zcode-acp-server 0.1.0 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +98 -1
- package/README.zh-CN.md +81 -1
- package/dist/backend/client.d.ts +12 -4
- package/dist/backend/client.d.ts.map +1 -1
- package/dist/backend/client.js +72 -7
- package/dist/backend/client.js.map +1 -1
- package/dist/backend/credentials.d.ts.map +1 -1
- package/dist/backend/credentials.js +2 -1
- package/dist/backend/credentials.js.map +1 -1
- package/dist/backend/listener.d.ts +12 -4
- package/dist/backend/listener.d.ts.map +1 -1
- package/dist/backend/listener.js +68 -12
- package/dist/backend/listener.js.map +1 -1
- package/dist/backend/types.d.ts +1 -1
- package/dist/backend/types.d.ts.map +1 -1
- package/dist/bin/quota.d.ts +54 -0
- package/dist/bin/quota.d.ts.map +1 -0
- package/dist/bin/quota.js +333 -0
- package/dist/bin/quota.js.map +1 -0
- package/dist/config/auto-compact.d.ts +23 -0
- package/dist/config/auto-compact.d.ts.map +1 -0
- package/dist/config/auto-compact.js +67 -0
- package/dist/config/auto-compact.js.map +1 -0
- package/dist/config/mcp-discovery.d.ts +34 -0
- package/dist/config/mcp-discovery.d.ts.map +1 -0
- package/dist/config/mcp-discovery.js +153 -0
- package/dist/config/mcp-discovery.js.map +1 -0
- package/dist/config/model-cache.d.ts +12 -1
- package/dist/config/model-cache.d.ts.map +1 -1
- package/dist/config/model-cache.js +30 -8
- package/dist/config/model-cache.js.map +1 -1
- package/dist/config/options.d.ts +87 -9
- package/dist/config/options.d.ts.map +1 -1
- package/dist/config/options.js +248 -45
- package/dist/config/options.js.map +1 -1
- package/dist/config/plugin-commands.d.ts +24 -0
- package/dist/config/plugin-commands.d.ts.map +1 -0
- package/dist/config/plugin-commands.js +107 -0
- package/dist/config/plugin-commands.js.map +1 -0
- package/dist/config/provider-registry.d.ts +60 -0
- package/dist/config/provider-registry.d.ts.map +1 -0
- package/dist/config/provider-registry.js +128 -0
- package/dist/config/provider-registry.js.map +1 -0
- package/dist/config/runtime-model.d.ts +54 -18
- package/dist/config/runtime-model.d.ts.map +1 -1
- package/dist/config/runtime-model.js +105 -61
- package/dist/config/runtime-model.js.map +1 -1
- package/dist/config/skill-discovery.d.ts +35 -0
- package/dist/config/skill-discovery.d.ts.map +1 -0
- package/dist/config/skill-discovery.js +188 -0
- package/dist/config/skill-discovery.js.map +1 -0
- package/dist/handlers/background-tasks.d.ts +72 -0
- package/dist/handlers/background-tasks.d.ts.map +1 -0
- package/dist/handlers/background-tasks.js +330 -0
- package/dist/handlers/background-tasks.js.map +1 -0
- package/dist/handlers/dispatch.d.ts.map +1 -1
- package/dist/handlers/dispatch.js +134 -22
- package/dist/handlers/dispatch.js.map +1 -1
- package/dist/handlers/extensions.d.ts +15 -0
- package/dist/handlers/extensions.d.ts.map +1 -1
- package/dist/handlers/extensions.js +43 -27
- package/dist/handlers/extensions.js.map +1 -1
- package/dist/handlers/io.d.ts +11 -2
- package/dist/handlers/io.d.ts.map +1 -1
- package/dist/handlers/io.js +51 -7
- package/dist/handlers/io.js.map +1 -1
- package/dist/handlers/server-requests.d.ts +20 -4
- package/dist/handlers/server-requests.d.ts.map +1 -1
- package/dist/handlers/server-requests.js +293 -63
- package/dist/handlers/server-requests.js.map +1 -1
- package/dist/handlers/session.d.ts +113 -10
- package/dist/handlers/session.d.ts.map +1 -1
- package/dist/handlers/session.js +876 -220
- package/dist/handlers/session.js.map +1 -1
- package/dist/handlers/slash.d.ts +14 -0
- package/dist/handlers/slash.d.ts.map +1 -1
- package/dist/handlers/slash.js +80 -6
- package/dist/handlers/slash.js.map +1 -1
- package/dist/index.js +38 -4
- package/dist/index.js.map +1 -1
- package/dist/interaction/adapter.d.ts +19 -33
- package/dist/interaction/adapter.d.ts.map +1 -1
- package/dist/interaction/adapter.js +80 -79
- package/dist/interaction/adapter.js.map +1 -1
- package/dist/lazy-sessions.d.ts +35 -0
- package/dist/lazy-sessions.d.ts.map +1 -0
- package/dist/lazy-sessions.js +98 -0
- package/dist/lazy-sessions.js.map +1 -0
- package/dist/quota/cache.d.ts +18 -0
- package/dist/quota/cache.d.ts.map +1 -0
- package/dist/quota/cache.js +32 -0
- package/dist/quota/cache.js.map +1 -0
- package/dist/quota/client.d.ts +30 -0
- package/dist/quota/client.d.ts.map +1 -0
- package/dist/quota/client.js +57 -0
- package/dist/quota/client.js.map +1 -0
- package/dist/quota/color.d.ts +58 -0
- package/dist/quota/color.d.ts.map +1 -0
- package/dist/quota/color.js +95 -0
- package/dist/quota/color.js.map +1 -0
- package/dist/quota/combined.d.ts +66 -0
- package/dist/quota/combined.d.ts.map +1 -0
- package/dist/quota/combined.js +179 -0
- package/dist/quota/combined.js.map +1 -0
- package/dist/quota/format.d.ts +105 -0
- package/dist/quota/format.d.ts.map +1 -0
- package/dist/quota/format.js +219 -0
- package/dist/quota/format.js.map +1 -0
- package/dist/quota/index.d.ts +23 -0
- package/dist/quota/index.d.ts.map +1 -0
- package/dist/quota/index.js +42 -0
- package/dist/quota/index.js.map +1 -0
- package/dist/quota/opencode-go/cache.d.ts +17 -0
- package/dist/quota/opencode-go/cache.d.ts.map +1 -0
- package/dist/quota/opencode-go/cache.js +31 -0
- package/dist/quota/opencode-go/cache.js.map +1 -0
- package/dist/quota/opencode-go/client.d.ts +28 -0
- package/dist/quota/opencode-go/client.d.ts.map +1 -0
- package/dist/quota/opencode-go/client.js +48 -0
- package/dist/quota/opencode-go/client.js.map +1 -0
- package/dist/quota/opencode-go/config.d.ts +37 -0
- package/dist/quota/opencode-go/config.d.ts.map +1 -0
- package/dist/quota/opencode-go/config.js +58 -0
- package/dist/quota/opencode-go/config.js.map +1 -0
- package/dist/quota/opencode-go/format.d.ts +36 -0
- package/dist/quota/opencode-go/format.d.ts.map +1 -0
- package/dist/quota/opencode-go/format.js +87 -0
- package/dist/quota/opencode-go/format.js.map +1 -0
- package/dist/quota/opencode-go/index.d.ts +30 -0
- package/dist/quota/opencode-go/index.d.ts.map +1 -0
- package/dist/quota/opencode-go/index.js +108 -0
- package/dist/quota/opencode-go/index.js.map +1 -0
- package/dist/quota/opencode-go/parse.d.ts +41 -0
- package/dist/quota/opencode-go/parse.d.ts.map +1 -0
- package/dist/quota/opencode-go/parse.js +75 -0
- package/dist/quota/opencode-go/parse.js.map +1 -0
- package/dist/quota/opencode-go/types.d.ts +48 -0
- package/dist/quota/opencode-go/types.d.ts.map +1 -0
- package/dist/quota/opencode-go/types.js +11 -0
- package/dist/quota/opencode-go/types.js.map +1 -0
- package/dist/quota/parse.d.ts +33 -0
- package/dist/quota/parse.d.ts.map +1 -0
- package/dist/quota/parse.js +200 -0
- package/dist/quota/parse.js.map +1 -0
- package/dist/quota/types.d.ts +72 -0
- package/dist/quota/types.d.ts.map +1 -0
- package/dist/quota/types.js +10 -0
- package/dist/quota/types.js.map +1 -0
- package/dist/server.d.ts +104 -0
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +119 -2
- package/dist/server.js.map +1 -1
- package/dist/tasks-index.d.ts +14 -4
- package/dist/tasks-index.d.ts.map +1 -1
- package/dist/tasks-index.js +145 -46
- package/dist/tasks-index.js.map +1 -1
- package/dist/translators/event-translator.d.ts +33 -0
- package/dist/translators/event-translator.d.ts.map +1 -1
- package/dist/translators/event-translator.js +101 -0
- package/dist/translators/event-translator.js.map +1 -1
- package/dist/translators/index.d.ts +1 -1
- package/dist/translators/index.d.ts.map +1 -1
- package/dist/translators/index.js +1 -1
- package/dist/translators/index.js.map +1 -1
- package/dist/translators/projection-differ.d.ts +8 -0
- package/dist/translators/projection-differ.d.ts.map +1 -1
- package/dist/translators/projection-differ.js +19 -9
- package/dist/translators/projection-differ.js.map +1 -1
- package/dist/translators/tool-helpers.d.ts +28 -0
- package/dist/translators/tool-helpers.d.ts.map +1 -1
- package/dist/translators/tool-helpers.js +104 -0
- package/dist/translators/tool-helpers.js.map +1 -1
- package/dist/translators/types.d.ts +38 -1
- package/dist/translators/types.d.ts.map +1 -1
- package/dist/translators/types.js.map +1 -1
- package/dist/utils.d.ts +35 -6
- package/dist/utils.d.ts.map +1 -1
- package/dist/utils.js +52 -4
- package/dist/utils.js.map +1 -1
- package/docs/ARCHITECTURE.md +96 -38
- package/docs/BACKLOG.md +57 -0
- package/docs/DEVELOPMENT.md +5 -0
- package/docs/PROTOCOL.md +270 -5
- package/docs/TROUBLESHOOTING.md +98 -14
- package/docs/agents/domain.md +51 -0
- package/docs/agents/issue-tracker.md +22 -0
- package/docs/agents/triage-labels.md +15 -0
- package/package.json +6 -5
|
@@ -207,23 +207,33 @@ export function parseAskUserResponse(acpResp) {
|
|
|
207
207
|
return optionId;
|
|
208
208
|
}
|
|
209
209
|
// ---------- elicitation form (preferred when client supports it) ----------
|
|
210
|
+
/**
|
|
211
|
+
* Sentinel `const` value marking a single-select question as skipped in the
|
|
212
|
+
* elicitation form. Paired with a human-readable `title` ("Skip this question")
|
|
213
|
+
* via `oneOf`, so the client renders the label — never the raw sentinel.
|
|
214
|
+
*/
|
|
215
|
+
const ELICIT_SKIP = "__skip__";
|
|
210
216
|
/**
|
|
211
217
|
* Build an elicitation form schema for an AskUserQuestion request.
|
|
212
218
|
*
|
|
213
|
-
*
|
|
214
|
-
*
|
|
215
|
-
*
|
|
219
|
+
* ACP/MCP elicitation string fields are EITHER an enum (restricted dropdown) OR
|
|
220
|
+
* free text — the spec ("enum strictly restricts the allowed string values")
|
|
221
|
+
* forbids "dropdown whose last row accepts custom input". To give the user both
|
|
222
|
+
* a pick list AND custom entry, each question is rendered as TWO fields:
|
|
216
223
|
*
|
|
217
|
-
*
|
|
218
|
-
*
|
|
219
|
-
*
|
|
220
|
-
*
|
|
221
|
-
*
|
|
224
|
+
* - `q_<i>`: enum dropdown of the model's suggested answers + a trailing
|
|
225
|
+
* "Skip this question" option. Uses `oneOf`/`anyOf` with `{const, title}`
|
|
226
|
+
* so the skip sentinel has a readable label instead of the raw `__skip__`.
|
|
227
|
+
* - `q_<i>_other`: free-text string. If non-empty it OVERRIDES the dropdown
|
|
228
|
+
* (single-select) or is APPENDED to the picked values (multi-select).
|
|
229
|
+
*
|
|
230
|
+
* A non-required free-text field plus a Skip enum option lets the user opt out
|
|
231
|
+
* of a single question without cancelling the whole form. Required is left
|
|
232
|
+
* empty so neither field forces an answer.
|
|
222
233
|
*/
|
|
223
234
|
export function buildAskUserElicitationForm(params, acpSid, toolCallId) {
|
|
224
235
|
const questions = params.questions?.length ? params.questions : (params.input?.questions ?? []);
|
|
225
236
|
const properties = {};
|
|
226
|
-
const required = [];
|
|
227
237
|
for (let i = 0; i < questions.length; i++) {
|
|
228
238
|
const q = questions[i];
|
|
229
239
|
if (!q || typeof q.question !== "string")
|
|
@@ -234,47 +244,64 @@ export function buildAskUserElicitationForm(params, acpSid, toolCallId) {
|
|
|
234
244
|
.filter((l) => l.length > 0);
|
|
235
245
|
if (labels.length === 0)
|
|
236
246
|
continue;
|
|
247
|
+
// Titled enum option for "skip": const carries the sentinel value the
|
|
248
|
+
// parser recognizes; title is what the client renders in the dropdown.
|
|
249
|
+
const skipOption = { const: ELICIT_SKIP, title: "Skip this question" };
|
|
237
250
|
if (q.multiSelect) {
|
|
238
251
|
properties[key] = {
|
|
239
252
|
type: "array",
|
|
240
|
-
items: { type: "string", enum: labels },
|
|
241
253
|
title: q.question,
|
|
242
|
-
|
|
254
|
+
items: { anyOf: labels.map((l) => ({ const: l, title: l })) },
|
|
243
255
|
};
|
|
244
256
|
}
|
|
245
257
|
else {
|
|
246
|
-
// Append a Skip option so the user can opt out of this question without
|
|
247
|
-
// cancelling the whole form (parity with the request_permission path).
|
|
248
258
|
properties[key] = {
|
|
249
259
|
type: "string",
|
|
250
|
-
enum: [...labels, ELICIT_SKIP],
|
|
251
260
|
title: q.question,
|
|
252
|
-
|
|
261
|
+
oneOf: [...labels.map((l) => ({ const: l, title: l })), skipOption],
|
|
253
262
|
};
|
|
254
|
-
required.push(key);
|
|
255
263
|
}
|
|
264
|
+
// Companion free-text field. Zed renders a string field's title
|
|
265
|
+
// prominently, and falls back to the description when title is absent — so
|
|
266
|
+
// a bright label here is unavoidable. Prefix with "↳" + padding so it reads
|
|
267
|
+
// as a continuation of the question above, and make the title self-contained
|
|
268
|
+
// (no description needed).
|
|
269
|
+
properties[`${key}_other`] = {
|
|
270
|
+
type: "string",
|
|
271
|
+
title: q.multiSelect
|
|
272
|
+
? "↳ or add a custom value (combined with the selection)"
|
|
273
|
+
: "↳ or type a custom value (overrides the selection)",
|
|
274
|
+
};
|
|
256
275
|
}
|
|
276
|
+
// The question text already appears as each field's `title` (its label), so
|
|
277
|
+
// the form `message` must NOT repeat it — otherwise Zed shows the question
|
|
278
|
+
// twice (top banner + field label). Use a neutral prompt instead. For a
|
|
279
|
+
// single question this reads naturally above its labeled field; for several,
|
|
280
|
+
// it tells the user how many fields follow.
|
|
257
281
|
const message = questions.length === 1
|
|
258
|
-
?
|
|
282
|
+
? "Please answer the question."
|
|
259
283
|
: `Please answer ${questions.length} questions.`;
|
|
260
284
|
const form = {
|
|
261
285
|
mode: "form",
|
|
262
286
|
sessionId: acpSid,
|
|
263
287
|
message,
|
|
264
|
-
|
|
288
|
+
// No required fields: the user can skip any question (via Skip option or
|
|
289
|
+
// blank free-text) without being blocked by validation.
|
|
290
|
+
requestedSchema: { type: "object", properties, required: [] },
|
|
265
291
|
};
|
|
266
292
|
if (toolCallId)
|
|
267
293
|
form.toolCallId = toolCallId;
|
|
268
294
|
return form;
|
|
269
295
|
}
|
|
270
|
-
/** Sentinel enum value marking a single-select question as skipped in the form. */
|
|
271
|
-
const ELICIT_SKIP = "__skip__";
|
|
272
296
|
/**
|
|
273
297
|
* Parse an elicitation form response into the zcode answers map.
|
|
274
298
|
*
|
|
275
|
-
*
|
|
276
|
-
*
|
|
277
|
-
*
|
|
299
|
+
* For each question the free-text companion (`q_<i>_other`) takes precedence:
|
|
300
|
+
* - Single-select: non-empty free-text OVERRIDES the dropdown. Otherwise the
|
|
301
|
+
* dropdown value is used, unless it's the skip sentinel or absent (omitted).
|
|
302
|
+
* - Multi-select: free-text is APPENDED to the picked values (de-duped, order
|
|
303
|
+
* preserved). The skip sentinel never appears in multi-select.
|
|
304
|
+
* Returns null if the user declined/cancelled.
|
|
278
305
|
*/
|
|
279
306
|
export function parseAskUserElicitationResponse(acpResp, params) {
|
|
280
307
|
if (!acpResp || typeof acpResp !== "object")
|
|
@@ -289,65 +316,39 @@ export function parseAskUserElicitationResponse(acpResp, params) {
|
|
|
289
316
|
if (!q || typeof q.question !== "string")
|
|
290
317
|
continue;
|
|
291
318
|
const key = `q_${i}`;
|
|
292
|
-
const
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
319
|
+
const otherKey = `${key}_other`;
|
|
320
|
+
const picked = resp.content[key];
|
|
321
|
+
const otherRaw = resp.content[otherKey];
|
|
322
|
+
const other = typeof otherRaw === "string" ? otherRaw.trim() : "";
|
|
323
|
+
if (q.multiSelect) {
|
|
324
|
+
const arr = Array.isArray(picked)
|
|
325
|
+
? picked.filter((v) => typeof v === "string" && v.length > 0)
|
|
326
|
+
: [];
|
|
327
|
+
// Merge selected values + custom free-text, preserving order and dropping dups.
|
|
328
|
+
const merged = [];
|
|
329
|
+
for (const v of [...arr, ...(other ? [other] : [])]) {
|
|
330
|
+
if (!merged.includes(v))
|
|
331
|
+
merged.push(v);
|
|
332
|
+
}
|
|
333
|
+
if (merged.length > 0)
|
|
334
|
+
answers[q.question] = merged.join(", ");
|
|
297
335
|
}
|
|
298
|
-
else
|
|
299
|
-
//
|
|
300
|
-
//
|
|
301
|
-
|
|
302
|
-
|
|
336
|
+
else {
|
|
337
|
+
// Free-text override wins when present; else use the dropdown value
|
|
338
|
+
// (skip sentinel / absent → question left unanswered).
|
|
339
|
+
if (other) {
|
|
340
|
+
answers[q.question] = other;
|
|
341
|
+
}
|
|
342
|
+
else if (typeof picked === "string" && picked.length > 0 && picked !== ELICIT_SKIP) {
|
|
343
|
+
answers[q.question] = picked;
|
|
344
|
+
}
|
|
303
345
|
}
|
|
304
346
|
}
|
|
305
347
|
return answers;
|
|
306
348
|
}
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
*/
|
|
313
|
-
export function buildExitPlanModeElicitationForm(params, acpSid, toolCallId) {
|
|
314
|
-
const planText = params.input && typeof params.input === "object"
|
|
315
|
-
? (params.input.plan ?? "")
|
|
316
|
-
: "";
|
|
317
|
-
const message = planText ? `Ready to code?\n\n${planText}` : "Ready to code?";
|
|
318
|
-
const form = {
|
|
319
|
-
mode: "form",
|
|
320
|
-
sessionId: acpSid,
|
|
321
|
-
message,
|
|
322
|
-
requestedSchema: {
|
|
323
|
-
type: "object",
|
|
324
|
-
properties: {
|
|
325
|
-
decision: {
|
|
326
|
-
type: "string",
|
|
327
|
-
enum: ["approve", "reject"],
|
|
328
|
-
title: "Decision",
|
|
329
|
-
description: "Approve to exit plan mode and start coding, or reject to keep planning.",
|
|
330
|
-
},
|
|
331
|
-
},
|
|
332
|
-
required: ["decision"],
|
|
333
|
-
},
|
|
334
|
-
};
|
|
335
|
-
if (toolCallId)
|
|
336
|
-
form.toolCallId = toolCallId;
|
|
337
|
-
return form;
|
|
338
|
-
}
|
|
339
|
-
/** Parse an ExitPlanMode elicitation response → zcode accept/decline. */
|
|
340
|
-
export function parseExitPlanModeElicitationResponse(acpResp) {
|
|
341
|
-
if (!acpResp || typeof acpResp !== "object") {
|
|
342
|
-
return { action: "decline", reason: "invalid client response" };
|
|
343
|
-
}
|
|
344
|
-
const resp = acpResp;
|
|
345
|
-
if (resp.action !== "accept" || !resp.content) {
|
|
346
|
-
return { action: "decline", reason: "cancelled" };
|
|
347
|
-
}
|
|
348
|
-
if (resp.content.decision === "approve") {
|
|
349
|
-
return { action: "accept", content: { answer_0: "approve" } };
|
|
350
|
-
}
|
|
351
|
-
return { action: "decline", reason: "rejected" };
|
|
352
|
-
}
|
|
349
|
+
// ExitPlanMode is handled via session/request_permission (see
|
|
350
|
+
// `exitPlanModeToAcpPermission` / `acpPermissionResponseToExitPlanMode` above) —
|
|
351
|
+
// not via elicitation/create. Plan approval is a permission decision, and
|
|
352
|
+
// routing it through elicitation surfaces a generic "input request" shell that
|
|
353
|
+
// reads wrong for this flow. AskUserQuestion is the elicitation use case.
|
|
353
354
|
//# sourceMappingURL=adapter.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"adapter.js","sourceRoot":"","sources":["../../src/interaction/adapter.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAUH,uCAAuC;AAEvC,MAAM,UAAU,mBAAmB,CAAC,MAAc;IAChD,OAAO,MAAM,KAAK,+BAA+B,CAAC;AACpD,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,MAAc;IAC/C,OAAO,MAAM,KAAK,8BAA8B,CAAC;AACnD,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,MAAe;IAC5C,IAAI,CAAC,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IACxD,MAAM,MAAM,GAAI,MAA+B,CAAC,MAAM,CAAC;IACvD,IAAI,CAAC,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IACxD,OAAQ,MAAmC,CAAC,WAAW,KAAK,eAAe,CAAC;AAC9E,CAAC;AAED,2EAA2E;AAC3E,MAAM,UAAU,iBAAiB,CAAC,MAAc,EAAE,MAAe;IAC/D,OAAO,kBAAkB,CAAC,MAAM,CAAC,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC;AAC/D,CAAC;AAED,iEAAiE;AAEjE;;;;;;;;;;;GAWG;AACH,SAAS,aAAa,CAAC,IAAwB;IAC7C,QAAQ,IAAI,EAAE,CAAC;QACb,KAAK,YAAY,CAAC;QAClB,KAAK,cAAc,CAAC;QACpB,KAAK,aAAa,CAAC;QACnB,KAAK,eAAe;YAClB,OAAO,IAAI,CAAC;QACd,KAAK,OAAO,CAAC;QACb,KAAK,eAAe;YAClB,OAAO,cAAc,CAAC;QACxB,KAAK,QAAQ,CAAC;QACd,KAAK,MAAM;YACT,OAAO,aAAa,CAAC;QACvB;YACE,OAAO,aAAa,CAAC;IACzB,CAAC;AACH,CAAC;AAED,iFAAiF;AACjF,MAAM,UAAU,oBAAoB,CAClC,MAAwC,EACxC,MAAc;IAMd,MAAM,OAAO,GAAuB,EAAE,CAAC;IACvC,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,OAAO,IAAI,EAAE,EAAE,CAAC;QACvC,OAAO,CAAC,IAAI,CAAC;YACX,QAAQ,EAAE,GAAG,CAAC,QAAQ,IAAI,EAAE;YAC5B,IAAI,EAAE,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC;YAC7B,IAAI,EAAE,GAAG,CAAC,IAAI,IAAI,GAAG,CAAC,QAAQ,IAAI,EAAE;SACrC,CAAC,CAAC;IACL,CAAC;IACD,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IACtC,OAAO;QACL,OAAO;QACP,SAAS,EAAE,MAAM;QACjB,QAAQ,EAAE,EAAE,UAAU,EAAE,MAAM,CAAC,UAAU,IAAI,EAAE,EAAE,QAAQ,EAAE,MAAM,CAAC,KAAK,EAAE;KAC1E,CAAC;AACJ,CAAC;AAED;;;;;kEAKkE;AAClE,MAAM,gBAAgB,GAAG,IAAI,GAAG,CAAC,CAAC,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE,eAAe,CAAC,CAAC,CAAC;AAE3F,6EAA6E;AAC7E,MAAM,UAAU,4BAA4B,CAC1C,OAAgB;IAEhB,IAAI,CAAC,OAAO,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE,CAAC;QAC5C,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,yBAAyB,EAAE,CAAC;IACjE,CAAC;IACD,MAAM,OAAO,GAAI,OAAiE,CAAC,OAAO,IAAI,EAAE,CAAC;IACjG,IAAI,OAAO,CAAC,OAAO,KAAK,WAAW;QAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,mBAAmB,EAAE,CAAC;IAC9F,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,IAAI,EAAE,CAAC;IACxC,IAAI,gBAAgB,CAAC,GAAG,CAAC,QAAQ,CAAC;QAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC;IACjE,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,aAAa,QAAQ,GAAG,EAAE,CAAC;AAChE,CAAC;AAED,6DAA6D;AAE7D,kEAAkE;AAClE,MAAM,UAAU,2BAA2B,CACzC,MAAuC,EACvC,MAAc;IAMd,OAAO;QACL,OAAO,EAAE;YACP,EAAE,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,0BAA0B,EAAE,QAAQ,EAAE,SAAS,EAAE;YAC7E,EAAE,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE,wBAAwB,EAAE,QAAQ,EAAE,QAAQ,EAAE;SAC5E;QACD,SAAS,EAAE,MAAM;QACjB,QAAQ,EAAE,EAAE,UAAU,EAAE,MAAM,CAAC,UAAU,IAAI,EAAE,EAAE,QAAQ,EAAE,MAAM,CAAC,KAAK,EAAE;KAC1E,CAAC;AACJ,CAAC;AAED,6DAA6D;AAC7D,MAAM,UAAU,mCAAmC,CACjD,OAAgB;IAEhB,IAAI,CAAC,OAAO,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE,CAAC;QAC5C,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,yBAAyB,EAAE,CAAC;IAClE,CAAC;IACD,MAAM,OAAO,GAAI,OAAiE,CAAC,OAAO,IAAI,EAAE,CAAC;IACjG,IAAI,OAAO,CAAC,OAAO,KAAK,WAAW;QAAE,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC;IACvF,IAAI,OAAO,CAAC,QAAQ,KAAK,SAAS,EAAE,CAAC;QACnC,0EAA0E;QAC1E,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,EAAE,QAAQ,EAAE,SAAS,EAAE,EAAE,CAAC;IAChE,CAAC;IACD,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC;AACnD,CAAC;AAUD;;;;;;;;GAQG;AACH,MAAM,UAAU,qBAAqB,CACnC,MAAuC;IAEvC,6FAA6F;IAC7F,IAAI,SAAS,GAAG,MAAM,CAAC,SAAS,CAAC;IACjC,IAAI,CAAC,SAAS,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzC,SAAS,GAAG,MAAM,CAAC,KAAK,EAAE,SAAS,IAAI,EAAE,CAAC;IAC5C,CAAC;IACD,MAAM,KAAK,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,OAAO,CAAC,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC;IAC3E,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IAEpC,MAAM,MAAM,GAAsB,EAAE,CAAC;IACrC,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;QACtB,MAAM,MAAM,GAAa,EAAE,CAAC;QAC5B,KAAK,MAAM,GAAG,IAAI,CAAC,CAAC,OAAO,IAAI,EAAE,EAAE,CAAC;YAClC,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,IAAI,GAAG,CAAC,KAAK,IAAI,EAAE,CAAC;YAC3C,IAAI,KAAK;gBAAE,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAChC,CAAC;QACD,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;YAAE,SAAS;QAElC,MAAM,KAAK,GAAG,CAAC,CAAC,WAAW,KAAK,IAAI,CAAC;QACrC,IAAI,KAAK,EAAE,CAAC;YACV,MAAM,OAAO,GAAuB,EAAE,CAAC;YACvC,KAAK,MAAM,EAAE,IAAI,MAAM,EAAE,CAAC;gBACxB,OAAO,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,YAAY,EAAE,EAAE,EAAE,CAAC,CAAC;gBACpF,OAAO,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,GAAG,EAAE,KAAK,EAAE,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE,SAAS,EAAE,EAAE,EAAE,CAAC,CAAC;YACnF,CAAC;YACD,MAAM,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,QAAQ,EAAE,WAAW,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC;QACpE,CAAC;aAAM,CAAC;YACN,MAAM,OAAO,GAAuB,MAAM,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;gBACtD,QAAQ,EAAE,EAAE;gBACZ,IAAI,EAAE,YAAY;gBAClB,IAAI,EAAE,EAAE;aACT,CAAC,CAAC,CAAC;YACJ,OAAO,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,UAAU,EAAE,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;YAC1E,MAAM,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,QAAQ,EAAE,WAAW,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC;QACrE,CAAC;IACH,CAAC;IACD,OAAO,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC;AAC3C,CAAC;AAED,2EAA2E;AAC3E,MAAM,UAAU,qBAAqB,CACnC,MAAuC,EACvC,MAAc,EACd,OAA2B;IAM3B,OAAO;QACL,OAAO;QACP,SAAS,EAAE,MAAM;QACjB,QAAQ,EAAE,EAAE,UAAU,EAAE,MAAM,CAAC,UAAU,IAAI,EAAE,EAAE,QAAQ,EAAE,MAAM,CAAC,KAAK,EAAE;KAC1E,CAAC;AACJ,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,oBAAoB,CAAC,OAAgB;IACnD,IAAI,CAAC,OAAO,IAAI,OAAO,OAAO,KAAK,QAAQ;QAAE,OAAO,IAAI,CAAC;IACzD,MAAM,OAAO,GAAI,OAAiE,CAAC,OAAO,IAAI,EAAE,CAAC;IACjG,IAAI,OAAO,CAAC,OAAO,KAAK,WAAW;QAAE,OAAO,IAAI,CAAC;IACjD,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,IAAI,EAAE,CAAC;IACxC,IAAI,CAAC,QAAQ,IAAI,QAAQ,KAAK,UAAU;QAAE,OAAO,IAAI,CAAC;IACtD,IAAI,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC;QAAE,OAAO,KAAK,CAAC;IAC5C,IAAI,QAAQ,CAAC,QAAQ,CAAC,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IAC1C,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,6EAA6E;AAE7E
|
|
1
|
+
{"version":3,"file":"adapter.js","sourceRoot":"","sources":["../../src/interaction/adapter.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Durable alias store for lazy `session/new` placeholders.
|
|
3
|
+
*
|
|
4
|
+
* `session/new` returns a placeholder id with no backend session behind it
|
|
5
|
+
* (the real `session/create` is deferred to first use). The editor stores this
|
|
6
|
+
* placeholder and may resume it later — including after a bridge restart, when
|
|
7
|
+
* the in-memory `pendingSessions`/`sessionMap` are gone. Without a durable
|
|
8
|
+
* record, `session/resume` then fails with "Session not found".
|
|
9
|
+
*
|
|
10
|
+
* This module keeps a tiny JSON file (`~/.zcode/v2/acp-lazy-sessions.json`,
|
|
11
|
+
* next to tasks-index.sqlite) mapping acp_sid → { cwd, zcodeSid?, createdAt }:
|
|
12
|
+
* - `rememberLazySession` — written at session/new (no zcodeSid yet);
|
|
13
|
+
* - `recordMaterializedSession` — updated once the placeholder materializes;
|
|
14
|
+
* - `lookupLazySession` — lets resume/load/ensureRealSession recover a
|
|
15
|
+
* placeholder from a previous bridge lifetime.
|
|
16
|
+
*
|
|
17
|
+
* Best-effort side-channel like tasks-index: failures are logged and swallowed
|
|
18
|
+
* so a store problem never breaks session/new or first use. Records older than
|
|
19
|
+
* 30 days are pruned on load — the real session stays reachable via
|
|
20
|
+
* session/list after that, only the placeholder alias expires.
|
|
21
|
+
*/
|
|
22
|
+
/** Placeholder alias record persisted in the store. */
|
|
23
|
+
export interface LazySessionRecord {
|
|
24
|
+
cwd: string;
|
|
25
|
+
/** Backend session id once the placeholder materialized (absent = never used). */
|
|
26
|
+
zcodeSid?: string;
|
|
27
|
+
createdAt: number;
|
|
28
|
+
}
|
|
29
|
+
/** Record a new placeholder at session/new (no backend session yet). */
|
|
30
|
+
export declare function rememberLazySession(acpSid: string, cwd: string): void;
|
|
31
|
+
/** Attach the backend session id once the placeholder materializes. */
|
|
32
|
+
export declare function recordMaterializedSession(acpSid: string, zcodeSid: string, cwd: string): void;
|
|
33
|
+
/** Look up a placeholder alias (undefined = unknown to this bridge and store). */
|
|
34
|
+
export declare function lookupLazySession(acpSid: string): LazySessionRecord | undefined;
|
|
35
|
+
//# sourceMappingURL=lazy-sessions.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lazy-sessions.d.ts","sourceRoot":"","sources":["../src/lazy-sessions.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAQH,uDAAuD;AACvD,MAAM,WAAW,iBAAiB;IAChC,GAAG,EAAE,MAAM,CAAC;IACZ,kFAAkF;IAClF,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACnB;AAqDD,wEAAwE;AACxE,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,IAAI,CAIrE;AAED,uEAAuE;AACvE,wBAAgB,yBAAyB,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,IAAI,CAU7F;AAED,kFAAkF;AAClF,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM,GAAG,iBAAiB,GAAG,SAAS,CAE/E"}
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Durable alias store for lazy `session/new` placeholders.
|
|
3
|
+
*
|
|
4
|
+
* `session/new` returns a placeholder id with no backend session behind it
|
|
5
|
+
* (the real `session/create` is deferred to first use). The editor stores this
|
|
6
|
+
* placeholder and may resume it later — including after a bridge restart, when
|
|
7
|
+
* the in-memory `pendingSessions`/`sessionMap` are gone. Without a durable
|
|
8
|
+
* record, `session/resume` then fails with "Session not found".
|
|
9
|
+
*
|
|
10
|
+
* This module keeps a tiny JSON file (`~/.zcode/v2/acp-lazy-sessions.json`,
|
|
11
|
+
* next to tasks-index.sqlite) mapping acp_sid → { cwd, zcodeSid?, createdAt }:
|
|
12
|
+
* - `rememberLazySession` — written at session/new (no zcodeSid yet);
|
|
13
|
+
* - `recordMaterializedSession` — updated once the placeholder materializes;
|
|
14
|
+
* - `lookupLazySession` — lets resume/load/ensureRealSession recover a
|
|
15
|
+
* placeholder from a previous bridge lifetime.
|
|
16
|
+
*
|
|
17
|
+
* Best-effort side-channel like tasks-index: failures are logged and swallowed
|
|
18
|
+
* so a store problem never breaks session/new or first use. Records older than
|
|
19
|
+
* 30 days are pruned on load — the real session stays reachable via
|
|
20
|
+
* session/list after that, only the placeholder alias expires.
|
|
21
|
+
*/
|
|
22
|
+
import { existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs";
|
|
23
|
+
import path from "node:path";
|
|
24
|
+
import process from "node:process";
|
|
25
|
+
import { log, warn } from "./utils.js";
|
|
26
|
+
/** Store file lives next to config.json / tasks-index.sqlite under ~/.zcode/v2/. */
|
|
27
|
+
const STORE_FILENAME = "acp-lazy-sessions.json";
|
|
28
|
+
/** Placeholder aliases expire after 30 days; the real session remains listable. */
|
|
29
|
+
const TTL_MS = 30 * 24 * 60 * 60 * 1000;
|
|
30
|
+
/** Resolved at call time so tests can stub HOME without re-importing. */
|
|
31
|
+
function storePath() {
|
|
32
|
+
const home = process.env.HOME || process.env.USERPROFILE || "~";
|
|
33
|
+
return path.join(home, ".zcode", "v2", STORE_FILENAME);
|
|
34
|
+
}
|
|
35
|
+
/** Read the store, pruning expired/corrupt records. Returns {} on any failure. */
|
|
36
|
+
function loadRecords() {
|
|
37
|
+
try {
|
|
38
|
+
const p = storePath();
|
|
39
|
+
if (!existsSync(p))
|
|
40
|
+
return {};
|
|
41
|
+
const raw = JSON.parse(readFileSync(p, "utf8"));
|
|
42
|
+
if (typeof raw !== "object" || raw === null)
|
|
43
|
+
return {};
|
|
44
|
+
const now = Date.now();
|
|
45
|
+
let pruned = false;
|
|
46
|
+
const out = {};
|
|
47
|
+
for (const [acpSid, rec] of Object.entries(raw)) {
|
|
48
|
+
if (typeof rec?.createdAt !== "number" || now - rec.createdAt > TTL_MS) {
|
|
49
|
+
pruned = true;
|
|
50
|
+
continue;
|
|
51
|
+
}
|
|
52
|
+
out[acpSid] = rec;
|
|
53
|
+
}
|
|
54
|
+
if (pruned)
|
|
55
|
+
writeRecords(out);
|
|
56
|
+
return out;
|
|
57
|
+
}
|
|
58
|
+
catch (e) {
|
|
59
|
+
warn(`lazy-sessions: store read failed ` +
|
|
60
|
+
`(${e instanceof Error ? e.message : String(e)}) — placeholder aliases unavailable`);
|
|
61
|
+
return {};
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
/** Overwrite the store file. Failures are logged, never thrown. */
|
|
65
|
+
function writeRecords(records) {
|
|
66
|
+
try {
|
|
67
|
+
const p = storePath();
|
|
68
|
+
mkdirSync(path.dirname(p), { recursive: true });
|
|
69
|
+
writeFileSync(p, JSON.stringify(records, null, 2));
|
|
70
|
+
}
|
|
71
|
+
catch (e) {
|
|
72
|
+
log(`lazy-sessions: store write failed (${e instanceof Error ? e.message : String(e)})`);
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
/** Record a new placeholder at session/new (no backend session yet). */
|
|
76
|
+
export function rememberLazySession(acpSid, cwd) {
|
|
77
|
+
const records = loadRecords();
|
|
78
|
+
records[acpSid] = { cwd, createdAt: Date.now() };
|
|
79
|
+
writeRecords(records);
|
|
80
|
+
}
|
|
81
|
+
/** Attach the backend session id once the placeholder materializes. */
|
|
82
|
+
export function recordMaterializedSession(acpSid, zcodeSid, cwd) {
|
|
83
|
+
const records = loadRecords();
|
|
84
|
+
const existing = records[acpSid];
|
|
85
|
+
if (existing?.zcodeSid === zcodeSid)
|
|
86
|
+
return;
|
|
87
|
+
records[acpSid] = {
|
|
88
|
+
cwd: existing?.cwd ?? cwd,
|
|
89
|
+
zcodeSid,
|
|
90
|
+
createdAt: existing?.createdAt ?? Date.now(),
|
|
91
|
+
};
|
|
92
|
+
writeRecords(records);
|
|
93
|
+
}
|
|
94
|
+
/** Look up a placeholder alias (undefined = unknown to this bridge and store). */
|
|
95
|
+
export function lookupLazySession(acpSid) {
|
|
96
|
+
return loadRecords()[acpSid];
|
|
97
|
+
}
|
|
98
|
+
//# sourceMappingURL=lazy-sessions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lazy-sessions.js","sourceRoot":"","sources":["../src/lazy-sessions.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* In-memory TTL cache for quota results.
|
|
3
|
+
*
|
|
4
|
+
* `/quota` is user-triggered, so the cache only guards against rapid repeats
|
|
5
|
+
* (e.g. double-entering the command). The TTL is intentionally short — 10s —
|
|
6
|
+
* so the displayed figures stay fresh while still debouncing bursts. There is
|
|
7
|
+
* no file persistence and no per-key sharding: a single process-wide slot.
|
|
8
|
+
*/
|
|
9
|
+
import type { QuotaResult } from "./types.js";
|
|
10
|
+
/** Return the cached result if still fresh, else `null`. */
|
|
11
|
+
export declare function getCached(): QuotaResult | null;
|
|
12
|
+
/** Store a fresh result, stamping it with the current time. */
|
|
13
|
+
export declare function setCached(result: QuotaResult): void;
|
|
14
|
+
/** Clear the cache (test helper). */
|
|
15
|
+
export declare function clearCache(): void;
|
|
16
|
+
/** Override the clock (test-only). Pass `undefined` to restore real time. */
|
|
17
|
+
export declare function setClock(fn?: () => number): void;
|
|
18
|
+
//# sourceMappingURL=cache.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cache.d.ts","sourceRoot":"","sources":["../../src/quota/cache.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAU9C,4DAA4D;AAC5D,wBAAgB,SAAS,IAAI,WAAW,GAAG,IAAI,CAG9C;AAED,+DAA+D;AAC/D,wBAAgB,SAAS,CAAC,MAAM,EAAE,WAAW,GAAG,IAAI,CAEnD;AAED,qCAAqC;AACrC,wBAAgB,UAAU,IAAI,IAAI,CAEjC;AAED,6EAA6E;AAC7E,wBAAgB,QAAQ,CAAC,EAAE,CAAC,EAAE,MAAM,MAAM,GAAG,IAAI,CAEhD"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* In-memory TTL cache for quota results.
|
|
3
|
+
*
|
|
4
|
+
* `/quota` is user-triggered, so the cache only guards against rapid repeats
|
|
5
|
+
* (e.g. double-entering the command). The TTL is intentionally short — 10s —
|
|
6
|
+
* so the displayed figures stay fresh while still debouncing bursts. There is
|
|
7
|
+
* no file persistence and no per-key sharding: a single process-wide slot.
|
|
8
|
+
*/
|
|
9
|
+
/** How long a cached result is served before re-querying. */
|
|
10
|
+
const TTL_MS = 10_000;
|
|
11
|
+
let slot = null;
|
|
12
|
+
/** Inject a fake clock — only tests should need this. */
|
|
13
|
+
let now = () => Date.now();
|
|
14
|
+
/** Return the cached result if still fresh, else `null`. */
|
|
15
|
+
export function getCached() {
|
|
16
|
+
if (slot && now() - slot.at < TTL_MS)
|
|
17
|
+
return slot.result;
|
|
18
|
+
return null;
|
|
19
|
+
}
|
|
20
|
+
/** Store a fresh result, stamping it with the current time. */
|
|
21
|
+
export function setCached(result) {
|
|
22
|
+
slot = { result, at: now() };
|
|
23
|
+
}
|
|
24
|
+
/** Clear the cache (test helper). */
|
|
25
|
+
export function clearCache() {
|
|
26
|
+
slot = null;
|
|
27
|
+
}
|
|
28
|
+
/** Override the clock (test-only). Pass `undefined` to restore real time. */
|
|
29
|
+
export function setClock(fn) {
|
|
30
|
+
now = fn ?? (() => Date.now());
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=cache.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cache.js","sourceRoot":"","sources":["../../src/quota/cache.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAIH,6DAA6D;AAC7D,MAAM,MAAM,GAAG,MAAM,CAAC;AAEtB,IAAI,IAAI,GAA+C,IAAI,CAAC;AAE5D,yDAAyD;AACzD,IAAI,GAAG,GAAiB,GAAG,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC;AAEzC,4DAA4D;AAC5D,MAAM,UAAU,SAAS;IACvB,IAAI,IAAI,IAAI,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,GAAG,MAAM;QAAE,OAAO,IAAI,CAAC,MAAM,CAAC;IACzD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,+DAA+D;AAC/D,MAAM,UAAU,SAAS,CAAC,MAAmB;IAC3C,IAAI,GAAG,EAAE,MAAM,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,CAAC;AAC/B,CAAC;AAED,qCAAqC;AACrC,MAAM,UAAU,UAAU;IACxB,IAAI,GAAG,IAAI,CAAC;AACd,CAAC;AAED,6EAA6E;AAC7E,MAAM,UAAU,QAAQ,CAAC,EAAiB;IACxC,GAAG,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;AACjC,CAAC"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* GLM quota API HTTP client.
|
|
3
|
+
*
|
|
4
|
+
* Queries `bigmodel.cn` (CN) or `api.z.ai` (intl) for the current account's
|
|
5
|
+
* usage limits. Credentials come from the active ZCode provider in
|
|
6
|
+
* `~/.zcode/v2/config.json` via {@link loadZcodeCredentials} — the same apiKey
|
|
7
|
+
* the backend already uses for model calls.
|
|
8
|
+
*/
|
|
9
|
+
/** Raw response from the quota endpoint, pre-parsing. */
|
|
10
|
+
export interface QuotaResponse {
|
|
11
|
+
status: number;
|
|
12
|
+
json: unknown;
|
|
13
|
+
text: string;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Pick the quota host from a provider `baseURL`.
|
|
17
|
+
*
|
|
18
|
+
* `api.z.ai` → intl; anything else (including `open.bigmodel.cn`,
|
|
19
|
+
* `bigmodel.cn`, empty) → CN. This mirrors how the backend routes model
|
|
20
|
+
* traffic.
|
|
21
|
+
*/
|
|
22
|
+
export declare function resolveQuotaHost(baseURL: string): string;
|
|
23
|
+
/**
|
|
24
|
+
* Fetch the quota envelope from the GLM API.
|
|
25
|
+
*
|
|
26
|
+
* @throws if the active provider has no apiKey in config, or on network/timeout
|
|
27
|
+
* errors. The caller maps these to `unavailable`.
|
|
28
|
+
*/
|
|
29
|
+
export declare function fetchQuotaResponse(fetchImpl?: typeof globalThis.fetch): Promise<QuotaResponse>;
|
|
30
|
+
//# sourceMappingURL=client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/quota/client.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAcH,yDAAyD;AACzD,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,OAAO,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;CACd;AAED;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAExD;AAED;;;;;GAKG;AACH,wBAAsB,kBAAkB,CACtC,SAAS,GAAE,OAAO,UAAU,CAAC,KAAwB,GACpD,OAAO,CAAC,aAAa,CAAC,CAyBxB"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* GLM quota API HTTP client.
|
|
3
|
+
*
|
|
4
|
+
* Queries `bigmodel.cn` (CN) or `api.z.ai` (intl) for the current account's
|
|
5
|
+
* usage limits. Credentials come from the active ZCode provider in
|
|
6
|
+
* `~/.zcode/v2/config.json` via {@link loadZcodeCredentials} — the same apiKey
|
|
7
|
+
* the backend already uses for model calls.
|
|
8
|
+
*/
|
|
9
|
+
import { loadZcodeCredentials } from "../backend/credentials.js";
|
|
10
|
+
/** Quota endpoint path, appended to the chosen host. */
|
|
11
|
+
const QUOTA_PATH = "/api/monitor/usage/quota/limit";
|
|
12
|
+
/** Request timeout (ms). The endpoint is fast; keep this tight. */
|
|
13
|
+
const TIMEOUT_MS = 8000;
|
|
14
|
+
/** Hosts for the CN and intl deployments. */
|
|
15
|
+
const HOST_CN = "https://open.bigmodel.cn";
|
|
16
|
+
const HOST_INTL = "https://api.z.ai";
|
|
17
|
+
/**
|
|
18
|
+
* Pick the quota host from a provider `baseURL`.
|
|
19
|
+
*
|
|
20
|
+
* `api.z.ai` → intl; anything else (including `open.bigmodel.cn`,
|
|
21
|
+
* `bigmodel.cn`, empty) → CN. This mirrors how the backend routes model
|
|
22
|
+
* traffic.
|
|
23
|
+
*/
|
|
24
|
+
export function resolveQuotaHost(baseURL) {
|
|
25
|
+
return baseURL.includes("api.z.ai") ? HOST_INTL : HOST_CN;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Fetch the quota envelope from the GLM API.
|
|
29
|
+
*
|
|
30
|
+
* @throws if the active provider has no apiKey in config, or on network/timeout
|
|
31
|
+
* errors. The caller maps these to `unavailable`.
|
|
32
|
+
*/
|
|
33
|
+
export async function fetchQuotaResponse(fetchImpl = globalThis.fetch) {
|
|
34
|
+
const { ANTHROPIC_API_KEY, ZCODE_BASE_URL } = loadZcodeCredentials();
|
|
35
|
+
if (!ANTHROPIC_API_KEY) {
|
|
36
|
+
throw new Error("no apiKey in ZCode config — cannot query quota");
|
|
37
|
+
}
|
|
38
|
+
const url = resolveQuotaHost(ZCODE_BASE_URL ?? "") + QUOTA_PATH;
|
|
39
|
+
const resp = await fetchImpl(url, {
|
|
40
|
+
method: "GET",
|
|
41
|
+
headers: {
|
|
42
|
+
Accept: "application/json, text/plain, */*",
|
|
43
|
+
Authorization: `Bearer ${ANTHROPIC_API_KEY}`,
|
|
44
|
+
},
|
|
45
|
+
signal: AbortSignal.timeout(TIMEOUT_MS),
|
|
46
|
+
});
|
|
47
|
+
const text = await resp.text();
|
|
48
|
+
let json = null;
|
|
49
|
+
try {
|
|
50
|
+
json = text ? JSON.parse(text) : null;
|
|
51
|
+
}
|
|
52
|
+
catch {
|
|
53
|
+
// Non-JSON body — leave json null; the parser treats it as unavailable.
|
|
54
|
+
}
|
|
55
|
+
return { status: resp.status, json, text };
|
|
56
|
+
}
|
|
57
|
+
//# sourceMappingURL=client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/quota/client.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAC;AAEjE,wDAAwD;AACxD,MAAM,UAAU,GAAG,gCAAgC,CAAC;AAEpD,mEAAmE;AACnE,MAAM,UAAU,GAAG,IAAI,CAAC;AAExB,6CAA6C;AAC7C,MAAM,OAAO,GAAG,0BAA0B,CAAC;AAC3C,MAAM,SAAS,GAAG,kBAAkB,CAAC;AASrC;;;;;;GAMG;AACH,MAAM,UAAU,gBAAgB,CAAC,OAAe;IAC9C,OAAO,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC;AAC5D,CAAC;AAED;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,YAAqC,UAAU,CAAC,KAAK;IAErD,MAAM,EAAE,iBAAiB,EAAE,cAAc,EAAE,GAAG,oBAAoB,EAAE,CAAC;IACrE,IAAI,CAAC,iBAAiB,EAAE,CAAC;QACvB,MAAM,IAAI,KAAK,CAAC,gDAAgD,CAAC,CAAC;IACpE,CAAC;IAED,MAAM,GAAG,GAAG,gBAAgB,CAAC,cAAc,IAAI,EAAE,CAAC,GAAG,UAAU,CAAC;IAChE,MAAM,IAAI,GAAG,MAAM,SAAS,CAAC,GAAG,EAAE;QAChC,MAAM,EAAE,KAAK;QACb,OAAO,EAAE;YACP,MAAM,EAAE,mCAAmC;YAC3C,aAAa,EAAE,UAAU,iBAAiB,EAAE;SAC7C;QACD,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,UAAU,CAAC;KACxC,CAAC,CAAC;IAEH,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC;IAC/B,IAAI,IAAI,GAAY,IAAI,CAAC;IACzB,IAAI,CAAC;QACH,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IACxC,CAAC;IAAC,MAAM,CAAC;QACP,wEAAwE;IAC1E,CAAC;IAED,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;AAC7C,CAAC"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Color progress-bar rendering for the `zcode-quota` CLI.
|
|
3
|
+
*
|
|
4
|
+
* The default CLI view overlays the usage numbers directly onto a heat-colored
|
|
5
|
+
* (green→yellow→red) bar using 24-bit ANSI background colors, so the percentage
|
|
6
|
+
* or used/total counter reads from inside the bar and the right margin stays
|
|
7
|
+
* short (just the reset time). `--plain` and the `/quota` slash command bypass
|
|
8
|
+
* this module entirely and keep the classic monochrome `█`/`░` layout from
|
|
9
|
+
* {@link renderBar}.
|
|
10
|
+
*
|
|
11
|
+
* Only real terminals render 24-bit color; the CLI caller gates this on
|
|
12
|
+
* `process.stdout.isTTY` so piping to a file or another command never emits
|
|
13
|
+
* raw escape codes.
|
|
14
|
+
*/
|
|
15
|
+
/** ANSI reset (cancel all attributes). */
|
|
16
|
+
export declare const RESET = "\u001B[0m";
|
|
17
|
+
/** 24-bit RGB triple. */
|
|
18
|
+
type Rgb = readonly [number, number, number];
|
|
19
|
+
/**
|
|
20
|
+
* Green→yellow→red heat color for a usage percent.
|
|
21
|
+
*
|
|
22
|
+
* 0% → green `(34,197,94)`, 50% → yellow `(234,179,8)`, 100% → red
|
|
23
|
+
* `(239,68,68)`, piecewise-linearly interpolated. Input is clamped to [0, 100].
|
|
24
|
+
*/
|
|
25
|
+
export declare function heatColor(pct: number): Rgb;
|
|
26
|
+
/**
|
|
27
|
+
* Pick the overlay text drawn inside the bar.
|
|
28
|
+
*
|
|
29
|
+
* Returns `"used/total"` when the item carries both absolute counters (e.g. the
|
|
30
|
+
* MCP limit), otherwise `"NN%"` (the rounded used percent). This lets
|
|
31
|
+
* counter-bearing limits show their exact counts in-bar while counter-less
|
|
32
|
+
* limits (5h, Opencode Go windows) show the percent.
|
|
33
|
+
*/
|
|
34
|
+
export declare function pickOverlay(item: {
|
|
35
|
+
usedPercent: number;
|
|
36
|
+
usedCount?: number;
|
|
37
|
+
totalCount?: number;
|
|
38
|
+
}): string;
|
|
39
|
+
/** Options for {@link renderColorBar}. */
|
|
40
|
+
export interface ColorBarOptions {
|
|
41
|
+
/** Text drawn centered inside the bar (e.g. `"73%"` or `"237/1000"`). */
|
|
42
|
+
overlay?: string;
|
|
43
|
+
/** Total cell count; defaults to 20 to match the plain {@link renderBar}. */
|
|
44
|
+
width?: number;
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Render a heat-colored progress bar with optional centered overlay text.
|
|
48
|
+
*
|
|
49
|
+
* Each cell is one background color: the fill cells use {@link heatColor} (so
|
|
50
|
+
* low usage reads green, high usage red), the empty cells use a constant dark
|
|
51
|
+
* gray. When an overlay string is supplied its characters are written over the
|
|
52
|
+
* bar with a contrasting foreground (white on fill, gray on empty), centered
|
|
53
|
+
* across the `width` cells. The result always ends with {@link RESET} so the
|
|
54
|
+
* color never leaks into the text that follows.
|
|
55
|
+
*/
|
|
56
|
+
export declare function renderColorBar(usedPercent: number, opts?: ColorBarOptions): string;
|
|
57
|
+
export {};
|
|
58
|
+
//# sourceMappingURL=color.d.ts.map
|