@leemour/max-cli 0.3.0 → 0.5.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 (144) hide show
  1. package/README.md +7 -0
  2. package/dist/bin/max.js +0 -0
  3. package/dist/cache/store.d.ts +18 -15
  4. package/dist/cache/store.d.ts.map +1 -1
  5. package/dist/cache/store.js +47 -8
  6. package/dist/cache/store.js.map +1 -1
  7. package/dist/client.d.ts +53 -10
  8. package/dist/client.d.ts.map +1 -1
  9. package/dist/client.js +252 -59
  10. package/dist/client.js.map +1 -1
  11. package/dist/commands/account.js +1 -1
  12. package/dist/commands/account.js.map +1 -1
  13. package/dist/commands/body.d.ts +23 -0
  14. package/dist/commands/body.d.ts.map +1 -0
  15. package/dist/commands/body.js +36 -0
  16. package/dist/commands/body.js.map +1 -0
  17. package/dist/commands/cache.js +2 -2
  18. package/dist/commands/cache.js.map +1 -1
  19. package/dist/commands/chats.d.ts.map +1 -1
  20. package/dist/commands/chats.js +21 -1
  21. package/dist/commands/chats.js.map +1 -1
  22. package/dist/commands/config.d.ts +3 -0
  23. package/dist/commands/config.d.ts.map +1 -0
  24. package/dist/commands/config.js +82 -0
  25. package/dist/commands/config.js.map +1 -0
  26. package/dist/commands/contacts.d.ts.map +1 -1
  27. package/dist/commands/contacts.js +20 -2
  28. package/dist/commands/contacts.js.map +1 -1
  29. package/dist/commands/context.d.ts +23 -2
  30. package/dist/commands/context.d.ts.map +1 -1
  31. package/dist/commands/context.js +43 -7
  32. package/dist/commands/context.js.map +1 -1
  33. package/dist/commands/doctor.d.ts +18 -0
  34. package/dist/commands/doctor.d.ts.map +1 -0
  35. package/dist/commands/doctor.js +72 -0
  36. package/dist/commands/doctor.js.map +1 -0
  37. package/dist/commands/messages.d.ts.map +1 -1
  38. package/dist/commands/messages.js +114 -7
  39. package/dist/commands/messages.js.map +1 -1
  40. package/dist/commands/runs.d.ts.map +1 -1
  41. package/dist/commands/runs.js +4 -6
  42. package/dist/commands/runs.js.map +1 -1
  43. package/dist/commands/session.js +2 -2
  44. package/dist/commands/session.js.map +1 -1
  45. package/dist/commands/skill.d.ts +3 -0
  46. package/dist/commands/skill.d.ts.map +1 -0
  47. package/dist/commands/skill.js +23 -0
  48. package/dist/commands/skill.js.map +1 -0
  49. package/dist/config.d.ts +80 -11
  50. package/dist/config.d.ts.map +1 -1
  51. package/dist/config.js +177 -21
  52. package/dist/config.js.map +1 -1
  53. package/dist/deadline.d.ts +30 -0
  54. package/dist/deadline.d.ts.map +1 -0
  55. package/dist/deadline.js +45 -0
  56. package/dist/deadline.js.map +1 -0
  57. package/dist/diagnose.d.ts +68 -0
  58. package/dist/diagnose.d.ts.map +1 -0
  59. package/dist/diagnose.js +115 -0
  60. package/dist/diagnose.js.map +1 -0
  61. package/dist/domain/map.js +6 -1
  62. package/dist/domain/map.js.map +1 -1
  63. package/dist/domain/models.d.ts +32 -1
  64. package/dist/domain/models.d.ts.map +1 -1
  65. package/dist/domain/models.js +11 -1
  66. package/dist/domain/models.js.map +1 -1
  67. package/dist/download.d.ts +15 -0
  68. package/dist/download.d.ts.map +1 -0
  69. package/dist/download.js +60 -0
  70. package/dist/download.js.map +1 -0
  71. package/dist/generated/client.generated.d.ts +4 -0
  72. package/dist/generated/client.generated.d.ts.map +1 -1
  73. package/dist/generated/client.generated.js +4 -0
  74. package/dist/generated/client.generated.js.map +1 -1
  75. package/dist/generated/opcodes.generated.d.ts +2 -0
  76. package/dist/generated/opcodes.generated.d.ts.map +1 -1
  77. package/dist/generated/opcodes.generated.js +2 -0
  78. package/dist/generated/opcodes.generated.js.map +1 -1
  79. package/dist/generated/operations.generated.d.ts +13 -0
  80. package/dist/generated/operations.generated.d.ts.map +1 -1
  81. package/dist/generated/operations.generated.js +3 -0
  82. package/dist/generated/operations.generated.js.map +1 -1
  83. package/dist/program.d.ts +2 -1
  84. package/dist/program.d.ts.map +1 -1
  85. package/dist/program.js +11 -0
  86. package/dist/program.js.map +1 -1
  87. package/dist/protocol/connection.d.ts.map +1 -1
  88. package/dist/protocol/connection.js +9 -0
  89. package/dist/protocol/connection.js.map +1 -1
  90. package/dist/rendering/messages.d.ts +3 -3
  91. package/dist/rendering/messages.d.ts.map +1 -1
  92. package/dist/rendering/messages.js +2 -1
  93. package/dist/rendering/messages.js.map +1 -1
  94. package/dist/runs/recording.d.ts.map +1 -1
  95. package/dist/runs/recording.js +7 -0
  96. package/dist/runs/recording.js.map +1 -1
  97. package/dist/runs/run.d.ts +2 -0
  98. package/dist/runs/run.d.ts.map +1 -1
  99. package/dist/runs/run.js +1 -0
  100. package/dist/runs/run.js.map +1 -1
  101. package/dist/session/handshake.d.ts +1 -1
  102. package/dist/spec/index.d.ts.map +1 -1
  103. package/dist/spec/index.js +3 -0
  104. package/dist/spec/index.js.map +1 -1
  105. package/dist/spec/operations/attachments.d.ts +15 -0
  106. package/dist/spec/operations/attachments.d.ts.map +1 -0
  107. package/dist/spec/operations/attachments.js +38 -0
  108. package/dist/spec/operations/attachments.js.map +1 -0
  109. package/dist/testing/mock-max.d.ts +8 -3
  110. package/dist/testing/mock-max.d.ts.map +1 -1
  111. package/dist/testing/mock-max.js +20 -2
  112. package/dist/testing/mock-max.js.map +1 -1
  113. package/dist/testing/sandbox.js +10 -1
  114. package/dist/testing/sandbox.js.map +1 -1
  115. package/dist/testing/unscripted.d.ts +2 -0
  116. package/dist/testing/unscripted.d.ts.map +1 -0
  117. package/dist/testing/unscripted.js +18 -0
  118. package/dist/testing/unscripted.js.map +1 -0
  119. package/dist/version.d.ts +1 -1
  120. package/dist/version.js +1 -1
  121. package/package.json +28 -22
  122. package/skills/max-cli/SKILL.md +91 -0
  123. package/dist/commands/login.d.ts +0 -15
  124. package/dist/commands/login.d.ts.map +0 -1
  125. package/dist/commands/login.js +0 -43
  126. package/dist/commands/login.js.map +0 -1
  127. package/dist/commands/logout.d.ts +0 -10
  128. package/dist/commands/logout.d.ts.map +0 -1
  129. package/dist/commands/logout.js +0 -22
  130. package/dist/commands/logout.js.map +0 -1
  131. package/dist/commands/me.d.ts +0 -3
  132. package/dist/commands/me.d.ts.map +0 -1
  133. package/dist/commands/me.js +0 -18
  134. package/dist/commands/me.js.map +0 -1
  135. package/dist/commands/send.d.ts +0 -10
  136. package/dist/commands/send.d.ts.map +0 -1
  137. package/dist/commands/send.js +0 -30
  138. package/dist/commands/send.js.map +0 -1
  139. package/dist/protocol/session.d.ts +0 -54
  140. package/dist/protocol/session.d.ts.map +0 -1
  141. package/dist/protocol/session.js +0 -57
  142. package/dist/protocol/session.js.map +0 -1
  143. package/dist/spec/operations/auth.d.ts +0 -42
  144. package/dist/spec/operations/auth.d.ts.map +0 -1
