@gkorepanov/ccodex 0.3.0 → 0.4.1

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.
Files changed (210) hide show
  1. package/README.md +139 -63
  2. package/assets/ccodex/goals/continuation.md +1 -0
  3. package/{compatibility.json → config/compatibility.json} +5 -6
  4. package/dist/claude/asyncQueue.d.ts +3 -0
  5. package/dist/claude/asyncQueue.js +13 -2
  6. package/dist/claude/asyncQueue.js.map +1 -1
  7. package/dist/claude/commandActions.d.ts +6 -0
  8. package/dist/claude/commandActions.js +57 -0
  9. package/dist/claude/commandActions.js.map +1 -0
  10. package/dist/claude/compactCommand.d.ts +2 -0
  11. package/dist/claude/compactCommand.js +7 -0
  12. package/dist/claude/compactCommand.js.map +1 -0
  13. package/dist/claude/goalTools.d.ts +15 -0
  14. package/dist/claude/goalTools.js +128 -0
  15. package/dist/claude/goalTools.js.map +1 -0
  16. package/dist/claude/hookMapper.d.ts +17 -4
  17. package/dist/claude/hookMapper.js +7 -5
  18. package/dist/claude/hookMapper.js.map +1 -1
  19. package/dist/claude/inputMapper.d.ts +1 -0
  20. package/dist/claude/inputMapper.js +1 -0
  21. package/dist/claude/inputMapper.js.map +1 -1
  22. package/dist/claude/rateLimits.d.ts +72 -0
  23. package/dist/claude/rateLimits.js +330 -0
  24. package/dist/claude/rateLimits.js.map +1 -0
  25. package/dist/claude/responseItemValidation.d.ts +2 -0
  26. package/dist/claude/responseItemValidation.js +40 -0
  27. package/dist/claude/responseItemValidation.js.map +1 -0
  28. package/dist/claude/resultClassifier.d.ts +8 -2
  29. package/dist/claude/resultClassifier.js +9 -1
  30. package/dist/claude/resultClassifier.js.map +1 -1
  31. package/dist/claude/service.d.ts +116 -29
  32. package/dist/claude/service.js +1337 -680
  33. package/dist/claude/service.js.map +1 -1
  34. package/dist/claude/session/backgroundOutput.d.ts +2 -0
  35. package/dist/claude/session/backgroundOutput.js +29 -0
  36. package/dist/claude/session/backgroundOutput.js.map +1 -0
  37. package/dist/claude/session/commands.d.ts +862 -0
  38. package/dist/claude/session/commands.js +2 -0
  39. package/dist/claude/session/commands.js.map +1 -0
  40. package/dist/claude/session/goalState.d.ts +49 -0
  41. package/dist/claude/session/goalState.js +407 -0
  42. package/dist/claude/session/goalState.js.map +1 -0
  43. package/dist/claude/session/mailbox.d.ts +52 -0
  44. package/dist/claude/session/mailbox.js +190 -0
  45. package/dist/claude/session/mailbox.js.map +1 -0
  46. package/dist/claude/session/outputAdapter.d.ts +11 -0
  47. package/dist/claude/session/outputAdapter.js +31 -0
  48. package/dist/claude/session/outputAdapter.js.map +1 -0
  49. package/dist/claude/session/permissionUpdates.d.ts +4 -0
  50. package/dist/claude/session/permissionUpdates.js +17 -0
  51. package/dist/claude/session/permissionUpdates.js.map +1 -0
  52. package/dist/claude/session/providerFacts.d.ts +47 -0
  53. package/dist/claude/session/providerFacts.js +84 -0
  54. package/dist/claude/session/providerFacts.js.map +1 -0
  55. package/dist/claude/session/providerRuntime.d.ts +1 -0
  56. package/dist/claude/session/providerRuntime.js +2 -0
  57. package/dist/claude/session/providerRuntime.js.map +1 -0
  58. package/dist/claude/session/providerRuntimeFactory.d.ts +49 -0
  59. package/dist/claude/session/providerRuntimeFactory.js +122 -0
  60. package/dist/claude/session/providerRuntimeFactory.js.map +1 -0
  61. package/dist/claude/session/repository.d.ts +57 -0
  62. package/dist/claude/session/repository.js +161 -0
  63. package/dist/claude/session/repository.js.map +1 -0
  64. package/dist/claude/session/runtime.d.ts +46 -0
  65. package/dist/claude/session/runtime.js +140 -0
  66. package/dist/claude/session/runtime.js.map +1 -0
  67. package/dist/claude/session/scopeState.d.ts +61 -0
  68. package/dist/claude/session/scopeState.js +74 -0
  69. package/dist/claude/session/scopeState.js.map +1 -0
  70. package/dist/claude/session/session.d.ts +285 -0
  71. package/dist/claude/session/session.js +6778 -0
  72. package/dist/claude/session/session.js.map +1 -0
  73. package/dist/claude/session/shellRunner.d.ts +13 -0
  74. package/dist/claude/session/shellRunner.js +103 -0
  75. package/dist/claude/session/shellRunner.js.map +1 -0
  76. package/dist/claude/session/usage.d.ts +2 -0
  77. package/dist/claude/session/usage.js +10 -0
  78. package/dist/claude/session/usage.js.map +1 -0
  79. package/dist/claude/sessionRegistry.d.ts +26 -0
  80. package/dist/claude/sessionRegistry.js +118 -0
  81. package/dist/claude/sessionRegistry.js.map +1 -0
  82. package/dist/claude/shellSupervisor.d.ts +1 -0
  83. package/dist/claude/shellSupervisor.js +69 -0
  84. package/dist/claude/shellSupervisor.js.map +1 -0
  85. package/dist/claude/statusCommand.d.ts +21 -0
  86. package/dist/claude/statusCommand.js +97 -0
  87. package/dist/claude/statusCommand.js.map +1 -0
  88. package/dist/claude/toolMapper.d.ts +9 -1
  89. package/dist/claude/toolMapper.js +98 -18
  90. package/dist/claude/toolMapper.js.map +1 -1
  91. package/dist/claude/transcriptBrancher.d.ts +37 -0
  92. package/dist/claude/transcriptBrancher.js +103 -0
  93. package/dist/claude/transcriptBrancher.js.map +1 -0
  94. package/dist/cli/delegate.js +23 -1
  95. package/dist/cli/delegate.js.map +1 -1
  96. package/dist/cli/main.js +28 -12
  97. package/dist/cli/main.js.map +1 -1
  98. package/dist/codex/generated/ResponseItemRuntimeSchema.d.ts +8 -0
  99. package/dist/codex/generated/ResponseItemRuntimeSchema.js +7 -0
  100. package/dist/codex/generated/ResponseItemRuntimeSchema.js.map +1 -0
  101. package/dist/compatibility/probe.js +12 -7
  102. package/dist/compatibility/probe.js.map +1 -1
  103. package/dist/config/config.d.ts +12 -0
  104. package/dist/config/config.js +103 -11
  105. package/dist/config/config.js.map +1 -1
  106. package/dist/daemon/daemon.js +91 -43
  107. package/dist/daemon/daemon.js.map +1 -1
  108. package/dist/daemon/ownership.d.ts +15 -0
  109. package/dist/daemon/ownership.js +185 -0
  110. package/dist/daemon/ownership.js.map +1 -0
  111. package/dist/daemon/probe.js +1 -1
  112. package/dist/daemon/supervisor.d.ts +3 -0
  113. package/dist/daemon/supervisor.js +37 -1
  114. package/dist/daemon/supervisor.js.map +1 -1
  115. package/dist/gateway/clientConnection.d.ts +7 -1
  116. package/dist/gateway/clientConnection.js +656 -60
  117. package/dist/gateway/clientConnection.js.map +1 -1
  118. package/dist/gateway/logicalThreadProjection.d.ts +8 -0
  119. package/dist/gateway/logicalThreadProjection.js +59 -0
  120. package/dist/gateway/logicalThreadProjection.js.map +1 -0
  121. package/dist/gateway/remoteRelay.js +0 -1
  122. package/dist/gateway/remoteRelay.js.map +1 -1
  123. package/dist/gateway/server.d.ts +1 -1
  124. package/dist/gateway/server.js +69 -11
  125. package/dist/gateway/server.js.map +1 -1
  126. package/dist/gateway/stockRpc.d.ts +5 -2
  127. package/dist/gateway/stockRpc.js +52 -6
  128. package/dist/gateway/stockRpc.js.map +1 -1
  129. package/dist/gateway/subscriptions.d.ts +19 -3
  130. package/dist/gateway/subscriptions.js +152 -13
  131. package/dist/gateway/subscriptions.js.map +1 -1
  132. package/dist/gateway/threadList.d.ts +7 -2
  133. package/dist/gateway/threadList.js +8 -4
  134. package/dist/gateway/threadList.js.map +1 -1
  135. package/dist/gateway/transientNotice.d.ts +15 -0
  136. package/dist/gateway/transientNotice.js +96 -1
  137. package/dist/gateway/transientNotice.js.map +1 -1
  138. package/dist/handoff/providerEpochs.d.ts +18 -0
  139. package/dist/handoff/providerEpochs.js +77 -0
  140. package/dist/handoff/providerEpochs.js.map +1 -0
  141. package/dist/handoff/service.d.ts +86 -6
  142. package/dist/handoff/service.js +1276 -168
  143. package/dist/handoff/service.js.map +1 -1
  144. package/dist/handoff/store.d.ts +189 -2
  145. package/dist/handoff/store.js +618 -7
  146. package/dist/handoff/store.js.map +1 -1
  147. package/dist/handoff/titleGeneration.d.ts +28 -0
  148. package/dist/handoff/titleGeneration.js +138 -0
  149. package/dist/handoff/titleGeneration.js.map +1 -0
  150. package/dist/management/doctor.d.ts +1 -1
  151. package/dist/management/doctor.js +32 -23
  152. package/dist/management/doctor.js.map +1 -1
  153. package/dist/management/lifecycle.js +14 -2
  154. package/dist/management/lifecycle.js.map +1 -1
  155. package/dist/management/remoteShim.d.ts +10 -0
  156. package/dist/management/remoteShim.js +65 -0
  157. package/dist/management/remoteShim.js.map +1 -0
  158. package/dist/management/setup.d.ts +5 -0
  159. package/dist/management/setup.js +122 -41
  160. package/dist/management/setup.js.map +1 -1
  161. package/dist/management/shimSelect.d.ts +3 -0
  162. package/dist/management/shimSelect.js +49 -0
  163. package/dist/management/shimSelect.js.map +1 -0
  164. package/dist/management/shims.d.ts +5 -0
  165. package/dist/management/shims.js +59 -0
  166. package/dist/management/shims.js.map +1 -0
  167. package/dist/observability/metrics.d.ts +2 -0
  168. package/dist/observability/metrics.js +6 -0
  169. package/dist/observability/metrics.js.map +1 -1
  170. package/dist/protocol/errors.d.ts +1 -0
  171. package/dist/protocol/errors.js +4 -1
  172. package/dist/protocol/errors.js.map +1 -1
  173. package/dist/runtime/dependencies.js +3 -3
  174. package/dist/runtime/dependencies.js.map +1 -1
  175. package/dist/runtime/providerAvailability.d.ts +24 -0
  176. package/dist/runtime/providerAvailability.js +107 -0
  177. package/dist/runtime/providerAvailability.js.map +1 -0
  178. package/dist/state/stateCommand.d.ts +21 -0
  179. package/dist/state/stateCommand.js +198 -0
  180. package/dist/state/stateCommand.js.map +1 -0
  181. package/dist/state/stockStateTracker.d.ts +16 -0
  182. package/dist/state/stockStateTracker.js +137 -0
  183. package/dist/state/stockStateTracker.js.map +1 -0
  184. package/dist/store/HybridStore.d.ts +118 -2
  185. package/dist/store/HybridStore.js +23 -1
  186. package/dist/store/HybridStore.js.map +1 -1
  187. package/dist/store/memoryStore.d.ts +57 -7
  188. package/dist/store/memoryStore.js +337 -5
  189. package/dist/store/memoryStore.js.map +1 -1
  190. package/dist/store/sqliteStore.d.ts +30 -4
  191. package/dist/store/sqliteStore.js +395 -42
  192. package/dist/store/sqliteStore.js.map +1 -1
  193. package/examples/config.toml +35 -0
  194. package/{LICENSES.md → legal/LICENSES.md} +2 -2
  195. package/{THIRD_PARTY_NOTICES.md → legal/THIRD_PARTY_NOTICES.md} +177 -148
  196. package/package.json +36 -24
  197. package/{install.sh → scripts/install.sh} +2 -2
  198. package/scripts/postinstall.mjs +10 -0
  199. package/vendor/codex/continuation.md +51 -0
  200. package/BUILD_BENCHMARKS.md +0 -27
  201. package/RELEASING.md +0 -98
  202. package/SSH_VERIFY.md +0 -69
  203. package/config.example.toml +0 -20
  204. package/dist/claude/interactions.d.ts +0 -23
  205. package/dist/claude/interactions.js +0 -77
  206. package/dist/claude/interactions.js.map +0 -1
  207. package/dist/claude/sessionRuntime.d.ts +0 -102
  208. package/dist/claude/sessionRuntime.js +0 -1361
  209. package/dist/claude/sessionRuntime.js.map +0 -1
  210. /package/{uninstall.sh → scripts/uninstall.sh} +0 -0
