@kapeta/local-cluster-service 0.0.0-96f91ef

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 (274) hide show
  1. package/.eslintrc.cjs +25 -0
  2. package/.github/workflows/check-license.yml +17 -0
  3. package/.github/workflows/main.yml +26 -0
  4. package/.prettierignore +4 -0
  5. package/.vscode/launch.json +19 -0
  6. package/CHANGELOG.md +920 -0
  7. package/LICENSE +38 -0
  8. package/README.md +36 -0
  9. package/definitions.d.ts +35 -0
  10. package/dist/cjs/index.d.ts +34 -0
  11. package/dist/cjs/index.js +263 -0
  12. package/dist/cjs/package.json +1 -0
  13. package/dist/cjs/src/RepositoryWatcher.d.ts +30 -0
  14. package/dist/cjs/src/RepositoryWatcher.js +332 -0
  15. package/dist/cjs/src/ai/aiClient.d.ts +20 -0
  16. package/dist/cjs/src/ai/aiClient.js +74 -0
  17. package/dist/cjs/src/ai/routes.d.ts +7 -0
  18. package/dist/cjs/src/ai/routes.js +37 -0
  19. package/dist/cjs/src/ai/transform.d.ts +11 -0
  20. package/dist/cjs/src/ai/transform.js +239 -0
  21. package/dist/cjs/src/ai/types.d.ts +40 -0
  22. package/dist/cjs/src/ai/types.js +2 -0
  23. package/dist/cjs/src/api.d.ts +7 -0
  24. package/dist/cjs/src/api.js +29 -0
  25. package/dist/cjs/src/assetManager.d.ts +41 -0
  26. package/dist/cjs/src/assetManager.js +274 -0
  27. package/dist/cjs/src/assets/routes.d.ts +7 -0
  28. package/dist/cjs/src/assets/routes.js +165 -0
  29. package/dist/cjs/src/attachments/routes.d.ts +7 -0
  30. package/dist/cjs/src/attachments/routes.js +72 -0
  31. package/dist/cjs/src/authManager.d.ts +16 -0
  32. package/dist/cjs/src/authManager.js +64 -0
  33. package/dist/cjs/src/cacheManager.d.ts +20 -0
  34. package/dist/cjs/src/cacheManager.js +51 -0
  35. package/dist/cjs/src/clusterService.d.ts +44 -0
  36. package/dist/cjs/src/clusterService.js +120 -0
  37. package/dist/cjs/src/codeGeneratorManager.d.ts +14 -0
  38. package/dist/cjs/src/codeGeneratorManager.js +93 -0
  39. package/dist/cjs/src/config/routes.d.ts +7 -0
  40. package/dist/cjs/src/config/routes.js +160 -0
  41. package/dist/cjs/src/configManager.d.ts +42 -0
  42. package/dist/cjs/src/configManager.js +136 -0
  43. package/dist/cjs/src/containerManager.d.ts +148 -0
  44. package/dist/cjs/src/containerManager.js +958 -0
  45. package/dist/cjs/src/definitionsManager.d.ts +20 -0
  46. package/dist/cjs/src/definitionsManager.js +171 -0
  47. package/dist/cjs/src/filesystem/routes.d.ts +7 -0
  48. package/dist/cjs/src/filesystem/routes.js +105 -0
  49. package/dist/cjs/src/filesystemManager.d.ts +27 -0
  50. package/dist/cjs/src/filesystemManager.js +118 -0
  51. package/dist/cjs/src/identities/routes.d.ts +7 -0
  52. package/dist/cjs/src/identities/routes.js +37 -0
  53. package/dist/cjs/src/instanceManager.d.ts +69 -0
  54. package/dist/cjs/src/instanceManager.js +910 -0
  55. package/dist/cjs/src/instances/routes.d.ts +7 -0
  56. package/dist/cjs/src/instances/routes.js +179 -0
  57. package/dist/cjs/src/middleware/cors.d.ts +6 -0
  58. package/dist/cjs/src/middleware/cors.js +14 -0
  59. package/dist/cjs/src/middleware/kapeta.d.ts +15 -0
  60. package/dist/cjs/src/middleware/kapeta.js +28 -0
  61. package/dist/cjs/src/middleware/stringBody.d.ts +9 -0
  62. package/dist/cjs/src/middleware/stringBody.js +18 -0
  63. package/dist/cjs/src/networkManager.d.ts +37 -0
  64. package/dist/cjs/src/networkManager.js +119 -0
  65. package/dist/cjs/src/operatorManager.d.ts +41 -0
  66. package/dist/cjs/src/operatorManager.js +211 -0
  67. package/dist/cjs/src/progressListener.d.ts +31 -0
  68. package/dist/cjs/src/progressListener.js +133 -0
  69. package/dist/cjs/src/providerManager.d.ts +11 -0
  70. package/dist/cjs/src/providerManager.js +84 -0
  71. package/dist/cjs/src/providers/routes.d.ts +7 -0
  72. package/dist/cjs/src/providers/routes.js +46 -0
  73. package/dist/cjs/src/proxy/routes.d.ts +7 -0
  74. package/dist/cjs/src/proxy/routes.js +115 -0
  75. package/dist/cjs/src/proxy/types/rest.d.ts +10 -0
  76. package/dist/cjs/src/proxy/types/rest.js +123 -0
  77. package/dist/cjs/src/proxy/types/web.d.ts +8 -0
  78. package/dist/cjs/src/proxy/types/web.js +61 -0
  79. package/dist/cjs/src/repositoryManager.d.ts +35 -0
  80. package/dist/cjs/src/repositoryManager.js +247 -0
  81. package/dist/cjs/src/serviceManager.d.ts +36 -0
  82. package/dist/cjs/src/serviceManager.js +106 -0
  83. package/dist/cjs/src/socketManager.d.ts +32 -0
  84. package/dist/cjs/src/socketManager.js +125 -0
  85. package/dist/cjs/src/storageService.d.ts +21 -0
  86. package/dist/cjs/src/storageService.js +81 -0
  87. package/dist/cjs/src/taskManager.d.ts +70 -0
  88. package/dist/cjs/src/taskManager.js +181 -0
  89. package/dist/cjs/src/tasks/routes.d.ts +7 -0
  90. package/dist/cjs/src/tasks/routes.js +39 -0
  91. package/dist/cjs/src/traffic/routes.d.ts +7 -0
  92. package/dist/cjs/src/traffic/routes.js +22 -0
  93. package/dist/cjs/src/types.d.ts +99 -0
  94. package/dist/cjs/src/types.js +39 -0
  95. package/dist/cjs/src/utils/BlockInstanceRunner.d.ts +28 -0
  96. package/dist/cjs/src/utils/BlockInstanceRunner.js +432 -0
  97. package/dist/cjs/src/utils/DefaultProviderInstaller.d.ts +15 -0
  98. package/dist/cjs/src/utils/DefaultProviderInstaller.js +136 -0
  99. package/dist/cjs/src/utils/InternalConfigProvider.d.ts +38 -0
  100. package/dist/cjs/src/utils/InternalConfigProvider.js +146 -0
  101. package/dist/cjs/src/utils/LogData.d.ts +23 -0
  102. package/dist/cjs/src/utils/LogData.js +46 -0
  103. package/dist/cjs/src/utils/commandLineUtils.d.ts +8 -0
  104. package/dist/cjs/src/utils/commandLineUtils.js +39 -0
  105. package/dist/cjs/src/utils/pathTemplateParser.d.ts +30 -0
  106. package/dist/cjs/src/utils/pathTemplateParser.js +135 -0
  107. package/dist/cjs/src/utils/utils.d.ts +40 -0
  108. package/dist/cjs/src/utils/utils.js +148 -0
  109. package/dist/cjs/start.d.ts +5 -0
  110. package/dist/cjs/start.js +17 -0
  111. package/dist/cjs/test/proxy/types/rest.test.d.ts +5 -0
  112. package/dist/cjs/test/proxy/types/rest.test.js +48 -0
  113. package/dist/cjs/test/utils/pathTemplateParser.test.d.ts +5 -0
  114. package/dist/cjs/test/utils/pathTemplateParser.test.js +27 -0
  115. package/dist/esm/index.d.ts +34 -0
  116. package/dist/esm/index.js +263 -0
  117. package/dist/esm/package.json +1 -0
  118. package/dist/esm/src/RepositoryWatcher.d.ts +30 -0
  119. package/dist/esm/src/RepositoryWatcher.js +332 -0
  120. package/dist/esm/src/ai/aiClient.d.ts +20 -0
  121. package/dist/esm/src/ai/aiClient.js +74 -0
  122. package/dist/esm/src/ai/routes.d.ts +7 -0
  123. package/dist/esm/src/ai/routes.js +37 -0
  124. package/dist/esm/src/ai/transform.d.ts +11 -0
  125. package/dist/esm/src/ai/transform.js +239 -0
  126. package/dist/esm/src/ai/types.d.ts +40 -0
  127. package/dist/esm/src/ai/types.js +2 -0
  128. package/dist/esm/src/api.d.ts +7 -0
  129. package/dist/esm/src/api.js +29 -0
  130. package/dist/esm/src/assetManager.d.ts +41 -0
  131. package/dist/esm/src/assetManager.js +274 -0
  132. package/dist/esm/src/assets/routes.d.ts +7 -0
  133. package/dist/esm/src/assets/routes.js +165 -0
  134. package/dist/esm/src/attachments/routes.d.ts +7 -0
  135. package/dist/esm/src/attachments/routes.js +72 -0
  136. package/dist/esm/src/authManager.d.ts +16 -0
  137. package/dist/esm/src/authManager.js +64 -0
  138. package/dist/esm/src/cacheManager.d.ts +20 -0
  139. package/dist/esm/src/cacheManager.js +51 -0
  140. package/dist/esm/src/clusterService.d.ts +44 -0
  141. package/dist/esm/src/clusterService.js +120 -0
  142. package/dist/esm/src/codeGeneratorManager.d.ts +14 -0
  143. package/dist/esm/src/codeGeneratorManager.js +93 -0
  144. package/dist/esm/src/config/routes.d.ts +7 -0
  145. package/dist/esm/src/config/routes.js +160 -0
  146. package/dist/esm/src/configManager.d.ts +42 -0
  147. package/dist/esm/src/configManager.js +136 -0
  148. package/dist/esm/src/containerManager.d.ts +148 -0
  149. package/dist/esm/src/containerManager.js +958 -0
  150. package/dist/esm/src/definitionsManager.d.ts +20 -0
  151. package/dist/esm/src/definitionsManager.js +171 -0
  152. package/dist/esm/src/filesystem/routes.d.ts +7 -0
  153. package/dist/esm/src/filesystem/routes.js +105 -0
  154. package/dist/esm/src/filesystemManager.d.ts +27 -0
  155. package/dist/esm/src/filesystemManager.js +118 -0
  156. package/dist/esm/src/identities/routes.d.ts +7 -0
  157. package/dist/esm/src/identities/routes.js +37 -0
  158. package/dist/esm/src/instanceManager.d.ts +69 -0
  159. package/dist/esm/src/instanceManager.js +910 -0
  160. package/dist/esm/src/instances/routes.d.ts +7 -0
  161. package/dist/esm/src/instances/routes.js +179 -0
  162. package/dist/esm/src/middleware/cors.d.ts +6 -0
  163. package/dist/esm/src/middleware/cors.js +14 -0
  164. package/dist/esm/src/middleware/kapeta.d.ts +15 -0
  165. package/dist/esm/src/middleware/kapeta.js +28 -0
  166. package/dist/esm/src/middleware/stringBody.d.ts +9 -0
  167. package/dist/esm/src/middleware/stringBody.js +18 -0
  168. package/dist/esm/src/networkManager.d.ts +37 -0
  169. package/dist/esm/src/networkManager.js +119 -0
  170. package/dist/esm/src/operatorManager.d.ts +41 -0
  171. package/dist/esm/src/operatorManager.js +211 -0
  172. package/dist/esm/src/progressListener.d.ts +31 -0
  173. package/dist/esm/src/progressListener.js +133 -0
  174. package/dist/esm/src/providerManager.d.ts +11 -0
  175. package/dist/esm/src/providerManager.js +84 -0
  176. package/dist/esm/src/providers/routes.d.ts +7 -0
  177. package/dist/esm/src/providers/routes.js +46 -0
  178. package/dist/esm/src/proxy/routes.d.ts +7 -0
  179. package/dist/esm/src/proxy/routes.js +115 -0
  180. package/dist/esm/src/proxy/types/rest.d.ts +10 -0
  181. package/dist/esm/src/proxy/types/rest.js +123 -0
  182. package/dist/esm/src/proxy/types/web.d.ts +8 -0
  183. package/dist/esm/src/proxy/types/web.js +61 -0
  184. package/dist/esm/src/repositoryManager.d.ts +35 -0
  185. package/dist/esm/src/repositoryManager.js +247 -0
  186. package/dist/esm/src/serviceManager.d.ts +36 -0
  187. package/dist/esm/src/serviceManager.js +106 -0
  188. package/dist/esm/src/socketManager.d.ts +32 -0
  189. package/dist/esm/src/socketManager.js +125 -0
  190. package/dist/esm/src/storageService.d.ts +21 -0
  191. package/dist/esm/src/storageService.js +81 -0
  192. package/dist/esm/src/taskManager.d.ts +70 -0
  193. package/dist/esm/src/taskManager.js +181 -0
  194. package/dist/esm/src/tasks/routes.d.ts +7 -0
  195. package/dist/esm/src/tasks/routes.js +39 -0
  196. package/dist/esm/src/traffic/routes.d.ts +7 -0
  197. package/dist/esm/src/traffic/routes.js +22 -0
  198. package/dist/esm/src/types.d.ts +99 -0
  199. package/dist/esm/src/types.js +39 -0
  200. package/dist/esm/src/utils/BlockInstanceRunner.d.ts +28 -0
  201. package/dist/esm/src/utils/BlockInstanceRunner.js +432 -0
  202. package/dist/esm/src/utils/DefaultProviderInstaller.d.ts +15 -0
  203. package/dist/esm/src/utils/DefaultProviderInstaller.js +136 -0
  204. package/dist/esm/src/utils/InternalConfigProvider.d.ts +38 -0
  205. package/dist/esm/src/utils/InternalConfigProvider.js +146 -0
  206. package/dist/esm/src/utils/LogData.d.ts +23 -0
  207. package/dist/esm/src/utils/LogData.js +46 -0
  208. package/dist/esm/src/utils/commandLineUtils.d.ts +8 -0
  209. package/dist/esm/src/utils/commandLineUtils.js +39 -0
  210. package/dist/esm/src/utils/pathTemplateParser.d.ts +30 -0
  211. package/dist/esm/src/utils/pathTemplateParser.js +135 -0
  212. package/dist/esm/src/utils/utils.d.ts +40 -0
  213. package/dist/esm/src/utils/utils.js +148 -0
  214. package/dist/esm/start.d.ts +5 -0
  215. package/dist/esm/start.js +17 -0
  216. package/dist/esm/test/proxy/types/rest.test.d.ts +5 -0
  217. package/dist/esm/test/proxy/types/rest.test.js +48 -0
  218. package/dist/esm/test/utils/pathTemplateParser.test.d.ts +5 -0
  219. package/dist/esm/test/utils/pathTemplateParser.test.js +27 -0
  220. package/index.ts +280 -0
  221. package/jest.config.js +8 -0
  222. package/package.json +134 -0
  223. package/src/RepositoryWatcher.ts +363 -0
  224. package/src/ai/aiClient.ts +93 -0
  225. package/src/ai/routes.ts +39 -0
  226. package/src/ai/transform.ts +275 -0
  227. package/src/ai/types.ts +45 -0
  228. package/src/api.ts +32 -0
  229. package/src/assetManager.ts +355 -0
  230. package/src/assets/routes.ts +183 -0
  231. package/src/attachments/routes.ts +79 -0
  232. package/src/authManager.ts +67 -0
  233. package/src/cacheManager.ts +59 -0
  234. package/src/clusterService.ts +142 -0
  235. package/src/codeGeneratorManager.ts +109 -0
  236. package/src/config/routes.ts +201 -0
  237. package/src/configManager.ts +180 -0
  238. package/src/containerManager.ts +1178 -0
  239. package/src/definitionsManager.ts +212 -0
  240. package/src/filesystem/routes.ts +123 -0
  241. package/src/filesystemManager.ts +133 -0
  242. package/src/identities/routes.ts +38 -0
  243. package/src/instanceManager.ts +1160 -0
  244. package/src/instances/routes.ts +203 -0
  245. package/src/middleware/cors.ts +14 -0
  246. package/src/middleware/kapeta.ts +41 -0
  247. package/src/middleware/stringBody.ts +21 -0
  248. package/src/networkManager.ts +148 -0
  249. package/src/operatorManager.ts +294 -0
  250. package/src/progressListener.ts +151 -0
  251. package/src/providerManager.ts +97 -0
  252. package/src/providers/routes.ts +51 -0
  253. package/src/proxy/routes.ts +153 -0
  254. package/src/proxy/types/rest.ts +172 -0
  255. package/src/proxy/types/web.ts +70 -0
  256. package/src/repositoryManager.ts +291 -0
  257. package/src/serviceManager.ts +133 -0
  258. package/src/socketManager.ts +138 -0
  259. package/src/storageService.ts +97 -0
  260. package/src/taskManager.ts +247 -0
  261. package/src/tasks/routes.ts +43 -0
  262. package/src/traffic/routes.ts +23 -0
  263. package/src/types.ts +112 -0
  264. package/src/utils/BlockInstanceRunner.ts +577 -0
  265. package/src/utils/DefaultProviderInstaller.ts +150 -0
  266. package/src/utils/InternalConfigProvider.ts +214 -0
  267. package/src/utils/LogData.ts +50 -0
  268. package/src/utils/commandLineUtils.ts +45 -0
  269. package/src/utils/pathTemplateParser.ts +157 -0
  270. package/src/utils/utils.ts +155 -0
  271. package/start.ts +14 -0
  272. package/test/proxy/types/rest.test.ts +54 -0
  273. package/test/utils/pathTemplateParser.test.ts +29 -0
  274. package/tsconfig.json +15 -0
