@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.
- package/CHANGELOG.md +0 -18
- package/dist/core/agent-session.d.ts +0 -32
- package/dist/core/agent-session.d.ts.map +1 -1
- package/dist/core/agent-session.js +68 -368
- package/dist/core/agent-session.js.map +1 -1
- package/dist/core/compaction/compaction.d.ts +2 -2
- package/dist/core/compaction/compaction.d.ts.map +1 -1
- package/dist/core/compaction/compaction.js +11 -39
- package/dist/core/compaction/compaction.js.map +1 -1
- package/dist/core/extensions/builtin/compaction/index.d.ts.map +1 -1
- package/dist/core/extensions/builtin/compaction/index.js +8 -24
- package/dist/core/extensions/builtin/compaction/index.js.map +1 -1
- package/dist/core/extensions/builtin/goal/command-registration.d.ts +2 -2
- package/dist/core/extensions/builtin/goal/command-registration.d.ts.map +1 -1
- package/dist/core/extensions/builtin/goal/command-registration.js +4 -3
- package/dist/core/extensions/builtin/goal/command-registration.js.map +1 -1
- package/dist/core/extensions/builtin/goal/index.d.ts.map +1 -1
- package/dist/core/extensions/builtin/goal/index.js +27 -11
- package/dist/core/extensions/builtin/goal/index.js.map +1 -1
- package/dist/core/extensions/builtin/goal/tool-registration.d.ts +2 -2
- package/dist/core/extensions/builtin/goal/tool-registration.d.ts.map +1 -1
- package/dist/core/extensions/builtin/goal/tool-registration.js +3 -2
- package/dist/core/extensions/builtin/goal/tool-registration.js.map +1 -1
- package/dist/core/extensions/builtin/index.d.ts.map +1 -1
- package/dist/core/extensions/builtin/index.js +0 -2
- package/dist/core/extensions/builtin/index.js.map +1 -1
- package/dist/core/extensions/builtin/nested-agents-md/index.d.ts.map +1 -1
- package/dist/core/extensions/builtin/nested-agents-md/index.js +1 -4
- package/dist/core/extensions/builtin/nested-agents-md/index.js.map +1 -1
- package/dist/core/extensions/builtin/rules/index.d.ts.map +1 -1
- package/dist/core/extensions/builtin/rules/index.js +1 -4
- package/dist/core/extensions/builtin/rules/index.js.map +1 -1
- package/dist/core/extensions/builtin/websearch/websearch/renderers.d.ts.map +1 -1
- package/dist/core/extensions/builtin/websearch/websearch/renderers.js +4 -13
- package/dist/core/extensions/builtin/websearch/websearch/renderers.js.map +1 -1
- package/dist/core/extensions/builtin/websearch/websearch/search.d.ts +2 -3
- package/dist/core/extensions/builtin/websearch/websearch/search.d.ts.map +1 -1
- package/dist/core/extensions/builtin/websearch/websearch/search.js +1 -2
- package/dist/core/extensions/builtin/websearch/websearch/search.js.map +1 -1
- package/dist/core/extensions/builtin/websearch/websearch/tool.d.ts.map +1 -1
- package/dist/core/extensions/builtin/websearch/websearch/tool.js +1 -17
- package/dist/core/extensions/builtin/websearch/websearch/tool.js.map +1 -1
- package/dist/core/extensions/builtin/websearch/websearch/types.d.ts +0 -2
- package/dist/core/extensions/builtin/websearch/websearch/types.d.ts.map +1 -1
- package/dist/core/extensions/builtin/websearch/websearch/types.js.map +1 -1
- package/dist/core/extensions/runner.d.ts +0 -1
- package/dist/core/extensions/runner.d.ts.map +1 -1
- package/dist/core/extensions/runner.js +0 -31
- package/dist/core/extensions/runner.js.map +1 -1
- package/dist/core/extensions/types.d.ts +10 -67
- package/dist/core/extensions/types.d.ts.map +1 -1
- package/dist/core/extensions/types.js.map +1 -1
- package/dist/core/sdk.d.ts.map +1 -1
- package/dist/core/sdk.js +0 -1
- package/dist/core/sdk.js.map +1 -1
- package/dist/core/session-manager.d.ts +1 -6
- package/dist/core/session-manager.d.ts.map +1 -1
- package/dist/core/session-manager.js +3 -19
- package/dist/core/session-manager.js.map +1 -1
- package/dist/core/settings-manager.d.ts +0 -15
- package/dist/core/settings-manager.d.ts.map +1 -1
- package/dist/core/settings-manager.js +1 -80
- package/dist/core/settings-manager.js.map +1 -1
- package/dist/modes/interactive/components/footer.d.ts +1 -2
- package/dist/modes/interactive/components/footer.d.ts.map +1 -1
- package/dist/modes/interactive/components/footer.js +2 -21
- package/dist/modes/interactive/components/footer.js.map +1 -1
- package/dist/modes/interactive/interactive-mode.d.ts +0 -4
- package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-mode.js +3 -78
- package/dist/modes/interactive/interactive-mode.js.map +1 -1
- package/docs/extensions.md +0 -28
- package/docs/settings.md +0 -35
- package/node_modules/@code-yeongyu/senpi-codemode/CHANGELOG.md +0 -12
- package/node_modules/@code-yeongyu/senpi-codemode/package.json +3 -3
- package/node_modules/@earendil-works/pi-agent-core/dist/agent-loop.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/agent-loop.js +8 -76
- package/node_modules/@earendil-works/pi-agent-core/dist/agent-loop.js.map +1 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/agent.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/agent.js +1 -26
- package/node_modules/@earendil-works/pi-agent-core/dist/agent.js.map +1 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/agent-harness.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/agent-harness.js +2 -24
- package/node_modules/@earendil-works/pi-agent-core/dist/harness/agent-harness.js.map +1 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/types.d.ts +0 -5
- package/node_modules/@earendil-works/pi-agent-core/dist/types.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/types.js.map +1 -1
- package/node_modules/@earendil-works/pi-agent-core/package.json +2 -2
- package/node_modules/@earendil-works/pi-ai/dist/api/anthropic-messages.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/api/anthropic-messages.js +25 -68
- package/node_modules/@earendil-works/pi-ai/dist/api/anthropic-messages.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/api/transform-messages.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/api/transform-messages.js +52 -62
- package/node_modules/@earendil-works/pi-ai/dist/api/transform-messages.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/index.d.ts +0 -1
- package/node_modules/@earendil-works/pi-ai/dist/index.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/index.js +0 -1
- package/node_modules/@earendil-works/pi-ai/dist/index.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/models.generated.d.ts +4 -0
- package/node_modules/@earendil-works/pi-ai/dist/models.generated.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/data/kimi-coding.json +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/data/openrouter.json +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/data/vercel-ai-gateway.json +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/faux.d.ts +0 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/faux.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/faux.js +0 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/faux.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/kimi-coding.models.d.ts +4 -0
- package/node_modules/@earendil-works/pi-ai/dist/providers/kimi-coding.models.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/kimi-coding.models.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/types.d.ts +0 -15
- package/node_modules/@earendil-works/pi-ai/dist/types.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/types.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/utils/retry.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/utils/retry.js +1 -5
- package/node_modules/@earendil-works/pi-ai/dist/utils/retry.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/package.json +1 -1
- package/node_modules/@earendil-works/pi-pty/package.json +1 -1
- package/node_modules/@earendil-works/pi-tui/package.json +1 -1
- package/package.json +6 -6
- package/dist/core/extensions/builtin/goal/turn-usage.d.ts +0 -20
- package/dist/core/extensions/builtin/goal/turn-usage.d.ts.map +0 -1
- package/dist/core/extensions/builtin/goal/turn-usage.js +0 -61
- package/dist/core/extensions/builtin/goal/turn-usage.js.map +0 -1
- package/dist/core/extensions/builtin/model-fallback/index.d.ts +0 -4
- package/dist/core/extensions/builtin/model-fallback/index.d.ts.map +0 -1
- package/dist/core/extensions/builtin/model-fallback/index.js +0 -55
- package/dist/core/extensions/builtin/model-fallback/index.js.map +0 -1
- package/dist/core/extensions/builtin/model-fallback/settings.d.ts +0 -6
- package/dist/core/extensions/builtin/model-fallback/settings.d.ts.map +0 -1
- package/dist/core/extensions/builtin/model-fallback/settings.js +0 -11
- package/dist/core/extensions/builtin/model-fallback/settings.js.map +0 -1
- package/dist/core/extensions/builtin/model-fallback/ui.d.ts +0 -12
- package/dist/core/extensions/builtin/model-fallback/ui.d.ts.map +0 -1
- package/dist/core/extensions/builtin/model-fallback/ui.js +0 -72
- package/dist/core/extensions/builtin/model-fallback/ui.js.map +0 -1
- package/dist/core/retry-fallback/chains.d.ts +0 -29
- package/dist/core/retry-fallback/chains.d.ts.map +0 -1
- package/dist/core/retry-fallback/chains.js +0 -109
- package/dist/core/retry-fallback/chains.js.map +0 -1
- package/dist/core/retry-fallback/controller.d.ts +0 -77
- package/dist/core/retry-fallback/controller.d.ts.map +0 -1
- package/dist/core/retry-fallback/controller.js +0 -157
- package/dist/core/retry-fallback/controller.js.map +0 -1
- package/dist/core/retry-fallback/cooldown.d.ts +0 -21
- package/dist/core/retry-fallback/cooldown.d.ts.map +0 -1
- package/dist/core/retry-fallback/cooldown.js +0 -49
- package/dist/core/retry-fallback/cooldown.js.map +0 -1
- package/dist/core/retry-fallback/log.d.ts +0 -10
- package/dist/core/retry-fallback/log.d.ts.map +0 -1
- package/dist/core/retry-fallback/log.js +0 -128
- package/dist/core/retry-fallback/log.js.map +0 -1
- package/dist/core/retry-fallback/validate.d.ts +0 -8
- package/dist/core/retry-fallback/validate.d.ts.map +0 -1
- package/dist/core/retry-fallback/validate.js +0 -63
- package/dist/core/retry-fallback/validate.js.map +0 -1
- package/node_modules/@earendil-works/pi-ai/dist/utils/stop-details.d.ts +0 -4
- package/node_modules/@earendil-works/pi-ai/dist/utils/stop-details.d.ts.map +0 -1
- package/node_modules/@earendil-works/pi-ai/dist/utils/stop-details.js +0 -6
- 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
|
-
|
|
676
|
-
|
|
677
|
-
|
|
678
|
-
|
|
679
|
-
|
|
680
|
-
|
|
681
|
-
|
|
682
|
-
|
|
683
|
-
|
|
684
|
-
|
|
685
|
-
|
|
686
|
-
|
|
687
|
-
|
|
688
|
-
|
|
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
|
|
675
|
+
let response;
|
|
711
676
|
try {
|
|
712
|
-
|
|
677
|
+
response = await client.messages.create({ ...params, stream: true }, requestOptions).asResponse();
|
|
713
678
|
}
|
|
714
679
|
catch (error) {
|
|
715
|
-
if (
|
|
716
|
-
|
|
717
|
-
|
|
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
|
|
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,
|
|
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,
|
|
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(
|
|
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"
|
|
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}`);
|