@graphorin/server 0.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (204) hide show
  1. package/CHANGELOG.md +7 -0
  2. package/LICENSE +21 -0
  3. package/README.md +116 -0
  4. package/dist/app.d.ts +174 -0
  5. package/dist/app.d.ts.map +1 -0
  6. package/dist/app.js +684 -0
  7. package/dist/app.js.map +1 -0
  8. package/dist/commentary/audit-bridge.d.ts +57 -0
  9. package/dist/commentary/audit-bridge.d.ts.map +1 -0
  10. package/dist/commentary/audit-bridge.js +92 -0
  11. package/dist/commentary/audit-bridge.js.map +1 -0
  12. package/dist/commentary/built-in-patterns.d.ts +24 -0
  13. package/dist/commentary/built-in-patterns.d.ts.map +1 -0
  14. package/dist/commentary/built-in-patterns.js +62 -0
  15. package/dist/commentary/built-in-patterns.js.map +1 -0
  16. package/dist/commentary/index.d.ts +5 -0
  17. package/dist/commentary/index.js +5 -0
  18. package/dist/commentary/sanitizer.d.ts +37 -0
  19. package/dist/commentary/sanitizer.d.ts.map +1 -0
  20. package/dist/commentary/sanitizer.js +182 -0
  21. package/dist/commentary/sanitizer.js.map +1 -0
  22. package/dist/commentary/types.d.ts +120 -0
  23. package/dist/commentary/types.d.ts.map +1 -0
  24. package/dist/config.d.ts +760 -0
  25. package/dist/config.d.ts.map +1 -0
  26. package/dist/config.js +217 -0
  27. package/dist/config.js.map +1 -0
  28. package/dist/consolidator/daemon.d.ts +88 -0
  29. package/dist/consolidator/daemon.d.ts.map +1 -0
  30. package/dist/consolidator/daemon.js +54 -0
  31. package/dist/consolidator/daemon.js.map +1 -0
  32. package/dist/consolidator/index.d.ts +2 -0
  33. package/dist/consolidator/index.js +3 -0
  34. package/dist/errors/index.d.ts +104 -0
  35. package/dist/errors/index.d.ts.map +1 -0
  36. package/dist/errors/index.js +131 -0
  37. package/dist/errors/index.js.map +1 -0
  38. package/dist/health/checks.d.ts +120 -0
  39. package/dist/health/checks.d.ts.map +1 -0
  40. package/dist/health/checks.js +127 -0
  41. package/dist/health/checks.js.map +1 -0
  42. package/dist/health/index.d.ts +3 -0
  43. package/dist/health/index.js +4 -0
  44. package/dist/health/routes.d.ts +66 -0
  45. package/dist/health/routes.d.ts.map +1 -0
  46. package/dist/health/routes.js +96 -0
  47. package/dist/health/routes.js.map +1 -0
  48. package/dist/index.d.ts +88 -0
  49. package/dist/index.d.ts.map +1 -0
  50. package/dist/index.js +86 -0
  51. package/dist/index.js.map +1 -0
  52. package/dist/internal/context.d.ts +66 -0
  53. package/dist/internal/context.d.ts.map +1 -0
  54. package/dist/internal/ids.js +21 -0
  55. package/dist/internal/ids.js.map +1 -0
  56. package/dist/internal/json.js +46 -0
  57. package/dist/internal/json.js.map +1 -0
  58. package/dist/lifecycle/hooks.d.ts +57 -0
  59. package/dist/lifecycle/hooks.d.ts.map +1 -0
  60. package/dist/lifecycle/index.d.ts +2 -0
  61. package/dist/lifecycle/index.js +3 -0
  62. package/dist/lifecycle/pre-bind.d.ts +38 -0
  63. package/dist/lifecycle/pre-bind.d.ts.map +1 -0
  64. package/dist/lifecycle/pre-bind.js +62 -0
  65. package/dist/lifecycle/pre-bind.js.map +1 -0
  66. package/dist/metrics/catalog.d.ts +34 -0
  67. package/dist/metrics/catalog.d.ts.map +1 -0
  68. package/dist/metrics/catalog.js +61 -0
  69. package/dist/metrics/catalog.js.map +1 -0
  70. package/dist/metrics/index.d.ts +3 -0
  71. package/dist/metrics/index.js +4 -0
  72. package/dist/metrics/registry.d.ts +63 -0
  73. package/dist/metrics/registry.d.ts.map +1 -0
  74. package/dist/metrics/registry.js +222 -0
  75. package/dist/metrics/registry.js.map +1 -0
  76. package/dist/middleware/audit.d.ts +47 -0
  77. package/dist/middleware/audit.d.ts.map +1 -0
  78. package/dist/middleware/audit.js +71 -0
  79. package/dist/middleware/audit.js.map +1 -0
  80. package/dist/middleware/auth.d.ts +50 -0
  81. package/dist/middleware/auth.d.ts.map +1 -0
  82. package/dist/middleware/auth.js +164 -0
  83. package/dist/middleware/auth.js.map +1 -0
  84. package/dist/middleware/cors.d.ts +15 -0
  85. package/dist/middleware/cors.d.ts.map +1 -0
  86. package/dist/middleware/cors.js +45 -0
  87. package/dist/middleware/cors.js.map +1 -0
  88. package/dist/middleware/csrf.d.ts +15 -0
  89. package/dist/middleware/csrf.d.ts.map +1 -0
  90. package/dist/middleware/csrf.js +77 -0
  91. package/dist/middleware/csrf.js.map +1 -0
  92. package/dist/middleware/idempotency.d.ts +41 -0
  93. package/dist/middleware/idempotency.d.ts.map +1 -0
  94. package/dist/middleware/idempotency.js +198 -0
  95. package/dist/middleware/idempotency.js.map +1 -0
  96. package/dist/middleware/index.d.ts +9 -0
  97. package/dist/middleware/index.js +10 -0
  98. package/dist/middleware/rate-limit.d.ts +17 -0
  99. package/dist/middleware/rate-limit.d.ts.map +1 -0
  100. package/dist/middleware/rate-limit.js +47 -0
  101. package/dist/middleware/rate-limit.js.map +1 -0
  102. package/dist/middleware/request-state.d.ts +27 -0
  103. package/dist/middleware/request-state.d.ts.map +1 -0
  104. package/dist/middleware/request-state.js +42 -0
  105. package/dist/middleware/request-state.js.map +1 -0
  106. package/dist/middleware/scope.d.ts +24 -0
  107. package/dist/middleware/scope.d.ts.map +1 -0
  108. package/dist/middleware/scope.js +50 -0
  109. package/dist/middleware/scope.js.map +1 -0
  110. package/dist/registry/index.d.ts +135 -0
  111. package/dist/registry/index.d.ts.map +1 -0
  112. package/dist/registry/index.js +96 -0
  113. package/dist/registry/index.js.map +1 -0
  114. package/dist/replay/index.d.ts +2 -0
  115. package/dist/replay/index.js +3 -0
  116. package/dist/replay/routes.d.ts +46 -0
  117. package/dist/replay/routes.d.ts.map +1 -0
  118. package/dist/replay/routes.js +189 -0
  119. package/dist/replay/routes.js.map +1 -0
  120. package/dist/routes/agents.d.ts +41 -0
  121. package/dist/routes/agents.d.ts.map +1 -0
  122. package/dist/routes/agents.js +213 -0
  123. package/dist/routes/agents.js.map +1 -0
  124. package/dist/routes/audit.d.ts +57 -0
  125. package/dist/routes/audit.d.ts.map +1 -0
  126. package/dist/routes/audit.js +116 -0
  127. package/dist/routes/audit.js.map +1 -0
  128. package/dist/routes/auth.d.ts +26 -0
  129. package/dist/routes/auth.d.ts.map +1 -0
  130. package/dist/routes/auth.js +54 -0
  131. package/dist/routes/auth.js.map +1 -0
  132. package/dist/routes/health.d.ts +22 -0
  133. package/dist/routes/health.d.ts.map +1 -0
  134. package/dist/routes/health.js +33 -0
  135. package/dist/routes/health.js.map +1 -0
  136. package/dist/routes/index.d.ts +10 -0
  137. package/dist/routes/index.js +12 -0
  138. package/dist/routes/mcp.d.ts +32 -0
  139. package/dist/routes/mcp.d.ts.map +1 -0
  140. package/dist/routes/mcp.js +61 -0
  141. package/dist/routes/mcp.js.map +1 -0
  142. package/dist/routes/memory.d.ts +141 -0
  143. package/dist/routes/memory.d.ts.map +1 -0
  144. package/dist/routes/memory.js +102 -0
  145. package/dist/routes/memory.js.map +1 -0
  146. package/dist/routes/sessions.d.ts +54 -0
  147. package/dist/routes/sessions.d.ts.map +1 -0
  148. package/dist/routes/sessions.js +135 -0
  149. package/dist/routes/sessions.js.map +1 -0
  150. package/dist/routes/skills.d.ts +34 -0
  151. package/dist/routes/skills.d.ts.map +1 -0
  152. package/dist/routes/skills.js +54 -0
  153. package/dist/routes/skills.js.map +1 -0
  154. package/dist/routes/tokens.d.ts +25 -0
  155. package/dist/routes/tokens.d.ts.map +1 -0
  156. package/dist/routes/tokens.js +87 -0
  157. package/dist/routes/tokens.js.map +1 -0
  158. package/dist/routes/workflows.d.ts +27 -0
  159. package/dist/routes/workflows.d.ts.map +1 -0
  160. package/dist/routes/workflows.js +220 -0
  161. package/dist/routes/workflows.js.map +1 -0
  162. package/dist/runtime/run-state.d.ts +158 -0
  163. package/dist/runtime/run-state.d.ts.map +1 -0
  164. package/dist/runtime/run-state.js +182 -0
  165. package/dist/runtime/run-state.js.map +1 -0
  166. package/dist/sse/events.d.ts +44 -0
  167. package/dist/sse/events.d.ts.map +1 -0
  168. package/dist/sse/events.js +200 -0
  169. package/dist/sse/events.js.map +1 -0
  170. package/dist/sse/index.d.ts +2 -0
  171. package/dist/sse/index.js +3 -0
  172. package/dist/triggers/daemon.d.ts +74 -0
  173. package/dist/triggers/daemon.d.ts.map +1 -0
  174. package/dist/triggers/daemon.js +114 -0
  175. package/dist/triggers/daemon.js.map +1 -0
  176. package/dist/triggers/index.d.ts +3 -0
  177. package/dist/triggers/index.js +4 -0
  178. package/dist/triggers/routes.d.ts +21 -0
  179. package/dist/triggers/routes.d.ts.map +1 -0
  180. package/dist/triggers/routes.js +117 -0
  181. package/dist/triggers/routes.js.map +1 -0
  182. package/dist/ws/dispatcher.d.ts +169 -0
  183. package/dist/ws/dispatcher.d.ts.map +1 -0
  184. package/dist/ws/dispatcher.js +303 -0
  185. package/dist/ws/dispatcher.js.map +1 -0
  186. package/dist/ws/index.d.ts +6 -0
  187. package/dist/ws/index.js +7 -0
  188. package/dist/ws/replay-buffer.d.ts +47 -0
  189. package/dist/ws/replay-buffer.d.ts.map +1 -0
  190. package/dist/ws/replay-buffer.js +88 -0
  191. package/dist/ws/replay-buffer.js.map +1 -0
  192. package/dist/ws/subjects.d.ts +71 -0
  193. package/dist/ws/subjects.d.ts.map +1 -0
  194. package/dist/ws/subjects.js +112 -0
  195. package/dist/ws/subjects.js.map +1 -0
  196. package/dist/ws/ticket.d.ts +74 -0
  197. package/dist/ws/ticket.d.ts.map +1 -0
  198. package/dist/ws/ticket.js +112 -0
  199. package/dist/ws/ticket.js.map +1 -0
  200. package/dist/ws/upgrade.d.ts +63 -0
  201. package/dist/ws/upgrade.d.ts.map +1 -0
  202. package/dist/ws/upgrade.js +324 -0
  203. package/dist/ws/upgrade.js.map +1 -0
  204. package/package.json +156 -0
