@manishbht/helpcode 0.3.5 → 0.3.6

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.
@@ -12,11 +12,21 @@ import * as path from 'path';
12
12
  import { loadState } from '../core/state.js';
13
13
  import { renderCockpit } from '../core/cockpit.js';
14
14
  import { buildCockpitViewModel, renderCockpitHtml } from '../core/cockpitHtml.js';
15
+ import { quotaFor } from '../core/quota.js';
15
16
  import { c, log } from '../lib/ui.js';
16
17
  export async function handleCockpit(opts = {}) {
17
18
  const state = loadState();
18
19
  if (opts.html) {
19
- const vm = buildCockpitViewModel(state.sousChefLog);
20
+ // Real quota fraction per provider, for the panel bars.
21
+ const quotaLookup = (providerId) => {
22
+ if (!state.quotas)
23
+ return null;
24
+ const s = quotaFor(state.quotas, providerId);
25
+ if (!s || s.limitPerDay === null)
26
+ return null;
27
+ return s.usedToday / s.limitPerDay;
28
+ };
29
+ const vm = buildCockpitViewModel(state.sousChefLog, quotaLookup);
20
30
  const html = renderCockpitHtml(vm);
21
31
  const outPath = opts.out ?? path.join('.helpcode', 'cockpit.html');
22
32
  const dir = path.dirname(outPath);
@@ -1 +1 @@
1
- {"version":3,"file":"cockpit.js","sourceRoot":"","sources":["../../../src/commands/cockpit.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EAAE,qBAAqB,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAClF,OAAO,EAAE,CAAC,EAAE,GAAG,EAAE,MAAM,cAAc,CAAC;AAEtC,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,OAAyC,EAAE;IAC7E,MAAM,KAAK,GAAG,SAAS,EAAE,CAAC;IAE1B,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;QACd,MAAM,EAAE,GAAG,qBAAqB,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;QACpD,MAAM,IAAI,GAAG,iBAAiB,CAAC,EAAE,CAAC,CAAC;QACnC,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,cAAc,CAAC,CAAC;QACnE,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QAClC,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC;YAAE,EAAE,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAChE,EAAE,CAAC,aAAa,CAAC,OAAO,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;QACzC,GAAG,CAAC,EAAE,CAAC,oBAAoB,OAAO,EAAE,CAAC,CAAC;QACtC,GAAG,CAAC,GAAG,CAAC,wBAAwB,GAAG,CAAC,CAAC,IAAI,CAAC,QAAQ,OAAO,EAAE,CAAC,CAAC,CAAC;QAC9D,OAAO,CAAC,CAAC;IACX,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC;IAC9C,OAAO,CAAC,CAAC;AACX,CAAC"}
1
+ {"version":3,"file":"cockpit.js","sourceRoot":"","sources":["../../../src/commands/cockpit.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EAAE,qBAAqB,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAClF,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,CAAC,EAAE,GAAG,EAAE,MAAM,cAAc,CAAC;AAEtC,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,OAAyC,EAAE;IAC7E,MAAM,KAAK,GAAG,SAAS,EAAE,CAAC;IAE1B,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;QACd,wDAAwD;QACxD,MAAM,WAAW,GAAG,CAAC,UAAkB,EAAiB,EAAE;YACxD,IAAI,CAAC,KAAK,CAAC,MAAM;gBAAE,OAAO,IAAI,CAAC;YAC/B,MAAM,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;YAC7C,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,WAAW,KAAK,IAAI;gBAAE,OAAO,IAAI,CAAC;YAC9C,OAAO,CAAC,CAAC,SAAS,GAAG,CAAC,CAAC,WAAW,CAAC;QACrC,CAAC,CAAC;QACF,MAAM,EAAE,GAAG,qBAAqB,CAAC,KAAK,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC;QACjE,MAAM,IAAI,GAAG,iBAAiB,CAAC,EAAE,CAAC,CAAC;QACnC,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,cAAc,CAAC,CAAC;QACnE,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QAClC,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC;YAAE,EAAE,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAChE,EAAE,CAAC,aAAa,CAAC,OAAO,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;QACzC,GAAG,CAAC,EAAE,CAAC,oBAAoB,OAAO,EAAE,CAAC,CAAC;QACtC,GAAG,CAAC,GAAG,CAAC,wBAAwB,GAAG,CAAC,CAAC,IAAI,CAAC,QAAQ,OAAO,EAAE,CAAC,CAAC,CAAC;QAC9D,OAAO,CAAC,CAAC;IACX,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC;IAC9C,OAAO,CAAC,CAAC;AACX,CAAC"}
@@ -46,7 +46,7 @@ export interface CockpitViewModel {
46
46
  coming: ComingVM[];
47
47
  generatedAt: string;
48
48
  }
49
- export declare function buildCockpitViewModel(log: SousChefEvent[]): CockpitViewModel;
49
+ export declare function buildCockpitViewModel(log: SousChefEvent[], quotaLookup?: (providerId: string) => number | null): CockpitViewModel;
50
50
  /** Turn the real event log into helpcode-shell-style terminal lines. */
51
51
  export declare function buildCliLines(log: SousChefEvent[]): CliLineVM[];
52
52
  export declare function renderCockpitHtml(vm: CockpitViewModel): string;
@@ -16,6 +16,18 @@
16
16
  */
17
17
  import { summariseWorkers, sessionMetrics } from './cockpit.js';
18
18
  const RECENT_CAP = 12;
19
+ /** Map a model string back to its provider id, for quota lookup. */
20
+ function providerIdFromModel(model) {
21
+ if (!model)
22
+ return null;
23
+ if (model.startsWith('gemini'))
24
+ return 'gemini';
25
+ if (model.startsWith('grok'))
26
+ return 'grok';
27
+ if (model.startsWith('gpt'))
28
+ return 'openai';
29
+ return null;
30
+ }
19
31
  function tierLabel(kind) {
20
32
  switch (kind) {
21
33
  case 'local': return 'local';
@@ -32,15 +44,27 @@ function comingCatalogue() {
32
44
  { name: 'Live quota bars', note: 'real per-provider free-tier usage tracking' },
33
45
  ];
34
46
  }
35
- export function buildCockpitViewModel(log) {
36
- const workers = summariseWorkers(log).map(w => ({
37
- model: w.model ?? tierLabel(w.kind),
38
- kind: w.kind,
39
- tierLabel: tierLabel(w.kind),
40
- events: w.eventsThisSession,
41
- lastSummary: w.lastSummary,
42
- quotaUsed: w.quotaUsed,
43
- }));
47
+ export function buildCockpitViewModel(log, quotaLookup) {
48
+ const workers = summariseWorkers(log).map(w => {
49
+ let quotaUsed = w.quotaUsed;
50
+ // For remote workers, look up real quota fraction by provider id.
51
+ if (w.kind === 'remote' && quotaLookup) {
52
+ const pid = providerIdFromModel(w.model);
53
+ if (pid) {
54
+ const frac = quotaLookup(pid);
55
+ if (frac !== null)
56
+ quotaUsed = frac;
57
+ }
58
+ }
59
+ return {
60
+ model: w.model ?? tierLabel(w.kind),
61
+ kind: w.kind,
62
+ tierLabel: tierLabel(w.kind),
63
+ events: w.eventsThisSession,
64
+ lastSummary: w.lastSummary,
65
+ quotaUsed,
66
+ };
67
+ });
44
68
  const recent = [...log]
45
69
  .sort((a, b) => a.at.localeCompare(b.at))
46
70
  .slice(-RECENT_CAP)
@@ -197,7 +221,7 @@ export function renderCockpitHtml(vm) {
197
221
  --brick:#cc785c;--brick2:#da7756;--brick-dim:#2a1610;
198
222
  --font-mono:'JetBrains Mono','Fira Mono','Courier New',monospace;
199
223
  }
200
- body{background:var(--bg);color:var(--text);font-family:'system-ui',sans-serif;font-size:13px;min-height:800px;padding:12px;display:flex;flex-direction:column;gap:8px}
224
+ body{background:var(--bg);color:var(--text);font-family:'system-ui',sans-serif;font-size:13px;min-height:800px;padding:12px;display:flex;flex-direction:column;gap:8px;max-width:1400px;margin:0 auto}
201
225
  .sr-only{position:absolute;width:1px;height:1px;overflow:hidden}
202
226
  .topbar{display:flex;align-items:center;justify-content:space-between;padding:8px 12px;background:var(--bg2);border:0.5px solid var(--border);border-radius:8px}
203
227
  .topbar-left{display:flex;align-items:center;gap:12px}
@@ -354,7 +378,7 @@ footer{color:var(--text3);font-size:10px;margin-top:4px;padding:8px 4px;text-ali
354
378
  <span style="margin-left:6px;font-size:10px;color:var(--text3)">helpcode · sous-chef shell · live</span>
355
379
  </div>
356
380
  <div class="cli-output">
357
- \${vm.cli.map(l => \`<div class="cli-line-\${l.kind}">\${esc(l.text)}</div>\`).join('')}
381
+ ${vm.cli.map(l => `<div class="cli-line-${l.kind}">${esc(l.text)}</div>`).join('')}
358
382
  </div>
359
383
  <div class="cli-input-row">
360
384
  <span class="cli-prompt">\u276f</span>
@@ -1 +1 @@
1
- {"version":3,"file":"cockpitHtml.js","sourceRoot":"","sources":["../../../src/core/cockpitHtml.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"cockpitHtml.js","sourceRoot":"","sources":["../../../src/core/cockpitHtml.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAGH,OAAO,EAAE,gBAAgB,EAAE,cAAc,EAAkB,MAAM,cAAc,CAAC;AAkChF,MAAM,UAAU,GAAG,EAAE,CAAC;AAEtB,oEAAoE;AACpE,SAAS,mBAAmB,CAAC,KAAoB;IAC/C,IAAI,CAAC,KAAK;QAAE,OAAO,IAAI,CAAC;IACxB,IAAI,KAAK,CAAC,UAAU,CAAC,QAAQ,CAAC;QAAE,OAAO,QAAQ,CAAC;IAChD,IAAI,KAAK,CAAC,UAAU,CAAC,MAAM,CAAC;QAAE,OAAO,MAAM,CAAC;IAC5C,IAAI,KAAK,CAAC,UAAU,CAAC,KAAK,CAAC;QAAE,OAAO,QAAQ,CAAC;IAC7C,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,SAAS,CAAC,IAAgB;IACjC,QAAQ,IAAI,EAAE,CAAC;QACb,KAAK,OAAO,CAAC,CAAC,OAAO,OAAO,CAAC;QAC7B,KAAK,QAAQ,CAAC,CAAC,OAAO,WAAW,CAAC;QAClC,KAAK,WAAW,CAAC,CAAC,OAAO,MAAM,CAAC;QAChC,KAAK,eAAe,CAAC,CAAC,OAAO,MAAM,CAAC;IACtC,CAAC;AACH,CAAC;AAED,SAAS,eAAe;IACtB,OAAO;QACL,EAAE,IAAI,EAAE,mBAAmB,EAAE,IAAI,EAAE,2DAA2D,EAAE;QAChG,EAAE,IAAI,EAAE,oBAAoB,EAAE,IAAI,EAAE,iDAAiD,EAAE;QACvF,EAAE,IAAI,EAAE,gBAAgB,EAAE,IAAI,EAAE,mDAAmD,EAAE;QACrF,EAAE,IAAI,EAAE,iBAAiB,EAAE,IAAI,EAAE,4CAA4C,EAAE;KAChF,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,qBAAqB,CACnC,GAAoB,EACpB,WAAmD;IAEnD,MAAM,OAAO,GAAc,gBAAgB,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE;QACvD,IAAI,SAAS,GAAG,CAAC,CAAC,SAAS,CAAC;QAC5B,kEAAkE;QAClE,IAAI,CAAC,CAAC,IAAI,KAAK,QAAQ,IAAI,WAAW,EAAE,CAAC;YACvC,MAAM,GAAG,GAAG,mBAAmB,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;YACzC,IAAI,GAAG,EAAE,CAAC;gBACR,MAAM,IAAI,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC;gBAC9B,IAAI,IAAI,KAAK,IAAI;oBAAE,SAAS,GAAG,IAAI,CAAC;YACtC,CAAC;QACH,CAAC;QACD,OAAO;YACL,KAAK,EAAE,CAAC,CAAC,KAAK,IAAI,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC;YACnC,IAAI,EAAE,CAAC,CAAC,IAAI;YACZ,SAAS,EAAE,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC;YAC5B,MAAM,EAAE,CAAC,CAAC,iBAAiB;YAC3B,WAAW,EAAE,CAAC,CAAC,WAAW;YAC1B,SAAS;SACV,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,MAAM,MAAM,GAAiB,CAAC,GAAG,GAAG,CAAC;SAClC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;SACxC,KAAK,CAAC,CAAC,UAAU,CAAC;SAClB,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QACT,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,EAAE,EAAE,EAAE,CAAC;QACxB,GAAG,EAAE,CAAC,CAAC,KAAK,IAAI,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC;QACnC,OAAO,EAAE,CAAC,CAAC,OAAO;QAClB,OAAO,EAAE,CAAC,CAAC,OAAO;KACnB,CAAC,CAAC,CAAC;IAEN,6EAA6E;IAC7E,MAAM,GAAG,GAAgB,aAAa,CAAC,GAAG,CAAC,CAAC;IAE5C,OAAO;QACL,OAAO;QACP,OAAO,EAAE,cAAc,CAAC,GAAG,CAAC;QAC5B,MAAM;QACN,GAAG;QACH,MAAM,EAAE,eAAe,EAAE;QACzB,WAAW,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;KACtC,CAAC;AACJ,CAAC;AAED,0DAA0D;AAC1D,SAAS,QAAQ,CAAC,IAA2B;IAC3C,QAAQ,IAAI,EAAE,CAAC;QACb,KAAK,gBAAgB,CAAC,CAAC,OAAO,QAAQ,CAAC;QACvC,KAAK,eAAe,CAAC,CAAC,OAAO,QAAQ,CAAC;QACtC,KAAK,eAAe,CAAC,CAAC,OAAO,MAAM,CAAC;QACpC,OAAO,CAAC,CAAC,OAAO,MAAM,CAAC;IACzB,CAAC;AACH,CAAC;AAED,wEAAwE;AACxE,MAAM,UAAU,aAAa,CAAC,GAAoB;IAChD,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACrB,OAAO;YACL,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,sBAAsB,EAAE;YAChD,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,0CAA0C,EAAE;YACjE,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,sDAAsD,EAAE;SAC9E,CAAC;IACJ,CAAC;IACD,MAAM,MAAM,GAAG,CAAC,GAAG,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IAC3E,MAAM,KAAK,GAAgB,EAAE,CAAC;IAC9B,KAAK,MAAM,CAAC,IAAI,MAAM,EAAE,CAAC;QACvB,MAAM,GAAG,GAAG,CAAC,CAAC,KAAK,IAAI,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;QAC3C,MAAM,IAAI,GAAG,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QAC9B,IAAI,CAAC,CAAC,OAAO,KAAK,IAAI,EAAE,CAAC;YACvB,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,YAAY,IAAI,WAAW,GAAG,KAAK,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;QAClH,CAAC;aAAM,IAAI,CAAC,CAAC,OAAO,KAAK,WAAW,EAAE,CAAC;YACrC,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,YAAY,IAAI,sCAAsC,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;QACxG,CAAC;aAAM,CAAC;YACN,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,YAAY,IAAI,qBAAqB,GAAG,WAAW,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;QACpG,CAAC;IACH,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,6EAA6E;AAE7E,SAAS,GAAG,CAAC,CAAS;IACpB,OAAO,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;AACtG,CAAC;AAED,SAAS,QAAQ,CAAC,IAAgB;IAChC,IAAI,IAAI,KAAK,QAAQ;QAAE,OAAO,EAAE,GAAG,EAAE,YAAY,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;IACnE,IAAI,IAAI,KAAK,WAAW;QAAE,OAAO,EAAE,GAAG,EAAE,YAAY,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;IACtE,IAAI,IAAI,KAAK,eAAe;QAAE,OAAO,EAAE,GAAG,EAAE,YAAY,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;IAC1E,OAAO,EAAE,GAAG,EAAE,cAAc,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC;AACjD,CAAC;AAED,mEAAmE;AACnE,SAAS,SAAS,CAAC,CAAU;IAC3B,MAAM,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;IAC3B,wFAAwF;IACxF,MAAM,UAAU,GAAG,CAAC,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,SAAS;QAC/C,CAAC,CAAC,CAAC,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,eAAe;YACvC,CAAC,CAAC,CAAC,CAAC,IAAI,KAAK,eAAe,CAAC,CAAC,CAAC,iBAAiB;gBAChD,CAAC,CAAC,QAAQ,CAAC;IACb,0EAA0E;IAC1E,MAAM,SAAS,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,WAAW,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,WAAW;QAChE,CAAC,CAAC,sBAAsB,CAAC,IAAI,CAAC,CAAC,CAAC,WAAW,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,MAAM;YAC3D,CAAC,CAAC,SAAS,CAAC;IACd,4EAA4E;IAC5E,IAAI,SAAS,GAAG,OAAO,CAAC;IACxB,IAAI,GAAW,CAAC;IAChB,IAAI,CAAC,CAAC,SAAS,KAAK,IAAI,EAAE,CAAC;QACzB,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,GAAG,GAAG,CAAC,CAAC;QACpC,SAAS,GAAG,GAAG,GAAG,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,GAAG,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC;IAC9D,CAAC;SAAM,CAAC;QACN,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC;IACrC,CAAC;IACD,MAAM,QAAQ,GAAG,CAAC,CAAC,SAAS,KAAK,IAAI;QACnC,CAAC,CAAC,2BAA2B,GAAG,UAAU;QAC1C,CAAC,CAAC,2BAA2B,CAAC,CAAC,MAAM,SAAS,CAAC;IACjD,OAAO;4BACmB,UAAU;;mCAEH,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC;wCACP,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,KAAK;;6DAEI,QAAQ,uDAAuD,SAAS,kBAAkB,GAAG;8BAC5H,SAAS,KAAK,CAAC,CAAC,MAAM,cAAc,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC;;yDAEzB,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,MAAM;;WAEzF,CAAC;AACZ,CAAC;AAED,kFAAkF;AAClF,SAAS,SAAS,CAAC,IAAY,EAAE,IAAqB,EAAE,IAAY;IAClE,MAAM,GAAG,GAAG,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,YAAY,CAAC;IAC1D,gFAAgF;IAChF,MAAM,UAAU,GAAG,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC;IAC1D,OAAO;4BACmB,UAAU;;;mCAGH,GAAG,CAAC,IAAI,CAAC;wCACJ,GAAG,KAAK,IAAI;;mEAEe,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,OAAO,4EAA4E,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO;oCACnL,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,mCAAmC,CAAC,CAAC,CAAC,eAAe;2EAChC,GAAG,CAAC,IAAI,CAAC;WACzE,CAAC;AACZ,CAAC;AAED,SAAS,QAAQ,CAAC,KAAmB;IACnC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,OAAO,2EAA2E,CAAC;IACrF,CAAC;IACD,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE;QACnB,MAAM,GAAG,GAAG,CAAC,CAAC,OAAO,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,KAAK,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC;QAChF,OAAO,8CAA8C,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,+BAA+B,GAAG,KAAK,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,gCAAgC,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,eAAe,CAAC;IACjL,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AACd,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,EAAoB;IACpD,MAAM,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC;IACrB,yFAAyF;IACzF,MAAM,IAAI,GAAG,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;IACvC,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,SAAS,CAAC,gBAAgB,EAAE,MAAM,EAAE,wBAAwB,CAAC,CAAC;IAC9G,MAAM,WAAW,GAAG;QAClB,IAAI,CAAC,CAAC,CAAC,IAAI,SAAS,CAAC,QAAQ,EAAE,MAAM,EAAE,uCAAuC,CAAC;QAC/E,SAAS,CAAC,aAAa,EAAE,MAAM,EAAE,+BAA+B,CAAC;KAClE,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAEX,MAAM,SAAS,GAAG,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC;IACpC,MAAM,GAAG,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2FAkH6E,CAAC;IAE1F,OAAO;;;;SAIA,GAAG;;;;;;;;qCAQyB,SAAS;;;;gCAId,CAAC,CAAC,WAAW,iCAAiC,CAAC,CAAC,cAAc;;;;;4DAKlC,UAAU;;;;sGAIgC,CAAC,CAAC,WAAW;sGACb,CAAC,CAAC,WAAW;uGACZ,CAAC,CAAC,SAAS;0GACR,CAAC,CAAC,cAAc;;;;;;;;;;;;;;;;;;;;;;;;;;;;UA4BhH,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,wBAAwB,CAAC,CAAC,IAAI,KAAK,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC;;;;;;;;;4DAS9B,WAAW;;;;;;MAMjE,QAAQ,CAAC,EAAE,CAAC,MAAM,CAAC;;;;;;;;;;;;;;;;MAgBnB,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,sDAAsD,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC;;;;0IAIuB,GAAG,CAAC,EAAE,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;eAC7K,CAAC;AAChB,CAAC"}
@@ -21,14 +21,6 @@
21
21
  * a default is deprecated.
22
22
  */
23
23
  export const PROVIDERS = [
24
- {
25
- id: 'kimi',
26
- label: 'Kimi',
27
- baseUrl: 'https://api.moonshot.ai/v1',
28
- defaultModel: 'kimi-k2.5',
29
- envVar: 'MOONSHOT_API_KEY',
30
- freeTierNote: 'Moonshot free tier (~1000 req/day); verify current training policy.',
31
- },
32
24
  {
33
25
  id: 'grok',
34
26
  label: 'Grok',
@@ -1 +1 @@
1
- {"version":3,"file":"providers.js","sourceRoot":"","sources":["../../../src/core/providers.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"providers.js","sourceRoot":"","sources":["../../../src/core/providers.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,29 @@
1
+ /**
2
+ * Per-provider quota tracking (v0.3.6).
3
+ *
4
+ * Free tiers are rate-limited per day. helpcode tracks a best-effort daily
5
+ * request count per provider so the cockpit can show a real usage bar and the
6
+ * router can skip a provider that's exhausted (after a 429). This is NOT a
7
+ * perfect mirror of each provider's accounting (which is server-side and often
8
+ * per-project, not per-key) — it's a local estimate, enough to inform routing
9
+ * and the UI.
10
+ *
11
+ * Pure functions over a QuotaState object; `now` is injectable for tests.
12
+ * Counts reset when the UTC day rolls over.
13
+ */
14
+ import { QuotaState } from '../types.js';
15
+ import { QuotaStatus } from './souschef.js';
16
+ /**
17
+ * Known free-tier daily request limits (approximate, mid-2026; they drift).
18
+ * null = unknown limit (we still count, but can't show a fraction).
19
+ */
20
+ export declare const PROVIDER_LIMITS: Record<string, number | null>;
21
+ export declare function emptyQuotas(): QuotaState;
22
+ /** Record one request against a provider (increments today's count). */
23
+ export declare function recordRequest(q: QuotaState, provider: string, now?: Date): void;
24
+ /** Mark a provider throttled until the given time (e.g. after a 429). */
25
+ export declare function markThrottled(q: QuotaState, provider: string, until: Date, now?: Date): void;
26
+ /** Is the provider currently throttled? */
27
+ export declare function isThrottled(q: QuotaState, provider: string, now?: Date): boolean;
28
+ /** Build a QuotaStatus for the cockpit/router, accounting for day reset. */
29
+ export declare function quotaFor(q: QuotaState, provider: string, now?: Date): QuotaStatus | null;
@@ -0,0 +1,74 @@
1
+ /**
2
+ * Per-provider quota tracking (v0.3.6).
3
+ *
4
+ * Free tiers are rate-limited per day. helpcode tracks a best-effort daily
5
+ * request count per provider so the cockpit can show a real usage bar and the
6
+ * router can skip a provider that's exhausted (after a 429). This is NOT a
7
+ * perfect mirror of each provider's accounting (which is server-side and often
8
+ * per-project, not per-key) — it's a local estimate, enough to inform routing
9
+ * and the UI.
10
+ *
11
+ * Pure functions over a QuotaState object; `now` is injectable for tests.
12
+ * Counts reset when the UTC day rolls over.
13
+ */
14
+ /**
15
+ * Known free-tier daily request limits (approximate, mid-2026; they drift).
16
+ * null = unknown limit (we still count, but can't show a fraction).
17
+ */
18
+ export const PROVIDER_LIMITS = {
19
+ gemini: 1000, // Gemini 2.5 Flash-Lite free: ~1000 req/day
20
+ grok: null, // xAI free credits are $-based, not a clean req/day cap
21
+ openai: null, // depends on account tier
22
+ };
23
+ export function emptyQuotas() {
24
+ return { providers: {} };
25
+ }
26
+ function utcDay(now) {
27
+ return now.toISOString().slice(0, 10); // YYYY-MM-DD
28
+ }
29
+ /** Get the provider's record, resetting it if the stored day is stale. */
30
+ function currentRecord(q, provider, now) {
31
+ const today = utcDay(now);
32
+ const existing = q.providers[provider];
33
+ if (!existing || existing.day !== today) {
34
+ // New day (or first time): fresh count, but preserve a future throttle.
35
+ const throttledUntil = existing?.throttledUntil;
36
+ const fresh = { day: today, count: 0 };
37
+ if (throttledUntil && new Date(throttledUntil) > now) {
38
+ fresh.throttledUntil = throttledUntil;
39
+ }
40
+ q.providers[provider] = fresh;
41
+ }
42
+ return q.providers[provider];
43
+ }
44
+ /** Record one request against a provider (increments today's count). */
45
+ export function recordRequest(q, provider, now = new Date()) {
46
+ const rec = currentRecord(q, provider, now);
47
+ rec.count += 1;
48
+ }
49
+ /** Mark a provider throttled until the given time (e.g. after a 429). */
50
+ export function markThrottled(q, provider, until, now = new Date()) {
51
+ const rec = currentRecord(q, provider, now);
52
+ rec.throttledUntil = until.toISOString();
53
+ }
54
+ /** Is the provider currently throttled? */
55
+ export function isThrottled(q, provider, now = new Date()) {
56
+ const rec = q.providers[provider];
57
+ if (!rec?.throttledUntil)
58
+ return false;
59
+ return new Date(rec.throttledUntil) > now;
60
+ }
61
+ /** Build a QuotaStatus for the cockpit/router, accounting for day reset. */
62
+ export function quotaFor(q, provider, now = new Date()) {
63
+ if (!(provider in PROVIDER_LIMITS))
64
+ return null;
65
+ const today = utcDay(now);
66
+ const rec = q.providers[provider];
67
+ const usedToday = rec && rec.day === today ? rec.count : 0;
68
+ return {
69
+ usedToday,
70
+ limitPerDay: PROVIDER_LIMITS[provider],
71
+ throttled: isThrottled(q, provider, now),
72
+ };
73
+ }
74
+ //# sourceMappingURL=quota.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"quota.js","sourceRoot":"","sources":["../../../src/core/quota.ts"],"names":[],"mappings":"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"}
@@ -11,6 +11,7 @@
11
11
  * ChatGPT. A caller may pass a preferred id to override the order when that
12
12
  * provider has a key.
13
13
  */
14
+ import { QuotaStatus } from './souschef.js';
14
15
  export interface ResolvedProvider {
15
16
  id: string;
16
17
  label: string;
@@ -20,6 +21,8 @@ export interface ResolvedProvider {
20
21
  /** Run a prompt through this provider's client. Throws on failure. */
21
22
  generate: (prompt: string, timeoutMs?: number) => Promise<string>;
22
23
  }
24
+ /** Read-only: current quota status for a provider (for the cockpit). */
25
+ export declare function providerQuotaStatus(id: string, cwd?: string): QuotaStatus | null;
23
26
  /**
24
27
  * Find the first remote provider that has a key. If `preferred` is given and
25
28
  * that provider has a key, it wins; otherwise fall back to priority order.
@@ -11,36 +11,84 @@
11
11
  * ChatGPT. A caller may pass a preferred id to override the order when that
12
12
  * provider has a key.
13
13
  */
14
- import { PROVIDERS, openaiCompatGenerate } from './providers.js';
15
- import { geminiGenerate } from './gemini.js';
14
+ import { PROVIDERS, openaiCompatGenerate, OpenAICompatError } from './providers.js';
15
+ import { geminiGenerate, GeminiError } from './gemini.js';
16
16
  import { loadGeminiKey, loadProviderKey } from './keys.js';
17
+ import { loadState, saveState } from './state.js';
18
+ import { recordRequest, markThrottled, isThrottled, quotaFor } from './quota.js';
17
19
  const GEMINI_MODEL = 'gemini-2.5-flash-lite';
18
20
  /** Priority order for auto-selection (Gemini first, then the OAI-compat trio). */
19
- const PRIORITY = ['gemini', 'kimi', 'grok', 'openai'];
21
+ const PRIORITY = ['gemini', 'grok', 'openai'];
22
+ /**
23
+ * Persist a quota mutation: load state, mutate its quotas, save. Best-effort —
24
+ * quota tracking must never break the actual generation.
25
+ */
26
+ function withQuota(mutate) {
27
+ try {
28
+ const state = loadState();
29
+ if (!state.quotas)
30
+ state.quotas = { providers: {} };
31
+ mutate(state.quotas);
32
+ saveState(state);
33
+ }
34
+ catch {
35
+ // ignore — quota is advisory
36
+ }
37
+ }
38
+ /** Wrap a provider's raw generate to record usage and mark throttling on 429. */
39
+ function trackedGenerate(id, raw) {
40
+ return async (prompt, timeoutMs) => {
41
+ withQuota(q => recordRequest(q, id));
42
+ try {
43
+ return await raw(prompt, timeoutMs);
44
+ }
45
+ catch (e) {
46
+ const quotaHit = (e instanceof GeminiError && e.quotaExhausted)
47
+ || (e instanceof OpenAICompatError && e.quotaExhausted);
48
+ if (quotaHit) {
49
+ // back off this provider for an hour (best-effort; real retry-after varies)
50
+ const until = new Date(Date.now() + 60 * 60 * 1000);
51
+ withQuota(q => markThrottled(q, id, until));
52
+ }
53
+ throw e;
54
+ }
55
+ };
56
+ }
20
57
  function makeGemini(key) {
58
+ const raw = (prompt, timeoutMs = 30000) => geminiGenerate(prompt, { apiKey: key, model: GEMINI_MODEL, timeoutMs });
21
59
  return {
22
60
  id: 'gemini',
23
61
  label: 'Gemini',
24
62
  model: GEMINI_MODEL,
25
63
  key,
26
64
  freeTierNote: 'Gemini free tier — inputs may train Google models.',
27
- generate: (prompt, timeoutMs = 30000) => geminiGenerate(prompt, { apiKey: key, model: GEMINI_MODEL, timeoutMs }),
65
+ generate: trackedGenerate('gemini', raw),
28
66
  };
29
67
  }
30
68
  function makeOpenAICompat(p, key) {
69
+ const raw = (prompt, timeoutMs = 30000) => openaiCompatGenerate(prompt, {
70
+ baseUrl: p.baseUrl, model: p.defaultModel, apiKey: key, timeoutMs,
71
+ });
31
72
  return {
32
73
  id: p.id,
33
74
  label: p.label,
34
75
  model: p.defaultModel,
35
76
  key,
36
77
  freeTierNote: p.freeTierNote,
37
- generate: (prompt, timeoutMs = 30000) => openaiCompatGenerate(prompt, {
38
- baseUrl: p.baseUrl, model: p.defaultModel, apiKey: key, timeoutMs,
39
- }),
78
+ generate: trackedGenerate(p.id, raw),
40
79
  };
41
80
  }
42
- /** Resolve a single provider by id, if it has a key. */
81
+ /** Resolve a single provider by id, if it has a key and isn't throttled. */
43
82
  function resolveById(id, env, cwd) {
83
+ // Skip a provider currently backed off after a 429.
84
+ try {
85
+ const state = loadState(cwd);
86
+ if (state.quotas && isThrottled(state.quotas, id))
87
+ return null;
88
+ }
89
+ catch {
90
+ // if state can't be read, don't block resolution
91
+ }
44
92
  if (id === 'gemini') {
45
93
  const key = loadGeminiKey(cwd, env);
46
94
  return key ? makeGemini(key) : null;
@@ -51,6 +99,18 @@ function resolveById(id, env, cwd) {
51
99
  const key = loadProviderKey(p.envVar, p.id, cwd, env);
52
100
  return key ? makeOpenAICompat(p, key) : null;
53
101
  }
102
+ /** Read-only: current quota status for a provider (for the cockpit). */
103
+ export function providerQuotaStatus(id, cwd = process.cwd()) {
104
+ try {
105
+ const state = loadState(cwd);
106
+ if (!state.quotas)
107
+ return null;
108
+ return quotaFor(state.quotas, id);
109
+ }
110
+ catch {
111
+ return null;
112
+ }
113
+ }
54
114
  /**
55
115
  * Find the first remote provider that has a key. If `preferred` is given and
56
116
  * that provider has a key, it wins; otherwise fall back to priority order.
@@ -1 +1 @@
1
- {"version":3,"file":"remoteRouter.js","sourceRoot":"","sources":["../../../src/core/remoteRouter.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAAE,SAAS,EAAE,oBAAoB,EAAkB,MAAM,gBAAgB,CAAC;AACjF,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAY3D,MAAM,YAAY,GAAG,uBAAuB,CAAC;AAE7C,kFAAkF;AAClF,MAAM,QAAQ,GAAG,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC;AAEtD,SAAS,UAAU,CAAC,GAAW;IAC7B,OAAO;QACL,EAAE,EAAE,QAAQ;QACZ,KAAK,EAAE,QAAQ;QACf,KAAK,EAAE,YAAY;QACnB,GAAG;QACH,YAAY,EAAE,oDAAoD;QAClE,QAAQ,EAAE,CAAC,MAAM,EAAE,SAAS,GAAG,KAAK,EAAE,EAAE,CACtC,cAAc,CAAC,MAAM,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,YAAY,EAAE,SAAS,EAAE,CAAC;KAC1E,CAAC;AACJ,CAAC;AAED,SAAS,gBAAgB,CAAC,CAAiB,EAAE,GAAW;IACtD,OAAO;QACL,EAAE,EAAE,CAAC,CAAC,EAAE;QACR,KAAK,EAAE,CAAC,CAAC,KAAK;QACd,KAAK,EAAE,CAAC,CAAC,YAAY;QACrB,GAAG;QACH,YAAY,EAAE,CAAC,CAAC,YAAY;QAC5B,QAAQ,EAAE,CAAC,MAAM,EAAE,SAAS,GAAG,KAAK,EAAE,EAAE,CACtC,oBAAoB,CAAC,MAAM,EAAE;YAC3B,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC,YAAY,EAAE,MAAM,EAAE,GAAG,EAAE,SAAS;SAClE,CAAC;KACL,CAAC;AACJ,CAAC;AAED,wDAAwD;AACxD,SAAS,WAAW,CAClB,EAAU,EACV,GAAuC,EACvC,GAAW;IAEX,IAAI,EAAE,KAAK,QAAQ,EAAE,CAAC;QACpB,MAAM,GAAG,GAAG,aAAa,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;QACpC,OAAO,GAAG,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IACtC,CAAC;IACD,MAAM,CAAC,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;IAC3C,IAAI,CAAC,CAAC;QAAE,OAAO,IAAI,CAAC;IACpB,MAAM,GAAG,GAAG,eAAe,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,EAAE,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;IACtD,OAAO,GAAG,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;AAC/C,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,sBAAsB,CACpC,MAA0C,OAAO,CAAC,GAAG,EACrD,SAAkB,EAClB,MAAc,OAAO,CAAC,GAAG,EAAE;IAE3B,IAAI,SAAS,EAAE,CAAC;QACd,MAAM,CAAC,GAAG,WAAW,CAAC,SAAS,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;QAC3C,IAAI,CAAC;YAAE,OAAO,CAAC,CAAC;IAClB,CAAC;IACD,KAAK,MAAM,EAAE,IAAI,QAAQ,EAAE,CAAC;QAC1B,MAAM,CAAC,GAAG,WAAW,CAAC,EAAE,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;QACpC,IAAI,CAAC;YAAE,OAAO,CAAC,CAAC;IAClB,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC"}
1
+ {"version":3,"file":"remoteRouter.js","sourceRoot":"","sources":["../../../src/core/remoteRouter.ts"],"names":[],"mappings":"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"}
package/dist/src/index.js CHANGED
@@ -20,7 +20,7 @@ import { handleCockpit } from './commands/cockpit.js';
20
20
  import { handleReset } from './commands/reset.js';
21
21
  import { HelpcodeError } from './lib/errors.js';
22
22
  import { c, log } from './lib/ui.js';
23
- const VERSION = '0.3.5';
23
+ const VERSION = '0.3.6';
24
24
  const HELP = `helpcode v${VERSION}
25
25
 
26
26
  A local agent that makes Claude.ai conversations efficient enough to ship
@@ -72,12 +72,26 @@ export interface AgentState {
72
72
  sousChefLog: SousChefEvent[];
73
73
  /** One-time UI flags (e.g. consent notices already shown). Optional. */
74
74
  flags?: StateFlags;
75
+ /** Per-provider quota tracking (v0.3.6). Optional; absent = none recorded. */
76
+ quotas?: QuotaState;
75
77
  }
76
78
  /** One-time flags persisted so we don't repeat notices. All optional. */
77
79
  export interface StateFlags {
78
80
  /** True once the "sending code to a free tier" notice has been shown. */
79
81
  remoteCodeNoticeShown?: boolean;
80
82
  }
83
+ /** Per-provider quota tracking (v0.3.6). */
84
+ export interface ProviderQuota {
85
+ /** UTC day (YYYY-MM-DD) the count applies to. */
86
+ day: string;
87
+ /** Requests made on that day. */
88
+ count: number;
89
+ /** ISO timestamp the provider is throttled until (after a 429), if any. */
90
+ throttledUntil?: string;
91
+ }
92
+ export interface QuotaState {
93
+ providers: Record<string, ProviderQuota>;
94
+ }
81
95
  export interface CurrentTask {
82
96
  id: string;
83
97
  description: string;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@manishbht/helpcode",
3
- "version": "0.3.5",
3
+ "version": "0.3.6",
4
4
  "description": "A local agent that makes Claude.ai conversations efficient enough to ship real projects on a Pro subscription.",
5
5
  "type": "module",
6
6
  "main": "dist/src/index.js",