@alwaysai/device-agent 0.0.3 → 0.0.4-1

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 (189) hide show
  1. package/lib/application-control/backup.d.ts +8 -0
  2. package/lib/application-control/backup.d.ts.map +1 -0
  3. package/lib/application-control/backup.js +34 -0
  4. package/lib/application-control/backup.js.map +1 -0
  5. package/lib/application-control/environment-variables.d.ts +9 -0
  6. package/lib/application-control/environment-variables.d.ts.map +1 -0
  7. package/lib/application-control/environment-variables.js +82 -0
  8. package/lib/application-control/environment-variables.js.map +1 -0
  9. package/lib/application-control/index.d.ts +9 -0
  10. package/lib/application-control/index.d.ts.map +1 -0
  11. package/lib/application-control/index.js +27 -0
  12. package/lib/application-control/index.js.map +1 -0
  13. package/lib/application-control/install.d.ts +16 -0
  14. package/lib/application-control/install.d.ts.map +1 -0
  15. package/lib/application-control/install.js +117 -0
  16. package/lib/application-control/install.js.map +1 -0
  17. package/lib/application-control/models.d.ts +8 -0
  18. package/lib/application-control/models.d.ts.map +1 -1
  19. package/lib/application-control/models.js +44 -11
  20. package/lib/application-control/models.js.map +1 -1
  21. package/lib/application-control/status.d.ts +26 -0
  22. package/lib/application-control/status.d.ts.map +1 -0
  23. package/lib/application-control/status.js +138 -0
  24. package/lib/application-control/status.js.map +1 -0
  25. package/lib/application-control/types.d.ts +5 -0
  26. package/lib/application-control/types.d.ts.map +1 -0
  27. package/lib/{util/spawner → application-control}/types.js +0 -0
  28. package/lib/{util/spawner → application-control}/types.js.map +1 -1
  29. package/lib/application-control/utils.d.ts +2 -9
  30. package/lib/application-control/utils.d.ts.map +1 -1
  31. package/lib/application-control/utils.js +14 -29
  32. package/lib/application-control/utils.js.map +1 -1
  33. package/lib/cloud-connection/device-agent-cloud-connection.d.ts +15 -1
  34. package/lib/cloud-connection/device-agent-cloud-connection.d.ts.map +1 -1
  35. package/lib/cloud-connection/device-agent-cloud-connection.js +227 -9
  36. package/lib/cloud-connection/device-agent-cloud-connection.js.map +1 -1
  37. package/lib/docker/docker-cmd.js +2 -2
  38. package/lib/docker/docker-cmd.js.map +1 -1
  39. package/lib/docker/docker-compose-cmd.js +2 -2
  40. package/lib/docker/docker-compose-cmd.js.map +1 -1
  41. package/lib/environment.d.ts +2 -0
  42. package/lib/environment.d.ts.map +1 -1
  43. package/lib/environment.js +3 -1
  44. package/lib/environment.js.map +1 -1
  45. package/lib/index.js +10 -8
  46. package/lib/index.js.map +1 -1
  47. package/lib/infrastructure/agent-config.d.ts +73 -0
  48. package/lib/infrastructure/agent-config.d.ts.map +1 -0
  49. package/lib/infrastructure/agent-config.js +186 -0
  50. package/lib/infrastructure/agent-config.js.map +1 -0
  51. package/lib/infrastructure/agent-config.test.d.ts +2 -0
  52. package/lib/infrastructure/agent-config.test.d.ts.map +1 -0
  53. package/lib/infrastructure/agent-config.test.js +135 -0
  54. package/lib/infrastructure/agent-config.test.js.map +1 -0
  55. package/lib/infrastructure/certificates-and-tokens.d.ts +4 -0
  56. package/lib/infrastructure/certificates-and-tokens.d.ts.map +1 -0
  57. package/lib/infrastructure/certificates-and-tokens.js +58 -0
  58. package/lib/infrastructure/certificates-and-tokens.js.map +1 -0
  59. package/lib/{util → infrastructure}/urls.d.ts +0 -0
  60. package/lib/infrastructure/urls.d.ts.map +1 -0
  61. package/lib/{util → infrastructure}/urls.js +3 -3
  62. package/lib/infrastructure/urls.js.map +1 -0
  63. package/lib/root.js +3 -3
  64. package/lib/root.js.map +1 -1
  65. package/lib/subcommands/app/app.d.ts +31 -14
  66. package/lib/subcommands/app/app.d.ts.map +1 -1
  67. package/lib/subcommands/app/app.js +117 -62
  68. package/lib/subcommands/app/app.js.map +1 -1
  69. package/lib/subcommands/app/index.d.ts.map +1 -1
  70. package/lib/subcommands/app/index.js +6 -1
  71. package/lib/subcommands/app/index.js.map +1 -1
  72. package/lib/subcommands/index.d.ts.map +1 -1
  73. package/lib/subcommands/index.js +1 -7
  74. package/lib/subcommands/index.js.map +1 -1
  75. package/lib/subcommands/login.d.ts +3 -2
  76. package/lib/subcommands/login.d.ts.map +1 -1
  77. package/lib/subcommands/login.js +11 -4
  78. package/lib/subcommands/login.js.map +1 -1
  79. package/lib/util/copy-dir.js +3 -3
  80. package/lib/util/copy-dir.js.map +1 -1
  81. package/lib/util/directories.d.ts +1 -1
  82. package/lib/util/directories.d.ts.map +1 -1
  83. package/lib/util/directories.js +9 -14
  84. package/lib/util/directories.js.map +1 -1
  85. package/lib/util/get-device-id.d.ts +2 -0
  86. package/lib/util/get-device-id.d.ts.map +1 -0
  87. package/lib/util/get-device-id.js +24 -0
  88. package/lib/util/get-device-id.js.map +1 -0
  89. package/package.json +19 -14
  90. package/readme.md +149 -72
  91. package/src/application-control/backup.ts +32 -0
  92. package/src/application-control/environment-variables.ts +81 -0
  93. package/src/application-control/index.ts +40 -0
  94. package/src/application-control/install.ts +126 -0
  95. package/src/application-control/models.ts +51 -11
  96. package/src/application-control/status.ts +156 -0
  97. package/src/application-control/types.ts +1 -0
  98. package/src/application-control/utils.ts +12 -27
  99. package/src/cloud-connection/device-agent-cloud-connection.ts +265 -12
  100. package/src/docker/docker-cmd.ts +1 -1
  101. package/src/docker/docker-compose-cmd.ts +1 -1
  102. package/src/environment.ts +2 -0
  103. package/src/index.ts +10 -7
  104. package/src/infrastructure/agent-config.test.ts +143 -0
  105. package/src/infrastructure/agent-config.ts +217 -0
  106. package/src/infrastructure/certificates-and-tokens.ts +60 -0
  107. package/src/{util → infrastructure}/urls.ts +1 -1
  108. package/src/root.ts +3 -3
  109. package/src/subcommands/app/app.ts +135 -62
  110. package/src/subcommands/app/index.ts +11 -1
  111. package/src/subcommands/index.ts +1 -7
  112. package/src/subcommands/login.ts +11 -4
  113. package/src/util/copy-dir.ts +1 -1
  114. package/src/util/directories.ts +12 -17
  115. package/src/util/get-device-id.ts +22 -0
  116. package/lib/application-control/application-control.d.ts +0 -46
  117. package/lib/application-control/application-control.d.ts.map +0 -1
  118. package/lib/application-control/application-control.js +0 -234
  119. package/lib/application-control/application-control.js.map +0 -1
  120. package/lib/constants.d.ts +0 -17
  121. package/lib/constants.d.ts.map +0 -1
  122. package/lib/constants.js +0 -24
  123. package/lib/constants.js.map +0 -1
  124. package/lib/subcommands/test-app.d.ts +0 -2
  125. package/lib/subcommands/test-app.d.ts.map +0 -1
  126. package/lib/subcommands/test-app.js +0 -29
  127. package/lib/subcommands/test-app.js.map +0 -1
  128. package/lib/util/spawner/gnu-spawner.d.ts +0 -9
  129. package/lib/util/spawner/gnu-spawner.d.ts.map +0 -1
  130. package/lib/util/spawner/gnu-spawner.js +0 -102
  131. package/lib/util/spawner/gnu-spawner.js.map +0 -1
  132. package/lib/util/spawner/js-spawner.d.ts +0 -5
  133. package/lib/util/spawner/js-spawner.d.ts.map +0 -1
  134. package/lib/util/spawner/js-spawner.js +0 -89
  135. package/lib/util/spawner/js-spawner.js.map +0 -1
  136. package/lib/util/spawner/types.d.ts +0 -28
  137. package/lib/util/spawner/types.d.ts.map +0 -1
  138. package/lib/util/spawner-base/index.d.ts +0 -17
  139. package/lib/util/spawner-base/index.d.ts.map +0 -1
  140. package/lib/util/spawner-base/index.js +0 -30
  141. package/lib/util/spawner-base/index.js.map +0 -1
  142. package/lib/util/spawner-base/run-foreground-sync.d.ts +0 -3
  143. package/lib/util/spawner-base/run-foreground-sync.d.ts.map +0 -1
  144. package/lib/util/spawner-base/run-foreground-sync.js +0 -18
  145. package/lib/util/spawner-base/run-foreground-sync.js.map +0 -1
  146. package/lib/util/spawner-base/run-foreground.d.ts +0 -3
  147. package/lib/util/spawner-base/run-foreground.d.ts.map +0 -1
  148. package/lib/util/spawner-base/run-foreground.js +0 -49
  149. package/lib/util/spawner-base/run-foreground.js.map +0 -1
  150. package/lib/util/spawner-base/run-streaming.d.ts +0 -4
  151. package/lib/util/spawner-base/run-streaming.d.ts.map +0 -1
  152. package/lib/util/spawner-base/run-streaming.js +0 -35
  153. package/lib/util/spawner-base/run-streaming.js.map +0 -1
  154. package/lib/util/spawner-base/run.d.ts +0 -4
  155. package/lib/util/spawner-base/run.d.ts.map +0 -1
  156. package/lib/util/spawner-base/run.js +0 -56
  157. package/lib/util/spawner-base/run.js.map +0 -1
  158. package/lib/util/urls.d.ts.map +0 -1
  159. package/lib/util/urls.js.map +0 -1
  160. package/lib/web/index.html +0 -229
  161. package/lib/web/static/Karla.css +0 -18
  162. package/lib/web/static/bootstrap-4.3.1.min.css +0 -7
  163. package/lib/web/static/bootstrap-4.3.1.min.js +0 -7
  164. package/lib/web/static/favicon.ico +0 -0
  165. package/lib/web/static/jquery-3.3.1.slim.min.js +0 -2
  166. package/lib/web/static/popper-1.14.7.min.js +0 -5
  167. package/lib/web/web-interface.d.ts +0 -2
  168. package/lib/web/web-interface.d.ts.map +0 -1
  169. package/lib/web/web-interface.js +0 -74
  170. package/lib/web/web-interface.js.map +0 -1
  171. package/src/application-control/application-control.ts +0 -273
  172. package/src/constants.ts +0 -32
  173. package/src/subcommands/test-app.ts +0 -30
  174. package/src/util/spawner/gnu-spawner.ts +0 -114
  175. package/src/util/spawner/js-spawner.ts +0 -110
  176. package/src/util/spawner/types.ts +0 -28
  177. package/src/util/spawner-base/index.ts +0 -28
  178. package/src/util/spawner-base/run-foreground-sync.ts +0 -16
  179. package/src/util/spawner-base/run-foreground.ts +0 -49
  180. package/src/util/spawner-base/run-streaming.ts +0 -40
  181. package/src/util/spawner-base/run.ts +0 -60
  182. package/src/web/index.html +0 -229
  183. package/src/web/static/Karla.css +0 -18
  184. package/src/web/static/bootstrap-4.3.1.min.css +0 -7
  185. package/src/web/static/bootstrap-4.3.1.min.js +0 -7
  186. package/src/web/static/favicon.ico +0 -0
  187. package/src/web/static/jquery-3.3.1.slim.min.js +0 -2
  188. package/src/web/static/popper-1.14.7.min.js +0 -5
  189. package/src/web/web-interface.ts +0 -89
