@appkit/llamacpp-cli 1.0.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 (136) hide show
  1. package/.versionrc.json +16 -0
  2. package/CHANGELOG.md +10 -0
  3. package/README.md +474 -0
  4. package/bin/llamacpp +26 -0
  5. package/dist/cli.d.ts +3 -0
  6. package/dist/cli.d.ts.map +1 -0
  7. package/dist/cli.js +196 -0
  8. package/dist/cli.js.map +1 -0
  9. package/dist/commands/delete.d.ts +2 -0
  10. package/dist/commands/delete.d.ts.map +1 -0
  11. package/dist/commands/delete.js +104 -0
  12. package/dist/commands/delete.js.map +1 -0
  13. package/dist/commands/list.d.ts +2 -0
  14. package/dist/commands/list.d.ts.map +1 -0
  15. package/dist/commands/list.js +37 -0
  16. package/dist/commands/list.js.map +1 -0
  17. package/dist/commands/logs.d.ts +8 -0
  18. package/dist/commands/logs.d.ts.map +1 -0
  19. package/dist/commands/logs.js +57 -0
  20. package/dist/commands/logs.js.map +1 -0
  21. package/dist/commands/ps.d.ts +2 -0
  22. package/dist/commands/ps.d.ts.map +1 -0
  23. package/dist/commands/ps.js +72 -0
  24. package/dist/commands/ps.js.map +1 -0
  25. package/dist/commands/pull.d.ts +6 -0
  26. package/dist/commands/pull.d.ts.map +1 -0
  27. package/dist/commands/pull.js +36 -0
  28. package/dist/commands/pull.js.map +1 -0
  29. package/dist/commands/rm.d.ts +2 -0
  30. package/dist/commands/rm.d.ts.map +1 -0
  31. package/dist/commands/rm.js +134 -0
  32. package/dist/commands/rm.js.map +1 -0
  33. package/dist/commands/run.d.ts +2 -0
  34. package/dist/commands/run.d.ts.map +1 -0
  35. package/dist/commands/run.js +198 -0
  36. package/dist/commands/run.js.map +1 -0
  37. package/dist/commands/search.d.ts +7 -0
  38. package/dist/commands/search.d.ts.map +1 -0
  39. package/dist/commands/search.js +93 -0
  40. package/dist/commands/search.js.map +1 -0
  41. package/dist/commands/show.d.ts +6 -0
  42. package/dist/commands/show.d.ts.map +1 -0
  43. package/dist/commands/show.js +196 -0
  44. package/dist/commands/show.js.map +1 -0
  45. package/dist/commands/start.d.ts +9 -0
  46. package/dist/commands/start.d.ts.map +1 -0
  47. package/dist/commands/start.js +150 -0
  48. package/dist/commands/start.js.map +1 -0
  49. package/dist/commands/stop.d.ts +2 -0
  50. package/dist/commands/stop.d.ts.map +1 -0
  51. package/dist/commands/stop.js +39 -0
  52. package/dist/commands/stop.js.map +1 -0
  53. package/dist/lib/config-generator.d.ts +30 -0
  54. package/dist/lib/config-generator.d.ts.map +1 -0
  55. package/dist/lib/config-generator.js +125 -0
  56. package/dist/lib/config-generator.js.map +1 -0
  57. package/dist/lib/launchctl-manager.d.ts +55 -0
  58. package/dist/lib/launchctl-manager.d.ts.map +1 -0
  59. package/dist/lib/launchctl-manager.js +227 -0
  60. package/dist/lib/launchctl-manager.js.map +1 -0
  61. package/dist/lib/model-downloader.d.ts +44 -0
  62. package/dist/lib/model-downloader.d.ts.map +1 -0
  63. package/dist/lib/model-downloader.js +248 -0
  64. package/dist/lib/model-downloader.js.map +1 -0
  65. package/dist/lib/model-scanner.d.ts +31 -0
  66. package/dist/lib/model-scanner.d.ts.map +1 -0
  67. package/dist/lib/model-scanner.js +145 -0
  68. package/dist/lib/model-scanner.js.map +1 -0
  69. package/dist/lib/model-search.d.ts +29 -0
  70. package/dist/lib/model-search.d.ts.map +1 -0
  71. package/dist/lib/model-search.js +131 -0
  72. package/dist/lib/model-search.js.map +1 -0
  73. package/dist/lib/port-manager.d.ts +26 -0
  74. package/dist/lib/port-manager.d.ts.map +1 -0
  75. package/dist/lib/port-manager.js +75 -0
  76. package/dist/lib/port-manager.js.map +1 -0
  77. package/dist/lib/state-manager.d.ts +59 -0
  78. package/dist/lib/state-manager.d.ts.map +1 -0
  79. package/dist/lib/state-manager.js +178 -0
  80. package/dist/lib/state-manager.js.map +1 -0
  81. package/dist/lib/status-checker.d.ts +28 -0
  82. package/dist/lib/status-checker.d.ts.map +1 -0
  83. package/dist/lib/status-checker.js +99 -0
  84. package/dist/lib/status-checker.js.map +1 -0
  85. package/dist/types/global-config.d.ts +16 -0
  86. package/dist/types/global-config.d.ts.map +1 -0
  87. package/dist/types/global-config.js +18 -0
  88. package/dist/types/global-config.js.map +1 -0
  89. package/dist/types/model-info.d.ts +9 -0
  90. package/dist/types/model-info.d.ts.map +1 -0
  91. package/dist/types/model-info.js +3 -0
  92. package/dist/types/model-info.js.map +1 -0
  93. package/dist/types/server-config.d.ts +27 -0
  94. package/dist/types/server-config.d.ts.map +1 -0
  95. package/dist/types/server-config.js +15 -0
  96. package/dist/types/server-config.js.map +1 -0
  97. package/dist/utils/file-utils.d.ts +49 -0
  98. package/dist/utils/file-utils.d.ts.map +1 -0
  99. package/dist/utils/file-utils.js +144 -0
  100. package/dist/utils/file-utils.js.map +1 -0
  101. package/dist/utils/format-utils.d.ts +29 -0
  102. package/dist/utils/format-utils.d.ts.map +1 -0
  103. package/dist/utils/format-utils.js +82 -0
  104. package/dist/utils/format-utils.js.map +1 -0
  105. package/dist/utils/process-utils.d.ts +27 -0
  106. package/dist/utils/process-utils.d.ts.map +1 -0
  107. package/dist/utils/process-utils.js +66 -0
  108. package/dist/utils/process-utils.js.map +1 -0
  109. package/package.json +56 -0
  110. package/src/cli.ts +195 -0
  111. package/src/commands/delete.ts +74 -0
  112. package/src/commands/list.ts +37 -0
  113. package/src/commands/logs.ts +61 -0
  114. package/src/commands/ps.ts +79 -0
  115. package/src/commands/pull.ts +40 -0
  116. package/src/commands/rm.ts +114 -0
  117. package/src/commands/run.ts +209 -0
  118. package/src/commands/search.ts +107 -0
  119. package/src/commands/show.ts +207 -0
  120. package/src/commands/start.ts +140 -0
  121. package/src/commands/stop.ts +39 -0
  122. package/src/lib/config-generator.ts +119 -0
  123. package/src/lib/launchctl-manager.ts +209 -0
  124. package/src/lib/model-downloader.ts +259 -0
  125. package/src/lib/model-scanner.ts +125 -0
  126. package/src/lib/model-search.ts +114 -0
  127. package/src/lib/port-manager.ts +80 -0
  128. package/src/lib/state-manager.ts +177 -0
  129. package/src/lib/status-checker.ts +113 -0
  130. package/src/types/global-config.ts +26 -0
  131. package/src/types/model-info.ts +8 -0
  132. package/src/types/server-config.ts +42 -0
  133. package/src/utils/file-utils.ts +106 -0
  134. package/src/utils/format-utils.ts +80 -0
  135. package/src/utils/process-utils.ts +60 -0
  136. package/tsconfig.json +20 -0
