@code-yeongyu/senpi 2026.7.20-2 → 2026.7.20

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 (160) hide show
  1. package/CHANGELOG.md +0 -18
  2. package/dist/core/agent-session.d.ts +0 -32
  3. package/dist/core/agent-session.d.ts.map +1 -1
  4. package/dist/core/agent-session.js +68 -368
  5. package/dist/core/agent-session.js.map +1 -1
  6. package/dist/core/compaction/compaction.d.ts +2 -2
  7. package/dist/core/compaction/compaction.d.ts.map +1 -1
  8. package/dist/core/compaction/compaction.js +11 -39
  9. package/dist/core/compaction/compaction.js.map +1 -1
  10. package/dist/core/extensions/builtin/compaction/index.d.ts.map +1 -1
  11. package/dist/core/extensions/builtin/compaction/index.js +8 -24
  12. package/dist/core/extensions/builtin/compaction/index.js.map +1 -1
  13. package/dist/core/extensions/builtin/goal/command-registration.d.ts +2 -2
  14. package/dist/core/extensions/builtin/goal/command-registration.d.ts.map +1 -1
  15. package/dist/core/extensions/builtin/goal/command-registration.js +4 -3
  16. package/dist/core/extensions/builtin/goal/command-registration.js.map +1 -1
  17. package/dist/core/extensions/builtin/goal/index.d.ts.map +1 -1
  18. package/dist/core/extensions/builtin/goal/index.js +27 -11
  19. package/dist/core/extensions/builtin/goal/index.js.map +1 -1
  20. package/dist/core/extensions/builtin/goal/tool-registration.d.ts +2 -2
  21. package/dist/core/extensions/builtin/goal/tool-registration.d.ts.map +1 -1
  22. package/dist/core/extensions/builtin/goal/tool-registration.js +3 -2
  23. package/dist/core/extensions/builtin/goal/tool-registration.js.map +1 -1
  24. package/dist/core/extensions/builtin/index.d.ts.map +1 -1
  25. package/dist/core/extensions/builtin/index.js +0 -2
  26. package/dist/core/extensions/builtin/index.js.map +1 -1
  27. package/dist/core/extensions/builtin/nested-agents-md/index.d.ts.map +1 -1
  28. package/dist/core/extensions/builtin/nested-agents-md/index.js +1 -4
  29. package/dist/core/extensions/builtin/nested-agents-md/index.js.map +1 -1
  30. package/dist/core/extensions/builtin/rules/index.d.ts.map +1 -1
  31. package/dist/core/extensions/builtin/rules/index.js +1 -4
  32. package/dist/core/extensions/builtin/rules/index.js.map +1 -1
  33. package/dist/core/extensions/builtin/websearch/websearch/renderers.d.ts.map +1 -1
  34. package/dist/core/extensions/builtin/websearch/websearch/renderers.js +4 -13
  35. package/dist/core/extensions/builtin/websearch/websearch/renderers.js.map +1 -1
  36. package/dist/core/extensions/builtin/websearch/websearch/search.d.ts +2 -3
  37. package/dist/core/extensions/builtin/websearch/websearch/search.d.ts.map +1 -1
  38. package/dist/core/extensions/builtin/websearch/websearch/search.js +1 -2
  39. package/dist/core/extensions/builtin/websearch/websearch/search.js.map +1 -1
  40. package/dist/core/extensions/builtin/websearch/websearch/tool.d.ts.map +1 -1
  41. package/dist/core/extensions/builtin/websearch/websearch/tool.js +1 -17
  42. package/dist/core/extensions/builtin/websearch/websearch/tool.js.map +1 -1
  43. package/dist/core/extensions/builtin/websearch/websearch/types.d.ts +0 -2
  44. package/dist/core/extensions/builtin/websearch/websearch/types.d.ts.map +1 -1
  45. package/dist/core/extensions/builtin/websearch/websearch/types.js.map +1 -1
  46. package/dist/core/extensions/runner.d.ts +0 -1
  47. package/dist/core/extensions/runner.d.ts.map +1 -1
  48. package/dist/core/extensions/runner.js +0 -31
  49. package/dist/core/extensions/runner.js.map +1 -1
  50. package/dist/core/extensions/types.d.ts +10 -67
  51. package/dist/core/extensions/types.d.ts.map +1 -1
  52. package/dist/core/extensions/types.js.map +1 -1
  53. package/dist/core/sdk.d.ts.map +1 -1
  54. package/dist/core/sdk.js +0 -1
  55. package/dist/core/sdk.js.map +1 -1
  56. package/dist/core/session-manager.d.ts +1 -6
  57. package/dist/core/session-manager.d.ts.map +1 -1
  58. package/dist/core/session-manager.js +3 -19
  59. package/dist/core/session-manager.js.map +1 -1
  60. package/dist/core/settings-manager.d.ts +0 -15
  61. package/dist/core/settings-manager.d.ts.map +1 -1
  62. package/dist/core/settings-manager.js +1 -80
  63. package/dist/core/settings-manager.js.map +1 -1
  64. package/dist/modes/interactive/components/footer.d.ts +1 -2
  65. package/dist/modes/interactive/components/footer.d.ts.map +1 -1
  66. package/dist/modes/interactive/components/footer.js +2 -21
  67. package/dist/modes/interactive/components/footer.js.map +1 -1
  68. package/dist/modes/interactive/interactive-mode.d.ts +0 -4
  69. package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  70. package/dist/modes/interactive/interactive-mode.js +3 -78
  71. package/dist/modes/interactive/interactive-mode.js.map +1 -1
  72. package/docs/extensions.md +0 -28
  73. package/docs/settings.md +0 -35
  74. package/node_modules/@code-yeongyu/senpi-codemode/CHANGELOG.md +0 -12
  75. package/node_modules/@code-yeongyu/senpi-codemode/package.json +3 -3
  76. package/node_modules/@earendil-works/pi-agent-core/dist/agent-loop.d.ts.map +1 -1
  77. package/node_modules/@earendil-works/pi-agent-core/dist/agent-loop.js +8 -76
  78. package/node_modules/@earendil-works/pi-agent-core/dist/agent-loop.js.map +1 -1
  79. package/node_modules/@earendil-works/pi-agent-core/dist/agent.d.ts.map +1 -1
  80. package/node_modules/@earendil-works/pi-agent-core/dist/agent.js +1 -26
  81. package/node_modules/@earendil-works/pi-agent-core/dist/agent.js.map +1 -1
  82. package/node_modules/@earendil-works/pi-agent-core/dist/harness/agent-harness.d.ts.map +1 -1
  83. package/node_modules/@earendil-works/pi-agent-core/dist/harness/agent-harness.js +2 -24
  84. package/node_modules/@earendil-works/pi-agent-core/dist/harness/agent-harness.js.map +1 -1
  85. package/node_modules/@earendil-works/pi-agent-core/dist/types.d.ts +0 -5
  86. package/node_modules/@earendil-works/pi-agent-core/dist/types.d.ts.map +1 -1
  87. package/node_modules/@earendil-works/pi-agent-core/dist/types.js.map +1 -1
  88. package/node_modules/@earendil-works/pi-agent-core/package.json +2 -2
  89. package/node_modules/@earendil-works/pi-ai/dist/api/anthropic-messages.d.ts.map +1 -1
  90. package/node_modules/@earendil-works/pi-ai/dist/api/anthropic-messages.js +25 -68
  91. package/node_modules/@earendil-works/pi-ai/dist/api/anthropic-messages.js.map +1 -1
  92. package/node_modules/@earendil-works/pi-ai/dist/api/transform-messages.d.ts.map +1 -1
  93. package/node_modules/@earendil-works/pi-ai/dist/api/transform-messages.js +52 -62
  94. package/node_modules/@earendil-works/pi-ai/dist/api/transform-messages.js.map +1 -1
  95. package/node_modules/@earendil-works/pi-ai/dist/index.d.ts +0 -1
  96. package/node_modules/@earendil-works/pi-ai/dist/index.d.ts.map +1 -1
  97. package/node_modules/@earendil-works/pi-ai/dist/index.js +0 -1
  98. package/node_modules/@earendil-works/pi-ai/dist/index.js.map +1 -1
  99. package/node_modules/@earendil-works/pi-ai/dist/models.generated.d.ts +4 -0
  100. package/node_modules/@earendil-works/pi-ai/dist/models.generated.d.ts.map +1 -1
  101. package/node_modules/@earendil-works/pi-ai/dist/providers/data/kimi-coding.json +1 -1
  102. package/node_modules/@earendil-works/pi-ai/dist/providers/data/openrouter.json +1 -1
  103. package/node_modules/@earendil-works/pi-ai/dist/providers/data/vercel-ai-gateway.json +1 -1
  104. package/node_modules/@earendil-works/pi-ai/dist/providers/faux.d.ts +0 -1
  105. package/node_modules/@earendil-works/pi-ai/dist/providers/faux.d.ts.map +1 -1
  106. package/node_modules/@earendil-works/pi-ai/dist/providers/faux.js +0 -1
  107. package/node_modules/@earendil-works/pi-ai/dist/providers/faux.js.map +1 -1
  108. package/node_modules/@earendil-works/pi-ai/dist/providers/kimi-coding.models.d.ts +4 -0
  109. package/node_modules/@earendil-works/pi-ai/dist/providers/kimi-coding.models.d.ts.map +1 -1
  110. package/node_modules/@earendil-works/pi-ai/dist/providers/kimi-coding.models.js.map +1 -1
  111. package/node_modules/@earendil-works/pi-ai/dist/types.d.ts +0 -15
  112. package/node_modules/@earendil-works/pi-ai/dist/types.d.ts.map +1 -1
  113. package/node_modules/@earendil-works/pi-ai/dist/types.js.map +1 -1
  114. package/node_modules/@earendil-works/pi-ai/dist/utils/retry.d.ts.map +1 -1
  115. package/node_modules/@earendil-works/pi-ai/dist/utils/retry.js +1 -5
  116. package/node_modules/@earendil-works/pi-ai/dist/utils/retry.js.map +1 -1
  117. package/node_modules/@earendil-works/pi-ai/package.json +1 -1
  118. package/node_modules/@earendil-works/pi-pty/package.json +1 -1
  119. package/node_modules/@earendil-works/pi-tui/package.json +1 -1
  120. package/package.json +6 -6
  121. package/dist/core/extensions/builtin/goal/turn-usage.d.ts +0 -20
  122. package/dist/core/extensions/builtin/goal/turn-usage.d.ts.map +0 -1
  123. package/dist/core/extensions/builtin/goal/turn-usage.js +0 -61
  124. package/dist/core/extensions/builtin/goal/turn-usage.js.map +0 -1
  125. package/dist/core/extensions/builtin/model-fallback/index.d.ts +0 -4
  126. package/dist/core/extensions/builtin/model-fallback/index.d.ts.map +0 -1
  127. package/dist/core/extensions/builtin/model-fallback/index.js +0 -55
  128. package/dist/core/extensions/builtin/model-fallback/index.js.map +0 -1
  129. package/dist/core/extensions/builtin/model-fallback/settings.d.ts +0 -6
  130. package/dist/core/extensions/builtin/model-fallback/settings.d.ts.map +0 -1
  131. package/dist/core/extensions/builtin/model-fallback/settings.js +0 -11
  132. package/dist/core/extensions/builtin/model-fallback/settings.js.map +0 -1
  133. package/dist/core/extensions/builtin/model-fallback/ui.d.ts +0 -12
  134. package/dist/core/extensions/builtin/model-fallback/ui.d.ts.map +0 -1
  135. package/dist/core/extensions/builtin/model-fallback/ui.js +0 -72
  136. package/dist/core/extensions/builtin/model-fallback/ui.js.map +0 -1
  137. package/dist/core/retry-fallback/chains.d.ts +0 -29
  138. package/dist/core/retry-fallback/chains.d.ts.map +0 -1
  139. package/dist/core/retry-fallback/chains.js +0 -109
  140. package/dist/core/retry-fallback/chains.js.map +0 -1
  141. package/dist/core/retry-fallback/controller.d.ts +0 -77
  142. package/dist/core/retry-fallback/controller.d.ts.map +0 -1
  143. package/dist/core/retry-fallback/controller.js +0 -157
  144. package/dist/core/retry-fallback/controller.js.map +0 -1
  145. package/dist/core/retry-fallback/cooldown.d.ts +0 -21
  146. package/dist/core/retry-fallback/cooldown.d.ts.map +0 -1
  147. package/dist/core/retry-fallback/cooldown.js +0 -49
  148. package/dist/core/retry-fallback/cooldown.js.map +0 -1
  149. package/dist/core/retry-fallback/log.d.ts +0 -10
  150. package/dist/core/retry-fallback/log.d.ts.map +0 -1
  151. package/dist/core/retry-fallback/log.js +0 -128
  152. package/dist/core/retry-fallback/log.js.map +0 -1
  153. package/dist/core/retry-fallback/validate.d.ts +0 -8
  154. package/dist/core/retry-fallback/validate.d.ts.map +0 -1
  155. package/dist/core/retry-fallback/validate.js +0 -63
  156. package/dist/core/retry-fallback/validate.js.map +0 -1
  157. package/node_modules/@earendil-works/pi-ai/dist/utils/stop-details.d.ts +0 -4
  158. package/node_modules/@earendil-works/pi-ai/dist/utils/stop-details.d.ts.map +0 -1
  159. package/node_modules/@earendil-works/pi-ai/dist/utils/stop-details.js +0 -6
  160. package/node_modules/@earendil-works/pi-ai/dist/utils/stop-details.js.map +0 -1
