diff --git a/V2_HTTP_API_AUDIT.md b/V2_HTTP_API_AUDIT.md index 19ed93162b7..371e93eba84 100644 --- a/V2_HTTP_API_AUDIT.md +++ b/V2_HTTP_API_AUDIT.md @@ -147,7 +147,7 @@ Review endpoints in document order. For each endpoint, select one disposition an | [x] 053 | `POST` | `/api/session/{sessionID}/fork` | `session.fork` | Change | Request now accepts optional branded `before` message ID; omission copies full history. | | [x] 054 | `POST` | `/api/session/{sessionID}/agent` | `session.switchAgent` | Keep | Subsequent-execution agent selection retained. | | [x] 055 | `POST` | `/api/session/{sessionID}/model` | `session.switchModel` | Keep | Subsequent-execution model and optional variant selection retained. | -| [x] 056 | `PATCH` | `/api/session/{sessionID}` | `session.update` | Change | General session patch now updates optional title and permissions. | +| [x] 056 | `PATCH` | `/api/session/{sessionID}` | `session.update` | Change | General session patch updates title and permissions; rules emit `session.permissions`. | | [x] 057 | `POST` | `/api/session/{sessionID}/move` | `session.move` | Change | Removed inaccurate local-change transfer claim; delivery behavior retained. | | [x] 058 | `POST` | `/api/session/{sessionID}/background` | `session.background` | Keep | Backgroundable foreground tools transition to background observation; idle requests remain no-ops. | diff --git a/packages/client/src/effect/api/api.ts b/packages/client/src/effect/api/api.ts index 32a9a2ab5ab..6a2de5f085a 100644 --- a/packages/client/src/effect/api/api.ts +++ b/packages/client/src/effect/api/api.ts @@ -515,7 +515,7 @@ export type SessionLogOutput = readonly id: Event.ID readonly created: number readonly metadata?: { readonly [x: string]: unknown } | undefined - readonly type: "session.permissions.updated" + readonly type: "session.permissions" readonly durable: { readonly aggregateID: string; readonly seq: Event.Seq; readonly version: Event.Version } readonly location?: | { diff --git a/packages/client/src/promise/generated/types.ts b/packages/client/src/promise/generated/types.ts index 6ad55c09908..63ac3c3f8b5 100644 --- a/packages/client/src/promise/generated/types.ts +++ b/packages/client/src/promise/generated/types.ts @@ -1888,11 +1888,11 @@ export type AgentInfo = { permissions: PermissionRuleset } -export type SessionPermissionsUpdated = { +export type SessionPermissions = { id: string created: number metadata?: { [x: string]: any } - type: "session.permissions.updated" + type: "session.permissions" durable: { aggregateID: string; seq: number; version: 1 } location?: LocationRef data: { sessionID: string; permissions: PermissionRuleset } @@ -2272,7 +2272,7 @@ export type SessionEventDurable = | SessionModelSelected | SessionMoved | SessionRenamed - | SessionPermissionsUpdated + | SessionPermissions | SessionViewed | SessionDeleted | SessionForked @@ -2333,7 +2333,7 @@ export type V2Event = | SessionModelSelected | SessionMoved | SessionRenamed - | SessionPermissionsUpdated + | SessionPermissions | SessionViewed | SessionUsageUpdated | SessionDeleted diff --git a/packages/client/src/solid/data.ts b/packages/client/src/solid/data.ts index a33a8b1cc19..fe8c435cc6b 100644 --- a/packages/client/src/solid/data.ts +++ b/packages/client/src/solid/data.ts @@ -697,7 +697,7 @@ export function createData(config: CreateDataInput) { }) return } - case "session.permissions.updated": + case "session.permissions": if (store.session.info[event.data.sessionID]) setStore("session", "info", event.data.sessionID, "permissions", event.data.permissions) return diff --git a/packages/core/src/session/message-updater.ts b/packages/core/src/session/message-updater.ts index 17f744040a5..09998dcdf9b 100644 --- a/packages/core/src/session/message-updater.ts +++ b/packages/core/src/session/message-updater.ts @@ -131,7 +131,7 @@ export function update(adapter: Adapter, event: SessionEvent.DurableEvent) { ) }), "session.renamed": () => Effect.void, - "session.permissions.updated": () => Effect.void, + "session.permissions": () => Effect.void, "session.deleted": () => Effect.void, "session.forked": () => Effect.void, "session.inbox.delivered": () => Effect.void, diff --git a/packages/core/src/session/projector.ts b/packages/core/src/session/projector.ts index 2baf71a610b..943072aac11 100644 --- a/packages/core/src/session/projector.ts +++ b/packages/core/src/session/projector.ts @@ -573,7 +573,7 @@ const layer = Layer.effectDiscard( .run() .pipe(Effect.orDie), ) - yield* bus.project(SessionEvent.PermissionsUpdated, (event) => + yield* bus.project(SessionEvent.Permissions, (event) => db .update(SessionTable) .set({ permission: event.data.permissions, time_updated: event.created }) diff --git a/packages/core/src/session/session.ts b/packages/core/src/session/session.ts index 70bddc6b4e1..cd7a3b0b426 100644 --- a/packages/core/src/session/session.ts +++ b/packages/core/src/session/session.ts @@ -78,7 +78,7 @@ export const make = Effect.fn("Session.make")(function* () { input: { permissions: Permission.Ruleset }, ) { yield* get(sessionID) - yield* bus.publish(SessionEvent.PermissionsUpdated, { sessionID, permissions: input.permissions }) + yield* bus.publish(SessionEvent.Permissions, { sessionID, permissions: input.permissions }) }) const switchAgent = Effect.fn("Session.switchAgent")(function* ( sessionID: SessionSchema.ID, diff --git a/packages/core/test/plugin/host.ts b/packages/core/test/plugin/host.ts index fd5b3b293a0..88a92f6cc01 100644 --- a/packages/core/test/plugin/host.ts +++ b/packages/core/test/plugin/host.ts @@ -107,7 +107,6 @@ export function host(overrides: Overrides = {}): Plugin.Context { list: () => Effect.die("unused permission.list"), get: () => Effect.die("unused permission.get"), reply: () => Effect.die("unused permission.reply"), - rules: () => Effect.die("unused permission.rules"), }, plugin: overrides.plugin ?? { list: () => Effect.die("unused plugin.list"), @@ -168,7 +167,7 @@ export function host(overrides: Overrides = {}): Plugin.Context { prompt: overrides.session?.prompt ?? (() => Effect.die("unused session.prompt")), generate: overrides.session?.generate ?? (() => Effect.die("unused session.generate")), command: overrides.session?.command ?? (() => Effect.die("unused session.command")), - rename: overrides.session?.rename ?? (() => Effect.die("unused session.rename")), + update: overrides.session?.update ?? (() => Effect.die("unused session.update")), move: overrides.session?.move ?? (() => Effect.die("unused session.move")), synthetic: overrides.session?.synthetic ?? (() => Effect.die("unused session.synthetic")), interrupt: overrides.session?.interrupt ?? (() => Effect.die("unused session.interrupt")), diff --git a/packages/schema/src/session-event.ts b/packages/schema/src/session-event.ts index 6e43890ff8a..bbf7edcb33a 100644 --- a/packages/schema/src/session-event.ts +++ b/packages/schema/src/session-event.ts @@ -111,15 +111,15 @@ export const Renamed = Event.durable({ }) export type Renamed = typeof Renamed.Type -export const PermissionsUpdated = Event.durable({ - type: "session.permissions.updated", +export const Permissions = Event.durable({ + type: "session.permissions", ...options, schema: { ...Base, permissions: Permission.Ruleset, }, }) -export type PermissionsUpdated = typeof PermissionsUpdated.Type +export type Permissions = typeof Permissions.Type export const Viewed = Event.durable({ type: "session.viewed", @@ -646,7 +646,7 @@ export const Definitions = Event.inventory( ModelSelected, Moved, Renamed, - PermissionsUpdated, + Permissions, Viewed, UsageUpdated, Deleted, diff --git a/packages/schema/test/event-manifest.test.ts b/packages/schema/test/event-manifest.test.ts index 05019c28c1b..a6b1c95197d 100644 --- a/packages/schema/test/event-manifest.test.ts +++ b/packages/schema/test/event-manifest.test.ts @@ -115,7 +115,7 @@ describe("public event manifest", () => { "session.model.selected.1", "session.moved.1", "session.renamed.1", - "session.permissions.updated.1", + "session.permissions.1", "session.viewed.1", "session.message.content.updated.1", "session.usage.recorded.1",