jinn-cli 0.3.0 → 0.4.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 (132) hide show
  1. package/dist/src/cli/chrome-allow.d.ts.map +1 -1
  2. package/dist/src/cli/chrome-allow.js +14 -5
  3. package/dist/src/cli/chrome-allow.js.map +1 -1
  4. package/dist/src/cli/list.js +1 -1
  5. package/dist/src/cli/list.js.map +1 -1
  6. package/dist/src/cli/nuke.js +2 -2
  7. package/dist/src/cli/nuke.js.map +1 -1
  8. package/dist/src/cli/setup.d.ts.map +1 -1
  9. package/dist/src/cli/setup.js +2 -1
  10. package/dist/src/cli/setup.js.map +1 -1
  11. package/dist/src/connectors/slack/index.d.ts +9 -1
  12. package/dist/src/connectors/slack/index.d.ts.map +1 -1
  13. package/dist/src/connectors/slack/index.js +172 -8
  14. package/dist/src/connectors/slack/index.js.map +1 -1
  15. package/dist/src/connectors/slack/threads.d.ts +1 -4
  16. package/dist/src/connectors/slack/threads.d.ts.map +1 -1
  17. package/dist/src/connectors/slack/threads.js +17 -7
  18. package/dist/src/connectors/slack/threads.js.map +1 -1
  19. package/dist/src/connectors/slack/threads.test.js +42 -8
  20. package/dist/src/connectors/slack/threads.test.js.map +1 -1
  21. package/dist/src/cron/runner.d.ts.map +1 -1
  22. package/dist/src/cron/runner.js +16 -5
  23. package/dist/src/cron/runner.js.map +1 -1
  24. package/dist/src/engines/claude.d.ts.map +1 -1
  25. package/dist/src/engines/claude.js +19 -4
  26. package/dist/src/engines/claude.js.map +1 -1
  27. package/dist/src/gateway/api.d.ts.map +1 -1
  28. package/dist/src/gateway/api.js +214 -3
  29. package/dist/src/gateway/api.js.map +1 -1
  30. package/dist/src/gateway/files.d.ts +6 -0
  31. package/dist/src/gateway/files.d.ts.map +1 -0
  32. package/dist/src/gateway/files.js +430 -0
  33. package/dist/src/gateway/files.js.map +1 -0
  34. package/dist/src/gateway/lifecycle.d.ts.map +1 -1
  35. package/dist/src/gateway/lifecycle.js +16 -6
  36. package/dist/src/gateway/lifecycle.js.map +1 -1
  37. package/dist/src/gateway/org.d.ts.map +1 -1
  38. package/dist/src/gateway/org.js +1 -0
  39. package/dist/src/gateway/org.js.map +1 -1
  40. package/dist/src/gateway/server.d.ts.map +1 -1
  41. package/dist/src/gateway/server.js +42 -1
  42. package/dist/src/gateway/server.js.map +1 -1
  43. package/dist/src/gateway/watcher.d.ts.map +1 -1
  44. package/dist/src/gateway/watcher.js +9 -2
  45. package/dist/src/gateway/watcher.js.map +1 -1
  46. package/dist/src/mcp/gateway-server.d.ts +13 -0
  47. package/dist/src/mcp/gateway-server.d.ts.map +1 -0
  48. package/dist/src/mcp/gateway-server.js +375 -0
  49. package/dist/src/mcp/gateway-server.js.map +1 -0
  50. package/dist/src/mcp/resolver.d.ts +19 -0
  51. package/dist/src/mcp/resolver.d.ts.map +1 -0
  52. package/dist/src/mcp/resolver.js +153 -0
  53. package/dist/src/mcp/resolver.js.map +1 -0
  54. package/dist/src/sessions/context.d.ts +1 -0
  55. package/dist/src/sessions/context.d.ts.map +1 -1
  56. package/dist/src/sessions/context.js +34 -3
  57. package/dist/src/sessions/context.js.map +1 -1
  58. package/dist/src/sessions/limits.d.ts +7 -0
  59. package/dist/src/sessions/limits.d.ts.map +1 -0
  60. package/dist/src/sessions/limits.js +42 -0
  61. package/dist/src/sessions/limits.js.map +1 -0
  62. package/dist/src/sessions/manager.d.ts +3 -1
  63. package/dist/src/sessions/manager.d.ts.map +1 -1
  64. package/dist/src/sessions/manager.js +38 -17
  65. package/dist/src/sessions/manager.js.map +1 -1
  66. package/dist/src/sessions/registry.d.ts +24 -0
  67. package/dist/src/sessions/registry.d.ts.map +1 -1
  68. package/dist/src/sessions/registry.js +76 -5
  69. package/dist/src/sessions/registry.js.map +1 -1
  70. package/dist/src/shared/effort.d.ts +17 -0
  71. package/dist/src/shared/effort.d.ts.map +1 -0
  72. package/dist/src/shared/effort.js +44 -0
  73. package/dist/src/shared/effort.js.map +1 -0
  74. package/dist/src/shared/paths.d.ts +3 -0
  75. package/dist/src/shared/paths.d.ts.map +1 -1
  76. package/dist/src/shared/paths.js +3 -0
  77. package/dist/src/shared/paths.js.map +1 -1
  78. package/dist/src/shared/types.d.ts +61 -1
  79. package/dist/src/shared/types.d.ts.map +1 -1
  80. package/dist/src/stt/stt.d.ts +24 -0
  81. package/dist/src/stt/stt.d.ts.map +1 -0
  82. package/dist/src/stt/stt.js +203 -0
  83. package/dist/src/stt/stt.js.map +1 -0
  84. package/dist/web/404.html +1 -1
  85. package/dist/web/_next/static/chunks/{704-af2893821e1d18dc.js → 704-ca24be493a922639.js} +1 -1
  86. package/dist/web/_next/static/chunks/{73-c226535579393e21.js → 73-2d6e730cea0fe6c8.js} +1 -1
  87. package/dist/web/_next/static/chunks/app/_not-found/{page-bb075b0779827928.js → page-7d43a486b7014af3.js} +1 -1
  88. package/dist/web/_next/static/chunks/app/chat/page-2f3c561ed768ed58.js +1 -0
  89. package/dist/web/_next/static/chunks/app/costs/{page-d6c03718defdb599.js → page-13a6f2c65a827f8a.js} +1 -1
  90. package/dist/web/_next/static/chunks/app/cron/{page-4c563eef2b6231fe.js → page-0ee07a679c7b79aa.js} +1 -1
  91. package/dist/web/_next/static/chunks/app/kanban/{page-55a73165a36f4077.js → page-a7facadd4194faae.js} +1 -1
  92. package/dist/web/_next/static/chunks/app/layout-fd975d16033dab25.js +1 -0
  93. package/dist/web/_next/static/chunks/app/logs/page-6de6b16523e85193.js +1 -0
  94. package/dist/web/_next/static/chunks/app/org/{page-d5cd8d9b7864737b.js → page-cd9d362e77f4799e.js} +1 -1
  95. package/dist/web/_next/static/chunks/app/{page-b81992940fd1dbc6.js → page-b98417ed4f4d45a0.js} +1 -1
  96. package/dist/web/_next/static/chunks/app/sessions/{page-c83c890177c18258.js → page-9f83fa32b654db3b.js} +1 -1
  97. package/dist/web/_next/static/chunks/app/settings/page-34c9276e2a012445.js +1 -0
  98. package/dist/web/_next/static/chunks/app/skills/page-18cf3b7bb9a7339c.js +1 -0
  99. package/dist/web/_next/static/chunks/main-app-0c65af8a0fd99888.js +1 -0
  100. package/dist/web/_next/static/css/24da9dfc818cea32.css +1 -0
  101. package/dist/web/chat.html +1 -1
  102. package/dist/web/chat.txt +5 -5
  103. package/dist/web/costs.html +2 -2
  104. package/dist/web/costs.txt +5 -5
  105. package/dist/web/cron.html +1 -1
  106. package/dist/web/cron.txt +5 -5
  107. package/dist/web/index.html +1 -1
  108. package/dist/web/index.txt +5 -5
  109. package/dist/web/kanban.html +1 -1
  110. package/dist/web/kanban.txt +5 -5
  111. package/dist/web/logs.html +2 -2
  112. package/dist/web/logs.txt +5 -5
  113. package/dist/web/org.html +1 -1
  114. package/dist/web/org.txt +5 -5
  115. package/dist/web/sessions.html +1 -1
  116. package/dist/web/sessions.txt +5 -5
  117. package/dist/web/settings.html +1 -1
  118. package/dist/web/settings.txt +5 -5
  119. package/dist/web/skills.html +1 -1
  120. package/dist/web/skills.txt +5 -5
  121. package/package.json +3 -1
  122. package/template/config.default.yaml +32 -0
  123. package/template/docs/mcp.md +108 -0
  124. package/dist/web/_next/static/chunks/app/chat/page-6d5bc707a45c92c6.js +0 -1
  125. package/dist/web/_next/static/chunks/app/layout-5129b67d5f126cf0.js +0 -1
  126. package/dist/web/_next/static/chunks/app/logs/page-e18889d67e48c9c9.js +0 -1
  127. package/dist/web/_next/static/chunks/app/settings/page-2583d55551abdf72.js +0 -1
  128. package/dist/web/_next/static/chunks/app/skills/page-df9465e314561bb5.js +0 -1
  129. package/dist/web/_next/static/chunks/main-app-437f51faf74fbb3b.js +0 -1
  130. package/dist/web/_next/static/css/4a6a5bca9238c104.css +0 -1
  131. /package/dist/web/_next/static/{jt8R5JvUgfB9CMfFwWFr0 → Tn0FXDHalXGkNoojna-vg}/_buildManifest.js +0 -0
  132. /package/dist/web/_next/static/{jt8R5JvUgfB9CMfFwWFr0 → Tn0FXDHalXGkNoojna-vg}/_ssgManifest.js +0 -0
