peerllm-host-cli 0.1.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 (190) hide show
  1. package/LICENSE +19 -0
  2. package/README.md +83 -0
  3. package/dist/cli/commands/agreement.d.ts +3 -0
  4. package/dist/cli/commands/agreement.d.ts.map +1 -0
  5. package/dist/cli/commands/agreement.js +151 -0
  6. package/dist/cli/commands/agreement.js.map +1 -0
  7. package/dist/cli/commands/config.d.ts +3 -0
  8. package/dist/cli/commands/config.d.ts.map +1 -0
  9. package/dist/cli/commands/config.js +163 -0
  10. package/dist/cli/commands/config.js.map +1 -0
  11. package/dist/cli/commands/diagnostics.d.ts +3 -0
  12. package/dist/cli/commands/diagnostics.d.ts.map +1 -0
  13. package/dist/cli/commands/diagnostics.js +131 -0
  14. package/dist/cli/commands/diagnostics.js.map +1 -0
  15. package/dist/cli/commands/doctor.d.ts +3 -0
  16. package/dist/cli/commands/doctor.d.ts.map +1 -0
  17. package/dist/cli/commands/doctor.js +349 -0
  18. package/dist/cli/commands/doctor.js.map +1 -0
  19. package/dist/cli/commands/events.d.ts +3 -0
  20. package/dist/cli/commands/events.d.ts.map +1 -0
  21. package/dist/cli/commands/events.js +51 -0
  22. package/dist/cli/commands/events.js.map +1 -0
  23. package/dist/cli/commands/host.d.ts +3 -0
  24. package/dist/cli/commands/host.d.ts.map +1 -0
  25. package/dist/cli/commands/host.js +252 -0
  26. package/dist/cli/commands/host.js.map +1 -0
  27. package/dist/cli/commands/login.d.ts +3 -0
  28. package/dist/cli/commands/login.d.ts.map +1 -0
  29. package/dist/cli/commands/login.js +51 -0
  30. package/dist/cli/commands/login.js.map +1 -0
  31. package/dist/cli/commands/logout.d.ts +3 -0
  32. package/dist/cli/commands/logout.d.ts.map +1 -0
  33. package/dist/cli/commands/logout.js +28 -0
  34. package/dist/cli/commands/logout.js.map +1 -0
  35. package/dist/cli/commands/logs.d.ts +3 -0
  36. package/dist/cli/commands/logs.d.ts.map +1 -0
  37. package/dist/cli/commands/logs.js +157 -0
  38. package/dist/cli/commands/logs.js.map +1 -0
  39. package/dist/cli/commands/models.d.ts +3 -0
  40. package/dist/cli/commands/models.d.ts.map +1 -0
  41. package/dist/cli/commands/models.js +227 -0
  42. package/dist/cli/commands/models.js.map +1 -0
  43. package/dist/cli/commands/register.d.ts +3 -0
  44. package/dist/cli/commands/register.d.ts.map +1 -0
  45. package/dist/cli/commands/register.js +48 -0
  46. package/dist/cli/commands/register.js.map +1 -0
  47. package/dist/cli/commands/restart.d.ts +3 -0
  48. package/dist/cli/commands/restart.d.ts.map +1 -0
  49. package/dist/cli/commands/restart.js +66 -0
  50. package/dist/cli/commands/restart.js.map +1 -0
  51. package/dist/cli/commands/service.d.ts +3 -0
  52. package/dist/cli/commands/service.d.ts.map +1 -0
  53. package/dist/cli/commands/service.js +194 -0
  54. package/dist/cli/commands/service.js.map +1 -0
  55. package/dist/cli/commands/setup.d.ts +3 -0
  56. package/dist/cli/commands/setup.d.ts.map +1 -0
  57. package/dist/cli/commands/setup.js +242 -0
  58. package/dist/cli/commands/setup.js.map +1 -0
  59. package/dist/cli/commands/start.d.ts +3 -0
  60. package/dist/cli/commands/start.d.ts.map +1 -0
  61. package/dist/cli/commands/start.js +125 -0
  62. package/dist/cli/commands/start.js.map +1 -0
  63. package/dist/cli/commands/status.d.ts +3 -0
  64. package/dist/cli/commands/status.d.ts.map +1 -0
  65. package/dist/cli/commands/status.js +76 -0
  66. package/dist/cli/commands/status.js.map +1 -0
  67. package/dist/cli/commands/stop.d.ts +3 -0
  68. package/dist/cli/commands/stop.d.ts.map +1 -0
  69. package/dist/cli/commands/stop.js +46 -0
  70. package/dist/cli/commands/stop.js.map +1 -0
  71. package/dist/cli/commands/subscription.d.ts +3 -0
  72. package/dist/cli/commands/subscription.d.ts.map +1 -0
  73. package/dist/cli/commands/subscription.js +342 -0
  74. package/dist/cli/commands/subscription.js.map +1 -0
  75. package/dist/cli/exit-codes.d.ts +12 -0
  76. package/dist/cli/exit-codes.d.ts.map +1 -0
  77. package/dist/cli/exit-codes.js +11 -0
  78. package/dist/cli/exit-codes.js.map +1 -0
  79. package/dist/cli/format.d.ts +8 -0
  80. package/dist/cli/format.d.ts.map +1 -0
  81. package/dist/cli/format.js +22 -0
  82. package/dist/cli/format.js.map +1 -0
  83. package/dist/cli/index.d.ts +3 -0
  84. package/dist/cli/index.d.ts.map +1 -0
  85. package/dist/cli/index.js +88 -0
  86. package/dist/cli/index.js.map +1 -0
  87. package/dist/cli/ipc-client.d.ts +20 -0
  88. package/dist/cli/ipc-client.d.ts.map +1 -0
  89. package/dist/cli/ipc-client.js +101 -0
  90. package/dist/cli/ipc-client.js.map +1 -0
  91. package/dist/cli/prompts.d.ts +5 -0
  92. package/dist/cli/prompts.d.ts.map +1 -0
  93. package/dist/cli/prompts.js +68 -0
  94. package/dist/cli/prompts.js.map +1 -0
  95. package/dist/cli/services.d.ts +18 -0
  96. package/dist/cli/services.d.ts.map +1 -0
  97. package/dist/cli/services.js +16 -0
  98. package/dist/cli/services.js.map +1 -0
  99. package/dist/core/auth.d.ts +24 -0
  100. package/dist/core/auth.d.ts.map +1 -0
  101. package/dist/core/auth.js +111 -0
  102. package/dist/core/auth.js.map +1 -0
  103. package/dist/core/backend-client.d.ts +33 -0
  104. package/dist/core/backend-client.d.ts.map +1 -0
  105. package/dist/core/backend-client.js +79 -0
  106. package/dist/core/backend-client.js.map +1 -0
  107. package/dist/core/config.d.ts +21 -0
  108. package/dist/core/config.d.ts.map +1 -0
  109. package/dist/core/config.js +98 -0
  110. package/dist/core/config.js.map +1 -0
  111. package/dist/core/events.d.ts +23 -0
  112. package/dist/core/events.d.ts.map +1 -0
  113. package/dist/core/events.js +15 -0
  114. package/dist/core/events.js.map +1 -0
  115. package/dist/core/fs-lock.d.ts +13 -0
  116. package/dist/core/fs-lock.d.ts.map +1 -0
  117. package/dist/core/fs-lock.js +52 -0
  118. package/dist/core/fs-lock.js.map +1 -0
  119. package/dist/core/jsonrpc.d.ts +55 -0
  120. package/dist/core/jsonrpc.d.ts.map +1 -0
  121. package/dist/core/jsonrpc.js +59 -0
  122. package/dist/core/jsonrpc.js.map +1 -0
  123. package/dist/core/logger.d.ts +28 -0
  124. package/dist/core/logger.d.ts.map +1 -0
  125. package/dist/core/logger.js +80 -0
  126. package/dist/core/logger.js.map +1 -0
  127. package/dist/core/model-info.d.ts +11 -0
  128. package/dist/core/model-info.d.ts.map +1 -0
  129. package/dist/core/model-info.js +137 -0
  130. package/dist/core/model-info.js.map +1 -0
  131. package/dist/core/models-fs.d.ts +6 -0
  132. package/dist/core/models-fs.d.ts.map +1 -0
  133. package/dist/core/models-fs.js +21 -0
  134. package/dist/core/models-fs.js.map +1 -0
  135. package/dist/core/orchestrator.d.ts +42 -0
  136. package/dist/core/orchestrator.d.ts.map +1 -0
  137. package/dist/core/orchestrator.js +304 -0
  138. package/dist/core/orchestrator.js.map +1 -0
  139. package/dist/core/paths.d.ts +17 -0
  140. package/dist/core/paths.d.ts.map +1 -0
  141. package/dist/core/paths.js +51 -0
  142. package/dist/core/paths.js.map +1 -0
  143. package/dist/core/redact.d.ts +3 -0
  144. package/dist/core/redact.d.ts.map +1 -0
  145. package/dist/core/redact.js +27 -0
  146. package/dist/core/redact.js.map +1 -0
  147. package/dist/core/secrets.d.ts +12 -0
  148. package/dist/core/secrets.d.ts.map +1 -0
  149. package/dist/core/secrets.js +66 -0
  150. package/dist/core/secrets.js.map +1 -0
  151. package/dist/core/shared-runner.d.ts +70 -0
  152. package/dist/core/shared-runner.d.ts.map +1 -0
  153. package/dist/core/shared-runner.js +450 -0
  154. package/dist/core/shared-runner.js.map +1 -0
  155. package/dist/core/subscription.d.ts +53 -0
  156. package/dist/core/subscription.d.ts.map +1 -0
  157. package/dist/core/subscription.js +117 -0
  158. package/dist/core/subscription.js.map +1 -0
  159. package/dist/daemon/index.d.ts +3 -0
  160. package/dist/daemon/index.d.ts.map +1 -0
  161. package/dist/daemon/index.js +22 -0
  162. package/dist/daemon/index.js.map +1 -0
  163. package/dist/daemon/ipc-server.d.ts +33 -0
  164. package/dist/daemon/ipc-server.d.ts.map +1 -0
  165. package/dist/daemon/ipc-server.js +202 -0
  166. package/dist/daemon/ipc-server.js.map +1 -0
  167. package/dist/daemon/methods.d.ts +17 -0
  168. package/dist/daemon/methods.d.ts.map +1 -0
  169. package/dist/daemon/methods.js +68 -0
  170. package/dist/daemon/methods.js.map +1 -0
  171. package/dist/daemon/pid-lock.d.ts +10 -0
  172. package/dist/daemon/pid-lock.d.ts.map +1 -0
  173. package/dist/daemon/pid-lock.js +45 -0
  174. package/dist/daemon/pid-lock.js.map +1 -0
  175. package/dist/daemon/run.d.ts +19 -0
  176. package/dist/daemon/run.d.ts.map +1 -0
  177. package/dist/daemon/run.js +182 -0
  178. package/dist/daemon/run.js.map +1 -0
  179. package/dist/shared/config-types.d.ts +27 -0
  180. package/dist/shared/config-types.d.ts.map +1 -0
  181. package/dist/shared/config-types.js +13 -0
  182. package/dist/shared/config-types.js.map +1 -0
  183. package/dist/shared/protocol.d.ts +43 -0
  184. package/dist/shared/protocol.d.ts.map +1 -0
  185. package/dist/shared/protocol.js +11 -0
  186. package/dist/shared/protocol.js.map +1 -0
  187. package/package.json +70 -0
  188. package/templates/launchd/com.peerllm.host.plist +25 -0
  189. package/templates/systemd/peerllm-host.service +17 -0
  190. package/templates/windows/install-service.ps1 +29 -0