@@ -1,6 +1,6 @@
1
1
  import { Command } from "commander";
2
2
  import { openProfileCache } from "../cache/index.js";
3
- import { resolveOutput } from "../output.js";
3
+ import { outputFor } from "./context.js";
4
4
  /**
5
5
  * The way out, and it matters more than it looks.
6
6
  *
@@ -15,7 +15,7 @@ export const cacheCommand = () => {
15
15
  .description("forget everything this profile has cached")
16
16
  .action(async function () {
17
17
  const options = this.optsWithGlobals();
18
- const { renderer } = resolveOutput(options);
18
+ const { renderer } = outputFor(this);
19
19
  const cache = await openProfileCache(options.profile, { onProblem: (message) => renderer.note(message) });
20
20
  if (!cache) {
21
21
  renderer.result({ profile: options.profile, cleared: false });
@@ -1 +1 @@
1
- {"version":3,"file":"cache.js","sourceRoot":"","sources":["../../src/commands/cache.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AACnC,OAAO,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAA;AACpD,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAA;AAE5C;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,YAAY,GAAG,GAAY,EAAE;IACxC,MAAM,OAAO,GAAG,IAAI,OAAO,CAAC,OAAO,CAAC,CAAC,WAAW,CAAC,gDAAgD,CAAC,CAAA;IAElG,OAAO;SACJ,OAAO,CAAC,OAAO,CAAC;SAChB,WAAW,CAAC,2CAA2C,CAAC;SACxD,MAAM,CAAC,KAAK;QACX,MAAM,OAAO,GAAG,IAAI,CAAC,eAAe,EAAE,CAAA;QACtC,MAAM,EAAE,QAAQ,EAAE,GAAG,aAAa,CAAC,OAAO,CAAC,CAAA;QAC3C,MAAM,KAAK,GAAG,MAAM,gBAAgB,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,CAAA;QAEzG,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,QAAQ,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAA;YAC7D,QAAQ,CAAC,IAAI,CAAC,oCAAoC,CAAC,CAAA;YACnD,OAAM;QACR,CAAC;QAED,IAAI,CAAC;YACH,KAAK,CAAC,KAAK,EAAE,CAAA;YACb,QAAQ,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAA;YAC5D,QAAQ,CAAC,OAAO,CAAC,iCAAiC,OAAO,CAAC,OAAO,GAAG,CAAC,CAAA;QACvE,CAAC;gBAAS,CAAC;YACT,KAAK,CAAC,KAAK,EAAE,CAAA;QACf,CAAC;IACH,CAAC,CAAC,CAAA;IAEJ,OAAO,OAAO,CAAA;AAChB,CAAC,CAAA"}
1
+ {"version":3,"file":"cache.js","sourceRoot":"","sources":["../../src/commands/cache.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AACnC,OAAO,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAA;AACpD,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAA;AAExC;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,YAAY,GAAG,GAAY,EAAE;IACxC,MAAM,OAAO,GAAG,IAAI,OAAO,CAAC,OAAO,CAAC,CAAC,WAAW,CAAC,gDAAgD,CAAC,CAAA;IAElG,OAAO;SACJ,OAAO,CAAC,OAAO,CAAC;SAChB,WAAW,CAAC,2CAA2C,CAAC;SACxD,MAAM,CAAC,KAAK;QACX,MAAM,OAAO,GAAG,IAAI,CAAC,eAAe,EAAE,CAAA;QACtC,MAAM,EAAE,QAAQ,EAAE,GAAG,SAAS,CAAC,IAAI,CAAC,CAAA;QACpC,MAAM,KAAK,GAAG,MAAM,gBAAgB,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,CAAA;QAEzG,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,QAAQ,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAA;YAC7D,QAAQ,CAAC,IAAI,CAAC,oCAAoC,CAAC,CAAA;YACnD,OAAM;QACR,CAAC;QAED,IAAI,CAAC;YACH,KAAK,CAAC,KAAK,EAAE,CAAA;YACb,QAAQ,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAA;YAC5D,QAAQ,CAAC,OAAO,CAAC,iCAAiC,OAAO,CAAC,OAAO,GAAG,CAAC,CAAA;QACvE,CAAC;gBAAS,CAAC;YACT,KAAK,CAAC,KAAK,EAAE,CAAA;QACf,CAAC;IACH,CAAC,CAAC,CAAA;IAEJ,OAAO,OAAO,CAAA;AAChB,CAAC,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"chats.d.ts","sourceRoot":"","sources":["../../src/commands/chats.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAMnC,eAAO,MAAM,YAAY,QAAO,OAgC/B,CAAA"}
1
+ {"version":3,"file":"chats.d.ts","sourceRoot":"","sources":["../../src/commands/chats.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAMnC,eAAO,MAAM,YAAY,QAAO,OAsD/B,CAAA"}
@@ -8,9 +8,10 @@ export const chatsCommand = () => {
8
8
  withPaging(command.command("list").description("the chats this account is in"))
9
9
  .option("--search <text>", "only chats whose name contains this; at least 3 characters")
10
10
  .option("--kind <dialog|group|channel>", "only chats of this kind")
11
+ .option("--unread", "only chats with unread messages")
11
12
  .action(async function () {
12
13
  const options = this.optsWithGlobals();
13
- const context = forCommand(options);
14
+ const context = forCommand(this);
14
15
  const { renderer, settings, createClient, run } = context;
15
16
  const cache = await openProfileCache(settings.profile, { onProblem: (message) => renderer.note(message) });
16
17
  await run("chats list", async (events) => {
@@ -20,6 +21,7 @@ export const chatsCommand = () => {
20
21
  ...window(settings),
21
22
  ...(options.search === undefined ? {} : { query: String(options.search) }),
22
23
  ...(options.kind === undefined ? {} : { kind: chatKind(options.kind) }),
24
+ ...(options.unread === true ? { unread: true } : {}),
23
25
  }));
24
26
  }
25
27
  finally {
@@ -28,6 +30,24 @@ export const chatsCommand = () => {
28
30
  }
29
31
  });
30
32
  });
33
+ command
34
+ .command("show")
35
+ .argument("<chat>", "chat id, or part of a chat name")
36
+ .description("one chat: its kind, unread count, last message time and who is in it")
37
+ .action(async function (chat) {
38
+ const { renderer, settings, createClient, run } = forCommand(this);
39
+ const cache = await openProfileCache(settings.profile, { onProblem: (message) => renderer.note(message) });
40
+ await run("chats show", async (events) => {
41
+ const client = createClient({ events, ...(cache ? { cache } : {}) });
42
+ try {
43
+ renderer.result(await client.chats.show(chat));
44
+ }
45
+ finally {
46
+ await client.close();
47
+ cache?.close();
48
+ }
49
+ });
50
+ });
31
51
  return command;
32
52
  };
33
53
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"chats.js","sourceRoot":"","sources":["../../src/commands/chats.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAA;AAC5C,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AACnC,OAAO,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAA;AAEpD,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAA;AACzC,OAAO,EAAE,UAAU,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AAE5D,MAAM,CAAC,MAAM,YAAY,GAAG,GAAY,EAAE;IACxC,MAAM,OAAO,GAAG,IAAI,OAAO,CAAC,OAAO,CAAC,CAAC,WAAW,CAAC,8BAA8B,CAAC,CAAA;IAEhF,UAAU,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,WAAW,CAAC,8BAA8B,CAAC,CAAC;SAC5E,MAAM,CAAC,iBAAiB,EAAE,4DAA4D,CAAC;SACvF,MAAM,CAAC,+BAA+B,EAAE,yBAAyB,CAAC;SAClE,MAAM,CAAC,KAAK;QACX,MAAM,OAAO,GAAG,IAAI,CAAC,eAAe,EAAE,CAAA;QACtC,MAAM,OAAO,GAAG,UAAU,CAAC,OAAO,CAAC,CAAA;QACnC,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,YAAY,EAAE,GAAG,EAAE,GAAG,OAAO,CAAA;QACzD,MAAM,KAAK,GAAG,MAAM,gBAAgB,CAAC,QAAQ,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,CAAA;QAE1G,MAAM,GAAG,CAAC,YAAY,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE;YACvC,MAAM,MAAM,GAAG,YAAY,CAAC,EAAE,MAAM,EAAE,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAA;YAEpE,IAAI,CAAC;gBACH,UAAU,CACR,OAAO,EACP,MAAM,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC;oBACtB,GAAG,MAAM,CAAC,QAAQ,CAAC;oBACnB,GAAG,CAAC,OAAO,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;oBAC1E,GAAG,CAAC,OAAO,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;iBACxE,CAAC,CACH,CAAA;YACH,CAAC;oBAAS,CAAC;gBACT,MAAM,MAAM,CAAC,KAAK,EAAE,CAAA;gBACpB,KAAK,EAAE,KAAK,EAAE,CAAA;YAChB,CAAC;QACH,CAAC,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;IAEJ,OAAO,OAAO,CAAA;AAChB,CAAC,CAAA;AAED;;;;;GAKG;AACH,MAAM,QAAQ,GAAG,CAAC,KAAc,EAAY,EAAE;IAC5C,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,WAAW,EAAE,CAAA;IAC1C,IAAI,MAAM,KAAK,QAAQ,IAAI,MAAM,KAAK,OAAO,IAAI,MAAM,KAAK,SAAS;QAAE,OAAO,MAAM,CAAA;IACpF,MAAM,IAAI,QAAQ,CAAC,kBAAkB,EAAE,+CAA+C,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;AACzG,CAAC,CAAA"}
1
+ {"version":3,"file":"chats.js","sourceRoot":"","sources":["../../src/commands/chats.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { Command } from "commander";
2
+ export declare const configCommand: () => Command;
3
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/commands/config.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAcnC,eAAO,MAAM,aAAa,QAAO,OAgEhC,CAAA"}
@@ -0,0 +1,82 @@
1
+ import { existsSync, readdirSync } from "node:fs";
2
+ import { join } from "node:path";
3
+ import { pathsAreOverridden, resolvePaths } from "@leemour/cli-core";
4
+ import { Command } from "commander";
5
+ import { changeSetting, PROFILE_SETTINGS } from "../config.js";
6
+ import { forCommand } from "./context.js";
7
+ const SHOWN = [
8
+ "limit",
9
+ "timeoutMs",
10
+ "commandTimeoutMs",
11
+ "color",
12
+ "senderColors",
13
+ "record",
14
+ "keepRunsForDays",
15
+ ];
16
+ export const configCommand = () => {
17
+ const command = new Command("config").description("the settings in force, and where each one came from");
18
+ /**
19
+ * Printed whole: no field the configuration accepts can hold a secret (`src/config.ts`). Whether
20
+ * a profile has a token is not here — reading the keyring is `max doctor`'s (`CLI-12`).
21
+ */
22
+ command
23
+ .command("show")
24
+ .description("the profile, the profiles that exist, and each setting with where it came from")
25
+ .action(function () {
26
+ const { settings, renderer } = forCommand(this);
27
+ const overridden = pathsAreOverridden({ appName: "max-cli", prefix: "MAX" });
28
+ renderer.result({
29
+ profile: settings.profile,
30
+ profileFrom: settings.sources.profile,
31
+ profiles: [...new Set([...settings.configuredProfiles, ...profilesWithState()])].sort(),
32
+ configFile: settings.configPath,
33
+ configFound: settings.configFound,
34
+ pathsOverridden: overridden,
35
+ settings: SHOWN.map((setting) => ({
36
+ setting,
37
+ value: settings[setting] ?? null,
38
+ from: settings.sources[setting],
39
+ })),
40
+ });
41
+ if (overridden) {
42
+ renderer.note("MAX_CONFIG_DIR, MAX_STATE_DIR or MAX_CACHE_DIR is set — a profile's keyring entry is not the usual one, " +
43
+ "so a session made without them reads as none");
44
+ }
45
+ });
46
+ for (const action of ["set", "unset"]) {
47
+ const sub = command
48
+ .command(action)
49
+ .argument("<setting>", `one of: ${PROFILE_SETTINGS.join(", ")}`)
50
+ .option("--defaults", "change what every profile gets, rather than this profile");
51
+ if (action === "set")
52
+ sub.argument("<value>", "a number, true or false").description("save a setting to the configuration file");
53
+ else
54
+ sub.description("remove a setting from the configuration file");
55
+ sub.action(function (setting, given) {
56
+ const value = action === "set" ? String(given) : undefined;
57
+ const { settings, renderer } = forCommand(this);
58
+ const defaults = this.opts().defaults === true;
59
+ const saved = changeSetting(settings.configPath, {
60
+ profile: defaults ? undefined : settings.profile,
61
+ setting,
62
+ value,
63
+ });
64
+ renderer.result({
65
+ configFile: settings.configPath,
66
+ scope: defaults ? "defaults" : `profiles.${settings.profile}`,
67
+ setting,
68
+ value: saved,
69
+ });
70
+ });
71
+ }
72
+ return command;
73
+ };
74
+ const profilesWithState = () => {
75
+ const dir = join(resolvePaths({ appName: "max-cli", prefix: "MAX" }).state, "profiles");
76
+ if (!existsSync(dir))
77
+ return [];
78
+ return readdirSync(dir)
79
+ .filter((name) => name.endsWith(".json"))
80
+ .map((name) => name.slice(0, -".json".length));
81
+ };
82
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/commands/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,SAAS,CAAA;AACjD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAChC,OAAO,EAAE,kBAAkB,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AACpE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AACnC,OAAO,EAAE,aAAa,EAAE,gBAAgB,EAAuB,MAAM,cAAc,CAAA;AACnF,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAA;AAEzC,MAAM,KAAK,GAAqB;IAC9B,OAAO;IACP,WAAW;IACX,kBAAkB;IAClB,OAAO;IACP,cAAc;IACd,QAAQ;IACR,iBAAiB;CAClB,CAAA;AAED,MAAM,CAAC,MAAM,aAAa,GAAG,GAAY,EAAE;IACzC,MAAM,OAAO,GAAG,IAAI,OAAO,CAAC,QAAQ,CAAC,CAAC,WAAW,CAAC,qDAAqD,CAAC,CAAA;IAExG;;;OAGG;IACH,OAAO;SACJ,OAAO,CAAC,MAAM,CAAC;SACf,WAAW,CAAC,gFAAgF,CAAC;SAC7F,MAAM,CAAC;QACN,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,GAAG,UAAU,CAAC,IAAI,CAAC,CAAA;QAC/C,MAAM,UAAU,GAAG,kBAAkB,CAAC,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAA;QAE5E,QAAQ,CAAC,MAAM,CAAC;YACd,OAAO,EAAE,QAAQ,CAAC,OAAO;YACzB,WAAW,EAAE,QAAQ,CAAC,OAAO,CAAC,OAAO;YACrC,QAAQ,EAAE,CAAC,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,QAAQ,CAAC,kBAAkB,EAAE,GAAG,iBAAiB,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE;YACvF,UAAU,EAAE,QAAQ,CAAC,UAAU;YAC/B,WAAW,EAAE,QAAQ,CAAC,WAAW;YACjC,eAAe,EAAE,UAAU;YAC3B,QAAQ,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;gBAChC,OAAO;gBACP,KAAK,EAAE,QAAQ,CAAC,OAAO,CAAC,IAAI,IAAI;gBAChC,IAAI,EAAE,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC;aAChC,CAAC,CAAC;SACJ,CAAC,CAAA;QAEF,IAAI,UAAU,EAAE,CAAC;YACf,QAAQ,CAAC,IAAI,CACX,0GAA0G;gBACxG,8CAA8C,CACjD,CAAA;QACH,CAAC;IACH,CAAC,CAAC,CAAA;IAEJ,KAAK,MAAM,MAAM,IAAI,CAAC,KAAK,EAAE,OAAO,CAAU,EAAE,CAAC;QAC/C,MAAM,GAAG,GAAG,OAAO;aAChB,OAAO,CAAC,MAAM,CAAC;aACf,QAAQ,CAAC,WAAW,EAAE,WAAW,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;aAC/D,MAAM,CAAC,YAAY,EAAE,0DAA0D,CAAC,CAAA;QACnF,IAAI,MAAM,KAAK,KAAK;YAClB,GAAG,CAAC,QAAQ,CAAC,SAAS,EAAE,yBAAyB,CAAC,CAAC,WAAW,CAAC,0CAA0C,CAAC,CAAA;;YACvG,GAAG,CAAC,WAAW,CAAC,8CAA8C,CAAC,CAAA;QAEpE,GAAG,CAAC,MAAM,CAAC,UAAyB,OAAe,EAAE,KAAc;YACjE,MAAM,KAAK,GAAG,MAAM,KAAK,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,CAAA;YAC1D,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,GAAG,UAAU,CAAC,IAAI,CAAC,CAAA;YAC/C,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,EAA0B,CAAC,QAAQ,KAAK,IAAI,CAAA;YACtE,MAAM,KAAK,GAAG,aAAa,CAAC,QAAQ,CAAC,UAAU,EAAE;gBAC/C,OAAO,EAAE,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO;gBAChD,OAAO;gBACP,KAAK;aACN,CAAC,CAAA;YACF,QAAQ,CAAC,MAAM,CAAC;gBACd,UAAU,EAAE,QAAQ,CAAC,UAAU;gBAC/B,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,YAAY,QAAQ,CAAC,OAAO,EAAE;gBAC7D,OAAO;gBACP,KAAK,EAAE,KAAK;aACb,CAAC,CAAA;QACJ,CAAC,CAAC,CAAA;IACJ,CAAC;IAED,OAAO,OAAO,CAAA;AAChB,CAAC,CAAA;AAED,MAAM,iBAAiB,GAAG,GAAa,EAAE;IACvC,MAAM,GAAG,GAAG,IAAI,CAAC,YAAY,CAAC,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,UAAU,CAAC,CAAA;IACvF,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC;QAAE,OAAO,EAAE,CAAA;IAC/B,OAAO,WAAW,CAAC,GAAG,CAAC;SACpB,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;SACxC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAA;AAClD,CAAC,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"contacts.d.ts","sourceRoot":"","sources":["../../src/commands/contacts.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAMnC;;;;;;GAMG;AACH,eAAO,MAAM,eAAe,QAAO,OA+DlC,CAAA"}
1
+ {"version":3,"file":"contacts.d.ts","sourceRoot":"","sources":["../../src/commands/contacts.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAMnC;;;;;;GAMG;AACH,eAAO,MAAM,eAAe,QAAO,OAmFlC,CAAA"}
@@ -17,7 +17,7 @@ export const contactsCommand = () => {
17
17
  .option("--search <text>", "only people whose name or @username contains this; at least 3 characters")
18
18
  .action(async function () {
19
19
  const options = this.optsWithGlobals();
20
- const context = forCommand(options);
20
+ const context = forCommand(this);
21
21
  const { renderer, settings, createClient, run } = context;
22
22
  const cache = await openProfileCache(settings.profile, { onProblem: (message) => renderer.note(message) });
23
23
  const order = orderFrom(options.order);
@@ -36,6 +36,24 @@ export const contactsCommand = () => {
36
36
  }
37
37
  });
38
38
  });
