@seamapi/cli 0.0.1 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (136) hide show
  1. package/README.md +59 -3
  2. package/bin/cli.d.ts +2 -0
  3. package/bin/cli.js +233 -0
  4. package/bin/cli.js.map +1 -0
  5. package/index.d.ts +2 -0
  6. package/index.js +5 -0
  7. package/index.js.map +1 -0
  8. package/lib/get-api-blueprint.d.ts +3 -0
  9. package/lib/get-api-blueprint.js +11 -0
  10. package/lib/get-api-blueprint.js.map +1 -0
  11. package/lib/get-command-blueprint-def.d.ts +2 -0
  12. package/lib/get-command-blueprint-def.js +11 -0
  13. package/lib/get-command-blueprint-def.js.map +1 -0
  14. package/lib/get-config-store.d.ts +2 -0
  15. package/lib/get-config-store.js +5 -0
  16. package/lib/get-config-store.js.map +1 -0
  17. package/lib/get-current-workspace-id.d.ts +1 -0
  18. package/lib/get-current-workspace-id.js +10 -0
  19. package/lib/get-current-workspace-id.js.map +1 -0
  20. package/lib/get-seam.d.ts +3 -0
  21. package/lib/get-seam.js +26 -0
  22. package/lib/get-seam.js.map +1 -0
  23. package/lib/get-server.d.ts +1 -0
  24. package/lib/get-server.js +7 -0
  25. package/lib/get-server.js.map +1 -0
  26. package/lib/interact-for-access-code.d.ts +3 -0
  27. package/lib/interact-for-access-code.js +19 -0
  28. package/lib/interact-for-access-code.js.map +1 -0
  29. package/lib/interact-for-acs-entrance.d.ts +1 -0
  30. package/lib/interact-for-acs-entrance.js +15 -0
  31. package/lib/interact-for-acs-entrance.js.map +1 -0
  32. package/lib/interact-for-acs-system.d.ts +1 -0
  33. package/lib/interact-for-acs-system.js +16 -0
  34. package/lib/interact-for-acs-system.js.map +1 -0
  35. package/lib/interact-for-acs-user.d.ts +1 -0
  36. package/lib/interact-for-acs-user.js +17 -0
  37. package/lib/interact-for-acs-user.js.map +1 -0
  38. package/lib/interact-for-action-attempt-poll.d.ts +2 -0
  39. package/lib/interact-for-action-attempt-poll.js +22 -0
  40. package/lib/interact-for-action-attempt-poll.js.map +1 -0
  41. package/lib/interact-for-array.d.ts +1 -0
  42. package/lib/interact-for-array.js +53 -0
  43. package/lib/interact-for-array.js.map +1 -0
  44. package/lib/interact-for-blueprint-object.d.ts +9 -0
  45. package/lib/interact-for-blueprint-object.js +235 -0
  46. package/lib/interact-for-blueprint-object.js.map +1 -0
  47. package/lib/interact-for-command-params.d.ts +5 -0
  48. package/lib/interact-for-command-params.js +11 -0
  49. package/lib/interact-for-command-params.js.map +1 -0
  50. package/lib/interact-for-command-selection.d.ts +2 -0
  51. package/lib/interact-for-command-selection.js +76 -0
  52. package/lib/interact-for-command-selection.js.map +1 -0
  53. package/lib/interact-for-connected-account.d.ts +1 -0
  54. package/lib/interact-for-connected-account.js +20 -0
  55. package/lib/interact-for-connected-account.js.map +1 -0
  56. package/lib/interact-for-custom-metadata.d.ts +6 -0
  57. package/lib/interact-for-custom-metadata.js +71 -0
  58. package/lib/interact-for-custom-metadata.js.map +1 -0
  59. package/lib/interact-for-device.d.ts +1 -0
  60. package/lib/interact-for-device.js +15 -0
  61. package/lib/interact-for-device.js.map +1 -0
  62. package/lib/interact-for-login.d.ts +1 -0
  63. package/lib/interact-for-login.js +39 -0
  64. package/lib/interact-for-login.js.map +1 -0
  65. package/lib/interact-for-resource.d.ts +11 -0
  66. package/lib/interact-for-resource.js +13 -0
  67. package/lib/interact-for-resource.js.map +1 -0
  68. package/lib/interact-for-server-selection.d.ts +1 -0
  69. package/lib/interact-for-server-selection.js +41 -0
  70. package/lib/interact-for-server-selection.js.map +1 -0
  71. package/lib/interact-for-timestamp.d.ts +1 -0
  72. package/lib/interact-for-timestamp.js +10 -0
  73. package/lib/interact-for-timestamp.js.map +1 -0
  74. package/lib/interact-for-use-remote-api-defs.d.ts +1 -0
  75. package/lib/interact-for-use-remote-api-defs.js +25 -0
  76. package/lib/interact-for-use-remote-api-defs.js.map +1 -0
  77. package/lib/interact-for-user-identity.d.ts +1 -0
  78. package/lib/interact-for-user-identity.js +15 -0
  79. package/lib/interact-for-user-identity.js.map +1 -0
  80. package/lib/interact-for-workspace-id.d.ts +1 -0
  81. package/lib/interact-for-workspace-id.js +31 -0
  82. package/lib/interact-for-workspace-id.js.map +1 -0
  83. package/lib/types.d.ts +5 -0
  84. package/lib/types.js +2 -0
  85. package/lib/types.js.map +1 -0
  86. package/lib/util/ellipsis.d.ts +1 -0
  87. package/lib/util/ellipsis.js +6 -0
  88. package/lib/util/ellipsis.js.map +1 -0
  89. package/lib/util/request-seam-api.d.ts +4 -0
  90. package/lib/util/request-seam-api.js +28 -0
  91. package/lib/util/request-seam-api.js.map +1 -0
  92. package/lib/util/with-loading.d.ts +1 -0
  93. package/lib/util/with-loading.js +14 -0
  94. package/lib/util/with-loading.js.map +1 -0
  95. package/lib/validate-token.d.ts +1 -0
  96. package/lib/validate-token.js +19 -0
  97. package/lib/validate-token.js.map +1 -0
  98. package/lib/version.d.ts +2 -0
  99. package/lib/version.js +3 -0
  100. package/lib/version.js.map +1 -0
  101. package/package.json +44 -18
  102. package/src/bin/cli.ts +265 -0
  103. package/src/index.ts +4 -1
  104. package/src/lib/get-api-blueprint.ts +17 -0
  105. package/src/lib/get-command-blueprint-def.ts +15 -0
  106. package/src/lib/get-config-store.ts +5 -0
  107. package/src/lib/get-current-workspace-id.ts +11 -0
  108. package/src/lib/get-seam.ts +43 -0
  109. package/src/lib/get-server.ts +9 -0
  110. package/src/lib/interact-for-access-code.ts +25 -0
  111. package/src/lib/interact-for-acs-entrance.ts +16 -0
  112. package/src/lib/interact-for-acs-system.ts +17 -0
  113. package/src/lib/interact-for-acs-user.ts +21 -0
  114. package/src/lib/interact-for-action-attempt-poll.ts +35 -0
  115. package/src/lib/interact-for-array.ts +61 -0
  116. package/src/lib/interact-for-blueprint-object.ts +274 -0
  117. package/src/lib/interact-for-command-params.ts +22 -0
  118. package/src/lib/interact-for-command-selection.ts +107 -0
  119. package/src/lib/interact-for-connected-account.ts +24 -0
  120. package/src/lib/interact-for-custom-metadata.ts +86 -0
  121. package/src/lib/interact-for-device.ts +15 -0
  122. package/src/lib/interact-for-login.ts +53 -0
  123. package/src/lib/interact-for-resource.ts +34 -0
  124. package/src/lib/interact-for-server-selection.ts +46 -0
  125. package/src/lib/interact-for-timestamp.ts +10 -0
  126. package/src/lib/interact-for-use-remote-api-defs.ts +27 -0
  127. package/src/lib/interact-for-user-identity.ts +16 -0
  128. package/src/lib/interact-for-workspace-id.ts +37 -0
  129. package/src/lib/types.ts +6 -0
  130. package/src/lib/util/ellipsis.ts +4 -0
  131. package/src/lib/util/request-seam-api.ts +43 -0
  132. package/src/lib/util/with-loading.ts +16 -0
  133. package/src/lib/validate-token.ts +28 -0
  134. package/src/lib/version.ts +3 -0
  135. package/src/lib/index.ts +0 -1
  136. package/src/lib/todo.ts +0 -1
