@gkorepanov/ccodex 0.3.0 → 0.3.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +27 -9
- package/RELEASING.md +14 -15
- package/SSH_VERIFY.md +11 -0
- package/archive/README.md +23 -0
- package/compatibility.json +1 -2
- package/config.example.toml +12 -4
- package/dist/claude/asyncQueue.d.ts +3 -0
- package/dist/claude/asyncQueue.js +13 -2
- package/dist/claude/asyncQueue.js.map +1 -1
- package/dist/claude/commandActions.d.ts +6 -0
- package/dist/claude/commandActions.js +57 -0
- package/dist/claude/commandActions.js.map +1 -0
- package/dist/claude/compactCommand.d.ts +2 -0
- package/dist/claude/compactCommand.js +7 -0
- package/dist/claude/compactCommand.js.map +1 -0
- package/dist/claude/goalTools.d.ts +15 -0
- package/dist/claude/goalTools.js +173 -0
- package/dist/claude/goalTools.js.map +1 -0
- package/dist/claude/hookMapper.d.ts +17 -4
- package/dist/claude/hookMapper.js +7 -5
- package/dist/claude/hookMapper.js.map +1 -1
- package/dist/claude/rateLimits.d.ts +72 -0
- package/dist/claude/rateLimits.js +330 -0
- package/dist/claude/rateLimits.js.map +1 -0
- package/dist/claude/responseItemValidation.d.ts +2 -0
- package/dist/claude/responseItemValidation.js +40 -0
- package/dist/claude/responseItemValidation.js.map +1 -0
- package/dist/claude/resultClassifier.d.ts +8 -2
- package/dist/claude/resultClassifier.js +1 -1
- package/dist/claude/resultClassifier.js.map +1 -1
- package/dist/claude/service.d.ts +108 -28
- package/dist/claude/service.js +1276 -668
- package/dist/claude/service.js.map +1 -1
- package/dist/claude/session/backgroundOutput.d.ts +2 -0
- package/dist/claude/session/backgroundOutput.js +29 -0
- package/dist/claude/session/backgroundOutput.js.map +1 -0
- package/dist/claude/session/commands.d.ts +855 -0
- package/dist/claude/session/commands.js +2 -0
- package/dist/claude/session/commands.js.map +1 -0
- package/dist/claude/session/goalState.d.ts +49 -0
- package/dist/claude/session/goalState.js +407 -0
- package/dist/claude/session/goalState.js.map +1 -0
- package/dist/claude/session/mailbox.d.ts +52 -0
- package/dist/claude/session/mailbox.js +190 -0
- package/dist/claude/session/mailbox.js.map +1 -0
- package/dist/claude/session/outputAdapter.d.ts +11 -0
- package/dist/claude/session/outputAdapter.js +31 -0
- package/dist/claude/session/outputAdapter.js.map +1 -0
- package/dist/claude/session/providerFacts.d.ts +47 -0
- package/dist/claude/session/providerFacts.js +84 -0
- package/dist/claude/session/providerFacts.js.map +1 -0
- package/dist/claude/session/providerRuntime.d.ts +1 -0
- package/dist/claude/session/providerRuntime.js +2 -0
- package/dist/claude/session/providerRuntime.js.map +1 -0
- package/dist/claude/session/providerRuntimeFactory.d.ts +49 -0
- package/dist/claude/session/providerRuntimeFactory.js +127 -0
- package/dist/claude/session/providerRuntimeFactory.js.map +1 -0
- package/dist/claude/session/repository.d.ts +57 -0
- package/dist/claude/session/repository.js +161 -0
- package/dist/claude/session/repository.js.map +1 -0
- package/dist/claude/session/runtime.d.ts +46 -0
- package/dist/claude/session/runtime.js +140 -0
- package/dist/claude/session/runtime.js.map +1 -0
- package/dist/claude/session/scopeState.d.ts +61 -0
- package/dist/claude/session/scopeState.js +74 -0
- package/dist/claude/session/scopeState.js.map +1 -0
- package/dist/claude/session/session.d.ts +281 -0
- package/dist/claude/session/session.js +6664 -0
- package/dist/claude/session/session.js.map +1 -0
- package/dist/claude/session/shellRunner.d.ts +13 -0
- package/dist/claude/session/shellRunner.js +103 -0
- package/dist/claude/session/shellRunner.js.map +1 -0
- package/dist/claude/session/usage.d.ts +2 -0
- package/dist/claude/session/usage.js +10 -0
- package/dist/claude/session/usage.js.map +1 -0
- package/dist/claude/sessionRegistry.d.ts +26 -0
- package/dist/claude/sessionRegistry.js +118 -0
- package/dist/claude/sessionRegistry.js.map +1 -0
- package/dist/claude/shellSupervisor.d.ts +1 -0
- package/dist/claude/shellSupervisor.js +69 -0
- package/dist/claude/shellSupervisor.js.map +1 -0
- package/dist/claude/statusCommand.d.ts +21 -0
- package/dist/claude/statusCommand.js +97 -0
- package/dist/claude/statusCommand.js.map +1 -0
- package/dist/claude/toolMapper.d.ts +9 -1
- package/dist/claude/toolMapper.js +92 -16
- package/dist/claude/toolMapper.js.map +1 -1
- package/dist/claude/transcriptBrancher.d.ts +37 -0
- package/dist/claude/transcriptBrancher.js +103 -0
- package/dist/claude/transcriptBrancher.js.map +1 -0
- package/dist/cli/delegate.js +23 -1
- package/dist/cli/delegate.js.map +1 -1
- package/dist/cli/main.js +28 -12
- package/dist/cli/main.js.map +1 -1
- package/dist/codex/generated/ResponseItemRuntimeSchema.d.ts +8 -0
- package/dist/codex/generated/ResponseItemRuntimeSchema.js +7 -0
- package/dist/codex/generated/ResponseItemRuntimeSchema.js.map +1 -0
- package/dist/compatibility/probe.js +11 -6
- package/dist/compatibility/probe.js.map +1 -1
- package/dist/config/config.d.ts +9 -0
- package/dist/config/config.js +80 -11
- package/dist/config/config.js.map +1 -1
- package/dist/daemon/daemon.js +91 -43
- package/dist/daemon/daemon.js.map +1 -1
- package/dist/daemon/ownership.d.ts +15 -0
- package/dist/daemon/ownership.js +185 -0
- package/dist/daemon/ownership.js.map +1 -0
- package/dist/daemon/supervisor.d.ts +3 -0
- package/dist/daemon/supervisor.js +37 -1
- package/dist/daemon/supervisor.js.map +1 -1
- package/dist/gateway/clientConnection.d.ts +7 -1
- package/dist/gateway/clientConnection.js +435 -48
- package/dist/gateway/clientConnection.js.map +1 -1
- package/dist/gateway/remoteRelay.js +0 -1
- package/dist/gateway/remoteRelay.js.map +1 -1
- package/dist/gateway/server.d.ts +1 -1
- package/dist/gateway/server.js +37 -9
- package/dist/gateway/server.js.map +1 -1
- package/dist/gateway/subscriptions.d.ts +9 -2
- package/dist/gateway/subscriptions.js +87 -9
- package/dist/gateway/subscriptions.js.map +1 -1
- package/dist/gateway/transientNotice.d.ts +2 -0
- package/dist/gateway/transientNotice.js +42 -1
- package/dist/gateway/transientNotice.js.map +1 -1
- package/dist/handoff/service.d.ts +32 -3
- package/dist/handoff/service.js +304 -26
- package/dist/handoff/service.js.map +1 -1
- package/dist/handoff/titleGeneration.d.ts +28 -0
- package/dist/handoff/titleGeneration.js +151 -0
- package/dist/handoff/titleGeneration.js.map +1 -0
- package/dist/management/doctor.d.ts +1 -1
- package/dist/management/doctor.js +32 -23
- package/dist/management/doctor.js.map +1 -1
- package/dist/management/lifecycle.js +14 -2
- package/dist/management/lifecycle.js.map +1 -1
- package/dist/management/remoteShim.d.ts +10 -0
- package/dist/management/remoteShim.js +65 -0
- package/dist/management/remoteShim.js.map +1 -0
- package/dist/management/setup.d.ts +4 -0
- package/dist/management/setup.js +108 -39
- package/dist/management/setup.js.map +1 -1
- package/dist/observability/metrics.d.ts +2 -0
- package/dist/observability/metrics.js +6 -0
- package/dist/observability/metrics.js.map +1 -1
- package/dist/protocol/errors.d.ts +1 -0
- package/dist/protocol/errors.js +4 -1
- package/dist/protocol/errors.js.map +1 -1
- package/dist/runtime/dependencies.js +2 -2
- package/dist/runtime/dependencies.js.map +1 -1
- package/dist/runtime/providerAvailability.d.ts +24 -0
- package/dist/runtime/providerAvailability.js +107 -0
- package/dist/runtime/providerAvailability.js.map +1 -0
- package/dist/state/stateCommand.d.ts +21 -0
- package/dist/state/stateCommand.js +198 -0
- package/dist/state/stateCommand.js.map +1 -0
- package/dist/state/stockStateTracker.d.ts +14 -0
- package/dist/state/stockStateTracker.js +120 -0
- package/dist/state/stockStateTracker.js.map +1 -0
- package/dist/store/HybridStore.d.ts +118 -2
- package/dist/store/HybridStore.js +23 -1
- package/dist/store/HybridStore.js.map +1 -1
- package/dist/store/memoryStore.d.ts +57 -7
- package/dist/store/memoryStore.js +337 -5
- package/dist/store/memoryStore.js.map +1 -1
- package/dist/store/sqliteStore.d.ts +30 -4
- package/dist/store/sqliteStore.js +395 -42
- package/dist/store/sqliteStore.js.map +1 -1
- package/install.sh +2 -2
- package/package.json +18 -10
- package/dist/claude/interactions.d.ts +0 -23
- package/dist/claude/interactions.js +0 -77
- package/dist/claude/interactions.js.map +0 -1
- package/dist/claude/sessionRuntime.d.ts +0 -102
- package/dist/claude/sessionRuntime.js +0 -1361
- package/dist/claude/sessionRuntime.js.map +0 -1
- /package/{BUILD_BENCHMARKS.md → archive/BUILD_BENCHMARKS.md} +0 -0
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import type { SDKHookProgressMessage, SDKHookResponseMessage, SDKHookStartedMessage } from "@anthropic-ai/claude-agent-sdk";
|
|
2
1
|
declare const eventNames: {
|
|
3
2
|
readonly PreToolUse: "preToolUse";
|
|
4
3
|
readonly PermissionRequest: "permissionRequest";
|
|
@@ -30,7 +29,21 @@ export interface ClaudeHookRun {
|
|
|
30
29
|
text: string;
|
|
31
30
|
}>;
|
|
32
31
|
}
|
|
33
|
-
export declare function startHookRun(message:
|
|
34
|
-
|
|
35
|
-
|
|
32
|
+
export declare function startHookRun(message: {
|
|
33
|
+
hookId: string;
|
|
34
|
+
hookName: string;
|
|
35
|
+
hookEvent: string;
|
|
36
|
+
}, cwd: string, activeTurn: boolean, displayOrder: number): ClaudeHookRun | undefined;
|
|
37
|
+
export declare function appendHookProgress(run: ClaudeHookRun, message: {
|
|
38
|
+
output: string;
|
|
39
|
+
stdout: string;
|
|
40
|
+
stderr: string;
|
|
41
|
+
}): void;
|
|
42
|
+
export declare function completeHookRun(run: ClaudeHookRun, message: {
|
|
43
|
+
output: string;
|
|
44
|
+
stdout: string;
|
|
45
|
+
stderr: string;
|
|
46
|
+
outcome: "success" | "error" | "cancelled";
|
|
47
|
+
exitCode?: number;
|
|
48
|
+
}): ClaudeHookRun;
|
|
36
49
|
export {};
|
|
@@ -12,20 +12,20 @@ const eventNames = {
|
|
|
12
12
|
Stop: "stop",
|
|
13
13
|
};
|
|
14
14
|
export function startHookRun(message, cwd, activeTurn, displayOrder) {
|
|
15
|
-
const eventName = eventNames[message.
|
|
15
|
+
const eventName = eventNames[message.hookEvent];
|
|
16
16
|
if (!eventName)
|
|
17
17
|
return undefined;
|
|
18
18
|
return {
|
|
19
|
-
id: message.
|
|
19
|
+
id: message.hookId,
|
|
20
20
|
eventName,
|
|
21
21
|
handlerType: "command",
|
|
22
22
|
executionMode: "sync",
|
|
23
23
|
scope: activeTurn ? "turn" : "thread",
|
|
24
|
-
sourcePath: isAbsolute(message.
|
|
24
|
+
sourcePath: isAbsolute(message.hookName) ? message.hookName : resolve(cwd, message.hookName),
|
|
25
25
|
source: "unknown",
|
|
26
26
|
displayOrder,
|
|
27
27
|
status: "running",
|
|
28
|
-
statusMessage: message.
|
|
28
|
+
statusMessage: message.hookName,
|
|
29
29
|
startedAt: Date.now(),
|
|
30
30
|
completedAt: null,
|
|
31
31
|
durationMs: null,
|
|
@@ -46,7 +46,9 @@ export function completeHookRun(run, message) {
|
|
|
46
46
|
appendOutput(run, message);
|
|
47
47
|
const completedAt = Date.now();
|
|
48
48
|
run.status = message.outcome === "success" ? "completed" : message.outcome === "cancelled" ? "stopped" : "failed";
|
|
49
|
-
run.statusMessage = message.
|
|
49
|
+
run.statusMessage = message.exitCode === undefined
|
|
50
|
+
? message.outcome
|
|
51
|
+
: `${message.outcome} (exit ${message.exitCode})`;
|
|
50
52
|
run.completedAt = completedAt;
|
|
51
53
|
run.durationMs = completedAt - run.startedAt;
|
|
52
54
|
return run;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hookMapper.js","sourceRoot":"","sources":["../../src/claude/hookMapper.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"hookMapper.js","sourceRoot":"","sources":["../../src/claude/hookMapper.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import type { Query, SDKRateLimitInfo } from "@anthropic-ai/claude-agent-sdk";
|
|
2
|
+
import type { Logger } from "../observability/logger.js";
|
|
3
|
+
export interface ClaudeRateLimitWindow {
|
|
4
|
+
usedPercent: number | null;
|
|
5
|
+
windowDurationMins: number | null;
|
|
6
|
+
resetsAt: number | null;
|
|
7
|
+
}
|
|
8
|
+
export interface ClaudeRateLimitSnapshot {
|
|
9
|
+
limitId: string;
|
|
10
|
+
limitName: string;
|
|
11
|
+
primary: ClaudeRateLimitWindow | null;
|
|
12
|
+
secondary: ClaudeRateLimitWindow | null;
|
|
13
|
+
credits: null;
|
|
14
|
+
individualLimit: null;
|
|
15
|
+
planType: "pro" | "team" | "enterprise" | "unknown";
|
|
16
|
+
rateLimitReachedType: "rate_limit_reached" | null;
|
|
17
|
+
}
|
|
18
|
+
export interface ClaudeRateLimitsResponse {
|
|
19
|
+
rateLimits: ClaudeRateLimitSnapshot;
|
|
20
|
+
rateLimitsByLimitId: Record<string, ClaudeRateLimitSnapshot>;
|
|
21
|
+
rateLimitResetCredits: null;
|
|
22
|
+
}
|
|
23
|
+
export declare class ClaudeUsageSchemaError extends Error {
|
|
24
|
+
constructor(message: string);
|
|
25
|
+
}
|
|
26
|
+
export declare function unavailableClaudeRateLimits(): ClaudeRateLimitsResponse;
|
|
27
|
+
export declare function mapClaudeUsage(raw: unknown): ClaudeRateLimitsResponse;
|
|
28
|
+
export interface ClaudeUsageSource {
|
|
29
|
+
usage_EXPERIMENTAL_MAY_CHANGE_DO_NOT_RELY_ON_THIS_API_YET(): ReturnType<Query["usage_EXPERIMENTAL_MAY_CHANGE_DO_NOT_RELY_ON_THIS_API_YET"]>;
|
|
30
|
+
}
|
|
31
|
+
type Listener = (response: ClaudeRateLimitsResponse) => void;
|
|
32
|
+
export interface ClaudeRateLimitCoordinatorOptions {
|
|
33
|
+
readonly ttlMs?: number;
|
|
34
|
+
readonly staleTtlMs?: number;
|
|
35
|
+
readonly now?: () => number;
|
|
36
|
+
}
|
|
37
|
+
export interface ClaudeRateLimitStatus {
|
|
38
|
+
readonly rateLimits: ClaudeRateLimitsResponse;
|
|
39
|
+
readonly unavailableReason: string | null;
|
|
40
|
+
}
|
|
41
|
+
export declare class ClaudeRateLimitCoordinator {
|
|
42
|
+
private readonly logger;
|
|
43
|
+
private readonly sources;
|
|
44
|
+
private readonly listeners;
|
|
45
|
+
private readonly ttlMs;
|
|
46
|
+
private readonly staleTtlMs;
|
|
47
|
+
private readonly now;
|
|
48
|
+
private nextGeneration;
|
|
49
|
+
private cache;
|
|
50
|
+
private inFlight;
|
|
51
|
+
private unavailableReason;
|
|
52
|
+
constructor(logger: Logger, options?: ClaudeRateLimitCoordinatorOptions);
|
|
53
|
+
register(source: ClaudeUsageSource): number;
|
|
54
|
+
unregister(generation: number): void;
|
|
55
|
+
subscribe(connectionId: string, listener: Listener): void;
|
|
56
|
+
get hasLiveSource(): boolean;
|
|
57
|
+
unsubscribe(connectionId: string): void;
|
|
58
|
+
invalidate(reason: string): void;
|
|
59
|
+
read(): Promise<ClaudeRateLimitsResponse>;
|
|
60
|
+
readStatus(): Promise<ClaudeRateLimitStatus>;
|
|
61
|
+
cached(): ClaudeRateLimitsResponse;
|
|
62
|
+
mergeEvent(generation: number, info: SDKRateLimitInfo): void;
|
|
63
|
+
private refresh;
|
|
64
|
+
private staleOrUnavailable;
|
|
65
|
+
}
|
|
66
|
+
export declare function rateLimitNotifications(response: ClaudeRateLimitsResponse): Array<{
|
|
67
|
+
method: "account/rateLimits/updated";
|
|
68
|
+
params: {
|
|
69
|
+
rateLimits: ClaudeRateLimitSnapshot;
|
|
70
|
+
};
|
|
71
|
+
}>;
|
|
72
|
+
export {};
|
|
@@ -0,0 +1,330 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
const rateWindowSchema = z.object({
|
|
3
|
+
utilization: z.number().nullable(),
|
|
4
|
+
resets_at: z.string().nullable(),
|
|
5
|
+
// Claude Code 2.1.211 adds these account-billing fields although the
|
|
6
|
+
// Agent SDK 0.3.209 declaration omits them. They are validated but never
|
|
7
|
+
// projected into Codex credits because their billing semantics differ.
|
|
8
|
+
limit_dollars: z.number().nullable().optional(),
|
|
9
|
+
used_dollars: z.number().nullable().optional(),
|
|
10
|
+
remaining_dollars: z.number().nullable().optional(),
|
|
11
|
+
}).strict();
|
|
12
|
+
const modelWindowSchema = rateWindowSchema.extend({ display_name: z.string().min(1) }).strict();
|
|
13
|
+
const rateLimitsSchema = z.object({
|
|
14
|
+
five_hour: rateWindowSchema.nullable().optional(),
|
|
15
|
+
seven_day: rateWindowSchema.nullable().optional(),
|
|
16
|
+
seven_day_oauth_apps: rateWindowSchema.nullable().optional(),
|
|
17
|
+
seven_day_opus: rateWindowSchema.nullable().optional(),
|
|
18
|
+
seven_day_sonnet: rateWindowSchema.nullable().optional(),
|
|
19
|
+
model_scoped: z.array(modelWindowSchema).optional(),
|
|
20
|
+
extra_usage: z.object({
|
|
21
|
+
is_enabled: z.boolean(),
|
|
22
|
+
monthly_limit: z.number().nullable(),
|
|
23
|
+
used_credits: z.number().nullable(),
|
|
24
|
+
utilization: z.number().nullable(),
|
|
25
|
+
currency: z.string().nullable().optional(),
|
|
26
|
+
// Claude Code 2.1.209 added decimal_places, disabled_reason, daily and
|
|
27
|
+
// weekly here. Keep the fields we consume strict while allowing additive
|
|
28
|
+
// billing detail at this exact envelope; none of it has Codex semantics.
|
|
29
|
+
}).passthrough().nullable().optional(),
|
|
30
|
+
// Claude's usage endpoint adds experimental/codename windows plus limits,
|
|
31
|
+
// spend and dashboard metadata here. Known windows remain strictly validated
|
|
32
|
+
// by their schemas above; unknown siblings are deliberately ignored.
|
|
33
|
+
}).passthrough();
|
|
34
|
+
const usageSchema = z.object({
|
|
35
|
+
session: z.object({
|
|
36
|
+
total_cost_usd: z.number(),
|
|
37
|
+
total_api_duration_ms: z.number(),
|
|
38
|
+
total_duration_ms: z.number(),
|
|
39
|
+
total_lines_added: z.number(),
|
|
40
|
+
total_lines_removed: z.number(),
|
|
41
|
+
model_usage: z.record(z.string(), z.unknown()),
|
|
42
|
+
}).strict(),
|
|
43
|
+
subscription_type: z.string().nullable(),
|
|
44
|
+
rate_limits_available: z.boolean(),
|
|
45
|
+
rate_limits: rateLimitsSchema.nullable(),
|
|
46
|
+
// Claude Code 2.1.209 adds account behavior analytics beside usage. It has no
|
|
47
|
+
// rate-limit semantics, so accept it only at its observed top-level location.
|
|
48
|
+
behaviors: z.unknown().optional(),
|
|
49
|
+
// Sanitized protocol fixtures carry capture provenance beside the raw shape.
|
|
50
|
+
capture: z.object({
|
|
51
|
+
agentSdkVersion: z.string(),
|
|
52
|
+
claudeCodeVersion: z.string(),
|
|
53
|
+
modelPromptsSubmitted: z.number().int().nonnegative(),
|
|
54
|
+
note: z.string(),
|
|
55
|
+
}).strict().optional(),
|
|
56
|
+
}).strict();
|
|
57
|
+
export class ClaudeUsageSchemaError extends Error {
|
|
58
|
+
constructor(message) {
|
|
59
|
+
super(message);
|
|
60
|
+
this.name = "ClaudeUsageSchemaError";
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
function percent(value) {
|
|
64
|
+
return value === null ? null : Math.max(0, Math.min(100, value));
|
|
65
|
+
}
|
|
66
|
+
function resetSeconds(value) {
|
|
67
|
+
if (value === null)
|
|
68
|
+
return null;
|
|
69
|
+
const millis = Date.parse(value);
|
|
70
|
+
if (!Number.isFinite(millis))
|
|
71
|
+
throw new ClaudeUsageSchemaError(`Malformed Claude rate-limit reset timestamp '${value}'.`);
|
|
72
|
+
return Math.floor(millis / 1_000);
|
|
73
|
+
}
|
|
74
|
+
function eventResetSeconds(value) {
|
|
75
|
+
if (value === undefined)
|
|
76
|
+
return null;
|
|
77
|
+
if (!Number.isFinite(value) || value < 0)
|
|
78
|
+
throw new ClaudeUsageSchemaError(`Malformed Claude rate-limit reset value '${value}'.`);
|
|
79
|
+
return Math.floor(value > 10_000_000_000 ? value / 1_000 : value);
|
|
80
|
+
}
|
|
81
|
+
function window(value, duration) {
|
|
82
|
+
if (!value)
|
|
83
|
+
return null;
|
|
84
|
+
return { usedPercent: percent(value.utilization), windowDurationMins: duration, resetsAt: resetSeconds(value.resets_at) };
|
|
85
|
+
}
|
|
86
|
+
function plan(value) {
|
|
87
|
+
if (value === "pro" || value === "team" || value === "enterprise")
|
|
88
|
+
return value;
|
|
89
|
+
return "unknown";
|
|
90
|
+
}
|
|
91
|
+
function slug(value) {
|
|
92
|
+
const normalized = value.normalize("NFKD").toLowerCase().replace(/[^a-z0-9]+/g, "-").replace(/^-|-$/g, "");
|
|
93
|
+
return normalized || "unknown";
|
|
94
|
+
}
|
|
95
|
+
function snapshot(limitId, limitName, primary, secondary, planType) {
|
|
96
|
+
return {
|
|
97
|
+
limitId, limitName, primary, secondary, credits: null, individualLimit: null, planType, rateLimitReachedType: null,
|
|
98
|
+
};
|
|
99
|
+
}
|
|
100
|
+
export function unavailableClaudeRateLimits() {
|
|
101
|
+
const aggregate = snapshot("claude", "Claude (unavailable)", null, null, "unknown");
|
|
102
|
+
return { rateLimits: aggregate, rateLimitsByLimitId: { claude: aggregate }, rateLimitResetCredits: null };
|
|
103
|
+
}
|
|
104
|
+
export function mapClaudeUsage(raw) {
|
|
105
|
+
const parsed = usageSchema.safeParse(raw);
|
|
106
|
+
if (!parsed.success)
|
|
107
|
+
throw new ClaudeUsageSchemaError(`Claude experimental usage schema mismatch: ${z.prettifyError(parsed.error)}`);
|
|
108
|
+
const usage = parsed.data;
|
|
109
|
+
if (!usage.rate_limits_available)
|
|
110
|
+
return unavailableClaudeRateLimits();
|
|
111
|
+
if (!usage.rate_limits)
|
|
112
|
+
throw new ClaudeUsageSchemaError("Claude reported rate_limits_available=true without rate_limits.");
|
|
113
|
+
const mappedPlan = plan(usage.subscription_type);
|
|
114
|
+
const aggregate = snapshot("claude", "Claude", window(usage.rate_limits.five_hour, 300), window(usage.rate_limits.seven_day, 10_080), mappedPlan);
|
|
115
|
+
const buckets = { claude: aggregate };
|
|
116
|
+
const add = (id, name, value) => {
|
|
117
|
+
if (value)
|
|
118
|
+
buckets[id] = snapshot(id, name, window(value, 10_080), null, mappedPlan);
|
|
119
|
+
};
|
|
120
|
+
add("claude-seven-day-opus", "Claude Opus · 7 day", usage.rate_limits.seven_day_opus);
|
|
121
|
+
add("claude-seven-day-sonnet", "Claude Sonnet · 7 day", usage.rate_limits.seven_day_sonnet);
|
|
122
|
+
add("claude-oauth-apps", "Claude OAuth apps · 7 day", usage.rate_limits.seven_day_oauth_apps);
|
|
123
|
+
for (const value of usage.rate_limits.model_scoped ?? []) {
|
|
124
|
+
const id = `claude-model-${slug(value.display_name)}`;
|
|
125
|
+
if (buckets[id])
|
|
126
|
+
throw new ClaudeUsageSchemaError(`Duplicate Claude model-scoped rate-limit id '${id}'.`);
|
|
127
|
+
buckets[id] = snapshot(id, `Claude ${value.display_name} · 7 day`, window(value, 10_080), null, mappedPlan);
|
|
128
|
+
}
|
|
129
|
+
return { rateLimits: aggregate, rateLimitsByLimitId: buckets, rateLimitResetCredits: null };
|
|
130
|
+
}
|
|
131
|
+
function hasRateLimitWindows(response) {
|
|
132
|
+
return Object.values(response.rateLimitsByLimitId)
|
|
133
|
+
.some((bucket) => bucket.primary !== null || bucket.secondary !== null);
|
|
134
|
+
}
|
|
135
|
+
export class ClaudeRateLimitCoordinator {
|
|
136
|
+
logger;
|
|
137
|
+
sources = new Map();
|
|
138
|
+
listeners = new Map();
|
|
139
|
+
ttlMs;
|
|
140
|
+
staleTtlMs;
|
|
141
|
+
now;
|
|
142
|
+
nextGeneration = 0;
|
|
143
|
+
cache;
|
|
144
|
+
inFlight;
|
|
145
|
+
unavailableReason = "No authenticated Claude runtime is loaded.";
|
|
146
|
+
constructor(logger, options = {}) {
|
|
147
|
+
this.logger = logger;
|
|
148
|
+
this.ttlMs = options.ttlMs ?? 60_000;
|
|
149
|
+
this.staleTtlMs = options.staleTtlMs ?? 120_000;
|
|
150
|
+
this.now = options.now ?? Date.now;
|
|
151
|
+
}
|
|
152
|
+
register(source) {
|
|
153
|
+
const generation = ++this.nextGeneration;
|
|
154
|
+
this.sources.set(generation, source);
|
|
155
|
+
// A newly authenticated Query may belong to a changed Claude account.
|
|
156
|
+
// Force the next status read through the account-level control surface.
|
|
157
|
+
this.cache = undefined;
|
|
158
|
+
this.inFlight = undefined;
|
|
159
|
+
this.unavailableReason = "Claude usage has not been loaded from the authenticated runtime yet.";
|
|
160
|
+
return generation;
|
|
161
|
+
}
|
|
162
|
+
unregister(generation) {
|
|
163
|
+
this.sources.delete(generation);
|
|
164
|
+
}
|
|
165
|
+
subscribe(connectionId, listener) {
|
|
166
|
+
this.listeners.set(connectionId, listener);
|
|
167
|
+
}
|
|
168
|
+
get hasLiveSource() {
|
|
169
|
+
return this.sources.size > 0;
|
|
170
|
+
}
|
|
171
|
+
unsubscribe(connectionId) {
|
|
172
|
+
this.listeners.delete(connectionId);
|
|
173
|
+
}
|
|
174
|
+
invalidate(reason) {
|
|
175
|
+
this.nextGeneration += 1;
|
|
176
|
+
this.cache = undefined;
|
|
177
|
+
this.inFlight = undefined;
|
|
178
|
+
this.unavailableReason = `Claude authentication changed (${reason}).`;
|
|
179
|
+
this.logger.warn("claude.rate-limits.invalidated", { reason });
|
|
180
|
+
}
|
|
181
|
+
async read() {
|
|
182
|
+
const cached = this.cache;
|
|
183
|
+
if (cached?.complete && this.now() - cached.fetchedAt <= this.ttlMs)
|
|
184
|
+
return cached.response;
|
|
185
|
+
if (this.inFlight)
|
|
186
|
+
return this.inFlight;
|
|
187
|
+
const refresh = this.refresh();
|
|
188
|
+
this.inFlight = refresh;
|
|
189
|
+
try {
|
|
190
|
+
return await refresh;
|
|
191
|
+
}
|
|
192
|
+
finally {
|
|
193
|
+
if (this.inFlight === refresh)
|
|
194
|
+
this.inFlight = undefined;
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
async readStatus() {
|
|
198
|
+
const rateLimits = await this.read();
|
|
199
|
+
return {
|
|
200
|
+
rateLimits,
|
|
201
|
+
unavailableReason: hasRateLimitWindows(rateLimits)
|
|
202
|
+
? null
|
|
203
|
+
: this.unavailableReason ?? "Claude returned no usable rate-limit data.",
|
|
204
|
+
};
|
|
205
|
+
}
|
|
206
|
+
cached() {
|
|
207
|
+
const cache = this.cache;
|
|
208
|
+
return cache && this.now() - cache.fetchedAt <= this.staleTtlMs ? cache.response : unavailableClaudeRateLimits();
|
|
209
|
+
}
|
|
210
|
+
mergeEvent(generation, info) {
|
|
211
|
+
if (!this.sources.has(generation)) {
|
|
212
|
+
this.logger.debug("claude.rate-limits.stale-event", { generation });
|
|
213
|
+
return;
|
|
214
|
+
}
|
|
215
|
+
const target = eventTarget(info.rateLimitType);
|
|
216
|
+
if (!target)
|
|
217
|
+
return;
|
|
218
|
+
const response = structuredClone(this.cached());
|
|
219
|
+
const bucket = response.rateLimitsByLimitId[target.id]
|
|
220
|
+
?? snapshot(target.id, target.name, null, null, response.rateLimits.planType);
|
|
221
|
+
const current = target.secondary ? response.rateLimits.secondary : bucket.primary;
|
|
222
|
+
const incoming = {
|
|
223
|
+
usedPercent: info.utilization === undefined ? current?.usedPercent ?? null : percent(info.utilization),
|
|
224
|
+
windowDurationMins: target.duration,
|
|
225
|
+
resetsAt: info.resetsAt === undefined ? current?.resetsAt ?? null : eventResetSeconds(info.resetsAt),
|
|
226
|
+
};
|
|
227
|
+
if (current && incoming.resetsAt !== null && current.resetsAt !== null) {
|
|
228
|
+
if (incoming.resetsAt < current.resetsAt)
|
|
229
|
+
return;
|
|
230
|
+
if (incoming.resetsAt === current.resetsAt && incoming.usedPercent !== null && current.usedPercent !== null
|
|
231
|
+
&& incoming.usedPercent < current.usedPercent)
|
|
232
|
+
return;
|
|
233
|
+
}
|
|
234
|
+
const previousReached = target.id === "claude" ? response.rateLimits.rateLimitReachedType : bucket.rateLimitReachedType;
|
|
235
|
+
const reached = info.status === "rejected"
|
|
236
|
+
? "rate_limit_reached"
|
|
237
|
+
: previousReached;
|
|
238
|
+
if (target.id === "claude" && target.secondary) {
|
|
239
|
+
response.rateLimits = { ...response.rateLimits, limitName: "Claude", secondary: incoming, rateLimitReachedType: reached };
|
|
240
|
+
}
|
|
241
|
+
else {
|
|
242
|
+
const next = { ...bucket, limitName: target.name, primary: incoming, rateLimitReachedType: reached };
|
|
243
|
+
response.rateLimitsByLimitId[target.id] = next;
|
|
244
|
+
if (target.id === "claude")
|
|
245
|
+
response.rateLimits = next;
|
|
246
|
+
}
|
|
247
|
+
response.rateLimitsByLimitId.claude = response.rateLimits;
|
|
248
|
+
this.cache = {
|
|
249
|
+
response,
|
|
250
|
+
fetchedAt: this.now(),
|
|
251
|
+
subscriptionType: this.cache?.subscriptionType ?? null,
|
|
252
|
+
complete: this.cache?.complete ?? false,
|
|
253
|
+
};
|
|
254
|
+
if (hasRateLimitWindows(response))
|
|
255
|
+
this.unavailableReason = null;
|
|
256
|
+
for (const listener of this.listeners.values())
|
|
257
|
+
listener(response);
|
|
258
|
+
}
|
|
259
|
+
async refresh() {
|
|
260
|
+
const attemptGeneration = this.nextGeneration;
|
|
261
|
+
const candidates = [...this.sources.entries()].sort(([a], [b]) => b - a);
|
|
262
|
+
if (candidates.length === 0) {
|
|
263
|
+
this.unavailableReason = "No authenticated Claude runtime is loaded.";
|
|
264
|
+
this.logger.warn("claude.rate-limits.unavailable", { reason: "no-live-runtime" });
|
|
265
|
+
return this.staleOrUnavailable();
|
|
266
|
+
}
|
|
267
|
+
let lastError;
|
|
268
|
+
for (const [generation, source] of candidates) {
|
|
269
|
+
try {
|
|
270
|
+
const raw = await source.usage_EXPERIMENTAL_MAY_CHANGE_DO_NOT_RELY_ON_THIS_API_YET();
|
|
271
|
+
if (attemptGeneration !== this.nextGeneration || !this.sources.has(generation)) {
|
|
272
|
+
this.logger.debug("claude.rate-limits.stale-refresh", { generation });
|
|
273
|
+
return this.staleOrUnavailable();
|
|
274
|
+
}
|
|
275
|
+
const response = mapClaudeUsage(raw);
|
|
276
|
+
const parsedUsage = usageSchema.parse(raw);
|
|
277
|
+
const subscriptionType = parsedUsage.subscription_type;
|
|
278
|
+
if (this.cache?.subscriptionType !== undefined && this.cache.subscriptionType !== subscriptionType) {
|
|
279
|
+
this.logger.info("claude.rate-limits.account-changed", {
|
|
280
|
+
previousSubscriptionType: this.cache.subscriptionType,
|
|
281
|
+
subscriptionType,
|
|
282
|
+
});
|
|
283
|
+
}
|
|
284
|
+
this.cache = { response, fetchedAt: this.now(), subscriptionType, complete: true };
|
|
285
|
+
this.unavailableReason = parsedUsage.rate_limits_available
|
|
286
|
+
? hasRateLimitWindows(response) ? null : "Claude returned no rate-limit windows."
|
|
287
|
+
: "Claude reports that rate-limit data is unavailable for this account.";
|
|
288
|
+
return response;
|
|
289
|
+
}
|
|
290
|
+
catch (error) {
|
|
291
|
+
lastError = error;
|
|
292
|
+
if (error instanceof ClaudeUsageSchemaError) {
|
|
293
|
+
this.cache = undefined;
|
|
294
|
+
this.unavailableReason = error.message;
|
|
295
|
+
this.logger.error("claude.rate-limits.schema-mismatch", { error: error.message });
|
|
296
|
+
return unavailableClaudeRateLimits();
|
|
297
|
+
}
|
|
298
|
+
}
|
|
299
|
+
}
|
|
300
|
+
this.unavailableReason = lastError instanceof Error
|
|
301
|
+
? `Claude usage request failed: ${lastError.message}`
|
|
302
|
+
: `Claude usage request failed: ${String(lastError)}`;
|
|
303
|
+
this.logger.warn("claude.rate-limits.refresh-failed", { error: lastError instanceof Error ? lastError.message : String(lastError) });
|
|
304
|
+
return this.staleOrUnavailable();
|
|
305
|
+
}
|
|
306
|
+
staleOrUnavailable() {
|
|
307
|
+
const cache = this.cache;
|
|
308
|
+
if (cache && this.now() - cache.fetchedAt <= this.staleTtlMs)
|
|
309
|
+
return cache.response;
|
|
310
|
+
return unavailableClaudeRateLimits();
|
|
311
|
+
}
|
|
312
|
+
}
|
|
313
|
+
function eventTarget(type) {
|
|
314
|
+
switch (type) {
|
|
315
|
+
case "five_hour": return { id: "claude", name: "Claude", duration: 300, secondary: false };
|
|
316
|
+
case "seven_day": return { id: "claude", name: "Claude", duration: 10_080, secondary: true };
|
|
317
|
+
case "seven_day_opus": return { id: "claude-seven-day-opus", name: "Claude Opus · 7 day", duration: 10_080, secondary: false };
|
|
318
|
+
case "seven_day_sonnet": return { id: "claude-seven-day-sonnet", name: "Claude Sonnet · 7 day", duration: 10_080, secondary: false };
|
|
319
|
+
default: return undefined;
|
|
320
|
+
}
|
|
321
|
+
}
|
|
322
|
+
export function rateLimitNotifications(response) {
|
|
323
|
+
const aggregate = response.rateLimits;
|
|
324
|
+
const buckets = Object.values(response.rateLimitsByLimitId)
|
|
325
|
+
.filter((rateLimits) => rateLimits.limitId !== aggregate.limitId);
|
|
326
|
+
return [...buckets, aggregate].map((rateLimits) => ({
|
|
327
|
+
method: "account/rateLimits/updated", params: { rateLimits },
|
|
328
|
+
}));
|
|
329
|
+
}
|
|
330
|
+
//# sourceMappingURL=rateLimits.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rateLimits.js","sourceRoot":"","sources":["../../src/claude/rateLimits.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { RESPONSE_ITEM_IMAGE_FIELDS, RESPONSE_ITEM_KNOWN_TYPES, RESPONSE_ITEM_SCHEMA_JSON, WEB_SEARCH_ACTION_KNOWN_TYPES, } from "../codex/generated/ResponseItemRuntimeSchema.js";
|
|
3
|
+
import { invalidRequest } from "../protocol/errors.js";
|
|
4
|
+
const responseItem = z.fromJSONSchema(JSON.parse(RESPONSE_ITEM_SCHEMA_JSON));
|
|
5
|
+
const knownTypes = new Set(RESPONSE_ITEM_KNOWN_TYPES);
|
|
6
|
+
const knownWebSearchActions = new Set(WEB_SEARCH_ACTION_KNOWN_TYPES);
|
|
7
|
+
const imageFields = RESPONSE_ITEM_IMAGE_FIELDS;
|
|
8
|
+
function record(value) {
|
|
9
|
+
return Boolean(value) && typeof value === "object" && !Array.isArray(value);
|
|
10
|
+
}
|
|
11
|
+
function normalized(item) {
|
|
12
|
+
if (!record(item) || typeof item.type !== "string" || item.type !== "web_search_call"
|
|
13
|
+
|| !record(item.action) || typeof item.action.type !== "string"
|
|
14
|
+
|| knownWebSearchActions.has(item.action.type))
|
|
15
|
+
return item;
|
|
16
|
+
return { ...item, action: { ...item.action, type: "other" } };
|
|
17
|
+
}
|
|
18
|
+
function hasRemoteImage(item) {
|
|
19
|
+
return (imageFields[item.type] ?? []).some((field) => {
|
|
20
|
+
const content = item[field];
|
|
21
|
+
return Array.isArray(content) && content.some((entry) => record(entry) && entry.type === "input_image"
|
|
22
|
+
&& typeof entry.image_url === "string" && /^https?:/iu.test(entry.image_url));
|
|
23
|
+
});
|
|
24
|
+
}
|
|
25
|
+
export function validateResponseItems(items) {
|
|
26
|
+
if (items.length === 0)
|
|
27
|
+
throw invalidRequest("items must not be empty");
|
|
28
|
+
for (const [index, item] of items.entries()) {
|
|
29
|
+
if (record(item) && typeof item.type === "string" && !knownTypes.has(item.type))
|
|
30
|
+
continue;
|
|
31
|
+
const parsed = responseItem.safeParse(normalized(item));
|
|
32
|
+
if (!parsed.success) {
|
|
33
|
+
throw invalidRequest(`items[${index}] is not a valid response item: ${z.prettifyError(parsed.error)}`);
|
|
34
|
+
}
|
|
35
|
+
if (record(item) && hasRemoteImage(item)) {
|
|
36
|
+
throw invalidRequest("remote image URLs are not supported; use an inline data URL instead");
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
//# sourceMappingURL=responseItemValidation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"responseItemValidation.js","sourceRoot":"","sources":["../../src/claude/responseItemValidation.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,9 +1,15 @@
|
|
|
1
|
-
import type { SDKResultMessage } from "@anthropic-ai/claude-agent-sdk";
|
|
2
1
|
import type { CodexErrorInfo } from "../codex/generated/v2/CodexErrorInfo.js";
|
|
3
2
|
export interface ClaudeResultClassification {
|
|
4
3
|
readonly status: "completed" | "interrupted" | "failed";
|
|
5
4
|
readonly error?: string;
|
|
6
5
|
readonly codexErrorInfo?: CodexErrorInfo;
|
|
7
6
|
}
|
|
7
|
+
export interface ClaudeResultInput {
|
|
8
|
+
readonly subtype: string;
|
|
9
|
+
readonly is_error?: boolean;
|
|
10
|
+
readonly result?: string;
|
|
11
|
+
readonly errors?: readonly string[];
|
|
12
|
+
readonly terminal_reason?: string | null;
|
|
13
|
+
}
|
|
8
14
|
export declare function classifyClaudeRuntimeError(message: string): CodexErrorInfo;
|
|
9
|
-
export declare function classifyClaudeResult(message:
|
|
15
|
+
export declare function classifyClaudeResult(message: ClaudeResultInput, providerError?: string): ClaudeResultClassification;
|
|
@@ -36,7 +36,7 @@ export function classifyClaudeResult(message, providerError) {
|
|
|
36
36
|
return { status: "completed" };
|
|
37
37
|
const errors = message.subtype === "success"
|
|
38
38
|
? [providerError, message.result].filter((value) => Boolean(value))
|
|
39
|
-
: message.errors;
|
|
39
|
+
: message.errors ?? [];
|
|
40
40
|
const interrupted = message.terminal_reason === "aborted_tools" || message.terminal_reason === "aborted_streaming" ||
|
|
41
41
|
errors.some((value) => value.toLocaleLowerCase().includes("interrupt") || value.toLocaleLowerCase().includes("abort"));
|
|
42
42
|
const error = errors[0];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"resultClassifier.js","sourceRoot":"","sources":["../../src/claude/resultClassifier.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"resultClassifier.js","sourceRoot":"","sources":["../../src/claude/resultClassifier.ts"],"names":[],"mappings":"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"}
|