@@ -144,20 +144,6 @@ const UNSUPPORTED_NATIVE_COMPUTER_TOOL_MODEL_MARKERS = [
144
144
  "opus-4-8",
145
145
  "opus-4.8",
146
146
  ];
147
- // A provider can reject its own empty signatures. Learn that capability for one
148
- // conversation without changing the shared model definition used by other sessions.
149
- const unsignedThinkingTextReplayFallbacks = new Set();
150
- function unsignedThinkingFallbackKey(model, sessionId) {
151
- return sessionId === undefined ? undefined : `${sessionId}\u0000${model.baseUrl}\u0000${model.id}`;
152
- }
153
- function isInvalidUnsignedThinkingSignatureError(error) {
154
- return (typeof error === "object" &&
155
- error !== null &&
156
- "status" in error &&
157
- error.status === 400 &&
158
- error instanceof Error &&
159
- /Invalid signature in thinking block/i.test(error.message));
160
- }
161
147
  function getAnthropicCompat(model) {
162
148
  // Auto-detect session affinity and cache control support from provider
163
149
  const isFireworks = model.provider === "fireworks";
@@ -173,7 +159,6 @@ function getAnthropicCompat(model) {
173
159
  supportsToolChoice: model.compat?.supportsToolChoice ?? true,
174
160
  supportsForcedToolChoice: model.compat?.supportsForcedToolChoice ?? !CLAUDE_FABLE_OR_MYTHOS_MODEL_ID.test(model.id),
175
161
  allowEmptySignature: model.compat?.allowEmptySignature ?? false,
176
- unsignedThinkingReplay: model.compat?.unsignedThinkingReplay ?? (model.compat?.allowEmptySignature ? "empty-signature" : "text"),
177
162
  supportsToolReferences: model.compat?.supportsToolReferences ?? defaultSupportsToolReferences(model),
178
163
  // Default: first-party Anthropic only. Anthropic-compatible providers
179
164
  // (kimi-coding, fireworks, copilot, gateways) may execute the server-side
@@ -672,57 +657,34 @@ export const stream = (model, context, options) => {
672
657
  client = created.client;
673
658
  isOAuth = created.isOAuthToken;
674
659
  }
675
- const fallbackKey = unsignedThinkingFallbackKey(model, options?.sessionId);
676
- let unsignedThinkingReplay = fallbackKey && unsignedThinkingTextReplayFallbacks.has(fallbackKey)
677
- ? "text"
678
- : getAnthropicCompat(model).unsignedThinkingReplay;
679
- const createRequest = async () => {
680
- let params = buildParams(model, context, isOAuth, options, unsignedThinkingReplay);
681
- const nextParams = await options?.onPayload?.(params, model);
682
- if (nextParams !== undefined) {
683
- params = nextParams;
684
- }
685
- params = sanitizeAdaptiveThinkingPayload(model, params, options);
686
- params = sanitizeUnsupportedNativeTools(model, params);
687
- const payloadRequestMetadata = extractPayloadRequestMetadata(params);
688
- params = payloadRequestMetadata.params;
689
- const requestOptions = {
690
- ...(options?.signal ? { signal: options.signal } : {}),
691
- ...(options?.timeoutMs !== undefined ? { timeout: options.timeoutMs } : {}),
692
- maxRetries: options?.maxRetries ?? 0,
693
- ...(payloadRequestMetadata.headers ? { headers: payloadRequestMetadata.headers } : {}),
694
- };
695
- try {
696
- const response = await client.messages.create({ ...params, stream: true }, requestOptions).asResponse();
697
- return { params, response };
698
- }
699
- catch (error) {
700
- if (isForcedToolChoiceUnsupportedError(error, isForcedAnthropicToolChoice(params.tool_choice))) {
701
- params = omitToolChoiceParam(params);
702
- const response = await client.messages
703
- .create({ ...params, stream: true }, requestOptions)
704
- .asResponse();
705
- return { params, response };
706
- }
707
- throw error;
708
- }
660
+ let params = buildParams(model, context, isOAuth, options);
661
+ const nextParams = await options?.onPayload?.(params, model);
662
+ if (nextParams !== undefined) {
663
+ params = nextParams;
664
+ }
665
+ params = sanitizeAdaptiveThinkingPayload(model, params, options);
666
+ params = sanitizeUnsupportedNativeTools(model, params);
667
+ const payloadRequestMetadata = extractPayloadRequestMetadata(params);
668
+ params = payloadRequestMetadata.params;
669
+ const requestOptions = {
670
+ ...(options?.signal ? { signal: options.signal } : {}),
671
+ ...(options?.timeoutMs !== undefined ? { timeout: options.timeoutMs } : {}),
672
+ maxRetries: options?.maxRetries ?? 0,
673
+ ...(payloadRequestMetadata.headers ? { headers: payloadRequestMetadata.headers } : {}),
709
674
  };
710
- let request;
675
+ let response;
711
676
  try {
712
- request = await createRequest();
677
+ response = await client.messages.create({ ...params, stream: true }, requestOptions).asResponse();
713
678
  }
714
679
  catch (error) {
715
- if (unsignedThinkingReplay !== "text" && isInvalidUnsignedThinkingSignatureError(error)) {
716
- unsignedThinkingReplay = "text";
717
- if (fallbackKey)
718
- unsignedThinkingTextReplayFallbacks.add(fallbackKey);
719
- request = await createRequest();
680
+ if (isForcedToolChoiceUnsupportedError(error, isForcedAnthropicToolChoice(params.tool_choice))) {
681
+ params = omitToolChoiceParam(params);
682
+ response = await client.messages.create({ ...params, stream: true }, requestOptions).asResponse();
720
683
  }
721
684
  else {
722
685
  throw error;
723
686
  }
724
687
  }
725
- const { response } = request;
726
688
  await options?.onResponse?.({ status: response.status, headers: headersToRecord(response.headers) }, model);
727
689
  stream.push({ type: "start", partial: output });
728
690
  const blocks = output.content;
@@ -902,9 +864,6 @@ export const stream = (model, context, options) => {
902
864
  if (stopReasonResult.errorMessage) {
903
865
  output.errorMessage = stopReasonResult.errorMessage;
904
866
  }
905
- if (stopReasonResult.stopDetails) {
906
- output.stopDetails = stopReasonResult.stopDetails;
907
- }
908
867
  }
909
868
  // Only update usage fields if present (not null).
910
869
  // Preserves input_tokens from message_start when proxies omit it in message_delta.
@@ -1130,7 +1089,7 @@ function createClient(model, apiKey, interleavedThinking, useFineGrainedToolStre
1130
1089
  });
1131
1090
  return { client, isOAuthToken: false };
1132
1091
  }
1133
- function buildParams(model, context, isOAuthToken, options, unsignedThinkingReplay = getAnthropicCompat(model).unsignedThinkingReplay) {
1092
+ function buildParams(model, context, isOAuthToken, options) {
1134
1093
  const compat = getAnthropicCompat(model);
1135
1094
  const { cacheControl } = getCacheControl(model, options?.cacheRetention ?? model.cacheRetention, options?.env);
1136
1095
  const transformedMessages = transformMessages(context.messages, model, normalizeToolCallId, {
@@ -1153,7 +1112,7 @@ function buildParams(model, context, isOAuthToken, options, unsignedThinkingRepl
1153
1112
  const deferredToolNames = new Set(deferredTools.map((tool) => normalizeToolName(tool.name)));
1154
1113
  const params = {
1155
1114
  model: model.id,
1156
- messages: convertMessages(transformedMessages, model, isOAuthToken, cacheControl, unsignedThinkingReplay, deferredToolNames, normalizeToolName),
1115
+ messages: convertMessages(transformedMessages, model, isOAuthToken, cacheControl, compat.allowEmptySignature, deferredToolNames, normalizeToolName),
1157
1116
  max_tokens: options?.maxTokens ?? model.maxTokens,
1158
1117
  stream: true,
1159
1118
  };
@@ -1291,7 +1250,7 @@ function convertToolResult(msg, isOAuthToken, deferredToolNames, loadedToolNames
1291
1250
  : convertedContent,
1292
1251
  };
1293
1252
  }
1294
- function convertMessages(transformedMessages, model, isOAuthToken, cacheControl, unsignedThinkingReplay = "text", deferredToolNames = new Set(), normalizeToolName = (name) => name) {
1253
+ function convertMessages(transformedMessages, model, isOAuthToken, cacheControl, allowEmptySignature = false, deferredToolNames = new Set(), normalizeToolName = (name) => name) {
1295
1254
  const params = [];
1296
1255
  const loadedToolNames = new Set();
1297
1256
  // Tool calls from a declined pre-fallback attempt are dropped from their
@@ -1401,7 +1360,7 @@ function convertMessages(transformedMessages, model, isOAuthToken, cacheControl,
1401
1360
  // convert to plain text for Anthropic. Some compatible providers emit
1402
1361
  // and accept empty signatures, so let marked models preserve the block.
1403
1362
  if (!hasThinkingSignature) {
1404
- blocks.push(unsignedThinkingReplay === "empty-signature"
1363
+ blocks.push(allowEmptySignature
1405
1364
  ? {
1406
1365
  type: "thinking",
1407
1366
  thinking: sanitizeSurrogates(block.thinking),
@@ -1515,7 +1474,6 @@ function convertTools(tools, isOAuthToken, supportsEagerToolInputStreaming, cach
1515
1474
  });
1516
1475
  }
1517
1476
  function mapStopReason(reason, stopDetails) {
1518
- const explanation = stopDetails?.explanation;
1519
1477
  switch (reason) {
1520
1478
  case "end_turn":
1521
1479
  return { stopReason: "stop" };
@@ -1526,15 +1484,14 @@ function mapStopReason(reason, stopDetails) {
1526
1484
  case "refusal":
1527
1485
  return {
1528
1486
  stopReason: "error",
1529
- errorMessage: explanation || `The model refused to complete the request`,
1530
- stopDetails: explanation == null ? { type: "refusal" } : { type: "refusal", explanation },
1487
+ errorMessage: stopDetails?.explanation || `The model refused to complete the request`,
1531
1488
  };
1532
1489
  case "pause_turn": // Stop is good enough -> resubmit
1533
1490
  return { stopReason: "stop" };
1534
1491
  case "stop_sequence":
1535
1492
  return { stopReason: "stop" }; // We don't supply stop sequences, so this should never happen
1536
1493
  case "sensitive": // Content flagged by safety filters (not yet in SDK types)
1537
- return { stopReason: "error", stopDetails: { type: "sensitive" } };
1494
+ return { stopReason: "error" };
1538
1495
  default:
1539
1496
  // Handle unknown stop reasons gracefully (API may add new values)
1540
1497
  throw new Error(`Unhandled stop reason: ${reason}`);