@code-yeongyu/senpi-ai 2026.9.3 → 2026.9.4-3

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 (84) hide show
  1. package/dist/api/anthropic-messages.d.ts +1 -1
  2. package/dist/api/anthropic-messages.d.ts.map +1 -1
  3. package/dist/api/anthropic-messages.js +130 -15
  4. package/dist/api/anthropic-messages.js.map +1 -1
  5. package/dist/api/context-room.d.ts +20 -0
  6. package/dist/api/context-room.d.ts.map +1 -0
  7. package/dist/api/context-room.js +40 -0
  8. package/dist/api/context-room.js.map +1 -0
  9. package/dist/api/cursor-agent.js +4 -4
  10. package/dist/api/cursor-agent.js.map +1 -1
  11. package/dist/api/mistral-conversations.js +1 -1
  12. package/dist/api/mistral-conversations.js.map +1 -1
  13. package/dist/api/openai-completions.d.ts.map +1 -1
  14. package/dist/api/openai-completions.js +16 -1
  15. package/dist/api/openai-completions.js.map +1 -1
  16. package/dist/api/openai-responses.d.ts.map +1 -1
  17. package/dist/api/openai-responses.js +2 -1
  18. package/dist/api/openai-responses.js.map +1 -1
  19. package/dist/api/pi-messages.d.ts +2 -0
  20. package/dist/api/pi-messages.d.ts.map +1 -1
  21. package/dist/api/pi-messages.js +6 -0
  22. package/dist/api/pi-messages.js.map +1 -1
  23. package/dist/api/simple-options.d.ts +1 -3
  24. package/dist/api/simple-options.d.ts.map +1 -1
  25. package/dist/api/simple-options.js +2 -16
  26. package/dist/api/simple-options.js.map +1 -1
  27. package/dist/api/warm-prompt-cache.js +1 -1
  28. package/dist/api/warm-prompt-cache.js.map +1 -1
  29. package/dist/auth/pool/slots.d.ts +16 -3
  30. package/dist/auth/pool/slots.d.ts.map +1 -1
  31. package/dist/auth/pool/slots.js +40 -6
  32. package/dist/auth/pool/slots.js.map +1 -1
  33. package/dist/compat/extension-oauth-types.d.ts +8 -0
  34. package/dist/compat/extension-oauth-types.d.ts.map +1 -1
  35. package/dist/compat/extension-oauth-types.js.map +1 -1
  36. package/dist/index.d.ts +1 -0
  37. package/dist/index.d.ts.map +1 -1
  38. package/dist/index.js +1 -0
  39. package/dist/index.js.map +1 -1
  40. package/dist/models.d.ts.map +1 -1
  41. package/dist/models.js +3 -2
  42. package/dist/models.js.map +1 -1
  43. package/dist/openai-responses-compat.d.ts +2 -0
  44. package/dist/openai-responses-compat.d.ts.map +1 -1
  45. package/dist/openai-responses-compat.js.map +1 -1
  46. package/dist/providers/data/.manifest.json +1 -1
  47. package/dist/providers/data/anthropic.json +1 -1
  48. package/dist/providers/data/azure-openai-responses.json +1 -1
  49. package/dist/providers/data/baseten.json +1 -1
  50. package/dist/providers/data/cloudflare-ai-gateway.json +1 -1
  51. package/dist/providers/data/fireworks.json +1 -1
  52. package/dist/providers/data/github-copilot.json +1 -1
  53. package/dist/providers/data/huggingface.json +1 -1
  54. package/dist/providers/data/nvidia.json +1 -1
  55. package/dist/providers/data/openai-codex.json +1 -1
  56. package/dist/providers/data/openai.json +1 -1
  57. package/dist/providers/data/opencode-go.json +1 -1
  58. package/dist/providers/data/openrouter.json +1 -1
  59. package/dist/providers/data/vercel-ai-gateway.json +1 -1
  60. package/dist/providers/openrouter.d.ts +1 -1
  61. package/dist/providers/openrouter.d.ts.map +1 -1
  62. package/dist/providers/openrouter.js +8 -1
  63. package/dist/providers/openrouter.js.map +1 -1
  64. package/dist/types.d.ts +14 -1
  65. package/dist/types.d.ts.map +1 -1
  66. package/dist/types.js.map +1 -1
  67. package/dist/utils/drop-failed-assistant-turns.d.ts +23 -0
  68. package/dist/utils/drop-failed-assistant-turns.d.ts.map +1 -0
  69. package/dist/utils/drop-failed-assistant-turns.js +58 -0
  70. package/dist/utils/drop-failed-assistant-turns.js.map +1 -0
  71. package/dist/utils/node-http-proxy.d.ts.map +1 -1
  72. package/dist/utils/node-http-proxy.js +53 -12
  73. package/dist/utils/node-http-proxy.js.map +1 -1
  74. package/dist/utils/overflow.d.ts.map +1 -1
  75. package/dist/utils/overflow.js +2 -0
  76. package/dist/utils/overflow.js.map +1 -1
  77. package/dist/utils/prompt-cache-ttl.d.ts +4 -2
  78. package/dist/utils/prompt-cache-ttl.d.ts.map +1 -1
  79. package/dist/utils/prompt-cache-ttl.js +3 -0
  80. package/dist/utils/prompt-cache-ttl.js.map +1 -1
  81. package/dist/utils/retry.d.ts.map +1 -1
  82. package/dist/utils/retry.js +3 -0
  83. package/dist/utils/retry.js.map +1 -1
  84. package/package.json +3 -3
