pi-zro-provider 1.3.13 → 1.3.15

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -15,7 +15,7 @@ _GLM-5.2, Kimi K3, and DeepSeek V4 / V4.1 Flash — run through the Zro inferenc
15
15
 
16
16
  ## Features
17
17
 
18
- - **8+ AI Models** — GLM-5.2 (default), Kimi K3, DeepSeek V4 Flash, and DeepSeek V4.1 Flash, straight from Zro's production catalog
18
+ - **9+ AI Models** — GLM-5.2 (default), Kimi K3, DeepSeek V4 Flash, and DeepSeek V4.1 Flash, straight from Zro's production catalog
19
19
  - **Native reasoning effort** — every model ships an endpoint-verified `piLevel` → level-id map (`glm-5.2`, `glm-5.3-flash`, `deepseek-v4-flash-0731`: full `off`–`max` ladder; `deepseek-v4.1-flash`: `low`/`high`/`max` — catalog has no `none`, and `xhigh`/`max` both send `max`; `kimi-k3`: `low`/`high`/`max` — the proxy rejects `medium` there), so `/thinking low` etc. maps exactly to what the Zro proxy accepts. Quirks: `glm-5.3-flash` silently disables thinking at `low`, so `minimal`/`low` map to `minimal`; `glm-5.3` mirrors flash's full ladder — Z.ai officially removed `none` for the 5.3 family, but the proxy accepts it and streams cleanly (occasionally a short chain-of-thought preamble surfaces in `content` before the answer), and `xhigh`/`max` both send `max`
20
20
  - **OpenAI-compatible API** at `https://zro.moonmath.ai/v1`
21
21
  - **Official catalog sync** from Zro's `/api/cli/models` endpoint — same one `zro models` uses
@@ -30,6 +30,7 @@ _GLM-5.2, Kimi K3, and DeepSeek V4 / V4.1 Flash — run through the Zro inferenc
30
30
  | DeepSeek V4 Flash | Text | 1.0M | 384K | $0.14 | $0.28 |
31
31
  | DeepSeek V4.1 Flash | Text + Image | 1.0M | 384K | $0.14 | $0.28 |
32
32
  | Dolly 1 | Text | 1.0M | 64K | — | — |
33
+ | Dolly 1 Security | Text | 1.0M | 64K | — | — |
33
34
  | GLM-5.2 | Text | 524K | 64K | $1.10 | $4.00 |
34
35
  | GLM-5.3 | Text | 1.0M | 131K | $1.40 | $4.40 |
35
36
  | GLM-5.3 Flash | Text + Image | 1.0M | 64K | $0.15 | $0.50 |
@@ -148,6 +149,7 @@ Edit `~/.pi/agent/extensions/zro.json` or run `/zro-status`:
148
149
  | `account` | `widget` \| `statusbar` \| `off` | `widget` |
149
150
  | `hideOnOtherProvider` | `true` \| `false` | `true` |
150
151
  | `lowBalanceUsd` | number \| `null` | `10` |
152
+ | `glyphs` | `auto` \| `unicode` \| `ascii` | `auto` |
151
153
 
152
154
  Non-interactive toggles:
153
155
 
@@ -156,10 +158,19 @@ Non-interactive toggles:
156
158
  /zro-status account widget|statusbar|off
157
159
  /zro-status hide true|false
158
160
  /zro-status lowBalance 25|off
161
+ /zro-status glyphs auto|unicode|ascii
159
162
  /zro-status refresh
160
163
  /zro-status reset
