@code-yeongyu/senpi 2026.7.14-3 → 2026.7.14

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 (171) hide show
  1. package/CHANGELOG.md +0 -38
  2. package/dist/core/agent-session.js +1 -1
  3. package/dist/core/agent-session.js.map +1 -1
  4. package/dist/core/compaction/branch-summarization.d.ts +1 -1
  5. package/dist/core/compaction/branch-summarization.d.ts.map +1 -1
  6. package/dist/core/compaction/branch-summarization.js.map +1 -1
  7. package/dist/core/extensions/builtin/prompt-preset/gpt-5.6.d.ts.map +1 -1
  8. package/dist/core/extensions/builtin/prompt-preset/gpt-5.6.js +5 -14
  9. package/dist/core/extensions/builtin/prompt-preset/gpt-5.6.js.map +1 -1
  10. package/dist/core/extensions/builtin/terminal/runtime-session.d.ts +1 -1
  11. package/dist/core/extensions/builtin/terminal/runtime-session.d.ts.map +1 -1
  12. package/dist/core/extensions/builtin/terminal/runtime-session.js +2 -3
  13. package/dist/core/extensions/builtin/terminal/runtime-session.js.map +1 -1
  14. package/dist/core/model-registry.d.ts.map +1 -1
  15. package/dist/core/model-registry.js +3 -18
  16. package/dist/core/model-registry.js.map +1 -1
  17. package/dist/core/model-resolver.d.ts.map +1 -1
  18. package/dist/core/model-resolver.js +0 -1
  19. package/dist/core/model-resolver.js.map +1 -1
  20. package/dist/core/package-manager.d.ts.map +1 -1
  21. package/dist/core/package-manager.js +2 -7
  22. package/dist/core/package-manager.js.map +1 -1
  23. package/dist/core/provider-display-names.d.ts.map +1 -1
  24. package/dist/core/provider-display-names.js +0 -1
  25. package/dist/core/provider-display-names.js.map +1 -1
  26. package/dist/core/system-prompt.d.ts.map +1 -1
  27. package/dist/core/system-prompt.js +11 -1
  28. package/dist/core/system-prompt.js.map +1 -1
  29. package/dist/modes/interactive/interactive-mode.js +2 -2
  30. package/dist/modes/interactive/interactive-mode.js.map +1 -1
  31. package/docs/custom-provider.md +0 -2
  32. package/docs/models.md +0 -2
  33. package/examples/extensions/custom-provider-anthropic/package-lock.json +2 -2
  34. package/examples/extensions/custom-provider-anthropic/package.json +1 -1
  35. package/examples/extensions/custom-provider-gitlab-duo/package.json +1 -1
  36. package/examples/extensions/gondolin/package-lock.json +2 -2
  37. package/examples/extensions/gondolin/package.json +1 -1
  38. package/examples/extensions/sandbox/package-lock.json +2 -2
  39. package/examples/extensions/sandbox/package.json +1 -1
  40. package/examples/extensions/with-deps/package-lock.json +2 -2
  41. package/examples/extensions/with-deps/package.json +1 -1
  42. package/node_modules/@code-yeongyu/senpi-codemode/CHANGELOG.md +0 -16
  43. package/node_modules/@code-yeongyu/senpi-codemode/package.json +3 -3
  44. package/node_modules/@earendil-works/pi-agent-core/package.json +2 -2
  45. package/node_modules/@earendil-works/pi-ai/README.md +2 -3
  46. package/node_modules/@earendil-works/pi-ai/dist/api/anthropic-messages.d.ts.map +1 -1
  47. package/node_modules/@earendil-works/pi-ai/dist/api/anthropic-messages.js +42 -23
  48. package/node_modules/@earendil-works/pi-ai/dist/api/anthropic-messages.js.map +1 -1
  49. package/node_modules/@earendil-works/pi-ai/dist/api/bedrock-converse-stream.d.ts.map +1 -1
  50. package/node_modules/@earendil-works/pi-ai/dist/api/bedrock-converse-stream.js +6 -10
  51. package/node_modules/@earendil-works/pi-ai/dist/api/bedrock-converse-stream.js.map +1 -1
  52. package/node_modules/@earendil-works/pi-ai/dist/api/openai-codex-responses.d.ts +0 -1
  53. package/node_modules/@earendil-works/pi-ai/dist/api/openai-codex-responses.d.ts.map +1 -1
  54. package/node_modules/@earendil-works/pi-ai/dist/api/openai-codex-responses.js +1 -1
  55. package/node_modules/@earendil-works/pi-ai/dist/api/openai-codex-responses.js.map +1 -1
  56. package/node_modules/@earendil-works/pi-ai/dist/api/openai-completions.d.ts.map +1 -1
  57. package/node_modules/@earendil-works/pi-ai/dist/api/openai-completions.js +3 -12
  58. package/node_modules/@earendil-works/pi-ai/dist/api/openai-completions.js.map +1 -1
  59. package/node_modules/@earendil-works/pi-ai/dist/api/openai-responses-shared.d.ts.map +1 -1
  60. package/node_modules/@earendil-works/pi-ai/dist/api/openai-responses-shared.js +0 -23
  61. package/node_modules/@earendil-works/pi-ai/dist/api/openai-responses-shared.js.map +1 -1
  62. package/node_modules/@earendil-works/pi-ai/dist/api/openai-responses.d.ts +0 -1
  63. package/node_modules/@earendil-works/pi-ai/dist/api/openai-responses.d.ts.map +1 -1
  64. package/node_modules/@earendil-works/pi-ai/dist/api/openai-responses.js +6 -22
  65. package/node_modules/@earendil-works/pi-ai/dist/api/openai-responses.js.map +1 -1
  66. package/node_modules/@earendil-works/pi-ai/dist/compat.d.ts +0 -2
  67. package/node_modules/@earendil-works/pi-ai/dist/compat.d.ts.map +1 -1
  68. package/node_modules/@earendil-works/pi-ai/dist/compat.js +0 -3
  69. package/node_modules/@earendil-works/pi-ai/dist/compat.js.map +1 -1
  70. package/node_modules/@earendil-works/pi-ai/dist/env-api-keys.d.ts.map +1 -1
  71. package/node_modules/@earendil-works/pi-ai/dist/env-api-keys.js +0 -1
  72. package/node_modules/@earendil-works/pi-ai/dist/env-api-keys.js.map +1 -1
  73. package/node_modules/@earendil-works/pi-ai/dist/index.d.ts +0 -1
  74. package/node_modules/@earendil-works/pi-ai/dist/index.d.ts.map +1 -1
  75. package/node_modules/@earendil-works/pi-ai/dist/index.js.map +1 -1
  76. package/node_modules/@earendil-works/pi-ai/dist/models.generated.d.ts +6 -58
  77. package/node_modules/@earendil-works/pi-ai/dist/models.generated.d.ts.map +1 -1
  78. package/node_modules/@earendil-works/pi-ai/dist/providers/all.d.ts +5 -9
  79. package/node_modules/@earendil-works/pi-ai/dist/providers/all.d.ts.map +1 -1
  80. package/node_modules/@earendil-works/pi-ai/dist/providers/all.js.map +1 -1
  81. package/node_modules/@earendil-works/pi-ai/dist/providers/github-copilot.models.d.ts +6 -1
  82. package/node_modules/@earendil-works/pi-ai/dist/providers/github-copilot.models.d.ts.map +1 -1
  83. package/node_modules/@earendil-works/pi-ai/dist/providers/github-copilot.models.js +2 -1
  84. package/node_modules/@earendil-works/pi-ai/dist/providers/github-copilot.models.js.map +1 -1
  85. package/node_modules/@earendil-works/pi-ai/dist/providers/opencode.models.d.ts +0 -57
  86. package/node_modules/@earendil-works/pi-ai/dist/providers/opencode.models.d.ts.map +1 -1
  87. package/node_modules/@earendil-works/pi-ai/dist/providers/opencode.models.js +0 -19
  88. package/node_modules/@earendil-works/pi-ai/dist/providers/opencode.models.js.map +1 -1
  89. package/node_modules/@earendil-works/pi-ai/dist/providers/openrouter.models.js +10 -10
  90. package/node_modules/@earendil-works/pi-ai/dist/providers/openrouter.models.js.map +1 -1
  91. package/node_modules/@earendil-works/pi-ai/dist/providers/vercel-ai-gateway.models.js +2 -2
  92. package/node_modules/@earendil-works/pi-ai/dist/providers/vercel-ai-gateway.models.js.map +1 -1
  93. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/context-transformer.d.ts.map +1 -1
  94. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/context-transformer.js +0 -9
  95. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/context-transformer.js.map +1 -1
  96. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/index.d.ts +1 -1
  97. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/index.d.ts.map +1 -1
  98. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/index.js +2 -6
  99. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/index.js.map +1 -1
  100. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/types.d.ts +1 -3
  101. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/types.d.ts.map +1 -1
  102. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/types.js.map +1 -1
  103. package/node_modules/@earendil-works/pi-ai/dist/types.d.ts +5 -10
  104. package/node_modules/@earendil-works/pi-ai/dist/types.d.ts.map +1 -1
  105. package/node_modules/@earendil-works/pi-ai/dist/types.js.map +1 -1
  106. package/node_modules/@earendil-works/pi-ai/dist/utils/oauth/index.d.ts +0 -1
  107. package/node_modules/@earendil-works/pi-ai/dist/utils/oauth/index.d.ts.map +1 -1
  108. package/node_modules/@earendil-works/pi-ai/dist/utils/oauth/index.js +0 -9
  109. package/node_modules/@earendil-works/pi-ai/dist/utils/oauth/index.js.map +1 -1
  110. package/node_modules/@earendil-works/pi-ai/package.json +1 -1
  111. package/node_modules/@earendil-works/pi-pty/native/prebuilds/darwin-arm64/senpi_pty.darwin-arm64.node +0 -0
  112. package/node_modules/@earendil-works/pi-pty/package.json +1 -1
  113. package/node_modules/@earendil-works/pi-tui/package.json +1 -1
  114. package/package.json +6 -6
  115. package/dist/core/radius.d.ts +0 -21
  116. package/dist/core/radius.d.ts.map +0 -1
  117. package/dist/core/radius.js +0 -30
  118. package/dist/core/radius.js.map +0 -1
  119. package/examples/AGENTS.md +0 -34
  120. package/node_modules/@earendil-works/pi-ai/dist/api/pi-messages.d.ts +0 -97
  121. package/node_modules/@earendil-works/pi-ai/dist/api/pi-messages.d.ts.map +0 -1
  122. package/node_modules/@earendil-works/pi-ai/dist/api/pi-messages.js +0 -307
  123. package/node_modules/@earendil-works/pi-ai/dist/api/pi-messages.js.map +0 -1
  124. package/node_modules/@earendil-works/pi-ai/dist/api/pi-messages.lazy.d.ts +0 -3
  125. package/node_modules/@earendil-works/pi-ai/dist/api/pi-messages.lazy.d.ts.map +0 -1
  126. package/node_modules/@earendil-works/pi-ai/dist/api/pi-messages.lazy.js +0 -3
  127. package/node_modules/@earendil-works/pi-ai/dist/api/pi-messages.lazy.js.map +0 -1
  128. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/anthropic-xml/coerce-parameters.d.ts +0 -8
  129. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/anthropic-xml/coerce-parameters.d.ts.map +0 -1
  130. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/anthropic-xml/coerce-parameters.js +0 -92
  131. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/anthropic-xml/coerce-parameters.js.map +0 -1
  132. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/anthropic-xml/format.d.ts +0 -6
  133. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/anthropic-xml/format.d.ts.map +0 -1
  134. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/anthropic-xml/format.js +0 -54
  135. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/anthropic-xml/format.js.map +0 -1
  136. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/anthropic-xml/index.d.ts +0 -4
  137. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/anthropic-xml/index.d.ts.map +0 -1
  138. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/anthropic-xml/index.js +0 -4
  139. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/anthropic-xml/index.js.map +0 -1
  140. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/anthropic-xml/invoke-match.d.ts +0 -7
  141. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/anthropic-xml/invoke-match.d.ts.map +0 -1
  142. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/anthropic-xml/invoke-match.js +0 -16
  143. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/anthropic-xml/invoke-match.js.map +0 -1
  144. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/anthropic-xml/invoke-tag-scanner.d.ts +0 -19
  145. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/anthropic-xml/invoke-tag-scanner.d.ts.map +0 -1
  146. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/anthropic-xml/invoke-tag-scanner.js +0 -217
  147. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/anthropic-xml/invoke-tag-scanner.js.map +0 -1
  148. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/anthropic-xml/parse.d.ts +0 -4
  149. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/anthropic-xml/parse.d.ts.map +0 -1
  150. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/anthropic-xml/parse.js +0 -46
  151. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/anthropic-xml/parse.js.map +0 -1
  152. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/anthropic-xml/stream-boundary.d.ts +0 -13
  153. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/anthropic-xml/stream-boundary.d.ts.map +0 -1
  154. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/anthropic-xml/stream-boundary.js +0 -144
  155. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/anthropic-xml/stream-boundary.js.map +0 -1
  156. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/anthropic-xml/stream.d.ts +0 -5
  157. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/anthropic-xml/stream.d.ts.map +0 -1
  158. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/anthropic-xml/stream.js +0 -208
  159. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/anthropic-xml/stream.js.map +0 -1
  160. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/anthropic-xml/tool-resolver.d.ts +0 -4
  161. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/anthropic-xml/tool-resolver.d.ts.map +0 -1
  162. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/anthropic-xml/tool-resolver.js +0 -17
  163. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/anthropic-xml/tool-resolver.js.map +0 -1
  164. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/anthropic-xml/xml-entities.d.ts +0 -5
  165. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/anthropic-xml/xml-entities.d.ts.map +0 -1
  166. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/anthropic-xml/xml-entities.js +0 -34
  167. package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/protocols/anthropic-xml/xml-entities.js.map +0 -1
  168. package/node_modules/@earendil-works/pi-ai/dist/utils/oauth/radius.d.ts +0 -39
  169. package/node_modules/@earendil-works/pi-ai/dist/utils/oauth/radius.d.ts.map +0 -1
  170. package/node_modules/@earendil-works/pi-ai/dist/utils/oauth/radius.js +0 -413
  171. package/node_modules/@earendil-works/pi-ai/dist/utils/oauth/radius.js.map +0 -1
