fix(web): correct the preset-layer contracts review found stale
None of these change behavior; each said something that was not true. `SessionCwdConflict`'s doc block had been left stranded above the `AgentPresetConflict` inserted under it, so one class carried a comment about the other and the second carried none. The roster comment named a `.system` directory that does not exist; the shipped root is `config/agent-presets/`, and `system` is the trust its entries carry. The real-composition test attributed the disabled `api-gateway` row to "side effects outside this process" alongside the port and the exporter. It is disabled for a different reason — the api-proxy cannot mount in this layer at all — and hiding that behind the same phrase would leave a later layer unable to tell whether the line can come out. One test claimed to refuse an adoption while asserting only that the header records the preset; it now says what it checks. `PERSONA_SECTION`/`PERSONA_ORDER` existed twice, once in the registry that declares the slot and once restated in the row that replaces it — a drift that would land a preset's persona beside the deployment's instead of shadowing it. The registry exports them now. The preset conflict message read "already runs agent preset undefined" for a session that records none, which is the shape a deployment with no roster produces; it names that case instead, with the regression that reaches it through the gateway. Finally, `PresetTree.write()` drops the `loader/config-update` the inherited method emits — recorded on the override, since a future edit-while-running flow needs its own persistence path.
This commit is contained in:
@@ -110,6 +110,17 @@ export interface PromptAssembly {
|
||||
variables: Record<string, string | undefined>
|
||||
}
|
||||
|
||||
/**
|
||||
* The deployment persona's section name and order. Exported because a
|
||||
* composition can replace this slot — an agent preset shadows the
|
||||
* deployment's persona with its own — and both sides naming the same section
|
||||
* is what makes the replacement work rather than duplicate.
|
||||
*/
|
||||
export const PERSONA_SECTION = 'deployment:persona'
|
||||
|
||||
/** Prompt order of the persona slot; the first section a model reads. */
|
||||
export const PERSONA_ORDER = 0
|
||||
|
||||
/** Valid variable names: how they are written between the braces. */
|
||||
const VARIABLE_NAME = /^[a-z][a-z0-9_]*$/
|
||||
|
||||
@@ -337,8 +348,8 @@ export class SystemPrompt extends Service {
|
||||
})
|
||||
}
|
||||
this.section({
|
||||
name: 'deployment:persona',
|
||||
order: 0,
|
||||
name: PERSONA_SECTION,
|
||||
order: PERSONA_ORDER,
|
||||
// The fallback narrows the optional input type; the schema already defaults it.
|
||||
text: config.persona ?? '',
|
||||
})
|
||||
|
||||
Reference in New Issue
Block a user