39
+ command
40
+ .command("show")
41
+ .argument("<person>", "person id, @username, or part of a name")
42
+ .description("one person and the chats you share with them")
43
+ .action(async function (person) {
44
+ const { renderer, settings, createClient, run } = forCommand(this);
45
+ const cache = await openProfileCache(settings.profile, { onProblem: (message) => renderer.note(message) });
46
+ await run("contacts show", async (events) => {
47
+ const client = createClient({ events, ...(cache ? { cache } : {}) });
48
+ try {
49
+ renderer.result(await client.contacts.show(person));
50
+ }
51
+ finally {
52
+ await client.close();
53
+ cache?.close();
54
+ }
55
+ });
56
+ });
39
57
  /**
40
58
  * The repair tool of the contact store, and **not how contacts normally arrive**: every command
41
59
  * logs in, and every login carries the delta, so the store is already current. This is for a
@@ -48,7 +66,7 @@ export const contactsCommand = () => {
48
66
  .command("sync")
49
67
  .description("forget where the last sync left off and take the whole list again")
50
68
  .action(async function () {
51
- const { renderer, settings, createClient, run } = forCommand(this.optsWithGlobals());
69
+ const { renderer, settings, createClient, run } = forCommand(this);
52
70
  const cache = await openProfileCache(settings.profile, { onProblem: (message) => renderer.note(message) });
53
71
  await run("contacts sync", async (events) => {
54
72
  const client = createClient({ events, ...(cache ? { cache } : {}) });
@@ -1 +1 @@
1
- {"version":3,"file":"contacts.js","sourceRoot":"","sources":["../../src/commands/contacts.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"contacts.js","sourceRoot":"","sources":["../../src/commands/contacts.ts"],"names":[],"mappings":"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"}
@@ -1,7 +1,28 @@
1
1
  import type { Renderer, RenderFormat, Streams } from "@leemour/cli-core";
2
+ import type { Command } from "commander";
2
3
  import { MaxClient, type MaxClientOptions } from "../client.js";
3
- import { type GlobalFlags, type Settings } from "../config.js";
4
+ import { type Settings } from "../config.js";
4
5
  import { SessionStore } from "../session/store.js";
6
+ /**
7
+ * What a command writes to and talks through, when it is not the real terminal, keyring and MAX.
8
+ * `run` sets it on the program; without it everything is the real thing.
9
+ */
10
+ export interface Environment {
11
+ streams?: Streams;
12
+ tty?: boolean;
13
+ /** A store over a memory keyring, so a test never touches the owner's. */
14
+ store?: (profile: string) => SessionStore;
15
+ /** A fresh connection per client — to a scripted MAX in a test. */
16
+ connection?: () => NonNullable<MaxClientOptions["connection"]>;
17
+ }
18
+ export declare const provide: (program: Command, environment: Environment) => void;
19
+ /** For the commands that print but never need settings or a client. */
20
+ export declare const outputFor: (command: Command) => {
21
+ format: "json" | "jsonl" | "pretty";
22
+ color: boolean;
23
+ streams: Streams;
24
+ renderer: Renderer;
25
+ };
5
26
  export interface CommandContext {
6
27
  settings: Settings;
7
28
  renderer: Renderer;
@@ -33,5 +54,5 @@ export interface CommandContext {
33
54
  * The cache is not opened here on purpose — only the reading commands want one, and opening it
34
55
  * would create a database file for `session end`, which will never read it.
35
56
  */
36
- export declare const forCommand: (flags: GlobalFlags) => CommandContext;
57
+ export declare const forCommand: (command: Command) => CommandContext;
37
58
  //# sourceMappingURL=context.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../../src/commands/context.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,YAAY,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAA;AACxE,OAAO,EAAE,SAAS,EAAE,KAAK,gBAAgB,EAAE,MAAM,cAAc,CAAA;AAC/D,OAAO,EAAE,KAAK,WAAW,EAAmB,KAAK,QAAQ,EAAE,MAAM,cAAc,CAAA;AAG/E,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAA;AAElD,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,QAAQ,CAAA;IAClB,QAAQ,EAAE,QAAQ,CAAA;IAClB,MAAM,EAAE,YAAY,CAAA;IACpB,kHAAkH;IAClH,KAAK,EAAE,OAAO,CAAA;IACd,OAAO,EAAE,OAAO,CAAA;IAChB,KAAK,EAAE,YAAY,CAAA;IACnB,yGAAyG;IACzG,YAAY,EAAE,CAAC,KAAK,CAAC,EAAE,OAAO,CAAC,IAAI,CAAC,gBAAgB,EAAE,OAAO,CAAC,CAAC,KAAK,SAAS,CAAA;IAC7E;;;OAGG;IACH,GAAG,EAAE,CAAC,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,MAAM,EAAE,gBAAgB,CAAC,QAAQ,CAAC,KAAK,OAAO,CAAC,CAAC,CAAC,KAAK,OAAO,CAAC,CAAC,CAAC,CAAA;CAClG;AAED;;;;;;;;;;;;;;GAcG;AACH,eAAO,MAAM,UAAU,GAAI,OAAO,WAAW,KAAG,cA0B/C,CAAA"}
1
+ {"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../../src/commands/context.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,YAAY,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAA;AACxE,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AACxC,OAAO,EAAE,SAAS,EAAE,KAAK,gBAAgB,EAAE,MAAM,cAAc,CAAA;AAC/D,OAAO,EAAqC,KAAK,QAAQ,EAAE,MAAM,cAAc,CAAA;AAK/E,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAA;AAElD;;;GAGG;AACH,MAAM,WAAW,WAAW;IAC1B,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,GAAG,CAAC,EAAE,OAAO,CAAA;IACb,0EAA0E;IAC1E,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,YAAY,CAAA;IACzC,mEAAmE;IACnE,UAAU,CAAC,EAAE,MAAM,WAAW,CAAC,gBAAgB,CAAC,YAAY,CAAC,CAAC,CAAA;CAC/D;AAID,eAAO,MAAM,OAAO,GAAI,SAAS,OAAO,EAAE,aAAa,WAAW,KAAG,IAEpE,CAAA;AAID,uEAAuE;AACvE,eAAO,MAAM,SAAS,GAAI,SAAS,OAAO;;;;;CAOzC,CAAA;AAED,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,QAAQ,CAAA;IAClB,QAAQ,EAAE,QAAQ,CAAA;IAClB,MAAM,EAAE,YAAY,CAAA;IACpB,kHAAkH;IAClH,KAAK,EAAE,OAAO,CAAA;IACd,OAAO,EAAE,OAAO,CAAA;IAChB,KAAK,EAAE,YAAY,CAAA;IACnB,yGAAyG;IACzG,YAAY,EAAE,CAAC,KAAK,CAAC,EAAE,OAAO,CAAC,IAAI,CAAC,gBAAgB,EAAE,OAAO,CAAC,CAAC,KAAK,SAAS,CAAA;IAC7E;;;OAGG;IACH,GAAG,EAAE,CAAC,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,MAAM,EAAE,gBAAgB,CAAC,QAAQ,CAAC,KAAK,OAAO,CAAC,CAAC,CAAC,KAAK,OAAO,CAAC,CAAC,CAAC,CAAA;CAClG;AAED;;;;;;;;;;;;;;GAcG;AACH,eAAO,MAAM,UAAU,GAAI,SAAS,OAAO,KAAG,cAgD7C,CAAA"}
@@ -1,8 +1,24 @@
1
1
  import { MaxClient } from "../client.js";
2
2
  import { resolveSettings } from "../config.js";
3
+ import { withDeadline } from "../deadline.js";
3
4
  import { resolveOutput } from "../output.js";
5
+ import { rootOf } from "../profile.js";
4
6
  import { recorded } from "../runs/recording.js";
5
7
  import { SessionStore } from "../session/store.js";
8
+ const environments = new WeakMap();
9
+ export const provide = (program, environment) => {
10
+ environments.set(program, environment);
11
+ };
12
+ const environmentOf = (command) => environments.get(rootOf(command)) ?? {};
13
+ /** For the commands that print but never need settings or a client. */
14
+ export const outputFor = (command) => {
15
+ const { streams, tty } = environmentOf(command);
16
+ return resolveOutput({
17
+ ...command.optsWithGlobals(),
18
+ ...(streams ? { streams } : {}),
19
+ ...(tty === undefined ? {} : { tty }),
20
+ });
21
+ };
6
22
  /**
7
23
  * Everything a command needs, resolved once — and **the only place a `MaxClient` is built.**
8
24
  *
@@ -18,10 +34,18 @@ import { SessionStore } from "../session/store.js";
18
34
  * The cache is not opened here on purpose — only the reading commands want one, and opening it
19
35
  * would create a database file for `session end`, which will never read it.
20
36
  */
21
- export const forCommand = (flags) => {
22
- const settings = resolveSettings(flags);
23
- const { renderer, format, color, streams } = resolveOutput(settings);
24
- const store = new SessionStore({ profile: settings.profile });
37
+ export const forCommand = (command) => {
38
+ const environment = environmentOf(command);
39
+ const settings = resolveSettings(command.optsWithGlobals());
40
+ const { renderer, format, color, streams } = resolveOutput({
41
+ ...settings,
42
+ ...(environment.streams ? { streams: environment.streams } : {}),
43
+ ...(environment.tty === undefined ? {} : { tty: environment.tty }),
44
+ });
45
+ const store = environment.store?.(settings.profile) ?? new SessionStore({ profile: settings.profile });
46
+ // Every client this command builds, so the deadline can shut them. There is always one; relying
47
+ // on that is what makes the second one, some day, the leak that keeps the process alive.
48
+ const clients = [];
25
49
  return {
26
50
  settings,
27
51
  renderer,
@@ -29,14 +53,26 @@ export const forCommand = (flags) => {
29
53
  color,
30
54
  streams,
31
55
  store,
32
- createClient: (extra = {}) => new MaxClient({ store, timeoutMs: settings.timeoutMs, warn: renderer.note, ...extra }),
33
- run: (command, body) => recorded({
56
+ createClient: (extra = {}) => {
57
+ const client = new MaxClient({
58
+ store,
59
+ timeoutMs: settings.timeoutMs,
60
+ warn: renderer.note,
61
+ offline: command.optsWithGlobals().offline === true,
62
+ ...(environment.connection ? { connection: environment.connection() } : {}),
63
+ ...extra,
64
+ });
65
+ clients.push(client);
66
+ return client;
67
+ },
68
+ run: (command, body) => withDeadline(settings.commandTimeoutMs, clients, () => recorded({
34
69
  command,
35
70
  profile: settings.profile,
36
71
  options: { record: settings.record, trace: settings.trace },
37
72
  format,
73
+ streams,
38
74
  keepDays: settings.keepRunsForDays,
39
- }, body),
75
+ }, body)),
40
76
  };
41
77
  };
42
78
  //# sourceMappingURL=context.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"context.js","sourceRoot":"","sources":["../../src/commands/context.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAyB,MAAM,cAAc,CAAA;AAC/D,OAAO,EAAoB,eAAe,EAAiB,MAAM,cAAc,CAAA;AAC/E,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAA;AAC5C,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAA;AAC/C,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAA;AAmBlD;;;;;;;;;;;;;;GAcG;AACH,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,KAAkB,EAAkB,EAAE;IAC/D,MAAM,QAAQ,GAAG,eAAe,CAAC,KAAK,CAAC,CAAA;IACvC,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,aAAa,CAAC,QAAQ,CAAC,CAAA;IACpE,MAAM,KAAK,GAAG,IAAI,YAAY,CAAC,EAAE,OAAO,EAAE,QAAQ,CAAC,OAAO,EAAE,CAAC,CAAA;IAE7D,OAAO;QACL,QAAQ;QACR,QAAQ;QACR,MAAM;QACN,KAAK;QACL,OAAO;QACP,KAAK;QACL,YAAY,EAAE,CAAC,KAAK,GAAG,EAAE,EAAE,EAAE,CAC3B,IAAI,SAAS,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,QAAQ,CAAC,SAAS,EAAE,IAAI,EAAE,QAAQ,CAAC,IAAI,EAAE,GAAG,KAAK,EAAE,CAAC;QACxF,GAAG,EAAE,CAAC,OAAO,EAAE,IAAI,EAAE,EAAE,CACrB,QAAQ,CACN;YACE,OAAO;YACP,OAAO,EAAE,QAAQ,CAAC,OAAO;YACzB,OAAO,EAAE,EAAE,MAAM,EAAE,QAAQ,CAAC,MAAM,EAAE,KAAK,EAAE,QAAQ,CAAC,KAAK,EAAE;YAC3D,MAAM;YACN,QAAQ,EAAE,QAAQ,CAAC,eAAe;SACnC,EACD,IAAI,CACL;KACJ,CAAA;AACH,CAAC,CAAA"}
1
+ {"version":3,"file":"context.js","sourceRoot":"","sources":["../../src/commands/context.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ import { Command } from "commander";
2
+ /**
3
+ * The state every other command depends on, read from disk and **never from MAX**.
4
+ *
5
+ * ⚠ **It must answer when everything is broken**, because that is the only time anybody runs it.
6
+ * No session, no configuration file, a cache written by a newer `max`, a keyring that will not
7
+ * open — each is a field in the answer and none is an exception. A diagnosis that fails with
8
+ * `authentication_error` when asked "do I have a session" is worth nothing.
9
+ *
10
+ * It is a thin shell over `diagnose` on purpose: the gathering is worth asserting on field by
11
+ * field, and a command body is a worse place to do that from than a function that takes its
12
+ * environment as arguments.
13
+ *
14
+ * `max config show` is the neighbouring half and does not overlap: that one reads what was
15
+ * configured, this one reads what exists.
16
+ */
17
+ export declare const doctorCommand: () => Command;
18
+ //# sourceMappingURL=doctor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"doctor.d.ts","sourceRoot":"","sources":["../../src/commands/doctor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAInC;;;;;;;;;;;;;;GAcG;AACH,eAAO,MAAM,aAAa,QAAO,OA6ChC,CAAA"}
@@ -0,0 +1,72 @@
1
+ import { Command } from "commander";
2
+ import { diagnose } from "../diagnose.js";
3
+ import { forCommand } from "./context.js";
4
+ /**
5
+ * The state every other command depends on, read from disk and **never from MAX**.
6
+ *
7
+ * ⚠ **It must answer when everything is broken**, because that is the only time anybody runs it.
8
+ * No session, no configuration file, a cache written by a newer `max`, a keyring that will not
9
+ * open — each is a field in the answer and none is an exception. A diagnosis that fails with
10
+ * `authentication_error` when asked "do I have a session" is worth nothing.
11
+ *
12
+ * It is a thin shell over `diagnose` on purpose: the gathering is worth asserting on field by
13
+ * field, and a command body is a worse place to do that from than a function that takes its
14
+ * environment as arguments.
15
+ *
16
+ * `max config show` is the neighbouring half and does not overlap: that one reads what was
17
+ * configured, this one reads what exists.
18
+ */
19
+ export const doctorCommand = () => {
20
+ const command = new Command("doctor").description("the state this installation is in, without contacting MAX");
21
+ command.action(async function () {
22
+ const { renderer, settings, format, run, store } = forCommand(this);
23
+ await run("doctor", async () => {
24
+ const report = await diagnose({
25
+ profile: settings.profile,
26
+ // Reading the keyring is the one thing here that can prompt or hang on a locked keyring,
27
+ // so its failure is "no token found" rather than a failed command.
28
+ hasKeyringToken: () => {
29
+ try {
30
+ return store.readToken() !== undefined;
31
+ }
32
+ catch {
33
+ return false;
34
+ }
35
+ },
36
+ });
37
+ renderer.result(format === "pretty" ? forPerson(report, settings.profile) : report);
38
+ // ⚠ Said whenever the environment moved the keyring, because this is the one failure with no
39
+ // other symptom: the profile is there, the login happened, and the answer is "no session".
40
+ if (report.keyring.movedByEnvironment) {
41
+ renderer.note("MAX_CONFIG_DIR, MAX_STATE_DIR or MAX_CACHE_DIR is set, which changes the keyring entry — " +
42
+ "a login done without them is invisible here, and the other way round");
43
+ }
44
+ if (!report.cache.readable) {
45
+ renderer.note(`the local copy was written by a newer max (schema ${report.cache.schemaVersion}, this one speaks ` +
46
+ `${report.cache.speaks}) — commands still work, but the copy is ignored until \`max cache clear\``);
47
+ }
48
+ if (!report.token.present) {
49
+ renderer.note(`no token for this profile — \`max ${settings.profile} session start\` stores one`);
50
+ }
51
+ });
52
+ });
53
+ return command;
54
+ };
55
+ /** One line per row: the pretty renderer prints a flat object and does not descend into one. */
56
+ const forPerson = (report, profile) => ({
57
+ profile,
58
+ token: report.token.present ? `yes, from the ${report.token.from}` : "none",
59
+ keyring: report.keyring.movedByEnvironment
60
+ ? `${report.keyring.service} (moved by the environment)`
61
+ : report.keyring.service,
62
+ "logged in": report.session.exists
63
+ ? `${report.session.logins ?? 0} time(s)${report.session.lastLoginAt ? `, last ${report.session.lastLoginAt}` : ""}`
64
+ : "never on this machine",
65
+ "account known": report.session.viewerId,
66
+ "profiles logged in": report.loggedInProfiles.length === 0 ? "none" : report.loggedInProfiles.join(", "),
67
+ "local copy": report.cache.exists
68
+ ? `schema ${report.cache.schemaVersion ?? "unreadable"}, this max speaks ${report.cache.speaks}`
69
+ : "not created yet",
70
+ runs: `${report.runs.kept} kept in ${report.runs.directory}`,
71
+ });
72
+ //# sourceMappingURL=doctor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"doctor.js","sourceRoot":"","sources":["../../src/commands/doctor.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"messages.d.ts","sourceRoot":"","sources":["../../src/commands/messages.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAOnC,eAAO,MAAM,eAAe,QAAO,OAoIlC,CAAA"}
1
+ {"version":3,"file":"messages.d.ts","sourceRoot":"","sources":["../../src/commands/messages.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AASnC,eAAO,MAAM,eAAe,QAAO,OAgNlC,CAAA"}