






















@@ -65,6 +65,23 @@ async function runMemoryRemBackfill(opts: MemoryRemBackfillOptions) {
6565await runtime.runMemoryRemBackfill(opts);
6666}
676768+function invalidCliArgument(message: string): Error & { code: string; exitCode: number } {
69+const error = new Error(message) as Error & { code: string; exitCode: number };
70+error.name = "InvalidArgumentError";
71+// Commander recognizes parser failures by code; keep the import type-only for bundled plugin deps.
72+error.code = "commander.invalidArgument";
73+error.exitCode = 1;
74+return error;
75+}
76+77+function parseMemoryCliNumberOption(value: string, flag: string): number {
78+const parsed = Number(value);
79+if (!Number.isFinite(parsed)) {
80+throw invalidCliArgument(`${flag} must be a finite number.`);
81+}
82+return parsed;
83+}
84+6885export function registerMemoryCli(program: Command) {
6986const memory = program
7087.command("memory")
@@ -142,8 +159,12 @@ export function registerMemoryCli(program: Command) {
142159.argument("[query]", "Search query")
143160.option("--query <text>", "Search query (alternative to positional argument)")
144161.option("--agent <id>", "Agent id (default: default agent)")
145-.option("--max-results <n>", "Max results", (value: string) => Number(value))
146-.option("--min-score <n>", "Minimum score", (value: string) => Number(value))
162+.option("--max-results <n>", "Max results", (value: string) =>
163+parseMemoryCliNumberOption(value, "--max-results"),
164+)
165+.option("--min-score <n>", "Minimum score", (value: string) =>
166+parseMemoryCliNumberOption(value, "--min-score"),
167+)
147168.option("--json", "Print JSON")
148169.action(async (queryArg: string | undefined, opts: MemorySearchCommandOptions) => {
149170await runMemorySearch(queryArg, opts);
@@ -153,21 +174,23 @@ export function registerMemoryCli(program: Command) {
153174.command("promote")
154175.description("Rank short-term recalls and optionally append top entries to MEMORY.md")
155176.option("--agent <id>", "Agent id (default: default agent)")
156-.option("--limit <n>", "Max candidates", (value: string) => Number(value))
177+.option("--limit <n>", "Max candidates", (value: string) =>
178+parseMemoryCliNumberOption(value, "--limit"),
179+)
157180.option(
158181"--min-score <n>",
159182`Minimum weighted score (default: ${DEFAULT_PROMOTION_MIN_SCORE})`,
160-(value: string) => Number(value),
183+(value: string) => parseMemoryCliNumberOption(value, "--min-score"),
161184)
162185.option(
163186"--min-recall-count <n>",
164187`Minimum recall count (default: ${DEFAULT_PROMOTION_MIN_RECALL_COUNT})`,
165-(value: string) => Number(value),
188+(value: string) => parseMemoryCliNumberOption(value, "--min-recall-count"),
166189)
167190.option(
168191"--min-unique-queries <n>",
169192`Minimum distinct query count (default: ${DEFAULT_PROMOTION_MIN_UNIQUE_QUERIES})`,
170-(value: string) => Number(value),
193+(value: string) => parseMemoryCliNumberOption(value, "--min-unique-queries"),
171194)
172195.option("--apply", "Append selected candidates to MEMORY.md", false)
173196.option("--include-promoted", "Include already promoted candidates", false)
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。