@code-yeongyu/senpi 2026.7.16 → 2026.7.17-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.
- package/CHANGELOG.md +65 -0
- package/dist/core/dynamic-prompt/build.d.ts +7 -0
- package/dist/core/dynamic-prompt/build.d.ts.map +1 -1
- package/dist/core/dynamic-prompt/build.js +5 -0
- package/dist/core/dynamic-prompt/build.js.map +1 -1
- package/dist/core/dynamic-prompt/workstation.d.ts +35 -0
- package/dist/core/dynamic-prompt/workstation.d.ts.map +1 -0
- package/dist/core/dynamic-prompt/workstation.js +81 -0
- package/dist/core/dynamic-prompt/workstation.js.map +1 -0
- package/dist/core/extensions/builtin/anthropic-web-search/index.d.ts +6 -2
- package/dist/core/extensions/builtin/anthropic-web-search/index.d.ts.map +1 -1
- package/dist/core/extensions/builtin/anthropic-web-search/index.js +73 -5
- package/dist/core/extensions/builtin/anthropic-web-search/index.js.map +1 -1
- package/dist/core/extensions/builtin/goal/command-registration.d.ts +1 -0
- package/dist/core/extensions/builtin/goal/command-registration.d.ts.map +1 -1
- package/dist/core/extensions/builtin/goal/command-registration.js +4 -5
- package/dist/core/extensions/builtin/goal/command-registration.js.map +1 -1
- package/dist/core/extensions/builtin/goal/elapsed-ticker.d.ts +43 -0
- package/dist/core/extensions/builtin/goal/elapsed-ticker.d.ts.map +1 -0
- package/dist/core/extensions/builtin/goal/elapsed-ticker.js +58 -0
- package/dist/core/extensions/builtin/goal/elapsed-ticker.js.map +1 -0
- package/dist/core/extensions/builtin/goal/index.d.ts.map +1 -1
- package/dist/core/extensions/builtin/goal/index.js +39 -14
- package/dist/core/extensions/builtin/goal/index.js.map +1 -1
- package/dist/core/extensions/builtin/goal/tool-registration.d.ts +1 -0
- package/dist/core/extensions/builtin/goal/tool-registration.d.ts.map +1 -1
- package/dist/core/extensions/builtin/goal/tool-registration.js +3 -4
- package/dist/core/extensions/builtin/goal/tool-registration.js.map +1 -1
- package/dist/core/extensions/builtin/goal/ui.d.ts +2 -2
- package/dist/core/extensions/builtin/goal/ui.d.ts.map +1 -1
- package/dist/core/extensions/builtin/goal/ui.js +8 -4
- package/dist/core/extensions/builtin/goal/ui.js.map +1 -1
- package/dist/core/extensions/builtin/prompt-preset/claude-fable-5.d.ts.map +1 -1
- package/dist/core/extensions/builtin/prompt-preset/claude-fable-5.js +5 -1
- package/dist/core/extensions/builtin/prompt-preset/claude-fable-5.js.map +1 -1
- package/dist/core/extensions/builtin/prompt-preset/claude-opus-4-5.d.ts.map +1 -1
- package/dist/core/extensions/builtin/prompt-preset/claude-opus-4-5.js +5 -1
- package/dist/core/extensions/builtin/prompt-preset/claude-opus-4-5.js.map +1 -1
- package/dist/core/extensions/builtin/prompt-preset/claude-opus-4-6.d.ts.map +1 -1
- package/dist/core/extensions/builtin/prompt-preset/claude-opus-4-6.js +5 -1
- package/dist/core/extensions/builtin/prompt-preset/claude-opus-4-6.js.map +1 -1
- package/dist/core/extensions/builtin/prompt-preset/claude-opus-4-7.d.ts.map +1 -1
- package/dist/core/extensions/builtin/prompt-preset/claude-opus-4-7.js +5 -1
- package/dist/core/extensions/builtin/prompt-preset/claude-opus-4-7.js.map +1 -1
- package/dist/core/extensions/builtin/prompt-preset/claude-opus-4-8.d.ts.map +1 -1
- package/dist/core/extensions/builtin/prompt-preset/claude-opus-4-8.js +5 -1
- package/dist/core/extensions/builtin/prompt-preset/claude-opus-4-8.js.map +1 -1
- package/dist/core/extensions/builtin/prompt-preset/glm-5-2.js +1 -1
- package/dist/core/extensions/builtin/prompt-preset/glm-5-2.js.map +1 -1
- package/dist/core/extensions/builtin/prompt-preset/gpt-5.2.js +1 -1
- package/dist/core/extensions/builtin/prompt-preset/gpt-5.2.js.map +1 -1
- package/dist/core/extensions/builtin/prompt-preset/gpt-5.3-codex.js +1 -1
- package/dist/core/extensions/builtin/prompt-preset/gpt-5.3-codex.js.map +1 -1
- package/dist/core/extensions/builtin/prompt-preset/gpt-5.4.js +1 -1
- package/dist/core/extensions/builtin/prompt-preset/gpt-5.4.js.map +1 -1
- package/dist/core/extensions/builtin/prompt-preset/gpt-5.5.js +1 -1
- package/dist/core/extensions/builtin/prompt-preset/gpt-5.5.js.map +1 -1
- package/dist/core/extensions/builtin/prompt-preset/gpt-5.6.js +1 -1
- package/dist/core/extensions/builtin/prompt-preset/gpt-5.6.js.map +1 -1
- package/dist/core/extensions/builtin/prompt-preset/gpt-5.js +1 -1
- package/dist/core/extensions/builtin/prompt-preset/gpt-5.js.map +1 -1
- package/dist/core/extensions/builtin/prompt-preset/kimi-k2-6.js +1 -1
- package/dist/core/extensions/builtin/prompt-preset/kimi-k2-6.js.map +1 -1
- package/dist/core/extensions/builtin/prompt-preset/kimi-k2-7.js +1 -1
- package/dist/core/extensions/builtin/prompt-preset/kimi-k2-7.js.map +1 -1
- package/dist/core/extensions/builtin/prompt-preset/kimi-k3.d.ts +3 -0
- package/dist/core/extensions/builtin/prompt-preset/kimi-k3.d.ts.map +1 -0
- package/dist/core/extensions/builtin/prompt-preset/kimi-k3.js +14 -0
- package/dist/core/extensions/builtin/prompt-preset/kimi-k3.js.map +1 -0
- package/dist/core/extensions/builtin/prompt-preset/presets.d.ts.map +1 -1
- package/dist/core/extensions/builtin/prompt-preset/presets.js +13 -0
- package/dist/core/extensions/builtin/prompt-preset/presets.js.map +1 -1
- package/dist/core/extensions/builtin/prompt-preset/settings.d.ts +1 -1
- package/dist/core/extensions/builtin/prompt-preset/settings.d.ts.map +1 -1
- package/dist/core/extensions/builtin/prompt-preset/settings.js +1 -0
- package/dist/core/extensions/builtin/prompt-preset/settings.js.map +1 -1
- package/dist/core/extensions/builtin/webfetch/webfetch/renderers.d.ts.map +1 -1
- package/dist/core/extensions/builtin/webfetch/webfetch/renderers.js +2 -1
- package/dist/core/extensions/builtin/webfetch/webfetch/renderers.js.map +1 -1
- package/dist/core/extensions/builtin/webfetch/webfetch/tool.d.ts +27 -0
- package/dist/core/extensions/builtin/webfetch/webfetch/tool.d.ts.map +1 -1
- package/dist/core/extensions/builtin/webfetch/webfetch/tool.js +60 -1
- package/dist/core/extensions/builtin/webfetch/webfetch/tool.js.map +1 -1
- package/dist/core/extensions/types.d.ts +5 -0
- package/dist/core/extensions/types.d.ts.map +1 -1
- package/dist/core/extensions/types.js.map +1 -1
- package/dist/core/model-config.d.ts +5 -0
- package/dist/core/model-config.d.ts.map +1 -1
- package/dist/core/model-config.js +1 -0
- package/dist/core/model-config.js.map +1 -1
- package/dist/modes/interactive/components/tool-execution-renderer.d.ts.map +1 -1
- package/dist/modes/interactive/components/tool-execution-renderer.js +1 -0
- package/dist/modes/interactive/components/tool-execution-renderer.js.map +1 -1
- package/docs/settings.md +1 -1
- package/examples/extensions/custom-provider-anthropic/package-lock.json +2 -2
- package/examples/extensions/custom-provider-anthropic/package.json +1 -1
- package/examples/extensions/custom-provider-gitlab-duo/package.json +1 -1
- package/examples/extensions/gondolin/package-lock.json +2 -2
- package/examples/extensions/gondolin/package.json +1 -1
- package/examples/extensions/sandbox/package-lock.json +2 -2
- package/examples/extensions/sandbox/package.json +1 -1
- package/examples/extensions/with-deps/package-lock.json +2 -2
- package/examples/extensions/with-deps/package.json +1 -1
- package/node_modules/@code-yeongyu/senpi-codemode/CHANGELOG.md +37 -0
- package/node_modules/@code-yeongyu/senpi-codemode/package.json +3 -3
- package/node_modules/@code-yeongyu/senpi-codemode/src/index.ts +59 -19
- package/node_modules/@code-yeongyu/senpi-codemode/src/prompt/eval-prompt.ts +68 -2
- package/node_modules/@code-yeongyu/senpi-codemode/src/tool/eval-tool.ts +6 -0
- package/node_modules/@code-yeongyu/senpi-codemode/src/tool/render.ts +6 -0
- package/node_modules/@earendil-works/pi-agent-core/package.json +2 -2
- package/node_modules/@earendil-works/pi-ai/README.md +1 -1
- 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 +58 -7
- package/node_modules/@earendil-works/pi-ai/dist/api/anthropic-messages.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/api/openai-completions.d.ts +2 -1
- package/node_modules/@earendil-works/pi-ai/dist/api/openai-completions.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/api/openai-completions.js +6 -1
- package/node_modules/@earendil-works/pi-ai/dist/api/openai-completions.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/models.generated.d.ts +70 -110
- package/node_modules/@earendil-works/pi-ai/dist/models.generated.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/kimi-coding.models.d.ts +26 -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 +6 -0
- package/node_modules/@earendil-works/pi-ai/dist/providers/kimi-coding.models.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/moonshotai-cn.models.js +3 -3
- package/node_modules/@earendil-works/pi-ai/dist/providers/moonshotai-cn.models.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/moonshotai.models.js +3 -3
- package/node_modules/@earendil-works/pi-ai/dist/providers/moonshotai.models.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/opencode-go.models.d.ts +44 -0
- package/node_modules/@earendil-works/pi-ai/dist/providers/opencode-go.models.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/opencode-go.models.js +36 -0
- package/node_modules/@earendil-works/pi-ai/dist/providers/opencode-go.models.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/openrouter.models.js +20 -20
- package/node_modules/@earendil-works/pi-ai/dist/providers/openrouter.models.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/xai.models.d.ts +0 -110
- package/node_modules/@earendil-works/pi-ai/dist/providers/xai.models.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/xai.models.js +0 -90
- package/node_modules/@earendil-works/pi-ai/dist/providers/xai.models.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/types.d.ts +14 -0
- 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/tool-schema-compat.d.ts +19 -0
- package/node_modules/@earendil-works/pi-ai/dist/utils/tool-schema-compat.d.ts.map +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/utils/tool-schema-compat.js +171 -0
- package/node_modules/@earendil-works/pi-ai/dist/utils/tool-schema-compat.js.map +1 -0
- 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
|
@@ -0,0 +1,171 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* JSON Schema normalization for tool parameters sent to OpenAI-compatible
|
|
3
|
+
* backends. Some gateways (e.g. Apitopia → Kimi / Moonshot) enforce a stricter
|
|
4
|
+
* subset that rejects a sibling `type` keyword on schemas that also declare
|
|
5
|
+
* `anyOf` / `oneOf` / `allOf`. This helper removes that redundancy while
|
|
6
|
+
* preserving the schema's semantics.
|
|
7
|
+
*/
|
|
8
|
+
const COMBINER_KEYS = ["anyOf", "oneOf", "allOf"];
|
|
9
|
+
const SCHEMA_MAP_KEYS = ["properties", "patternProperties", "$defs", "definitions"];
|
|
10
|
+
const SCHEMA_SINGLE_KEYS = [
|
|
11
|
+
"items",
|
|
12
|
+
"additionalProperties",
|
|
13
|
+
"contains",
|
|
14
|
+
"propertyNames",
|
|
15
|
+
"if",
|
|
16
|
+
"then",
|
|
17
|
+
"else",
|
|
18
|
+
"not",
|
|
19
|
+
];
|
|
20
|
+
function isJsonObject(value) {
|
|
21
|
+
return value !== null && typeof value === "object" && !Array.isArray(value);
|
|
22
|
+
}
|
|
23
|
+
function isScalarType(type) {
|
|
24
|
+
return type === "string" || type === "number" || type === "integer" || type === "boolean";
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Move a parent-level `type` keyword into combiner branches that do not already
|
|
28
|
+
* declare one, then drop the parent `type`. This keeps the schema equivalent
|
|
29
|
+
* while satisfying validators that require `type` to live inside each branch.
|
|
30
|
+
*/
|
|
31
|
+
function moveTypeIntoCombinerBranches(node) {
|
|
32
|
+
if (!("type" in node))
|
|
33
|
+
return;
|
|
34
|
+
const parentType = node.type;
|
|
35
|
+
for (const combiner of COMBINER_KEYS) {
|
|
36
|
+
const branches = node[combiner];
|
|
37
|
+
if (!Array.isArray(branches))
|
|
38
|
+
continue;
|
|
39
|
+
for (const branch of branches) {
|
|
40
|
+
if (isJsonObject(branch) && !("type" in branch)) {
|
|
41
|
+
branch.type = parentType;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
delete node.type;
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Collapse a homogeneous all-`const` union into a typed `enum`. This is the
|
|
49
|
+
* wire shape many OpenAI-compatible gateways expect for literal unions.
|
|
50
|
+
*/
|
|
51
|
+
function collapseConstUnion(node) {
|
|
52
|
+
const branches = node.anyOf;
|
|
53
|
+
if (!Array.isArray(branches) || branches.length < 2)
|
|
54
|
+
return;
|
|
55
|
+
if ("type" in node)
|
|
56
|
+
return;
|
|
57
|
+
const values = [];
|
|
58
|
+
let sharedType;
|
|
59
|
+
for (const branch of branches) {
|
|
60
|
+
if (!isJsonObject(branch))
|
|
61
|
+
return;
|
|
62
|
+
if (!Object.hasOwn(branch, "const"))
|
|
63
|
+
return;
|
|
64
|
+
const keys = Object.keys(branch);
|
|
65
|
+
if (keys.length !== 2 || !keys.includes("type"))
|
|
66
|
+
return;
|
|
67
|
+
const branchType = branch.type;
|
|
68
|
+
if (!isScalarType(branchType))
|
|
69
|
+
return;
|
|
70
|
+
if (sharedType === undefined) {
|
|
71
|
+
sharedType = branchType;
|
|
72
|
+
}
|
|
73
|
+
else if (sharedType !== branchType) {
|
|
74
|
+
return;
|
|
75
|
+
}
|
|
76
|
+
values.push(branch.const);
|
|
77
|
+
}
|
|
78
|
+
if (sharedType === undefined || values.length === 0)
|
|
79
|
+
return;
|
|
80
|
+
delete node.anyOf;
|
|
81
|
+
node.type = sharedType;
|
|
82
|
+
node.enum = values;
|
|
83
|
+
}
|
|
84
|
+
function normalizeNode(node) {
|
|
85
|
+
if (Array.isArray(node)) {
|
|
86
|
+
return node.map((child) => normalizeNode(child));
|
|
87
|
+
}
|
|
88
|
+
if (!isJsonObject(node)) {
|
|
89
|
+
return node;
|
|
90
|
+
}
|
|
91
|
+
const hasCombiner = COMBINER_KEYS.some((key) => Array.isArray(node[key]));
|
|
92
|
+
if (hasCombiner) {
|
|
93
|
+
moveTypeIntoCombinerBranches(node);
|
|
94
|
+
}
|
|
95
|
+
for (const combiner of COMBINER_KEYS) {
|
|
96
|
+
const branches = node[combiner];
|
|
97
|
+
if (Array.isArray(branches)) {
|
|
98
|
+
node[combiner] = branches.map((branch) => normalizeNode(branch));
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
if (Array.isArray(node.anyOf)) {
|
|
102
|
+
collapseConstUnion(node);
|
|
103
|
+
}
|
|
104
|
+
for (const key of SCHEMA_SINGLE_KEYS) {
|
|
105
|
+
if (Object.hasOwn(node, key)) {
|
|
106
|
+
node[key] = normalizeNode(node[key]);
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
for (const key of SCHEMA_MAP_KEYS) {
|
|
110
|
+
const map = node[key];
|
|
111
|
+
if (!isJsonObject(map))
|
|
112
|
+
continue;
|
|
113
|
+
for (const name of Object.keys(map)) {
|
|
114
|
+
map[name] = normalizeNode(map[name]);
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
return node;
|
|
118
|
+
}
|
|
119
|
+
/**
|
|
120
|
+
* Return a deep-normalized copy of a tool's JSON Schema parameters, suitable
|
|
121
|
+
* for OpenAI-compatible Chat Completions backends.
|
|
122
|
+
*/
|
|
123
|
+
export function normalizeToolParametersForOpenAICompat(schema) {
|
|
124
|
+
return normalizeNode(structuredClone(schema));
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* Moonshot-flavored JSON Schema subset: in addition to the OpenAI-compatible
|
|
128
|
+
* normalization, drop non-structural annotation keywords that Moonshot rejects.
|
|
129
|
+
*/
|
|
130
|
+
export function normalizeToolParametersForMoonshot(schema) {
|
|
131
|
+
const normalized = normalizeToolParametersForOpenAICompat(schema);
|
|
132
|
+
return stripMoonshotAnnotations(normalized);
|
|
133
|
+
}
|
|
134
|
+
function stripMoonshotAnnotations(node) {
|
|
135
|
+
if (Array.isArray(node)) {
|
|
136
|
+
return node.map((child) => stripMoonshotAnnotations(child));
|
|
137
|
+
}
|
|
138
|
+
if (!isJsonObject(node)) {
|
|
139
|
+
return node;
|
|
140
|
+
}
|
|
141
|
+
// Moonshot does not support JSON Schema validators like `format` or
|
|
142
|
+
// annotation-only keywords like `examples` inside function parameters.
|
|
143
|
+
delete node.format;
|
|
144
|
+
delete node.examples;
|
|
145
|
+
delete node.readOnly;
|
|
146
|
+
delete node.writeOnly;
|
|
147
|
+
delete node.deprecated;
|
|
148
|
+
delete node.$schema;
|
|
149
|
+
delete node.$id;
|
|
150
|
+
for (const combiner of COMBINER_KEYS) {
|
|
151
|
+
const branches = node[combiner];
|
|
152
|
+
if (Array.isArray(branches)) {
|
|
153
|
+
node[combiner] = branches.map((branch) => stripMoonshotAnnotations(branch));
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
for (const key of SCHEMA_SINGLE_KEYS) {
|
|
157
|
+
if (Object.hasOwn(node, key)) {
|
|
158
|
+
node[key] = stripMoonshotAnnotations(node[key]);
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
for (const key of SCHEMA_MAP_KEYS) {
|
|
162
|
+
const map = node[key];
|
|
163
|
+
if (!isJsonObject(map))
|
|
164
|
+
continue;
|
|
165
|
+
for (const name of Object.keys(map)) {
|
|
166
|
+
map[name] = stripMoonshotAnnotations(map[name]);
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
return node;
|
|
170
|
+
}
|
|
171
|
+
//# sourceMappingURL=tool-schema-compat.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tool-schema-compat.js","sourceRoot":"","sources":["../../src/utils/tool-schema-compat.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * JSON Schema normalization for tool parameters sent to OpenAI-compatible\n * backends. Some gateways (e.g. Apitopia → Kimi / Moonshot) enforce a stricter\n * subset that rejects a sibling `type` keyword on schemas that also declare\n * `anyOf` / `oneOf` / `allOf`. This helper removes that redundancy while\n * preserving the schema's semantics.\n */\n\nexport type ToolSchemaFlavor = \"moonshot-mfjs\";\n\nconst COMBINER_KEYS = [\"anyOf\", \"oneOf\", \"allOf\"] as const;\nconst SCHEMA_MAP_KEYS = [\"properties\", \"patternProperties\", \"$defs\", \"definitions\"] as const;\nconst SCHEMA_SINGLE_KEYS = [\n\t\"items\",\n\t\"additionalProperties\",\n\t\"contains\",\n\t\"propertyNames\",\n\t\"if\",\n\t\"then\",\n\t\"else\",\n\t\"not\",\n] as const;\n\nfunction isJsonObject(value: unknown): value is Record<string, unknown> {\n\treturn value !== null && typeof value === \"object\" && !Array.isArray(value);\n}\n\nfunction isScalarType(type: unknown): type is \"string\" | \"number\" | \"integer\" | \"boolean\" {\n\treturn type === \"string\" || type === \"number\" || type === \"integer\" || type === \"boolean\";\n}\n\n/**\n * Move a parent-level `type` keyword into combiner branches that do not already\n * declare one, then drop the parent `type`. This keeps the schema equivalent\n * while satisfying validators that require `type` to live inside each branch.\n */\nfunction moveTypeIntoCombinerBranches(node: Record<string, unknown>): void {\n\tif (!(\"type\" in node)) return;\n\n\tconst parentType = node.type;\n\tfor (const combiner of COMBINER_KEYS) {\n\t\tconst branches = node[combiner];\n\t\tif (!Array.isArray(branches)) continue;\n\n\t\tfor (const branch of branches) {\n\t\t\tif (isJsonObject(branch) && !(\"type\" in branch)) {\n\t\t\t\tbranch.type = parentType;\n\t\t\t}\n\t\t}\n\t}\n\n\tdelete node.type;\n}\n\n/**\n * Collapse a homogeneous all-`const` union into a typed `enum`. This is the\n * wire shape many OpenAI-compatible gateways expect for literal unions.\n */\nfunction collapseConstUnion(node: Record<string, unknown>): void {\n\tconst branches = node.anyOf;\n\tif (!Array.isArray(branches) || branches.length < 2) return;\n\tif (\"type\" in node) return;\n\n\tconst values: unknown[] = [];\n\tlet sharedType: string | undefined;\n\n\tfor (const branch of branches) {\n\t\tif (!isJsonObject(branch)) return;\n\t\tif (!Object.hasOwn(branch, \"const\")) return;\n\n\t\tconst keys = Object.keys(branch);\n\t\tif (keys.length !== 2 || !keys.includes(\"type\")) return;\n\n\t\tconst branchType = branch.type;\n\t\tif (!isScalarType(branchType)) return;\n\n\t\tif (sharedType === undefined) {\n\t\t\tsharedType = branchType;\n\t\t} else if (sharedType !== branchType) {\n\t\t\treturn;\n\t\t}\n\n\t\tvalues.push(branch.const);\n\t}\n\n\tif (sharedType === undefined || values.length === 0) return;\n\n\tdelete node.anyOf;\n\tnode.type = sharedType;\n\tnode.enum = values;\n}\n\nfunction normalizeNode(node: unknown): unknown {\n\tif (Array.isArray(node)) {\n\t\treturn node.map((child) => normalizeNode(child));\n\t}\n\n\tif (!isJsonObject(node)) {\n\t\treturn node;\n\t}\n\n\tconst hasCombiner = COMBINER_KEYS.some((key) => Array.isArray(node[key]));\n\tif (hasCombiner) {\n\t\tmoveTypeIntoCombinerBranches(node);\n\t}\n\n\tfor (const combiner of COMBINER_KEYS) {\n\t\tconst branches = node[combiner];\n\t\tif (Array.isArray(branches)) {\n\t\t\tnode[combiner] = branches.map((branch) => normalizeNode(branch));\n\t\t}\n\t}\n\n\tif (Array.isArray(node.anyOf)) {\n\t\tcollapseConstUnion(node);\n\t}\n\n\tfor (const key of SCHEMA_SINGLE_KEYS) {\n\t\tif (Object.hasOwn(node, key)) {\n\t\t\tnode[key] = normalizeNode(node[key]);\n\t\t}\n\t}\n\n\tfor (const key of SCHEMA_MAP_KEYS) {\n\t\tconst map = node[key];\n\t\tif (!isJsonObject(map)) continue;\n\t\tfor (const name of Object.keys(map)) {\n\t\t\tmap[name] = normalizeNode(map[name]);\n\t\t}\n\t}\n\n\treturn node;\n}\n\n/**\n * Return a deep-normalized copy of a tool's JSON Schema parameters, suitable\n * for OpenAI-compatible Chat Completions backends.\n */\nexport function normalizeToolParametersForOpenAICompat(schema: Record<string, unknown>): Record<string, unknown> {\n\treturn normalizeNode(structuredClone(schema)) as Record<string, unknown>;\n}\n\n/**\n * Moonshot-flavored JSON Schema subset: in addition to the OpenAI-compatible\n * normalization, drop non-structural annotation keywords that Moonshot rejects.\n */\nexport function normalizeToolParametersForMoonshot(schema: Record<string, unknown>): Record<string, unknown> {\n\tconst normalized = normalizeToolParametersForOpenAICompat(schema);\n\treturn stripMoonshotAnnotations(normalized);\n}\n\nfunction stripMoonshotAnnotations(node: unknown): Record<string, unknown> {\n\tif (Array.isArray(node)) {\n\t\treturn node.map((child) => stripMoonshotAnnotations(child)) as unknown as Record<string, unknown>;\n\t}\n\n\tif (!isJsonObject(node)) {\n\t\treturn node as Record<string, unknown>;\n\t}\n\n\t// Moonshot does not support JSON Schema validators like `format` or\n\t// annotation-only keywords like `examples` inside function parameters.\n\tdelete node.format;\n\tdelete node.examples;\n\tdelete node.readOnly;\n\tdelete node.writeOnly;\n\tdelete node.deprecated;\n\tdelete node.$schema;\n\tdelete node.$id;\n\n\tfor (const combiner of COMBINER_KEYS) {\n\t\tconst branches = node[combiner];\n\t\tif (Array.isArray(branches)) {\n\t\t\tnode[combiner] = branches.map((branch) => stripMoonshotAnnotations(branch));\n\t\t}\n\t}\n\n\tfor (const key of SCHEMA_SINGLE_KEYS) {\n\t\tif (Object.hasOwn(node, key)) {\n\t\t\tnode[key] = stripMoonshotAnnotations(node[key]);\n\t\t}\n\t}\n\n\tfor (const key of SCHEMA_MAP_KEYS) {\n\t\tconst map = node[key];\n\t\tif (!isJsonObject(map)) continue;\n\t\tfor (const name of Object.keys(map)) {\n\t\t\tmap[name] = stripMoonshotAnnotations(map[name]);\n\t\t}\n\t}\n\n\treturn node;\n}\n"]}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@earendil-works/pi-tui",
|
|
3
3
|
"private": true,
|
|
4
|
-
"version": "2026.7.
|
|
4
|
+
"version": "2026.7.17-2",
|
|
5
5
|
"description": "Terminal User Interface library with differential rendering for efficient text-based applications",
|
|
6
6
|
"type": "module",
|
|
7
7
|
"main": "dist/index.js",
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@code-yeongyu/senpi",
|
|
3
|
-
"version": "2026.7.
|
|
3
|
+
"version": "2026.7.17-2",
|
|
4
4
|
"description": "Coding agent CLI with read, bash, edit, write tools and session management",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"piConfig": {
|
|
@@ -43,11 +43,11 @@
|
|
|
43
43
|
"dependencies": {
|
|
44
44
|
"@anthropic-ai/sdk": "0.91.1",
|
|
45
45
|
"@aws-sdk/client-bedrock-runtime": "3.1048.0",
|
|
46
|
-
"@code-yeongyu/senpi-codemode": "^2026.7.
|
|
47
|
-
"@earendil-works/pi-agent-core": "^2026.7.
|
|
48
|
-
"@earendil-works/pi-ai": "^2026.7.
|
|
49
|
-
"@earendil-works/pi-pty": "^2026.7.
|
|
50
|
-
"@earendil-works/pi-tui": "^2026.7.
|
|
46
|
+
"@code-yeongyu/senpi-codemode": "^2026.7.17-2",
|
|
47
|
+
"@earendil-works/pi-agent-core": "^2026.7.17-2",
|
|
48
|
+
"@earendil-works/pi-ai": "^2026.7.17-2",
|
|
49
|
+
"@earendil-works/pi-pty": "^2026.7.17-2",
|
|
50
|
+
"@earendil-works/pi-tui": "^2026.7.17-2",
|
|
51
51
|
"@mistralai/mistralai": "2.2.6",
|
|
52
52
|
"@modelcontextprotocol/sdk": "1.29.0",
|
|
53
53
|
"@mozilla/readability": "0.6.0",
|