























@@ -16,6 +16,7 @@ import {
16161717type Args = {
1818agentId: string;
19+help: boolean;
1920reveal: boolean;
2021sessionKey?: string;
2122};
@@ -36,31 +37,86 @@ const mask = (value: string) => {
3637);
3738};
383939-const parseArgs = (): Args => {
40-const args = process.argv.slice(2);
40+const parseArgs = (args = process.argv.slice(2)): Args => {
4141let agentId = "main";
42+let help = false;
4243let reveal = false;
4344let sessionKey: string | undefined;
44454546for (let i = 0; i < args.length; i++) {
4647const arg = args[i];
47-if (arg === "--agent" && args[i + 1]) {
48-agentId = args[++i].trim() || "main";
48+if (arg === "--agent") {
49+agentId = parseNonBlankArgValue(parseRequiredArgValue(args, i, "--agent"), "--agent");
50+i += 1;
51+continue;
52+}
53+if (arg.startsWith("--agent=")) {
54+agentId = parseNonBlankArgValue(parseInlineArgValue(arg, "--agent"), "--agent");
55+continue;
56+}
57+if (arg === "--help" || arg === "-h") {
58+help = true;
4959continue;
5060}
5161if (arg === "--reveal") {
5262reveal = true;
5363continue;
5464}
55-if (arg === "--session-key" && args[i + 1]) {
56-sessionKey = normalizeOptionalString(args[++i]);
65+if (arg === "--session-key") {
66+sessionKey = parseNonBlankArgValue(
67+parseRequiredArgValue(args, i, "--session-key"),
68+"--session-key",
69+);
70+i += 1;
71+continue;
72+}
73+if (arg.startsWith("--session-key=")) {
74+sessionKey = parseNonBlankArgValue(
75+parseInlineArgValue(arg, "--session-key"),
76+"--session-key",
77+);
5778continue;
5879}
80+throw new Error(`Unknown argument: ${arg}`);
5981}
608261-return { agentId, reveal, sessionKey };
83+return { agentId, help, reveal, sessionKey };
6284};
638586+function parseRequiredArgValue(args: string[], index: number, label: string): string {
87+const value = args[index + 1];
88+if (!value || value.startsWith("-")) {
89+throw new Error(`${label} requires a value`);
90+}
91+return value;
92+}
93+94+function parseInlineArgValue(arg: string, label: string): string {
95+const value = arg.slice(`${label}=`.length);
96+if (!value) {
97+throw new Error(`${label} requires a value`);
98+}
99+return value;
100+}
101+102+function parseNonBlankArgValue(value: string, label: string): string {
103+const normalized = normalizeOptionalString(value);
104+if (!normalized) {
105+throw new Error(`${label} requires a value`);
106+}
107+return normalized;
108+}
109+110+function printUsage(): void {
111+console.log(`Usage: node --import tsx scripts/debug-claude-usage.ts [options]
112+113+Options:
114+ --agent <id> OpenClaw agent id to inspect (default: main)
115+ --session-key <key> Claude web session key override
116+ --reveal Print token/session values instead of masked identifiers
117+ --help, -h Show this help message`);
118+}
119+64120const loadAuthProfiles = (agentId: string) => {
65121const stateRoot = process.env.OPENCLAW_STATE_DIR?.trim() || path.join(os.homedir(), ".openclaw");
66122const authPath = path.join(stateRoot, "agents", agentId, "agent", "auth-profiles.json");
@@ -413,8 +469,13 @@ const fetchClaudeWebUsage = async (sessionKey: string, options: FetchOptions = {
413469 : { ok: false as const, step: "usage", status: usageRes.status, body: usageText };
414470};
415471416-const main = async () => {
417-const opts = parseArgs();
472+const main = async (argv = process.argv.slice(2)) => {
473+const opts = parseArgs(argv);
474+if (opts.help) {
475+printUsage();
476+return;
477+}
478+418479const { authPath, store } = loadAuthProfiles(opts.agentId);
419480console.log(`Auth file: ${redactHomePath(authPath)}`);
420481@@ -485,11 +546,12 @@ export const testing = {
485546 browserRootLabel,
486547 fetchAnthropicOAuthUsage,
487548 mask,
549+ parseArgs,
488550 readBoundedResponseText,
489551 resolveFetchTimeoutMs,
490552};
491553492-if (import.meta.url === pathToFileURL(process.argv[1] ?? "").href) {
554+if (import.meta.url === pathToFileURL(path.resolve(process.argv[1] ?? "")).href) {
493555await main().catch((error: unknown) => {
494556console.error(
495557previewForDevToolLog(error instanceof Error ? error.message : String(error), 800),
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。