@@ -0,0 +1,44 @@
1
+ import { logger } from "./logger.js";
2
+ const VALID_EFFORTS = new Set(["low", "medium", "high"]);
3
+ /**
4
+ * Resolve the effort level for a session.
5
+ *
6
+ * For child sessions (has parentSessionId), resolution chain:
7
+ * 1. config.engines.<engine>.childEffortOverride — global cost-control knob
8
+ * 2. session.effortLevel — COO's per-task judgment (from API body)
9
+ * 3. employee.effortLevel — employee YAML default
10
+ * 4. config.engines.<engine>.effortLevel — engine fallback
11
+ *
12
+ * For non-child sessions (COO's own), use engine effortLevel directly.
13
+ */
14
+ export function resolveEffort(engineConfig, session, employee) {
15
+ if (session.parentSessionId) {
16
+ const override = engineConfig.childEffortOverride;
17
+ if (override) {
18
+ if (VALID_EFFORTS.has(override))
19
+ return override;
20
+ logger.warn(`Invalid childEffortOverride "${override}" in engine config, skipping`);
21
+ }
22
+ const requested = session.effortLevel;
23
+ if (requested) {
24
+ if (VALID_EFFORTS.has(requested))
25
+ return requested;
26
+ logger.warn(`Invalid effortLevel "${requested}" on session, skipping`);
27
+ }
28
+ const empDefault = employee?.effortLevel;
29
+ if (empDefault) {
30
+ if (VALID_EFFORTS.has(empDefault))
31
+ return empDefault;
32
+ logger.warn(`Invalid effortLevel "${empDefault}" on employee, skipping`);
33
+ }
34
+ }
35
+ // Non-child sessions (COO) or fallback
36
+ const engineDefault = engineConfig.effortLevel;
37
+ if (engineDefault && VALID_EFFORTS.has(engineDefault))
38
+ return engineDefault;
39
+ if (engineDefault) {
40
+ logger.warn(`Invalid effortLevel "${engineDefault}" in engine config, defaulting to "medium"`);
41
+ }
42
+ return "medium";
43
+ }
44
+ //# sourceMappingURL=effort.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"effort.js","sourceRoot":"","sources":["../../../src/shared/effort.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAGrC,MAAM,aAAa,GAAG,IAAI,GAAG,CAAC,CAAC,KAAK,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC;AAEzD;;;;;;;;;;GAUG;AACH,MAAM,UAAU,aAAa,CAC3B,YAAoE,EACpE,OAAyD,EACzD,QAA+C;IAE/C,IAAI,OAAO,CAAC,eAAe,EAAE,CAAC;QAC5B,MAAM,QAAQ,GAAG,YAAY,CAAC,mBAAmB,CAAC;QAClD,IAAI,QAAQ,EAAE,CAAC;YACb,IAAI,aAAa,CAAC,GAAG,CAAC,QAAQ,CAAC;gBAAE,OAAO,QAAQ,CAAC;YACjD,MAAM,CAAC,IAAI,CAAC,gCAAgC,QAAQ,8BAA8B,CAAC,CAAC;QACtF,CAAC;QAED,MAAM,SAAS,GAAG,OAAO,CAAC,WAAW,CAAC;QACtC,IAAI,SAAS,EAAE,CAAC;YACd,IAAI,aAAa,CAAC,GAAG,CAAC,SAAS,CAAC;gBAAE,OAAO,SAAS,CAAC;YACnD,MAAM,CAAC,IAAI,CAAC,wBAAwB,SAAS,wBAAwB,CAAC,CAAC;QACzE,CAAC;QAED,MAAM,UAAU,GAAG,QAAQ,EAAE,WAAW,CAAC;QACzC,IAAI,UAAU,EAAE,CAAC;YACf,IAAI,aAAa,CAAC,GAAG,CAAC,UAAU,CAAC;gBAAE,OAAO,UAAU,CAAC;YACrD,MAAM,CAAC,IAAI,CAAC,wBAAwB,UAAU,yBAAyB,CAAC,CAAC;QAC3E,CAAC;IACH,CAAC;IAED,uCAAuC;IACvC,MAAM,aAAa,GAAG,YAAY,CAAC,WAAW,CAAC;IAC/C,IAAI,aAAa,IAAI,aAAa,CAAC,GAAG,CAAC,aAAa,CAAC;QAAE,OAAO,aAAa,CAAC;IAC5E,IAAI,aAAa,EAAE,CAAC;QAClB,MAAM,CAAC,IAAI,CAAC,wBAAwB,aAAa,4CAA4C,CAAC,CAAC;IACjG,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC"}
@@ -8,10 +8,13 @@ export declare const SKILLS_DIR: string;
8
8
  export declare const DOCS_DIR: string;
