@code-yeongyu/senpi 2026.9.11 → 2026.9.12-2

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 (156) hide show
  1. package/CHANGELOG.md +40 -0
  2. package/dist/core/agent-session-runtime.d.ts.map +1 -1
  3. package/dist/core/agent-session-runtime.js +5 -1
  4. package/dist/core/agent-session-runtime.js.map +1 -1
  5. package/dist/core/agent-session.d.ts +13 -9
  6. package/dist/core/agent-session.d.ts.map +1 -1
  7. package/dist/core/agent-session.js +54 -121
  8. package/dist/core/agent-session.js.map +1 -1
  9. package/dist/core/cursor-history-admission.d.ts +50 -0
  10. package/dist/core/cursor-history-admission.d.ts.map +1 -0
  11. package/dist/core/cursor-history-admission.js +130 -0
  12. package/dist/core/cursor-history-admission.js.map +1 -0
  13. package/dist/core/extensions/builtin/cursor-cli-oauth/models.d.ts.map +1 -1
  14. package/dist/core/extensions/builtin/cursor-cli-oauth/models.js +2 -1
  15. package/dist/core/extensions/builtin/cursor-cli-oauth/models.js.map +1 -1
  16. package/dist/core/session-manager.d.ts +2 -0
  17. package/dist/core/session-manager.d.ts.map +1 -1
  18. package/dist/core/session-manager.js +22 -13
  19. package/dist/core/session-manager.js.map +1 -1
  20. package/dist/core/session-write-reservation.d.ts +9 -0
  21. package/dist/core/session-write-reservation.d.ts.map +1 -1
  22. package/dist/core/session-write-reservation.js +33 -0
  23. package/dist/core/session-write-reservation.js.map +1 -1
  24. package/dist/modes/interactive/components/ask-user-async-widget.d.ts +2 -0
  25. package/dist/modes/interactive/components/ask-user-async-widget.d.ts.map +1 -1
  26. package/dist/modes/interactive/components/ask-user-async-widget.js +17 -1
  27. package/dist/modes/interactive/components/ask-user-async-widget.js.map +1 -1
  28. package/dist/modes/interactive/interactive-mode.js +2 -2
  29. package/dist/modes/interactive/interactive-mode.js.map +1 -1
  30. package/dist/modes/rpc/rpc-types.d.ts +2 -1
  31. package/dist/modes/rpc/rpc-types.d.ts.map +1 -1
  32. package/dist/modes/rpc/rpc-types.js +1 -0
  33. package/dist/modes/rpc/rpc-types.js.map +1 -1
  34. package/dist/modes/rpc/session-path-reservations.d.ts +30 -0
  35. package/dist/modes/rpc/session-path-reservations.d.ts.map +1 -0
  36. package/dist/modes/rpc/session-path-reservations.js +58 -0
  37. package/dist/modes/rpc/session-path-reservations.js.map +1 -0
  38. package/dist/modes/rpc/session-registry.d.ts +3 -1
  39. package/dist/modes/rpc/session-registry.d.ts.map +1 -1
  40. package/dist/modes/rpc/session-registry.js.map +1 -1
  41. package/dist/modes/rpc/session-worker-client.d.ts +10 -8
  42. package/dist/modes/rpc/session-worker-client.d.ts.map +1 -1
  43. package/dist/modes/rpc/session-worker-client.js +14 -23
  44. package/dist/modes/rpc/session-worker-client.js.map +1 -1
  45. package/dist/modes/rpc/session-worker-credit.d.ts +17 -0
  46. package/dist/modes/rpc/session-worker-credit.d.ts.map +1 -0
  47. package/dist/modes/rpc/session-worker-credit.js +39 -0
  48. package/dist/modes/rpc/session-worker-credit.js.map +1 -0
  49. package/dist/modes/rpc/session-worker-protocol.d.ts +10 -0
  50. package/dist/modes/rpc/session-worker-protocol.d.ts.map +1 -1
  51. package/dist/modes/rpc/session-worker-protocol.js +2 -0
  52. package/dist/modes/rpc/session-worker-protocol.js.map +1 -1
  53. package/dist/modes/rpc/session-worker-signals.d.ts +7 -0
  54. package/dist/modes/rpc/session-worker-signals.d.ts.map +1 -0
  55. package/dist/modes/rpc/session-worker-signals.js +19 -0
  56. package/dist/modes/rpc/session-worker-signals.js.map +1 -0
  57. package/dist/modes/rpc/session-worker.js +12 -16
  58. package/dist/modes/rpc/session-worker.js.map +1 -1
  59. package/dist/modes/rpc/worker-session-registry.d.ts +12 -0
  60. package/dist/modes/rpc/worker-session-registry.d.ts.map +1 -1
  61. package/dist/modes/rpc/worker-session-registry.js +51 -24
  62. package/dist/modes/rpc/worker-session-registry.js.map +1 -1
  63. package/docs/rpc.md +14 -6
  64. package/node_modules/@code-yeongyu/senpi-codemode/CHANGELOG.md +24 -0
  65. package/node_modules/@code-yeongyu/senpi-codemode/package.json +4 -4
  66. package/node_modules/@earendil-works/pi-agent-core/package.json +3 -3
  67. package/node_modules/@earendil-works/pi-ai/dist/api/cursor-agent/measure.d.ts +11 -0
  68. package/node_modules/@earendil-works/pi-ai/dist/api/cursor-agent/measure.d.ts.map +1 -1
  69. package/node_modules/@earendil-works/pi-ai/dist/api/cursor-agent/measure.js +18 -0
  70. package/node_modules/@earendil-works/pi-ai/dist/api/cursor-agent/measure.js.map +1 -1
  71. package/node_modules/@earendil-works/pi-ai/dist/api/cursor-agent.d.ts +1 -1
  72. package/node_modules/@earendil-works/pi-ai/dist/api/cursor-agent.d.ts.map +1 -1
  73. package/node_modules/@earendil-works/pi-ai/dist/api/cursor-agent.js +5 -1
  74. package/node_modules/@earendil-works/pi-ai/dist/api/cursor-agent.js.map +1 -1
  75. package/node_modules/@earendil-works/pi-ai/dist/api/devin-agent/discovery.d.ts +2 -0
  76. package/node_modules/@earendil-works/pi-ai/dist/api/devin-agent/discovery.d.ts.map +1 -1
  77. package/node_modules/@earendil-works/pi-ai/dist/api/devin-agent/discovery.js +96 -51
  78. package/node_modules/@earendil-works/pi-ai/dist/api/devin-agent/discovery.js.map +1 -1
  79. package/node_modules/@earendil-works/pi-ai/dist/api/devin-agent/gen/cascade_pb.d.ts +389 -1
  80. package/node_modules/@earendil-works/pi-ai/dist/api/devin-agent/gen/cascade_pb.d.ts.map +1 -1
  81. package/node_modules/@earendil-works/pi-ai/dist/api/devin-agent/gen/cascade_pb.js +132 -4
  82. package/node_modules/@earendil-works/pi-ai/dist/api/devin-agent/gen/cascade_pb.js.map +1 -1
  83. package/node_modules/@earendil-works/pi-ai/dist/api/devin-agent/metadata.d.ts +34 -4
  84. package/node_modules/@earendil-works/pi-ai/dist/api/devin-agent/metadata.d.ts.map +1 -1
  85. package/node_modules/@earendil-works/pi-ai/dist/api/devin-agent/metadata.js +41 -8
  86. package/node_modules/@earendil-works/pi-ai/dist/api/devin-agent/metadata.js.map +1 -1
  87. package/node_modules/@earendil-works/pi-ai/dist/api/devin-agent/paths.d.ts +20 -0
  88. package/node_modules/@earendil-works/pi-ai/dist/api/devin-agent/paths.d.ts.map +1 -1
  89. package/node_modules/@earendil-works/pi-ai/dist/api/devin-agent/paths.js +20 -0
  90. package/node_modules/@earendil-works/pi-ai/dist/api/devin-agent/paths.js.map +1 -1
  91. package/node_modules/@earendil-works/pi-ai/dist/api/devin-agent/request.d.ts +18 -6
  92. package/node_modules/@earendil-works/pi-ai/dist/api/devin-agent/request.d.ts.map +1 -1
  93. package/node_modules/@earendil-works/pi-ai/dist/api/devin-agent/request.js +77 -35
  94. package/node_modules/@earendil-works/pi-ai/dist/api/devin-agent/request.js.map +1 -1
  95. package/node_modules/@earendil-works/pi-ai/dist/api/devin-agent/stream-state.d.ts +9 -3
  96. package/node_modules/@earendil-works/pi-ai/dist/api/devin-agent/stream-state.d.ts.map +1 -1
  97. package/node_modules/@earendil-works/pi-ai/dist/api/devin-agent/stream-state.js +30 -38
  98. package/node_modules/@earendil-works/pi-ai/dist/api/devin-agent/stream-state.js.map +1 -1
  99. package/node_modules/@earendil-works/pi-ai/dist/api/devin-agent/trailer.d.ts +16 -0
  100. package/node_modules/@earendil-works/pi-ai/dist/api/devin-agent/trailer.d.ts.map +1 -0
  101. package/node_modules/@earendil-works/pi-ai/dist/api/devin-agent/trailer.js +69 -0
  102. package/node_modules/@earendil-works/pi-ai/dist/api/devin-agent/trailer.js.map +1 -0
  103. package/node_modules/@earendil-works/pi-ai/dist/api/devin-agent/unary.d.ts +26 -0
  104. package/node_modules/@earendil-works/pi-ai/dist/api/devin-agent/unary.d.ts.map +1 -0
  105. package/node_modules/@earendil-works/pi-ai/dist/api/devin-agent/unary.js +61 -0
  106. package/node_modules/@earendil-works/pi-ai/dist/api/devin-agent/unary.js.map +1 -0
  107. package/node_modules/@earendil-works/pi-ai/dist/api/devin-agent/wire.d.ts +6 -4
  108. package/node_modules/@earendil-works/pi-ai/dist/api/devin-agent/wire.d.ts.map +1 -1
  109. package/node_modules/@earendil-works/pi-ai/dist/api/devin-agent/wire.js +6 -4
  110. package/node_modules/@earendil-works/pi-ai/dist/api/devin-agent/wire.js.map +1 -1
  111. package/node_modules/@earendil-works/pi-ai/dist/api/devin-agent.d.ts +13 -5
  112. package/node_modules/@earendil-works/pi-ai/dist/api/devin-agent.d.ts.map +1 -1
  113. package/node_modules/@earendil-works/pi-ai/dist/api/devin-agent.js +76 -21
  114. package/node_modules/@earendil-works/pi-ai/dist/api/devin-agent.js.map +1 -1
  115. package/node_modules/@earendil-works/pi-ai/dist/auth/oauth/devin.d.ts +5 -0
  116. package/node_modules/@earendil-works/pi-ai/dist/auth/oauth/devin.d.ts.map +1 -1
  117. package/node_modules/@earendil-works/pi-ai/dist/auth/oauth/devin.js +7 -2
  118. package/node_modules/@earendil-works/pi-ai/dist/auth/oauth/devin.js.map +1 -1
  119. package/node_modules/@earendil-works/pi-ai/dist/cursor/context-limit-store.d.ts +32 -0
  120. package/node_modules/@earendil-works/pi-ai/dist/cursor/context-limit-store.d.ts.map +1 -0
  121. package/node_modules/@earendil-works/pi-ai/dist/cursor/context-limit-store.js +62 -0
  122. package/node_modules/@earendil-works/pi-ai/dist/cursor/context-limit-store.js.map +1 -0
  123. package/node_modules/@earendil-works/pi-ai/dist/cursor/store-migration.d.ts.map +1 -1
  124. package/node_modules/@earendil-works/pi-ai/dist/cursor/store-migration.js +2 -1
  125. package/node_modules/@earendil-works/pi-ai/dist/cursor/store-migration.js.map +1 -1
  126. package/node_modules/@earendil-works/pi-ai/dist/index.d.ts +1 -1
  127. package/node_modules/@earendil-works/pi-ai/dist/index.d.ts.map +1 -1
  128. package/node_modules/@earendil-works/pi-ai/dist/index.js +1 -1
  129. package/node_modules/@earendil-works/pi-ai/dist/index.js.map +1 -1
  130. package/node_modules/@earendil-works/pi-ai/dist/model.d.ts +11 -1
  131. package/node_modules/@earendil-works/pi-ai/dist/model.d.ts.map +1 -1
  132. package/node_modules/@earendil-works/pi-ai/dist/model.js.map +1 -1
  133. package/node_modules/@earendil-works/pi-ai/dist/providers/cursor.d.ts.map +1 -1
  134. package/node_modules/@earendil-works/pi-ai/dist/providers/cursor.js +2 -1
  135. package/node_modules/@earendil-works/pi-ai/dist/providers/cursor.js.map +1 -1
  136. package/node_modules/@earendil-works/pi-ai/dist/providers/data/.manifest.json +1 -1
  137. package/node_modules/@earendil-works/pi-ai/dist/providers/data/amazon-bedrock.json +1 -1
  138. package/node_modules/@earendil-works/pi-ai/dist/providers/data/openrouter.json +1 -1
  139. package/node_modules/@earendil-works/pi-ai/dist/providers/data/venice.json +1 -1
  140. package/node_modules/@earendil-works/pi-ai/dist/providers/data/vercel-ai-gateway.json +1 -1
  141. package/node_modules/@earendil-works/pi-ai/dist/providers/devin.d.ts.map +1 -1
  142. package/node_modules/@earendil-works/pi-ai/dist/providers/devin.js +3 -3
  143. package/node_modules/@earendil-works/pi-ai/dist/providers/devin.js.map +1 -1
  144. package/node_modules/@earendil-works/pi-ai/dist/providers/devin.models.d.ts +4 -2
  145. package/node_modules/@earendil-works/pi-ai/dist/providers/devin.models.d.ts.map +1 -1
  146. package/node_modules/@earendil-works/pi-ai/dist/providers/devin.models.js +18 -9
  147. package/node_modules/@earendil-works/pi-ai/dist/providers/devin.models.js.map +1 -1
  148. package/node_modules/@earendil-works/pi-ai/dist/utils/cursor-context-limit.d.ts +12 -0
  149. package/node_modules/@earendil-works/pi-ai/dist/utils/cursor-context-limit.d.ts.map +1 -0
  150. package/node_modules/@earendil-works/pi-ai/dist/utils/cursor-context-limit.js +93 -0
  151. package/node_modules/@earendil-works/pi-ai/dist/utils/cursor-context-limit.js.map +1 -0
  152. package/node_modules/@earendil-works/pi-ai/package.json +2 -2
  153. package/node_modules/@earendil-works/pi-pty/package.json +1 -1
  154. package/node_modules/@earendil-works/pi-telemetry/package.json +1 -1
  155. package/node_modules/@earendil-works/pi-tui/package.json +1 -1
  156. package/package.json +7 -7