@@ -0,0 +1,114 @@
1
+ //#region src/triggers/daemon.ts
2
+ /**
3
+ * @stable
4
+ */
5
+ function createTriggersDaemon(options) {
6
+ const fires = /* @__PURE__ */ new Map();
7
+ let catchupApplied = 0;
8
+ let libModeWarnings = 0;
9
+ let lastFireAtMs;
10
+ let running = false;
11
+ let pump;
12
+ const warn = options.warn ?? ((m) => process.stderr.write(`${m}\n`));
13
+ function recordFire(id, kind) {
14
+ const entry = fires.get(id) ?? {
15
+ success: 0,
16
+ error: 0
17
+ };
18
+ entry[kind] += 1;
19
+ fires.set(id, entry);
20
+ lastFireAtMs = Date.now();
21
+ }
22
+ async function pumpEvents() {
23
+ try {
24
+ for await (const event of options.scheduler.events()) observe(event);
25
+ } catch (err) {
26
+ warn(`[graphorin/server] triggers daemon event pump aborted: ${describeError(err)}`);
27
+ }
28
+ }
29
+ function observe(event) {
30
+ switch (event.type) {
31
+ case "fire-end":
32
+ recordFire(event.id, "success");
33
+ return;
34
+ case "fire-error":
35
+ recordFire(event.id, "error");
36
+ warn(`[graphorin/server] triggers daemon: trigger '${event.id}' failed after ${event.durationMs}ms: ${describeError(event.error)}`);
37
+ return;
38
+ case "catchup-applied":
39
+ catchupApplied += event.missed;
40
+ return;
41
+ case "lib-mode-warning":
42
+ libModeWarnings += 1;
43
+ return;
44
+ default: return;
45
+ }
46
+ }
47
+ return {
48
+ get scheduler() {
49
+ return options.scheduler;
50
+ },
51
+ async start() {
52
+ if (running) return;
53
+ running = true;
54
+ pump = pumpEvents();
55
+ await options.scheduler.start();
56
+ },
57
+ async stop() {
58
+ if (!running) return;
59
+ running = false;
60
+ await options.scheduler.stop();
61
+ if (pump !== void 0) {
62
+ try {
63
+ await pump;
64
+ } catch {}
65
+ pump = void 0;
66
+ }
67
+ },
68
+ async status() {
69
+ const all = await options.scheduler.list();
70
+ let active = 0;
71
+ let disabled = 0;
72
+ let deferred = 0;
73
+ for (const t of all) {
74
+ if (t.disabled) disabled += 1;
75
+ else active += 1;
76
+ if (t.missedFires > 0) deferred += 1;
77
+ }
78
+ const out = {
79
+ running,
80
+ active,
81
+ disabled,
82
+ deferred
83
+ };
84
+ if (lastFireAtMs !== void 0) out.lastFireAt = new Date(lastFireAtMs).toISOString();
85
+ return Object.freeze(out);
86
+ },
87
+ metrics() {
88
+ return Object.freeze({
89
+ fires: new Map(fires),
90
+ catchupApplied,
91
+ libModeWarnings
92
+ });
93
+ }
94
+ };
95
+ }
96
+ /**
97
+ * Resolve the catch-up policy default for triggers that did not
98
+ * declare one explicitly. Returns `'none'` per DEC-150 (personal-
99
+ * assistant friendly).
100
+ *
101
+ * @stable
102
+ */
103
+ function defaultCatchupPolicy() {
104
+ return "none";
105
+ }
106
+ function describeError(err) {
107
+ if (err === null || err === void 0) return "unknown";
108
+ if (err instanceof Error) return err.message;
109
+ return String(err);
110
+ }
111
+
112
+ //#endregion
113
+ export { createTriggersDaemon, defaultCatchupPolicy };
114
+ //# sourceMappingURL=daemon.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"daemon.js","names":["lastFireAtMs: number | undefined","pump: Promise<void> | undefined","out: {\n -readonly [K in keyof TriggersDaemonStatus]?: TriggersDaemonStatus[K];\n }"],"sources":["../../src/triggers/daemon.ts"],"sourcesContent":["/**\n * Trigger scheduler integration with the server lifecycle.\n *\n * The daemon wraps a `Scheduler` from `@graphorin/triggers` and binds\n * its `start()` / `stop()` calls to the `beforeStart` / `beforeShutdown`\n * lifecycle hooks. On `start()`, every persisted trigger is loaded\n * from `trigger_state` (durable) and the per-trigger `catchupPolicy`\n * is honoured so cron / interval / idle / event triggers survive\n * process restarts as documented in the runtime spec.\n *\n * The daemon never invokes user callbacks itself — those run inside\n * the `Scheduler`. The daemon only owns lifecycle + observability.\n *\n * @packageDocumentation\n */\n\nimport type { CatchupPolicy, Scheduler, SchedulerEvent } from '@graphorin/triggers';\n\n/**\n * Snapshot exposed via {@link TriggersDaemon.status} + the\n * `/v1/health` aggregator. Counts split by `disabled` so the health\n * endpoint can flag a deployment that disabled every cron trigger.\n *\n * @stable\n */\nexport interface TriggersDaemonStatus {\n readonly running: boolean;\n readonly active: number;\n readonly disabled: number;\n readonly deferred: number;\n /** Last fire timestamp across the entire pool (ISO-8601). */\n readonly lastFireAt?: string;\n}\n\n/**\n * Aggregate counters surfaced through the Prometheus\n * `/v1/metrics` exposition. Updated incrementally as the scheduler\n * publishes lifecycle events.\n *\n * @stable\n */\nexport interface TriggersDaemonMetrics {\n readonly fires: ReadonlyMap<string, { readonly success: number; readonly error: number }>;\n readonly catchupApplied: number;\n readonly libModeWarnings: number;\n}\n\n/**\n * @stable\n */\nexport interface CreateTriggersDaemonOptions {\n readonly scheduler: Scheduler;\n /**\n * Optional logger. Defaults to the standard error stream so the\n * daemon never depends on the framework logger directly.\n */\n readonly warn?: (message: string) => void;\n}\n\n/**\n * Stateful handle returned by {@link createTriggersDaemon}. The\n * `start()` / `stop()` methods are wired into\n * `LifecycleHooks.beforeStart` / `beforeShutdown` by `createServer`.\n *\n * @stable\n */\nexport interface TriggersDaemon {\n start(): Promise<void>;\n stop(): Promise<void>;\n status(): Promise<TriggersDaemonStatus>;\n metrics(): TriggersDaemonMetrics;\n readonly scheduler: Scheduler;\n}\n\n/**\n * @stable\n */\nexport function createTriggersDaemon(options: CreateTriggersDaemonOptions): TriggersDaemon {\n const fires = new Map<string, { success: number; error: number }>();\n let catchupApplied = 0;\n let libModeWarnings = 0;\n let lastFireAtMs: number | undefined;\n let running = false;\n let pump: Promise<void> | undefined;\n\n const warn = options.warn ?? ((m: string) => process.stderr.write(`${m}\\n`));\n\n function recordFire(id: string, kind: 'success' | 'error'): void {\n const entry = fires.get(id) ?? { success: 0, error: 0 };\n entry[kind] += 1;\n fires.set(id, entry);\n lastFireAtMs = Date.now();\n }\n\n async function pumpEvents(): Promise<void> {\n try {\n for await (const event of options.scheduler.events()) {\n observe(event);\n }\n } catch (err) {\n warn(`[graphorin/server] triggers daemon event pump aborted: ${describeError(err)}`);\n }\n }\n\n function observe(event: SchedulerEvent): void {\n switch (event.type) {\n case 'fire-end':\n recordFire(event.id, 'success');\n return;\n case 'fire-error':\n recordFire(event.id, 'error');\n warn(\n `[graphorin/server] triggers daemon: trigger '${event.id}' failed after ${event.durationMs}ms: ${describeError(event.error)}`,\n );\n return;\n case 'catchup-applied':\n catchupApplied += event.missed;\n return;\n case 'lib-mode-warning':\n libModeWarnings += 1;\n return;\n default:\n return;\n }\n }\n\n return {\n get scheduler() {\n return options.scheduler;\n },\n async start() {\n if (running) return;\n running = true;\n pump = pumpEvents();\n await options.scheduler.start();\n },\n async stop() {\n if (!running) return;\n running = false;\n await options.scheduler.stop();\n if (pump !== undefined) {\n try {\n await pump;\n } catch {\n // Best-effort during stop().\n }\n pump = undefined;\n }\n },\n async status() {\n const all = await options.scheduler.list();\n let active = 0;\n let disabled = 0;\n let deferred = 0;\n for (const t of all) {\n if (t.disabled) disabled += 1;\n else active += 1;\n if (t.missedFires > 0) deferred += 1;\n }\n const out: {\n -readonly [K in keyof TriggersDaemonStatus]?: TriggersDaemonStatus[K];\n } = {\n running,\n active,\n disabled,\n deferred,\n };\n if (lastFireAtMs !== undefined) {\n out.lastFireAt = new Date(lastFireAtMs).toISOString();\n }\n return Object.freeze(out as TriggersDaemonStatus);\n },\n metrics() {\n return Object.freeze({\n fires: new Map(fires),\n catchupApplied,\n libModeWarnings,\n });\n },\n };\n}\n\n/**\n * Resolve the catch-up policy default for triggers that did not\n * declare one explicitly. Returns `'none'` per DEC-150 (personal-\n * assistant friendly).\n *\n * @stable\n */\nexport function defaultCatchupPolicy(): CatchupPolicy {\n return 'none';\n}\n\nfunction describeError(err: unknown): string {\n if (err === null || err === undefined) return 'unknown';\n if (err instanceof Error) return err.message;\n return String(err);\n}\n"],"mappings":";;;;AA6EA,SAAgB,qBAAqB,SAAsD;CACzF,MAAM,wBAAQ,IAAI,KAAiD;CACnE,IAAI,iBAAiB;CACrB,IAAI,kBAAkB;CACtB,IAAIA;CACJ,IAAI,UAAU;CACd,IAAIC;CAEJ,MAAM,OAAO,QAAQ,UAAU,MAAc,QAAQ,OAAO,MAAM,GAAG,EAAE,IAAI;CAE3E,SAAS,WAAW,IAAY,MAAiC;EAC/D,MAAM,QAAQ,MAAM,IAAI,GAAG,IAAI;GAAE,SAAS;GAAG,OAAO;GAAG;AACvD,QAAM,SAAS;AACf,QAAM,IAAI,IAAI,MAAM;AACpB,iBAAe,KAAK,KAAK;;CAG3B,eAAe,aAA4B;AACzC,MAAI;AACF,cAAW,MAAM,SAAS,QAAQ,UAAU,QAAQ,CAClD,SAAQ,MAAM;WAET,KAAK;AACZ,QAAK,0DAA0D,cAAc,IAAI,GAAG;;;CAIxF,SAAS,QAAQ,OAA6B;AAC5C,UAAQ,MAAM,MAAd;GACE,KAAK;AACH,eAAW,MAAM,IAAI,UAAU;AAC/B;GACF,KAAK;AACH,eAAW,MAAM,IAAI,QAAQ;AAC7B,SACE,gDAAgD,MAAM,GAAG,iBAAiB,MAAM,WAAW,MAAM,cAAc,MAAM,MAAM,GAC5H;AACD;GACF,KAAK;AACH,sBAAkB,MAAM;AACxB;GACF,KAAK;AACH,uBAAmB;AACnB;GACF,QACE;;;AAIN,QAAO;EACL,IAAI,YAAY;AACd,UAAO,QAAQ;;EAEjB,MAAM,QAAQ;AACZ,OAAI,QAAS;AACb,aAAU;AACV,UAAO,YAAY;AACnB,SAAM,QAAQ,UAAU,OAAO;;EAEjC,MAAM,OAAO;AACX,OAAI,CAAC,QAAS;AACd,aAAU;AACV,SAAM,QAAQ,UAAU,MAAM;AAC9B,OAAI,SAAS,QAAW;AACtB,QAAI;AACF,WAAM;YACA;AAGR,WAAO;;;EAGX,MAAM,SAAS;GACb,MAAM,MAAM,MAAM,QAAQ,UAAU,MAAM;GAC1C,IAAI,SAAS;GACb,IAAI,WAAW;GACf,IAAI,WAAW;AACf,QAAK,MAAM,KAAK,KAAK;AACnB,QAAI,EAAE,SAAU,aAAY;QACvB,WAAU;AACf,QAAI,EAAE,cAAc,EAAG,aAAY;;GAErC,MAAMC,MAEF;IACF;IACA;IACA;IACA;IACD;AACD,OAAI,iBAAiB,OACnB,KAAI,aAAa,IAAI,KAAK,aAAa,CAAC,aAAa;AAEvD,UAAO,OAAO,OAAO,IAA4B;;EAEnD,UAAU;AACR,UAAO,OAAO,OAAO;IACnB,OAAO,IAAI,IAAI,MAAM;IACrB;IACA;IACD,CAAC;;EAEL;;;;;;;;;AAUH,SAAgB,uBAAsC;AACpD,QAAO;;AAGT,SAAS,cAAc,KAAsB;AAC3C,KAAI,QAAQ,QAAQ,QAAQ,OAAW,QAAO;AAC9C,KAAI,eAAe,MAAO,QAAO,IAAI;AACrC,QAAO,OAAO,IAAI"}
@@ -0,0 +1,3 @@
1
+ import { CreateTriggersDaemonOptions, TriggersDaemon, TriggersDaemonMetrics, TriggersDaemonStatus, createTriggersDaemon, defaultCatchupPolicy } from "./daemon.js";
2
+ import { TriggersRoutesDeps, createTriggersRoutes } from "./routes.js";
3
+ export { type CreateTriggersDaemonOptions, type TriggersDaemon, type TriggersDaemonMetrics, type TriggersDaemonStatus, type TriggersRoutesDeps, createTriggersDaemon, createTriggersRoutes, defaultCatchupPolicy };
@@ -0,0 +1,4 @@
1
+ import { createTriggersDaemon, defaultCatchupPolicy } from "./daemon.js";
2
+ import { createTriggersRoutes } from "./routes.js";
3
+
4
+ export { createTriggersDaemon, createTriggersRoutes, defaultCatchupPolicy };
@@ -0,0 +1,21 @@
1
+ import { TriggersDaemon } from "./daemon.js";
2
+ import { ServerVariables } from "../internal/context.js";
3
+ import { Hono } from "hono";
4
+
5
+ //#region src/triggers/routes.d.ts
6
+
7
+ /**
8
+ * @stable
9
+ */
10
+ interface TriggersRoutesDeps {
11
+ readonly daemon: TriggersDaemon;
12
+ }
13
+ /**
14
+ * @stable
15
+ */
16
+ declare function createTriggersRoutes(deps: TriggersRoutesDeps): Hono<{
17
+ Variables: ServerVariables;
18
+ }>;
19
+ //#endregion
20
+ export { TriggersRoutesDeps, createTriggersRoutes };
21
+ //# sourceMappingURL=routes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"routes.d.ts","names":[],"sources":["../../src/triggers/routes.ts"],"sourcesContent":[],"mappings":";;;;;;;;;UA6BiB,kBAAA;mBACE;;;;;iBAMH,oBAAA,OACR,qBACL;aAAkB"}
@@ -0,0 +1,117 @@
1
+ import { createScopeMiddleware } from "../middleware/scope.js";
2
+ import { Hono } from "hono";
3
+
4
+ //#region src/triggers/routes.ts
5
+ /**
6
+ * @stable
7
+ */
8
+ function createTriggersRoutes(deps) {
9
+ const app = new Hono();
10
+ const scheduler = deps.daemon.scheduler;
11
+ app.get("/", createScopeMiddleware("triggers:read"), async (c) => {
12
+ const all = await scheduler.list();
13
+ return c.json({ triggers: all.map(serializeTrigger) });
14
+ });
15
+ app.get("/:id", createScopeMiddleware("triggers:read"), async (c) => {
16
+ const id = c.req.param("id");
17
+ const found = (await scheduler.list()).find((t) => t.id === id);
18
+ if (found === void 0) return c.json({
19
+ error: "not-found",
20
+ message: `Trigger '${id}' not found.`
21
+ }, 404);
22
+ return c.json({ trigger: serializeTrigger(found) });
23
+ });
24
+ app.post("/:id/fire", createScopeMiddleware("triggers:fire"), async (c) => {
25
+ const id = c.req.param("id");
26
+ try {
27
+ await scheduler.fire(id);
28
+ } catch (err) {
29
+ return c.json({
30
+ error: "not-found",
31
+ message: err instanceof Error ? err.message : `Trigger '${id}' not found.`
32
+ }, 404);
33
+ }
34
+ return c.json({
35
+ ok: true,
36
+ fired: id
37
+ });
38
+ });
39
+ app.post("/:id/disable", createScopeMiddleware("triggers:disable"), async (c) => {
40
+ const id = c.req.param("id");
41
+ try {
42
+ const updated = await scheduler.setDisabled(id, true);
43
+ return c.json({
44
+ ok: true,
45
+ trigger: serializeTrigger(updated)
46
+ });
47
+ } catch {
48
+ return c.json({
49
+ error: "not-found",
50
+ message: `Trigger '${id}' not found.`
51
+ }, 404);
52
+ }
53
+ });
54
+ app.post("/:id/enable", createScopeMiddleware("triggers:disable"), async (c) => {
55
+ const id = c.req.param("id");
56
+ try {
57
+ const updated = await scheduler.setDisabled(id, false);
58
+ return c.json({
59
+ ok: true,
60
+ trigger: serializeTrigger(updated)
61
+ });
62
+ } catch {
63
+ return c.json({
64
+ error: "not-found",
65
+ message: `Trigger '${id}' not found.`
66
+ }, 404);
67
+ }
68
+ });
69
+ app.delete("/:id", createScopeMiddleware("triggers:disable"), async (c) => {
70
+ const id = c.req.param("id");
71
+ if (!(await scheduler.list()).some((t) => t.id === id)) return c.json({
72
+ error: "not-found",
73
+ message: `Trigger '${id}' not found.`
74
+ }, 404);
75
+ await scheduler.unregister(id);
76
+ return c.json({
77
+ ok: true,
78
+ removed: id
79
+ });
80
+ });
81
+ app.post("/prune", createScopeMiddleware("triggers:disable"), async (c) => {
82
+ const all = await scheduler.list();
83
+ const removedIds = [];
84
+ for (const trigger of all) if (trigger.disabled) {
85
+ await scheduler.unregister(trigger.id);
86
+ removedIds.push(trigger.id);
87
+ }
88
+ return c.json({
89
+ ok: true,
90
+ removed: removedIds,
91
+ count: removedIds.length
92
+ });
93
+ });
94
+ return app;
95
+ }
96
+ function serializeTrigger(state) {
97
+ return {
98
+ id: state.id,
99
+ kind: state.kind,
100
+ spec: state.spec,
101
+ callbackRef: state.callbackRef,
102
+ ...state.nextFireAt !== void 0 ? { nextFireAt: state.nextFireAt } : {},
103
+ ...state.lastFiredAt !== void 0 ? { lastFiredAt: state.lastFiredAt } : {},
104
+ missedFires: state.missedFires,
105
+ disabled: state.disabled,
106
+ catchupPolicy: state.catchupPolicy,
107
+ maxCatchupRuns: state.maxCatchupRuns,
108
+ catchupWindowMs: state.catchupWindowMs,
109
+ ...state.tags !== void 0 ? { tags: [...state.tags] } : {},
110
+ createdAt: state.createdAt,
111
+ ...state.updatedAt !== void 0 ? { updatedAt: state.updatedAt } : {}
112
+ };
113
+ }
114
+
115
+ //#endregion
116
+ export { createTriggersRoutes };
117
+ //# sourceMappingURL=routes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"routes.js","names":["scheduler: Scheduler","removedIds: string[]"],"sources":["../../src/triggers/routes.ts"],"sourcesContent":["/**\n * REST routes for the `/v1/triggers` family. Mounted by the server\n * factory when a {@link TriggersDaemon} is wired in.\n *\n * GET /triggers (scope `triggers:read`)\n * GET /triggers/:id (scope `triggers:read`)\n * POST /triggers/:id/fire (scope `triggers:fire`)\n * POST /triggers/:id/disable (scope `triggers:disable`) — flag flip\n * POST /triggers/:id/enable (scope `triggers:disable`) — flag flip\n * DELETE /triggers/:id (scope `triggers:disable`) — unregister\n * POST /triggers/prune (scope `triggers:disable`)\n *\n * Response shapes mirror the persisted `TriggerState` rows so CLI +\n * dashboard consumers can render them without re-mapping.\n *\n * @packageDocumentation\n */\n\nimport type { TriggerState } from '@graphorin/core/contracts';\nimport type { Scheduler } from '@graphorin/triggers';\nimport { Hono } from 'hono';\n\nimport type { ServerVariables } from '../internal/context.js';\nimport { createScopeMiddleware } from '../middleware/scope.js';\nimport type { TriggersDaemon } from './daemon.js';\n\n/**\n * @stable\n */\nexport interface TriggersRoutesDeps {\n readonly daemon: TriggersDaemon;\n}\n\n/**\n * @stable\n */\nexport function createTriggersRoutes(\n deps: TriggersRoutesDeps,\n): Hono<{ Variables: ServerVariables }> {\n const app = new Hono<{ Variables: ServerVariables }>();\n const scheduler: Scheduler = deps.daemon.scheduler;\n\n app.get('/', createScopeMiddleware('triggers:read'), async (c) => {\n const all = await scheduler.list();\n return c.json({ triggers: all.map(serializeTrigger) });\n });\n\n app.get('/:id', createScopeMiddleware('triggers:read'), async (c) => {\n const id = c.req.param('id');\n const all = await scheduler.list();\n const found = all.find((t) => t.id === id);\n if (found === undefined) {\n return c.json({ error: 'not-found', message: `Trigger '${id}' not found.` }, 404);\n }\n return c.json({ trigger: serializeTrigger(found) });\n });\n\n app.post('/:id/fire', createScopeMiddleware('triggers:fire'), async (c) => {\n const id = c.req.param('id');\n try {\n await scheduler.fire(id);\n } catch (err) {\n return c.json(\n {\n error: 'not-found',\n message: err instanceof Error ? err.message : `Trigger '${id}' not found.`,\n },\n 404,\n );\n }\n return c.json({ ok: true, fired: id });\n });\n\n // IP-17: disable/enable are non-destructive flag flips on the\n // persistent TriggerState (in agreement with the CLI); the\n // destructive removal is DELETE /:id.\n app.post('/:id/disable', createScopeMiddleware('triggers:disable'), async (c) => {\n const id = c.req.param('id');\n try {\n const updated = await scheduler.setDisabled(id, true);\n return c.json({ ok: true, trigger: serializeTrigger(updated) });\n } catch {\n return c.json({ error: 'not-found', message: `Trigger '${id}' not found.` }, 404);\n }\n });\n\n app.post('/:id/enable', createScopeMiddleware('triggers:disable'), async (c) => {\n const id = c.req.param('id');\n try {\n const updated = await scheduler.setDisabled(id, false);\n return c.json({ ok: true, trigger: serializeTrigger(updated) });\n } catch {\n return c.json({ error: 'not-found', message: `Trigger '${id}' not found.` }, 404);\n }\n });\n\n app.delete('/:id', createScopeMiddleware('triggers:disable'), async (c) => {\n const id = c.req.param('id');\n const all = await scheduler.list();\n if (!all.some((t) => t.id === id)) {\n return c.json({ error: 'not-found', message: `Trigger '${id}' not found.` }, 404);\n }\n await scheduler.unregister(id);\n return c.json({ ok: true, removed: id });\n });\n\n app.post('/prune', createScopeMiddleware('triggers:disable'), async (c) => {\n const all = await scheduler.list();\n const removedIds: string[] = [];\n for (const trigger of all) {\n if (trigger.disabled) {\n await scheduler.unregister(trigger.id);\n removedIds.push(trigger.id);\n }\n }\n return c.json({ ok: true, removed: removedIds, count: removedIds.length });\n });\n\n return app;\n}\n\nfunction serializeTrigger(state: TriggerState): Record<string, unknown> {\n return {\n id: state.id,\n kind: state.kind,\n spec: state.spec,\n callbackRef: state.callbackRef,\n ...(state.nextFireAt !== undefined ? { nextFireAt: state.nextFireAt } : {}),\n ...(state.lastFiredAt !== undefined ? { lastFiredAt: state.lastFiredAt } : {}),\n missedFires: state.missedFires,\n disabled: state.disabled,\n catchupPolicy: state.catchupPolicy,\n maxCatchupRuns: state.maxCatchupRuns,\n catchupWindowMs: state.catchupWindowMs,\n ...(state.tags !== undefined ? { tags: [...state.tags] } : {}),\n createdAt: state.createdAt,\n ...(state.updatedAt !== undefined ? { updatedAt: state.updatedAt } : {}),\n };\n}\n"],"mappings":"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"}
@@ -0,0 +1,169 @@
1
+ import { DeliveryCommentaryConfig } from "../commentary/types.js";
2
+ import { DeliveryCommentarySanitizer } from "../commentary/sanitizer.js";
3
+ import "../commentary/index.js";
4
+ import { ReplayBuffer, ReplayBufferOptions } from "./replay-buffer.js";
5
+ import { ParsedSubject } from "./subjects.js";
6
+ import { ServerLifecycleFrame, ServerMessage } from "@graphorin/protocol";
7
+ import { ParsedScope } from "@graphorin/security/auth";
8
+
9
+ //#region src/ws/dispatcher.d.ts
10
+
11
+ /**
12
+ * Public configuration accepted by {@link createWsDispatcher}.
13
+ *
14
+ * @stable
15
+ */
16
+ interface WsDispatcherOptions {
17
+ readonly commentary?: DeliveryCommentaryConfig;
18
+ readonly replayBuffer?: ReplayBufferOptions;
19
+ /**
20
+ * Cap on outstanding events queued for an offline subscriber.
21
+ * Defaults to the same value as the replay buffer per-subject cap.
22
+ */
23
+ readonly perConnectionQueueLimit?: number;
24
+ readonly now?: () => number;
25
+ /**
26
+ * Logger sink for protocol violations + dropped frames. When
27
+ * omitted, the dispatcher is silent (production wiring uses the
28
+ * server's structured logger).
29
+ */
30
+ readonly onWarn?: (event: WsDispatcherWarning) => void;
31
+ }
32
+ /**
33
+ * Discriminator surfaced to the optional warn sink.
34
+ *
35
+ * @stable
36
+ */
37
+ type WsDispatcherWarning = {
38
+ readonly kind: 'invalid-frame';
39
+ readonly subscriptionId: string;
40
+ readonly issues: ReadonlyArray<string>;
41
+ } | {
42
+ readonly kind: 'queue-overflow';
43
+ readonly subscriptionId: string;
44
+ } | {
45
+ readonly kind: 'subject-rejected';
46
+ readonly subject: string;
47
+ readonly reason: string;
48
+ };
49
+ /**
50
+ * Subscriber surface used by the dispatcher. Each WebSocket
51
+ * connection wraps its `WSContext.send` in this interface so the
52
+ * dispatcher does not depend on `@hono/node-ws` types directly.
53
+ *
54
+ * @stable
55
+ */
56
+ interface WsSubscriberHandle {
57
+ readonly id: string;
58
+ readonly tokenId: string;
59
+ readonly grantedScopes: ReadonlyArray<ParsedScope>;
60
+ /** Send a server frame; the dispatcher already validated it. */
61
+ send(frame: ServerMessage): void;
62
+ /** Close the underlying WebSocket with a Graphorin close code. */
63
+ close(code: number, reason: string): void;
64
+ /**
65
+ * Optional buffered-byte sample. The dispatcher reads this on every
66
+ * emit to detect sustained backpressure and close the connection
67
+ * with the Graphorin `flow.throttled` code (4006) before the OS-
68
+ * level send buffer collapses. Consumers backed by `@hono/node-ws`
69
+ * can return the underlying `ws.bufferedAmount`. When the field is
70
+ * not implemented, the dispatcher falls back to the per-connection
71
+ * outstanding-event counter.
72
+ */
73
+ bufferedAmount?(): number;
74
+ }
75
+ /**
76
+ * Snapshot of an active subscription. Surfaced via
77
+ * {@link WsDispatcher.snapshotSubscription}.
78
+ *
79
+ * @stable
80
+ */
81
+ interface WsSubscriptionSnapshot {
82
+ readonly subscriptionId: string;
83
+ readonly subject: string;
84
+ readonly subjectKind: ParsedSubject['kind'];
85
+ readonly subscriberId: string;
86
+ readonly tokenId: string;
87
+ readonly createdAt: number;
88
+ readonly lastEventId: string | undefined;
89
+ }
90
+ /**
91
+ * Result of {@link WsDispatcher.subscribe}.
92
+ *
93
+ * @stable
94
+ */
95
+ type SubscribeResult = {
96
+ readonly ok: true;
97
+ readonly subscription: WsSubscriptionSnapshot;
98
+ readonly replayedCount: number;
99
+ readonly snapshotEventId: string | undefined;
100
+ } | {
101
+ readonly ok: false;
102
+ readonly reason: 'subject-malformed' | 'subject-unknown' | 'subject-wildcard' | 'scope-denied';
103
+ };
104
+ /**
105
+ * Public surface of the dispatcher.
106
+ *
107
+ * @stable
108
+ */
109
+ interface WsDispatcher {
110
+ readonly sanitizer: DeliveryCommentarySanitizer;
111
+ readonly replayBuffer: ReplayBuffer;
112
+ /**
113
+ * Register a subscriber (one per WebSocket connection).
114
+ * `unregister` is called on close.
115
+ */
116
+ registerSubscriber(handle: WsSubscriberHandle): {
117
+ unregister(): void;
118
+ };
119
+ /**
120
+ * Open a new subscription for an active subscriber. Returns either
121
+ * the subscription snapshot + replayed-event count or a typed
122
+ * failure reason the caller maps to the appropriate close code /
123
+ * RPC error.
124
+ */
125
+ subscribe(input: {
126
+ readonly subscriberId: string;
127
+ readonly subject: string;
128
+ readonly subscriptionId: string;
129
+ readonly sinceEventId?: string;
130
+ }): SubscribeResult;
131
+ unsubscribe(subscriptionId: string): boolean;
132
+ /**
133
+ * Push an event into the dispatcher. Goes through the sanitizer,
134
+ * validates against the protocol schema, persists into the replay
135
+ * buffer, and fans out to every matching active subscription.
136
+ */
137
+ emit(subject: string, frame: BareEventFrame): void;
138
+ /** Push a lifecycle frame to a single subscription. */
139
+ emitLifecycle(subscriptionId: string, status: ServerLifecycleFrame['status'], reason?: string): void;
140
+ /** List active subscriptions for a given subscriber (diagnostics). */
141
+ listForSubscriber(subscriberId: string): ReadonlyArray<WsSubscriptionSnapshot>;
142
+ snapshotSubscription(subscriptionId: string): WsSubscriptionSnapshot | undefined;
143
+ size(): {
144
+ readonly subscribers: number;
145
+ readonly subscriptions: number;
146
+ };
147
+ /** Clear in-memory state (used during graceful shutdown). */
148
+ shutdown(): void;
149
+ }
150
+ /**
151
+ * Frame argument accepted by {@link WsDispatcher.emit}. The
152
+ * dispatcher fills in `subscriptionId`, `subject`, and `eventId`.
153
+ *
154
+ * @stable
155
+ */
156
+ interface BareEventFrame {
157
+ readonly type: string;
158
+ readonly payload: unknown;
159
+ readonly eventId?: string;
160
+ }
161
+ /**
162
+ * Build a fresh dispatcher.
163
+ *
164
+ * @stable
165
+ */
166
+ declare function createWsDispatcher(options?: WsDispatcherOptions): WsDispatcher;
167
+ //#endregion
168
+ export { BareEventFrame, SubscribeResult, WsDispatcher, WsDispatcherOptions, WsDispatcherWarning, WsSubscriberHandle, WsSubscriptionSnapshot, createWsDispatcher };
169
+ //# sourceMappingURL=dispatcher.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dispatcher.d.ts","names":[],"sources":["../../src/ws/dispatcher.ts"],"sourcesContent":[],"mappings":";;;;;;;;;;AA0EA;;;;;AA0BiB,UAhEA,mBAAA,CAgEsB;EAe3B,SAAA,UAAe,CAAA,EA9EH,wBAiFK;EAkBZ,SAAA,YAAY,CAAA,EAlGH,mBAkGG;EACP;;;;EAyBS,SAAA,uBAAA,CAAA,EAAA,MAAA;EAInB,SAAA,GAAA,CAAA,EAAA,GAAA,GAAA,MAAA;EAI6C;;;;AAazD;EA6BgB,SAAA,MAAA,CAAA,EAAA,CAAA,KAAkB,EAlKN,mBAkKgB,EAAA,GAAA,IAAA;;;;;;;KA1JhC,mBAAA;;;mBAIW;;;;;;;;;;;;;;;;UAYN,kBAAA;;;0BAGS,cAAc;;cAE1B;;;;;;;;;;;;;;;;;;;;UAqBG,sBAAA;;;wBAGO;;;;;;;;;;;KAYZ,eAAA;;yBAGiB;;;;;;;;;;;;UAkBZ,YAAA;sBACK;yBACG;;;;;6BAKI;;;;;;;;;;;;;;MAYvB;;;;;;;+BAOyB;;gDAInB;;2CAI+B,cAAc;gDACT;;;;;;;;;;;;;;UAY/B,cAAA;;;;;;;;;;iBA6BD,kBAAA,WAA4B,sBAA2B"}