@alwaysai/device-agent 0.0.12 → 0.0.14

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 (227) hide show
  1. package/lib/application-control/backup.d.ts.map +1 -1
  2. package/lib/application-control/backup.js +11 -5
  3. package/lib/application-control/backup.js.map +1 -1
  4. package/lib/application-control/config.d.ts +12 -4
  5. package/lib/application-control/config.d.ts.map +1 -1
  6. package/lib/application-control/config.js +59 -16
  7. package/lib/application-control/config.js.map +1 -1
  8. package/lib/application-control/environment-variables.d.ts.map +1 -1
  9. package/lib/application-control/environment-variables.js.map +1 -1
  10. package/lib/application-control/index.d.ts +5 -5
  11. package/lib/application-control/index.d.ts.map +1 -1
  12. package/lib/application-control/index.js +4 -6
  13. package/lib/application-control/index.js.map +1 -1
  14. package/lib/application-control/install.d.ts +1 -1
  15. package/lib/application-control/install.d.ts.map +1 -1
  16. package/lib/application-control/install.js +58 -57
  17. package/lib/application-control/install.js.map +1 -1
  18. package/lib/application-control/models.d.ts +7 -5
  19. package/lib/application-control/models.d.ts.map +1 -1
  20. package/lib/application-control/models.js +78 -57
  21. package/lib/application-control/models.js.map +1 -1
  22. package/lib/application-control/status.d.ts +0 -6
  23. package/lib/application-control/status.d.ts.map +1 -1
  24. package/lib/application-control/status.js +21 -33
  25. package/lib/application-control/status.js.map +1 -1
  26. package/lib/application-control/utils.d.ts +3 -2
  27. package/lib/application-control/utils.d.ts.map +1 -1
  28. package/lib/application-control/utils.js +54 -34
  29. package/lib/application-control/utils.js.map +1 -1
  30. package/lib/cloud-connection/app-install-status.d.ts +16 -0
  31. package/lib/cloud-connection/app-install-status.d.ts.map +1 -0
  32. package/lib/cloud-connection/app-install-status.js +53 -0
  33. package/lib/cloud-connection/app-install-status.js.map +1 -0
  34. package/lib/cloud-connection/bootstrap-provision.d.ts +2 -0
  35. package/lib/cloud-connection/bootstrap-provision.d.ts.map +1 -0
  36. package/lib/cloud-connection/bootstrap-provision.js +34 -0
  37. package/lib/cloud-connection/bootstrap-provision.js.map +1 -0
  38. package/lib/cloud-connection/cmd-status.d.ts +16 -0
  39. package/lib/cloud-connection/cmd-status.d.ts.map +1 -0
  40. package/lib/cloud-connection/cmd-status.js +49 -0
  41. package/lib/cloud-connection/cmd-status.js.map +1 -0
  42. package/lib/cloud-connection/device-agent-cloud-connection.d.ts +21 -34
  43. package/lib/cloud-connection/device-agent-cloud-connection.d.ts.map +1 -1
  44. package/lib/cloud-connection/device-agent-cloud-connection.js +211 -387
  45. package/lib/cloud-connection/device-agent-cloud-connection.js.map +1 -1
  46. package/lib/cloud-connection/device-agent.d.ts.map +1 -1
  47. package/lib/cloud-connection/device-agent.js +22 -26
  48. package/lib/cloud-connection/device-agent.js.map +1 -1
  49. package/lib/cloud-connection/live-updates-handler.d.ts +34 -0
  50. package/lib/cloud-connection/live-updates-handler.d.ts.map +1 -0
  51. package/lib/cloud-connection/live-updates-handler.js +167 -0
  52. package/lib/cloud-connection/live-updates-handler.js.map +1 -0
  53. package/lib/cloud-connection/messages.d.ts +14 -0
  54. package/lib/cloud-connection/messages.d.ts.map +1 -0
  55. package/lib/cloud-connection/messages.js +38 -0
  56. package/lib/cloud-connection/messages.js.map +1 -0
  57. package/lib/cloud-connection/passthrough-handler.d.ts +11 -0
  58. package/lib/cloud-connection/passthrough-handler.d.ts.map +1 -0
  59. package/lib/cloud-connection/passthrough-handler.js +59 -0
  60. package/lib/cloud-connection/passthrough-handler.js.map +1 -0
  61. package/lib/cloud-connection/publisher.d.ts +15 -0
  62. package/lib/cloud-connection/publisher.d.ts.map +1 -0
  63. package/lib/cloud-connection/publisher.js +58 -0
  64. package/lib/cloud-connection/publisher.js.map +1 -0
  65. package/lib/cloud-connection/shadow-handler.d.ts +33 -0
  66. package/lib/cloud-connection/shadow-handler.d.ts.map +1 -0
  67. package/lib/cloud-connection/shadow-handler.js +108 -0
  68. package/lib/cloud-connection/shadow-handler.js.map +1 -0
  69. package/lib/cloud-connection/shadow-handler.test.d.ts +2 -0
  70. package/lib/cloud-connection/shadow-handler.test.d.ts.map +1 -0
  71. package/lib/cloud-connection/shadow-handler.test.js +321 -0
  72. package/lib/cloud-connection/shadow-handler.test.js.map +1 -0
  73. package/lib/cloud-connection/shadow.d.ts +16 -0
  74. package/lib/cloud-connection/shadow.d.ts.map +1 -0
  75. package/lib/cloud-connection/shadow.js +36 -0
  76. package/lib/cloud-connection/shadow.js.map +1 -0
  77. package/lib/device-control/device-control.d.ts.map +1 -1
  78. package/lib/device-control/device-control.js +1 -0
  79. package/lib/device-control/device-control.js.map +1 -1
  80. package/lib/docker/docker-cmd.js +1 -1
  81. package/lib/docker/docker-compose-cmd.d.ts.map +1 -1
  82. package/lib/docker/docker-compose-cmd.js +1 -1
  83. package/lib/docker/docker-compose-cmd.js.map +1 -1
  84. package/lib/endpoints.js +10 -10
  85. package/lib/endpoints.js.map +1 -1
  86. package/lib/environment.d.ts +1 -0
  87. package/lib/environment.d.ts.map +1 -1
  88. package/lib/environment.js +2 -1
  89. package/lib/environment.js.map +1 -1
  90. package/lib/infrastructure/agent-config.d.ts +15 -58
  91. package/lib/infrastructure/agent-config.d.ts.map +1 -1
  92. package/lib/infrastructure/agent-config.js +22 -15
  93. package/lib/infrastructure/agent-config.js.map +1 -1
  94. package/lib/infrastructure/agent-config.test.js +25 -23
  95. package/lib/infrastructure/agent-config.test.js.map +1 -1
  96. package/lib/infrastructure/system-id.d.ts +2 -0
  97. package/lib/infrastructure/system-id.d.ts.map +1 -0
  98. package/lib/infrastructure/system-id.js +21 -0
  99. package/lib/infrastructure/system-id.js.map +1 -0
  100. package/lib/infrastructure/tokens-and-device-cfg.d.ts +4 -0
  101. package/lib/infrastructure/tokens-and-device-cfg.d.ts.map +1 -0
  102. package/lib/infrastructure/tokens-and-device-cfg.js +27 -0
  103. package/lib/infrastructure/tokens-and-device-cfg.js.map +1 -0
  104. package/lib/infrastructure/urls.d.ts.map +1 -1
  105. package/lib/infrastructure/urls.js +3 -3
  106. package/lib/infrastructure/urls.js.map +1 -1
  107. package/lib/local-connection/rabbitmq-connection.d.ts +4 -0
  108. package/lib/local-connection/rabbitmq-connection.d.ts.map +1 -0
  109. package/lib/local-connection/rabbitmq-connection.js +58 -0
  110. package/lib/local-connection/rabbitmq-connection.js.map +1 -0
  111. package/lib/root.d.ts.map +1 -1
  112. package/lib/root.js +2 -7
  113. package/lib/root.js.map +1 -1
  114. package/lib/subcommands/app/app.d.ts +2 -1
  115. package/lib/subcommands/app/app.d.ts.map +1 -1
  116. package/lib/subcommands/app/app.js +112 -77
  117. package/lib/subcommands/app/app.js.map +1 -1
  118. package/lib/subcommands/app/index.js +2 -2
  119. package/lib/subcommands/device/clean.d.ts +2 -0
  120. package/lib/subcommands/device/clean.d.ts.map +1 -0
  121. package/lib/subcommands/device/clean.js +29 -0
  122. package/lib/subcommands/device/clean.js.map +1 -0
  123. package/lib/subcommands/device/device.d.ts +1 -1
  124. package/lib/subcommands/device/device.d.ts.map +1 -1
  125. package/lib/subcommands/device/device.js +44 -33
  126. package/lib/subcommands/device/device.js.map +1 -1
  127. package/lib/subcommands/device/index.d.ts.map +1 -1
  128. package/lib/subcommands/device/index.js +2 -1
  129. package/lib/subcommands/device/index.js.map +1 -1
  130. package/lib/subcommands/get-model-package.js +5 -5
  131. package/lib/subcommands/index.d.ts +0 -1
  132. package/lib/subcommands/index.d.ts.map +1 -1
  133. package/lib/subcommands/index.js +1 -1
  134. package/lib/subcommands/login.d.ts +0 -1
  135. package/lib/subcommands/login.d.ts.map +1 -1
  136. package/lib/subcommands/login.js +6 -14
  137. package/lib/subcommands/login.js.map +1 -1
  138. package/lib/util/clean-certs.d.ts +2 -0
  139. package/lib/util/clean-certs.d.ts.map +1 -0
  140. package/lib/util/clean-certs.js +16 -0
  141. package/lib/util/clean-certs.js.map +1 -0
  142. package/lib/util/directories.d.ts +16 -15
  143. package/lib/util/directories.d.ts.map +1 -1
  144. package/lib/util/directories.js +45 -26
  145. package/lib/util/directories.js.map +1 -1
  146. package/lib/util/fetch-with-timeout.d.ts +4 -0
  147. package/lib/util/fetch-with-timeout.d.ts.map +1 -0
  148. package/lib/util/fetch-with-timeout.js +15 -0
  149. package/lib/util/fetch-with-timeout.js.map +1 -0
  150. package/lib/util/get-device-id.d.ts +1 -1
  151. package/lib/util/get-device-id.d.ts.map +1 -1
  152. package/lib/util/get-device-id.js +14 -19
  153. package/lib/util/get-device-id.js.map +1 -1
  154. package/lib/util/http-client.d.ts +1 -1
  155. package/lib/util/http-client.d.ts.map +1 -1
  156. package/lib/util/http-client.js +10 -8
  157. package/lib/util/http-client.js.map +1 -1
  158. package/lib/util/logger.d.ts.map +1 -1
  159. package/lib/util/logger.js +4 -5
  160. package/lib/util/logger.js.map +1 -1
  161. package/lib/util/require-logged-in-and-paid-plan.d.ts +2 -0
  162. package/lib/util/require-logged-in-and-paid-plan.d.ts.map +1 -0
  163. package/lib/util/require-logged-in-and-paid-plan.js +18 -0
  164. package/lib/util/require-logged-in-and-paid-plan.js.map +1 -0
  165. package/lib/util/run-in-dir.d.ts.map +1 -1
  166. package/lib/util/run-in-dir.js +1 -0
  167. package/lib/util/run-in-dir.js.map +1 -1
  168. package/lib/util/timer.d.ts +2 -0
  169. package/lib/util/timer.d.ts.map +1 -0
  170. package/lib/util/timer.js +6 -0
  171. package/lib/util/timer.js.map +1 -0
  172. package/package.json +32 -35
  173. package/readme.md +100 -89
  174. package/src/application-control/backup.ts +11 -6
  175. package/src/application-control/config.ts +75 -13
  176. package/src/application-control/environment-variables.ts +3 -3
  177. package/src/application-control/index.ts +18 -11
  178. package/src/application-control/install.ts +82 -78
  179. package/src/application-control/models.ts +104 -72
  180. package/src/application-control/status.ts +29 -40
  181. package/src/application-control/utils.ts +66 -38
  182. package/src/cloud-connection/app-install-status.ts +62 -0
  183. package/src/cloud-connection/bootstrap-provision.ts +40 -0
  184. package/src/cloud-connection/cmd-status.ts +52 -0
  185. package/src/cloud-connection/device-agent-cloud-connection.ts +302 -526
  186. package/src/cloud-connection/device-agent.ts +31 -38
  187. package/src/cloud-connection/live-updates-handler.ts +226 -0
  188. package/src/cloud-connection/messages.ts +39 -0
  189. package/src/cloud-connection/passthrough-handler.ts +67 -0
  190. package/src/cloud-connection/publisher.ts +86 -0
  191. package/src/cloud-connection/shadow-handler.test.ts +361 -0
  192. package/src/cloud-connection/shadow-handler.ts +175 -0
  193. package/src/cloud-connection/shadow.ts +50 -0
  194. package/src/device-control/device-control.ts +1 -0
  195. package/src/docker/docker-cmd.ts +1 -1
  196. package/src/docker/docker-compose-cmd.ts +5 -2
  197. package/src/endpoints.ts +9 -9
  198. package/src/environment.ts +11 -3
  199. package/src/infrastructure/agent-config.test.ts +33 -29
  200. package/src/infrastructure/agent-config.ts +57 -22
  201. package/src/infrastructure/system-id.ts +18 -0
  202. package/src/infrastructure/tokens-and-device-cfg.ts +34 -0
  203. package/src/infrastructure/urls.ts +4 -2
  204. package/src/local-connection/rabbitmq-connection.ts +53 -0
  205. package/src/root.ts +2 -8
  206. package/src/subcommands/app/app.ts +119 -83
  207. package/src/subcommands/app/index.ts +3 -3
  208. package/src/subcommands/device/clean.ts +26 -0
  209. package/src/subcommands/device/device.ts +67 -54
  210. package/src/subcommands/device/index.ts +2 -1
  211. package/src/subcommands/get-model-package.ts +5 -5
  212. package/src/subcommands/index.ts +1 -1
  213. package/src/subcommands/login.ts +6 -14
  214. package/src/util/clean-certs.ts +12 -0
  215. package/src/util/directories.ts +68 -52
  216. package/src/util/fetch-with-timeout.ts +18 -0
  217. package/src/util/get-device-id.ts +16 -18
  218. package/src/util/http-client.ts +18 -13
  219. package/src/util/logger.ts +6 -6
  220. package/src/util/require-logged-in-and-paid-plan.ts +16 -0
  221. package/src/util/run-in-dir.ts +2 -1
  222. package/src/util/timer.ts +1 -0
  223. package/lib/infrastructure/certificates-and-tokens.d.ts +0 -6
  224. package/lib/infrastructure/certificates-and-tokens.d.ts.map +0 -1
  225. package/lib/infrastructure/certificates-and-tokens.js +0 -43
  226. package/lib/infrastructure/certificates-and-tokens.js.map +0 -1
  227. package/src/infrastructure/certificates-and-tokens.ts +0 -53
