Add file-backed personality support and listing

This commit is contained in:
Eric Traut
2026-03-31 17:06:45 -06:00
parent ae057e0bb9
commit 8e00fec700
61 changed files with 1741 additions and 366 deletions
@@ -1304,13 +1304,19 @@
],
"type": "string"
},
"Personality": {
"enum": [
"none",
"friendly",
"pragmatic"
],
"type": "string"
"PersonalitiesListParams": {
"properties": {
"cwds": {
"items": {
"$ref": "#/definitions/AbsolutePathBuf"
},
"type": [
"array",
"null"
]
}
},
"type": "object"
},
"PluginInstallParams": {
"properties": {
@@ -2878,13 +2884,9 @@
]
},
"personality": {
"anyOf": [
{
"$ref": "#/definitions/Personality"
},
{
"type": "null"
}
"type": [
"string",
"null"
]
},
"sandbox": {
@@ -3061,13 +3063,9 @@
]
},
"personality": {
"anyOf": [
{
"$ref": "#/definitions/Personality"
},
{
"type": "null"
}
"type": [
"string",
"null"
]
},
"sandbox": {
@@ -3202,15 +3200,11 @@
"description": "Optional JSON Schema used to constrain the final assistant message for this turn."
},
"personality": {
"anyOf": [
{
"$ref": "#/definitions/Personality"
},
{
"type": "null"
}
],
"description": "Override the personality for this turn and subsequent turns."
"description": "Override the personality for this turn and subsequent turns.",
"type": [
"string",
"null"
]
},
"sandboxPolicy": {
"anyOf": [
@@ -3821,6 +3815,30 @@
"title": "Skills/listRequest",
"type": "object"
},
{
"properties": {
"id": {
"$ref": "#/definitions/RequestId"
},
"method": {
"enum": [
"personalities/list"
],
"title": "Personalities/listRequestMethod",
"type": "string"
},
"params": {
"$ref": "#/definitions/PersonalitiesListParams"
}
},
"required": [
"id",
"method",
"params"
],
"title": "Personalities/listRequest",
"type": "object"
},
{
"properties": {
"id": {
@@ -602,6 +602,30 @@
"title": "Skills/listRequest",
"type": "object"
},
{
"properties": {
"id": {
"$ref": "#/definitions/v2/RequestId"
},
"method": {
"enum": [
"personalities/list"
],
"title": "Personalities/listRequestMethod",
"type": "string"
},
"params": {
"$ref": "#/definitions/v2/PersonalitiesListParams"
}
},
"required": [
"id",
"method",
"params"
],
"title": "Personalities/listRequest",
"type": "object"
},
{
"properties": {
"id": {
@@ -9462,11 +9486,84 @@
}
]
},
"Personality": {
"PersonalitiesListEntry": {
"properties": {
"cwd": {
"type": "string"
},
"personalities": {
"items": {
"$ref": "#/definitions/v2/PersonalityMetadata"
},
"type": "array"
}
},
"required": [
"cwd",
"personalities"
],
"type": "object"
},
"PersonalitiesListParams": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"cwds": {
"items": {
"$ref": "#/definitions/v2/AbsolutePathBuf"
},
"type": [
"array",
"null"
]
}
},
"title": "PersonalitiesListParams",
"type": "object"
},
"PersonalitiesListResponse": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"data": {
"items": {
"$ref": "#/definitions/v2/PersonalitiesListEntry"
},
"type": "array"
}
},
"required": [
"data"
],
"title": "PersonalitiesListResponse",
"type": "object"
},
"PersonalityMetadata": {
"properties": {
"description": {
"type": "string"
},
"isBuiltIn": {
"type": "boolean"
},
"name": {
"type": "string"
},
"scope": {
"$ref": "#/definitions/v2/PersonalityScope"
}
},
"required": [
"description",
"isBuiltIn",
"name",
"scope"
],
"type": "object"
},
"PersonalityScope": {
"enum": [
"none",
"friendly",
"pragmatic"
"builtin",
"user",
"repo"
],
"type": "string"
},
@@ -13438,13 +13535,9 @@
]
},
"personality": {
"anyOf": [
{
"$ref": "#/definitions/v2/Personality"
},
{
"type": "null"
}
"type": [
"string",
"null"
]
},
"sandbox": {
@@ -13719,13 +13812,9 @@
]
},
"personality": {
"anyOf": [
{
"$ref": "#/definitions/v2/Personality"
},
{
"type": "null"
}
"type": [
"string",
"null"
]
},
"sandbox": {
@@ -14373,15 +14462,11 @@
"description": "Optional JSON Schema used to constrain the final assistant message for this turn."
},
"personality": {
"anyOf": [
{
"$ref": "#/definitions/v2/Personality"
},
{
"type": "null"
}
],
"description": "Override the personality for this turn and subsequent turns."
"description": "Override the personality for this turn and subsequent turns.",
"type": [
"string",
"null"
]
},
"sandboxPolicy": {
"anyOf": [
@@ -1177,6 +1177,30 @@
"title": "Skills/listRequest",
"type": "object"
},
{
"properties": {
"id": {
"$ref": "#/definitions/RequestId"
},
"method": {
"enum": [
"personalities/list"
],
"title": "Personalities/listRequestMethod",
"type": "string"
},
"params": {
"$ref": "#/definitions/PersonalitiesListParams"
}
},
"required": [
"id",
"method",
"params"
],
"title": "Personalities/listRequest",
"type": "object"
},
{
"properties": {
"id": {
@@ -6276,11 +6300,84 @@
}
]
},
"Personality": {
"PersonalitiesListEntry": {
"properties": {
"cwd": {
"type": "string"
},
"personalities": {
"items": {
"$ref": "#/definitions/PersonalityMetadata"
},
"type": "array"
}
},
"required": [
"cwd",
"personalities"
],
"type": "object"
},
"PersonalitiesListParams": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"cwds": {
"items": {
"$ref": "#/definitions/AbsolutePathBuf"
},
"type": [
"array",
"null"
]
}
},
"title": "PersonalitiesListParams",
"type": "object"
},
"PersonalitiesListResponse": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"data": {
"items": {
"$ref": "#/definitions/PersonalitiesListEntry"
},
"type": "array"
}
},
"required": [
"data"
],
"title": "PersonalitiesListResponse",
"type": "object"
},
"PersonalityMetadata": {
"properties": {
"description": {
"type": "string"
},
"isBuiltIn": {
"type": "boolean"
},
"name": {
"type": "string"
},
"scope": {
"$ref": "#/definitions/PersonalityScope"
}
},
"required": [
"description",
"isBuiltIn",
"name",
"scope"
],
"type": "object"
},
"PersonalityScope": {
"enum": [
"none",
"friendly",
"pragmatic"
"builtin",
"user",
"repo"
],
"type": "string"
},
@@ -11284,13 +11381,9 @@
]
},
"personality": {
"anyOf": [
{
"$ref": "#/definitions/Personality"
},
{
"type": "null"
}
"type": [
"string",
"null"
]
},
"sandbox": {
@@ -11565,13 +11658,9 @@
]
},
"personality": {
"anyOf": [
{
"$ref": "#/definitions/Personality"
},
{
"type": "null"
}
"type": [
"string",
"null"
]
},
"sandbox": {
@@ -12219,15 +12308,11 @@
"description": "Optional JSON Schema used to constrain the final assistant message for this turn."
},
"personality": {
"anyOf": [
{
"$ref": "#/definitions/Personality"
},
{
"type": "null"
}
],
"description": "Override the personality for this turn and subsequent turns."
"description": "Override the personality for this turn and subsequent turns.",
"type": [
"string",
"null"
]
},
"sandboxPolicy": {
"anyOf": [
@@ -0,0 +1,22 @@
{
"$schema": "http://json-schema.org/draft-07/schema#",
"definitions": {
"AbsolutePathBuf": {
"description": "A path that is guaranteed to be absolute and normalized (though it is not guaranteed to be canonicalized or exist on the filesystem).\n\nIMPORTANT: When deserializing an `AbsolutePathBuf`, a base path must be set using [AbsolutePathBufGuard::new]. If no base path is set, the deserialization will fail unless the path being deserialized is already absolute.",
"type": "string"
}
},
"properties": {
"cwds": {
"items": {
"$ref": "#/definitions/AbsolutePathBuf"
},
"type": [
"array",
"null"
]
}
},
"title": "PersonalitiesListParams",
"type": "object"
}
@@ -0,0 +1,67 @@
{
"$schema": "http://json-schema.org/draft-07/schema#",
"definitions": {
"PersonalitiesListEntry": {
"properties": {
"cwd": {
"type": "string"
},
"personalities": {
"items": {
"$ref": "#/definitions/PersonalityMetadata"
},
"type": "array"
}
},
"required": [
"cwd",
"personalities"
],
"type": "object"
},
"PersonalityMetadata": {
"properties": {
"description": {
"type": "string"
},
"isBuiltIn": {
"type": "boolean"
},
"name": {
"type": "string"
},
"scope": {
"$ref": "#/definitions/PersonalityScope"
}
},
"required": [
"description",
"isBuiltIn",
"name",
"scope"
],
"type": "object"
},
"PersonalityScope": {
"enum": [
"builtin",
"user",
"repo"
],
"type": "string"
}
},
"properties": {
"data": {
"items": {
"$ref": "#/definitions/PersonalitiesListEntry"
},
"type": "array"
}
},
"required": [
"data"
],
"title": "PersonalitiesListResponse",
"type": "object"
}
@@ -315,14 +315,6 @@
}
]
},
"Personality": {
"enum": [
"none",
"friendly",
"pragmatic"
],
"type": "string"
},
"ReasoningItemContent": {
"oneOf": [
{
@@ -1043,13 +1035,9 @@
]
},
"personality": {
"anyOf": [
{
"$ref": "#/definitions/Personality"
},
{
"type": "null"
}
"type": [
"string",
"null"
]
},
"sandbox": {
@@ -79,14 +79,6 @@
],
"type": "object"
},
"Personality": {
"enum": [
"none",
"friendly",
"pragmatic"
],
"type": "string"
},
"SandboxMode": {
"enum": [
"read-only",
@@ -169,13 +161,9 @@
]
},
"personality": {
"anyOf": [
{
"$ref": "#/definitions/Personality"
},
{
"type": "null"
}
"type": [
"string",
"null"
]
},
"sandbox": {
@@ -113,14 +113,6 @@
],
"type": "string"
},
"Personality": {
"enum": [
"none",
"friendly",
"pragmatic"
],
"type": "string"
},
"ReadOnlyAccess": {
"oneOf": [
{
@@ -556,15 +548,11 @@
"description": "Optional JSON Schema used to constrain the final assistant message for this turn."
},
"personality": {
"anyOf": [
{
"$ref": "#/definitions/Personality"
},
{
"type": "null"
}
],
"description": "Override the personality for this turn and subsequent turns."
"description": "Override the personality for this turn and subsequent turns.",
"type": [
"string",
"null"
]
},
"sandboxPolicy": {
"anyOf": [
File diff suppressed because one or more lines are too long
@@ -2,4 +2,4 @@
// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually.
export type Personality = "none" | "friendly" | "pragmatic";
export type Personality = string;
@@ -0,0 +1,6 @@
// GENERATED CODE! DO NOT MODIFY BY HAND!
// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually.
import type { PersonalityMetadata } from "./PersonalityMetadata";
export type PersonalitiesListEntry = { cwd: string, personalities: Array<PersonalityMetadata>, };
@@ -0,0 +1,6 @@
// GENERATED CODE! DO NOT MODIFY BY HAND!
// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually.
import type { AbsolutePathBuf } from "../AbsolutePathBuf";
export type PersonalitiesListParams = { cwds?: Array<AbsolutePathBuf> | null, };
@@ -0,0 +1,6 @@
// GENERATED CODE! DO NOT MODIFY BY HAND!
// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually.
import type { PersonalitiesListEntry } from "./PersonalitiesListEntry";
export type PersonalitiesListResponse = { data: Array<PersonalitiesListEntry>, };
@@ -0,0 +1,6 @@
// GENERATED CODE! DO NOT MODIFY BY HAND!
// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually.
import type { PersonalityScope } from "./PersonalityScope";
export type PersonalityMetadata = { name: string, description: string, scope: PersonalityScope, isBuiltIn: boolean, };
@@ -0,0 +1,5 @@
// GENERATED CODE! DO NOT MODIFY BY HAND!
// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually.
export type PersonalityScope = "builtin" | "user" | "repo";
@@ -209,6 +209,11 @@ export type { PatchChangeKind } from "./PatchChangeKind";
export type { PermissionGrantScope } from "./PermissionGrantScope";
export type { PermissionsRequestApprovalParams } from "./PermissionsRequestApprovalParams";
export type { PermissionsRequestApprovalResponse } from "./PermissionsRequestApprovalResponse";
export type { PersonalitiesListEntry } from "./PersonalitiesListEntry";
export type { PersonalitiesListParams } from "./PersonalitiesListParams";
export type { PersonalitiesListResponse } from "./PersonalitiesListResponse";
export type { PersonalityMetadata } from "./PersonalityMetadata";
export type { PersonalityScope } from "./PersonalityScope";
export type { PlanDeltaNotification } from "./PlanDeltaNotification";
export type { PluginAuthPolicy } from "./PluginAuthPolicy";
export type { PluginDetail } from "./PluginDetail";
@@ -321,6 +321,10 @@ client_request_definitions! {
params: v2::SkillsListParams,
response: v2::SkillsListResponse,
},
PersonalitiesList => "personalities/list" {
params: v2::PersonalitiesListParams,
response: v2::PersonalitiesListResponse,
},
PluginList => "plugin/list" {
params: v2::PluginListParams,
response: v2::PluginListResponse,
@@ -3182,6 +3182,21 @@ pub struct SkillsListResponse {
pub data: Vec<SkillsListEntry>,
}
#[derive(Serialize, Deserialize, Debug, Clone, PartialEq, JsonSchema, TS)]
#[serde(rename_all = "camelCase")]
#[ts(export_to = "v2/")]
pub struct PersonalitiesListParams {
#[ts(optional = nullable)]
pub cwds: Option<Vec<AbsolutePathBuf>>,
}
#[derive(Serialize, Deserialize, Debug, Clone, PartialEq, JsonSchema, TS)]
#[serde(rename_all = "camelCase")]
#[ts(export_to = "v2/")]
pub struct PersonalitiesListResponse {
pub data: Vec<PersonalitiesListEntry>,
}
#[derive(Serialize, Deserialize, Debug, Clone, PartialEq, JsonSchema, TS)]
#[serde(rename_all = "camelCase")]
#[ts(export_to = "v2/")]
@@ -3327,6 +3342,34 @@ pub struct SkillsListEntry {
pub errors: Vec<SkillErrorInfo>,
}
#[derive(Serialize, Deserialize, Debug, Clone, Copy, PartialEq, Eq, JsonSchema, TS)]
#[serde(rename_all = "snake_case")]
#[ts(rename_all = "snake_case")]
#[ts(export_to = "v2/")]
pub enum PersonalityScope {
Builtin,
User,
Repo,
}
#[derive(Serialize, Deserialize, Debug, Clone, PartialEq, JsonSchema, TS)]
#[serde(rename_all = "camelCase")]
#[ts(export_to = "v2/")]
pub struct PersonalityMetadata {
pub name: String,
pub description: String,
pub scope: PersonalityScope,
pub is_built_in: bool,
}
#[derive(Serialize, Deserialize, Debug, Clone, PartialEq, JsonSchema, TS)]
#[serde(rename_all = "camelCase")]
#[ts(export_to = "v2/")]
pub struct PersonalitiesListEntry {
pub cwd: PathBuf,
pub personalities: Vec<PersonalityMetadata>,
}
#[derive(Serialize, Deserialize, Debug, Clone, PartialEq, JsonSchema, TS)]
#[serde(rename_all = "camelCase")]
#[ts(export_to = "v2/")]