@@ -722,8 +722,6 @@ interface ProviderModelConfig {
722
722
  thinkingFormat?: "openai" | "openrouter" | "deepseek" | "together" | "zai" | "qwen" | "chat-template" | "qwen-chat-template" | "string-thinking" | "ant-ling";
723
723
  chatTemplateKwargs?: Record<string, string | number | boolean | null | { "$var": "thinking.enabled" | "thinking.effort"; omitWhenOff?: boolean }>;
724
724
  cacheControlFormat?: "anthropic";
725
- sessionAffinityFormat?: "openai" | "openai-nosession" | "openrouter";
726
- sendSessionAffinityHeaders?: boolean;
727
725
 
728
726
  // anthropic-messages
729
727
  supportsEagerToolInputStreaming?: boolean;
package/docs/models.md CHANGED
@@ -447,8 +447,6 @@ For providers with partial OpenAI compatibility, use the `compat` field.
447
447
  | `thinkingFormat` | Use `reasoning_effort`, `openrouter`, `deepseek`, `together`, `zai`, `qwen`, `chat-template`, or `qwen-chat-template` thinking parameters |
448
448
  | `chatTemplateKwargs` | `chat_template_kwargs` values for `thinkingFormat: "chat-template"`; use `{ "$var": "thinking.enabled" }` or `{ "$var": "thinking.effort" }` for pi-controlled thinking values |
449
449
  | `cacheControlFormat` | Use Anthropic-style `cache_control` markers on the system prompt, last tool definition, and last user/assistant text content. Currently only `anthropic` is supported. |
450
- | `sendSessionAffinityHeaders` | For `openai-completions`, send session-affinity headers from the session id when caching is enabled. Default: `false`. |
451
- | `sessionAffinityFormat` | For `openai-completions` and `openai-responses`, the session-affinity header format: `openai` sends `session_id`/`x-client-request-id` (completions also `x-session-affinity`), `openai-nosession` omits the underscore-containing `session_id` header, `openrouter` sends `x-session-id`. Does not affect the `prompt_cache_key` body param. Default: auto-detected. |
452
450
  | `supportsStrictMode` | Include the `strict` field in tool definitions |
453
451
  | `supportsLongCacheRetention` | Whether the provider accepts long cache retention when cache retention is `long`: `prompt_cache_retention: "24h"` for OpenAI prompt caching, or `cache_control.ttl: "1h"` when `cacheControlFormat` is `anthropic`. Default: `true`. |
454
452
  | `openRouterRouting` | OpenRouter provider routing preferences. This object is sent as-is in the `provider` field of the [OpenRouter API request](https://openrouter.ai/docs/guides/routing/provider-selection). |
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "name": "pi-extension-custom-provider",
3
- "version": "0.80.7",
3
+ "version": "0.80.6",
4
4
  "lockfileVersion": 3,
5
5
  "requires": true,
6
6
  "packages": {
7
7
  "": {
8
8
  "name": "pi-extension-custom-provider",
9
- "version": "0.80.7",
9
+ "version": "0.80.6",
10
10
  "dependencies": {
11
11
  "@anthropic-ai/sdk": "^0.52.0"
12
12
  }
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "pi-extension-custom-provider-anthropic",
3
3
  "private": true,
4
- "version": "0.80.7",
4
+ "version": "0.80.6",
5
5
  "type": "module",
6
6
  "scripts": {
7
7
  "clean": "echo 'nothing to clean'",
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "pi-extension-custom-provider-gitlab-duo",
3
3
  "private": true,
4
- "version": "0.80.7",
4
+ "version": "0.80.6",
5
5
  "type": "module",
6
6
  "scripts": {
7
7
  "clean": "echo 'nothing to clean'",
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "name": "pi-extension-gondolin",
3
- "version": "0.80.7",
3
+ "version": "0.80.6",
4
4
  "lockfileVersion": 3,
5
5
  "requires": true,
6
6
  "packages": {
7
7
  "": {
8
8
  "name": "pi-extension-gondolin",
9
- "version": "0.80.7",
9
+ "version": "0.80.6",
10
10
  "dependencies": {
11
11
  "@earendil-works/gondolin": "0.12.0"
12
12
  }
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "pi-extension-gondolin",
3
3
  "private": true,
4
- "version": "0.80.7",
4
+ "version": "0.80.6",
5
5
  "type": "module",
6
6
  "scripts": {
7
7
  "clean": "echo 'nothing to clean'",
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "name": "pi-extension-sandbox",
3
- "version": "1.10.7",
3
+ "version": "1.10.6",
4
4
  "lockfileVersion": 3,
5
5
  "requires": true,
6
6
  "packages": {
7
7
  "": {
8
8
  "name": "pi-extension-sandbox",
9
- "version": "1.10.7",
9
+ "version": "1.10.6",
10
10
  "dependencies": {
11
11
  "@anthropic-ai/sandbox-runtime": "^0.0.26"
12
12
  }
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "pi-extension-sandbox",
3
3
  "private": true,
4
- "version": "1.10.7",
4
+ "version": "1.10.6",
5
5
  "type": "module",
6
6
  "scripts": {
7
7
  "clean": "echo 'nothing to clean'",
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "name": "pi-extension-with-deps",
3
- "version": "0.80.7",
3
+ "version": "0.80.6",
4
4
  "lockfileVersion": 3,
5
5
  "requires": true,
6
6
  "packages": {
7
7
  "": {
8
8
  "name": "pi-extension-with-deps",
9
- "version": "0.80.7",
9
+ "version": "0.80.6",
10
10
  "dependencies": {
11
11
  "ms": "^2.1.3"
12
12
  },
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "pi-extension-with-deps",
3
3
  "private": true,
4
- "version": "0.80.7",
4
+ "version": "0.80.6",
5
5
  "type": "module",
6
6
  "scripts": {
7
7
  "clean": "echo 'nothing to clean'",
@@ -1,21 +1,5 @@
1
1
  # Changelog
2
2
 
3
- ## [2026.7.14-3] - 2026-07-14
4
-
5
- ### Added
6
-
7
- ### Changed
8
-
9
- ### Fixed
10
-
11
- ## [2026.7.14-2] - 2026-07-14
12
-
13
- ### Added
14
-
15
- ### Changed
16
-
17
- ### Fixed
18
-
19
3
  ## [2026.7.14] - 2026-07-14
20
4
 
21
5
  ### Added
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@code-yeongyu/senpi-codemode",
3
- "version": "2026.7.14-3",
3
+ "version": "2026.7.14",
4
4
  "description": "Source-only senpi extension package for codemode evaluation tools",
5
5
  "type": "module",
6
6
  "main": "./src/index.ts",
@@ -30,14 +30,14 @@
30
30
  },
31
31
  "dependencies": {
32
32
  "@babel/parser": "7.29.7",
33
- "@earendil-works/pi-ai": "^2026.7.14-3",
33
+ "@earendil-works/pi-ai": "^2026.7.14",
34
34
  "typebox": "1.1.38"
35
35
  },
36
36
  "peerDependencies": {
37
37
  "@code-yeongyu/senpi": "*"
38
38
  },
39
39
  "devDependencies": {
40
- "@code-yeongyu/senpi": "2026.7.14-3"
40
+ "@code-yeongyu/senpi": "2026.7.14"
41
41
  },
42
42
  "keywords": [
43
43
  "senpi",
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@earendil-works/pi-agent-core",
3
3
  "private": true,
4
- "version": "2026.7.14-3",
4
+ "version": "2026.7.14",
5
5
  "description": "General-purpose agent with transport abstraction, state management, and attachment support",
6
6
  "type": "module",
7
7
  "main": "./dist/index.js",
@@ -30,7 +30,7 @@
30
30
  "prepublishOnly": "npm run clean && npm run build"
31
31
  },
32
32
  "dependencies": {
33
- "@earendil-works/pi-ai": "^2026.7.14-3",
33
+ "@earendil-works/pi-ai": "^2026.7.14",
34
34
  "ignore": "7.0.5",
35
35
  "typebox": "1.1.38",
36
36
  "yaml": "2.9.0"
@@ -1070,8 +1070,7 @@ interface OpenAICompletionsCompat {
1070
1070
  supportsReasoningEffort?: boolean; // Whether provider supports `reasoning_effort` (default: true)
1071
1071
  supportsUsageInStreaming?: boolean; // Whether provider supports `stream_options: { include_usage: true }` (default: true)
1072
1072
  supportsStrictMode?: boolean; // Whether provider supports `strict` in tool definitions (default: true)
1073
- sendSessionAffinityHeaders?: boolean; // Send session-affinity data from `sessionId` (default: false)
1074
- sessionAffinityFormat?: 'openai' | 'openai-nosession' | 'openrouter'; // Format for session affinity: 'openai' uses `prompt_cache_key`, `session_id`, `x-client-request-id`, and `x-session-affinity`; 'openai-nosession' uses `prompt_cache_key`, `x-client-request-id`, and `x-session-affinity`; 'openrouter' uses `x-session-id` (default: auto-detected)
1073
+ sendSessionAffinityHeaders?: boolean; // Whether to send `session_id`, `x-client-request-id`, and `x-session-affinity` from `sessionId` when caching is enabled (default: false)
1075
1074
  maxTokensField?: 'max_completion_tokens' | 'max_tokens'; // Which field name to use (default: max_completion_tokens)
1076
1075
  requiresToolResultName?: boolean; // Whether tool results require the `name` field (default: false)
1077
1076
  requiresAssistantAfterToolResult?: boolean; // Whether tool results must be followed by an assistant message (default: false)
@@ -1086,7 +1085,7 @@ interface OpenAICompletionsCompat {
1086
1085
 
1087
1086
  interface OpenAIResponsesCompat {
1088
1087
  supportsDeveloperRole?: boolean; // Whether provider supports `developer` role vs `system` (default: true)
1089
- sessionAffinityFormat?: 'openai' | 'openai-nosession' | 'openrouter'; // Session-affinity header format: 'openai' sends `session_id` and `x-client-request-id`; 'openai-nosession' sends `x-client-request-id`; 'openrouter' sends `x-session-id`. Does not affect the `prompt_cache_key` body param (default: auto-detected)
1088
+ sendSessionIdHeader?: boolean; // Whether to send `session_id` from `sessionId` when caching is enabled (default: true)
1090
1089
  supportsLongCacheRetention?: boolean; // Whether provider supports `prompt_cache_retention: "24h"` (default: true)
1091
1090
  }
1092
1091
  ```
@@ -1 +1 @@
1
- {"version":3,"file":"anthropic-messages.d.ts","sourceRoot":"","sources":["../../src/api/anthropic-messages.ts"],"names":[],"mappings":"AAAA,OAAO,SAAS,MAAM,mBAAmB,CAAC;AAU1C,OAAO,KAAK,EAWX,mBAAmB,EAEnB,cAAc,EACd,aAAa,EAMb,MAAM,aAAa,CAAC;AAgKrB,MAAM,MAAM,eAAe,GAAG,KAAK,GAAG,QAAQ,GAAG,MAAM,GAAG,OAAO,GAAG,KAAK,CAAC;AAE1E,MAAM,MAAM,wBAAwB,GAAG,YAAY,GAAG,SAAS,CAAC;AAuDhE,MAAM,WAAW,gBAAiB,SAAQ,aAAa;IACtD;;;;;;OAMG;IACH,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B;;;;OAIG;IACH,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B;;;;;;;;;;;OAWG;IACH,MAAM,CAAC,EAAE,eAAe,CAAC;IACzB;;;;;;;;;;;OAWG;IACH,eAAe,CAAC,EAAE,wBAAwB,CAAC;IAC3C;;;;;OAKG;IACH,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAC9B;;;;OAIG;IACH,UAAU,CAAC,EAAE,MAAM,GAAG,KAAK,GAAG,MAAM,GAAG;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;IACtE;;;;OAIG;IACH,MAAM,CAAC,EAAE,SAAS,CAAC;CACnB;AAghBD,eAAO,MAAM,MAAM,EAAE,cAAc,CAAC,oBAAoB,EAAE,gBAAgB,CAsTzE,CAAC;AAoEF,eAAO,MAAM,YAAY,EAAE,cAAc,CAAC,oBAAoB,EAAE,mBAAmB,CA2ClF,CAAC"}
1
+ {"version":3,"file":"anthropic-messages.d.ts","sourceRoot":"","sources":["../../src/api/anthropic-messages.ts"],"names":[],"mappings":"AAAA,OAAO,SAAS,MAAM,mBAAmB,CAAC;AAU1C,OAAO,KAAK,EAWX,mBAAmB,EAEnB,cAAc,EACd,aAAa,EAMb,MAAM,aAAa,CAAC;AAgKrB,MAAM,MAAM,eAAe,GAAG,KAAK,GAAG,QAAQ,GAAG,MAAM,GAAG,OAAO,GAAG,KAAK,CAAC;AAE1E,MAAM,MAAM,wBAAwB,GAAG,YAAY,GAAG,SAAS,CAAC;AAuDhE,MAAM,WAAW,gBAAiB,SAAQ,aAAa;IACtD;;;;;;OAMG;IACH,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B;;;;OAIG;IACH,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B;;;;;;;;;;;OAWG;IACH,MAAM,CAAC,EAAE,eAAe,CAAC;IACzB;;;;;;;;;;;OAWG;IACH,eAAe,CAAC,EAAE,wBAAwB,CAAC;IAC3C;;;;;OAKG;IACH,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAC9B;;;;OAIG;IACH,UAAU,CAAC,EAAE,MAAM,GAAG,KAAK,GAAG,MAAM,GAAG;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;IACtE;;;;OAIG;IACH,MAAM,CAAC,EAAE,SAAS,CAAC;CACnB;AAkiBD,eAAO,MAAM,MAAM,EAAE,cAAc,CAAC,oBAAoB,EAAE,gBAAgB,CAoTzE,CAAC;AAoEF,eAAO,MAAM,YAAY,EAAE,cAAc,CAAC,oBAAoB,EAAE,mBAAmB,CA2ClF,CAAC"}
@@ -200,6 +200,24 @@ const REPLAYABLE_ANTHROPIC_PROVIDER_NATIVE_TYPES = new Set([
200
200
  function isReplayableAnthropicProviderNativeBlock(raw) {
201
201
  return isRecord(raw) && typeof raw.type === "string" && REPLAYABLE_ANTHROPIC_PROVIDER_NATIVE_TYPES.has(raw.type);
202
202
  }
203
+ function stripEncryptedContentFromWebSearchResult(raw) {
204
+ const { encrypted_content: _encryptedContent, ...rest } = raw;
205
+ return rest;
206
+ }
207
+ function sanitizeReplayableAnthropicProviderNativeBlock(raw) {
208
+ if (!isReplayableAnthropicProviderNativeBlock(raw))
209
+ return undefined;
210
+ if (!isRecord(raw) || raw.type !== "web_search_tool_result" || !Array.isArray(raw.content))
211
+ return raw;
212
+ return {
213
+ ...raw,
214
+ content: raw.content.map((item) => {
215
+ if (!isRecord(item) || item.type !== "web_search_result")
216
+ return item;
217
+ return stripEncryptedContentFromWebSearchResult(item);
218
+ }),
219
+ };
220
+ }
203
221
  function isSameAnthropicModel(message, model) {
204
222
  return message.provider === model.provider && message.api === model.api && message.model === model.id;
205
223
  }
@@ -819,27 +837,25 @@ export const stream = (model, context, options) => {
819
837
  }
820
838
  // Only update usage fields if present (not null).
821
839
  // Preserves input_tokens from message_start when proxies omit it in message_delta.
822
- if (event.usage) {
823
- if (event.usage.input_tokens != null) {
824
- output.usage.input = event.usage.input_tokens;
825
- }
826
- if (event.usage.output_tokens != null) {
827
- output.usage.output = event.usage.output_tokens;
828
- }
829
- if (event.usage.cache_read_input_tokens != null) {
830
- output.usage.cacheRead = event.usage.cache_read_input_tokens;
831
- }
832
- if (event.usage.cache_creation_input_tokens != null) {
833
- output.usage.cacheWrite = event.usage.cache_creation_input_tokens;
834
- }
835
- // Anthropic reports reasoning tokens in `output_tokens_details.thinking_tokens` on the
836
- // final message_delta usage (a subset of output_tokens). SDK 0.91.1 omits the field from
837
- // its Usage type, so read it through a narrow cast. Verified against the live API.
838
- const thinkingTokens = event.usage
839
- .output_tokens_details?.thinking_tokens;
840
- if (thinkingTokens != null) {
841
- output.usage.reasoning = thinkingTokens;
842
- }
840
+ if (event.usage.input_tokens != null) {
841
+ output.usage.input = event.usage.input_tokens;
842
+ }
843
+ if (event.usage.output_tokens != null) {
844
+ output.usage.output = event.usage.output_tokens;
845
+ }
846
+ if (event.usage.cache_read_input_tokens != null) {
847
+ output.usage.cacheRead = event.usage.cache_read_input_tokens;
848
+ }
849
+ if (event.usage.cache_creation_input_tokens != null) {
850
+ output.usage.cacheWrite = event.usage.cache_creation_input_tokens;
851
+ }
852
+ // Anthropic reports reasoning tokens in `output_tokens_details.thinking_tokens` on the
853
+ // final message_delta usage (a subset of output_tokens). SDK 0.91.1 omits the field from
854
+ // its Usage type, so read it through a narrow cast. Verified against the live API.
855
+ const thinkingTokens = event.usage
856
+ .output_tokens_details?.thinking_tokens;
857
+ if (thinkingTokens != null) {
858
+ output.usage.reasoning = thinkingTokens;
843
859
  }
844
860
  // Anthropic doesn't provide total_tokens, compute from components
845
861
  output.usage.totalTokens =
@@ -1320,8 +1336,11 @@ function convertMessages(transformedMessages, model, isOAuthToken, cacheControl,
1320
1336
  });
1321
1337
  }
1322
1338
  else if (block.type === "providerNative") {
1323
- if (isSameModel && isReplayableAnthropicProviderNativeBlock(block.raw))
1324
- blocks.push(block.raw);
1339
+ if (isSameModel) {
1340
+ const replayableBlock = sanitizeReplayableAnthropicProviderNativeBlock(block.raw);
1341
+ if (replayableBlock)
1342
+ blocks.push(replayableBlock);
1343
+ }
1325
1344
  }
1326
1345
  }
1327
1346
  if (blocks.length === 0)