@wirecat/cli-core 0.428.0 → 0.430.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 +17 -0
- package/dist/cli/command-runs.d.ts +64 -0
- package/dist/cli/command-runs.js +171 -0
- package/dist/cli/entry.d.ts +1 -0
- package/dist/cli/entry.js +19 -4
- package/dist/cli/first-run.js +8 -6
- package/dist/cli/index.d.ts +1 -0
- package/dist/cli/index.js +1 -0
- package/dist/cli/messenger/store-maintenance-command.js +62 -6
- package/dist/cli/shared-command-exports.d.ts +7 -7
- package/dist/entities/index.d.ts +14 -0
- package/dist/entities/store-maintenance.d.ts +14 -0
- package/dist/entities/store-maintenance.js +12 -0
- package/dist/meetings/mcp/index.d.ts +15 -15
- package/package.json +5 -1
- package/parity.json +1 -0
package/CHANGELOG.md
CHANGED
|
@@ -7,6 +7,23 @@ shape of this file.
|
|
|
7
7
|
|
|
8
8
|
## Unreleased
|
|
9
9
|
|
|
10
|
+
## 0.430.0 — 25.10.2026
|
|
11
|
+
|
|
12
|
+
### Added
|
|
13
|
+
|
|
14
|
+
- **Run records for a CLI with its own commander program** (`/cli`). `recordRuns(program, options)` gives a `startCli` tool WC-LIFE-15 in one call: `--record` and `--no-record`, a failed run for every failed command — a usage error before any action included, named by its command words and never an argument — and a run of every command when the flag or the saved `record` asks. `providerEvent(event)` and `providerRequest(operation)` put a provider call's operation, status and duration into the current command's run from anywhere in the program. `commandRuns(options)` keeps one command's run from a tool's own hooks under `run()`, and `runSettings(flag, saved)` is the rule both follow. zoom-cli, drive-cli and cli-memo replace their own copies with it. A run with no profile now leaves `profile` out rather than writing `""`.
|
|
15
|
+
|
|
16
|
+
## 0.429.0 — 25.10.2026
|
|
17
|
+
|
|
18
|
+
### Added
|
|
19
|
+
|
|
20
|
+
- **`@wirecat/cli-core/cli/start` gives a bin `startCli` without the rest of `./cli`**, and **a bare `--version` or `-V` is answered before the program loads**. Importing `./cli` for `startCli` loaded about 1,000 files before the program even ran; `./cli/start` loads about 50 (`check:dist` keeps it under 80). The version is `app.version` and a newline on stdout, exit 0 — what Commander printed. Nothing else runs for it: no SQLite swap, no crash handler, and no notice a tool's `run` prints. `--version` with any other word (`--version --json`, `personal --version`) goes through the program as before. `startCli` and `run()` load the first-run questions, the store and the consent prompt only when a command asks them: the program module alone now loads about 320 files, not 850 (the `./cli` barrel a CLI imports still loads them all).
|
|
21
|
+
- **`store reset --dry-run` lists what a reset would empty and deletes nothing**: the store's files, their bytes,
|
|
22
|
+
every data table with its row count (search indexes are left out: they are rebuilt from those tables), whether a
|
|
23
|
+
backup comes first, and `in_use` — whether a serve or another process has the file open now, which the real reset
|
|
24
|
+
refuses (`null` where the system cannot say). It reads without a write lock, so it answers while a sync runs, and
|
|
25
|
+
it runs under `<PREFIX>_READ_ONLY`. A desktop app shows the list in its confirmation dialog.
|
|
26
|
+
|
|
10
27
|
## 0.428.0 — 25.10.2026
|
|
11
28
|
|
|
12
29
|
### Changed — may break callers
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import { type RenderFormat, type Streams } from "@wirecat/cli-base";
|
|
2
|
+
import type { Command } from "commander";
|
|
3
|
+
import type { AppIdentity } from "../ports/app.js";
|
|
4
|
+
import type { RequestEvent } from "../runs/events.js";
|
|
5
|
+
/** What the owner saved: `record` and `keep_runs_for_days`, read from the CLI's own config. */
|
|
6
|
+
export interface SavedRunSettings {
|
|
7
|
+
record?: boolean | undefined;
|
|
8
|
+
keepRunsForDays?: number | undefined;
|
|
9
|
+
}
|
|
10
|
+
export interface RunSettings {
|
|
11
|
+
record: boolean;
|
|
12
|
+
keepFailedRuns: boolean;
|
|
13
|
+
keepRunsForDays: number;
|
|
14
|
+
}
|
|
15
|
+
/** `--record`/`--no-record` first, then the config; a failure is kept unless either says no (WC-LIFE-15). */
|
|
16
|
+
export declare const runSettings: (flag: boolean | undefined, saved?: SavedRunSettings) => RunSettings;
|
|
17
|
+
export interface CommandRunOptions {
|
|
18
|
+
app: AppIdentity;
|
|
19
|
+
/** The owner's saved choice. One that throws — a config that will not load — leaves the defaults. */
|
|
20
|
+
settings: () => SavedRunSettings;
|
|
21
|
+
/**
|
|
22
|
+
* The profile the command runs for; one that throws or is empty leaves the run without one. Given only by a CLI
|
|
23
|
+
* whose first word may be a profile, so a failure before any command skips that word when naming the run.
|
|
24
|
+
*/
|
|
25
|
+
profile?: () => string | undefined;
|
|
26
|
+
/** An agent's run is named `mcp <command>`. Read from the program's environment when left out. */
|
|
27
|
+
agent?: boolean;
|
|
28
|
+
/** The data stream's format, which the warning about an unwritable run follows; `--json`/`--jsonl` when left out. */
|
|
29
|
+
format?: () => RenderFormat;
|
|
30
|
+
/** What a failed run keeps of the error: cli-memo turns a Commander or Valibot error into a CLI error first. */
|
|
31
|
+
recognise?: (error: unknown) => unknown;
|
|
32
|
+
env?: NodeJS.ProcessEnv;
|
|
33
|
+
streams?: Streams;
|
|
34
|
+
}
|
|
35
|
+
/** One command's run at a time, for a CLI that starts and ends it from its own hooks (zoom-cli under `run()`). */
|
|
36
|
+
export interface CommandRuns {
|
|
37
|
+
start(action: Command): void;
|
|
38
|
+
succeed(): Promise<void>;
|
|
39
|
+
fail(error: unknown): Promise<void>;
|
|
40
|
+
/** The id the command's run has, kept or not, so its answer can name it. */
|
|
41
|
+
runId(): string | undefined;
|
|
42
|
+
events(event: RequestEvent): void;
|
|
43
|
+
}
|
|
44
|
+
export declare const commandRuns: (options: CommandRunOptions) => CommandRuns;
|
|
45
|
+
/** For a provider client far from the program: the event lands in the current command's run, or nowhere. */
|
|
46
|
+
export declare const providerEvent: (event: RequestEvent) => void;
|
|
47
|
+
/**
|
|
48
|
+
* Times one provider call under a fixed operation name — nothing the call carries goes into the run. The returned
|
|
49
|
+
* function ends it; an `error` or an `errorCode` makes it a failed one.
|
|
50
|
+
*/
|
|
51
|
+
export declare const providerRequest: (operation: string, sink?: (event: RequestEvent) => void) => ({ status, error, errorCode }?: {
|
|
52
|
+
status?: number;
|
|
53
|
+
error?: unknown;
|
|
54
|
+
errorCode?: string;
|
|
55
|
+
}) => void;
|
|
56
|
+
/**
|
|
57
|
+
* WC-LIFE-15 for a CLI with its own commander program (`startCli`, not `run()`): adds `--record` and `--no-record`,
|
|
58
|
+
* keeps every failed command as a run — a usage error before any action too — and every command when recording is
|
|
59
|
+
* on. Call it after the program's other `parseAsync` wrappers, so its own is the outermost and sees how the parse
|
|
60
|
+
* really ended; a refusal in an earlier `preAction` hook is then kept under the words read from the line.
|
|
61
|
+
*/
|
|
62
|
+
export declare const recordRuns: (program: Command, options: CommandRunOptions & {
|
|
63
|
+
content: string;
|
|
64
|
+
}) => void;
|
|
@@ -0,0 +1,171 @@
|
|
|
1
|
+
import { AsyncLocalStorage } from "node:async_hooks";
|
|
2
|
+
import { isCliError } from "@wirecat/cli-base";
|
|
3
|
+
import { startRecording, wasSettled } from "../runs/recording.js";
|
|
4
|
+
import { KEEP_RUNS_FOR_DAYS } from "../runs/run.js";
|
|
5
|
+
import { environmentOf } from "./context.js";
|
|
6
|
+
/** `--record`/`--no-record` first, then the config; a failure is kept unless either says no (WC-LIFE-15). */
|
|
7
|
+
export const runSettings = (flag, saved = {}) => {
|
|
8
|
+
const record = flag ?? saved.record ?? false;
|
|
9
|
+
return {
|
|
10
|
+
record,
|
|
11
|
+
keepFailedRuns: record || (flag !== false && saved.record !== false),
|
|
12
|
+
keepRunsForDays: saved.keepRunsForDays ?? KEEP_RUNS_FOR_DAYS,
|
|
13
|
+
};
|
|
14
|
+
};
|
|
15
|
+
const SKIPPED = new Set(["runs", "help"]);
|
|
16
|
+
const pathOf = (command) => {
|
|
17
|
+
const words = [];
|
|
18
|
+
for (let at = command; at?.parent; at = at.parent)
|
|
19
|
+
words.unshift(at.name());
|
|
20
|
+
return words;
|
|
21
|
+
};
|
|
22
|
+
const tracker = (options) => {
|
|
23
|
+
let recording;
|
|
24
|
+
const open = (program, words, flag, format) => {
|
|
25
|
+
recording = undefined;
|
|
26
|
+
// Reading the log is not worth a run of its own.
|
|
27
|
+
if (SKIPPED.has(words[0] ?? ""))
|
|
28
|
+
return;
|
|
29
|
+
const environment = environmentOf(program);
|
|
30
|
+
let saved = {};
|
|
31
|
+
try {
|
|
32
|
+
saved = options.settings();
|
|
33
|
+
}
|
|
34
|
+
catch { }
|
|
35
|
+
let profile;
|
|
36
|
+
try {
|
|
37
|
+
profile = options.profile?.() || undefined;
|
|
38
|
+
}
|
|
39
|
+
catch { }
|
|
40
|
+
const settings = runSettings(flag, saved);
|
|
41
|
+
const agent = options.agent ?? environment.agent !== undefined;
|
|
42
|
+
const streams = options.streams ?? environment.streams;
|
|
43
|
+
const env = options.env ?? environment.env;
|
|
44
|
+
recording = startRecording({
|
|
45
|
+
app: options.app,
|
|
46
|
+
command: `${agent ? "mcp " : ""}${words.join(" ") || options.app.command}`,
|
|
47
|
+
...(profile === undefined ? {} : { profile }),
|
|
48
|
+
record: settings.record,
|
|
49
|
+
keepFailed: settings.keepFailedRuns,
|
|
50
|
+
keepDays: settings.keepRunsForDays,
|
|
51
|
+
trace: false,
|
|
52
|
+
format,
|
|
53
|
+
...(streams ? { streams } : {}),
|
|
54
|
+
...(env ? { env } : {}),
|
|
55
|
+
});
|
|
56
|
+
};
|
|
57
|
+
const finish = () => {
|
|
58
|
+
const done = recording;
|
|
59
|
+
recording = undefined;
|
|
60
|
+
return done;
|
|
61
|
+
};
|
|
62
|
+
return {
|
|
63
|
+
start(action) {
|
|
64
|
+
const flags = action.optsWithGlobals();
|
|
65
|
+
const json = (flags.json !== undefined && flags.json !== false) || Boolean(flags.jsonl);
|
|
66
|
+
open(action, pathOf(action), flags.record, options.format?.() ?? (json ? "json" : "pretty"));
|
|
67
|
+
},
|
|
68
|
+
async succeed() {
|
|
69
|
+
await finish()?.succeed();
|
|
70
|
+
},
|
|
71
|
+
async fail(error) {
|
|
72
|
+
await finish()?.fail(options.recognise ? options.recognise(error) : error);
|
|
73
|
+
},
|
|
74
|
+
runId: () => recording?.runId,
|
|
75
|
+
events: (event) => recording?.events(event),
|
|
76
|
+
open,
|
|
77
|
+
};
|
|
78
|
+
};
|
|
79
|
+
export const commandRuns = (options) => tracker(options);
|
|
80
|
+
const parses = new AsyncLocalStorage();
|
|
81
|
+
/** For a provider client far from the program: the event lands in the current command's run, or nowhere. */
|
|
82
|
+
export const providerEvent = (event) => parses.getStore()?.runs.events(event);
|
|
83
|
+
/**
|
|
84
|
+
* Times one provider call under a fixed operation name — nothing the call carries goes into the run. The returned
|
|
85
|
+
* function ends it; an `error` or an `errorCode` makes it a failed one.
|
|
86
|
+
*/
|
|
87
|
+
export const providerRequest = (operation, sink = providerEvent) => {
|
|
88
|
+
sink({ event: "request", operation });
|
|
89
|
+
const started = performance.now();
|
|
90
|
+
return ({ status, error, errorCode } = {}) => {
|
|
91
|
+
const failed = error !== undefined || errorCode !== undefined;
|
|
92
|
+
sink({
|
|
93
|
+
event: "response",
|
|
94
|
+
operation,
|
|
95
|
+
...(status === undefined ? {} : { status }),
|
|
96
|
+
durationMs: Math.round(performance.now() - started),
|
|
97
|
+
outcome: failed ? "error" : "ok",
|
|
98
|
+
...(failed ? { errorCode: errorCode ?? (isCliError(error) ? error.code : "provider_error") } : {}),
|
|
99
|
+
});
|
|
100
|
+
};
|
|
101
|
+
};
|
|
102
|
+
/** `files list` from `files list abc --limit 5`: command words only, never an argument. */
|
|
103
|
+
const pathFromArgs = (program, args, profileWord) => {
|
|
104
|
+
const words = [];
|
|
105
|
+
let at = program;
|
|
106
|
+
let skipped = !profileWord;
|
|
107
|
+
for (const arg of args) {
|
|
108
|
+
if (arg.startsWith("-"))
|
|
109
|
+
continue;
|
|
110
|
+
const next = at.commands.find((one) => one.name() === arg || one.aliases().includes(arg));
|
|
111
|
+
if (next) {
|
|
112
|
+
words.push(arg);
|
|
113
|
+
at = next;
|
|
114
|
+
}
|
|
115
|
+
else if (words.length === 0 && !skipped)
|
|
116
|
+
skipped = true;
|
|
117
|
+
else
|
|
118
|
+
break;
|
|
119
|
+
}
|
|
120
|
+
return words;
|
|
121
|
+
};
|
|
122
|
+
const isHelpExit = (error) => {
|
|
123
|
+
const { code, exitCode } = (error ?? {});
|
|
124
|
+
return typeof code === "string" && code.startsWith("commander.") && (exitCode === 0 || code === "commander.help");
|
|
125
|
+
};
|
|
126
|
+
/**
|
|
127
|
+
* WC-LIFE-15 for a CLI with its own commander program (`startCli`, not `run()`): adds `--record` and `--no-record`,
|
|
128
|
+
* keeps every failed command as a run — a usage error before any action too — and every command when recording is
|
|
129
|
+
* on. Call it after the program's other `parseAsync` wrappers, so its own is the outermost and sees how the parse
|
|
130
|
+
* really ended; a refusal in an earlier `preAction` hook is then kept under the words read from the line.
|
|
131
|
+
*/
|
|
132
|
+
export const recordRuns = (program, options) => {
|
|
133
|
+
program
|
|
134
|
+
.option("--record", `keep this run — ids and timings, never ${options.content}`)
|
|
135
|
+
.option("--no-record", "do not keep this run, even if it fails");
|
|
136
|
+
program.hook("preAction", (_root, action) => {
|
|
137
|
+
const parse = parses.getStore();
|
|
138
|
+
if (!parse)
|
|
139
|
+
return;
|
|
140
|
+
parse.started = true;
|
|
141
|
+
parse.runs.start(action);
|
|
142
|
+
});
|
|
143
|
+
const parseAsync = program.parseAsync.bind(program);
|
|
144
|
+
program.parseAsync = (argv, settings) => {
|
|
145
|
+
const parse = { runs: tracker(options), started: false };
|
|
146
|
+
return parses.run(parse, async () => {
|
|
147
|
+
try {
|
|
148
|
+
const parsed = await parseAsync(argv, settings);
|
|
149
|
+
await parse.runs.succeed();
|
|
150
|
+
return parsed;
|
|
151
|
+
}
|
|
152
|
+
catch (error) {
|
|
153
|
+
if (!isHelpExit(error) && !wasSettled(error)) {
|
|
154
|
+
try {
|
|
155
|
+
if (!parse.started) {
|
|
156
|
+
const args = settings?.from === "user" ? (argv ?? []) : (argv ?? process.argv).slice(2);
|
|
157
|
+
const flag = args.includes("--no-record") ? false : args.includes("--record") ? true : undefined;
|
|
158
|
+
const json = args.some((arg) => arg === "--json" || arg.startsWith("--json=") || arg === "--jsonl");
|
|
159
|
+
const words = pathFromArgs(program, args, options.profile !== undefined);
|
|
160
|
+
const format = options.format?.() ?? (json ? "json" : "pretty");
|
|
161
|
+
parse.runs.open(program, words, flag, format);
|
|
162
|
+
}
|
|
163
|
+
await parse.runs.fail(error);
|
|
164
|
+
}
|
|
165
|
+
catch { }
|
|
166
|
+
}
|
|
167
|
+
throw error;
|
|
168
|
+
}
|
|
169
|
+
});
|
|
170
|
+
};
|
|
171
|
+
};
|
package/dist/cli/entry.d.ts
CHANGED
|
@@ -2,6 +2,7 @@ import { type ChildProcess, type SpawnOptions } from "node:child_process";
|
|
|
2
2
|
import type { ErrorReason } from "@wirecat/cli-base/standards";
|
|
3
3
|
import type { Command } from "commander";
|
|
4
4
|
import { type AppIdentity } from "../ports/app.js";
|
|
5
|
+
export type { AppIdentity };
|
|
5
6
|
/** What `startCli` hands the CLI's own program: the process, wired once. */
|
|
6
7
|
export interface EntryContext {
|
|
7
8
|
/** `process.argv` without the runtime and the script. */
|
package/dist/cli/entry.js
CHANGED
|
@@ -1,10 +1,8 @@
|
|
|
1
1
|
import { spawn } from "node:child_process";
|
|
2
2
|
import { CliError, catchCrashes } from "@wirecat/cli-base";
|
|
3
|
-
import { readOnlyLockOf } from "../ports/app.js";
|
|
3
|
+
import { envName, readOnlyLockOf } from "../ports/app.js";
|
|
4
4
|
import { ensureSqlite } from "../sqlite-runtime.js";
|
|
5
|
-
import {
|
|
6
|
-
import { commandPathOf } from "./command-contract.js";
|
|
7
|
-
import { setupAtStart } from "./first-run.js";
|
|
5
|
+
import { logVersion } from "./argv-log.js";
|
|
8
6
|
const processIo = () => ({
|
|
9
7
|
argv: process.argv,
|
|
10
8
|
env: process.env,
|
|
@@ -26,6 +24,8 @@ const processIo = () => ({
|
|
|
26
24
|
export const startCli = async (entry) => {
|
|
27
25
|
const io = { ...processIo(), ...entry.io };
|
|
28
26
|
const args = io.argv.slice(2);
|
|
27
|
+
if (args.length === 1 && (args[0] === "--version" || args[0] === "-V"))
|
|
28
|
+
return printVersion(entry.app, io);
|
|
29
29
|
const tty = io.stdout.isTTY === true;
|
|
30
30
|
const release = catchCrashes({
|
|
31
31
|
cli: entry.app.command,
|
|
@@ -62,6 +62,10 @@ export const startCli = async (entry) => {
|
|
|
62
62
|
// The first-run questions write the shared config; a dry run writes nothing.
|
|
63
63
|
if (command.optsWithGlobals().dryRun === true)
|
|
64
64
|
return;
|
|
65
|
+
const [{ setupAtStart }, { commandPathOf }] = await Promise.all([
|
|
66
|
+
import("./first-run.js"),
|
|
67
|
+
import("./command-contract.js"),
|
|
68
|
+
]);
|
|
65
69
|
await setupAtStart({
|
|
66
70
|
command: entry.app.command,
|
|
67
71
|
env: io.env,
|
|
@@ -75,6 +79,7 @@ export const startCli = async (entry) => {
|
|
|
75
79
|
ask: async (question, command) => {
|
|
76
80
|
if (headless(command) || io.stdin.isTTY !== true)
|
|
77
81
|
return false;
|
|
82
|
+
const { readSecret } = await import("../terminal/prompt.js");
|
|
78
83
|
const answer = await readSecret(`${question} [y/N] `, {
|
|
79
84
|
input: io.stdin,
|
|
80
85
|
output: io.stderr,
|
|
@@ -112,6 +117,16 @@ export const startCli = async (entry) => {
|
|
|
112
117
|
else if (code !== undefined)
|
|
113
118
|
io.setExitCode(code);
|
|
114
119
|
};
|
|
120
|
+
/**
|
|
121
|
+
* Answered before the program loads, which is most of a start: an agent asks for the version to learn whether the
|
|
122
|
+
* tool is there at all. Only the bare flag — anything else on the line goes through the program as before.
|
|
123
|
+
*/
|
|
124
|
+
const printVersion = (app, io) => {
|
|
125
|
+
const argvLog = io.env[envName(app, "TEST_ARGV_LOG")];
|
|
126
|
+
if (argvLog)
|
|
127
|
+
logVersion(argvLog);
|
|
128
|
+
io.stdout.write(`${app.version}\n`);
|
|
129
|
+
};
|
|
115
130
|
/** Help and the version were printed already; help for a missing command is a usage mistake, as in `run()`. */
|
|
116
131
|
const commanderExit = (error) => {
|
|
117
132
|
if (!(error instanceof Error))
|
package/dist/cli/first-run.js
CHANGED
|
@@ -4,13 +4,8 @@ import { delimiter, join } from "node:path";
|
|
|
4
4
|
import { installerOf, updateCommand } from "@wirecat/cli-base/update";
|
|
5
5
|
import { LANGUAGES } from "../search/languages.js";
|
|
6
6
|
import { DEFAULT_STEMMERS } from "../search/stem.js";
|
|
7
|
-
import { openCache } from "../store/open.js";
|
|
8
7
|
import { storePath } from "../store/path.js";
|
|
9
8
|
import { sharedConfigPath } from "../store/shared-config.js";
|
|
10
|
-
import { openStore } from "../store/store.js";
|
|
11
|
-
import { readSecret } from "../terminal/prompt.js";
|
|
12
|
-
import { WIRECAT_TOOLS } from "./help/first-screen.js";
|
|
13
|
-
import { buildStems } from "./messenger/store-maintenance-command.js";
|
|
14
9
|
import { QUESTIONS, readSetupAnswers, unanswered, writeSetupAnswers, } from "./setup-answers.js";
|
|
15
10
|
/** Commands that run without first-run questions: they serve agents, help, or open the store themselves. */
|
|
16
11
|
const SKIPPED = new Set(["help", "guide", "completion", "mcp", "serve", "server", "update", "store"]);
|
|
@@ -86,6 +81,8 @@ const suggested = (env, contentLanguages) => {
|
|
|
86
81
|
return (own.length ? own : LANGUAGES.filter(({ code }) => code === "en" || code === system)).map(({ name }) => name);
|
|
87
82
|
};
|
|
88
83
|
const askLanguages = async ({ command, env, io, contentLanguages }) => {
|
|
84
|
+
// The store and its maintenance are most of cli-core; every command runs this file, few ever ask.
|
|
85
|
+
const { openStore } = await import("../store/store.js");
|
|
89
86
|
const store = await openStore({ env });
|
|
90
87
|
let rebuild = false;
|
|
91
88
|
try {
|
|
@@ -117,6 +114,10 @@ const askLanguages = async ({ command, env, io, contentLanguages }) => {
|
|
|
117
114
|
}
|
|
118
115
|
if (!rebuild)
|
|
119
116
|
return;
|
|
117
|
+
const [{ openCache }, { buildStems }] = await Promise.all([
|
|
118
|
+
import("../store/open.js"),
|
|
119
|
+
import("./messenger/store-maintenance-command.js"),
|
|
120
|
+
]);
|
|
120
121
|
const database = await openCache(storePath(env));
|
|
121
122
|
try {
|
|
122
123
|
buildStems(database, (note) => io.say(` ${note}`), { force: true });
|
|
@@ -128,6 +129,7 @@ const askLanguages = async ({ command, env, io, contentLanguages }) => {
|
|
|
128
129
|
const askTools = async (run) => {
|
|
129
130
|
const { command, env, io } = run;
|
|
130
131
|
const installed = run.installed ?? ((name) => onPath(name, env));
|
|
132
|
+
const { WIRECAT_TOOLS } = await import("./help/first-screen.js");
|
|
131
133
|
const others = WIRECAT_TOOLS.filter((tool) => tool.command !== command);
|
|
132
134
|
const missing = others.filter((tool) => !installed(tool.command));
|
|
133
135
|
io.say("Other WireCat tools — they share this store, so one search finds everything:");
|
|
@@ -213,7 +215,7 @@ export const setupAtStart = async (start) => {
|
|
|
213
215
|
contentLanguages: start.contentLanguages,
|
|
214
216
|
all: start.path[0] === "setup",
|
|
215
217
|
io: {
|
|
216
|
-
ask: (prompt) => readSecret(prompt, { input, echo: true }),
|
|
218
|
+
ask: async (prompt) => (await import("../terminal/prompt.js")).readSecret(prompt, { input, echo: true }),
|
|
217
219
|
say: (text) => process.stderr.write(`${text}\n`),
|
|
218
220
|
},
|
|
219
221
|
}).catch((error) => {
|
package/dist/cli/index.d.ts
CHANGED
|
@@ -50,6 +50,7 @@ export { BotTokenStore, type BotTokenStoreOptions } from "./bot/token.js";
|
|
|
50
50
|
export { PressLog, UpdatesCursor } from "./bot/updates.js";
|
|
51
51
|
export type { CommandAvailability, DiscoveredCommand } from "./command-availability.js";
|
|
52
52
|
export { commandContract, type JsonSchema, SCHEMA_DIALECT } from "./command-contract.js";
|
|
53
|
+
export { type CommandRunOptions, type CommandRuns, commandRuns, providerEvent, providerRequest, type RunSettings, recordRuns, runSettings, type SavedRunSettings, } from "./command-runs.js";
|
|
53
54
|
export { CONTRACT } from "./commands-command.js";
|
|
54
55
|
export { refuseUnknownKey } from "./config-command.js";
|
|
55
56
|
export { type ConfigIssue, type ConfigIssueKind, checkConfigText, issueMessage } from "./config-issues.js";
|
package/dist/cli/index.js
CHANGED
|
@@ -43,6 +43,7 @@ export { botFiles, botsDirectory, ChatRegistry, registryProfiles } from "./bot/r
|
|
|
43
43
|
export { BotTokenStore } from "./bot/token.js";
|
|
44
44
|
export { PressLog, UpdatesCursor } from "./bot/updates.js";
|
|
45
45
|
export { commandContract, SCHEMA_DIALECT } from "./command-contract.js";
|
|
46
|
+
export { commandRuns, providerEvent, providerRequest, recordRuns, runSettings, } from "./command-runs.js";
|
|
46
47
|
export { CONTRACT } from "./commands-command.js";
|
|
47
48
|
export { refuseUnknownKey } from "./config-command.js";
|
|
48
49
|
export { checkConfigText, issueMessage } from "./config-issues.js";
|
|
@@ -12,7 +12,7 @@ import { migrate } from "../../store/migrations.js";
|
|
|
12
12
|
import { openCache } from "../../store/open.js";
|
|
13
13
|
import { storePath } from "../../store/path.js";
|
|
14
14
|
import { deleteCopy, repairStore } from "../../store/repair.js";
|
|
15
|
-
import { drainNoteIndex, fillSearchIndex, fillStems, involvementStoreOver, noteIndexState, openStore, orphanPointers, pendingNormalization, resetAttachmentWords, resetNoteIndex, resetSearchIndex, resetStems, searchIndexState, stemmerCache, stemsState, } from "../../store/store.js";
|
|
15
|
+
import { drainNoteIndex, fillSearchIndex, fillStems, involvementStoreOver, noteIndexState, openSqlite, openStore, orphanPointers, pendingNormalization, resetAttachmentWords, resetNoteIndex, resetSearchIndex, resetStems, searchIndexState, stemmerCache, stemsState, } from "../../store/store.js";
|
|
16
16
|
import { environmentOf, outputFor } from "../context.js";
|
|
17
17
|
import { destroysNothing, LOCAL_READ, LOCAL_WRITE } from "../effects.js";
|
|
18
18
|
import { itemOf, renderAnswer, snakeKeys } from "../envelope.js";
|
|
@@ -45,6 +45,16 @@ const reading = async (path, read) => {
|
|
|
45
45
|
database.close();
|
|
46
46
|
}
|
|
47
47
|
};
|
|
48
|
+
/** For a command that only reads: the connection refuses writes, and opening sets no journal mode. */
|
|
49
|
+
const readingOnly = async (path, read) => {
|
|
50
|
+
const { database } = await openSqlite(path, { readOnly: true });
|
|
51
|
+
try {
|
|
52
|
+
return read(database);
|
|
53
|
+
}
|
|
54
|
+
finally {
|
|
55
|
+
database.close();
|
|
56
|
+
}
|
|
57
|
+
};
|
|
48
58
|
/** `doctor`'s short summary of the store. Must answer for a broken file, so an error is a field. */
|
|
49
59
|
export const storeSummary = async (env) => {
|
|
50
60
|
const path = storePath(env);
|
|
@@ -630,22 +640,30 @@ const quiesce = async (path, messenger, then, warn, waitMs = STORE_LOCK_WAIT_MS)
|
|
|
630
640
|
}
|
|
631
641
|
};
|
|
632
642
|
/**
|
|
633
|
-
* For a store this build cannot migrate: a backup beside it, then an empty
|
|
634
|
-
* schema. The backup is made before anything is deleted, and its path is said before
|
|
643
|
+
* For a store this build cannot migrate, or one the owner wants empty: a backup beside it, then an empty
|
|
644
|
+
* store at this build's schema. The backup is made before anything is deleted, and its path is said before
|
|
645
|
+
* the delete. A new file rather than `DELETE FROM` every table: deleted rows would stay readable in free
|
|
646
|
+
* pages until a VACUUM, and every table comes back in this build's shape.
|
|
635
647
|
*/
|
|
636
648
|
const resetCommand = (messenger) => annotate(new Command("reset"), { output: { entity: "store_reset" }, effects: LOCAL_WRITE })
|
|
637
649
|
.summary("back up the local archive and replace it with an empty one")
|
|
638
650
|
.description("back the store up beside itself, then delete it and start an empty one at this build's schema; asks first, or --yes")
|
|
639
651
|
.option("--no-backup", "delete the store without backing it up first")
|
|
640
|
-
.
|
|
652
|
+
.option("--dry-run", "list every table it would empty, with its rows, and delete nothing")
|
|
653
|
+
.action(async function ({ backup: keep, dryRun }) {
|
|
641
654
|
const { renderer } = outputFor(this);
|
|
642
655
|
const { command } = messenger.app;
|
|
643
|
-
const
|
|
656
|
+
const env = environmentOf(this).env ?? process.env;
|
|
657
|
+
const path = storePath(env);
|
|
644
658
|
if (!existsSync(path)) {
|
|
645
659
|
result(this, { path, exists: false, reset: false });
|
|
646
660
|
renderer.note(`no store at ${path} — nothing to reset; the first \`${command}\` command that reads a chat creates it`);
|
|
647
661
|
return;
|
|
648
662
|
}
|
|
663
|
+
if (dryRun) {
|
|
664
|
+
result(this, await resetPreview(path, messenger, env, keep));
|
|
665
|
+
return;
|
|
666
|
+
}
|
|
649
667
|
refuseWhileServing(this, messenger);
|
|
650
668
|
if (this.optsWithGlobals().yes !== true) {
|
|
651
669
|
const what = `this deletes the store at ${path} and starts an empty one, ${keep ? "after a backup beside it" : "with no backup"}`;
|
|
@@ -674,7 +692,7 @@ const resetCommand = (messenger) => annotate(new Command("reset"), { output: { e
|
|
|
674
692
|
});
|
|
675
693
|
renderer.note(`backed the store up to ${backup}`);
|
|
676
694
|
}
|
|
677
|
-
for (const suffix of
|
|
695
|
+
for (const suffix of STORE_PARTS)
|
|
678
696
|
rmSync(`${path}${suffix}`, { force: true });
|
|
679
697
|
await (await openStore({ path, command })).close();
|
|
680
698
|
const schema = await reading(path, (database) => schemaOf(database).version);
|
|
@@ -683,5 +701,43 @@ const resetCommand = (messenger) => annotate(new Command("reset"), { output: { e
|
|
|
683
701
|
? `the store is empty at schema ${schema}; \`${command} store restore ${backup}\` puts the old one back once a build can read it`
|
|
684
702
|
: `the store is empty at schema ${schema}; there is no backup`);
|
|
685
703
|
});
|
|
704
|
+
const STORE_PARTS = ["", "-wal", "-shm"];
|
|
705
|
+
/**
|
|
706
|
+
* What a reset would delete, read without a write lock so it answers while a sync runs. `in_use` is what the
|
|
707
|
+
* real run would refuse over now; `null` where this system cannot say who has the file open.
|
|
708
|
+
*/
|
|
709
|
+
const resetPreview = async (path, messenger, env, keep) => {
|
|
710
|
+
const files = STORE_PARTS.map((suffix) => `${path}${suffix}`).filter((file) => existsSync(file));
|
|
711
|
+
const holders = holdersOf(files.map((file) => realpathSync(file)));
|
|
712
|
+
const serving = servingProfiles(messenger.app, env).length > 0;
|
|
713
|
+
const read = await readingOnly(path, (database) => ({
|
|
714
|
+
schema: schemaOf(database).version,
|
|
715
|
+
tables: emptiedTables(database),
|
|
716
|
+
}));
|
|
717
|
+
return {
|
|
718
|
+
path,
|
|
719
|
+
exists: true,
|
|
720
|
+
reset: false,
|
|
721
|
+
dryRun: true,
|
|
722
|
+
files,
|
|
723
|
+
bytes: files.reduce((sum, file) => sum + bytesOf(file), 0),
|
|
724
|
+
schema: read.schema,
|
|
725
|
+
tables: read.tables,
|
|
726
|
+
backupFirst: keep,
|
|
727
|
+
inUse: serving || (holders === undefined ? null : holders.length > 0),
|
|
728
|
+
};
|
|
729
|
+
};
|
|
730
|
+
/** The tables that hold data; a search index and its shadow tables are rebuilt from them, so they are left out. */
|
|
731
|
+
const emptiedTables = (database) => {
|
|
732
|
+
const all = database
|
|
733
|
+
.prepare("SELECT name, sql FROM sqlite_master WHERE type = 'table' AND name NOT LIKE 'sqlite_%' ORDER BY name")
|
|
734
|
+
.all()
|
|
735
|
+
.map((row) => ({ name: String(row.name), virtual: /^\s*CREATE\s+VIRTUAL/i.test(String(row.sql)) }));
|
|
736
|
+
const indexes = all.filter((table) => table.virtual).map((table) => `${table.name}_`);
|
|
737
|
+
return all
|
|
738
|
+
.filter((table) => !table.virtual && table.name !== "schema_migrations")
|
|
739
|
+
.filter((table) => !indexes.some((prefix) => table.name.startsWith(prefix)))
|
|
740
|
+
.map((table) => ({ name: table.name, rows: count(database, `"${table.name}"`) }));
|
|
741
|
+
};
|
|
686
742
|
const isoOf = (value) => new Date(Number(value)).toISOString();
|
|
687
743
|
const messageOf = (error) => (error instanceof Error ? error.message : String(error));
|
|
@@ -4,8 +4,8 @@ export declare const generatedApiCommand: (api: import("./bot/api.js").ApiComman
|
|
|
4
4
|
export declare const botCommand: (bot: import("./index.js").BotMessenger) => import("commander").Command;
|
|
5
5
|
export declare const botMcpCommand: (bot: import("./index.js").BotMessenger) => import("commander").Command;
|
|
6
6
|
export declare const botMessagesCommand: (bot: import("./index.js").BotMessenger) => import("commander").Command;
|
|
7
|
-
export declare const commandsCommand: (app: import("./
|
|
8
|
-
export declare const configCommand: (app: import("./
|
|
7
|
+
export declare const commandsCommand: (app: import("./entry.js").AppIdentity) => import("commander").Command;
|
|
8
|
+
export declare const configCommand: (app: import("./entry.js").AppIdentity, config: {
|
|
9
9
|
resolveSettings: (flags?: import("./settings.js").GlobalFlags, options?: import("./settings.js").ResolveOptions) => import("./settings.js").Settings & object;
|
|
10
10
|
configuredProfiles: (options?: import("./settings.js").ResolveOptions) => string[];
|
|
11
11
|
changeSetting: (path: string, { profile, setting, value, kind, root, }: {
|
|
@@ -172,7 +172,7 @@ export declare const configCommand: (app: import("./index.js").AppIdentity, conf
|
|
|
172
172
|
}, args_2?: {
|
|
173
173
|
permissionKey?: import("./permission-keys.js").PermissionKeyOf;
|
|
174
174
|
} | undefined) => import("commander").Command;
|
|
175
|
-
export declare const guideCommand: (app: Pick<import("./
|
|
175
|
+
export declare const guideCommand: (app: Pick<import("./entry.js").AppIdentity, "command">, options: import("./guide.js").GuideOptions) => import("commander").Command;
|
|
176
176
|
export declare const addMeetingBatchCommand: (program: import("commander").Command, deps: {
|
|
177
177
|
reader: import("../meetings/batch.js").MeetingBatchReader;
|
|
178
178
|
input: (path: string, signal?: AbortSignal) => Promise<string>;
|
|
@@ -410,7 +410,7 @@ export declare const tasksCommand: (messenger: import("./index.js").Messenger) =
|
|
|
410
410
|
export declare const tasksStatsCommand: (messenger: import("./index.js").Messenger) => import("commander").Command;
|
|
411
411
|
export declare const topicsCommand: (messenger: import("./index.js").Messenger) => import("commander").Command;
|
|
412
412
|
export declare const watchCommand: (messenger: import("./index.js").Messenger) => import("commander").Command;
|
|
413
|
-
export declare const runsCommand: (app: import("./
|
|
414
|
-
export declare const skillCommand: (app: import("./
|
|
415
|
-
export declare const upgradeCommand: (app: import("./
|
|
416
|
-
export declare const modelCatalogueCommand: (app: import("./
|
|
413
|
+
export declare const runsCommand: (app: import("./entry.js").AppIdentity) => import("commander").Command;
|
|
414
|
+
export declare const skillCommand: (app: import("./entry.js").AppIdentity, skill: URL) => import("commander").Command;
|
|
415
|
+
export declare const upgradeCommand: (app: import("./entry.js").AppIdentity, packageName: string, contextFor: (command: import("commander").Command) => import("./upgrade-command.js").UpgradeContext) => import("commander").Command;
|
|
416
|
+
export declare const modelCatalogueCommand: (app: import("./entry.js").AppIdentity, options: import("./model-catalogue-command.js").ModelCatalogueOptions) => import("commander").Command;
|
package/dist/entities/index.d.ts
CHANGED
|
@@ -9773,6 +9773,20 @@ export declare const ENTITIES: {
|
|
|
9773
9773
|
readonly path: v.StringSchema<undefined>;
|
|
9774
9774
|
readonly exists: v.LiteralSchema<false, undefined>;
|
|
9775
9775
|
readonly reset: v.LiteralSchema<false, undefined>;
|
|
9776
|
+
}, undefined>, v.StrictObjectSchema<{
|
|
9777
|
+
readonly path: v.StringSchema<undefined>;
|
|
9778
|
+
readonly exists: v.LiteralSchema<true, undefined>;
|
|
9779
|
+
readonly reset: v.LiteralSchema<false, undefined>;
|
|
9780
|
+
readonly dry_run: v.LiteralSchema<true, undefined>;
|
|
9781
|
+
readonly files: v.ArraySchema<v.StringSchema<undefined>, undefined>;
|
|
9782
|
+
readonly bytes: v.SchemaWithPipe<readonly [v.NumberSchema<undefined>, v.IntegerAction<number, undefined>, v.MinValueAction<number, 0, undefined>]>;
|
|
9783
|
+
readonly schema: v.SchemaWithPipe<readonly [v.NumberSchema<undefined>, v.IntegerAction<number, undefined>, v.MinValueAction<number, 0, undefined>]>;
|
|
9784
|
+
readonly tables: v.ArraySchema<v.StrictObjectSchema<{
|
|
9785
|
+
readonly name: v.StringSchema<undefined>;
|
|
9786
|
+
readonly rows: v.SchemaWithPipe<readonly [v.NumberSchema<undefined>, v.IntegerAction<number, undefined>, v.MinValueAction<number, 0, undefined>]>;
|
|
9787
|
+
}, undefined>, undefined>;
|
|
9788
|
+
readonly backup_first: v.BooleanSchema<undefined>;
|
|
9789
|
+
readonly in_use: v.NullableSchema<v.BooleanSchema<undefined>, undefined>;
|
|
9776
9790
|
}, undefined>, v.StrictObjectSchema<{
|
|
9777
9791
|
readonly path: v.StringSchema<undefined>;
|
|
9778
9792
|
readonly exists: v.LiteralSchema<true, undefined>;
|
|
@@ -346,6 +346,20 @@ export declare const storeReset: v.UnionSchema<[v.StrictObjectSchema<{
|
|
|
346
346
|
readonly path: v.StringSchema<undefined>;
|
|
347
347
|
readonly exists: v.LiteralSchema<false, undefined>;
|
|
348
348
|
readonly reset: v.LiteralSchema<false, undefined>;
|
|
349
|
+
}, undefined>, v.StrictObjectSchema<{
|
|
350
|
+
readonly path: v.StringSchema<undefined>;
|
|
351
|
+
readonly exists: v.LiteralSchema<true, undefined>;
|
|
352
|
+
readonly reset: v.LiteralSchema<false, undefined>;
|
|
353
|
+
readonly dry_run: v.LiteralSchema<true, undefined>;
|
|
354
|
+
readonly files: v.ArraySchema<v.StringSchema<undefined>, undefined>;
|
|
355
|
+
readonly bytes: v.SchemaWithPipe<readonly [v.NumberSchema<undefined>, v.IntegerAction<number, undefined>, v.MinValueAction<number, 0, undefined>]>;
|
|
356
|
+
readonly schema: v.SchemaWithPipe<readonly [v.NumberSchema<undefined>, v.IntegerAction<number, undefined>, v.MinValueAction<number, 0, undefined>]>;
|
|
357
|
+
readonly tables: v.ArraySchema<v.StrictObjectSchema<{
|
|
358
|
+
readonly name: v.StringSchema<undefined>;
|
|
359
|
+
readonly rows: v.SchemaWithPipe<readonly [v.NumberSchema<undefined>, v.IntegerAction<number, undefined>, v.MinValueAction<number, 0, undefined>]>;
|
|
360
|
+
}, undefined>, undefined>;
|
|
361
|
+
readonly backup_first: v.BooleanSchema<undefined>;
|
|
362
|
+
readonly in_use: v.NullableSchema<v.BooleanSchema<undefined>, undefined>;
|
|
349
363
|
}, undefined>, v.StrictObjectSchema<{
|
|
350
364
|
readonly path: v.StringSchema<undefined>;
|
|
351
365
|
readonly exists: v.LiteralSchema<true, undefined>;
|
|
@@ -147,6 +147,18 @@ export const storeRestore = v.strictObject({
|
|
|
147
147
|
});
|
|
148
148
|
export const storeReset = v.union([
|
|
149
149
|
v.strictObject({ ...absent.entries, reset: v.literal(false) }),
|
|
150
|
+
v.strictObject({
|
|
151
|
+
path: text,
|
|
152
|
+
exists: v.literal(true),
|
|
153
|
+
reset: v.literal(false),
|
|
154
|
+
dry_run: v.literal(true),
|
|
155
|
+
files: v.array(text),
|
|
156
|
+
bytes: count,
|
|
157
|
+
schema: count,
|
|
158
|
+
tables: v.array(v.strictObject({ name: text, rows: count })),
|
|
159
|
+
backup_first: v.boolean(),
|
|
160
|
+
in_use: v.nullable(v.boolean()),
|
|
161
|
+
}),
|
|
150
162
|
v.strictObject({
|
|
151
163
|
path: text,
|
|
152
164
|
exists: v.literal(true),
|
|
@@ -38,7 +38,6 @@ export declare const meetingTools: ({
|
|
|
38
38
|
max_read_bytes?: undefined;
|
|
39
39
|
cursor?: undefined;
|
|
40
40
|
} | {
|
|
41
|
-
limit?: undefined;
|
|
42
41
|
event_id?: undefined;
|
|
43
42
|
series_id?: undefined;
|
|
44
43
|
page?: undefined;
|
|
@@ -54,11 +53,11 @@ export declare const meetingTools: ({
|
|
|
54
53
|
format?: undefined;
|
|
55
54
|
transcript_id?: undefined;
|
|
56
55
|
query?: undefined;
|
|
56
|
+
limit?: undefined;
|
|
57
57
|
scan_limit?: undefined;
|
|
58
58
|
max_read_bytes?: undefined;
|
|
59
59
|
cursor?: undefined;
|
|
60
60
|
} | {
|
|
61
|
-
limit?: undefined;
|
|
62
61
|
event_id?: undefined;
|
|
63
62
|
series_id?: undefined;
|
|
64
63
|
page?: undefined;
|
|
@@ -76,11 +75,11 @@ export declare const meetingTools: ({
|
|
|
76
75
|
format?: undefined;
|
|
77
76
|
transcript_id?: undefined;
|
|
78
77
|
query?: undefined;
|
|
78
|
+
limit?: undefined;
|
|
79
79
|
scan_limit?: undefined;
|
|
80
80
|
max_read_bytes?: undefined;
|
|
81
81
|
cursor?: undefined;
|
|
82
82
|
} | {
|
|
83
|
-
limit?: undefined;
|
|
84
83
|
event_id?: undefined;
|
|
85
84
|
series_id?: undefined;
|
|
86
85
|
page?: undefined;
|
|
@@ -102,6 +101,7 @@ export declare const meetingTools: ({
|
|
|
102
101
|
minimum: number;
|
|
103
102
|
};
|
|
104
103
|
query?: undefined;
|
|
104
|
+
limit?: undefined;
|
|
105
105
|
scan_limit?: undefined;
|
|
106
106
|
max_read_bytes?: undefined;
|
|
107
107
|
cursor?: undefined;
|
|
@@ -188,7 +188,6 @@ export declare const meetingTools: ({
|
|
|
188
188
|
max_read_bytes?: undefined;
|
|
189
189
|
cursor?: undefined;
|
|
190
190
|
} | {
|
|
191
|
-
limit?: undefined;
|
|
192
191
|
event_id?: undefined;
|
|
193
192
|
series_id?: undefined;
|
|
194
193
|
page?: undefined;
|
|
@@ -204,11 +203,11 @@ export declare const meetingTools: ({
|
|
|
204
203
|
format?: undefined;
|
|
205
204
|
transcript_id?: undefined;
|
|
206
205
|
query?: undefined;
|
|
206
|
+
limit?: undefined;
|
|
207
207
|
scan_limit?: undefined;
|
|
208
208
|
max_read_bytes?: undefined;
|
|
209
209
|
cursor?: undefined;
|
|
210
210
|
} | {
|
|
211
|
-
limit?: undefined;
|
|
212
211
|
event_id?: undefined;
|
|
213
212
|
series_id?: undefined;
|
|
214
213
|
page?: undefined;
|
|
@@ -226,11 +225,11 @@ export declare const meetingTools: ({
|
|
|
226
225
|
format?: undefined;
|
|
227
226
|
transcript_id?: undefined;
|
|
228
227
|
query?: undefined;
|
|
228
|
+
limit?: undefined;
|
|
229
229
|
scan_limit?: undefined;
|
|
230
230
|
max_read_bytes?: undefined;
|
|
231
231
|
cursor?: undefined;
|
|
232
232
|
} | {
|
|
233
|
-
limit?: undefined;
|
|
234
233
|
event_id?: undefined;
|
|
235
234
|
series_id?: undefined;
|
|
236
235
|
page?: undefined;
|
|
@@ -252,6 +251,7 @@ export declare const meetingTools: ({
|
|
|
252
251
|
minimum: number;
|
|
253
252
|
};
|
|
254
253
|
query?: undefined;
|
|
254
|
+
limit?: undefined;
|
|
255
255
|
scan_limit?: undefined;
|
|
256
256
|
max_read_bytes?: undefined;
|
|
257
257
|
cursor?: undefined;
|
|
@@ -338,7 +338,6 @@ export declare const meetingTools: ({
|
|
|
338
338
|
max_read_bytes?: undefined;
|
|
339
339
|
cursor?: undefined;
|
|
340
340
|
} | {
|
|
341
|
-
limit?: undefined;
|
|
342
341
|
event_id?: undefined;
|
|
343
342
|
series_id?: undefined;
|
|
344
343
|
page?: undefined;
|
|
@@ -354,11 +353,11 @@ export declare const meetingTools: ({
|
|
|
354
353
|
format?: undefined;
|
|
355
354
|
transcript_id?: undefined;
|
|
356
355
|
query?: undefined;
|
|
356
|
+
limit?: undefined;
|
|
357
357
|
scan_limit?: undefined;
|
|
358
358
|
max_read_bytes?: undefined;
|
|
359
359
|
cursor?: undefined;
|
|
360
360
|
} | {
|
|
361
|
-
limit?: undefined;
|
|
362
361
|
event_id?: undefined;
|
|
363
362
|
series_id?: undefined;
|
|
364
363
|
page?: undefined;
|
|
@@ -376,11 +375,11 @@ export declare const meetingTools: ({
|
|
|
376
375
|
format?: undefined;
|
|
377
376
|
transcript_id?: undefined;
|
|
378
377
|
query?: undefined;
|
|
378
|
+
limit?: undefined;
|
|
379
379
|
scan_limit?: undefined;
|
|
380
380
|
max_read_bytes?: undefined;
|
|
381
381
|
cursor?: undefined;
|
|
382
382
|
} | {
|
|
383
|
-
limit?: undefined;
|
|
384
383
|
event_id?: undefined;
|
|
385
384
|
series_id?: undefined;
|
|
386
385
|
page?: undefined;
|
|
@@ -402,6 +401,7 @@ export declare const meetingTools: ({
|
|
|
402
401
|
minimum: number;
|
|
403
402
|
};
|
|
404
403
|
query?: undefined;
|
|
404
|
+
limit?: undefined;
|
|
405
405
|
scan_limit?: undefined;
|
|
406
406
|
max_read_bytes?: undefined;
|
|
407
407
|
cursor?: undefined;
|
|
@@ -488,7 +488,6 @@ export declare const meetingTools: ({
|
|
|
488
488
|
max_read_bytes?: undefined;
|
|
489
489
|
cursor?: undefined;
|
|
490
490
|
} | {
|
|
491
|
-
limit?: undefined;
|
|
492
491
|
event_id?: undefined;
|
|
493
492
|
series_id?: undefined;
|
|
494
493
|
page?: undefined;
|
|
@@ -504,11 +503,11 @@ export declare const meetingTools: ({
|
|
|
504
503
|
format?: undefined;
|
|
505
504
|
transcript_id?: undefined;
|
|
506
505
|
query?: undefined;
|
|
506
|
+
limit?: undefined;
|
|
507
507
|
scan_limit?: undefined;
|
|
508
508
|
max_read_bytes?: undefined;
|
|
509
509
|
cursor?: undefined;
|
|
510
510
|
} | {
|
|
511
|
-
limit?: undefined;
|
|
512
511
|
event_id?: undefined;
|
|
513
512
|
series_id?: undefined;
|
|
514
513
|
page?: undefined;
|
|
@@ -526,11 +525,11 @@ export declare const meetingTools: ({
|
|
|
526
525
|
format?: undefined;
|
|
527
526
|
transcript_id?: undefined;
|
|
528
527
|
query?: undefined;
|
|
528
|
+
limit?: undefined;
|
|
529
529
|
scan_limit?: undefined;
|
|
530
530
|
max_read_bytes?: undefined;
|
|
531
531
|
cursor?: undefined;
|
|
532
532
|
} | {
|
|
533
|
-
limit?: undefined;
|
|
534
533
|
event_id?: undefined;
|
|
535
534
|
series_id?: undefined;
|
|
536
535
|
page?: undefined;
|
|
@@ -552,6 +551,7 @@ export declare const meetingTools: ({
|
|
|
552
551
|
minimum: number;
|
|
553
552
|
};
|
|
554
553
|
query?: undefined;
|
|
554
|
+
limit?: undefined;
|
|
555
555
|
scan_limit?: undefined;
|
|
556
556
|
max_read_bytes?: undefined;
|
|
557
557
|
cursor?: undefined;
|
|
@@ -638,7 +638,6 @@ export declare const meetingTools: ({
|
|
|
638
638
|
max_read_bytes?: undefined;
|
|
639
639
|
cursor?: undefined;
|
|
640
640
|
} | {
|
|
641
|
-
limit?: undefined;
|
|
642
641
|
event_id?: undefined;
|
|
643
642
|
series_id?: undefined;
|
|
644
643
|
page?: undefined;
|
|
@@ -654,11 +653,11 @@ export declare const meetingTools: ({
|
|
|
654
653
|
format?: undefined;
|
|
655
654
|
transcript_id?: undefined;
|
|
656
655
|
query?: undefined;
|
|
656
|
+
limit?: undefined;
|
|
657
657
|
scan_limit?: undefined;
|
|
658
658
|
max_read_bytes?: undefined;
|
|
659
659
|
cursor?: undefined;
|
|
660
660
|
} | {
|
|
661
|
-
limit?: undefined;
|
|
662
661
|
event_id?: undefined;
|
|
663
662
|
series_id?: undefined;
|
|
664
663
|
page?: undefined;
|
|
@@ -676,11 +675,11 @@ export declare const meetingTools: ({
|
|
|
676
675
|
format?: undefined;
|
|
677
676
|
transcript_id?: undefined;
|
|
678
677
|
query?: undefined;
|
|
678
|
+
limit?: undefined;
|
|
679
679
|
scan_limit?: undefined;
|
|
680
680
|
max_read_bytes?: undefined;
|
|
681
681
|
cursor?: undefined;
|
|
682
682
|
} | {
|
|
683
|
-
limit?: undefined;
|
|
684
683
|
event_id?: undefined;
|
|
685
684
|
series_id?: undefined;
|
|
686
685
|
page?: undefined;
|
|
@@ -702,6 +701,7 @@ export declare const meetingTools: ({
|
|
|
702
701
|
minimum: number;
|
|
703
702
|
};
|
|
704
703
|
query?: undefined;
|
|
704
|
+
limit?: undefined;
|
|
705
705
|
scan_limit?: undefined;
|
|
706
706
|
max_read_bytes?: undefined;
|
|
707
707
|
cursor?: undefined;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@wirecat/cli-core",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.430.0",
|
|
4
4
|
"description": "The messenger-neutral half of a messaging CLI: domain model, message locators, rendering, name resolution, the SQLite seam, the command skeleton and shared read commands, the send guard, run records and the message store",
|
|
5
5
|
"license": "Apache-2.0",
|
|
6
6
|
"author": "Viacheslav Ptsarev",
|
|
@@ -48,6 +48,10 @@
|
|
|
48
48
|
"types": "./dist/cli/index.d.ts",
|
|
49
49
|
"default": "./dist/cli/index.js"
|
|
50
50
|
},
|
|
51
|
+
"./cli/start": {
|
|
52
|
+
"types": "./dist/cli/entry.d.ts",
|
|
53
|
+
"default": "./dist/cli/entry.js"
|
|
54
|
+
},
|
|
51
55
|
"./sends": {
|
|
52
56
|
"types": "./dist/sends/index.d.ts",
|
|
53
57
|
"default": "./dist/sends/index.js"
|