9
9
  export declare const LOGS_DIR: string;
10
10
  export declare const TMP_DIR: string;
11
+ export declare const MODELS_DIR: string;
12
+ export declare const STT_MODELS_DIR: string;
11
13
  export declare const PID_FILE: string;
12
14
  export declare const CLAUDE_SKILLS_DIR: string;
13
15
  export declare const AGENTS_SKILLS_DIR: string;
14
16
  export declare const TEMPLATE_DIR: string;
17
+ export declare const FILES_DIR: string;
15
18
  export declare const MIGRATIONS_DIR: string;
16
19
  export declare const TEMPLATE_MIGRATIONS_DIR: string;
17
20
  /** Path to the global instances registry (always in default ~/.jinn/) */
@@ -1 +1 @@
1
- {"version":3,"file":"paths.d.ts","sourceRoot":"","sources":["../../../src/shared/paths.ts"],"names":[],"mappings":"AAcA,eAAO,MAAM,SAAS,QAAgB,CAAC;AACvC,eAAO,MAAM,WAAW,QAAsC,CAAC;AAC/D,eAAO,MAAM,WAAW,QAAkD,CAAC;AAC3E,eAAO,MAAM,SAAS,QAA4C,CAAC;AACnE,eAAO,MAAM,SAAS,QAAuC,CAAC;AAC9D,eAAO,MAAM,OAAO,QAA8B,CAAC;AACnD,eAAO,MAAM,UAAU,QAAiC,CAAC;AACzD,eAAO,MAAM,QAAQ,QAA+B,CAAC;AACrD,eAAO,MAAM,QAAQ,QAA+B,CAAC;AACrD,eAAO,MAAM,OAAO,QAA8B,CAAC;AACnD,eAAO,MAAM,QAAQ,QAAsC,CAAC;AAC5D,eAAO,MAAM,iBAAiB,QAA4C,CAAC;AAC3E,eAAO,MAAM,iBAAiB,QAA4C,CAAC;AAC3E,eAAO,MAAM,YAAY,QAAqD,CAAC;AAC/E,eAAO,MAAM,cAAc,QAAqC,CAAC;AACjE,eAAO,MAAM,uBAAuB,QAAwC,CAAC;AAE7E,yEAAyE;AACzE,eAAO,MAAM,kBAAkB,QAAqD,CAAC"}
1
+ {"version":3,"file":"paths.d.ts","sourceRoot":"","sources":["../../../src/shared/paths.ts"],"names":[],"mappings":"AAcA,eAAO,MAAM,SAAS,QAAgB,CAAC;AACvC,eAAO,MAAM,WAAW,QAAsC,CAAC;AAC/D,eAAO,MAAM,WAAW,QAAkD,CAAC;AAC3E,eAAO,MAAM,SAAS,QAA4C,CAAC;AACnE,eAAO,MAAM,SAAS,QAAuC,CAAC;AAC9D,eAAO,MAAM,OAAO,QAA8B,CAAC;AACnD,eAAO,MAAM,UAAU,QAAiC,CAAC;AACzD,eAAO,MAAM,QAAQ,QAA+B,CAAC;AACrD,eAAO,MAAM,QAAQ,QAA+B,CAAC;AACrD,eAAO,MAAM,OAAO,QAA8B,CAAC;AACnD,eAAO,MAAM,UAAU,QAAiC,CAAC;AACzD,eAAO,MAAM,cAAc,QAA4C,CAAC;AACxE,eAAO,MAAM,QAAQ,QAAsC,CAAC;AAC5D,eAAO,MAAM,iBAAiB,QAA4C,CAAC;AAC3E,eAAO,MAAM,iBAAiB,QAA4C,CAAC;AAC3E,eAAO,MAAM,YAAY,QAAqD,CAAC;AAC/E,eAAO,MAAM,SAAS,QAAgC,CAAC;AACvD,eAAO,MAAM,cAAc,QAAqC,CAAC;AACjE,eAAO,MAAM,uBAAuB,QAAwC,CAAC;AAE7E,yEAAyE;AACzE,eAAO,MAAM,kBAAkB,QAAqD,CAAC"}
@@ -20,10 +20,13 @@ export const SKILLS_DIR = path.join(JINN_HOME, "skills");
20
20
  export const DOCS_DIR = path.join(JINN_HOME, "docs");
21
21
  export const LOGS_DIR = path.join(JINN_HOME, "logs");
22
22
  export const TMP_DIR = path.join(JINN_HOME, "tmp");
23
+ export const MODELS_DIR = path.join(JINN_HOME, "models");
24
+ export const STT_MODELS_DIR = path.join(JINN_HOME, "models", "whisper");
23
25
  export const PID_FILE = path.join(JINN_HOME, "gateway.pid");
24
26
  export const CLAUDE_SKILLS_DIR = path.join(JINN_HOME, ".claude", "skills");
25
27
  export const AGENTS_SKILLS_DIR = path.join(JINN_HOME, ".agents", "skills");
26
28
  export const TEMPLATE_DIR = path.join(__dirname, "..", "..", "..", "template");
