@leemour/max-cli 0.9.0 → 0.11.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.
- package/README.md +24 -3
- package/dist/backup.d.ts +28 -0
- package/dist/backup.d.ts.map +1 -0
- package/dist/backup.js +47 -0
- package/dist/backup.js.map +1 -0
- package/dist/cache/drivers/bun-sqlite.d.ts.map +1 -1
- package/dist/cache/drivers/node-sqlite.d.ts.map +1 -1
- package/dist/cache/index.d.ts.map +1 -1
- package/dist/cache/index.js +10 -4
- package/dist/cache/index.js.map +1 -1
- package/dist/cache/open.d.ts.map +1 -1
- package/dist/cache/schema.d.ts.map +1 -1
- package/dist/cache/store.d.ts +7 -0
- package/dist/cache/store.d.ts.map +1 -1
- package/dist/cache/store.js +8 -0
- package/dist/cache/store.js.map +1 -1
- package/dist/client.d.ts +73 -3
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +354 -66
- package/dist/client.js.map +1 -1
- package/dist/commands/backup.d.ts +3 -0
- package/dist/commands/backup.d.ts.map +1 -0
- package/dist/commands/backup.js +101 -0
- package/dist/commands/backup.js.map +1 -0
- package/dist/commands/body.d.ts.map +1 -1
- package/dist/commands/body.js.map +1 -1
- package/dist/commands/cache.d.ts.map +1 -1
- package/dist/commands/cache.js +6 -5
- package/dist/commands/cache.js.map +1 -1
- package/dist/commands/chats.js +2 -2
- package/dist/commands/chats.js.map +1 -1
- package/dist/commands/complete.d.ts.map +1 -1
- package/dist/commands/complete.js +28 -22
- package/dist/commands/complete.js.map +1 -1
- package/dist/commands/config.d.ts.map +1 -1
- package/dist/commands/config.js +5 -1
- package/dist/commands/config.js.map +1 -1
- package/dist/commands/contacts.d.ts.map +1 -1
- package/dist/commands/context.d.ts +4 -0
- package/dist/commands/context.d.ts.map +1 -1
- package/dist/commands/context.js +7 -15
- package/dist/commands/context.js.map +1 -1
- package/dist/commands/doctor.d.ts.map +1 -1
- package/dist/commands/doctor.js +136 -15
- package/dist/commands/doctor.js.map +1 -1
- package/dist/commands/folders.js.map +1 -1
- package/dist/commands/mcp.js +3 -3
- package/dist/commands/mcp.js.map +1 -1
- package/dist/commands/messages.d.ts.map +1 -1
- package/dist/commands/messages.js +6 -4
- package/dist/commands/messages.js.map +1 -1
- package/dist/commands/models.d.ts.map +1 -1
- package/dist/commands/models.js +29 -23
- package/dist/commands/models.js.map +1 -1
- package/dist/commands/paging.d.ts.map +1 -1
- package/dist/commands/recipients.d.ts.map +1 -1
- package/dist/commands/recipients.js +25 -17
- package/dist/commands/recipients.js.map +1 -1
- package/dist/commands/sends.d.ts.map +1 -1
- package/dist/commands/sends.js +8 -6
- package/dist/commands/sends.js.map +1 -1
- package/dist/commands/serve.d.ts +12 -0
- package/dist/commands/serve.d.ts.map +1 -1
- package/dist/commands/serve.js +10 -7
- package/dist/commands/serve.js.map +1 -1
- package/dist/commands/server.d.ts +7 -0
- package/dist/commands/server.d.ts.map +1 -0
- package/dist/commands/server.js +84 -0
- package/dist/commands/server.js.map +1 -0
- package/dist/commands/session.d.ts.map +1 -1
- package/dist/commands/session.js +10 -10
- package/dist/commands/session.js.map +1 -1
- package/dist/commands/skill.js.map +1 -1
- package/dist/commands/watch.d.ts +17 -0
- package/dist/commands/watch.d.ts.map +1 -1
- package/dist/commands/watch.js +73 -38
- package/dist/commands/watch.js.map +1 -1
- package/dist/config.d.ts +5 -3
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +19 -2
- package/dist/config.js.map +1 -1
- package/dist/deadline.d.ts.map +1 -1
- package/dist/diagnose.d.ts +17 -3
- package/dist/diagnose.d.ts.map +1 -1
- package/dist/diagnose.js +16 -4
- package/dist/diagnose.js.map +1 -1
- package/dist/domain/map.d.ts.map +1 -1
- package/dist/domain/map.js.map +1 -1
- package/dist/domain/models.d.ts +20 -0
- package/dist/domain/models.d.ts.map +1 -1
- package/dist/domain/models.js.map +1 -1
- package/dist/download.d.ts +22 -3
- package/dist/download.d.ts.map +1 -1
- package/dist/download.js +133 -27
- package/dist/download.js.map +1 -1
- package/dist/export.d.ts +10 -4
- package/dist/export.d.ts.map +1 -1
- package/dist/export.js +26 -18
- package/dist/export.js.map +1 -1
- package/dist/generated/client.generated.d.ts +10 -0
- package/dist/generated/client.generated.d.ts.map +1 -1
- package/dist/generated/client.generated.js +10 -0
- package/dist/generated/client.generated.js.map +1 -1
- package/dist/generated/opcodes.generated.d.ts +4 -0
- package/dist/generated/opcodes.generated.d.ts.map +1 -1
- package/dist/generated/opcodes.generated.js +4 -0
- package/dist/generated/opcodes.generated.js.map +1 -1
- package/dist/generated/operations.generated.d.ts +35 -1
- package/dist/generated/operations.generated.d.ts.map +1 -1
- package/dist/generated/operations.generated.js +8 -1
- package/dist/generated/operations.generated.js.map +1 -1
- package/dist/markdown.d.ts.map +1 -1
- package/dist/mcp/confirm.d.ts +19 -11
- package/dist/mcp/confirm.d.ts.map +1 -1
- package/dist/mcp/confirm.js +53 -29
- package/dist/mcp/confirm.js.map +1 -1
- package/dist/mcp/instructions.d.ts.map +1 -1
- package/dist/mcp/server.d.ts.map +1 -1
- package/dist/mcp/session.d.ts.map +1 -1
- package/dist/mcp/session.js.map +1 -1
- package/dist/mcp/tools.d.ts.map +1 -1
- package/dist/mcp/tools.js +9 -4
- package/dist/mcp/tools.js.map +1 -1
- package/dist/output.d.ts.map +1 -1
- package/dist/output.js +24 -2
- package/dist/output.js.map +1 -1
- package/dist/profile.d.ts.map +1 -1
- package/dist/program.d.ts.map +1 -1
- package/dist/program.js +55 -5
- package/dist/program.js.map +1 -1
- package/dist/protocol/connection.d.ts +2 -0
- package/dist/protocol/connection.d.ts.map +1 -1
- package/dist/protocol/connection.js +27 -5
- package/dist/protocol/connection.js.map +1 -1
- package/dist/protocol/frame.d.ts +2 -0
- package/dist/protocol/frame.d.ts.map +1 -1
- package/dist/protocol/frame.js +3 -1
- package/dist/protocol/frame.js.map +1 -1
- package/dist/protocol/lz4.d.ts.map +1 -1
- package/dist/protocol/lz4.js +8 -5
- package/dist/protocol/lz4.js.map +1 -1
- package/dist/rendering/messages.d.ts.map +1 -1
- package/dist/rendering/messages.js +9 -10
- package/dist/rendering/messages.js.map +1 -1
- package/dist/report.d.ts +43 -0
- package/dist/report.d.ts.map +1 -0
- package/dist/report.js +91 -0
- package/dist/report.js.map +1 -0
- package/dist/resolve.d.ts +4 -3
- package/dist/resolve.d.ts.map +1 -1
- package/dist/resolve.js +9 -10
- package/dist/resolve.js.map +1 -1
- package/dist/runs/events.d.ts +21 -1
- package/dist/runs/events.d.ts.map +1 -1
- package/dist/runs/events.js +14 -1
- package/dist/runs/events.js.map +1 -1
- package/dist/runs/recording.d.ts +12 -0
- package/dist/runs/recording.d.ts.map +1 -1
- package/dist/runs/recording.js +83 -22
- package/dist/runs/recording.js.map +1 -1
- package/dist/runs/run.d.ts +11 -0
- package/dist/runs/run.d.ts.map +1 -1
- package/dist/runs/run.js +8 -1
- package/dist/runs/run.js.map +1 -1
- package/dist/sends/guard.d.ts +35 -4
- package/dist/sends/guard.d.ts.map +1 -1
- package/dist/sends/guard.js +128 -28
- package/dist/sends/guard.js.map +1 -1
- package/dist/sends/journal.d.ts +17 -3
- package/dist/sends/journal.d.ts.map +1 -1
- package/dist/sends/journal.js +62 -2
- package/dist/sends/journal.js.map +1 -1
- package/dist/sends/permissions.d.ts.map +1 -1
- package/dist/sends/permissions.js.map +1 -1
- package/dist/sends/recipients.d.ts +3 -1
- package/dist/sends/recipients.d.ts.map +1 -1
- package/dist/sends/recipients.js +7 -2
- package/dist/sends/recipients.js.map +1 -1
- package/dist/server/lines.d.ts +8 -2
- package/dist/server/lines.d.ts.map +1 -1
- package/dist/server/lines.js +13 -2
- package/dist/server/lines.js.map +1 -1
- package/dist/server/server-connection.d.ts +9 -6
- package/dist/server/server-connection.d.ts.map +1 -1
- package/dist/server/server-connection.js +16 -7
- package/dist/server/server-connection.js.map +1 -1
- package/dist/server/server.d.ts +21 -4
- package/dist/server/server.d.ts.map +1 -1
- package/dist/server/server.js +154 -17
- package/dist/server/server.js.map +1 -1
- package/dist/server/start.d.ts +3 -1
- package/dist/server/start.d.ts.map +1 -1
- package/dist/server/start.js +6 -1
- package/dist/server/start.js.map +1 -1
- package/dist/server/subscribe.d.ts.map +1 -1
- package/dist/session/adopt.d.ts.map +1 -1
- package/dist/session/browser.d.ts.map +1 -1
- package/dist/session/browser.js.map +1 -1
- package/dist/session/handshake.d.ts +17 -3
- package/dist/session/handshake.d.ts.map +1 -1
- package/dist/session/handshake.js +11 -5
- package/dist/session/handshake.js.map +1 -1
- package/dist/session/login.d.ts.map +1 -1
- package/dist/session/prompt.d.ts.map +1 -1
- package/dist/session/prompt.js +7 -1
- package/dist/session/prompt.js.map +1 -1
- package/dist/session/qr-terminal.d.ts.map +1 -1
- package/dist/session/store.d.ts +18 -1
- package/dist/session/store.d.ts.map +1 -1
- package/dist/session/store.js +32 -1
- package/dist/session/store.js.map +1 -1
- package/dist/spec/check.d.ts.map +1 -1
- package/dist/spec/define.d.ts +12 -0
- package/dist/spec/define.d.ts.map +1 -1
- package/dist/spec/define.js.map +1 -1
- package/dist/spec/guards.d.ts +16 -0
- package/dist/spec/guards.d.ts.map +1 -0
- package/dist/spec/guards.js +30 -0
- package/dist/spec/guards.js.map +1 -0
- package/dist/spec/identity.d.ts +39 -6
- package/dist/spec/identity.d.ts.map +1 -1
- package/dist/spec/identity.js +41 -12
- package/dist/spec/identity.js.map +1 -1
- package/dist/spec/index.d.ts.map +1 -1
- package/dist/spec/index.js +8 -1
- package/dist/spec/index.js.map +1 -1
- package/dist/spec/operations/account.d.ts.map +1 -1
- package/dist/spec/operations/account.js +3 -0
- package/dist/spec/operations/account.js.map +1 -1
- package/dist/spec/operations/assets.d.ts +10 -0
- package/dist/spec/operations/assets.d.ts.map +1 -0
- package/dist/spec/operations/assets.js +20 -0
- package/dist/spec/operations/assets.js.map +1 -0
- package/dist/spec/operations/attachments.d.ts.map +1 -1
- package/dist/spec/operations/attachments.js +2 -0
- package/dist/spec/operations/attachments.js.map +1 -1
- package/dist/spec/operations/banners.d.ts +7 -0
- package/dist/spec/operations/banners.d.ts.map +1 -0
- package/dist/spec/operations/banners.js +16 -0
- package/dist/spec/operations/banners.js.map +1 -0
- package/dist/spec/operations/calls.d.ts +8 -0
- package/dist/spec/operations/calls.d.ts.map +1 -0
- package/dist/spec/operations/calls.js +18 -0
- package/dist/spec/operations/calls.js.map +1 -0
- package/dist/spec/operations/chats.d.ts +5 -3
- package/dist/spec/operations/chats.d.ts.map +1 -1
- package/dist/spec/operations/chats.js +58 -9
- package/dist/spec/operations/chats.js.map +1 -1
- package/dist/spec/operations/contacts.d.ts.map +1 -1
- package/dist/spec/operations/contacts.js +8 -0
- package/dist/spec/operations/contacts.js.map +1 -1
- package/dist/spec/operations/folders.d.ts.map +1 -1
- package/dist/spec/operations/folders.js +5 -0
- package/dist/spec/operations/folders.js.map +1 -1
- package/dist/spec/operations/login.d.ts.map +1 -1
- package/dist/spec/operations/login.js +6 -0
- package/dist/spec/operations/login.js.map +1 -1
- package/dist/spec/operations/messages.d.ts.map +1 -1
- package/dist/spec/operations/messages.js +50 -0
- package/dist/spec/operations/messages.js.map +1 -1
- package/dist/spec/operations/session.d.ts +28 -1
- package/dist/spec/operations/session.d.ts.map +1 -1
- package/dist/spec/operations/session.js +47 -1
- package/dist/spec/operations/session.js.map +1 -1
- package/dist/spec/operations/uploads.d.ts.map +1 -1
- package/dist/spec/operations/uploads.js +2 -0
- package/dist/spec/operations/uploads.js.map +1 -1
- package/dist/spec/scalars.d.ts.map +1 -1
- package/dist/transcribe/index.d.ts.map +1 -1
- package/dist/transcribe/index.js +4 -1
- package/dist/transcribe/index.js.map +1 -1
- package/dist/transcribe/install.d.ts +3 -1
- package/dist/transcribe/install.d.ts.map +1 -1
- package/dist/transcribe/install.js +24 -1
- package/dist/transcribe/install.js.map +1 -1
- package/dist/transcribe/models.d.ts.map +1 -1
- package/dist/transcribe/speech.d.ts.map +1 -1
- package/dist/transcribe/speech.js.map +1 -1
- package/dist/update.d.ts.map +1 -1
- package/dist/update.js.map +1 -1
- package/dist/upload.d.ts +3 -1
- package/dist/upload.d.ts.map +1 -1
- package/dist/upload.js +34 -4
- package/dist/upload.js.map +1 -1
- package/dist/version.d.ts +1 -1
- package/dist/version.d.ts.map +1 -1
- package/dist/version.js +1 -1
- package/dist/version.js.map +1 -1
- package/package.json +18 -15
- package/skills/max-cli/SKILL.md +12 -1
- package/dist/testing/mock-max.d.ts +0 -49
- package/dist/testing/mock-max.d.ts.map +0 -1
- package/dist/testing/mock-max.js +0 -80
- package/dist/testing/mock-max.js.map +0 -1
- package/dist/testing/sandbox.d.ts +0 -2
- package/dist/testing/sandbox.d.ts.map +0 -1
- package/dist/testing/sandbox.js +0 -36
- package/dist/testing/sandbox.js.map +0 -1
- package/dist/testing/unscripted.d.ts +0 -2
- package/dist/testing/unscripted.d.ts.map +0 -1
- package/dist/testing/unscripted.js +0 -18
- package/dist/testing/unscripted.js.map +0 -1
package/dist/report.d.ts
ADDED
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import type { Diagnosis } from "./diagnose.js";
|
|
2
|
+
import { type RunMetadata } from "./runs/run.js";
|
|
3
|
+
import type { SendEntry } from "./sends/journal.js";
|
|
4
|
+
/** Where problem reports go (`NEED-267`, changed by the owner to issues). Anybody can read them there. */
|
|
5
|
+
export declare const REPORT_URL = "https://github.com/leemour/max-cli/issues/new";
|
|
6
|
+
export interface Report {
|
|
7
|
+
createdAt: string;
|
|
8
|
+
version: string;
|
|
9
|
+
runtime: string;
|
|
10
|
+
platform: string;
|
|
11
|
+
arch: string;
|
|
12
|
+
profile: string;
|
|
13
|
+
doctor: Diagnosis;
|
|
14
|
+
/** The run the report is about: the one asked for, or the newest that failed. */
|
|
15
|
+
run: {
|
|
16
|
+
metadata: RunMetadata;
|
|
17
|
+
events: Record<string, unknown>[];
|
|
18
|
+
} | null;
|
|
19
|
+
/** The newest write actions — outcomes and ids, never text (`src/sends/journal.ts`). */
|
|
20
|
+
sends: SendEntry[];
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* **Everything a report holds is already free of content** — the run log and the send journal are
|
|
24
|
+
* built that way. Two things are added: chat and message ids become labels, and the home directory
|
|
25
|
+
* is hidden, since the doctor's paths name the person's account on this machine.
|
|
26
|
+
*/
|
|
27
|
+
export declare const buildReport: ({ profile, doctor, runsDir, runId, sends, now, home, }: {
|
|
28
|
+
profile: string;
|
|
29
|
+
doctor: Diagnosis;
|
|
30
|
+
runsDir: string;
|
|
31
|
+
runId?: string;
|
|
32
|
+
sends: SendEntry[];
|
|
33
|
+
now?: Date;
|
|
34
|
+
home?: string;
|
|
35
|
+
}) => Report;
|
|
36
|
+
/**
|
|
37
|
+
* A new issue with its title and body filled in, through GitHub's `title` and `body` query
|
|
38
|
+
* parameters. The file cannot travel in a link; the person drags it in. **Only the file's name**
|
|
39
|
+
* goes into the body — the issue is public, and a full path names the account on this machine.
|
|
40
|
+
*/
|
|
41
|
+
export declare const issueUrlFor: (report: Report, file: string) => string;
|
|
42
|
+
export declare const reportFileName: (now: Date) => string;
|
|
43
|
+
//# sourceMappingURL=report.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"report.d.ts","sourceRoot":"","sources":["../src/report.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,eAAe,CAAA;AAC9C,OAAO,EAAqB,KAAK,WAAW,EAAuB,MAAM,eAAe,CAAA;AACxF,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAA;AAGnD,0GAA0G;AAC1G,eAAO,MAAM,UAAU,kDAAkD,CAAA;AAIzE,MAAM,WAAW,MAAM;IACrB,SAAS,EAAE,MAAM,CAAA;IACjB,OAAO,EAAE,MAAM,CAAA;IACf,OAAO,EAAE,MAAM,CAAA;IACf,QAAQ,EAAE,MAAM,CAAA;IAChB,IAAI,EAAE,MAAM,CAAA;IACZ,OAAO,EAAE,MAAM,CAAA;IACf,MAAM,EAAE,SAAS,CAAA;IACjB,iFAAiF;IACjF,GAAG,EAAE;QAAE,QAAQ,EAAE,WAAW,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAA;KAAE,GAAG,IAAI,CAAA;IACxE,wFAAwF;IACxF,KAAK,EAAE,SAAS,EAAE,CAAA;CACnB;AAED;;;;GAIG;AACH,eAAO,MAAM,WAAW,2DAQrB;IACD,OAAO,EAAE,MAAM,CAAA;IACf,MAAM,EAAE,SAAS,CAAA;IACjB,OAAO,EAAE,MAAM,CAAA;IACf,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,KAAK,EAAE,SAAS,EAAE,CAAA;IAClB,GAAG,CAAC,EAAE,IAAI,CAAA;IACV,IAAI,CAAC,EAAE,MAAM,CAAA;CACd,KAAG,MAsBH,CAAA;AA4BD;;;;GAIG;AACH,eAAO,MAAM,WAAW,WAAY,MAAM,QAAQ,MAAM,KAAG,MAgB1D,CAAA;AAED,eAAO,MAAM,cAAc,QAAS,IAAI,KAAG,MAIR,CAAA"}
|
package/dist/report.js
ADDED
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
import { createHash, randomBytes } from "node:crypto";
|
|
2
|
+
import { homedir } from "node:os";
|
|
3
|
+
import { basename, join } from "node:path";
|
|
4
|
+
import { CliError } from "@leemour/cli-core";
|
|
5
|
+
import { findRun, listRuns, readEvents, runtime } from "./runs/run.js";
|
|
6
|
+
import { VERSION } from "./version.js";
|
|
7
|
+
/** Where problem reports go (`NEED-267`, changed by the owner to issues). Anybody can read them there. */
|
|
8
|
+
export const REPORT_URL = "https://github.com/leemour/max-cli/issues/new";
|
|
9
|
+
const RECENT_SENDS = 20;
|
|
10
|
+
/**
|
|
11
|
+
* **Everything a report holds is already free of content** — the run log and the send journal are
|
|
12
|
+
* built that way. Two things are added: chat and message ids become labels, and the home directory
|
|
13
|
+
* is hidden, since the doctor's paths name the person's account on this machine.
|
|
14
|
+
*/
|
|
15
|
+
export const buildReport = ({ profile, doctor, runsDir, runId, sends, now = new Date(), home = homedir(), }) => {
|
|
16
|
+
const chosen = runId === undefined ? newestFailed(runsDir) : findRun(runsDir, runId);
|
|
17
|
+
if (runId !== undefined && !chosen)
|
|
18
|
+
throw new CliError("not_found", `no run ${runId} — \`max runs list\` names them`);
|
|
19
|
+
const label = labeller();
|
|
20
|
+
const labelled = labelledEvent(label);
|
|
21
|
+
const report = {
|
|
22
|
+
createdAt: now.toISOString(),
|
|
23
|
+
version: VERSION,
|
|
24
|
+
runtime: runtime(),
|
|
25
|
+
platform: process.platform,
|
|
26
|
+
arch: process.arch,
|
|
27
|
+
profile,
|
|
28
|
+
doctor,
|
|
29
|
+
run: chosen ? { metadata: chosen.metadata, events: readEvents(chosen.dir).map(labelled) } : null,
|
|
30
|
+
sends: sends.slice(-RECENT_SENDS).map((entry) => ({
|
|
31
|
+
...entry,
|
|
32
|
+
chatId: entry.chatId === null ? null : label(entry.chatId),
|
|
33
|
+
...(entry.messageId === undefined ? {} : { messageId: label(entry.messageId) }),
|
|
34
|
+
})),
|
|
35
|
+
};
|
|
36
|
+
return JSON.parse(JSON.stringify(report).replaceAll(home, "~"));
|
|
37
|
+
};
|
|
38
|
+
/**
|
|
39
|
+
* The report is posted to a public issue, and a chat id is somebody's conversation with the owner.
|
|
40
|
+
* Each id becomes a label that is the same everywhere in this report — so a failure can still be
|
|
41
|
+
* followed from request to journal — and **a new salt per report**, so two reports cannot be joined.
|
|
42
|
+
*/
|
|
43
|
+
const labeller = () => {
|
|
44
|
+
const salt = randomBytes(16);
|
|
45
|
+
return (id) => `id:${createHash("sha256").update(salt).update(id).digest("hex").slice(0, 12)}`;
|
|
46
|
+
};
|
|
47
|
+
const labelledEvent = (label) => (event) => {
|
|
48
|
+
const ids = event.ids;
|
|
49
|
+
if (typeof ids !== "object" || ids === null)
|
|
50
|
+
return event;
|
|
51
|
+
const { chat, message, ...rest } = ids;
|
|
52
|
+
return {
|
|
53
|
+
...event,
|
|
54
|
+
ids: {
|
|
55
|
+
...rest,
|
|
56
|
+
...(typeof chat === "string" ? { chat: label(chat) } : {}),
|
|
57
|
+
...(typeof message === "string" ? { message: label(message) } : {}),
|
|
58
|
+
},
|
|
59
|
+
};
|
|
60
|
+
};
|
|
61
|
+
/**
|
|
62
|
+
* A new issue with its title and body filled in, through GitHub's `title` and `body` query
|
|
63
|
+
* parameters. The file cannot travel in a link; the person drags it in. **Only the file's name**
|
|
64
|
+
* goes into the body — the issue is public, and a full path names the account on this machine.
|
|
65
|
+
*/
|
|
66
|
+
export const issueUrlFor = (report, file) => {
|
|
67
|
+
const run = report.run?.metadata;
|
|
68
|
+
const subject = `max ${report.version}: ${run ? `${run.command} — ${run.errorCode ?? "failed"}` : "problem report"}`;
|
|
69
|
+
const body = [
|
|
70
|
+
"Что я делал:",
|
|
71
|
+
"",
|
|
72
|
+
"Что ожидал:",
|
|
73
|
+
"",
|
|
74
|
+
"Что случилось:",
|
|
75
|
+
"",
|
|
76
|
+
"---",
|
|
77
|
+
`max ${report.version}, ${report.runtime}, ${report.platform} ${report.arch}`,
|
|
78
|
+
...(run ? [`run ${run.runId}: ${run.errorCode ?? "failed"}${run.maxError ? ` (${run.maxError})` : ""}`] : []),
|
|
79
|
+
`Файл отчёта: ${basename(file)}`,
|
|
80
|
+
].join("\n");
|
|
81
|
+
return `${REPORT_URL}?title=${encodeURIComponent(subject)}&body=${encodeURIComponent(body)}`;
|
|
82
|
+
};
|
|
83
|
+
export const reportFileName = (now) => `max-report-${now
|
|
84
|
+
.toISOString()
|
|
85
|
+
.replace(/[-:]/g, "")
|
|
86
|
+
.replace(/\.\d+Z$/, "Z")}.json`;
|
|
87
|
+
const newestFailed = (runsDir) => {
|
|
88
|
+
const failed = listRuns(runsDir).find((run) => run.status === "failed");
|
|
89
|
+
return failed ? { dir: join(runsDir, failed.startedAt.slice(0, 10), failed.runId), metadata: failed } : undefined;
|
|
90
|
+
};
|
|
91
|
+
//# sourceMappingURL=report.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"report.js","sourceRoot":"","sources":["../src/report.ts"],"names":[],"mappings":"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"}
|
package/dist/resolve.d.ts
CHANGED
|
@@ -2,9 +2,10 @@ import type { CacheStore } from "./cache/store.js";
|
|
|
2
2
|
import type { Chat, Contact } from "./domain/models.js";
|
|
3
3
|
export declare const isId: (reference: string) => boolean;
|
|
4
4
|
/**
|
|
5
|
-
* A name matched
|
|
6
|
-
*
|
|
7
|
-
*
|
|
5
|
+
* A name matched as a fragment — and **an ambiguous one is an error, not a guess**: sending to the
|
|
6
|
+
* wrong conversation is not undoable, so the caller is shown the candidates and asked to be
|
|
7
|
+
* specific. An exact title does not settle it while another title contains it too: a group named
|
|
8
|
+
* "Мама" must not quietly take a send meant for "Мама Иванова".
|
|
8
9
|
*/
|
|
9
10
|
export declare const pickChat: (reference: string, chats: Chat[]) => Chat;
|
|
10
11
|
/**
|
package/dist/resolve.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"resolve.d.ts","sourceRoot":"","sources":["../src/resolve.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAClD,OAAO,KAAK,EAAE,IAAI,EAAE,OAAO,EAAM,MAAM,oBAAoB,CAAA;AAE3D,eAAO,MAAM,IAAI,
|
|
1
|
+
{"version":3,"file":"resolve.d.ts","sourceRoot":"","sources":["../src/resolve.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAClD,OAAO,KAAK,EAAE,IAAI,EAAE,OAAO,EAAM,MAAM,oBAAoB,CAAA;AAE3D,eAAO,MAAM,IAAI,cAAe,MAAM,KAAG,OAA2C,CAAA;AAEpF;;;;;GAKG;AACH,eAAO,MAAM,QAAQ,cAAe,MAAM,SAAS,IAAI,EAAE,KAAG,IAY3D,CAAA;AAED;;;GAGG;AACH,eAAO,MAAM,UAAU,cAAe,MAAM,SAAS,UAAU,KAAG,OAwBjE,CAAA"}
|
package/dist/resolve.js
CHANGED
|
@@ -1,20 +1,19 @@
|
|
|
1
|
-
import { CliError } from "@leemour/cli-core";
|
|
1
|
+
import { CliError, singleLine } from "@leemour/cli-core";
|
|
2
2
|
export const isId = (reference) => /^-?\d+$/.test(reference.trim());
|
|
3
3
|
/**
|
|
4
|
-
* A name matched
|
|
5
|
-
*
|
|
6
|
-
*
|
|
4
|
+
* A name matched as a fragment — and **an ambiguous one is an error, not a guess**: sending to the
|
|
5
|
+
* wrong conversation is not undoable, so the caller is shown the candidates and asked to be
|
|
6
|
+
* specific. An exact title does not settle it while another title contains it too: a group named
|
|
7
|
+
* "Мама" must not quietly take a send meant for "Мама Иванова".
|
|
7
8
|
*/
|
|
8
9
|
export const pickChat = (reference, chats) => {
|
|
9
10
|
const wanted = reference.trim().toLowerCase();
|
|
10
|
-
const
|
|
11
|
-
const exact = titled.filter((chat) => chat.title?.toLowerCase() === wanted);
|
|
12
|
-
const matches = exact.length > 0 ? exact : titled.filter((chat) => chat.title?.toLowerCase().includes(wanted));
|
|
11
|
+
const matches = chats.filter((chat) => chat.title?.toLowerCase().includes(wanted));
|
|
13
12
|
if (matches.length === 1 && matches[0])
|
|
14
13
|
return matches[0];
|
|
15
14
|
if (matches.length === 0)
|
|
16
15
|
throw new CliError("not_found", `no chat matches "${reference}"`);
|
|
17
|
-
throw ambiguous(reference, "chats", matches.map((chat) => ({ id: chat.id, title: chat.title })), ({ title }) => String(title));
|
|
16
|
+
throw ambiguous(reference, "chats", matches.map((chat) => ({ id: chat.id, title: chat.title })), ({ title }) => singleLine(String(title)));
|
|
18
17
|
};
|
|
19
18
|
/**
|
|
20
19
|
* As `pickChat`, over names and @usernames. Matched here rather than in SQL because SQLite's
|
|
@@ -37,12 +36,12 @@ export const pickPerson = (reference, cache) => {
|
|
|
37
36
|
return matches[0];
|
|
38
37
|
if (matches.length === 0)
|
|
39
38
|
throw new CliError("not_found", `nobody matches "${reference}"`);
|
|
40
|
-
throw ambiguous(reference, "people", matches.map(({ id, name, username }) => ({ id, name, username })), ({ name, username }) => [name, username && `@${username}`].filter(isPresent).join(" "));
|
|
39
|
+
throw ambiguous(reference, "people", matches.map(({ id, name, username }) => ({ id, name, username })), ({ name, username }) => singleLine([name, username && `@${username}`].filter(isPresent).join(" ")));
|
|
41
40
|
};
|
|
42
41
|
const ambiguous = (reference, what, candidates, label) => {
|
|
43
42
|
const width = Math.max(...candidates.map(({ id }) => id.length));
|
|
44
43
|
const lines = candidates.map((candidate) => ` ${candidate.id.padEnd(width)} ${label(candidate)}`).join("\n");
|
|
45
|
-
return new CliError("validation_error", `"${reference}" matches ${candidates.length} ${what} — name one by its id:\n${lines}`, { candidates });
|
|
44
|
+
return new CliError("validation_error", `"${singleLine(reference)}" matches ${candidates.length} ${what} — name one by its id:\n${lines}`, { candidates });
|
|
46
45
|
};
|
|
47
46
|
const isPresent = (value) => value !== null && value !== undefined;
|
|
48
47
|
//# sourceMappingURL=resolve.js.map
|
package/dist/resolve.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"resolve.js","sourceRoot":"","sources":["../src/resolve.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAA;
|
|
1
|
+
{"version":3,"file":"resolve.js","sourceRoot":"","sources":["../src/resolve.ts"],"names":[],"mappings":"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"}
|
package/dist/runs/events.d.ts
CHANGED
|
@@ -27,7 +27,21 @@ export interface RequestEvent {
|
|
|
27
27
|
outcome?: "ok" | "error";
|
|
28
28
|
/** `cli-core`'s code — `timeout`, `provider_error`. Never the message: MAX quotes our payload. */
|
|
29
29
|
errorCode?: string;
|
|
30
|
+
/** MAX's own key for a refusal — `login.token`, `proto.payload` — and only if it is shaped like one (`maxErrorKey`). */
|
|
31
|
+
maxError?: string;
|
|
30
32
|
}
|
|
33
|
+
/**
|
|
34
|
+
* Something the client noticed and went on without — reactions it could not read, a response of an
|
|
35
|
+
* unexpected shape. **A code, never the sentence**: the sentence quotes MAX, and MAX quotes us.
|
|
36
|
+
*/
|
|
37
|
+
export interface WarningEvent {
|
|
38
|
+
event: "warning";
|
|
39
|
+
code: WarningCode;
|
|
40
|
+
operation?: string;
|
|
41
|
+
/** Only for `response_shape`: field paths and types, built without the values (`src/spec/check.ts`). */
|
|
42
|
+
detail?: string;
|
|
43
|
+
}
|
|
44
|
+
export type WarningCode = "chats_partial" | "token_not_saved" | "cache_not_written" | "reactions_unread" | "names_unread" | "response_shape";
|
|
31
45
|
/**
|
|
32
46
|
* A read that never reached MAX.
|
|
33
47
|
*
|
|
@@ -59,7 +73,13 @@ export type CacheReason =
|
|
|
59
73
|
/** The window asked for is older than a fetch would return, so the record is authoritative. */
|
|
60
74
|
| "history";
|
|
61
75
|
/** What either sink is handed. One object, two sinks — see `RequestEvent`. */
|
|
62
|
-
export type DiagnosticEvent = RequestEvent | CacheEvent;
|
|
76
|
+
export type DiagnosticEvent = RequestEvent | CacheEvent | WarningEvent;
|
|
77
|
+
/**
|
|
78
|
+
* MAX's refusal as a key, or nothing. Every refusal seen so far is a dotted key — `proto.payload`,
|
|
79
|
+
* `login.token`, `folder.validation.title.too-long` — and a key carries no content. Anything else,
|
|
80
|
+
* a sentence or a quote, is dropped rather than trimmed.
|
|
81
|
+
*/
|
|
82
|
+
export declare const maxErrorKey: (value: unknown) => string | undefined;
|
|
63
83
|
/**
|
|
64
84
|
* The ids a request named, by name, from a list of fields that is written out here.
|
|
65
85
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"events.d.ts","sourceRoot":"","sources":["../../src/runs/events.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAA;AAEnD;;;;;;;;;;;GAWG;AACH,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,SAAS,GAAG,UAAU,CAAA;IAC7B,4DAA4D;IAC5D,SAAS,EAAE,MAAM,CAAA;IACjB,MAAM,EAAE,MAAM,CAAA;IACd,GAAG,EAAE,MAAM,CAAA;IACX,yFAAyF;IACzF,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,mFAAmF;IACnF,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IAC5B,iGAAiG;IACjG,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IAC/B,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,OAAO,CAAC,EAAE,IAAI,GAAG,OAAO,CAAA;IACxB,kGAAkG;IAClG,SAAS,CAAC,EAAE,MAAM,CAAA;
|
|
1
|
+
{"version":3,"file":"events.d.ts","sourceRoot":"","sources":["../../src/runs/events.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAA;AAEnD;;;;;;;;;;;GAWG;AACH,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,SAAS,GAAG,UAAU,CAAA;IAC7B,4DAA4D;IAC5D,SAAS,EAAE,MAAM,CAAA;IACjB,MAAM,EAAE,MAAM,CAAA;IACd,GAAG,EAAE,MAAM,CAAA;IACX,yFAAyF;IACzF,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,mFAAmF;IACnF,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IAC5B,iGAAiG;IACjG,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IAC/B,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,OAAO,CAAC,EAAE,IAAI,GAAG,OAAO,CAAA;IACxB,kGAAkG;IAClG,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,wHAAwH;IACxH,QAAQ,CAAC,EAAE,MAAM,CAAA;CAClB;AAED;;;GAGG;AACH,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,SAAS,CAAA;IAChB,IAAI,EAAE,WAAW,CAAA;IACjB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,wGAAwG;IACxG,MAAM,CAAC,EAAE,MAAM,CAAA;CAChB;AAED,MAAM,MAAM,WAAW,GACnB,eAAe,GACf,iBAAiB,GACjB,mBAAmB,GACnB,kBAAkB,GAClB,cAAc,GACd,gBAAgB,CAAA;AAEpB;;;;;;;GAOG;AACH,MAAM,WAAW,UAAU;IACzB,KAAK,EAAE,OAAO,CAAA;IACd,2CAA2C;IAC3C,SAAS,EAAE,MAAM,CAAA;IACjB,MAAM,EAAE,WAAW,CAAA;IACnB,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IAC5B,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IAC/B,uFAAuF;IACvF,KAAK,CAAC,EAAE,MAAM,CAAA;CACf;AAED;;;;;;GAMG;AACH,MAAM,MAAM,WAAW;AACrB,oEAAoE;AAClE,SAAS;AACX,+FAA+F;GAC7F,SAAS,CAAA;AAEb,8EAA8E;AAC9E,MAAM,MAAM,eAAe,GAAG,YAAY,GAAG,UAAU,GAAG,YAAY,CAAA;AAEtE;;;;GAIG;AACH,eAAO,MAAM,WAAW,UAAW,OAAO,KAAG,MAAM,GAAG,SACmC,CAAA;AAEzF;;;;;;GAMG;AACH,eAAO,MAAM,KAAK,YAAa,OAAO,KAAG;IAAE,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CAqBvG,CAAA;AAED;;;;;;GAMG;AACH,eAAO,MAAM,QAAQ,YAAa,OAAO,KAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,SAIpE,CAAA;AAED;;;;;;;;GAQG;AACH,eAAO,MAAM,WAAW,UAAW,eAAe,KAAG,MA2BpD,CAAA"}
|
package/dist/runs/events.js
CHANGED
|
@@ -1,3 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MAX's refusal as a key, or nothing. Every refusal seen so far is a dotted key — `proto.payload`,
|
|
3
|
+
* `login.token`, `folder.validation.title.too-long` — and a key carries no content. Anything else,
|
|
4
|
+
* a sentence or a quote, is dropped rather than trimmed.
|
|
5
|
+
*/
|
|
6
|
+
export const maxErrorKey = (value) => typeof value === "string" && /^[a-z][a-z0-9._-]{0,63}$/.test(value) ? value : undefined;
|
|
1
7
|
/**
|
|
2
8
|
* The ids a request named, by name, from a list of fields that is written out here.
|
|
3
9
|
*
|
|
@@ -52,6 +58,11 @@ export const countsIn = (payload) => {
|
|
|
52
58
|
* ```
|
|
53
59
|
*/
|
|
54
60
|
export const renderEvent = (event) => {
|
|
61
|
+
if (event.event === "warning") {
|
|
62
|
+
return [`${MARK.warning} ${(event.operation ?? "").padEnd(16)} ${event.code}`, event.detail]
|
|
63
|
+
.filter(Boolean)
|
|
64
|
+
.join(" ");
|
|
65
|
+
}
|
|
55
66
|
const parts = [];
|
|
56
67
|
if (event.event === "cache") {
|
|
57
68
|
parts.push(event.reason);
|
|
@@ -75,9 +86,11 @@ export const renderEvent = (event) => {
|
|
|
75
86
|
parts.push(`${count} ${field}`);
|
|
76
87
|
if (event.event !== "cache" && event.errorCode)
|
|
77
88
|
parts.push(event.errorCode);
|
|
89
|
+
if (event.event !== "cache" && event.maxError)
|
|
90
|
+
parts.push(event.maxError);
|
|
78
91
|
return `${MARK[event.event]} ${event.operation.padEnd(16)} ${parts.join(" ")}`;
|
|
79
92
|
};
|
|
80
|
-
const MARK = { request: "\u2192", response: "\u2190", cache: "\u2022" };
|
|
93
|
+
const MARK = { request: "\u2192", response: "\u2190", cache: "\u2022", warning: "!" };
|
|
81
94
|
const age = (ms) => (ms < 1000 ? `${ms}ms` : `${Math.round(ms / 1000)}s`);
|
|
82
95
|
const size = (bytes) => (bytes < 1000 ? `${bytes} B` : `${(bytes / 1000).toFixed(1)} kB`);
|
|
83
96
|
const isRecord = (value) => typeof value === "object" && value !== null && !Array.isArray(value);
|
package/dist/runs/events.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"events.js","sourceRoot":"","sources":["../../src/runs/events.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"events.js","sourceRoot":"","sources":["../../src/runs/events.ts"],"names":[],"mappings":"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"}
|
package/dist/runs/recording.d.ts
CHANGED
|
@@ -10,6 +10,7 @@ export interface RecordingOptions {
|
|
|
10
10
|
*/
|
|
11
11
|
options: {
|
|
12
12
|
record?: boolean | undefined;
|
|
13
|
+
keepFailed?: boolean | undefined;
|
|
13
14
|
trace?: boolean | undefined;
|
|
14
15
|
};
|
|
15
16
|
/** What `resolveOutput` decided for the data stream. Diagnostics follow it (`NEED-53`). */
|
|
@@ -32,4 +33,15 @@ export interface RecordingOptions {
|
|
|
32
33
|
* `running` because the command that owned it threw on the way out.
|
|
33
34
|
*/
|
|
34
35
|
export declare const recorded: <T>(options: RecordingOptions, body: (events: (event: DiagnosticEvent) => void) => Promise<T>) => Promise<T>;
|
|
36
|
+
/**
|
|
37
|
+
* Where a crash happened, not what it said: the class and up to ten frames as `function file:line`,
|
|
38
|
+
* paths cut to what follows the package's `dist/` or `src/`. **Never `message`** — it can hold
|
|
39
|
+
* whatever the failing line was handling.
|
|
40
|
+
*/
|
|
41
|
+
export declare const crashOf: (error: unknown) => {
|
|
42
|
+
event: "crash";
|
|
43
|
+
errorName: string;
|
|
44
|
+
frames: string[];
|
|
45
|
+
};
|
|
46
|
+
export declare const wasSettled: (error: unknown) => boolean;
|
|
35
47
|
//# sourceMappingURL=recording.d.ts.map
|
|
@@ -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,KAAK,CAAC,EAAE,OAAO,GAAG,SAAS,CAAA;KAAE,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,UAAU,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;QAAC,KAAK,CAAC,EAAE,OAAO,GAAG,SAAS,CAAA;KAAE,CAAA;IACxG,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,WACrB,gBAAgB,QACnB,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE,eAAe,KAAK,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,KAC7D,OAAO,CAAC,CAAC,CA2DX,CAAA;AAgBD;;;;GAIG;AACH,eAAO,MAAM,OAAO,UAAW,OAAO,KAAG;IAAE,KAAK,EAAE,OAAO,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,EAAE,CAAA;CAc7F,CAAA;AAaD,eAAO,MAAM,UAAU,UAAW,OAAO,KAAG,OAA6B,CAAA"}
|
package/dist/runs/recording.js
CHANGED
|
@@ -16,23 +16,27 @@ import { runsDirFor, startRun } from "./run.js";
|
|
|
16
16
|
export const recorded = async (options, body) => {
|
|
17
17
|
const streams = options.streams ?? processStreams;
|
|
18
18
|
const trace = options.options.trace === true;
|
|
19
|
-
const
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
19
|
+
const open = (extra = {}) => startRun({
|
|
20
|
+
runsDir: options.runsDir ?? runsDirFor(),
|
|
21
|
+
command: options.command,
|
|
22
|
+
profile: options.profile,
|
|
23
|
+
cliVersion: VERSION,
|
|
24
|
+
// Asked for, so never silent, `--quiet` included (`NEED-53`) — but the operation it
|
|
25
|
+
// describes has happened or is under way, and failing the command now invites a retry
|
|
26
|
+
// that sends twice (`NEED-133`).
|
|
27
|
+
onError: (error) => {
|
|
28
|
+
const warning = `this run is not recorded past this point: ${error.message}`;
|
|
29
|
+
streams.diagnostic(options.format === "pretty" ? warning : JSON.stringify({ warning }));
|
|
30
|
+
},
|
|
31
|
+
...(options.keepDays === undefined ? {} : { keepDays: options.keepDays }),
|
|
32
|
+
...(options.now === undefined ? {} : { now: options.now }),
|
|
33
|
+
...extra,
|
|
34
|
+
});
|
|
35
|
+
const run = options.options.record === true ? open() : undefined;
|
|
36
|
+
// Unrecorded, a run is still kept if it fails (`NEED-268`): held here until the outcome is known,
|
|
37
|
+
// and only the newest — a server lives for hours.
|
|
38
|
+
const held = !run && options.options.keepFailed === true ? [] : undefined;
|
|
39
|
+
const startedAt = (options.now ?? (() => new Date()))();
|
|
36
40
|
let requests = 0;
|
|
37
41
|
const events = (event) => {
|
|
38
42
|
if (event.event === "request")
|
|
@@ -42,6 +46,11 @@ export const recorded = async (options, body) => {
|
|
|
42
46
|
if (trace)
|
|
43
47
|
streams.diagnostic(options.format === "pretty" ? renderEvent(event) : JSON.stringify(event));
|
|
44
48
|
run?.logger.info(event);
|
|
49
|
+
if (held) {
|
|
50
|
+
held.push(event);
|
|
51
|
+
if (held.length > HELD_AT_MOST)
|
|
52
|
+
held.shift();
|
|
53
|
+
}
|
|
45
54
|
};
|
|
46
55
|
try {
|
|
47
56
|
const answer = await body(events);
|
|
@@ -49,12 +58,64 @@ export const recorded = async (options, body) => {
|
|
|
49
58
|
return answer;
|
|
50
59
|
}
|
|
51
60
|
catch (error) {
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
61
|
+
settled.add(error);
|
|
62
|
+
const failed = run ?? (held ? keep(open({ startedAt }), held) : undefined);
|
|
63
|
+
if (failed) {
|
|
64
|
+
if (!(error instanceof CliError))
|
|
65
|
+
failed.logger.info(crashOf(error));
|
|
66
|
+
await failed.finish("failed", {
|
|
67
|
+
requests,
|
|
68
|
+
...outcomeOf(error),
|
|
69
|
+
...(run ? {} : { keptBecauseFailed: true }),
|
|
70
|
+
});
|
|
71
|
+
}
|
|
57
72
|
throw error;
|
|
58
73
|
}
|
|
59
74
|
};
|
|
75
|
+
const HELD_AT_MOST = 500;
|
|
76
|
+
const keep = (run, events) => {
|
|
77
|
+
for (const event of events)
|
|
78
|
+
run.logger.info(event);
|
|
79
|
+
return run;
|
|
80
|
+
};
|
|
81
|
+
/** The code a script branches on, never the sentence: MAX's refusals quote our payload back. */
|
|
82
|
+
const outcomeOf = (error) => {
|
|
83
|
+
if (!(error instanceof CliError))
|
|
84
|
+
return { errorCode: "generic_failure" };
|
|
85
|
+
const maxError = typeof error.details.maxError === "string" ? error.details.maxError : undefined;
|
|
86
|
+
return { errorCode: error.code, ...(maxError ? { maxError } : {}) };
|
|
87
|
+
};
|
|
88
|
+
/**
|
|
89
|
+
* Where a crash happened, not what it said: the class and up to ten frames as `function file:line`,
|
|
90
|
+
* paths cut to what follows the package's `dist/` or `src/`. **Never `message`** — it can hold
|
|
91
|
+
* whatever the failing line was handling.
|
|
92
|
+
*/
|
|
93
|
+
export const crashOf = (error) => {
|
|
94
|
+
const stack = error instanceof Error && typeof error.stack === "string" ? error.stack : "";
|
|
95
|
+
const frames = stack
|
|
96
|
+
.split("\n")
|
|
97
|
+
.filter((line) => line.trimStart().startsWith("at "))
|
|
98
|
+
.slice(0, 10)
|
|
99
|
+
.map((line) => {
|
|
100
|
+
const match = /^\s*at (?:(.+?) \()?(.+?):(\d+):\d+\)?$/.exec(line);
|
|
101
|
+
if (!match)
|
|
102
|
+
return "?";
|
|
103
|
+
const [, fn, path = "", lineNumber] = match;
|
|
104
|
+
const file = /(?:^|\/)(?:dist|src)\/(.+)$/.exec(path)?.[1] ?? path.split("/").at(-1);
|
|
105
|
+
return `${fn ?? "<anonymous>"} ${file}:${lineNumber}`;
|
|
106
|
+
});
|
|
107
|
+
return { event: "crash", errorName: error instanceof Error ? error.name : typeof error, frames };
|
|
108
|
+
};
|
|
109
|
+
/** Failures a run already dealt with — kept, or not kept by the owner's choice. The program's last catch skips them. */
|
|
110
|
+
const settled = new (class {
|
|
111
|
+
#errors = new WeakSet();
|
|
112
|
+
add(error) {
|
|
113
|
+
if (typeof error === "object" && error !== null)
|
|
114
|
+
this.#errors.add(error);
|
|
115
|
+
}
|
|
116
|
+
has(error) {
|
|
117
|
+
return typeof error === "object" && error !== null && this.#errors.has(error);
|
|
118
|
+
}
|
|
119
|
+
})();
|
|
120
|
+
export const wasSettled = (error) => settled.has(error);
|
|
60
121
|
//# sourceMappingURL=recording.js.map
|
|
@@ -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,KAAK,GAAG,OAAO,CAAC,OAAO,CAAC,KAAK,KAAK,IAAI,CAAA;IAE5C,MAAM,GAAG,
|
|
1
|
+
{"version":3,"file":"recording.js","sourceRoot":"","sources":["../../src/runs/recording.ts"],"names":[],"mappings":"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"}
|
package/dist/runs/run.d.ts
CHANGED
|
@@ -17,7 +17,15 @@ export interface RunMetadata {
|
|
|
17
17
|
requests?: number;
|
|
18
18
|
durationMs?: number;
|
|
19
19
|
cliVersion: string;
|
|
20
|
+
/** `node 24.1.0` or `bun 1.3.14`, and where: what a problem report is asked for first. */
|
|
21
|
+
runtime?: string;
|
|
22
|
+
platform?: string;
|
|
23
|
+
arch?: string;
|
|
20
24
|
errorCode?: string;
|
|
25
|
+
/** MAX's key for the refusal that ended it, when there was one (`maxErrorKey`). */
|
|
26
|
+
maxError?: string;
|
|
27
|
+
/** Written only because it failed: recording was not asked for (`NEED-268`). */
|
|
28
|
+
keptBecauseFailed?: boolean;
|
|
21
29
|
}
|
|
22
30
|
export interface StartRunOptions {
|
|
23
31
|
runsDir: string;
|
|
@@ -28,6 +36,8 @@ export interface StartRunOptions {
|
|
|
28
36
|
keepDays?: number;
|
|
29
37
|
runId?: string;
|
|
30
38
|
now?: () => Date;
|
|
39
|
+
/** When the command began, if that was before the run was opened — a failure kept after the fact. */
|
|
40
|
+
startedAt?: Date;
|
|
31
41
|
/** The log file could not be opened or written; the run goes on unrecorded from here. */
|
|
32
42
|
onError?: (error: Error) => void;
|
|
33
43
|
}
|
|
@@ -62,6 +72,7 @@ export declare const runsDirFor: (env?: NodeJS.ProcessEnv) => string;
|
|
|
62
72
|
* holding events and no metadata is a special case `max runs list` would carry forever.
|
|
63
73
|
*/
|
|
64
74
|
export declare const startRun: (options: StartRunOptions) => Run;
|
|
75
|
+
export declare const runtime: () => string;
|
|
65
76
|
/** Newest first, which is the order anyone asking "what did I just do" wants. */
|
|
66
77
|
export declare const listRuns: (runsDir: string) => RunMetadata[];
|
|
67
78
|
export declare const findRun: (runsDir: string, id: string) => {
|
package/dist/runs/run.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"run.d.ts","sourceRoot":"","sources":["../../src/runs/run.ts"],"names":[],"mappings":"AAGA,OAAO,EAAoB,KAAK,UAAU,EAA+B,MAAM,mBAAmB,CAAA;AAElG,MAAM,MAAM,SAAS,GAAG,SAAS,GAAG,QAAQ,CAAA;AAE5C;;;;GAIG;AACH,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,MAAM,CAAA;IACb,sEAAsE;IACtE,OAAO,EAAE,MAAM,CAAA;IACf,OAAO,EAAE,MAAM,CAAA;IACf,SAAS,EAAE,MAAM,CAAA;IACjB,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,MAAM,EAAE,SAAS,GAAG,SAAS,CAAA;IAC7B,2FAA2F;IAC3F,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,UAAU,EAAE,MAAM,CAAA;IAClB,SAAS,CAAC,EAAE,MAAM,CAAA;
|
|
1
|
+
{"version":3,"file":"run.d.ts","sourceRoot":"","sources":["../../src/runs/run.ts"],"names":[],"mappings":"AAGA,OAAO,EAAoB,KAAK,UAAU,EAA+B,MAAM,mBAAmB,CAAA;AAElG,MAAM,MAAM,SAAS,GAAG,SAAS,GAAG,QAAQ,CAAA;AAE5C;;;;GAIG;AACH,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,MAAM,CAAA;IACb,sEAAsE;IACtE,OAAO,EAAE,MAAM,CAAA;IACf,OAAO,EAAE,MAAM,CAAA;IACf,SAAS,EAAE,MAAM,CAAA;IACjB,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,MAAM,EAAE,SAAS,GAAG,SAAS,CAAA;IAC7B,2FAA2F;IAC3F,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,UAAU,EAAE,MAAM,CAAA;IAClB,0FAA0F;IAC1F,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,mFAAmF;IACnF,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,gFAAgF;IAChF,iBAAiB,CAAC,EAAE,OAAO,CAAA;CAC5B;AAED,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,MAAM,CAAA;IACf,OAAO,EAAE,MAAM,CAAA;IACf,OAAO,EAAE,MAAM,CAAA;IACf,UAAU,EAAE,MAAM,CAAA;IAClB,6DAA6D;IAC7D,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,GAAG,CAAC,EAAE,MAAM,IAAI,CAAA;IAChB,qGAAqG;IACrG,SAAS,CAAC,EAAE,IAAI,CAAA;IAChB,yFAAyF;IACzF,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAA;CACjC;AAED,MAAM,WAAW,GAAG;IAClB,EAAE,EAAE,MAAM,CAAA;IACV,GAAG,EAAE,MAAM,CAAA;IACX,MAAM,EAAE,UAAU,CAAA;IAClB;;;OAGG;IACH,MAAM,CAAC,MAAM,EAAE,SAAS,EAAE,KAAK,CAAC,EAAE,OAAO,CAAC,WAAW,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;CACvE;AAED,yFAAyF;AACzF,eAAO,MAAM,kBAAkB,KAAK,CAAA;AAEpC;;;GAGG;AACH,eAAO,MAAM,UAAU,SAAS,MAAM,CAAC,UAAU,KAAiB,MACY,CAAA;AAE9E;;;;;;;;;;;;GAYG;AACH,eAAO,MAAM,QAAQ,YAAa,eAAe,KAAG,GA6DnD,CAAA;AAED,eAAO,MAAM,OAAO,QAAO,MAG1B,CAAA;AAkBD,iFAAiF;AACjF,eAAO,MAAM,QAAQ,YAAa,MAAM,KAAG,WAAW,EAUrD,CAAA;AAED,eAAO,MAAM,OAAO,YAAa,MAAM,MAAM,MAAM,KAAG;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,WAAW,CAAA;CAAE,GAAG,SAO9F,CAAA;AAED,gGAAgG;AAChG,eAAO,MAAM,UAAU,QAAS,MAAM,KAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAoB/D,CAAA;AAED;;;;;GAKG;AACH,eAAO,MAAM,SAAS,YAAa,MAAM,qBAAqB;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,IAAI,CAAA;CAAE,KAAG,MAc/F,CAAA"}
|
package/dist/runs/run.js
CHANGED
|
@@ -24,7 +24,7 @@ export const runsDirFor = (env = process.env) => join(resolvePaths({ appName: "m
|
|
|
24
24
|
*/
|
|
25
25
|
export const startRun = (options) => {
|
|
26
26
|
const now = options.now ?? (() => new Date());
|
|
27
|
-
const startedAt = now();
|
|
27
|
+
const startedAt = options.startedAt ?? now();
|
|
28
28
|
const id = options.runId ?? runId(startedAt, options.command);
|
|
29
29
|
const dir = join(options.runsDir, day(startedAt), id);
|
|
30
30
|
// Only while something is being recorded: a tool that is not recording has no business walking
|
|
@@ -48,6 +48,9 @@ export const startRun = (options) => {
|
|
|
48
48
|
startedAt: startedAt.toISOString(),
|
|
49
49
|
status: "running",
|
|
50
50
|
cliVersion: options.cliVersion,
|
|
51
|
+
runtime: runtime(),
|
|
52
|
+
platform: process.platform,
|
|
53
|
+
arch: process.arch,
|
|
51
54
|
};
|
|
52
55
|
writeRunFile(dir, metadata);
|
|
53
56
|
let finished = false;
|
|
@@ -73,6 +76,10 @@ export const startRun = (options) => {
|
|
|
73
76
|
},
|
|
74
77
|
};
|
|
75
78
|
};
|
|
79
|
+
export const runtime = () => {
|
|
80
|
+
const bun = process.versions.bun;
|
|
81
|
+
return bun ? `bun ${bun}` : `node ${process.versions.node}`;
|
|
82
|
+
};
|
|
76
83
|
/** `20260920T084431Z-chats-list-a81f2c` — sortable, and readable without opening it. */
|
|
77
84
|
const runId = (startedAt, command) => {
|
|
78
85
|
const stamp = startedAt
|