@wat-toolbox/wat 0.1.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 (63) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +62 -0
  3. package/dist/cli/commands/availability.d.ts +10 -0
  4. package/dist/cli/commands/availability.d.ts.map +1 -0
  5. package/dist/cli/commands/availability.js +83 -0
  6. package/dist/cli/commands/availability.js.map +1 -0
  7. package/dist/cli/commands/bookings.d.ts +12 -0
  8. package/dist/cli/commands/bookings.d.ts.map +1 -0
  9. package/dist/cli/commands/bookings.js +195 -0
  10. package/dist/cli/commands/bookings.js.map +1 -0
  11. package/dist/cli/commands/config.d.ts +7 -0
  12. package/dist/cli/commands/config.d.ts.map +1 -0
  13. package/dist/cli/commands/config.js +59 -0
  14. package/dist/cli/commands/config.js.map +1 -0
  15. package/dist/cli/commands/login.d.ts +11 -0
  16. package/dist/cli/commands/login.d.ts.map +1 -0
  17. package/dist/cli/commands/login.js +127 -0
  18. package/dist/cli/commands/login.js.map +1 -0
  19. package/dist/cli/commands/logout.d.ts +8 -0
  20. package/dist/cli/commands/logout.d.ts.map +1 -0
  21. package/dist/cli/commands/logout.js +38 -0
  22. package/dist/cli/commands/logout.js.map +1 -0
  23. package/dist/cli/commands/rooms.d.ts +22 -0
  24. package/dist/cli/commands/rooms.d.ts.map +1 -0
  25. package/dist/cli/commands/rooms.js +76 -0
  26. package/dist/cli/commands/rooms.js.map +1 -0
  27. package/dist/cli/commands/whoami.d.ts +6 -0
  28. package/dist/cli/commands/whoami.d.ts.map +1 -0
  29. package/dist/cli/commands/whoami.js +37 -0
  30. package/dist/cli/commands/whoami.js.map +1 -0
  31. package/dist/cli/index.d.ts +22 -0
  32. package/dist/cli/index.d.ts.map +1 -0
  33. package/dist/cli/index.js +61 -0
  34. package/dist/cli/index.js.map +1 -0
  35. package/dist/cli/utils/output.d.ts +28 -0
  36. package/dist/cli/utils/output.d.ts.map +1 -0
  37. package/dist/cli/utils/output.js +40 -0
  38. package/dist/cli/utils/output.js.map +1 -0
  39. package/dist/cli/utils/require-key.d.ts +6 -0
  40. package/dist/cli/utils/require-key.d.ts.map +1 -0
  41. package/dist/cli/utils/require-key.js +18 -0
  42. package/dist/cli/utils/require-key.js.map +1 -0
  43. package/dist/utils/api-client.d.ts +35 -0
  44. package/dist/utils/api-client.d.ts.map +1 -0
  45. package/dist/utils/api-client.js +98 -0
  46. package/dist/utils/api-client.js.map +1 -0
  47. package/dist/utils/auth-flow-client.d.ts +60 -0
  48. package/dist/utils/auth-flow-client.d.ts.map +1 -0
  49. package/dist/utils/auth-flow-client.js +28 -0
  50. package/dist/utils/auth-flow-client.js.map +1 -0
  51. package/dist/utils/config.d.ts +95 -0
  52. package/dist/utils/config.d.ts.map +1 -0
  53. package/dist/utils/config.js +246 -0
  54. package/dist/utils/config.js.map +1 -0
  55. package/dist/utils/rooms-client.d.ts +70 -0
  56. package/dist/utils/rooms-client.d.ts.map +1 -0
  57. package/dist/utils/rooms-client.js +59 -0
  58. package/dist/utils/rooms-client.js.map +1 -0
  59. package/dist/utils/time.d.ts +37 -0
  60. package/dist/utils/time.d.ts.map +1 -0
  61. package/dist/utils/time.js +130 -0
  62. package/dist/utils/time.js.map +1 -0
  63. package/package.json +54 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"login.js","sourceRoot":"","sources":["../../../src/cli/commands/login.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAC7C,OAAO,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,iCAAiC,CAAC;AACjF,OAAO,EACL,YAAY,EACZ,iBAAiB,EACjB,YAAY,EACZ,UAAU,EACV,gBAAgB,EAChB,aAAa,EACb,cAAc,EACd,qBAAqB,EACtB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,EAAE,aAAa,EAAE,eAAe,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAYxG,KAAK,UAAU,MAAM,CAAC,QAAgB;IACpC,MAAM,EAAE,GAAG,eAAe,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;IAC7D,IAAI,CAAC;QACH,OAAO,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IAC9C,CAAC;YAAS,CAAC;QACT,EAAE,CAAC,KAAK,EAAE,CAAC;IACb,CAAC;AACH,CAAC;AAED,MAAM,CAAC,MAAM,YAAY,GAAG,IAAI,OAAO,CAAC,OAAO,CAAC;KAC7C,WAAW,CAAC,4CAA4C,CAAC;KACzD,MAAM,CAAC,iBAAiB,EAAE,oCAAoC,CAAC;KAC/D,MAAM,CAAC,eAAe,EAAE,iDAAiD,CAAC;KAC1E,MAAM,CAAC,sBAAsB,EAAE,gDAAgD,CAAC;KAChF,MAAM,CAAC,uBAAuB,EAAE,8CAA8C,CAAC;KAC/E,MAAM,CAAC,mBAAmB,EAAE,4CAA4C,CAAC;KACzE,MAAM,CAAC,iBAAiB,EAAE,2BAA2B,CAAC;KACtD,MAAM,CAAC,QAAQ,EAAE,gBAAgB,CAAC;KAClC,MAAM,CAAC,KAAK,EAAE,OAAgB,EAAE,EAAE;IACjC,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,IAAI,CAAC,MAAM,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC;IACzD,IAAI,CAAC,KAAK;QAAE,SAAS,CAAC,EAAE,OAAO,EAAE,uBAAuB,EAAE,CAAC,CAAC;IAE5D,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;QAClB,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAChB,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,WAAW,cAAc,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,qBAAqB,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;IAC3G,CAAC;IAED,sBAAsB;IACtB,MAAM,GAAG,GAAG,MAAM,eAAe,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IACtE,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC;QACjB,IAAI,OAAO,CAAC,IAAI;YAAE,aAAa,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;;YAClD,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QAC1B,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,iDAAiD;IACjD,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,IAAI,CAAC,MAAM,MAAM,CAAC,wBAAwB,CAAC,CAAC,CAAC;IACtE,IAAI,CAAC,IAAI;QAAE,SAAS,CAAC,EAAE,OAAO,EAAE,kCAAkC,EAAE,CAAC,CAAC;IAEtE,yEAAyE;IACzE,sEAAsE;IACtE,IAAI,UAAU,GAAG,OAAO,CAAC,UAAU,CAAC;IACpC,IAAI,MAAM,GAAG,MAAM,aAAa,CAAC;QAC/B,KAAK;QACL,IAAI;QACJ,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACrC,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACjE,OAAO,EAAE,OAAO,CAAC,MAAM;KACxB,CAAC,CAAC;IAEH,IAAI,CAAC,MAAM,CAAC,OAAO,IAAI,MAAM,CAAC,KAAK,CAAC,IAAI,KAAK,gBAAgB,IAAI,CAAC,UAAU,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;QAC9F,UAAU,GAAG,MAAM,MAAM,CAAC,sCAAsC,CAAC,CAAC;QAClE,IAAI,UAAU,EAAE,CAAC;YACf,MAAM,GAAG,MAAM,aAAa,CAAC;gBAC3B,KAAK;gBACL,IAAI;gBACJ,UAAU;gBACV,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBACjE,OAAO,EAAE,OAAO,CAAC,MAAM;aACxB,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;QACpB,IAAI,OAAO,CAAC,IAAI;YAAE,aAAa,CAAC,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;;YACxD,SAAS,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAC7B,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,4CAA4C;IAC5C,MAAM,aAAa,GAAG,IAAI,GAAG,CAAC,YAAY,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;IACjE,MAAM,WAAW,GACf,OAAO,CAAC,WAAW;QACnB,iBAAiB,CACf;YACE,KAAK,EAAE,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK;YAC/B,OAAO,EAAE,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI;YAChC,SAAS,EAAE,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS;SACxC,EACD,aAAa,CACd,CAAC;IAEJ,aAAa,CAAC,WAAW,EAAE;QACzB,MAAM,EAAE,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG;QAC9B,KAAK,EAAE,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK;QAC/B,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI;QAC7B,OAAO,EAAE,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI;QAChC,SAAS,EAAE,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS;QACvC,SAAS,EAAE,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS;QACvC,SAAS,EAAE,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,IAAI,IAAI;QAC/C,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KACvD,CAAC,CAAC;IACH,gBAAgB,CAAC,WAAW,CAAC,CAAC;IAE9B,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;QACjB,eAAe,CAAC;YACd,WAAW;YACX,OAAO,EAAE,MAAM,CAAC,IAAI,CAAC,OAAO;YAC5B,MAAM,EAAE,MAAM,CAAC,IAAI,CAAC,MAAM;YAC1B,MAAM,EAAE;gBACN,KAAK,EAAE,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK;gBAC/B,SAAS,EAAE,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS;gBACvC,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI;gBAC7B,SAAS,EAAE,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS;gBACvC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,IAAI,EAAE,SAAS,EAAE,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC;aACjF;SACF,CAAC,CAAC;QACH,OAAO;IACT,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAChB,OAAO,CAAC,GAAG,CAAC,GAAG,KAAK,IAAI,KAAK,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC;IAC9C,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAChB,OAAO,CAAC,GAAG,CAAC,eAAe,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,KAAK,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,GAAG,CAAC,CAAC;IACpF,OAAO,CAAC,GAAG,CAAC,eAAe,WAAW,IAAI,IAAI,CAAC,cAAc,CAAC,EAAE,CAAC,CAAC;IAClE,OAAO,CAAC,GAAG,CAAC,eAAe,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IACjE,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAChB,OAAO,CAAC,GAAG,CAAC,eAAe,IAAI,CAAC,GAAG,YAAY,aAAa,CAAC,EAAE,CAAC,CAAC;IACjE,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * `wat logout` — remove the active profile (or --all to clear every profile).
3
+ * This only deletes the LOCAL copy of the key; revoke it server-side from the
4
+ * web app's settings page if you need it dead everywhere.
5
+ */
6
+ import { Command } from 'commander';
7
+ export declare const logoutCommand: Command;
8
+ //# sourceMappingURL=logout.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logout.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/logout.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AASpC,eAAO,MAAM,aAAa,SAyBtB,CAAC"}
@@ -0,0 +1,38 @@
1
+ /**
2
+ * `wat logout` — remove the active profile (or --all to clear every profile).
3
+ * This only deletes the LOCAL copy of the key; revoke it server-side from the
4
+ * web app's settings page if you need it dead everywhere.
5
+ */
6
+ import { Command } from 'commander';
7
+ import { clearConfig, getActiveProfile, removeProfile, listProfiles } from '../../utils/config.js';
8
+ import { CHECK, emitJsonSuccess, green, yellow } from '../utils/output.js';
9
+ export const logoutCommand = new Command('logout')
10
+ .description('Remove the local API key (active profile, or --all)')
11
+ .option('--all', 'Remove every saved profile')
12
+ .option('--json', 'Output as JSON')
13
+ .action((options) => {
14
+ if (options.all) {
15
+ clearConfig();
16
+ if (options.json)
17
+ emitJsonSuccess({ removed: 'all' });
18
+ else
19
+ console.log(`${CHECK} ${green('Removed all profiles.')}`);
20
+ return;
21
+ }
22
+ const active = getActiveProfile();
23
+ if (!active) {
24
+ if (options.json)
25
+ emitJsonSuccess({ removed: null });
26
+ else
27
+ console.log(yellow('No active profile to remove.'));
28
+ return;
29
+ }
30
+ removeProfile(active.name);
31
+ if (options.json) {
32
+ emitJsonSuccess({ removed: active.name, remaining: listProfiles().map((p) => p.name) });
33
+ }
34
+ else {
35
+ console.log(`${CHECK} ${green(`Removed profile "${active.name}".`)}`);
36
+ }
37
+ });
38
+ //# sourceMappingURL=logout.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logout.js","sourceRoot":"","sources":["../../../src/cli/commands/logout.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EACL,WAAW,EACX,gBAAgB,EAChB,aAAa,EACb,YAAY,EACb,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,KAAK,EAAE,eAAe,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAE3E,MAAM,CAAC,MAAM,aAAa,GAAG,IAAI,OAAO,CAAC,QAAQ,CAAC;KAC/C,WAAW,CAAC,qDAAqD,CAAC;KAClE,MAAM,CAAC,OAAO,EAAE,4BAA4B,CAAC;KAC7C,MAAM,CAAC,QAAQ,EAAE,gBAAgB,CAAC;KAClC,MAAM,CAAC,CAAC,OAA0C,EAAE,EAAE;IACrD,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;QAChB,WAAW,EAAE,CAAC;QACd,IAAI,OAAO,CAAC,IAAI;YAAE,eAAe,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC;;YACjD,OAAO,CAAC,GAAG,CAAC,GAAG,KAAK,IAAI,KAAK,CAAC,uBAAuB,CAAC,EAAE,CAAC,CAAC;QAC/D,OAAO;IACT,CAAC;IAED,MAAM,MAAM,GAAG,gBAAgB,EAAE,CAAC;IAClC,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,IAAI,OAAO,CAAC,IAAI;YAAE,eAAe,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;;YAChD,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,8BAA8B,CAAC,CAAC,CAAC;QACzD,OAAO;IACT,CAAC;IAED,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IAC3B,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;QACjB,eAAe,CAAC,EAAE,OAAO,EAAE,MAAM,CAAC,IAAI,EAAE,SAAS,EAAE,YAAY,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC1F,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,GAAG,CAAC,GAAG,KAAK,IAAI,KAAK,CAAC,oBAAoB,MAAM,CAAC,IAAI,IAAI,CAAC,EAAE,CAAC,CAAC;IACxE,CAAC;AACH,CAAC,CAAC,CAAC"}
@@ -0,0 +1,22 @@
1
+ /**
2
+ * `wat rooms list` — list the active meeting rooms.
3
+ */
4
+ import { Command } from 'commander';
5
+ import { type Room } from '../../utils/rooms-client.js';
6
+ export declare const roomsCommand: Command;
7
+ /**
8
+ * Resolve a `--room` argument to a room id. Accepts either a room id (UUID-ish:
9
+ * returned as-is after confirming it exists) or a case-insensitive name match.
10
+ * Shared by `availability` and `bookings create`.
11
+ */
12
+ export declare function resolveRoom(apiKey: string, baseUrl: string | undefined, roomArg: string): Promise<{
13
+ ok: true;
14
+ room: Room;
15
+ } | {
16
+ ok: false;
17
+ error: {
18
+ code: string;
19
+ message: string;
20
+ };
21
+ }>;
22
+ //# sourceMappingURL=rooms.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rooms.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/rooms.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAa,KAAK,IAAI,EAAE,MAAM,6BAA6B,CAAC;AAInE,eAAO,MAAM,YAAY,SAAoD,CAAC;AAsC9E;;;;GAIG;AACH,wBAAsB,WAAW,CAC/B,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,MAAM,GAAG,SAAS,EAC3B,OAAO,EAAE,MAAM,GACd,OAAO,CAAC;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,IAAI,EAAE,IAAI,CAAA;CAAE,GAAG;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAA;CAAE,CAAC,CAyB7F"}
@@ -0,0 +1,76 @@
1
+ /**
2
+ * `wat rooms list` — list the active meeting rooms.
3
+ */
4
+ import { Command } from 'commander';
5
+ import { listRooms } from '../../utils/rooms-client.js';
6
+ import { emitJsonError, emitJsonSuccess, failHuman, bold, dim } from '../utils/output.js';
7
+ import { requireApiKey } from '../utils/require-key.js';
8
+ export const roomsCommand = new Command('rooms').description('Meeting rooms');
9
+ roomsCommand
10
+ .command('list')
11
+ .description('List active rooms')
12
+ .option('--api-key <key>', 'API key (overrides the saved profile)')
13
+ .option('--api-url <url>', 'Override the API base URL')
14
+ .option('--json', 'Output as JSON')
15
+ .action(async (options) => {
16
+ const apiKey = requireApiKey(options.apiKey, options.json);
17
+ const result = await listRooms({ apiKey, baseUrl: options.apiUrl });
18
+ if (!result.success) {
19
+ if (options.json)
20
+ emitJsonError(result.error, result.status);
21
+ else
22
+ failHuman(result.error);
23
+ process.exit(1);
24
+ }
25
+ const rooms = result.data.rooms ?? [];
26
+ if (options.json) {
27
+ emitJsonSuccess({ rooms });
28
+ return;
29
+ }
30
+ if (rooms.length === 0) {
31
+ console.log(dim('No rooms.'));
32
+ return;
33
+ }
34
+ console.log('');
35
+ for (const r of rooms) {
36
+ const cap = r.capacity != null ? ` · ${r.capacity} seats` : '';
37
+ console.log(`${bold(r.name)}${dim(cap)}`);
38
+ if (r.description)
39
+ console.log(` ${dim(r.description)}`);
40
+ console.log(` ${dim('id: ' + r.id)}`);
41
+ }
42
+ console.log('');
43
+ });
44
+ /**
45
+ * Resolve a `--room` argument to a room id. Accepts either a room id (UUID-ish:
46
+ * returned as-is after confirming it exists) or a case-insensitive name match.
47
+ * Shared by `availability` and `bookings create`.
48
+ */
49
+ export async function resolveRoom(apiKey, baseUrl, roomArg) {
50
+ const result = await listRooms({ apiKey, baseUrl });
51
+ if (!result.success)
52
+ return { ok: false, error: result.error };
53
+ const rooms = result.data.rooms ?? [];
54
+ const arg = roomArg.trim();
55
+ const byId = rooms.find((r) => r.id === arg);
56
+ if (byId)
57
+ return { ok: true, room: byId };
58
+ const lc = arg.toLowerCase();
59
+ const matches = rooms.filter((r) => r.name.toLowerCase() === lc);
60
+ if (matches.length === 1)
61
+ return { ok: true, room: matches[0] };
62
+ if (matches.length > 1) {
63
+ return {
64
+ ok: false,
65
+ error: { code: 'AMBIGUOUS_ROOM', message: `Multiple rooms named "${roomArg}". Pass the room id instead.` }
66
+ };
67
+ }
68
+ return {
69
+ ok: false,
70
+ error: {
71
+ code: 'ROOM_NOT_FOUND',
72
+ message: `No active room matches "${roomArg}". Run 'wat rooms list' to see ids + names.`
73
+ }
74
+ };
75
+ }
76
+ //# sourceMappingURL=rooms.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rooms.js","sourceRoot":"","sources":["../../../src/cli/commands/rooms.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * `wat whoami` — verify the stored API key and print the resolved member + role.
3
+ */
4
+ import { Command } from 'commander';
5
+ export declare const whoamiCommand: Command;
6
+ //# sourceMappingURL=whoami.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"whoami.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/whoami.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAKpC,eAAO,MAAM,aAAa,SA6BtB,CAAC"}
@@ -0,0 +1,37 @@
1
+ /**
2
+ * `wat whoami` — verify the stored API key and print the resolved member + role.
3
+ */
4
+ import { Command } from 'commander';
5
+ import { verifyApiKey } from '../../utils/auth-flow-client.js';
6
+ import { CHECK, cyan, emitJsonError, emitJsonSuccess, failHuman, green } from '../utils/output.js';
7
+ import { requireApiKey } from '../utils/require-key.js';
8
+ export const whoamiCommand = new Command('whoami')
9
+ .description('Verify the stored API key and show the member + role')
10
+ .option('--api-key <key>', 'API key (overrides the saved profile)')
11
+ .option('--api-url <url>', 'Override the API base URL')
12
+ .option('--json', 'Output as JSON')
13
+ .action(async (options) => {
14
+ const apiKey = requireApiKey(options.apiKey, options.json);
15
+ const result = await verifyApiKey({ apiKey, baseUrl: options.apiUrl });
16
+ if (!result.success) {
17
+ if (options.json)
18
+ emitJsonError(result.error, result.status);
19
+ else
20
+ failHuman(result.error);
21
+ process.exit(1);
22
+ }
23
+ if (options.json) {
24
+ emitJsonSuccess(result.data);
25
+ return;
26
+ }
27
+ console.log('');
28
+ console.log(`${CHECK} ${green('Authenticated')}`);
29
+ console.log('');
30
+ console.log(` Member: ${result.data.email} (${cyan(result.data.role)})`);
31
+ console.log(` Key: ${result.data.keyName} [${result.data.keyPrefix}]`);
32
+ if (result.data.expiresAt) {
33
+ console.log(` Expires: ${new Date(result.data.expiresAt).toLocaleDateString()}`);
34
+ }
35
+ console.log('');
36
+ });
37
+ //# sourceMappingURL=whoami.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"whoami.js","sourceRoot":"","sources":["../../../src/cli/commands/whoami.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,YAAY,EAAE,MAAM,iCAAiC,CAAC;AAC/D,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,aAAa,EAAE,eAAe,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AACnG,OAAO,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAExD,MAAM,CAAC,MAAM,aAAa,GAAG,IAAI,OAAO,CAAC,QAAQ,CAAC;KAC/C,WAAW,CAAC,sDAAsD,CAAC;KACnE,MAAM,CAAC,iBAAiB,EAAE,uCAAuC,CAAC;KAClE,MAAM,CAAC,iBAAiB,EAAE,2BAA2B,CAAC;KACtD,MAAM,CAAC,QAAQ,EAAE,gBAAgB,CAAC;KAClC,MAAM,CAAC,KAAK,EAAE,OAA6D,EAAE,EAAE;IAC9E,MAAM,MAAM,GAAG,aAAa,CAAC,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;IAC3D,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IAEvE,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;QACpB,IAAI,OAAO,CAAC,IAAI;YAAE,aAAa,CAAC,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;;YACxD,SAAS,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAC7B,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;QACjB,eAAe,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QAC7B,OAAO;IACT,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAChB,OAAO,CAAC,GAAG,CAAC,GAAG,KAAK,IAAI,KAAK,CAAC,eAAe,CAAC,EAAE,CAAC,CAAC;IAClD,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAChB,OAAO,CAAC,GAAG,CAAC,cAAc,MAAM,CAAC,IAAI,CAAC,KAAK,KAAK,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC3E,OAAO,CAAC,GAAG,CAAC,cAAc,MAAM,CAAC,IAAI,CAAC,OAAO,KAAK,MAAM,CAAC,IAAI,CAAC,SAAS,GAAG,CAAC,CAAC;IAC5E,IAAI,MAAM,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC;QAC1B,OAAO,CAAC,GAAG,CAAC,cAAc,IAAI,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,kBAAkB,EAAE,EAAE,CAAC,CAAC;IACpF,CAAC;IACD,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
@@ -0,0 +1,22 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * wat
4
+ *
5
+ * Command-line interface for WAT Rooms. Book WAT meeting rooms from the terminal,
6
+ * driving the SAME public API the web app uses. Scaffolded from
7
+ * codika-cli-template, mirroring the codika-meet CLI's --env + config model.
8
+ *
9
+ * Usage:
10
+ * wat login
11
+ * wat rooms list
12
+ * wat availability --room "Room A" --from 2026-06-09 --to 2026-06-10
13
+ * wat bookings list --mine
14
+ * wat bookings create --room "Room A" --start "2026-06-09T10:00" --end "2026-06-09T11:00" --title "Sync"
15
+ * wat bookings cancel <id>
16
+ *
17
+ * wat --env dev <command> # target the dev/stag deployment (development data)
18
+ *
19
+ * Run `wat --help` for the full command list.
20
+ */
21
+ export {};
22
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":";AACA;;;;;;;;;;;;;;;;;;GAkBG"}
@@ -0,0 +1,61 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * wat
4
+ *
5
+ * Command-line interface for WAT Rooms. Book WAT meeting rooms from the terminal,
6
+ * driving the SAME public API the web app uses. Scaffolded from
7
+ * codika-cli-template, mirroring the codika-meet CLI's --env + config model.
8
+ *
9
+ * Usage:
10
+ * wat login
11
+ * wat rooms list
12
+ * wat availability --room "Room A" --from 2026-06-09 --to 2026-06-10
13
+ * wat bookings list --mine
14
+ * wat bookings create --room "Room A" --start "2026-06-09T10:00" --end "2026-06-09T11:00" --title "Sync"
15
+ * wat bookings cancel <id>
16
+ *
17
+ * wat --env dev <command> # target the dev/stag deployment (development data)
18
+ *
19
+ * Run `wat --help` for the full command list.
20
+ */
21
+ import { program } from 'commander';
22
+ import { createRequire } from 'module';
23
+ import { loginCommand } from './commands/login.js';
24
+ import { whoamiCommand } from './commands/whoami.js';
25
+ import { logoutCommand } from './commands/logout.js';
26
+ import { configCommand } from './commands/config.js';
27
+ import { roomsCommand } from './commands/rooms.js';
28
+ import { availabilityCommand } from './commands/availability.js';
29
+ import { bookingsCommand } from './commands/bookings.js';
30
+ import { PROGRAM_NAME, parseEnvTarget, setEnvTarget } from '../utils/config.js';
31
+ import { yellow } from './utils/output.js';
32
+ const require = createRequire(import.meta.url);
33
+ const { version: VERSION } = require('../../package.json');
34
+ program
35
+ .name(PROGRAM_NAME)
36
+ .description('wat — book WAT meeting rooms from the terminal')
37
+ .version(VERSION)
38
+ .option('--env <dev|prod>', 'Target deployment (default: prod; or WAT_CLI_ENV)');
39
+ program.addCommand(loginCommand);
40
+ program.addCommand(whoamiCommand);
41
+ program.addCommand(logoutCommand);
42
+ program.addCommand(configCommand);
43
+ program.addCommand(roomsCommand);
44
+ program.addCommand(availabilityCommand);
45
+ program.addCommand(bookingsCommand);
46
+ // Resolve the global `--env` target before any command runs, so every base-URL
47
+ // resolution (login, Bearer calls) honors it.
48
+ program.hook('preAction', (thisCommand) => {
49
+ const envOpt = thisCommand.opts().env;
50
+ if (envOpt !== undefined) {
51
+ const parsed = parseEnvTarget(envOpt);
52
+ if (!parsed) {
53
+ process.stderr.write(yellow(`⚠ Invalid --env "${envOpt}"; expected "dev" or "prod". Ignoring.`) + '\n');
54
+ }
55
+ else {
56
+ setEnvTarget(parsed);
57
+ }
58
+ }
59
+ });
60
+ program.parse();
61
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":";AACA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,aAAa,EAAE,MAAM,QAAQ,CAAC;AAEvC,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AACjE,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAChF,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAE3C,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAC/C,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAAC;AAE3D,OAAO;KACJ,IAAI,CAAC,YAAY,CAAC;KAClB,WAAW,CAAC,gDAAgD,CAAC;KAC7D,OAAO,CAAC,OAAO,CAAC;KAChB,MAAM,CAAC,kBAAkB,EAAE,mDAAmD,CAAC,CAAC;AAEnF,OAAO,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC;AACjC,OAAO,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC;AAClC,OAAO,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC;AAClC,OAAO,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC;AAClC,OAAO,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC;AACjC,OAAO,CAAC,UAAU,CAAC,mBAAmB,CAAC,CAAC;AACxC,OAAO,CAAC,UAAU,CAAC,eAAe,CAAC,CAAC;AAEpC,+EAA+E;AAC/E,8CAA8C;AAC9C,OAAO,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,WAAW,EAAE,EAAE;IACxC,MAAM,MAAM,GAAG,WAAW,CAAC,IAAI,EAAE,CAAC,GAAyB,CAAC;IAC5D,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;QACzB,MAAM,MAAM,GAAG,cAAc,CAAC,MAAM,CAAC,CAAC;QACtC,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,MAAM,CAAC,oBAAoB,MAAM,wCAAwC,CAAC,GAAG,IAAI,CAClF,CAAC;QACJ,CAAC;aAAM,CAAC;YACN,YAAY,CAAC,MAAM,CAAC,CAAC;QACvB,CAAC;IACH,CAAC;AACH,CAAC,CAAC,CAAC;AAEH,OAAO,CAAC,KAAK,EAAE,CAAC"}
@@ -0,0 +1,28 @@
1
+ /**
2
+ * CLI output utilities — colored text for humans, --json for machines.
3
+ */
4
+ export declare const red: (s: string) => string;
5
+ export declare const green: (s: string) => string;
6
+ export declare const yellow: (s: string) => string;
7
+ export declare const cyan: (s: string) => string;
8
+ export declare const dim: (s: string) => string;
9
+ export declare const bold: (s: string) => string;
10
+ export declare const CHECK: string;
11
+ export declare const CROSS: string;
12
+ export declare const DOT = "\u25CF";
13
+ export declare function emitJsonSuccess(data: unknown): void;
14
+ export declare function emitJsonError(error: {
15
+ code: string;
16
+ message: string;
17
+ nextAction?: string;
18
+ details?: unknown;
19
+ }, status?: number): void;
20
+ /** Print a structured error to stderr (human form) and exit 1. */
21
+ export declare function failHuman(error: {
22
+ code?: string;
23
+ message: string;
24
+ nextAction?: string;
25
+ }): never;
26
+ /** Print a fatal error and exit. */
27
+ export declare function exitWithError(message: string, code?: number): never;
28
+ //# sourceMappingURL=output.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"output.d.ts","sourceRoot":"","sources":["../../../src/cli/utils/output.ts"],"names":[],"mappings":"AAAA;;GAEG;AAUH,eAAO,MAAM,GAAG,GAAI,GAAG,MAAM,KAAG,MAA8B,CAAC;AAC/D,eAAO,MAAM,KAAK,GAAI,GAAG,MAAM,KAAG,MAAgC,CAAC;AACnE,eAAO,MAAM,MAAM,GAAI,GAAG,MAAM,KAAG,MAAiC,CAAC;AACrE,eAAO,MAAM,IAAI,GAAI,GAAG,MAAM,KAAG,MAA+B,CAAC;AACjE,eAAO,MAAM,GAAG,GAAI,GAAG,MAAM,KAAG,MAA8B,CAAC;AAC/D,eAAO,MAAM,IAAI,GAAI,GAAG,MAAM,KAAG,MAA+B,CAAC;AAEjE,eAAO,MAAM,KAAK,QAAa,CAAC;AAChC,eAAO,MAAM,KAAK,QAAW,CAAC;AAC9B,eAAO,MAAM,GAAG,WAAM,CAAC;AAEvB,wBAAgB,eAAe,CAAC,IAAI,EAAE,OAAO,GAAG,IAAI,CAEnD;AAED,wBAAgB,aAAa,CAC3B,KAAK,EAAE;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,OAAO,CAAA;CAAE,EAChF,MAAM,CAAC,EAAE,MAAM,GACd,IAAI,CAIN;AAED,kEAAkE;AAClE,wBAAgB,SAAS,CAAC,KAAK,EAAE;IAC/B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB,GAAG,KAAK,CAMR;AAED,oCAAoC;AACpC,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,SAAI,GAAG,KAAK,CAG9D"}
@@ -0,0 +1,40 @@
1
+ /**
2
+ * CLI output utilities — colored text for humans, --json for machines.
3
+ */
4
+ const RESET = '\x1b[0m';
5
+ const RED = '\x1b[31m';
6
+ const GREEN = '\x1b[32m';
7
+ const YELLOW = '\x1b[33m';
8
+ const CYAN = '\x1b[36m';
9
+ const DIM = '\x1b[2m';
10
+ const BOLD = '\x1b[1m';
11
+ export const red = (s) => `${RED}${s}${RESET}`;
12
+ export const green = (s) => `${GREEN}${s}${RESET}`;
13
+ export const yellow = (s) => `${YELLOW}${s}${RESET}`;
14
+ export const cyan = (s) => `${CYAN}${s}${RESET}`;
15
+ export const dim = (s) => `${DIM}${s}${RESET}`;
16
+ export const bold = (s) => `${BOLD}${s}${RESET}`;
17
+ export const CHECK = green('✓');
18
+ export const CROSS = red('✗');
19
+ export const DOT = '●';
20
+ export function emitJsonSuccess(data) {
21
+ console.log(JSON.stringify({ success: true, data }, null, 2));
22
+ }
23
+ export function emitJsonError(error, status) {
24
+ console.log(JSON.stringify({ success: false, ...(status !== undefined && { status }), error }, null, 2));
25
+ }
26
+ /** Print a structured error to stderr (human form) and exit 1. */
27
+ export function failHuman(error) {
28
+ console.error('');
29
+ console.error(`${CROSS} ${red(error.message)}`);
30
+ if (error.nextAction)
31
+ console.error(` ${yellow('next:')} ${error.nextAction}`);
32
+ console.error('');
33
+ process.exit(1);
34
+ }
35
+ /** Print a fatal error and exit. */
36
+ export function exitWithError(message, code = 1) {
37
+ console.error(`${red('Error:')} ${message}`);
38
+ process.exit(code);
39
+ }
40
+ //# sourceMappingURL=output.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"output.js","sourceRoot":"","sources":["../../../src/cli/utils/output.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,KAAK,GAAG,SAAS,CAAC;AACxB,MAAM,GAAG,GAAG,UAAU,CAAC;AACvB,MAAM,KAAK,GAAG,UAAU,CAAC;AACzB,MAAM,MAAM,GAAG,UAAU,CAAC;AAC1B,MAAM,IAAI,GAAG,UAAU,CAAC;AACxB,MAAM,GAAG,GAAG,SAAS,CAAC;AACtB,MAAM,IAAI,GAAG,SAAS,CAAC;AAEvB,MAAM,CAAC,MAAM,GAAG,GAAG,CAAC,CAAS,EAAU,EAAE,CAAC,GAAG,GAAG,GAAG,CAAC,GAAG,KAAK,EAAE,CAAC;AAC/D,MAAM,CAAC,MAAM,KAAK,GAAG,CAAC,CAAS,EAAU,EAAE,CAAC,GAAG,KAAK,GAAG,CAAC,GAAG,KAAK,EAAE,CAAC;AACnE,MAAM,CAAC,MAAM,MAAM,GAAG,CAAC,CAAS,EAAU,EAAE,CAAC,GAAG,MAAM,GAAG,CAAC,GAAG,KAAK,EAAE,CAAC;AACrE,MAAM,CAAC,MAAM,IAAI,GAAG,CAAC,CAAS,EAAU,EAAE,CAAC,GAAG,IAAI,GAAG,CAAC,GAAG,KAAK,EAAE,CAAC;AACjE,MAAM,CAAC,MAAM,GAAG,GAAG,CAAC,CAAS,EAAU,EAAE,CAAC,GAAG,GAAG,GAAG,CAAC,GAAG,KAAK,EAAE,CAAC;AAC/D,MAAM,CAAC,MAAM,IAAI,GAAG,CAAC,CAAS,EAAU,EAAE,CAAC,GAAG,IAAI,GAAG,CAAC,GAAG,KAAK,EAAE,CAAC;AAEjE,MAAM,CAAC,MAAM,KAAK,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC;AAChC,MAAM,CAAC,MAAM,KAAK,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC;AAC9B,MAAM,CAAC,MAAM,GAAG,GAAG,GAAG,CAAC;AAEvB,MAAM,UAAU,eAAe,CAAC,IAAa;IAC3C,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;AAChE,CAAC;AAED,MAAM,UAAU,aAAa,CAC3B,KAAgF,EAChF,MAAe;IAEf,OAAO,CAAC,GAAG,CACT,IAAI,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,GAAG,CAAC,MAAM,KAAK,SAAS,IAAI,EAAE,MAAM,EAAE,CAAC,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,CAC5F,CAAC;AACJ,CAAC;AAED,kEAAkE;AAClE,MAAM,UAAU,SAAS,CAAC,KAIzB;IACC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IAClB,OAAO,CAAC,KAAK,CAAC,GAAG,KAAK,IAAI,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IAChD,IAAI,KAAK,CAAC,UAAU;QAAE,OAAO,CAAC,KAAK,CAAC,KAAK,MAAM,CAAC,OAAO,CAAC,IAAI,KAAK,CAAC,UAAU,EAAE,CAAC,CAAC;IAChF,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IAClB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC;AAED,oCAAoC;AACpC,MAAM,UAAU,aAAa,CAAC,OAAe,EAAE,IAAI,GAAG,CAAC;IACrD,OAAO,CAAC,KAAK,CAAC,GAAG,GAAG,CAAC,QAAQ,CAAC,IAAI,OAAO,EAAE,CAAC,CAAC;IAC7C,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACrB,CAAC"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Resolve the active API key or fail with a clear "not logged in" message.
3
+ * Shared by every authenticated command.
4
+ */
5
+ export declare function requireApiKey(flagKey: string | undefined, json: boolean | undefined): string;
6
+ //# sourceMappingURL=require-key.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"require-key.d.ts","sourceRoot":"","sources":["../../../src/cli/utils/require-key.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,SAAS,EAAE,IAAI,EAAE,OAAO,GAAG,SAAS,GAAG,MAAM,CAU5F"}
@@ -0,0 +1,18 @@
1
+ /**
2
+ * Resolve the active API key or fail with a clear "not logged in" message.
3
+ * Shared by every authenticated command.
4
+ */
5
+ import { resolveApiKey, API_KEY_MISSING_MESSAGE } from '../../utils/config.js';
6
+ import { emitJsonError, failHuman } from './output.js';
7
+ export function requireApiKey(flagKey, json) {
8
+ const key = resolveApiKey(flagKey);
9
+ if (!key) {
10
+ if (json) {
11
+ emitJsonError({ code: 'NOT_LOGGED_IN', message: API_KEY_MISSING_MESSAGE });
12
+ process.exit(1);
13
+ }
14
+ failHuman({ message: 'Not logged in.', nextAction: `Run '${'wat'} login' first.` });
15
+ }
16
+ return key;
17
+ }
18
+ //# sourceMappingURL=require-key.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"require-key.js","sourceRoot":"","sources":["../../../src/cli/utils/require-key.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,aAAa,EAAE,uBAAuB,EAAE,MAAM,uBAAuB,CAAC;AAC/E,OAAO,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAEvD,MAAM,UAAU,aAAa,CAAC,OAA2B,EAAE,IAAyB;IAClF,MAAM,GAAG,GAAG,aAAa,CAAC,OAAO,CAAC,CAAC;IACnC,IAAI,CAAC,GAAG,EAAE,CAAC;QACT,IAAI,IAAI,EAAE,CAAC;YACT,aAAa,CAAC,EAAE,IAAI,EAAE,eAAe,EAAE,OAAO,EAAE,uBAAuB,EAAE,CAAC,CAAC;YAC3E,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QACD,SAAS,CAAC,EAAE,OAAO,EAAE,gBAAgB,EAAE,UAAU,EAAE,QAAQ,KAAK,gBAAgB,EAAE,CAAC,CAAC;IACtF,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC"}
@@ -0,0 +1,35 @@
1
+ /**
2
+ * Shared HTTP client.
3
+ *
4
+ * - Sends `Authorization: Bearer <key>` for authenticated calls.
5
+ * - Returns a discriminated union { success, data | error } — never throws across
6
+ * the boundary.
7
+ * - Normalizes the two response shapes the app uses: the CLI envelope
8
+ * ({ success, data | error }) from /api/cli/*, and the plain JSON the shared
9
+ * domain endpoints return (e.g. { rooms }, { bookings }, { error }).
10
+ */
11
+ export interface ApiSuccess<T> {
12
+ success: true;
13
+ data: T;
14
+ status: number;
15
+ }
16
+ export interface ApiError {
17
+ success: false;
18
+ status: number;
19
+ error: {
20
+ code: string;
21
+ message: string;
22
+ nextAction?: string;
23
+ details?: unknown;
24
+ };
25
+ }
26
+ export type ApiResult<T> = ApiSuccess<T> | ApiError;
27
+ export interface ApiCallOptions {
28
+ url: string;
29
+ method?: 'GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE';
30
+ apiKey?: string;
31
+ body?: unknown;
32
+ headers?: Record<string, string>;
33
+ }
34
+ export declare function apiCall<T = unknown>(options: ApiCallOptions): Promise<ApiResult<T>>;
35
+ //# sourceMappingURL=api-client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api-client.d.ts","sourceRoot":"","sources":["../../src/utils/api-client.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,MAAM,WAAW,UAAU,CAAC,CAAC;IAC3B,OAAO,EAAE,IAAI,CAAC;IACd,IAAI,EAAE,CAAC,CAAC;IACR,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,QAAQ;IACvB,OAAO,EAAE,KAAK,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE;QACL,IAAI,EAAE,MAAM,CAAC;QACb,OAAO,EAAE,MAAM,CAAC;QAChB,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,OAAO,CAAC,EAAE,OAAO,CAAC;KACnB,CAAC;CACH;AAED,MAAM,MAAM,SAAS,CAAC,CAAC,IAAI,UAAU,CAAC,CAAC,CAAC,GAAG,QAAQ,CAAC;AAEpD,MAAM,WAAW,cAAc;IAC7B,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,CAAC,EAAE,KAAK,GAAG,MAAM,GAAG,KAAK,GAAG,OAAO,GAAG,QAAQ,CAAC;IACrD,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAClC;AAED,wBAAsB,OAAO,CAAC,CAAC,GAAG,OAAO,EAAE,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAwEzF"}
@@ -0,0 +1,98 @@
1
+ /**
2
+ * Shared HTTP client.
3
+ *
4
+ * - Sends `Authorization: Bearer <key>` for authenticated calls.
5
+ * - Returns a discriminated union { success, data | error } — never throws across
6
+ * the boundary.
7
+ * - Normalizes the two response shapes the app uses: the CLI envelope
8
+ * ({ success, data | error }) from /api/cli/*, and the plain JSON the shared
9
+ * domain endpoints return (e.g. { rooms }, { bookings }, { error }).
10
+ */
11
+ export async function apiCall(options) {
12
+ const method = options.method ?? 'POST';
13
+ const headers = {
14
+ Accept: 'application/json',
15
+ ...(options.headers ?? {})
16
+ };
17
+ if (options.apiKey)
18
+ headers['Authorization'] = `Bearer ${options.apiKey}`;
19
+ if (options.body !== undefined && method !== 'GET')
20
+ headers['Content-Type'] = 'application/json';
21
+ let response;
22
+ try {
23
+ response = await fetch(options.url, {
24
+ method,
25
+ headers,
26
+ body: options.body !== undefined && method !== 'GET' ? JSON.stringify(options.body) : undefined
27
+ });
28
+ }
29
+ catch (error) {
30
+ return {
31
+ success: false,
32
+ status: 0,
33
+ error: { code: 'network-error', message: error instanceof Error ? error.message : String(error) }
34
+ };
35
+ }
36
+ const text = await response.text();
37
+ let body = null;
38
+ if (text) {
39
+ try {
40
+ body = JSON.parse(text);
41
+ }
42
+ catch {
43
+ body = { raw: text };
44
+ }
45
+ }
46
+ if (!response.ok) {
47
+ return {
48
+ success: false,
49
+ status: response.status,
50
+ error: {
51
+ code: body?.error?.code || body?.code || mapStatusToCode(response.status),
52
+ message: body?.error?.message ||
53
+ (typeof body?.error === 'string' ? body.error : undefined) ||
54
+ body?.message ||
55
+ `HTTP ${response.status}: ${response.statusText}`,
56
+ ...(body?.error?.nextAction && { nextAction: body.error.nextAction }),
57
+ ...(body?.error?.details && { details: body.error.details })
58
+ }
59
+ };
60
+ }
61
+ // Explicit CLI-envelope failure.
62
+ if (body && typeof body === 'object' && body.success === false) {
63
+ return {
64
+ success: false,
65
+ status: response.status,
66
+ error: {
67
+ code: body.error?.code || 'api-error',
68
+ message: body.error?.message || 'Unknown API error',
69
+ ...(body.error?.nextAction && { nextAction: body.error.nextAction }),
70
+ ...(body.error?.details && { details: body.error.details })
71
+ }
72
+ };
73
+ }
74
+ // CLI-envelope success → unwrap data.
75
+ if (body && typeof body === 'object' && body.success === true && 'data' in body) {
76
+ return { success: true, data: body.data, status: response.status };
77
+ }
78
+ // Plain JSON from the shared domain endpoints.
79
+ return { success: true, data: body, status: response.status };
80
+ }
81
+ function mapStatusToCode(status) {
82
+ if (status === 401)
83
+ return 'unauthenticated';
84
+ if (status === 403)
85
+ return 'permission-denied';
86
+ if (status === 404)
87
+ return 'not-found';
88
+ if (status === 405)
89
+ return 'method-not-allowed';
90
+ if (status === 409)
91
+ return 'conflict';
92
+ if (status === 422)
93
+ return 'validation';
94
+ if (status >= 500)
95
+ return 'internal';
96
+ return 'http-error';
97
+ }
98
+ //# sourceMappingURL=api-client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api-client.js","sourceRoot":"","sources":["../../src/utils/api-client.ts"],"names":[],"mappings":"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"}