@schlessera/brain-ui-server 0.13.1 → 0.15.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (182) hide show
  1. package/README.md +51 -12
  2. package/dist/agent/backend.d.ts +163 -37
  3. package/dist/agent/backend.d.ts.map +1 -1
  4. package/dist/agent/backend.js +281 -286
  5. package/dist/agent/backend.js.map +1 -1
  6. package/dist/app.d.ts +46 -5
  7. package/dist/app.d.ts.map +1 -1
  8. package/dist/app.js +94 -35
  9. package/dist/app.js.map +1 -1
  10. package/dist/brain/client.d.ts +41 -30
  11. package/dist/brain/client.d.ts.map +1 -1
  12. package/dist/brain/client.js +138 -132
  13. package/dist/brain/client.js.map +1 -1
  14. package/dist/config/env.d.ts +104 -0
  15. package/dist/config/env.d.ts.map +1 -0
  16. package/dist/config/env.js +296 -0
  17. package/dist/config/env.js.map +1 -0
  18. package/dist/cron/scheduler.d.ts +16 -8
  19. package/dist/cron/scheduler.d.ts.map +1 -1
  20. package/dist/cron/scheduler.js +54 -53
  21. package/dist/cron/scheduler.js.map +1 -1
  22. package/dist/db/brain-db.d.ts +50 -0
  23. package/dist/db/brain-db.d.ts.map +1 -0
  24. package/dist/db/brain-db.js +75 -0
  25. package/dist/db/brain-db.js.map +1 -0
  26. package/dist/db/client.d.ts +8 -6
  27. package/dist/db/client.d.ts.map +1 -1
  28. package/dist/db/client.js +12 -25
  29. package/dist/db/client.js.map +1 -1
  30. package/dist/db/settings.d.ts +5 -4
  31. package/dist/db/settings.d.ts.map +1 -1
  32. package/dist/db/settings.js +9 -12
  33. package/dist/db/settings.js.map +1 -1
  34. package/dist/files/walker.d.ts +6 -7
  35. package/dist/files/walker.d.ts.map +1 -1
  36. package/dist/files/walker.js +6 -9
  37. package/dist/files/walker.js.map +1 -1
  38. package/dist/graph/reader.d.ts +6 -6
  39. package/dist/graph/reader.d.ts.map +1 -1
  40. package/dist/graph/reader.js +22 -12
  41. package/dist/graph/reader.js.map +1 -1
  42. package/dist/index.d.ts +15 -9
  43. package/dist/index.d.ts.map +1 -1
  44. package/dist/index.js +20 -10
  45. package/dist/index.js.map +1 -1
  46. package/dist/middleware/auth.d.ts +17 -6
  47. package/dist/middleware/auth.d.ts.map +1 -1
  48. package/dist/middleware/auth.js +34 -43
  49. package/dist/middleware/auth.js.map +1 -1
  50. package/dist/middleware/origin.d.ts +1 -2
  51. package/dist/middleware/origin.d.ts.map +1 -1
  52. package/dist/middleware/origin.js +1 -7
  53. package/dist/middleware/origin.js.map +1 -1
  54. package/dist/middleware/passkeys.d.ts +29 -5
  55. package/dist/middleware/passkeys.d.ts.map +1 -1
  56. package/dist/middleware/passkeys.js +47 -76
  57. package/dist/middleware/passkeys.js.map +1 -1
  58. package/dist/middleware/tailscale.d.ts +14 -11
  59. package/dist/middleware/tailscale.d.ts.map +1 -1
  60. package/dist/middleware/tailscale.js +11 -10
  61. package/dist/middleware/tailscale.js.map +1 -1
  62. package/dist/routes/brain.d.ts +9 -154
  63. package/dist/routes/brain.d.ts.map +1 -1
  64. package/dist/routes/brain.js +187 -188
  65. package/dist/routes/brain.js.map +1 -1
  66. package/dist/routes/files.d.ts +4 -88
  67. package/dist/routes/files.d.ts.map +1 -1
  68. package/dist/routes/files.js +74 -71
  69. package/dist/routes/files.js.map +1 -1
  70. package/dist/routes/graph.d.ts +4 -255
  71. package/dist/routes/graph.d.ts.map +1 -1
  72. package/dist/routes/graph.js +67 -64
  73. package/dist/routes/graph.js.map +1 -1
  74. package/dist/routes/health.d.ts +8 -22
  75. package/dist/routes/health.d.ts.map +1 -1
  76. package/dist/routes/health.js +10 -10
  77. package/dist/routes/health.js.map +1 -1
  78. package/dist/routes/models.d.ts +7 -90
  79. package/dist/routes/models.d.ts.map +1 -1
  80. package/dist/routes/models.js +53 -51
  81. package/dist/routes/models.js.map +1 -1
  82. package/dist/routes/providers.d.ts +5 -34
  83. package/dist/routes/providers.d.ts.map +1 -1
  84. package/dist/routes/providers.js +13 -11
  85. package/dist/routes/providers.js.map +1 -1
  86. package/dist/routes/sessions.d.ts +7 -78
  87. package/dist/routes/sessions.d.ts.map +1 -1
  88. package/dist/routes/sessions.js +35 -34
  89. package/dist/routes/sessions.js.map +1 -1
  90. package/dist/routes/share.d.ts +7 -60
  91. package/dist/routes/share.d.ts.map +1 -1
  92. package/dist/routes/share.js +80 -77
  93. package/dist/routes/share.js.map +1 -1
  94. package/dist/routes/voice.d.ts +8 -91
  95. package/dist/routes/voice.d.ts.map +1 -1
  96. package/dist/routes/voice.js +62 -59
  97. package/dist/routes/voice.js.map +1 -1
  98. package/dist/share/staging.d.ts +4 -4
  99. package/dist/share/staging.d.ts.map +1 -1
  100. package/dist/share/staging.js +7 -8
  101. package/dist/share/staging.js.map +1 -1
  102. package/dist/voice/deepgram-token.d.ts +1 -1
  103. package/dist/voice/deepgram-token.d.ts.map +1 -1
  104. package/dist/voice/deepgram-token.js +1 -2
  105. package/dist/voice/deepgram-token.js.map +1 -1
  106. package/dist/voice/keyterm-builder.d.ts +23 -8
  107. package/dist/voice/keyterm-builder.d.ts.map +1 -1
  108. package/dist/voice/keyterm-builder.js +67 -43
  109. package/dist/voice/keyterm-builder.js.map +1 -1
  110. package/dist/voice/speech-providers.d.ts +6 -4
  111. package/dist/voice/speech-providers.d.ts.map +1 -1
  112. package/dist/voice/speech-providers.js +28 -25
  113. package/dist/voice/speech-providers.js.map +1 -1
  114. package/dist/ws/bridge.d.ts.map +1 -1
  115. package/dist/ws/bridge.js +2 -3
  116. package/dist/ws/bridge.js.map +1 -1
  117. package/dist/ws/clients.d.ts +18 -10
  118. package/dist/ws/clients.d.ts.map +1 -1
  119. package/dist/ws/clients.js +35 -37
  120. package/dist/ws/clients.js.map +1 -1
  121. package/dist/ws/connection.d.ts.map +1 -1
  122. package/dist/ws/connection.js +5 -7
  123. package/dist/ws/connection.js.map +1 -1
  124. package/dist/ws/dispatch.d.ts.map +1 -1
  125. package/dist/ws/dispatch.js +1 -2
  126. package/dist/ws/dispatch.js.map +1 -1
  127. package/dist/ws/host.d.ts +16 -12
  128. package/dist/ws/host.d.ts.map +1 -1
  129. package/dist/ws/host.js +14 -23
  130. package/dist/ws/host.js.map +1 -1
  131. package/dist/ws/routing.d.ts +2 -1
  132. package/dist/ws/routing.d.ts.map +1 -1
  133. package/dist/ws/routing.js +5 -6
  134. package/dist/ws/routing.js.map +1 -1
  135. package/dist/ws/run-session.js +1 -1
  136. package/dist/ws/run-session.js.map +1 -1
  137. package/dist/ws/session-catalog.d.ts +2 -2
  138. package/dist/ws/session-catalog.d.ts.map +1 -1
  139. package/dist/ws/session-catalog.js +2 -3
  140. package/dist/ws/session-catalog.js.map +1 -1
  141. package/package.json +8 -5
  142. package/src/agent/backend.ts +509 -340
  143. package/src/app.ts +157 -36
  144. package/src/brain/client.ts +166 -143
  145. package/src/config/env.ts +401 -0
  146. package/src/cron/scheduler.ts +77 -59
  147. package/src/db/brain-db.ts +104 -0
  148. package/src/db/client.ts +12 -31
  149. package/src/db/settings.ts +12 -14
  150. package/src/files/walker.ts +6 -10
  151. package/src/graph/reader.ts +26 -15
  152. package/src/index.ts +56 -17
  153. package/src/middleware/auth.ts +51 -45
  154. package/src/middleware/origin.ts +1 -8
  155. package/src/middleware/passkeys.ts +72 -68
  156. package/src/middleware/tailscale.ts +22 -17
  157. package/src/routes/brain.ts +31 -30
  158. package/src/routes/files.ts +10 -7
  159. package/src/routes/graph.ts +9 -6
  160. package/src/routes/health.ts +17 -10
  161. package/src/routes/models.ts +19 -15
  162. package/src/routes/providers.ts +14 -15
  163. package/src/routes/sessions.ts +18 -11
  164. package/src/routes/share.ts +35 -24
  165. package/src/routes/voice.ts +78 -68
  166. package/src/share/staging.ts +10 -8
  167. package/src/voice/deepgram-token.ts +4 -2
  168. package/src/voice/keyterm-builder.ts +90 -56
  169. package/src/voice/speech-providers.ts +28 -24
  170. package/src/ws/bridge.ts +2 -3
  171. package/src/ws/clients.ts +38 -41
  172. package/src/ws/connection.ts +5 -7
  173. package/src/ws/dispatch.ts +1 -2
  174. package/src/ws/host.ts +24 -27
  175. package/src/ws/routing.ts +6 -10
  176. package/src/ws/run-session.ts +1 -1
  177. package/src/ws/session-catalog.ts +2 -3
  178. package/dist/ws/handler.d.ts +0 -34
  179. package/dist/ws/handler.d.ts.map +0 -1
  180. package/dist/ws/handler.js +0 -33
  181. package/dist/ws/handler.js.map +0 -1
  182. package/src/ws/handler.ts +0 -50
