diff --git a/package-lock.json b/package-lock.json index d521dd2..ed06bd2 100644 --- a/package-lock.json +++ b/package-lock.json @@ -13,6 +13,7 @@ "packages/vfs", "packages/harness", "packages/memory", + "packages/persona", "packages/inbox", "packages/continuation", "packages/turn-context", @@ -78,6 +79,10 @@ "resolved": "packages/memory", "link": true }, + "node_modules/@agent-assistant/persona": { + "resolved": "packages/persona", + "link": true + }, "node_modules/@agent-assistant/policy": { "resolved": "packages/policy", "link": true @@ -3663,7 +3668,7 @@ }, "packages/cloudflare-runtime": { "name": "@agent-assistant/cloudflare-runtime", - "version": "0.4.31", + "version": "0.4.33", "dependencies": { "@agent-assistant/continuation": "^0.3.4", "@agent-assistant/surfaces": "^0.3.0", @@ -3746,7 +3751,7 @@ }, "packages/connectivity": { "name": "@agent-assistant/connectivity", - "version": "0.4.31", + "version": "0.4.33", "license": "MIT", "dependencies": { "nanoid": "^5.1.6" @@ -3758,7 +3763,7 @@ }, "packages/continuation": { "name": "@agent-assistant/continuation", - "version": "0.4.31", + "version": "0.4.33", "dependencies": { "@agent-assistant/harness": "^0.10.1" }, @@ -4025,7 +4030,7 @@ }, "packages/coordination": { "name": "@agent-assistant/coordination", - "version": "0.4.31", + "version": "0.4.33", "license": "MIT", "dependencies": { "@agent-assistant/connectivity": "^0.2.6", @@ -4048,7 +4053,7 @@ }, "packages/core": { "name": "@agent-assistant/core", - "version": "0.4.31", + "version": "0.4.33", "devDependencies": { "@agent-assistant/traits": "file:../traits", "typescript": "^5.9.3", @@ -4081,7 +4086,7 @@ }, "packages/harness": { "name": "@agent-assistant/harness", - "version": "0.4.31", + "version": "0.4.33", "dependencies": { "@agent-assistant/connectivity": "^0.2.6", "@agent-assistant/coordination": "^0.2.6", @@ -4249,7 +4254,7 @@ }, "packages/inbox": { "name": "@agent-assistant/inbox", - "version": "0.4.31", + "version": "0.4.33", "license": "MIT", "dependencies": { "@agent-assistant/turn-context": ">=0.1.0" @@ -5037,7 +5042,7 @@ }, "packages/memory": { "name": "@agent-assistant/memory", - "version": "0.4.31", + "version": "0.4.33", "license": "MIT", "dependencies": { "@agent-relay/memory": "^6.0.9", @@ -5048,9 +5053,18 @@ "vitest": "^3.2.4" } }, + "packages/persona": { + "name": "@agent-assistant/persona", + "version": "0.1.0", + "license": "MIT", + "devDependencies": { + "typescript": "^5.9.3", + "vitest": "^3.2.4" + } + }, "packages/policy": { "name": "@agent-assistant/policy", - "version": "0.4.31", + "version": "0.4.33", "license": "MIT", "dependencies": { "nanoid": "^5.0.0" @@ -5062,7 +5076,7 @@ }, "packages/proactive": { "name": "@agent-assistant/proactive", - "version": "0.4.31", + "version": "0.4.33", "license": "MIT", "dependencies": { "@agent-assistant/coordination": "^0.4.25", @@ -5085,7 +5099,7 @@ }, "packages/sdk": { "name": "@agent-assistant/sdk", - "version": "0.4.31", + "version": "0.4.33", "license": "MIT", "dependencies": { "@agent-assistant/core": ">=0.1.0", @@ -5102,7 +5116,7 @@ }, "packages/sessions": { "name": "@agent-assistant/sessions", - "version": "0.4.31", + "version": "0.4.33", "devDependencies": { "typescript": "^5.9.3", "vitest": "^3.2.4" @@ -5110,7 +5124,7 @@ }, "packages/specialists": { "name": "@agent-assistant/specialists", - "version": "0.4.31", + "version": "0.4.33", "dependencies": { "@agent-assistant/coordination": "^0.2.6", "@agent-assistant/vfs": "^0.2.6", @@ -5149,7 +5163,7 @@ }, "packages/surfaces": { "name": "@agent-assistant/surfaces", - "version": "0.4.31", + "version": "0.4.33", "devDependencies": { "typescript": "^5.9.3", "vitest": "^3.2.4" @@ -5157,7 +5171,7 @@ }, "packages/telemetry": { "name": "@agent-assistant/telemetry", - "version": "0.4.31", + "version": "0.4.33", "dependencies": { "@agent-assistant/harness": "^0.10.1" }, @@ -5430,7 +5444,7 @@ }, "packages/traits": { "name": "@agent-assistant/traits", - "version": "0.4.31", + "version": "0.4.33", "license": "MIT", "devDependencies": { "typescript": "^5.9.3", @@ -5439,7 +5453,7 @@ }, "packages/turn-context": { "name": "@agent-assistant/turn-context", - "version": "0.4.31", + "version": "0.4.33", "license": "MIT", "dependencies": { "@agent-assistant/harness": "^0.4.0 || ^0.6.0", @@ -5599,7 +5613,7 @@ }, "packages/vfs": { "name": "@agent-assistant/vfs", - "version": "0.4.31", + "version": "0.4.33", "license": "MIT", "devDependencies": { "@types/node": "^20.0.0", @@ -5626,7 +5640,7 @@ }, "packages/webhook-runtime": { "name": "@agent-assistant/webhook-runtime", - "version": "0.4.31", + "version": "0.4.33", "dependencies": { "@agent-assistant/specialists": "^0.3.5", "@agent-assistant/surfaces": "^0.3.0", diff --git a/package.json b/package.json index 0dc9e7f..6175ebd 100644 --- a/package.json +++ b/package.json @@ -8,6 +8,7 @@ "packages/vfs", "packages/harness", "packages/memory", + "packages/persona", "packages/inbox", "packages/continuation", "packages/turn-context", diff --git a/packages/persona/package.json b/packages/persona/package.json new file mode 100644 index 0000000..cb58235 --- /dev/null +++ b/packages/persona/package.json @@ -0,0 +1,29 @@ +{ + "name": "@agent-assistant/persona", + "version": "0.1.0", + "description": "Shared persona type contracts for agent assistant services", + "type": "module", + "main": "dist/index.js", + "types": "dist/index.d.ts", + "exports": { + ".": { + "import": "./dist/index.js", + "types": "./dist/index.d.ts" + } + }, + "files": [ + "dist" + ], + "scripts": { + "prepack": "npm run build", + "build": "tsc -p tsconfig.json", + "test": "vitest run", + "test:watch": "vitest", + "typecheck": "tsc --noEmit -p tsconfig.json" + }, + "devDependencies": { + "typescript": "^5.9.3", + "vitest": "^3.2.4" + }, + "license": "MIT" +} diff --git a/packages/persona/src/index.ts b/packages/persona/src/index.ts new file mode 100644 index 0000000..abbb378 --- /dev/null +++ b/packages/persona/src/index.ts @@ -0,0 +1,9 @@ +export type { + PersonaDefinition, + PersonaDeliveryConfig, + PersonaExecutor, + PersonaMemoryConfig, + PersonaTrigger, + RouterConfig, + SandboxBorrowConfig, +} from "./types.js"; diff --git a/packages/persona/src/types.test.ts b/packages/persona/src/types.test.ts new file mode 100644 index 0000000..b48364f --- /dev/null +++ b/packages/persona/src/types.test.ts @@ -0,0 +1,66 @@ +import { describe, expect, it } from "vitest"; +import type { PersonaDefinition } from "./types.js"; + +describe("persona type contracts", () => { + it("supports ephemeral sandbox executors", () => { + const persona = { + id: "daily-research", + displayName: "Daily Research", + version: "0.1.0", + ownerService: "sage", + executor: { kind: "ephemeral-sandbox" }, + triggers: [{ kind: "cron", cron: "0 9 * * *", timezone: "UTC" }], + } satisfies PersonaDefinition; + + expect(persona.executor.kind).toBe("ephemeral-sandbox"); + }); + + it("supports HTTP delegate executors", () => { + const persona = { + id: "nightcto-triage", + displayName: "NightCTO Triage", + version: "0.1.0", + ownerService: "nightcto", + executor: { + kind: "http-delegate", + router: { + endpoint: "https://example.com/personas/nightcto", + method: "POST", + timeoutMs: 30_000, + headers: { "x-persona": "nightcto" }, + }, + }, + triggers: [{ kind: "webhook", provider: "github", event: "issue.opened" }], + delivery: { mode: "callback", callbackUrl: "https://example.com/callback" }, + } satisfies PersonaDefinition; + + expect(persona.executor.kind).toBe("http-delegate"); + }); + + it("supports hybrid executors", () => { + const persona = { + id: "msd-app-helper", + displayName: "MSD App Helper", + version: "0.1.0", + ownerService: "msd-app", + executor: { + kind: "hybrid", + router: { + endpoint: "https://example.com/personas/msd", + }, + sandbox: { + snapshot: "persona-msd-base", + lifecycle: "warm-pool", + ttlSeconds: 600, + maxConcurrentBorrows: 3, + capabilities: ["repo-read", "browser"], + }, + }, + triggers: [{ kind: "inbox", channel: "support", event: "message.created" }], + memory: { backend: "agent-memory", namespace: "msd-app" }, + metadata: { tier: "support" }, + } satisfies PersonaDefinition; + + expect(persona.executor.kind).toBe("hybrid"); + }); +}); diff --git a/packages/persona/src/types.ts b/packages/persona/src/types.ts new file mode 100644 index 0000000..5fca299 --- /dev/null +++ b/packages/persona/src/types.ts @@ -0,0 +1,48 @@ +export interface RouterConfig { + endpoint: string; + method?: "POST"; + timeoutMs?: number; + headers?: Record; +} + +export interface SandboxBorrowConfig { + snapshot: string; + lifecycle?: "ephemeral" | "warm-pool"; + ttlSeconds?: number; + maxConcurrentBorrows?: number; + capabilities?: string[]; +} + +export type PersonaExecutor = + | { kind: "ephemeral-sandbox" } + | { kind: "http-delegate"; router: RouterConfig } + | { kind: "hybrid"; router: RouterConfig; sandbox: SandboxBorrowConfig }; + +export type PersonaTrigger = + | { kind: "cron"; cron: string; timezone?: string; name?: string } + | { kind: "webhook"; provider: string; event?: string; path?: string } + | { kind: "inbox"; channel?: string; event?: string }; + +export interface PersonaMemoryConfig { + backend?: "agent-memory" | "supermemory" | "none"; + namespace?: string; +} + +export interface PersonaDeliveryConfig { + mode?: "inline" | "callback" | "direct"; + callbackUrl?: string; +} + +export interface PersonaDefinition { + id: string; + displayName: string; + version: string; + description?: string; + ownerService?: "sage" | "nightcto" | "msd-app" | "workforce" | (string & {}); + sourceTag?: string; + executor: PersonaExecutor; + triggers?: PersonaTrigger[]; + memory?: PersonaMemoryConfig; + delivery?: PersonaDeliveryConfig; + metadata?: Record; +} diff --git a/packages/persona/tsconfig.json b/packages/persona/tsconfig.json new file mode 100644 index 0000000..01a4173 --- /dev/null +++ b/packages/persona/tsconfig.json @@ -0,0 +1,19 @@ +{ + "compilerOptions": { + "target": "ES2022", + "module": "NodeNext", + "moduleResolution": "NodeNext", + "declaration": true, + "outDir": "dist", + "rootDir": "src", + "strict": true, + "exactOptionalPropertyTypes": true, + "esModuleInterop": true, + "forceConsistentCasingInFileNames": true, + "skipLibCheck": true, + "noUncheckedIndexedAccess": true + }, + "include": [ + "src/**/*.ts" + ] +}