161
164
  ```
162
165
 
166
+ `glyphs: "auto"` swaps the emoji footer glyphs (bolt, gem, warn, separator) for ASCII equivalents on
167
+ legacy terminals (mintty/Cygwin), whose cell-width tables can disagree with the
168
+ extension's width math. On those terminals a full-width widget line can wrap
169
+ physically, which desynchronizes pi's renderer and leaves stale rows behind.
170
+ The widget also never paints the terminal's last column, and clamps an explicit
171
+ `unicode` choice to ASCII on legacy terminals; the statusbar is not edge-padded
172
+ and always honors the exact choice.
173
+
163
174
 
164
175
  ## Authentication
165
176
 
@@ -29,5 +29,35 @@
29
29
  "maxTokensField": "max_tokens"
30
30
  },
31
31
  "deprecatedAt": "2026-09-12T02:00:31.341Z"
32
+ },
33
+ "dolly1": {
34
+ "id": "dolly1",
35
+ "name": "Dolly 1",
36
+ "reasoning": true,
37
+ "thinkingLevelMap": {
38
+ "off": "none",
39
+ "minimal": null,
40
+ "low": null,
41
+ "medium": null,
42
+ "high": "high",
43
+ "xhigh": "max"
44
+ },
45
+ "input": [
46
+ "text"
47
+ ],
48
+ "cost": {
49
+ "input": 0,
50
+ "output": 0,
51
+ "cacheRead": 0,
52
+ "cacheWrite": 0
53
+ },
54
+ "contextWindow": 1048576,
55
+ "maxTokens": 64000,
56
+ "compat": {
57
+ "supportsDeveloperRole": false,
58
+ "supportsReasoningEffort": true,
59
+ "maxTokensField": "max_tokens"
60
+ },
61
+ "deprecatedAt": "2026-09-15T02:00:30.252Z"
32
62
  }
33
63
  }
package/index.ts CHANGED
@@ -53,7 +53,8 @@
53
53
  * "session": "widget", // "widget" | "statusbar" | "off"
54
54
  * "account": "widget", // "widget" | "statusbar" | "off"
55
55
  * "hideOnOtherProvider": true, // hide when a non-Zro model is active
56
- * "lowBalanceUsd": 10 // warn threshold, null/false disables
56
+ * "lowBalanceUsd": 10, // warn threshold, null/false disables
57
+ * "glyphs": "auto" // "auto" | "unicode" | "ascii"
57
58
  * }
58
59
  *
59
60
  * - "widget" (default): rendered in the below-editor status line
@@ -65,6 +66,14 @@
65
66
  * /zro-status account widget|statusbar|off
66
67
  * /zro-status hide true|false
67
68
  * /zro-status lowBalance <usd>|off
69
+ * /zro-status glyphs auto|unicode|ascii
70
+ *
71
+ * - glyphs "auto" swaps the emoji footer glyphs (bolt, gem, warn) for
72
+ * terminals (mintty/Cygwin), whose cell-width tables disagree with the
73
+ * width math and wrap the full-width widget line. "unicode"/"ascii"
74
+ * force a set. The widget never paints the terminal's last column, and
75
+ * clamps an explicit "unicode" to ASCII on legacy terminals; the
76
+ * statusbar is not edge-padded and honors the explicit choice.
68
77
  * /zro-status refresh (re-fetch account status now)
69
78
  * /zro-status reset
70
79
  *
@@ -105,8 +114,11 @@ import {
105
114
  EMPTY_SESSION_STATS,
106
115
  StatusLineWidget,
107
116
  accountHasData,
117
+ resolveGlyphSet,
118
+ resolveWidgetGlyphSet,
108
119
  type AccountState,
109
120
  type SessionStats,
121
+ type GlyphSet,
110
122
  type StatusConfig,
111
123
  } from "./status";
112
124
  import fs from "fs";
@@ -467,6 +479,7 @@ function writeStatusConfig(): void {
467
479
  raw.account = statusConfig.account;
468
480
  raw.hideOnOtherProvider = statusConfig.hideOnOtherProvider;
469
481
  raw.lowBalanceUsd = statusConfig.lowBalanceUsd;
482
+ raw.glyphs = statusConfig.glyphs;
470
483
  fs.mkdirSync(path.dirname(CONFIG_PATH), { recursive: true });
471
484
  fs.writeFileSync(CONFIG_PATH, JSON.stringify(raw, null, 2) + "\n");
472
485
  } catch {
@@ -494,6 +507,7 @@ let sessionStartedAt = 0;
494
507
  let pendingSawUsage = false;
495
508
  let pendingSawOutOfCredits = false;
496
509
  let outOfCreditsNotified = false;
510
+ let widgetGlyphClampNotified = false;
497
511
 
498
512
  const teeReaders = new Set<Promise<void>>();
499
513
 
@@ -760,21 +774,32 @@ function renderStatus(ctx: ExtensionContext): void {
760
774
  }
761
775
 
762
776
  const hasActivity = sessionStats.requests > 0 || sessionStats.spend > 0;
763
- const sessionLine = statusConfig.session !== "off" ? buildSessionLine(sessionStats) : undefined;
777
+ // Legacy terminals measure ⚡ ◆ ⚠ with their own cell tables; the widget
778
+ // clamps to ASCII there, the statusbar keeps the user's explicit choice.
779
+ const glyphs = resolveGlyphSet(statusConfig.glyphs);
780
+ const widgetGlyphs = resolveWidgetGlyphSet(statusConfig.glyphs);
781
+ const widgetClamped = widgetGlyphs !== glyphs;
782
+ if (widgetClamped && !widgetGlyphClampNotified && ctx.hasUI) {
783
+ widgetGlyphClampNotified = true;
784
+ ctx.ui.notify("Zro: widget glyphs stay ASCII on this terminal — unicode ⚡ ◆ ⚠ overflow legacy mintty/Cygwin cell widths. Statusbar is unaffected.", "info");
785
+ }
764
786
  // Show only after Zro activity this session (like pi-neuralwatt):
765
787
  // no empty-gap line on fresh sessions, no stale account glare on other
766
788
  // providers' sessions.
767
789
  const accountVisible = statusConfig.account !== "off" && accountHasData(account) && hasActivity;
768
790
  const lowBalance =
769
791
  statusConfig.lowBalanceUsd !== null && account.availableUsd !== null && account.availableUsd <= statusConfig.lowBalanceUsd;
770
- const accTiers = accountVisible ? buildAccountTiers(account, lowBalance) : [];
792
+ const sessionLine = statusConfig.session !== "off" ? buildSessionLine(sessionStats, glyphs) : undefined;
793
+ const accTiers = accountVisible ? buildAccountTiers(account, lowBalance, glyphs) : [];
794
+ const sessionLineW = widgetClamped && statusConfig.session !== "off" ? buildSessionLine(sessionStats, widgetGlyphs) : sessionLine;
795
+ const accTiersW = widgetClamped && accountVisible ? buildAccountTiers(account, lowBalance, widgetGlyphs) : accTiers;
771
796
 
772
797
  // Status bar (built-in footer slots)
773
798
  const sBar = statusConfig.session === "statusbar" ? sessionLine : undefined;
774
799
  const aBar = statusConfig.account === "statusbar" && accountVisible ? accTiers[0] : undefined;
775
800
  if (sBar && aBar) {
776
801
  // Combined to avoid eating two footer slots
777
- ctx.ui.setStatus(STATUS_KEY_SESSION, ctx.ui.theme.fg(lowBalance ? "warning" : "dim", `${sBar} · ${aBar}`));
802
+ ctx.ui.setStatus(STATUS_KEY_SESSION, ctx.ui.theme.fg(lowBalance ? "warning" : "dim", `${sBar} ${glyphs.sep} ${aBar}`));
778
803
  ctx.ui.setStatus(STATUS_KEY_ACCOUNT, undefined);
779
804
  } else {
780
805
  ctx.ui.setStatus(STATUS_KEY_SESSION, sBar ? ctx.ui.theme.fg("dim", sBar) : undefined);
@@ -782,17 +807,17 @@ function renderStatus(ctx: ExtensionContext): void {
782
807
  }
783
808
 
784
809
  // Below-editor widget (two-zone, width-aware)
785
- const leftW = statusConfig.session === "widget" ? sessionLine : undefined;
786
- const rightW = statusConfig.account === "widget" && accountVisible ? accTiers : undefined;
810
+ const leftW = statusConfig.session === "widget" ? sessionLineW : undefined;
811
+ const rightW = statusConfig.account === "widget" && accountVisible ? accTiersW : undefined;
787
812
  if (leftW !== undefined || (rightW !== undefined && rightW.length > 0)) {
788
813
  ctx.ui.setWidget(
789
814
  WIDGET_KEY,
790
- (_tui: any, theme: any) => new StatusLineWidget(theme, leftW ?? "", rightW ?? [], lowBalance),
815
+ (_tui: any, theme: any) => new StatusLineWidget(theme, leftW ?? "", rightW ?? [], lowBalance, widgetGlyphs),
791
816
  { placement: "belowEditor" },
792
817
  );
793
- } else {
818
+ } else {
794
819
  ctx.ui.setWidget(WIDGET_KEY, undefined);
795
- }
820
+ }
796
821
  }
797
822
 
798
823
  function resetStatusState(): void {
@@ -842,11 +867,11 @@ function commitPending(ctx: ExtensionContext): void {
842
867
 
843
868
  function statusSummary(): string {
844
869
  const lb = statusConfig.lowBalanceUsd === null ? "off" : `${statusConfig.lowBalanceUsd}`;
845
- return `session=${statusConfig.session}, account=${statusConfig.account}, hideOnOtherProvider=${statusConfig.hideOnOtherProvider}, lowBalanceUsd=${lb}`;
870
+ return `session=${statusConfig.session}, account=${statusConfig.account}, hideOnOtherProvider=${statusConfig.hideOnOtherProvider}, lowBalanceUsd=${lb}, glyphs=${statusConfig.glyphs}`;
846
871
  }
847
872
 
848
873
  const STATUS_USAGE =
849
- "Usage: /zro-status [session|account widget|statusbar|off · hide true|false · lowBalance <usd>|off · refresh · reset]";
874
+ "Usage: /zro-status [session|account widget|statusbar|off · hide true|false · lowBalance <usd>|off · glyphs auto|unicode|ascii · refresh · reset]";
850
875
 
851
876
  async function handleStatusCommand(args: string, ctx: ExtensionContext): Promise<void> {
852
877
  const tokens = args.trim().split(/\s+/).filter(Boolean);
@@ -926,12 +951,26 @@ async function handleStatusCommand(args: string, ctx: ExtensionContext): Promise
926
951
  return;
927
952
  }
928
953
 
954
+ if (key === "glyphs" && tokens.length === 2) {
955
+ if (value !== "auto" && value !== "unicode" && value !== "ascii") {
956
+ ctx.ui.notify(STATUS_USAGE, "error");
957
+ return;
958
+ }
959
+ statusConfig.glyphs = value;
960
+ writeStatusConfig();
961
+ updateStatus(ctx);
962
+ ctx.ui.notify(`Zro status. ${statusSummary()}`, "info");
963
+ return;
964
+ }
965
+
929
966
  ctx.ui.notify(STATUS_USAGE, "error");
930
967
  }
931
968
 
932
969
  async function configureStatusInteractive(ctx: ExtensionContext): Promise<void> {
933
970
  const modes = ["widget", "statusbar", "off"] as const;
934
971
  const nextMode = (m: string) => modes[(modes.indexOf(m as any) + 1) % modes.length];
972
+ const glyphModes = ["auto", "unicode", "ascii"] as const;
973
+ const nextGlyphMode = () => glyphModes[(glyphModes.indexOf(statusConfig.glyphs as any) + 1) % glyphModes.length];
935
974
 
936
975
  for (;;) {
937
976
  const lb = statusConfig.lowBalanceUsd === null ? "off" : `$${statusConfig.lowBalanceUsd}`;
@@ -939,6 +978,7 @@ async function configureStatusInteractive(ctx: ExtensionContext): Promise<void>
939
978
  const accountOpt = `Account line (plan/balance/packs/activity): ${statusConfig.account}`;
940
979
  const hideOpt = `Hide on other providers: ${statusConfig.hideOnOtherProvider ? "on" : "off"}`;
941
980
  const lbOpt = `Low-balance warning: ${lb}`;
981
+ const glyphOpt = `Glyphs (legacy terminals): ${statusConfig.glyphs}`;
942
982
  const refreshOpt = "Refresh account status now";
943
983
  const doneOpt = "Done";
944
984
 
@@ -947,6 +987,7 @@ async function configureStatusInteractive(ctx: ExtensionContext): Promise<void>
947
987
  accountOpt,
948
988
  hideOpt,
949
989
  lbOpt,
990
+ glyphOpt,
950
991
  refreshOpt,
951
992
  doneOpt,
952
993
  ]);
@@ -986,6 +1027,12 @@ async function configureStatusInteractive(ctx: ExtensionContext): Promise<void>
986
1027
  }
987
1028
  continue;
988
1029
  }
1030
+ if (choice === glyphOpt) {
1031
+ statusConfig.glyphs = nextGlyphMode();
1032
+ writeStatusConfig();
1033
+ updateStatus(ctx);
1034
+ continue;
1035
+ }
989
1036
  if (choice === refreshOpt) {
990
1037
  metaFetched = false;
991
1038
  await refreshAccountStatus(cachedApiKey, statusAbort?.signal ?? undefined, true);
package/models.json CHANGED
@@ -88,8 +88,8 @@
88
88
  }
89
89
  },
90
90
  {
91
- "id": "dolly1",
92
- "name": "Dolly 1",
91
+ "id": "dolly1-security",
92
+ "name": "Dolly 1 Security",
93
93
  "reasoning": true,
94
94
  "thinkingLevelMap": {
95
95
  "off": "none",
package/package.json CHANGED
@@ -1,9 +1,16 @@
1
1
  {
2
2
  "name": "pi-zro-provider",
3
- "version": "1.3.13",
3
+ "version": "1.3.15",
4
4
  "description": "Zro provider extension for pi - GLM-5.2, GLM-5.3 Flash, Kimi K3, DeepSeek V4 Flash & DeepSeek V4.1 Flash through the Zro inference endpoint",
5
5
  "type": "module",
6
6
  "main": "index.ts",
7
+ "scripts": {
8
+ "clean": "echo 'nothing to clean'",
9
+ "build": "echo 'nothing to build'",
10
+ "check": "tsc --noEmit && node tests/status.smoke.ts",
11
+ "smoke": "node tests/status.smoke.ts",
12
+ "update-models": "node scripts/update-models.js"
13
+ },
7
14
  "keywords": [
8
15
  "pi",
9
16
  "extension",
@@ -30,12 +37,5 @@
30
37
  "@earendil-works/pi-coding-agent": "0.85.1",
31
38
  "@types/node": "^24.10.1",
32
39
  "typescript": "6.0.3"
33
- },
34
- "scripts": {
35
- "clean": "echo 'nothing to clean'",
36
- "build": "echo 'nothing to build'",
37
- "check": "tsc --noEmit && node tests/status.smoke.ts",
38
- "smoke": "node tests/status.smoke.ts",
39
- "update-models": "node scripts/update-models.js"
40
40
  }
41
- }
41
+ }
package/status.ts CHANGED
@@ -15,15 +15,68 @@
15
15
  * that fits the remaining width, and as a last resort truncates the minimal
16
16
  * tier. Width math counts only terminal-visible columns (ANSI-aware, wide
17
17
  * glyphs like ⚡ ⚠ measure 2 columns).
18
+ *
19
+ * Terminal safety (legacy terminals, mintty/Cygwin):
20
+ * - Glyphs degrade to ASCII when auto-detection matches a legacy terminal
21
+ * or when the glyphs config asks for it (see GlyphMode). Older mintty
22
+ * builds measure ⚡ ◆ ⚠ with cell tables that disagree with the ones
23
+ * above; the statusbar absorbs that (its lines are not edge-padded) but
24
+ * the full-width widget line wraps, which desyncs pi's row bookkeeping.
25
+ * - render() budgets width − 1, so the widget never paints the terminal's
26
+ * last column (the classic pending-wrap hazard).
18
27
  */
19
28
 
20
29
  export type DisplayMode = "widget" | "statusbar" | "off";
21
30
 
31
+ export type GlyphMode = "auto" | "unicode" | "ascii";
32
+
33
+ export interface GlyphSet {
34
+ bolt: string;
35
+ gem: string;
36
+ warn: string;
37
+ sep: string;
38
+ ellipsis: string;
39
+ }
40
+
41
+ export const UNICODE_GLYPHS: GlyphSet = { bolt: "⚡", gem: "◆", warn: "⚠", sep: "·", ellipsis: "…" };
42
+ export const ASCII_GLYPHS: GlyphSet = { bolt: "*", gem: "+", warn: "!", sep: "-", ellipsis: "..." };
43
+
44
+ /** True for terminals whose cell-width tables are known to disagree with the
45
+ * width math below (older mintty/Cygwin builds). */
46
+ export function detectLegacyTerminal(env: NodeJS.ProcessEnv = process.env): boolean {
47
+ const termProgram = env.TERM_PROGRAM ?? "";
48
+ const term = env.TERM ?? "";
49
+ return (
50
+ termProgram === "mintty" ||
51
+ termProgram === "cygwin" ||
52
+ termProgram === "msys" ||
53
+ term.startsWith("cygwin") ||
54
+ term.startsWith("msys")
55
+ );
56
+ }
57
+
58
+ export function resolveGlyphSet(mode: GlyphMode, env: NodeJS.ProcessEnv = process.env): GlyphSet {
59
+ if (mode === "unicode") return UNICODE_GLYPHS;
60
+ if (mode === "ascii") return ASCII_GLYPHS;
61
+ return detectLegacyTerminal(env) ? ASCII_GLYPHS : UNICODE_GLYPHS;
62
+ }
63
+
64
+ /** Widget content is edge-padded to the terminal width, so a glyph the
65
+ * terminal measures wider than termVisWidth() does wraps the line and
66
+ * corrupts pi's differential renderer. An explicit "unicode" choice is
67
+ * therefore clamped to ASCII for widget content on legacy terminals;
68
+ * statusbar content is not edge-padded and keeps the caller's choice. */
69
+ export function resolveWidgetGlyphSet(mode: GlyphMode, env: NodeJS.ProcessEnv = process.env): GlyphSet {
70
+ if (mode === "unicode" && detectLegacyTerminal(env)) return ASCII_GLYPHS;
71
+ return resolveGlyphSet(mode, env);
72
+ }
73
+
22
74
  export interface StatusConfig {
23
75
  session: DisplayMode;
24
76
  account: DisplayMode;
25
77
  hideOnOtherProvider: boolean;
26
78
  lowBalanceUsd: number | null;
79
+ glyphs: GlyphMode;
27
80
  }
28
81
 
29
82
  export const DEFAULT_STATUS_CONFIG: StatusConfig = {
@@ -31,14 +84,20 @@ export const DEFAULT_STATUS_CONFIG: StatusConfig = {
31
84
  account: "widget",
32
85
  hideOnOtherProvider: true,
33
86
  lowBalanceUsd: 10,
87
+ glyphs: "auto",
34
88
  };
35
89
 
36
90
  const VALID_MODES = new Set<string>(["widget", "statusbar", "off"]);
91
+ const VALID_GLYPH_MODES = new Set<string>(["auto", "unicode", "ascii"]);
37
92
 
38
93
  function coerceMode(value: unknown, fallback: DisplayMode): DisplayMode {
39
94
  return typeof value === "string" && VALID_MODES.has(value) ? (value as DisplayMode) : fallback;
40
95
  }
41
96
 
97
+ function coerceGlyphMode(value: unknown, fallback: GlyphMode): GlyphMode {
98
+ return typeof value === "string" && VALID_GLYPH_MODES.has(value) ? (value as GlyphMode) : fallback;
99
+ }
100
+
42
101
  export function coerceStatusConfig(raw: unknown): StatusConfig {
43
102
  const d = DEFAULT_STATUS_CONFIG;
44
103
  if (typeof raw !== "object" || raw === null || Array.isArray(raw)) return { ...d };
@@ -53,6 +112,7 @@ export function coerceStatusConfig(raw: unknown): StatusConfig {
53
112
  : r.lowBalanceUsd === null || r.lowBalanceUsd === false
54
113
  ? null
55
114
  : d.lowBalanceUsd,
115
+ glyphs: coerceGlyphMode(r.glyphs, d.glyphs),
56
116
  };
57
117
  }
58
118
 
@@ -139,13 +199,13 @@ export function formatCount(n: number): string {
139
199
  }
140
200
 
141
201
  // Line builders
142
- export function buildSessionLine(stats: SessionStats): string | undefined {
202
+ export function buildSessionLine(stats: SessionStats, glyphs: GlyphSet = UNICODE_GLYPHS): string | undefined {
143
203
  if (stats.requests <= 0 && stats.spend <= 0) return undefined;
144
204
  const atoms: string[] = [];
145
205
  if (stats.spend > 0) atoms.push(formatUsd(stats.spend));
146
206
  atoms.push(`${stats.requests} req`);
147
207
  if (stats.elapsedMs > 0) atoms.push(formatDuration(stats.elapsedMs));
148
- return `⚡ ${atoms.join(" · ")}`;
208
+ return `${glyphs.bolt} ${atoms.join(` ${glyphs.sep} `)}`;
149
209
  }
150
210
 
151
211
  export function accountHasData(acc: AccountState): boolean {
@@ -160,8 +220,8 @@ export function accountHasData(acc: AccountState): boolean {
160
220
  );
161
221
  }
162
222
 
163
- export function buildAccountTiers(acc: AccountState, lowBalance: boolean): string[] {
164
- const gem = lowBalance ? "⚠ ◆" : "◆";
223
+ export function buildAccountTiers(acc: AccountState, lowBalance: boolean, glyphs: GlyphSet = UNICODE_GLYPHS): string[] {
224
+ const gem = lowBalance ? `${glyphs.warn} ${glyphs.gem}` : glyphs.gem;
165
225
  const bal = acc.availableUsd !== null ? `${gem} ${formatUsd(acc.availableUsd)} avail` : undefined;
166
226
  const plan = acc.planName?.trim() || undefined;
167
227
  const pack = acc.usagePackUsd !== null && acc.usagePackUsd > 0 ? `${formatUsd(acc.usagePackUsd)} pack` : undefined;
@@ -171,7 +231,7 @@ export function buildAccountTiers(acc: AccountState, lowBalance: boolean): strin
171
231
  const head = [plan, bal].filter((p): p is string => !!p).join(" ") || undefined;
172
232
  const numOnly = acc.availableUsd !== null ? formatUsd(acc.availableUsd) : undefined;
173
233
 
174
- const join = (parts: (string | undefined)[]) => parts.filter((p): p is string => !!p).join(" · ");
234
+ const join = (parts: (string | undefined)[]) => parts.filter((p): p is string => !!p).join(` ${glyphs.sep} `);
175
235
 
176
236
  const tiers: string[] = [
177
237
  join([head, pack, actTok, actReq, rate]),
@@ -233,7 +293,7 @@ export function termVisWidth(str: string): number {
233
293
  return width;
234
294
  }
235
295
 
236
- export function truncateAnsi(str: string, maxCols: number): string {
296
+ export function truncateAnsi(str: string, maxCols: number, ellipsis = "…"): string {
237
297
  if (maxCols <= 0) return "";
238
298
  if (termVisWidth(str) <= maxCols) return str;
239
299
  let result = "";
@@ -263,7 +323,7 @@ export function truncateAnsi(str: string, maxCols: number): string {
263
323
  visWidth += charWidth;
264
324
  i += cp > 0xffff ? 2 : 1;
265
325
  }
266
- return result + "…";
326
+ return result + ellipsis;
267
327
  }
268
328
 
269
329
  export interface LineTheme {
@@ -275,35 +335,41 @@ export class StatusLineWidget {
275
335
  private leftRaw: string;
276
336
  private rightTiers: string[];
277
337
  private rightWarn: boolean;
338
+ private glyphs: GlyphSet;
278
339
 
279
- constructor(theme: LineTheme, leftRaw: string, rightTiers: string[] = [], rightWarn = false) {
340
+ constructor(theme: LineTheme, leftRaw: string, rightTiers: string[] = [], rightWarn = false, glyphs: GlyphSet = UNICODE_GLYPHS) {
280
341
  this.theme = theme;
281
342
  this.leftRaw = leftRaw;
282
343
  this.rightTiers = rightTiers;
283
344
  this.rightWarn = rightWarn;
345
+ this.glyphs = glyphs;
284
346
  }
285
347
 
286
348
  invalidate(): void {}
287
349
 
288
350
  render(width: number): string[] {
351
+ // Never paint the terminal's last column: writing the final cell marks a
352
+ // pending wrap on legacy terminals, and any real-vs-table width
353
+ // disagreement then scrolls the frame and desyncs pi's row bookkeeping.
354
+ const w = Math.max(1, width - 1);
289
355
  const leftVis = termVisWidth(this.leftRaw);
290
- if (leftVis > width) {
291
- return [this.theme.fg("dim", truncateAnsi(this.leftRaw, width))];
356
+ if (leftVis > w) {
357
+ return [this.theme.fg("dim", truncateAnsi(this.leftRaw, w, this.glyphs.ellipsis))];
292
358
  }
293
359
 
294
360
  const rightColor = this.rightWarn ? "warning" : "dim";
295
361
  const themedLeft = this.theme.fg("dim", this.leftRaw);
296
- const budget = width - leftVis - 1;
362
+ const budget = w - leftVis - 1;
297
363
 
298
364
  for (const tier of this.rightTiers) {
299
365
  if (termVisWidth(tier) <= budget) {
300
366
  const themedRight = this.theme.fg(rightColor, tier);
301
- const pad = width - termVisWidth(themedLeft) - termVisWidth(themedRight);
367
+ const pad = w - termVisWidth(themedLeft) - termVisWidth(themedRight);
302
368
  return [themedLeft + " ".repeat(Math.max(1, pad)) + themedRight];
303
369
  }
304
370
  }
305
371
 
306
- const pad = width - termVisWidth(themedLeft);
372
+ const pad = w - termVisWidth(themedLeft);
307
373
  return [themedLeft + " ".repeat(Math.max(0, pad))];
308
374
  }
309
375
  }
@@ -6,9 +6,11 @@
6
6
  */
7
7
  import assert from "node:assert/strict";
8
8
  import {
9
+ ASCII_GLYPHS,
9
10
  EMPTY_ACCOUNT,
10
11
  StatusLineWidget,
11
12
  accountHasData,
13
+ detectLegacyTerminal,
12
14
  applyOptimisticSpend,
13
15
  buildAccountTiers,
14
16
  buildSessionLine,
@@ -17,6 +19,9 @@ import {
17
19
  formatDuration,
18
20
  formatTokens,
19
21
  formatUsd,
22
+ resolveGlyphSet,
23
+ resolveWidgetGlyphSet,
24
+ UNICODE_GLYPHS,
20
25
  termVisWidth,
21
26
  truncateAnsi,
22
27
  type AccountState,
@@ -103,36 +108,38 @@ assert.equal(truncateAnsi("abc", 0), "");
103
108
  const left = buildSessionLine({ requests: 7, spend: 0.42, elapsedMs: 0 })!;
104
109
  const widget = new StatusLineWidget(fakeTheme, left, tiers, false);
105
110
 
106
- // Wide: full tier, left-right justified, exactly width columns
111
+ // Wide: full tier, left-right justified at width − 1 (the widget never
112
+ // paints the terminal's last column — legacy terminals treat that cell as a
113
+ // pending wrap).
107
114
  const wide = widget.render(80);
108
115
  assert.equal(wide.length, 1);
109
- assert.equal(termVisWidth(wide[0]), 80);
110
- assert.ok(stripAnsi(wide[0]).startsWith("⚡ $0.42"));
116
+ assert.equal(termVisWidth(wide[0]), 79);
117
+ assert.ok(stripAnsi(wide[0]).startsWith("\u26A1 $0.42"));
111
118
  assert.ok(stripAnsi(wide[0]).endsWith("996/1k"));
112
119
 
113
- // Medium: drops to a compressed tier, still exactly width
120
+ // Medium: drops to a compressed tier, still exactly width − 1
114
121
  const med = widget.render(52);
115
- assert.equal(termVisWidth(med[0]), 52);
122
+ assert.equal(termVisWidth(med[0]), 51);
116
123
  assert.ok(!stripAnsi(med[0]).includes("tok/30d"), "compressed tiers drop tokens activity first");
117
124
 
118
125
  // Narrow: no tier fits → left only, padded
119
126
  const narrow = widget.render(termVisWidth(left) + 3);
120
- assert.equal(termVisWidth(narrow[0]), termVisWidth(left) + 3);
121
- assert.ok(stripAnsi(narrow[0]).startsWith("⚡"));
127
+ assert.equal(termVisWidth(narrow[0]), termVisWidth(left) + 2);
128
+ assert.ok(stripAnsi(narrow[0]).startsWith("\u26A1"));
122
129
  assert.ok(!stripAnsi(narrow[0]).includes("◆"));
123
130
 
124
131
  // Narrower than left itself: truncation never overflows (crash guard)
125
132
  const tiny = widget.render(10);
126
- assert.equal(termVisWidth(tiny[0]), 10);
133
+ assert.equal(termVisWidth(tiny[0]), 9);
127
134
 
128
135
  // Left empty (session gated) → right-aligned account line
129
136
  const rightOnly = new StatusLineWidget(fakeTheme, "", tiers, false);
130
137
  const ro = rightOnly.render(70);
131
- assert.equal(termVisWidth(ro[0]), 70);
138
+ assert.equal(termVisWidth(ro[0]), 69);
132
139
  assert.ok(stripAnsi(ro[0]).endsWith("996/1k"));
133
140
 
134
141
  // No data at all
135
- assert.deepEqual(new StatusLineWidget(fakeTheme, "", [], false).render(40), [fakeTheme.fg("dim", "") + " ".repeat(40)]);
142
+ assert.deepEqual(new StatusLineWidget(fakeTheme, "", [], false).render(40), [fakeTheme.fg("dim", "") + " ".repeat(39)]);
136
143
 
137
144
  // Warning color wired through
138
145
  const warn = new StatusLineWidget(fakeTheme, "", buildAccountTiers(acc({ availableUsd: 5 }), true), true);
@@ -149,21 +156,59 @@ assert.deepEqual(coerceStatusConfig(undefined), {
149
156
  account: "widget",
150
157
  hideOnOtherProvider: true,
151
158
  lowBalanceUsd: 10,
159
+ glyphs: "auto",
152
160
  });
153
161
  assert.deepEqual(coerceStatusConfig({ session: "bogus", lowBalanceUsd: -3 }), {
154
162
  session: "widget",
155
163
  account: "widget",
156
164
  hideOnOtherProvider: true,
157
165
  lowBalanceUsd: 10,
166
+ glyphs: "auto",
158
167
  });
159
168
  assert.deepEqual(coerceStatusConfig({ session: "statusbar", account: "off", hideOnOtherProvider: false, lowBalanceUsd: null }), {
160
169
  session: "statusbar",
161
170
  account: "off",
162
171
  hideOnOtherProvider: false,
163
172
  lowBalanceUsd: null,
173
+ glyphs: "auto",
164
174
  });
165
175
  assert.equal(coerceStatusConfig({ lowBalanceUsd: 42 }).lowBalanceUsd, 42);
166
176
  assert.equal(coerceStatusConfig({ lowBalanceUsd: false }).lowBalanceUsd, null);
167
177
  assert.deepEqual(coerceStatusConfig(null).session, "widget");
168
178
 
179
+ // ── legacy-terminal glyph policy ──
180
+ const mintty = { TERM_PROGRAM: "mintty", TERM: "xterm" } as NodeJS.ProcessEnv;
181
+ const cygwin = { TERM: "cygwin" } as NodeJS.ProcessEnv;
182
+ const wt = { TERM_PROGRAM: "Windows_Terminal", TERM: "xterm-256color" } as NodeJS.ProcessEnv;
183
+ assert.equal(detectLegacyTerminal(mintty), true);
184
+ assert.equal(detectLegacyTerminal(cygwin), true);
185
+ assert.equal(detectLegacyTerminal(wt), false);
186
+ assert.equal(detectLegacyTerminal({} as NodeJS.ProcessEnv), false);
187
+
188
+ assert.equal(resolveGlyphSet("auto", wt), UNICODE_GLYPHS);
189
+ assert.equal(resolveGlyphSet("auto", mintty), ASCII_GLYPHS);
190
+ assert.equal(resolveGlyphSet("unicode", mintty), UNICODE_GLYPHS);
191
+ assert.equal(resolveGlyphSet("ascii", wt), ASCII_GLYPHS);
192
+ // An explicit unicode choice is clamped for widget content on legacy terminals
193
+ assert.equal(resolveWidgetGlyphSet("unicode", mintty), ASCII_GLYPHS);
194
+ assert.equal(resolveWidgetGlyphSet("unicode", wt), UNICODE_GLYPHS);
195
+ assert.equal(resolveWidgetGlyphSet("auto", mintty), ASCII_GLYPHS);
196
+ assert.equal(resolveWidgetGlyphSet("ascii", wt), ASCII_GLYPHS);
197
+
198
+ // ASCII mode emits no non-ASCII codepoints at all
199
+ const asciiLine = buildSessionLine({ requests: 7, spend: 0.42, elapsedMs: 252_000 }, ASCII_GLYPHS)!;
200
+ assert.equal(asciiLine, "* $0.42 - 7 req - 4m 12s");
201
+ const asciiTiers = buildAccountTiers(acc({ availableUsd: 5, activity30dRequests: 1200 }), true, ASCII_GLYPHS);
202
+ assert.ok(asciiTiers[0].startsWith("! + $5 avail"), `got ${asciiTiers[0]}`);
203
+ const asciiWidget = new StatusLineWidget(fakeTheme, asciiLine, asciiTiers, true, ASCII_GLYPHS).render(60)[0];
204
+ assert.equal([...stripAnsi(asciiWidget)].every((c) => c.charCodeAt(0) < 128), true);
205
+
206
+ // Unicode mode keeps the glyphs (regression guard for the default path)
207
+ assert.ok(buildAccountTiers(acc({ availableUsd: 5 }), true)[0].includes("⚠ ◆"));
208
+
209
+ // Truncation takes the caller's ellipsis so ASCII mode stays ASCII
210
+ assert.equal(truncateAnsi("abcdefghij", 5, "..."), "abcd...");
211
+ assert.ok(truncateAnsi("abcdefghij", 5).endsWith("…"));
212
+ assert.equal(coerceStatusConfig({ glyphs: "bogus" }).glyphs, "auto");
213
+ assert.equal(coerceStatusConfig({ glyphs: "ascii" }).glyphs, "ascii");
169
214
  console.log("status.smoke: all assertions passed");
package/bun.lock DELETED
@@ -1,342 +0,0 @@
1
- {
2
- "lockfileVersion": 2,
3
- "configVersion": 1,
4
- "workspaces": {
5
- "": {
6
- "name": "pi-zro-provider",
7
- "devDependencies": {
8
- "@earendil-works/pi-ai": "0.85.1",
9
- "@earendil-works/pi-coding-agent": "0.85.1",
10
- "@types/node": "^24.10.1",
11
- "typescript": "6.0.3",
12
- },
13
- },
14
- },
15
- "packages": {
16
- "@anthropic-ai/sdk": ["@anthropic-ai/sdk@0.123.0", "", { "dependencies": { "json-schema-to-ts": "^3.1.1", "standardwebhooks": "^1.0.0" }, "peerDependencies": { "zod": "^3.25.0 || ^4.0.0" }, "optionalPeers": ["zod"], "bin": { "anthropic-ai-sdk": "bin/cli" } }, "sha512-Y9oX9mPNGZClHQOFqrWRk43Srcu/UHuPq3rfxxOq7JgW0gi+lJA2MAOK4Ul3k/+AUrwRWFJvd0tK3oC0Pw25dw=="],
17
-
18
- "@aws-crypto/sha256-browser": ["@aws-crypto/sha256-browser@5.2.0", "", { "dependencies": { "@aws-crypto/sha256-js": "5.2.0", "@aws-crypto/supports-web-crypto": "5.2.0", "@aws-crypto/util": "5.2.0", "@aws-sdk/types": "3.974.4", "@aws-sdk/util-locate-window": "3.965.10", "@smithy/util-utf8": "2.3.0", "tslib": "2.8.1" } }, "sha512-AXfN/lGotSQwu6HNcEsIASo7kWXZ5HYWvfOmSNKDsEqC4OashTp8alTmaz+F7TC2L083SFv5RdB+qU3Vs1kZqw=="],
19
-
20
- "@aws-crypto/sha256-js": ["@aws-crypto/sha256-js@5.2.0", "", { "dependencies": { "@aws-crypto/util": "5.2.0", "@aws-sdk/types": "3.974.4", "tslib": "2.8.1" } }, "sha512-FFQQyu7edu4ufvIZ+OadFpHHOt+eSTBaYaki44c+akjg7qZg9oOQeLlk77F6tSYqjDAFClrHJk9tMf0HdVyOvA=="],
21
-
22
- "@aws-crypto/supports-web-crypto": ["@aws-crypto/supports-web-crypto@5.2.0", "", { "dependencies": { "tslib": "2.8.1" } }, "sha512-iAvUotm021kM33eCdNfwIN//F77/IADDSs58i+MDaOqFrVjZo9bAal0NK7HurRuWLLpF1iLX7gbWrjHjeo+YFg=="],
23
-
24
- "@aws-crypto/util": ["@aws-crypto/util@5.2.0", "", { "dependencies": { "@aws-sdk/types": "3.974.4", "@smithy/util-utf8": "2.3.0", "tslib": "2.8.1" } }, "sha512-4RkU9EsI6ZpBve5fseQlGNUWKMa1RLPQ1dnjnQoe07ldfIzcsGb5hC5W0Dm7u423KWzawlrpbjXBrXCEv9zazQ=="],
25
-
26
- "@aws-sdk/client-bedrock-runtime": ["@aws-sdk/client-bedrock-runtime@3.1048.0", "", { "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", "@aws-sdk/core": "3.977.8", "@aws-sdk/credential-provider-node": "3.972.80", "@aws-sdk/eventstream-handler-node": "3.972.33", "@aws-sdk/middleware-eventstream": "3.972.28", "@aws-sdk/middleware-websocket": "3.972.51", "@aws-sdk/token-providers": "3.1048.0", "@aws-sdk/types": "3.974.4", "@smithy/core": "3.33.2", "@smithy/fetch-http-handler": "5.7.2", "@smithy/node-http-handler": "4.11.2", "@smithy/types": "4.17.2", "tslib": "2.8.1" } }, "sha512-u+NT61JZEkRFtpL0CAw1N1dwxnaLgwVXQl/zjJxTGgLyS/jTIdg2SdoEoCTHxgDyCnqa1HEi9QOoE9/pYRNpOQ=="],
27
-
28
- "@aws-sdk/core": ["@aws-sdk/core@3.977.8", "", { "dependencies": { "@aws-sdk/types": "3.974.4", "@aws-sdk/xml-builder": "3.972.39", "@aws/lambda-invoke-store": "0.3.0", "@smithy/core": "3.33.2", "@smithy/signature-v4": "5.7.2", "@smithy/types": "4.17.2", "bowser": "2.14.1", "tslib": "2.8.1" } }, "sha512-7+Kcrkvrk9lM/m7jRhHpT4jCdvzGHsuaSRbF8TdzzkY1mRzp/Ogwf9c7H29k4gGhey0BBWhCWr16+t0J61gwmg=="],
29
-
30
- "@aws-sdk/credential-provider-env": ["@aws-sdk/credential-provider-env@3.972.69", "", { "dependencies": { "@aws-sdk/core": "3.977.8", "@aws-sdk/types": "3.974.4", "@smithy/core": "3.33.2", "@smithy/types": "4.17.2", "tslib": "2.8.1" } }, "sha512-AreCFzcB4kH2HF9031Ot0jSJr3KXvRg6e8uDeub20JEVdZU3Bv0sTq1plc7VsT3KiqutlzH7l0j50UcCWHUioA=="],
31
-
32
- "@aws-sdk/credential-provider-http": ["@aws-sdk/credential-provider-http@3.972.71", "", { "dependencies": { "@aws-sdk/core": "3.977.8", "@aws-sdk/types": "3.974.4", "@smithy/core": "3.33.2", "@smithy/fetch-http-handler": "5.7.2", "@smithy/node-http-handler": "4.11.2", "@smithy/types": "4.17.2", "tslib": "2.8.1" } }, "sha512-A8ObcqVmDMnk4F9NozZ7JwmUu9Q4xyBJkmyq1C5U+wNM9ht9J7+EuuyabsLWXZnOoTqFaJuYBYTKf5CTipkEjA=="],
33
-
34
- "@aws-sdk/credential-provider-ini": ["@aws-sdk/credential-provider-ini@3.973.14", "", { "dependencies": { "@aws-sdk/core": "3.977.8", "@aws-sdk/credential-provider-env": "3.972.69", "@aws-sdk/credential-provider-http": "3.972.71", "@aws-sdk/credential-provider-login": "3.972.76", "@aws-sdk/credential-provider-process": "3.972.69", "@aws-sdk/credential-provider-sso": "3.973.13", "@aws-sdk/credential-provider-web-identity": "3.972.75", "@aws-sdk/nested-clients": "3.997.43", "@aws-sdk/types": "3.974.4", "@smithy/core": "3.33.2", "@smithy/credential-provider-imds": "4.5.2", "@smithy/types": "4.17.2", "tslib": "2.8.1" } }, "sha512-7c+Wti2LsERNWMfm7ySz3/6RPopFW3Nmn7s63Xpcq6R/tRuY5hpvkHA2xVgi5ukJbvok9l0IDtVEvqTtg+X7dw=="],
35
-
36
- "@aws-sdk/credential-provider-login": ["@aws-sdk/credential-provider-login@3.972.76", "", { "dependencies": { "@aws-sdk/core": "3.977.8", "@aws-sdk/nested-clients": "3.997.43", "@aws-sdk/types": "3.974.4", "@smithy/core": "3.33.2", "@smithy/types": "4.17.2", "tslib": "2.8.1" } }, "sha512-LVixwOnEJfrrfKHeZjBA8pIMTZjNDq8ak8VpcoWUuCJDrSnBNU8POJksULMgvN089P0MXtQYH2Zs627/MK1K0g=="],
37
-
38
- "@aws-sdk/credential-provider-node": ["@aws-sdk/credential-provider-node@3.972.80", "", { "dependencies": { "@aws-sdk/credential-provider-env": "3.972.69", "@aws-sdk/credential-provider-http": "3.972.71", "@aws-sdk/credential-provider-ini": "3.973.14", "@aws-sdk/credential-provider-process": "3.972.69", "@aws-sdk/credential-provider-sso": "3.973.13", "@aws-sdk/credential-provider-web-identity": "3.972.75", "@aws-sdk/types": "3.974.4", "@smithy/core": "3.33.2", "@smithy/credential-provider-imds": "4.5.2", "@smithy/types": "4.17.2", "tslib": "2.8.1" } }, "sha512-bE2qh8ww4iClO1jHsBXdOE8FUgzDbdxbyorNjSCoPSkQd51k3jODItuPZfuwcLHZqDXsH+bI4AMHhqtuyR7mSg=="],
39
-
40
- "@aws-sdk/credential-provider-process": ["@aws-sdk/credential-provider-process@3.972.69", "", { "dependencies": { "@aws-sdk/core": "3.977.8", "@aws-sdk/types": "3.974.4", "@smithy/core": "3.33.2", "@smithy/types": "4.17.2", "tslib": "2.8.1" } }, "sha512-9kpTNdZTrcqXTfhxM7fgl9Z68ek3Fu5oe3Yf+A/pJGibEqpgZxz2tSY7SinmyCIU2PJ+ygY4FPoBBnLpocMtrQ=="],
41
-
42
- "@aws-sdk/credential-provider-sso": ["@aws-sdk/credential-provider-sso@3.973.13", "", { "dependencies": { "@aws-sdk/core": "3.977.8", "@aws-sdk/nested-clients": "3.997.43", "@aws-sdk/token-providers": "3.1111.0", "@aws-sdk/types": "3.974.4", "@smithy/core": "3.33.2", "@smithy/types": "4.17.2", "tslib": "2.8.1" } }, "sha512-Oc81qauMPzUoTnAS2YKpNwY6sY/LUyQTEeaf6yP197WMxkEBQfcKLR1MFpD7+pNTubXnfkH6gwpji+Gc7iyD2Q=="],
43
-
44
- "@aws-sdk/credential-provider-web-identity": ["@aws-sdk/credential-provider-web-identity@3.972.75", "", { "dependencies": { "@aws-sdk/core": "3.977.8", "@aws-sdk/nested-clients": "3.997.43", "@aws-sdk/types": "3.974.4", "@smithy/core": "3.33.2", "@smithy/types": "4.17.2", "tslib": "2.8.1" } }, "sha512-YPN6uoGDgjjjeVFZrcOeCJqmB6zpXoeeNgIjqe+DexJaWqdjVfCCe+VAZwli9Z2h8KhFW8oxkO39emQ1tyz/Mw=="],
45
-
46
- "@aws-sdk/eventstream-handler-node": ["@aws-sdk/eventstream-handler-node@3.972.33", "", { "dependencies": { "@aws-sdk/types": "3.974.4", "@smithy/core": "3.33.2", "@smithy/types": "4.17.2", "tslib": "2.8.1" } }, "sha512-1Dd5WyEE2Kb3HvY44u7Ob16ST2W6iutOqsQ8Y2hUmsL2mAH/STlGS1dS9h3IOE6L7Ld3AR2HzKJ6XeCMOw8Peg=="],
47
-
48
- "@aws-sdk/middleware-eventstream": ["@aws-sdk/middleware-eventstream@3.972.28", "", { "dependencies": { "@aws-sdk/types": "3.974.4", "@smithy/core": "3.33.2", "@smithy/types": "4.17.2", "tslib": "2.8.1" } }, "sha512-Z1EDXnS01P7H5jVrUx+/dBqV0m7dta7bSxLclkOuDuS93pNNQm0IcT4YLUbuvWKPYNxbI8aTG0p5Br30GSKDgA=="],
49
-
50
- "@aws-sdk/middleware-websocket": ["@aws-sdk/middleware-websocket@3.972.51", "", { "dependencies": { "@aws-sdk/core": "3.977.8", "@aws-sdk/types": "3.974.4", "@smithy/core": "3.33.2", "@smithy/fetch-http-handler": "5.7.2", "@smithy/signature-v4": "5.7.2", "@smithy/types": "4.17.2", "tslib": "2.8.1" } }, "sha512-jdgP3jR5Q96j1jjZ98GGwpGg1CBNFIO2YE+vXg8cg8PvNY4NvgQNYJsqDaRX2PYv5gSUX/+C0D58Fhspj9ELMQ=="],
51
-
52
- "@aws-sdk/nested-clients": ["@aws-sdk/nested-clients@3.997.43", "", { "dependencies": { "@aws-sdk/core": "3.977.8", "@aws-sdk/signature-v4-multi-region": "3.996.45", "@aws-sdk/types": "3.974.4", "@smithy/core": "3.33.2", "@smithy/fetch-http-handler": "5.7.2", "@smithy/node-http-handler": "4.11.2", "@smithy/types": "4.17.2", "tslib": "2.8.1" } }, "sha512-bit+VpqWNyi3wHxFoTsTliNXimCSL2r2OeDTm7ZrG+YsTZ2D7ofDJ6r/t9PVBn80i6/v0X2h9Tgw6QP2MAKfPw=="],
53
-
54
- "@aws-sdk/signature-v4-multi-region": ["@aws-sdk/signature-v4-multi-region@3.996.45", "", { "dependencies": { "@aws-sdk/types": "3.974.4", "@smithy/signature-v4": "5.7.2", "@smithy/types": "4.17.2", "tslib": "2.8.1" } }, "sha512-bBuyztukzXq6plzFGHAWiQt0QXo+HL8b8lX5cFTzkez/74PtS1c0qPFCIVuHkyoT+miH2qOjAcm1/yoro2ESPA=="],
55
-
56
- "@aws-sdk/token-providers": ["@aws-sdk/token-providers@3.1048.0", "", { "dependencies": { "@aws-sdk/core": "3.977.8", "@aws-sdk/nested-clients": "3.997.43", "@aws-sdk/types": "3.974.4", "@smithy/core": "3.33.2", "@smithy/types": "4.17.2", "tslib": "2.8.1" } }, "sha512-k0y/GcuesuSfWyUM0WamrGyeZmltRYaPbHO82UDA6mZ/doB+FOHKutikPAtSXMn/hDz970cF+iRuuiYO9VEbAA=="],
57
-
58
- "@aws-sdk/types": ["@aws-sdk/types@3.974.4", "", { "dependencies": { "@smithy/types": "4.17.2", "tslib": "2.8.1" } }, "sha512-dSFDNG00MEz0/xl5gxL62giLd1iYyJsTxZ1I1DOj6lC+bbgLB4TRsYClJg3b62dhXT1uATzsTNXPnC+33EJV3A=="],
59
-
60
- "@aws-sdk/util-locate-window": ["@aws-sdk/util-locate-window@3.965.10", "", { "dependencies": { "tslib": "2.8.1" } }, "sha512-ycwH6Zd2GhuSqdXX9ihbCjeGTB6xOJs+O3+Jb8/zDG9978XU80qs75dfkPJRMNKe5MvBZPuNeFpd4JZKPoUF4g=="],
61
-
62
- "@aws-sdk/xml-builder": ["@aws-sdk/xml-builder@3.972.39", "", { "dependencies": { "@smithy/types": "4.17.2", "tslib": "2.8.1" } }, "sha512-FTti8DS5MMWXNUWiRwXAJeYS+0GHHiMy0+7XOhcwk63ILHmfS2UFy2z/HNpZCSOJJ3P3dnWY6hfYNW3DF0nXUA=="],
63
-
64
- "@aws/lambda-invoke-store": ["@aws/lambda-invoke-store@0.3.0", "", {}, "sha512-sl4Bm6yiMNYrZKkqqDFWN0UfnWhlS8ivKxrYl+6t0gCLrqr8y3B2IqZZbFRkfaVVp7C/baApyh71P+LeE1A2sQ=="],
65
-
66
- "@babel/runtime": ["@babel/runtime@7.29.7", "", {}, "sha512-Nq8OhGWiZIZGV6hLHoyAKLLcJihP/xFeBMGJoUrxTX2psI8dCifzLhZISFb+VWS3wFMRDmCGw5R+dOySCqPLhw=="],
67
-
68
- "@earendil-works/chord": ["@earendil-works/chord@0.85.1", "", { "dependencies": { "esbuild": "0.28.1" } }, "sha512-VDlkEC3dhCzQ5fcyH1OhG19dq+6jCn+rqc/iXFivwDYGR5anwo2RCiXij9PpHhqNR5GuhhE+Er69Zi1Sn4eY6w=="],
69
-
70
- "@earendil-works/pi-agent-core": ["@earendil-works/pi-agent-core@0.85.1", "", { "dependencies": { "@earendil-works/chord": "^0.85.1", "@earendil-works/pi-ai": "^0.85.1", "@earendil-works/pi-telemetry": "^0.85.1", "diff": "8.0.4", "ignore": "7.0.5", "typebox": "1.3.7", "yaml": "2.9.0" } }, "sha512-hIXIP3eAWueAYiAl8aMvWCvvZ8Q5gT3Dip5bE5uJyIGh4+YlWRjtMLI4BaeoXoSs93zndjue61u1B/vhefLnuA=="],
71
-
72
- "@earendil-works/pi-ai": ["@earendil-works/pi-ai@0.85.1", "", { "dependencies": { "@anthropic-ai/sdk": "0.123.0", "@aws-sdk/client-bedrock-runtime": "3.1048.0", "@earendil-works/pi-telemetry": "^0.85.1", "@google/genai": "1.52.0", "@smithy/node-http-handler": "4.7.3", "http-proxy-agent": "7.0.2", "https-proxy-agent": "7.0.6", "openai": "6.40.0", "partial-json": "0.1.7", "typebox": "1.3.7" }, "bin": { "pi-ai": "dist/cli.js" } }, "sha512-+VgVIJDkDO2efYJKEEqvPTH4zmnIaXdAppGbO+vKFA9qy5PdhFiAenuFAkU+oiCSfOC4dMHDyrjdQeL4ZoC5CQ=="],
73
-
74
- "@earendil-works/pi-coding-agent": ["@earendil-works/pi-coding-agent@0.85.1", "", { "dependencies": { "@earendil-works/chord": "^0.85.1", "@earendil-works/pi-agent-core": "^0.85.1", "@earendil-works/pi-ai": "^0.85.1", "@earendil-works/pi-tui": "^0.85.1", "@silvia-odwyer/photon-node": "0.3.4", "chalk": "5.6.2", "cross-spawn": "7.0.6", "diff": "8.0.4", "grok-mermaid": "0.2.2", "highlight.js": "10.7.3", "hosted-git-info": "9.0.3", "ignore": "7.0.5", "jiti": "2.7.0", "minimatch": "10.2.5", "proper-lockfile": "4.1.2", "semver": "7.8.0", "typebox": "1.3.7", "undici": "8.9.0", "yaml": "2.9.0" }, "optionalDependencies": { "@mariozechner/clipboard": "0.3.9" }, "bin": { "pi": "dist/bundle/cli.js" } }, "sha512-FGRN+OHbWaefBPGaTggAdLjrIHW+s2PzLyglz/5dfLzb9of7uuXMXYC0fJIeZTw+shS32o2cuQ9jF7YSDuL/oQ=="],
75
-
76
- "@earendil-works/pi-telemetry": ["@earendil-works/pi-telemetry@0.85.1", "", {}, "sha512-Bg/YN6kA7Swja/NQxka8xFdecb4E/auIEGF2G5A25EaQXhRnPj300/7/KpgsDDMYUzHTDAv4RyUxaQPJKW81Rw=="],
77
-
78
- "@earendil-works/pi-tui": ["@earendil-works/pi-tui@0.85.1", "", { "dependencies": { "get-east-asian-width": "1.6.0", "marked": "18.0.5" } }, "sha512-OIzw9efInmO4WOBnD4TxcTdBjmzvYJpzslkgoUro946nEGoYWg5rwv1p4fDt3/JvMx9QybryUCUwlm7j8Dreig=="],
79
-
80
- "@esbuild/aix-ppc64": ["@esbuild/aix-ppc64@0.28.1", "", { "os": "aix", "cpu": "ppc64" }, "sha512-Svl7tq8k/08+p6CXPpRjQ1fKX+1odH/BQbb48fV6fj3CWHhsoIOoY87w1oHXm0qEpkIK3ZfVgp0hed3XBXzXMQ=="],
81
-
82
- "@esbuild/android-arm": ["@esbuild/android-arm@0.28.1", "", { "os": "android", "cpu": "arm" }, "sha512-0k2F129Xdio1TdJfzJ8sy1Q47vUD2NnwdhiAf7drUN1EBTfPf4hsFCtmMgu/6m8JSzsBrlmVjudMBQqOfG8usQ=="],
83
-
84
- "@esbuild/android-arm64": ["@esbuild/android-arm64@0.28.1", "", { "os": "android", "cpu": "arm64" }, "sha512-34EGEbCIAgosYz6goLcopX6Mo7NyGv9tfwEM2/7Ce2VcVRk568iSvniGWcUXIy7wEDR1wzolcxcriFVrWYcwBg=="],
85
-
86
- "@esbuild/android-x64": ["@esbuild/android-x64@0.28.1", "", { "os": "android", "cpu": "x64" }, "sha512-dbwY7ltSMDWsRatcRpCnES4F+im88OCUgGZjy52shC7GqHRE/cYlxNbB4Z4UpJswpcc4Qxd2oE/ufM0p61IKng=="],
87
-
88
- "@esbuild/darwin-arm64": ["@esbuild/darwin-arm64@0.28.1", "", { "os": "darwin", "cpu": "arm64" }, "sha512-TZbWkQY7kvTAXbXUT7uVACR5cMHsDiSz9z7ZKAX/RTq/WJEk3QyRr0wZpNhBDX+/0CtdqUIJlOiodQcta6tY3Q=="],
89
-
90
- "@esbuild/darwin-x64": ["@esbuild/darwin-x64@0.28.1", "", { "os": "darwin", "cpu": "x64" }, "sha512-zfdzgK9ACBNZLI/CyHTOx81SyNbM6YXn7rxSgX97VjyiPl9W1i4Ka4fgKECEoFCKGpvBj5qArWIGgQjOwkgskQ=="],
91
-
92
- "@esbuild/freebsd-arm64": ["@esbuild/freebsd-arm64@0.28.1", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-wG2EA8ENdEI0qhkSZMjfqrdY+ziCYCPMmtZjjIwOmXFjmyzEHn+UUxk5of+SYsjtfs3VpnlC7QLzSI5hY/rOAw=="],
93
-
94
- "@esbuild/freebsd-x64": ["@esbuild/freebsd-x64@0.28.1", "", { "os": "freebsd", "cpu": "x64" }, "sha512-i7dZ9vQgnvSCzi/rYCXNgtF/U+eKZNJBzu3eTQbRgHnM7tNSizLOkRFAl3qzVc/Op/u5YkHHa4pf/3DOYHthLQ=="],
95
-
96
- "@esbuild/linux-arm": ["@esbuild/linux-arm@0.28.1", "", { "os": "linux", "cpu": "arm" }, "sha512-qVXBOHQS+d5Y722GwJzJUtOLlX7km3CraOaGormF1pDtPd2C/l1SHRPgjLunLGe51Sh5YYWKMFDyV4SxgMQYTQ=="],
97
-
98
- "@esbuild/linux-arm64": ["@esbuild/linux-arm64@0.28.1", "", { "os": "linux", "cpu": "arm64" }, "sha512-yHs+0uc8+nvEAfAfxrWQKK5peSNzBc4PegcMO0EJ2hT71uA7vB8Ihg2e77R2P7SG5uYjPbHlLLmve4LLLRCf0g=="],
99
-
100
- "@esbuild/linux-ia32": ["@esbuild/linux-ia32@0.28.1", "", { "os": "linux", "cpu": "ia32" }, "sha512-d1z4ZuP0ajrfz/FhGT4vv278rX8KnPPJx8i5+AtK7TYbx9Le9F1hyzurZpkEyjkGa9dUGhQow4C1NmeGvqxN2w=="],
101
-
102
- "@esbuild/linux-loong64": ["@esbuild/linux-loong64@0.28.1", "", { "os": "linux", "cpu": "none" }, "sha512-M5sRjUVZrkm1OAPR3dlOYzNmN+loZKGVi1VUQGrwuqLcbR6qeAz+famMhjASeH3YVKvZz+zT1jlh/keC3Rj/lg=="],
103
-
104
- "@esbuild/linux-mips64el": ["@esbuild/linux-mips64el@0.28.1", "", { "os": "linux", "cpu": "none" }, "sha512-mRObBZeHh2OxcBFPWE/FjylkRgZdYuiTR3vaTozquCGOH14iP9oN4x4Ge81CoIDYQrXmIxpFumJBu5MtZpnQJQ=="],
105
-
106
- "@esbuild/linux-ppc64": ["@esbuild/linux-ppc64@0.28.1", "", { "os": "linux", "cpu": "ppc64" }, "sha512-slScBsMAb3GFDcdrCgLwZtPYRoH2H/youv10QiZyRjmsP48fznoveWytSgCI/R0ZcUgpc0ZhIUEx6LHts8yrfQ=="],
107
-
108
- "@esbuild/linux-riscv64": ["@esbuild/linux-riscv64@0.28.1", "", { "os": "linux", "cpu": "none" }, "sha512-kw0owk1o0GFETUJyW0jc0G4Yzs0BHZn0JDZ8JRT088vjJYX777BAs1fDGxAC+q831qOs2DTC96mNsG2opdfyyQ=="],
109
-
110
- "@esbuild/linux-s390x": ["@esbuild/linux-s390x@0.28.1", "", { "os": "linux", "cpu": "s390x" }, "sha512-/lAIjX8aYFRByhh6L5rYtPEDRqa9de/4V/juOXcta5frjvzXO4/sqEtyytse0g3zZFuWu5cDN0MkLz2qRDD2Ag=="],
111
-
112
- "@esbuild/linux-x64": ["@esbuild/linux-x64@0.28.1", "", { "os": "linux", "cpu": "x64" }, "sha512-u/anNYF2mmVOEDwLtnQ1wOr3EZ9sTNGLWrsYGYwHWzGA3Si84IOkHXlbWTD1NB+9/1lcnweYKO54uhxZydNzfA=="],
113
-
114
- "@esbuild/netbsd-arm64": ["@esbuild/netbsd-arm64@0.28.1", "", { "os": "none", "cpu": "arm64" }, "sha512-oks0DYbLwWMmaakTsCb+zL4E+aHRVLom9IJZOAthMQEPiQmydXHkziYEsGYRx0uNV/IjEKGAV941JzH02pflqw=="],
115
-
116
- "@esbuild/netbsd-x64": ["@esbuild/netbsd-x64@0.28.1", "", { "os": "none", "cpu": "x64" }, "sha512-aeL6lAnN89Hz43Mlh1G8ARasbuoYvSITDEx0tHh5b7jJnHcssqgjy9Yx430GDpmCa6OyrKoS0aNRjKundRizGg=="],
117
-
118
- "@esbuild/openbsd-arm64": ["@esbuild/openbsd-arm64@0.28.1", "", { "os": "openbsd", "cpu": "arm64" }, "sha512-MEFJe5C3R8pwXdZ5Y21oo6m7ePiS0d9pWucn99O/wvyJZChoIQKrQDxKrGeW8F5+T0okTHesAmDeiHDTIq0V/Q=="],
119
-
120
- "@esbuild/openbsd-x64": ["@esbuild/openbsd-x64@0.28.1", "", { "os": "openbsd", "cpu": "x64" }, "sha512-i/ZLIOafE0Z8cI/XANJAixoJL/uRAoS2xOA3rb0xN+KK0K177cMAsQYkzHtBrtMXAKuAc7HGgcWiZ/sRC1Nxgw=="],
121
-
122
- "@esbuild/openharmony-arm64": ["@esbuild/openharmony-arm64@0.28.1", "", { "os": "none", "cpu": "arm64" }, "sha512-ge+Z7EXFNt2BO1oAMsVpiQ8EwndV9i1xXerAeTIK7AtPs3bKFXQM7nlRxDSIUIMeueR1CNXxqztLzdNeReKBJg=="],
123
-
124
- "@esbuild/sunos-x64": ["@esbuild/sunos-x64@0.28.1", "", { "os": "sunos", "cpu": "x64" }, "sha512-BEjgtECkL3vY+SaSQ6nzVfiALUeFxpawyp8Jmf5PtYhf1Ug40N1h/hxlhts+f1FvSvarEigdxS3BlSMI2PJLcQ=="],
125
-
126
- "@esbuild/win32-arm64": ["@esbuild/win32-arm64@0.28.1", "", { "os": "win32", "cpu": "arm64" }, "sha512-lCv9eK/H6ZJWbE7bh2nw54CZ9M2nupBxJcTsdk/QQnWkdSjKGuxmmH8/GWrlT1eMmZfn4dGcCjRte397WqfQXA=="],
127
-
128
- "@esbuild/win32-ia32": ["@esbuild/win32-ia32@0.28.1", "", { "os": "win32", "cpu": "ia32" }, "sha512-zvb/mB2bSCoJOpoCBgYKKpX6YM6mJBlBUVUtVj41DlZJVEB6/0CKlRYxP5wWl1C1ILiCoAU5wZZ4q1P3qeS6Eg=="],
129
-
130
- "@esbuild/win32-x64": ["@esbuild/win32-x64@0.28.1", "", { "os": "win32", "cpu": "x64" }, "sha512-bm4Mowrv+GXMlpWX++EcXw/iLyd1o3+bJkC2DkWXYVvgZCqD/bSj9ctZeAMC3cIxgjRVR2Dufaiu4YPxr5gW1A=="],
131
-
132
- "@google/genai": ["@google/genai@1.52.0", "", { "dependencies": { "google-auth-library": "10.9.1", "p-retry": "4.6.2", "protobufjs": "7.6.5", "ws": "8.21.3" }, "peerDependencies": { "@modelcontextprotocol/sdk": "^1.25.2" }, "optionalPeers": ["@modelcontextprotocol/sdk"] }, "sha512-gwSvbpiN/17O9TbsqSsE/OzZcpv5Fo4RQjdngGgogtuB9RsyJ8ZHhX5KjHj1bp5N9snN2eK8LDGXSaWW2hof8Q=="],
133
-
134
- "@mariozechner/clipboard": ["@mariozechner/clipboard@0.3.9", "", { "optionalDependencies": { "@mariozechner/clipboard-darwin-arm64": "0.3.9", "@mariozechner/clipboard-darwin-universal": "0.3.9", "@mariozechner/clipboard-darwin-x64": "0.3.9", "@mariozechner/clipboard-linux-arm64-gnu": "0.3.9", "@mariozechner/clipboard-linux-arm64-musl": "0.3.9", "@mariozechner/clipboard-linux-riscv64-gnu": "0.3.9", "@mariozechner/clipboard-linux-x64-gnu": "0.3.9", "@mariozechner/clipboard-linux-x64-musl": "0.3.9", "@mariozechner/clipboard-win32-arm64-msvc": "0.3.9", "@mariozechner/clipboard-win32-x64-msvc": "0.3.9" } }, "sha512-ABnA53mdfkGZwOFUdZNv2S0CWGO/EIuPj8Vv9xmBFmSYg/qFc7ihO6q5FcQjvoE67kZpWkEc4AhD6B/os04yuA=="],
135
-
136
- "@mariozechner/clipboard-darwin-arm64": ["@mariozechner/clipboard-darwin-arm64@0.3.9", "", { "os": "darwin", "cpu": "arm64" }, "sha512-BfgV7vCEWZwJwZJw03r6bP5+tf0iI/ANuQYCxi9RNn7FrWB3yzGuMKCrNLRl6V761vXRdL8+OqZ0wd4TqlsNOQ=="],
137
-
138
- "@mariozechner/clipboard-darwin-universal": ["@mariozechner/clipboard-darwin-universal@0.3.9", "", { "os": "darwin" }, "sha512-BGGR4iA9Z2shAjI65eI5xtyb3LYNlDW9X3gxKxDbqtbnREohsrqznov6zpKoIrsRWpzlYVEdKphS7ksJ0/ndSQ=="],
139
-
140
- "@mariozechner/clipboard-darwin-x64": ["@mariozechner/clipboard-darwin-x64@0.3.9", "", { "os": "darwin", "cpu": "x64" }, "sha512-4kURmCbS6nt8uYhtmWpUcJWyPHfmAr5dTpXD1nO3pIfa+TSQ9DbrGOYCKH+aEFW47XhQ4Vp8ZTszie+wfFvDKg=="],
141
-
142
- "@mariozechner/clipboard-linux-arm64-gnu": ["@mariozechner/clipboard-linux-arm64-gnu@0.3.9", "", { "os": "linux", "cpu": "arm64" }, "sha512-g59OkUGP2DDfCOIKypHeYgv2M55u/cKvXa5dSxFbEJ34XvIQMdcVmpKCkGUro3ZgefXiGVdwguvTMQGpHWzIXw=="],
143
-
144
- "@mariozechner/clipboard-linux-arm64-musl": ["@mariozechner/clipboard-linux-arm64-musl@0.3.9", "", { "os": "linux", "cpu": "arm64" }, "sha512-AGuJdgKsmJdm4Pych7kv3sqe591ERRaAHW3xjLooiFzn8J+PxUyof++7YZrB5Y5tpnTO+K18Og3taj2NpluCRQ=="],
145
-
146
- "@mariozechner/clipboard-linux-riscv64-gnu": ["@mariozechner/clipboard-linux-riscv64-gnu@0.3.9", "", { "os": "linux", "cpu": "none" }, "sha512-DXBEAiuMpk7dhS1a9NzNxVAFi1vaKoPu7rQNgY8LIDLGrK3lnIp3nT10DUum+PKVJoJppIP+NAA8IZe4DMNDPw=="],
147
-
148
- "@mariozechner/clipboard-linux-x64-gnu": ["@mariozechner/clipboard-linux-x64-gnu@0.3.9", "", { "os": "linux", "cpu": "x64" }, "sha512-WORrMLd6EpElEME7JRKfSaY34nW1P5LbdgK5YNCS1ncG2LqmITsSMEJ8nh2mpvxb3TxqbOOKgY7k9eMJYlW9Mw=="],
149
-
150
- "@mariozechner/clipboard-linux-x64-musl": ["@mariozechner/clipboard-linux-x64-musl@0.3.9", "", { "os": "linux", "cpu": "x64" }, "sha512-/DHn+1DrfL6oRaPPWXaOKvonFFrni666fxd+zFqiQEfvBH0tsHVWjq9iqBk0oDp0qaPA72lIMy5BptxISBEhZQ=="],
151
-
152
- "@mariozechner/clipboard-win32-arm64-msvc": ["@mariozechner/clipboard-win32-arm64-msvc@0.3.9", "", { "os": "win32", "cpu": "arm64" }, "sha512-O5FHD3ErkMwMhNzAfu3ggy0ug4z7btZuoQgwwxlzPrwV2bxlD6WDpqBY4NCgICAgZdDKdp+loUEKVAVt8aYnhQ=="],
153
-
154
- "@mariozechner/clipboard-win32-x64-msvc": ["@mariozechner/clipboard-win32-x64-msvc@0.3.9", "", { "os": "win32", "cpu": "x64" }, "sha512-ihQC3EufqEY81vhXBgVBtK4prL+wc62zJsSvxrgz7K1hsdt6OObz6v9p3Rn1OG3GJksTTKMJF0u/guMISHPhSA=="],
155
-
156
- "@protobufjs/aspromise": ["@protobufjs/aspromise@1.1.2", "", {}, "sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ=="],
157
-
158
- "@protobufjs/base64": ["@protobufjs/base64@1.1.2", "", {}, "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg=="],
159
-
160
- "@protobufjs/codegen": ["@protobufjs/codegen@2.0.5", "", {}, "sha512-zgXFLzW3Ap33e6d0Wlj4MGIm6Ce8O89n/apUaGNB/jx+hw+ruWEp7EwGUshdLKVRCxZW12fp9r40E1mQrf/34g=="],
161
-
162
- "@protobufjs/eventemitter": ["@protobufjs/eventemitter@1.1.1", "", {}, "sha512-vW1GmwMZNnL+gMRaovlh9yZX74kc+TTU3FObkkurpMaRtBfLP3ldjS9KQWlwZgraRE0+dheEEoAxdzcJQ8eXZg=="],
163
-
164
- "@protobufjs/fetch": ["@protobufjs/fetch@1.1.1", "", { "dependencies": { "@protobufjs/aspromise": "1.1.2" } }, "sha512-GpptLrs57adMSuHi3VNj0mAF8dwh36LMaYF6XyJ6JMWlVsc+t42tm1HSEDmOs3A8fC9yyeisgLhsTVQokOZ0zw=="],
165
-
166
- "@protobufjs/float": ["@protobufjs/float@1.0.2", "", {}, "sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ=="],
167
-
168
- "@protobufjs/path": ["@protobufjs/path@1.1.2", "", {}, "sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA=="],
169
-
170
- "@protobufjs/pool": ["@protobufjs/pool@1.1.0", "", {}, "sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw=="],
171
-
172
- "@protobufjs/utf8": ["@protobufjs/utf8@1.1.2", "", {}, "sha512-b1UQwcEZ4yCnMCD8DAL1VlbvBJE9/IX4FTIp7BG1xYpf29SLazLSrqUkj4w7Y5y7cCVP6E5tcqqcI0xemPkHug=="],
173
-
174
- "@silvia-odwyer/photon-node": ["@silvia-odwyer/photon-node@0.3.4", "", {}, "sha512-bnly4BKB3KDTFxrUIcgCLbaeVVS8lrAkri1pEzskpmxu9MdfGQTy8b8EgcD83ywD3RPMsIulY8xJH5Awa+t9fA=="],
175
-
176
- "@smithy/core": ["@smithy/core@3.33.2", "", { "dependencies": { "@smithy/types": "4.17.2", "tslib": "2.8.1" } }, "sha512-CUGXpnPkVdjUCbix+83sWLW9VFgQOm44MDOx/ihITJMAnOZKvL8YYIc7DR9pP/tZ8CIRvMiON/TucvygqbHO3w=="],
177
-
178
- "@smithy/credential-provider-imds": ["@smithy/credential-provider-imds@4.5.2", "", { "dependencies": { "@smithy/core": "3.33.2", "@smithy/types": "4.17.2", "tslib": "2.8.1" } }, "sha512-A9uSdn72ozbRUSit0eib0TW7nXuNPlaeM0zcGkJ+nE6tFcSDbnmtwoxbTCFBukVQcszDAyvsd7+rTduPTXpygg=="],
179
-
180
- "@smithy/fetch-http-handler": ["@smithy/fetch-http-handler@5.7.2", "", { "dependencies": { "@smithy/core": "3.33.2", "@smithy/types": "4.17.2", "tslib": "2.8.1" } }, "sha512-nZyWTmSpJEXl6VtWVMBJve/7x12DZu6sIX1z1a+ZMaHlQQRs9Zpu6NbTe/gmxYXVRpkjxyDYpZ5gx2IM6f/Wkw=="],
181
-
182
- "@smithy/is-array-buffer": ["@smithy/is-array-buffer@2.2.0", "", { "dependencies": { "tslib": "2.8.1" } }, "sha512-GGP3O9QFD24uGeAXYUjwSTXARoqpZykHadOmA8G5vfJPK0/DC67qa//0qvqrJzL1xc8WQWX7/yc7fwudjPHPhA=="],
183
-
184
- "@smithy/node-http-handler": ["@smithy/node-http-handler@4.7.3", "", { "dependencies": { "@smithy/core": "3.33.2", "@smithy/types": "4.17.2", "tslib": "2.8.1" } }, "sha512-/jPhevcTFPMVl6KNjbaI47iOg1zxC7IsnX4PQDGVZKMFceOXtB8IEYaB7a9VvkP/3oC60WzTeKocvSI7vLT0vA=="],
185
-
186
- "@smithy/signature-v4": ["@smithy/signature-v4@5.7.2", "", { "dependencies": { "@smithy/core": "3.33.2", "@smithy/types": "4.17.2", "tslib": "2.8.1" } }, "sha512-P7Ki6px6OOrxVtx8K7nLmyx4SlXUW/uTKDdMG44UHefmPGSRMBKe2v+TM59WdLcpUIrBrnuCsIqiM2MbsZjmhw=="],
187
-
188
- "@smithy/types": ["@smithy/types@4.17.2", "", { "dependencies": { "tslib": "2.8.1" } }, "sha512-FOKpVZob9MPTn2znRzGrnsMHv7BOsKVw3XiP/cOyYLDVZ9qKp4nifIiSCuUU/fIj5Vu0UOAxCFr+qRAtG0NUkA=="],
189
-
190
- "@smithy/util-buffer-from": ["@smithy/util-buffer-from@2.2.0", "", { "dependencies": { "@smithy/is-array-buffer": "2.2.0", "tslib": "2.8.1" } }, "sha512-IJdWBbTcMQ6DA0gdNhh/BwrLkDR+ADW5Kr1aZmd4k3DIF6ezMV4R2NIAmT08wQJ3yUK82thHWmC/TnK/wpMMIA=="],
191
-
192
- "@smithy/util-utf8": ["@smithy/util-utf8@2.3.0", "", { "dependencies": { "@smithy/util-buffer-from": "2.2.0", "tslib": "2.8.1" } }, "sha512-R8Rdn8Hy72KKcebgLiv8jQcQkXoLMOGGv5uI1/k0l+snqkOzQ1R0ChUBCxWMlBsFMekWjq0wRudIweFs7sKT5A=="],
193
-
194
- "@stablelib/base64": ["@stablelib/base64@1.0.1", "", {}, "sha512-1bnPQqSxSuc3Ii6MhBysoWCg58j97aUjuCSZrGSmDxNqtytIi0k8utUenAwTZN4V5mXXYGsVUI9zeBqy+jBOSQ=="],
195
-
196
- "@types/node": ["@types/node@24.13.3", "", { "dependencies": { "undici-types": "7.18.2" } }, "sha512-Dh8vAsV36ig5wa9OX4pXvMc9D3Veibfw2wix0CUwYODLD8nkj9UsLjASr49nPg+2eKzxhBV+v7L8pXvT4e639Q=="],
197
-
198
- "@types/retry": ["@types/retry@0.12.0", "", {}, "sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA=="],
199
-
200
- "agent-base": ["agent-base@7.1.4", "", {}, "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ=="],
201
-
202
- "balanced-match": ["balanced-match@4.0.4", "", {}, "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA=="],
203
-
204
- "base64-js": ["base64-js@1.5.1", "", {}, "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA=="],
205
-
206
- "bignumber.js": ["bignumber.js@9.3.1", "", {}, "sha512-Ko0uX15oIUS7wJ3Rb30Fs6SkVbLmPBAKdlm7q9+ak9bbIeFf0MwuBsQV6z7+X768/cHsfg+WlysDWJcmthjsjQ=="],
207
-
208
- "bowser": ["bowser@2.14.1", "", {}, "sha512-tzPjzCxygAKWFOJP011oxFHs57HzIhOEracIgAePE4pqB3LikALKnSzUyU4MGs9/iCEUuHlAJTjTc5M+u7YEGg=="],
209
-
210
- "brace-expansion": ["brace-expansion@5.0.9", "", { "dependencies": { "balanced-match": "4.0.4" } }, "sha512-ScQ4IuvIEF1TMlP7Zt+vjJ//9zlPb2SDcxWxM3bk8s6t6GGdJ7KO1dCcTidOPJKePW30LE/2cT7wCyPho9/Wxg=="],
211
-
212
- "buffer-equal-constant-time": ["buffer-equal-constant-time@1.0.1", "", {}, "sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA=="],
213
-
214
- "chalk": ["chalk@5.6.2", "", {}, "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA=="],
215
-
216
- "cross-spawn": ["cross-spawn@7.0.6", "", { "dependencies": { "path-key": "3.1.1", "shebang-command": "2.0.0", "which": "2.0.2" } }, "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA=="],
217
-
218
- "data-uri-to-buffer": ["data-uri-to-buffer@4.0.1", "", {}, "sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A=="],
219
-
220
- "debug": ["debug@4.4.3", "", { "dependencies": { "ms": "2.1.3" }, "peerDependencies": { "supports-color": "*" }, "optionalPeers": ["supports-color"] }, "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA=="],
221
-
222
- "diff": ["diff@8.0.4", "", {}, "sha512-DPi0FmjiSU5EvQV0++GFDOJ9ASQUVFh5kD+OzOnYdi7n3Wpm9hWWGfB/O2blfHcMVTL5WkQXSnRiK9makhrcnw=="],
223
-
224
- "ecdsa-sig-formatter": ["ecdsa-sig-formatter@1.0.11", "", { "dependencies": { "safe-buffer": "5.2.1" } }, "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ=="],
225
-
226
- "esbuild": ["esbuild@0.28.1", "", { "optionalDependencies": { "@esbuild/aix-ppc64": "0.28.1", "@esbuild/android-arm": "0.28.1", "@esbuild/android-arm64": "0.28.1", "@esbuild/android-x64": "0.28.1", "@esbuild/darwin-arm64": "0.28.1", "@esbuild/darwin-x64": "0.28.1", "@esbuild/freebsd-arm64": "0.28.1", "@esbuild/freebsd-x64": "0.28.1", "@esbuild/linux-arm": "0.28.1", "@esbuild/linux-arm64": "0.28.1", "@esbuild/linux-ia32": "0.28.1", "@esbuild/linux-loong64": "0.28.1", "@esbuild/linux-mips64el": "0.28.1", "@esbuild/linux-ppc64": "0.28.1", "@esbuild/linux-riscv64": "0.28.1", "@esbuild/linux-s390x": "0.28.1", "@esbuild/linux-x64": "0.28.1", "@esbuild/netbsd-arm64": "0.28.1", "@esbuild/netbsd-x64": "0.28.1", "@esbuild/openbsd-arm64": "0.28.1", "@esbuild/openbsd-x64": "0.28.1", "@esbuild/openharmony-arm64": "0.28.1", "@esbuild/sunos-x64": "0.28.1", "@esbuild/win32-arm64": "0.28.1", "@esbuild/win32-ia32": "0.28.1", "@esbuild/win32-x64": "0.28.1" }, "bin": { "esbuild": "bin/esbuild" } }, "sha512-HrJrvZv5ayxBzPfwphOoNzkzOIIlifzk0KJrGK2c8R4+LKpMtpYLQeUdjnwjWv/LZlkH2laZk+4w78pi99D4Vw=="],
227
-
228
- "extend": ["extend@3.0.2", "", {}, "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g=="],
229
-
230
- "fast-sha256": ["fast-sha256@1.3.0", "", {}, "sha512-n11RGP/lrWEFI/bWdygLxhI+pVeo1ZYIVwvvPkW7azl/rOy+F3HYRZ2K5zeE9mmkhQppyv9sQFx0JM9UabnpPQ=="],
231
-
232
- "fetch-blob": ["fetch-blob@3.2.0", "", { "dependencies": { "node-domexception": "1.0.0", "web-streams-polyfill": "3.3.3" } }, "sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ=="],
233
-
234
- "formdata-polyfill": ["formdata-polyfill@4.0.10", "", { "dependencies": { "fetch-blob": "3.2.0" } }, "sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g=="],
235
-
236
- "gaxios": ["gaxios@7.3.1", "", { "dependencies": { "extend": "3.0.2", "https-proxy-agent": "7.0.6", "node-fetch": "3.3.2" } }, "sha512-kB3rzJV7d9juLZh8/56QTXCwQfxyhdOMdyYk1HdQKFtF8TJTDTZQJtixWIwXdE9Jji91mC41DUNpjleo4L4eAQ=="],
237
-
238
- "gcp-metadata": ["gcp-metadata@8.1.2", "", { "dependencies": { "gaxios": "7.3.1", "google-logging-utils": "1.1.3", "json-bigint": "1.0.0" } }, "sha512-zV/5HKTfCeKWnxG0Dmrw51hEWFGfcF2xiXqcA3+J90WDuP0SvoiSO5ORvcBsifmx/FoIjgQN3oNOGaQ5PhLFkg=="],
239
-
240
- "get-east-asian-width": ["get-east-asian-width@1.6.0", "", {}, "sha512-QRbvDIbx6YklUe6RxeTeleMR0yv3cYH6PsPZHcnVn7xv7zO1BHN8r0XETu8n6Ye3Q+ahtSarc3WgtNWmehIBfA=="],
241
-
242
- "google-auth-library": ["google-auth-library@10.9.1", "", { "dependencies": { "base64-js": "1.5.1", "ecdsa-sig-formatter": "1.0.11", "gaxios": "7.3.1", "gcp-metadata": "8.1.2", "google-logging-utils": "1.1.3", "jws": "4.0.1" } }, "sha512-i1ydyHrqcIxXkWh/uBmVkzCvIuq5yiK2ATndIe5XxKholrG/MTYP9xGYka4sQhrbIAgGjL2B6NOE7rFaiF3fXw=="],
243
-
244
- "google-logging-utils": ["google-logging-utils@1.1.3", "", {}, "sha512-eAmLkjDjAFCVXg7A1unxHsLf961m6y17QFqXqAXGj/gVkKFrEICfStRfwUlGNfeCEjNRa32JEWOUTlYXPyyKvA=="],
245
-
246
- "graceful-fs": ["graceful-fs@4.2.11", "", {}, "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ=="],
247
-
248
- "grok-mermaid": ["grok-mermaid@0.2.2", "", {}, "sha512-XcJEP5dDC8liHBh52mlLjU18fNvu1ckFsu0QpIG3+APZ270fsj9wxpiA6cOURmbUEuoMVgjbC2+UYgTdCqqgzA=="],
249
-
250
- "highlight.js": ["highlight.js@10.7.3", "", {}, "sha512-tzcUFauisWKNHaRkN4Wjl/ZA07gENAjFl3J/c480dprkGTg5EQstgaNFqBfUqCq54kZRIEcreTsAgF/m2quD7A=="],
251
-
252
- "hosted-git-info": ["hosted-git-info@9.0.3", "", { "dependencies": { "lru-cache": "11.5.2" } }, "sha512-Hc+ghLoSt6QaYZUv0WBiIvmMDZuZZ7oaDvdH8MbfOO4lOsxdXLEvuC6ePoGs9H1X9oCLyq6+NVN0MKqD+ydxyg=="],
253
-
254
- "http-proxy-agent": ["http-proxy-agent@7.0.2", "", { "dependencies": { "agent-base": "7.1.4", "debug": "4.4.3" } }, "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig=="],
255
-
256
- "https-proxy-agent": ["https-proxy-agent@7.0.6", "", { "dependencies": { "agent-base": "7.1.4", "debug": "4.4.3" } }, "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw=="],
257
-
258
- "ignore": ["ignore@7.0.5", "", {}, "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg=="],
259
-
260
- "isexe": ["isexe@2.0.0", "", {}, "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw=="],
261
-
262
- "jiti": ["jiti@2.7.0", "", { "bin": { "jiti": "lib/jiti-cli.mjs" } }, "sha512-AC/7JofJvZGrrneWNaEnJeOLUx+JlGt7tNa0wZiRPT4MY1wmfKjt2+6O2p2uz2+skll8OZZmJMNqeke7kKbNgQ=="],
263
-
264
- "json-bigint": ["json-bigint@1.0.0", "", { "dependencies": { "bignumber.js": "9.3.1" } }, "sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ=="],
265
-
266
- "json-schema-to-ts": ["json-schema-to-ts@3.1.1", "", { "dependencies": { "@babel/runtime": "7.29.7", "ts-algebra": "2.0.0" } }, "sha512-+DWg8jCJG2TEnpy7kOm/7/AxaYoaRbjVB4LFZLySZlWn8exGs3A4OLJR966cVvU26N7X9TWxl+Jsw7dzAqKT6g=="],
267
-
268
- "jwa": ["jwa@2.0.1", "", { "dependencies": { "buffer-equal-constant-time": "1.0.1", "ecdsa-sig-formatter": "1.0.11", "safe-buffer": "5.2.1" } }, "sha512-hRF04fqJIP8Abbkq5NKGN0Bbr3JxlQ+qhZufXVr0DvujKy93ZCbXZMHDL4EOtodSbCWxOqR8MS1tXA5hwqCXDg=="],
269
-
270
- "jws": ["jws@4.0.1", "", { "dependencies": { "jwa": "2.0.1", "safe-buffer": "5.2.1" } }, "sha512-EKI/M/yqPncGUUh44xz0PxSidXFr/+r0pA70+gIYhjv+et7yxM+s29Y+VGDkovRofQem0fs7Uvf4+YmAdyRduA=="],
271
-
272
- "long": ["long@5.3.2", "", {}, "sha512-mNAgZ1GmyNhD7AuqnTG3/VQ26o760+ZYBPKjPvugO8+nLbYfX6TVpJPseBvopbdY+qpZ/lKUnmEc1LeZYS3QAA=="],
273
-
274
- "lru-cache": ["lru-cache@11.5.2", "", {}, "sha512-4pfM1Ff0x50o0tQwb5ucw/RzNyD0/YJME6IVcStalZuMWxdt3sR3huStTtxz4PUmvZfRguvDejasvQ2kifR11g=="],
275
-
276
- "marked": ["marked@18.0.5", "", { "bin": { "marked": "bin/marked.js" } }, "sha512-S6GcvALHg6K4ohtu4E7x0a1AqhAjp6cV8KhLSyN9qVapnzJkusVBxZRcIU9AeYsbe6P1hKDusSbEOzGyyuce6w=="],
277
-
278
- "minimatch": ["minimatch@10.2.5", "", { "dependencies": { "brace-expansion": "5.0.9" } }, "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg=="],
279
-
280
- "ms": ["ms@2.1.3", "", {}, "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="],
281
-
282
- "node-domexception": ["node-domexception@1.0.0", "", {}, "sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ=="],
283
-
284
- "node-fetch": ["node-fetch@3.3.2", "", { "dependencies": { "data-uri-to-buffer": "4.0.1", "fetch-blob": "3.2.0", "formdata-polyfill": "4.0.10" } }, "sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA=="],
285
-
286
- "openai": ["openai@6.40.0", "", { "peerDependencies": { "ws": "^8.18.0", "zod": "^3.25 || ^4.0" }, "optionalPeers": ["ws", "zod"] }, "sha512-MWtTjd/gQt4jpbji61NTgFWJLoY/PdRJ6wG9/ZDRMYNMlBKrCrSlkLI+KgHP1vR1qT6LKSAyAqIxno6lcK9JiA=="],
287
-
288
- "p-retry": ["p-retry@4.6.2", "", { "dependencies": { "@types/retry": "0.12.0", "retry": "0.13.1" } }, "sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ=="],
289
-
290
- "partial-json": ["partial-json@0.1.7", "", {}, "sha512-Njv/59hHaokb/hRUjce3Hdv12wd60MtM9Z5Olmn+nehe0QDAsRtRbJPvJ0Z91TusF0SuZRIvnM+S4l6EIP8leA=="],
291
-
292
- "path-key": ["path-key@3.1.1", "", {}, "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q=="],
293
-
294
- "proper-lockfile": ["proper-lockfile@4.1.2", "", { "dependencies": { "graceful-fs": "4.2.11", "retry": "0.12.0", "signal-exit": "3.0.7" } }, "sha512-TjNPblN4BwAWMXU8s9AEz4JmQxnD1NNL7bNOY/AKUzyamc379FWASUhc/K1pL2noVb+XmZKLL68cjzLsiOAMaA=="],
295
-
296
- "protobufjs": ["protobufjs@7.6.5", "", { "dependencies": { "@protobufjs/aspromise": "1.1.2", "@protobufjs/base64": "1.1.2", "@protobufjs/codegen": "2.0.5", "@protobufjs/eventemitter": "1.1.1", "@protobufjs/fetch": "1.1.1", "@protobufjs/float": "1.0.2", "@protobufjs/path": "1.1.2", "@protobufjs/pool": "1.1.0", "@protobufjs/utf8": "1.1.2", "@types/node": "24.13.3", "long": "5.3.2" } }, "sha512-/FPD0nUc9jH6rfFjji9IBqOz4pcSE3CsT1m7Ep6Mdb0LxSUMj8hgl6GomOvZzpNpAqqGaXA0P3VSrZLFzIhQrw=="],
297
-
298
- "retry": ["retry@0.12.0", "", {}, "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow=="],
299
-
300
- "safe-buffer": ["safe-buffer@5.2.1", "", {}, "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ=="],
301
-
302
- "semver": ["semver@7.8.0", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-AcM7dV/5ul4EekoQ29Agm5vri8JNqRyj39o0qpX6vDF2GZrtutZl5RwgD1XnZjiTAfncsJhMI48QQH3sN87YNA=="],
303
-
304
- "shebang-command": ["shebang-command@2.0.0", "", { "dependencies": { "shebang-regex": "3.0.0" } }, "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA=="],
305
-
306
- "shebang-regex": ["shebang-regex@3.0.0", "", {}, "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A=="],
307
-
308
- "signal-exit": ["signal-exit@3.0.7", "", {}, "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ=="],
309
-
310
- "standardwebhooks": ["standardwebhooks@1.1.1", "", { "dependencies": { "@stablelib/base64": "^1.0.0", "fast-sha256": "^1.3.0" } }, "sha512-bCbX9ZEyFkWPsRz7Bl3NuQUJohmwGSev/yhr7vhaGPlc4AfIrspIRa6cPTBuI1ItmrTDJ4d/S2hCsfe4+vQGnQ=="],
311
-
312
- "ts-algebra": ["ts-algebra@2.0.0", "", {}, "sha512-FPAhNPFMrkwz76P7cdjdmiShwMynZYN6SgOujD1urY4oNm80Ou9oMdmbR45LotcKOXoy7wSmHkRFE6Mxbrhefw=="],
313
-
314
- "tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="],
315
-
316
- "typebox": ["typebox@1.3.7", "", {}, "sha512-meKuifc33Pccx0O6PdIzYMq3Og8zvP4TIi/a+Bw3AEMZMxOD0+RHGQvpglEe6Zdy3wZ8nqn/j95h8LUZLk/6Hg=="],
317
-
318
- "typescript": ["typescript@6.0.3", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-y2TvuxSZPDyQakkFRPZHKFm+KKVqIisdg9/CZwm9ftvKXLP8NRWj38/ODjNbr43SsoXqNuAisEf1GdCxqWcdBw=="],
319
-
320
- "undici": ["undici@8.9.0", "", {}, "sha512-aWZpUj7XoGonMClx4gdDRfgBjqeA+F473aDmROQQbM9n6PRfK/u1q/a0X4wMTgcHfT8H6fpbt98PFuDUwFg2YA=="],
321
-
322
- "undici-types": ["undici-types@7.18.2", "", {}, "sha512-AsuCzffGHJybSaRrmr5eHr81mwJU3kjw6M+uprWvCXiNeN9SOGwQ3Jn8jb8m3Z6izVgknn1R0FTCEAP2QrLY/w=="],
323
-
324
- "web-streams-polyfill": ["web-streams-polyfill@3.3.3", "", {}, "sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw=="],
325
-
326
- "which": ["which@2.0.2", "", { "dependencies": { "isexe": "2.0.0" }, "bin": { "node-which": "./bin/node-which" } }, "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA=="],
327
-
328
- "ws": ["ws@8.21.3", "", { "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": ">=5.0.2" }, "optionalPeers": ["bufferutil", "utf-8-validate"] }, "sha512-201TZ/kPWxoPr/OKWjquZR1SWKXcvxdH+e1xrx89b3YbmzLMFCLfnaG1HFIgWzJOEWZ7MvpK++odZufgYR50Rw=="],
329
-
330
- "yaml": ["yaml@2.9.0", "", { "bin": { "yaml": "bin.mjs" } }, "sha512-2AvhNX3mb8zd6Zy7INTtSpl1F15HW6Wnqj0srWlkKLcpYl/gMIMJiyuGq2KeI2YFxUPjdlB+3Lc10seMLtL4cA=="],
331
-
332
- "@aws-sdk/client-bedrock-runtime/@smithy/node-http-handler": ["@smithy/node-http-handler@4.11.2", "", { "dependencies": { "@smithy/core": "3.33.2", "@smithy/types": "4.17.2", "tslib": "2.8.1" } }, "sha512-avwAh9HM3h2lcfjvP3zYIZGf+XVgLQ91wOJ2qoFbNpW1UZeZb33aGlhTZvtkANHfcGhJroRY64525OjfgOg30g=="],
333
-
334
- "@aws-sdk/credential-provider-http/@smithy/node-http-handler": ["@smithy/node-http-handler@4.11.2", "", { "dependencies": { "@smithy/core": "3.33.2", "@smithy/types": "4.17.2", "tslib": "2.8.1" } }, "sha512-avwAh9HM3h2lcfjvP3zYIZGf+XVgLQ91wOJ2qoFbNpW1UZeZb33aGlhTZvtkANHfcGhJroRY64525OjfgOg30g=="],
335
-
336
- "@aws-sdk/credential-provider-sso/@aws-sdk/token-providers": ["@aws-sdk/token-providers@3.1111.0", "", { "dependencies": { "@aws-sdk/core": "3.977.8", "@aws-sdk/nested-clients": "3.997.43", "@aws-sdk/types": "3.974.4", "@smithy/core": "3.33.2", "@smithy/types": "4.17.2", "tslib": "2.8.1" } }, "sha512-JfljgoVtl+s3Qy21n9a7Z48uCQaOXcN74KJ3TEQfPoB293GrXFSt6HSQJF1sTZ8c/5QedEvd3NjJQMO4u9qa5A=="],
337
-
338
- "@aws-sdk/nested-clients/@smithy/node-http-handler": ["@smithy/node-http-handler@4.11.2", "", { "dependencies": { "@smithy/core": "3.33.2", "@smithy/types": "4.17.2", "tslib": "2.8.1" } }, "sha512-avwAh9HM3h2lcfjvP3zYIZGf+XVgLQ91wOJ2qoFbNpW1UZeZb33aGlhTZvtkANHfcGhJroRY64525OjfgOg30g=="],
339
-
340
- "p-retry/retry": ["retry@0.13.1", "", {}, "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg=="],
341
- }
342
- }