29
+ export const FILES_DIR = path.join(JINN_HOME, "files");
27
30
  export const MIGRATIONS_DIR = path.join(JINN_HOME, "migrations");
28
31
  export const TEMPLATE_MIGRATIONS_DIR = path.join(TEMPLATE_DIR, "migrations");
29
32
  /** Path to the global instances registry (always in default ~/.jinn/) */
@@ -1 +1 @@
1
- {"version":3,"file":"paths.js","sourceRoot":"","sources":["../../../src/shared/paths.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAEzC,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAClD,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;AAE3C,2DAA2D;AAC3D,SAAS,WAAW;IAClB,IAAI,OAAO,CAAC,GAAG,CAAC,SAAS;QAAE,OAAO,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC;IACxD,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,aAAa,IAAI,MAAM,CAAC;IACrD,OAAO,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,IAAI,QAAQ,EAAE,CAAC,CAAC;AACjD,CAAC;AAED,MAAM,CAAC,MAAM,SAAS,GAAG,WAAW,EAAE,CAAC;AACvC,MAAM,CAAC,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,aAAa,CAAC,CAAC;AAC/D,MAAM,CAAC,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,UAAU,EAAE,aAAa,CAAC,CAAC;AAC3E,MAAM,CAAC,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,MAAM,EAAE,WAAW,CAAC,CAAC;AACnE,MAAM,CAAC,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;AAC9D,MAAM,CAAC,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;AACnD,MAAM,CAAC,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;AACzD,MAAM,CAAC,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;AACrD,MAAM,CAAC,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;AACrD,MAAM,CAAC,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;AACnD,MAAM,CAAC,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,aAAa,CAAC,CAAC;AAC5D,MAAM,CAAC,MAAM,iBAAiB,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAC;AAC3E,MAAM,CAAC,MAAM,iBAAiB,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAC;AAC3E,MAAM,CAAC,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,UAAU,CAAC,CAAC;AAC/E,MAAM,CAAC,MAAM,cAAc,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,YAAY,CAAC,CAAC;AACjE,MAAM,CAAC,MAAM,uBAAuB,GAAG,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,YAAY,CAAC,CAAC;AAE7E,yEAAyE;AACzE,MAAM,CAAC,MAAM,kBAAkB,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,OAAO,EAAE,gBAAgB,CAAC,CAAC"}
1
+ {"version":3,"file":"paths.js","sourceRoot":"","sources":["../../../src/shared/paths.ts"],"names":[],"mappings":"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"}
@@ -29,6 +29,8 @@ export interface EngineRunOpts {
29
29
  attachments?: string[];
30
30
  /** Extra CLI flags to pass to the engine binary (e.g. ["--chrome"]) */
31
31
  cliFlags?: string[];
32
+ /** Path to MCP config JSON file (passed as --mcp-config to Claude Code) */
33
+ mcpConfigPath?: string;
32
34
  onStream?: (delta: StreamDelta) => void;
33
35
  /** Unique Jinn session ID for tracking the spawned process. */
34
36
  sessionId?: string;
@@ -70,6 +72,7 @@ export interface Connector {
70
72
  addReaction(target: Target, emoji: string): Promise<void>;
71
73
  removeReaction(target: Target, emoji: string): Promise<void>;
72
74
  editMessage(target: Target, text: string): Promise<void>;
75
+ setTypingStatus?(channelId: string, threadTs: string | undefined, status: string): Promise<void>;
73
76
  onMessage(handler: (msg: IncomingMessage) => void): void;
74
77
  }
75
78
  export interface IncomingMessage {
@@ -115,6 +118,9 @@ export interface Session {
115
118
  title: string | null;
116
119
  parentSessionId: string | null;
117
120
  status: "idle" | "running" | "error";
121
+ effortLevel: string | null;
122
+ totalCost: number;
123
+ totalTurns: number;
118
124
  queueDepth?: number;
119
125
  transportState?: "idle" | "queued" | "running" | "error";
120
126
  createdAt: string;
@@ -149,18 +155,52 @@ export interface Employee {
149
155
  emoji?: string;
150
156
  /** Extra CLI flags passed to the engine (e.g. ["--chrome"]) */
151
157
  cliFlags?: string[];
158
+ /** MCP servers this employee needs. true = all global, false = none, string[] = specific servers */
159
+ mcp?: boolean | string[];
160
+ /** Max cost in USD for a single session. Overrides global config. */
161
+ maxCostUsd?: number;
162
+ /** Default effort level for sessions assigned to this employee */
163
+ effortLevel?: string;
152
164
  }
153
165
  export interface Department {
154
166
  name: string;
155
167
  displayName: string;
156
168
  description: string;
157
169
  }
170
+ export interface McpServerConfig {
171
+ /** Shell command to start the MCP server */
172
+ command: string;
173
+ /** Arguments to pass to the command */
174
+ args?: string[];
175
+ /** Environment variables for the MCP server process */
176
+ env?: Record<string, string>;
177
+ }
178
+ export interface McpGlobalConfig {
179
+ browser?: {
180
+ enabled: boolean;
181
+ provider?: "playwright" | "puppeteer";
182
+ };
183
+ search?: {
184
+ enabled: boolean;
185
+ provider?: "brave";
186
+ apiKey?: string;
187
+ };
188
+ fetch?: {
189
+ enabled: boolean;
190
+ };
191
+ gateway?: {
192
+ enabled: boolean;
193
+ };
194
+ /** Custom MCP servers defined by the user */
195
+ custom?: Record<string, McpServerConfig & {
196
+ enabled?: boolean;
197
+ }>;
198
+ }
158
199
  export interface WebConnectorConfig {
159
200
  }
160
201
  export interface SlackConnectorConfig {
161
202
  appToken: string;
162
203
  botToken: string;
163
- shareSessionInChannel?: boolean;
164
204
  allowFrom?: string | string[];
165
205
  ignoreOldMessagesOnBoot?: boolean;
166
206
  }
@@ -184,11 +224,13 @@ export interface JinnConfig {
184
224
  bin: string;
185
225
  model: string;
186
226
  effortLevel?: string;
227
+ childEffortOverride?: string;
187
228
  };
188
229
  codex: {
189
230
  bin: string;
190
231
  model: string;
191
232
  effortLevel?: string;
233
+ childEffortOverride?: string;
192
234
  };
193
235
  };
194
236
  connectors: Record<string, any> & {
@@ -200,9 +242,27 @@ export interface JinnConfig {
200
242
  stdout: boolean;
201
243
  level: string;
202
244
  };
245
+ mcp?: McpGlobalConfig;
246
+ sessions?: {
247
+ maxDurationMinutes?: number;
248
+ maxCostUsd?: number;
249
+ };
203
250
  cron?: {
204
251
  defaultDelivery?: CronDelivery;
252
+ alertChannel?: string;
253
+ alertConnector?: string;
205
254
  };
206
255
  portal?: PortalConfig;
256
+ stt?: {
257
+ enabled?: boolean;
258
+ model?: string;
259
+ /** @deprecated Use `languages` instead. Kept for backwards compat. */
260
+ language?: string;
261
+ languages?: string[];
262
+ };
263
+ remotes?: Record<string, {
264
+ url: string;
265
+ label?: string;
266
+ }>;
207
267
  }
208
268
  //# sourceMappingURL=types.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/shared/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/shared/types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ /** Valid Whisper language codes (ISO 639-1). */
2
+ export declare const WHISPER_LANGUAGES: Record<string, string>;
3
+ /** Ensure models directory exists. */
4
+ export declare function initStt(): void;
5
+ export declare function getModelPath(model: string): string | null;
6
+ export interface SttStatus {
7
+ available: boolean;
8
+ model: string | null;
9
+ downloading: boolean;
10
+ progress: number;
11
+ languages: string[];
12
+ }
13
+ /**
14
+ * Resolve the languages list from config, with backwards compat for the
15
+ * old `language: "en"` string format.
16
+ */
17
+ export declare function resolveLanguages(sttConfig?: {
18
+ language?: string;
19
+ languages?: string[];
20
+ }): string[];
21
+ export declare function getSttStatus(configModel?: string, languages?: string[]): SttStatus;
22
+ export declare function downloadModel(model: string, onProgress: (progress: number) => void): Promise<void>;
23
+ export declare function transcribe(audioPath: string, model: string, language?: string): Promise<string>;
24
+ //# sourceMappingURL=stt.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stt.d.ts","sourceRoot":"","sources":["../../../src/stt/stt.ts"],"names":[],"mappings":"AAYA,gDAAgD;AAChD,eAAO,MAAM,iBAAiB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CASpD,CAAC;AAiCF,sCAAsC;AACtC,wBAAgB,OAAO,IAAI,IAAI,CAG9B;AAED,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAKzD;AAED,MAAM,WAAW,SAAS;IACxB,SAAS,EAAE,OAAO,CAAC;IACnB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,WAAW,EAAE,OAAO,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,EAAE,CAAC;CACrB;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,SAAS,CAAC,EAAE;IAAE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,EAAE,CAAA;CAAE,GAAG,MAAM,EAAE,CAIlG;AAED,wBAAgB,YAAY,CAAC,WAAW,CAAC,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,EAAE,GAAG,SAAS,CAUlF;AAED,wBAAsB,aAAa,CACjC,KAAK,EAAE,MAAM,EACb,UAAU,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,IAAI,GACrC,OAAO,CAAC,IAAI,CAAC,CAkEf;AAqBD,wBAAsB,UAAU,CAC9B,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,MAAM,EACb,QAAQ,CAAC,EAAE,MAAM,GAChB,OAAO,CAAC,MAAM,CAAC,CAsCjB"}
@@ -0,0 +1,203 @@
1
+ import fs from "node:fs";
2
+ import path from "node:path";
3
+ import { execFile, spawn } from "node:child_process";
4
+ import { promisify } from "node:util";
5
+ import { STT_MODELS_DIR } from "../shared/paths.js";
6
+ import { logger } from "../shared/logger.js";
7
+ const execFileAsync = promisify(execFile);
8
+ const WHISPER_CLI = "whisper-cli";
9
+ const FFMPEG = "ffmpeg";
10
+ /** Valid Whisper language codes (ISO 639-1). */
11
+ export const WHISPER_LANGUAGES = {
12
+ en: "English", bg: "Bulgarian", de: "German", fr: "French", es: "Spanish",
13
+ it: "Italian", pt: "Portuguese", ru: "Russian", zh: "Chinese", ja: "Japanese",
14
+ ko: "Korean", ar: "Arabic", hi: "Hindi", tr: "Turkish", pl: "Polish",
15
+ nl: "Dutch", sv: "Swedish", cs: "Czech", el: "Greek", ro: "Romanian",
16
+ uk: "Ukrainian", he: "Hebrew", da: "Danish", fi: "Finnish", hu: "Hungarian",
17
+ no: "Norwegian", sk: "Slovak", hr: "Croatian", ca: "Catalan", th: "Thai",
18
+ vi: "Vietnamese", id: "Indonesian", ms: "Malay", tl: "Filipino", sr: "Serbian",
19
+ lt: "Lithuanian", lv: "Latvian", sl: "Slovenian", et: "Estonian",
20
+ };
21
+ const MODEL_URLS = {
22
+ tiny: "https://huggingface.co/ggerganov/whisper.cpp/resolve/main/ggml-tiny.bin",
23
+ "tiny.en": "https://huggingface.co/ggerganov/whisper.cpp/resolve/main/ggml-tiny.en.bin",
24
+ base: "https://huggingface.co/ggerganov/whisper.cpp/resolve/main/ggml-base.bin",
25
+ "base.en": "https://huggingface.co/ggerganov/whisper.cpp/resolve/main/ggml-base.en.bin",
26
+ small: "https://huggingface.co/ggerganov/whisper.cpp/resolve/main/ggml-small.bin",
27
+ "small.en": "https://huggingface.co/ggerganov/whisper.cpp/resolve/main/ggml-small.en.bin",
28
+ medium: "https://huggingface.co/ggerganov/whisper.cpp/resolve/main/ggml-medium.bin",
29
+ "medium.en": "https://huggingface.co/ggerganov/whisper.cpp/resolve/main/ggml-medium.en.bin",
30
+ "large-v3-turbo": "https://huggingface.co/ggerganov/whisper.cpp/resolve/main/ggml-large-v3-turbo.bin",
31
+ };
32
+ const MODEL_FILES = Object.fromEntries(Object.entries(MODEL_URLS).map(([k, url]) => [k, path.basename(url)]));
33
+ const EXPECTED_SIZES = {
34
+ tiny: 75_000_000,
35
+ "tiny.en": 75_000_000,
36
+ base: 142_000_000,
37
+ "base.en": 142_000_000,
38
+ small: 466_000_000,
39
+ "small.en": 466_000_000,
40
+ medium: 1_500_000_000,
41
+ "medium.en": 1_500_000_000,
42
+ "large-v3-turbo": 1_500_000_000,
43
+ };
44
+ let downloading = false;
45
+ let downloadProgress = 0;
46
+ /** Ensure models directory exists. */
47
+ export function initStt() {
48
+ fs.mkdirSync(STT_MODELS_DIR, { recursive: true });
49
+ logger.info(`STT initialized, models dir: ${STT_MODELS_DIR}`);
50
+ }
51
+ export function getModelPath(model) {
52
+ const filename = MODEL_FILES[model];
53
+ if (!filename)
54
+ return null;
55
+ const filePath = path.join(STT_MODELS_DIR, filename);
56
+ return fs.existsSync(filePath) ? filePath : null;
57
+ }
58
+ /**
59
+ * Resolve the languages list from config, with backwards compat for the
60
+ * old `language: "en"` string format.
61
+ */
62
+ export function resolveLanguages(sttConfig) {
63
+ if (sttConfig?.languages && sttConfig.languages.length > 0)
64
+ return sttConfig.languages;
65
+ if (sttConfig?.language)
66
+ return [sttConfig.language];
67
+ return ["en"];
68
+ }
69
+ export function getSttStatus(configModel, languages) {
70
+ const model = configModel || "small";
71
+ const modelPath = getModelPath(model);
72
+ return {
73
+ available: modelPath !== null,
74
+ model: modelPath ? model : null,
75
+ downloading,
76
+ progress: downloadProgress,
77
+ languages: languages || ["en"],
78
+ };
79
+ }
80
+ export async function downloadModel(model, onProgress) {
81
+ if (downloading)
82
+ throw new Error("Download already in progress");
83
+ const url = MODEL_URLS[model];
84
+ if (!url)
85
+ throw new Error(`Unknown model: ${model}`);
86
+ if (getModelPath(model)) {
87
+ onProgress(100);
88
+ return;
89
+ }
90
+ downloading = true;
91
+ downloadProgress = 0;
92
+ const filename = MODEL_FILES[model];
93
+ const destPath = path.join(STT_MODELS_DIR, filename);
94
+ const tmpPath = destPath + ".downloading";
95
+ const expectedSize = EXPECTED_SIZES[model] || 466_000_000;
96
+ try {
97
+ fs.mkdirSync(STT_MODELS_DIR, { recursive: true });
98
+ await new Promise((resolve, reject) => {
99
+ // Use curl for download — handles redirects, progress, and is reliable
100
+ const curl = spawn("curl", [
101
+ "-L", // follow redirects
102
+ "-o", tmpPath,
103
+ url,
104
+ ]);
105
+ // Poll file size for progress
106
+ const progressInterval = setInterval(() => {
107
+ try {
108
+ const stat = fs.statSync(tmpPath, { throwIfNoEntry: false });
109
+ if (stat && stat.size > 0) {
110
+ downloadProgress = Math.min(95, Math.round((stat.size / expectedSize) * 100));
111
+ onProgress(downloadProgress);
112
+ }
113
+ }
114
+ catch { /* file not created yet */ }
115
+ }, 1000);
116
+ curl.on("close", (code) => {
117
+ clearInterval(progressInterval);
118
+ if (code === 0)
119
+ resolve();
120
+ else
121
+ reject(new Error(`curl exited with code ${code}`));
122
+ });
123
+ curl.on("error", (err) => {
124
+ clearInterval(progressInterval);
125
+ reject(err);
126
+ });
127
+ });
128
+ // Rename temp file to final path
129
+ fs.renameSync(tmpPath, destPath);
130
+ downloadProgress = 100;
131
+ onProgress(100);
132
+ logger.info(`STT model '${model}' downloaded to ${destPath}`);
133
+ }
134
+ catch (err) {
135
+ // Clean up partial download
136
+ try {
137
+ fs.unlinkSync(tmpPath);
138
+ }
139
+ catch { /* ignore */ }
140
+ throw err;
141
+ }
142
+ finally {
143
+ downloading = false;
144
+ }
145
+ }
146
+ /**
147
+ * Convert audio to WAV (16kHz mono PCM) using ffmpeg.
148
+ * whisper-cli requires this format.
149
+ */
150
+ async function convertToWav(inputPath) {
151
+ const wavPath = inputPath.replace(/\.[^.]+$/, "") + ".wav";
152
+ await execFileAsync(FFMPEG, [
153
+ "-i", inputPath,
154
+ "-ar", "16000", // 16kHz sample rate
155
+ "-ac", "1", // mono
156
+ "-c:a", "pcm_s16le", // 16-bit PCM
157
+ "-y", // overwrite
158
+ wavPath,
159
+ ], {
160
+ timeout: 2 * 60 * 1000, // 2 min timeout
161
+ });
162
+ return wavPath;
163
+ }
164
+ export async function transcribe(audioPath, model, language) {
165
+ const modelPath = getModelPath(model);
166
+ if (!modelPath)
167
+ throw new Error(`Model '${model}' not found. Download it first.`);
168
+ // Convert to WAV if not already
169
+ let wavPath = audioPath;
170
+ let needsCleanup = false;
171
+ if (!audioPath.endsWith(".wav")) {
172
+ wavPath = await convertToWav(audioPath);
173
+ needsCleanup = true;
174
+ }
175
+ try {
176
+ const { stdout } = await execFileAsync(WHISPER_CLI, [
177
+ "-m", modelPath,
178
+ "-l", language || "en",
179
+ "--no-timestamps",
180
+ "-f", wavPath,
181
+ ], {
182
+ maxBuffer: 10 * 1024 * 1024,
183
+ timeout: 15 * 60 * 1000, // 15 min timeout for long recordings
184
+ });
185
+ // Clean up whisper output: remove blank lines, trim whitespace
186
+ const text = stdout
187
+ .split("\n")
188
+ .map((l) => l.trim())
189
+ .filter((l) => l.length > 0)
190
+ .join(" ")
191
+ .trim();
192
+ return text;
193
+ }
194
+ finally {
195
+ if (needsCleanup) {
196
+ try {
197
+ fs.unlinkSync(wavPath);
198
+ }
199
+ catch { /* ignore */ }
200
+ }
201
+ }
202
+ }
203
+ //# sourceMappingURL=stt.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stt.js","sourceRoot":"","sources":["../../../src/stt/stt.ts"],"names":[],"mappings":"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"}
package/dist/web/404.html CHANGED
@@ -1 +1 @@
1
- <!DOCTYPE html><!--jt8R5JvUgfB9CMfFwWFr0--><html lang="en" data-theme="dark"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="stylesheet" href="/_next/static/css/4a6a5bca9238c104.css" data-precedence="next"/><link rel="preload" as="script" fetchPriority="low" href="/_next/static/chunks/webpack-0f39b7e91dce9791.js"/><script src="/_next/static/chunks/8e6518bb-c26e82767f1faf66.js" async=""></script><script src="/_next/static/chunks/743-5bb03adbb0e4ddec.js" async=""></script><script src="/_next/static/chunks/main-app-437f51faf74fbb3b.js" async=""></script><script src="/_next/static/chunks/app/layout-5129b67d5f126cf0.js" async=""></script><meta name="robots" content="noindex"/><title>404: This page could not be found.</title><meta name="description" content="AI Gateway Dashboard"/><script src="/_next/static/chunks/polyfills-42372ed130431b0a.js" noModule=""></script></head><body><div hidden=""><!--$--><!--/$--></div><div style="font-family:system-ui,&quot;Segoe UI&quot;,Roboto,Helvetica,Arial,sans-serif,&quot;Apple Color Emoji&quot;,&quot;Segoe UI Emoji&quot;;height:100vh;text-align:center;display:flex;flex-direction:column;align-items:center;justify-content:center"><div><style>body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}</style><h1 class="next-error-h1" style="display:inline-block;margin:0 20px 0 0;padding:0 23px 0 0;font-size:24px;font-weight:500;vertical-align:top;line-height:49px">404</h1><div style="display:inline-block"><h2 style="font-size:14px;font-weight:400;line-height:49px;margin:0">This page could not be found.</h2></div></div></div><!--$--><!--/$--><script src="/_next/static/chunks/webpack-0f39b7e91dce9791.js" id="_R_" async=""></script><script>(self.__next_f=self.__next_f||[]).push([0])</script><script>self.__next_f.push([1,"1:\"$Sreact.fragment\"\n2:I[1150,[\"177\",\"static/chunks/app/layout-5129b67d5f126cf0.js\"],\"ClientProviders\"]\n3:I[8954,[],\"\"]\n4:I[5640,[],\"\"]\n5:I[2051,[],\"OutletBoundary\"]\n7:I[6658,[],\"AsyncMetadataOutlet\"]\n9:I[2051,[],\"ViewportBoundary\"]\nb:I[2051,[],\"MetadataBoundary\"]\nc:\"$Sreact.suspense\"\ne:I[7698,[],\"\"]\n:HL[\"/_next/static/css/4a6a5bca9238c104.css\",\"style\"]\n"])</script><script>self.__next_f.push([1,"0:{\"P\":null,\"b\":\"jt8R5JvUgfB9CMfFwWFr0\",\"p\":\"\",\"c\":[\"\",\"_not-found\"],\"i\":false,\"f\":[[[\"\",{\"children\":[\"/_not-found\",{\"children\":[\"__PAGE__\",{}]}]},\"$undefined\",\"$undefined\",true],[\"\",[\"$\",\"$1\",\"c\",{\"children\":[[[\"$\",\"link\",\"0\",{\"rel\":\"stylesheet\",\"href\":\"/_next/static/css/4a6a5bca9238c104.css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\",\"nonce\":\"$undefined\"}]],[\"$\",\"html\",null,{\"lang\":\"en\",\"data-theme\":\"dark\",\"suppressHydrationWarning\":true,\"children\":[\"$\",\"body\",null,{\"children\":[\"$\",\"$L2\",null,{\"children\":[\"$\",\"$L3\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L4\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":\"$undefined\",\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]}]}]}]]}],{\"children\":[\"/_not-found\",[\"$\",\"$1\",\"c\",{\"children\":[null,[\"$\",\"$L3\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L4\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":\"$undefined\",\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]]}],{\"children\":[\"__PAGE__\",[\"$\",\"$1\",\"c\",{\"children\":[[[\"$\",\"title\",null,{\"children\":\"404: This page could not be found.\"}],[\"$\",\"div\",null,{\"style\":{\"fontFamily\":\"system-ui,\\\"Segoe UI\\\",Roboto,Helvetica,Arial,sans-serif,\\\"Apple Color Emoji\\\",\\\"Segoe UI Emoji\\\"\",\"height\":\"100vh\",\"textAlign\":\"center\",\"display\":\"flex\",\"flexDirection\":\"column\",\"alignItems\":\"center\",\"justifyContent\":\"center\"},\"children\":[\"$\",\"div\",null,{\"children\":[[\"$\",\"style\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}\"}}],[\"$\",\"h1\",null,{\"className\":\"next-error-h1\",\"style\":{\"display\":\"inline-block\",\"margin\":\"0 20px 0 0\",\"padding\":\"0 23px 0 0\",\"fontSize\":24,\"fontWeight\":500,\"verticalAlign\":\"top\",\"lineHeight\":\"49px\"},\"children\":404}],[\"$\",\"div\",null,{\"style\":{\"display\":\"inline-block\"},\"children\":[\"$\",\"h2\",null,{\"style\":{\"fontSize\":14,\"fontWeight\":400,\"lineHeight\":\"49px\",\"margin\":0},\"children\":\"This page could not be found.\"}]}]]}]}]],null,[\"$\",\"$L5\",null,{\"children\":[\"$L6\",[\"$\",\"$L7\",null,{\"promise\":\"$@8\"}]]}]]}],{},null,false]},null,false]},null,false],[\"$\",\"$1\",\"h\",{\"children\":[[\"$\",\"meta\",null,{\"name\":\"robots\",\"content\":\"noindex\"}],[[\"$\",\"$L9\",null,{\"children\":\"$La\"}],null],[\"$\",\"$Lb\",null,{\"children\":[\"$\",\"div\",null,{\"hidden\":true,\"children\":[\"$\",\"$c\",null,{\"fallback\":null,\"children\":\"$Ld\"}]}]}]]}],false]],\"m\":\"$undefined\",\"G\":[\"$e\",[]],\"s\":false,\"S\":true}\n"])</script><script>self.__next_f.push([1,"a:[[\"$\",\"meta\",\"0\",{\"charSet\":\"utf-8\"}],[\"$\",\"meta\",\"1\",{\"name\":\"viewport\",\"content\":\"width=device-width, initial-scale=1\"}]]\n6:null\n"])</script><script>self.__next_f.push([1,"8:{\"metadata\":[[\"$\",\"meta\",\"0\",{\"name\":\"description\",\"content\":\"AI Gateway Dashboard\"}]],\"error\":null,\"digest\":\"$undefined\"}\n"])</script><script>self.__next_f.push([1,"d:\"$8:metadata\"\n"])</script></body></html>
1
+ <!DOCTYPE html><!--Tn0FXDHalXGkNoojna_vg--><html lang="en" data-theme="dark"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no"/><link rel="stylesheet" href="/_next/static/css/24da9dfc818cea32.css" data-precedence="next"/><link rel="preload" as="script" fetchPriority="low" href="/_next/static/chunks/webpack-0f39b7e91dce9791.js"/><script src="/_next/static/chunks/8e6518bb-c26e82767f1faf66.js" async=""></script><script src="/_next/static/chunks/743-5bb03adbb0e4ddec.js" async=""></script><script src="/_next/static/chunks/main-app-0c65af8a0fd99888.js" async=""></script><script src="/_next/static/chunks/app/layout-fd975d16033dab25.js" async=""></script><meta name="robots" content="noindex"/><title>404: This page could not be found.</title><meta name="description" content="AI Gateway Dashboard"/><script src="/_next/static/chunks/polyfills-42372ed130431b0a.js" noModule=""></script></head><body><div hidden=""><!--$--><!--/$--></div><div style="font-family:system-ui,&quot;Segoe UI&quot;,Roboto,Helvetica,Arial,sans-serif,&quot;Apple Color Emoji&quot;,&quot;Segoe UI Emoji&quot;;height:100vh;text-align:center;display:flex;flex-direction:column;align-items:center;justify-content:center"><div><style>body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}</style><h1 class="next-error-h1" style="display:inline-block;margin:0 20px 0 0;padding:0 23px 0 0;font-size:24px;font-weight:500;vertical-align:top;line-height:49px">404</h1><div style="display:inline-block"><h2 style="font-size:14px;font-weight:400;line-height:49px;margin:0">This page could not be found.</h2></div></div></div><!--$--><!--/$--><script src="/_next/static/chunks/webpack-0f39b7e91dce9791.js" id="_R_" async=""></script><script>(self.__next_f=self.__next_f||[]).push([0])</script><script>self.__next_f.push([1,"1:\"$Sreact.fragment\"\n2:I[1150,[\"177\",\"static/chunks/app/layout-fd975d16033dab25.js\"],\"ClientProviders\"]\n3:I[8954,[],\"\"]\n4:I[5640,[],\"\"]\n5:I[2051,[],\"OutletBoundary\"]\n7:I[6658,[],\"AsyncMetadataOutlet\"]\n9:I[2051,[],\"ViewportBoundary\"]\nb:I[2051,[],\"MetadataBoundary\"]\nc:\"$Sreact.suspense\"\ne:I[7698,[],\"\"]\n:HL[\"/_next/static/css/24da9dfc818cea32.css\",\"style\"]\n"])</script><script>self.__next_f.push([1,"0:{\"P\":null,\"b\":\"Tn0FXDHalXGkNoojna-vg\",\"p\":\"\",\"c\":[\"\",\"_not-found\"],\"i\":false,\"f\":[[[\"\",{\"children\":[\"/_not-found\",{\"children\":[\"__PAGE__\",{}]}]},\"$undefined\",\"$undefined\",true],[\"\",[\"$\",\"$1\",\"c\",{\"children\":[[[\"$\",\"link\",\"0\",{\"rel\":\"stylesheet\",\"href\":\"/_next/static/css/24da9dfc818cea32.css\",\"precedence\":\"next\",\"crossOrigin\":\"$undefined\",\"nonce\":\"$undefined\"}]],[\"$\",\"html\",null,{\"lang\":\"en\",\"data-theme\":\"dark\",\"suppressHydrationWarning\":true,\"children\":[\"$\",\"body\",null,{\"children\":[\"$\",\"$L2\",null,{\"children\":[\"$\",\"$L3\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L4\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":\"$undefined\",\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]}]}]}]]}],{\"children\":[\"/_not-found\",[\"$\",\"$1\",\"c\",{\"children\":[null,[\"$\",\"$L3\",null,{\"parallelRouterKey\":\"children\",\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L4\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":\"$undefined\",\"forbidden\":\"$undefined\",\"unauthorized\":\"$undefined\"}]]}],{\"children\":[\"__PAGE__\",[\"$\",\"$1\",\"c\",{\"children\":[[[\"$\",\"title\",null,{\"children\":\"404: This page could not be found.\"}],[\"$\",\"div\",null,{\"style\":{\"fontFamily\":\"system-ui,\\\"Segoe UI\\\",Roboto,Helvetica,Arial,sans-serif,\\\"Apple Color Emoji\\\",\\\"Segoe UI Emoji\\\"\",\"height\":\"100vh\",\"textAlign\":\"center\",\"display\":\"flex\",\"flexDirection\":\"column\",\"alignItems\":\"center\",\"justifyContent\":\"center\"},\"children\":[\"$\",\"div\",null,{\"children\":[[\"$\",\"style\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}\"}}],[\"$\",\"h1\",null,{\"className\":\"next-error-h1\",\"style\":{\"display\":\"inline-block\",\"margin\":\"0 20px 0 0\",\"padding\":\"0 23px 0 0\",\"fontSize\":24,\"fontWeight\":500,\"verticalAlign\":\"top\",\"lineHeight\":\"49px\"},\"children\":404}],[\"$\",\"div\",null,{\"style\":{\"display\":\"inline-block\"},\"children\":[\"$\",\"h2\",null,{\"style\":{\"fontSize\":14,\"fontWeight\":400,\"lineHeight\":\"49px\",\"margin\":0},\"children\":\"This page could not be found.\"}]}]]}]}]],null,[\"$\",\"$L5\",null,{\"children\":[\"$L6\",[\"$\",\"$L7\",null,{\"promise\":\"$@8\"}]]}]]}],{},null,false]},null,false]},null,false],[\"$\",\"$1\",\"h\",{\"children\":[[\"$\",\"meta\",null,{\"name\":\"robots\",\"content\":\"noindex\"}],[[\"$\",\"$L9\",null,{\"children\":\"$La\"}],null],[\"$\",\"$Lb\",null,{\"children\":[\"$\",\"div\",null,{\"hidden\":true,\"children\":[\"$\",\"$c\",null,{\"fallback\":null,\"children\":\"$Ld\"}]}]}]]}],false]],\"m\":\"$undefined\",\"G\":[\"$e\",[]],\"s\":false,\"S\":true}\n"])</script><script>self.__next_f.push([1,"a:[[\"$\",\"meta\",\"0\",{\"charSet\":\"utf-8\"}],[\"$\",\"meta\",\"1\",{\"name\":\"viewport\",\"content\":\"width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no\"}]]\n6:null\n"])</script><script>self.__next_f.push([1,"8:{\"metadata\":[[\"$\",\"meta\",\"0\",{\"name\":\"description\",\"content\":\"AI Gateway Dashboard\"}]],\"error\":null,\"digest\":\"$undefined\"}\n"])</script><script>self.__next_f.push([1,"d:\"$8:metadata\"\n"])</script></body></html>