@@ -0,0 +1,23 @@
1
+ export interface DaemonEventMap {
2
+ hostStats: {
3
+ cpuPercent: number;
4
+ ramUsedMB: number;
5
+ ramTotalMB: number;
6
+ };
7
+ orchestratorStatus: {
8
+ status: "disconnected" | "connecting" | "connected" | "error";
9
+ };
10
+ log: {
11
+ level: "debug" | "info" | "warn" | "error";
12
+ message: string;
13
+ timestamp: string;
14
+ };
15
+ }
16
+ export type DaemonEventName = keyof DaemonEventMap;
17
+ export declare class DaemonEventBus {
18
+ private readonly emitter;
19
+ emit<K extends DaemonEventName>(name: K, payload: DaemonEventMap[K]): void;
20
+ on<K extends DaemonEventName>(name: K, handler: (payload: DaemonEventMap[K]) => void): () => void;
21
+ removeAll(): void;
22
+ }
23
+ //# sourceMappingURL=events.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"events.d.ts","sourceRoot":"","sources":["../../src/core/events.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,cAAc;IAC7B,SAAS,EAAE;QAAE,UAAU,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE,CAAC;IACzE,kBAAkB,EAAE;QAAE,MAAM,EAAE,cAAc,GAAG,YAAY,GAAG,WAAW,GAAG,OAAO,CAAA;KAAE,CAAC;IACtF,GAAG,EAAE;QAAE,KAAK,EAAE,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,CAAC;CACzF;AAED,MAAM,MAAM,eAAe,GAAG,MAAM,cAAc,CAAC;AAEnD,qBAAa,cAAc;IACzB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAsB;IAE9C,IAAI,CAAC,CAAC,SAAS,eAAe,EAAE,IAAI,EAAE,CAAC,EAAE,OAAO,EAAE,cAAc,CAAC,CAAC,CAAC,GAAG,IAAI;IAI1E,EAAE,CAAC,CAAC,SAAS,eAAe,EAC1B,IAAI,EAAE,CAAC,EACP,OAAO,EAAE,CAAC,OAAO,EAAE,cAAc,CAAC,CAAC,CAAC,KAAK,IAAI,GAC5C,MAAM,IAAI;IAKb,SAAS,IAAI,IAAI;CAGlB"}
@@ -0,0 +1,15 @@
1
+ import { EventEmitter } from "node:events";
2
+ export class DaemonEventBus {
3
+ emitter = new EventEmitter();
4
+ emit(name, payload) {
5
+ this.emitter.emit(name, payload);
6
+ }
7
+ on(name, handler) {
8
+ this.emitter.on(name, handler);
9
+ return () => this.emitter.off(name, handler);
10
+ }
11
+ removeAll() {
12
+ this.emitter.removeAllListeners();
13
+ }
14
+ }
15
+ //# sourceMappingURL=events.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"events.js","sourceRoot":"","sources":["../../src/core/events.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAU3C,MAAM,OAAO,cAAc;IACR,OAAO,GAAG,IAAI,YAAY,EAAE,CAAC;IAE9C,IAAI,CAA4B,IAAO,EAAE,OAA0B;QACjE,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IACnC,CAAC;IAED,EAAE,CACA,IAAO,EACP,OAA6C;QAE7C,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QAC/B,OAAO,GAAG,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IAC/C,CAAC;IAED,SAAS;QACP,IAAI,CAAC,OAAO,CAAC,kBAAkB,EAAE,CAAC;IACpC,CAAC;CACF"}
@@ -0,0 +1,13 @@
1
+ export declare class LockTimeoutError extends Error {
2
+ readonly lockPath: string;
3
+ constructor(lockPath: string);
4
+ }
5
+ export interface FileLock {
6
+ release(): Promise<void>;
7
+ }
8
+ export declare function acquireFileLock(lockPath: string, opts?: {
9
+ timeoutMs?: number;
10
+ retryMs?: number;
11
+ }): Promise<FileLock>;
12
+ export declare function atomicWriteFile(targetPath: string, contents: string): Promise<void>;
13
+ //# sourceMappingURL=fs-lock.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fs-lock.d.ts","sourceRoot":"","sources":["../../src/core/fs-lock.ts"],"names":[],"mappings":"AAIA,qBAAa,gBAAiB,SAAQ,KAAK;aACb,QAAQ,EAAE,MAAM;gBAAhB,QAAQ,EAAE,MAAM;CAG7C;AAED,MAAM,WAAW,QAAQ;IACvB,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CAC1B;AAED,wBAAsB,eAAe,CACnC,QAAQ,EAAE,MAAM,EAChB,IAAI,GAAE;IAAE,SAAS,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CAAO,GAClD,OAAO,CAAC,QAAQ,CAAC,CA2BnB;AAED,wBAAsB,eAAe,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAYzF"}
@@ -0,0 +1,52 @@
1
+ import { mkdir, open, unlink } from "node:fs/promises";
2
+ import { dirname } from "node:path";
3
+ import { setTimeout as delay } from "node:timers/promises";
4
+ export class LockTimeoutError extends Error {
5
+ lockPath;
6
+ constructor(lockPath) {
7
+ super(`timed out acquiring lock: ${lockPath}`);
8
+ this.lockPath = lockPath;
9
+ }
10
+ }
11
+ export async function acquireFileLock(lockPath, opts = {}) {
12
+ const timeoutMs = opts.timeoutMs ?? 5000;
13
+ const retryMs = opts.retryMs ?? 50;
14
+ const deadline = Date.now() + timeoutMs;
15
+ await mkdir(dirname(lockPath), { recursive: true });
16
+ for (;;) {
17
+ try {
18
+ const handle = await open(lockPath, "wx");
19
+ await handle.writeFile(String(process.pid));
20
+ await handle.close();
21
+ return {
22
+ release: async () => {
23
+ await unlink(lockPath).catch(() => undefined);
24
+ },
25
+ };
26
+ }
27
+ catch (err) {
28
+ if (err.code !== "EEXIST") {
29
+ throw err;
30
+ }
31
+ if (Date.now() >= deadline) {
32
+ throw new LockTimeoutError(lockPath);
33
+ }
34
+ await delay(retryMs);
35
+ }
36
+ }
37
+ }
38
+ export async function atomicWriteFile(targetPath, contents) {
39
+ await mkdir(dirname(targetPath), { recursive: true });
40
+ const tmpPath = `${targetPath}.tmp.${process.pid}.${Math.random().toString(36).slice(2, 8)}`;
41
+ const handle = await open(tmpPath, "w", 0o600);
42
+ try {
43
+ await handle.writeFile(contents);
44
+ await handle.sync();
45
+ }
46
+ finally {
47
+ await handle.close();
48
+ }
49
+ const { rename } = await import("node:fs/promises");
50
+ await rename(tmpPath, targetPath);
51
+ }
52
+ //# sourceMappingURL=fs-lock.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fs-lock.js","sourceRoot":"","sources":["../../src/core/fs-lock.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,UAAU,IAAI,KAAK,EAAE,MAAM,sBAAsB,CAAC;AAE3D,MAAM,OAAO,gBAAiB,SAAQ,KAAK;IACb;IAA5B,YAA4B,QAAgB;QAC1C,KAAK,CAAC,6BAA6B,QAAQ,EAAE,CAAC,CAAC;QADrB,aAAQ,GAAR,QAAQ,CAAQ;IAE5C,CAAC;CACF;AAMD,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,QAAgB,EAChB,OAAiD,EAAE;IAEnD,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC;IACzC,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,IAAI,EAAE,CAAC;IACnC,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC;IAExC,MAAM,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAEpD,SAAS,CAAC;QACR,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;YAC1C,MAAM,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC;YAC5C,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC;YACrB,OAAO;gBACL,OAAO,EAAE,KAAK,IAAI,EAAE;oBAClB,MAAM,MAAM,CAAC,QAAQ,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;gBAChD,CAAC;aACF,CAAC;QACJ,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAK,GAA6B,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;gBACrD,MAAM,GAAG,CAAC;YACZ,CAAC;YACD,IAAI,IAAI,CAAC,GAAG,EAAE,IAAI,QAAQ,EAAE,CAAC;gBAC3B,MAAM,IAAI,gBAAgB,CAAC,QAAQ,CAAC,CAAC;YACvC,CAAC;YACD,MAAM,KAAK,CAAC,OAAO,CAAC,CAAC;QACvB,CAAC;IACH,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,UAAkB,EAAE,QAAgB;IACxE,MAAM,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACtD,MAAM,OAAO,GAAG,GAAG,UAAU,QAAQ,OAAO,CAAC,GAAG,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;IAC7F,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,OAAO,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC;IAC/C,IAAI,CAAC;QACH,MAAM,MAAM,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;QACjC,MAAM,MAAM,CAAC,IAAI,EAAE,CAAC;IACtB,CAAC;YAAS,CAAC;QACT,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC;IACvB,CAAC;IACD,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,MAAM,CAAC,kBAAkB,CAAC,CAAC;IACpD,MAAM,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;AACpC,CAAC"}
@@ -0,0 +1,55 @@
1
+ export interface JsonRpcRequest {
2
+ jsonrpc: "2.0";
3
+ id: number | string;
4
+ method: string;
5
+ params?: unknown;
6
+ }
7
+ export interface JsonRpcNotification {
8
+ jsonrpc: "2.0";
9
+ method: string;
10
+ params?: unknown;
11
+ }
12
+ export interface JsonRpcSuccess {
13
+ jsonrpc: "2.0";
14
+ id: number | string;
15
+ result: unknown;
16
+ }
17
+ export interface JsonRpcError {
18
+ jsonrpc: "2.0";
19
+ id: number | string | null;
20
+ error: {
21
+ code: number;
22
+ message: string;
23
+ data?: {
24
+ hint?: string;
25
+ [k: string]: unknown;
26
+ };
27
+ };
28
+ }
29
+ export type JsonRpcMessage = JsonRpcRequest | JsonRpcNotification | JsonRpcSuccess | JsonRpcError;
30
+ export declare const RPC_ERROR: {
31
+ readonly parseError: -32700;
32
+ readonly invalidRequest: -32600;
33
+ readonly methodNotFound: -32601;
34
+ readonly invalidParams: -32602;
35
+ readonly internalError: -32603;
36
+ };
37
+ export declare class RpcError extends Error {
38
+ readonly code: number;
39
+ readonly hint?: string | undefined;
40
+ constructor(code: number, message: string, hint?: string | undefined);
41
+ toJSON(id: number | string | null): JsonRpcError;
42
+ }
43
+ export declare function isRequest(msg: JsonRpcMessage): msg is JsonRpcRequest;
44
+ export declare function isNotification(msg: JsonRpcMessage): msg is JsonRpcNotification;
45
+ export declare function isResponse(msg: JsonRpcMessage): msg is JsonRpcSuccess | JsonRpcError;
46
+ /**
47
+ * Splits a stream of bytes into newline-delimited JSON messages.
48
+ * Holds incomplete trailing data across calls.
49
+ */
50
+ export declare class LineFramer {
51
+ private buffer;
52
+ push(chunk: string): string[];
53
+ reset(): void;
54
+ }
55
+ //# sourceMappingURL=jsonrpc.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"jsonrpc.d.ts","sourceRoot":"","sources":["../../src/core/jsonrpc.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,KAAK,CAAC;IACf,EAAE,EAAE,MAAM,GAAG,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,WAAW,mBAAmB;IAClC,OAAO,EAAE,KAAK,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,KAAK,CAAC;IACf,EAAE,EAAE,MAAM,GAAG,MAAM,CAAC;IACpB,MAAM,EAAE,OAAO,CAAC;CACjB;AAED,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,KAAK,CAAC;IACf,EAAE,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC;IAC3B,KAAK,EAAE;QACL,IAAI,EAAE,MAAM,CAAC;QACb,OAAO,EAAE,MAAM,CAAC;QAChB,IAAI,CAAC,EAAE;YAAE,IAAI,CAAC,EAAE,MAAM,CAAC;YAAC,CAAC,CAAC,EAAE,MAAM,GAAG,OAAO,CAAA;SAAE,CAAC;KAChD,CAAC;CACH;AAED,MAAM,MAAM,cAAc,GACtB,cAAc,GACd,mBAAmB,GACnB,cAAc,GACd,YAAY,CAAC;AAEjB,eAAO,MAAM,SAAS;;;;;;CAMZ,CAAC;AAEX,qBAAa,QAAS,SAAQ,KAAK;aAEf,IAAI,EAAE,MAAM;aAEZ,IAAI,CAAC,EAAE,MAAM;gBAFb,IAAI,EAAE,MAAM,EAC5B,OAAO,EAAE,MAAM,EACC,IAAI,CAAC,EAAE,MAAM,YAAA;IAK/B,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,GAAG,YAAY;CAWjD;AAED,wBAAgB,SAAS,CAAC,GAAG,EAAE,cAAc,GAAG,GAAG,IAAI,cAAc,CAEpE;AAED,wBAAgB,cAAc,CAAC,GAAG,EAAE,cAAc,GAAG,GAAG,IAAI,mBAAmB,CAE9E;AAED,wBAAgB,UAAU,CACxB,GAAG,EAAE,cAAc,GAClB,GAAG,IAAI,cAAc,GAAG,YAAY,CAEtC;AAED;;;GAGG;AACH,qBAAa,UAAU;IACrB,OAAO,CAAC,MAAM,CAAM;IAEpB,IAAI,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE;IAY7B,KAAK,IAAI,IAAI;CAGd"}
@@ -0,0 +1,59 @@
1
+ export const RPC_ERROR = {
2
+ parseError: -32700,
3
+ invalidRequest: -32600,
4
+ methodNotFound: -32601,
5
+ invalidParams: -32602,
6
+ internalError: -32603,
7
+ };
8
+ export class RpcError extends Error {
9
+ code;
10
+ hint;
11
+ constructor(code, message, hint) {
12
+ super(message);
13
+ this.code = code;
14
+ this.hint = hint;
15
+ }
16
+ toJSON(id) {
17
+ return {
18
+ jsonrpc: "2.0",
19
+ id,
20
+ error: {
21
+ code: this.code,
22
+ message: this.message,
23
+ ...(this.hint ? { data: { hint: this.hint } } : {}),
24
+ },
25
+ };
26
+ }
27
+ }
28
+ export function isRequest(msg) {
29
+ return "method" in msg && "id" in msg;
30
+ }
31
+ export function isNotification(msg) {
32
+ return "method" in msg && !("id" in msg);
33
+ }
34
+ export function isResponse(msg) {
35
+ return "id" in msg && ("result" in msg || "error" in msg);
36
+ }
37
+ /**
38
+ * Splits a stream of bytes into newline-delimited JSON messages.
39
+ * Holds incomplete trailing data across calls.
40
+ */
41
+ export class LineFramer {
42
+ buffer = "";
43
+ push(chunk) {
44
+ this.buffer += chunk;
45
+ const lines = [];
46
+ let idx;
47
+ while ((idx = this.buffer.indexOf("\n")) >= 0) {
48
+ const line = this.buffer.slice(0, idx).trim();
49
+ this.buffer = this.buffer.slice(idx + 1);
50
+ if (line)
51
+ lines.push(line);
52
+ }
53
+ return lines;
54
+ }
55
+ reset() {
56
+ this.buffer = "";
57
+ }
58
+ }
59
+ //# sourceMappingURL=jsonrpc.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"jsonrpc.js","sourceRoot":"","sources":["../../src/core/jsonrpc.ts"],"names":[],"mappings":"AAmCA,MAAM,CAAC,MAAM,SAAS,GAAG;IACvB,UAAU,EAAE,CAAC,KAAK;IAClB,cAAc,EAAE,CAAC,KAAK;IACtB,cAAc,EAAE,CAAC,KAAK;IACtB,aAAa,EAAE,CAAC,KAAK;IACrB,aAAa,EAAE,CAAC,KAAK;CACb,CAAC;AAEX,MAAM,OAAO,QAAS,SAAQ,KAAK;IAEf;IAEA;IAHlB,YACkB,IAAY,EAC5B,OAAe,EACC,IAAa;QAE7B,KAAK,CAAC,OAAO,CAAC,CAAC;QAJC,SAAI,GAAJ,IAAI,CAAQ;QAEZ,SAAI,GAAJ,IAAI,CAAS;IAG/B,CAAC;IAED,MAAM,CAAC,EAA0B;QAC/B,OAAO;YACL,OAAO,EAAE,KAAK;YACd,EAAE;YACF,KAAK,EAAE;gBACL,IAAI,EAAE,IAAI,CAAC,IAAI;gBACf,OAAO,EAAE,IAAI,CAAC,OAAO;gBACrB,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;aACpD;SACF,CAAC;IACJ,CAAC;CACF;AAED,MAAM,UAAU,SAAS,CAAC,GAAmB;IAC3C,OAAO,QAAQ,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,CAAC;AACxC,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,GAAmB;IAChD,OAAO,QAAQ,IAAI,GAAG,IAAI,CAAC,CAAC,IAAI,IAAI,GAAG,CAAC,CAAC;AAC3C,CAAC;AAED,MAAM,UAAU,UAAU,CACxB,GAAmB;IAEnB,OAAO,IAAI,IAAI,GAAG,IAAI,CAAC,QAAQ,IAAI,GAAG,IAAI,OAAO,IAAI,GAAG,CAAC,CAAC;AAC5D,CAAC;AAED;;;GAGG;AACH,MAAM,OAAO,UAAU;IACb,MAAM,GAAG,EAAE,CAAC;IAEpB,IAAI,CAAC,KAAa;QAChB,IAAI,CAAC,MAAM,IAAI,KAAK,CAAC;QACrB,MAAM,KAAK,GAAa,EAAE,CAAC;QAC3B,IAAI,GAAW,CAAC;QAChB,OAAO,CAAC,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC;YAC9C,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;YAC9C,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC;YACzC,IAAI,IAAI;gBAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC7B,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;IAED,KAAK;QACH,IAAI,CAAC,MAAM,GAAG,EAAE,CAAC;IACnB,CAAC;CACF"}
@@ -0,0 +1,28 @@
1
+ export type LogLevel = "debug" | "info" | "warn" | "error";
2
+ export interface LoggerOptions {
3
+ logsDir: string;
4
+ prefix?: string;
5
+ minLevel?: LogLevel;
6
+ stderrSink?: boolean;
7
+ fileSink?: boolean;
8
+ }
9
+ export declare class Logger {
10
+ private readonly opts;
11
+ private stream;
12
+ private currentDate;
13
+ private readonly prefix;
14
+ private readonly minLevel;
15
+ private readonly stderrSink;
16
+ private readonly fileSink;
17
+ constructor(opts: LoggerOptions);
18
+ debug(message: string, ...args: unknown[]): void;
19
+ info(message: string, ...args: unknown[]): void;
20
+ warn(message: string, ...args: unknown[]): void;
21
+ error(message: string, ...args: unknown[]): void;
22
+ close(): void;
23
+ private write;
24
+ private appendFile;
25
+ }
26
+ export declare function initGlobalLogger(opts: LoggerOptions): Logger;
27
+ export declare function getLogger(): Logger;
28
+ //# sourceMappingURL=logger.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../src/core/logger.ts"],"names":[],"mappings":"AAKA,MAAM,MAAM,QAAQ,GAAG,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC;AAS3D,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,QAAQ,CAAC;IACpB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,qBAAa,MAAM;IAQL,OAAO,CAAC,QAAQ,CAAC,IAAI;IAPjC,OAAO,CAAC,MAAM,CAA0B;IACxC,OAAO,CAAC,WAAW,CAAM;IACzB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAW;IACpC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAU;IACrC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAU;gBAEN,IAAI,EAAE,aAAa;IAOhD,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,IAAI;IAIhD,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,IAAI;IAI/C,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,IAAI;IAI/C,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,IAAI;IAIhD,KAAK,IAAI,IAAI;IAKb,OAAO,CAAC,KAAK;IAmBb,OAAO,CAAC,UAAU;CAWnB;AAID,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,aAAa,GAAG,MAAM,CAG5D;AAED,wBAAgB,SAAS,IAAI,MAAM,CAMlC"}
@@ -0,0 +1,80 @@
1
+ import { createWriteStream, mkdirSync } from "node:fs";
2
+ import { join } from "node:path";
3
+ import { redact, redactString } from "./redact.js";
4
+ const LEVEL_RANK = {
5
+ debug: 10,
6
+ info: 20,
7
+ warn: 30,
8
+ error: 40,
9
+ };
10
+ export class Logger {
11
+ opts;
12
+ stream;
13
+ currentDate = "";
14
+ prefix;
15
+ minLevel;
16
+ stderrSink;
17
+ fileSink;
18
+ constructor(opts) {
19
+ this.opts = opts;
20
+ this.prefix = opts.prefix ?? "host";
21
+ this.minLevel = opts.minLevel ?? "info";
22
+ this.stderrSink = opts.stderrSink ?? false;
23
+ this.fileSink = opts.fileSink ?? true;
24
+ }
25
+ debug(message, ...args) {
26
+ this.write("debug", message, args);
27
+ }
28
+ info(message, ...args) {
29
+ this.write("info", message, args);
30
+ }
31
+ warn(message, ...args) {
32
+ this.write("warn", message, args);
33
+ }
34
+ error(message, ...args) {
35
+ this.write("error", message, args);
36
+ }
37
+ close() {
38
+ this.stream?.end();
39
+ this.stream = undefined;
40
+ }
41
+ write(level, message, args) {
42
+ if (LEVEL_RANK[level] < LEVEL_RANK[this.minLevel])
43
+ return;
44
+ const stamp = new Date().toISOString();
45
+ const formattedArgs = args
46
+ .map((a) => (typeof a === "string" ? redactString(a) : JSON.stringify(redact(a))))
47
+ .join(" ");
48
+ const line = `[${stamp}] [${level.toUpperCase()}] ${redactString(message)}${formattedArgs ? " " + formattedArgs : ""}\n`;
49
+ if (this.fileSink) {
50
+ this.appendFile(line);
51
+ }
52
+ if (this.stderrSink) {
53
+ process.stderr.write(line);
54
+ }
55
+ }
56
+ appendFile(line) {
57
+ const today = new Date().toISOString().slice(0, 10);
58
+ if (this.currentDate !== today || !this.stream) {
59
+ this.stream?.end();
60
+ mkdirSync(this.opts.logsDir, { recursive: true });
61
+ const filePath = join(this.opts.logsDir, `${this.prefix}-${today}.log`);
62
+ this.stream = createWriteStream(filePath, { flags: "a", mode: 0o600 });
63
+ this.currentDate = today;
64
+ }
65
+ this.stream.write(line);
66
+ }
67
+ }
68
+ let globalLogger;
69
+ export function initGlobalLogger(opts) {
70
+ globalLogger = new Logger(opts);
71
+ return globalLogger;
72
+ }
73
+ export function getLogger() {
74
+ if (!globalLogger) {
75
+ // Stderr-only fallback so log() calls outside the daemon don't crash.
76
+ globalLogger = new Logger({ logsDir: "", fileSink: false, stderrSink: false });
77
+ }
78
+ return globalLogger;
79
+ }
80
+ //# sourceMappingURL=logger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/core/logger.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ export interface ModelInfo {
2
+ architecture: string;
3
+ quantization: string;
4
+ layers: number;
5
+ }
6
+ export declare function parseModelFilename(filename: string): ModelInfo;
7
+ export declare function getPerLayerCost(quant: string, arch: string): number;
8
+ export declare function estimateGpuLayers(vramMB: number, model: ModelInfo): number;
9
+ export type ComputeMode = "gpu" | "cpu" | "dynamic" | "custom";
10
+ export declare function calculateGpuLayersFromConfig(vramMB: number, model: ModelInfo, computeMode?: ComputeMode, customGpuLayers?: number): number;
11
+ //# sourceMappingURL=model-info.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"model-info.d.ts","sourceRoot":"","sources":["../../src/core/model-info.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,SAAS;IACxB,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,MAAM,GAAG,SAAS,CAyB9D;AA6DD,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAEnE;AAED,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,GAAG,MAAM,CAO1E;AAED,MAAM,MAAM,WAAW,GAAG,KAAK,GAAG,KAAK,GAAG,SAAS,GAAG,QAAQ,CAAC;AAE/D,wBAAgB,4BAA4B,CAC1C,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,SAAS,EAChB,WAAW,GAAE,WAAuB,EACpC,eAAe,CAAC,EAAE,MAAM,GACvB,MAAM,CAYR"}
@@ -0,0 +1,137 @@
1
+ export function parseModelFilename(filename) {
2
+ const lower = filename.toLowerCase();
3
+ const name = lower.replace(".gguf", "");
4
+ const quantMatch = name.match(/q\d+(_?[ksm])?(_?\d+)?/i);
5
+ const quant = quantMatch ? quantMatch[0].toUpperCase() : "UNKNOWN";
6
+ let architecture = "unknown";
7
+ if (name.includes("mistral"))
8
+ architecture = "mistral";
9
+ else if (name.includes("mixtral"))
10
+ architecture = "mixtral";
11
+ else if (name.includes("llama3") || name.includes("llama-3"))
12
+ architecture = "llama3";
13
+ else if (name.includes("llama2") || name.includes("llama-2"))
14
+ architecture = "llama2";
15
+ else if (name.includes("llama"))
16
+ architecture = "llama";
17
+ else if (name.includes("phi-3") || name.includes("phi3"))
18
+ architecture = "phi3";
19
+ else if (name.includes("phi-2") || name.includes("phi2"))
20
+ architecture = "phi2";
21
+ else if (name.includes("neox"))
22
+ architecture = "neox";
23
+ else if (name.includes("gpt-j"))
24
+ architecture = "gpt-j";
25
+ let params = 0;
26
+ const paramMatch = name.match(/(\d+)\s*b/);
27
+ if (paramMatch && paramMatch[1]) {
28
+ params = parseInt(paramMatch[1], 10);
29
+ }
30
+ return { architecture, quantization: quant, layers: inferLayerCount(architecture, params) };
31
+ }
32
+ function inferLayerCount(architecture, params) {
33
+ switch (architecture) {
34
+ case "mistral":
35
+ return 32;
36
+ case "mixtral":
37
+ return 56;
38
+ case "llama3":
39
+ if (params === 8)
40
+ return 32;
41
+ if (params === 70)
42
+ return 80;
43
+ return 40;
44
+ case "llama2":
45
+ if (params === 7)
46
+ return 32;
47
+ if (params === 13)
48
+ return 40;
49
+ if (params === 70)
50
+ return 80;
51
+ return 32;
52
+ case "llama":
53
+ if (params === 7)
54
+ return 32;
55
+ if (params === 13)
56
+ return 40;
57
+ return 32;
58
+ case "phi3":
59
+ return 32;
60
+ case "phi2":
61
+ return 24;
62
+ case "neox":
63
+ return 44;
64
+ case "gpt-j":
65
+ return 28;
66
+ default:
67
+ return 32;
68
+ }
69
+ }
70
+ function getBaseLayerCost(arch) {
71
+ const a = arch.toLowerCase();
72
+ if (a.includes("mistral"))
73
+ return 110;
74
+ if (a.includes("mixtral"))
75
+ return 140;
76
+ if (a.includes("llama3"))
77
+ return 85;
78
+ if (a.includes("llama2"))
79
+ return 80;
80
+ if (a.includes("llama"))
81
+ return 75;
82
+ if (a.includes("phi"))
83
+ return 40;
84
+ if (a.includes("neox"))
85
+ return 120;
86
+ if (a.includes("gpt-j"))
87
+ return 110;
88
+ return 100;
89
+ }
90
+ function getQuantizationMultiplier(quant) {
91
+ const q = quant.toUpperCase();
92
+ if (q.includes("Q2"))
93
+ return 0.3;
94
+ if (q.includes("Q3"))
95
+ return 0.45;
96
+ if (q.includes("Q4_K"))
97
+ return 0.6;
98
+ if (q.includes("Q4"))
99
+ return 0.7;
100
+ if (q.includes("Q5_K"))
101
+ return 0.85;
102
+ if (q.includes("Q5"))
103
+ return 0.9;
104
+ if (q.includes("Q6_K"))
105
+ return 1.1;
106
+ if (q.includes("Q6"))
107
+ return 1.15;
108
+ if (q.includes("Q8"))
109
+ return 2.4;
110
+ return 1.0;
111
+ }
112
+ export function getPerLayerCost(quant, arch) {
113
+ return Math.round(getBaseLayerCost(arch) * getQuantizationMultiplier(quant));
114
+ }
115
+ export function estimateGpuLayers(vramMB, model) {
116
+ const SAFETY_BUFFER_MB = 800;
117
+ const usable = Math.max(0, vramMB - SAFETY_BUFFER_MB);
118
+ const perLayer = getPerLayerCost(model.quantization, model.architecture);
119
+ if (usable <= 0)
120
+ return 0;
121
+ const possible = Math.floor(usable / perLayer);
122
+ return Math.max(0, Math.min(possible, model.layers));
123
+ }
124
+ export function calculateGpuLayersFromConfig(vramMB, model, computeMode = "dynamic", customGpuLayers) {
125
+ switch (computeMode) {
126
+ case "cpu":
127
+ return 0;
128
+ case "gpu":
129
+ return model.layers;
130
+ case "custom":
131
+ return Math.min(customGpuLayers ?? 0, model.layers);
132
+ case "dynamic":
133
+ default:
134
+ return estimateGpuLayers(vramMB, model);
135
+ }
136
+ }
137
+ //# sourceMappingURL=model-info.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"model-info.js","sourceRoot":"","sources":["../../src/core/model-info.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import type { ResolvedPaths } from "./paths.js";
2
+ import type { HostConfig } from "../shared/config-types.js";
3
+ export declare function getLLMDirectory(paths: ResolvedPaths, config: HostConfig): string;
4
+ export declare function ensureLLMDirectory(paths: ResolvedPaths, config: HostConfig): Promise<string>;
5
+ export declare function listModelsSync(paths: ResolvedPaths, config: HostConfig): string[];
6
+ //# sourceMappingURL=models-fs.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"models-fs.d.ts","sourceRoot":"","sources":["../../src/core/models-fs.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAChD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAC;AAE5D,wBAAgB,eAAe,CAAC,KAAK,EAAE,aAAa,EAAE,MAAM,EAAE,UAAU,GAAG,MAAM,CAIhF;AAED,wBAAsB,kBAAkB,CACtC,KAAK,EAAE,aAAa,EACpB,MAAM,EAAE,UAAU,GACjB,OAAO,CAAC,MAAM,CAAC,CAIjB;AAED,wBAAgB,cAAc,CAAC,KAAK,EAAE,aAAa,EAAE,MAAM,EAAE,UAAU,GAAG,MAAM,EAAE,CAMjF"}
@@ -0,0 +1,21 @@
1
+ import { existsSync, readdirSync } from "node:fs";
2
+ import { mkdir } from "node:fs/promises";
3
+ export function getLLMDirectory(paths, config) {
4
+ return config.llmLocation && config.llmLocation.trim().length > 0
5
+ ? config.llmLocation
6
+ : paths.modelsDir;
7
+ }
8
+ export async function ensureLLMDirectory(paths, config) {
9
+ const dir = getLLMDirectory(paths, config);
10
+ await mkdir(dir, { recursive: true });
11
+ return dir;
12
+ }
13
+ export function listModelsSync(paths, config) {
14
+ const dir = getLLMDirectory(paths, config);
15
+ if (!existsSync(dir))
16
+ return [];
17
+ return readdirSync(dir)
18
+ .filter((f) => f.toLowerCase().endsWith(".gguf"))
19
+ .map((f) => f.replace(/\.gguf$/i, ""));
20
+ }
21
+ //# sourceMappingURL=models-fs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"models-fs.js","sourceRoot":"","sources":["../../src/core/models-fs.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAClD,OAAO,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAKzC,MAAM,UAAU,eAAe,CAAC,KAAoB,EAAE,MAAkB;IACtE,OAAO,MAAM,CAAC,WAAW,IAAI,MAAM,CAAC,WAAW,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC;QAC/D,CAAC,CAAC,MAAM,CAAC,WAAW;QACpB,CAAC,CAAC,KAAK,CAAC,SAAS,CAAC;AACtB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,KAAoB,EACpB,MAAkB;IAElB,MAAM,GAAG,GAAG,eAAe,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;IAC3C,MAAM,KAAK,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACtC,OAAO,GAAG,CAAC;AACb,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,KAAoB,EAAE,MAAkB;IACrE,MAAM,GAAG,GAAG,eAAe,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;IAC3C,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC;QAAE,OAAO,EAAE,CAAC;IAChC,OAAO,WAAW,CAAC,GAAG,CAAC;SACpB,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;SAChD,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC,CAAC;AAC3C,CAAC"}
@@ -0,0 +1,42 @@
1
+ import type { ConfigService } from "./config.js";
2
+ import { DaemonEventBus } from "./events.js";
3
+ import type { ResolvedPaths } from "./paths.js";
4
+ export type OrchestratorStatus = "disconnected" | "connecting" | "connected" | "error";
5
+ export interface OrchestratorOptions {
6
+ paths: ResolvedPaths;
7
+ config: ConfigService;
8
+ events: DaemonEventBus;
9
+ cliVersion: string;
10
+ hubUrl?: string;
11
+ }
12
+ export declare class OrchestratorService {
13
+ private readonly opts;
14
+ private connection;
15
+ private heartbeatInterval;
16
+ private cleanupInterval;
17
+ private intentionalDisconnect;
18
+ private isConnecting;
19
+ private status;
20
+ private readonly url;
21
+ private readonly sharedRunner;
22
+ private readonly sessions;
23
+ constructor(opts: OrchestratorOptions);
24
+ getStatus(): OrchestratorStatus;
25
+ getRunnerStats(): {
26
+ activeContexts: number;
27
+ maxContexts: number;
28
+ modelName: string;
29
+ gpuLayers: number;
30
+ };
31
+ updateHostName(hostName: string): Promise<void>;
32
+ connect(): Promise<void>;
33
+ disconnect(): Promise<void>;
34
+ private registerAndStartHeartbeat;
35
+ private handlePrompt;
36
+ private cleanupConversation;
37
+ private startCleanupLoop;
38
+ private stopTimers;
39
+ private send;
40
+ private setStatus;
41
+ }
42
+ //# sourceMappingURL=orchestrator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"orchestrator.d.ts","sourceRoot":"","sources":["../../src/core/orchestrator.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AACjD,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAG7C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AA4BhD,MAAM,MAAM,kBAAkB,GAAG,cAAc,GAAG,YAAY,GAAG,WAAW,GAAG,OAAO,CAAC;AAEvF,MAAM,WAAW,mBAAmB;IAClC,KAAK,EAAE,aAAa,CAAC;IACrB,MAAM,EAAE,aAAa,CAAC;IACtB,MAAM,EAAE,cAAc,CAAC;IACvB,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,qBAAa,mBAAmB;IAYlB,OAAO,CAAC,QAAQ,CAAC,IAAI;IAXjC,OAAO,CAAC,UAAU,CAA8B;IAChD,OAAO,CAAC,iBAAiB,CAA+B;IACxD,OAAO,CAAC,eAAe,CAA+B;IACtD,OAAO,CAAC,qBAAqB,CAAS;IACtC,OAAO,CAAC,YAAY,CAAS;IAC7B,OAAO,CAAC,MAAM,CAAsC;IAEpD,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAS;IAC7B,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAmB;IAChD,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAgE;gBAE5D,IAAI,EAAE,mBAAmB;IAQtD,SAAS,IAAI,kBAAkB;IAI/B,cAAc,IAAI;QAAE,cAAc,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE;IAIjG,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAgB/C,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAqHxB,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;YAmBnB,yBAAyB;YAkCzB,YAAY;IAgE1B,OAAO,CAAC,mBAAmB;IAM3B,OAAO,CAAC,gBAAgB;IAYxB,OAAO,CAAC,UAAU;YAWJ,IAAI;IASlB,OAAO,CAAC,SAAS;CAKlB"}