package/README.md CHANGED
@@ -1,3 +1,5 @@
1
+ ![seam-cli-chromatic-dark-blog-cover-repo](https://github.com/seamapi/seam-cli/assets/852751/e63bbaaa-d8a9-4417-ac69-d21b172e6de6)
2
+
1
3
  # Seam CLI
2
4
 
3
5
  [![npm](https://img.shields.io/npm/v/@seamapi/cli.svg)](https://www.npmjs.com/package/@seamapi/cli)
@@ -7,18 +9,66 @@ A command line interface (CLI) for interacting with the Seam API.
7
9
 
8
10
  ## Description
9
11
 
10
- TODO
12
+ Every command is interactive: the CLI prompts for any missing required
13
+ parameter with suggestions pulled from your workspace. Pass `-y` to take the
14
+ first suggestion instead of being asked.
15
+
16
+ The command list is derived at runtime from the [Seam API blueprint], so the
17
+ CLI exposes every documented endpoint without needing a release of its own.
18
+
19
+ [Seam API blueprint]: https://github.com/seamapi/blueprint
11
20
 
12
21
  ## Installation
13
22
 
14
- Add this as a dependency to your project using [npm] with
23
+ Install the CLI globally using [npm] with
24
+
25
+ ```
26
+ $ npm install --global @seamapi/cli
27
+ ```
28
+
29
+ On Arch Linux, install the [`seam-bin`][aur] package from the AUR with
15
30
 
16
31
  ```
17
- $ npm install @seamapi/cli
32
+ $ paru -S seam-bin
18
33
  ```
19
34
 
35
+ [aur]: https://aur.archlinux.org/packages/seam-bin
20
36
  [npm]: https://www.npmjs.com/
21
37
 
38
+ ## Usage
39
+
40
+ Every `seam` command is interactive and will prompt you for any missing
41
+ required properties with helpful suggestions. To avoid automatic behavior,
42
+ pass `-y`
43
+
44
+ ```bash
45
+ # Login to Seam
46
+ seam login
47
+
48
+ # Select your workspace
49
+ seam select workspace
50
+
51
+ # Interactively select commands to execute
52
+ seam
53
+
54
+ # Create a connect webview to connect devices
55
+ seam connect-webviews create
56
+
57
+ # List devices in your workspace
58
+ seam devices list
59
+
60
+ MY_DOOR=$(seam devices get --name "Front Door" --id-only)
61
+
62
+ # Unlock a lock
63
+ seam locks unlock-door --device-id $MY_DOOR
64
+
65
+ # Create an access code
66
+ seam access-codes create --code "1234" --name "My Code"
67
+
68
+ # List you access codes
69
+ seam access-codes list --device-id $MY_DOOR
70
+ ```
71
+
22
72
  ## Development and Testing
23
73
 
24
74
  ### Quickstart
@@ -31,6 +81,12 @@ $ npm install
31
81
  $ npm run test:watch
32
82
  ```
33
83
 
84
+ Run the CLI from source with
85
+
86
+ ```
87
+ $ npm run seam -- devices list
88
+ ```
89
+
34
90
  Primary development tasks are defined under `scripts` in `package.json`
35
91
  and available via `npm run`.
36
92
  View them with
package/bin/cli.d.ts ADDED
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env node
2
+ export {};
package/bin/cli.js ADDED
@@ -0,0 +1,233 @@
1
+ #!/usr/bin/env node
2
+ import { randomBytes } from 'node:crypto';
3
+ import { isDeepStrictEqual as isEqual } from 'node:util';
4
+ import chalk from 'chalk';
5
+ import commandLineUsage from 'command-line-usage';
6
+ import parseArgs, {} from 'minimist';
7
+ import prompts from 'prompts';
8
+ import { getApiBlueprint } from '../lib/get-api-blueprint.js';
9
+ import { getConfigStore } from '../lib/get-config-store.js';
10
+ import { getServer } from '../lib/get-server.js';
11
+ import { interactForActionAttemptPoll } from '../lib/interact-for-action-attempt-poll.js';
12
+ import { interactForCommandParams } from '../lib/interact-for-command-params.js';
13
+ import { interactForCommandSelection } from '../lib/interact-for-command-selection.js';
14
+ import { interactForLogin } from '../lib/interact-for-login.js';
15
+ import { interactForServerSelection } from '../lib/interact-for-server-selection.js';
16
+ import { interactForUseRemoteApiDefs } from '../lib/interact-for-use-remote-api-defs.js';
17
+ import { interactForWorkspaceId } from '../lib/interact-for-workspace-id.js';
18
+ import { RequestSeamApi } from '../lib/util/request-seam-api.js';
19
+ import { validateToken } from '../lib/validate-token.js';
20
+ import seamapiCliVersion from '../lib/version.js';
21
+ const sections = [
22
+ {
23
+ header: 'Seam CLI',
24
+ content: 'Every seam command is interactive and will prompt you for any missing required properties with helpful suggestions. To avoid automatic behavior, pass -y ',
25
+ },
26
+ {
27
+ header: 'Options',
28
+ optionList: [
29
+ {
30
+ name: 'help',
31
+ description: 'Display this help guide.',
32
+ alias: 'h',
33
+ type: Boolean,
34
+ },
35
+ ],
36
+ },
37
+ {
38
+ header: 'Command List Examples',
39
+ content: [
40
+ { name: 'seam', summary: 'Interactively select commands to execute.' },
41
+ { name: 'seam login', summary: 'Login to Seam.' },
42
+ { name: 'seam select workspace', summary: 'Select your workspace.' },
43
+ {
44
+ name: 'seam connect-webviews create',
45
+ summary: 'Create a connect webview to connect devices.',
46
+ },
47
+ { name: 'seam devices list', summary: 'List devices in your workspace.' },
48
+ {
49
+ name: 'seam locks unlock-door {bold --device-id} $MY_DOOR',
50
+ summary: 'Unlock a lock.',
51
+ },
52
+ {
53
+ name: "seam access-codes create {bold --code} '1234' {bold --name} 'My Code'",
54
+ summary: 'Create an access code.',
55
+ },
56
+ {
57
+ name: 'seam access-codes list {bold --device-id} $MY_DOOR',
58
+ summary: 'List you access codes.',
59
+ },
60
+ ],
61
+ },
62
+ ];
63
+ async function cli(args) {
64
+ const config = getConfigStore();
65
+ if (args['help'] || args['h']) {
66
+ const usage = commandLineUsage(sections);
67
+ console.log(usage);
68
+ return;
69
+ }
70
+ if (args['version']) {
71
+ console.log(seamapiCliVersion);
72
+ process.exit(0);
73
+ }
74
+ if (args._[0] === 'config' &&
75
+ args._[1] === 'set' &&
76
+ args._[2] === 'fake-server') {
77
+ const randomstring = randomBytes(5).toString('hex');
78
+ const fakeApiUrl = `https://${randomstring}.fakeseamconnect.seam.vc`;
79
+ config.set('server', fakeApiUrl);
80
+ console.log(`Server URL set to ${fakeApiUrl}`);
81
+ config.set(`${getServer()}.pat`, `seam_apikey1_token`);
82
+ console.log(`PAT set to use fakeseamconnect with "seam_apikey1_token"`);
83
+ return;
84
+ }
85
+ if (!config.get(`${getServer()}.pat`) &&
86
+ args._[0] !== 'login' &&
87
+ !isEqual(args._, ['select', 'server'])) {
88
+ console.log(`Not logged in. Please run "seam login"`);
89
+ process.exit(1);
90
+ }
91
+ args._ = args._.map((arg) => arg.toLowerCase().replace(/_/g, '-'));
92
+ for (const k in args) {
93
+ args[k.toLowerCase().replace(/-/g, '_')] = args[k];
94
+ }
95
+ const use_remote_api_defs = args['remote_api_defs'] ?? config.get('use_remote_api_defs');
96
+ const blueprint = await getApiBlueprint(use_remote_api_defs ?? false);
97
+ const commandParams = {};
98
+ /**
99
+ * Whether or not to auto-select first option
100
+ */
101
+ const is_interactive = args['y'] !== true;
102
+ const ctx = {
103
+ blueprint,
104
+ is_interactive,
105
+ };
106
+ for (const k in args) {
107
+ if (k === '_')
108
+ continue;
109
+ const v = args[k];
110
+ delete args[k];
111
+ args[k.replace(/-/g, '_')] = v;
112
+ commandParams[k.replace(/-/g, '_')] = v;
113
+ }
114
+ const selectedCommand = await interactForCommandSelection(args._, ctx);
115
+ if (isEqual(selectedCommand, ['login'])) {
116
+ if (args['server']) {
117
+ config.set('server', args['server']);
118
+ config.delete('current_workspace_id');
119
+ }
120
+ if (args['token']) {
121
+ const token = String(args['token']).trim();
122
+ await validateToken(token, args['workspace_id']);
123
+ config.set(`${getServer()}.pat`, token);
124
+ config.delete('current_workspace_id');
125
+ }
126
+ if (args['workspace_id']) {
127
+ config.set(`current_workspace_id`, args['workspace_id']);
128
+ }
129
+ if (args['token'] || args['workspace_id'] || args['server']) {
130
+ return;
131
+ }
132
+ await interactForLogin();
133
+ return;
134
+ }
135
+ else if (isEqual(selectedCommand, ['logout'])) {
136
+ config.delete('pat');
137
+ console.log('Logged out!');
138
+ return;
139
+ }
140
+ else if (isEqual(selectedCommand, ['config', 'reveal-location'])) {
141
+ console.log(config.path);
142
+ return;
143
+ }
144
+ else if (isEqual(selectedCommand, ['config', 'use-remote-api-defs'])) {
145
+ await interactForUseRemoteApiDefs();
146
+ return;
147
+ }
148
+ else if (isEqual(selectedCommand, ['select', 'workspace'])) {
149
+ await interactForWorkspaceId();
150
+ return;
151
+ }
152
+ else if (isEqual(selectedCommand, ['events', 'list'])) {
153
+ if (!commandParams['since']) {
154
+ const date = new Date();
155
+ date.setMonth(date.getMonth() - 1);
156
+ commandParams['since'] = date.toISOString();
157
+ }
158
+ }
159
+ else if (isEqual(selectedCommand, ['select', 'server'])) {
160
+ if (args['server']) {
161
+ config.set('server', args['server']);
162
+ config.delete('current_workspace_id');
163
+ return;
164
+ }
165
+ await interactForServerSelection();
166
+ return;
167
+ }
168
+ else if (isEqual(selectedCommand, ['health', 'get-health'])) {
169
+ await RequestSeamApi({
170
+ path: '/health/get_health',
171
+ params: {},
172
+ });
173
+ return;
174
+ }
175
+ // TODO - do this using the OpenAPI spec for the command rather than
176
+ // explicitly encoding the property names
177
+ if (commandParams['accepted_providers']) {
178
+ commandParams['accepted_providers'] =
179
+ commandParams['accepted_providers'].split(',');
180
+ }
181
+ // Hit 'back' on a top-level command path, so we start again
182
+ const lastCommandPath = selectedCommand.slice(-1)[0];
183
+ if (lastCommandPath === '[Back]') {
184
+ return await cli({
185
+ ...args,
186
+ _: [],
187
+ });
188
+ }
189
+ const params = await interactForCommandParams({ command: selectedCommand, params: commandParams }, ctx);
190
+ if (params === '[Back]') {
191
+ const previousCommands = [...selectedCommand];
192
+ previousCommands.pop();
193
+ return await cli({
194
+ ...args,
195
+ _: previousCommands,
196
+ });
197
+ }
198
+ const apiPath = `/${selectedCommand.join('/').replace(/-/g, '_')}`;
199
+ if (apiPath.includes('/events/list') && params.between) {
200
+ delete params.since;
201
+ }
202
+ const response = await RequestSeamApi({
203
+ path: apiPath,
204
+ params,
205
+ });
206
+ if (response.data?.connect_webview) {
207
+ await handleConnectWebviewResponse(response.data.connect_webview);
208
+ }
209
+ if (response.data?.action_attempt) {
210
+ interactForActionAttemptPoll(response.data.action_attempt);
211
+ }
212
+ }
213
+ const handleConnectWebviewResponse = async (connect_webview) => {
214
+ const url = connect_webview.url;
215
+ if (process.env['INSIDE_WEB_BROWSER'] !== '1') {
216
+ const { action } = await prompts({
217
+ type: 'confirm',
218
+ name: 'action',
219
+ message: 'Would you like to open the webview in your browser?',
220
+ });
221
+ if (action) {
222
+ const { default: open } = await import('open');
223
+ await open(url);
224
+ }
225
+ }
226
+ };
227
+ cli(parseArgs(process.argv.slice(2), { string: ['code'] })).catch((e) => {
228
+ console.log(chalk.red(`CLI Error: ${e.toString()}\n${e.stack}`));
229
+ if (e.toString().includes('object Object')) {
230
+ console.log(e);
231
+ }
232
+ });
233
+ //# sourceMappingURL=cli.js.map
package/bin/cli.js.map ADDED
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/bin/cli.ts"],"names":[],"mappings":"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"}
package/index.d.ts ADDED
@@ -0,0 +1,2 @@
1
+ declare const _default: null;
2
+ export default _default;
package/index.js ADDED
@@ -0,0 +1,5 @@
1
+ // This package is a CLI, not a library: nothing here is part of a public API.
2
+ // The entrypoint exists so that importing the package resolves to a module
3
+ // instead of failing, for consumers that depend on it to get the bin.
4
+ export default null;
5
+ //# sourceMappingURL=index.js.map
package/index.js.map ADDED
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["src/index.ts"],"names":[],"mappings":"AAAA,8EAA8E;AAC9E,2EAA2E;AAC3E,sEAAsE;AACtE,eAAe,IAAI,CAAA"}
@@ -0,0 +1,3 @@
1
+ import { type Blueprint } from '@seamapi/blueprint';
2
+ export type ApiBlueprint = Blueprint;
3
+ export declare const getApiBlueprint: (useRemoteDefinitions: boolean) => Promise<ApiBlueprint>;
@@ -0,0 +1,11 @@
1
+ import { createBlueprint } from '@seamapi/blueprint';
2
+ import { getOpenapiSchema } from '@seamapi/http/connect';
3
+ import * as seamTypes from '@seamapi/types/connect';
4
+ import { getServer } from './get-server.js';
5
+ export const getApiBlueprint = async (useRemoteDefinitions) => {
6
+ const typesModule = useRemoteDefinitions
7
+ ? { ...seamTypes, openapi: await getOpenapiSchema(getServer()) }
8
+ : seamTypes;
9
+ return createBlueprint(typesModule, { omitUndocumented: true });
10
+ };
11
+ //# sourceMappingURL=get-api-blueprint.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-api-blueprint.js","sourceRoot":"","sources":["../src/lib/get-api-blueprint.ts"],"names":[],"mappings":"AAAA,OAAO,EAAkB,eAAe,EAAE,MAAM,oBAAoB,CAAA;AACpE,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAA;AACxD,OAAO,KAAK,SAAS,MAAM,wBAAwB,CAAA;AAEnD,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAA;AAI3C,MAAM,CAAC,MAAM,eAAe,GAAG,KAAK,EAClC,oBAA6B,EACN,EAAE;IACzB,MAAM,WAAW,GAAG,oBAAoB;QACtC,CAAC,CAAC,EAAE,GAAG,SAAS,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC,SAAS,EAAE,CAAC,EAAE;QAChE,CAAC,CAAC,SAAS,CAAA;IAEb,OAAO,eAAe,CAAC,WAAW,EAAE,EAAE,gBAAgB,EAAE,IAAI,EAAE,CAAC,CAAA;AACjE,CAAC,CAAA"}
@@ -0,0 +1,2 @@
1
+ import type { ContextHelpers } from './types.js';
2
+ export declare const getCommandBlueprintDef: (cmd: string[], helpers: ContextHelpers) => import("@seamapi/blueprint").Endpoint;
@@ -0,0 +1,11 @@
1
+ export const getCommandBlueprintDef = (cmd, helpers) => {
2
+ const path = `/${cmd.join('/').replace(/-/g, '_')}`;
3
+ const def = helpers.blueprint.routes
4
+ .flatMap((route) => route.endpoints)
5
+ .find((endpoint) => endpoint.path === path);
6
+ if (!def) {
7
+ throw new Error(`No definition for path ${path}`);
8
+ }
9
+ return def;
10
+ };
11
+ //# sourceMappingURL=get-command-blueprint-def.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-command-blueprint-def.js","sourceRoot":"","sources":["../src/lib/get-command-blueprint-def.ts"],"names":[],"mappings":"AACA,MAAM,CAAC,MAAM,sBAAsB,GAAG,CACpC,GAAa,EACb,OAAuB,EACvB,EAAE;IACF,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,EAAE,CAAA;IACnD,MAAM,GAAG,GAAG,OAAO,CAAC,SAAS,CAAC,MAAM;SACjC,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,SAAS,CAAC;SACnC,IAAI,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,IAAI,KAAK,IAAI,CAAC,CAAA;IAC7C,IAAI,CAAC,GAAG,EAAE,CAAC;QACT,MAAM,IAAI,KAAK,CAAC,0BAA0B,IAAI,EAAE,CAAC,CAAA;IACnD,CAAC;IAED,OAAO,GAAG,CAAA;AACZ,CAAC,CAAA"}
@@ -0,0 +1,2 @@
1
+ import Configstore from 'configstore';
2
+ export declare const getConfigStore: () => Configstore;
@@ -0,0 +1,5 @@
1
+ import Configstore from 'configstore';
2
+ export const getConfigStore = () => {
3
+ return new Configstore('seam-cli', {});
4
+ };
5
+ //# sourceMappingURL=get-config-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-config-store.js","sourceRoot":"","sources":["../src/lib/get-config-store.ts"],"names":[],"mappings":"AAAA,OAAO,WAAW,MAAM,aAAa,CAAA;AAErC,MAAM,CAAC,MAAM,cAAc,GAAG,GAAG,EAAE;IACjC,OAAO,IAAI,WAAW,CAAC,UAAU,EAAE,EAAE,CAAC,CAAA;AACxC,CAAC,CAAA"}
@@ -0,0 +1 @@
1
+ export declare const getCurrentWorkspaceId: () => Promise<string>;
@@ -0,0 +1,10 @@
1
+ import { getConfigStore } from './get-config-store.js';
2
+ import { interactForWorkspaceId } from './interact-for-workspace-id.js';
3
+ export const getCurrentWorkspaceId = async () => {
4
+ const configStore = getConfigStore();
5
+ const currentWorkspaceId = configStore.get('current_workspace_id');
6
+ if (typeof currentWorkspaceId === 'string')
7
+ return currentWorkspaceId;
8
+ return await interactForWorkspaceId();
9
+ };
10
+ //# sourceMappingURL=get-current-workspace-id.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-current-workspace-id.js","sourceRoot":"","sources":["../src/lib/get-current-workspace-id.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAA;AACtD,OAAO,EAAE,sBAAsB,EAAE,MAAM,gCAAgC,CAAA;AAEvE,MAAM,CAAC,MAAM,qBAAqB,GAAG,KAAK,IAAqB,EAAE;IAC/D,MAAM,WAAW,GAAG,cAAc,EAAE,CAAA;IAEpC,MAAM,kBAAkB,GAAG,WAAW,CAAC,GAAG,CAAC,sBAAsB,CAAC,CAAA;IAClE,IAAI,OAAO,kBAAkB,KAAK,QAAQ;QAAE,OAAO,kBAAkB,CAAA;IAErE,OAAO,MAAM,sBAAsB,EAAE,CAAA;AACvC,CAAC,CAAA"}
@@ -0,0 +1,3 @@
1
+ import { SeamHttp, SeamHttpWithoutWorkspace } from '@seamapi/http/connect';
2
+ export declare const getSeam: () => Promise<SeamHttp>;
3
+ export declare const getSeamMultiWorkspace: () => Promise<SeamHttpWithoutWorkspace | SeamHttp>;
@@ -0,0 +1,26 @@
1
+ import { isConsoleSessionToken, isPersonalAccessToken, SeamHttp, SeamHttpWithoutWorkspace, } from '@seamapi/http/connect';
2
+ import { getConfigStore } from './get-config-store.js';
3
+ import { getServer } from './get-server.js';
4
+ export const getSeam = async () => {
5
+ const config = getConfigStore();
6
+ const token = config.get(`${getServer()}.pat`);
7
+ const workspaceId = config.get('current_workspace_id');
8
+ const options = { endpoint: getServer() };
9
+ if (isPersonalAccessToken(token)) {
10
+ return SeamHttp.fromPersonalAccessToken(token, workspaceId, options);
11
+ }
12
+ if (isConsoleSessionToken(token)) {
13
+ return SeamHttp.fromConsoleSessionToken(token, workspaceId, options);
14
+ }
15
+ return SeamHttp.fromApiKey(token, options);
16
+ };
17
+ export const getSeamMultiWorkspace = async () => {
18
+ const config = getConfigStore();
19
+ const token = config.get(`${getServer()}.pat`);
20
+ const options = { endpoint: getServer() };
21
+ if (isPersonalAccessToken(token)) {
22
+ return SeamHttpWithoutWorkspace.fromPersonalAccessToken(token, options);
23
+ }
24
+ return getSeam();
25
+ };
26
+ //# sourceMappingURL=get-seam.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-seam.js","sourceRoot":"","sources":["../src/lib/get-seam.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,qBAAqB,EACrB,qBAAqB,EACrB,QAAQ,EACR,wBAAwB,GACzB,MAAM,uBAAuB,CAAA;AAE9B,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAA;AACtD,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAA;AAE3C,MAAM,CAAC,MAAM,OAAO,GAAG,KAAK,IAAuB,EAAE;IACnD,MAAM,MAAM,GAAG,cAAc,EAAE,CAAA;IAE/B,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,GAAG,SAAS,EAAE,MAAM,CAAW,CAAA;IAExD,MAAM,WAAW,GAAG,MAAM,CAAC,GAAG,CAAC,sBAAsB,CAAW,CAAA;IAEhE,MAAM,OAAO,GAAG,EAAE,QAAQ,EAAE,SAAS,EAAE,EAAE,CAAA;IAEzC,IAAI,qBAAqB,CAAC,KAAK,CAAC,EAAE,CAAC;QACjC,OAAO,QAAQ,CAAC,uBAAuB,CAAC,KAAK,EAAE,WAAW,EAAE,OAAO,CAAC,CAAA;IACtE,CAAC;IAED,IAAI,qBAAqB,CAAC,KAAK,CAAC,EAAE,CAAC;QACjC,OAAO,QAAQ,CAAC,uBAAuB,CAAC,KAAK,EAAE,WAAW,EAAE,OAAO,CAAC,CAAA;IACtE,CAAC;IAED,OAAO,QAAQ,CAAC,UAAU,CAAC,KAAK,EAAE,OAAO,CAAC,CAAA;AAC5C,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,qBAAqB,GAAG,KAAK,IAExC,EAAE;IACF,MAAM,MAAM,GAAG,cAAc,EAAE,CAAA;IAC/B,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,GAAG,SAAS,EAAE,MAAM,CAAW,CAAA;IACxD,MAAM,OAAO,GAAG,EAAE,QAAQ,EAAE,SAAS,EAAE,EAAE,CAAA;IAEzC,IAAI,qBAAqB,CAAC,KAAK,CAAC,EAAE,CAAC;QACjC,OAAO,wBAAwB,CAAC,uBAAuB,CAAC,KAAK,EAAE,OAAO,CAAC,CAAA;IACzE,CAAC;IAED,OAAO,OAAO,EAAE,CAAA;AAClB,CAAC,CAAA"}
@@ -0,0 +1 @@
1
+ export declare const getServer: () => string;
@@ -0,0 +1,7 @@
1
+ import { getConfigStore } from './get-config-store.js';
2
+ export const getServer = () => {
3
+ const config = getConfigStore();
4
+ const server = config.get('server');
5
+ return typeof server === 'string' ? server : 'https://connect.getseam.com';
6
+ };
7
+ //# sourceMappingURL=get-server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-server.js","sourceRoot":"","sources":["../src/lib/get-server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAA;AAEtD,MAAM,CAAC,MAAM,SAAS,GAAG,GAAW,EAAE;IACpC,MAAM,MAAM,GAAG,cAAc,EAAE,CAAA;IAE/B,MAAM,MAAM,GAAG,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAA;IAEnC,OAAO,OAAO,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,6BAA6B,CAAA;AAC5E,CAAC,CAAA"}
@@ -0,0 +1,3 @@
1
+ export declare const interactForAccessCode: ({ device_id, }: {
2
+ device_id?: string;
3
+ }) => Promise<string>;
@@ -0,0 +1,19 @@
1
+ import { getSeam } from './get-seam.js';
2
+ import { interactForDevice } from './interact-for-device.js';
3
+ import { interactForResource } from './interact-for-resource.js';
4
+ export const interactForAccessCode = async ({ device_id, }) => {
5
+ const seam = await getSeam();
6
+ if (!device_id) {
7
+ device_id = await interactForDevice();
8
+ }
9
+ return interactForResource({
10
+ resourceName: 'access_code',
11
+ fetchResources: () => seam.accessCodes.list({ device_id }),
12
+ toChoice: (accessCode) => ({
13
+ title: accessCode.name ?? '<No Name>',
14
+ value: accessCode.access_code_id,
15
+ description: `${accessCode.type} ${accessCode.access_code_id}`,
16
+ }),
17
+ });
18
+ };
19
+ //# sourceMappingURL=interact-for-access-code.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"interact-for-access-code.js","sourceRoot":"","sources":["../src/lib/interact-for-access-code.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAA;AACvC,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAA;AAC5D,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAA;AAEhE,MAAM,CAAC,MAAM,qBAAqB,GAAG,KAAK,EAAE,EAC1C,SAAS,GAGV,EAAE,EAAE;IACH,MAAM,IAAI,GAAG,MAAM,OAAO,EAAE,CAAA;IAE5B,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,SAAS,GAAG,MAAM,iBAAiB,EAAE,CAAA;IACvC,CAAC;IAED,OAAO,mBAAmB,CAAC;QACzB,YAAY,EAAE,aAAa;QAC3B,cAAc,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE,SAAS,EAAE,CAAC;QAC1D,QAAQ,EAAE,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;YACzB,KAAK,EAAE,UAAU,CAAC,IAAI,IAAI,WAAW;YACrC,KAAK,EAAE,UAAU,CAAC,cAAc;YAChC,WAAW,EAAE,GAAG,UAAU,CAAC,IAAI,IAAI,UAAU,CAAC,cAAc,EAAE;SAC/D,CAAC;KACH,CAAC,CAAA;AACJ,CAAC,CAAA"}
@@ -0,0 +1 @@
1
+ export declare const interactForAcsEntrance: () => Promise<string>;
@@ -0,0 +1,15 @@
1
+ import { getSeam } from './get-seam.js';
2
+ import { interactForResource } from './interact-for-resource.js';
3
+ export const interactForAcsEntrance = async () => {
4
+ const seam = await getSeam();
5
+ return interactForResource({
6
+ resourceName: 'ACS entrance',
7
+ fetchResources: () => seam.acs.entrances.list(),
8
+ toChoice: (entrance) => ({
9
+ title: entrance.display_name ?? '<No Name>',
10
+ value: entrance.acs_entrance_id,
11
+ description: entrance.acs_entrance_id,
12
+ }),
13
+ });
14
+ };
15
+ //# sourceMappingURL=interact-for-acs-entrance.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"interact-for-acs-entrance.js","sourceRoot":"","sources":["../src/lib/interact-for-acs-entrance.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAA;AACvC,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAA;AAEhE,MAAM,CAAC,MAAM,sBAAsB,GAAG,KAAK,IAAI,EAAE;IAC/C,MAAM,IAAI,GAAG,MAAM,OAAO,EAAE,CAAA;IAE5B,OAAO,mBAAmB,CAAC;QACzB,YAAY,EAAE,cAAc;QAC5B,cAAc,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,EAAE;QAC/C,QAAQ,EAAE,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;YACvB,KAAK,EAAE,QAAQ,CAAC,YAAY,IAAI,WAAW;YAC3C,KAAK,EAAE,QAAQ,CAAC,eAAe;YAC/B,WAAW,EAAE,QAAQ,CAAC,eAAe;SACtC,CAAC;KACH,CAAC,CAAA;AACJ,CAAC,CAAA"}
@@ -0,0 +1 @@
1
+ export declare const interactForAcsSystem: (message?: string) => Promise<string>;
@@ -0,0 +1,16 @@
1
+ import { getSeam } from './get-seam.js';
2
+ import { interactForResource } from './interact-for-resource.js';
3
+ export const interactForAcsSystem = async (message) => {
4
+ const seam = await getSeam();
5
+ return interactForResource({
6
+ resourceName: 'ACS system',
7
+ fetchResources: () => seam.acs.systems.list(),
8
+ message,
9
+ toChoice: (system) => ({
10
+ title: `${system.name} ${system.external_type_display_name}`,
11
+ value: system.acs_system_id,
12
+ description: system.acs_system_id,
13
+ }),
14
+ });
15
+ };
16
+ //# sourceMappingURL=interact-for-acs-system.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"interact-for-acs-system.js","sourceRoot":"","sources":["../src/lib/interact-for-acs-system.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAA;AACvC,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAA;AAEhE,MAAM,CAAC,MAAM,oBAAoB,GAAG,KAAK,EAAE,OAAgB,EAAE,EAAE;IAC7D,MAAM,IAAI,GAAG,MAAM,OAAO,EAAE,CAAA;IAE5B,OAAO,mBAAmB,CAAC;QACzB,YAAY,EAAE,YAAY;QAC1B,cAAc,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE;QAC7C,OAAO;QACP,QAAQ,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;YACrB,KAAK,EAAE,GAAG,MAAM,CAAC,IAAI,IAAI,MAAM,CAAC,0BAA0B,EAAE;YAC5D,KAAK,EAAE,MAAM,CAAC,aAAa;YAC3B,WAAW,EAAE,MAAM,CAAC,aAAa;SAClC,CAAC;KACH,CAAC,CAAA;AACJ,CAAC,CAAA"}
@@ -0,0 +1 @@
1
+ export declare const interactForAcsUser: () => Promise<string>;
@@ -0,0 +1,17 @@
1
+ import { getSeam } from './get-seam.js';
2
+ import { interactForAcsSystem } from './interact-for-acs-system.js';
3
+ import { interactForResource } from './interact-for-resource.js';
4
+ export const interactForAcsUser = async () => {
5
+ const seam = await getSeam();
6
+ const acs_system_id = await interactForAcsSystem('What acs_system does the acs_user belong to?');
7
+ return interactForResource({
8
+ resourceName: 'ACS user',
9
+ fetchResources: () => seam.acs.users.list({ acs_system_id }),
10
+ toChoice: (user) => ({
11
+ title: `${user.display_name} ${user.email_address}`,
12
+ value: user.acs_user_id,
13
+ description: user.acs_user_id,
14
+ }),
15
+ });
16
+ };
17
+ //# sourceMappingURL=interact-for-acs-user.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"interact-for-acs-user.js","sourceRoot":"","sources":["../src/lib/interact-for-acs-user.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAA;AACvC,OAAO,EAAE,oBAAoB,EAAE,MAAM,8BAA8B,CAAA;AACnE,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAA;AAEhE,MAAM,CAAC,MAAM,kBAAkB,GAAG,KAAK,IAAI,EAAE;IAC3C,MAAM,IAAI,GAAG,MAAM,OAAO,EAAE,CAAA;IAE5B,MAAM,aAAa,GAAG,MAAM,oBAAoB,CAC9C,8CAA8C,CAC/C,CAAA;IAED,OAAO,mBAAmB,CAAC;QACzB,YAAY,EAAE,UAAU;QACxB,cAAc,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,aAAa,EAAE,CAAC;QAC5D,QAAQ,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;YACnB,KAAK,EAAE,GAAG,IAAI,CAAC,YAAY,IAAI,IAAI,CAAC,aAAa,EAAE;YACnD,KAAK,EAAE,IAAI,CAAC,WAAW;YACvB,WAAW,EAAE,IAAI,CAAC,WAAW;SAC9B,CAAC;KACH,CAAC,CAAA;AACJ,CAAC,CAAA"}
@@ -0,0 +1,2 @@
1
+ import type { ActionAttemptsGetResponse } from '@seamapi/http/connect';
2
+ export declare const interactForActionAttemptPoll: (action_attempt: ActionAttemptsGetResponse["action_attempt"]) => Promise<void>;
@@ -0,0 +1,22 @@
1
+ import prompts from 'prompts';
2
+ import { getSeam } from './get-seam.js';
3
+ import { withLoading } from './util/with-loading.js';
4
+ export const interactForActionAttemptPoll = async (action_attempt) => {
5
+ if (action_attempt.status === 'pending') {
6
+ const { poll_for_action_attempt } = await prompts({
7
+ name: 'poll_for_action_attempt',
8
+ message: "Would you like to poll the action attempt until it's ready?",
9
+ type: 'toggle',
10
+ initial: true,
11
+ active: 'yes',
12
+ inactive: 'no',
13
+ });
14
+ if (poll_for_action_attempt) {
15
+ const seam = await getSeam();
16
+ const { action_attempt_id } = action_attempt;
17
+ const updated_action_attempt = await withLoading('Polling action attempt...', () => seam.actionAttempts.get({ action_attempt_id }, { waitForActionAttempt: { pollingInterval: 240, timeout: 10_000 } }));
18
+ console.dir(updated_action_attempt, { depth: null });
19
+ }
20
+ }
21
+ };
22
+ //# sourceMappingURL=interact-for-action-attempt-poll.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"interact-for-action-attempt-poll.js","sourceRoot":"","sources":["../src/lib/interact-for-action-attempt-poll.ts"],"names":[],"mappings":"AACA,OAAO,OAAO,MAAM,SAAS,CAAA;AAE7B,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAA;AACvC,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAA;AAEpD,MAAM,CAAC,MAAM,4BAA4B,GAAG,KAAK,EAC/C,cAA2D,EAC3D,EAAE;IACF,IAAI,cAAc,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;QACxC,MAAM,EAAE,uBAAuB,EAAE,GAAG,MAAM,OAAO,CAAC;YAChD,IAAI,EAAE,yBAAyB;YAC/B,OAAO,EAAE,6DAA6D;YACtE,IAAI,EAAE,QAAQ;YACd,OAAO,EAAE,IAAI;YACb,MAAM,EAAE,KAAK;YACb,QAAQ,EAAE,IAAI;SACf,CAAC,CAAA;QAEF,IAAI,uBAAuB,EAAE,CAAC;YAC5B,MAAM,IAAI,GAAG,MAAM,OAAO,EAAE,CAAA;YAC5B,MAAM,EAAE,iBAAiB,EAAE,GAAG,cAAc,CAAA;YAE5C,MAAM,sBAAsB,GAAG,MAAM,WAAW,CAC9C,2BAA2B,EAC3B,GAAG,EAAE,CACH,IAAI,CAAC,cAAc,CAAC,GAAG,CACrB,EAAE,iBAAiB,EAAE,EACrB,EAAE,oBAAoB,EAAE,EAAE,eAAe,EAAE,GAAG,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE,CACpE,CACJ,CAAA;YACD,OAAO,CAAC,GAAG,CAAC,sBAAsB,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAA;QACtD,CAAC;IACH,CAAC;AACH,CAAC,CAAA"}
@@ -0,0 +1 @@
1
+ export declare const interactForArray: (array: string[], message: string) => Promise<string[]>;