@@ -0,0 +1,8 @@
1
+ export declare const BACKUP_EXT = ".bak";
2
+ export declare function createAppBackup(props: {
3
+ projectId: string;
4
+ }): Promise<void>;
5
+ export declare function rollbackApp(props: {
6
+ projectId: string;
7
+ }): Promise<void>;
8
+ //# sourceMappingURL=backup.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"backup.d.ts","sourceRoot":"","sources":["../../src/application-control/backup.ts"],"names":[],"mappings":"AAMA,eAAO,MAAM,UAAU,SAAS,CAAC;AAEjC,wBAAsB,eAAe,CAAC,KAAK,EAAE;IAAE,SAAS,EAAE,MAAM,CAAA;CAAE,iBAQjE;AAED,wBAAsB,WAAW,CAAC,KAAK,EAAE;IAAE,SAAS,EAAE,MAAM,CAAA;CAAE,iBAa7D"}
@@ -0,0 +1,34 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.rollbackApp = exports.createAppBackup = exports.BACKUP_EXT = void 0;
4
+ const rimraf = require("rimraf");
5
+ const copy_dir_1 = require("../util/copy-dir");
6
+ const utils_1 = require("./utils");
7
+ const agent_config_1 = require("../infrastructure/agent-config");
8
+ exports.BACKUP_EXT = '.bak';
9
+ async function createAppBackup(props) {
10
+ const { projectId } = props;
11
+ const appDir = (0, utils_1.getAppDir)(projectId);
12
+ const backupAppDir = `${appDir}${exports.BACKUP_EXT}`;
13
+ rimraf.sync(backupAppDir);
14
+ await (0, copy_dir_1.copyDir)({ srcPath: appDir, destPath: backupAppDir });
15
+ await (0, agent_config_1.AgentConfigFile)().setAppBackup({ projectId });
16
+ console.log(`Backed up app ${projectId} to ${backupAppDir}`);
17
+ }
18
+ exports.createAppBackup = createAppBackup;
19
+ async function rollbackApp(props) {
20
+ const { projectId } = props;
21
+ const config = await (0, agent_config_1.AgentConfigFile)().getAppBackup({ projectId });
22
+ if (!config) {
23
+ throw new Error(`Backup doesn't exist for ${projectId}`);
24
+ }
25
+ const appDir = (0, utils_1.getAppDir)(projectId);
26
+ const backupAppDir = `${appDir}${exports.BACKUP_EXT}`;
27
+ rimraf.sync(appDir);
28
+ await (0, copy_dir_1.copyDir)({ srcPath: backupAppDir, destPath: appDir });
29
+ await (0, utils_1.buildApp)({ appDir });
30
+ await (0, agent_config_1.AgentConfigFile)().setAppInstalled({ projectId, version: config.version });
31
+ console.log(`Rolled back app ${projectId} to ${config.version}`);
32
+ }
33
+ exports.rollbackApp = rollbackApp;
34
+ //# sourceMappingURL=backup.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"backup.js","sourceRoot":"","sources":["../../src/application-control/backup.ts"],"names":[],"mappings":";;;AAAA,iCAAiC;AAEjC,+CAA2C;AAC3C,mCAA8C;AAC9C,iEAAiE;AAEpD,QAAA,UAAU,GAAG,MAAM,CAAC;AAE1B,KAAK,UAAU,eAAe,CAAC,KAA4B;IAChE,MAAM,EAAE,SAAS,EAAE,GAAG,KAAK,CAAC;IAC5B,MAAM,MAAM,GAAG,IAAA,iBAAS,EAAC,SAAS,CAAC,CAAC;IACpC,MAAM,YAAY,GAAG,GAAG,MAAM,GAAG,kBAAU,EAAE,CAAC;IAC9C,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;IAC1B,MAAM,IAAA,kBAAO,EAAC,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,YAAY,EAAE,CAAC,CAAC;IAC3D,MAAM,IAAA,8BAAe,GAAE,CAAC,YAAY,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC;IACpD,OAAO,CAAC,GAAG,CAAC,iBAAiB,SAAS,OAAO,YAAY,EAAE,CAAC,CAAC;AAC/D,CAAC;AARD,0CAQC;AAEM,KAAK,UAAU,WAAW,CAAC,KAA4B;IAC5D,MAAM,EAAE,SAAS,EAAE,GAAG,KAAK,CAAC;IAC5B,MAAM,MAAM,GAAG,MAAM,IAAA,8BAAe,GAAE,CAAC,YAAY,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC;IACnE,IAAI,CAAC,MAAM,EAAE;QACX,MAAM,IAAI,KAAK,CAAC,4BAA4B,SAAS,EAAE,CAAC,CAAC;KAC1D;IACD,MAAM,MAAM,GAAG,IAAA,iBAAS,EAAC,SAAS,CAAC,CAAC;IACpC,MAAM,YAAY,GAAG,GAAG,MAAM,GAAG,kBAAU,EAAE,CAAC;IAC9C,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACpB,MAAM,IAAA,kBAAO,EAAC,EAAE,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC,CAAC;IAC3D,MAAM,IAAA,gBAAQ,EAAC,EAAE,MAAM,EAAE,CAAC,CAAC;IAC3B,MAAM,IAAA,8BAAe,GAAE,CAAC,eAAe,CAAC,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC;IAChF,OAAO,CAAC,GAAG,CAAC,mBAAmB,SAAS,OAAO,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC;AACnE,CAAC;AAbD,kCAaC"}
@@ -0,0 +1,9 @@
1
+ export declare function setEnv(props: {
2
+ projectId: string;
3
+ vars: string[];
4
+ service?: string;
5
+ }): Promise<void>;
6
+ export declare function getAllEnvs(props: {
7
+ projectId: string;
8
+ }): Promise<{}>;
9
+ //# sourceMappingURL=environment-variables.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"environment-variables.d.ts","sourceRoot":"","sources":["../../src/application-control/environment-variables.ts"],"names":[],"mappings":"AAMA,wBAAsB,MAAM,CAAC,KAAK,EAAE;IAClC,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,iBAmCA;AAED,wBAAsB,UAAU,CAAC,KAAK,EAAE;IAAE,SAAS,EAAE,MAAM,CAAA;CAAE,eAiC5D"}
@@ -0,0 +1,82 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getAllEnvs = exports.setEnv = void 0;
4
+ const util_1 = require("alwaysai/lib/util");
5
+ const docker_compose_1 = require("docker-compose");
6
+ const yaml_1 = require("yaml");
7
+ const agent_config_1 = require("../infrastructure/agent-config");
8
+ const utils_1 = require("./utils");
9
+ async function setEnv(props) {
10
+ const { projectId, vars } = props;
11
+ if (!(0, agent_config_1.AgentConfigFile)().isAppReady({ projectId })) {
12
+ throw new Error(`App ${projectId} is not ready!`);
13
+ }
14
+ const appDir = (0, utils_1.getAppDir)(projectId);
15
+ const spawner = (0, util_1.JsSpawner)({ path: appDir });
16
+ const composeContents = await spawner.readFile('docker-compose.yaml');
17
+ const composeParsed = (0, yaml_1.parse)(composeContents);
18
+ if ('services' in composeParsed) {
19
+ let services = Object.keys(composeParsed['services']);
20
+ if (props.service) {
21
+ console.log(services);
22
+ if (services.includes(props.service)) {
23
+ services = [props.service];
24
+ }
25
+ else {
26
+ throw new Error(`Service ${props.service} not found in ${services}`);
27
+ }
28
+ }
29
+ for (const s of services) {
30
+ const service = composeParsed['services'][s];
31
+ // The environment field overrides the env files, so by appending to
32
+ // the environment list we can assure the value will be used
33
+ if ('environment' in service) {
34
+ const environment = service['environment'];
35
+ composeParsed['services'][s]['environment'] = environment.concat(vars);
36
+ }
37
+ else {
38
+ composeParsed['services'][s]['environment'] = vars;
39
+ }
40
+ }
41
+ }
42
+ const composeOutput = (0, yaml_1.stringify)(composeParsed);
43
+ // Validate new contents
44
+ await docker_compose_1.default.config({ cwd: appDir, configAsString: composeOutput });
45
+ await spawner.writeFile('docker-compose.yaml', composeOutput);
46
+ }
47
+ exports.setEnv = setEnv;
48
+ async function getAllEnvs(props) {
49
+ const { projectId } = props;
50
+ if (!(0, agent_config_1.AgentConfigFile)().isAppReady({ projectId })) {
51
+ throw new Error(`App ${projectId} is not ready!`);
52
+ }
53
+ const appDir = (0, utils_1.getAppDir)(projectId);
54
+ const spawner = (0, util_1.JsSpawner)({ path: appDir });
55
+ const envVars = {};
56
+ const composeContents = await spawner.readFile('docker-compose.yaml');
57
+ const composeParsed = (0, yaml_1.parse)(composeContents);
58
+ if ('services' in composeParsed) {
59
+ const services = Object.keys(composeParsed['services']);
60
+ for (const s of services) {
61
+ envVars[s] = [];
62
+ const service = composeParsed['services'][s];
63
+ if ('env_file' in service) {
64
+ const envFiles = service['env_file'];
65
+ for (const ef of envFiles) {
66
+ envVars[s] = envVars[s].concat((await spawner.readFile(ef)).split('\n'));
67
+ }
68
+ }
69
+ if ('environment' in service) {
70
+ const environment = service['environment'];
71
+ envVars[s] = envVars[s].concat(environment);
72
+ }
73
+ // Filter out empty lines and comment lines
74
+ envVars[s] = envVars[s].filter((v) => {
75
+ return v !== '' && !v.includes('#');
76
+ });
77
+ }
78
+ }
79
+ return envVars;
80
+ }
81
+ exports.getAllEnvs = getAllEnvs;
82
+ //# sourceMappingURL=environment-variables.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"environment-variables.js","sourceRoot":"","sources":["../../src/application-control/environment-variables.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import { installApp, uninstallApp } from './install';
2
+ import { rollbackApp } from './backup';
3
+ import { listAppReleases, listAppLatestRelease, getAppStatus, startApp, getAppLogs, stopApp, restartApp } from './status';
4
+ import { ModelDetails } from './types';
5
+ import { getAllEnvs, setEnv } from './environment-variables';
6
+ export { installApp, uninstallApp, rollbackApp, listAppReleases, listAppLatestRelease, getAppStatus, startApp, getAppLogs, stopApp, restartApp, ModelDetails, getAllEnvs, setEnv, };
7
+ import { addModel, getAppModels, removeModel, replaceModels, updateModels } from './models';
8
+ export { addModel, getAppModels, removeModel, replaceModels, updateModels };
9
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/application-control/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AACrD,OAAO,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AACvC,OAAO,EACL,eAAe,EACf,oBAAoB,EACpB,YAAY,EACZ,QAAQ,EACR,UAAU,EACV,OAAO,EACP,UAAU,EACX,MAAM,UAAU,CAAC;AAClB,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,yBAAyB,CAAC;AAE7D,OAAO,EACL,UAAU,EACV,YAAY,EACZ,WAAW,EACX,eAAe,EACf,oBAAoB,EACpB,YAAY,EACZ,QAAQ,EACR,UAAU,EACV,OAAO,EACP,UAAU,EACV,YAAY,EACZ,UAAU,EACV,MAAM,GACP,CAAC;AAGF,OAAO,EACL,QAAQ,EACR,YAAY,EACZ,WAAW,EACX,aAAa,EACb,YAAY,EACb,MAAM,UAAU,CAAC;AAElB,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,WAAW,EAAE,aAAa,EAAE,YAAY,EAAE,CAAC"}
@@ -0,0 +1,27 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.updateModels = exports.replaceModels = exports.removeModel = exports.getAppModels = exports.addModel = exports.setEnv = exports.getAllEnvs = exports.restartApp = exports.stopApp = exports.getAppLogs = exports.startApp = exports.getAppStatus = exports.listAppLatestRelease = exports.listAppReleases = exports.rollbackApp = exports.uninstallApp = exports.installApp = void 0;
4
+ const install_1 = require("./install");
5
+ Object.defineProperty(exports, "installApp", { enumerable: true, get: function () { return install_1.installApp; } });
6
+ Object.defineProperty(exports, "uninstallApp", { enumerable: true, get: function () { return install_1.uninstallApp; } });
7
+ const backup_1 = require("./backup");
8
+ Object.defineProperty(exports, "rollbackApp", { enumerable: true, get: function () { return backup_1.rollbackApp; } });
9
+ const status_1 = require("./status");
10
+ Object.defineProperty(exports, "listAppReleases", { enumerable: true, get: function () { return status_1.listAppReleases; } });
11
+ Object.defineProperty(exports, "listAppLatestRelease", { enumerable: true, get: function () { return status_1.listAppLatestRelease; } });
12
+ Object.defineProperty(exports, "getAppStatus", { enumerable: true, get: function () { return status_1.getAppStatus; } });
13
+ Object.defineProperty(exports, "startApp", { enumerable: true, get: function () { return status_1.startApp; } });
14
+ Object.defineProperty(exports, "getAppLogs", { enumerable: true, get: function () { return status_1.getAppLogs; } });
15
+ Object.defineProperty(exports, "stopApp", { enumerable: true, get: function () { return status_1.stopApp; } });
16
+ Object.defineProperty(exports, "restartApp", { enumerable: true, get: function () { return status_1.restartApp; } });
17
+ const environment_variables_1 = require("./environment-variables");
18
+ Object.defineProperty(exports, "getAllEnvs", { enumerable: true, get: function () { return environment_variables_1.getAllEnvs; } });
19
+ Object.defineProperty(exports, "setEnv", { enumerable: true, get: function () { return environment_variables_1.setEnv; } });
20
+ // CLI-mode only
21
+ const models_1 = require("./models");
22
+ Object.defineProperty(exports, "addModel", { enumerable: true, get: function () { return models_1.addModel; } });
23
+ Object.defineProperty(exports, "getAppModels", { enumerable: true, get: function () { return models_1.getAppModels; } });
24
+ Object.defineProperty(exports, "removeModel", { enumerable: true, get: function () { return models_1.removeModel; } });
25
+ Object.defineProperty(exports, "replaceModels", { enumerable: true, get: function () { return models_1.replaceModels; } });
26
+ Object.defineProperty(exports, "updateModels", { enumerable: true, get: function () { return models_1.updateModels; } });
27
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/application-control/index.ts"],"names":[],"mappings":";;;AAAA,uCAAqD;AAenD,2FAfO,oBAAU,OAeP;AACV,6FAhBmB,sBAAY,OAgBnB;AAfd,qCAAuC;AAgBrC,4FAhBO,oBAAW,OAgBP;AAfb,qCAQkB;AAQhB,gGAfA,wBAAe,OAeA;AACf,qGAfA,6BAAoB,OAeA;AACpB,6FAfA,qBAAY,OAeA;AACZ,yFAfA,iBAAQ,OAeA;AACR,2FAfA,mBAAU,OAeA;AACV,wFAfA,gBAAO,OAeA;AACP,2FAfA,mBAAU,OAeA;AAZZ,mEAA6D;AAc3D,2FAdO,kCAAU,OAcP;AACV,uFAfmB,8BAAM,OAenB;AAGR,gBAAgB;AAChB,qCAMkB;AAET,yFAPP,iBAAQ,OAOO;AAAE,6FANjB,qBAAY,OAMiB;AAAE,4FAL/B,oBAAW,OAK+B;AAAE,8FAJ5C,sBAAa,OAI4C;AAAE,6FAH3D,qBAAY,OAG2D"}
@@ -0,0 +1,16 @@
1
+ import { AppDetails } from '@alwaysai/device-agent-schemas';
2
+ export declare function getInstalledApps(): Promise<AppDetails[]>;
3
+ export declare type InstallAppProps = {
4
+ projectId: string;
5
+ releaseHash: string;
6
+ presignedAppUrl?: string;
7
+ };
8
+ export declare function installAppPackage({ localDest, presignedUrl }: {
9
+ localDest: any;
10
+ presignedUrl: any;
11
+ }): Promise<void>;
12
+ export declare function installApp(props: InstallAppProps): Promise<void>;
13
+ export declare function uninstallApp(props: {
14
+ projectId: string;
15
+ }): Promise<void>;
16
+ //# sourceMappingURL=install.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"install.d.ts","sourceRoot":"","sources":["../../src/application-control/install.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,UAAU,EAAE,MAAM,gCAAgC,CAAC;AAK5D,wBAAsB,gBAAgB,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC,CAQ9D;AAED,oBAAY,eAAe,GAAG;IAC5B,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B,CAAC;AAEF,wBAAsB,iBAAiB,CAAC,EAAE,SAAS,EAAE,YAAY,EAAE;;;CAAA,GAAG,OAAO,CAAC,IAAI,CAAC,CAiBlF;AAED,wBAAsB,UAAU,CAAC,KAAK,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CA0DtE;AAED,wBAAsB,YAAY,CAAC,KAAK,EAAE;IAAE,SAAS,EAAE,MAAM,CAAA;CAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAiB9E"}
@@ -0,0 +1,117 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.uninstallApp = exports.installApp = exports.installAppPackage = exports.getInstalledApps = void 0;
4
+ const rimraf = require("rimraf");
5
+ const fs = require("fs");
6
+ const path = require("path");
7
+ const node_fetch_1 = require("node-fetch");
8
+ const util_1 = require("alwaysai/lib/util");
9
+ const run_cli_cmd_1 = require("../util/run-cli-cmd");
10
+ const utils_1 = require("./utils");
11
+ const backup_1 = require("./backup");
12
+ const status_1 = require("./status");
13
+ const agent_config_1 = require("../infrastructure/agent-config");
14
+ async function getInstalledApps() {
15
+ const apps = await (0, agent_config_1.AgentConfigFile)().getApps();
16
+ const appDetails = [];
17
+ for (const app of apps) {
18
+ const { projectId, version } = app;
19
+ appDetails.push({ projectId, version });
20
+ }
21
+ return appDetails;
22
+ }
23
+ exports.getInstalledApps = getInstalledApps;
24
+ async function installAppPackage({ localDest, presignedUrl }) {
25
+ const response = await (0, node_fetch_1.default)(presignedUrl);
26
+ if (response.status !== 200) {
27
+ // If the URL is invalid; I think we shouldn't get here with the new changes
28
+ throw new Error(`Status Code: ${response.status}, ${response.statusText}. Response: ${response.body}`);
29
+ }
30
+ /**
31
+ * Write the app package to the hash directory
32
+ */
33
+ const stream = response.body.pipe(fs.createWriteStream(localDest));
34
+ await new Promise((resolve, reject) => {
35
+ stream.on('finish', resolve);
36
+ stream.on('error', reject);
37
+ });
38
+ }
39
+ exports.installAppPackage = installAppPackage;
40
+ async function installApp(props) {
41
+ const { projectId, releaseHash, presignedAppUrl } = props;
42
+ const appDir = (0, utils_1.getAppDir)(projectId);
43
+ const spawner = (0, util_1.JsSpawner)();
44
+ if (await (0, agent_config_1.AgentConfigFile)().isAppPresent({ projectId })) {
45
+ if (!(await (0, agent_config_1.AgentConfigFile)().isAppReady({ projectId }))) {
46
+ throw new Error('Application already has installation in progress!');
47
+ }
48
+ await (0, agent_config_1.AgentConfigFile)().setAppInstalling({ projectId, version: releaseHash });
49
+ console.log('Application is already installed, updating');
50
+ await (0, backup_1.createAppBackup)({ projectId });
51
+ await spawner.rimraf(appDir);
52
+ }
53
+ else {
54
+ await (0, agent_config_1.AgentConfigFile)().setAppInstalling({ projectId, version: releaseHash });
55
+ }
56
+ /**
57
+ * Prep directory and fetch the app package
58
+ */
59
+ await spawner.mkdirp(appDir);
60
+ const localDest = path.join(appDir, `${path.basename(releaseHash)}.tgz`);
61
+ if (!presignedAppUrl) {
62
+ // Download the application using the CLI
63
+ await (0, run_cli_cmd_1.runCliCmd)({
64
+ cmd: [
65
+ 'release',
66
+ 'pull',
67
+ '--yes',
68
+ '--project',
69
+ projectId,
70
+ '--releaseHash',
71
+ releaseHash,
72
+ ],
73
+ cwd: appDir,
74
+ });
75
+ }
76
+ else {
77
+ await installAppPackage({ localDest, presignedUrl: presignedAppUrl });
78
+ }
79
+ /**
80
+ * Unpack app package
81
+ */
82
+ await spawner.untar(fs.createReadStream(localDest), appDir);
83
+ console.log(`Unpacked application to ${appDir}`);
84
+ /**
85
+ * Build app
86
+ * ToDo: migrate the model pull to use MQTT workflow
87
+ */
88
+ await (0, utils_1.buildApp)({ appDir });
89
+ /**
90
+ * Remove tar file
91
+ */
92
+ await spawner.rimraf(localDest);
93
+ await (0, agent_config_1.AgentConfigFile)().setAppInstalled({ projectId, version: releaseHash });
94
+ console.log(`Installed ${projectId} to ${appDir}`);
95
+ }
96
+ exports.installApp = installApp;
97
+ async function uninstallApp(props) {
98
+ const { projectId } = props;
99
+ if (!(await (0, agent_config_1.AgentConfigFile)().isAppPresent({ projectId }))) {
100
+ console.log(`Application ${projectId} not installed`);
101
+ return;
102
+ }
103
+ try {
104
+ await (0, status_1.stopApp)({ projectId });
105
+ }
106
+ catch (_a) {
107
+ console.log('Failed to stop app, may be left running...');
108
+ }
109
+ await (0, agent_config_1.AgentConfigFile)().setAppUninstalled({ projectId });
110
+ // Delete application directory and backup
111
+ const appDir = (0, utils_1.getAppDir)(projectId);
112
+ rimraf.sync(appDir);
113
+ rimraf.sync(`${appDir}${backup_1.BACKUP_EXT}`);
114
+ console.log('Uninstalled', projectId);
115
+ }
116
+ exports.uninstallApp = uninstallApp;
117
+ //# sourceMappingURL=install.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"install.js","sourceRoot":"","sources":["../../src/application-control/install.ts"],"names":[],"mappings":"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"}
@@ -1,3 +1,7 @@
1
+ import { ModelDetails } from './types';
2
+ export declare function getAppModels(props: {
3
+ projectId: string;
4
+ }): Promise<ModelDetails[]>;
1
5
  export declare function addModel(props: {
2
6
  projectId: string;
3
7
  modelId: string;
@@ -6,6 +10,10 @@ export declare function removeModel(props: {
6
10
  projectId: string;
7
11
  modelId: string;
8
12
  }): Promise<void>;
13
+ export declare function replaceModels(props: {
14
+ projectId: string;
15
+ modelIds: string[];
16
+ }): Promise<void>;
9
17
  export declare function updateModels(props: {
10
18
  projectId: string;
11
19
  }): Promise<void>;
@@ -1 +1 @@
1
- {"version":3,"file":"models.d.ts","sourceRoot":"","sources":["../../src/application-control/models.ts"],"names":[],"mappings":"AAGA,wBAAsB,QAAQ,CAAC,KAAK,EAAE;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,iBAW3E;AAED,wBAAsB,WAAW,CAAC,KAAK,EAAE;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,iBAU9E;AAED,wBAAsB,YAAY,CAAC,KAAK,EAAE;IAAE,SAAS,EAAE,MAAM,CAAA;CAAE,iBAW9D"}
1
+ {"version":3,"file":"models.d.ts","sourceRoot":"","sources":["../../src/application-control/models.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAGvC,wBAAsB,YAAY,CAAC,KAAK,EAAE;IAAE,SAAS,EAAE,MAAM,CAAA;CAAE,2BAkB9D;AAED,wBAAsB,QAAQ,CAAC,KAAK,EAAE;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,iBAU3E;AAED,wBAAsB,WAAW,CAAC,KAAK,EAAE;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,iBAS9E;AAED,wBAAsB,aAAa,CAAC,KAAK,EAAE;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,EAAE,CAAA;CAAE,iBAgBnF;AAED,wBAAsB,YAAY,CAAC,KAAK,EAAE;IAAE,SAAS,EAAE,MAAM,CAAA;CAAE,iBAU9D"}
@@ -1,14 +1,34 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.updateModels = exports.removeModel = exports.addModel = void 0;
3
+ exports.updateModels = exports.replaceModels = exports.removeModel = exports.addModel = exports.getAppModels = void 0;
4
+ const util_1 = require("alwaysai/lib/util");
5
+ const fs_1 = require("fs");
6
+ const path_1 = require("path");
4
7
  const run_cli_cmd_1 = require("../util/run-cli-cmd");
5
8
  const utils_1 = require("./utils");
9
+ async function getAppModels(props) {
10
+ const { projectId } = props;
11
+ await (0, utils_1.requireAppInstalled)({ projectId });
12
+ const appDir = (0, utils_1.getAppDir)(projectId);
13
+ const appCfgPath = (0, path_1.join)(appDir, 'alwaysai.app.json');
14
+ if (!(0, fs_1.existsSync)(appCfgPath)) {
15
+ throw new Error('Application config not found!');
16
+ }
17
+ const appCfg = JSON.parse(await (0, util_1.JsSpawner)().readFile(appCfgPath));
18
+ const modelDetails = [];
19
+ if (!('models' in appCfg)) {
20
+ return modelDetails;
21
+ }
22
+ for (const model in appCfg['models']) {
23
+ modelDetails.push({ modelId: model, version: appCfg['models'][model] });
24
+ }
25
+ return modelDetails;
26
+ }
27
+ exports.getAppModels = getAppModels;
6
28
  async function addModel(props) {
7
29
  const { projectId, modelId } = props;
30
+ await (0, utils_1.requireAppInstalled)({ projectId });
8
31
  const appDir = (0, utils_1.getAppDir)(projectId);
9
- if (!(await (0, utils_1.isAppInstalled)({ appDir }))) {
10
- throw new Error('Application is not installed');
11
- }
12
32
  await (0, run_cli_cmd_1.runCliCmd)({
13
33
  cmd: ['app', 'models', 'add', modelId],
14
34
  cwd: appDir,
@@ -18,22 +38,35 @@ async function addModel(props) {
18
38
  exports.addModel = addModel;
19
39
  async function removeModel(props) {
20
40
  const { projectId, modelId } = props;
41
+ await (0, utils_1.requireAppInstalled)({ projectId });
21
42
  const appDir = (0, utils_1.getAppDir)(projectId);
22
- if (!(await (0, utils_1.isAppInstalled)({ appDir }))) {
23
- throw new Error('Application is not installed');
24
- }
25
43
  await (0, run_cli_cmd_1.runCliCmd)({
26
- cmd: ['app', 'models', 'remove', modelId],
44
+ cmd: ['app', 'models', 'remove', modelId, '--purge'],
27
45
  cwd: appDir,
28
46
  });
29
47
  }
30
48
  exports.removeModel = removeModel;
49
+ async function replaceModels(props) {
50
+ const { projectId, modelIds } = props;
51
+ await (0, utils_1.requireAppInstalled)({ projectId });
52
+ const appDir = (0, utils_1.getAppDir)(projectId);
53
+ await (0, run_cli_cmd_1.runCliCmd)({
54
+ cmd: ['app', 'models', 'remove-all', '--purge'],
55
+ cwd: appDir,
56
+ });
57
+ for (const modelId of modelIds) {
58
+ await (0, run_cli_cmd_1.runCliCmd)({
59
+ cmd: ['app', 'models', 'add', modelId],
60
+ cwd: appDir,
61
+ });
62
+ }
63
+ await (0, utils_1.buildApp)({ appDir });
64
+ }
65
+ exports.replaceModels = replaceModels;
31
66
  async function updateModels(props) {
32
67
  const { projectId } = props;
68
+ await (0, utils_1.requireAppInstalled)({ projectId });
33
69
  const appDir = (0, utils_1.getAppDir)(projectId);
34
- if (!(await (0, utils_1.isAppInstalled)({ appDir }))) {
35
- throw new Error('Application is not installed');
36
- }
37
70
  await (0, run_cli_cmd_1.runCliCmd)({
38
71
  cmd: ['app', 'models', 'update'],
39
72
  cwd: appDir,
@@ -1 +1 @@
1
- {"version":3,"file":"models.js","sourceRoot":"","sources":["../../src/application-control/models.ts"],"names":[],"mappings":";;;AAAA,qDAAgD;AAChD,mCAA8D;AAEvD,KAAK,UAAU,QAAQ,CAAC,KAA6C;IAC1E,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,GAAG,KAAK,CAAC;IACrC,MAAM,MAAM,GAAG,IAAA,iBAAS,EAAC,SAAS,CAAC,CAAC;IACpC,IAAI,CAAC,CAAC,MAAM,IAAA,sBAAc,EAAC,EAAE,MAAM,EAAE,CAAC,CAAC,EAAE;QACvC,MAAM,IAAI,KAAK,CAAC,8BAA8B,CAAC,CAAC;KACjD;IACD,MAAM,IAAA,uBAAS,EAAC;QACd,GAAG,EAAE,CAAC,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,OAAO,CAAC;QACtC,GAAG,EAAE,MAAM;KACZ,CAAC,CAAC;IACH,MAAM,IAAA,gBAAQ,EAAC,EAAE,MAAM,EAAE,CAAC,CAAC;AAC7B,CAAC;AAXD,4BAWC;AAEM,KAAK,UAAU,WAAW,CAAC,KAA6C;IAC7E,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,GAAG,KAAK,CAAC;IACrC,MAAM,MAAM,GAAG,IAAA,iBAAS,EAAC,SAAS,CAAC,CAAC;IACpC,IAAI,CAAC,CAAC,MAAM,IAAA,sBAAc,EAAC,EAAE,MAAM,EAAE,CAAC,CAAC,EAAE;QACvC,MAAM,IAAI,KAAK,CAAC,8BAA8B,CAAC,CAAC;KACjD;IACD,MAAM,IAAA,uBAAS,EAAC;QACd,GAAG,EAAE,CAAC,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,CAAC;QACzC,GAAG,EAAE,MAAM;KACZ,CAAC,CAAC;AACL,CAAC;AAVD,kCAUC;AAEM,KAAK,UAAU,YAAY,CAAC,KAA4B;IAC7D,MAAM,EAAE,SAAS,EAAE,GAAG,KAAK,CAAC;IAC5B,MAAM,MAAM,GAAG,IAAA,iBAAS,EAAC,SAAS,CAAC,CAAC;IACpC,IAAI,CAAC,CAAC,MAAM,IAAA,sBAAc,EAAC,EAAE,MAAM,EAAE,CAAC,CAAC,EAAE;QACvC,MAAM,IAAI,KAAK,CAAC,8BAA8B,CAAC,CAAC;KACjD;IACD,MAAM,IAAA,uBAAS,EAAC;QACd,GAAG,EAAE,CAAC,KAAK,EAAE,QAAQ,EAAE,QAAQ,CAAC;QAChC,GAAG,EAAE,MAAM;KACZ,CAAC,CAAC;IACH,MAAM,IAAA,gBAAQ,EAAC,EAAE,MAAM,EAAE,CAAC,CAAC;AAC7B,CAAC;AAXD,oCAWC"}
1
+ {"version":3,"file":"models.js","sourceRoot":"","sources":["../../src/application-control/models.ts"],"names":[],"mappings":";;;AAAA,4CAA8C;AAC9C,2BAAgC;AAChC,+BAA4B;AAE5B,qDAAgD;AAEhD,mCAAmE;AAE5D,KAAK,UAAU,YAAY,CAAC,KAA4B;IAC7D,MAAM,EAAE,SAAS,EAAE,GAAG,KAAK,CAAC;IAC5B,MAAM,IAAA,2BAAmB,EAAC,EAAE,SAAS,EAAE,CAAC,CAAC;IAEzC,MAAM,MAAM,GAAG,IAAA,iBAAS,EAAC,SAAS,CAAC,CAAC;IACpC,MAAM,UAAU,GAAG,IAAA,WAAI,EAAC,MAAM,EAAE,mBAAmB,CAAC,CAAC;IACrD,IAAI,CAAC,IAAA,eAAU,EAAC,UAAU,CAAC,EAAE;QAC3B,MAAM,IAAI,KAAK,CAAC,+BAA+B,CAAC,CAAC;KAClD;IACD,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,IAAA,gBAAS,GAAE,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC,CAAC;IAClE,MAAM,YAAY,GAAmB,EAAE,CAAC;IACxC,IAAI,CAAC,CAAC,QAAQ,IAAI,MAAM,CAAC,EAAE;QACzB,OAAO,YAAY,CAAC;KACrB;IACD,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,QAAQ,CAAC,EAAE;QACpC,YAAY,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;KACzE;IACD,OAAO,YAAY,CAAC;AACtB,CAAC;AAlBD,oCAkBC;AAEM,KAAK,UAAU,QAAQ,CAAC,KAA6C;IAC1E,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,GAAG,KAAK,CAAC;IACrC,MAAM,IAAA,2BAAmB,EAAC,EAAE,SAAS,EAAE,CAAC,CAAC;IAEzC,MAAM,MAAM,GAAG,IAAA,iBAAS,EAAC,SAAS,CAAC,CAAC;IACpC,MAAM,IAAA,uBAAS,EAAC;QACd,GAAG,EAAE,CAAC,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,OAAO,CAAC;QACtC,GAAG,EAAE,MAAM;KACZ,CAAC,CAAC;IACH,MAAM,IAAA,gBAAQ,EAAC,EAAE,MAAM,EAAE,CAAC,CAAC;AAC7B,CAAC;AAVD,4BAUC;AAEM,KAAK,UAAU,WAAW,CAAC,KAA6C;IAC7E,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,GAAG,KAAK,CAAC;IACrC,MAAM,IAAA,2BAAmB,EAAC,EAAE,SAAS,EAAE,CAAC,CAAC;IAEzC,MAAM,MAAM,GAAG,IAAA,iBAAS,EAAC,SAAS,CAAC,CAAC;IACpC,MAAM,IAAA,uBAAS,EAAC;QACd,GAAG,EAAE,CAAC,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,SAAS,CAAC;QACpD,GAAG,EAAE,MAAM;KACZ,CAAC,CAAC;AACL,CAAC;AATD,kCASC;AAEM,KAAK,UAAU,aAAa,CAAC,KAAgD;IAClF,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,GAAG,KAAK,CAAC;IACtC,MAAM,IAAA,2BAAmB,EAAC,EAAE,SAAS,EAAE,CAAC,CAAC;IAEzC,MAAM,MAAM,GAAG,IAAA,iBAAS,EAAC,SAAS,CAAC,CAAC;IACpC,MAAM,IAAA,uBAAS,EAAC;QACd,GAAG,EAAE,CAAC,KAAK,EAAE,QAAQ,EAAE,YAAY,EAAE,SAAS,CAAC;QAC/C,GAAG,EAAE,MAAM;KACZ,CAAC,CAAC;IACH,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE;QAC9B,MAAM,IAAA,uBAAS,EAAC;YACd,GAAG,EAAE,CAAC,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,OAAO,CAAC;YACtC,GAAG,EAAE,MAAM;SACZ,CAAC,CAAC;KACJ;IACD,MAAM,IAAA,gBAAQ,EAAC,EAAE,MAAM,EAAE,CAAC,CAAC;AAC7B,CAAC;AAhBD,sCAgBC;AAEM,KAAK,UAAU,YAAY,CAAC,KAA4B;IAC7D,MAAM,EAAE,SAAS,EAAE,GAAG,KAAK,CAAC;IAC5B,MAAM,IAAA,2BAAmB,EAAC,EAAE,SAAS,EAAE,CAAC,CAAC;IAEzC,MAAM,MAAM,GAAG,IAAA,iBAAS,EAAC,SAAS,CAAC,CAAC;IACpC,MAAM,IAAA,uBAAS,EAAC;QACd,GAAG,EAAE,CAAC,KAAK,EAAE,QAAQ,EAAE,QAAQ,CAAC;QAChC,GAAG,EAAE,MAAM;KACZ,CAAC,CAAC;IACH,MAAM,IAAA,gBAAQ,EAAC,EAAE,MAAM,EAAE,CAAC,CAAC;AAC7B,CAAC;AAVD,oCAUC"}
@@ -0,0 +1,26 @@
1
+ /// <reference types="node" />
2
+ import { AppState } from '@alwaysai/device-agent-schemas';
3
+ export declare function listAppReleases(props: {
4
+ projectId: string;
5
+ }): Promise<import("alwaysai/lib/infrastructure").ReleaseHistoryArray>;
6
+ export declare function listAppLatestRelease(props: {
7
+ projectId: string;
8
+ }): Promise<string | undefined>;
9
+ export declare function getAppStatus(props: {
10
+ projectId: string;
11
+ }): Promise<AppState>;
12
+ export declare function getAppLogs(props: {
13
+ projectId: string;
14
+ services?: string[];
15
+ }): Promise<NodeJS.ReadableStream>;
16
+ export declare function startApp(props: {
17
+ projectId: string;
18
+ dockerLoginToken?: string;
19
+ }): Promise<void>;
20
+ export declare function stopApp(props: {
21
+ projectId: string;
22
+ }): Promise<void>;
23
+ export declare function restartApp(props: {
24
+ projectId: string;
25
+ }): Promise<void>;
26
+ //# sourceMappingURL=status.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../src/application-control/status.ts"],"names":[],"mappings":";AAMA,OAAO,EAAgC,QAAQ,EAAE,MAAM,gCAAgC,CAAC;AAGxF,wBAAsB,eAAe,CAAC,KAAK,EAAE;IAAE,SAAS,EAAE,MAAM,CAAA;CAAE,sEAIjE;AAED,wBAAsB,oBAAoB,CAAC,KAAK,EAAE;IAAE,SAAS,EAAE,MAAM,CAAA;CAAE,+BAOtE;AAED,wBAAsB,YAAY,CAAC,KAAK,EAAE;IAAE,SAAS,EAAE,MAAM,CAAA;CAAE,GAAG,OAAO,CAAC,QAAQ,CAAC,CAuDlF;AAED,wBAAsB,UAAU,CAAC,KAAK,EAAE;IACtC,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;CACrB,GAAG,OAAO,CAAC,MAAM,CAAC,cAAc,CAAC,CAuBjC;AAED,wBAAsB,QAAQ,CAAC,KAAK,EAAE;IACpC,SAAS,EAAE,MAAM,CAAC;IAClB,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B,GAAG,OAAO,CAAC,IAAI,CAAC,CAoBhB;AAED,wBAAsB,OAAO,CAAC,KAAK,EAAE;IAAE,SAAS,EAAE,MAAM,CAAA;CAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAezE;AAED,wBAAsB,UAAU,CAAC,KAAK,EAAE;IAAE,SAAS,EAAE,MAAM,CAAA;CAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAI5E"}
@@ -0,0 +1,138 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.restartApp = exports.stopApp = exports.startApp = exports.getAppLogs = exports.getAppStatus = exports.listAppLatestRelease = exports.listAppReleases = void 0;
4
+ const docker_compose_1 = require("docker-compose");
5
+ const infrastructure_1 = require("alwaysai/lib/infrastructure");
6
+ const util_1 = require("alwaysai/lib/util");
7
+ const docker_cmd_1 = require("../docker/docker-cmd");
8
+ const utils_1 = require("./utils");
9
+ const agent_config_1 = require("../infrastructure/agent-config");
10
+ async function listAppReleases(props) {
11
+ const { projectId } = props;
12
+ const releaseHistory = await (0, infrastructure_1.fetchAppReleaseHistory)(projectId);
13
+ return releaseHistory;
14
+ }
15
+ exports.listAppReleases = listAppReleases;
16
+ async function listAppLatestRelease(props) {
17
+ const { projectId } = props;
18
+ const releaseHistory = await (0, infrastructure_1.fetchAppReleaseHistory)(projectId);
19
+ if (releaseHistory.length >= 1) {
20
+ return releaseHistory[0]['releaseHash'];
21
+ }
22
+ return undefined;
23
+ }
24
+ exports.listAppLatestRelease = listAppLatestRelease;
25
+ async function getAppStatus(props) {
26
+ const { projectId } = props;
27
+ if (!(await (0, agent_config_1.AgentConfigFile)().isAppPresent({ projectId }))) {
28
+ throw new Error('Application is not installed');
29
+ }
30
+ const appDetails = {
31
+ projectId,
32
+ version: await (0, agent_config_1.AgentConfigFile)().getAppVersion({ projectId }),
33
+ };
34
+ if (!(await (0, agent_config_1.AgentConfigFile)().isAppReady({ projectId }))) {
35
+ // App is being installed or updated
36
+ return { appDetails, services: [] };
37
+ }
38
+ const appDir = (0, utils_1.getAppDir)(projectId);
39
+ // Check if app is running
40
+ const output = await docker_compose_1.default.ps({ cwd: appDir });
41
+ if (output.exitCode !== 0) {
42
+ throw new Error(`Failed to get application status! stdout=${output.out} stderr=${output.err}`);
43
+ }
44
+ const services = [];
45
+ if (output.data.services.length === 0) {
46
+ // If the app has never been started (or has an empty docker-compose.yaml)
47
+ // the list will be empty.
48
+ services.push({ name: '', state: 'Stopped' });
49
+ }
50
+ else {
51
+ for (const service of output.data.services) {
52
+ // Container name has the format:
53
+ // <projectId>_name_<number>
54
+ const matchProjectId = new RegExp(`^${projectId}`);
55
+ const name = service.name
56
+ .replace(matchProjectId, '')
57
+ .replace(/\d+$/, '')
58
+ .replace(/_/g, '');
59
+ let state;
60
+ if (service.state.includes('Up')) {
61
+ state = 'Up';
62
+ }
63
+ else if (service.state.includes('Stopped') || service.state.includes('Exit')) {
64
+ state = 'Stopped';
65
+ }
66
+ else if (service.state.includes('Restarting')) {
67
+ state = 'Restarting';
68
+ }
69
+ else {
70
+ throw new Error(`Unknown state for service! (${service.state})`);
71
+ }
72
+ services.push({ name, state });
73
+ }
74
+ }
75
+ return { appDetails, services };
76
+ }
77
+ exports.getAppStatus = getAppStatus;
78
+ async function getAppLogs(props) {
79
+ const { projectId, services } = props;
80
+ await (0, utils_1.requireAppInstalled)({ projectId });
81
+ const appDir = (0, utils_1.getAppDir)(projectId);
82
+ const serviceList = services
83
+ ? services
84
+ : await (async function () {
85
+ const appStatus = await getAppStatus({ projectId });
86
+ const services = [];
87
+ for (const service of appStatus.services) {
88
+ services.push(service.name);
89
+ }
90
+ return services;
91
+ })();
92
+ // Use direct command with spawner in order to get a readable stream
93
+ return await (0, util_1.JsSpawner)().runStreaming({
94
+ exe: 'docker-compose',
95
+ args: ['logs', '-f', ...serviceList],
96
+ cwd: appDir,
97
+ });
98
+ }
99
+ exports.getAppLogs = getAppLogs;
100
+ async function startApp(props) {
101
+ const { projectId, dockerLoginToken } = props;
102
+ await (0, utils_1.requireAppInstalled)({ projectId });
103
+ const appDir = (0, utils_1.getAppDir)(projectId);
104
+ if (dockerLoginToken !== undefined) {
105
+ const result = await (0, docker_cmd_1.runDockerLogin)({ token: dockerLoginToken });
106
+ console.log(result);
107
+ }
108
+ // TODO: Check if app is running
109
+ // Start app
110
+ const upOut = await docker_compose_1.default.upAll({ cwd: appDir });
111
+ console.log(upOut);
112
+ if (upOut.exitCode !== 0) {
113
+ throw new Error(`Failed to start application! stdout=${upOut.out} stderr=${upOut.err}`);
114
+ }
115
+ console.log('Started', projectId);
116
+ }
117
+ exports.startApp = startApp;
118
+ async function stopApp(props) {
119
+ const { projectId } = props;
120
+ await (0, utils_1.requireAppInstalled)({ projectId });
121
+ const appDir = (0, utils_1.getAppDir)(projectId);
122
+ // TODO: Check if app is running
123
+ // Stop app
124
+ const output = await docker_compose_1.default.down({ cwd: appDir });
125
+ console.log(output);
126
+ if (output.exitCode !== 0) {
127
+ throw new Error(`Failed to stop application! stdout=${output.out} stderr=${output.err}`);
128
+ }
129
+ console.log('Stopped', projectId);
130
+ }
131
+ exports.stopApp = stopApp;
132
+ async function restartApp(props) {
133
+ const { projectId } = props;
134
+ await stopApp({ projectId });
135
+ await startApp({ projectId });
136
+ }
137
+ exports.restartApp = restartApp;
138
+ //# sourceMappingURL=status.js.map