@@ -0,0 +1,332 @@
1
+ "use strict";
2
+ /**
3
+ * Copyright 2023 Kapeta Inc.
4
+ * SPDX-License-Identifier: BUSL-1.1
5
+ */
6
+ var __importDefault = (this && this.__importDefault) || function (mod) {
7
+ return (mod && mod.__esModule) ? mod : { "default": mod };
8
+ };
9
+ Object.defineProperty(exports, "__esModule", { value: true });
10
+ exports.RepositoryWatcher = void 0;
11
+ const chokidar_1 = __importDefault(require("chokidar"));
12
+ const local_cluster_config_1 = __importDefault(require("@kapeta/local-cluster-config"));
13
+ const fs_extra_1 = __importDefault(require("fs-extra"));
14
+ const node_path_1 = __importDefault(require("node:path"));
15
+ const yaml_1 = __importDefault(require("yaml"));
16
+ const nodejs_utils_1 = require("@kapeta/nodejs-utils");
17
+ const lodash_1 = __importDefault(require("lodash"));
18
+ const socketManager_1 = require("./socketManager");
19
+ const cacheManager_1 = require("./cacheManager");
20
+ const node_events_1 = require("node:events");
21
+ const assetManager_1 = require("./assetManager");
22
+ const KAPETA_YML_RX = /^kapeta.ya?ml$/;
23
+ let definitions;
24
+ let definitionTimeout;
25
+ function getDefinitionsDebounced() {
26
+ if (definitionTimeout) {
27
+ clearTimeout(definitionTimeout);
28
+ definitionTimeout = undefined;
29
+ }
30
+ if (!definitions) {
31
+ definitions = local_cluster_config_1.default.getDefinitions();
32
+ }
33
+ else {
34
+ definitionTimeout = setTimeout(() => {
35
+ definitionTimeout = undefined;
36
+ definitions = undefined;
37
+ }, 500);
38
+ }
39
+ return definitions;
40
+ }
41
+ class RepositoryWatcher extends node_events_1.EventEmitter {
42
+ watcher;
43
+ disabled = false;
44
+ baseDir;
45
+ allDefinitions = [];
46
+ symbolicLinks = {};
47
+ sourceOfChange = new Map();
48
+ constructor() {
49
+ super();
50
+ this.baseDir = local_cluster_config_1.default.getRepositoryBasedir();
51
+ }
52
+ setDisabled(disabled) {
53
+ this.disabled = disabled;
54
+ }
55
+ watch() {
56
+ if (!fs_extra_1.default.existsSync(this.baseDir)) {
57
+ fs_extra_1.default.mkdirpSync(this.baseDir);
58
+ }
59
+ this.allDefinitions = local_cluster_config_1.default.getDefinitions();
60
+ try {
61
+ this.watcher = chokidar_1.default.watch(this.baseDir, {
62
+ followSymlinks: false,
63
+ ignorePermissionErrors: true,
64
+ disableGlobbing: true,
65
+ persistent: true,
66
+ depth: 2,
67
+ ignored: (path) => this.ignoreFile(path),
68
+ });
69
+ this.watcher.on('all', this.handleFileChange.bind(this));
70
+ this.watcher.on('error', (error) => {
71
+ console.log('Error watching repository', error);
72
+ });
73
+ this.watcher.on('ready', () => {
74
+ console.log('Watching local repository for provider changes: %s', this.baseDir);
75
+ });
76
+ }
77
+ catch (e) {
78
+ // Fallback to run without watch mode due to potential platform issues.
79
+ // https://nodejs.org/docs/latest/api/fs.html#caveats
80
+ console.log('Unable to watch for changes. Changes to assets will not update automatically.', e);
81
+ return;
82
+ }
83
+ }
84
+ async setSourceOfChangeFor(file, source) {
85
+ this.sourceOfChange.set(file, source);
86
+ try {
87
+ const realPath = await fs_extra_1.default.realpath(file);
88
+ if (realPath !== file) {
89
+ this.sourceOfChange.set(realPath, source);
90
+ }
91
+ }
92
+ catch (e) {
93
+ // Ignore
94
+ }
95
+ }
96
+ async clearSourceOfChangeFor(file) {
97
+ this.sourceOfChange.delete(file);
98
+ try {
99
+ const realPath = await fs_extra_1.default.realpath(file);
100
+ if (realPath !== file) {
101
+ this.sourceOfChange.delete(realPath);
102
+ }
103
+ }
104
+ catch (e) {
105
+ // Ignore
106
+ }
107
+ }
108
+ async unwatch() {
109
+ if (!this.watcher) {
110
+ return;
111
+ }
112
+ this.symbolicLinks = {};
113
+ await this.watcher.close();
114
+ this.watcher = undefined;
115
+ }
116
+ async getAssetIdentity(path) {
117
+ const baseName = node_path_1.default.basename(path);
118
+ let handle, name, version;
119
+ if (path.startsWith(this.baseDir)) {
120
+ const relativePath = node_path_1.default.relative(this.baseDir, path);
121
+ // Inside the repo we can use the path to determine the handle, name and version
122
+ [handle, name, version] = relativePath.split(node_path_1.default.sep);
123
+ if (!handle || !name || !version) {
124
+ // Do nothing with this
125
+ return;
126
+ }
127
+ return {
128
+ handle,
129
+ name,
130
+ version,
131
+ };
132
+ }
133
+ if (!KAPETA_YML_RX.test(baseName)) {
134
+ // Do nothing with this
135
+ return;
136
+ }
137
+ // Outside the repo we need to use the file content to determine the handle, name
138
+ // Version is always 'local'
139
+ version = 'local';
140
+ try {
141
+ const definition = yaml_1.default.parse((await fs_extra_1.default.readFile(path)).toString());
142
+ const uri = (0, nodejs_utils_1.parseKapetaUri)(definition.metadata.name);
143
+ handle = uri.handle;
144
+ name = uri.name;
145
+ return {
146
+ handle,
147
+ name,
148
+ version,
149
+ };
150
+ }
151
+ catch (e) {
152
+ // Ignore issues in the YML file
153
+ return;
154
+ }
155
+ }
156
+ async handleFileChange(eventName, path) {
157
+ if (!path) {
158
+ return;
159
+ }
160
+ if (this.disabled) {
161
+ return;
162
+ }
163
+ const assetIdentity = await this.getAssetIdentity(path);
164
+ if (!assetIdentity) {
165
+ return;
166
+ }
167
+ // If this is false it's because we're watching a symlink target
168
+ const withinRepo = path.startsWith(this.baseDir);
169
+ if (withinRepo && assetIdentity.version === 'local' && path.endsWith(node_path_1.default.sep + 'local')) {
170
+ // This is likely a symlink target
171
+ if (eventName === 'add') {
172
+ //console.log('Checking if we should add symlink target', handle, name, version, path);
173
+ await this.addSymlinkTarget(path);
174
+ }
175
+ if (eventName === 'unlink') {
176
+ await this.removeSymlinkTarget(path);
177
+ }
178
+ if (eventName === 'change') {
179
+ await this.updateSymlinkTarget(path);
180
+ }
181
+ }
182
+ const repoPath = this.getRepositoryPath(assetIdentity);
183
+ if (eventName === 'change' &&
184
+ !withinRepo &&
185
+ assetIdentity.version === 'local' &&
186
+ node_path_1.default.basename(path) === 'kapeta.yml' &&
187
+ (await this.exists(path)) &&
188
+ !(await this.exists(repoPath))) {
189
+ // This happens when a local asset is renamed
190
+ const oldPath = lodash_1.default.findKey(this.symbolicLinks, (link) => link === path);
191
+ if (oldPath) {
192
+ await fs_extra_1.default.unlink(oldPath);
193
+ await assetManager_1.assetManager.importFile(path);
194
+ return;
195
+ }
196
+ }
197
+ const sourceOfChange = this.sourceOfChange.get(path) ?? 'filesystem';
198
+ await this.checkForChange(assetIdentity, sourceOfChange);
199
+ // We consume the sourceOfChange when the file is changed
200
+ this.sourceOfChange.delete(path);
201
+ }
202
+ getRepositoryPath(assetIdentity) {
203
+ return node_path_1.default.join(this.baseDir, assetIdentity.handle, assetIdentity.name, assetIdentity.version);
204
+ }
205
+ async checkForChange(assetIdentity, sourceOfChange) {
206
+ const ymlPath = node_path_1.default.join(this.getRepositoryPath(assetIdentity), 'kapeta.yml');
207
+ const newDefinitions = getDefinitionsDebounced();
208
+ const newDefinition = newDefinitions.find((d) => d.ymlPath === ymlPath);
209
+ let currentDefinition = this.allDefinitions.find((d) => d.ymlPath === ymlPath);
210
+ const ymlExists = await this.exists(ymlPath);
211
+ let type;
212
+ if (ymlExists) {
213
+ if (currentDefinition) {
214
+ if (newDefinition && lodash_1.default.isEqual(currentDefinition, newDefinition)) {
215
+ //Definition was not changed
216
+ return;
217
+ }
218
+ type = 'updated';
219
+ }
220
+ else if (newDefinition) {
221
+ type = 'added';
222
+ currentDefinition = newDefinition;
223
+ }
224
+ else {
225
+ //Other definition was added / updated - ignore
226
+ return;
227
+ }
228
+ }
229
+ else {
230
+ if (currentDefinition) {
231
+ //Something was removed
232
+ type = 'removed';
233
+ }
234
+ else {
235
+ //Other definition was removed - ignore
236
+ return;
237
+ }
238
+ }
239
+ const payload = {
240
+ type,
241
+ definition: newDefinition?.definition ?? currentDefinition?.definition,
242
+ asset: assetIdentity,
243
+ sourceOfChange,
244
+ };
245
+ this.allDefinitions = newDefinitions;
246
+ //console.log('Asset changed', payload);
247
+ socketManager_1.socketManager.emitGlobal('asset-change', payload);
248
+ this.emit('change', payload);
249
+ cacheManager_1.cacheManager.flush();
250
+ }
251
+ async exists(path) {
252
+ try {
253
+ await fs_extra_1.default.access(path);
254
+ return true;
255
+ }
256
+ catch (e) {
257
+ return false;
258
+ }
259
+ }
260
+ async removeSymlinkTarget(path) {
261
+ if (this.symbolicLinks[path]) {
262
+ //console.log('Unwatching symlink target %s => %s', path, this.symbolicLinks[path]);
263
+ this.watcher?.unwatch(this.symbolicLinks[path]);
264
+ delete this.symbolicLinks[path];
265
+ }
266
+ }
267
+ async updateSymlinkTarget(path) {
268
+ if (this.symbolicLinks[path]) {
269
+ //console.log('Updating symlink target %s => %s', path, this.symbolicLinks[path]);
270
+ this.watcher?.unwatch(this.symbolicLinks[path]);
271
+ delete this.symbolicLinks[path];
272
+ await this.addSymlinkTarget(path);
273
+ }
274
+ }
275
+ async addSymlinkTarget(path) {
276
+ try {
277
+ // Make sure we're not watching the symlink target
278
+ await this.removeSymlinkTarget(path);
279
+ let symbolicLink = false;
280
+ try {
281
+ const stat = await fs_extra_1.default.lstat(path);
282
+ symbolicLink = stat.isSymbolicLink();
283
+ }
284
+ catch (e) { }
285
+ if (symbolicLink) {
286
+ try {
287
+ const realPath = node_path_1.default.join(await fs_extra_1.default.realpath(path), 'kapeta.yml');
288
+ if (await this.exists(realPath)) {
289
+ //console.log('Watching symlink target %s => %s', path, realPath);
290
+ this.watcher?.add(realPath);
291
+ this.symbolicLinks[path] = realPath;
292
+ }
293
+ }
294
+ catch (e) {
295
+ // Remove the symlink - it's broken
296
+ await fs_extra_1.default.remove(path);
297
+ }
298
+ }
299
+ }
300
+ catch (e) {
301
+ // Ignore
302
+ console.warn('Failed to check local symlink target', e);
303
+ }
304
+ }
305
+ ignoreFile(path) {
306
+ if (!path.startsWith(this.baseDir)) {
307
+ return false;
308
+ }
309
+ if (path.includes(node_path_1.default.sep + 'node_modules' + node_path_1.default.sep)) {
310
+ return true;
311
+ }
312
+ const filename = node_path_1.default.basename(path);
313
+ if (filename.startsWith('.')) {
314
+ return true;
315
+ }
316
+ const relativePath = node_path_1.default.relative(this.baseDir, path).split(node_path_1.default.sep);
317
+ try {
318
+ if (fs_extra_1.default.statSync(path).isDirectory()) {
319
+ if (relativePath.length > 3) {
320
+ return true;
321
+ }
322
+ return false;
323
+ }
324
+ }
325
+ catch (e) {
326
+ // Didn't exist - dont ignore
327
+ return false;
328
+ }
329
+ return !/^kapeta\.ya?ml$/.test(filename);
330
+ }
331
+ }
332
+ exports.RepositoryWatcher = RepositoryWatcher;
@@ -0,0 +1,20 @@
1
+ import { PlanContext } from './transform';
2
+ export type PromptResult = {
3
+ explanation: string;
4
+ response: string;
5
+ context?: PlanContext;
6
+ };
7
+ export interface AIMessage {
8
+ content: string;
9
+ role: 'user' | 'assistant';
10
+ }
11
+ export interface AIRequest {
12
+ messages: AIMessage[];
13
+ }
14
+ declare class AIClient {
15
+ private readonly _baseUrl;
16
+ constructor();
17
+ sendPrompt(handle: string, body: AIRequest): Promise<PromptResult>;
18
+ }
19
+ export declare const aiClient: AIClient;
20
+ export {};
@@ -0,0 +1,74 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.aiClient = void 0;
7
+ /**
8
+ * Copyright 2023 Kapeta Inc.
9
+ * SPDX-License-Identifier: BUSL-1.1
10
+ */
11
+ const request_1 = __importDefault(require("request"));
12
+ const transform_1 = require("./transform");
13
+ const nodejs_api_client_1 = require("@kapeta/nodejs-api-client");
14
+ const utils_1 = require("../utils/utils");
15
+ class AIClient {
16
+ _baseUrl;
17
+ constructor() {
18
+ this._baseUrl = (0, utils_1.getRemoteUrl)('ai-service', 'https://ai.kapeta.com');
19
+ }
20
+ async sendPrompt(handle, body) {
21
+ const url = `${this._baseUrl}/v1/plan?type=chat`;
22
+ const headers = {};
23
+ const api = new nodejs_api_client_1.KapetaAPI();
24
+ if (api.hasToken()) {
25
+ headers['Authorization'] = `Bearer ${await api.getAccessToken()}`;
26
+ }
27
+ const options = {
28
+ url,
29
+ method: 'POST',
30
+ json: true,
31
+ body,
32
+ headers,
33
+ };
34
+ return new Promise((resolve, reject) => {
35
+ (0, request_1.default)(options, async (error, response, application) => {
36
+ if (error) {
37
+ console.error(error);
38
+ reject(error);
39
+ }
40
+ if (response.statusCode !== 200) {
41
+ console.log('Prompt failed', response.statusCode, response.body);
42
+ reject(new Error(`Invalid response code: ${response.statusCode}`));
43
+ return;
44
+ }
45
+ try {
46
+ if (application?.name) {
47
+ const planContext = await (0, transform_1.transformToPlan)(handle, application);
48
+ resolve({
49
+ explanation: application.explanation,
50
+ response: application.response ?? application.explanation ?? 'Plan was generated',
51
+ context: planContext,
52
+ });
53
+ }
54
+ else {
55
+ resolve({
56
+ explanation: application.explanation,
57
+ response: application.response ??
58
+ application.explanation ??
59
+ 'I did not understand your request. Please rephrase.',
60
+ });
61
+ }
62
+ }
63
+ catch (err) {
64
+ console.error(err);
65
+ resolve({
66
+ explanation: '',
67
+ response: 'I did not understand your request. Please rephrase.',
68
+ });
69
+ }
70
+ });
71
+ });
72
+ }
73
+ }
74
+ exports.aiClient = new AIClient();
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Copyright 2023 Kapeta Inc.
3
+ * SPDX-License-Identifier: BUSL-1.1
4
+ */
5
+ /// <reference types="express" />
6
+ declare const router: import("express").Router;
7
+ export default router;
@@ -0,0 +1,37 @@
1
+ "use strict";
2
+ /**
3
+ * Copyright 2023 Kapeta Inc.
4
+ * SPDX-License-Identifier: BUSL-1.1
5
+ */
6
+ var __importDefault = (this && this.__importDefault) || function (mod) {
7
+ return (mod && mod.__esModule) ? mod : { "default": mod };
8
+ };
9
+ Object.defineProperty(exports, "__esModule", { value: true });
10
+ const express_promise_router_1 = __importDefault(require("express-promise-router"));
11
+ const cors_1 = require("../middleware/cors");
12
+ const stringBody_1 = require("../middleware/stringBody");
13
+ const aiClient_1 = require("./aiClient");
14
+ const yaml_1 = __importDefault(require("yaml"));
15
+ const router = (0, express_promise_router_1.default)();
16
+ router.use('/', cors_1.corsHandler);
17
+ router.use('/', stringBody_1.stringBody);
18
+ router.post('/prompt/:handle', async (req, res) => {
19
+ const handle = req.params.handle;
20
+ try {
21
+ const aiRequest = JSON.parse(req.stringBody ?? '{}');
22
+ const result = await aiClient_1.aiClient.sendPrompt(handle, aiRequest);
23
+ if (req.accepts('application/yaml')) {
24
+ res.set('Content-Type', 'application/yaml');
25
+ res.send(yaml_1.default.stringify(result));
26
+ }
27
+ else {
28
+ res.json(result);
29
+ }
30
+ }
31
+ catch (err) {
32
+ console.error('Failed to send prompt', err);
33
+ res.status(400).send({ error: err.message });
34
+ return;
35
+ }
36
+ });
37
+ exports.default = router;
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Copyright 2023 Kapeta Inc.
3
+ * SPDX-License-Identifier: BUSL-1.1
4
+ */
5
+ import { BlockDefinition, Plan } from '@kapeta/schemas';
6
+ import { Application } from './types';
7
+ export type PlanContext = {
8
+ plan: Plan;
9
+ blocks: BlockDefinition[];
10
+ };
11
+ export declare const transformToPlan: (handle: string, application: Application) => Promise<PlanContext>;