@stoneforge/smithy 1.4.1 → 1.5.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/dist/cli/commands/daemon.d.ts +5 -1
- package/dist/cli/commands/daemon.d.ts.map +1 -1
- package/dist/cli/commands/daemon.js +184 -6
- package/dist/cli/commands/daemon.js.map +1 -1
- package/dist/cli/index.d.ts +1 -1
- package/dist/cli/index.d.ts.map +1 -1
- package/dist/cli/index.js +1 -1
- package/dist/cli/index.js.map +1 -1
- package/dist/git/merge.d.ts +2 -0
- package/dist/git/merge.d.ts.map +1 -1
- package/dist/git/merge.js +19 -0
- package/dist/git/merge.js.map +1 -1
- package/dist/git/worktree-manager.d.ts.map +1 -1
- package/dist/git/worktree-manager.js +11 -2
- package/dist/git/worktree-manager.js.map +1 -1
- package/dist/runtime/session-manager.d.ts +2 -0
- package/dist/runtime/session-manager.d.ts.map +1 -1
- package/dist/runtime/session-manager.js +10 -2
- package/dist/runtime/session-manager.js.map +1 -1
- package/dist/runtime/spawner.d.ts.map +1 -1
- package/dist/runtime/spawner.js +13 -0
- package/dist/runtime/spawner.js.map +1 -1
- package/dist/server/routes/daemon.d.ts.map +1 -1
- package/dist/server/routes/daemon.js +84 -0
- package/dist/server/routes/daemon.js.map +1 -1
- package/dist/server/routes/settings.d.ts.map +1 -1
- package/dist/server/routes/settings.js +15 -2
- package/dist/server/routes/settings.js.map +1 -1
- package/dist/server/services.d.ts.map +1 -1
- package/dist/server/services.js +10 -1
- package/dist/server/services.js.map +1 -1
- package/dist/services/dispatch-daemon.d.ts +54 -2
- package/dist/services/dispatch-daemon.d.ts.map +1 -1
- package/dist/services/dispatch-daemon.js +204 -6
- package/dist/services/dispatch-daemon.js.map +1 -1
- package/dist/services/index.d.ts +2 -0
- package/dist/services/index.d.ts.map +1 -1
- package/dist/services/index.js +5 -0
- package/dist/services/index.js.map +1 -1
- package/dist/services/merge-steward-service.d.ts +8 -0
- package/dist/services/merge-steward-service.d.ts.map +1 -1
- package/dist/services/merge-steward-service.js +57 -0
- package/dist/services/merge-steward-service.js.map +1 -1
- package/dist/services/rate-limit-tracker.d.ts +77 -0
- package/dist/services/rate-limit-tracker.d.ts.map +1 -0
- package/dist/services/rate-limit-tracker.js +117 -0
- package/dist/services/rate-limit-tracker.js.map +1 -0
- package/dist/services/settings-service.d.ts +2 -0
- package/dist/services/settings-service.d.ts.map +1 -1
- package/dist/services/settings-service.js +10 -1
- package/dist/services/settings-service.js.map +1 -1
- package/dist/types/task-meta.d.ts +2 -0
- package/dist/types/task-meta.d.ts.map +1 -1
- package/dist/types/task-meta.js.map +1 -1
- package/dist/utils/rate-limit-parser.d.ts +55 -0
- package/dist/utils/rate-limit-parser.d.ts.map +1 -0
- package/dist/utils/rate-limit-parser.js +233 -0
- package/dist/utils/rate-limit-parser.js.map +1 -0
- package/package.json +5 -5
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Rate Limit Tracker Service
|
|
3
|
+
*
|
|
4
|
+
* An in-memory service that tracks which executables are rate-limited
|
|
5
|
+
* and when their limits reset. Used by the dispatch system to avoid
|
|
6
|
+
* spawning sessions against rate-limited executables and to select
|
|
7
|
+
* fallback executables when the primary is throttled.
|
|
8
|
+
*
|
|
9
|
+
* Key features:
|
|
10
|
+
* - Track rate-limited executables with reset timestamps
|
|
11
|
+
* - Auto-expire stale entries (past reset times)
|
|
12
|
+
* - Walk fallback chains to find available executables
|
|
13
|
+
* - Query soonest reset time for scheduling retries
|
|
14
|
+
*
|
|
15
|
+
* @module
|
|
16
|
+
*/
|
|
17
|
+
/**
|
|
18
|
+
* A single rate limit entry for a tracked executable.
|
|
19
|
+
*/
|
|
20
|
+
export interface RateLimitEntry {
|
|
21
|
+
executable: string;
|
|
22
|
+
resetsAt: Date;
|
|
23
|
+
recordedAt: Date;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Rate Limit Tracker interface for managing executable rate limit state.
|
|
27
|
+
*
|
|
28
|
+
* The tracker provides methods for:
|
|
29
|
+
* - Recording rate-limited executables
|
|
30
|
+
* - Checking whether an executable is currently limited
|
|
31
|
+
* - Walking fallback chains to find available executables
|
|
32
|
+
* - Querying when rate limits will reset
|
|
33
|
+
*/
|
|
34
|
+
export interface RateLimitTracker {
|
|
35
|
+
/**
|
|
36
|
+
* Mark an executable as rate-limited until the given reset time.
|
|
37
|
+
* If the executable is already tracked, only update if the new
|
|
38
|
+
* resetsAt is later than the existing one (never downgrade).
|
|
39
|
+
*/
|
|
40
|
+
markLimited(executable: string, resetsAt: Date): void;
|
|
41
|
+
/**
|
|
42
|
+
* Check whether an executable is currently rate-limited.
|
|
43
|
+
* Auto-expires stale entries whose resetsAt is in the past.
|
|
44
|
+
*/
|
|
45
|
+
isLimited(executable: string): boolean;
|
|
46
|
+
/**
|
|
47
|
+
* Walk the fallback chain and return the first executable that
|
|
48
|
+
* is not currently rate-limited. Returns undefined if all are limited.
|
|
49
|
+
*/
|
|
50
|
+
getAvailableExecutable(fallbackChain: string[]): string | undefined;
|
|
51
|
+
/**
|
|
52
|
+
* Return the earliest resetsAt among all currently-limited executables
|
|
53
|
+
* (after auto-expiring stale entries). Returns undefined if nothing is limited.
|
|
54
|
+
*/
|
|
55
|
+
getSoonestResetTime(): Date | undefined;
|
|
56
|
+
/**
|
|
57
|
+
* Return all currently-limited entries (after auto-expiring stale ones).
|
|
58
|
+
*/
|
|
59
|
+
getAllLimits(): RateLimitEntry[];
|
|
60
|
+
/**
|
|
61
|
+
* Return true if every executable in the fallback chain is currently
|
|
62
|
+
* rate-limited (after auto-expiring stale entries).
|
|
63
|
+
*/
|
|
64
|
+
isAllLimited(fallbackChain: string[]): boolean;
|
|
65
|
+
/**
|
|
66
|
+
* Reset all tracked state.
|
|
67
|
+
*/
|
|
68
|
+
clear(): void;
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Creates a RateLimitTracker instance.
|
|
72
|
+
*
|
|
73
|
+
* No constructor arguments — this is purely in-memory with no DB or
|
|
74
|
+
* service dependencies.
|
|
75
|
+
*/
|
|
76
|
+
export declare function createRateLimitTracker(): RateLimitTracker;
|
|
77
|
+
//# sourceMappingURL=rate-limit-tracker.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rate-limit-tracker.d.ts","sourceRoot":"","sources":["../../src/services/rate-limit-tracker.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAMH;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,IAAI,CAAC;IACf,UAAU,EAAE,IAAI,CAAC;CAClB;AAED;;;;;;;;GAQG;AACH,MAAM,WAAW,gBAAgB;IAC/B;;;;OAIG;IACH,WAAW,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,GAAG,IAAI,CAAC;IAEtD;;;OAGG;IACH,SAAS,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC;IAEvC;;;OAGG;IACH,sBAAsB,CAAC,aAAa,EAAE,MAAM,EAAE,GAAG,MAAM,GAAG,SAAS,CAAC;IAEpE;;;OAGG;IACH,mBAAmB,IAAI,IAAI,GAAG,SAAS,CAAC;IAExC;;OAEG;IACH,YAAY,IAAI,cAAc,EAAE,CAAC;IAEjC;;;OAGG;IACH,YAAY,CAAC,aAAa,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC;IAE/C;;OAEG;IACH,KAAK,IAAI,IAAI,CAAC;CACf;AAkHD;;;;;GAKG;AACH,wBAAgB,sBAAsB,IAAI,gBAAgB,CAEzD"}
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Rate Limit Tracker Service
|
|
3
|
+
*
|
|
4
|
+
* An in-memory service that tracks which executables are rate-limited
|
|
5
|
+
* and when their limits reset. Used by the dispatch system to avoid
|
|
6
|
+
* spawning sessions against rate-limited executables and to select
|
|
7
|
+
* fallback executables when the primary is throttled.
|
|
8
|
+
*
|
|
9
|
+
* Key features:
|
|
10
|
+
* - Track rate-limited executables with reset timestamps
|
|
11
|
+
* - Auto-expire stale entries (past reset times)
|
|
12
|
+
* - Walk fallback chains to find available executables
|
|
13
|
+
* - Query soonest reset time for scheduling retries
|
|
14
|
+
*
|
|
15
|
+
* @module
|
|
16
|
+
*/
|
|
17
|
+
// ============================================================================
|
|
18
|
+
// Implementation
|
|
19
|
+
// ============================================================================
|
|
20
|
+
/**
|
|
21
|
+
* In-memory implementation of the RateLimitTracker.
|
|
22
|
+
*
|
|
23
|
+
* Uses a Map keyed by executable name. Stale entries (resetsAt in the past)
|
|
24
|
+
* are lazily cleaned up during read operations.
|
|
25
|
+
*/
|
|
26
|
+
class RateLimitTrackerImpl {
|
|
27
|
+
limits = new Map();
|
|
28
|
+
markLimited(executable, resetsAt) {
|
|
29
|
+
const existing = this.limits.get(executable);
|
|
30
|
+
if (existing && existing.resetsAt.getTime() >= resetsAt.getTime()) {
|
|
31
|
+
// Existing entry has a later (or equal) reset time — don't downgrade
|
|
32
|
+
return;
|
|
33
|
+
}
|
|
34
|
+
this.limits.set(executable, {
|
|
35
|
+
resetsAt,
|
|
36
|
+
recordedAt: new Date(),
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
isLimited(executable) {
|
|
40
|
+
const entry = this.limits.get(executable);
|
|
41
|
+
if (!entry) {
|
|
42
|
+
return false;
|
|
43
|
+
}
|
|
44
|
+
if (entry.resetsAt.getTime() <= Date.now()) {
|
|
45
|
+
// Stale — auto-expire
|
|
46
|
+
this.limits.delete(executable);
|
|
47
|
+
return false;
|
|
48
|
+
}
|
|
49
|
+
return true;
|
|
50
|
+
}
|
|
51
|
+
getAvailableExecutable(fallbackChain) {
|
|
52
|
+
for (const executable of fallbackChain) {
|
|
53
|
+
if (!this.isLimited(executable)) {
|
|
54
|
+
return executable;
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
return undefined;
|
|
58
|
+
}
|
|
59
|
+
getSoonestResetTime() {
|
|
60
|
+
this.expireStale();
|
|
61
|
+
let soonest;
|
|
62
|
+
for (const entry of this.limits.values()) {
|
|
63
|
+
if (!soonest || entry.resetsAt.getTime() < soonest.getTime()) {
|
|
64
|
+
soonest = entry.resetsAt;
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
return soonest;
|
|
68
|
+
}
|
|
69
|
+
getAllLimits() {
|
|
70
|
+
this.expireStale();
|
|
71
|
+
const entries = [];
|
|
72
|
+
for (const [executable, entry] of this.limits) {
|
|
73
|
+
entries.push({
|
|
74
|
+
executable,
|
|
75
|
+
resetsAt: entry.resetsAt,
|
|
76
|
+
recordedAt: entry.recordedAt,
|
|
77
|
+
});
|
|
78
|
+
}
|
|
79
|
+
return entries;
|
|
80
|
+
}
|
|
81
|
+
isAllLimited(fallbackChain) {
|
|
82
|
+
if (fallbackChain.length === 0) {
|
|
83
|
+
return false;
|
|
84
|
+
}
|
|
85
|
+
return fallbackChain.every((executable) => this.isLimited(executable));
|
|
86
|
+
}
|
|
87
|
+
clear() {
|
|
88
|
+
this.limits.clear();
|
|
89
|
+
}
|
|
90
|
+
// ----------------------------------------
|
|
91
|
+
// Private Helpers
|
|
92
|
+
// ----------------------------------------
|
|
93
|
+
/**
|
|
94
|
+
* Remove all entries whose resetsAt is in the past.
|
|
95
|
+
*/
|
|
96
|
+
expireStale() {
|
|
97
|
+
const now = Date.now();
|
|
98
|
+
for (const [executable, entry] of this.limits) {
|
|
99
|
+
if (entry.resetsAt.getTime() <= now) {
|
|
100
|
+
this.limits.delete(executable);
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
// ============================================================================
|
|
106
|
+
// Factory Function
|
|
107
|
+
// ============================================================================
|
|
108
|
+
/**
|
|
109
|
+
* Creates a RateLimitTracker instance.
|
|
110
|
+
*
|
|
111
|
+
* No constructor arguments — this is purely in-memory with no DB or
|
|
112
|
+
* service dependencies.
|
|
113
|
+
*/
|
|
114
|
+
export function createRateLimitTracker() {
|
|
115
|
+
return new RateLimitTrackerImpl();
|
|
116
|
+
}
|
|
117
|
+
//# sourceMappingURL=rate-limit-tracker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rate-limit-tracker.js","sourceRoot":"","sources":["../../src/services/rate-limit-tracker.ts"],"names":[],"mappings":"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"}
|
|
@@ -22,6 +22,8 @@ export interface Setting {
|
|
|
22
22
|
export interface ServerAgentDefaults {
|
|
23
23
|
/** Provider name → executable path (e.g. { claude: '/usr/local/bin/claude-dev' }) */
|
|
24
24
|
defaultExecutablePaths: Record<string, string>;
|
|
25
|
+
/** Ordered list of executable names/paths for rate limit fallback. When one hits its limit, the next available is used. */
|
|
26
|
+
fallbackChain?: string[];
|
|
25
27
|
}
|
|
26
28
|
/**
|
|
27
29
|
* Well-known setting keys
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"settings-service.d.ts","sourceRoot":"","sources":["../../src/services/settings-service.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAS1D;;GAEG;AACH,MAAM,WAAW,OAAO;IACtB,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,OAAO,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,qFAAqF;IACrF,sBAAsB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"settings-service.d.ts","sourceRoot":"","sources":["../../src/services/settings-service.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAS1D;;GAEG;AACH,MAAM,WAAW,OAAO;IACtB,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,OAAO,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,qFAAqF;IACrF,sBAAsB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC/C,2HAA2H;IAC3H,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;CAC1B;AAED;;GAEG;AACH,eAAO,MAAM,YAAY;;CAEf,CAAC;AAMX,MAAM,WAAW,eAAe;IAC9B;;OAEG;IACH,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,GAAG,SAAS,CAAC;IAE7C;;OAEG;IACH,UAAU,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC;IAEjD;;;OAGG;IACH,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;IAEpC;;OAEG;IACH,gBAAgB,IAAI,mBAAmB,CAAC;IAExC;;OAEG;IACH,gBAAgB,CAAC,QAAQ,EAAE,mBAAmB,GAAG,mBAAmB,CAAC;CACtE;AAoCD,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,cAAc,GAAG,eAAe,CAsF9E"}
|
|
@@ -66,11 +66,16 @@ export function createSettingsService(storage) {
|
|
|
66
66
|
// Validate shape — ensure defaultExecutablePaths exists and is an object
|
|
67
67
|
const value = setting.value;
|
|
68
68
|
const paths = value?.defaultExecutablePaths;
|
|
69
|
-
|
|
69
|
+
const result = {
|
|
70
70
|
defaultExecutablePaths: paths && typeof paths === 'object' && !Array.isArray(paths)
|
|
71
71
|
? paths
|
|
72
72
|
: {},
|
|
73
73
|
};
|
|
74
|
+
// Include fallbackChain if it's a valid array
|
|
75
|
+
if (Array.isArray(value?.fallbackChain)) {
|
|
76
|
+
result.fallbackChain = value.fallbackChain.filter((entry) => typeof entry === 'string');
|
|
77
|
+
}
|
|
78
|
+
return result;
|
|
74
79
|
},
|
|
75
80
|
setAgentDefaults(defaults) {
|
|
76
81
|
// Validate that defaultExecutablePaths is a plain object of strings
|
|
@@ -84,6 +89,10 @@ export function createSettingsService(storage) {
|
|
|
84
89
|
const validated = {
|
|
85
90
|
defaultExecutablePaths: sanitized,
|
|
86
91
|
};
|
|
92
|
+
// Validate fallbackChain — must be an array; filter out non-string entries
|
|
93
|
+
if (Array.isArray(defaults.fallbackChain)) {
|
|
94
|
+
validated.fallbackChain = defaults.fallbackChain.filter((entry) => typeof entry === 'string');
|
|
95
|
+
}
|
|
87
96
|
this.setSetting(SETTING_KEYS.AGENT_DEFAULTS, validated);
|
|
88
97
|
return validated;
|
|
89
98
|
},
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"settings-service.js","sourceRoot":"","sources":["../../src/services/settings-service.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAGH,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAElD,MAAM,MAAM,GAAG,YAAY,CAAC,kBAAkB,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"settings-service.js","sourceRoot":"","sources":["../../src/services/settings-service.ts"],"names":[],"mappings":"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"}
|
|
@@ -49,6 +49,8 @@ export interface OrchestratorTaskMeta {
|
|
|
49
49
|
readonly reconciliationCount?: number;
|
|
50
50
|
/** Number of times this task has been recovered from a stuck merging/testing state */
|
|
51
51
|
readonly stuckMergeRecoveryCount?: number;
|
|
52
|
+
/** Number of times the steward orphan recovery has re-dispatched a steward for this task */
|
|
53
|
+
readonly stewardRecoveryCount?: number;
|
|
52
54
|
/**
|
|
53
55
|
* Number of consecutive times the orphan recovery loop has resumed this task
|
|
54
56
|
* without a status change. When this exceeds the configured threshold,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"task-meta.d.ts","sourceRoot":"","sources":["../../src/types/task-meta.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"task-meta.d.ts","sourceRoot":"","sources":["../../src/types/task-meta.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"task-meta.js","sourceRoot":"","sources":["../../src/types/task-meta.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;
|
|
1
|
+
{"version":3,"file":"task-meta.js","sourceRoot":"","sources":["../../src/types/task-meta.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Rate Limit Parser Utility
|
|
3
|
+
*
|
|
4
|
+
* Detects and parses Claude Code rate limit messages emitted during
|
|
5
|
+
* headless SDK sessions. Supports three known message formats:
|
|
6
|
+
*
|
|
7
|
+
* 1. Hourly/5-hour limit: "You've hit your limit · resets 12am"
|
|
8
|
+
* 2. Weekly limit: "Weekly limit reached · resets Feb 22 at 9:30am"
|
|
9
|
+
* 3. Tomorrow reset: "resets tomorrow at 3pm"
|
|
10
|
+
*
|
|
11
|
+
* Also provides a fallback function for when parsing fails, so callers
|
|
12
|
+
* can always obtain a conservative reset time estimate.
|
|
13
|
+
*
|
|
14
|
+
* Usage:
|
|
15
|
+
* import { isRateLimitMessage, parseRateLimitResetTime, getFallbackResetTime } from '../utils/rate-limit-parser.js';
|
|
16
|
+
*
|
|
17
|
+
* if (isRateLimitMessage(text)) {
|
|
18
|
+
* const resetAt = parseRateLimitResetTime(text) ?? getFallbackResetTime(text);
|
|
19
|
+
* }
|
|
20
|
+
*
|
|
21
|
+
* @module
|
|
22
|
+
*/
|
|
23
|
+
/**
|
|
24
|
+
* Patterns to detect rate limit messages from Claude Code.
|
|
25
|
+
*
|
|
26
|
+
* Handles:
|
|
27
|
+
* - "You've hit your limit" with straight (') or curly (\u2019) apostrophes
|
|
28
|
+
* - "Weekly limit reached"
|
|
29
|
+
* - Generic "limit" + "resets" co-occurrence in the same message
|
|
30
|
+
*/
|
|
31
|
+
export declare const RATE_LIMIT_PATTERNS: ReadonlyArray<RegExp>;
|
|
32
|
+
/**
|
|
33
|
+
* Returns `true` if the content matches any known rate limit pattern.
|
|
34
|
+
*/
|
|
35
|
+
export declare function isRateLimitMessage(content: string): boolean;
|
|
36
|
+
/**
|
|
37
|
+
* Parses the reset time embedded in a rate limit message.
|
|
38
|
+
*
|
|
39
|
+
* Returns a `Date` representing when the rate limit resets, or `undefined`
|
|
40
|
+
* if the message does not contain a parseable reset time.
|
|
41
|
+
*
|
|
42
|
+
* @param content - The raw message text from Claude Code
|
|
43
|
+
* @returns The parsed reset `Date`, or `undefined` if parsing fails
|
|
44
|
+
*/
|
|
45
|
+
export declare function parseRateLimitResetTime(content: string): Date | undefined;
|
|
46
|
+
/**
|
|
47
|
+
* Returns a fallback reset time when the exact time cannot be parsed.
|
|
48
|
+
* Uses the message content to determine the type of limit and applies
|
|
49
|
+
* a conservative default sleep duration.
|
|
50
|
+
*
|
|
51
|
+
* - Weekly limit ("weekly"): 6 hours from now
|
|
52
|
+
* - Hourly/daily limit (default): 1 hour from now
|
|
53
|
+
*/
|
|
54
|
+
export declare function getFallbackResetTime(content: string): Date;
|
|
55
|
+
//# sourceMappingURL=rate-limit-parser.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rate-limit-parser.d.ts","sourceRoot":"","sources":["../../src/utils/rate-limit-parser.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAwBH;;;;;;;GAOG;AACH,eAAO,MAAM,mBAAmB,EAAE,aAAa,CAAC,MAAM,CAIrD,CAAC;AAMF;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAE3D;AA0CD;;;;;;;;GAQG;AACH,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAoBzE;AAED;;;;;;;GAOG;AACH,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAI1D"}
|
|
@@ -0,0 +1,233 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Rate Limit Parser Utility
|
|
3
|
+
*
|
|
4
|
+
* Detects and parses Claude Code rate limit messages emitted during
|
|
5
|
+
* headless SDK sessions. Supports three known message formats:
|
|
6
|
+
*
|
|
7
|
+
* 1. Hourly/5-hour limit: "You've hit your limit · resets 12am"
|
|
8
|
+
* 2. Weekly limit: "Weekly limit reached · resets Feb 22 at 9:30am"
|
|
9
|
+
* 3. Tomorrow reset: "resets tomorrow at 3pm"
|
|
10
|
+
*
|
|
11
|
+
* Also provides a fallback function for when parsing fails, so callers
|
|
12
|
+
* can always obtain a conservative reset time estimate.
|
|
13
|
+
*
|
|
14
|
+
* Usage:
|
|
15
|
+
* import { isRateLimitMessage, parseRateLimitResetTime, getFallbackResetTime } from '../utils/rate-limit-parser.js';
|
|
16
|
+
*
|
|
17
|
+
* if (isRateLimitMessage(text)) {
|
|
18
|
+
* const resetAt = parseRateLimitResetTime(text) ?? getFallbackResetTime(text);
|
|
19
|
+
* }
|
|
20
|
+
*
|
|
21
|
+
* @module
|
|
22
|
+
*/
|
|
23
|
+
// ============================================================================
|
|
24
|
+
// Constants
|
|
25
|
+
// ============================================================================
|
|
26
|
+
/**
|
|
27
|
+
* Month name abbreviations used in Format B reset times.
|
|
28
|
+
*/
|
|
29
|
+
const MONTH_NAMES = {
|
|
30
|
+
jan: 0,
|
|
31
|
+
feb: 1,
|
|
32
|
+
mar: 2,
|
|
33
|
+
apr: 3,
|
|
34
|
+
may: 4,
|
|
35
|
+
jun: 5,
|
|
36
|
+
jul: 6,
|
|
37
|
+
aug: 7,
|
|
38
|
+
sep: 8,
|
|
39
|
+
oct: 9,
|
|
40
|
+
nov: 10,
|
|
41
|
+
dec: 11,
|
|
42
|
+
};
|
|
43
|
+
/**
|
|
44
|
+
* Patterns to detect rate limit messages from Claude Code.
|
|
45
|
+
*
|
|
46
|
+
* Handles:
|
|
47
|
+
* - "You've hit your limit" with straight (') or curly (\u2019) apostrophes
|
|
48
|
+
* - "Weekly limit reached"
|
|
49
|
+
* - Generic "limit" + "resets" co-occurrence in the same message
|
|
50
|
+
*/
|
|
51
|
+
export const RATE_LIMIT_PATTERNS = [
|
|
52
|
+
/you[\u2018\u2019''`]ve hit your limit/i,
|
|
53
|
+
/weekly limit reached/i,
|
|
54
|
+
/limit\b.*\bresets?\b/i,
|
|
55
|
+
];
|
|
56
|
+
// ============================================================================
|
|
57
|
+
// Detection
|
|
58
|
+
// ============================================================================
|
|
59
|
+
/**
|
|
60
|
+
* Returns `true` if the content matches any known rate limit pattern.
|
|
61
|
+
*/
|
|
62
|
+
export function isRateLimitMessage(content) {
|
|
63
|
+
return RATE_LIMIT_PATTERNS.some((pattern) => pattern.test(content));
|
|
64
|
+
}
|
|
65
|
+
// ============================================================================
|
|
66
|
+
// Parsing — reset time extraction
|
|
67
|
+
// ============================================================================
|
|
68
|
+
/**
|
|
69
|
+
* Format B regex: "resets Mon DD at H:MMam/pm" or "resets Mon DD Ham/pm"
|
|
70
|
+
*
|
|
71
|
+
* The "at" keyword is optional to handle both "resets Feb 22 at 8pm"
|
|
72
|
+
* and "resets Feb 22 8pm".
|
|
73
|
+
*
|
|
74
|
+
* Captures:
|
|
75
|
+
* [1] month name (e.g. "Feb" or "February")
|
|
76
|
+
* [2] day number (e.g. "22")
|
|
77
|
+
* [3] hour (e.g. "9" or "12")
|
|
78
|
+
* [4] minutes (optional, e.g. "30")
|
|
79
|
+
* [5] am/pm (e.g. "am")
|
|
80
|
+
*/
|
|
81
|
+
const FORMAT_B_REGEX = /resets?\s+([A-Za-z]+)\s+(\d{1,2})\s+(?:at\s+)?(\d{1,2})(?::(\d{2}))?\s*(am|pm)/i;
|
|
82
|
+
/**
|
|
83
|
+
* Format C regex: "resets tomorrow at H:MMam/pm" or "resets tomorrow at Ham/pm"
|
|
84
|
+
*
|
|
85
|
+
* Captures:
|
|
86
|
+
* [1] hour (e.g. "3" or "12")
|
|
87
|
+
* [2] minutes (optional, e.g. "30")
|
|
88
|
+
* [3] am/pm
|
|
89
|
+
*/
|
|
90
|
+
const FORMAT_C_REGEX = /resets?\s+tomorrow\s+at\s+(\d{1,2})(?::(\d{2}))?\s*(am|pm)/i;
|
|
91
|
+
/**
|
|
92
|
+
* Format A regex: "resets Ham/pm" or "resets H:MMam/pm" (time only, no date)
|
|
93
|
+
*
|
|
94
|
+
* Captures:
|
|
95
|
+
* [1] hour (e.g. "12" or "3")
|
|
96
|
+
* [2] minutes (optional, e.g. "30")
|
|
97
|
+
* [3] am/pm
|
|
98
|
+
*/
|
|
99
|
+
const FORMAT_A_REGEX = /resets?\s+(\d{1,2})(?::(\d{2}))?\s*(am|pm)/i;
|
|
100
|
+
/**
|
|
101
|
+
* Parses the reset time embedded in a rate limit message.
|
|
102
|
+
*
|
|
103
|
+
* Returns a `Date` representing when the rate limit resets, or `undefined`
|
|
104
|
+
* if the message does not contain a parseable reset time.
|
|
105
|
+
*
|
|
106
|
+
* @param content - The raw message text from Claude Code
|
|
107
|
+
* @returns The parsed reset `Date`, or `undefined` if parsing fails
|
|
108
|
+
*/
|
|
109
|
+
export function parseRateLimitResetTime(content) {
|
|
110
|
+
// Try Format B first (most specific — includes a date)
|
|
111
|
+
const formatB = FORMAT_B_REGEX.exec(content);
|
|
112
|
+
if (formatB) {
|
|
113
|
+
return parseDateAndTime(formatB);
|
|
114
|
+
}
|
|
115
|
+
// Try Format C (tomorrow + time — more specific than time-only)
|
|
116
|
+
const formatC = FORMAT_C_REGEX.exec(content);
|
|
117
|
+
if (formatC) {
|
|
118
|
+
return parseTomorrowTime(formatC);
|
|
119
|
+
}
|
|
120
|
+
// Fall back to Format A (time only)
|
|
121
|
+
const formatA = FORMAT_A_REGEX.exec(content);
|
|
122
|
+
if (formatA) {
|
|
123
|
+
return parseTimeOnly(formatA);
|
|
124
|
+
}
|
|
125
|
+
return undefined;
|
|
126
|
+
}
|
|
127
|
+
/**
|
|
128
|
+
* Returns a fallback reset time when the exact time cannot be parsed.
|
|
129
|
+
* Uses the message content to determine the type of limit and applies
|
|
130
|
+
* a conservative default sleep duration.
|
|
131
|
+
*
|
|
132
|
+
* - Weekly limit ("weekly"): 6 hours from now
|
|
133
|
+
* - Hourly/daily limit (default): 1 hour from now
|
|
134
|
+
*/
|
|
135
|
+
export function getFallbackResetTime(content) {
|
|
136
|
+
const isWeekly = /weekly/i.test(content);
|
|
137
|
+
const fallbackMs = isWeekly ? 6 * 60 * 60 * 1000 : 1 * 60 * 60 * 1000;
|
|
138
|
+
return new Date(Date.now() + fallbackMs);
|
|
139
|
+
}
|
|
140
|
+
// ============================================================================
|
|
141
|
+
// Internal helpers
|
|
142
|
+
// ============================================================================
|
|
143
|
+
/**
|
|
144
|
+
* Converts a 12-hour time (hour + am/pm) to 24-hour format.
|
|
145
|
+
*/
|
|
146
|
+
function to24Hour(hour, ampm) {
|
|
147
|
+
const lower = ampm.toLowerCase();
|
|
148
|
+
if (lower === 'am') {
|
|
149
|
+
return hour === 12 ? 0 : hour;
|
|
150
|
+
}
|
|
151
|
+
// pm
|
|
152
|
+
return hour === 12 ? 12 : hour + 12;
|
|
153
|
+
}
|
|
154
|
+
/**
|
|
155
|
+
* Parses a Format B match (date + time) into a Date.
|
|
156
|
+
*
|
|
157
|
+
* If the resulting date is in the past, assumes next year.
|
|
158
|
+
*/
|
|
159
|
+
function parseDateAndTime(match) {
|
|
160
|
+
try {
|
|
161
|
+
const monthStr = match[1].toLowerCase();
|
|
162
|
+
const day = parseInt(match[2], 10);
|
|
163
|
+
const hour12 = parseInt(match[3], 10);
|
|
164
|
+
const minutes = match[4] ? parseInt(match[4], 10) : 0;
|
|
165
|
+
const ampm = match[5];
|
|
166
|
+
const month = MONTH_NAMES[monthStr.slice(0, 3)];
|
|
167
|
+
if (month === undefined)
|
|
168
|
+
return undefined;
|
|
169
|
+
if (isNaN(day) || isNaN(hour12) || isNaN(minutes))
|
|
170
|
+
return undefined;
|
|
171
|
+
const hour24 = to24Hour(hour12, ampm);
|
|
172
|
+
const now = new Date();
|
|
173
|
+
const year = now.getFullYear();
|
|
174
|
+
const result = new Date(year, month, day, hour24, minutes, 0, 0);
|
|
175
|
+
// If the parsed date is in the past, assume it means next year
|
|
176
|
+
if (result.getTime() < now.getTime()) {
|
|
177
|
+
result.setFullYear(year + 1);
|
|
178
|
+
}
|
|
179
|
+
return result;
|
|
180
|
+
}
|
|
181
|
+
catch {
|
|
182
|
+
return undefined;
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
/**
|
|
186
|
+
* Parses a Format C match (tomorrow + time) into a Date.
|
|
187
|
+
*
|
|
188
|
+
* Computes tomorrow's date and sets the parsed time on it.
|
|
189
|
+
*/
|
|
190
|
+
function parseTomorrowTime(match) {
|
|
191
|
+
try {
|
|
192
|
+
const hour12 = parseInt(match[1], 10);
|
|
193
|
+
const minutes = match[2] ? parseInt(match[2], 10) : 0;
|
|
194
|
+
const ampm = match[3];
|
|
195
|
+
if (isNaN(hour12) || isNaN(minutes))
|
|
196
|
+
return undefined;
|
|
197
|
+
const hour24 = to24Hour(hour12, ampm);
|
|
198
|
+
const now = new Date();
|
|
199
|
+
const result = new Date(now.getFullYear(), now.getMonth(), now.getDate() + 1, // tomorrow
|
|
200
|
+
hour24, minutes, 0, 0);
|
|
201
|
+
return result;
|
|
202
|
+
}
|
|
203
|
+
catch {
|
|
204
|
+
return undefined;
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
/**
|
|
208
|
+
* Parses a Format A match (time only) into a Date.
|
|
209
|
+
*
|
|
210
|
+
* Returns the next occurrence of that local time — today if still in the
|
|
211
|
+
* future, otherwise tomorrow.
|
|
212
|
+
*/
|
|
213
|
+
function parseTimeOnly(match) {
|
|
214
|
+
try {
|
|
215
|
+
const hour12 = parseInt(match[1], 10);
|
|
216
|
+
const minutes = match[2] ? parseInt(match[2], 10) : 0;
|
|
217
|
+
const ampm = match[3];
|
|
218
|
+
if (isNaN(hour12) || isNaN(minutes))
|
|
219
|
+
return undefined;
|
|
220
|
+
const hour24 = to24Hour(hour12, ampm);
|
|
221
|
+
const now = new Date();
|
|
222
|
+
const result = new Date(now.getFullYear(), now.getMonth(), now.getDate(), hour24, minutes, 0, 0);
|
|
223
|
+
// If the time has already passed today, advance to tomorrow
|
|
224
|
+
if (result.getTime() <= now.getTime()) {
|
|
225
|
+
result.setDate(result.getDate() + 1);
|
|
226
|
+
}
|
|
227
|
+
return result;
|
|
228
|
+
}
|
|
229
|
+
catch {
|
|
230
|
+
return undefined;
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
//# sourceMappingURL=rate-limit-parser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rate-limit-parser.js","sourceRoot":"","sources":["../../src/utils/rate-limit-parser.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@stoneforge/smithy",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.5.0",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"description": "Orchestrator SDK for Stoneforge - AI agent orchestration library extending the core SDK",
|
|
6
6
|
"main": "dist/index.js",
|
|
@@ -93,10 +93,10 @@
|
|
|
93
93
|
"hono": "^4.7.0",
|
|
94
94
|
"node-pty": "^1.1.0",
|
|
95
95
|
"ws": "^8.18.0",
|
|
96
|
-
"@stoneforge/core": "1.
|
|
97
|
-
"@stoneforge/quarry": "1.
|
|
98
|
-
"@stoneforge/shared-routes": "1.
|
|
99
|
-
"@stoneforge/storage": "1.
|
|
96
|
+
"@stoneforge/core": "1.5.0",
|
|
97
|
+
"@stoneforge/quarry": "1.5.0",
|
|
98
|
+
"@stoneforge/shared-routes": "1.5.0",
|
|
99
|
+
"@stoneforge/storage": "1.5.0"
|
|
100
100
|
},
|
|
101
101
|
"optionalDependencies": {
|
|
102
102
|
"@opencode-ai/sdk": "^1.2.6"
|