@@ -0,0 +1,50 @@
1
+ /**
2
+ * Cursor request admission: what the transport is allowed to send in one turn.
3
+ *
4
+ * Cursor rebuilds the whole conversation on every hop and rejects large
5
+ * verbatim tool payloads, so a turn is bounded twice - each tool result is
6
+ * capped on its own, and the aggregate model input is held under the model's
7
+ * context window. Admission NEVER deletes a turn (senpi#1603): dropping the
8
+ * oldest turns to reach a byte cap silently amputated the conversation, and a
9
+ * history that still exceeds the budget after blanking is admitted as-is so the
10
+ * existing Cursor overflow path (a 0-token `resource_exhausted` surfaced to the
11
+ * session layer) compacts it with the session's own policy.
12
+ */
13
+ import type { AgentMessage } from "@earendil-works/pi-agent-core";
14
+ import type { Message } from "@earendil-works/pi-ai/compat";
15
+ /** Cursor ingest rejects large verbatim tool payloads. The bound is graphemes. */
16
+ export declare const CURSOR_TOOL_RESULT_MAX_CHARS = 2000;
17
+ /** Aggregate admission budget for a model whose window is `contextWindowTokens`. */
18
+ export declare function cursorAdmissionBudgetBytes(contextWindowTokens: number): number;
19
+ export type CursorAdmissionRequest = {
20
+ readonly messages: AgentMessage[] | undefined;
21
+ /** Serialized model-input bytes this turn may occupy. */
22
+ readonly budgetBytes: number;
23
+ readonly maxChars?: number;
24
+ readonly convert?: (candidate: AgentMessage[]) => Message[];
25
+ };
26
+ export type CursorAdmissionResult = {
27
+ readonly messages: AgentMessage[] | undefined;
28
+ readonly changed: boolean;
29
+ readonly blankedToolResults: number;
30
+ readonly bytesBefore: number;
31
+ readonly bytesAfter: number;
32
+ /** True when the history still exceeds the budget; the request is still sent. */
33
+ readonly overBudget: boolean;
34
+ };
35
+ /**
36
+ * Bounds one Cursor request: per-result caps first, then blanking the oldest
37
+ * tool result bodies while the model input exceeds `budgetBytes`. Conversation
38
+ * turns are never removed.
39
+ */
40
+ export declare function admitCursorHistory(request: CursorAdmissionRequest): CursorAdmissionResult;
41
+ /**
42
+ * Positional entry point kept for existing callers. An omitted `maxBytes`
43
+ * applies the per-result cap only; the aggregate budget belongs to the caller
44
+ * that knows the model window.
45
+ */
46
+ export declare function truncateToolResultBodies(messages: AgentMessage[] | undefined, maxChars?: number, maxBytes?: number, convert?: (candidate: AgentMessage[]) => Message[]): {
47
+ messages: AgentMessage[] | undefined;
48
+ changed: boolean;
49
+ };
50
+ //# sourceMappingURL=cursor-history-admission.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cursor-history-admission.d.ts","sourceRoot":"","sources":["../../src/core/cursor-history-admission.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AACH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;AAElE,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,8BAA8B,CAAC;AAG5D,kFAAkF;AAClF,eAAO,MAAM,4BAA4B,OAAO,CAAC;AAKjD,oFAAoF;AACpF,wBAAgB,0BAA0B,CAAC,mBAAmB,EAAE,MAAM,GAAG,MAAM,CAG9E;AAED,MAAM,MAAM,sBAAsB,GAAG;IACpC,QAAQ,CAAC,QAAQ,EAAE,YAAY,EAAE,GAAG,SAAS,CAAC;IAC9C,yDAAyD;IACzD,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,YAAY,EAAE,KAAK,OAAO,EAAE,CAAC;CAC5D,CAAC;AAEF,MAAM,MAAM,qBAAqB,GAAG;IACnC,QAAQ,CAAC,QAAQ,EAAE,YAAY,EAAE,GAAG,SAAS,CAAC;IAC9C,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,kBAAkB,EAAE,MAAM,CAAC;IACpC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,iFAAiF;IACjF,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC;CAC7B,CAAC;AA2EF;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,sBAAsB,GAAG,qBAAqB,CAoCzF;AAED;;;;GAIG;AACH,wBAAgB,wBAAwB,CACvC,QAAQ,EAAE,YAAY,EAAE,GAAG,SAAS,EACpC,QAAQ,SAA+B,EACvC,QAAQ,SAA2B,EACnC,OAAO,eAAe,YAAY,EAAE,cAA4B,GAC9D;IAAE,QAAQ,EAAE,YAAY,EAAE,GAAG,SAAS,CAAC;IAAC,OAAO,EAAE,OAAO,CAAA;CAAE,CAG5D"}
@@ -0,0 +1,130 @@
1
+ import { measureCursorModelInputSerializedBytes } from "@earendil-works/pi-ai";
2
+ import { convertToLlm } from "./messages.js";
3
+ /** Cursor ingest rejects large verbatim tool payloads. The bound is graphemes. */
4
+ export const CURSOR_TOOL_RESULT_MAX_CHARS = 2000;
5
+ const CURSOR_TRUNCATION_MARKER = "\n...[truncated]";
6
+ /** Repo-wide estimate, matching `estimateTokens` in core/compaction. */
7
+ const CHARS_PER_TOKEN = 4;
8
+ /** Aggregate admission budget for a model whose window is `contextWindowTokens`. */
9
+ export function cursorAdmissionBudgetBytes(contextWindowTokens) {
10
+ if (!Number.isFinite(contextWindowTokens) || contextWindowTokens <= 0)
11
+ return 0;
12
+ return Math.floor(contextWindowTokens) * CHARS_PER_TOKEN;
13
+ }
14
+ function capToolResultBodies(messages, maxChars) {
15
+ const segmenter = new Intl.Segmenter(undefined, { granularity: "grapheme" });
16
+ const markerChars = [...segmenter.segment(CURSOR_TRUNCATION_MARKER)].length;
17
+ const result = messages.slice();
18
+ let changed = false;
19
+ for (let messageIndex = result.length - 1; messageIndex >= 0; messageIndex--) {
20
+ const message = result[messageIndex];
21
+ if (message.role !== "toolResult" || !Array.isArray(message.content))
22
+ continue;
23
+ let content = message.content;
24
+ for (let partIndex = content.length - 1; partIndex >= 0; partIndex--) {
25
+ const part = content[partIndex];
26
+ if (part.type === "image" && typeof part.data === "string")
27
+ continue;
28
+ if (part.type !== "text" || typeof part.text !== "string")
29
+ continue;
30
+ const graphemes = [...segmenter.segment(part.text)].map((item) => item.segment);
31
+ if (graphemes.length <= maxChars)
32
+ continue;
33
+ const kept = graphemes.slice(0, Math.max(0, maxChars - markerChars)).join("");
34
+ content = content === message.content ? content.slice() : content;
35
+ content[partIndex] = { ...part, text: kept + CURSOR_TRUNCATION_MARKER };
36
+ result[messageIndex] = { ...message, content };
37
+ changed = true;
38
+ }
39
+ }
40
+ return { messages: result, changed };
41
+ }
42
+ function emptyToolResult(message) {
43
+ if (message.role !== "toolResult" || !Array.isArray(message.content))
44
+ return message;
45
+ const emptiedContent = message.content.map((part) => part.type === "text" ? { ...part, text: "" } : part.type === "image" ? { ...part, data: "" } : part);
46
+ const content = emptiedContent.filter((part, index) => {
47
+ if (index === 0)
48
+ return true;
49
+ const previous = emptiedContent[index - 1];
50
+ const empty = part.type === "text" ? part.text === "" : part.type === "image" && part.data === "";
51
+ const previousEmpty = previous.type === "text" ? previous.text === "" : previous.type === "image" && previous.data === "";
52
+ return !empty || !previousEmpty;
53
+ });
54
+ return { ...message, content };
55
+ }
56
+ /**
57
+ * Empties the oldest result bodies until the rest fits. The prefix search is
58
+ * monotonic, so admission stays bounded instead of reserializing the whole
59
+ * history once per tool result.
60
+ */
61
+ function blankOldestToolResults(messages, fits) {
62
+ const toolResultIndexes = messages.flatMap((message, index) => message.role === "toolResult" && Array.isArray(message.content) ? [index] : []);
63
+ const withEmptyPrefix = (count) => {
64
+ const candidate = messages.slice();
65
+ for (let i = 0; i < count; i++)
66
+ candidate[toolResultIndexes[i]] = emptyToolResult(candidate[toolResultIndexes[i]]);
67
+ return candidate;
68
+ };
69
+ let low = 0;
70
+ let high = toolResultIndexes.length;
71
+ while (low < high) {
72
+ const middle = Math.floor((low + high) / 2);
73
+ if (fits(withEmptyPrefix(middle + 1)))
74
+ high = middle;
75
+ else
76
+ low = middle + 1;
77
+ }
78
+ const count = Math.min(low + 1, toolResultIndexes.length);
79
+ return { messages: count > 0 ? withEmptyPrefix(count) : messages, count };
80
+ }
81
+ /**
82
+ * Bounds one Cursor request: per-result caps first, then blanking the oldest
83
+ * tool result bodies while the model input exceeds `budgetBytes`. Conversation
84
+ * turns are never removed.
85
+ */
86
+ export function admitCursorHistory(request) {
87
+ const { messages, budgetBytes } = request;
88
+ if (!Array.isArray(messages) || messages.length === 0) {
89
+ return { messages, changed: false, blankedToolResults: 0, bytesBefore: 0, bytesAfter: 0, overBudget: false };
90
+ }
91
+ const convert = request.convert ?? ((candidate) => convertToLlm(candidate));
92
+ const capped = capToolResultBodies(messages, request.maxChars ?? CURSOR_TOOL_RESULT_MAX_CHARS);
93
+ const measure = (candidate) => {
94
+ const converted = convert(candidate);
95
+ const activeUserMessageIndex = converted.at(-1)?.role === "user" ? converted.length - 1 : -1;
96
+ return measureCursorModelInputSerializedBytes(converted, activeUserMessageIndex);
97
+ };
98
+ const bytesBefore = measure(capped.messages);
99
+ if (bytesBefore <= budgetBytes) {
100
+ return {
101
+ messages: capped.changed ? capped.messages : messages,
102
+ changed: capped.changed,
103
+ blankedToolResults: 0,
104
+ bytesBefore,
105
+ bytesAfter: bytesBefore,
106
+ overBudget: false,
107
+ };
108
+ }
109
+ const blanked = blankOldestToolResults(capped.messages, (candidate) => measure(candidate) <= budgetBytes);
110
+ const bytesAfter = blanked.count > 0 ? measure(blanked.messages) : bytesBefore;
111
+ const changed = capped.changed || blanked.count > 0;
112
+ return {
113
+ messages: changed ? blanked.messages : messages,
114
+ changed,
115
+ blankedToolResults: blanked.count,
116
+ bytesBefore,
117
+ bytesAfter,
118
+ overBudget: bytesAfter > budgetBytes,
119
+ };
120
+ }
121
+ /**
122
+ * Positional entry point kept for existing callers. An omitted `maxBytes`
123
+ * applies the per-result cap only; the aggregate budget belongs to the caller
124
+ * that knows the model window.
125
+ */
126
+ export function truncateToolResultBodies(messages, maxChars = CURSOR_TOOL_RESULT_MAX_CHARS, maxBytes = Number.POSITIVE_INFINITY, convert = (candidate) => convertToLlm(candidate)) {
127
+ const admission = admitCursorHistory({ messages, budgetBytes: maxBytes, maxChars, convert });
128
+ return { messages: admission.messages, changed: admission.changed };
129
+ }
130
+ //# sourceMappingURL=cursor-history-admission.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cursor-history-admission.js","sourceRoot":"","sources":["../../src/core/cursor-history-admission.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Cursor request admission: what the transport is allowed to send in one turn.\n *\n * Cursor rebuilds the whole conversation on every hop and rejects large\n * verbatim tool payloads, so a turn is bounded twice - each tool result is\n * capped on its own, and the aggregate model input is held under the model's\n * context window. Admission NEVER deletes a turn (senpi#1603): dropping the\n * oldest turns to reach a byte cap silently amputated the conversation, and a\n * history that still exceeds the budget after blanking is admitted as-is so the\n * existing Cursor overflow path (a 0-token `resource_exhausted` surfaced to the\n * session layer) compacts it with the session's own policy.\n */\nimport type { AgentMessage } from \"@earendil-works/pi-agent-core\";\nimport { measureCursorModelInputSerializedBytes } from \"@earendil-works/pi-ai\";\nimport type { Message } from \"@earendil-works/pi-ai/compat\";\nimport { convertToLlm } from \"./messages.ts\";\n\n/** Cursor ingest rejects large verbatim tool payloads. The bound is graphemes. */\nexport const CURSOR_TOOL_RESULT_MAX_CHARS = 2000;\nconst CURSOR_TRUNCATION_MARKER = \"\\n...[truncated]\";\n/** Repo-wide estimate, matching `estimateTokens` in core/compaction. */\nconst CHARS_PER_TOKEN = 4;\n\n/** Aggregate admission budget for a model whose window is `contextWindowTokens`. */\nexport function cursorAdmissionBudgetBytes(contextWindowTokens: number): number {\n\tif (!Number.isFinite(contextWindowTokens) || contextWindowTokens <= 0) return 0;\n\treturn Math.floor(contextWindowTokens) * CHARS_PER_TOKEN;\n}\n\nexport type CursorAdmissionRequest = {\n\treadonly messages: AgentMessage[] | undefined;\n\t/** Serialized model-input bytes this turn may occupy. */\n\treadonly budgetBytes: number;\n\treadonly maxChars?: number;\n\treadonly convert?: (candidate: AgentMessage[]) => Message[];\n};\n\nexport type CursorAdmissionResult = {\n\treadonly messages: AgentMessage[] | undefined;\n\treadonly changed: boolean;\n\treadonly blankedToolResults: number;\n\treadonly bytesBefore: number;\n\treadonly bytesAfter: number;\n\t/** True when the history still exceeds the budget; the request is still sent. */\n\treadonly overBudget: boolean;\n};\n\nfunction capToolResultBodies(\n\tmessages: AgentMessage[],\n\tmaxChars: number,\n): { readonly messages: AgentMessage[]; readonly changed: boolean } {\n\tconst segmenter = new Intl.Segmenter(undefined, { granularity: \"grapheme\" });\n\tconst markerChars = [...segmenter.segment(CURSOR_TRUNCATION_MARKER)].length;\n\tconst result = messages.slice();\n\tlet changed = false;\n\tfor (let messageIndex = result.length - 1; messageIndex >= 0; messageIndex--) {\n\t\tconst message = result[messageIndex];\n\t\tif (message.role !== \"toolResult\" || !Array.isArray(message.content)) continue;\n\t\tlet content = message.content;\n\t\tfor (let partIndex = content.length - 1; partIndex >= 0; partIndex--) {\n\t\t\tconst part = content[partIndex];\n\t\t\tif (part.type === \"image\" && typeof part.data === \"string\") continue;\n\t\t\tif (part.type !== \"text\" || typeof part.text !== \"string\") continue;\n\t\t\tconst graphemes = [...segmenter.segment(part.text)].map((item) => item.segment);\n\t\t\tif (graphemes.length <= maxChars) continue;\n\t\t\tconst kept = graphemes.slice(0, Math.max(0, maxChars - markerChars)).join(\"\");\n\t\t\tcontent = content === message.content ? content.slice() : content;\n\t\t\tcontent[partIndex] = { ...part, text: kept + CURSOR_TRUNCATION_MARKER };\n\t\t\tresult[messageIndex] = { ...message, content };\n\t\t\tchanged = true;\n\t\t}\n\t}\n\treturn { messages: result, changed };\n}\n\nfunction emptyToolResult(message: AgentMessage): AgentMessage {\n\tif (message.role !== \"toolResult\" || !Array.isArray(message.content)) return message;\n\tconst emptiedContent = message.content.map((part) =>\n\t\tpart.type === \"text\" ? { ...part, text: \"\" } : part.type === \"image\" ? { ...part, data: \"\" } : part,\n\t);\n\tconst content = emptiedContent.filter((part, index) => {\n\t\tif (index === 0) return true;\n\t\tconst previous = emptiedContent[index - 1];\n\t\tconst empty = part.type === \"text\" ? part.text === \"\" : part.type === \"image\" && part.data === \"\";\n\t\tconst previousEmpty =\n\t\t\tprevious.type === \"text\" ? previous.text === \"\" : previous.type === \"image\" && previous.data === \"\";\n\t\treturn !empty || !previousEmpty;\n\t});\n\treturn { ...message, content };\n}\n\n/**\n * Empties the oldest result bodies until the rest fits. The prefix search is\n * monotonic, so admission stays bounded instead of reserializing the whole\n * history once per tool result.\n */\nfunction blankOldestToolResults(\n\tmessages: AgentMessage[],\n\tfits: (candidate: AgentMessage[]) => boolean,\n): { readonly messages: AgentMessage[]; readonly count: number } {\n\tconst toolResultIndexes = messages.flatMap((message, index) =>\n\t\tmessage.role === \"toolResult\" && Array.isArray(message.content) ? [index] : [],\n\t);\n\tconst withEmptyPrefix = (count: number): AgentMessage[] => {\n\t\tconst candidate = messages.slice();\n\t\tfor (let i = 0; i < count; i++)\n\t\t\tcandidate[toolResultIndexes[i]] = emptyToolResult(candidate[toolResultIndexes[i]]);\n\t\treturn candidate;\n\t};\n\tlet low = 0;\n\tlet high = toolResultIndexes.length;\n\twhile (low < high) {\n\t\tconst middle = Math.floor((low + high) / 2);\n\t\tif (fits(withEmptyPrefix(middle + 1))) high = middle;\n\t\telse low = middle + 1;\n\t}\n\tconst count = Math.min(low + 1, toolResultIndexes.length);\n\treturn { messages: count > 0 ? withEmptyPrefix(count) : messages, count };\n}\n\n/**\n * Bounds one Cursor request: per-result caps first, then blanking the oldest\n * tool result bodies while the model input exceeds `budgetBytes`. Conversation\n * turns are never removed.\n */\nexport function admitCursorHistory(request: CursorAdmissionRequest): CursorAdmissionResult {\n\tconst { messages, budgetBytes } = request;\n\tif (!Array.isArray(messages) || messages.length === 0) {\n\t\treturn { messages, changed: false, blankedToolResults: 0, bytesBefore: 0, bytesAfter: 0, overBudget: false };\n\t}\n\tconst convert = request.convert ?? ((candidate: AgentMessage[]) => convertToLlm(candidate));\n\tconst capped = capToolResultBodies(messages, request.maxChars ?? CURSOR_TOOL_RESULT_MAX_CHARS);\n\tconst measure = (candidate: AgentMessage[]): number => {\n\t\tconst converted = convert(candidate);\n\t\tconst activeUserMessageIndex = converted.at(-1)?.role === \"user\" ? converted.length - 1 : -1;\n\t\treturn measureCursorModelInputSerializedBytes(converted, activeUserMessageIndex);\n\t};\n\n\tconst bytesBefore = measure(capped.messages);\n\tif (bytesBefore <= budgetBytes) {\n\t\treturn {\n\t\t\tmessages: capped.changed ? capped.messages : messages,\n\t\t\tchanged: capped.changed,\n\t\t\tblankedToolResults: 0,\n\t\t\tbytesBefore,\n\t\t\tbytesAfter: bytesBefore,\n\t\t\toverBudget: false,\n\t\t};\n\t}\n\n\tconst blanked = blankOldestToolResults(capped.messages, (candidate) => measure(candidate) <= budgetBytes);\n\tconst bytesAfter = blanked.count > 0 ? measure(blanked.messages) : bytesBefore;\n\tconst changed = capped.changed || blanked.count > 0;\n\treturn {\n\t\tmessages: changed ? blanked.messages : messages,\n\t\tchanged,\n\t\tblankedToolResults: blanked.count,\n\t\tbytesBefore,\n\t\tbytesAfter,\n\t\toverBudget: bytesAfter > budgetBytes,\n\t};\n}\n\n/**\n * Positional entry point kept for existing callers. An omitted `maxBytes`\n * applies the per-result cap only; the aggregate budget belongs to the caller\n * that knows the model window.\n */\nexport function truncateToolResultBodies(\n\tmessages: AgentMessage[] | undefined,\n\tmaxChars = CURSOR_TOOL_RESULT_MAX_CHARS,\n\tmaxBytes = Number.POSITIVE_INFINITY,\n\tconvert = (candidate: AgentMessage[]) => convertToLlm(candidate),\n): { messages: AgentMessage[] | undefined; changed: boolean } {\n\tconst admission = admitCursorHistory({ messages, budgetBytes: maxBytes, maxChars, convert });\n\treturn { messages: admission.messages, changed: admission.changed };\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"models.d.ts","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/cursor-cli-oauth/models.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AAU1D,MAAM,MAAM,6BAA6B,GAAG;IAC3C,QAAQ,CAAC,oBAAoB,CAAC,EAAE,MAAM,CAAC;IACvC,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAC;CACjC,CAAC;AAEF,MAAM,MAAM,yBAAyB,GAAG;IACvC,GAAG,EAAE,MAAM,MAAM,CAAC;IAClB,iBAAiB,EAAE,MAAM,MAAM,CAAC;IAChC,QAAQ,EAAE,CAAC,UAAU,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACvF,sBAAsB,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IAC5D,YAAY,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IAChD,aAAa,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC/C,aAAa,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACjE,UAAU,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACxD,eAAe,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CACjD,CAAC;AAEF,MAAM,MAAM,mCAAmC,GAAG;IACjD,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,QAAQ,CAAC,EAAE,6BAA6B,CAAC;IAClD,QAAQ,CAAC,IAAI,CAAC,EAAE,OAAO,CAAC,yBAAyB,CAAC,CAAC;CACnD,CAAC;AA+DF,eAAO,MAAM,wBAAwB,EAAE,SAAS,mBAAmB,EAA+C,CAAC;AAEnH,wFAAwF;AACxF,wBAAgB,6BAA6B,CAAC,OAAO,EAAE,MAAM,GAAG,mBAAmB,EAAE,CAiBpF;AA6ID,0FAA0F;AAC1F,wBAAsB,4BAA4B,CACjD,OAAO,EAAE,mCAAmC,GAC1C,OAAO,CAAC,SAAS,mBAAmB,EAAE,CAAC,CAkCzC"}
1
+ {"version":3,"file":"models.d.ts","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/cursor-cli-oauth/models.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AAU1D,MAAM,MAAM,6BAA6B,GAAG;IAC3C,QAAQ,CAAC,oBAAoB,CAAC,EAAE,MAAM,CAAC;IACvC,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAC;CACjC,CAAC;AAEF,MAAM,MAAM,yBAAyB,GAAG;IACvC,GAAG,EAAE,MAAM,MAAM,CAAC;IAClB,iBAAiB,EAAE,MAAM,MAAM,CAAC;IAChC,QAAQ,EAAE,CAAC,UAAU,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACvF,sBAAsB,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IAC5D,YAAY,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IAChD,aAAa,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC/C,aAAa,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACjE,UAAU,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACxD,eAAe,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CACjD,CAAC;AAEF,MAAM,MAAM,mCAAmC,GAAG;IACjD,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,QAAQ,CAAC,EAAE,6BAA6B,CAAC;IAClD,QAAQ,CAAC,IAAI,CAAC,EAAE,OAAO,CAAC,yBAAyB,CAAC,CAAC;CACnD,CAAC;AA+DF,eAAO,MAAM,wBAAwB,EAAE,SAAS,mBAAmB,EAA+C,CAAC;AAEnH,wFAAwF;AACxF,wBAAgB,6BAA6B,CAAC,OAAO,EAAE,MAAM,GAAG,mBAAmB,EAAE,CAiBpF;AA6ID,0FAA0F;AAC1F,wBAAsB,4BAA4B,CACjD,OAAO,EAAE,mCAAmC,GAC1C,OAAO,CAAC,SAAS,mBAAmB,EAAE,CAAC,CAkCzC"}
@@ -3,6 +3,7 @@ import { mkdir, mkdtemp, open, readFile, rename, rm, writeFile } from "node:fs/p
3
3
  import { tmpdir } from "node:os";
