scoutline 0.1.0 → 0.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (242) hide show
  1. package/README.md +394 -7
  2. package/bin/scoutline.js +36 -15
  3. package/dist/capabilities/diagnostics.d.ts +135 -0
  4. package/dist/capabilities/diagnostics.d.ts.map +1 -0
  5. package/dist/capabilities/diagnostics.js +139 -0
  6. package/dist/capabilities/diagnostics.js.map +1 -0
  7. package/dist/capabilities/quota.d.ts +99 -0
  8. package/dist/capabilities/quota.d.ts.map +1 -0
  9. package/dist/capabilities/quota.js +129 -0
  10. package/dist/capabilities/quota.js.map +1 -0
  11. package/dist/capabilities/reader.d.ts +227 -0
  12. package/dist/capabilities/reader.d.ts.map +1 -0
  13. package/dist/capabilities/reader.js +100 -0
  14. package/dist/capabilities/reader.js.map +1 -0
  15. package/dist/capabilities/repository.d.ts +221 -0
  16. package/dist/capabilities/repository.d.ts.map +1 -0
  17. package/dist/capabilities/repository.js +172 -0
  18. package/dist/capabilities/repository.js.map +1 -0
  19. package/dist/capabilities/search.d.ts +110 -0
  20. package/dist/capabilities/search.d.ts.map +1 -0
  21. package/dist/capabilities/search.js +21 -0
  22. package/dist/capabilities/search.js.map +1 -0
  23. package/dist/capabilities/vision.d.ts +156 -0
  24. package/dist/capabilities/vision.d.ts.map +1 -0
  25. package/dist/capabilities/vision.js +111 -0
  26. package/dist/capabilities/vision.js.map +1 -0
  27. package/dist/command-invocation.d.ts +58 -0
  28. package/dist/command-invocation.d.ts.map +1 -0
  29. package/dist/command-invocation.js +95 -0
  30. package/dist/command-invocation.js.map +1 -0
  31. package/dist/commands/cache.d.ts +106 -0
  32. package/dist/commands/cache.d.ts.map +1 -0
  33. package/dist/commands/cache.js +203 -0
  34. package/dist/commands/cache.js.map +1 -0
  35. package/dist/commands/code.d.ts +11 -4
  36. package/dist/commands/code.d.ts.map +1 -1
  37. package/dist/commands/code.js +16 -42
  38. package/dist/commands/code.js.map +1 -1
  39. package/dist/commands/doctor.d.ts +69 -3
  40. package/dist/commands/doctor.d.ts.map +1 -1
  41. package/dist/commands/doctor.js +179 -52
  42. package/dist/commands/doctor.js.map +1 -1
  43. package/dist/commands/quota.d.ts +45 -3
  44. package/dist/commands/quota.d.ts.map +1 -1
  45. package/dist/commands/quota.js +116 -60
  46. package/dist/commands/quota.js.map +1 -1
  47. package/dist/commands/read.d.ts +76 -2
  48. package/dist/commands/read.d.ts.map +1 -1
  49. package/dist/commands/read.js +260 -121
  50. package/dist/commands/read.js.map +1 -1
  51. package/dist/commands/repo.d.ts +55 -4
  52. package/dist/commands/repo.d.ts.map +1 -1
  53. package/dist/commands/repo.js +115 -172
  54. package/dist/commands/repo.js.map +1 -1
  55. package/dist/commands/repository-explorer.d.ts +147 -0
  56. package/dist/commands/repository-explorer.d.ts.map +1 -0
  57. package/dist/commands/repository-explorer.js +550 -0
  58. package/dist/commands/repository-explorer.js.map +1 -0
  59. package/dist/commands/search.d.ts +27 -2
  60. package/dist/commands/search.d.ts.map +1 -1
  61. package/dist/commands/search.js +95 -103
  62. package/dist/commands/search.js.map +1 -1
  63. package/dist/commands/tools.d.ts +9 -3
  64. package/dist/commands/tools.d.ts.map +1 -1
  65. package/dist/commands/tools.js +29 -59
  66. package/dist/commands/tools.js.map +1 -1
  67. package/dist/commands/vision.d.ts +35 -9
  68. package/dist/commands/vision.d.ts.map +1 -1
  69. package/dist/commands/vision.js +184 -131
  70. package/dist/commands/vision.js.map +1 -1
  71. package/dist/index.d.ts +62 -1
  72. package/dist/index.d.ts.map +1 -1
  73. package/dist/index.js +580 -223
  74. package/dist/index.js.map +1 -1
  75. package/dist/lib/cache.d.ts +178 -12
  76. package/dist/lib/cache.d.ts.map +1 -1
  77. package/dist/lib/cache.js +377 -39
  78. package/dist/lib/cache.js.map +1 -1
  79. package/dist/lib/code-mode.d.ts +13 -0
  80. package/dist/lib/code-mode.d.ts.map +1 -1
  81. package/dist/lib/code-mode.js +26 -6
  82. package/dist/lib/code-mode.js.map +1 -1
  83. package/dist/lib/config.d.ts.map +1 -1
  84. package/dist/lib/config.js +15 -18
  85. package/dist/lib/config.js.map +1 -1
  86. package/dist/lib/errors.d.ts +89 -11
  87. package/dist/lib/errors.d.ts.map +1 -1
  88. package/dist/lib/errors.js +168 -21
  89. package/dist/lib/errors.js.map +1 -1
  90. package/dist/lib/execution.d.ts +190 -0
  91. package/dist/lib/execution.d.ts.map +1 -0
  92. package/dist/lib/execution.js +383 -0
  93. package/dist/lib/execution.js.map +1 -0
  94. package/dist/lib/index.d.ts +10 -2
  95. package/dist/lib/index.d.ts.map +1 -1
  96. package/dist/lib/index.js +10 -2
  97. package/dist/lib/index.js.map +1 -1
  98. package/dist/lib/mcp-client.d.ts +75 -16
  99. package/dist/lib/mcp-client.d.ts.map +1 -1
  100. package/dist/lib/mcp-client.js +173 -108
  101. package/dist/lib/mcp-client.js.map +1 -1
  102. package/dist/lib/mcp-config.d.ts +17 -0
  103. package/dist/lib/mcp-config.d.ts.map +1 -1
  104. package/dist/lib/mcp-config.js +29 -0
  105. package/dist/lib/mcp-config.js.map +1 -1
  106. package/dist/lib/monitor-client.d.ts +17 -3
  107. package/dist/lib/monitor-client.d.ts.map +1 -1
  108. package/dist/lib/monitor-client.js +23 -69
  109. package/dist/lib/monitor-client.js.map +1 -1
  110. package/dist/lib/output.d.ts +53 -7
  111. package/dist/lib/output.d.ts.map +1 -1
  112. package/dist/lib/output.js +126 -39
  113. package/dist/lib/output.js.map +1 -1
  114. package/dist/lib/redact.d.ts +62 -3
  115. package/dist/lib/redact.d.ts.map +1 -1
  116. package/dist/lib/redact.js +165 -31
  117. package/dist/lib/redact.js.map +1 -1
  118. package/dist/lib/tool-cache.d.ts +86 -0
  119. package/dist/lib/tool-cache.d.ts.map +1 -0
  120. package/dist/lib/tool-cache.js +123 -0
  121. package/dist/lib/tool-cache.js.map +1 -0
  122. package/dist/lib/tty.d.ts +7 -20
  123. package/dist/lib/tty.d.ts.map +1 -1
  124. package/dist/lib/tty.js +51 -30
  125. package/dist/lib/tty.js.map +1 -1
  126. package/dist/node-command-invocation-adapter.d.ts +28 -0
  127. package/dist/node-command-invocation-adapter.d.ts.map +1 -0
  128. package/dist/node-command-invocation-adapter.js +88 -0
  129. package/dist/node-command-invocation-adapter.js.map +1 -0
  130. package/dist/providers/minimax/adapter.d.ts +49 -0
  131. package/dist/providers/minimax/adapter.d.ts.map +1 -0
  132. package/dist/providers/minimax/adapter.js +450 -0
  133. package/dist/providers/minimax/adapter.js.map +1 -0
  134. package/dist/providers/minimax/coding-plan-client.d.ts +60 -0
  135. package/dist/providers/minimax/coding-plan-client.d.ts.map +1 -0
  136. package/dist/providers/minimax/coding-plan-client.js +204 -0
  137. package/dist/providers/minimax/coding-plan-client.js.map +1 -0
  138. package/dist/providers/minimax/config.d.ts +32 -0
  139. package/dist/providers/minimax/config.d.ts.map +1 -0
  140. package/dist/providers/minimax/config.js +84 -0
  141. package/dist/providers/minimax/config.js.map +1 -0
  142. package/dist/providers/minimax/media.d.ts +88 -0
  143. package/dist/providers/minimax/media.d.ts.map +1 -0
  144. package/dist/providers/minimax/media.js +232 -0
  145. package/dist/providers/minimax/media.js.map +1 -0
  146. package/dist/providers/minimax/quota-client.d.ts +44 -0
  147. package/dist/providers/minimax/quota-client.d.ts.map +1 -0
  148. package/dist/providers/minimax/quota-client.js +83 -0
  149. package/dist/providers/minimax/quota-client.js.map +1 -0
  150. package/dist/providers/minimax/quota.d.ts +48 -0
  151. package/dist/providers/minimax/quota.d.ts.map +1 -0
  152. package/dist/providers/minimax/quota.js +120 -0
  153. package/dist/providers/minimax/quota.js.map +1 -0
  154. package/dist/providers/minimax/sdk-client.d.ts +29 -0
  155. package/dist/providers/minimax/sdk-client.d.ts.map +1 -0
  156. package/dist/providers/minimax/sdk-client.js +50 -0
  157. package/dist/providers/minimax/sdk-client.js.map +1 -0
  158. package/dist/providers/minimax/vision-attestations.d.ts +52 -0
  159. package/dist/providers/minimax/vision-attestations.d.ts.map +1 -0
  160. package/dist/providers/minimax/vision-attestations.js +79 -0
  161. package/dist/providers/minimax/vision-attestations.js.map +1 -0
  162. package/dist/providers/minimax/vision-conformance.d.ts +186 -0
  163. package/dist/providers/minimax/vision-conformance.d.ts.map +1 -0
  164. package/dist/providers/minimax/vision-conformance.js +371 -0
  165. package/dist/providers/minimax/vision-conformance.js.map +1 -0
  166. package/dist/providers/minimax/vision-mappings/chart.d.ts +35 -0
  167. package/dist/providers/minimax/vision-mappings/chart.d.ts.map +1 -0
  168. package/dist/providers/minimax/vision-mappings/chart.js +55 -0
  169. package/dist/providers/minimax/vision-mappings/chart.js.map +1 -0
  170. package/dist/providers/minimax/vision-mappings/common.d.ts +60 -0
  171. package/dist/providers/minimax/vision-mappings/common.d.ts.map +1 -0
  172. package/dist/providers/minimax/vision-mappings/common.js +75 -0
  173. package/dist/providers/minimax/vision-mappings/common.js.map +1 -0
  174. package/dist/providers/minimax/vision-mappings/diagnose-error.d.ts +35 -0
  175. package/dist/providers/minimax/vision-mappings/diagnose-error.d.ts.map +1 -0
  176. package/dist/providers/minimax/vision-mappings/diagnose-error.js +55 -0
  177. package/dist/providers/minimax/vision-mappings/diagnose-error.js.map +1 -0
  178. package/dist/providers/minimax/vision-mappings/diagram.d.ts +35 -0
  179. package/dist/providers/minimax/vision-mappings/diagram.d.ts.map +1 -0
  180. package/dist/providers/minimax/vision-mappings/diagram.js +55 -0
  181. package/dist/providers/minimax/vision-mappings/diagram.js.map +1 -0
  182. package/dist/providers/minimax/vision-mappings/extract-text.d.ts +35 -0
  183. package/dist/providers/minimax/vision-mappings/extract-text.d.ts.map +1 -0
  184. package/dist/providers/minimax/vision-mappings/extract-text.js +55 -0
  185. package/dist/providers/minimax/vision-mappings/extract-text.js.map +1 -0
  186. package/dist/providers/minimax/vision-mappings/ui-artifact.d.ts +35 -0
  187. package/dist/providers/minimax/vision-mappings/ui-artifact.d.ts.map +1 -0
  188. package/dist/providers/minimax/vision-mappings/ui-artifact.js +69 -0
  189. package/dist/providers/minimax/vision-mappings/ui-artifact.js.map +1 -0
  190. package/dist/providers/minimax/vision-mappings.generated.d.ts +29 -0
  191. package/dist/providers/minimax/vision-mappings.generated.d.ts.map +1 -0
  192. package/dist/providers/minimax/vision-mappings.generated.js +29 -0
  193. package/dist/providers/minimax/vision-mappings.generated.js.map +1 -0
  194. package/dist/providers/minimax/vision-revisions.d.ts +29 -0
  195. package/dist/providers/minimax/vision-revisions.d.ts.map +1 -0
  196. package/dist/providers/minimax/vision-revisions.js +34 -0
  197. package/dist/providers/minimax/vision-revisions.js.map +1 -0
  198. package/dist/providers/registry.d.ts +36 -0
  199. package/dist/providers/registry.d.ts.map +1 -0
  200. package/dist/providers/registry.js +45 -0
  201. package/dist/providers/registry.js.map +1 -0
  202. package/dist/providers/selection.d.ts +44 -0
  203. package/dist/providers/selection.d.ts.map +1 -0
  204. package/dist/providers/selection.js +85 -0
  205. package/dist/providers/selection.js.map +1 -0
  206. package/dist/providers/types.d.ts +281 -0
  207. package/dist/providers/types.d.ts.map +1 -0
  208. package/dist/providers/types.js +127 -0
  209. package/dist/providers/types.js.map +1 -0
  210. package/dist/providers/zai/adapter.d.ts +35 -0
  211. package/dist/providers/zai/adapter.d.ts.map +1 -0
  212. package/dist/providers/zai/adapter.js +685 -0
  213. package/dist/providers/zai/adapter.js.map +1 -0
  214. package/dist/providers/zai/credentials.d.ts +38 -0
  215. package/dist/providers/zai/credentials.d.ts.map +1 -0
  216. package/dist/providers/zai/credentials.js +60 -0
  217. package/dist/providers/zai/credentials.js.map +1 -0
  218. package/dist/providers/zai/encoded-error.d.ts +90 -0
  219. package/dist/providers/zai/encoded-error.d.ts.map +1 -0
  220. package/dist/providers/zai/encoded-error.js +169 -0
  221. package/dist/providers/zai/encoded-error.js.map +1 -0
  222. package/dist/providers/zai/media.d.ts +38 -0
  223. package/dist/providers/zai/media.d.ts.map +1 -0
  224. package/dist/providers/zai/media.js +107 -0
  225. package/dist/providers/zai/media.js.map +1 -0
  226. package/dist/providers/zai/monitor-client.d.ts +53 -0
  227. package/dist/providers/zai/monitor-client.d.ts.map +1 -0
  228. package/dist/providers/zai/monitor-client.js +117 -0
  229. package/dist/providers/zai/monitor-client.js.map +1 -0
  230. package/dist/providers/zai/quota.d.ts +47 -0
  231. package/dist/providers/zai/quota.d.ts.map +1 -0
  232. package/dist/providers/zai/quota.js +127 -0
  233. package/dist/providers/zai/quota.js.map +1 -0
  234. package/dist/providers/zai/reader.d.ts +82 -0
  235. package/dist/providers/zai/reader.d.ts.map +1 -0
  236. package/dist/providers/zai/reader.js +490 -0
  237. package/dist/providers/zai/reader.js.map +1 -0
  238. package/dist/providers/zai/repository.d.ts +76 -0
  239. package/dist/providers/zai/repository.d.ts.map +1 -0
  240. package/dist/providers/zai/repository.js +715 -0
  241. package/dist/providers/zai/repository.js.map +1 -0
  242. package/package.json +11 -6
