@leemour/max-cli 0.2.0 → 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 (109) hide show
  1. package/README.md +10 -3
  2. package/dist/cache/index.d.ts.map +1 -1
  3. package/dist/cache/index.js +3 -0
  4. package/dist/cache/index.js.map +1 -1
  5. package/dist/cache/schema.d.ts +4 -1
  6. package/dist/cache/schema.d.ts.map +1 -1
  7. package/dist/cache/schema.js +89 -2
  8. package/dist/cache/schema.js.map +1 -1
  9. package/dist/cache/store.d.ts +38 -11
  10. package/dist/cache/store.d.ts.map +1 -1
  11. package/dist/cache/store.js +123 -17
  12. package/dist/cache/store.js.map +1 -1
  13. package/dist/client.d.ts +41 -9
  14. package/dist/client.d.ts.map +1 -1
  15. package/dist/client.js +188 -49
  16. package/dist/client.js.map +1 -1
  17. package/dist/commands/account.js +1 -1
  18. package/dist/commands/account.js.map +1 -1
  19. package/dist/commands/body.d.ts +23 -0
  20. package/dist/commands/body.d.ts.map +1 -0
  21. package/dist/commands/body.js +36 -0
  22. package/dist/commands/body.js.map +1 -0
  23. package/dist/commands/cache.js +2 -2
  24. package/dist/commands/cache.js.map +1 -1
  25. package/dist/commands/chats.d.ts.map +1 -1
  26. package/dist/commands/chats.js +24 -3
  27. package/dist/commands/chats.js.map +1 -1
  28. package/dist/commands/config.d.ts +3 -0
  29. package/dist/commands/config.d.ts.map +1 -0
  30. package/dist/commands/config.js +55 -0
  31. package/dist/commands/config.js.map +1 -0
  32. package/dist/commands/contacts.d.ts.map +1 -1
  33. package/dist/commands/contacts.js +8 -3
  34. package/dist/commands/contacts.js.map +1 -1
  35. package/dist/commands/context.d.ts +27 -3
  36. package/dist/commands/context.d.ts.map +1 -1
  37. package/dist/commands/context.js +45 -8
  38. package/dist/commands/context.js.map +1 -1
  39. package/dist/commands/doctor.d.ts +18 -0
  40. package/dist/commands/doctor.d.ts.map +1 -0
  41. package/dist/commands/doctor.js +72 -0
  42. package/dist/commands/doctor.js.map +1 -0
  43. package/dist/commands/messages.d.ts.map +1 -1
  44. package/dist/commands/messages.js +129 -5
  45. package/dist/commands/messages.js.map +1 -1
  46. package/dist/commands/paging.d.ts +6 -3
  47. package/dist/commands/paging.d.ts.map +1 -1
  48. package/dist/commands/paging.js +14 -3
  49. package/dist/commands/paging.js.map +1 -1
  50. package/dist/commands/runs.d.ts.map +1 -1
  51. package/dist/commands/runs.js +4 -6
  52. package/dist/commands/runs.js.map +1 -1
  53. package/dist/commands/session.js +2 -2
  54. package/dist/commands/session.js.map +1 -1
  55. package/dist/commands/skill.d.ts +3 -0
  56. package/dist/commands/skill.d.ts.map +1 -0
  57. package/dist/commands/skill.js +23 -0
  58. package/dist/commands/skill.js.map +1 -0
  59. package/dist/config.d.ts +46 -2
  60. package/dist/config.d.ts.map +1 -1
  61. package/dist/config.js +103 -9
  62. package/dist/config.js.map +1 -1
  63. package/dist/deadline.d.ts +30 -0
  64. package/dist/deadline.d.ts.map +1 -0
  65. package/dist/deadline.js +45 -0
  66. package/dist/deadline.js.map +1 -0
  67. package/dist/diagnose.d.ts +68 -0
  68. package/dist/diagnose.d.ts.map +1 -0
  69. package/dist/diagnose.js +115 -0
  70. package/dist/diagnose.js.map +1 -0
  71. package/dist/domain/map.d.ts.map +1 -1
  72. package/dist/domain/map.js +42 -3
  73. package/dist/domain/map.js.map +1 -1
  74. package/dist/domain/models.d.ts +46 -0
  75. package/dist/domain/models.d.ts.map +1 -1
  76. package/dist/domain/models.js +11 -1
  77. package/dist/domain/models.js.map +1 -1
  78. package/dist/output.d.ts +7 -4
  79. package/dist/output.d.ts.map +1 -1
  80. package/dist/output.js +8 -11
  81. package/dist/output.js.map +1 -1
  82. package/dist/program.d.ts +2 -1
  83. package/dist/program.d.ts.map +1 -1
  84. package/dist/program.js +15 -2
  85. package/dist/program.js.map +1 -1
  86. package/dist/protocol/connection.d.ts +10 -0
  87. package/dist/protocol/connection.d.ts.map +1 -1
  88. package/dist/protocol/connection.js +20 -3
  89. package/dist/protocol/connection.js.map +1 -1
  90. package/dist/rendering/messages.d.ts +19 -0
  91. package/dist/rendering/messages.d.ts.map +1 -0
  92. package/dist/rendering/messages.js +138 -0
  93. package/dist/rendering/messages.js.map +1 -0
  94. package/dist/runs/events.d.ts +1 -1
  95. package/dist/runs/recording.d.ts +2 -2
  96. package/dist/runs/recording.d.ts.map +1 -1
  97. package/dist/runs/recording.js +3 -3
  98. package/dist/runs/recording.js.map +1 -1
  99. package/dist/testing/mock-max.d.ts.map +1 -1
  100. package/dist/testing/mock-max.js +16 -2
  101. package/dist/testing/mock-max.js.map +1 -1
  102. package/dist/testing/sandbox.d.ts +2 -0
  103. package/dist/testing/sandbox.d.ts.map +1 -0
  104. package/dist/testing/sandbox.js +31 -0
  105. package/dist/testing/sandbox.js.map +1 -0
  106. package/dist/version.d.ts +1 -1
  107. package/dist/version.js +1 -1
  108. package/package.json +7 -3
  109. package/skills/max-cli/SKILL.md +83 -0
@@ -3,5 +3,15 @@
3
3
  * shape is undocumented, changes without notice, and carries fields whose meaning nobody knows.
4
4
  * Everything above the adapter speaks these types.
5
5
  */
6
- export {};
6
+ /**
7
+ * When a message was sent, read from its id: **`id >> 16` is the send time in milliseconds**, the
8
+ * low 16 bits a counter. Measured 2026-09-22 on three messages across two days, exact every time.
9
+ * `undefined` for anything that is not a message id.
10
+ */
11
+ export const timeOfMessageId = (id) => {
12
+ if (!/^\d{10,20}$/.test(id))
13
+ return undefined;
14
+ const time = Number(BigInt(id) >> 16n);
15
+ return Number.isSafeInteger(time) && time > 0 ? time : undefined;
16
+ };
7
17
  //# sourceMappingURL=models.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"models.js","sourceRoot":"","sources":["../../src/domain/models.ts"],"names":[],"mappings":"AAAA;;;;GAIG"}