@@ -1,13 +1,6 @@
1
1
  import * as tempy from 'tempy';
2
2
  import { AgentConfigFile } from './agent-config';
3
3
 
4
- const mockAgentModeGetter = jest.fn().mockReturnValue(undefined);
5
- jest.mock('../environment', () => ({
6
- get ALWAYSAI_DEVICE_AGENT_MODE() {
7
- return mockAgentModeGetter();
8
- },
9
- }));
10
-
11
4
  const configFile = AgentConfigFile(tempy.directory());
12
5
 
13
6
  describe('Test Agent Config', () => {
@@ -21,9 +14,13 @@ describe('Test Agent Config', () => {
21
14
  expect(apps).toEqual([]);
22
15
  const app = await configFile.getApp({ projectId: 'wrong-id' });
23
16
  expect(app).toBeNull();
24
- const present = await configFile.isAppPresent({ projectId: 'another-id' });
17
+ const present = await configFile.isAppPresent({
18
+ projectId: 'another-id'
19
+ });
25
20
  expect(present).toBeFalsy();
26
- const ready = await configFile.isAppReady({ projectId: 'yet-another-id' });
21
+ const ready = await configFile.isAppReady({
22
+ projectId: 'yet-another-id'
23
+ });
27
24
  expect(ready).toBeFalsy();
28
25
  });
29
26
 
@@ -37,8 +34,8 @@ describe('Test Agent Config', () => {
37
34
  {
38
35
  projectId,
39
36
  version,
40
- ready: false,
41
- },
37
+ ready: false
38
+ }
42
39
  ]);
43
40
  const readyApps = await configFile.getReadyApps();
44
41
  expect(readyApps).toEqual([]);
@@ -46,7 +43,7 @@ describe('Test Agent Config', () => {
46
43
  expect(app).toEqual({
47
44
  projectId,
48
45
  version,
49
- ready: false,
46
+ ready: false
50
47
  });
51
48
  const present = await configFile.isAppPresent({ projectId });
52
49
  expect(present).toBeTruthy();
@@ -65,22 +62,22 @@ describe('Test Agent Config', () => {
65
62
  {
66
63
  projectId,
67
64
  version,
68
- ready: true,
69
- },
65
+ ready: true
66
+ }
70
67
  ]);
71
68
  const readyApps = await configFile.getReadyApps();
72
69
  expect(readyApps).toEqual([
73
70
  {
74
71
  projectId,
75
72
  version,
76
- ready: true,
77
- },
73
+ ready: true
74
+ }
78
75
  ]);
79
76
  const app = await configFile.getApp({ projectId });
80
77
  expect(app).toEqual({
81
78
  projectId,
82
79
  version,
83
- ready: true,
80
+ ready: true
84
81
  });
85
82
  const appVersion = await configFile.getAppVersion({ projectId });
86
83
  expect(appVersion).toEqual(version);
@@ -103,9 +100,13 @@ describe('Test Agent Config', () => {
103
100
  expect(apps).toEqual([]);
104
101
  const app = await configFile.getApp({ projectId: 'wrong-id' });
105
102
  expect(app).toBeNull();
106
- const present = await configFile.isAppPresent({ projectId: 'another-id' });
103
+ const present = await configFile.isAppPresent({
104
+ projectId: 'another-id'
105
+ });
107
106
  expect(present).toBeFalsy();
108
- const ready = await configFile.isAppReady({ projectId: 'yet-another-id' });
107
+ const ready = await configFile.isAppReady({
108
+ projectId: 'yet-another-id'
109
+ });
109
110
  expect(ready).toBeFalsy();
110
111
  });
111
112
 
@@ -129,9 +130,9 @@ describe('Test Agent Config', () => {
129
130
  version,
130
131
  ready: true,
131
132
  backup: {
132
- version,
133
- },
134
- },
133
+ version
134
+ }
135
+ }
135
136
  ]);