@@ -0,0 +1,145 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.modelScanner = exports.ModelScanner = void 0;
37
+ const fs = __importStar(require("fs/promises"));
38
+ const path = __importStar(require("path"));
39
+ const file_utils_1 = require("../utils/file-utils");
40
+ const format_utils_1 = require("../utils/format-utils");
41
+ class ModelScanner {
42
+ constructor(modelsDir) {
43
+ this.modelsDir = modelsDir || (0, file_utils_1.getModelsDir)();
44
+ }
45
+ /**
46
+ * Scan models directory for GGUF files
47
+ */
48
+ async scanModels() {
49
+ try {
50
+ const files = await fs.readdir(this.modelsDir);
51
+ const ggufFiles = files.filter((f) => f.toLowerCase().endsWith('.gguf'));
52
+ const models = [];
53
+ for (const file of ggufFiles) {
54
+ const modelInfo = await this.getModelInfo(file);
55
+ if (modelInfo) {
56
+ models.push(modelInfo);
57
+ }
58
+ }
59
+ // Sort by modified date (newest first)
60
+ models.sort((a, b) => b.modified.getTime() - a.modified.getTime());
61
+ return models;
62
+ }
63
+ catch (error) {
64
+ // Models directory doesn't exist or is not accessible
65
+ return [];
66
+ }
67
+ }
68
+ /**
69
+ * Get information about a specific model file
70
+ */
71
+ async getModelInfo(filename) {
72
+ const modelPath = path.join(this.modelsDir, filename);
73
+ try {
74
+ const stats = await fs.stat(modelPath);
75
+ return {
76
+ filename,
77
+ path: modelPath,
78
+ size: stats.size,
79
+ sizeFormatted: (0, format_utils_1.formatBytes)(stats.size),
80
+ modified: stats.mtime,
81
+ exists: true,
82
+ };
83
+ }
84
+ catch (error) {
85
+ // File doesn't exist or is not accessible
86
+ return {
87
+ filename,
88
+ path: modelPath,
89
+ size: 0,
90
+ sizeFormatted: '0 B',
91
+ modified: new Date(),
92
+ exists: false,
93
+ };
94
+ }
95
+ }
96
+ /**
97
+ * Validate that a model file exists and is readable
98
+ */
99
+ async validateModel(filename) {
100
+ const modelInfo = await this.getModelInfo(filename);
101
+ return modelInfo !== null && modelInfo.exists && modelInfo.size > 0;
102
+ }
103
+ /**
104
+ * Resolve a model filename to full path
105
+ */
106
+ async resolveModelPath(filename) {
107
+ // If already absolute path, return it
108
+ if (path.isAbsolute(filename)) {
109
+ return filename;
110
+ }
111
+ // Try in models directory
112
+ const modelPath = path.join(this.modelsDir, filename);
113
+ const modelInfo = await this.getModelInfo(filename);
114
+ if (modelInfo && modelInfo.exists) {
115
+ return modelPath;
116
+ }
117
+ // Try adding .gguf extension
118
+ if (!filename.toLowerCase().endsWith('.gguf')) {
119
+ const withExtension = `${filename}.gguf`;
120
+ const modelInfoWithExt = await this.getModelInfo(withExtension);
121
+ if (modelInfoWithExt && modelInfoWithExt.exists) {
122
+ return path.join(this.modelsDir, withExtension);
123
+ }
124
+ }
125
+ return null;
126
+ }
127
+ /**
128
+ * Get the size of a model file
129
+ */
130
+ async getModelSize(filename) {
131
+ const modelInfo = await this.getModelInfo(filename);
132
+ return modelInfo?.size || null;
133
+ }
134
+ /**
135
+ * Get total size of all models
136
+ */
137
+ async getTotalSize() {
138
+ const models = await this.scanModels();
139
+ return models.reduce((total, model) => total + model.size, 0);
140
+ }
141
+ }
142
+ exports.ModelScanner = ModelScanner;
143
+ // Export singleton instance
144
+ exports.modelScanner = new ModelScanner();
145
+ //# sourceMappingURL=model-scanner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"model-scanner.js","sourceRoot":"","sources":["../../src/lib/model-scanner.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,gDAAkC;AAClC,2CAA6B;AAE7B,oDAAmD;AACnD,wDAAoD;AAEpD,MAAa,YAAY;IAGvB,YAAY,SAAkB;QAC5B,IAAI,CAAC,SAAS,GAAG,SAAS,IAAI,IAAA,yBAAY,GAAE,CAAC;IAC/C,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,UAAU;QACd,IAAI,CAAC;YACH,MAAM,KAAK,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YAC/C,MAAM,SAAS,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC;YAEzE,MAAM,MAAM,GAAgB,EAAE,CAAC;YAC/B,KAAK,MAAM,IAAI,IAAI,SAAS,EAAE,CAAC;gBAC7B,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;gBAChD,IAAI,SAAS,EAAE,CAAC;oBACd,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;gBACzB,CAAC;YACH,CAAC;YAED,uCAAuC;YACvC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAC,CAAC;YAEnE,OAAO,MAAM,CAAC;QAChB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,sDAAsD;YACtD,OAAO,EAAE,CAAC;QACZ,CAAC;IACH,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,YAAY,CAAC,QAAgB;QACjC,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;QAEtD,IAAI,CAAC;YACH,MAAM,KAAK,GAAG,MAAM,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YAEvC,OAAO;gBACL,QAAQ;gBACR,IAAI,EAAE,SAAS;gBACf,IAAI,EAAE,KAAK,CAAC,IAAI;gBAChB,aAAa,EAAE,IAAA,0BAAW,EAAC,KAAK,CAAC,IAAI,CAAC;gBACtC,QAAQ,EAAE,KAAK,CAAC,KAAK;gBACrB,MAAM,EAAE,IAAI;aACb,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,0CAA0C;YAC1C,OAAO;gBACL,QAAQ;gBACR,IAAI,EAAE,SAAS;gBACf,IAAI,EAAE,CAAC;gBACP,aAAa,EAAE,KAAK;gBACpB,QAAQ,EAAE,IAAI,IAAI,EAAE;gBACpB,MAAM,EAAE,KAAK;aACd,CAAC;QACJ,CAAC;IACH,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,aAAa,CAAC,QAAgB;QAClC,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC;QACpD,OAAO,SAAS,KAAK,IAAI,IAAI,SAAS,CAAC,MAAM,IAAI,SAAS,CAAC,IAAI,GAAG,CAAC,CAAC;IACtE,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,gBAAgB,CAAC,QAAgB;QACrC,sCAAsC;QACtC,IAAI,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC9B,OAAO,QAAQ,CAAC;QAClB,CAAC;QAED,0BAA0B;QAC1B,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;QACtD,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC;QAEpD,IAAI,SAAS,IAAI,SAAS,CAAC,MAAM,EAAE,CAAC;YAClC,OAAO,SAAS,CAAC;QACnB,CAAC;QAED,6BAA6B;QAC7B,IAAI,CAAC,QAAQ,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;YAC9C,MAAM,aAAa,GAAG,GAAG,QAAQ,OAAO,CAAC;YACzC,MAAM,gBAAgB,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,aAAa,CAAC,CAAC;YAChE,IAAI,gBAAgB,IAAI,gBAAgB,CAAC,MAAM,EAAE,CAAC;gBAChD,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,aAAa,CAAC,CAAC;YAClD,CAAC;QACH,CAAC;QAED,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,YAAY,CAAC,QAAgB;QACjC,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC;QACpD,OAAO,SAAS,EAAE,IAAI,IAAI,IAAI,CAAC;IACjC,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,YAAY;QAChB,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,UAAU,EAAE,CAAC;QACvC,OAAO,MAAM,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE,CAAC,KAAK,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;IAChE,CAAC;CACF;AAnHD,oCAmHC;AAED,4BAA4B;AACf,QAAA,YAAY,GAAG,IAAI,YAAY,EAAE,CAAC"}
@@ -0,0 +1,29 @@
1
+ export interface HFModelResult {
2
+ modelId: string;
3
+ author: string;
4
+ modelName: string;
5
+ downloads: number;
6
+ likes: number;
7
+ tags: string[];
8
+ lastModified: string;
9
+ }
10
+ export declare class ModelSearch {
11
+ /**
12
+ * Search Hugging Face for GGUF models
13
+ */
14
+ searchModels(query: string, limit?: number): Promise<HFModelResult[]>;
15
+ /**
16
+ * Build Hugging Face search URL
17
+ */
18
+ private buildSearchUrl;
19
+ /**
20
+ * Parse API results into our model format
21
+ */
22
+ private parseResults;
23
+ /**
24
+ * Get GGUF files for a specific model
25
+ */
26
+ getModelFiles(modelId: string): Promise<string[]>;
27
+ }
28
+ export declare const modelSearch: ModelSearch;
29
+ //# sourceMappingURL=model-search.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"model-search.d.ts","sourceRoot":"","sources":["../../src/lib/model-search.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,qBAAa,WAAW;IACtB;;OAEG;IACG,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,SAAK,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC;IA0BvE;;OAEG;IACH,OAAO,CAAC,cAAc;IAYtB;;OAEG;IACH,OAAO,CAAC,YAAY;IAmBpB;;OAEG;IACG,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;CA4BxD;AAGD,eAAO,MAAM,WAAW,aAAoB,CAAC"}
@@ -0,0 +1,131 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.modelSearch = exports.ModelSearch = void 0;
37
+ const https = __importStar(require("https"));
38
+ class ModelSearch {
39
+ /**
40
+ * Search Hugging Face for GGUF models
41
+ */
42
+ async searchModels(query, limit = 20) {
43
+ const searchUrl = this.buildSearchUrl(query, limit);
44
+ return new Promise((resolve, reject) => {
45
+ https.get(searchUrl, (response) => {
46
+ let data = '';
47
+ response.on('data', (chunk) => {
48
+ data += chunk;
49
+ });
50
+ response.on('end', () => {
51
+ try {
52
+ const results = JSON.parse(data);
53
+ const models = this.parseResults(results);
54
+ resolve(models);
55
+ }
56
+ catch (error) {
57
+ reject(new Error(`Failed to parse search results: ${error.message}`));
58
+ }
59
+ });
60
+ }).on('error', (error) => {
61
+ reject(new Error(`Search request failed: ${error.message}`));
62
+ });
63
+ });
64
+ }
65
+ /**
66
+ * Build Hugging Face search URL
67
+ */
68
+ buildSearchUrl(query, limit) {
69
+ const params = new URLSearchParams({
70
+ search: query,
71
+ filter: 'gguf',
72
+ sort: 'downloads',
73
+ direction: '-1',
74
+ limit: limit.toString(),
75
+ });
76
+ return `https://huggingface.co/api/models?${params.toString()}`;
77
+ }
78
+ /**
79
+ * Parse API results into our model format
80
+ */
81
+ parseResults(results) {
82
+ return results.map((result) => {
83
+ const modelId = result.id || result.modelId || '';
84
+ const parts = modelId.split('/');
85
+ const author = parts[0] || '';
86
+ const modelName = parts.slice(1).join('/') || '';
87
+ return {
88
+ modelId,
89
+ author,
90
+ modelName,
91
+ downloads: result.downloads || 0,
92
+ likes: result.likes || 0,
93
+ tags: result.tags || [],
94
+ lastModified: result.lastModified || '',
95
+ };
96
+ });
97
+ }
98
+ /**
99
+ * Get GGUF files for a specific model
100
+ */
101
+ async getModelFiles(modelId) {
102
+ const apiUrl = `https://huggingface.co/api/models/${modelId}`;
103
+ return new Promise((resolve, reject) => {
104
+ https.get(apiUrl, (response) => {
105
+ let data = '';
106
+ response.on('data', (chunk) => {
107
+ data += chunk;
108
+ });
109
+ response.on('end', () => {
110
+ try {
111
+ const modelInfo = JSON.parse(data);
112
+ const files = modelInfo.siblings || [];
113
+ const ggufFiles = files
114
+ .filter((file) => file.rfilename?.toLowerCase().endsWith('.gguf'))
115
+ .map((file) => file.rfilename);
116
+ resolve(ggufFiles);
117
+ }
118
+ catch (error) {
119
+ reject(new Error(`Failed to fetch model files: ${error.message}`));
120
+ }
121
+ });
122
+ }).on('error', (error) => {
123
+ reject(new Error(`API request failed: ${error.message}`));
124
+ });
125
+ });
126
+ }
127
+ }
128
+ exports.ModelSearch = ModelSearch;
129
+ // Export singleton instance
130
+ exports.modelSearch = new ModelSearch();
131
+ //# sourceMappingURL=model-search.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"model-search.js","sourceRoot":"","sources":["../../src/lib/model-search.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,26 @@
1
+ export declare class PortManager {
2
+ private readonly portRangeStart;
3
+ private readonly portRangeEnd;
4
+ /**
5
+ * Find an available port in the range
6
+ */
7
+ findAvailablePort(startPort?: number): Promise<number>;
8
+ /**
9
+ * Check if a port is available
10
+ */
11
+ isPortAvailable(port: number): Promise<boolean>;
12
+ /**
13
+ * Validate a port number
14
+ */
15
+ validatePort(port: number): void;
16
+ /**
17
+ * Find a server using a given port
18
+ */
19
+ findServerByPort(port: number): Promise<import("../types/server-config").ServerConfig | null>;
20
+ /**
21
+ * Check for port conflicts
22
+ */
23
+ checkPortConflict(port: number, exceptId?: string): Promise<boolean>;
24
+ }
25
+ export declare const portManager: PortManager;
26
+ //# sourceMappingURL=port-manager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"port-manager.d.ts","sourceRoot":"","sources":["../../src/lib/port-manager.ts"],"names":[],"mappings":"AAGA,qBAAa,WAAW;IACtB,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAQ;IACvC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAQ;IAErC;;OAEG;IACG,iBAAiB,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAoB5D;;OAEG;IACG,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAgBrD;;OAEG;IACH,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAShC;;OAEG;IACG,gBAAgB,CAAC,IAAI,EAAE,MAAM;IAInC;;OAEG;IACG,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;CAK3E;AAGD,eAAO,MAAM,WAAW,aAAoB,CAAC"}
@@ -0,0 +1,75 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.portManager = exports.PortManager = void 0;
4
+ const process_utils_1 = require("../utils/process-utils");
5
+ const state_manager_1 = require("./state-manager");
6
+ class PortManager {
7
+ constructor() {
8
+ this.portRangeStart = 9000;
9
+ this.portRangeEnd = 9999;
10
+ }
11
+ /**
12
+ * Find an available port in the range
13
+ */
14
+ async findAvailablePort(startPort) {
15
+ const start = startPort || this.portRangeStart;
16
+ // Get ports used by existing servers
17
+ const usedPorts = await state_manager_1.stateManager.getUsedPorts();
18
+ // Find first available port
19
+ for (let port = start; port <= this.portRangeEnd; port++) {
20
+ if (!usedPorts.has(port)) {
21
+ // Check if port is actually available (not used by other processes)
22
+ const inUse = await (0, process_utils_1.isPortInUse)(port);
23
+ if (!inUse) {
24
+ return port;
25
+ }
26
+ }
27
+ }
28
+ throw new Error(`No available ports in range ${start}-${this.portRangeEnd}`);
29
+ }
30
+ /**
31
+ * Check if a port is available
32
+ */
33
+ async isPortAvailable(port) {
34
+ // Check if port is in valid range
35
+ if (port < 1024 || port > 65535) {
36
+ return false;
37
+ }
38
+ // Check if port is used by any server
39
+ const usedPorts = await state_manager_1.stateManager.getUsedPorts();
40
+ if (usedPorts.has(port)) {
41
+ return false;
42
+ }
43
+ // Check if port is actually in use
44
+ return !(await (0, process_utils_1.isPortInUse)(port));
45
+ }
46
+ /**
47
+ * Validate a port number
48
+ */
49
+ validatePort(port) {
50
+ if (port < 1024) {
51
+ throw new Error('Port must be >= 1024 (ports below 1024 require root)');
52
+ }
53
+ if (port > 65535) {
54
+ throw new Error('Port must be <= 65535');
55
+ }
56
+ }
57
+ /**
58
+ * Find a server using a given port
59
+ */
60
+ async findServerByPort(port) {
61
+ return await state_manager_1.stateManager.findServerByPort(port);
62
+ }
63
+ /**
64
+ * Check for port conflicts
65
+ */
66
+ async checkPortConflict(port, exceptId) {
67
+ const servers = await state_manager_1.stateManager.getAllServers();
68
+ const conflict = servers.find((s) => s.port === port && s.id !== exceptId);
69
+ return conflict !== undefined;
70
+ }
71
+ }
72
+ exports.PortManager = PortManager;
73
+ // Export singleton instance
74
+ exports.portManager = new PortManager();
75
+ //# sourceMappingURL=port-manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"port-manager.js","sourceRoot":"","sources":["../../src/lib/port-manager.ts"],"names":[],"mappings":";;;AAAA,0DAAqD;AACrD,mDAA+C;AAE/C,MAAa,WAAW;IAAxB;QACmB,mBAAc,GAAG,IAAI,CAAC;QACtB,iBAAY,GAAG,IAAI,CAAC;IAuEvC,CAAC;IArEC;;OAEG;IACH,KAAK,CAAC,iBAAiB,CAAC,SAAkB;QACxC,MAAM,KAAK,GAAG,SAAS,IAAI,IAAI,CAAC,cAAc,CAAC;QAE/C,qCAAqC;QACrC,MAAM,SAAS,GAAG,MAAM,4BAAY,CAAC,YAAY,EAAE,CAAC;QAEpD,4BAA4B;QAC5B,KAAK,IAAI,IAAI,GAAG,KAAK,EAAE,IAAI,IAAI,IAAI,CAAC,YAAY,EAAE,IAAI,EAAE,EAAE,CAAC;YACzD,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;gBACzB,oEAAoE;gBACpE,MAAM,KAAK,GAAG,MAAM,IAAA,2BAAW,EAAC,IAAI,CAAC,CAAC;gBACtC,IAAI,CAAC,KAAK,EAAE,CAAC;oBACX,OAAO,IAAI,CAAC;gBACd,CAAC;YACH,CAAC;QACH,CAAC;QAED,MAAM,IAAI,KAAK,CAAC,+BAA+B,KAAK,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC,CAAC;IAC/E,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,eAAe,CAAC,IAAY;QAChC,kCAAkC;QAClC,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,KAAK,EAAE,CAAC;YAChC,OAAO,KAAK,CAAC;QACf,CAAC;QAED,sCAAsC;QACtC,MAAM,SAAS,GAAG,MAAM,4BAAY,CAAC,YAAY,EAAE,CAAC;QACpD,IAAI,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;YACxB,OAAO,KAAK,CAAC;QACf,CAAC;QAED,mCAAmC;QACnC,OAAO,CAAC,CAAC,MAAM,IAAA,2BAAW,EAAC,IAAI,CAAC,CAAC,CAAC;IACpC,CAAC;IAED;;OAEG;IACH,YAAY,CAAC,IAAY;QACvB,IAAI,IAAI,GAAG,IAAI,EAAE,CAAC;YAChB,MAAM,IAAI,KAAK,CAAC,sDAAsD,CAAC,CAAC;QAC1E,CAAC;QACD,IAAI,IAAI,GAAG,KAAK,EAAE,CAAC;YACjB,MAAM,IAAI,KAAK,CAAC,uBAAuB,CAAC,CAAC;QAC3C,CAAC;IACH,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,gBAAgB,CAAC,IAAY;QACjC,OAAO,MAAM,4BAAY,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC;IACnD,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,iBAAiB,CAAC,IAAY,EAAE,QAAiB;QACrD,MAAM,OAAO,GAAG,MAAM,4BAAY,CAAC,aAAa,EAAE,CAAC;QACnD,MAAM,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,IAAI,CAAC,CAAC,EAAE,KAAK,QAAQ,CAAC,CAAC;QAC3E,OAAO,QAAQ,KAAK,SAAS,CAAC;IAChC,CAAC;CACF;AAzED,kCAyEC;AAED,4BAA4B;AACf,QAAA,WAAW,GAAG,IAAI,WAAW,EAAE,CAAC"}
@@ -0,0 +1,59 @@
1
+ import { ServerConfig } from '../types/server-config';
2
+ import { GlobalConfig } from '../types/global-config';
3
+ export declare class StateManager {
4
+ private configDir;
5
+ private serversDir;
6
+ private logsDir;
7
+ private globalConfigPath;
8
+ constructor();
9
+ /**
10
+ * Initialize config directories
11
+ */
12
+ initialize(): Promise<void>;
13
+ /**
14
+ * Load global configuration
15
+ */
16
+ loadGlobalConfig(): Promise<GlobalConfig>;
17
+ /**
18
+ * Save global configuration
19
+ */
20
+ saveGlobalConfig(config: GlobalConfig): Promise<void>;
21
+ /**
22
+ * Load a server configuration by ID
23
+ */
24
+ loadServerConfig(id: string): Promise<ServerConfig | null>;
25
+ /**
26
+ * Save a server configuration
27
+ */
28
+ saveServerConfig(config: ServerConfig): Promise<void>;
29
+ /**
30
+ * Delete a server configuration
31
+ */
32
+ deleteServerConfig(id: string): Promise<void>;
33
+ /**
34
+ * Get all server configurations
35
+ */
36
+ getAllServers(): Promise<ServerConfig[]>;
37
+ /**
38
+ * Find a server by port
39
+ */
40
+ findServerByPort(port: number): Promise<ServerConfig | null>;
41
+ /**
42
+ * Find a server by model name (fuzzy match)
43
+ */
44
+ findServerByModelName(name: string): Promise<ServerConfig | null>;
45
+ /**
46
+ * Find a server by identifier (ID, model name, or port)
47
+ */
48
+ findServer(identifier: string): Promise<ServerConfig | null>;
49
+ /**
50
+ * Check if a server exists for a given model
51
+ */
52
+ serverExistsForModel(modelPath: string): Promise<boolean>;
53
+ /**
54
+ * Get all used ports
55
+ */
56
+ getUsedPorts(): Promise<Set<number>>;
57
+ }
58
+ export declare const stateManager: StateManager;
59
+ //# sourceMappingURL=state-manager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"state-manager.d.ts","sourceRoot":"","sources":["../../src/lib/state-manager.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AACtD,OAAO,EAAE,YAAY,EAAyB,MAAM,wBAAwB,CAAC;AAc7E,qBAAa,YAAY;IACvB,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,gBAAgB,CAAS;;IASjC;;OAEG;IACG,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAgBjC;;OAEG;IACG,gBAAgB,IAAI,OAAO,CAAC,YAAY,CAAC;IAK/C;;OAEG;IACG,gBAAgB,CAAC,MAAM,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC;IAI3D;;OAEG;IACG,gBAAgB,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC;IAQhE;;OAEG;IACG,gBAAgB,CAAC,MAAM,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC;IAK3D;;OAEG;IACG,kBAAkB,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAOnD;;OAEG;IACG,aAAa,IAAI,OAAO,CAAC,YAAY,EAAE,CAAC;IAmB9C;;OAEG;IACG,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC;IAKlE;;OAEG;IACG,qBAAqB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC;IAiBvE;;OAEG;IACG,UAAU,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC;IAYlE;;OAEG;IACG,oBAAoB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAK/D;;OAEG;IACG,YAAY,IAAI,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;CAI3C;AAGD,eAAO,MAAM,YAAY,cAAqB,CAAC"}
@@ -0,0 +1,178 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.stateManager = exports.StateManager = void 0;
37
+ const path = __importStar(require("path"));
38
+ const fs = __importStar(require("fs/promises"));
39
+ const global_config_1 = require("../types/global-config");
40
+ const file_utils_1 = require("../utils/file-utils");
41
+ class StateManager {
42
+ constructor() {
43
+ this.configDir = (0, file_utils_1.getConfigDir)();
44
+ this.serversDir = (0, file_utils_1.getServersDir)();
45
+ this.logsDir = (0, file_utils_1.getLogsDir)();
46
+ this.globalConfigPath = (0, file_utils_1.getGlobalConfigPath)();
47
+ }
48
+ /**
49
+ * Initialize config directories
50
+ */
51
+ async initialize() {
52
+ await (0, file_utils_1.ensureDir)(this.configDir);
53
+ await (0, file_utils_1.ensureDir)(this.serversDir);
54
+ await (0, file_utils_1.ensureDir)(this.logsDir);
55
+ await (0, file_utils_1.ensureDir)((0, file_utils_1.getLaunchAgentsDir)());
56
+ // Create default global config if it doesn't exist
57
+ if (!(await (0, file_utils_1.fileExists)(this.globalConfigPath))) {
58
+ const defaultConfig = {
59
+ ...global_config_1.DEFAULT_GLOBAL_CONFIG,
60
+ modelsDirectory: (0, file_utils_1.getModelsDir)(),
61
+ };
62
+ await this.saveGlobalConfig(defaultConfig);
63
+ }
64
+ }
65
+ /**
66
+ * Load global configuration
67
+ */
68
+ async loadGlobalConfig() {
69
+ await this.initialize();
70
+ return await (0, file_utils_1.readJson)(this.globalConfigPath);
71
+ }
72
+ /**
73
+ * Save global configuration
74
+ */
75
+ async saveGlobalConfig(config) {
76
+ await (0, file_utils_1.writeJsonAtomic)(this.globalConfigPath, config);
77
+ }
78
+ /**
79
+ * Load a server configuration by ID
80
+ */
81
+ async loadServerConfig(id) {
82
+ const configPath = path.join(this.serversDir, `${id}.json`);
83
+ if (!(await (0, file_utils_1.fileExists)(configPath))) {
84
+ return null;
85
+ }
86
+ return await (0, file_utils_1.readJson)(configPath);
87
+ }
88
+ /**
89
+ * Save a server configuration
90
+ */
91
+ async saveServerConfig(config) {
92
+ const configPath = path.join(this.serversDir, `${config.id}.json`);
93
+ await (0, file_utils_1.writeJsonAtomic)(configPath, config);
94
+ }
95
+ /**
96
+ * Delete a server configuration
97
+ */
98
+ async deleteServerConfig(id) {
99
+ const configPath = path.join(this.serversDir, `${id}.json`);
100
+ if (await (0, file_utils_1.fileExists)(configPath)) {
101
+ await fs.unlink(configPath);
102
+ }
103
+ }
104
+ /**
105
+ * Get all server configurations
106
+ */
107
+ async getAllServers() {
108
+ await (0, file_utils_1.ensureDir)(this.serversDir);
109
+ const files = await fs.readdir(this.serversDir);
110
+ const configFiles = files.filter((f) => f.endsWith('.json'));
111
+ const servers = [];
112
+ for (const file of configFiles) {
113
+ const filePath = path.join(this.serversDir, file);
114
+ try {
115
+ const config = await (0, file_utils_1.readJson)(filePath);
116
+ servers.push(config);
117
+ }
118
+ catch (error) {
119
+ console.error(`Failed to load server config ${file}:`, error);
120
+ }
121
+ }
122
+ return servers;
123
+ }
124
+ /**
125
+ * Find a server by port
126
+ */
127
+ async findServerByPort(port) {
128
+ const servers = await this.getAllServers();
129
+ return servers.find((s) => s.port === port) || null;
130
+ }
131
+ /**
132
+ * Find a server by model name (fuzzy match)
133
+ */
134
+ async findServerByModelName(name) {
135
+ const servers = await this.getAllServers();
136
+ const nameLower = name.toLowerCase();
137
+ // Try exact ID match first
138
+ const exactMatch = servers.find((s) => s.id === nameLower);
139
+ if (exactMatch)
140
+ return exactMatch;
141
+ // Try partial match on model name or ID
142
+ const partialMatch = servers.find((s) => s.modelName.toLowerCase().includes(nameLower) ||
143
+ s.id.toLowerCase().includes(nameLower));
144
+ return partialMatch || null;
145
+ }
146
+ /**
147
+ * Find a server by identifier (ID, model name, or port)
148
+ */
149
+ async findServer(identifier) {
150
+ // Try as port number
151
+ const port = parseInt(identifier, 10);
152
+ if (!isNaN(port)) {
153
+ const server = await this.findServerByPort(port);
154
+ if (server)
155
+ return server;
156
+ }
157
+ // Try as ID or model name
158
+ return await this.findServerByModelName(identifier);
159
+ }
160
+ /**
161
+ * Check if a server exists for a given model
162
+ */
163
+ async serverExistsForModel(modelPath) {
164
+ const servers = await this.getAllServers();
165
+ return servers.some((s) => s.modelPath === modelPath);
166
+ }
167
+ /**
168
+ * Get all used ports
169
+ */
170
+ async getUsedPorts() {
171
+ const servers = await this.getAllServers();
172
+ return new Set(servers.map((s) => s.port));
173
+ }
174
+ }
175
+ exports.StateManager = StateManager;
176
+ // Export singleton instance
177
+ exports.stateManager = new StateManager();
178
+ //# sourceMappingURL=state-manager.js.map