@@ -1 +1 @@
1
- {"version":3,"file":"health.d.ts","sourceRoot":"","sources":["../../src/routes/health.ts"],"names":[],"mappings":"AASA,eAAO,MAAM,YAAY;;;;;;;;;;;;;kBAMvB,CAAC;AAKH,eAAO,MAAM,YAAY;;;;;;;;;;;;;;;;;;;;;kBAQvB,CAAC"}
1
+ {"version":3,"file":"health.d.ts","sourceRoot":"","sources":["../../src/routes/health.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAO5B,eAAO,MAAM,YAAY;;;;;;;;;;;;;kBAMvB,CAAC;AAEH,MAAM,WAAW,UAAU;IACzB,qEAAqE;IACrE,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,IAAI,OAAO,CAAC;IACzB,YAAY,IAAI,OAAO,CAAC;CACzB;AAKD,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,UAAU,GAAG,IAAI,CAUzD"}
@@ -1,6 +1,4 @@
1
1
  import { Hono } from "hono";
2
- import { getCronStatus } from "../cron/scheduler.js";
3
- import { isTurnActive } from "../ws/handler.js";
4
2
  const startTime = Date.now();
5
3
  // Public liveness probe. Deliberately minimal: no version/commit, no cron
6
4
  // detail, no session oracle — this route sits in front of the auth guard and
@@ -15,13 +13,15 @@ export const healthRoutes = new Hono().get("/health", (c) => {
15
13
  // Operational status. Registered BEHIND the auth guard: it exposes the git SHA,
16
14
  // cron job errors (raw stderr with filesystem paths), and whether a turn is
17
15
  // active — none of which should be readable unauthenticated.
18
- export const statusRoutes = new Hono().get("/status", (c) => {
19
- return c.json({
20
- healthy: true,
21
- uptime: Date.now() - startTime,
22
- version: process.env.SOURCE_COMMIT ?? "dev",
23
- cronJobs: getCronStatus(),
24
- activeSession: isTurnActive(),
16
+ export function createStatusRoutes(deps) {
17
+ return new Hono().get("/status", (c) => {
18
+ return c.json({
19
+ healthy: true,
20
+ uptime: Date.now() - startTime,
21
+ version: deps.sourceCommit,
22
+ cronJobs: deps.getCronStatus(),
23
+ activeSession: deps.isTurnActive(),
24
+ });
25
25
  });
26
- });
26
+ }
27
27
  //# sourceMappingURL=health.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"health.js","sourceRoot":"","sources":["../../src/routes/health.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAEhD,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;AAE7B,0EAA0E;AAC1E,6EAA6E;AAC7E,wCAAwC;AACxC,MAAM,CAAC,MAAM,YAAY,GAAG,IAAI,IAAI,EAAE,CAAC,GAAG,CAAC,SAAS,EAAE,CAAC,CAAC,EAAE,EAAE;IAC1D,OAAO,CAAC,CAAC,IAAI,CAAC;QACZ,MAAM,EAAE,SAAS;QACjB,MAAM,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS;QAC9B,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;KACpC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,gFAAgF;AAChF,4EAA4E;AAC5E,6DAA6D;AAC7D,MAAM,CAAC,MAAM,YAAY,GAAG,IAAI,IAAI,EAAE,CAAC,GAAG,CAAC,SAAS,EAAE,CAAC,CAAC,EAAE,EAAE;IAC1D,OAAO,CAAC,CAAC,IAAI,CAAC;QACZ,OAAO,EAAE,IAAI;QACb,MAAM,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS;QAC9B,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,aAAa,IAAI,KAAK;QAC3C,QAAQ,EAAE,aAAa,EAAE;QACzB,aAAa,EAAE,YAAY,EAAE;KAC9B,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
1
+ {"version":3,"file":"health.js","sourceRoot":"","sources":["../../src/routes/health.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAE5B,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;AAE7B,0EAA0E;AAC1E,6EAA6E;AAC7E,wCAAwC;AACxC,MAAM,CAAC,MAAM,YAAY,GAAG,IAAI,IAAI,EAAE,CAAC,GAAG,CAAC,SAAS,EAAE,CAAC,CAAC,EAAE,EAAE;IAC1D,OAAO,CAAC,CAAC,IAAI,CAAC;QACZ,MAAM,EAAE,SAAS;QACjB,MAAM,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS;QAC9B,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;KACpC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AASH,gFAAgF;AAChF,4EAA4E;AAC5E,6DAA6D;AAC7D,MAAM,UAAU,kBAAkB,CAAC,IAAgB;IACjD,OAAO,IAAI,IAAI,EAAE,CAAC,GAAG,CAAC,SAAS,EAAE,CAAC,CAAC,EAAE,EAAE;QACrC,OAAO,CAAC,CAAC,IAAI,CAAC;YACZ,OAAO,EAAE,IAAI;YACb,MAAM,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS;YAC9B,OAAO,EAAE,IAAI,CAAC,YAAY;YAC1B,QAAQ,EAAE,IAAI,CAAC,aAAa,EAAE;YAC9B,aAAa,EAAE,IAAI,CAAC,YAAY,EAAE;SACnC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC"}
@@ -1,91 +1,8 @@
1
- export declare const modelRoutes: import("hono/hono-base").HonoBase<import("hono/types").BlankEnv, {
2
- "/models": {
3
- $get: {
4
- input: {};
5
- output: {
6
- models: {
7
- hidden: boolean;
8
- id: string;
9
- label: string;
10
- vendor?: string | undefined;
11
- backendId?: string | undefined;
12
- contextWindow?: number | undefined;
13
- source?: "builtin" | "declared" | "discovered" | undefined;
14
- }[];
15
- refreshedAt: number | null;
16
- stale: boolean;
17
- discovery: {
18
- enabled: boolean;
19
- error?: string | undefined;
20
- };
21
- };
22
- outputFormat: "json";
23
- status: import("hono/utils/http-status").ContentfulStatusCode;
24
- };
25
- };
26
- } & {
27
- "/models/hidden": {
28
- $put: {
29
- input: {};
30
- output: {
31
- models: {
32
- hidden: boolean;
33
- id: string;
34
- label: string;
35
- vendor?: string | undefined;
36
- backendId?: string | undefined;
37
- contextWindow?: number | undefined;
38
- source?: "builtin" | "declared" | "discovered" | undefined;
39
- }[];
40
- refreshedAt: number | null;
41
- stale: boolean;
42
- discovery: {
43
- enabled: boolean;
44
- error?: string | undefined;
45
- };
46
- };
47
- outputFormat: "json";
48
- status: import("hono/utils/http-status").ContentfulStatusCode;
49
- } | {
50
- input: {};
51
- output: {
52
- error: string;
53
- };
54
- outputFormat: "json";
55
- status: 400;
56
- };
57
- };
58
- } & {
59
- "/models/refresh": {
60
- $post: {
61
- input: {};
62
- output: {
63
- models: {
64
- hidden: boolean;
65
- id: string;
66
- label: string;
67
- vendor?: string | undefined;
68
- backendId?: string | undefined;
69
- contextWindow?: number | undefined;
70
- source?: "builtin" | "declared" | "discovered" | undefined;
71
- }[];
72
- refreshedAt: number | null;
73
- stale: boolean;
74
- discovery: {
75
- enabled: boolean;
76
- error?: string | undefined;
77
- };
78
- };
79
- outputFormat: "json";
80
- status: import("hono/utils/http-status").ContentfulStatusCode;
81
- } | {
82
- input: {};
83
- output: {
84
- error: string;
85
- };
86
- outputFormat: "json";
87
- status: 409;
88
- };
89
- };
90
- }, "/", "/models/refresh">;
1
+ import { Hono } from "hono";
2
+ import type { Database } from "bun:sqlite";
3
+ import type { BackendRegistry } from "../agent/backend.js";
4
+ export declare function createModelRoutes(deps: {
5
+ registry: BackendRegistry;
6
+ db: Database;
7
+ }): Hono;
91
8
  //# sourceMappingURL=models.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"models.d.ts","sourceRoot":"","sources":["../../src/routes/models.ts"],"names":[],"mappings":"AAsCA,eAAO,MAAM,WAAW;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;0BA8CpB,CAAC"}
1
+ {"version":3,"file":"models.d.ts","sourceRoot":"","sources":["../../src/routes/models.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAK3C,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAG3D,wBAAgB,iBAAiB,CAAC,IAAI,EAAE;IACtC,QAAQ,EAAE,eAAe,CAAC;IAC1B,EAAE,EAAE,QAAQ,CAAC;CACd,GAAG,IAAI,CAqEP"}
@@ -5,57 +5,59 @@
5
5
  // with its visibility, plus discovery freshness so the UI can say when the list
6
6
  // was last refreshed and why it might be stale.
7
7
  import { Hono } from "hono";
8
- import { getModelSource, invalidateProfiles, listAllProviders, } from "../agent/backend.js";
9
8
  import { getHiddenModelIds, setHiddenModelIds } from "../db/settings.js";
10
- async function buildCatalog() {
11
- const source = await getModelSource();
12
- const hidden = new Set(getHiddenModelIds());
13
- const models = (await listAllProviders({ includeHidden: true })).map((profile) => ({ ...profile, hidden: hidden.has(profile.id) }));
14
- const state = source?.state();
15
- return {
16
- models,
17
- refreshedAt: state?.refreshedAt ?? null,
18
- stale: state?.stale ?? false,
19
- discovery: {
20
- enabled: state?.enabled ?? false,
21
- ...(state?.error !== undefined ? { error: state.error } : {}),
22
- },
23
- };
24
- }
25
- export const modelRoutes = new Hono()
26
- .get("/models", async (c) => {
27
- // Serves the cached roster immediately and refreshes behind the response
28
- // when stale; only a cold start (nothing cached) waits on the network.
29
- const source = await getModelSource();
30
- await source?.ensureFresh();
31
- return c.json(await buildCatalog());
32
- })
33
- .put("/models/hidden", async (c) => {
34
- const body = (await c.req.json().catch(() => null));
35
- const hidden = body?.hidden;
36
- if (!Array.isArray(hidden) ||
37
- hidden.some((id) => typeof id !== "string")) {
38
- return c.json({ error: "hidden must be an array of profile ids" }, 400);
39
- }
40
- setHiddenModelIds(hidden);
41
- // The picker reads through a memo — drop it so the change is immediate.
42
- invalidateProfiles();
43
- return c.json(await buildCatalog());
44
- })
45
- .post("/models/refresh", async (c) => {
46
- const source = await getModelSource();
47
- if (!source) {
48
- return c.json({ error: "Model discovery is not available on this backend" }, 409);
49
- }
50
- try {
51
- await source.refresh();
9
+ export function createModelRoutes(deps) {
10
+ const { registry, db } = deps;
11
+ async function buildCatalog() {
12
+ const source = await registry.getModelSource();
13
+ const hidden = new Set(getHiddenModelIds(db));
14
+ const models = (await registry.listAllProviders({ includeHidden: true })).map((profile) => ({ ...profile, hidden: hidden.has(profile.id) }));
15
+ const state = source?.state();
16
+ return {
17
+ models,
18
+ refreshedAt: state?.refreshedAt ?? null,
19
+ stale: state?.stale ?? false,
20
+ discovery: {
21
+ enabled: state?.enabled ?? false,
22
+ ...(state?.error !== undefined ? { error: state.error } : {}),
23
+ },
24
+ };
52
25
  }
53
- catch (err) {
54
- // The previous roster is still served; report the failure in the payload
55
- // rather than 500ing, so the settings screen can show it inline.
56
- console.warn(`[models] Refresh failed: ${err instanceof Error ? err.message : String(err)}`);
57
- }
58
- invalidateProfiles();
59
- return c.json(await buildCatalog());
60
- });
26
+ return new Hono()
27
+ .get("/models", async (c) => {
28
+ // Serves the cached roster immediately and refreshes behind the response
29
+ // when stale; only a cold start (nothing cached) waits on the network.
30
+ const source = await registry.getModelSource();
31
+ await source?.ensureFresh();
32
+ return c.json(await buildCatalog());
33
+ })
34
+ .put("/models/hidden", async (c) => {
35
+ const body = (await c.req.json().catch(() => null));
36
+ const hidden = body?.hidden;
37
+ if (!Array.isArray(hidden) ||
38
+ hidden.some((id) => typeof id !== "string")) {
39
+ return c.json({ error: "hidden must be an array of profile ids" }, 400);
40
+ }
41
+ setHiddenModelIds(db, hidden);
42
+ // The picker reads through a memo — drop it so the change is immediate.
43
+ registry.invalidateProfiles();
44
+ return c.json(await buildCatalog());
45
+ })
46
+ .post("/models/refresh", async (c) => {
47
+ const source = await registry.getModelSource();
48
+ if (!source) {
49
+ return c.json({ error: "Model discovery is not available on this backend" }, 409);
50
+ }
51
+ try {
52
+ await source.refresh();
53
+ }
54
+ catch (err) {
55
+ // The previous roster is still served; report the failure in the payload
56
+ // rather than 500ing, so the settings screen can show it inline.
57
+ console.warn(`[models] Refresh failed: ${err instanceof Error ? err.message : String(err)}`);
58
+ }
59
+ registry.invalidateProfiles();
60
+ return c.json(await buildCatalog());
61
+ });
62
+ }
61
63
  //# sourceMappingURL=models.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"models.js","sourceRoot":"","sources":["../../src/routes/models.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"models.js","sourceRoot":"","sources":["../../src/routes/models.ts"],"names":[],"mappings":"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"}
@@ -1,35 +1,6 @@
1
- export declare const providerRoutes: import("hono/hono-base").HonoBase<import("hono/types").BlankEnv, {
2
- "/providers": {
3
- $get: {
4
- input: {};
5
- output: {
6
- providers: {
7
- id: string;
8
- label: string;
9
- vendor?: string | undefined;
10
- backendId?: string | undefined;
11
- contextWindow?: number | undefined;
12
- source?: "builtin" | "declared" | "discovered" | undefined;
13
- }[];
14
- backends: {
15
- [x: string]: {
16
- id: string;
17
- capabilities: {
18
- resume: boolean;
19
- permissions: boolean;
20
- thinking: boolean;
21
- attachments: boolean;
22
- askUser: boolean;
23
- costReporting: boolean;
24
- concurrentSessions: boolean;
25
- followUp: boolean;
26
- };
27
- };
28
- };
29
- };
30
- outputFormat: "json";
31
- status: import("hono/utils/http-status").ContentfulStatusCode;
32
- };
33
- };
34
- }, "/", "/providers">;
1
+ import { Hono } from "hono";
2
+ import type { BackendRegistry } from "../agent/backend.js";
3
+ export declare function createProviderRoutes(deps: {
4
+ registry: BackendRegistry;
5
+ }): Hono;
35
6
  //# sourceMappingURL=providers.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"providers.d.ts","sourceRoot":"","sources":["../../src/routes/providers.ts"],"names":[],"mappings":"AAOA,eAAO,MAAM,cAAc;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;qBAWzB,CAAC"}
1
+ {"version":3,"file":"providers.d.ts","sourceRoot":"","sources":["../../src/routes/providers.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAE3D,wBAAgB,oBAAoB,CAAC,IAAI,EAAE;IAAE,QAAQ,EAAE,eAAe,CAAA;CAAE,GAAG,IAAI,CAc9E"}
@@ -1,14 +1,16 @@
1
1
  import { Hono } from "hono";
2
- import { getBackendsInfo, getModelSource, listAllProviders, } from "../agent/backend.js";
3
- export const providerRoutes = new Hono().get("/providers", async (c) => {
4
- // Keeps the roster current without a restart: serves the cached list and
5
- // refreshes behind the response when it has gone stale. Only a cold start
6
- // (nothing cached yet) waits on the Models API.
7
- const source = await getModelSource();
8
- await source?.ensureFresh();
9
- return c.json({
10
- providers: await listAllProviders(),
11
- backends: await getBackendsInfo(),
2
+ export function createProviderRoutes(deps) {
3
+ const { registry } = deps;
4
+ return new Hono().get("/providers", async (c) => {
5
+ // Keeps the roster current without a restart: serves the cached list and
6
+ // refreshes behind the response when it has gone stale. Only a cold start
7
+ // (nothing cached yet) waits on the Models API.
8
+ const source = await registry.getModelSource();
9
+ await source?.ensureFresh();
10
+ return c.json({
11
+ providers: await registry.listAllProviders(),
12
+ backends: await registry.getBackendsInfo(),
13
+ });
12
14
  });
13
- });
15
+ }
14
16
  //# sourceMappingURL=providers.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"providers.js","sourceRoot":"","sources":["../../src/routes/providers.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,EACL,eAAe,EACf,cAAc,EACd,gBAAgB,GACjB,MAAM,qBAAqB,CAAC;AAE7B,MAAM,CAAC,MAAM,cAAc,GAAG,IAAI,IAAI,EAAE,CAAC,GAAG,CAAC,YAAY,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;IACrE,yEAAyE;IACzE,0EAA0E;IAC1E,gDAAgD;IAChD,MAAM,MAAM,GAAG,MAAM,cAAc,EAAE,CAAC;IACtC,MAAM,MAAM,EAAE,WAAW,EAAE,CAAC;IAE5B,OAAO,CAAC,CAAC,IAAI,CAAC;QACZ,SAAS,EAAE,MAAM,gBAAgB,EAAE;QACnC,QAAQ,EAAE,MAAM,eAAe,EAAE;KAClC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
1
+ {"version":3,"file":"providers.js","sourceRoot":"","sources":["../../src/routes/providers.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAG5B,MAAM,UAAU,oBAAoB,CAAC,IAAmC;IACtE,MAAM,EAAE,QAAQ,EAAE,GAAG,IAAI,CAAC;IAC1B,OAAO,IAAI,IAAI,EAAE,CAAC,GAAG,CAAC,YAAY,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;QAC9C,yEAAyE;QACzE,0EAA0E;QAC1E,gDAAgD;QAChD,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,cAAc,EAAE,CAAC;QAC/C,MAAM,MAAM,EAAE,WAAW,EAAE,CAAC;QAE5B,OAAO,CAAC,CAAC,IAAI,CAAC;YACZ,SAAS,EAAE,MAAM,QAAQ,CAAC,gBAAgB,EAAE;YAC5C,QAAQ,EAAE,MAAM,QAAQ,CAAC,eAAe,EAAE;SAC3C,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC"}
@@ -1,79 +1,8 @@
1
- export declare const sessionRoutes: import("hono/hono-base").HonoBase<import("hono/types").BlankEnv, {
2
- "/sessions": {
3
- $get: {
4
- input: {};
5
- output: {
6
- sessions: {
7
- backendId: string;
8
- id: string;
9
- title: string | null;
10
- createdAt: number;
11
- lastActiveAt: number;
12
- totalCostUsd: number;
13
- numTurns: number;
14
- }[];
15
- };
16
- outputFormat: "json";
17
- status: import("hono/utils/http-status").ContentfulStatusCode;
18
- } | {
19
- input: {};
20
- output: {
21
- error: string;
22
- };
23
- outputFormat: "json";
24
- status: 500;
25
- };
26
- };
27
- } & {
28
- "/sessions/:id": {
29
- $get: {
30
- input: {
31
- param: {
32
- id: string;
33
- };
34
- };
35
- output: {
36
- id: string;
37
- messages: {
38
- role: "user" | "assistant";
39
- content: string;
40
- thinking?: string | undefined;
41
- toolCalls: {
42
- id: string;
43
- name: string;
44
- input: {
45
- [x: string]: import("hono/utils/types").JSONValue;
46
- };
47
- output?: string | undefined;
48
- isError?: boolean | undefined;
49
- }[];
50
- parts?: ({
51
- kind: "thinking";
52
- text: string;
53
- } | {
54
- kind: "text";
55
- text: string;
56
- } | {
57
- kind: "tool";
58
- toolIndex: number;
59
- })[] | undefined;
60
- attachmentCount?: number | undefined;
61
- }[];
62
- };
63
- outputFormat: "json";
64
- status: import("hono/utils/http-status").ContentfulStatusCode;
65
- } | {
66
- input: {
67
- param: {
68
- id: string;
69
- };
70
- };
71
- output: {
72
- error: string;
73
- };
74
- outputFormat: "json";
75
- status: 500;
76
- };
77
- };
78
- }, "/", "/sessions/:id">;
1
+ import { Hono } from "hono";
2
+ import type { Database } from "bun:sqlite";
3
+ import type { BackendRegistry } from "../agent/backend.js";
4
+ export declare function createSessionRoutes(deps: {
5
+ registry: BackendRegistry;
6
+ db: Database;
7
+ }): Hono;
79
8
  //# sourceMappingURL=sessions.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"sessions.d.ts","sourceRoot":"","sources":["../../src/routes/sessions.ts"],"names":[],"mappings":"AAWA,eAAO,MAAM,aAAa;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;wBAqCtB,CAAC"}
1
+ {"version":3,"file":"sessions.d.ts","sourceRoot":"","sources":["../../src/routes/sessions.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAC3C,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAE3D,wBAAgB,mBAAmB,CAAC,IAAI,EAAE;IACxC,QAAQ,EAAE,eAAe,CAAC;IAC1B,EAAE,EAAE,QAAQ,CAAC;CACd,GAAG,IAAI,CAgDP"}
@@ -1,37 +1,38 @@
1
1
  import { Hono } from "hono";
2
- import { getBackendForSession, getBackends } from "../agent/backend.js";
3
- import { getDb } from "../db/client.js";
4
- function getStoredBackendId(sessionId) {
5
- const row = getDb()
6
- .query("SELECT backend_id AS backendId FROM sessions WHERE id = ?")
7
- .get(sessionId);
8
- return row?.backendId ?? null;
9
- }
10
- export const sessionRoutes = new Hono()
11
- .get("/sessions", async (c) => {
12
- try {
13
- const backends = await getBackends();
14
- const sessions = (await Promise.all(backends.map(async (backend) => (await backend.listSessions()).map((session) => ({
15
- ...session,
16
- backendId: backend.id,
17
- })))))
18
- .flat()
19
- .sort((a, b) => b.lastActiveAt - a.lastActiveAt);
20
- return c.json({ sessions });
21
- }
22
- catch (err) {
23
- return c.json({ error: err instanceof Error ? err.message : "Failed to list sessions" }, 500);
24
- }
25
- })
26
- .get("/sessions/:id", async (c) => {
27
- const id = c.req.param("id");
28
- try {
29
- const backend = await getBackendForSession(getStoredBackendId(id));
30
- const messages = await backend.getHistory(id);
31
- return c.json({ id, messages });
2
+ export function createSessionRoutes(deps) {
3
+ const { registry, db } = deps;
4
+ function getStoredBackendId(sessionId) {
5
+ const row = db
6
+ .query("SELECT backend_id AS backendId FROM sessions WHERE id = ?")
7
+ .get(sessionId);
8
+ return row?.backendId ?? null;
32
9
  }
33
- catch (err) {
34
- return c.json({ error: err instanceof Error ? err.message : "Failed to get session" }, 500);
35
- }
36
- });
10
+ return new Hono()
11
+ .get("/sessions", async (c) => {
12
+ try {
13
+ const backends = await registry.getBackends();
14
+ const sessions = (await Promise.all(backends.map(async (backend) => (await backend.listSessions()).map((session) => ({
15
+ ...session,
16
+ backendId: backend.id,
17
+ })))))
18
+ .flat()
19
+ .sort((a, b) => b.lastActiveAt - a.lastActiveAt);
20
+ return c.json({ sessions });
21
+ }
22
+ catch (err) {
23
+ return c.json({ error: err instanceof Error ? err.message : "Failed to list sessions" }, 500);
24
+ }
25
+ })
26
+ .get("/sessions/:id", async (c) => {
27
+ const id = c.req.param("id");
28
+ try {
29
+ const backend = await registry.getBackendForSession(getStoredBackendId(id));
30
+ const messages = await backend.getHistory(id);
31
+ return c.json({ id, messages });
32
+ }
33
+ catch (err) {
34
+ return c.json({ error: err instanceof Error ? err.message : "Failed to get session" }, 500);
35
+ }
36
+ });
37
+ }
37
38
  //# sourceMappingURL=sessions.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"sessions.js","sourceRoot":"","sources":["../../src/routes/sessions.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,EAAE,oBAAoB,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AACxE,OAAO,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAC;AAExC,SAAS,kBAAkB,CAAC,SAAiB;IAC3C,MAAM,GAAG,GAAG,KAAK,EAAE;SAChB,KAAK,CAAC,2DAA2D,CAAC;SAClE,GAAG,CAAC,SAAS,CAAwC,CAAC;IACzD,OAAO,GAAG,EAAE,SAAS,IAAI,IAAI,CAAC;AAChC,CAAC;AAED,MAAM,CAAC,MAAM,aAAa,GAAG,IAAI,IAAI,EAAE;KACpC,GAAG,CAAC,WAAW,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;IAC5B,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,WAAW,EAAE,CAAC;QACrC,MAAM,QAAQ,GAAG,CACf,MAAM,OAAO,CAAC,GAAG,CACf,QAAQ,CAAC,GAAG,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE,CAC7B,CAAC,MAAM,OAAO,CAAC,YAAY,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;YAC/C,GAAG,OAAO;YACV,SAAS,EAAE,OAAO,CAAC,EAAE;SACtB,CAAC,CAAC,CACJ,CACF,CACF;aACE,IAAI,EAAE;aACN,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,YAAY,GAAG,CAAC,CAAC,YAAY,CAAC,CAAC;QACnD,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC;IAC9B,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,CAAC,IAAI,CACX,EAAE,KAAK,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,yBAAyB,EAAE,EACzE,GAAG,CACJ,CAAC;IACJ,CAAC;AACH,CAAC,CAAC;KAED,GAAG,CAAC,eAAe,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;IAChC,MAAM,EAAE,GAAG,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC7B,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,MAAM,oBAAoB,CAAC,kBAAkB,CAAC,EAAE,CAAC,CAAC,CAAC;QACnE,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC;QAC9C,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAC;IAClC,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,CAAC,IAAI,CACX,EAAE,KAAK,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,uBAAuB,EAAE,EACvE,GAAG,CACJ,CAAC;IACJ,CAAC;AACH,CAAC,CAAC,CAAC"}
1
+ {"version":3,"file":"sessions.js","sourceRoot":"","sources":["../../src/routes/sessions.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAI5B,MAAM,UAAU,mBAAmB,CAAC,IAGnC;IACC,MAAM,EAAE,QAAQ,EAAE,EAAE,EAAE,GAAG,IAAI,CAAC;IAE9B,SAAS,kBAAkB,CAAC,SAAiB;QAC3C,MAAM,GAAG,GAAG,EAAE;aACX,KAAK,CAAC,2DAA2D,CAAC;aAClE,GAAG,CAAC,SAAS,CAAwC,CAAC;QACzD,OAAO,GAAG,EAAE,SAAS,IAAI,IAAI,CAAC;IAChC,CAAC;IAED,OAAO,IAAI,IAAI,EAAE;SAChB,GAAG,CAAC,WAAW,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;QAC5B,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,QAAQ,CAAC,WAAW,EAAE,CAAC;YAC9C,MAAM,QAAQ,GAAG,CACf,MAAM,OAAO,CAAC,GAAG,CACf,QAAQ,CAAC,GAAG,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE,CAC7B,CAAC,MAAM,OAAO,CAAC,YAAY,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;gBAC/C,GAAG,OAAO;gBACV,SAAS,EAAE,OAAO,CAAC,EAAE;aACtB,CAAC,CAAC,CACJ,CACF,CACF;iBACE,IAAI,EAAE;iBACN,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,YAAY,GAAG,CAAC,CAAC,YAAY,CAAC,CAAC;YACnD,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC;QAC9B,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,CAAC,CAAC,IAAI,CACX,EAAE,KAAK,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,yBAAyB,EAAE,EACzE,GAAG,CACJ,CAAC;QACJ,CAAC;IACH,CAAC,CAAC;SAED,GAAG,CAAC,eAAe,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;QAChC,MAAM,EAAE,GAAG,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAC7B,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,oBAAoB,CAAC,kBAAkB,CAAC,EAAE,CAAC,CAAC,CAAC;YAC5E,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC;YAC9C,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAC;QAClC,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,CAAC,CAAC,IAAI,CACX,EAAE,KAAK,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,uBAAuB,EAAE,EACvE,GAAG,CACJ,CAAC;QACJ,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC"}
@@ -1,3 +1,4 @@
1
+ import { Hono } from "hono";
1
2
  /**
2
3
  * Answer a share that reached the SERVER — which means no service worker was
3
4
  * there to intercept it.
@@ -26,64 +27,10 @@ export declare const shareTargetFallbackRoutes: import("hono/hono-base").HonoBas
26
27
  };
27
28
  };
28
29
  }, "/", "/share-target">;
29
- export declare const shareRoutes: import("hono/hono-base").HonoBase<import("hono/types").BlankEnv, {
30
- "/share": {
31
- $post: {
32
- input: {};
33
- output: {
34
- error: string;
35
- };
36
- outputFormat: "json";
37
- status: 403;
38
- } | {
39
- input: {};
40
- output: {
41
- error: string;
42
- };
43
- outputFormat: "json";
44
- status: 503;
45
- } | {
46
- input: {};
47
- output: {
48
- error: string;
49
- limit: number;
50
- };
51
- outputFormat: "json";
52
- status: 413;
53
- } | {
54
- input: {};
55
- output: {
56
- error: string;
57
- };
58
- outputFormat: "json";
59
- status: 400;
60
- } | {
61
- input: {};
62
- output: {
63
- id: string;
64
- dir: string;
65
- receivedAt: number;
66
- title?: string | undefined;
67
- text?: string | undefined;
68
- url?: string | undefined;
69
- files: {
70
- name: string;
71
- path: string;
72
- mediaType: string;
73
- bytes: number;
74
- }[];
75
- skipped?: string[] | undefined;
76
- };
77
- outputFormat: "json";
78
- status: 201;
79
- } | {
80
- input: {};
81
- output: {
82
- error: string;
83
- };
84
- outputFormat: "json";
85
- status: 500;
86
- };
87
- };
88
- }, "/", "/share">;
30
+ export interface ShareRoutesDeps {
31
+ brainRoot: string;
32
+ /** ALLOWED_ORIGINS — the same-origin check's split-topology allowlist. */
33
+ allowedOrigins: string[];
34
+ }
35
+ export declare function createShareRoutes(deps: ShareRoutesDeps): Hono;
89
36
  //# sourceMappingURL=share.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"share.d.ts","sourceRoot":"","sources":["../../src/routes/share.ts"],"names":[],"mappings":"AA8DA;;;;;;;;;;;;;;;;;GAiBG;AACH,eAAO,MAAM,yBAAyB;;;;;;;;;wBAErC,CAAC;AA8BF,eAAO,MAAM,WAAW;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAiEtB,CAAC"}
1
+ {"version":3,"file":"share.d.ts","sourceRoot":"","sources":["../../src/routes/share.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AA8D5B;;;;;;;;;;;;;;;;;GAiBG;AACH,eAAO,MAAM,yBAAyB;;;;;;;;;wBAErC,CAAC;AASF,MAAM,WAAW,eAAe;IAC9B,SAAS,EAAE,MAAM,CAAC;IAClB,0EAA0E;IAC1E,cAAc,EAAE,MAAM,EAAE,CAAC;CAC1B;AAED,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,eAAe,GAAG,IAAI,CA2F7D"}