@@ -0,0 +1,20 @@
1
+ import type { Api, Context, Model } from "../types.ts";
2
+ export declare const CONTEXT_SAFETY_TOKENS = 4096;
3
+ /** Tokens always left for the answer when a thinking budget shares the response ceiling. */
4
+ export declare const MIN_ANSWER_TOKENS = 1024;
5
+ /** Windows too small to hold the safety margin plus one answer keep the legacy one-token floor. */
6
+ export declare const CONTEXT_GUARD_MIN_WINDOW: number;
7
+ export declare class ContextWindowExhaustedError extends Error {
8
+ readonly estimatedTokens: number;
9
+ readonly contextWindow: number;
10
+ constructor(estimatedTokens: number, contextWindow: number);
11
+ }
12
+ /**
13
+ * Fit the requested output budget into the room the context leaves in the model window.
14
+ * For windows of at least {@link CONTEXT_GUARD_MIN_WINDOW} tokens this throws
15
+ * {@link ContextWindowExhaustedError} instead of shrinking the budget below
16
+ * {@link MIN_ANSWER_TOKENS}: such a request can only return a truncated tool call or an
17
+ * empty "length" stop while still billing the whole prompt.
18
+ */
19
+ export declare function clampMaxTokensToContext(model: Model<Api>, context: Context, maxTokens: number): number;
20
+ //# sourceMappingURL=context-room.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context-room.d.ts","sourceRoot":"","sources":["../../src/api/context-room.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAGvD,eAAO,MAAM,qBAAqB,OAAO,CAAC;AAC1C,4FAA4F;AAC5F,eAAO,MAAM,iBAAiB,OAAO,CAAC;AAEtC,mGAAmG;AACnG,eAAO,MAAM,wBAAwB,QAA4C,CAAC;AAElF,qBAAa,2BAA4B,SAAQ,KAAK;IACrD,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;gBAEnB,eAAe,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM;CAU1D;AAED;;;;;;GAMG;AACH,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CActG"}
@@ -0,0 +1,40 @@
1
+ import { estimateContextTokens } from "../utils/estimate.js";
2
+ export const CONTEXT_SAFETY_TOKENS = 4096;
3
+ /** Tokens always left for the answer when a thinking budget shares the response ceiling. */
4
+ export const MIN_ANSWER_TOKENS = 1024;
5
+ const MIN_MAX_TOKENS = 1;
6
+ /** Windows too small to hold the safety margin plus one answer keep the legacy one-token floor. */
7
+ export const CONTEXT_GUARD_MIN_WINDOW = CONTEXT_SAFETY_TOKENS + MIN_ANSWER_TOKENS;
8
+ export class ContextWindowExhaustedError extends Error {
9
+ constructor(estimatedTokens, contextWindow) {
10
+ super(`Context window exhausted: the conversation is estimated at ${estimatedTokens} of ${contextWindow} tokens, ` +
11
+ `leaving fewer than ${MIN_ANSWER_TOKENS} tokens for a response. ` +
12
+ "Compact the conversation, enable auto-compaction, or start a new session before retrying.");
13
+ this.name = "ContextWindowExhaustedError";
14
+ this.estimatedTokens = estimatedTokens;
15
+ this.contextWindow = contextWindow;
16
+ }
17
+ }
18
+ /**
19
+ * Fit the requested output budget into the room the context leaves in the model window.
20
+ * For windows of at least {@link CONTEXT_GUARD_MIN_WINDOW} tokens this throws
21
+ * {@link ContextWindowExhaustedError} instead of shrinking the budget below
22
+ * {@link MIN_ANSWER_TOKENS}: such a request can only return a truncated tool call or an
23
+ * empty "length" stop while still billing the whole prompt.
24
+ */
25
+ export function clampMaxTokensToContext(model, context, maxTokens) {
26
+ if (model.contextWindow <= 0) {
27
+ return Number.isFinite(maxTokens) && maxTokens > 0
28
+ ? Math.max(MIN_MAX_TOKENS, Math.floor(maxTokens))
29
+ : MIN_MAX_TOKENS;
30
+ }
31
+ const estimatedTokens = estimateContextTokens(context).tokens;
32
+ const available = model.contextWindow - estimatedTokens - CONTEXT_SAFETY_TOKENS;
33
+ if (model.contextWindow >= CONTEXT_GUARD_MIN_WINDOW && available < MIN_ANSWER_TOKENS) {
34
+ throw new ContextWindowExhaustedError(estimatedTokens, model.contextWindow);
35
+ }
36
+ const safeAvailable = Math.max(MIN_MAX_TOKENS, available);
37
+ const requested = Number.isFinite(maxTokens) && maxTokens > 0 ? Math.floor(maxTokens) : safeAvailable;
38
+ return Math.min(requested, safeAvailable);
39
+ }
40
+ //# sourceMappingURL=context-room.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context-room.js","sourceRoot":"","sources":["../../src/api/context-room.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAE7D,MAAM,CAAC,MAAM,qBAAqB,GAAG,IAAI,CAAC;AAC1C,4FAA4F;AAC5F,MAAM,CAAC,MAAM,iBAAiB,GAAG,IAAI,CAAC;AACtC,MAAM,cAAc,GAAG,CAAC,CAAC;AACzB,mGAAmG;AACnG,MAAM,CAAC,MAAM,wBAAwB,GAAG,qBAAqB,GAAG,iBAAiB,CAAC;AAElF,MAAM,OAAO,2BAA4B,SAAQ,KAAK;IAIrD,YAAY,eAAuB,EAAE,aAAqB;QACzD,KAAK,CACJ,8DAA8D,eAAe,OAAO,aAAa,WAAW;YAC3G,sBAAsB,iBAAiB,0BAA0B;YACjE,2FAA2F,CAC5F,CAAC;QACF,IAAI,CAAC,IAAI,GAAG,6BAA6B,CAAC;QAC1C,IAAI,CAAC,eAAe,GAAG,eAAe,CAAC;QACvC,IAAI,CAAC,aAAa,GAAG,aAAa,CAAC;IACpC,CAAC;CACD;AAED;;;;;;GAMG;AACH,MAAM,UAAU,uBAAuB,CAAC,KAAiB,EAAE,OAAgB,EAAE,SAAiB;IAC7F,IAAI,KAAK,CAAC,aAAa,IAAI,CAAC,EAAE,CAAC;QAC9B,OAAO,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,SAAS,GAAG,CAAC;YACjD,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,cAAc,EAAE,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;YACjD,CAAC,CAAC,cAAc,CAAC;IACnB,CAAC;IACD,MAAM,eAAe,GAAG,qBAAqB,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC;IAC9D,MAAM,SAAS,GAAG,KAAK,CAAC,aAAa,GAAG,eAAe,GAAG,qBAAqB,CAAC;IAChF,IAAI,KAAK,CAAC,aAAa,IAAI,wBAAwB,IAAI,SAAS,GAAG,iBAAiB,EAAE,CAAC;QACtF,MAAM,IAAI,2BAA2B,CAAC,eAAe,EAAE,KAAK,CAAC,aAAa,CAAC,CAAC;IAC7E,CAAC;IACD,MAAM,aAAa,GAAG,IAAI,CAAC,GAAG,CAAC,cAAc,EAAE,SAAS,CAAC,CAAC;IAC1D,MAAM,SAAS,GAAG,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,SAAS,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC;IACtG,OAAO,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,aAAa,CAAC,CAAC;AAC3C,CAAC","sourcesContent":["import type { Api, Context, Model } from \"../types.ts\";\nimport { estimateContextTokens } from \"../utils/estimate.ts\";\n\nexport const CONTEXT_SAFETY_TOKENS = 4096;\n/** Tokens always left for the answer when a thinking budget shares the response ceiling. */\nexport const MIN_ANSWER_TOKENS = 1024;\nconst MIN_MAX_TOKENS = 1;\n/** Windows too small to hold the safety margin plus one answer keep the legacy one-token floor. */\nexport const CONTEXT_GUARD_MIN_WINDOW = CONTEXT_SAFETY_TOKENS + MIN_ANSWER_TOKENS;\n\nexport class ContextWindowExhaustedError extends Error {\n\treadonly estimatedTokens: number;\n\treadonly contextWindow: number;\n\n\tconstructor(estimatedTokens: number, contextWindow: number) {\n\t\tsuper(\n\t\t\t`Context window exhausted: the conversation is estimated at ${estimatedTokens} of ${contextWindow} tokens, ` +\n\t\t\t\t`leaving fewer than ${MIN_ANSWER_TOKENS} tokens for a response. ` +\n\t\t\t\t\"Compact the conversation, enable auto-compaction, or start a new session before retrying.\",\n\t\t);\n\t\tthis.name = \"ContextWindowExhaustedError\";\n\t\tthis.estimatedTokens = estimatedTokens;\n\t\tthis.contextWindow = contextWindow;\n\t}\n}\n\n/**\n * Fit the requested output budget into the room the context leaves in the model window.\n * For windows of at least {@link CONTEXT_GUARD_MIN_WINDOW} tokens this throws\n * {@link ContextWindowExhaustedError} instead of shrinking the budget below\n * {@link MIN_ANSWER_TOKENS}: such a request can only return a truncated tool call or an\n * empty \"length\" stop while still billing the whole prompt.\n */\nexport function clampMaxTokensToContext(model: Model<Api>, context: Context, maxTokens: number): number {\n\tif (model.contextWindow <= 0) {\n\t\treturn Number.isFinite(maxTokens) && maxTokens > 0\n\t\t\t? Math.max(MIN_MAX_TOKENS, Math.floor(maxTokens))\n\t\t\t: MIN_MAX_TOKENS;\n\t}\n\tconst estimatedTokens = estimateContextTokens(context).tokens;\n\tconst available = model.contextWindow - estimatedTokens - CONTEXT_SAFETY_TOKENS;\n\tif (model.contextWindow >= CONTEXT_GUARD_MIN_WINDOW && available < MIN_ANSWER_TOKENS) {\n\t\tthrow new ContextWindowExhaustedError(estimatedTokens, model.contextWindow);\n\t}\n\tconst safeAvailable = Math.max(MIN_MAX_TOKENS, available);\n\tconst requested = Number.isFinite(maxTokens) && maxTokens > 0 ? Math.floor(maxTokens) : safeAvailable;\n\treturn Math.min(requested, safeAvailable);\n}\n"]}
@@ -532,10 +532,6 @@ export const stream = (model, context, options) => {
532
532
  if (h2Settled)
533
533
  return;
534
534
  h2Settled = true;
535
- if (streamHealthTimer) {
536
- clearTimeout(streamHealthTimer);
537
- streamHealthTimer = null;
538
- }
539
535
  if (error !== undefined) {
540
536
  rejectH2(error);
541
537
  return;
@@ -958,6 +954,10 @@ export const stream = (model, context, options) => {
958
954
  clearInterval(heartbeatTimer);
959
955
  heartbeatTimer = null;
960
956
  }
957
+ if (streamHealthTimer) {
958
+ clearTimeout(streamHealthTimer);
959
+ streamHealthTimer = null;
960
+ }
961
961
  h2Request?.close();
962
962
  h2Client?.close();
963
963
  h2Request = null;