@hyperdreamer/pi-webui 1.11.0-beta.5 → 1.11.0-beta.7
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 +1 -1
- package/dist/client/assets/{CodeViewer-BJQFgK3S.js → CodeViewer-DnVESWeo.js} +1 -1
- package/dist/client/assets/{UnifiedDiffViewer-DfJJrNLr.js → UnifiedDiffViewer-DtcErd2T.js} +1 -1
- package/dist/client/assets/{index-CsVTzPPD.js → index-BnqpOnKq.js} +584 -516
- package/dist/client/index.html +1 -1
- package/dist/server/sessiond.js +6 -1
- 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/piSessionService.js +877 -290
- 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/starterModelPolicyPreferenceStore.js +164 -0
- package/dist/server/sessions/starterModelPolicyPreferenceStore.js.map +1 -0
- package/dist/shared/apiTypes.d.ts +23 -3
- package/dist/shared/apiTypes.js +1 -0
- package/dist/shared/apiTypes.js.map +1 -1
- package/dist/shared/capabilities.js +3 -0
- package/dist/shared/capabilities.js.map +1 -1
- package/docs/config.md +12 -5
- package/optional-skills/deterministic-subagent-driven-development/SKILL.md +15 -15
- package/optional-skills/deterministic-subagent-driven-development/pi-webui-skill.json +2 -2
- package/optional-skills/deterministic-subagent-driven-development/references/capability-contract.md +16 -16
- package/optional-skills/deterministic-subagent-driven-development/references/plan-contract.md +4 -4
- package/optional-skills/deterministic-subagent-driven-development/references/state-machine.md +3 -3
- package/optional-skills/deterministic-subagent-driven-development/scripts/lib/plan-policy.mjs +18 -9
- package/optional-skills/deterministic-subagent-driven-development/scripts/lib/prompt-renderer.mjs +3 -3
- package/optional-skills/deterministic-subagent-driven-development/scripts/lib/state-machine.mjs +6 -5
- package/optional-skills/deterministic-subagent-driven-development/scripts/sdd-state.mjs +1 -0
- package/package.json +7 -7
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { MODEL_TIERS, } from "../../shared/apiTypes.js";
|
|
1
2
|
import { isKnownThinkingLevel } from "../../shared/thinkingLevels.js";
|
|
2
3
|
import { normalizeRequestCwd } from "../workingDirectory.js";
|
|
3
4
|
export function registerSessionDefaultsRoutes(app, service, prefix = "") {
|
|
@@ -21,7 +22,19 @@ export function registerSessionDefaultsRoutes(app, service, prefix = "") {
|
|
|
21
22
|
}
|
|
22
23
|
function parseUpdate(value) {
|
|
23
24
|
const body = requireRecord(value);
|
|
25
|
+
requireAllowedFields(body, ["cwd", "model", "thinkingLevel", "starterModelPolicyPreference"], "session defaults update");
|
|
24
26
|
const cwd = normalizeRequestCwd(requireString(body["cwd"], "cwd"));
|
|
27
|
+
if (body["starterModelPolicyPreference"] !== undefined) {
|
|
28
|
+
if (body["model"] !== undefined || body["thinkingLevel"] !== undefined) {
|
|
29
|
+
throw new Error("A starter model policy preference update cannot include model or thinkingLevel");
|
|
30
|
+
}
|
|
31
|
+
return {
|
|
32
|
+
cwd,
|
|
33
|
+
update: {
|
|
34
|
+
starterModelPolicyPreference: parseStarterModelPolicyPreference(body["starterModelPolicyPreference"]),
|
|
35
|
+
},
|
|
36
|
+
};
|
|
37
|
+
}
|
|
25
38
|
const model = body["model"] === undefined ? undefined : parseModel(body["model"]);
|
|
26
39
|
const thinkingLevel = body["thinkingLevel"] === undefined ? undefined : requireThinkingLevel(body["thinkingLevel"]);
|
|
27
40
|
if (model === undefined && thinkingLevel === undefined)
|
|
@@ -34,6 +47,25 @@ function parseUpdate(value) {
|
|
|
34
47
|
},
|
|
35
48
|
};
|
|
36
49
|
}
|
|
50
|
+
function parseStarterModelPolicyPreference(value) {
|
|
51
|
+
const preference = requireRecord(value);
|
|
52
|
+
requireAllowedFields(preference, ["mode", "tier"], "starterModelPolicyPreference");
|
|
53
|
+
const mode = preference["mode"];
|
|
54
|
+
if (mode !== "exact" && mode !== "tiered") {
|
|
55
|
+
throw new Error("starterModelPolicyPreference mode must be exact or tiered");
|
|
56
|
+
}
|
|
57
|
+
const tier = preference["tier"];
|
|
58
|
+
if (tier !== undefined && !isModelTier(tier)) {
|
|
59
|
+
throw new Error(`starterModelPolicyPreference tier must be one of: ${MODEL_TIERS.join(", ")}`);
|
|
60
|
+
}
|
|
61
|
+
if (mode === "tiered" && tier === undefined) {
|
|
62
|
+
throw new Error("starterModelPolicyPreference tier is required in Tiered mode");
|
|
63
|
+
}
|
|
64
|
+
return tier === undefined ? { mode } : { mode, tier };
|
|
65
|
+
}
|
|
66
|
+
function isModelTier(value) {
|
|
67
|
+
return typeof value === "string" && MODEL_TIERS.some((tier) => tier === value);
|
|
68
|
+
}
|
|
37
69
|
function parseModel(value) {
|
|
38
70
|
const model = requireRecord(value);
|
|
39
71
|
return {
|
|
@@ -46,6 +78,13 @@ function requireThinkingLevel(value) {
|
|
|
46
78
|
throw new Error("Invalid thinkingLevel");
|
|
47
79
|
return value;
|
|
48
80
|
}
|
|
81
|
+
function requireAllowedFields(record, allowedFields, field) {
|
|
82
|
+
const allowed = new Set(allowedFields);
|
|
83
|
+
const unknownField = Object.keys(record).find((key) => !allowed.has(key));
|
|
84
|
+
if (unknownField !== undefined) {
|
|
85
|
+
throw new Error(`${field} has unknown field ${JSON.stringify(unknownField)}`);
|
|
86
|
+
}
|
|
87
|
+
}
|
|
49
88
|
function requireRecord(value) {
|
|
50
89
|
if (!isRecord(value))
|
|
51
90
|
throw new Error("Expected object body");
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sessionDefaultsRoutes.js","sourceRoot":"","sources":["../../../src/server/sessions/sessionDefaultsRoutes.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"sessionDefaultsRoutes.js","sourceRoot":"","sources":["../../../src/server/sessions/sessionDefaultsRoutes.ts"],"names":[],"mappings":"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"}
|
|
@@ -10,10 +10,18 @@ export class SessionDefaultsService {
|
|
|
10
10
|
}
|
|
11
11
|
async read(cwd) {
|
|
12
12
|
const settings = this.createSettingsManager(cwd, this.deps.agentDir);
|
|
13
|
-
const models = await
|
|
14
|
-
|
|
13
|
+
const [models, preferenceInspection] = await Promise.all([
|
|
14
|
+
this.availableModels(),
|
|
15
|
+
this.inspectStarterPreference(cwd),
|
|
16
|
+
]);
|
|
17
|
+
return this.response(settings, models, preferenceInspection);
|
|
15
18
|
}
|
|
16
19
|
async update(cwd, update) {
|
|
20
|
+
const preference = update.starterModelPolicyPreference;
|
|
21
|
+
if (preference !== undefined) {
|
|
22
|
+
await this.deps.starterModelPolicyPreferenceStore.replace(cwd, preference);
|
|
23
|
+
return await this.read(cwd);
|
|
24
|
+
}
|
|
17
25
|
const settings = this.createSettingsManager(cwd, this.deps.agentDir);
|
|
18
26
|
const models = await this.availableModels();
|
|
19
27
|
let model = configuredDefaultModel(settings, models);
|
|
@@ -44,17 +52,26 @@ export class SessionDefaultsService {
|
|
|
44
52
|
}
|
|
45
53
|
if (changed)
|
|
46
54
|
await settings.flush();
|
|
47
|
-
|
|
55
|
+
const preferenceInspection = await this.inspectStarterPreference(cwd);
|
|
56
|
+
return responseFor(models, model, thinkingLevel, thinkingLevels, preferenceInspection);
|
|
48
57
|
}
|
|
49
58
|
async availableModels() {
|
|
50
59
|
await this.deps.modelRuntime.refresh({ allowNetwork: false });
|
|
51
60
|
return [...this.deps.modelRuntime.getAvailableSnapshot()];
|
|
52
61
|
}
|
|
53
|
-
|
|
62
|
+
async inspectStarterPreference(cwd) {
|
|
63
|
+
try {
|
|
64
|
+
return await this.deps.starterModelPolicyPreferenceStore.inspect(cwd);
|
|
65
|
+
}
|
|
66
|
+
catch (error) {
|
|
67
|
+
return { kind: "invalid", reason: errorMessage(error) };
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
response(settings, models, preferenceInspection) {
|
|
54
71
|
const model = configuredDefaultModel(settings, models);
|
|
55
72
|
const thinkingLevels = this.thinkingLevelsForModel(model);
|
|
56
73
|
const thinkingLevel = effectiveThinkingLevel(settings.getDefaultThinkingLevel() ?? "off", thinkingLevels);
|
|
57
|
-
return responseFor(models, model, thinkingLevel, thinkingLevels);
|
|
74
|
+
return responseFor(models, model, thinkingLevel, thinkingLevels, preferenceInspection);
|
|
58
75
|
}
|
|
59
76
|
}
|
|
60
77
|
function defaultThinkingLevelsForModel(model) {
|
|
@@ -70,14 +87,24 @@ function configuredDefaultModel(settings, models) {
|
|
|
70
87
|
function effectiveThinkingLevel(configured, levels) {
|
|
71
88
|
return levels.includes(configured) ? configured : (levels[0] ?? "off");
|
|
72
89
|
}
|
|
73
|
-
function responseFor(models, model, thinkingLevel, thinkingLevels) {
|
|
90
|
+
function responseFor(models, model, thinkingLevel, thinkingLevels, preferenceInspection) {
|
|
74
91
|
return {
|
|
75
92
|
...(model === undefined ? {} : { model: modelToClientModel(model) }),
|
|
76
93
|
thinkingLevel,
|
|
77
94
|
models: models.map(modelToClientModel),
|
|
78
95
|
thinkingLevels: [...thinkingLevels],
|
|
96
|
+
...preferenceFields(preferenceInspection),
|
|
79
97
|
};
|
|
80
98
|
}
|
|
99
|
+
function preferenceFields(inspection) {
|
|
100
|
+
if (inspection.kind === "valid") {
|
|
101
|
+
return { starterModelPolicyPreference: { ...inspection.preference } };
|
|
102
|
+
}
|
|
103
|
+
if (inspection.kind === "invalid") {
|
|
104
|
+
return { starterModelPolicyPreferenceError: inspection.reason };
|
|
105
|
+
}
|
|
106
|
+
return {};
|
|
107
|
+
}
|
|
81
108
|
function modelToClientModel(model) {
|
|
82
109
|
return {
|
|
83
110
|
provider: model.provider,
|
|
@@ -87,4 +114,7 @@ function modelToClientModel(model) {
|
|
|
87
114
|
reasoning: model.reasoning,
|
|
88
115
|
};
|
|
89
116
|
}
|
|
117
|
+
function errorMessage(error) {
|
|
118
|
+
return error instanceof Error ? error.message : String(error);
|
|
119
|
+
}
|
|
90
120
|
//# sourceMappingURL=sessionDefaultsService.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sessionDefaultsService.js","sourceRoot":"","sources":["../../../src/server/sessions/sessionDefaultsService.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,0BAA0B,EAAwB,MAAM,uBAAuB,CAAC;AACzF,OAAO,EAAE,eAAe,EAAE,MAAM,iCAAiC,CAAC;AAElE,OAAO,EAAE,qBAAqB,EAAE,oBAAoB,EAAsB,MAAM,gCAAgC,CAAC;
|
|
1
|
+
{"version":3,"file":"sessionDefaultsService.js","sourceRoot":"","sources":["../../../src/server/sessions/sessionDefaultsService.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
import { randomUUID } from "node:crypto";
|
|
2
|
+
import { mkdir, readFile, rename, rm, writeFile } from "node:fs/promises";
|
|
3
|
+
import { basename, dirname, isAbsolute, join, resolve } from "node:path";
|
|
4
|
+
import { piWebUiDataDir } from "../../config.js";
|
|
5
|
+
import { MODEL_TIERS, } from "../../shared/apiTypes.js";
|
|
6
|
+
const STARTER_MODEL_POLICY_PREFERENCE_VERSION = 1;
|
|
7
|
+
const STARTER_MODEL_POLICY_PREFERENCE_FILE_MODE = 0o600;
|
|
8
|
+
export class FileStarterModelPolicyPreferencePersistence {
|
|
9
|
+
constructor(filePath = defaultStarterModelPolicyPreferenceFilePath(), renameFile = rename) {
|
|
10
|
+
this.filePath = filePath;
|
|
11
|
+
this.renameFile = renameFile;
|
|
12
|
+
}
|
|
13
|
+
async load() {
|
|
14
|
+
try {
|
|
15
|
+
const value = JSON.parse(await readFile(this.filePath, "utf8"));
|
|
16
|
+
return value;
|
|
17
|
+
}
|
|
18
|
+
catch (error) {
|
|
19
|
+
if (isNodeErrorWithCode(error, "ENOENT"))
|
|
20
|
+
return undefined;
|
|
21
|
+
throw error;
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
async save(value) {
|
|
25
|
+
await mkdir(dirname(this.filePath), { recursive: true });
|
|
26
|
+
const tempPath = join(dirname(this.filePath), `.${basename(this.filePath)}.${String(process.pid)}.${randomUUID()}.tmp`);
|
|
27
|
+
try {
|
|
28
|
+
await writeFile(tempPath, `${JSON.stringify(value, null, 2)}\n`, {
|
|
29
|
+
encoding: "utf8",
|
|
30
|
+
mode: STARTER_MODEL_POLICY_PREFERENCE_FILE_MODE,
|
|
31
|
+
flag: "wx",
|
|
32
|
+
});
|
|
33
|
+
await this.renameFile(tempPath, this.filePath);
|
|
34
|
+
}
|
|
35
|
+
finally {
|
|
36
|
+
await rm(tempPath, { force: true }).catch(() => undefined);
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
export class StarterModelPolicyPreferenceStore {
|
|
41
|
+
constructor(persistence = new FileStarterModelPolicyPreferencePersistence()) {
|
|
42
|
+
this.persistence = persistence;
|
|
43
|
+
this.operationQueue = Promise.resolve();
|
|
44
|
+
}
|
|
45
|
+
async inspect(cwd) {
|
|
46
|
+
try {
|
|
47
|
+
requireNormalizedAbsoluteCwd(cwd);
|
|
48
|
+
const data = parsePreferenceFile(await this.persistence.load());
|
|
49
|
+
const preference = data.workspaces[cwd];
|
|
50
|
+
return preference === undefined
|
|
51
|
+
? { kind: "absent" }
|
|
52
|
+
: { kind: "valid", preference: clonePreference(preference) };
|
|
53
|
+
}
|
|
54
|
+
catch (error) {
|
|
55
|
+
return { kind: "invalid", reason: errorMessage(error) };
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
async replace(cwd, value) {
|
|
59
|
+
requireNormalizedAbsoluteCwd(cwd);
|
|
60
|
+
const preference = parsePreference(value, "starter preference");
|
|
61
|
+
await this.exclusive(async () => {
|
|
62
|
+
const data = parsePreferenceFile(await this.persistence.load());
|
|
63
|
+
data.workspaces[cwd] = clonePreference(preference);
|
|
64
|
+
await this.persistence.save(data);
|
|
65
|
+
});
|
|
66
|
+
}
|
|
67
|
+
async exclusive(operation) {
|
|
68
|
+
const previous = this.operationQueue;
|
|
69
|
+
let release = () => undefined;
|
|
70
|
+
this.operationQueue = new Promise((resolvePromise) => { release = resolvePromise; });
|
|
71
|
+
await previous.catch(() => undefined);
|
|
72
|
+
try {
|
|
73
|
+
return await operation();
|
|
74
|
+
}
|
|
75
|
+
finally {
|
|
76
|
+
release();
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
export function defaultStarterModelPolicyPreferenceFilePath(env = process.env, cwd = process.cwd()) {
|
|
81
|
+
return join(piWebUiDataDir(env, cwd), "starter-model-policy-preferences.json");
|
|
82
|
+
}
|
|
83
|
+
function parsePreferenceFile(value) {
|
|
84
|
+
if (value === undefined)
|
|
85
|
+
return emptyPreferenceFile();
|
|
86
|
+
const record = requireRecord(value, "starter model policy preference file must be an object");
|
|
87
|
+
requireExactFields(record, ["version", "workspaces"], [], "starter model policy preference file");
|
|
88
|
+
if (record["version"] !== STARTER_MODEL_POLICY_PREFERENCE_VERSION) {
|
|
89
|
+
throw new Error("unsupported starter model policy preference file version");
|
|
90
|
+
}
|
|
91
|
+
const persistedWorkspaces = requireRecord(record["workspaces"], "starter model policy preference workspaces must be an object");
|
|
92
|
+
const workspaces = emptyWorkspaceRecord();
|
|
93
|
+
for (const [cwd, preference] of Object.entries(persistedWorkspaces)) {
|
|
94
|
+
requireNormalizedAbsoluteCwd(cwd);
|
|
95
|
+
workspaces[cwd] = parsePreference(preference, `starter preference for ${JSON.stringify(cwd)}`);
|
|
96
|
+
}
|
|
97
|
+
return { version: STARTER_MODEL_POLICY_PREFERENCE_VERSION, workspaces };
|
|
98
|
+
}
|
|
99
|
+
function emptyPreferenceFile() {
|
|
100
|
+
return {
|
|
101
|
+
version: STARTER_MODEL_POLICY_PREFERENCE_VERSION,
|
|
102
|
+
workspaces: emptyWorkspaceRecord(),
|
|
103
|
+
};
|
|
104
|
+
}
|
|
105
|
+
function emptyWorkspaceRecord() {
|
|
106
|
+
const workspaces = {};
|
|
107
|
+
Object.setPrototypeOf(workspaces, null);
|
|
108
|
+
return workspaces;
|
|
109
|
+
}
|
|
110
|
+
function parsePreference(value, field) {
|
|
111
|
+
const record = requireRecord(value, `${field} must be an object`);
|
|
112
|
+
requireExactFields(record, ["mode"], ["tier"], field);
|
|
113
|
+
const mode = record["mode"];
|
|
114
|
+
if (mode !== "exact" && mode !== "tiered") {
|
|
115
|
+
throw new Error(`${field} mode must be exact or tiered`);
|
|
116
|
+
}
|
|
117
|
+
const tier = record["tier"] === undefined
|
|
118
|
+
? undefined
|
|
119
|
+
: requireCanonicalTier(record["tier"], `${field} tier`);
|
|
120
|
+
if (mode === "tiered" && tier === undefined)
|
|
121
|
+
throw new Error(`${field} tier is required in Tiered mode`);
|
|
122
|
+
return tier === undefined ? { mode } : { mode, tier };
|
|
123
|
+
}
|
|
124
|
+
function clonePreference(preference) {
|
|
125
|
+
return preference.tier === undefined
|
|
126
|
+
? { mode: preference.mode }
|
|
127
|
+
: { mode: preference.mode, tier: preference.tier };
|
|
128
|
+
}
|
|
129
|
+
function requireCanonicalTier(value, field) {
|
|
130
|
+
for (const tier of MODEL_TIERS) {
|
|
131
|
+
if (value === tier)
|
|
132
|
+
return tier;
|
|
133
|
+
}
|
|
134
|
+
throw new Error(`${field} must be one of: ${MODEL_TIERS.join(", ")}`);
|
|
135
|
+
}
|
|
136
|
+
function requireNormalizedAbsoluteCwd(cwd) {
|
|
137
|
+
if (!isAbsolute(cwd) || resolve(cwd) !== cwd) {
|
|
138
|
+
throw new Error(`workspace path must be normalized and absolute: ${JSON.stringify(cwd)}`);
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
function requireExactFields(record, required, optional, field) {
|
|
142
|
+
const allowed = new Set([...required, ...optional]);
|
|
143
|
+
const unknownField = Object.keys(record).find((key) => !allowed.has(key));
|
|
144
|
+
if (unknownField !== undefined)
|
|
145
|
+
throw new Error(`${field} has unknown field ${JSON.stringify(unknownField)}`);
|
|
146
|
+
const missingField = required.find((key) => !Object.hasOwn(record, key));
|
|
147
|
+
if (missingField !== undefined)
|
|
148
|
+
throw new Error(`${field} is missing field ${JSON.stringify(missingField)}`);
|
|
149
|
+
}
|
|
150
|
+
function requireRecord(value, message) {
|
|
151
|
+
if (!isRecord(value))
|
|
152
|
+
throw new Error(message);
|
|
153
|
+
return value;
|
|
154
|
+
}
|
|
155
|
+
function isRecord(value) {
|
|
156
|
+
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
157
|
+
}
|
|
158
|
+
function isNodeErrorWithCode(error, code) {
|
|
159
|
+
return error instanceof Error && "code" in error && error.code === code;
|
|
160
|
+
}
|
|
161
|
+
function errorMessage(error) {
|
|
162
|
+
return error instanceof Error ? error.message : String(error);
|
|
163
|
+
}
|
|
164
|
+
//# sourceMappingURL=starterModelPolicyPreferenceStore.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"starterModelPolicyPreferenceStore.js","sourceRoot":"","sources":["../../../src/server/sessions/starterModelPolicyPreferenceStore.ts"],"names":[],"mappings":"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"}
|
|
@@ -18,6 +18,7 @@ export declare const PI_WEBUI_CAPABILITIES: {
|
|
|
18
18
|
readonly agentProfileConfig: "settings.agentProfile";
|
|
19
19
|
readonly modelTierSettings: "settings.modelTiers";
|
|
20
20
|
readonly sessionsModelPolicy: "sessions.modelPolicy";
|
|
21
|
+
readonly sessionsModelPolicyDefaults: "sessions.modelPolicyDefaults";
|
|
21
22
|
};
|
|
22
23
|
export type PiWebUiCapability = typeof PI_WEBUI_CAPABILITIES[keyof typeof PI_WEBUI_CAPABILITIES];
|
|
23
24
|
export interface Machine {
|
|
@@ -84,6 +85,11 @@ export interface ExactModelSelection {
|
|
|
84
85
|
thinkingLevel: string;
|
|
85
86
|
}
|
|
86
87
|
export type SessionModelPolicyMode = "exact" | "tiered";
|
|
88
|
+
export interface StarterModelPolicyPreference {
|
|
89
|
+
mode: SessionModelPolicyMode;
|
|
90
|
+
/** Remembered while Exact is active; required while Tiered is active. */
|
|
91
|
+
tier?: ModelTier;
|
|
92
|
+
}
|
|
87
93
|
export interface SessionModelPolicy {
|
|
88
94
|
mode: SessionModelPolicyMode;
|
|
89
95
|
exact: ExactModelSelection;
|
|
@@ -679,14 +685,28 @@ export interface SessionDefaultsResponse {
|
|
|
679
685
|
thinkingLevel: string;
|
|
680
686
|
models: SessionModel[];
|
|
681
687
|
thinkingLevels: string[];
|
|
688
|
+
starterModelPolicyPreference?: StarterModelPolicyPreference;
|
|
689
|
+
starterModelPolicyPreferenceError?: string;
|
|
682
690
|
}
|
|
683
|
-
export
|
|
684
|
-
model
|
|
691
|
+
export type SessionDefaultsUpdate = {
|
|
692
|
+
model: {
|
|
685
693
|
provider: string;
|
|
686
694
|
modelId: string;
|
|
687
695
|
};
|
|
688
696
|
thinkingLevel?: string;
|
|
689
|
-
|
|
697
|
+
starterModelPolicyPreference?: never;
|
|
698
|
+
} | {
|
|
699
|
+
model?: {
|
|
700
|
+
provider: string;
|
|
701
|
+
modelId: string;
|
|
702
|
+
};
|
|
703
|
+
thinkingLevel: string;
|
|
704
|
+
starterModelPolicyPreference?: never;
|
|
705
|
+
} | {
|
|
706
|
+
model?: never;
|
|
707
|
+
thinkingLevel?: never;
|
|
708
|
+
starterModelPolicyPreference: StarterModelPolicyPreference;
|
|
709
|
+
};
|
|
690
710
|
/** Editable `models.json` document for the active Pi-compatible profile. */
|
|
691
711
|
export interface ModelsConfigDocument {
|
|
692
712
|
providers?: Record<string, ModelsConfigProvider> | undefined;
|
package/dist/shared/apiTypes.js
CHANGED
|
@@ -16,6 +16,7 @@ export const PI_WEBUI_CAPABILITIES = {
|
|
|
16
16
|
agentProfileConfig: "settings.agentProfile",
|
|
17
17
|
modelTierSettings: "settings.modelTiers",
|
|
18
18
|
sessionsModelPolicy: "sessions.modelPolicy",
|
|
19
|
+
sessionsModelPolicyDefaults: "sessions.modelPolicyDefaults",
|
|
19
20
|
};
|
|
20
21
|
export const MODEL_TIERS = ["economy", "fast", "standard", "advanced", "capable", "frontier"];
|
|
21
22
|
export const SESSION_UNREAD_LIMIT = 1_000;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"apiTypes.js","sourceRoot":"","sources":["../../src/shared/apiTypes.ts"],"names":[],"mappings":"AAGA,MAAM,CAAC,MAAM,qBAAqB,GAAG;IACnC,sBAAsB,EAAE,yBAAyB;IACjD,qBAAqB,EAAE,wBAAwB;IAC/C,eAAe,EAAE,kBAAkB;IACnC,cAAc,EAAE,iBAAiB;IACjC,kBAAkB,EAAE,qBAAqB;IACzC,sBAAsB,EAAE,yBAAyB;IACjD,oBAAoB,EAAE,uBAAuB;IAC7C,sBAAsB,EAAE,yBAAyB;IACjD,qBAAqB,EAAE,wBAAwB;IAC/C,cAAc,EAAE,iBAAiB;IACjC,iBAAiB,EAAE,oBAAoB;IACvC,wBAAwB,EAAE,2BAA2B;IACrD,gBAAgB,EAAE,mBAAmB;IACrC,uBAAuB,EAAE,0BAA0B;IACnD,kBAAkB,EAAE,uBAAuB;IAC3C,iBAAiB,EAAE,qBAAqB;IACxC,mBAAmB,EAAE,sBAAsB;
|
|
1
|
+
{"version":3,"file":"apiTypes.js","sourceRoot":"","sources":["../../src/shared/apiTypes.ts"],"names":[],"mappings":"AAGA,MAAM,CAAC,MAAM,qBAAqB,GAAG;IACnC,sBAAsB,EAAE,yBAAyB;IACjD,qBAAqB,EAAE,wBAAwB;IAC/C,eAAe,EAAE,kBAAkB;IACnC,cAAc,EAAE,iBAAiB;IACjC,kBAAkB,EAAE,qBAAqB;IACzC,sBAAsB,EAAE,yBAAyB;IACjD,oBAAoB,EAAE,uBAAuB;IAC7C,sBAAsB,EAAE,yBAAyB;IACjD,qBAAqB,EAAE,wBAAwB;IAC/C,cAAc,EAAE,iBAAiB;IACjC,iBAAiB,EAAE,oBAAoB;IACvC,wBAAwB,EAAE,2BAA2B;IACrD,gBAAgB,EAAE,mBAAmB;IACrC,uBAAuB,EAAE,0BAA0B;IACnD,kBAAkB,EAAE,uBAAuB;IAC3C,iBAAiB,EAAE,qBAAqB;IACxC,mBAAmB,EAAE,sBAAsB;IAC3C,2BAA2B,EAAE,8BAA8B;CACnD,CAAC;AAsDX,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,UAAU,EAAE,SAAS,EAAE,UAAU,CAAU,CAAC;AA8WvG,MAAM,CAAC,MAAM,oBAAoB,GAAG,KAAK,CAAC;AAC1C,MAAM,CAAC,MAAM,oCAAoC,GAAG,GAAG,CAAC;AACxD,MAAM,CAAC,MAAM,6BAA6B,GAAG,EAAE,GAAG,IAAI,CAAC;AACvD,MAAM,CAAC,MAAM,oCAAoC,GAAG,GAAG,CAAC;AACxD,MAAM,CAAC,MAAM,sCAAsC,GAAG,EAAE,CAAC;AAqCzD,MAAM,CAAC,MAAM,0BAA0B,GAAG,GAAG,CAAC;AAC9C,MAAM,CAAC,MAAM,kCAAkC,GAAG,CAAC,GAAG,IAAI,CAAC;AAkvB3D,MAAM,CAAC,MAAM,2CAA2C,GAAG,MAAM,CAAC"}
|
|
@@ -20,6 +20,7 @@ export const WEB_RUNTIME_CAPABILITIES = [
|
|
|
20
20
|
PI_WEBUI_CAPABILITIES.agentProfileConfig,
|
|
21
21
|
PI_WEBUI_CAPABILITIES.modelTierSettings,
|
|
22
22
|
PI_WEBUI_CAPABILITIES.sessionsModelPolicy,
|
|
23
|
+
PI_WEBUI_CAPABILITIES.sessionsModelPolicyDefaults,
|
|
23
24
|
];
|
|
24
25
|
export const SESSIOND_RUNTIME_CAPABILITIES = [
|
|
25
26
|
PI_WEBUI_CAPABILITIES.sessionsDeleteArchived,
|
|
@@ -35,6 +36,7 @@ export const SESSIOND_RUNTIME_CAPABILITIES = [
|
|
|
35
36
|
PI_WEBUI_CAPABILITIES.promptAttachments,
|
|
36
37
|
PI_WEBUI_CAPABILITIES.modelTierSettings,
|
|
37
38
|
PI_WEBUI_CAPABILITIES.sessionsModelPolicy,
|
|
39
|
+
PI_WEBUI_CAPABILITIES.sessionsModelPolicyDefaults,
|
|
38
40
|
];
|
|
39
41
|
const EFFECTIVE_CAPABILITY_REQUIREMENTS = {
|
|
40
42
|
[PI_WEBUI_CAPABILITIES.sessionsDeleteArchived]: ["web", "sessiond"],
|
|
@@ -54,6 +56,7 @@ const EFFECTIVE_CAPABILITY_REQUIREMENTS = {
|
|
|
54
56
|
[PI_WEBUI_CAPABILITIES.agentProfileConfig]: ["web"],
|
|
55
57
|
[PI_WEBUI_CAPABILITIES.modelTierSettings]: ["web", "sessiond"],
|
|
56
58
|
[PI_WEBUI_CAPABILITIES.sessionsModelPolicy]: ["web", "sessiond"],
|
|
59
|
+
[PI_WEBUI_CAPABILITIES.sessionsModelPolicyDefaults]: ["web", "sessiond"],
|
|
57
60
|
};
|
|
58
61
|
export function isPiWebUiCapability(value) {
|
|
59
62
|
return typeof value === "string" && knownPiWebUiCapabilities.has(value);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"capabilities.js","sourceRoot":"","sources":["../../src/shared/capabilities.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAsF,MAAM,eAAe,CAAC;AAE1I,OAAO,EAAE,qBAAqB,EAAE,CAAC;AAGjC,MAAM,CAAC,MAAM,2BAA2B,GAAG,MAAM,CAAC,MAAM,CAAC,qBAAqB,CAAC,CAAC;AAChF,MAAM,wBAAwB,GAAwB,IAAI,GAAG,CAAC,2BAA2B,CAAC,CAAC;AAE3F,MAAM,CAAC,MAAM,wBAAwB,GAAG;IACtC,qBAAqB,CAAC,sBAAsB;IAC5C,qBAAqB,CAAC,qBAAqB;IAC3C,qBAAqB,CAAC,eAAe;IACrC,qBAAqB,CAAC,cAAc;IACpC,qBAAqB,CAAC,kBAAkB;IACxC,qBAAqB,CAAC,sBAAsB;IAC5C,qBAAqB,CAAC,oBAAoB;IAC1C,qBAAqB,CAAC,sBAAsB;IAC5C,qBAAqB,CAAC,qBAAqB;IAC3C,qBAAqB,CAAC,cAAc;IACpC,qBAAqB,CAAC,iBAAiB;IACvC,qBAAqB,CAAC,wBAAwB;IAC9C,qBAAqB,CAAC,gBAAgB;IACtC,qBAAqB,CAAC,uBAAuB;IAC7C,qBAAqB,CAAC,kBAAkB;IACxC,qBAAqB,CAAC,iBAAiB;IACvC,qBAAqB,CAAC,mBAAmB;
|
|
1
|
+
{"version":3,"file":"capabilities.js","sourceRoot":"","sources":["../../src/shared/capabilities.ts"],"names":[],"mappings":"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"}
|
package/docs/config.md
CHANGED
|
@@ -146,7 +146,9 @@ Rows with JSON key `—` are runtime-only environment variables, not config-file
|
|
|
146
146
|
|
|
147
147
|
### Managed data directory
|
|
148
148
|
|
|
149
|
-
`PI_WEBUI_DATA_DIR` sets the root for PI WEBUI-managed runtime state and defaults to `~/.pi-webui`. Unless a more specific path override is configured, PI WEBUI stores its project and machine registries, locally discovered plugins, default session-daemon socket, and session archives beneath this root.
|
|
149
|
+
`PI_WEBUI_DATA_DIR` sets the root for PI WEBUI-managed runtime state and defaults to `~/.pi-webui`. Unless a more specific path override is configured, PI WEBUI stores its project and machine registries (`projects.json` and `machines.json`), remembered starter model policy preferences (`starter-model-policy-preferences.json`, see [Model tiers](#model-tiers)), locally discovered plugins, default session-daemon socket, and session archives beneath this root.
|
|
150
|
+
|
|
151
|
+
This managed state is not the user-editable config API. Edit it through PI WEBUI rather than by hand.
|
|
150
152
|
|
|
151
153
|
This setting does not change the PI WEBUI config file selected by `PI_WEBUI_CONFIG` or Pi-owned state such as the active session files selected by `PI_CODING_AGENT_SESSION_DIR`.
|
|
152
154
|
|
|
@@ -237,11 +239,16 @@ In **Settings → Model tiers**, you edit one complete six-rung ladder: `economy
|
|
|
237
239
|
|
|
238
240
|
Sessions can also use a per-session model policy from the composer:
|
|
239
241
|
|
|
240
|
-
- **
|
|
241
|
-
- **
|
|
242
|
-
- **
|
|
242
|
+
- **Composer controls:** The composer action row has three cascading controls: a mode pill, a mode-dependent second control, and an Exact-only thinking menu. The mode pill opens a two-item mode menu: **Exact model** with the hint "Choose a model and thinking level", and **Tiered** with the hint "Use a configured model tier". A checkmark marks the current mode. There is no policy panel or Save button.
|
|
243
|
+
- **Exact fallback:** With no remembered starter preference, a new root starts in Exact mode using Pi's persisted model and thinking defaults. Selecting Exact remembers the mode while retaining the last selected tier for a later switch back.
|
|
244
|
+
- **Exact controls:** The second control is the searchable model picker, and the third is a thinking level menu whose trigger is a bar gauge showing the current level's rank, with the level name in its tooltip. The menu lists levels relevant to the selected model in canonical ascending order: `off`, `minimal`, `low`, `medium`, `high`, `xhigh`, and `max`. A level the model does not support stays visible but dimmed, says `unsupported by this model`, and cannot be selected. An Exact change applies once both a model and a supported thinking level are selected.
|
|
245
|
+
- **Remembered starter policy:** A valid starter mode and tier are remembered per workspace on the selected machine. Starter selections update this personal managed state immediately; changes inside an existing session do not change future-session defaults.
|
|
246
|
+
- **Tiered:** In Tiered mode, the second control is a tier menu listing all six ladder tiers. An unusable tier stays visible with its specific reason inline instead of being hidden, and selecting a valid tier applies immediately. No thinking control renders in Tiered mode; it is absent rather than disabled. Switching modes is non-destructive in both directions: the remembered tier and the remembered Exact model/thinking selection stay intact.
|
|
247
|
+
- **Validation and recovery:** A remembered Tiered choice whose current mapping is unavailable remains selected and blocks Start until the user chooses a valid tier, switches to a complete Exact branch, or repairs the ladder. PI WEBUI never substitutes another tier or Exact mode.
|
|
248
|
+
- **Persistence failures:** If PI WEBUI cannot read the preference, a complete Exact starter remains usable and the composer shows the preference error. If a write fails, the current session still starts with the selected in-memory policy but PI WEBUI warns that the choice was not remembered.
|
|
243
249
|
- **When changes are available:** You can change a policy only while its session is idle and writable. During active work and for archived sessions, the current policy and any block reason remain visible but the controls are disabled. Once the session is idle and writable, a blocked policy remains repairable through an explicit update.
|
|
244
|
-
- **Availability and compatibility:**
|
|
250
|
+
- **Availability and compatibility:** Per-session policy uses `sessions.modelPolicy`; persisted starter mode/tier additionally requires `sessions.modelPolicyDefaults` on both web and session daemon. Older peers keep the previous in-memory starter behavior.
|
|
251
|
+
- **Managed state and concurrency:** Preferences live in `$PI_WEBUI_DATA_DIR/starter-model-policy-preferences.json` on the selected machine. One daemon serializes complete read-modify-write operations; atomic file replacement prevents partial JSON. Concurrent tabs therefore use last-successful-write-wins semantics in daemon queue order, not browser click order or cross-process locking.
|
|
245
252
|
- **Starting and persistence:** The selected policy is carried into root-session creation from both the first-prompt and **New Session** paths, persists with that session, and remains selected after a failed creation so a retry uses the same choice.
|
|
246
253
|
- **Scope and installation:** This release does not add `/tier-*` commands, and editing the tier ladder later does not automatically remap an existing Tiered session. After installing this release, restart `pi-webui-sessiond.service` manually once; ordinary UI/API autoreload does not load session-daemon changes.
|
|
247
254
|
|
|
@@ -5,10 +5,9 @@ description: Use when executing a written implementation plan whose tasks declar
|
|
|
5
5
|
|
|
6
6
|
# Deterministic Subagent-Driven Development
|
|
7
7
|
|
|
8
|
-
**Related workflows:** `using-git-worktrees` before
|
|
9
|
-
`test-driven-development`, `requesting-code-review`, and
|
|
10
|
-
`finishing-a-development-branch`
|
|
11
|
-
prompts are self-contained; never assume a child loaded a parent skill.
|
|
8
|
+
**Related workflows:** use `using-git-worktrees` before allocation. Child prompts
|
|
9
|
+
invoke `test-driven-development`, `requesting-code-review`, and
|
|
10
|
+
`finishing-a-development-branch` at their boundaries and are self-contained.
|
|
12
11
|
|
|
13
12
|
## Capability and Validation Gates
|
|
14
13
|
|
|
@@ -19,23 +18,23 @@ forbidden.
|
|
|
19
18
|
**Read the governing reference before judging anything against it:**
|
|
20
19
|
`references/capability-contract.md` before gates 2–4, `references/plan-contract.md`
|
|
21
20
|
before gate 6, `references/state-machine.md` before reporting any state token. They
|
|
22
|
-
hold the exact field names, tokens, and thresholds
|
|
21
|
+
hold the exact field names, tokens, and thresholds.
|
|
23
22
|
|
|
24
23
|
1. **Plan and worktree.** Confirm both are specified and accessible without
|
|
25
24
|
mutating either.
|
|
26
25
|
|
|
27
26
|
2. **Policy contract.** Read `references/capability-contract.md`, then confirm
|
|
28
|
-
`get_model_policy` returns
|
|
29
|
-
|
|
30
|
-
capability. Reject unknown versions.
|
|
27
|
+
`get_model_policy` returns version 1 with active policy, current/next-request
|
|
28
|
+
tuples, ladder status, and tracked-dispatch capability. Reject other versions.
|
|
31
29
|
|
|
32
|
-
3. **Spawn capability.** Confirm
|
|
33
|
-
The runtime provides **no** dispatch key and **no** deduplication.
|
|
34
|
-
idempotency evidence
|
|
30
|
+
3. **Spawn capability.** Confirm the policy result's `trackedDispatch.tierField`
|
|
31
|
+
is `true`. The runtime provides **no** dispatch key and **no** deduplication.
|
|
32
|
+
Missing idempotency evidence is not a capability failure.
|
|
35
33
|
|
|
36
|
-
4. **Ladder completeness.**
|
|
37
|
-
|
|
38
|
-
|
|
34
|
+
4. **Ladder completeness.** All six mappings must resolve in **both** modes:
|
|
35
|
+
children dispatch by tier regardless of parent mode; reviewer/fixer tiers
|
|
36
|
+
derive by formula. Exact mode reports `currentTier` as `null` and keeps the
|
|
37
|
+
runtime tuple.
|
|
39
38
|
|
|
40
39
|
5. **Capability blocked.** If any check above fails: record `CAPABILITY_BLOCKED`,
|
|
41
40
|
name the cause and required capability, confirm zero dispatches. **Stop.**
|
|
@@ -166,7 +165,8 @@ own instructions. Then stop: a mismatch is never diagnosed by spawning another
|
|
|
166
165
|
child.
|
|
167
166
|
|
|
168
167
|
**Exact mode:** the parent's policy inspection is the gate, checked before dispatch.
|
|
169
|
-
|
|
168
|
+
The human-readable tier label does not change the child's model; the typed `tier`
|
|
169
|
+
field still binds it.
|
|
170
170
|
|
|
171
171
|
## Bounded Context, Review, and Completion
|
|
172
172
|
|
|
@@ -4,10 +4,10 @@
|
|
|
4
4
|
"distribution": "opt-in",
|
|
5
5
|
"sourcePackage": {
|
|
6
6
|
"name": "@hyperdreamer/pi-webui",
|
|
7
|
-
"version": "1.11.0-beta.
|
|
7
|
+
"version": "1.11.0-beta.6"
|
|
8
8
|
},
|
|
9
9
|
"runtimeHashAlgorithm": "sha256-path-nul-bytes-v1",
|
|
10
|
-
"runtimeHash": "
|
|
10
|
+
"runtimeHash": "7e9c66f015eda1705ceafb3e7d827dbd57c33a4fea15d0cc2b09c66efdfdedb8",
|
|
11
11
|
"runtimeFiles": [
|
|
12
12
|
"SKILL.md",
|
|
13
13
|
"prompts/final-reviewer.md",
|