@duyquangnvx/agent-cli 0.4.0 → 0.6.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/CHANGELOG.md +80 -0
- package/dist/agent-cli.js +2 -2
- package/dist/agent-cli.js.map +1 -1
- package/dist/agent.d.ts +5 -3
- package/dist/agent.js +31 -10
- package/dist/agent.js.map +1 -1
- package/dist/built-ins/commands.d.ts +8 -0
- package/dist/{built-ins.js → built-ins/commands.js} +4 -4
- package/dist/built-ins/commands.js.map +1 -0
- package/dist/built-ins/doctor-rows.d.ts +4 -0
- package/dist/{doctor-rows.js → built-ins/doctor-rows.js} +18 -26
- package/dist/built-ins/doctor-rows.js.map +1 -0
- package/dist/built-ins/doctor.d.ts +5 -0
- package/dist/{doctor.js → built-ins/doctor.js} +27 -20
- package/dist/built-ins/doctor.js.map +1 -0
- package/dist/{global-install.js → built-ins/global-install.js} +1 -1
- package/dist/built-ins/global-install.js.map +1 -0
- package/dist/{npm.d.ts → built-ins/npm.d.ts} +5 -2
- package/dist/{npm.js → built-ins/npm.js} +25 -33
- package/dist/built-ins/npm.js.map +1 -0
- package/dist/built-ins/semver.js.map +1 -0
- package/dist/built-ins/skills.d.ts +18 -0
- package/dist/built-ins/skills.js +97 -0
- package/dist/built-ins/skills.js.map +1 -0
- package/dist/{update.d.ts → built-ins/update.d.ts} +3 -2
- package/dist/{update.js → built-ins/update.js} +28 -18
- package/dist/built-ins/update.js.map +1 -0
- package/dist/{upgrade-notes.js → built-ins/upgrade-notes.js} +1 -1
- package/dist/built-ins/upgrade-notes.js.map +1 -0
- package/dist/clock.d.ts +1 -0
- package/dist/clock.js.map +1 -1
- package/dist/command-spec.d.ts +17 -2
- package/dist/command-spec.js +30 -9
- package/dist/command-spec.js.map +1 -1
- package/dist/confirm.js +6 -2
- package/dist/confirm.js.map +1 -1
- package/dist/context.d.ts +139 -0
- package/dist/context.js +2 -0
- package/dist/context.js.map +1 -0
- package/dist/cost.js +2 -2
- package/dist/cost.js.map +1 -1
- package/dist/define.d.ts +100 -87
- package/dist/define.js +3 -1
- package/dist/define.js.map +1 -1
- package/dist/errno.d.ts +8 -4
- package/dist/errno.js +21 -4
- package/dist/errno.js.map +1 -1
- package/dist/error-table.d.ts +6 -1
- package/dist/error-table.js +5 -1
- package/dist/error-table.js.map +1 -1
- package/dist/errors.d.ts +11 -2
- package/dist/errors.js +21 -8
- package/dist/errors.js.map +1 -1
- package/dist/execute.d.ts +9 -2
- package/dist/execute.js +10 -3
- package/dist/execute.js.map +1 -1
- package/dist/exit-classes.js +38 -38
- package/dist/exit-classes.js.map +1 -1
- package/dist/files.d.ts +30 -8
- package/dist/files.js +104 -17
- package/dist/files.js.map +1 -1
- package/dist/help-json.d.ts +2 -2
- package/dist/help-json.js +6 -2
- package/dist/help-json.js.map +1 -1
- package/dist/help.d.ts +1 -1
- package/dist/help.js +14 -9
- package/dist/help.js.map +1 -1
- package/dist/index.d.ts +12 -5
- package/dist/index.js +6 -2
- package/dist/index.js.map +1 -1
- package/dist/input.d.ts +7 -1
- package/dist/input.js +33 -4
- package/dist/input.js.map +1 -1
- package/dist/interrupts.d.ts +7 -2
- package/dist/interrupts.js +29 -15
- package/dist/interrupts.js.map +1 -1
- package/dist/invocation.d.ts +10 -5
- package/dist/invocation.js +24 -11
- package/dist/invocation.js.map +1 -1
- package/dist/list.d.ts +12 -3
- package/dist/list.js +38 -6
- package/dist/list.js.map +1 -1
- package/dist/manifest.d.ts +17 -0
- package/dist/manifest.js +24 -0
- package/dist/manifest.js.map +1 -0
- package/dist/operator.d.ts +5 -0
- package/dist/operator.js +15 -0
- package/dist/operator.js.map +1 -0
- package/dist/output.d.ts +6 -4
- package/dist/output.js +5 -6
- package/dist/output.js.map +1 -1
- package/dist/outputs.d.ts +24 -1
- package/dist/outputs.js +58 -2
- package/dist/outputs.js.map +1 -1
- package/dist/parse-input.d.ts +11 -2
- package/dist/parse-input.js +78 -27
- package/dist/parse-input.js.map +1 -1
- package/dist/project.d.ts +3 -2
- package/dist/project.js +11 -10
- package/dist/project.js.map +1 -1
- package/dist/route.d.ts +1 -1
- package/dist/route.js +2 -1
- package/dist/route.js.map +1 -1
- package/dist/run-cli.d.ts +8 -33
- package/dist/run-cli.js +50 -157
- package/dist/run-cli.js.map +1 -1
- package/dist/run-command.d.ts +11 -0
- package/dist/run-command.js +234 -0
- package/dist/run-command.js.map +1 -0
- package/dist/run-options.d.ts +48 -0
- package/dist/run-options.js +2 -0
- package/dist/run-options.js.map +1 -0
- package/dist/run-process.js +7 -4
- package/dist/run-process.js.map +1 -1
- package/dist/secrets.d.ts +10 -6
- package/dist/secrets.js +8 -9
- package/dist/secrets.js.map +1 -1
- package/dist/side-task.d.ts +27 -0
- package/dist/side-task.js +31 -0
- package/dist/side-task.js.map +1 -0
- package/dist/spawn.d.ts +29 -6
- package/dist/spawn.js +126 -29
- package/dist/spawn.js.map +1 -1
- package/dist/spill.d.ts +4 -3
- package/dist/spill.js +1 -7
- package/dist/spill.js.map +1 -1
- package/dist/stdin.d.ts +33 -0
- package/dist/stdin.js +92 -0
- package/dist/stdin.js.map +1 -0
- package/dist/style.d.ts +1 -1
- package/dist/tokenize.d.ts +3 -0
- package/dist/tokenize.js +5 -4
- package/dist/tokenize.js.map +1 -1
- package/dist/tools.d.ts +6 -3
- package/dist/tools.js +18 -11
- package/dist/tools.js.map +1 -1
- package/dist/usage.d.ts +2 -0
- package/dist/usage.js +12 -1
- package/dist/usage.js.map +1 -1
- package/dist/version.d.ts +3 -0
- package/dist/version.js +7 -0
- package/dist/version.js.map +1 -0
- package/package.json +1 -1
- package/dist/built-ins.d.ts +0 -3
- package/dist/built-ins.js.map +0 -1
- package/dist/doctor-rows.d.ts +0 -3
- package/dist/doctor-rows.js.map +0 -1
- package/dist/doctor.d.ts +0 -4
- package/dist/doctor.js.map +0 -1
- package/dist/global-install.js.map +0 -1
- package/dist/npm.js.map +0 -1
- package/dist/semver.js.map +0 -1
- package/dist/skills.d.ts +0 -11
- package/dist/skills.js +0 -58
- package/dist/skills.js.map +0 -1
- package/dist/update.js.map +0 -1
- package/dist/upgrade-notes.js.map +0 -1
- /package/dist/{global-install.d.ts → built-ins/global-install.d.ts} +0 -0
- /package/dist/{semver.d.ts → built-ins/semver.d.ts} +0 -0
- /package/dist/{semver.js → built-ins/semver.js} +0 -0
- /package/dist/{upgrade-notes.d.ts → built-ins/upgrade-notes.d.ts} +0 -0
package/dist/index.js
CHANGED
|
@@ -1,8 +1,12 @@
|
|
|
1
1
|
export { agentCli } from "./agent-cli.js";
|
|
2
|
-
export { ALREADY_EXISTS, DISK_FULL, NOT_FOUND, PERMISSION_DENIED } from "./errno.js";
|
|
2
|
+
export { ALREADY_EXISTS, DISK_FULL, NOT_A_FILE, NOT_FOUND, PERMISSION_DENIED, } from "./errno.js";
|
|
3
3
|
export { cliError, defineErrors } from "./error-table.js";
|
|
4
4
|
export { CliError, debugVariable, UsageError } from "./errors.js";
|
|
5
|
-
export {
|
|
5
|
+
export { DEADLINE_EXCEEDED, INTERRUPTED } from "./interrupts.js";
|
|
6
|
+
export { page, paginate } from "./list.js";
|
|
7
|
+
export { NEEDS_OPERATOR } from "./operator.js";
|
|
6
8
|
export { runCli } from "./run-cli.js";
|
|
7
9
|
export { runProcess } from "./run-process.js";
|
|
10
|
+
export { SIDE_TASK_WAIT_MS } from "./side-task.js";
|
|
11
|
+
export { orStdin, STDIN_IDLE_MS, STDIN_STALLED } from "./stdin.js";
|
|
8
12
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AA6B1C,OAAO,EACL,cAAc,EACd,SAAS,EAET,UAAU,EACV,SAAS,EACT,iBAAiB,GAClB,MAAM,YAAY,CAAC;AAOpB,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAE1D,OAAO,EAAE,QAAQ,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAElE,OAAO,EAAE,iBAAiB,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAEjE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAC3C,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAE/C,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAEtC,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAG9C,OAAO,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAGnD,OAAO,EAAE,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC"}
|
package/dist/input.d.ts
CHANGED
|
@@ -11,8 +11,10 @@ export interface InputField {
|
|
|
11
11
|
readonly defaultValue: unknown;
|
|
12
12
|
readonly description: string | undefined;
|
|
13
13
|
readonly choices: readonly string[] | undefined;
|
|
14
|
-
/**
|
|
14
|
+
/** A `z.array(...)` field: an arg taking every remaining operand, or an option taking every occurrence of its flag; `type` and `choices` are its element's. */
|
|
15
15
|
readonly variadic: boolean;
|
|
16
|
+
/** Marked with `orStdin`: the operand `-` stands for the text on stdin. */
|
|
17
|
+
readonly stdin: boolean;
|
|
16
18
|
/** How the caller names it: `<name>` for an arg, `--name` or `--no-name` for an option. */
|
|
17
19
|
readonly label: string;
|
|
18
20
|
/** How the caller passes it: the label plus a value placeholder such as `<value>` or `<a|b>`. */
|
|
@@ -23,4 +25,8 @@ export declare function optionField(key: string, schema: z.ZodType): InputField;
|
|
|
23
25
|
export declare function argFields(schema: InputSchema | undefined): InputField[];
|
|
24
26
|
/** Throws when an arg that takes every remaining operand is not the last arg. */
|
|
25
27
|
export declare function checkArrayArgLast(name: string, args: InputSchema | undefined): void;
|
|
28
|
+
/** Throws unless at most one arg, and no option, is marked with `orStdin`. */
|
|
29
|
+
export declare function checkStdinFields(name: string, args: InputSchema | undefined, options: InputSchema | undefined): void;
|
|
26
30
|
export declare function optionFields(schema: InputSchema | undefined): InputField[];
|
|
31
|
+
/** Throws when an option is an array of booleans, which a switch cannot express. */
|
|
32
|
+
export declare function checkNoBooleanArrayOption(name: string, options: InputSchema | undefined): void;
|
package/dist/input.js
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import * as z from "zod";
|
|
2
|
+
import { isStdinSchema } from "./stdin.js";
|
|
2
3
|
function isWrapper(schema) {
|
|
3
4
|
return (schema instanceof z.ZodOptional ||
|
|
4
5
|
schema instanceof z.ZodNullable ||
|
|
@@ -20,6 +21,7 @@ function describe(schema) {
|
|
|
20
21
|
let description = current.description;
|
|
21
22
|
let required = true;
|
|
22
23
|
let defaultValue;
|
|
24
|
+
let stdin = isStdinSchema(current);
|
|
23
25
|
while (isWrapper(current)) {
|
|
24
26
|
if (current instanceof z.ZodDefault || current instanceof z.ZodPrefault) {
|
|
25
27
|
defaultValue = current.def.defaultValue;
|
|
@@ -27,6 +29,7 @@ function describe(schema) {
|
|
|
27
29
|
required = false;
|
|
28
30
|
current = current.unwrap();
|
|
29
31
|
description ??= current.description;
|
|
32
|
+
stdin ||= isStdinSchema(current);
|
|
30
33
|
}
|
|
31
34
|
const variadic = current instanceof z.ZodArray;
|
|
32
35
|
if (current instanceof z.ZodArray) {
|
|
@@ -39,9 +42,13 @@ function describe(schema) {
|
|
|
39
42
|
description,
|
|
40
43
|
choices: current instanceof z.ZodEnum ? current.options.map(String) : undefined,
|
|
41
44
|
variadic,
|
|
45
|
+
stdin,
|
|
42
46
|
};
|
|
43
47
|
}
|
|
44
|
-
function argLabel(key, { variadic, required }) {
|
|
48
|
+
function argLabel(key, { variadic, required, stdin }) {
|
|
49
|
+
if (stdin) {
|
|
50
|
+
return required ? `<${key}|->` : `[${key}|-]`;
|
|
51
|
+
}
|
|
45
52
|
if (!variadic) {
|
|
46
53
|
return `<${key}>`;
|
|
47
54
|
}
|
|
@@ -58,7 +65,8 @@ export function optionField(key, schema) {
|
|
|
58
65
|
const isBoolean = described.type === "boolean";
|
|
59
66
|
// A boolean that defaults to true can only be changed by turning it off.
|
|
60
67
|
const label = isBoolean && described.defaultValue === true ? `--no-${name}` : `--${name}`;
|
|
61
|
-
const
|
|
68
|
+
const value = `<${described.choices?.join("|") ?? "value"}>${described.variadic ? "..." : ""}`;
|
|
69
|
+
const usage = isBoolean ? label : `${label} ${value}`;
|
|
62
70
|
return { key, name, schema, ...described, label, usage };
|
|
63
71
|
}
|
|
64
72
|
function fieldsOf(schema, toField) {
|
|
@@ -69,17 +77,38 @@ function fieldsOf(schema, toField) {
|
|
|
69
77
|
export function argFields(schema) {
|
|
70
78
|
return fieldsOf(schema, argField);
|
|
71
79
|
}
|
|
80
|
+
function keysOf(fields) {
|
|
81
|
+
return fields.map(({ key }) => `'${key}'`).join(", ");
|
|
82
|
+
}
|
|
72
83
|
/** Throws when an arg that takes every remaining operand is not the last arg. */
|
|
73
84
|
export function checkArrayArgLast(name, args) {
|
|
74
85
|
const misplaced = argFields(args)
|
|
75
86
|
.slice(0, -1)
|
|
76
87
|
.filter((field) => field.variadic);
|
|
77
88
|
if (misplaced.length > 0) {
|
|
78
|
-
|
|
79
|
-
|
|
89
|
+
throw new Error(`Command '${name}' declares array arg ${keysOf(misplaced)} before its last arg; only the last arg may be an array`);
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
/** Throws unless at most one arg, and no option, is marked with `orStdin`. */
|
|
93
|
+
export function checkStdinFields(name, args, options) {
|
|
94
|
+
const stdinArgs = argFields(args).filter((field) => field.stdin);
|
|
95
|
+
if (stdinArgs.length > 1) {
|
|
96
|
+
throw new Error(`Command '${name}' marks args ${keysOf(stdinArgs)} with orStdin; only one arg may read stdin`);
|
|
97
|
+
}
|
|
98
|
+
const stdinOptions = optionFields(options).filter((field) => field.stdin);
|
|
99
|
+
if (stdinOptions.length > 0) {
|
|
100
|
+
const noun = stdinOptions.length === 1 ? "option" : "options";
|
|
101
|
+
throw new Error(`Command '${name}' marks ${noun} ${keysOf(stdinOptions)} with orStdin; only an arg may read stdin`);
|
|
80
102
|
}
|
|
81
103
|
}
|
|
82
104
|
export function optionFields(schema) {
|
|
83
105
|
return fieldsOf(schema, optionField);
|
|
84
106
|
}
|
|
107
|
+
/** Throws when an option is an array of booleans, which a switch cannot express. */
|
|
108
|
+
export function checkNoBooleanArrayOption(name, options) {
|
|
109
|
+
const booleans = optionFields(options).filter((field) => field.variadic && field.type === "boolean");
|
|
110
|
+
if (booleans.length > 0) {
|
|
111
|
+
throw new Error(`Command '${name}' declares boolean array option ${keysOf(booleans)}; a switch cannot repeat, use a boolean`);
|
|
112
|
+
}
|
|
113
|
+
}
|
|
85
114
|
//# sourceMappingURL=input.js.map
|
package/dist/input.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"input.js","sourceRoot":"","sources":["../src/input.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,CAAC,MAAM,KAAK,CAAC;
|
|
1
|
+
{"version":3,"file":"input.js","sourceRoot":"","sources":["../src/input.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,CAAC,MAAM,KAAK,CAAC;AAEzB,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AA4B3C,SAAS,SAAS,CAAC,MAAiB;IAClC,OAAO,CACL,MAAM,YAAY,CAAC,CAAC,WAAW;QAC/B,MAAM,YAAY,CAAC,CAAC,WAAW;QAC/B,MAAM,YAAY,CAAC,CAAC,UAAU;QAC9B,MAAM,YAAY,CAAC,CAAC,WAAW,CAChC,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,KAAK,CAAC,GAAW;IAC/B,OAAO,GAAG,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,IAAI,MAAM,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;AACvE,CAAC;AAED,0EAA0E;AAC1E,SAAS,MAAM,CAAC,MAAiB;IAC/B,IAAI,MAAM,YAAY,CAAC,CAAC,SAAS,EAAE,CAAC;QAClC,OAAO,QAAQ,CAAC;IAClB,CAAC;IACD,OAAO,MAAM,YAAY,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC;AAC/D,CAAC;AAED,SAAS,QAAQ,CAAC,MAAiB;IACjC,IAAI,OAAO,GAAG,MAAM,CAAC;IACrB,IAAI,WAAW,GAAG,OAAO,CAAC,WAAW,CAAC;IACtC,IAAI,QAAQ,GAAG,IAAI,CAAC;IACpB,IAAI,YAAqB,CAAC;IAC1B,IAAI,KAAK,GAAG,aAAa,CAAC,OAAO,CAAC,CAAC;IACnC,OAAO,SAAS,CAAC,OAAO,CAAC,EAAE,CAAC;QAC1B,IAAI,OAAO,YAAY,CAAC,CAAC,UAAU,IAAI,OAAO,YAAY,CAAC,CAAC,WAAW,EAAE,CAAC;YACxE,YAAY,GAAG,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC;QAC1C,CAAC;QACD,QAAQ,GAAG,KAAK,CAAC;QACjB,OAAO,GAAG,OAAO,CAAC,MAAM,EAAe,CAAC;QACxC,WAAW,KAAK,OAAO,CAAC,WAAW,CAAC;QACpC,KAAK,KAAK,aAAa,CAAC,OAAO,CAAC,CAAC;IACnC,CAAC;IACD,MAAM,QAAQ,GAAG,OAAO,YAAY,CAAC,CAAC,QAAQ,CAAC;IAC/C,IAAI,OAAO,YAAY,CAAC,CAAC,QAAQ,EAAE,CAAC;QAClC,OAAO,GAAG,OAAO,CAAC,OAAoB,CAAC;IACzC,CAAC;IACD,OAAO;QACL,IAAI,EAAE,MAAM,CAAC,OAAO,CAAC;QACrB,QAAQ;QACR,YAAY;QACZ,WAAW;QACX,OAAO,EAAE,OAAO,YAAY,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS;QAC/E,QAAQ;QACR,KAAK;KACN,CAAC;AACJ,CAAC;AAED,SAAS,QAAQ,CAAC,GAAW,EAAE,EAAE,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAa;IACrE,IAAI,KAAK,EAAE,CAAC;QACV,OAAO,QAAQ,CAAC,CAAC,CAAC,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,IAAI,GAAG,KAAK,CAAC;IAChD,CAAC;IACD,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,OAAO,IAAI,GAAG,GAAG,CAAC;IACpB,CAAC;IACD,OAAO,QAAQ,CAAC,CAAC,CAAC,IAAI,GAAG,MAAM,CAAC,CAAC,CAAC,IAAI,GAAG,MAAM,CAAC;AAClD,CAAC;AAED,SAAS,QAAQ,CAAC,GAAW,EAAE,MAAiB;IAC9C,MAAM,SAAS,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC;IACnC,MAAM,KAAK,GAAG,QAAQ,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;IACvC,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,SAAS,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;AACvE,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,GAAW,EAAE,MAAiB;IACxD,MAAM,SAAS,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC;IACnC,MAAM,IAAI,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC;IACxB,MAAM,SAAS,GAAG,SAAS,CAAC,IAAI,KAAK,SAAS,CAAC;IAC/C,yEAAyE;IACzE,MAAM,KAAK,GAAG,SAAS,IAAI,SAAS,CAAC,YAAY,KAAK,IAAI,CAAC,CAAC,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;IAC1F,MAAM,KAAK,GAAG,IAAI,SAAS,CAAC,OAAO,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,OAAO,IAAI,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;IAC/F,MAAM,KAAK,GAAG,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,KAAK,IAAI,KAAK,EAAE,CAAC;IACtD,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,SAAS,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;AAC3D,CAAC;AAED,SAAS,QAAQ,CACf,MAA+B,EAC/B,OAAuD;IAEvD,OAAO,MAAM,KAAK,SAAS;QACzB,CAAC,CAAC,EAAE;QACJ,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC,CAAC;AAC9E,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,MAA+B;IACvD,OAAO,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;AACpC,CAAC;AAED,SAAS,MAAM,CAAC,MAA6B;IAC3C,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,EAAE,EAAE,CAAC,IAAI,GAAG,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACxD,CAAC;AAED,iFAAiF;AACjF,MAAM,UAAU,iBAAiB,CAAC,IAAY,EAAE,IAA6B;IAC3E,MAAM,SAAS,GAAG,SAAS,CAAC,IAAI,CAAC;SAC9B,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;SACZ,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;IACrC,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACzB,MAAM,IAAI,KAAK,CACb,YAAY,IAAI,wBAAwB,MAAM,CAAC,SAAS,CAAC,yDAAyD,CACnH,CAAC;IACJ,CAAC;AACH,CAAC;AAED,8EAA8E;AAC9E,MAAM,UAAU,gBAAgB,CAC9B,IAAY,EACZ,IAA6B,EAC7B,OAAgC;IAEhC,MAAM,SAAS,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IACjE,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACzB,MAAM,IAAI,KAAK,CACb,YAAY,IAAI,gBAAgB,MAAM,CAAC,SAAS,CAAC,4CAA4C,CAC9F,CAAC;IACJ,CAAC;IACD,MAAM,YAAY,GAAG,YAAY,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IAC1E,IAAI,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC5B,MAAM,IAAI,GAAG,YAAY,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC;QAC9D,MAAM,IAAI,KAAK,CACb,YAAY,IAAI,WAAW,IAAI,IAAI,MAAM,CAAC,YAAY,CAAC,2CAA2C,CACnG,CAAC;IACJ,CAAC;AACH,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,MAA+B;IAC1D,OAAO,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;AACvC,CAAC;AAED,oFAAoF;AACpF,MAAM,UAAU,yBAAyB,CAAC,IAAY,EAAE,OAAgC;IACtF,MAAM,QAAQ,GAAG,YAAY,CAAC,OAAO,CAAC,CAAC,MAAM,CAC3C,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,QAAQ,IAAI,KAAK,CAAC,IAAI,KAAK,SAAS,CACtD,CAAC;IACF,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACxB,MAAM,IAAI,KAAK,CACb,YAAY,IAAI,mCAAmC,MAAM,CAAC,QAAQ,CAAC,yCAAyC,CAC7G,CAAC;IACJ,CAAC;AACH,CAAC"}
|
package/dist/interrupts.d.ts
CHANGED
|
@@ -12,7 +12,7 @@ export interface RunControlOptions {
|
|
|
12
12
|
/** The whole run's deadline and the hint, naming the resume command line, it ends with. */
|
|
13
13
|
readonly runDeadline: {
|
|
14
14
|
readonly ms: number;
|
|
15
|
-
readonly hint: string;
|
|
15
|
+
readonly hint: () => string;
|
|
16
16
|
} | undefined;
|
|
17
17
|
}
|
|
18
18
|
/** One Command run's cancellation: its signal, its deadlines and the steps it must finish. */
|
|
@@ -21,12 +21,17 @@ export declare class RunControl {
|
|
|
21
21
|
readonly signal: AbortSignal;
|
|
22
22
|
constructor({ commandLine, outer, clock, progress, runDeadline }: RunControlOptions);
|
|
23
23
|
deadline(ms: number): AbortSignal;
|
|
24
|
+
timeout(ms: number): AbortSignal;
|
|
24
25
|
runToEnd<T>(name: string, work: () => Promise<T>): Promise<T>;
|
|
25
26
|
/** Waits for the Command, its must-finish steps, and no longer than the grace once interrupted. */
|
|
26
27
|
settle<T>(work: Promise<T>): Promise<T>;
|
|
27
28
|
/**
|
|
28
|
-
* The error a run ends with: an interrupt or
|
|
29
|
+
* The error a run ends with: an interrupt or the run deadline outranks what the Command threw,
|
|
29
30
|
* unless the Command threw its own `INTERRUPTED`, saying what it finished before it stopped.
|
|
31
|
+
* Otherwise each leaf that is not a `CliError` and whose cause chain holds a deadline's or timeout's
|
|
32
|
+
* abort is reported as that abort, so a declared error keeps its own code.
|
|
30
33
|
*/
|
|
31
34
|
errorAfter(error: unknown): unknown;
|
|
35
|
+
/** Stops the run's timers and its hold on the caller's signal, for a run that never settles. */
|
|
36
|
+
close(): void;
|
|
32
37
|
}
|
package/dist/interrupts.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { after } from "./clock.js";
|
|
2
|
-
import { CliError } from "./errors.js";
|
|
2
|
+
import { CliError, causesOf, errorsOf } from "./errors.js";
|
|
3
3
|
export const INTERRUPTED = "INTERRUPTED";
|
|
4
4
|
export const DEADLINE_EXCEEDED = "DEADLINE_EXCEEDED";
|
|
5
5
|
/** How long an interrupted Command may take to settle before the run ends without it. */
|
|
@@ -13,10 +13,10 @@ function interruptedError() {
|
|
|
13
13
|
});
|
|
14
14
|
}
|
|
15
15
|
const WAIT_HINT = "run it again later, when the service it waits on may answer faster";
|
|
16
|
-
function deadlineError(commandLine, ms, hint) {
|
|
16
|
+
function deadlineError(commandLine, ms, hint, bound = "deadline") {
|
|
17
17
|
return new CliError({
|
|
18
18
|
code: DEADLINE_EXCEEDED,
|
|
19
|
-
message: `${commandLine} ran past its ${ms} ms
|
|
19
|
+
message: `${commandLine} ran past its ${ms} ms ${bound}`,
|
|
20
20
|
hint,
|
|
21
21
|
});
|
|
22
22
|
}
|
|
@@ -32,7 +32,8 @@ export class RunControl {
|
|
|
32
32
|
#progress;
|
|
33
33
|
#clock;
|
|
34
34
|
#disposed = new AbortController();
|
|
35
|
-
|
|
35
|
+
/** The reasons this run's deadlines and timeouts aborted with, to tell them in a Command's error. */
|
|
36
|
+
#abortReasons = new WeakSet();
|
|
36
37
|
#graceCancel = new AbortController();
|
|
37
38
|
#endGrace = () => { };
|
|
38
39
|
#graceOver = new Promise((resolve) => {
|
|
@@ -53,16 +54,23 @@ export class RunControl {
|
|
|
53
54
|
}
|
|
54
55
|
if (runDeadline !== undefined) {
|
|
55
56
|
const { ms, hint } = runDeadline;
|
|
56
|
-
after(clock, ms, this.#disposed.signal, () => this.#controller.abort(deadlineError(commandLine, ms, hint)));
|
|
57
|
+
after(clock, ms, this.#disposed.signal, () => this.#controller.abort(deadlineError(commandLine, ms, hint())));
|
|
57
58
|
}
|
|
58
59
|
}
|
|
59
60
|
deadline(ms) {
|
|
61
|
+
return AbortSignal.any([this.signal, this.#abortsAfter(ms, "deadline")]);
|
|
62
|
+
}
|
|
63
|
+
timeout(ms) {
|
|
64
|
+
return this.#abortsAfter(ms, "timeout");
|
|
65
|
+
}
|
|
66
|
+
#abortsAfter(ms, bound) {
|
|
60
67
|
const controller = new AbortController();
|
|
61
68
|
after(this.#clock, ms, this.#disposed.signal, () => {
|
|
62
|
-
|
|
63
|
-
|
|
69
|
+
const reason = deadlineError(this.#commandLine, ms, WAIT_HINT, bound);
|
|
70
|
+
this.#abortReasons.add(reason);
|
|
71
|
+
controller.abort(reason);
|
|
64
72
|
});
|
|
65
|
-
return
|
|
73
|
+
return controller.signal;
|
|
66
74
|
}
|
|
67
75
|
async runToEnd(name, work) {
|
|
68
76
|
this.#graceCancel.abort();
|
|
@@ -91,21 +99,26 @@ export class RunControl {
|
|
|
91
99
|
}
|
|
92
100
|
finally {
|
|
93
101
|
await this.#stepsDone();
|
|
94
|
-
this
|
|
102
|
+
this.close();
|
|
95
103
|
}
|
|
96
104
|
}
|
|
97
105
|
/**
|
|
98
|
-
* The error a run ends with: an interrupt or
|
|
106
|
+
* The error a run ends with: an interrupt or the run deadline outranks what the Command threw,
|
|
99
107
|
* unless the Command threw its own `INTERRUPTED`, saying what it finished before it stopped.
|
|
108
|
+
* Otherwise each leaf that is not a `CliError` and whose cause chain holds a deadline's or timeout's
|
|
109
|
+
* abort is reported as that abort, so a declared error keeps its own code.
|
|
100
110
|
*/
|
|
101
111
|
errorAfter(error) {
|
|
102
112
|
if (this.signal.aborted) {
|
|
103
113
|
return error instanceof CliError && error.code === INTERRUPTED ? error : this.signal.reason;
|
|
104
114
|
}
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
115
|
+
const leaves = errorsOf(error).map((leaf) => this.#abortIn(leaf) ?? leaf);
|
|
116
|
+
return leaves.length === 1 ? leaves[0] : new AggregateError(leaves);
|
|
117
|
+
}
|
|
118
|
+
#abortIn(error) {
|
|
119
|
+
if (error instanceof CliError)
|
|
120
|
+
return undefined;
|
|
121
|
+
return causesOf(error).find((each) => each instanceof CliError && this.#abortReasons.has(each));
|
|
109
122
|
}
|
|
110
123
|
#onStop() {
|
|
111
124
|
for (const name of this.#steps.values())
|
|
@@ -127,7 +140,8 @@ export class RunControl {
|
|
|
127
140
|
await Promise.all(this.#steps.keys());
|
|
128
141
|
}
|
|
129
142
|
}
|
|
130
|
-
|
|
143
|
+
/** Stops the run's timers and its hold on the caller's signal, for a run that never settles. */
|
|
144
|
+
close() {
|
|
131
145
|
this.#graceCancel.abort();
|
|
132
146
|
this.#disposed.abort();
|
|
133
147
|
this.#outer?.removeEventListener("abort", this.#onOuterAbort);
|
package/dist/interrupts.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"interrupts.js","sourceRoot":"","sources":["../src/interrupts.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAc,MAAM,YAAY,CAAC;AAC/C,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"interrupts.js","sourceRoot":"","sources":["../src/interrupts.ts"],"names":[],"mappings":"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"}
|
package/dist/invocation.d.ts
CHANGED
|
@@ -1,14 +1,19 @@
|
|
|
1
|
+
import { type KnownFlag } from "./tokenize.js";
|
|
1
2
|
export declare const END_OF_OPTIONS = "--";
|
|
2
3
|
export interface Invocation {
|
|
3
4
|
readonly cliName: string;
|
|
4
5
|
readonly argv: readonly string[];
|
|
6
|
+
/** What each flag of the routed Command takes after it; empty before routing. */
|
|
7
|
+
readonly flags: readonly KnownFlag[];
|
|
8
|
+
}
|
|
9
|
+
export interface CommandLineChange {
|
|
10
|
+
readonly add?: readonly string[];
|
|
11
|
+
readonly remove?: readonly string[];
|
|
5
12
|
}
|
|
6
|
-
/** The caller's command line as typed, ready to paste. */
|
|
7
|
-
export declare function commandLineOf({ cliName, argv }: Invocation): string;
|
|
8
13
|
/**
|
|
9
|
-
* The caller's command line, ready to paste, with
|
|
10
|
-
*
|
|
14
|
+
* The caller's command line as typed, ready to paste, with each flag in `remove` dropped along with
|
|
15
|
+
* its value and the words in `add` placed before any `--`.
|
|
11
16
|
*/
|
|
12
|
-
export declare function
|
|
17
|
+
export declare function commandLineOf({ cliName, argv, flags }: Invocation, { add, remove }?: CommandLineChange): string;
|
|
13
18
|
/** The caller's command line, ready to paste, with each flag in `renames` typed as its new name. */
|
|
14
19
|
export declare function commandLineRenaming({ cliName, argv }: Invocation, renames: ReadonlyMap<string, string>): string;
|
package/dist/invocation.js
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { isOptionLike } from "./tokenize.js";
|
|
1
2
|
export const END_OF_OPTIONS = "--";
|
|
2
3
|
const SHELL_SAFE = /^[\w@%+=:,./-]+$/;
|
|
3
4
|
// POSIX quoting: Coding agents run commands in a POSIX shell, Git Bash included on Windows.
|
|
@@ -7,27 +8,39 @@ function quoted(token) {
|
|
|
7
8
|
function pasteable(cliName, tokens) {
|
|
8
9
|
return [cliName, ...tokens].map(quoted).join(" ");
|
|
9
10
|
}
|
|
10
|
-
/** The caller's command line as typed, ready to paste. */
|
|
11
|
-
export function commandLineOf({ cliName, argv }) {
|
|
12
|
-
return pasteable(cliName, argv);
|
|
13
|
-
}
|
|
14
11
|
function split(argv) {
|
|
15
12
|
const end = argv.indexOf(END_OF_OPTIONS);
|
|
16
13
|
return end === -1
|
|
17
14
|
? { options: [...argv], operands: [] }
|
|
18
15
|
: { options: argv.slice(0, end), operands: argv.slice(end) };
|
|
19
16
|
}
|
|
20
|
-
|
|
21
|
-
|
|
17
|
+
// Mirrors how `tokenize` reads the flag, so the word it took as the value goes with it.
|
|
18
|
+
function tookValue(takes, next) {
|
|
19
|
+
return (takes === "value" || (takes === "optional value" && next !== undefined && !isOptionLike(next)));
|
|
20
|
+
}
|
|
21
|
+
function without(flag, takes, tokens) {
|
|
22
|
+
const kept = [];
|
|
23
|
+
for (let index = 0; index < tokens.length; index += 1) {
|
|
24
|
+
const token = tokens[index] ?? "";
|
|
25
|
+
if (token === flag) {
|
|
26
|
+
if (tookValue(takes, tokens[index + 1]))
|
|
27
|
+
index += 1;
|
|
28
|
+
}
|
|
29
|
+
else if (!token.startsWith(`${flag}=`)) {
|
|
30
|
+
kept.push(token);
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
return kept;
|
|
22
34
|
}
|
|
23
35
|
/**
|
|
24
|
-
* The caller's command line, ready to paste, with
|
|
25
|
-
*
|
|
36
|
+
* The caller's command line as typed, ready to paste, with each flag in `remove` dropped along with
|
|
37
|
+
* its value and the words in `add` placed before any `--`.
|
|
26
38
|
*/
|
|
27
|
-
export function
|
|
39
|
+
export function commandLineOf({ cliName, argv, flags }, { add = [], remove = [] } = {}) {
|
|
28
40
|
const { options, operands } = split(argv);
|
|
29
|
-
const
|
|
30
|
-
|
|
41
|
+
const takes = new Map(flags.map((known) => [known.flag, known.takes]));
|
|
42
|
+
const kept = remove.reduce((tokens, flag) => without(flag, takes.get(flag) ?? "nothing", tokens), options);
|
|
43
|
+
return pasteable(cliName, [...kept, ...add, ...operands]);
|
|
31
44
|
}
|
|
32
45
|
function renamed(token, renames) {
|
|
33
46
|
const [flag = token, ...value] = token.split("=");
|
package/dist/invocation.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"invocation.js","sourceRoot":"","sources":["../src/invocation.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,cAAc,GAAG,IAAI,CAAC;AACnC,MAAM,UAAU,GAAG,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"invocation.js","sourceRoot":"","sources":["../src/invocation.ts"],"names":[],"mappings":"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"}
|
package/dist/list.d.ts
CHANGED
|
@@ -6,16 +6,25 @@ export declare const UNKNOWN_FIELD = "UNKNOWN_FIELD";
|
|
|
6
6
|
declare const FIELDS_FLAG = "--fields";
|
|
7
7
|
export declare const PAGE_INPUT: z.ZodObject<{
|
|
8
8
|
limit: z.ZodDefault<z.ZodNumber>;
|
|
9
|
-
cursor: z.ZodOptional<z.
|
|
9
|
+
cursor: z.ZodOptional<z.ZodString>;
|
|
10
10
|
}, z.core.$strip>;
|
|
11
11
|
export type PageInput = z.output<typeof PAGE_INPUT>;
|
|
12
12
|
export type ListFlagName = keyof PageInput | NameOf<typeof FIELDS_FLAG>;
|
|
13
13
|
export type RowSchema = z.ZodObject;
|
|
14
14
|
export declare class Page<Item> {
|
|
15
15
|
readonly items: readonly Item[];
|
|
16
|
-
readonly nextCursor:
|
|
17
|
-
constructor(items: readonly Item[], nextCursor:
|
|
16
|
+
readonly nextCursor: string | undefined;
|
|
17
|
+
constructor(items: readonly Item[], nextCursor: string | undefined);
|
|
18
18
|
}
|
|
19
|
+
/**
|
|
20
|
+
* A page whose source pages itself, such as a remote API: `next` is the cursor the source gave for
|
|
21
|
+
* the following page, which the caller passes back as `--cursor`, or absent on the last page.
|
|
22
|
+
*/
|
|
23
|
+
export declare function page<Item>(items: readonly Item[], next?: string): Page<Item>;
|
|
24
|
+
/**
|
|
25
|
+
* The page of `items` that `limit` and `cursor` select, for a list held whole in memory; a cursor
|
|
26
|
+
* it never gave is a usage error.
|
|
27
|
+
*/
|
|
19
28
|
export declare function paginate<Item>(items: readonly Item[], { limit, cursor }: PageInput): Page<Item>;
|
|
20
29
|
/** What the Runtime adds to a List Command, derived from its row schema. */
|
|
21
30
|
export interface ListSpec {
|
package/dist/list.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import * as z from "zod";
|
|
2
2
|
import { UsageError } from "./errors.js";
|
|
3
3
|
import { optionField, optionFields } from "./input.js";
|
|
4
|
-
import {
|
|
4
|
+
import { commandLineOf } from "./invocation.js";
|
|
5
5
|
import { INVALID_INPUT } from "./usage.js";
|
|
6
6
|
export const UNKNOWN_FIELD = "UNKNOWN_FIELD";
|
|
7
7
|
const DEFAULT_PAGE_LIMIT = 20;
|
|
@@ -9,9 +9,10 @@ const FIELDS_FLAG = "--fields";
|
|
|
9
9
|
const SEPARATOR = ",";
|
|
10
10
|
const COLUMN_SEPARATOR = "\t";
|
|
11
11
|
const UNSAFE_IN_COLUMN = /[\t\n\r]/;
|
|
12
|
+
const OFFSET = /^\d+$/;
|
|
12
13
|
export const PAGE_INPUT = z.object({
|
|
13
14
|
limit: z.number().int().positive().default(DEFAULT_PAGE_LIMIT),
|
|
14
|
-
cursor: z.
|
|
15
|
+
cursor: z.string().min(1).optional(),
|
|
15
16
|
});
|
|
16
17
|
export class Page {
|
|
17
18
|
items;
|
|
@@ -21,9 +22,32 @@ export class Page {
|
|
|
21
22
|
this.nextCursor = nextCursor;
|
|
22
23
|
}
|
|
23
24
|
}
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
25
|
+
/**
|
|
26
|
+
* A page whose source pages itself, such as a remote API: `next` is the cursor the source gave for
|
|
27
|
+
* the following page, which the caller passes back as `--cursor`, or absent on the last page.
|
|
28
|
+
*/
|
|
29
|
+
export function page(items, next) {
|
|
30
|
+
return new Page(items, next);
|
|
31
|
+
}
|
|
32
|
+
function offsetOf(cursor, length) {
|
|
33
|
+
const offset = Number(cursor);
|
|
34
|
+
if (!OFFSET.test(cursor) || String(offset) !== cursor || offset > length) {
|
|
35
|
+
throw new UsageError({
|
|
36
|
+
code: INVALID_INPUT,
|
|
37
|
+
message: `--cursor ${cursor}: not a cursor this list gave`,
|
|
38
|
+
hint: "drop --cursor to start from the first page, then follow each page's next",
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
return offset;
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* The page of `items` that `limit` and `cursor` select, for a list held whole in memory; a cursor
|
|
45
|
+
* it never gave is a usage error.
|
|
46
|
+
*/
|
|
47
|
+
export function paginate(items, { limit, cursor }) {
|
|
48
|
+
const start = cursor === undefined ? 0 : offsetOf(cursor, items.length);
|
|
49
|
+
const end = start + limit;
|
|
50
|
+
return new Page(items.slice(start, end), end < items.length ? String(end) : undefined);
|
|
27
51
|
}
|
|
28
52
|
const PAGE_FLAG_DESCRIPTIONS = {
|
|
29
53
|
limit: `how many rows to show, a positive whole number (default: ${DEFAULT_PAGE_LIMIT})`,
|
|
@@ -112,12 +136,20 @@ export function renderRows(rows, fields) {
|
|
|
112
136
|
const lines = [fields, ...rows.map((row) => fields.map((field) => cell(row[field])))];
|
|
113
137
|
return `${lines.map((line) => line.join(COLUMN_SEPARATOR)).join("\n")}\n`;
|
|
114
138
|
}
|
|
139
|
+
// A cursor starting with `-` would read as a flag, so it rides on `=`.
|
|
140
|
+
function cursorWords(cursor) {
|
|
141
|
+
const { flag } = PAGE_FLAGS.cursor;
|
|
142
|
+
return cursor.startsWith("-") ? [`${flag}=${cursor}`] : [flag, cursor];
|
|
143
|
+
}
|
|
115
144
|
export function printedPage(page, invocation) {
|
|
116
145
|
return page.nextCursor === undefined
|
|
117
146
|
? { items: page.items }
|
|
118
147
|
: {
|
|
119
148
|
items: page.items,
|
|
120
|
-
next:
|
|
149
|
+
next: commandLineOf(invocation, {
|
|
150
|
+
remove: [PAGE_FLAGS.cursor.flag],
|
|
151
|
+
add: cursorWords(page.nextCursor),
|
|
152
|
+
}),
|
|
121
153
|
};
|
|
122
154
|
}
|
|
123
155
|
/** The line that ends a rendered page, so the caller always knows whether and how to get more. */
|
package/dist/list.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"list.js","sourceRoot":"","sources":["../src/list.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,CAAC,MAAM,KAAK,CAAC;AACzB,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzC,OAAO,EAAmB,WAAW,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AACxE,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"list.js","sourceRoot":"","sources":["../src/list.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import * as z from "zod";
|
|
2
|
+
declare const manifestSchema: z.ZodObject<{
|
|
3
|
+
repository: z.ZodCatch<z.ZodOptional<z.ZodPipe<z.ZodUnion<readonly [z.ZodString, z.ZodObject<{
|
|
4
|
+
url: z.ZodString;
|
|
5
|
+
}, z.core.$strip>]>, z.ZodTransform<string, string | {
|
|
6
|
+
url: string;
|
|
7
|
+
}>>>>;
|
|
8
|
+
bugs: z.ZodCatch<z.ZodOptional<z.ZodPipe<z.ZodUnion<readonly [z.ZodString, z.ZodObject<{
|
|
9
|
+
url: z.ZodString;
|
|
10
|
+
}, z.core.$strip>]>, z.ZodTransform<string, string | {
|
|
11
|
+
url: string;
|
|
12
|
+
}>>>>;
|
|
13
|
+
}, z.core.$strip>;
|
|
14
|
+
/** The fields of the CLI's package.json the Runtime reads; each is absent when missing or malformed. */
|
|
15
|
+
export type Manifest = z.infer<typeof manifestSchema>;
|
|
16
|
+
export declare function manifestAt(packageRoot: string): Manifest;
|
|
17
|
+
export {};
|
package/dist/manifest.js
ADDED
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { readFileSync } from "node:fs";
|
|
2
|
+
import { join } from "node:path";
|
|
3
|
+
import * as z from "zod";
|
|
4
|
+
const link = z
|
|
5
|
+
.union([z.string(), z.object({ url: z.string() })])
|
|
6
|
+
.transform((value) => (typeof value === "string" ? value : value.url))
|
|
7
|
+
.optional()
|
|
8
|
+
.catch(undefined);
|
|
9
|
+
const manifestSchema = z.object({ repository: link, bugs: link });
|
|
10
|
+
const NO_MANIFEST = {};
|
|
11
|
+
// The fields only help, so a package.json that cannot be read or parsed gives none. It is read
|
|
12
|
+
// synchronously because an error's hint, which may name `bugs`, is built synchronously.
|
|
13
|
+
export function manifestAt(packageRoot) {
|
|
14
|
+
let manifest;
|
|
15
|
+
try {
|
|
16
|
+
manifest = JSON.parse(readFileSync(join(packageRoot, "package.json"), "utf8"));
|
|
17
|
+
}
|
|
18
|
+
catch {
|
|
19
|
+
return NO_MANIFEST;
|
|
20
|
+
}
|
|
21
|
+
const parsed = manifestSchema.safeParse(manifest);
|
|
22
|
+
return parsed.success ? parsed.data : NO_MANIFEST;
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=manifest.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"manifest.js","sourceRoot":"","sources":["../src/manifest.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,KAAK,CAAC,MAAM,KAAK,CAAC;AAEzB,MAAM,IAAI,GAAG,CAAC;KACX,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,CAAC;KAClD,SAAS,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;KACrE,QAAQ,EAAE;KACV,KAAK,CAAC,SAAS,CAAC,CAAC;AAEpB,MAAM,cAAc,GAAG,CAAC,CAAC,MAAM,CAAC,EAAE,UAAU,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;AAKlE,MAAM,WAAW,GAAa,EAAE,CAAC;AAEjC,+FAA+F;AAC/F,wFAAwF;AACxF,MAAM,UAAU,UAAU,CAAC,WAAmB;IAC5C,IAAI,QAAiB,CAAC;IACtB,IAAI,CAAC;QACH,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,CAAC,WAAW,EAAE,cAAc,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC;IACjF,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,WAAW,CAAC;IACrB,CAAC;IACD,MAAM,MAAM,GAAG,cAAc,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;IAClD,OAAO,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,WAAW,CAAC;AACpD,CAAC"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { CommandSpec } from "./command-spec.js";
|
|
2
|
+
import type { Env } from "./context.js";
|
|
3
|
+
export declare const NEEDS_OPERATOR = "NEEDS_OPERATOR";
|
|
4
|
+
/** Fails with `NEEDS_OPERATOR` when a Coding agent runs an Operator Command. */
|
|
5
|
+
export declare function checkOperator({ operator, commandLine }: CommandSpec, env: Env, callerLine: string): void;
|
package/dist/operator.js
ADDED
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { isAgent } from "./agent.js";
|
|
2
|
+
import { CliError } from "./errors.js";
|
|
3
|
+
export const NEEDS_OPERATOR = "NEEDS_OPERATOR";
|
|
4
|
+
/** Fails with `NEEDS_OPERATOR` when a Coding agent runs an Operator Command. */
|
|
5
|
+
export function checkOperator({ operator, commandLine }, env, callerLine) {
|
|
6
|
+
if (!operator || !isAgent(env))
|
|
7
|
+
return;
|
|
8
|
+
throw new CliError({
|
|
9
|
+
code: NEEDS_OPERATOR,
|
|
10
|
+
message: `\`${commandLine}\` must be run by a person at a terminal, not a Coding agent`,
|
|
11
|
+
// Typed at Claude Code's prompt, `!` runs the rest of the line in the operator's own shell.
|
|
12
|
+
hint: `ask the operator to type: ! ${callerLine}`,
|
|
13
|
+
});
|
|
14
|
+
}
|
|
15
|
+
//# sourceMappingURL=operator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"operator.js","sourceRoot":"","sources":["../src/operator.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAGrC,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAEvC,MAAM,CAAC,MAAM,cAAc,GAAG,gBAAgB,CAAC;AAE/C,gFAAgF;AAChF,MAAM,UAAU,aAAa,CAC3B,EAAE,QAAQ,EAAE,WAAW,EAAe,EACtC,GAAQ,EACR,UAAkB;IAElB,IAAI,CAAC,QAAQ,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC;QAAE,OAAO;IACvC,MAAM,IAAI,QAAQ,CAAC;QACjB,IAAI,EAAE,cAAc;QACpB,OAAO,EAAE,KAAK,WAAW,8DAA8D;QACvF,4FAA4F;QAC5F,IAAI,EAAE,+BAA+B,UAAU,EAAE;KAClD,CAAC,CAAC;AACL,CAAC"}
|