@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.
Files changed (35) hide show
  1. package/README.md +1 -1
  2. package/dist/client/assets/{CodeViewer-BJQFgK3S.js → CodeViewer-DnVESWeo.js} +1 -1
  3. package/dist/client/assets/{UnifiedDiffViewer-DfJJrNLr.js → UnifiedDiffViewer-DtcErd2T.js} +1 -1
  4. package/dist/client/assets/{index-CsVTzPPD.js → index-BnqpOnKq.js} +584 -516
  5. package/dist/client/index.html +1 -1
  6. package/dist/server/sessiond.js +6 -1
  7. package/dist/server/sessiond.js.map +1 -1
  8. package/dist/server/sessions/modelPolicyCapability.js +88 -0
  9. package/dist/server/sessions/modelPolicyCapability.js.map +1 -0
  10. package/dist/server/sessions/modelPolicyTool.js +31 -0
  11. package/dist/server/sessions/modelPolicyTool.js.map +1 -0
  12. package/dist/server/sessions/piSessionService.js +877 -290
  13. package/dist/server/sessions/piSessionService.js.map +1 -1
  14. package/dist/server/sessions/sessionDefaultsRoutes.js +39 -0
  15. package/dist/server/sessions/sessionDefaultsRoutes.js.map +1 -1
  16. package/dist/server/sessions/sessionDefaultsService.js +36 -6
  17. package/dist/server/sessions/sessionDefaultsService.js.map +1 -1
  18. package/dist/server/sessions/starterModelPolicyPreferenceStore.js +164 -0
  19. package/dist/server/sessions/starterModelPolicyPreferenceStore.js.map +1 -0
  20. package/dist/shared/apiTypes.d.ts +23 -3
  21. package/dist/shared/apiTypes.js +1 -0
  22. package/dist/shared/apiTypes.js.map +1 -1
  23. package/dist/shared/capabilities.js +3 -0
  24. package/dist/shared/capabilities.js.map +1 -1
  25. package/docs/config.md +12 -5
  26. package/optional-skills/deterministic-subagent-driven-development/SKILL.md +15 -15
  27. package/optional-skills/deterministic-subagent-driven-development/pi-webui-skill.json +2 -2
  28. package/optional-skills/deterministic-subagent-driven-development/references/capability-contract.md +16 -16
  29. package/optional-skills/deterministic-subagent-driven-development/references/plan-contract.md +4 -4
  30. package/optional-skills/deterministic-subagent-driven-development/references/state-machine.md +3 -3
  31. package/optional-skills/deterministic-subagent-driven-development/scripts/lib/plan-policy.mjs +18 -9
  32. package/optional-skills/deterministic-subagent-driven-development/scripts/lib/prompt-renderer.mjs +3 -3
  33. package/optional-skills/deterministic-subagent-driven-development/scripts/lib/state-machine.mjs +6 -5
  34. package/optional-skills/deterministic-subagent-driven-development/scripts/sdd-state.mjs +1 -0
  35. 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":"AAEA,OAAO,EAAE,oBAAoB,EAAE,MAAM,gCAAgC,CAAC;AACtE,OAAO,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAQ7D,MAAM,UAAU,6BAA6B,CAAC,GAAoB,EAAE,OAAoC,EAAE,MAAM,GAAG,EAAE;IACnH,GAAG,CAAC,GAAG,CAAoC,GAAG,MAAM,mBAAmB,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE;QAChG,IAAI,CAAC;YACH,OAAO,MAAM,OAAO,CAAC,IAAI,CAAC,mBAAmB,CAAC,aAAa,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC;QAC1F,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,YAAY,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QAC9D,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,GAAG,CAAC,GAAG,CAAoB,GAAG,MAAM,mBAAmB,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE;QAChF,IAAI,CAAC;YACH,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,WAAW,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;YAClD,OAAO,MAAM,OAAO,CAAC,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;QAC3C,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,YAAY,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QAC9D,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC;AAED,SAAS,WAAW,CAAC,KAAc;IACjC,MAAM,IAAI,GAAG,aAAa,CAAC,KAAK,CAAC,CAAC;IAClC,MAAM,GAAG,GAAG,mBAAmB,CAAC,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC;IACnE,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC;IAClF,MAAM,aAAa,GAAG,IAAI,CAAC,eAAe,CAAC,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,oBAAoB,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC,CAAC;IACpH,IAAI,KAAK,KAAK,SAAS,IAAI,aAAa,KAAK,SAAS;QAAE,MAAM,IAAI,KAAK,CAAC,+CAA+C,CAAC,CAAC;IACzH,OAAO;QACL,GAAG;QACH,MAAM,EAAE;YACN,GAAG,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC;YACzC,GAAG,CAAC,aAAa,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,aAAa,EAAE,CAAC;SAC1D;KACF,CAAC;AACJ,CAAC;AAED,SAAS,UAAU,CAAC,KAAc;IAChC,MAAM,KAAK,GAAG,aAAa,CAAC,KAAK,CAAC,CAAC;IACnC,OAAO;QACL,QAAQ,EAAE,aAAa,CAAC,KAAK,CAAC,UAAU,CAAC,EAAE,UAAU,CAAC;QACtD,OAAO,EAAE,aAAa,CAAC,KAAK,CAAC,SAAS,CAAC,EAAE,SAAS,CAAC;KACpD,CAAC;AACJ,CAAC;AAED,SAAS,oBAAoB,CAAC,KAAc;IAC1C,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,oBAAoB,CAAC,KAAK,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,uBAAuB,CAAC,CAAC;IACxG,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,aAAa,CAAC,KAAc;IACnC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,sBAAsB,CAAC,CAAC;IAC9D,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,QAAQ,CAAC,KAAc;IAC9B,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;AAC9E,CAAC;AAED,SAAS,aAAa,CAAC,KAAc,EAAE,IAAY;IACjD,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,EAAE;QAAE,MAAM,IAAI,KAAK,CAAC,GAAG,IAAI,cAAc,CAAC,CAAC;IACtF,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,YAAY,CAAC,KAAc;IAClC,OAAO,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AAChE,CAAC"}
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 this.availableModels();
14
- return this.response(settings, models);
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
- return responseFor(models, model, thinkingLevel, thinkingLevels);
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
- response(settings, models) {
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;AAyBjH,2FAA2F;AAC3F,MAAM,OAAO,sBAAsB;IAIjC,YAA6B,IAAwC;QAAxC,SAAI,GAAJ,IAAI,CAAoC;QACnE,IAAI,CAAC,qBAAqB,GAAG,IAAI,CAAC,qBAAqB,IAAI,CAAC,CAAC,GAAG,EAAE,QAAQ,EAAE,EAAE,CAAC,eAAe,CAAC,MAAM,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC,CAAC;QACtH,IAAI,CAAC,sBAAsB,GAAG,IAAI,CAAC,sBAAsB,IAAI,6BAA6B,CAAC;IAC7F,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,GAAW;QACpB,MAAM,QAAQ,GAAG,IAAI,CAAC,qBAAqB,CAAC,GAAG,EAAE,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACrE,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,eAAe,EAAE,CAAC;QAC5C,OAAO,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IACzC,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,GAAW,EAAE,MAA6B;QACrD,MAAM,QAAQ,GAAG,IAAI,CAAC,qBAAqB,CAAC,GAAG,EAAE,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACrE,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,eAAe,EAAE,CAAC;QAC5C,IAAI,KAAK,GAAG,sBAAsB,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;QACrD,IAAI,OAAO,GAAG,KAAK,CAAC;QAEpB,MAAM,cAAc,GAAG,MAAM,CAAC,KAAK,CAAC;QACpC,IAAI,cAAc,KAAK,SAAS,EAAE,CAAC;YACjC,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,QAAQ,KAAK,cAAc,CAAC,QAAQ,IAAI,SAAS,CAAC,EAAE,KAAK,cAAc,CAAC,OAAO,CAAC,CAAC;YAC9H,IAAI,KAAK,KAAK,SAAS;gBAAE,MAAM,IAAI,KAAK,CAAC,wBAAwB,cAAc,CAAC,QAAQ,IAAI,cAAc,CAAC,OAAO,EAAE,CAAC,CAAC;YACtH,IAAI,QAAQ,CAAC,kBAAkB,EAAE,KAAK,KAAK,CAAC,QAAQ,IAAI,QAAQ,CAAC,eAAe,EAAE,KAAK,KAAK,CAAC,EAAE,EAAE,CAAC;gBAChG,QAAQ,CAAC,0BAA0B,CAAC,KAAK,CAAC,QAAQ,EAAE,KAAK,CAAC,EAAE,CAAC,CAAC;gBAC9D,OAAO,GAAG,IAAI,CAAC;YACjB,CAAC;QACH,CAAC;QAED,MAAM,cAAc,GAAG,IAAI,CAAC,sBAAsB,CAAC,KAAK,CAAC,CAAC;QAC1D,MAAM,uBAAuB,GAAG,QAAQ,CAAC,uBAAuB,EAAE,IAAI,KAAK,CAAC;QAC5E,IAAI,aAAa,GAAG,sBAAsB,CAAC,uBAAuB,EAAE,cAAc,CAAC,CAAC;QACpF,IAAI,MAAM,CAAC,aAAa,KAAK,SAAS,EAAE,CAAC;YACvC,IAAI,CAAC,oBAAoB,CAAC,MAAM,CAAC,aAAa,CAAC;gBAAE,MAAM,IAAI,KAAK,CAAC,2BAA2B,MAAM,CAAC,aAAa,EAAE,CAAC,CAAC;YACpH,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,MAAM,CAAC,aAAa,CAAC;gBAAE,MAAM,IAAI,KAAK,CAAC,kBAAkB,MAAM,CAAC,aAAa,wCAAwC,CAAC,CAAC;YACpJ,aAAa,GAAG,MAAM,CAAC,aAAa,CAAC;QACvC,CAAC;QACD,IAAI,aAAa,KAAK,uBAAuB,EAAE,CAAC;YAC9C,QAAQ,CAAC,uBAAuB,CAAC,aAAa,CAAC,CAAC;YAChD,OAAO,GAAG,IAAI,CAAC;QACjB,CAAC;QAED,IAAI,OAAO;YAAE,MAAM,QAAQ,CAAC,KAAK,EAAE,CAAC;QACpC,OAAO,WAAW,CAAC,MAAM,EAAE,KAAK,EAAE,aAAa,EAAE,cAAc,CAAC,CAAC;IACnE,CAAC;IAEO,KAAK,CAAC,eAAe;QAC3B,MAAM,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,EAAE,YAAY,EAAE,KAAK,EAAE,CAAC,CAAC;QAC9D,OAAO,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,oBAAoB,EAAE,CAAC,CAAC;IAC5D,CAAC;IAEO,QAAQ,CAAC,QAAiC,EAAE,MAA+B;QACjF,MAAM,KAAK,GAAG,sBAAsB,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;QACvD,MAAM,cAAc,GAAG,IAAI,CAAC,sBAAsB,CAAC,KAAK,CAAC,CAAC;QAC1D,MAAM,aAAa,GAAG,sBAAsB,CAAC,QAAQ,CAAC,uBAAuB,EAAE,IAAI,KAAK,EAAE,cAAc,CAAC,CAAC;QAC1G,OAAO,WAAW,CAAC,MAAM,EAAE,KAAK,EAAE,aAAa,EAAE,cAAc,CAAC,CAAC;IACnE,CAAC;CACF;AAED,SAAS,6BAA6B,CAAC,KAA+B;IACpE,OAAO,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,0BAA0B,CAAC,KAAK,CAAC,CAAC;AACzF,CAAC;AAED,SAAS,sBAAsB,CAAC,QAAiC,EAAE,MAA+B;IAChG,MAAM,QAAQ,GAAG,QAAQ,CAAC,kBAAkB,EAAE,CAAC;IAC/C,MAAM,OAAO,GAAG,QAAQ,CAAC,eAAe,EAAE,CAAC;IAC3C,IAAI,QAAQ,KAAK,SAAS,IAAI,OAAO,KAAK,SAAS;QAAE,OAAO,SAAS,CAAC;IACtE,OAAO,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,QAAQ,KAAK,QAAQ,IAAI,KAAK,CAAC,EAAE,KAAK,OAAO,CAAC,CAAC;AACrF,CAAC;AAED,SAAS,sBAAsB,CAAC,UAAyB,EAAE,MAAgC;IACzF,OAAO,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC;AACzE,CAAC;AAED,SAAS,WAAW,CAClB,MAA+B,EAC/B,KAA+B,EAC/B,aAA4B,EAC5B,cAAwC;IAExC,OAAO;QACL,GAAG,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,kBAAkB,CAAC,KAAK,CAAC,EAAE,CAAC;QACpE,aAAa;QACb,MAAM,EAAE,MAAM,CAAC,GAAG,CAAC,kBAAkB,CAAC;QACtC,cAAc,EAAE,CAAC,GAAG,cAAc,CAAC;KACpC,CAAC;AACJ,CAAC;AAED,SAAS,kBAAkB,CAAC,KAAmB;IAC7C,OAAO;QACL,QAAQ,EAAE,KAAK,CAAC,QAAQ;QACxB,EAAE,EAAE,KAAK,CAAC,EAAE;QACZ,IAAI,EAAE,KAAK,CAAC,IAAI;QAChB,aAAa,EAAE,KAAK,CAAC,aAAa;QAClC,SAAS,EAAE,KAAK,CAAC,SAAS;KAC3B,CAAC;AACJ,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 interface SessionDefaultsUpdate {
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;
@@ -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;CACnC,CAAC;AAsDX,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,UAAU,EAAE,SAAS,EAAE,UAAU,CAAU,CAAC;AAwWvG,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;AAouB3D,MAAM,CAAC,MAAM,2CAA2C,GAAG,MAAM,CAAC"}
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":"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"}
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
- - **Exact (default):** New root sessions start in Exact mode. It pins the selected provider, model, and thinking level, and keeps the existing provider/model/thinking controls.
241
- - **Tiered:** Use the first composer control, **Mode**, to select Tiered, then choose one of the six ladder tiers. The Tier selector is disabled while Mode is Exact. Tiered remembers both the selected tier and the Exact model/thinking selection, so switching modes does not discard either choice. It shows the resolved model and thinking level instead of editable Exact controls. Saving the policy or creating a root session applies the selected tier's model and thinking-level tuple atomically.
242
- - **Validation and recovery:** Tiered requires a complete, valid six-tier ladder on the selected machine. If a configured model becomes unavailable, authentication no longer permits it, or its thinking level is unsupported, PI WEBUI shows the reason and never silently substitutes a model, tier, or thinking level. If a saved policy cannot be restored, prompts remain blocked until you save an explicit repair; PI WEBUI does not silently reuse an older choice.
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:** Model-policy controls require the `sessions.modelPolicy` capability on both the web process and the session daemon for the selected machine. When that capability is unavailable, PI WEBUI keeps the existing model and thinking controls and hides the additive policy control.
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 allocating a worktree;
9
- `test-driven-development`, `requesting-code-review`, and
10
- `finishing-a-development-branch` as child prompts at their boundaries. Child
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; this file only points at them.
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 a version-1 result matching it: active policy, current runtime
29
- tuple, next-request tuple, ladder status, tier commands, and tracked-dispatch
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 `spawn_subsession` advertises `tierField: true`.
33
- The runtime provides **no** dispatch key and **no** deduplication. Never expect
34
- idempotency evidence; its absence is not a capability failure.
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.** Tiered mode: all six ladder mappings valid and
37
- resolvable. Exact mode: retain the runtime tuple; tier directives are visibly
38
- ignored.
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
- Tier directives will be visibly ignored in the child; that is expected behavior.
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.4"
7
+ "version": "1.11.0-beta.6"
8
8
  },
9
9
  "runtimeHashAlgorithm": "sha256-path-nul-bytes-v1",
10
- "runtimeHash": "784da54c3cca6d68c338563a6eae8f655d2660ef7b91ada622e028b71222fe86",
10
+ "runtimeHash": "7e9c66f015eda1705ceafb3e7d827dbd57c33a4fea15d0cc2b09c66efdfdedb8",
11
11
  "runtimeFiles": [
12
12
  "SKILL.md",
13
13
  "prompts/final-reviewer.md",