pi-harness-runtime 1.1.33 → 1.1.36
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/harness/langchain/daemon.ts +47 -18
- package/package.json +1 -1
- package/packages/a2a-adapter/package.json +1 -1
- package/packages/architecture-generator/package.json +1 -1
- package/packages/auth/package.json +1 -1
- package/packages/autonomous-refactor/package.json +1 -1
- package/packages/autonomous-runtime/package.json +1 -1
- package/packages/cache-strategy/package.json +1 -1
- package/packages/capability-registry/package.json +1 -1
- package/packages/checkpoint/package.json +1 -1
- package/packages/cli-plugin-sdk/package.json +1 -1
- package/packages/clipboard/package.json +1 -1
- package/packages/clipboard-plugin/package.json +1 -1
- package/packages/code-generation/package.json +1 -1
- package/packages/code-review/package.json +1 -1
- package/packages/codex-adapter/package.json +1 -1
- package/packages/config-capture/package.json +1 -1
- package/packages/context-compiler/package.json +1 -1
- package/packages/context-discovery/package.json +1 -1
- package/packages/context-manager/package.json +1 -1
- package/packages/cookie-sanitizer/package.json +1 -1
- package/packages/cost-optimizer/package.json +1 -1
- package/packages/dependency-analyzer/package.json +1 -1
- package/packages/django-plugin/package.json +1 -1
- package/packages/doc-generator/package.json +1 -1
- package/packages/evaluation-engine/package.json +1 -1
- package/packages/evaluation-runner/package.json +1 -1
- package/packages/event-bus/package.json +1 -1
- package/packages/event-store/package.json +1 -1
- package/packages/experience-replay/package.json +1 -1
- package/packages/feedback-collector/package.json +1 -1
- package/packages/file-copy-helper/package.json +1 -1
- package/packages/framework-detector/package.json +1 -1
- package/packages/framework-plugin-sdk/package.json +1 -1
- package/packages/frappe-plugin/package.json +1 -1
- package/packages/generic-web-plugin/package.json +1 -1
- package/packages/health-monitor/package.json +1 -1
- package/packages/intent-analyzer/package.json +1 -1
- package/packages/knowledge-graph/package.json +1 -1
- package/packages/knowledge-retrieval/package.json +1 -1
- package/packages/laravel-plugin/package.json +1 -1
- package/packages/learning-engine/package.json +1 -1
- package/packages/mcp-adapter/package.json +1 -1
- package/packages/memory-engine/package.json +1 -1
- package/packages/milestone-manager/package.json +1 -1
- package/packages/model-registry/package.json +1 -1
- package/packages/nextjs-plugin/package.json +1 -1
- package/packages/notification/package.json +1 -1
- package/packages/observability/package.json +1 -1
- package/packages/okf-indexer/package.json +1 -1
- package/packages/performance-optimizer/package.json +1 -1
- package/packages/privilege-broker/package.json +1 -1
- package/packages/project-analyzer/package.json +1 -1
- package/packages/project-bootstrap/package.json +1 -1
- package/packages/projection-engine/package.json +1 -1
- package/packages/prompt-compiler/package.json +1 -1
- package/packages/prompt-versioning/package.json +1 -1
- package/packages/provider-adapter-sdk/package.json +1 -1
- package/packages/provider-router/package.json +1 -1
- package/packages/provider-selector/package.json +1 -1
- package/packages/providers/dist/glm-usage.d.ts.map +1 -1
- package/packages/providers/dist/glm-usage.js +16 -3
- package/packages/providers/dist/glm-usage.js.map +1 -1
- package/packages/providers/package.json +1 -1
- package/packages/providers/src/glm-usage.ts +18 -7
- package/packages/quota-manager/package.json +1 -1
- package/packages/rate-limiter/package.json +1 -1
- package/packages/react-vite-plugin/package.json +1 -1
- package/packages/release-manager/package.json +1 -1
- package/packages/requirement-compiler/package.json +1 -1
- package/packages/runtime/package.json +1 -1
- package/packages/scheduler/package.json +1 -1
- package/packages/scheduler-adapter/package.json +1 -1
- package/packages/session/package.json +1 -1
- package/packages/session-api/package.json +1 -1
- package/packages/session-export/package.json +1 -1
- package/packages/shared-context/package.json +1 -1
- package/packages/skill-mcp-client/package.json +1 -1
- package/packages/skill-registry/package.json +1 -1
- package/packages/sprint-planner/package.json +1 -1
- package/packages/subscription-engine/package.json +1 -1
- package/packages/task-compiler/package.json +1 -1
- package/packages/tencentdb-memory/package.json +1 -1
- package/packages/tencentdb-sync/package.json +1 -1
- package/packages/test-data-generator/package.json +1 -1
- package/packages/test-generator/package.json +1 -1
- package/packages/todo-bd-sync/package.json +1 -1
- package/packages/token-estimation/package.json +1 -1
- package/packages/token-optimizer/package.json +1 -1
- package/packages/tui/package.json +1 -1
- package/packages/types/package.json +1 -1
- package/packages/workflow-events/package.json +1 -1
- package/packages/workspace-scanner/package.json +1 -1
- package/packages/worktree/package.json +1 -1
- package/packages/write-review/package.json +1 -1
|
@@ -90,6 +90,8 @@ export interface DaemonConfig {
|
|
|
90
90
|
costCapUsd?: number;
|
|
91
91
|
/** Surge (529/overloaded) retry policy. Default: 3→6→12 min, max 5 pauses */
|
|
92
92
|
surgePolicy?: Partial<SurgePolicy>;
|
|
93
|
+
/** Kill a task if it runs longer than this (ms). Prevents permanent freezes. Default: no timeout */
|
|
94
|
+
taskTimeoutMs?: number;
|
|
93
95
|
/** Use persistent file-based checkpointer for crash-resume. Default: false (MemorySaver). */
|
|
94
96
|
checkpointer?: boolean | string;
|
|
95
97
|
/** @internal Test injection — overrides dryRun/real deps entirely */
|
|
@@ -199,6 +201,13 @@ function effectivePolicy(
|
|
|
199
201
|
return policy;
|
|
200
202
|
}
|
|
201
203
|
|
|
204
|
+
/** Rejects after `ms` milliseconds — used to time-box task execution. */
|
|
205
|
+
function timeoutPromise(ms: number): Promise<never> {
|
|
206
|
+
return new Promise<never>((_, reject) =>
|
|
207
|
+
setTimeout(() => reject(new Error(`Task timed out after ${ms}ms`)), ms),
|
|
208
|
+
);
|
|
209
|
+
}
|
|
210
|
+
|
|
202
211
|
/** Wait (poll) for a human ack file or bus event. Returns true if approved. */
|
|
203
212
|
async function waitForAck(
|
|
204
213
|
task: TriggeredTask,
|
|
@@ -735,26 +744,46 @@ export class LoopDaemon {
|
|
|
735
744
|
: undefined; // default MemorySaver
|
|
736
745
|
const loop: WriteReviewLoop = buildWriteReviewLoop(deps, { checkpointer });
|
|
737
746
|
|
|
738
|
-
const
|
|
739
|
-
(
|
|
740
|
-
|
|
741
|
-
|
|
742
|
-
|
|
743
|
-
|
|
744
|
-
{
|
|
745
|
-
policy: this.config.surgePolicy,
|
|
746
|
-
onSurge: ({ attempt, delayMs }) =>
|
|
747
|
-
log(
|
|
748
|
-
`Provider surge (529) — resume in ${Math.round(delayMs / 1000)}s (attempt ${attempt})`,
|
|
747
|
+
const invokeTask = (signal?: AbortSignal) =>
|
|
748
|
+
invokeWithSurgeRetry(
|
|
749
|
+
() =>
|
|
750
|
+
loop.invoke(
|
|
751
|
+
{ request: task.request },
|
|
752
|
+
{ configurable: { thread_id: loopId }, signal },
|
|
749
753
|
),
|
|
750
|
-
|
|
751
|
-
this.
|
|
752
|
-
|
|
753
|
-
|
|
754
|
-
|
|
754
|
+
{
|
|
755
|
+
policy: this.config.surgePolicy,
|
|
756
|
+
onSurge: ({ attempt, delayMs }) =>
|
|
757
|
+
log(
|
|
758
|
+
`Provider surge (529) — resume in ${Math.round(delayMs / 1000)}s (attempt ${attempt})`,
|
|
759
|
+
),
|
|
760
|
+
onExhausted: () => {
|
|
761
|
+
this._notifyHumanReviewNeeded(
|
|
762
|
+
task,
|
|
763
|
+
"Provider surged past max surge attempts — task failed",
|
|
764
|
+
);
|
|
765
|
+
},
|
|
755
766
|
},
|
|
756
|
-
|
|
757
|
-
|
|
767
|
+
);
|
|
768
|
+
|
|
769
|
+
let finalState: Awaited<ReturnType<typeof invokeTask>>;
|
|
770
|
+
if (this.config.taskTimeoutMs) {
|
|
771
|
+
const ac = new AbortController();
|
|
772
|
+
const timeout = setTimeout(() => {
|
|
773
|
+
log(`Task timed out after ${this.config.taskTimeoutMs}ms — aborting`);
|
|
774
|
+
ac.abort();
|
|
775
|
+
}, this.config.taskTimeoutMs);
|
|
776
|
+
try {
|
|
777
|
+
finalState = await Promise.race([
|
|
778
|
+
invokeTask(ac.signal),
|
|
779
|
+
timeoutPromise(this.config.taskTimeoutMs),
|
|
780
|
+
]);
|
|
781
|
+
} finally {
|
|
782
|
+
clearTimeout(timeout);
|
|
783
|
+
}
|
|
784
|
+
} else {
|
|
785
|
+
finalState = await invokeTask();
|
|
786
|
+
}
|
|
758
787
|
|
|
759
788
|
const verdict = finalState.review?.verdict ?? "blocked";
|
|
760
789
|
const iterations = finalState.iteration ?? 0;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@pi-harness/capability-registry",
|
|
3
|
-
"version": "1.1.
|
|
3
|
+
"version": "1.1.36",
|
|
4
4
|
"description": "Capability Registry for pi-harness-runtime — tracks model capabilities and enables capability-based routing",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.js",
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@pi-harness/provider-router",
|
|
3
|
-
"version": "1.1.
|
|
3
|
+
"version": "1.1.36",
|
|
4
4
|
"description": "Enhanced Provider Router for pi-harness-runtime — intelligent routing with capabilities, costs, and quotas",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/provider-router.js",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"glm-usage.d.ts","sourceRoot":"","sources":["../src/glm-usage.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE3C,MAAM,WAAW,YAAY;IAC5B,QAAQ,EAAE,KAAK,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,6CAA6C;IAC7C,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,mCAAmC;IACnC,YAAY,EAAE,MAAM,CAAC;IACrB,mBAAmB;IACnB,SAAS,EAAE,OAAO,CAAC;IACnB,iBAAiB;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,0BAA0B;IAC1B,SAAS,EAAE,QAAQ,GAAG,gBAAgB,GAAG,YAAY,GAAG,SAAS,CAAC;IAClE,gCAAgC;IAChC,eAAe,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,cAAc;IAC9B,wDAAwD;IACxD,aAAa,CAAC,EAAE,CAAC,IAAI,EAAE,YAAY,KAAK,IAAI,CAAC;CAC7C;
|
|
1
|
+
{"version":3,"file":"glm-usage.d.ts","sourceRoot":"","sources":["../src/glm-usage.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE3C,MAAM,WAAW,YAAY;IAC5B,QAAQ,EAAE,KAAK,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,6CAA6C;IAC7C,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,mCAAmC;IACnC,YAAY,EAAE,MAAM,CAAC;IACrB,mBAAmB;IACnB,SAAS,EAAE,OAAO,CAAC;IACnB,iBAAiB;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,0BAA0B;IAC1B,SAAS,EAAE,QAAQ,GAAG,gBAAgB,GAAG,YAAY,GAAG,SAAS,CAAC;IAClE,gCAAgC;IAChC,eAAe,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,cAAc;IAC9B,wDAAwD;IACxD,aAAa,CAAC,EAAE,CAAC,IAAI,EAAE,YAAY,KAAK,IAAI,CAAC;CAC7C;AA6CD,qBAAa,gBAAiB,SAAQ,YAAY;IACjD,OAAO,CAAC,aAAa,CAA6B;IAClD,OAAO,CAAC,aAAa,CAAC,CAA+B;IAErD,YAAY,MAAM,GAAE,cAAmB,EAGtC;IAED;;;OAGG;IACH,iBAAiB,IAAI,OAAO,CAE3B;IAED;;;OAGG;IACH,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG,YAAY,GAAG,IAAI,CAqBtD;IAED;;OAEG;IACH,OAAO,CAAC,cAAc;IA4BtB;;OAEG;IACH,OAAO,CAAC,oBAAoB;IA2B5B;;OAEG;IACH,YAAY,IAAI,YAAY,GAAG,IAAI,CAElC;IAED;;OAEG;IACH,KAAK,IAAI,IAAI,CAEZ;IAED;;;OAGG;IACG,QAAQ,IAAI,OAAO,CAAC,YAAY,CAAC,CAatC;IAED;;OAEG;IACG,eAAe,IAAI,OAAO,CAAC,MAAM,CAAC,CAGvC;IAED;;OAEG;IACG,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC,CAGpC;CACD;AAED;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG"}
|
|
@@ -37,8 +37,15 @@ const GLM_QUOTA_PATTERNS = [
|
|
|
37
37
|
pattern: /ZhipuAI|GLM.*(?:exhausted|limit|quota)/i,
|
|
38
38
|
limitType: "tokens",
|
|
39
39
|
},
|
|
40
|
+
// MiniMax 429: "Usage limit reached for N hour. Your limit will reset at 2026-08-31 19:17:01"
|
|
41
|
+
{
|
|
42
|
+
pattern: /Usage limit.*reset/i,
|
|
43
|
+
limitType: "tokens",
|
|
44
|
+
},
|
|
40
45
|
];
|
|
41
46
|
const RESET_TIME_PATTERNS = [
|
|
47
|
+
// "reset at 2026-08-31 19:17:01" (MiniMax 429 format)
|
|
48
|
+
/reset\s+(?:at\s+)?(\d{4}-\d{2}-\d{2})\s+(\d{2}):(\d{2})/i,
|
|
42
49
|
/reset(?:s)?\s+(?:at|in)\s+(\d{1,2}):(\d{2})/i,
|
|
43
50
|
/(?:at|in)\s+(\d{1,2}):(\d{2})/i,
|
|
44
51
|
/retry\s+after\s+(\d{1,2}):(\d{2})/i,
|
|
@@ -85,13 +92,19 @@ export class GLMUsageProvider extends EventEmitter {
|
|
|
85
92
|
for (const pattern of RESET_TIME_PATTERNS) {
|
|
86
93
|
const match = message.match(pattern);
|
|
87
94
|
if (match) {
|
|
95
|
+
// Pattern 0: "reset at YYYY-MM-DD HH:MM" — 4 groups: date, hour, minute (+ full match = 4)
|
|
96
|
+
if (match.length === 4) {
|
|
97
|
+
const resetTime = new Date(`${match[1].trim()}T${match[2]}:${match[3]}:00.000Z`);
|
|
98
|
+
if (resetTime.getTime() > Date.now()) {
|
|
99
|
+
return resetTime.toISOString();
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
// Patterns 1-3: HH:MM only — construct date for today or tomorrow
|
|
88
103
|
const hour = parseInt(match[1], 10);
|
|
89
104
|
const minute = parseInt(match[2], 10);
|
|
90
|
-
// Convert to ISO string for today or tomorrow
|
|
91
105
|
const now = new Date();
|
|
92
106
|
const resetTime = new Date(now);
|
|
93
107
|
resetTime.setHours(hour, minute, 0, 0);
|
|
94
|
-
// If time has passed today, assume tomorrow
|
|
95
108
|
if (resetTime <= now) {
|
|
96
109
|
resetTime.setDate(resetTime.getDate() + 1);
|
|
97
110
|
}
|
|
@@ -116,7 +129,7 @@ export class GLMUsageProvider extends EventEmitter {
|
|
|
116
129
|
provider: "glm",
|
|
117
130
|
timestamp: new Date().toISOString(),
|
|
118
131
|
usedPct,
|
|
119
|
-
remainingPct: usedPct
|
|
132
|
+
remainingPct: usedPct === undefined ? 0 : 100 - usedPct,
|
|
120
133
|
exhausted: true,
|
|
121
134
|
resetsAt,
|
|
122
135
|
limitType,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"glm-usage.js","sourceRoot":"","sources":["../src/glm-usage.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAwB3C;;;GAGG;AACH,MAAM,kBAAkB,GAAG;IAC1B,sBAAsB;IACtB;QACC,OAAO,EAAE,2DAA2D;QACpE,SAAS,EAAE,gBAAyB;KACpC;IACD;QACC,OAAO,EAAE,kEAAkE;QAC3E,SAAS,EAAE,QAAiB;KAC5B;IACD,sBAAsB;IACtB;QACC,OAAO,EAAE,2CAA2C;QACpD,SAAS,EAAE,SAAkB;KAC7B;IACD;QACC,OAAO,EAAE,6CAA6C;QACtD,SAAS,EAAE,QAAiB;KAC5B;IACD,gCAAgC;IAChC;QACC,OAAO,EAAE,yCAAyC;QAClD,SAAS,EAAE,QAAiB;KAC5B;CACD,CAAC;AAEF,MAAM,mBAAmB,GAAG;IAC3B,8CAA8C;IAC9C,gCAAgC;IAChC,oCAAoC;CACpC,CAAC;AAEF,MAAM,OAAO,gBAAiB,SAAQ,YAAY;IACzC,aAAa,GAAwB,IAAI,CAAC;IAC1C,aAAa,CAAgC;IAErD,YAAY,MAAM,GAAmB,EAAE;QACtC,KAAK,EAAE,CAAC;QACR,IAAI,CAAC,aAAa,GAAG,MAAM,CAAC,aAAa,CAAC;IAC3C,CAAC;IAED;;;OAGG;IACH,iBAAiB;QAChB,OAAO,IAAI,CAAC,CAAC,sCAAsC;IACpD,CAAC;IAED;;;OAGG;IACH,iBAAiB,CAAC,OAAe;QAChC,uCAAuC;QACvC,KAAK,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,IAAI,kBAAkB,EAAE,CAAC;YACzD,IAAI,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;gBAC3B,MAAM,SAAS,GAAG,IAAI,CAAC,oBAAoB,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;gBAEhE,IAAI,SAAS,EAAE,CAAC;oBACf,IAAI,CAAC,aAAa,GAAG,SAAS,CAAC;oBAE/B,aAAa;oBACb,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;oBAE9B,uBAAuB;oBACvB,IAAI,CAAC,aAAa,EAAE,CAAC,SAAS,CAAC,CAAC;oBAEhC,OAAO,SAAS,CAAC;gBAClB,CAAC;YACF,CAAC;QACF,CAAC;QAED,OAAO,IAAI,CAAC;IACb,CAAC;IAED;;OAEG;IACK,cAAc,CAAC,OAAe;QACrC,KAAK,MAAM,OAAO,IAAI,mBAAmB,EAAE,CAAC;YAC3C,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;YACrC,IAAI,KAAK,EAAE,CAAC;gBACX,MAAM,IAAI,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;gBACpC,MAAM,MAAM,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"glm-usage.js","sourceRoot":"","sources":["../src/glm-usage.ts"],"names":[],"mappings":"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"}
|
|
@@ -61,9 +61,16 @@ const GLM_QUOTA_PATTERNS = [
|
|
|
61
61
|
pattern: /ZhipuAI|GLM.*(?:exhausted|limit|quota)/i,
|
|
62
62
|
limitType: "tokens" as const,
|
|
63
63
|
},
|
|
64
|
+
// MiniMax 429: "Usage limit reached for N hour. Your limit will reset at 2026-08-31 19:17:01"
|
|
65
|
+
{
|
|
66
|
+
pattern: /Usage limit.*reset/i,
|
|
67
|
+
limitType: "tokens" as const,
|
|
68
|
+
},
|
|
64
69
|
];
|
|
65
70
|
|
|
66
71
|
const RESET_TIME_PATTERNS = [
|
|
72
|
+
// "reset at 2026-08-31 19:17:01" (MiniMax 429 format)
|
|
73
|
+
/reset\s+(?:at\s+)?(\d{4}-\d{2}-\d{2})\s+(\d{2}):(\d{2})/i,
|
|
67
74
|
/reset(?:s)?\s+(?:at|in)\s+(\d{1,2}):(\d{2})/i,
|
|
68
75
|
/(?:at|in)\s+(\d{1,2}):(\d{2})/i,
|
|
69
76
|
/retry\s+after\s+(\d{1,2}):(\d{2})/i,
|
|
@@ -120,23 +127,27 @@ export class GLMUsageProvider extends EventEmitter {
|
|
|
120
127
|
for (const pattern of RESET_TIME_PATTERNS) {
|
|
121
128
|
const match = message.match(pattern);
|
|
122
129
|
if (match) {
|
|
130
|
+
// Pattern 0: "reset at YYYY-MM-DD HH:MM" — 4 groups: date, hour, minute (+ full match = 4)
|
|
131
|
+
if (match.length === 4) {
|
|
132
|
+
const resetTime = new Date(
|
|
133
|
+
`${match[1].trim()}T${match[2]}:${match[3]}:00.000Z`,
|
|
134
|
+
);
|
|
135
|
+
if (resetTime.getTime() > Date.now()) {
|
|
136
|
+
return resetTime.toISOString();
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
// Patterns 1-3: HH:MM only — construct date for today or tomorrow
|
|
123
140
|
const hour = parseInt(match[1], 10);
|
|
124
141
|
const minute = parseInt(match[2], 10);
|
|
125
|
-
|
|
126
|
-
// Convert to ISO string for today or tomorrow
|
|
127
142
|
const now = new Date();
|
|
128
143
|
const resetTime = new Date(now);
|
|
129
144
|
resetTime.setHours(hour, minute, 0, 0);
|
|
130
|
-
|
|
131
|
-
// If time has passed today, assume tomorrow
|
|
132
145
|
if (resetTime <= now) {
|
|
133
146
|
resetTime.setDate(resetTime.getDate() + 1);
|
|
134
147
|
}
|
|
135
|
-
|
|
136
148
|
return resetTime.toISOString();
|
|
137
149
|
}
|
|
138
150
|
}
|
|
139
|
-
|
|
140
151
|
return undefined;
|
|
141
152
|
}
|
|
142
153
|
|
|
@@ -162,7 +173,7 @@ export class GLMUsageProvider extends EventEmitter {
|
|
|
162
173
|
provider: "glm",
|
|
163
174
|
timestamp: new Date().toISOString(),
|
|
164
175
|
usedPct,
|
|
165
|
-
remainingPct: usedPct
|
|
176
|
+
remainingPct: usedPct === undefined ? 0 : 100 - usedPct,
|
|
166
177
|
exhausted: true,
|
|
167
178
|
resetsAt,
|
|
168
179
|
limitType,
|