1
+ {"version":3,"file":"models.js","sourceRoot":"","sources":["../../src/domain/models.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAwHH;;;;GAIG;AACH,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,EAAM,EAAsB,EAAE;IAC5D,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,EAAE,CAAC;QAAE,OAAO,SAAS,CAAA;IAC7C,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,GAAG,CAAC,CAAA;IACtC,OAAO,MAAM,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAA;AAClE,CAAC,CAAA"}
package/dist/output.d.ts CHANGED
@@ -1,6 +1,7 @@
1
1
  import { type Renderer, type Streams } from "@leemour/cli-core";
2
2
  export interface OutputOptions {
3
3
  json?: boolean;
4
+ jsonl?: boolean;
4
5
  quiet?: boolean;
5
6
  streams?: Streams;
6
7
  /** Whether a person is looking. Defaults to whether stdout is a terminal. */
@@ -11,12 +12,14 @@ export interface OutputOptions {
11
12
  * One place decides the mode, so no command can disagree with another.
12
13
  *
13
14
  * `--json` forces machine output; otherwise a terminal gets the pretty renderer and a pipe gets
14
- * JSON, because a pipe is a script until proven otherwise. In every machine mode **stdout carries
15
- * one JSON value and nothing else** — diagnostics are on stderr in all modes, which is what makes
15
+ * JSON, because a pipe is a script until proven otherwise. `--jsonl` gives one JSON object per line
16
+ * instead. In every machine mode **stdout carries JSON and nothing else** — diagnostics are on stderr in all modes, which is what makes
16
17
  * that contract hold by construction rather than by remembering.
17
18
  */
18
- export declare const resolveOutput: ({ json, quiet, streams, tty, color }?: OutputOptions) => {
19
- format: "json" | "pretty";
19
+ export declare const resolveOutput: ({ json, jsonl, quiet, streams, tty, color }?: OutputOptions) => {
20
+ format: "json" | "jsonl" | "pretty";
21
+ color: boolean;
22
+ streams: Streams;
20
23
  renderer: Renderer;
21
24
  };
22
25
  //# sourceMappingURL=output.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"output.d.ts","sourceRoot":"","sources":["../src/output.ts"],"names":[],"mappings":"AAAA,OAAO,EAAkB,KAAK,QAAQ,EAAqB,KAAK,OAAO,EAAE,MAAM,mBAAmB,CAAA;AAElG,MAAM,WAAW,aAAa;IAC5B,IAAI,CAAC,EAAE,OAAO,CAAA;IACd,KAAK,CAAC,EAAE,OAAO,CAAA;IACf,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,6EAA6E;IAC7E,GAAG,CAAC,EAAE,OAAO,CAAA;IACb,KAAK,CAAC,EAAE,OAAO,CAAA;CAChB;AAED;;;;;;;GAOG;AACH,eAAO,MAAM,aAAa,GAAI,uCAAsC,aAAkB;;;CAUrF,CAAA"}
1
+ {"version":3,"file":"output.d.ts","sourceRoot":"","sources":["../src/output.ts"],"names":[],"mappings":"AAAA,OAAO,EAAkC,KAAK,QAAQ,EAAqB,KAAK,OAAO,EAAE,MAAM,mBAAmB,CAAA;AAElH,MAAM,WAAW,aAAa;IAC5B,IAAI,CAAC,EAAE,OAAO,CAAA;IACd,KAAK,CAAC,EAAE,OAAO,CAAA;IACf,KAAK,CAAC,EAAE,OAAO,CAAA;IACf,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,6EAA6E;IAC7E,GAAG,CAAC,EAAE,OAAO,CAAA;IACb,KAAK,CAAC,EAAE,OAAO,CAAA;CAChB;AAED;;;;;;;GAOG;AACH,eAAO,MAAM,aAAa,GAAI,8CAA8D,aAAkB;;;;;CAO7G,CAAA"}
package/dist/output.js CHANGED
@@ -1,21 +1,18 @@
1
- import { createRenderer } from "@leemour/cli-core";
1
+ import { createRenderer, processStreams } from "@leemour/cli-core";
2
2
  /**
3
3
  * One place decides the mode, so no command can disagree with another.
4
4
  *
5
5
  * `--json` forces machine output; otherwise a terminal gets the pretty renderer and a pipe gets
6
- * JSON, because a pipe is a script until proven otherwise. In every machine mode **stdout carries
7
- * one JSON value and nothing else** — diagnostics are on stderr in all modes, which is what makes
6
+ * JSON, because a pipe is a script until proven otherwise. `--jsonl` gives one JSON object per line
7
+ * instead. In every machine mode **stdout carries JSON and nothing else** — diagnostics are on stderr in all modes, which is what makes
8
8
  * that contract hold by construction rather than by remembering.
9
9
  */
10
- export const resolveOutput = ({ json, quiet, streams, tty, color } = {}) => {
10
+ export const resolveOutput = ({ json, jsonl, quiet, streams = processStreams, tty, color } = {}) => {
11
11
  const interactive = tty ?? process.stdout.isTTY === true;
12
- const format = json || !interactive ? "json" : "pretty";
13
- const renderer = createRenderer({
14
- format,
15
- color: color ?? (format === "pretty" && process.env.NO_COLOR === undefined),
16
- ...(streams ? { streams } : {}),
17
- });
18
- return { format, renderer: quiet ? silence(renderer) : renderer };
12
+ const format = jsonl ? "jsonl" : json || !interactive ? "json" : "pretty";
13
+ const painted = color ?? (format === "pretty" && process.env.NO_COLOR === undefined);
14
+ const renderer = createRenderer({ format, color: painted, streams });
15
+ return { format, color: painted, streams, renderer: quiet ? silence(renderer) : renderer };
19
16
  };
20
17
  /**
21
18
  * Everything diagnostic, and **not** `failure`: an exit code says which kind of thing went wrong
@@ -1 +1 @@
1
- {"version":3,"file":"output.js","sourceRoot":"","sources":["../src/output.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAkD,MAAM,mBAAmB,CAAA;AAWlG;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,EAAE,KAAK,KAAoB,EAAE,EAAE,EAAE;IACxF,MAAM,WAAW,GAAG,GAAG,IAAI,OAAO,CAAC,MAAM,CAAC,KAAK,KAAK,IAAI,CAAA;IACxD,MAAM,MAAM,GAAiB,IAAI,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAA;IACrE,MAAM,QAAQ,GAAG,cAAc,CAAC;QAC9B,MAAM;QACN,KAAK,EAAE,KAAK,IAAI,CAAC,MAAM,KAAK,QAAQ,IAAI,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK,SAAS,CAAC;QAC3E,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAChC,CAAC,CAAA;IAEF,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAA;AACnE,CAAC,CAAA;AAED;;;;;;;GAOG;AACH,MAAM,OAAO,GAAG,CAAC,QAAkB,EAAY,EAAE,CAAC,CAAC;IACjD,GAAG,QAAQ;IACX,IAAI,EAAE,GAAG,EAAE,GAAE,CAAC;IACd,OAAO,EAAE,GAAG,EAAE,GAAE,CAAC;IACjB,IAAI,EAAE,GAAG,EAAE,GAAE,CAAC;CACf,CAAC,CAAA"}
1
+ {"version":3,"file":"output.js","sourceRoot":"","sources":["../src/output.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,cAAc,EAAkD,MAAM,mBAAmB,CAAA;AAYlH;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,GAAG,cAAc,EAAE,GAAG,EAAE,KAAK,KAAoB,EAAE,EAAE,EAAE;IAChH,MAAM,WAAW,GAAG,GAAG,IAAI,OAAO,CAAC,MAAM,CAAC,KAAK,KAAK,IAAI,CAAA;IACxD,MAAM,MAAM,GAAiB,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAA;IACvF,MAAM,OAAO,GAAG,KAAK,IAAI,CAAC,MAAM,KAAK,QAAQ,IAAI,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAA;IACpF,MAAM,QAAQ,GAAG,cAAc,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,CAAA;IAEpE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAA;AAC5F,CAAC,CAAA;AAED;;;;;;;GAOG;AACH,MAAM,OAAO,GAAG,CAAC,QAAkB,EAAY,EAAE,CAAC,CAAC;IACjD,GAAG,QAAQ;IACX,IAAI,EAAE,GAAG,EAAE,GAAE,CAAC;IACd,OAAO,EAAE,GAAG,EAAE,GAAE,CAAC;IACjB,IAAI,EAAE,GAAG,EAAE,GAAE,CAAC;CACf,CAAC,CAAA"}
package/dist/program.d.ts CHANGED
@@ -1,6 +1,7 @@
1
1
  import { type Streams } from "@leemour/cli-core";
2
2
  import { Command } from "commander";
3
- export interface RunOptions {
3
+ import { type Environment } from "./commands/context.js";
4
+ export interface RunOptions extends Environment {
4
5
  streams?: Streams;
5
6
  /** Whether a person is looking. Defaults to whether stdout is a terminal. */
6
7
  tty?: boolean;
@@ -1 +1 @@
1
- {"version":3,"file":"program.d.ts","sourceRoot":"","sources":["../src/program.ts"],"names":[],"mappings":"AAAA,OAAO,EAA0D,KAAK,OAAO,EAAE,MAAM,mBAAmB,CAAA;AACxG,OAAO,EAAE,OAAO,EAAkB,MAAM,WAAW,CAAA;AAWnD,MAAM,WAAW,UAAU;IACzB,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,6EAA6E;IAC7E,GAAG,CAAC,EAAE,OAAO,CAAA;CACd;AAED,MAAM,WAAW,cAAc;IAC7B,mGAAmG;IACnG,GAAG,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAA;IAC5B,GAAG,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAA;CAC7B;AAED;;;;;;GAMG;AACH,eAAO,MAAM,aAAa,GAAI,eAAc,cAAmB,KAAG,OA4CjE,CAAA;AAOD;;;;;;GAMG;AACH,eAAO,MAAM,GAAG,GAAU,MAAM,MAAM,EAAE,EAAE,UAAS,UAAe,KAAG,OAAO,CAAC,MAAM,CA2DlF,CAAA"}
1
+ {"version":3,"file":"program.d.ts","sourceRoot":"","sources":["../src/program.ts"],"names":[],"mappings":"AAAA,OAAO,EAA0D,KAAK,OAAO,EAAE,MAAM,mBAAmB,CAAA;AACxG,OAAO,EAAE,OAAO,EAAkB,MAAM,WAAW,CAAA;AAMnD,OAAO,EAAE,KAAK,WAAW,EAAW,MAAM,uBAAuB,CAAA;AASjE,MAAM,WAAW,UAAW,SAAQ,WAAW;IAC7C,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,6EAA6E;IAC7E,GAAG,CAAC,EAAE,OAAO,CAAA;CACd;AAED,MAAM,WAAW,cAAc;IAC7B,mGAAmG;IACnG,GAAG,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAA;IAC5B,GAAG,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAA;CAC7B;AAED;;;;;;GAMG;AACH,eAAO,MAAM,aAAa,GAAI,eAAc,cAAmB,KAAG,OAuDjE,CAAA;AAOD;;;;;;GAMG;AACH,eAAO,MAAM,GAAG,GAAU,MAAM,MAAM,EAAE,EAAE,UAAS,UAAe,KAAG,OAAO,CAAC,MAAM,CA+DlF,CAAA"}
package/dist/program.js CHANGED
@@ -3,10 +3,14 @@ import { Command, CommanderError } from "commander";
3
3
  import { accountCommand } from "./commands/account.js";
4
4
  import { cacheCommand } from "./commands/cache.js";
5
5
  import { chatsCommand } from "./commands/chats.js";
6
+ import { configCommand } from "./commands/config.js";
6
7
  import { contactsCommand } from "./commands/contacts.js";
8
+ import { provide } from "./commands/context.js";
9
+ import { doctorCommand } from "./commands/doctor.js";
7
10
  import { messagesCommand } from "./commands/messages.js";
8
11
  import { runsCommand } from "./commands/runs.js";
9
12
  import { sessionCommand } from "./commands/session.js";
13
+ import { skillCommand } from "./commands/skill.js";
10
14
  import { commandWords, liftProfile } from "./profile.js";
11
15
  import { VERSION } from "./version.js";
12
16
  /**
@@ -24,10 +28,13 @@ export const createProgram = ({ out, err } = {}) => {
24
28
  .description("A local command line interface for a personal MAX Messenger account\n\n" +
25
29
  "The first word is the profile whenever it is not a command — `max personal chats list`.\n" +
26
30
  "`MAX_PROFILE` says the same thing for a whole shell session; without either it is `default`.")
27
- .version(VERSION, "-v, --version")
31
+ .version(VERSION, "-V, --version")
32
+ .option("-v, --verbose", "more detail in what is shown: -v ids, -vv everything we know", (_, level) => level + 1, 0)
28
33
  .option("--json", "machine-readable output: one JSON value on stdout, nothing else")
34
+ .option("--jsonl", "machine-readable output: one JSON object per line, for streaming and jq")
29
35
  .option("--quiet", "diagnostics off")
30
- .option("--verbose", "diagnostics on: ids and timings on stderr, never message content")
36
+ .option("--trace", "one line per request on stderr: ids and timings, never message content")
37
+ .option("--timeout <duration>", "give up on the whole command after this — 30s, 2m, 500ms")
31
38
  .option("--offline", "answer from what was recorded and never connect; fails if nothing was")
32
39
  .option("--record", "keep this run under `max runs` — ids and timings, never message content")
33
40
  .option("--no-record", "do not keep it, whatever the configuration says")
@@ -40,8 +47,11 @@ export const createProgram = ({ out, err } = {}) => {
40
47
  program.addCommand(chatsCommand());
41
48
  program.addCommand(contactsCommand());
42
49
  program.addCommand(messagesCommand());
50
+ program.addCommand(configCommand());
51
+ program.addCommand(doctorCommand());
43
52
  program.addCommand(cacheCommand());
44
53
  program.addCommand(runsCommand());
54
+ program.addCommand(skillCommand());
45
55
  // Depth-first: Commander does not pass `configureOutput` down to a command added with
46
56
  // `addCommand`, so `max messages --help` would write to the real terminal while the top level
47
57
  // wrote to the injected streams — and a test reading stdout would see nothing at all.
@@ -71,6 +81,9 @@ export const run = async (argv, options = {}) => {
71
81
  out: (text) => streams.data(text.replace(/\n$/, "")),
72
82
  err: (text) => streams.diagnostic(text.replace(/\n$/, "")),
73
83
  });
84
+ // Commands print through this rather than the process's own streams, so a test sees their output
85
+ // and not only help and errors.
86
+ provide(program, { ...options, streams });
74
87
  // Commander calls process.exit for --help and --version. A library that kills the process cannot
75
88
  // be tested and cannot be embedded, so it throws instead and `run` decides the exit code.
76
89
  //
@@ -1 +1 @@
1
- {"version":3,"file":"program.js","sourceRoot":"","sources":["../src/program.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"program.js","sourceRoot":"","sources":["../src/program.ts"],"names":[],"mappings":"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"}
@@ -55,6 +55,16 @@ export declare class Connection {
55
55
  * record — which is the run somebody actually wants to read.
56
56
  */
57
57
  invoke(opcode: number, payload?: Payload, watch?: (event: WireEvent) => void): Promise<Payload>;
58
+ /**
59
+ * Closes the socket and **settles anything still waiting**, rather than dropping it.
60
+ *
61
+ * ⚠ It used to clear the pending map without rejecting, which left the caller of an in-flight
62
+ * `invoke` awaiting a promise nothing could ever settle: the timers were cleared and the socket
63
+ * listeners removed in the same breath, so neither the timeout nor the close event was left to
64
+ * fire. Invisible in normal use, because `close()` runs in a `finally` once the body is done —
65
+ * and a hang the moment anything closes the connection while a request is out, which is exactly
66
+ * what a whole-command deadline does. Found by a test, not by a user.
67
+ */
58
68
  close(): Promise<void>;
59
69
  }
60
70
  //# sourceMappingURL=connection.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"connection.d.ts","sourceRoot":"","sources":["../../src/protocol/connection.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,IAAI,CAAA;AAC9B,OAAO,EAAqC,KAAK,YAAY,EAAE,KAAK,OAAO,EAAE,MAAM,YAAY,CAAA;AAE/F,eAAO,MAAM,iBAAiB,oCAAoC,CAAA;AAClE,iGAAiG;AACjG,eAAO,MAAM,UAAU,uBAAuB,CAAA;AAE9C;;;;;;GAMG;AACH,MAAM,WAAW,SAAS;IACxB,KAAK,EAAE,MAAM,GAAG,UAAU,CAAA;IAC1B,GAAG,EAAE,MAAM,CAAA;IACX,MAAM,EAAE,MAAM,CAAA;IACd,KAAK,EAAE,MAAM,CAAA;CACd;AAED,MAAM,WAAW,iBAAiB;IAChC,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,uCAAuC;IACvC,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,iGAAiG;IACjG,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,YAAY,KAAK,IAAI,CAAA;IACvC,2DAA2D;IAC3D,YAAY,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,KAAK,SAAS,CAAA;CAC1D;AAED,qBAAa,aAAc,SAAQ,KAAK;IACtC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;IACvB,QAAQ,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAAA;gBAEpB,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,IAAI;CAMrE;AAED;;;;;;;GAOG;AACH,qBAAa,UAAU;;gBAmBT,OAAO,GAAE,iBAAsB;IAQrC,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAwB3B;;;;;;;;;;OAUG;IACG,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,GAAE,OAAY,EAAE,KAAK,CAAC,EAAE,CAAC,KAAK,EAAE,SAAS,KAAK,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC;IAoCnG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAuC7B"}
1
+ {"version":3,"file":"connection.d.ts","sourceRoot":"","sources":["../../src/protocol/connection.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,IAAI,CAAA;AAC9B,OAAO,EAAqC,KAAK,YAAY,EAAE,KAAK,OAAO,EAAE,MAAM,YAAY,CAAA;AAE/F,eAAO,MAAM,iBAAiB,oCAAoC,CAAA;AAClE,iGAAiG;AACjG,eAAO,MAAM,UAAU,uBAAuB,CAAA;AAE9C;;;;;;GAMG;AACH,MAAM,WAAW,SAAS;IACxB,KAAK,EAAE,MAAM,GAAG,UAAU,CAAA;IAC1B,GAAG,EAAE,MAAM,CAAA;IACX,MAAM,EAAE,MAAM,CAAA;IACd,KAAK,EAAE,MAAM,CAAA;CACd;AAED,MAAM,WAAW,iBAAiB;IAChC,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,uCAAuC;IACvC,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,iGAAiG;IACjG,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,YAAY,KAAK,IAAI,CAAA;IACvC,2DAA2D;IAC3D,YAAY,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,KAAK,SAAS,CAAA;CAC1D;AAED,qBAAa,aAAc,SAAQ,KAAK;IACtC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;IACvB,QAAQ,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAAA;gBAEpB,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,IAAI;CAMrE;AAED;;;;;;;GAOG;AACH,qBAAa,UAAU;;gBAmBT,OAAO,GAAE,iBAAsB;IAQrC,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAwB3B;;;;;;;;;;OAUG;IACG,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,GAAE,OAAY,EAAE,KAAK,CAAC,EAAE,CAAC,KAAK,EAAE,SAAS,KAAK,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC;IAoCzG;;;;;;;;;OASG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAgD7B"}
@@ -101,16 +101,33 @@ export class Connection {
101
101
  }
102
102
  return frame.payload ?? {};
103
103
  }
104
+ /**
105
+ * Closes the socket and **settles anything still waiting**, rather than dropping it.
106
+ *
107
+ * ⚠ It used to clear the pending map without rejecting, which left the caller of an in-flight
108
+ * `invoke` awaiting a promise nothing could ever settle: the timers were cleared and the socket
109
+ * listeners removed in the same breath, so neither the timeout nor the close event was left to
110
+ * fire. Invisible in normal use, because `close()` runs in a `finally` once the body is done —
111
+ * and a hang the moment anything closes the connection while a request is out, which is exactly
112
+ * what a whole-command deadline does. Found by a test, not by a user.
113
+ */
104
114
  async close() {
105
115
  this.#closed = true;
106
116
  const socket = this.#socket;
107
117
  this.#socket = undefined;
108
- for (const { timer } of this.#pending.values())
109
- clearTimeout(timer);
110
- this.#pending.clear();
118
+ this.#failAll(new Error("the connection was closed before MAX answered"));
111
119
  if (!socket)
112
120
  return;
113
121
  socket.removeAllListeners();
122
+ // ⚠ **An error listener has to survive the close.** `ws` emits `error` when a socket is closed
123
+ // while it is still CONNECTING — measured against the real service — and an `error` event with
124
+ // no listener is how Node kills the whole process. Removing every listener and *then* closing
125
+ // turned a timeout into an unhandled event and a stack trace: exit 1 and a dump of `ws`
126
+ // internals, instead of exit 9 and one sentence.
127
+ //
128
+ // Nothing here can act on such an error anyway. The connection is being discarded; the socket
129
+ // failing to shut politely changes nothing a caller could use.
130
+ socket.on("error", () => { });
114
131
  if (socket.readyState === socket.OPEN || socket.readyState === socket.CONNECTING)
115
132
  socket.close();
116
133
  }
@@ -1 +1 @@
1
- {"version":3,"file":"connection.js","sourceRoot":"","sources":["../../src/protocol/connection.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"connection.js","sourceRoot":"","sources":["../../src/protocol/connection.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ import type { Message, MessageHit, WindowedMessage } from "../domain/models.js";
2
+ export interface RenderOptions {
3
+ /** 0 — the conversation; 1 — the ids worth searching by; 2 — everything the model knows. */
4
+ verbosity?: 0 | 1 | 2;
5
+ width?: number;
6
+ /**
7
+ * Whether to style at all. **Decided by the caller**: `styleText` checks the stream under Node and
8
+ * not under Bun, which styles a pipe too (measured 2026-09-22).
9
+ */
10
+ color?: boolean;
11
+ /** A colour per sender, `вы` keeping cyan to itself. */
12
+ senderColors?: boolean;
13
+ locale?: string;
14
+ timeZone?: string;
15
+ profile?: string;
16
+ }
17
+ export declare const renderMessages: (messages: (Message | MessageHit | WindowedMessage)[], options?: RenderOptions) => string;
18
+ export declare const renderMessage: (message: Message | MessageHit | WindowedMessage, options?: RenderOptions) => string;
19
+ //# sourceMappingURL=messages.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"messages.d.ts","sourceRoot":"","sources":["../../src/rendering/messages.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAc,OAAO,EAAE,UAAU,EAAiB,eAAe,EAAE,MAAM,qBAAqB,CAAA;AAE1G,MAAM,WAAW,aAAa;IAC5B,4FAA4F;IAC5F,SAAS,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;IACrB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd;;;OAGG;IACH,KAAK,CAAC,EAAE,OAAO,CAAA;IACf,wDAAwD;IACxD,YAAY,CAAC,EAAE,OAAO,CAAA;IACtB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,OAAO,CAAC,EAAE,MAAM,CAAA;CACjB;AASD,eAAO,MAAM,cAAc,GACzB,UAAU,CAAC,OAAO,GAAG,UAAU,GAAG,eAAe,CAAC,EAAE,EACpD,UAAS,aAAkB,KAC1B,MAcF,CAAA;AAED,eAAO,MAAM,aAAa,GAAI,SAAS,OAAO,GAAG,UAAU,GAAG,eAAe,EAAE,UAAS,aAAkB,KAAG,MA+C5G,CAAA"}
@@ -0,0 +1,138 @@
1
+ import { styleText } from "node:util";
2
+ import stringWidth from "string-width";
3
+ import wrapAnsi from "wrap-ansi";
4
+ const TIME_WIDTH = 8;
5
+ const INDENT = " ".repeat(TIME_WIDTH + 2);
6
+ const MIN_WIDTH = 40;
7
+ const SENDER_COLOURS = ["green", "yellow", "magenta", "blue", "red"];
8
+ export const renderMessages = (messages, options = {}) => {
9
+ if (messages.length === 0)
10
+ return "(nothing)";
11
+ const day = dayFormatter(options);
12
+ const paint = painter(options);
13
+ let previous;
14
+ const blocks = [];
15
+ for (const message of messages) {
16
+ const date = day(message.timestamp);
17
+ if (date !== previous)
18
+ blocks.push(paint("dim", `── ${date} ──`));
19
+ previous = date;
20
+ blocks.push(renderMessage(message, options));
21
+ }
22
+ return blocks.join("\n\n");
23
+ };
24
+ export const renderMessage = (message, options = {}) => {
25
+ const paint = painter(options);
26
+ const width = Math.max(MIN_WIDTH, options.width ?? 80);
27
+ const room = width - INDENT.length;
28
+ const time = timeFormatter(options);
29
+ const verbosity = options.verbosity ?? 0;
30
+ const chat = "chatTitle" in message ? paint("dim", ` · ${message.chatTitle ?? message.chatId}`) : "";
31
+ const mark = "anchor" in message && message.anchor ? paint("bold", " ◀") : "";
32
+ const lines = [`${paint("dim", time(message.timestamp))} ${senderOf(message, options)}${chat}${mark}`];
33
+ const body = (text) => wrapAnsi(text, room, { hard: true }).split("\n");
34
+ if (message.replyTo)
35
+ lines.push(paint("dim", preview("↳", message.replyTo, room)));
36
+ if (message.forwardedFrom) {
37
+ lines.push(paint("dim", `↪ ${nameOf(message.forwardedFrom)}`));
38
+ if (message.forwardedFrom.text)
39
+ lines.push(...body(message.forwardedFrom.text));
40
+ lines.push(...attachmentLines(message.forwardedFrom.attachments, paint, options));
41
+ }
42
+ if (message.text)
43
+ lines.push(...body(message.text));
44
+ lines.push(...attachmentLines(message.attachments, paint, options));
45
+ if (message.editedAt)
46
+ lines.push(paint("dim", `edited ${editedAt(message, options)}`));
47
+ if (verbosity >= 1) {
48
+ const fields = [
49
+ ["message", message.id],
50
+ ["sender", message.senderId],
51
+ ["chat", message.chatId],
52
+ ["reply to", message.replyTo?.id],
53
+ ["forward of", message.forwardedFrom?.id],
54
+ ...message.attachments.map((a) => ["link", a.url]),
55
+ ];
56
+ if (verbosity >= 2) {
57
+ fields.push(["provider", "max"], ["profile", options.profile], ["sent", message.timestamp], ["edited", message.editedAt], ["outgoing", message.outgoing === null ? "unknown" : String(message.outgoing)], ...message.attachments.map((a) => ["attachment", JSON.stringify(a)]));
58
+ }
59
+ const shown = fields.filter((field) => typeof field[1] === "string");
60
+ const label = Math.max(...shown.map(([key]) => key.length));
61
+ lines.push("", ...shown.map(([key, value]) => paint("dim", `${key.padEnd(label)} ${value}`)));
62
+ }
63
+ return lines.map((line, index) => (index === 0 || line === "" ? line : `${INDENT}${line}`)).join("\n");
64
+ };
65
+ const painter = ({ color = false }) => (style, text) => color ? styleText(style, text, { validateStream: false }) : text;
66
+ const senderOf = (message, options) => {
67
+ const paint = painter(options);
68
+ if (message.outgoing === true)
69
+ return paint(["bold", "cyan"], "вы");
70
+ const name = nameOf(message);
71
+ if (!options.senderColors)
72
+ return paint("bold", name);
73
+ const colour = SENDER_COLOURS[hash(message.senderId ?? name) % SENDER_COLOURS.length] ?? "green";
74
+ return paint(["bold", colour], name);
75
+ };
76
+ const nameOf = ({ senderName, senderId, outgoing }) => outgoing === true ? "вы" : (senderName ?? senderId ?? "unknown");
77
+ const hash = (value) => [...value].reduce((sum, char) => (sum * 31 + char.charCodeAt(0)) >>> 0, 7);
78
+ /** One line: it is a pointer to the other message, not a second copy of it. */
79
+ const preview = (mark, quoted, room) => {
80
+ const text = quoted.text.split("\n")[0] || (quoted.attachments[0] ? `📎 ${quoted.attachments[0].kind}` : "");
81
+ const line = text ? `${mark} ${nameOf(quoted)}: ${text}` : `${mark} message ${quoted.id}`;
82
+ if (stringWidth(line) <= room)
83
+ return line;
84
+ return `${wrapAnsi(line, room - 1, { hard: true }).split("\n")[0]}…`;
85
+ };
86
+ /**
87
+ * Compact, and each one a link: `📎 photo`, `📎 photo ×3 1 2 3`, `📎 report.pdf · 24 MB`. The link
88
+ * is an OSC 8 hyperlink where there is colour; without it the address is printed, so it is never
89
+ * out of reach.
90
+ */
91
+ const attachmentLines = (attachments, paint, options) => {
92
+ const link = (label, url) => url === undefined ? label : options.color ? `\u001b]8;;${url}\u0007${label}\u001b]8;;\u0007` : `${label} ${url}`;
93
+ const groups = new Map();
94
+ for (const attachment of attachments) {
95
+ const key = attachment.name ?? attachment.title ?? attachment.kind;
96
+ groups.set(key, [...(groups.get(key) ?? []), attachment]);
97
+ }
98
+ return [...groups].map(([label, same]) => {
99
+ const first = same[0];
100
+ const size = first?.size === undefined ? "" : ` · ${megabytes(first.size)}`;
101
+ if (same.length === 1)
102
+ return paint("dim", `📎 ${link(`${label}${size}`, first?.url)}`);
103
+ const each = same.map((attachment, index) => link(String(index + 1), attachment.url)).join(" ");
104
+ return paint("dim", `📎 ${label} ×${same.length} ${each}`);
105
+ });
106
+ };
107
+ const megabytes = (bytes) => bytes >= 1_000_000 ? `${Math.round(bytes / 1_000_000)} MB` : `${Math.max(1, Math.round(bytes / 1_000))} KB`;
108
+ const parts = (format, iso) => Object.fromEntries(format.formatToParts(new Date(iso)).map(({ type, value }) => [type, value]));
109
+ const timeFormatter = ({ timeZone }) => {
110
+ const format = new Intl.DateTimeFormat("en-GB", {
111
+ hour: "2-digit",
112
+ minute: "2-digit",
113
+ second: "2-digit",
114
+ hourCycle: "h23",
115
+ ...(timeZone ? { timeZone } : {}),
116
+ });
117
+ return (iso) => {
118
+ const { hour, minute, second } = parts(format, iso);
119
+ return `${hour}:${minute}:${second}`;
120
+ };
121
+ };
122
+ /** `3 января 2026` — the `г.` Intl adds for Russian is dropped; the line is a heading, not a date field. */
123
+ const dayFormatter = ({ locale = "ru-RU", timeZone }) => {
124
+ const format = new Intl.DateTimeFormat(locale, {
125
+ day: "numeric",
126
+ month: "long",
127
+ year: "numeric",
128
+ ...(timeZone ? { timeZone } : {}),
129
+ });
130
+ return (iso) => format.format(new Date(iso)).replace(/\s*г\.$/, "");
131
+ };
132
+ const editedAt = (message, options) => {
133
+ const edited = message.editedAt ?? message.timestamp;
134
+ const time = timeFormatter(options)(edited);
135
+ const day = dayFormatter(options);
136
+ return day(edited) === day(message.timestamp) ? time : `${day(edited)} ${time}`;
137
+ };
138
+ //# sourceMappingURL=messages.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"messages.js","sourceRoot":"","sources":["../../src/rendering/messages.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,6 @@
1
1
  import type { Payload } from "../protocol/frame.js";
2
2
  /**
3
- * One request, as both sinks see it: `--verbose` renders it, the run log writes it as a line of
3
+ * One request, as both sinks see it: `--trace` renders it, the run log writes it as a line of
4
4
  * JSON. **One object, two sinks** — a second shape for one of them is how the two start disagreeing
5
5
  * about what happened.
6
6
  *
@@ -10,7 +10,7 @@ export interface RecordingOptions {
10
10
  */
11
11
  options: {
12
12
  record?: boolean | undefined;
13
- verbose?: boolean | undefined;
13
+ trace?: boolean | undefined;
14
14
  };
15
15
  /** What `resolveOutput` decided for the data stream. Diagnostics follow it (`NEED-53`). */
16
16
  format: RenderFormat;
@@ -23,7 +23,7 @@ export interface RecordingOptions {
23
23
  /**
24
24
  * Runs one command with the diagnostics turned on, and **finalizes on every path**.
25
25
  *
26
- * Two sinks, one event object (plan §3.1, §3.7): `--verbose` shows it as it happens and keeps
26
+ * Two sinks, one event object (plan §3.1, §3.7): `--trace` shows it as it happens and keeps
27
27
  * nothing, `--record` keeps it and shows nothing. Either, both, or — by default — neither, in
28
28
  * which case this costs a counter.
29
29
  *
@@ -1 +1 @@
1
- {"version":3,"file":"recording.d.ts","sourceRoot":"","sources":["../../src/runs/recording.ts"],"names":[],"mappings":"AAAA,OAAO,EAA4B,KAAK,YAAY,EAAE,KAAK,OAAO,EAAE,MAAM,mBAAmB,CAAA;AAE7F,OAAO,EAAE,KAAK,eAAe,EAAe,MAAM,aAAa,CAAA;AAG/D,MAAM,WAAW,gBAAgB;IAC/B,iFAAiF;IACjF,OAAO,EAAE,MAAM,CAAA;IACf,OAAO,EAAE,MAAM,CAAA;IACf;;;OAGG;IACH,OAAO,EAAE;QAAE,MAAM,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;QAAC,OAAO,CAAC,EAAE,OAAO,GAAG,SAAS,CAAA;KAAE,CAAA;IACxE,2FAA2F;IAC3F,MAAM,EAAE,YAAY,CAAA;IACpB,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,iDAAiD;IACjD,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,GAAG,CAAC,EAAE,MAAM,IAAI,CAAA;CACjB;AAED;;;;;;;;;;GAUG;AACH,eAAO,MAAM,QAAQ,GAAU,CAAC,EAC9B,SAAS,gBAAgB,EACzB,MAAM,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE,eAAe,KAAK,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,KAC7D,OAAO,CAAC,CAAC,CAsCX,CAAA"}
1
+ {"version":3,"file":"recording.d.ts","sourceRoot":"","sources":["../../src/runs/recording.ts"],"names":[],"mappings":"AAAA,OAAO,EAA4B,KAAK,YAAY,EAAE,KAAK,OAAO,EAAE,MAAM,mBAAmB,CAAA;AAE7F,OAAO,EAAE,KAAK,eAAe,EAAe,MAAM,aAAa,CAAA;AAG/D,MAAM,WAAW,gBAAgB;IAC/B,iFAAiF;IACjF,OAAO,EAAE,MAAM,CAAA;IACf,OAAO,EAAE,MAAM,CAAA;IACf;;;OAGG;IACH,OAAO,EAAE;QAAE,MAAM,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;QAAC,KAAK,CAAC,EAAE,OAAO,GAAG,SAAS,CAAA;KAAE,CAAA;IACtE,2FAA2F;IAC3F,MAAM,EAAE,YAAY,CAAA;IACpB,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,iDAAiD;IACjD,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,GAAG,CAAC,EAAE,MAAM,IAAI,CAAA;CACjB;AAED;;;;;;;;;;GAUG;AACH,eAAO,MAAM,QAAQ,GAAU,CAAC,EAC9B,SAAS,gBAAgB,EACzB,MAAM,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE,eAAe,KAAK,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,KAC7D,OAAO,CAAC,CAAC,CAsCX,CAAA"}
@@ -5,7 +5,7 @@ import { runsDirFor, startRun } from "./run.js";
5
5
  /**
6
6
  * Runs one command with the diagnostics turned on, and **finalizes on every path**.
7
7
  *
8
- * Two sinks, one event object (plan §3.1, §3.7): `--verbose` shows it as it happens and keeps
8
+ * Two sinks, one event object (plan §3.1, §3.7): `--trace` shows it as it happens and keeps
9
9
  * nothing, `--record` keeps it and shows nothing. Either, both, or — by default — neither, in
10
10
  * which case this costs a counter.
11
11
  *
@@ -15,7 +15,7 @@ import { runsDirFor, startRun } from "./run.js";
15
15
  */
16
16
  export const recorded = async (options, body) => {
17
17
  const streams = options.streams ?? processStreams;
18
- const verbose = options.options.verbose === true;
18
+ const trace = options.options.trace === true;
19
19
  const run = options.options.record === true
20
20
  ? startRun({
21
21
  runsDir: options.runsDir ?? runsDirFor(),
@@ -32,7 +32,7 @@ export const recorded = async (options, body) => {
32
32
  requests += 1;
33
33
  // Text for a person, one JSON object per line for anything else — the rule `resolveOutput`
34
34
  // already applies to the data stream (`NEED-53`). Never stdout, in any mode.
35
- if (verbose)
35
+ if (trace)
36
36
  streams.diagnostic(options.format === "pretty" ? renderEvent(event) : JSON.stringify(event));
37
37
  run?.logger.info(event);
38
38
  };
@@ -1 +1 @@
1
- {"version":3,"file":"recording.js","sourceRoot":"","sources":["../../src/runs/recording.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,cAAc,EAAmC,MAAM,mBAAmB,CAAA;AAC7F,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAA;AACvC,OAAO,EAAwB,WAAW,EAAE,MAAM,aAAa,CAAA;AAC/D,OAAO,EAAY,UAAU,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAA;AAoBzD;;;;;;;;;;GAUG;AACH,MAAM,CAAC,MAAM,QAAQ,GAAG,KAAK,EAC3B,OAAyB,EACzB,IAA8D,EAClD,EAAE;IACd,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,IAAI,cAAc,CAAA;IACjD,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,OAAO,KAAK,IAAI,CAAA;IAEhD,MAAM,GAAG,GACP,OAAO,CAAC,OAAO,CAAC,MAAM,KAAK,IAAI;QAC7B,CAAC,CAAC,QAAQ,CAAC;YACP,OAAO,EAAE,OAAO,CAAC,OAAO,IAAI,UAAU,EAAE;YACxC,OAAO,EAAE,OAAO,CAAC,OAAO;YACxB,OAAO,EAAE,OAAO,CAAC,OAAO;YACxB,UAAU,EAAE,OAAO;YACnB,GAAG,CAAC,OAAO,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,OAAO,CAAC,QAAQ,EAAE,CAAC;YACzE,GAAG,CAAC,OAAO,CAAC,GAAG,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE,CAAC;SAC3D,CAAC;QACJ,CAAC,CAAC,SAAS,CAAA;IAEf,IAAI,QAAQ,GAAG,CAAC,CAAA;IAEhB,MAAM,MAAM,GAAG,CAAC,KAAsB,EAAQ,EAAE;QAC9C,IAAI,KAAK,CAAC,KAAK,KAAK,SAAS;YAAE,QAAQ,IAAI,CAAC,CAAA;QAC5C,2FAA2F;QAC3F,6EAA6E;QAC7E,IAAI,OAAO;YAAE,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAA;QACzG,GAAG,EAAE,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;IACzB,CAAC,CAAA;IAED,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,CAAA;QACjC,MAAM,GAAG,EAAE,MAAM,CAAC,SAAS,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAA;QAC1C,OAAO,MAAM,CAAA;IACf,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,GAAG,EAAE,MAAM,CAAC,QAAQ,EAAE;YAC1B,QAAQ;YACR,4FAA4F;YAC5F,GAAG,CAAC,KAAK,YAAY,QAAQ,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAChE,CAAC,CAAA;QACF,MAAM,KAAK,CAAA;IACb,CAAC;AACH,CAAC,CAAA"}
1
+ {"version":3,"file":"recording.js","sourceRoot":"","sources":["../../src/runs/recording.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,cAAc,EAAmC,MAAM,mBAAmB,CAAA;AAC7F,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAA;AACvC,OAAO,EAAwB,WAAW,EAAE,MAAM,aAAa,CAAA;AAC/D,OAAO,EAAY,UAAU,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAA;AAoBzD;;;;;;;;;;GAUG;AACH,MAAM,CAAC,MAAM,QAAQ,GAAG,KAAK,EAC3B,OAAyB,EACzB,IAA8D,EAClD,EAAE;IACd,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,IAAI,cAAc,CAAA;IACjD,MAAM,KAAK,GAAG,OAAO,CAAC,OAAO,CAAC,KAAK,KAAK,IAAI,CAAA;IAE5C,MAAM,GAAG,GACP,OAAO,CAAC,OAAO,CAAC,MAAM,KAAK,IAAI;QAC7B,CAAC,CAAC,QAAQ,CAAC;YACP,OAAO,EAAE,OAAO,CAAC,OAAO,IAAI,UAAU,EAAE;YACxC,OAAO,EAAE,OAAO,CAAC,OAAO;YACxB,OAAO,EAAE,OAAO,CAAC,OAAO;YACxB,UAAU,EAAE,OAAO;YACnB,GAAG,CAAC,OAAO,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,OAAO,CAAC,QAAQ,EAAE,CAAC;YACzE,GAAG,CAAC,OAAO,CAAC,GAAG,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE,CAAC;SAC3D,CAAC;QACJ,CAAC,CAAC,SAAS,CAAA;IAEf,IAAI,QAAQ,GAAG,CAAC,CAAA;IAEhB,MAAM,MAAM,GAAG,CAAC,KAAsB,EAAQ,EAAE;QAC9C,IAAI,KAAK,CAAC,KAAK,KAAK,SAAS;YAAE,QAAQ,IAAI,CAAC,CAAA;QAC5C,2FAA2F;QAC3F,6EAA6E;QAC7E,IAAI,KAAK;YAAE,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAA;QACvG,GAAG,EAAE,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;IACzB,CAAC,CAAA;IAED,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,CAAA;QACjC,MAAM,GAAG,EAAE,MAAM,CAAC,SAAS,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAA;QAC1C,OAAO,MAAM,CAAA;IACf,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,GAAG,EAAE,MAAM,CAAC,QAAQ,EAAE;YAC1B,QAAQ;YACR,4FAA4F;YAC5F,GAAG,CAAC,KAAK,YAAY,QAAQ,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAChE,CAAC,CAAA;QACF,MAAM,KAAK,CAAA;IACb,CAAC;AACH,CAAC,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"mock-max.d.ts","sourceRoot":"","sources":["../../src/testing/mock-max.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,IAAI,CAAA;AACnC,OAAO,EAAqC,KAAK,OAAO,EAAE,MAAM,sBAAsB,CAAA;AAEtF,MAAM,WAAW,cAAc;IAC7B,iGAAiG;IACjG,4FAA4F;IAC5F,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,GAAG,CAAC,MAAM,OAAO,GAAG,SAAS,CAAC,CAAC,CAAA;IAC9D,8EAA8E;IAC9E,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CAChC;AAED,MAAM,WAAW,OAAO;IACtB,YAAY,EAAE,MAAM,SAAS,CAAA;IAC7B,sFAAsF;IACtF,IAAI,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,OAAO,CAAA;KAAE,EAAE,CAAA;IAC5C,8FAA8F;IAC9F,UAAU,EAAE,MAAM,EAAE,CAAA;IACpB,MAAM,EAAE,OAAO,CAAA;CAChB;AAED;;;;;;GAMG;AACH,eAAO,MAAM,OAAO,GAAI,qBAA0B,cAAc,KAAG,OA2ClE,CAAA"}
1
+ {"version":3,"file":"mock-max.d.ts","sourceRoot":"","sources":["../../src/testing/mock-max.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,IAAI,CAAA;AACnC,OAAO,EAAqC,KAAK,OAAO,EAAE,MAAM,sBAAsB,CAAA;AAEtF,MAAM,WAAW,cAAc;IAC7B,iGAAiG;IACjG,4FAA4F;IAC5F,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,GAAG,CAAC,MAAM,OAAO,GAAG,SAAS,CAAC,CAAC,CAAA;IAC9D,8EAA8E;IAC9E,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CAChC;AAED,MAAM,WAAW,OAAO;IACtB,YAAY,EAAE,MAAM,SAAS,CAAA;IAC7B,sFAAsF;IACtF,IAAI,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,OAAO,CAAA;KAAE,EAAE,CAAA;IAC5C,8FAA8F;IAC9F,UAAU,EAAE,MAAM,EAAE,CAAA;IACpB,MAAM,EAAE,OAAO,CAAA;CAChB;AAED;;;;;;GAMG;AACH,eAAO,MAAM,OAAO,GAAI,qBAA0B,cAAc,KAAG,OAyDlE,CAAA"}
@@ -8,7 +8,13 @@ import { Command, decodeFrame, encodeFrame } from "../protocol/frame.js";
8
8
  * rather than a hope: assert that opcode 50 is absent from `sent`.
9
9
  */
10
10
  export const mockMax = ({ answers, refuse = {} }) => {
11
- const state = { createSocket: () => socket, sent: [], unexpected: [], closed: false };
11
+ // Open when asked for, as a real socket does — not when the mock is built, or a connection made
12
+ // later than the same tick waits for an event that already fired.
13
+ const createSocket = () => {
14
+ queueMicrotask(() => socket.emit("open"));
15
+ return socket;
16
+ };
17
+ const state = { createSocket, sent: [], unexpected: [], closed: false };
12
18
  const socket = new (class extends EventEmitter {
13
19
  readyState = 1;
14
20
  OPEN = 1;
@@ -35,12 +41,20 @@ export const mockMax = ({ answers, refuse = {} }) => {
35
41
  answer(frame) {
36
42
  queueMicrotask(() => this.emit("message", encodeFrame(frame)));
37
43
  }
44
+ /**
45
+ * ⚠ **Emits `error` on the way out, the way `ws` does when a socket is closed before it
46
+ * finished connecting** — measured against the real service on 2026-09-22.
47
+ *
48
+ * It is here so the suite can see what that costs: an `error` event with nobody listening is
49
+ * how Node kills the process, so a connection that strips its listeners before closing turns
50
+ * a timeout into a stack trace. A mock that closed politely would have let that ship.
51
+ */
38
52
  close() {
39
53
  state.closed = true;
40
54
  this.readyState = 3;
55
+ this.emit("error", new Error("WebSocket was closed before the connection was established"));
41
56
  }
42
57
  })();
43
- queueMicrotask(() => socket.emit("open"));
44
58
  return state;
45
59
  };
46
60
  //# sourceMappingURL=mock-max.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"mock-max.js","sourceRoot":"","sources":["../../src/testing/mock-max.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAE1C,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,WAAW,EAAgB,MAAM,sBAAsB,CAAA;AAmBtF;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,OAAO,GAAG,CAAC,EAAE,OAAO,EAAE,MAAM,GAAG,EAAE,EAAkB,EAAW,EAAE;IAC3E,MAAM,KAAK,GAAY,EAAE,YAAY,EAAE,GAAG,EAAE,CAAC,MAA8B,EAAE,IAAI,EAAE,EAAE,EAAE,UAAU,EAAE,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,CAAA;IAEtH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAM,SAAQ,YAAY;QAC5C,UAAU,GAAG,CAAC,CAAA;QACL,IAAI,GAAG,CAAC,CAAA;QACR,UAAU,GAAG,CAAC,CAAA;QACd,OAAO,GAAG,CAAC,CAAA;QAEpB,IAAI,CAAC,GAAW;YACd,MAAM,KAAK,GAAG,WAAW,CAAC,GAAG,CAAC,CAAA;YAC9B,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,IAAI,EAAE,EAAE,CAAC,CAAA;YAEvE,MAAM,OAAO,GAAG,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAA;YACpC,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;gBAC1B,IAAI,CAAC,MAAM,CAAC,EAAE,GAAG,EAAE,KAAK,CAAC,GAAG,IAAI,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,OAAO,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,GAAG,EAAE,OAAO,CAAC,KAAK,EAAE,CAAC,CAAA;gBAC3G,OAAM;YACR,CAAC;YAED,MAAM,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,CAAA;YACpC,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;gBACzB,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAA;gBACnC,OAAM;YACR,CAAC;YAED,MAAM,OAAO,GAAG,OAAO,MAAM,KAAK,UAAU,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,MAAM,CAAA;YAChE,IAAI,OAAO,KAAK,SAAS;gBAAE,OAAM,CAAC,4DAA4D;YAE9F,IAAI,CAAC,MAAM,CAAC,EAAE,GAAG,EAAE,KAAK,CAAC,GAAG,IAAI,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,OAAO,EAAE,GAAG,EAAE,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAA;QAC5F,CAAC;QAED,MAAM,CAAC,KAAsE;YAC3E,cAAc,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA;QAChE,CAAC;QAED,KAAK;YACH,KAAK,CAAC,MAAM,GAAG,IAAI,CAAA;YACnB,IAAI,CAAC,UAAU,GAAG,CAAC,CAAA;QACrB,CAAC;KACF,CAAC,EAAE,CAAA;IAEJ,cAAc,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAA;IACzC,OAAO,KAAK,CAAA;AACd,CAAC,CAAA"}
1
+ {"version":3,"file":"mock-max.js","sourceRoot":"","sources":["../../src/testing/mock-max.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAE1C,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,WAAW,EAAgB,MAAM,sBAAsB,CAAA;AAmBtF;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,OAAO,GAAG,CAAC,EAAE,OAAO,EAAE,MAAM,GAAG,EAAE,EAAkB,EAAW,EAAE;IAC3E,gGAAgG;IAChG,kEAAkE;IAClE,MAAM,YAAY,GAAG,GAAG,EAAE;QACxB,cAAc,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAA;QACzC,OAAO,MAA8B,CAAA;IACvC,CAAC,CAAA;IACD,MAAM,KAAK,GAAY,EAAE,YAAY,EAAE,IAAI,EAAE,EAAE,EAAE,UAAU,EAAE,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,CAAA;IAEhF,MAAM,MAAM,GAAG,IAAI,CAAC,KAAM,SAAQ,YAAY;QAC5C,UAAU,GAAG,CAAC,CAAA;QACL,IAAI,GAAG,CAAC,CAAA;QACR,UAAU,GAAG,CAAC,CAAA;QACd,OAAO,GAAG,CAAC,CAAA;QAEpB,IAAI,CAAC,GAAW;YACd,MAAM,KAAK,GAAG,WAAW,CAAC,GAAG,CAAC,CAAA;YAC9B,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,IAAI,EAAE,EAAE,CAAC,CAAA;YAEvE,MAAM,OAAO,GAAG,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAA;YACpC,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;gBAC1B,IAAI,CAAC,MAAM,CAAC,EAAE,GAAG,EAAE,KAAK,CAAC,GAAG,IAAI,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,OAAO,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,GAAG,EAAE,OAAO,CAAC,KAAK,EAAE,CAAC,CAAA;gBAC3G,OAAM;YACR,CAAC;YAED,MAAM,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,CAAA;YACpC,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;gBACzB,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAA;gBACnC,OAAM;YACR,CAAC;YAED,MAAM,OAAO,GAAG,OAAO,MAAM,KAAK,UAAU,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,MAAM,CAAA;YAChE,IAAI,OAAO,KAAK,SAAS;gBAAE,OAAM,CAAC,4DAA4D;YAE9F,IAAI,CAAC,MAAM,CAAC,EAAE,GAAG,EAAE,KAAK,CAAC,GAAG,IAAI,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,OAAO,EAAE,GAAG,EAAE,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAA;QAC5F,CAAC;QAED,MAAM,CAAC,KAAsE;YAC3E,cAAc,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA;QAChE,CAAC;QAED;;;;;;;WAOG;QACH,KAAK;YACH,KAAK,CAAC,MAAM,GAAG,IAAI,CAAA;YACnB,IAAI,CAAC,UAAU,GAAG,CAAC,CAAA;YACnB,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,KAAK,CAAC,4DAA4D,CAAC,CAAC,CAAA;QAC7F,CAAC;KACF,CAAC,EAAE,CAAA;IAEJ,OAAO,KAAK,CAAA;AACd,CAAC,CAAA"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=sandbox.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sandbox.d.ts","sourceRoot":"","sources":["../../src/testing/sandbox.ts"],"names":[],"mappings":""}