4
4
  import { join } from "node:path";
5
5
  import { normalizeCursorCatalog } from "@earendil-works/pi-ai";
6
+ import { resolveCursorContextWindow } from "@earendil-works/pi-ai/utils/cursor-context-limit";
6
7
  import { defaultCursorAgentExecutableDeps, resolveCursorAgentExecutable } from "./executable.js";
7
8
  const MODEL_PROBE_TIMEOUT_MS = 15_000;
8
9
  const DEFAULT_MODEL_CATALOG_TTL_HOURS = 24;
@@ -38,7 +39,7 @@ function normalizeEntries(raw) {
38
39
  ...(entry.thinkingLevelMap ? { thinkingLevelMap: entry.thinkingLevelMap } : {}),
39
40
  input: ["text"],
40
41
  cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 },
41
- contextWindow: entry.window,
42
+ contextWindow: resolveCursorContextWindow(entry.id, entry.window),
42
43
  maxTokens: 64_000,
43
44
  ...(entry.representativeVariantId !== undefined && entry.representativeVariantId !== entry.id
44
45
  ? { upstreamModelId: entry.representativeVariantId }
@@ -1 +1 @@
1
- {"version":3,"file":"models.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/cursor-cli-oauth/models.ts"],"names":[],"mappings":"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","sourcesContent":["import { spawn } from \"node:child_process\";\nimport { mkdir, mkdtemp, open, readFile, rename, rm, writeFile } from \"node:fs/promises\";\nimport { tmpdir } from \"node:os\";\nimport { join } from \"node:path\";\nimport { normalizeCursorCatalog } from \"@earendil-works/pi-ai\";\nimport type { ProviderModelConfig } from \"../../types.ts\";\nimport { defaultCursorAgentExecutableDeps, resolveCursorAgentExecutable } from \"./executable.ts\";\n\nconst MODEL_PROBE_TIMEOUT_MS = 15_000;\nconst DEFAULT_MODEL_CATALOG_TTL_HOURS = 24;\nconst ANSI_ESCAPE_SEQUENCE = /\\u001B(?:[@-Z\\\\-_]|\\[[0-?]*[ -/]*[@-~])/g;\nconst MODEL_LINE = /^(\\S+)\\s+-\\s+(.+)$/;\nconst MODEL_ID = /^[A-Za-z0-9][A-Za-z0-9._/:+-]*$/;\nconst MISLEADING_ERROR_LINE = /^\\s*(?:error|failed|failure)(?=\\s|:|-|$)/i;\n\nexport type CursorCliModelCatalogSettings = {\n\treadonly modelCatalogTtlHours?: number;\n\treadonly executablePath?: string;\n};\n\nexport type CursorCliModelCatalogDeps = {\n\tnow: () => number;\n\tresolveExecutable: () => string;\n\trunProbe: (executable: string, stdoutPath: string, timeoutMs: number) => Promise<void>;\n\tmakeTemporaryDirectory: (prefix: string) => Promise<string>;\n\treadTextFile: (path: string) => Promise<string>;\n\tmakeDirectory: (path: string) => Promise<void>;\n\twriteTextFile: (path: string, contents: string) => Promise<void>;\n\trenameFile: (from: string, to: string) => Promise<void>;\n\tremoveDirectory: (path: string) => Promise<void>;\n};\n\nexport type ResolveCursorCliModelCatalogOptions = {\n\treadonly agentDir: string;\n\treadonly settings?: CursorCliModelCatalogSettings;\n\treadonly deps?: Partial<CursorCliModelCatalogDeps>;\n};\n\ntype CachedModelCatalog = {\n\treadonly cachedAt: number;\n\treadonly models: readonly ProviderModelConfig[];\n};\n\ntype StaticModelDefinition = {\n\treadonly id: string;\n\treadonly label: string;\n};\n\nconst STATIC_MODEL_DEFINITIONS: readonly StaticModelDefinition[] = [\n\t{ id: \"auto\", label: \"Auto\" },\n\t{ id: \"composer-2.5\", label: \"Composer 2.5 (200K context)\" },\n\t{ id: \"composer-2.5-fast\", label: \"Composer 2.5 Fast (200K context)\" },\n\t{ id: \"gpt-5.6-sol-high\", label: \"GPT 5.6 SOL High (272K context)\" },\n\t{ id: \"gpt-5.6-luna-high\", label: \"GPT 5.6 Luna High (272K context)\" },\n\t{ id: \"gpt-5.5-high\", label: \"GPT 5.5 High (272K context)\" },\n\t{ id: \"gpt-5.3-codex\", label: \"GPT 5.3 Codex (272K context)\" },\n\t{ id: \"gpt-5.2\", label: \"GPT 5.2 (272K context)\" },\n\t{ id: \"claude-opus-5-high\", label: \"Claude Opus 5 High (300K context)\" },\n\t{ id: \"claude-opus-5-thinking-high\", label: \"Claude Opus 5 Thinking High (300K context)\" },\n\t{ id: \"claude-opus-4-8-thinking-high\", label: \"Claude Opus 4.8 Thinking High (300K context)\" },\n\t{ id: \"claude-fable-5-thinking-high\", label: \"Claude Fable 5 Thinking High (300K context)\" },\n\t{ id: \"claude-sonnet-5-thinking-high\", label: \"Claude Sonnet 5 Thinking High (300K context)\" },\n\t{ id: \"gemini-3.7-flash-high\", label: \"Gemini 3.7 Flash High (1M context)\" },\n\t{ id: \"cursor-grok-4.6-high\", label: \"Cursor Grok 4.6 High (200K context)\" },\n];\n\nfunction stripAnsi(value: string): string {\n\treturn value.replace(ANSI_ESCAPE_SEQUENCE, \"\");\n}\n\nfunction normalizeEntries(raw: readonly { id: string; label: string }[]): ProviderModelConfig[] {\n\treturn normalizeCursorCatalog(\n\t\traw.map(({ id, label }) => ({ id, name: label, input: [\"text\"] as const, cursorMaxMode: false })),\n\t).map((entry) => ({\n\t\tid: entry.id,\n\t\tname: entry.name,\n\t\treasoning: entry.reasoning,\n\t\t...(entry.thinkingLevelMap ? { thinkingLevelMap: entry.thinkingLevelMap } : {}),\n\t\tinput: [\"text\"] as (\"text\" | \"image\")[],\n\t\tcost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 },\n\t\tcontextWindow: entry.window,\n\t\tmaxTokens: 64_000,\n\t\t...(entry.representativeVariantId !== undefined && entry.representativeVariantId !== entry.id\n\t\t\t? { upstreamModelId: entry.representativeVariantId }\n\t\t\t: {}),\n\t\tcompat: {\n\t\t\t...(entry.capabilityId !== undefined && entry.representativeVariantId !== undefined\n\t\t\t\t? {\n\t\t\t\t\t\tcursorReasoning: {\n\t\t\t\t\t\t\tcapabilityId: entry.capabilityId,\n\t\t\t\t\t\t\t...(entry.thinkingMode !== undefined ? { thinkingMode: entry.thinkingMode } : {}),\n\t\t\t\t\t\t\trepresentativeVariantId: entry.representativeVariantId,\n\t\t\t\t\t\t},\n\t\t\t\t\t}\n\t\t\t\t: {}),\n\t\t},\n\t}));\n}\n\nexport const STATIC_CURSOR_CLI_MODELS: readonly ProviderModelConfig[] = normalizeEntries(STATIC_MODEL_DEFINITIONS);\n\n/** Parse the complete `cursor-agent models` listing into extension provider entries. */\nexport function parseCursorAgentModelsListing(listing: string): ProviderModelConfig[] {\n\tconst plainListing = stripAnsi(listing);\n\tconst lines = plainListing.split(/\\r?\\n/);\n\tif (lines.some((line) => MISLEADING_ERROR_LINE.test(line))) return [];\n\n\tconst seen = new Set<string>();\n\tconst raw: { id: string; label: string }[] = [];\n\tfor (const rawLine of lines) {\n\t\tconst match = MODEL_LINE.exec(rawLine.trim());\n\t\tif (!match) continue;\n\t\tconst id = match[1];\n\t\tconst label = match[2].trim();\n\t\tif (!MODEL_ID.test(id) || label.length === 0 || seen.has(id)) continue;\n\t\tseen.add(id);\n\t\traw.push({ id, label });\n\t}\n\treturn normalizeEntries(raw);\n}\n\nasync function runModelsProbe(executable: string, stdoutPath: string, timeoutMs: number): Promise<void> {\n\tconst output = await open(stdoutPath, \"w\");\n\ttry {\n\t\tawait new Promise<void>((resolve, reject) => {\n\t\t\tconst child = spawn(executable, [\"models\"], {\n\t\t\t\tstdio: [\"ignore\", output.fd, \"ignore\"],\n\t\t\t});\n\t\t\tlet timedOut = false;\n\t\t\tlet settled = false;\n\t\t\tconst finish = (error?: Error): void => {\n\t\t\t\tif (settled) return;\n\t\t\t\tsettled = true;\n\t\t\t\tclearTimeout(deadline);\n\t\t\t\tif (error) reject(error);\n\t\t\t\telse resolve();\n\t\t\t};\n\t\t\tconst deadline = setTimeout(() => {\n\t\t\t\ttimedOut = true;\n\t\t\t\tchild.kill(\"SIGKILL\");\n\t\t\t}, timeoutMs);\n\t\t\tchild.once(\"error\", (error) => finish(error));\n\t\t\tchild.once(\"close\", (code, signal) => {\n\t\t\t\tif (timedOut) {\n\t\t\t\t\tfinish(new Error(`cursor-agent models exceeded its ${timeoutMs}ms deadline`));\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tif (code !== 0) {\n\t\t\t\t\tfinish(new Error(`cursor-agent models failed with code ${String(code)} and signal ${String(signal)}`));\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tfinish();\n\t\t\t});\n\t\t});\n\t} finally {\n\t\tawait output.close();\n\t}\n}\n\nfunction defaultDeps(settings: CursorCliModelCatalogSettings): CursorCliModelCatalogDeps {\n\treturn {\n\t\tnow: Date.now,\n\t\tresolveExecutable: () => {\n\t\t\tconst executableDeps = defaultCursorAgentExecutableDeps();\n\t\t\treturn resolveCursorAgentExecutable({\n\t\t\t\t...executableDeps,\n\t\t\t\tsettings: { executablePath: settings.executablePath },\n\t\t\t});\n\t\t},\n\t\trunProbe: runModelsProbe,\n\t\tmakeTemporaryDirectory: (prefix) => mkdtemp(prefix),\n\t\treadTextFile: (path) => readFile(path, \"utf8\"),\n\t\tmakeDirectory: async (path) => {\n\t\t\tawait mkdir(path, { recursive: true });\n\t\t},\n\t\twriteTextFile: async (path, contents) => {\n\t\t\tawait writeFile(path, contents, \"utf8\");\n\t\t},\n\t\trenameFile: async (from, to) => {\n\t\t\tawait rename(from, to);\n\t\t},\n\t\tremoveDirectory: async (path) => {\n\t\t\tawait rm(path, { recursive: true, force: true });\n\t\t},\n\t};\n}\n\nfunction catalogTtlMs(settings: CursorCliModelCatalogSettings): number {\n\tconst hours = settings.modelCatalogTtlHours;\n\tconst validHours =\n\t\ttypeof hours === \"number\" && Number.isFinite(hours) && hours > 0 ? hours : DEFAULT_MODEL_CATALOG_TTL_HOURS;\n\treturn validHours * 60 * 60 * 1_000;\n}\n\nfunction parseCachedCatalog(contents: string): CachedModelCatalog | undefined {\n\tlet parsed: unknown;\n\ttry {\n\t\tparsed = JSON.parse(contents);\n\t} catch {\n\t\treturn undefined;\n\t}\n\tif (typeof parsed !== \"object\" || parsed === null || !(\"cachedAt\" in parsed) || !(\"models\" in parsed)) {\n\t\treturn undefined;\n\t}\n\tconst cachedAt = parsed.cachedAt;\n\tconst models = parsed.models;\n\tif (typeof cachedAt !== \"number\" || !Number.isFinite(cachedAt) || !Array.isArray(models) || models.length === 0) {\n\t\treturn undefined;\n\t}\n\n\tconst rawCached: { id: string; label: string }[] = [];\n\tconst seen = new Set<string>();\n\tfor (const candidate of models) {\n\t\tif (typeof candidate !== \"object\" || candidate === null || !(\"id\" in candidate) || !(\"name\" in candidate)) {\n\t\t\treturn undefined;\n\t\t}\n\t\tconst id = candidate.id;\n\t\tconst name = candidate.name;\n\t\tif (\n\t\t\ttypeof id !== \"string\" ||\n\t\t\t!MODEL_ID.test(id) ||\n\t\t\ttypeof name !== \"string\" ||\n\t\t\tname.length === 0 ||\n\t\t\tseen.has(id)\n\t\t) {\n\t\t\treturn undefined;\n\t\t}\n\t\tseen.add(id);\n\t\trawCached.push({ id, label: name });\n\t}\n\treturn { cachedAt, models: normalizeEntries(rawCached) };\n}\n\nasync function readFreshCache(\n\tcachePath: string,\n\tnow: number,\n\tttlMs: number,\n\tdeps: CursorCliModelCatalogDeps,\n): Promise<readonly ProviderModelConfig[] | undefined> {\n\ttry {\n\t\tconst cached = parseCachedCatalog(await deps.readTextFile(cachePath));\n\t\tif (!cached || now < cached.cachedAt || now - cached.cachedAt >= ttlMs) return undefined;\n\t\treturn cached.models;\n\t} catch {\n\t\treturn undefined;\n\t}\n}\n\nasync function writeCache(\n\tcacheDirectory: string,\n\tcachePath: string,\n\tcatalog: CachedModelCatalog,\n\tdeps: CursorCliModelCatalogDeps,\n): Promise<void> {\n\tconst temporaryPath = `${cachePath}.${process.pid}.${catalog.cachedAt}.tmp`;\n\tawait deps.makeDirectory(cacheDirectory);\n\tawait deps.writeTextFile(temporaryPath, `${JSON.stringify(catalog, null, 2)}\\n`);\n\tawait deps.renameFile(temporaryPath, cachePath);\n}\n\n/** Resolve a cached or probed catalog, always degrading to the exact offline fallback. */\nexport async function resolveCursorCliModelCatalog(\n\toptions: ResolveCursorCliModelCatalogOptions,\n): Promise<readonly ProviderModelConfig[]> {\n\tconst settings = options.settings ?? {};\n\tconst deps = { ...defaultDeps(settings), ...options.deps };\n\tconst cacheDirectory = join(options.agentDir, \"cursor-cli-oauth\");\n\tconst cachePath = join(cacheDirectory, \"models.json\");\n\tconst now = deps.now();\n\tconst cached = await readFreshCache(cachePath, now, catalogTtlMs(settings), deps);\n\tif (cached) return cached;\n\n\tlet temporaryDirectory: string | undefined;\n\ttry {\n\t\tconst executable = deps.resolveExecutable();\n\t\ttemporaryDirectory = await deps.makeTemporaryDirectory(join(tmpdir(), \"senpi-cursor-models-\"));\n\t\tconst stdoutPath = join(temporaryDirectory, \"stdout.txt\");\n\t\tawait deps.runProbe(executable, stdoutPath, MODEL_PROBE_TIMEOUT_MS);\n\t\tconst models = parseCursorAgentModelsListing(await deps.readTextFile(stdoutPath));\n\t\tif (models.length === 0) return STATIC_CURSOR_CLI_MODELS;\n\t\ttry {\n\t\t\tawait writeCache(cacheDirectory, cachePath, { cachedAt: now, models }, deps);\n\t\t} catch {\n\t\t\t// A read-only cache directory must not prevent provider registration.\n\t\t}\n\t\treturn models;\n\t} catch {\n\t\treturn STATIC_CURSOR_CLI_MODELS;\n\t} finally {\n\t\tif (temporaryDirectory !== undefined) {\n\t\t\ttry {\n\t\t\t\tawait deps.removeDirectory(temporaryDirectory);\n\t\t\t} catch {\n\t\t\t\t// Best-effort cleanup must not replace the catalog result.\n\t\t\t}\n\t\t}\n\t}\n}\n"]}
1
+ {"version":3,"file":"models.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/cursor-cli-oauth/models.ts"],"names":[],"mappings":"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","sourcesContent":["import { spawn } from \"node:child_process\";\nimport { mkdir, mkdtemp, open, readFile, rename, rm, writeFile } from \"node:fs/promises\";\nimport { tmpdir } from \"node:os\";\nimport { join } from \"node:path\";\nimport { normalizeCursorCatalog } from \"@earendil-works/pi-ai\";\nimport { resolveCursorContextWindow } from \"@earendil-works/pi-ai/utils/cursor-context-limit\";\nimport type { ProviderModelConfig } from \"../../types.ts\";\nimport { defaultCursorAgentExecutableDeps, resolveCursorAgentExecutable } from \"./executable.ts\";\n\nconst MODEL_PROBE_TIMEOUT_MS = 15_000;\nconst DEFAULT_MODEL_CATALOG_TTL_HOURS = 24;\nconst ANSI_ESCAPE_SEQUENCE = /\\u001B(?:[@-Z\\\\-_]|\\[[0-?]*[ -/]*[@-~])/g;\nconst MODEL_LINE = /^(\\S+)\\s+-\\s+(.+)$/;\nconst MODEL_ID = /^[A-Za-z0-9][A-Za-z0-9._/:+-]*$/;\nconst MISLEADING_ERROR_LINE = /^\\s*(?:error|failed|failure)(?=\\s|:|-|$)/i;\n\nexport type CursorCliModelCatalogSettings = {\n\treadonly modelCatalogTtlHours?: number;\n\treadonly executablePath?: string;\n};\n\nexport type CursorCliModelCatalogDeps = {\n\tnow: () => number;\n\tresolveExecutable: () => string;\n\trunProbe: (executable: string, stdoutPath: string, timeoutMs: number) => Promise<void>;\n\tmakeTemporaryDirectory: (prefix: string) => Promise<string>;\n\treadTextFile: (path: string) => Promise<string>;\n\tmakeDirectory: (path: string) => Promise<void>;\n\twriteTextFile: (path: string, contents: string) => Promise<void>;\n\trenameFile: (from: string, to: string) => Promise<void>;\n\tremoveDirectory: (path: string) => Promise<void>;\n};\n\nexport type ResolveCursorCliModelCatalogOptions = {\n\treadonly agentDir: string;\n\treadonly settings?: CursorCliModelCatalogSettings;\n\treadonly deps?: Partial<CursorCliModelCatalogDeps>;\n};\n\ntype CachedModelCatalog = {\n\treadonly cachedAt: number;\n\treadonly models: readonly ProviderModelConfig[];\n};\n\ntype StaticModelDefinition = {\n\treadonly id: string;\n\treadonly label: string;\n};\n\nconst STATIC_MODEL_DEFINITIONS: readonly StaticModelDefinition[] = [\n\t{ id: \"auto\", label: \"Auto\" },\n\t{ id: \"composer-2.5\", label: \"Composer 2.5 (200K context)\" },\n\t{ id: \"composer-2.5-fast\", label: \"Composer 2.5 Fast (200K context)\" },\n\t{ id: \"gpt-5.6-sol-high\", label: \"GPT 5.6 SOL High (272K context)\" },\n\t{ id: \"gpt-5.6-luna-high\", label: \"GPT 5.6 Luna High (272K context)\" },\n\t{ id: \"gpt-5.5-high\", label: \"GPT 5.5 High (272K context)\" },\n\t{ id: \"gpt-5.3-codex\", label: \"GPT 5.3 Codex (272K context)\" },\n\t{ id: \"gpt-5.2\", label: \"GPT 5.2 (272K context)\" },\n\t{ id: \"claude-opus-5-high\", label: \"Claude Opus 5 High (300K context)\" },\n\t{ id: \"claude-opus-5-thinking-high\", label: \"Claude Opus 5 Thinking High (300K context)\" },\n\t{ id: \"claude-opus-4-8-thinking-high\", label: \"Claude Opus 4.8 Thinking High (300K context)\" },\n\t{ id: \"claude-fable-5-thinking-high\", label: \"Claude Fable 5 Thinking High (300K context)\" },\n\t{ id: \"claude-sonnet-5-thinking-high\", label: \"Claude Sonnet 5 Thinking High (300K context)\" },\n\t{ id: \"gemini-3.7-flash-high\", label: \"Gemini 3.7 Flash High (1M context)\" },\n\t{ id: \"cursor-grok-4.6-high\", label: \"Cursor Grok 4.6 High (200K context)\" },\n];\n\nfunction stripAnsi(value: string): string {\n\treturn value.replace(ANSI_ESCAPE_SEQUENCE, \"\");\n}\n\nfunction normalizeEntries(raw: readonly { id: string; label: string }[]): ProviderModelConfig[] {\n\treturn normalizeCursorCatalog(\n\t\traw.map(({ id, label }) => ({ id, name: label, input: [\"text\"] as const, cursorMaxMode: false })),\n\t).map((entry) => ({\n\t\tid: entry.id,\n\t\tname: entry.name,\n\t\treasoning: entry.reasoning,\n\t\t...(entry.thinkingLevelMap ? { thinkingLevelMap: entry.thinkingLevelMap } : {}),\n\t\tinput: [\"text\"] as (\"text\" | \"image\")[],\n\t\tcost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 },\n\t\tcontextWindow: resolveCursorContextWindow(entry.id, entry.window),\n\t\tmaxTokens: 64_000,\n\t\t...(entry.representativeVariantId !== undefined && entry.representativeVariantId !== entry.id\n\t\t\t? { upstreamModelId: entry.representativeVariantId }\n\t\t\t: {}),\n\t\tcompat: {\n\t\t\t...(entry.capabilityId !== undefined && entry.representativeVariantId !== undefined\n\t\t\t\t? {\n\t\t\t\t\t\tcursorReasoning: {\n\t\t\t\t\t\t\tcapabilityId: entry.capabilityId,\n\t\t\t\t\t\t\t...(entry.thinkingMode !== undefined ? { thinkingMode: entry.thinkingMode } : {}),\n\t\t\t\t\t\t\trepresentativeVariantId: entry.representativeVariantId,\n\t\t\t\t\t\t},\n\t\t\t\t\t}\n\t\t\t\t: {}),\n\t\t},\n\t}));\n}\n\nexport const STATIC_CURSOR_CLI_MODELS: readonly ProviderModelConfig[] = normalizeEntries(STATIC_MODEL_DEFINITIONS);\n\n/** Parse the complete `cursor-agent models` listing into extension provider entries. */\nexport function parseCursorAgentModelsListing(listing: string): ProviderModelConfig[] {\n\tconst plainListing = stripAnsi(listing);\n\tconst lines = plainListing.split(/\\r?\\n/);\n\tif (lines.some((line) => MISLEADING_ERROR_LINE.test(line))) return [];\n\n\tconst seen = new Set<string>();\n\tconst raw: { id: string; label: string }[] = [];\n\tfor (const rawLine of lines) {\n\t\tconst match = MODEL_LINE.exec(rawLine.trim());\n\t\tif (!match) continue;\n\t\tconst id = match[1];\n\t\tconst label = match[2].trim();\n\t\tif (!MODEL_ID.test(id) || label.length === 0 || seen.has(id)) continue;\n\t\tseen.add(id);\n\t\traw.push({ id, label });\n\t}\n\treturn normalizeEntries(raw);\n}\n\nasync function runModelsProbe(executable: string, stdoutPath: string, timeoutMs: number): Promise<void> {\n\tconst output = await open(stdoutPath, \"w\");\n\ttry {\n\t\tawait new Promise<void>((resolve, reject) => {\n\t\t\tconst child = spawn(executable, [\"models\"], {\n\t\t\t\tstdio: [\"ignore\", output.fd, \"ignore\"],\n\t\t\t});\n\t\t\tlet timedOut = false;\n\t\t\tlet settled = false;\n\t\t\tconst finish = (error?: Error): void => {\n\t\t\t\tif (settled) return;\n\t\t\t\tsettled = true;\n\t\t\t\tclearTimeout(deadline);\n\t\t\t\tif (error) reject(error);\n\t\t\t\telse resolve();\n\t\t\t};\n\t\t\tconst deadline = setTimeout(() => {\n\t\t\t\ttimedOut = true;\n\t\t\t\tchild.kill(\"SIGKILL\");\n\t\t\t}, timeoutMs);\n\t\t\tchild.once(\"error\", (error) => finish(error));\n\t\t\tchild.once(\"close\", (code, signal) => {\n\t\t\t\tif (timedOut) {\n\t\t\t\t\tfinish(new Error(`cursor-agent models exceeded its ${timeoutMs}ms deadline`));\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tif (code !== 0) {\n\t\t\t\t\tfinish(new Error(`cursor-agent models failed with code ${String(code)} and signal ${String(signal)}`));\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tfinish();\n\t\t\t});\n\t\t});\n\t} finally {\n\t\tawait output.close();\n\t}\n}\n\nfunction defaultDeps(settings: CursorCliModelCatalogSettings): CursorCliModelCatalogDeps {\n\treturn {\n\t\tnow: Date.now,\n\t\tresolveExecutable: () => {\n\t\t\tconst executableDeps = defaultCursorAgentExecutableDeps();\n\t\t\treturn resolveCursorAgentExecutable({\n\t\t\t\t...executableDeps,\n\t\t\t\tsettings: { executablePath: settings.executablePath },\n\t\t\t});\n\t\t},\n\t\trunProbe: runModelsProbe,\n\t\tmakeTemporaryDirectory: (prefix) => mkdtemp(prefix),\n\t\treadTextFile: (path) => readFile(path, \"utf8\"),\n\t\tmakeDirectory: async (path) => {\n\t\t\tawait mkdir(path, { recursive: true });\n\t\t},\n\t\twriteTextFile: async (path, contents) => {\n\t\t\tawait writeFile(path, contents, \"utf8\");\n\t\t},\n\t\trenameFile: async (from, to) => {\n\t\t\tawait rename(from, to);\n\t\t},\n\t\tremoveDirectory: async (path) => {\n\t\t\tawait rm(path, { recursive: true, force: true });\n\t\t},\n\t};\n}\n\nfunction catalogTtlMs(settings: CursorCliModelCatalogSettings): number {\n\tconst hours = settings.modelCatalogTtlHours;\n\tconst validHours =\n\t\ttypeof hours === \"number\" && Number.isFinite(hours) && hours > 0 ? hours : DEFAULT_MODEL_CATALOG_TTL_HOURS;\n\treturn validHours * 60 * 60 * 1_000;\n}\n\nfunction parseCachedCatalog(contents: string): CachedModelCatalog | undefined {\n\tlet parsed: unknown;\n\ttry {\n\t\tparsed = JSON.parse(contents);\n\t} catch {\n\t\treturn undefined;\n\t}\n\tif (typeof parsed !== \"object\" || parsed === null || !(\"cachedAt\" in parsed) || !(\"models\" in parsed)) {\n\t\treturn undefined;\n\t}\n\tconst cachedAt = parsed.cachedAt;\n\tconst models = parsed.models;\n\tif (typeof cachedAt !== \"number\" || !Number.isFinite(cachedAt) || !Array.isArray(models) || models.length === 0) {\n\t\treturn undefined;\n\t}\n\n\tconst rawCached: { id: string; label: string }[] = [];\n\tconst seen = new Set<string>();\n\tfor (const candidate of models) {\n\t\tif (typeof candidate !== \"object\" || candidate === null || !(\"id\" in candidate) || !(\"name\" in candidate)) {\n\t\t\treturn undefined;\n\t\t}\n\t\tconst id = candidate.id;\n\t\tconst name = candidate.name;\n\t\tif (\n\t\t\ttypeof id !== \"string\" ||\n\t\t\t!MODEL_ID.test(id) ||\n\t\t\ttypeof name !== \"string\" ||\n\t\t\tname.length === 0 ||\n\t\t\tseen.has(id)\n\t\t) {\n\t\t\treturn undefined;\n\t\t}\n\t\tseen.add(id);\n\t\trawCached.push({ id, label: name });\n\t}\n\treturn { cachedAt, models: normalizeEntries(rawCached) };\n}\n\nasync function readFreshCache(\n\tcachePath: string,\n\tnow: number,\n\tttlMs: number,\n\tdeps: CursorCliModelCatalogDeps,\n): Promise<readonly ProviderModelConfig[] | undefined> {\n\ttry {\n\t\tconst cached = parseCachedCatalog(await deps.readTextFile(cachePath));\n\t\tif (!cached || now < cached.cachedAt || now - cached.cachedAt >= ttlMs) return undefined;\n\t\treturn cached.models;\n\t} catch {\n\t\treturn undefined;\n\t}\n}\n\nasync function writeCache(\n\tcacheDirectory: string,\n\tcachePath: string,\n\tcatalog: CachedModelCatalog,\n\tdeps: CursorCliModelCatalogDeps,\n): Promise<void> {\n\tconst temporaryPath = `${cachePath}.${process.pid}.${catalog.cachedAt}.tmp`;\n\tawait deps.makeDirectory(cacheDirectory);\n\tawait deps.writeTextFile(temporaryPath, `${JSON.stringify(catalog, null, 2)}\\n`);\n\tawait deps.renameFile(temporaryPath, cachePath);\n}\n\n/** Resolve a cached or probed catalog, always degrading to the exact offline fallback. */\nexport async function resolveCursorCliModelCatalog(\n\toptions: ResolveCursorCliModelCatalogOptions,\n): Promise<readonly ProviderModelConfig[]> {\n\tconst settings = options.settings ?? {};\n\tconst deps = { ...defaultDeps(settings), ...options.deps };\n\tconst cacheDirectory = join(options.agentDir, \"cursor-cli-oauth\");\n\tconst cachePath = join(cacheDirectory, \"models.json\");\n\tconst now = deps.now();\n\tconst cached = await readFreshCache(cachePath, now, catalogTtlMs(settings), deps);\n\tif (cached) return cached;\n\n\tlet temporaryDirectory: string | undefined;\n\ttry {\n\t\tconst executable = deps.resolveExecutable();\n\t\ttemporaryDirectory = await deps.makeTemporaryDirectory(join(tmpdir(), \"senpi-cursor-models-\"));\n\t\tconst stdoutPath = join(temporaryDirectory, \"stdout.txt\");\n\t\tawait deps.runProbe(executable, stdoutPath, MODEL_PROBE_TIMEOUT_MS);\n\t\tconst models = parseCursorAgentModelsListing(await deps.readTextFile(stdoutPath));\n\t\tif (models.length === 0) return STATIC_CURSOR_CLI_MODELS;\n\t\ttry {\n\t\t\tawait writeCache(cacheDirectory, cachePath, { cachedAt: now, models }, deps);\n\t\t} catch {\n\t\t\t// A read-only cache directory must not prevent provider registration.\n\t\t}\n\t\treturn models;\n\t} catch {\n\t\treturn STATIC_CURSOR_CLI_MODELS;\n\t} finally {\n\t\tif (temporaryDirectory !== undefined) {\n\t\t\ttry {\n\t\t\t\tawait deps.removeDirectory(temporaryDirectory);\n\t\t\t} catch {\n\t\t\t\t// Best-effort cleanup must not replace the catalog result.\n\t\t\t}\n\t\t}\n\t}\n}\n"]}
@@ -263,6 +263,8 @@ export declare class SessionManager {
263
263
  setSessionFile(sessionFile: string): void;
264
264
  private _setSessionFile;
265
265
  newSession(options?: NewSessionOptions): string | undefined;
266
+ /** Resets every in-memory field onto a fresh header. Allocates no session path. */
267
+ private _resetToNewSession;
266
268
  private _buildIndex;
267
269
  private _rewriteFile;
268
270
  isPersisted(): boolean;
@@ -1 +1 @@
1
- {"version":3,"file":"session-manager.d.ts","sourceRoot":"","sources":["../../src/core/session-manager.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"session-manager.d.ts","sourceRoot":"","sources":["../../src/core/session-manager.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;AAClE,OAAO,KAAK,EAAE,YAAY,EAAE,OAAO,EAAE,WAAW,EAAE,iBAAiB,EAAE,KAAK,EAAE,MAAM,uBAAuB,CAAC;AAmB1G,OAAO,EAAyC,KAAK,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAEzG,OAAO,EAAE,KAAK,kBAAkB,EAAuB,MAAM,6BAA6B,CAAC;AAG3F,YAAY,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAuBlE,OAAO,EACN,KAAK,oBAAoB,EAEzB,KAAK,aAAa,EAIlB,MAAM,eAAe,CAAC;AAIvB,8FAA8F;AAC9F,eAAO,MAAM,wBAAwB,8BAA8B,CAAC;AAOpE,6EAA6E;AAC7E,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,YAAY,GAAG,MAAM,GAAG,SAAS,CAElF;AAED,MAAM,WAAW,WAAW;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,kBAAkB,EAAE,MAAM,GAAG,SAAS,CAAC;CACvC;AAED,eAAO,MAAM,uBAAuB,IAAI,CAAC;AAEzC,MAAM,WAAW,aAAa;IAC7B,IAAI,EAAE,SAAS,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,GAAG,EAAE,MAAM,CAAC;IACZ,aAAa,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,iBAAiB;IACjC,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,aAAa,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,gBAAgB;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,SAAS,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,mBAAoB,SAAQ,gBAAgB;IAC5D,IAAI,EAAE,SAAS,CAAC;IAChB,OAAO,EAAE,YAAY,CAAC;CACtB;AAED,MAAM,WAAW,wBAAyB,SAAQ,gBAAgB;IACjE,IAAI,EAAE,uBAAuB,CAAC;IAC9B,aAAa,EAAE,MAAM,CAAC;IACtB,2FAA2F;IAC3F,iBAAiB,CAAC,EAAE,iBAAiB,CAAC;CACtC;AAED,MAAM,WAAW,wBAAyB,SAAQ,gBAAgB;IACjE,IAAI,EAAE,sBAAsB,CAAC;IAC7B,SAAS,EAAE;QAAE,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;CAC9B;AAED,MAAM,WAAW,gBAAiB,SAAQ,gBAAgB;IACzD,IAAI,EAAE,cAAc,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,8EAA8E;IAC9E,MAAM,CAAC,EAAE,UAAU,GAAG,iBAAiB,CAAC;IACxC,mFAAmF;IACnF,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,eAAe,CAAC,EAAE,MAAM,CAAC;CACzB;AAED;;;;;;;;;;GAUG;AACH,MAAM,WAAW,wBAAyB,SAAQ,gBAAgB;IACjE,IAAI,EAAE,uBAAuB,CAAC;IAC9B,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,gBAAgB,GAAG,MAAM,CAAC;IAClC;;;;OAIG;IACH,MAAM,EAAE,MAAM,CAAC;IACf,kEAAkE;IAClE,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,mBAAmB,CAAC,EAAE,MAAM,CAAC;CAC7B;AAED,MAAM,WAAW,eAAe,CAAC,CAAC,GAAG,OAAO,CAAE,SAAQ,gBAAgB;IACrE,IAAI,EAAE,YAAY,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,gBAAgB,EAAE,MAAM,CAAC;IACzB,YAAY,EAAE,MAAM,CAAC;IACrB,+FAA+F;IAC/F,OAAO,CAAC,EAAE,CAAC,CAAC;IACZ,2EAA2E;IAC3E,KAAK,CAAC,EAAE,KAAK,CAAC;IACd,+FAA+F;IAC/F,QAAQ,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,MAAM,WAAW,kBAAkB,CAAC,CAAC,GAAG,OAAO,CAAE,SAAQ,gBAAgB;IACxE,IAAI,EAAE,gBAAgB,CAAC;IACvB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,gDAAgD;IAChD,OAAO,CAAC,EAAE,CAAC,CAAC;IACZ,wEAAwE;IACxE,KAAK,CAAC,EAAE,KAAK,CAAC;IACd,+DAA+D;IAC/D,QAAQ,CAAC,EAAE,OAAO,CAAC;CACnB;AAED;;;;;;;;;GASG;AACH,MAAM,WAAW,WAAW,CAAC,CAAC,GAAG,OAAO,CAAE,SAAQ,gBAAgB;IACjE,IAAI,EAAE,QAAQ,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,CAAC,EAAE,CAAC,CAAC;CACT;AAED,iEAAiE;AACjE,MAAM,WAAW,UAAW,SAAQ,gBAAgB;IACnD,IAAI,EAAE,OAAO,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,GAAG,SAAS,CAAC;CAC1B;AAED,gEAAgE;AAChE,MAAM,WAAW,gBAAiB,SAAQ,gBAAgB;IACzD,IAAI,EAAE,cAAc,CAAC;IACrB,IAAI,CAAC,EAAE,MAAM,CAAC;CACd;AAED;;;;;;;;;;;GAWG;AACH,MAAM,WAAW,kBAAkB,CAAC,CAAC,GAAG,OAAO,CAAE,SAAQ,gBAAgB;IACxE,IAAI,EAAE,gBAAgB,CAAC;IACvB,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,GAAG,CAAC,WAAW,GAAG,YAAY,CAAC,EAAE,CAAC;IACjD,OAAO,CAAC,EAAE,CAAC,CAAC;IACZ,OAAO,EAAE,OAAO,CAAC;CACjB;AAED,wGAAwG;AACxG,MAAM,MAAM,YAAY,GACrB,mBAAmB,GACnB,wBAAwB,GACxB,wBAAwB,GACxB,gBAAgB,GAChB,wBAAwB,GACxB,eAAe,GACf,kBAAkB,GAClB,WAAW,GACX,kBAAkB,GAClB,UAAU,GACV,gBAAgB,CAAC;AAEpB,uCAAuC;AACvC,MAAM,MAAM,SAAS,GAAG,aAAa,GAAG,YAAY,CAAC;AAErD,oEAAoE;AACpE,MAAM,WAAW,eAAe;IAC/B,KAAK,EAAE,YAAY,CAAC;IACpB,QAAQ,EAAE,eAAe,EAAE,CAAC;IAC5B,4CAA4C;IAC5C,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,kEAAkE;IAClE,cAAc,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,cAAc;IAC9B,QAAQ,EAAE,YAAY,EAAE,CAAC;IACzB,aAAa,EAAE,MAAM,CAAC;IACtB,iBAAiB,CAAC,EAAE,iBAAiB,CAAC;IACtC,mBAAmB,CAAC,EAAE;QAAE,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;IACzC,KAAK,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;CACpD;AAED,MAAM,WAAW,WAAW;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,MAAM,CAAC;IACX,sFAAsF;IACtF,GAAG,EAAE,MAAM,CAAC;IACZ,2DAA2D;IAC3D,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,+DAA+D;IAC/D,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,OAAO,EAAE,IAAI,CAAC;IACd,QAAQ,EAAE,IAAI,CAAC;IACf,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;IACrB,eAAe,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,MAAM,sBAAsB,GAAG,IAAI,CACxC,cAAc,EACZ,QAAQ,GACR,eAAe,GACf,cAAc,GACd,gBAAgB,GAChB,WAAW,GACX,cAAc,GACd,UAAU,GACV,UAAU,GACV,WAAW,GACX,qBAAqB,GACrB,qBAAqB,GACrB,WAAW,GACX,YAAY,GACZ,SAAS,GACT,gBAAgB,CAClB,CAAC;AAMF,wBAAgB,oBAAoB,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,CAMrD;AA2ED,2BAA2B;AAC3B,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,SAAS,EAAE,GAAG,IAAI,CAEhE;AAED,sCAAsC;AACtC,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,MAAM,GAAG,SAAS,EAAE,CAehE;AAED,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,YAAY,EAAE,GAAG,eAAe,GAAG,IAAI,CAOxF;AAiHD;;;GAGG;AACH,wBAAgB,6BAA6B,CAAC,KAAK,EAAE,YAAY,GAAG,YAAY,EAAE,CA2CjF;AAED;;;;;;;GAOG;AACH,wBAAgB,mBAAmB,CAClC,OAAO,EAAE,YAAY,EAAE,EACvB,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,EACtB,IAAI,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,YAAY,CAAC,GAC9B,YAAY,EAAE,CAoChB;AAED;;;;GAIG;AACH,wBAAgB,mBAAmB,CAClC,OAAO,EAAE,YAAY,EAAE,EACvB,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,EACtB,IAAI,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,YAAY,CAAC,GAC9B,cAAc,CAKhB;AAaD,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,GAAE,MAA6B,GAAG,MAAM,CAMjG;AAwBD,2BAA2B;AAC3B,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,GAAG,SAAS,EAAE,CA0CjE;AA8ED,2BAA2B;AAC3B,wBAAgB,qBAAqB,CAAC,UAAU,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAqBrF;AAeD,mFAAmF;AACnF,wBAAgB,+BAA+B,CAAC,MAAM,EAAE,OAAO,mBAAmB,GAAG,MAAM,IAAI,CAM9F;AAED,qBAAa,cAAc;IAC1B,OAAO,CAAC,SAAS,CAAc;IAC/B,OAAO,CAAC,WAAW,CAAqB;IACxC,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,GAAG,CAAS;IACpB,OAAO,CAAC,OAAO,CAAU;IACzB,OAAO,CAAC,OAAO,CAAkB;IACjC,OAAO,CAAC,WAAW,CAAmB;IACtC,OAAO,CAAC,IAAI,CAAwC;IAKpD,OAAO,CAAC,eAAe,CAAkC;IACzD,OAAO,CAAC,qBAAqB,CAAmE;IAChG,OAAO,CAAC,UAAU,CAAkC;IACpD,OAAO,CAAC,mBAAmB,CAAkC;IAC7D,OAAO,CAAC,MAAM,CAAuB;IACrC,OAAO,CAAC,aAAa,CAA6B;IAClD,OAAO,CAAC,aAAa,CAAS;IAC9B,OAAO,CAAC,mBAAmB,CAA8D;IAGzF,OAAO,CAAC,aAAa,CAAK;IAC1B,OAAO,CAAC,YAAY,CAA8D;IAClF,OAAO,CAAC,WAAW,CAAqF;IACxG,OAAO,CAAC,gBAAgB,CAAiC;IAKzD,OAAO,CAAC,WAAW,CAOjB;IAEF,OAAO,eAuBN;IAED;;OAEG;IACH,cAAc,IAAI,IAAI,CAYrB;IAED,yEAAyE;IACzE,cAAc,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI,CAExC;IAED,OAAO,CAAC,eAAe;IAwCvB,UAAU,CAAC,OAAO,CAAC,EAAE,iBAAiB,GAAG,MAAM,GAAG,SAAS,CAS1D;IAED,mFAAmF;IACnF,OAAO,CAAC,kBAAkB;IAqC1B,OAAO,CAAC,WAAW;IAsCnB,OAAO,CAAC,YAAY;IAapB,WAAW,IAAI,OAAO,CAErB;IAED,MAAM,IAAI,MAAM,CAEf;IAED,aAAa,IAAI,MAAM,CAEtB;IAED,qBAAqB,IAAI,OAAO,CAE/B;IAED,YAAY,IAAI,MAAM,CAErB;IAED,cAAc,IAAI,MAAM,GAAG,SAAS,CAEnC;IAED,qBAAqB,IAAI,kBAAkB,CAE1C;IAED,QAAQ,CAAC,KAAK,EAAE,YAAY,GAAG,IAAI,CA6BlC;IAED,OAAO,CAAC,YAAY;IAWpB;;;OAGG;IACH,WAAW,CAAC,KAAK,EAAE,YAAY,GAAG,IAAI,CAgBrC;IAED,OAAO,CAAC,iBAAiB;IAqBzB;;;OAGG;IACH,OAAO,CAAC,gBAAgB;IAgBxB;;;OAGG;IACH,cAAc,IAAI,WAAW,CAE5B;IAED;;;;;OAKG;IACH,aAAa,CAAC,OAAO,EAAE,OAAO,GAAG,aAAa,GAAG,oBAAoB,GAAG,MAAM,CAc7E;IAED,iFAAiF;IACjF,uBAAuB,CAAC,OAAO,EAAE,YAAY,GAAG,QAAQ,CAAC;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,GAAG,SAAS,CAEvG;IAED,sFAAsF;IACtF,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAEjD;IAED,oGAAoG;IACpG,yBAAyB,CAAC,aAAa,EAAE,MAAM,EAAE,iBAAiB,CAAC,EAAE,iBAAiB,GAAG,MAAM,CAW9F;IAED,gFAAgF;IAChF,yBAAyB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAUhD;IAED;;;OAGG;IACH,yBAAyB,CACxB,OAAO,EAAE,IAAI,CAAC,wBAAwB,EAAE,MAAM,GAAG,IAAI,GAAG,UAAU,GAAG,WAAW,CAAC,GAC/E,MAAM,CAUR;IAED,2FAA2F;IAC3F,iBAAiB,CAChB,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,MAAM,EACf,MAAM,CAAC,EAAE,UAAU,GAAG,iBAAiB,EACvC,gBAAgB,CAAC,EAAE,MAAM,EACzB,eAAe,CAAC,EAAE,MAAM,GACtB,MAAM,CAcR;IAED,iGAAiG;IACjG,gBAAgB,CAAC,CAAC,GAAG,OAAO,EAC3B,OAAO,EAAE,MAAM,EACf,gBAAgB,EAAE,MAAM,EACxB,YAAY,EAAE,MAAM,EACpB,OAAO,CAAC,EAAE,CAAC,EACX,QAAQ,CAAC,EAAE,OAAO,EAClB,KAAK,CAAC,EAAE,KAAK,GACX,MAAM,CAgBR;IAED,OAAO,CAAC,0BAA0B;IAyBlC,0FAA0F;IAC1F,iBAAiB,CAAC,UAAU,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,OAAO,GAAG,MAAM,CAW5D;IAED,0EAA0E;IAC1E,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAYtC;IAED;;;OAGG;IACH,cAAc,IAAI,MAAM,GAAG,SAAS,CAEnC;IAED;;;;;;;OAOG;IACH,wBAAwB,CAAC,CAAC,GAAG,OAAO,EACnC,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,MAAM,GAAG,CAAC,WAAW,GAAG,YAAY,CAAC,EAAE,EAChD,OAAO,EAAE,OAAO,EAChB,OAAO,CAAC,EAAE,CAAC,GACT,MAAM,CAaR;IAMD,SAAS,IAAI,MAAM,GAAG,IAAI,CAEzB;IAED,YAAY,IAAI,YAAY,GAAG,SAAS,CAGvC;IAED,QAAQ,CAAC,EAAE,EAAE,MAAM,GAAG,YAAY,GAAG,SAAS,CAQ7C;IAED;;OAEG;IACH,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,YAAY,EAAE,CAQ5C;IAED;;OAEG;IACH,QAAQ,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAEvC;IAED;;;;OAIG;IACH,iBAAiB,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,CAqBrE;IAED;;;;OAIG;IACH,SAAS,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,YAAY,EAAE,CA+BzC;IAED;;;OAGG;IACH,mBAAmB,IAAI,YAAY,EAAE,CAEpC;IAED;;;OAGG;IACH,mBAAmB,IAAI,cAAc,CAEpC;IAED,kBAAkB,IAAI,OAAO,CAQ5B;IAED,uBAAuB,IAAI,OAAO,CAEjC;IAED,gBAAgB,IAAI,MAAM,CAMzB;IAED,OAAO,CAAC,cAAc;IAStB;;OAEG;IACH,SAAS,IAAI,aAAa,GAAG,IAAI,CAGhC;IAED;;;;;;;;;OASG;IACH,UAAU,IAAI,YAAY,EAAE,CAa3B;IAED,OAAO,CAAC,mBAAmB;IAc3B,OAAO,CAAC,kBAAkB;IAkC1B,OAAO,CAAC,uBAAuB;IAI/B;;;;OAIG;IACH,OAAO,IAAI,eAAe,EAAE,CAsC3B;IAMD;;;;;OAKG;IACH,MAAM,CAAC,YAAY,EAAE,MAAM,GAAG,IAAI,CASjC;IAED;;;;OAIG;IACH,SAAS,IAAI,IAAI,CAGhB;IAED;;;;OAIG;IACH,iBAAiB,CAChB,YAAY,EAAE,MAAM,GAAG,IAAI,EAC3B,OAAO,EAAE,MAAM,EACf,OAAO,CAAC,EAAE,OAAO,EACjB,QAAQ,CAAC,EAAE,OAAO,EAClB,KAAK,CAAC,EAAE,KAAK,GACX,MAAM,CAmBR;IAED;;;;OAIG;IACH,qBAAqB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CA8GxD;IAED;;;;OAIG;IACH,MAAM,CAAC,MAAM,CAAC,GAAG,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,iBAAiB,GAAG,cAAc,CAG3F;IAED;;;;;OAKG;IACH,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM,GAAG,cAAc,CA2BnF;IAED;;;;OAIG;IACH,MAAM,CAAC,cAAc,CAAC,GAAG,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,cAAc,CAQtE;IAED,wDAAwD;IACxD,MAAM,CAAC,QAAQ,CAAC,GAAG,GAAE,MAAsB,EAAE,OAAO,CAAC,EAAE,iBAAiB,GAAG,cAAc,CAExF;IAED;;;;;;OAMG;IACH,MAAM,CAAC,QAAQ,CACd,UAAU,EAAE,MAAM,EAClB,SAAS,EAAE,MAAM,EACjB,UAAU,CAAC,EAAE,MAAM,EACnB,OAAO,CAAC,EAAE,iBAAiB,GACzB,cAAc,CA+ChB;IAED;;;;;OAKG;IACH,OAAa,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,mBAAmB,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC,CAS5G;IAED;;;OAGG;IACH,OAAa,OAAO,CAAC,UAAU,CAAC,EAAE,mBAAmB,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC;IAC/E,OAAa,OAAO,CAAC,UAAU,CAAC,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,mBAAmB,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC;CAmDpG"}
@@ -8,7 +8,7 @@ import { normalizePath, resolvePath } from "../utils/paths.js";
8
8
  import { listSessionInfos, listSessionsFromDir } from "./session-discovery.js";
9
9
  import { materializeSessionEntries } from "./session-entry-materializer.js";
10
10
  import { ResidentStringStore } from "./session-resident-store.js";
11
- import { reserveSessionWrite } from "./session-write-reservation.js";
11
+ import { registerSessionWriter, reserveSessionWrite } from "./session-write-reservation.js";
12
12
  // Fork change: inlined UUIDv7 (upstream uses the `uuid` npm package). Keeps this
13
13
  // package self-contained so consumers don't need a transitive `uuid` install.
14
14
  function uuidv7() {
@@ -578,6 +578,10 @@ export class SessionManager {
578
578
  this.cwd = resolvePath(cwd);
579
579
  this.sessionDir = normalizePath(sessionDir);
580
580
  this.persist = persist;
581
+ // A persisted manager owns its session file for as long as it lives; the shared
582
+ // RPC host reads this registry to release grants no writer holds anymore.
583
+ if (persist)
584
+ registerSessionWriter(this);
581
585
  if (persist && this.sessionDir && !existsSync(this.sessionDir)) {
582
586
  mkdirSync(this.sessionDir, { recursive: true });
583
587
  }
@@ -624,8 +628,9 @@ export class SessionManager {
624
628
  if (statSync(explicitPath).size > 0) {
625
629
  throw new Error(`Session file is not a valid ${APP_NAME} session: ${explicitPath}`);
626
630
  }
627
- this.newSession();
628
- this.sessionFile = explicitPath;
631
+ // The explicit path is already granted above and keeps being written here:
632
+ // allocating a second path would take a grant no writer ever uses.
633
+ this._resetToNewSession();
629
634
  this._rewriteFile();
630
635
  this.flushed = true;
631
636
  return;
@@ -641,12 +646,22 @@ export class SessionManager {
641
646
  this.flushed = true;
642
647
  }
643
648
  else {
644
- const explicitPath = this.sessionFile;
645
- this.newSession();
646
- this.sessionFile = explicitPath; // preserve explicit path from --session flag
649
+ // Same here: the explicit path from --session stays the only granted one.
650
+ this._resetToNewSession();
647
651
  }
648
652
  }
649
653
  newSession(options) {
654
+ const timestamp = this._resetToNewSession(options);
655
+ if (this.persist) {
656
+ const fileTimestamp = timestamp.replace(/[:.]/g, "-");
657
+ const path = join(this.getSessionDir(), `${fileTimestamp}_${this.sessionId}.jsonl`);
658
+ reserveSessionWrite(path);
659
+ this.sessionFile = path;
660
+ }
661
+ return this.sessionFile;
662
+ }
663
+ /** Resets every in-memory field onto a fresh header. Allocates no session path. */
664
+ _resetToNewSession(options) {
650
665
  if (options?.id !== undefined) {
651
666
  assertValidSessionId(options.id);
652
667
  }
@@ -680,13 +695,7 @@ export class SessionManager {
680
695
  };
681
696
  this.mutationCount++;
682
697
  this.flushed = false;
683
- if (this.persist) {
684
- const fileTimestamp = timestamp.replace(/[:.]/g, "-");
685
- const path = join(this.getSessionDir(), `${fileTimestamp}_${this.sessionId}.jsonl`);
686
- reserveSessionWrite(path);
687
- this.sessionFile = path;
688
- }
689
- return this.sessionFile;
698
+ return timestamp;
690
699
  }
691
700
  _buildIndex() {
692
701
  this.byId.clear();