feat: prompt template tech debt — tests, read-only endpoints, double-… (#67)

* feat: prompt template tech debt — tests, read-only endpoints, double-load fix, server creation modal

Close test coverage gaps for prompt templates:
- Resume with deleted template: verifies graceful degradation (template_content=None, warning logged)
- Threading safety: concurrent set_template/init_system_messages with no race conditions
- Factory passthrough: template kwarg propagation through WorkstreamManager.create()

Add read-only template listing endpoints (read scope, no content exposed):
- GET /v1/api/templates — prompt template summaries (name, category, is_default, origin)
- GET /v1/api/ws-templates — enabled workstream template summaries (name, description, model)
- Available on both server and console; Python + TypeScript SDK methods added
- Console creation modal switched from admin endpoint to read-scope endpoint

Eliminate double-load inefficiency in workstream creation:
- Template validation moved before mgr.create() (no create-then-rollback on invalid template)
- template kwarg plumbed through WorkstreamManager.create() and session factory
- _SessionFactory Protocol added for proper mypy typing

Add workstream creation modal to server web UI:
- Name, model, template dropdown, ws_template/profile dropdown
- Instrument panel aesthetic: gradient top border, blur backdrop, amber accent
- Focus trap, Escape/Enter keyboard handling, loading state, error display
- WCAG AA contrast compliance, reduced-motion support

* fix: add list_ws_templates SDK methods + regenerate OpenAPI snapshots

Add list_ws_templates() to Python SDK (async + sync) and listWsTemplates()
to TypeScript SDK for the new GET /v1/api/ws-templates server endpoint.
Add WsTemplateSummary + ListWsTemplateSummaryResponse TypeScript types.
Regenerate openapi-server.json and openapi-console.json snapshots.

Addresses Copilot review feedback on PR #67.

* fix: skip template pre-validation when resuming a workstream

When resume_ws is set, the request's template field is irrelevant —
resume() restores the template from workstream_config. Pre-validating
a stale template name would incorrectly return 400 before the resume
even runs.

Addresses Copilot review feedback on PR #67.
This commit is contained in:
Patrick Buckley
2026-03-15 02:09:31 -07:00
committed by GitHub
parent e2a199c9c3
commit 376da3d084
24 changed files with 961 additions and 39 deletions
+70 -1
View File
@@ -2,7 +2,7 @@
"openapi": "3.1.0",
"info": {
"title": "turnstone Console API",
"version": "0.6.1",
"version": "0.6.2",
"description": "Cluster-wide visibility and control across all turnstone nodes."
},
"paths": {
@@ -2052,6 +2052,27 @@
}
}
},
"/v1/api/templates": {
"get": {
"summary": "List available prompt templates (summary)",
"operationId": "v1_api_templates_get",
"tags": [
"Templates"
],
"responses": {
"200": {
"description": "Success",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ListPromptTemplateSummaryResponse"
}
}
}
}
}
}
},
"/v1/api/admin/usage": {
"get": {
"summary": "Aggregated usage data",
@@ -5947,6 +5968,54 @@
},
"title": "McpReloadResponse",
"type": "object"
},
"PromptTemplateSummary": {
"properties": {
"name": {
"description": "Template name",
"title": "Name",
"type": "string"
},
"category": {
"default": "",
"description": "Template category",
"title": "Category",
"type": "string"
},
"is_default": {
"default": false,
"description": "Whether this template is applied by default",
"title": "Is Default",
"type": "boolean"
},
"origin": {
"default": "manual",
"description": "Template origin: manual or mcp",
"title": "Origin",
"type": "string"
}
},
"required": [
"name"
],
"title": "PromptTemplateSummary",
"type": "object"
},
"ListPromptTemplateSummaryResponse": {
"properties": {
"templates": {
"items": {
"$ref": "#/components/schemas/PromptTemplateSummary"
},
"title": "Templates",
"type": "array"
}
},
"required": [
"templates"
],
"title": "ListPromptTemplateSummaryResponse",
"type": "object"
}
}
}