@@ -1,50 +1,184 @@
1
1
  /**
2
- * Redact sensitive values from tool metadata (for output + caching).
2
+ * Recursive Provider credential redaction (DESIGN.md §16).
3
+ *
4
+ * This Module is the single source of truth for stripping Provider
5
+ * credentials before any value leaves Scoutline's outward boundaries:
6
+ * formatted errors, cached metadata, quota failures, diagnostics output,
7
+ * and fatal shell errors.
8
+ *
9
+ * Redaction properties (Phase 4 P4-01):
10
+ * - Case-insensitive for the canonical credential-shaped keys.
11
+ * - Recursive through nested arrays and plain objects.
12
+ * - Non-mutating — the original input is never modified.
13
+ * - Secret-aware — every configured secret value is replaced inside
14
+ * any string the value tree reaches, not just the configured key.
15
+ * - Empty-safe — empty strings are never treated as a replacement token.
16
+ *
17
+ * The Module retains the legacy `redactSecrets(value, apiKey?)` and
18
+ * `redactTool(tool)` exports so existing call sites keep compiling.
19
+ * New code should pass an explicit array of secrets so every Provider's
20
+ * credential is covered in one pass.
3
21
  */
4
- const REDACT_KEYS = new Set([
22
+ /**
23
+ * Canonical credential-shaped key names. Lowercased so case-insensitive
24
+ * matching is a one-step compare. Covers every name DESIGN.md §16
25
+ * enumerates plus the common HTTP header aliases.
26
+ */
27
+ const CREDENTIAL_KEYS = new Set([
5
28
  "authorization",
6
- "Authorization",
29
+ "x-api-key",
7
30
  "api_key",
8
- "apiKey",
31
+ "apikey",
9
32
  "access_token",
10
33
  "token",
11
- "Z_AI_API_KEY",
12
- "ZAI_API_KEY",
34
+ "z_ai_api_key",
35
+ "zai_api_key",
36
+ "minimax_api_key",
13
37
  ]);
14
- function redactString(value, apiKey) {
15
- let result = value;
16
- if (apiKey && result.includes(apiKey)) {
17
- result = result.replaceAll(apiKey, "[REDACTED]");
18
- }
19
- if (/^Bearer\s+\S+/.test(result)) {
20
- result = result.replace(/Bearer\s+\S+/, "Bearer [REDACTED]");
38
+ const REDACTED = "[REDACTED]";
39
+ /**
40
+ * Replace credential-shaped substrings inside a single string. Useful
41
+ * for error messages and load-failure texts where the value is a flat
42
+ * string rather than a structured object.
43
+ *
44
+ * Replaces:
45
+ * - Bearer authorization values (any case).
46
+ * - x-api-key assignments (any case; `=`, `:`, or whitespace as the
47
+ * key/value separator — covers both `x-api-key=value` and
48
+ * `x-api-key value`).
49
+ * - Z_AI_API_KEY, ZAI_API_KEY, MINIMAX_API_KEY assignments.
50
+ * - The literal credentials passed in `extraSecrets` (each value is
51
+ * replaced wherever it appears; empty strings are skipped).
52
+ */
53
+ export function redactCredentialString(input, extraSecrets) {
54
+ if (typeof input !== "string")
55
+ return input;
56
+ let result = input;
57
+ result = result.replace(/Bearer\s+\S+/gi, REDACTED);
58
+ // Fixup C — W3: the class accepts either `=`, `:`, or any whitespace
59
+ // as the key/value separator. The trailing `\S+` consumes the secret
60
+ // value; the entire `key + separator + value` span is replaced with
61
+ // the redaction marker.
62
+ result = result.replace(/x-api-key[\s=:]+[^\s,;"'`]+/gi, REDACTED);
63
+ result = result.replace(/Z_AI_API_KEY\s*=\s*\S+/gi, REDACTED);
64
+ result = result.replace(/ZAI_API_KEY\s*=\s*\S+/gi, REDACTED);
65
+ result = result.replace(/MINIMAX_API_KEY\s*=\s*\S+/gi, REDACTED);
66
+ // Embedded credential substrings inside URLs, e.g.
67
+ // `https://user:secret@host/path`. Catches both `https://` and
68
+ // `http://` schemes and replaces the entire URL with the marker so
69
+ // the user info does not leak.
70
+ result = result.replace(/https?:\/\/[^\s/:]+:[^\s@\/]+@[^\s/]+/gi, REDACTED);
71
+ const secrets = normalizeSecrets(extraSecrets);
72
+ for (const secret of secrets) {
73
+ if (secret.length === 0)
74
+ continue;
75
+ // Escape regex meta characters so a secret containing characters
76
+ // like `.` or `+` does not accidentally broaden the replacement.
77
+ const escaped = secret.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
78
+ result = result.replace(new RegExp(escaped, "g"), REDACTED);
21
79
  }
22
80
  return result;
23
81
  }
24
- export function redactSecrets(value, apiKey) {
25
- if (typeof value === "string") {
26
- return redactString(value, apiKey);
82
+ /**
83
+ * Normalise the `secrets` argument to a deduplicated array of
84
+ * non-empty strings. A `undefined` argument yields an empty list;
85
+ * a single string yields `[string]`; an array yields the filtered
86
+ * list.
87
+ */
88
+ function normalizeSecrets(secrets) {
89
+ if (secrets === undefined)
90
+ return [];
91
+ const list = Array.isArray(secrets) ? secrets : [secrets];
92
+ const out = [];
93
+ const seen = new Set();
94
+ for (const item of list) {
95
+ if (typeof item !== "string")
96
+ continue;
97
+ if (item.length === 0)
98
+ continue;
99
+ if (seen.has(item))
100
+ continue;
101
+ seen.add(item);
102
+ out.push(item);
103
+ }
104
+ return out;
105
+ }
106
+ /**
107
+ * Resolve the configured Provider credential values from the current
108
+ * process environment. Returned values are deduplicated and empty
109
+ * entries skipped, so callers can pass the result directly to
110
+ * {@link redactSecrets}.
111
+ */
112
+ export function configuredSecrets(env = process.env) {
113
+ const candidates = [
114
+ env.Z_AI_API_KEY,
115
+ env.ZAI_API_KEY,
116
+ env.MINIMAX_API_KEY,
117
+ ];
118
+ return normalizeSecrets(candidates.filter((c) => typeof c === "string"));
119
+ }
120
+ /**
121
+ * Recursively redact credential values from an arbitrary tree.
122
+ *
123
+ * Accepts either a single string (back-compat overload) or an array of
124
+ * secret values. Returns a NEW value tree; the input is never mutated.
125
+ *
126
+ * Key matching is case-insensitive over {@link CREDENTIAL_KEYS}. Plain
127
+ * objects and arrays are descended into. Other object kinds (Date,
128
+ * typed arrays, class instances) are returned as-is so their internal
129
+ * state is not reflected.
130
+ */
131
+ export function redactSecrets(value, secrets) {
132
+ const normalized = normalizeSecrets(secrets);
133
+ // Fast path: primitive value or null/undefined.
134
+ if (value === null || value === undefined)
135
+ return value;
136
+ const t = typeof value;
137
+ if (t === "string") {
138
+ return redactCredentialString(value, normalized);
27
139
  }
140
+ if (t !== "object")
141
+ return value;
142
+ // Recurse through arrays.
28
143
  if (Array.isArray(value)) {
29
- return value.map((item) => redactSecrets(item, apiKey));
144
+ return value.map((item) => redactSecrets(item, normalized));
30
145
  }
31
- if (value && typeof value === "object") {
32
- const obj = value;
33
- const output = {};
34
- for (const [key, child] of Object.entries(obj)) {
35
- if (REDACT_KEYS.has(key)) {
36
- output[key] = "[REDACTED]";
37
- continue;
38
- }
39
- output[key] = redactSecrets(child, apiKey);
146
+ // Skip exotic non-plain objects: Date, TypedArrays, Map, Set,
147
+ // class instances. Plain objects descend; everything else is left
148
+ // untouched to avoid reflecting internal state.
149
+ if (!isPlainObject(value)) {
150
+ return value;
151
+ }
152
+ const input = value;
153
+ const output = {};
154
+ for (const key of Object.keys(input)) {
155
+ if (CREDENTIAL_KEYS.has(key.toLowerCase())) {
156
+ output[key] = REDACTED;
157
+ continue;
40
158
  }
41
- return output;
159
+ output[key] = redactSecrets(input[key], normalized);
42
160
  }
43
- return value;
161
+ return output;
162
+ }
163
+ function isPlainObject(value) {
164
+ if (value === null || typeof value !== "object")
165
+ return false;
166
+ const proto = Object.getPrototypeOf(value);
167
+ return proto === Object.prototype || proto === null;
44
168
  }
45
- export function redactTool(tool) {
46
- const apiKey = process.env.Z_AI_API_KEY || process.env.ZAI_API_KEY;
169
+ /**
170
+ * Redact credential-shaped fields from a Tool's metadata tree.
171
+ *
172
+ * Back-compat: when called with a single argument the function reads
173
+ * the configured Provider credentials from the current process
174
+ * environment. When called with an explicit secrets argument, the
175
+ * caller's value is used instead.
176
+ */
177
+ export function redactTool(tool, secrets) {
178
+ const resolved = secrets === undefined
179
+ ? configuredSecrets()
180
+ : normalizeSecrets(secrets);
47
181
  const clone = JSON.parse(JSON.stringify(tool));
48
- return redactSecrets(clone, apiKey);
182
+ return redactSecrets(clone, resolved);
49
183
  }
50
184
  //# sourceMappingURL=redact.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"redact.js","sourceRoot":"","sources":["../../src/lib/redact.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,MAAM,WAAW,GAAG,IAAI,GAAG,CAAC;IAC1B,eAAe;IACf,eAAe;IACf,SAAS;IACT,QAAQ;IACR,cAAc;IACd,OAAO;IACP,cAAc;IACd,aAAa;CACd,CAAC,CAAC;AAEH,SAAS,YAAY,CAAC,KAAa,EAAE,MAAe;IAClD,IAAI,MAAM,GAAG,KAAK,CAAC;IACnB,IAAI,MAAM,IAAI,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;QACtC,MAAM,GAAG,MAAM,CAAC,UAAU,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;IACnD,CAAC;IACD,IAAI,eAAe,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;QACjC,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,cAAc,EAAE,mBAAmB,CAAC,CAAC;IAC/D,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,KAAc,EAAE,MAAe;IAC3D,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9B,OAAO,YAAY,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;IACrC,CAAC;IACD,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,aAAa,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC;IAC1D,CAAC;IACD,IAAI,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QACvC,MAAM,GAAG,GAAG,KAAgC,CAAC;QAC7C,MAAM,MAAM,GAA4B,EAAE,CAAC;QAC3C,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;YAC/C,IAAI,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;gBACzB,MAAM,CAAC,GAAG,CAAC,GAAG,YAAY,CAAC;gBAC3B,SAAS;YACX,CAAC;YACD,MAAM,CAAC,GAAG,CAAC,GAAG,aAAa,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;QAC7C,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,IAAU;IACnC,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,YAAY,IAAI,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC;IACnE,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAS,CAAC;IACvD,OAAO,aAAa,CAAC,KAAK,EAAE,MAAM,CAAS,CAAC;AAC9C,CAAC"}
1
+ {"version":3,"file":"redact.js","sourceRoot":"","sources":["../../src/lib/redact.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,86 @@
1
+ /**
2
+ * Tool-discovery cache — extracted from {@link ZaiMcpClient} (Ticket 02).
3
+ *
4
+ * Owns its filesystem I/O directly against the `tools/` subdirectory
5
+ * under the unified cache root (D1 revised — does NOT reuse
6
+ * `ResponseCache` for storage). Stores {@link redactTool}-scrubbed tools
7
+ * (B2 fix) under a single TTL check (H2 fix).
8
+ *
9
+ * # Enable check (preserves v0.4.0 granularity — D3 deviation)
10
+ *
11
+ * ```text
12
+ * isToolCacheEnabled = isCacheEnabled() && ZAI_MCP_TOOL_CACHE != "0"/"false"
13
+ * ```
14
+ *
15
+ * - `SCOUTLINE_CACHE=0` (or legacy `ZAI_CACHE=0`) disables BOTH caches
16
+ * because `isCacheEnabled()` returns false.
17
+ * - `ZAI_MCP_TOOL_CACHE=0` disables ONLY the tool cache; the response
18
+ * cache stays enabled because `isCacheEnabled()` does NOT consult
19
+ * this var. This preserves the four `mcp-client.test.js` suites that
20
+ * set `ZAI_MCP_TOOL_CACHE=0` per-suite while relying on
21
+ * response-cache hits.
22
+ *
23
+ * # Versioning
24
+ *
25
+ * {@link TOOL_CACHE_VERSION} is stamped into every cache envelope. A
26
+ * mismatch (e.g. an old `tools-*.json` written by a future or past
27
+ * release) yields a clean miss — never a throw — so an upgrade cannot
28
+ * break tool discovery.
29
+ */
30
+ import type { Tool } from "@utcp/sdk";
31
+ /**
32
+ * Cache envelope version. Bumped when the on-disk shape of
33
+ * {@link ToolCachePayload} changes; old envelopes are ignored.
34
+ */
35
+ export declare const TOOL_CACHE_VERSION = 1;
36
+ /**
37
+ * Inputs to the tool-cache key. Captures every dimension that affects
38
+ * WHICH tools the MCP servers return: mode + baseUrl (ZAI vs ZHIPU),
39
+ * the three HTTP endpoints, and whether the stdio vision server is
40
+ * registered. The ZaiMcpClient adapter builds this from {@link loadConfig}
41
+ * + {@link getMcpEndpoints} + its private `resolveEnableVision()`.
42
+ */
43
+ export interface ToolCacheConfig {
44
+ mode: string;
45
+ baseUrl: string;
46
+ endpoints: Record<string, string>;
47
+ enableVision: boolean;
48
+ }
49
+ /**
50
+ * Tool-cache enable check (preserves v0.4.0 granularity — D3
51
+ * deviation). The tool cache is enabled only when BOTH:
52
+ * - the response cache is enabled (`isCacheEnabled()` honours
53
+ * `SCOUTLINE_CACHE` / `ZAI_CACHE`); AND
54
+ * - the tool-specific `ZAI_MCP_TOOL_CACHE` env var is not "0"/"false".
55
+ *
56
+ * Read at call time (H1 fix) so per-suite env mutations in tests remain
57
+ * observable.
58
+ */
59
+ export declare function isToolCacheEnabled(): boolean;
60
+ /**
61
+ * Build the 16-char cache key for a config. Mirrors the v0.4.0 algorithm
62
+ * in the extracted `ZaiMcpClient.getToolCacheKey`: SHA-256 of the
63
+ * JSON-stringified config, first 16 hex chars. Two configs that produce
64
+ * the same JSON yield the same key; distinct configs yield distinct keys.
65
+ */
66
+ export declare function buildToolCacheKey(config: ToolCacheConfig): string;
67
+ /**
68
+ * Build the absolute on-disk path for a config's tool-cache envelope.
69
+ * Always lands under the `tools/` subdirectory (sibling of `cache/`).
70
+ */
71
+ export declare function buildToolCachePath(config: ToolCacheConfig): string;
72
+ /**
73
+ * Read the tool cache for a config. Returns `null` on miss, version
74
+ * mismatch, TTL expiry, corruption (invalid JSON, missing file), or when
75
+ * the tool cache is disabled. NEVER throws — a miss degrades cleanly to
76
+ * discovery.
77
+ */
78
+ export declare function readToolCache(config: ToolCacheConfig): Promise<Tool[] | null>;
79
+ /**
80
+ * Write the tool cache for a config. Applies {@link redactTool} to every
81
+ * tool before serialization (B2 fix) so the on-disk envelope never
82
+ * contains raw Provider credentials. Best-effort: I/O failures are
83
+ * swallowed (cache is disposable).
84
+ */
85
+ export declare function writeToolCache(config: ToolCacheConfig, tools: Tool[]): Promise<void>;
86
+ //# sourceMappingURL=tool-cache.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool-cache.d.ts","sourceRoot":"","sources":["../../src/lib/tool-cache.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AAKH,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAItC;;;GAGG;AACH,eAAO,MAAM,kBAAkB,IAAI,CAAC;AAEpC;;;;;;GAMG;AACH,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAClC,YAAY,EAAE,OAAO,CAAC;CACvB;AAQD;;;;;;;;;GASG;AACH,wBAAgB,kBAAkB,IAAI,OAAO,CAI5C;AAED;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,eAAe,GAAG,MAAM,CAEjE;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,eAAe,GAAG,MAAM,CAElE;AAED;;;;;GAKG;AACH,wBAAsB,aAAa,CAAC,MAAM,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,EAAE,GAAG,IAAI,CAAC,CAenF;AAED;;;;;GAKG;AACH,wBAAsB,cAAc,CAAC,MAAM,EAAE,eAAe,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAe1F"}
@@ -0,0 +1,123 @@
1
+ /**
2
+ * Tool-discovery cache — extracted from {@link ZaiMcpClient} (Ticket 02).
3
+ *
4
+ * Owns its filesystem I/O directly against the `tools/` subdirectory
5
+ * under the unified cache root (D1 revised — does NOT reuse
6
+ * `ResponseCache` for storage). Stores {@link redactTool}-scrubbed tools
7
+ * (B2 fix) under a single TTL check (H2 fix).
8
+ *
9
+ * # Enable check (preserves v0.4.0 granularity — D3 deviation)
10
+ *
11
+ * ```text
12
+ * isToolCacheEnabled = isCacheEnabled() && ZAI_MCP_TOOL_CACHE != "0"/"false"
13
+ * ```
14
+ *
15
+ * - `SCOUTLINE_CACHE=0` (or legacy `ZAI_CACHE=0`) disables BOTH caches
16
+ * because `isCacheEnabled()` returns false.
17
+ * - `ZAI_MCP_TOOL_CACHE=0` disables ONLY the tool cache; the response
18
+ * cache stays enabled because `isCacheEnabled()` does NOT consult
19
+ * this var. This preserves the four `mcp-client.test.js` suites that
20
+ * set `ZAI_MCP_TOOL_CACHE=0` per-suite while relying on
21
+ * response-cache hits.
22
+ *
23
+ * # Versioning
24
+ *
25
+ * {@link TOOL_CACHE_VERSION} is stamped into every cache envelope. A
26
+ * mismatch (e.g. an old `tools-*.json` written by a future or past
27
+ * release) yields a clean miss — never a throw — so an upgrade cannot
28
+ * break tool discovery.
29
+ */
30
+ import crypto from "node:crypto";
31
+ import * as fs from "node:fs/promises";
32
+ import path from "node:path";
33
+ import { toolCacheDir, isCacheEnabled, getCacheTtlMs } from "./cache.js";
34
+ import { redactTool } from "./redact.js";
35
+ /**
36
+ * Cache envelope version. Bumped when the on-disk shape of
37
+ * {@link ToolCachePayload} changes; old envelopes are ignored.
38
+ */
39
+ export const TOOL_CACHE_VERSION = 1;
40
+ /**
41
+ * Tool-cache enable check (preserves v0.4.0 granularity — D3
42
+ * deviation). The tool cache is enabled only when BOTH:
43
+ * - the response cache is enabled (`isCacheEnabled()` honours
44
+ * `SCOUTLINE_CACHE` / `ZAI_CACHE`); AND
45
+ * - the tool-specific `ZAI_MCP_TOOL_CACHE` env var is not "0"/"false".
46
+ *
47
+ * Read at call time (H1 fix) so per-suite env mutations in tests remain
48
+ * observable.
49
+ */
50
+ export function isToolCacheEnabled() {
51
+ if (!isCacheEnabled())
52
+ return false;
53
+ const v = (process.env.ZAI_MCP_TOOL_CACHE ?? "1").toLowerCase();
54
+ return !["0", "false"].includes(v);
55
+ }
56
+ /**
57
+ * Build the 16-char cache key for a config. Mirrors the v0.4.0 algorithm
58
+ * in the extracted `ZaiMcpClient.getToolCacheKey`: SHA-256 of the
59
+ * JSON-stringified config, first 16 hex chars. Two configs that produce
60
+ * the same JSON yield the same key; distinct configs yield distinct keys.
61
+ */
62
+ export function buildToolCacheKey(config) {
63
+ return crypto.createHash("sha256").update(JSON.stringify(config)).digest("hex").slice(0, 16);
64
+ }
65
+ /**
66
+ * Build the absolute on-disk path for a config's tool-cache envelope.
67
+ * Always lands under the `tools/` subdirectory (sibling of `cache/`).
68
+ */
69
+ export function buildToolCachePath(config) {
70
+ return path.join(toolCacheDir(), `tools-${buildToolCacheKey(config)}.json`);
71
+ }
72
+ /**
73
+ * Read the tool cache for a config. Returns `null` on miss, version
74
+ * mismatch, TTL expiry, corruption (invalid JSON, missing file), or when
75
+ * the tool cache is disabled. NEVER throws — a miss degrades cleanly to
76
+ * discovery.
77
+ */
78
+ export async function readToolCache(config) {
79
+ if (!isToolCacheEnabled())
80
+ return null;
81
+ const ttlMs = getCacheTtlMs();
82
+ if (ttlMs <= 0)
83
+ return null;
84
+ try {
85
+ const raw = await fs.readFile(buildToolCachePath(config), "utf8");
86
+ const entry = JSON.parse(raw);
87
+ if (!entry || entry.version !== TOOL_CACHE_VERSION || !Array.isArray(entry.tools)) {
88
+ return null;
89
+ }
90
+ if (Date.now() - (entry.timestamp ?? 0) > ttlMs)
91
+ return null;
92
+ return entry.tools;
93
+ }
94
+ catch {
95
+ return null;
96
+ }
97
+ }
98
+ /**
99
+ * Write the tool cache for a config. Applies {@link redactTool} to every
100
+ * tool before serialization (B2 fix) so the on-disk envelope never
101
+ * contains raw Provider credentials. Best-effort: I/O failures are
102
+ * swallowed (cache is disposable).
103
+ */
104
+ export async function writeToolCache(config, tools) {
105
+ if (!isToolCacheEnabled())
106
+ return;
107
+ if (getCacheTtlMs() <= 0)
108
+ return;
109
+ try {
110
+ const filePath = buildToolCachePath(config);
111
+ await fs.mkdir(path.dirname(filePath), { recursive: true });
112
+ const payload = {
113
+ version: TOOL_CACHE_VERSION,
114
+ timestamp: Date.now(),
115
+ tools: tools.map((tool) => redactTool(tool)),
116
+ };
117
+ await fs.writeFile(filePath, JSON.stringify(payload));
118
+ }
119
+ catch {
120
+ // Best-effort cache only.
121
+ }
122
+ }
123
+ //# sourceMappingURL=tool-cache.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool-cache.js","sourceRoot":"","sources":["../../src/lib/tool-cache.ts"],"names":[],"mappings":"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"}
package/dist/lib/tty.d.ts CHANGED
@@ -36,25 +36,12 @@ interface SearchResultLike {
36
36
  occurrences?: number;
37
37
  }
38
38
  export declare function formatSearchResultsPretty(results: SearchResultLike[]): string;
39
- interface QuotaLike {
40
- plan?: string;
41
- timeWindow?: {
42
- used?: number;
43
- limit?: number;
44
- remaining?: number;
45
- percentage?: number;
46
- windowHours?: number;
47
- resetsIn?: string | null;
48
- byTool?: Array<{
49
- modelCode?: string;
50
- usage?: number;
51
- }>;
52
- } | null;
53
- tokens?: {
54
- percentage?: number;
55
- resetsIn?: string | null;
56
- } | null;
57
- }
58
- export declare function formatQuotaPretty(q: QuotaLike): string;
39
+ import type { QuotaDashboard } from "../capabilities/quota.js";
40
+ /**
41
+ * Provider-neutral TTY rendering of a {@link QuotaDashboard}. Each
42
+ * Provider entry is labelled with its Provider id and each category by
43
+ * its normalized name; progress bars represent the REMAINING percentage.
44
+ */
45
+ export declare function formatQuotaDashboard(dashboard: QuotaDashboard): string;
59
46
  export {};
60
47
  //# sourceMappingURL=tty.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"tty.d.ts","sourceRoot":"","sources":["../../src/lib/tty.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,KAAK,OAAO,GAAG,CAAC,CAAC,EAAE,MAAM,KAAK,MAAM,CAAC;AAUrC,eAAO,MAAM,KAAK;IAChB,IAAI;IACJ,GAAG;IACH,IAAI;IACJ,KAAK;IACL,MAAM;IACN,GAAG;IACH,OAAO;IACP,IAAI;CACL,CAAC;AAEF,wBAAgB,KAAK,IAAI,OAAO,CAE/B;AAED,uFAAuF;AACvF,wBAAgB,cAAc,CAC5B,cAAc,EAAE,MAAM,GAAG,SAAS,EAClC,IAAI,EAAE;IAAE,WAAW,CAAC,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,EAAE,OAAO,CAAA;CAAE,GAClD,KAAK,GAAG,SAAS,CAKnB;AAED,UAAU,gBAAgB;IACxB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,wBAAgB,yBAAyB,CAAC,OAAO,EAAE,gBAAgB,EAAE,GAAG,MAAM,CAe7E;AAED,UAAU,SAAS;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,UAAU,CAAC,EAAE;QACX,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;QACzB,MAAM,CAAC,EAAE,KAAK,CAAC;YAAE,SAAS,CAAC,EAAE,MAAM,CAAC;YAAC,KAAK,CAAC,EAAE,MAAM,CAAA;SAAE,CAAC,CAAC;KACxD,GAAG,IAAI,CAAC;IACT,MAAM,CAAC,EAAE;QAAE,UAAU,CAAC,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,GAAG,IAAI,CAAC;CACnE;AAUD,wBAAgB,iBAAiB,CAAC,CAAC,EAAE,SAAS,GAAG,MAAM,CAqCtD"}
1
+ {"version":3,"file":"tty.d.ts","sourceRoot":"","sources":["../../src/lib/tty.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,KAAK,OAAO,GAAG,CAAC,CAAC,EAAE,MAAM,KAAK,MAAM,CAAC;AAUrC,eAAO,MAAM,KAAK;IAChB,IAAI;IACJ,GAAG;IACH,IAAI;IACJ,KAAK;IACL,MAAM;IACN,GAAG;IACH,OAAO;IACP,IAAI;CACL,CAAC;AAEF,wBAAgB,KAAK,IAAI,OAAO,CAE/B;AAED,uFAAuF;AACvF,wBAAgB,cAAc,CAC5B,cAAc,EAAE,MAAM,GAAG,SAAS,EAClC,IAAI,EAAE;IAAE,WAAW,CAAC,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,EAAE,OAAO,CAAA;CAAE,GAClD,KAAK,GAAG,SAAS,CAKnB;AAED,UAAU,gBAAgB;IACxB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,wBAAgB,yBAAyB,CAAC,OAAO,EAAE,gBAAgB,EAAE,GAAG,MAAM,CAe7E;AAED,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAsE/D;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,SAAS,EAAE,cAAc,GAAG,MAAM,CAkBtE"}
package/dist/lib/tty.js CHANGED
@@ -60,42 +60,63 @@ export function formatSearchResultsPretty(results) {
60
60
  }
61
61
  return lines.join("\n");
62
62
  }
63
- /** ASCII progress bar: 20 chars wide. */
64
- function progressBar(pct) {
63
+ /**
64
+ * Remaining-percentage progress bar: 20 chars wide. Low remaining is
65
+ * red (tight quota), high remaining is green. The bar represents the
66
+ * REMAINING share, not the used share.
67
+ */
68
+ function remainingBar(pct) {
65
69
  const filled = Math.round((pct / 100) * 20);
66
70
  const bar = "█".repeat(filled) + "░".repeat(20 - filled);
67
- const colorFn = pct >= 90 ? color.red : pct >= 70 ? color.yellow : color.green;
71
+ const colorFn = pct < 30 ? color.red : pct < 70 ? color.yellow : color.green;
68
72
  return colorFn(bar);
69
73
  }
70
- export function formatQuotaPretty(q) {
71
- const lines = [];
72
- lines.push("");
73
- lines.push(` ${color.bold("Z.AI Coding Plan")} — ${color.magenta(q.plan || "unknown")} tier`);
74
- lines.push("");
75
- if (q.timeWindow) {
76
- const tw = q.timeWindow;
77
- const pct = tw.percentage ?? 0;
78
- const resetTxt = tw.resetsIn ? `resets in ${color.dim(tw.resetsIn)}` : "";
79
- lines.push(` ${color.bold(`Time window`)} ${color.gray(`(${tw.windowHours || 5}h rolling)`)} ${resetTxt}`);
80
- lines.push("");
81
- lines.push(` ${progressBar(pct)} ${tw.used ?? 0}/${tw.limit ?? 0} calls (${pct}%)`);
82
- if (tw.remaining !== undefined) {
83
- lines.push(` ${color.green(`${tw.remaining} remaining`)}`);
84
- }
85
- if (tw.byTool && tw.byTool.length > 0) {
86
- lines.push("");
87
- const sorted = [...tw.byTool].sort((a, b) => (b.usage || 0) - (a.usage || 0));
88
- for (const t of sorted) {
89
- lines.push(` ${color.gray("•")} ${t.modelCode}: ${t.usage || 0}`);
74
+ function formatResetLabel(resetsAt) {
75
+ if (!resetsAt)
76
+ return "";
77
+ return `resets ${color.gray(resetsAt)}`;
78
+ }
79
+ function renderCategory(category, lines) {
80
+ const current = category.current;
81
+ const pct = current.remainingPercent;
82
+ const resetTxt = formatResetLabel(current.resetsAt);
83
+ lines.push(` ${color.bold(category.name)} ${remainingBar(pct)} ${pct}% remaining`);
84
+ const counts = [];
85
+ if (typeof current.used === "number" && typeof current.limit === "number") {
86
+ counts.push(`${current.used}/${current.limit}`);
87
+ }
88
+ if (typeof current.remaining === "number") {
89
+ counts.push(`${color.green(`${current.remaining} left`)}`);
90
+ }
91
+ if (counts.length > 0 || resetTxt) {
92
+ lines.push(` ${[...counts, resetTxt].filter(Boolean).join(" · ")}`);
93
+ }
94
+ if (category.weekly) {
95
+ const w = category.weekly;
96
+ lines.push(` ${color.gray("weekly")} ${remainingBar(w.remainingPercent)} ${w.remainingPercent}%`);
97
+ }
98
+ }
99
+ /**
100
+ * Provider-neutral TTY rendering of a {@link QuotaDashboard}. Each
101
+ * Provider entry is labelled with its Provider id and each category by
102
+ * its normalized name; progress bars represent the REMAINING percentage.
103
+ */
104
+ export function formatQuotaDashboard(dashboard) {
105
+ const lines = [""];
106
+ for (const entry of dashboard.providers) {
107
+ if (entry.status === "ok") {
108
+ const success = entry;
109
+ const planTxt = success.plan ? ` ${color.gray(`(${success.plan})`)}` : "";
110
+ lines.push(` ${color.bold(success.provider)}${planTxt}`);
111
+ for (const category of success.categories) {
112
+ renderCategory(category, lines);
90
113
  }
91
114
  }
92
- lines.push("");
93
- }
94
- if (q.tokens) {
95
- const pct = q.tokens.percentage ?? 0;
96
- const resetTxt = q.tokens.resetsIn ? `resets in ${color.dim(q.tokens.resetsIn)}` : "";
97
- lines.push(` ${color.bold("Token budget")} ${resetTxt}`);
98
- lines.push(` ${progressBar(pct)} ${pct}% used`);
115
+ else {
116
+ const failure = entry;
117
+ lines.push(` ${color.bold(failure.provider)} ${color.red("error")}`);
118
+ lines.push(` ${color.dim(failure.error.message)}`);
119
+ }
99
120
  lines.push("");
100
121
  }
101
122
  return lines.join("\n");
@@ -1 +1 @@
1
- {"version":3,"file":"tty.js","sourceRoot":"","sources":["../../src/lib/tty.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"tty.js","sourceRoot":"","sources":["../../src/lib/tty.ts"],"names":[],"mappings":"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"}