@hyperdreamer/pi-webui 1.10.7 → 1.11.0-beta.10
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/README.md +17 -2
- package/dist/cli.js +265 -32
- package/dist/cli.js.map +1 -1
- package/dist/client/assets/{CodeViewer-BIb2Wx8W.js → CodeViewer-CAf_j27u.js} +1 -1
- package/dist/client/assets/{UnifiedDiffViewer-DpWiGlQo.js → UnifiedDiffViewer-wBjEJWa1.js} +1 -1
- package/dist/client/assets/{index-DX583DEv.js → index-5EtDb9nj.js} +1197 -476
- package/dist/client/index.html +1 -1
- package/dist/config.js +52 -11
- package/dist/config.js.map +1 -1
- package/dist/pi-webui-plugins/workspace-memory/pi-webui-plugin.js +3 -2
- package/dist/pi-webui-plugins/workspace-tasks/pi-webui-plugin.js +1 -0
- package/dist/plugin-api.d.ts +30 -0
- package/dist/server/app.js +6 -1
- package/dist/server/app.js.map +1 -1
- package/dist/server/realtime/sessionEventHub.js +40 -5
- package/dist/server/realtime/sessionEventHub.js.map +1 -1
- package/dist/server/realtime/sessionStatusCoalescer.js +137 -0
- package/dist/server/realtime/sessionStatusCoalescer.js.map +1 -0
- package/dist/server/sessiond/sessionProxyRoutes.js +2 -0
- package/dist/server/sessiond/sessionProxyRoutes.js.map +1 -1
- package/dist/server/sessiond.js +57 -5
- package/dist/server/sessiond.js.map +1 -1
- package/dist/server/sessions/modelPolicyCapability.js +88 -0
- package/dist/server/sessions/modelPolicyCapability.js.map +1 -0
- package/dist/server/sessions/modelPolicyTool.js +31 -0
- package/dist/server/sessions/modelPolicyTool.js.map +1 -0
- package/dist/server/sessions/modelTierRegistry.js +14 -0
- package/dist/server/sessions/modelTierRegistry.js.map +1 -1
- package/dist/server/sessions/modelTierSettingsRoutes.js +36 -0
- package/dist/server/sessions/modelTierSettingsRoutes.js.map +1 -0
- package/dist/server/sessions/modelTierSettingsService.js +100 -0
- package/dist/server/sessions/modelTierSettingsService.js.map +1 -0
- package/dist/server/sessions/piSessionService.js +1643 -433
- package/dist/server/sessions/piSessionService.js.map +1 -1
- package/dist/server/sessions/sessionDefaultsRoutes.js +39 -0
- package/dist/server/sessions/sessionDefaultsRoutes.js.map +1 -1
- package/dist/server/sessions/sessionDefaultsService.js +36 -6
- package/dist/server/sessions/sessionDefaultsService.js.map +1 -1
- package/dist/server/sessions/sessionMetadataStore.js +107 -13
- package/dist/server/sessions/sessionMetadataStore.js.map +1 -1
- package/dist/server/sessions/sessionModelPolicy.js +118 -0
- package/dist/server/sessions/sessionModelPolicy.js.map +1 -0
- package/dist/server/sessions/sessionReorder.js +117 -0
- package/dist/server/sessions/sessionReorder.js.map +1 -0
- package/dist/server/sessions/sessionRouteFastifyOptions.js +8 -0
- package/dist/server/sessions/sessionRouteFastifyOptions.js.map +1 -0
- package/dist/server/sessions/sessionRoutes.js +208 -3
- package/dist/server/sessions/sessionRoutes.js.map +1 -1
- package/dist/server/sessions/starterModelPolicyPreferenceStore.js +164 -0
- package/dist/server/sessions/starterModelPolicyPreferenceStore.js.map +1 -0
- package/dist/server/sessions/utilityModelExtension.js +199 -0
- package/dist/server/sessions/utilityModelExtension.js.map +1 -0
- package/dist/server/sessions/utilityModelResolver.js +77 -0
- package/dist/server/sessions/utilityModelResolver.js.map +1 -0
- package/dist/server/sessions/utilityModelSettingsRoutes.js +62 -0
- package/dist/server/sessions/utilityModelSettingsRoutes.js.map +1 -0
- package/dist/server/sessions/utilityModelSettingsService.js +101 -0
- package/dist/server/sessions/utilityModelSettingsService.js.map +1 -0
- package/dist/server/skills/optionalSkillInstall.js +69 -0
- package/dist/server/skills/optionalSkillInstall.js.map +1 -0
- package/dist/server/skills/optionalSkillInstaller.js +148 -0
- package/dist/server/skills/optionalSkillInstaller.js.map +1 -0
- package/dist/shared/apiTypes.d.ts +129 -3
- package/dist/shared/apiTypes.js +10 -0
- package/dist/shared/apiTypes.js.map +1 -1
- package/dist/shared/capabilities.js +15 -0
- package/dist/shared/capabilities.js.map +1 -1
- package/dist/shared/federatedRoutes.js +7 -0
- package/dist/shared/federatedRoutes.js.map +1 -1
- package/docs/assets/pi-webui-desktop.png +0 -0
- package/docs/config.md +61 -3
- package/docs/plugins.md +93 -16
- package/optional-skills/deterministic-subagent-driven-development/SKILL.md +224 -0
- package/optional-skills/deterministic-subagent-driven-development/pi-webui-skill.json +28 -0
- package/optional-skills/deterministic-subagent-driven-development/prompts/final-reviewer.md +132 -0
- package/optional-skills/deterministic-subagent-driven-development/prompts/implementer.md +101 -0
- package/optional-skills/deterministic-subagent-driven-development/prompts/re-reviewer.md +60 -0
- package/optional-skills/deterministic-subagent-driven-development/prompts/task-reviewer.md +80 -0
- package/optional-skills/deterministic-subagent-driven-development/references/capability-contract.md +174 -0
- package/optional-skills/deterministic-subagent-driven-development/references/plan-contract.md +268 -0
- package/optional-skills/deterministic-subagent-driven-development/references/state-machine.md +177 -0
- package/optional-skills/deterministic-subagent-driven-development/scripts/lib/manifest.mjs +258 -0
- package/optional-skills/deterministic-subagent-driven-development/scripts/lib/plan-policy.mjs +350 -0
- package/optional-skills/deterministic-subagent-driven-development/scripts/lib/prompt-renderer.mjs +290 -0
- package/optional-skills/deterministic-subagent-driven-development/scripts/lib/state-machine.mjs +1264 -0
- package/optional-skills/deterministic-subagent-driven-development/scripts/lib/state-store.mjs +532 -0
- package/optional-skills/deterministic-subagent-driven-development/scripts/sdd-state +3 -0
- package/optional-skills/deterministic-subagent-driven-development/scripts/sdd-state.mjs +349 -0
- package/optional-skills/deterministic-writing-plans/SKILL.md +232 -0
- package/optional-skills/deterministic-writing-plans/references/grammar.md +84 -0
- package/optional-skills/deterministic-writing-plans/templates/plan-skeleton.md +143 -0
- package/package.json +13 -9
|
@@ -0,0 +1,199 @@
|
|
|
1
|
+
import { compact as piCompact, generateBranchSummary as piGenerateBranchSummary, } from "@earendil-works/pi-coding-agent";
|
|
2
|
+
import { runtimeThinkingLevels as piRuntimeThinkingLevels } from "./modelTierRegistry.js";
|
|
3
|
+
export function createUtilityModelHandlers(deps) {
|
|
4
|
+
const generateBranchSummary = deps.generateBranchSummary ?? piGenerateBranchSummary;
|
|
5
|
+
const compact = deps.compact ?? piCompact;
|
|
6
|
+
const thinkingLevels = deps.runtimeThinkingLevels ?? piRuntimeThinkingLevels;
|
|
7
|
+
return {
|
|
8
|
+
sessionBeforeTree: async (event, ctx) => {
|
|
9
|
+
if (!event.preparation.userWantsSummary ||
|
|
10
|
+
event.preparation.entriesToSummarize.length === 0 ||
|
|
11
|
+
ctx.model === undefined) {
|
|
12
|
+
return undefined;
|
|
13
|
+
}
|
|
14
|
+
const refs = availableRefs(deps.refs);
|
|
15
|
+
if (refs === undefined)
|
|
16
|
+
return undefined;
|
|
17
|
+
let reserveTokens;
|
|
18
|
+
let retry;
|
|
19
|
+
try {
|
|
20
|
+
reserveTokens = refs.settingsManager.getBranchSummarySettings().reserveTokens;
|
|
21
|
+
retry = refs.settingsManager.getRetrySettings();
|
|
22
|
+
}
|
|
23
|
+
catch (error) {
|
|
24
|
+
logNoThrow(deps.logger, { err: error, task: "lightweight" }, "utility model runtime refs failed");
|
|
25
|
+
return undefined;
|
|
26
|
+
}
|
|
27
|
+
const candidates = await deps.resolver.configuredCandidates("lightweight");
|
|
28
|
+
for (const model of candidates) {
|
|
29
|
+
if (isAborted(event.signal))
|
|
30
|
+
return { cancel: true };
|
|
31
|
+
const auth = await resolveCandidateAuth(deps, "lightweight", model);
|
|
32
|
+
if (isAborted(event.signal))
|
|
33
|
+
return { cancel: true };
|
|
34
|
+
if (auth === undefined)
|
|
35
|
+
continue;
|
|
36
|
+
try {
|
|
37
|
+
const thinking = utilityThinking(model, thinkingLevels);
|
|
38
|
+
const options = {
|
|
39
|
+
model,
|
|
40
|
+
signal: event.signal,
|
|
41
|
+
reserveTokens,
|
|
42
|
+
streamFn: utilityStreamFunction(refs.streamFunction, thinking),
|
|
43
|
+
retry,
|
|
44
|
+
...auth,
|
|
45
|
+
...(event.preparation.customInstructions === undefined
|
|
46
|
+
? {}
|
|
47
|
+
: { customInstructions: event.preparation.customInstructions }),
|
|
48
|
+
...(event.preparation.replaceInstructions === undefined
|
|
49
|
+
? {}
|
|
50
|
+
: { replaceInstructions: event.preparation.replaceInstructions }),
|
|
51
|
+
};
|
|
52
|
+
const result = await generateBranchSummary(event.preparation.entriesToSummarize, options);
|
|
53
|
+
if (isAborted(event.signal) || result.aborted === true) {
|
|
54
|
+
return { cancel: true };
|
|
55
|
+
}
|
|
56
|
+
if (result.error !== undefined || result.summary?.trim() === "") {
|
|
57
|
+
logCandidateFailure(deps.logger, "lightweight", model, new Error(result.error ?? "branch summary was empty"));
|
|
58
|
+
continue;
|
|
59
|
+
}
|
|
60
|
+
if (result.summary === undefined) {
|
|
61
|
+
logCandidateFailure(deps.logger, "lightweight", model, new Error("branch summary was missing"));
|
|
62
|
+
continue;
|
|
63
|
+
}
|
|
64
|
+
return {
|
|
65
|
+
summary: {
|
|
66
|
+
summary: result.summary,
|
|
67
|
+
details: {
|
|
68
|
+
readFiles: result.readFiles ?? [],
|
|
69
|
+
modifiedFiles: result.modifiedFiles ?? [],
|
|
70
|
+
},
|
|
71
|
+
...(result.usage === undefined ? {} : { usage: result.usage }),
|
|
72
|
+
},
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
catch (error) {
|
|
76
|
+
if (isAborted(event.signal))
|
|
77
|
+
return { cancel: true };
|
|
78
|
+
logCandidateFailure(deps.logger, "lightweight", model, error);
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
return undefined;
|
|
82
|
+
},
|
|
83
|
+
sessionBeforeCompact: async (event, ctx) => {
|
|
84
|
+
if (ctx.model === undefined)
|
|
85
|
+
return undefined;
|
|
86
|
+
const refs = availableRefs(deps.refs);
|
|
87
|
+
if (refs === undefined)
|
|
88
|
+
return undefined;
|
|
89
|
+
let retry;
|
|
90
|
+
try {
|
|
91
|
+
retry = refs.settingsManager.getRetrySettings();
|
|
92
|
+
}
|
|
93
|
+
catch (error) {
|
|
94
|
+
logNoThrow(deps.logger, { err: error, task: "context" }, "utility model runtime refs failed");
|
|
95
|
+
return undefined;
|
|
96
|
+
}
|
|
97
|
+
const candidates = await deps.resolver.configuredCandidates("context");
|
|
98
|
+
for (const model of candidates) {
|
|
99
|
+
if (isAborted(event.signal))
|
|
100
|
+
return { cancel: true };
|
|
101
|
+
const auth = await resolveCandidateAuth(deps, "context", model);
|
|
102
|
+
if (isAborted(event.signal))
|
|
103
|
+
return { cancel: true };
|
|
104
|
+
if (auth === undefined)
|
|
105
|
+
continue;
|
|
106
|
+
try {
|
|
107
|
+
const thinking = utilityThinking(model, thinkingLevels);
|
|
108
|
+
const result = await compact(event.preparation, model, auth.apiKey, auth.headers, event.customInstructions, event.signal, thinking, utilityStreamFunction(refs.streamFunction, thinking), auth.env, retry);
|
|
109
|
+
if (isAborted(event.signal))
|
|
110
|
+
return { cancel: true };
|
|
111
|
+
return { compaction: result };
|
|
112
|
+
}
|
|
113
|
+
catch (error) {
|
|
114
|
+
if (isAborted(event.signal))
|
|
115
|
+
return { cancel: true };
|
|
116
|
+
logCandidateFailure(deps.logger, "context", model, error);
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
return undefined;
|
|
120
|
+
},
|
|
121
|
+
};
|
|
122
|
+
}
|
|
123
|
+
export function createUtilityModelExtension(deps) {
|
|
124
|
+
const handlers = createUtilityModelHandlers(deps);
|
|
125
|
+
return {
|
|
126
|
+
name: "pi-webui-utility-models",
|
|
127
|
+
hidden: true,
|
|
128
|
+
factory(pi) {
|
|
129
|
+
pi.on("session_before_tree", handlers.sessionBeforeTree);
|
|
130
|
+
pi.on("session_before_compact", handlers.sessionBeforeCompact);
|
|
131
|
+
},
|
|
132
|
+
};
|
|
133
|
+
}
|
|
134
|
+
function availableRefs(refs) {
|
|
135
|
+
if (refs.streamFunction === undefined || refs.settingsManager === undefined) {
|
|
136
|
+
return undefined;
|
|
137
|
+
}
|
|
138
|
+
return {
|
|
139
|
+
streamFunction: refs.streamFunction,
|
|
140
|
+
settingsManager: refs.settingsManager,
|
|
141
|
+
};
|
|
142
|
+
}
|
|
143
|
+
async function resolveCandidateAuth(deps, task, model) {
|
|
144
|
+
try {
|
|
145
|
+
const result = await deps.modelRuntime.getAuth(model);
|
|
146
|
+
if (result === undefined) {
|
|
147
|
+
logCandidateFailure(deps.logger, task, model, new Error("utility model authentication is unavailable"));
|
|
148
|
+
return undefined;
|
|
149
|
+
}
|
|
150
|
+
const headers = normalizeHeaders(result.auth.headers);
|
|
151
|
+
return {
|
|
152
|
+
...(result.auth.apiKey === undefined ? {} : { apiKey: result.auth.apiKey }),
|
|
153
|
+
...(headers === undefined ? {} : { headers }),
|
|
154
|
+
...(result.env === undefined ? {} : { env: result.env }),
|
|
155
|
+
};
|
|
156
|
+
}
|
|
157
|
+
catch (error) {
|
|
158
|
+
logCandidateFailure(deps.logger, task, model, error);
|
|
159
|
+
return undefined;
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
function normalizeHeaders(headers) {
|
|
163
|
+
if (headers === undefined)
|
|
164
|
+
return undefined;
|
|
165
|
+
const normalized = {};
|
|
166
|
+
for (const [name, value] of Object.entries(headers)) {
|
|
167
|
+
if (value !== null)
|
|
168
|
+
normalized[name] = value;
|
|
169
|
+
}
|
|
170
|
+
return normalized;
|
|
171
|
+
}
|
|
172
|
+
function isAborted(signal) {
|
|
173
|
+
return signal.aborted;
|
|
174
|
+
}
|
|
175
|
+
function utilityThinking(model, thinkingLevels) {
|
|
176
|
+
return model.reasoning && thinkingLevels(model).includes("minimal")
|
|
177
|
+
? "minimal"
|
|
178
|
+
: "off";
|
|
179
|
+
}
|
|
180
|
+
function utilityStreamFunction(streamFunction, thinking) {
|
|
181
|
+
if (thinking === "off")
|
|
182
|
+
return streamFunction;
|
|
183
|
+
return (model, context, options) => streamFunction(model, context, {
|
|
184
|
+
...options,
|
|
185
|
+
reasoning: "minimal",
|
|
186
|
+
});
|
|
187
|
+
}
|
|
188
|
+
function logCandidateFailure(logger, task, model, error) {
|
|
189
|
+
logNoThrow(logger, { err: error, task, provider: model.provider, modelId: model.id }, "utility model candidate failed");
|
|
190
|
+
}
|
|
191
|
+
function logNoThrow(logger, details, message) {
|
|
192
|
+
try {
|
|
193
|
+
logger?.info(details, message);
|
|
194
|
+
}
|
|
195
|
+
catch {
|
|
196
|
+
// Diagnostics must not prevent Pi's active-session fallback.
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
//# sourceMappingURL=utilityModelExtension.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utilityModelExtension.js","sourceRoot":"","sources":["../../../src/server/sessions/utilityModelExtension.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
const taskSlots = {
|
|
2
|
+
lightweight: ["lightweight"],
|
|
3
|
+
context: ["context", "lightweight"],
|
|
4
|
+
};
|
|
5
|
+
export function createUtilityModelResolver(deps) {
|
|
6
|
+
return {
|
|
7
|
+
configuredCandidates: async (task) => {
|
|
8
|
+
try {
|
|
9
|
+
await deps.modelRuntime.refresh({ allowNetwork: false });
|
|
10
|
+
const config = deps.loadConfig();
|
|
11
|
+
if (config.utilityModelsError !== undefined ||
|
|
12
|
+
config.utilityModels === undefined) {
|
|
13
|
+
return [];
|
|
14
|
+
}
|
|
15
|
+
const available = deps.modelRuntime.getAvailableSnapshot();
|
|
16
|
+
const candidates = [];
|
|
17
|
+
const seen = new Set();
|
|
18
|
+
for (const slot of taskSlots[task]) {
|
|
19
|
+
const reference = config.utilityModels[slot];
|
|
20
|
+
if (reference === undefined)
|
|
21
|
+
continue;
|
|
22
|
+
const candidate = available.find((model) => model.provider === reference.provider && model.id === reference.id);
|
|
23
|
+
if (candidate === undefined)
|
|
24
|
+
continue;
|
|
25
|
+
const key = modelKey(candidate);
|
|
26
|
+
if (seen.has(key))
|
|
27
|
+
continue;
|
|
28
|
+
seen.add(key);
|
|
29
|
+
candidates.push(candidate);
|
|
30
|
+
}
|
|
31
|
+
return candidates;
|
|
32
|
+
}
|
|
33
|
+
catch (error) {
|
|
34
|
+
logNoThrow(deps.logger, { err: error, task }, "utility model resolution failed");
|
|
35
|
+
return [];
|
|
36
|
+
}
|
|
37
|
+
},
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
export async function runWithUtilityModelFallback(resolver, task, activeModel, run, onFailure) {
|
|
41
|
+
const configured = await resolver.configuredCandidates(task);
|
|
42
|
+
const candidates = [];
|
|
43
|
+
const seen = new Set();
|
|
44
|
+
for (const model of [
|
|
45
|
+
...configured,
|
|
46
|
+
...(activeModel === undefined ? [] : [activeModel]),
|
|
47
|
+
]) {
|
|
48
|
+
const key = modelKey(model);
|
|
49
|
+
if (seen.has(key))
|
|
50
|
+
continue;
|
|
51
|
+
seen.add(key);
|
|
52
|
+
candidates.push(model);
|
|
53
|
+
}
|
|
54
|
+
for (const model of candidates) {
|
|
55
|
+
try {
|
|
56
|
+
const result = await run(model);
|
|
57
|
+
if (result !== undefined)
|
|
58
|
+
return result;
|
|
59
|
+
}
|
|
60
|
+
catch (error) {
|
|
61
|
+
onFailure?.(model, error);
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
return undefined;
|
|
65
|
+
}
|
|
66
|
+
function modelKey(model) {
|
|
67
|
+
return JSON.stringify([model.provider, model.id]);
|
|
68
|
+
}
|
|
69
|
+
function logNoThrow(logger, details, message) {
|
|
70
|
+
try {
|
|
71
|
+
logger?.info(details, message);
|
|
72
|
+
}
|
|
73
|
+
catch {
|
|
74
|
+
// Diagnostics must not defeat the active-model fallback.
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
//# sourceMappingURL=utilityModelResolver.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utilityModelResolver.js","sourceRoot":"","sources":["../../../src/server/sessions/utilityModelResolver.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import { parseUtilityModelsConfig } from "../../config.js";
|
|
2
|
+
import { UTILITY_MODEL_SLOTS } from "../../shared/apiTypes.js";
|
|
3
|
+
export function registerUtilityModelSettingsRoutes(app, service, prefix = "") {
|
|
4
|
+
app.get(`${prefix}/utility-models`, async (_request, reply) => {
|
|
5
|
+
try {
|
|
6
|
+
return await service.inspect();
|
|
7
|
+
}
|
|
8
|
+
catch (error) {
|
|
9
|
+
return reply.code(400).send({ error: errorMessage(error) });
|
|
10
|
+
}
|
|
11
|
+
});
|
|
12
|
+
app.put(`${prefix}/utility-models`, async (request, reply) => {
|
|
13
|
+
try {
|
|
14
|
+
return await service.update(parseUpdate(request.body));
|
|
15
|
+
}
|
|
16
|
+
catch (error) {
|
|
17
|
+
return reply.code(400).send({ error: errorMessage(error) });
|
|
18
|
+
}
|
|
19
|
+
});
|
|
20
|
+
}
|
|
21
|
+
function parseUpdate(value) {
|
|
22
|
+
if (!isRecord(value))
|
|
23
|
+
throw new Error("Expected object body");
|
|
24
|
+
const unknownField = Object.keys(value).find((key) => key !== "settings");
|
|
25
|
+
if (unknownField !== undefined)
|
|
26
|
+
throw new Error(`unknown field ${JSON.stringify(unknownField)}; expected exactly settings`);
|
|
27
|
+
if (!Object.prototype.hasOwnProperty.call(value, "settings"))
|
|
28
|
+
throw new Error("settings is required");
|
|
29
|
+
return parseSettingsUpdate(value["settings"]);
|
|
30
|
+
}
|
|
31
|
+
function parseSettingsUpdate(value) {
|
|
32
|
+
if (!isRecord(value))
|
|
33
|
+
throw new Error("settings must be an object");
|
|
34
|
+
const unknownSlot = Object.keys(value).find((key) => !isUtilityModelSlot(key));
|
|
35
|
+
if (unknownSlot !== undefined)
|
|
36
|
+
throw new Error(`unknown utility model slot ${JSON.stringify(unknownSlot)}`);
|
|
37
|
+
const update = {};
|
|
38
|
+
for (const slot of UTILITY_MODEL_SLOTS) {
|
|
39
|
+
if (!Object.prototype.hasOwnProperty.call(value, slot))
|
|
40
|
+
continue;
|
|
41
|
+
if (value[slot] === null) {
|
|
42
|
+
update[slot] = null;
|
|
43
|
+
continue;
|
|
44
|
+
}
|
|
45
|
+
const parsed = parseUtilityModelsConfig({ [slot]: value[slot] }, "request body settings");
|
|
46
|
+
const reference = parsed[slot];
|
|
47
|
+
if (reference === undefined)
|
|
48
|
+
throw new Error(`${slot} utility model reference is required`);
|
|
49
|
+
update[slot] = reference;
|
|
50
|
+
}
|
|
51
|
+
return update;
|
|
52
|
+
}
|
|
53
|
+
function isUtilityModelSlot(value) {
|
|
54
|
+
return UTILITY_MODEL_SLOTS.some((slot) => slot === value);
|
|
55
|
+
}
|
|
56
|
+
function isRecord(value) {
|
|
57
|
+
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
58
|
+
}
|
|
59
|
+
function errorMessage(error) {
|
|
60
|
+
return error instanceof Error ? error.message : String(error);
|
|
61
|
+
}
|
|
62
|
+
//# sourceMappingURL=utilityModelSettingsRoutes.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utilityModelSettingsRoutes.js","sourceRoot":"","sources":["../../../src/server/sessions/utilityModelSettingsRoutes.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
import { UTILITY_MODEL_SLOTS, } from "../../shared/apiTypes.js";
|
|
2
|
+
/**
|
|
3
|
+
* Inspect and atomically update machine-global utility model settings against
|
|
4
|
+
* the daemon's latest authenticated model catalog.
|
|
5
|
+
*/
|
|
6
|
+
export function createUtilityModelSettingsService(deps) {
|
|
7
|
+
let updateQueue = Promise.resolve();
|
|
8
|
+
const inspect = async () => {
|
|
9
|
+
const models = await refreshedSnapshot();
|
|
10
|
+
return responseFor(deps.loadConfig(), models);
|
|
11
|
+
};
|
|
12
|
+
return {
|
|
13
|
+
inspect,
|
|
14
|
+
update: (patch) => enqueueUpdate(() => updateSettings(patch)),
|
|
15
|
+
};
|
|
16
|
+
function enqueueUpdate(operation) {
|
|
17
|
+
const queuedUpdate = updateQueue.then(operation);
|
|
18
|
+
updateQueue = queuedUpdate.then(() => undefined, () => undefined);
|
|
19
|
+
return queuedUpdate;
|
|
20
|
+
}
|
|
21
|
+
async function updateSettings(patch) {
|
|
22
|
+
const current = deps.loadConfig();
|
|
23
|
+
const next = current.utilityModelsError === undefined
|
|
24
|
+
? { ...current.utilityModels }
|
|
25
|
+
: {};
|
|
26
|
+
if (Object.prototype.hasOwnProperty.call(patch, "lightweight")) {
|
|
27
|
+
if (patch.lightweight === null)
|
|
28
|
+
delete next.lightweight;
|
|
29
|
+
else if (patch.lightweight !== undefined)
|
|
30
|
+
next.lightweight = patch.lightweight;
|
|
31
|
+
}
|
|
32
|
+
if (Object.prototype.hasOwnProperty.call(patch, "context")) {
|
|
33
|
+
if (patch.context === null)
|
|
34
|
+
delete next.context;
|
|
35
|
+
else if (patch.context !== undefined)
|
|
36
|
+
next.context = patch.context;
|
|
37
|
+
}
|
|
38
|
+
const models = await refreshedSnapshot();
|
|
39
|
+
const slots = validationSlots(next, models);
|
|
40
|
+
const invalidSlots = UTILITY_MODEL_SLOTS.filter((slot) => !slots[slot].valid);
|
|
41
|
+
if (invalidSlots.length > 0) {
|
|
42
|
+
throw new Error(invalidSlots.map((slot) => slots[slot].reason ?? `${slot} utility model is invalid`).join("; "));
|
|
43
|
+
}
|
|
44
|
+
await deps.saveConfig({ utilityModels: next });
|
|
45
|
+
return await inspect();
|
|
46
|
+
}
|
|
47
|
+
async function refreshedSnapshot() {
|
|
48
|
+
await deps.modelRuntime.refresh({ allowNetwork: false });
|
|
49
|
+
return deps.modelRuntime.getAvailableSnapshot();
|
|
50
|
+
}
|
|
51
|
+
function responseFor(config, models) {
|
|
52
|
+
const modelOptions = models.map(modelOptionFor);
|
|
53
|
+
if (config.utilityModelsError !== undefined) {
|
|
54
|
+
return {
|
|
55
|
+
contractVersion: 1,
|
|
56
|
+
configError: config.utilityModelsError,
|
|
57
|
+
settings: {},
|
|
58
|
+
models: modelOptions,
|
|
59
|
+
slots: invalidSlots(config.utilityModelsError),
|
|
60
|
+
valid: false,
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
const settings = config.utilityModels ?? {};
|
|
64
|
+
const slots = validationSlots(settings, models);
|
|
65
|
+
return {
|
|
66
|
+
contractVersion: 1,
|
|
67
|
+
settings,
|
|
68
|
+
models: modelOptions,
|
|
69
|
+
slots,
|
|
70
|
+
valid: UTILITY_MODEL_SLOTS.every((slot) => slots[slot].valid),
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
function modelOptionFor(model) {
|
|
74
|
+
return {
|
|
75
|
+
model: { provider: model.provider, id: model.id },
|
|
76
|
+
...(model.name === undefined ? {} : { name: model.name }),
|
|
77
|
+
};
|
|
78
|
+
}
|
|
79
|
+
function validationSlots(settings, models) {
|
|
80
|
+
return {
|
|
81
|
+
lightweight: validationFor("lightweight", settings, models),
|
|
82
|
+
context: validationFor("context", settings, models),
|
|
83
|
+
};
|
|
84
|
+
}
|
|
85
|
+
function validationFor(slot, settings, models) {
|
|
86
|
+
const configured = settings[slot];
|
|
87
|
+
if (configured === undefined)
|
|
88
|
+
return { valid: true };
|
|
89
|
+
const available = models.some((model) => model.provider === configured.provider && model.id === configured.id);
|
|
90
|
+
return available
|
|
91
|
+
? { valid: true }
|
|
92
|
+
: { valid: false, reason: `${slot} utility model ${configured.provider}/${configured.id} is unavailable` };
|
|
93
|
+
}
|
|
94
|
+
function invalidSlots(reason) {
|
|
95
|
+
return {
|
|
96
|
+
lightweight: { valid: false, reason },
|
|
97
|
+
context: { valid: false, reason },
|
|
98
|
+
};
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
//# sourceMappingURL=utilityModelSettingsService.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utilityModelSettingsService.js","sourceRoot":"","sources":["../../../src/server/sessions/utilityModelSettingsService.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Installs the repository's opt-in skills into the user's global skill directory.
|
|
3
|
+
*
|
|
4
|
+
* The shipped source directories carry a `deterministic-` prefix so they can sit
|
|
5
|
+
* beside the upstream skills they derive from. Installation strips that prefix,
|
|
6
|
+
* because sibling skills such as `brainstorming` route to `writing-plans` and
|
|
7
|
+
* `subagent-driven-development` by name; installing under the prefixed names
|
|
8
|
+
* would leave those references dangling.
|
|
9
|
+
*
|
|
10
|
+
* Stripping the prefix is not a directory rename. The name appears inside hashed
|
|
11
|
+
* runtime files, so the caller must rewrite those occurrences and then regenerate
|
|
12
|
+
* the runtime manifest, or `manifest-hash` reports a mismatch for a tree that is
|
|
13
|
+
* otherwise correct.
|
|
14
|
+
*/
|
|
15
|
+
export const OPTIONAL_SKILLS = Object.freeze([
|
|
16
|
+
Object.freeze({
|
|
17
|
+
sourceName: "deterministic-writing-plans",
|
|
18
|
+
installName: "writing-plans",
|
|
19
|
+
}),
|
|
20
|
+
Object.freeze({
|
|
21
|
+
sourceName: "deterministic-subagent-driven-development",
|
|
22
|
+
installName: "subagent-driven-development",
|
|
23
|
+
}),
|
|
24
|
+
]);
|
|
25
|
+
const PREFIX = "deterministic-";
|
|
26
|
+
/**
|
|
27
|
+
* Rewrites prefixed skill names in a shipped text file to their installed names.
|
|
28
|
+
*
|
|
29
|
+
* Applies to every configured skill, not just the file's own, because the
|
|
30
|
+
* authoring skill references the controller's directory as a sibling path.
|
|
31
|
+
*/
|
|
32
|
+
export function rewriteSkillNames(content, skills = OPTIONAL_SKILLS) {
|
|
33
|
+
let result = content;
|
|
34
|
+
for (const skill of skills) {
|
|
35
|
+
result = result.split(skill.sourceName).join(skill.installName);
|
|
36
|
+
}
|
|
37
|
+
return result;
|
|
38
|
+
}
|
|
39
|
+
/** Strips the install prefix from a single name, leaving unprefixed names alone. */
|
|
40
|
+
export function stripSkillPrefix(name) {
|
|
41
|
+
return name.startsWith(PREFIX) ? name.slice(PREFIX.length) : name;
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Removes lock entries for skills this installer now owns.
|
|
45
|
+
*
|
|
46
|
+
* A stale entry is worse than a missing one: it names an upstream `sourceUrl`
|
|
47
|
+
* and a folder hash that no longer matches the installed tree, so an updater
|
|
48
|
+
* comparing them concludes the skill is out of date and overwrites it. With no
|
|
49
|
+
* entry the server reports no install info at all, which is the documented
|
|
50
|
+
* behavior for package-provided skills.
|
|
51
|
+
*/
|
|
52
|
+
export function pruneSkillLock(document, skills = OPTIONAL_SKILLS) {
|
|
53
|
+
const entries = document.skills;
|
|
54
|
+
if (entries === undefined)
|
|
55
|
+
return { document, removed: [] };
|
|
56
|
+
const removed = [];
|
|
57
|
+
const kept = {};
|
|
58
|
+
for (const [name, value] of Object.entries(entries)) {
|
|
59
|
+
if (skills.some((skill) => skill.installName === name)) {
|
|
60
|
+
removed.push(name);
|
|
61
|
+
continue;
|
|
62
|
+
}
|
|
63
|
+
kept[name] = value;
|
|
64
|
+
}
|
|
65
|
+
if (removed.length === 0)
|
|
66
|
+
return { document, removed: [] };
|
|
67
|
+
return { document: { ...document, skills: kept }, removed };
|
|
68
|
+
}
|
|
69
|
+
//# sourceMappingURL=optionalSkillInstall.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"optionalSkillInstall.js","sourceRoot":"","sources":["../../../src/server/skills/optionalSkillInstall.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AASH,MAAM,CAAC,MAAM,eAAe,GAAiC,MAAM,CAAC,MAAM,CAAC;IACzE,MAAM,CAAC,MAAM,CAAC;QACZ,UAAU,EAAE,6BAA6B;QACzC,WAAW,EAAE,eAAe;KAC7B,CAAC;IACF,MAAM,CAAC,MAAM,CAAC;QACZ,UAAU,EAAE,2CAA2C;QACvD,WAAW,EAAE,6BAA6B;KAC3C,CAAC;CACH,CAAC,CAAC;AAEH,MAAM,MAAM,GAAG,gBAAgB,CAAC;AAEhC;;;;;GAKG;AACH,MAAM,UAAU,iBAAiB,CAC/B,OAAe,EACf,SAAuC,eAAe;IAEtD,IAAI,MAAM,GAAG,OAAO,CAAC;IACrB,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;IAClE,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,oFAAoF;AACpF,MAAM,UAAU,gBAAgB,CAAC,IAAY;IAC3C,OAAO,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;AACpE,CAAC;AAcD;;;;;;;;GAQG;AACH,MAAM,UAAU,cAAc,CAC5B,QAA2B,EAC3B,SAAuC,eAAe;IAEtD,MAAM,OAAO,GAAG,QAAQ,CAAC,MAAM,CAAC;IAChC,IAAI,OAAO,KAAK,SAAS;QAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC;IAE5D,MAAM,OAAO,GAAa,EAAE,CAAC;IAC7B,MAAM,IAAI,GAA4B,EAAE,CAAC;IACzC,KAAK,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;QACpD,IAAI,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,WAAW,KAAK,IAAI,CAAC,EAAE,CAAC;YACvD,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACnB,SAAS;QACX,CAAC;QACD,IAAI,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC;IACrB,CAAC;IAED,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC;IAC3D,OAAO,EAAE,QAAQ,EAAE,EAAE,GAAG,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,OAAO,EAAE,CAAC;AAC9D,CAAC"}
|