136
137
  const app = await configFile.getApp({ projectId });
137
138
  expect(app).toEqual({
@@ -139,8 +140,8 @@ describe('Test Agent Config', () => {
139
140
  version,
140
141
  ready: true,
141
142
  backup: {
142
- version,
143
- },
143
+ version
144
+ }
144
145
  });
145
146
  const backup2 = await configFile.getAppBackup({ projectId });
146
147
  expect(backup2).toEqual({ version });
@@ -168,15 +169,17 @@ describe('Test Agent Config', () => {
168
169
 
169
170
  // test to see if app has backup
170
171
  await configFile.setAppBackup({ projectId });
171
- const expectedBackupVersion = (await configFile.getAppBackup({ projectId }))
172
- ?.version;
172
+ const expectedBackupVersion = (
173
+ await configFile.getAppBackup({ projectId })
174
+ )?.version;
173
175
  expect(expectedBackupVersion).toEqual(version1);
174
176
  expect(await configFile.getAppVersion({ projectId })).toEqual(version1);
175
177
 
176
178
  // simulate second version install
177
179
  await configFile.setAppInstalling({ projectId, version: version2 });
178
- const newExpectedBackupVersion = (await configFile.getAppBackup({ projectId }))
179
- ?.version;
180
+ const newExpectedBackupVersion = (
181
+ await configFile.getAppBackup({ projectId })
182
+ )?.version;
180
183
  expect(newExpectedBackupVersion).toEqual(version1);
181
184
  await configFile.setAppInstalled({ projectId, version: version2 });
182
185
  expect(await configFile.getAppVersion({ projectId })).toEqual(version2);
@@ -190,7 +193,8 @@ describe('Test Agent Config', () => {
190
193
 
191
194
  // test final state of rolled-back app
192
195
  await configFile.setAppInstalled({ projectId, version: version1 });
193
- const finalBackupVersion = (await configFile.getAppBackup({ projectId }))?.version;
196
+ const finalBackupVersion = (await configFile.getAppBackup({ projectId }))
197
+ ?.version;
194
198
  expect(finalBackupVersion).toEqual(version1);
195
199
  expect(await configFile.isAppReady({ projectId })).toEqual(true);
196
200
  expect(await configFile.getAppVersion({ projectId })).toEqual(version1);
@@ -1,5 +1,8 @@
1
- import { ConfigFileSchema } from '@alwaysai/config-nodejs';
2
- import { JSONSchemaType } from 'ajv';
1
+ import {
2
+ ConfigFileSchema,
3
+ ConfigFileSchemaReturnType
4
+ } from '@alwaysai/config-nodejs';
5
+ import Ajv, { JSONSchemaType } from 'ajv';
3
6
  import { homedir } from 'os';
4
7
  import { join } from 'path';
5
8
 
@@ -33,34 +36,56 @@ const schema: JSONSchemaType<AgentConfig> = {
33
36
  type: 'object',
34
37
  nullable: true,
35
38
  properties: {
36
- version: { type: 'string' },
39
+ version: { type: 'string' }
37
40
  },
38
41
  required: ['version'],
39
- additionalProperties: true,
40
- },
42
+ additionalProperties: true
43
+ }
41
44
  },
42
45
  required: ['projectId', 'version', 'ready'],
43
- additionalProperties: true,
44
- },
45
- },
46
+ additionalProperties: true
47
+ }
48
+ }
46
49
  },