@@ -1 +1 @@
1
- {"version":3,"file":"hookMapper.js","sourceRoot":"","sources":["../../src/claude/hookMapper.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"hookMapper.js","sourceRoot":"","sources":["../../src/claude/hookMapper.ts"],"names":[],"mappings":"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"}
@@ -3,6 +3,7 @@ import type { UserInput } from "../codex/generated/v2/UserInput.js";
3
3
  interface InputContext {
4
4
  readonly cwd: string;
5
5
  readonly sandboxPolicy: unknown;
6
+ readonly origin?: "human";
6
7
  }
7
8
  export declare function mapUserInput(input: readonly UserInput[], uuid?: string, context?: InputContext): Promise<SDKUserMessage>;
8
9
  export {};
@@ -62,6 +62,7 @@ export async function mapUserInput(input, uuid, context) {
62
62
  session_id: "",
63
63
  parent_tool_use_id: null,
64
64
  ...(uuid ? { uuid } : {}),
65
+ ...(context?.origin === "human" ? { origin: { kind: "human" } } : {}),
65
66
  message: { role: "user", content },
66
67
  };
67
68
  }
@@ -1 +1 @@
1
- {"version":3,"file":"inputMapper.js","sourceRoot":"","sources":["../../src/claude/inputMapper.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"inputMapper.js","sourceRoot":"","sources":["../../src/claude/inputMapper.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,2 @@
1
+ import type { JsonValue } from "../codex/generated/serde_json/JsonValue.js";
2
+ export declare function validateResponseItems(items: JsonValue[]): void;
@@ -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: SDKResultMessage, providerError?: string): ClaudeResultClassification;
15
+ export declare function classifyClaudeResult(message: ClaudeResultInput, providerError?: string): ClaudeResultClassification;
@@ -1,3 +1,4 @@
1
+ import { ORG_POLICY_LIMIT_PREFIXES, USAGE_LIMIT_ERROR_PREFIXES, USAGE_TRANSITION_PREFIXES, USAGE_WARNING_PREFIXES, } from "@anthropic-ai/claude-agent-sdk";
1
2
  function providerErrorInfo(providerError, message) {
2
3
  if (providerError === "authentication_failed" || providerError === "oauth_org_not_allowed")
3
4
  return "unauthorized";
@@ -11,6 +12,13 @@ function providerErrorInfo(providerError, message) {
11
12
  return "badRequest";
12
13
  if (providerError === "unknown")
13
14
  return "other";
15
+ if (message && ORG_POLICY_LIMIT_PREFIXES.some((prefix) => message.startsWith(prefix)))
16
+ return "badRequest";
17
+ if (message && USAGE_LIMIT_ERROR_PREFIXES.some((prefix) => message.startsWith(prefix)))
18
+ return "usageLimitExceeded";
19
+ if (message && [...USAGE_TRANSITION_PREFIXES, ...USAGE_WARNING_PREFIXES].some((prefix) => message.startsWith(prefix))) {
20
+ return undefined;
21
+ }
14
22
  const normalized = message?.toLocaleLowerCase() ?? "";
15
23
  if (/auth|oauth|unauthori[sz]ed/.test(normalized))
16
24
  return "unauthorized";
@@ -36,7 +44,7 @@ export function classifyClaudeResult(message, providerError) {
36
44
  return { status: "completed" };
37
45
  const errors = message.subtype === "success"
38
46
  ? [providerError, message.result].filter((value) => Boolean(value))
39
- : message.errors;
47
+ : message.errors ?? [];
40
48
  const interrupted = message.terminal_reason === "aborted_tools" || message.terminal_reason === "aborted_streaming" ||
41
49
  errors.some((value) => value.toLocaleLowerCase().includes("interrupt") || value.toLocaleLowerCase().includes("abort"));
42
50
  const error = errors[0];
@@ -1 +1 @@
1
- {"version":3,"file":"resultClassifier.js","sourceRoot":"","sources":["../../src/claude/resultClassifier.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"resultClassifier.js","sourceRoot":"","sources":["../../src/claude/resultClassifier.ts"],"names":[],"mappings":"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"}