47
50
  required: ['applications'],
48
- additionalProperties: true,
51
+ additionalProperties: true
49
52
  };
50
53
 
54
+ const ajv = new Ajv();
55
+ const validateFunction = ajv.compile(schema);
56
+
51
57
  const ALWAYSAI_CONFIG_DIR = join(homedir(), '.config', 'alwaysai');
52
58
 
53
59
  const AGENT_CONFIG_FILE_NAME = 'alwaysai.agent.json';
54
60
 
55
- export function AgentConfigFile(dir = ALWAYSAI_CONFIG_DIR) {
61
+ export interface AgentJsonFileReturnType
62
+ extends ConfigFileSchemaReturnType<AgentConfig> {
63
+ name: string;
64
+ getApps: () => Promise<InstalledAppConfig[]>;
65
+ getReadyApps;
66
+ getApp;
67
+ isAppPresent;
68
+ isAppReady;
69
+ removeApp;
70
+ setAppInstalling;
71
+ setAppInstalled;
72
+ setAppUninstalled;
73
+ getAppVersion;
74
+ setAppBackup;
75
+ getAppBackup;
76
+ }
77
+
78
+ export function AgentConfigFile(
79
+ dir = ALWAYSAI_CONFIG_DIR
80
+ ): AgentJsonFileReturnType {
56
81
  const path = join(dir, AGENT_CONFIG_FILE_NAME);
57
82
  const initialValue: AgentConfig = {
58
- applications: [],
83
+ applications: []
59
84
  };
60
85
  const configFile = ConfigFileSchema({
61
86
  path,
62
- schema,
63
- initialValue,
87
+ validateFunction,
88
+ initialValue
64
89
  });
65
90
 
66
91
  return {
@@ -77,19 +102,21 @@ export function AgentConfigFile(dir = ALWAYSAI_CONFIG_DIR) {
77
102
  setAppUninstalled,
78
103
  getAppVersion,
79
104
  setAppBackup,
80
- getAppBackup,
105
+ getAppBackup
81
106
  };
82
107
 
83
108
  async function getApps() {
84
109
  const config = configFile.read();
85
- return config.applications;
110
+ return config && config.applications ? config.applications : [];
86
111
  }
87
112
 
88
113
  async function getReadyApps() {
89
114
  const config = configFile.read();
90
- return config.applications.filter((app) => {
91
- return app.ready;
92
- });
115
+ return config && config.applications
116
+ ? config.applications.filter((app) => {
117
+ return app.ready;
118
+ })
119
+ : [];
93
120
  }
94
121
 
95
122
  async function getApp(props: { projectId: string }) {
@@ -124,6 +151,8 @@ export function AgentConfigFile(dir = ALWAYSAI_CONFIG_DIR) {
124
151
  async function removeApp(props: { projectId: string }) {
125
152
  const { projectId } = props;
126
153
  const config = configFile.read();
154
+ if (!config) return;
155
+
127
156
  const newList = config.applications.filter((app) => {
128
157
  return app.projectId !== projectId;
129
158
  });
@@ -131,7 +160,10 @@ export function AgentConfigFile(dir = ALWAYSAI_CONFIG_DIR) {
131
160
  configFile.write(config);
132
161
  }
133
162
 
134
- async function setAppInstalling(props: { projectId: string; version: string }) {
163
+ async function setAppInstalling(props: {
164
+ projectId: string;
165
+ version: string;
166
+ }) {
135
167
  const { projectId, version } = props;
136
168
 
137
169
  const app = await getApp({ projectId });
@@ -147,13 +179,16 @@ export function AgentConfigFile(dir = ALWAYSAI_CONFIG_DIR) {
147
179
  config.applications.push({
148
180
  projectId,
149
181
  version,
150
- ready: false,
182
+ ready: false
151
183
  });
152
184
  configFile.write(config);
153
185
  }
154
186
  }
155
187
 
156
- async function setAppInstalled(props: { projectId: string; version: string }) {
188
+ async function setAppInstalled(props: {
189
+ projectId: string;
190
+ version: string;
191
+ }) {
157
192
  const { projectId, version } = props;
158
193
  const app = await getApp({ projectId });
159
194
  if (app) {
@@ -165,7 +200,7 @@ export function AgentConfigFile(dir = ALWAYSAI_CONFIG_DIR) {
165
200
  // NOTE: we should never be setting an app as installed
166
201
  // if it doesn't exist (setAppInstalling was never called)
167
202
  throw new Error(
168
- `App ${projectId} was not previously configured and could not be set to installed!`,
203
+ `App ${projectId} was not previously configured and could not be set to installed!`
169
204
  );
170
205
  }
171
206
  }
@@ -0,0 +1,18 @@
1
+ import { SystemId } from 'alwaysai/lib/constants';
2
+ import { DeviceConfigFile } from 'alwaysai/lib/core/device';
3
+ import { ALWAYSAI_SYSTEM_ID } from 'alwaysai/lib/environment';
4
+
5
+ export function getSystemId() {
6
+ if (ALWAYSAI_SYSTEM_ID) {
7
+ // When the env var is set return the overridden value without updating the config file.
8
+ // This prevents one-off commands from having side effects.
9
+ if (Object.keys(SystemId).includes(ALWAYSAI_SYSTEM_ID)) {
10
+ return ALWAYSAI_SYSTEM_ID as SystemId;
11
+ }
12
+ throw new Error(`Invalid ALWAYSAI_SYSTEM_ID: ${ALWAYSAI_SYSTEM_ID}`);
13
+ }
14
+ const maybeConfig = DeviceConfigFile().readIfExists();
15
+ const systemId =
16
+ maybeConfig && maybeConfig.systemId ? maybeConfig.systemId : 'production';
17
+ return systemId;
18
+ }
@@ -0,0 +1,34 @@
1
+ import { LOCAL_AAI_CFG_DIR } from 'alwaysai/lib/constants';
2
+ import { logger } from '../util/logger';
3
+ import { microServiceHttpClient } from '../util/http-client';
4
+ import { requireLoggedInAndPaidPlan } from '../util/require-logged-in-and-paid-plan';
5
+ import {
6
+ DeviceTokens,
7
+ writeOrValidateDeviceCfgFile,
8
+ writeTokens
9
+ } from 'alwaysai/lib/core/device';
10
+ import { JsSpawner } from 'alwaysai/lib/util';
11
+
12
+ // NOTE: This closely follows the flow of deviceCheckAndUpdateComponent in the CLI
13
+ export async function writeTokenAndDeviceCfg(props: { deviceUuid: string }) {
14
+ const { deviceUuid } = props;
15
+ await requireLoggedInAndPaidPlan();
16
+ const { accessToken, refreshToken, idToken } = await microServiceHttpClient(
17
+ 'token-service',
18
+ 'create-device-tokens',
19
+ 'POST',
20
+ JSON.stringify({})
21
+ );
22
+
23
+ const tokens: DeviceTokens = {
24
+ deviceId: deviceUuid,
25
+ accessToken,
26
+ refreshToken,
27
+ idToken
28
+ };
29
+ const tokenSpawner = JsSpawner({ path: LOCAL_AAI_CFG_DIR });
30
+ await writeTokens({ spawner: tokenSpawner, tokens });
31
+ await writeOrValidateDeviceCfgFile({ spawner: tokenSpawner, deviceUuid });
32
+
33
+ logger.info('Updated tokens and certificate');
34
+ }
@@ -1,5 +1,5 @@
1
1
  import { CliTerseError } from '@alwaysai/alwayscli';
2
- import { getSystemId } from 'alwaysai/lib/infrastructure';
2
+ import { getSystemId } from './system-id';
3
3
 
4
4
  export function getIoTCoreEndpointUrl() {
5
5
  let iotCoreEndpointUrl = '';
@@ -15,7 +15,9 @@ export function getIoTCoreEndpointUrl() {
15
15
  iotCoreEndpointUrl = 'a3tzi5g7sq5zsj-ats.iot.us-west-2.amazonaws.com';
16
16
  break;
17
17
  default:
18
- throw new CliTerseError(`Remote deployment not supported on ${getSystemId()}!`);
18
+ throw new CliTerseError(
19
+ `Remote deployment not supported on ${getSystemId()}!`
20
+ );
19
21
  }
20
22
  return iotCoreEndpointUrl;
21
23
  }
@@ -0,0 +1,53 @@
1
+ import { JsSpawner } from 'alwaysai/lib/util';
2
+ import { logger } from '../util/logger';
3
+ import sleep from '../util/sleep';
4
+
5
+ export async function checkRabbitMQContainerRunning() {
6
+ const spawner = JsSpawner();
7
+ return await spawner.run({
8
+ exe: 'docker',
9
+ args: ['ps', '-q', '--filter', 'ancestor=rabbitmq']
10
+ });
11
+ }
12
+
13
+ export async function setupRabbitMQContainer() {
14
+ const spawner = JsSpawner();
15
+ const rabbitMqContainerRunning = await checkRabbitMQContainerRunning();
16
+ logger.debug('Checking for running RabbitMQ container');
17
+ if (!rabbitMqContainerRunning) {
18
+ logger.debug('Setting up RabbitMQ container');
19
+ await spawner.run({
20
+ exe: 'docker',
21
+ args: [
22
+ 'run',
23
+ '--rm',
24
+ '-p',
25
+ '5672:5672',
26
+ '-d',
27
+ '--hostname',
28
+ 'my-rabbit',
29
+ 'rabbitmq'
30
+ ]
31
+ });
32
+ await sleep(8000);
33
+ while (!(await checkRabbitMQContainerRunning())) {
34
+ await sleep(5000);
35
+ }
36
+ }
37
+ }
38
+
39
+ export async function stopRabbitMQContainer() {
40
+ const spawner = JsSpawner();
41
+ const rabbitMqContainer = await spawner.run({
42
+ exe: 'docker',
43
+ args: ['ps', '-q', '--filter', 'ancestor=rabbitmq']
44
+ });
45
+ if (!rabbitMqContainer) {
46
+ logger.debug('No RabbitMQ container running');
47
+ } else {
48
+ await spawner.run({
49
+ exe: 'docker',
50
+ args: ['stop', `${rabbitMqContainer}`]
51
+ });
52
+ }
53
+ }
package/src/root.ts CHANGED
@@ -1,18 +1,12 @@
1
+ // eslint-disable-next-line
1
2
  const winston = require('winston');
2
3
 
3
4
  import { CliBranch } from '@alwaysai/alwayscli';
4
5
 
5
6
  import { subcommands } from './subcommands';
6
- import { ALWAYSAI_LOG_LEVEL } from './environment';
7
-
8
- winston.configure({
9
- level: ALWAYSAI_LOG_LEVEL || 'info',
10
- transports: [new winston.transports.Console()],
11
- format: winston.format.simple(),
12
- });
13
7
 
14
8
  export const root = CliBranch({
15
9
  name: 'aai-agent',
16
10
  description: 'Manage your alwaysAI production device',
17
- subcommands,
11
+ subcommands
18
12
  });