@rizom/brain 0.2.0-alpha.367 → 0.2.0-alpha.368
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/brain.js +37 -37
- package/dist/chunks/{app-yd32mksm.js → app-8ra52y7h.js} +2 -2
- package/dist/chunks/{index-jayjg24d.js → index-73p25fze.js} +3 -3
- package/dist/chunks/{index-jayjg24d.js.map → index-73p25fze.js.map} +1 -1
- package/dist/chunks/{index-4m0x16b0.js → index-btdnz7tq.js} +2 -2
- package/dist/chunks/{index-51vjv16n.js → index-ssjqpwz8.js} +2 -2
- package/dist/index.js +1 -1
- package/dist/model.js +38 -38
- package/dist/model.js.map +2 -2
- package/dist/ui/studio-app.css +5 -6
- package/dist/ui/studio-app.js +97 -97
- package/dist/ui/studio-app.js.map +8 -6
- package/dist/ui/studio-asset-manifest.json +10 -10
- package/dist/ui/studio-chunks/{account-view-x4x23bba.js → account-view-jaz2s37s.js} +1 -1
- package/dist/ui/studio-chunks/{main-1zqwy1pt.js → main-5kjr6001.js} +2 -2
- package/dist/ui/studio-chunks/{main-1zqwy1pt.js.map → main-5kjr6001.js.map} +2 -2
- package/dist/ui/studio-chunks/{main-gza6av7a.js → main-a0txvxhh.js} +3 -3
- package/dist/ui/studio-chunks/{main-gza6av7a.js.map → main-a0txvxhh.js.map} +4 -4
- package/dist/ui/studio-chunks/{main-9hc6fxah.js → main-fn39pm5j.js} +1 -1
- package/dist/ui/studio-chunks/studio-chat-workspace-tep5fwgz.js +5 -0
- package/dist/ui/studio-chunks/{studio-chat-workspace-htkcczf9.js.map → studio-chat-workspace-tep5fwgz.js.map} +3 -3
- package/package.json +1 -1
- package/dist/ui/studio-chunks/studio-chat-workspace-htkcczf9.js +0 -5
- /package/dist/chunks/{app-yd32mksm.js.map → app-8ra52y7h.js.map} +0 -0
- /package/dist/chunks/{index-4m0x16b0.js.map → index-btdnz7tq.js.map} +0 -0
- /package/dist/chunks/{index-51vjv16n.js.map → index-ssjqpwz8.js.map} +0 -0
- /package/dist/ui/studio-chunks/{account-view-x4x23bba.js.map → account-view-jaz2s37s.js.map} +0 -0
- /package/dist/ui/studio-chunks/{main-9hc6fxah.js.map → main-fn39pm5j.js.map} +0 -0
|
@@ -5,10 +5,10 @@
|
|
|
5
5
|
"import * as stylex from \"@stylexjs/stylex\";\nexport const chatLayout: Record<\"root\" | \"shell\" | \"frame\" | \"room\" | \"roomWithoutSessions\" | \"emptyThreadHead\" | \"emptyConversation\" | \"sessions\" | \"picker\" | \"thread\" | \"threadHead\" | \"sessionList\" | \"session\" | \"activeSession\" | \"sessionTitle\" | \"timestamp\" | \"actions\" | \"title\" | \"summary\" | \"context\" | \"contextBody\" | \"contextItem\" | \"threadScroll\" | \"manuscript\" | \"turn\" | \"speaker\" | \"turnBody\" | \"userBody\" | \"paragraph\" | \"cards\" | \"card\" | \"kicker\" | \"empty\" | \"error\" | \"form\" | \"composer\" | \"fieldLabel\" | \"input\" | \"uploadInput\" | \"attachButton\" | \"uploadList\" | \"upload\" | \"headCopy\" | \"subheading\" | \"button\" | \"primaryButton\" | \"cardHeading\" | \"cardText\", stylex.StyleXStyles> = {\n shell: {\n k1xSpc: \"xrvj5dj\",\n kUk6DE: \"x98rzlu\",\n kAzted: \"x2lwn1j\",\n k7Eaqz: \"xeuugli\",\n kVQacm: \"xb3r6kr\",\n $$css: true\n },\n root: {\n k1xSpc: \"x78zum5\",\n kXwgrk: \"xdt5ytf\",\n kZKoxP: \"xtdtrs8\",\n kskxy: \"x1wj9ous\",\n kAzted: \"x2lwn1j\",\n k7Eaqz: \"xeuugli\",\n kVQacm: \"xb3r6kr\",\n $$css: true\n },\n frame: {\n k1xSpc: \"x78zum5\",\n kXwgrk: \"xdt5ytf\",\n k7Eaqz: \"xeuugli\",\n kAzted: \"x2lwn1j\",\n kVQacm: \"xb3r6kr\",\n kmVPX3: \"x11alobv x54aoxz\",\n kOIVth: \"x33pbmt\",\n $$css: true\n },\n room: {\n k1xSpc: \"xrvj5dj\",\n kumcoG: \"x8z353p xf4kbi9\",\n kOIVth: \"x1rzw5jd\",\n kUk6DE: \"x98rzlu\",\n kAzted: \"x2lwn1j\",\n k7Eaqz: \"xeuugli\",\n kVQacm: \"xb3r6kr\",\n $$css: true\n },\n roomWithoutSessions: {\n kumcoG: \"x1mkdm3x\",\n $$css: true\n },\n emptyThreadHead: {\n k1K539: \"xod5an3\",\n $$css: true\n },\n emptyConversation: {\n kogj98: \"x1ghz6dp\",\n $$css: true\n },\n sessions: {\n k1xSpc: \"x1lliihq xubcuz8\",\n k7Eaqz: \"xeuugli\",\n kAzted: \"x2lwn1j\",\n kORKVm: \"x1odjw0f\",\n $$css: true\n },\n picker: {\n k1xSpc: \"xrvj5dj\",\n k9llMU: \"x16p6thf\",\n kskxy: \"x1j65ot3\",\n kAzted: \"x2lwn1j\",\n kVQacm: \"xb3r6kr\",\n $$css: true\n },\n thread: {\n k1xSpc: \"x78zum5\",\n kXwgrk: \"xdt5ytf\",\n k7Eaqz: \"xeuugli\",\n kAzted: \"x2lwn1j\",\n kVQacm: \"xb3r6kr\",\n $$css: true\n },\n threadHead: {\n k1xSpc: \"x78zum5\",\n kGNEyG: \"x1pha0wt\",\n kjj79g: \"x1qughib\",\n kOIVth: \"x1c1vhfx\",\n k7Eaqz: \"xeuugli\",\n k1K539: \"x91k8ka\",\n $$css: true\n },\n title: {\n kogj98: \"x1ghz6dp\",\n kMv6JI: \"xssy22x\",\n kGuDYH: \"x1pvqxga\",\n ka26j: \"xkhxzli\",\n k63SB2: \"xo1l8bm\",\n kLWn49: \"xwn7fz2\",\n kHjlTd: \"xj0a0fe\",\n kMwMTN: \"xqvuw85\",\n $$css: true\n },\n headCopy: {\n k7Eaqz: \"xeuugli\",\n kUk6DE: \"x98rzlu\",\n $$css: true\n },\n actions: {\n k1xSpc: \"x78zum5\",\n kwnvtZ: \"x1a02dak\",\n kGNEyG: \"x6s0dn4\",\n kOIVth: \"x883omv\",\n $$css: true\n },\n sessionList: {\n k1xSpc: \"xrvj5dj\",\n kfiyM8: \"x10ukxgv\",\n kAzted: \"x2lwn1j\",\n k7Eaqz: \"xeuugli\",\n kORKVm: \"x1odjw0f\",\n $$css: true\n },\n session: {\n k1xSpc: \"xrvj5dj\",\n kOIVth: \"x17d4w8g\",\n kzqmXN: \"xh8yej3\",\n k7Eaqz: \"xeuugli\",\n kmVPX3: \"x1g8o3q3\",\n kMzoRj: \"xc342km\",\n kt9PQ7: \"xso031l\",\n ksu8eU: \"x1y0btm7\",\n kVAM5u: \"xy1lt07\",\n kWkggS: \"xjbqb8w\",\n kMwMTN: \"xqvuw85\",\n k9WMMc: \"xdpxx8g\",\n kkrTdU: \"x1ypdohk\",\n kDPRdz: \"x1711cle\",\n k3Woio: \"x16dl9wz\",\n kiEn40: \"x1bqaal\",\n $$css: true\n },\n activeSession: {\n kMwMTN: \"x1myn341\",\n $$css: true\n },\n sessionTitle: {\n kMv6JI: \"x5ddh9m\",\n kGuDYH: \"xif65rj\",\n k63SB2: \"xo1l8bm\",\n kLWn49: \"xfrs9s4\",\n kHjlTd: \"xj0a0fe\",\n k1xSpc: \"x104kibb\",\n kgKLqz: \"x1ua5tub\",\n kJFfOR: \"x1h7i4cw\",\n kVQacm: \"xb3r6kr\",\n $$css: true\n },\n timestamp: {\n kMv6JI: \"xa9opjo\",\n kGuDYH: \"x1j6dyjg\",\n kLWn49: \"xa7kkou\",\n kMwMTN: \"x1ar3pfp\",\n kHjlTd: \"xj0a0fe\",\n $$css: true\n },\n summary: {\n kAzted: \"x21xpn4\",\n kGO01o: \"xsag5q8\",\n kMv6JI: \"x5ddh9m\",\n kGuDYH: \"xfifm61\",\n kMwMTN: \"x1ar3pfp\",\n kkrTdU: \"x1ypdohk\",\n $$css: true\n },\n context: {\n k7Eaqz: \"xeuugli\",\n kt9PQ7: \"xso031l\",\n kfdmCh: \"x1q0q8m5\",\n kL6WhQ: \"xpqg30t\",\n $$css: true\n },\n contextBody: {\n k1xSpc: \"xrvj5dj\",\n kOIVth: \"xou54vl\",\n kskxy: \"x1551h31 x1jku9b6\",\n kORKVm: \"x1odjw0f\",\n kGO01o: \"x1l90r2v\",\n k7Eaqz: \"xeuugli\",\n $$css: true\n },\n contextItem: {\n k1xSpc: \"xrvj5dj\",\n kOIVth: \"x17d4w8g\",\n k7Eaqz: \"xeuugli\",\n kmVPX3: \"x1b4vry6\",\n kt9PQ7: \"xso031l\",\n kfdmCh: \"x1q0q8m5\",\n kL6WhQ: \"xpqg30t\",\n kMv6JI: \"x5ddh9m\",\n kGuDYH: \"xfifm61\",\n kLWn49: \"x1dbl2gt\",\n $$css: true\n },\n threadScroll: {\n kUk6DE: \"x98rzlu\",\n kAzted: \"x2lwn1j\",\n k7Eaqz: \"xeuugli\",\n kORKVm: \"x1odjw0f\",\n kZeWKH: \"xish69e\",\n k5wCbM: \"x1597r2g\",\n k6w4Gs: \"xgwpcrc\",\n $$css: true\n },\n manuscript: {\n k7Eaqz: \"xeuugli\",\n $$css: true\n },\n turn: {\n k1xSpc: \"xrvj5dj\",\n kumcoG: \"xpczwk3 xfs71jk\",\n kOIVth: \"xou54vl\",\n kmVPX3: \"x10czhz2\",\n kt9PQ7: \"xso031l\",\n kfdmCh: \"x1q0q8m5\",\n kL6WhQ: \"xpqg30t\",\n k7Eaqz: \"xeuugli\",\n $$css: true\n },\n speaker: {\n kLKAdn: \"x1yrsyyn\",\n kMv6JI: \"xa9opjo\",\n kGuDYH: \"x1j6dyjg\",\n kLWn49: \"x1dbl2gt\",\n kMwMTN: \"x1ar3pfp\",\n $$css: true\n },\n turnBody: {\n k1xSpc: \"xrvj5dj\",\n kOIVth: \"x1v2ro7d\",\n k7Eaqz: \"xeuugli\",\n kMv6JI: \"xssy22x\",\n kGuDYH: \"xosj86m\",\n k63SB2: \"xo1l8bm\",\n kLWn49: \"x11m8ghp\",\n kMwMTN: \"xqvuw85\",\n kHjlTd: \"xj0a0fe\",\n $$css: true\n },\n userBody: {\n k63SB2: \"x1s688f\",\n $$css: true\n },\n paragraph: {\n kogj98: \"x1ghz6dp\",\n khDVqt: \"x126k92a\",\n kHjlTd: \"xj0a0fe\",\n $$css: true\n },\n cards: {\n k1xSpc: \"xrvj5dj\",\n kOIVth: \"x1v2ro7d\",\n k7Eaqz: \"xeuugli\",\n $$css: true\n },\n card: {\n k1xSpc: \"xrvj5dj\",\n kOIVth: \"x883omv\",\n k7Eaqz: \"xeuugli\",\n kmVPX3: \"x1tamke2\",\n kMzoRj: \"xmkeg23\",\n ksu8eU: \"x1y0btm7\",\n kVAM5u: \"xy1lt07\",\n kaIpWk: \"x1sxf85j\",\n kMv6JI: \"x5ddh9m\",\n kGuDYH: \"xfifm61\",\n k63SB2: \"xo1l8bm\",\n kLWn49: \"x1dbl2gt\",\n kHjlTd: \"xj0a0fe\",\n kXHlph: \"xw2csxc\",\n $$css: true\n },\n kicker: {\n kMv6JI: \"xa9opjo\",\n kGuDYH: \"x1j6dyjg\",\n kMwMTN: \"x1ar3pfp\",\n $$css: true\n },\n cardHeading: {\n kogj98: \"x1ghz6dp\",\n kGuDYH: \"xif65rj\",\n k63SB2: \"x1s688f\",\n $$css: true\n },\n cardText: {\n kogj98: \"x1ghz6dp\",\n kMv6JI: \"x5ddh9m\",\n kGuDYH: \"xfifm61\",\n kLWn49: \"x1dbl2gt\",\n $$css: true\n },\n empty: {\n kogj98: \"xhv1u6h\",\n kMv6JI: \"x5ddh9m\",\n kGuDYH: \"xfifm61\",\n kLWn49: \"x1dbl2gt\",\n kMwMTN: \"x1ar3pfp\",\n kHjlTd: \"xj0a0fe\",\n $$css: true\n },\n error: {\n kMwMTN: \"x1mel2pz\",\n $$css: true\n },\n form: {\n k1xSpc: \"xrvj5dj\",\n kOIVth: \"x1v2ro7d\",\n k7Eaqz: \"xeuugli\",\n $$css: true\n },\n composer: {\n kmuXW: \"x2lah0s\",\n k7Eaqz: \"xeuugli\",\n kLKAdn: \"xz9dl7a\",\n kEafiO: \"x178xt8z\",\n kPef9Z: \"x13fuv20\",\n kLZC3w: \"xvg7k2t\",\n $$css: true\n },\n fieldLabel: {\n k1xSpc: \"xrvj5dj\",\n kOIVth: \"x167g77z\",\n kMv6JI: \"x5ddh9m\",\n kGuDYH: \"xfifm61\",\n kMwMTN: \"xqvuw85\",\n $$css: true\n },\n input: {\n kzqmXN: \"xh8yej3\",\n kB7OPa: \"x9f619\",\n k7Eaqz: \"xeuugli\",\n kAzted: \"xseoqlg\",\n kskxy: \"x19aweqf\",\n kHenm0: \"x288g5\",\n kmVPX3: \"xc7ga6q\",\n kMzoRj: \"xmkeg23\",\n ksu8eU: \"x1y0btm7\",\n kVAM5u: \"xy1lt07\",\n kaIpWk: \"x1sxf85j\",\n kWkggS: \"xjbqb8w\",\n kMv6JI: \"x5ddh9m\",\n kGuDYH: \"xif65rj\",\n kLWn49: \"x1evy7pa\",\n kMwMTN: \"xqvuw85\",\n k3Woio: \"x16dl9wz\",\n kiEn40: \"x7s97pk\",\n $$css: true\n },\n attachButton: {\n k1xSpc: \"x3nfvp2\",\n kGNEyG: \"x6s0dn4\",\n kAzted: \"x1ba4aug\",\n kmVPX3: \"x153ncpu\",\n kB7OPa: \"x9f619\",\n kMzoRj: \"xmkeg23\",\n ksu8eU: \"x1y0btm7\",\n kVAM5u: \"xy1lt07\",\n kaIpWk: \"x1sxf85j\",\n kMv6JI: \"x5ddh9m\",\n kGuDYH: \"xfifm61\",\n kMwMTN: \"xqvuw85\",\n kkrTdU: \"x1ypdohk\",\n k8PahR: \"xt2bx3g\",\n kfQpEX: \"x1fanpfn\",\n $$css: true\n },\n uploadInput: {\n kVAEAm: \"x10l6tqk\",\n kzqmXN: \"x1i1rx1s\",\n kZKoxP: \"xjm9jq1\",\n kz4h6p: \"x1hyvwdk\",\n kVQacm: \"xb3r6kr\",\n khDVqt: \"xuxw1ft\",\n $$css: true\n },\n uploadList: {\n k1xSpc: \"x78zum5\",\n kwnvtZ: \"x1a02dak\",\n kOIVth: \"x167g77z\",\n k1K539: \"xod5an3\",\n $$css: true\n },\n upload: {\n k1xSpc: \"x1rg5ohu\",\n kogj98: \"x1ghz6dp\",\n ks0D6T: \"x193iq5w\",\n kMv6JI: \"xa9opjo\",\n kGuDYH: \"x1j6dyjg\",\n k63SB2: \"xo1l8bm\",\n kMwMTN: \"x1ar3pfp\",\n kHjlTd: \"xj0a0fe\",\n $$css: true\n },\n button: {\n kAzted: \"x1ba4aug\",\n kmVPX3: \"x153ncpu\",\n kMzoRj: \"xmkeg23\",\n ksu8eU: \"x1y0btm7\",\n kVAM5u: \"xy1lt07\",\n kaIpWk: \"x1sxf85j\",\n kWkggS: \"xjbqb8w\",\n kMwMTN: \"xqvuw85\",\n kMv6JI: \"x5ddh9m\",\n kGuDYH: \"xfifm61\",\n kkrTdU: \"x1ypdohk\",\n k3Woio: \"x16dl9wz\",\n kiEn40: \"x7s97pk\",\n kWCcOm: \"xijokvz\",\n kYPGJ8: \"xtgyt42\",\n $$css: true\n },\n primaryButton: {\n kWkggS: \"x15vqgvx\",\n kVAM5u: \"xawfzfr\",\n kMwMTN: \"xb8ja0n\",\n $$css: true\n },\n subheading: {\n kogj98: \"x1ghz6dp\",\n kMv6JI: \"x5ddh9m\",\n kGuDYH: \"xif65rj\",\n k63SB2: \"x1s688f\",\n kLWn49: \"x1evy7pa\",\n $$css: true\n }\n};\nexport function chatClass(name: string, ...styles: stylex.StyleXStyles[]): string {\n return `${name} ${stylex.props(...styles).className ?? \"\"}`;\n}",
|
|
6
6
|
"import { z } from \"@brains/utils/zod\";\n\nexport const AGENT_ACTION_REQUEST_CHANNEL = \"agent:action:request\";\n\ntype AgentEventActionSchema = z.ZodObject<{\n type: z.ZodLiteral<\"event\">;\n event: z.ZodString;\n fromState: z.ZodOptional<z.ZodString>;\n}>;\n\nexport const agentEventActionSchema: AgentEventActionSchema = z.object({\n type: z.literal(\"event\"),\n event: z.string().min(1),\n /** State id the action was rendered for; lets handlers reject stale events. */\n fromState: z.string().min(1).optional(),\n});\n\nexport type AgentEventAction = z.output<typeof agentEventActionSchema>;\n\ntype AgentActionRequestSchema = z.ZodObject<{\n conversationId: z.ZodString;\n interfaceType: z.ZodString;\n channelId: z.ZodOptional<z.ZodString>;\n channelName: z.ZodString;\n userPermissionLevel: z.ZodEnum<{\n admin: \"admin\";\n trusted: \"trusted\";\n public: \"public\";\n }>;\n isAnchor: z.ZodBoolean;\n action: AgentEventActionSchema;\n}>;\n\nexport const agentActionRequestSchema: AgentActionRequestSchema = z.object({\n conversationId: z.string().min(1),\n interfaceType: z.string().min(1),\n channelId: z.string().min(1).optional(),\n channelName: z.string().min(1),\n userPermissionLevel: z.enum([\"admin\", \"trusted\", \"public\"]),\n isAnchor: z.boolean(),\n action: agentEventActionSchema,\n});\n\nexport type AgentActionRequest = z.output<typeof agentActionRequestSchema>;\n",
|
|
7
7
|
"import { z } from \"@brains/utils/zod\";\nimport { agentEventActionSchema, type AgentEventAction } from \"./agent-action\";\n\nexport const CHAT_API_VERSION = 1 as const;\nexport const DEFAULT_CHAT_API_PATH = \"/api/chat\" as const;\n\ntype Loose<Shape extends z.ZodRawShape> = z.ZodObject<Shape, z.core.$loose>;\ntype Strict<Shape extends z.ZodRawShape> = z.ZodObject<Shape, z.core.$strict>;\n\nconst chatIdSchema: z.ZodString = z.string().trim().min(1).max(256);\nconst chatUploadIdSchema: z.ZodString = z\n .string()\n .regex(\n /^upload-[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i,\n );\nconst chatTitleSchema: z.ZodString = z.string().trim().min(1).max(48);\nconst chatTimestampSchema: z.ZodString = z.string().datetime();\nconst chatRelativeUrlSchema: z.ZodString = z\n .string()\n .regex(/^\\/(?!\\/)/)\n .max(2_048);\nconst chatLinkUrlSchema: z.ZodString = z\n .string()\n .regex(/^(?:\\/(?!\\/)|https?:\\/\\/)/)\n .max(2_048);\n\nconst chatToolApprovalCardSchema: Loose<{\n kind: z.ZodLiteral<\"tool-approval\">;\n id: z.ZodString;\n toolCallId: z.ZodOptional<z.ZodString>;\n toolName: z.ZodString;\n input: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;\n summary: z.ZodString;\n completionSummary: z.ZodOptional<z.ZodString>;\n preview: z.ZodOptional<z.ZodString>;\n state: z.ZodEnum<{\n \"approval-requested\": \"approval-requested\";\n \"approval-responded\": \"approval-responded\";\n \"output-available\": \"output-available\";\n \"output-denied\": \"output-denied\";\n \"output-error\": \"output-error\";\n }>;\n output: z.ZodOptional<z.ZodUnknown>;\n error: z.ZodOptional<z.ZodString>;\n}> = z.looseObject({\n kind: z.literal(\"tool-approval\"),\n id: chatIdSchema,\n toolCallId: chatIdSchema.optional(),\n toolName: z.string().trim().min(1).max(256),\n input: z.record(z.string(), z.unknown()).optional(),\n summary: z.string().max(4_096),\n completionSummary: z.string().max(4_096).optional(),\n preview: z.string().max(100_000).optional(),\n state: z.enum([\n \"approval-requested\",\n \"approval-responded\",\n \"output-available\",\n \"output-denied\",\n \"output-error\",\n ]),\n output: z.unknown().optional(),\n error: z.string().max(4_096).optional(),\n});\n\nconst chatAttachmentCardSourceSchema: Loose<{\n entityType: z.ZodOptional<z.ZodString>;\n entityId: z.ZodOptional<z.ZodString>;\n attachmentType: z.ZodOptional<z.ZodString>;\n}> = z.looseObject({\n entityType: z.string().trim().min(1).max(128).optional(),\n entityId: chatIdSchema.optional(),\n attachmentType: z.string().trim().min(1).max(128).optional(),\n});\n\nconst chatAttachmentCardDataSchema: Loose<{\n mediaType: z.ZodString;\n url: z.ZodString;\n downloadUrl: z.ZodOptional<z.ZodString>;\n previewUrl: z.ZodOptional<z.ZodString>;\n filename: z.ZodOptional<z.ZodString>;\n sizeBytes: z.ZodOptional<z.ZodNumber>;\n source: z.ZodOptional<typeof chatAttachmentCardSourceSchema>;\n}> = z.looseObject({\n mediaType: z.string().trim().min(1).max(255),\n url: chatLinkUrlSchema,\n downloadUrl: chatLinkUrlSchema.optional(),\n previewUrl: chatLinkUrlSchema.optional(),\n filename: z.string().trim().min(1).max(255).optional(),\n sizeBytes: z.number().int().nonnegative().optional(),\n source: chatAttachmentCardSourceSchema.optional(),\n});\n\nconst chatAttachmentCardSchema: Loose<{\n kind: z.ZodLiteral<\"attachment\">;\n id: z.ZodString;\n jobId: z.ZodOptional<z.ZodString>;\n title: z.ZodString;\n description: z.ZodOptional<z.ZodString>;\n attachment: typeof chatAttachmentCardDataSchema;\n}> = z.looseObject({\n kind: z.literal(\"attachment\"),\n id: chatIdSchema,\n jobId: chatIdSchema.optional(),\n title: z.string().max(4_096),\n description: z.string().max(20_000).optional(),\n attachment: chatAttachmentCardDataSchema,\n});\n\nconst chatSourceCitationSchema: Loose<{\n id: z.ZodString;\n title: z.ZodOptional<z.ZodString>;\n source: z.ZodString;\n url: z.ZodOptional<z.ZodString>;\n entityType: z.ZodOptional<z.ZodString>;\n entityId: z.ZodOptional<z.ZodString>;\n excerpt: z.ZodOptional<z.ZodString>;\n provenance: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;\n}> = z.looseObject({\n id: chatIdSchema,\n title: z.string().max(4_096).optional(),\n source: z.string().trim().min(1).max(512),\n url: chatLinkUrlSchema.optional(),\n entityType: z.string().trim().min(1).max(128).optional(),\n entityId: chatIdSchema.optional(),\n excerpt: z.string().max(20_000).optional(),\n provenance: z.record(z.string(), z.unknown()).optional(),\n});\n\nconst chatSourcesCardSchema: Loose<{\n kind: z.ZodLiteral<\"sources\">;\n id: z.ZodString;\n title: z.ZodOptional<z.ZodString>;\n sources: z.ZodArray<typeof chatSourceCitationSchema>;\n}> = z.looseObject({\n kind: z.literal(\"sources\"),\n id: chatIdSchema,\n title: z.string().max(4_096).optional(),\n sources: z.array(chatSourceCitationSchema).min(1).max(100),\n});\n\nconst chatSuggestedActionSchema: z.ZodDiscriminatedUnion<\n [\n z.ZodObject<{\n type: z.ZodLiteral<\"prompt\">;\n id: z.ZodString;\n label: z.ZodString;\n prompt: z.ZodString;\n description: z.ZodOptional<z.ZodString>;\n }>,\n z.ZodObject<{\n type: z.ZodLiteral<\"event\">;\n id: z.ZodString;\n label: z.ZodString;\n event: z.ZodString;\n fromState: z.ZodOptional<z.ZodString>;\n description: z.ZodOptional<z.ZodString>;\n }>,\n ],\n \"type\"\n> = z.discriminatedUnion(\"type\", [\n z.object({\n type: z.literal(\"prompt\"),\n id: chatIdSchema,\n label: z.string().trim().min(1).max(256),\n prompt: z.string().min(1).max(100_000),\n description: z.string().max(4_096).optional(),\n }),\n z.object({\n type: z.literal(\"event\"),\n id: chatIdSchema,\n label: z.string().trim().min(1).max(256),\n event: z.string().trim().min(1).max(256),\n fromState: z.string().trim().min(1).max(256).optional(),\n description: z.string().max(4_096).optional(),\n }),\n]);\n\nconst chatActionsCardSchema: Loose<{\n kind: z.ZodLiteral<\"actions\">;\n id: z.ZodString;\n title: z.ZodOptional<z.ZodString>;\n actions: z.ZodArray<typeof chatSuggestedActionSchema>;\n}> = z.looseObject({\n kind: z.literal(\"actions\"),\n id: chatIdSchema,\n title: z.string().max(4_096).optional(),\n actions: z.array(chatSuggestedActionSchema).min(1).max(100),\n});\n\nexport const chatCardSchema: z.ZodDiscriminatedUnion<\n [\n typeof chatToolApprovalCardSchema,\n typeof chatAttachmentCardSchema,\n typeof chatSourcesCardSchema,\n typeof chatActionsCardSchema,\n ],\n \"kind\"\n> = z.discriminatedUnion(\"kind\", [\n chatToolApprovalCardSchema,\n chatAttachmentCardSchema,\n chatSourcesCardSchema,\n chatActionsCardSchema,\n]);\n\nexport type ChatCard = z.output<typeof chatCardSchema>;\n\nexport type ChatEventAction = AgentEventAction;\nexport const chatEventActionSchema: typeof agentEventActionSchema =\n agentEventActionSchema;\n\nconst chatPendingConfirmationSchema: z.ZodObject<{\n id: z.ZodString;\n toolCallId: z.ZodOptional<z.ZodString>;\n toolName: z.ZodString;\n summary: z.ZodString;\n completionSummary: z.ZodOptional<z.ZodString>;\n preview: z.ZodOptional<z.ZodString>;\n args: z.ZodUnknown;\n}> = z.object({\n id: chatIdSchema,\n toolCallId: chatIdSchema.optional(),\n toolName: z.string().trim().min(1).max(256),\n summary: z.string().max(4_096),\n completionSummary: z.string().max(4_096).optional(),\n preview: z.string().max(100_000).optional(),\n args: z.unknown(),\n});\n\nconst chatToolResultSchema: z.ZodObject<{\n toolName: z.ZodString;\n args: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;\n jobId: z.ZodOptional<z.ZodString>;\n data: z.ZodOptional<z.ZodUnknown>;\n error: z.ZodOptional<\n z.ZodObject<{\n message: z.ZodString;\n code: z.ZodOptional<z.ZodString>;\n }>\n >;\n}> = z.object({\n toolName: z.string().trim().min(1).max(256),\n args: z.record(z.string(), z.unknown()).optional(),\n jobId: chatIdSchema.optional(),\n data: z.unknown().optional(),\n error: z\n .object({\n message: z.string().max(4_096),\n code: z.string().trim().min(1).max(256).optional(),\n })\n .optional(),\n});\n\nexport const chatActionResponseSchema: Loose<{\n text: z.ZodString;\n toolResults: z.ZodOptional<z.ZodArray<typeof chatToolResultSchema>>;\n cards: z.ZodOptional<z.ZodArray<typeof chatCardSchema>>;\n pendingConfirmations: z.ZodOptional<\n z.ZodArray<typeof chatPendingConfirmationSchema>\n >;\n usage: z.ZodObject<{\n promptTokens: z.ZodNumber;\n completionTokens: z.ZodNumber;\n totalTokens: z.ZodNumber;\n }>;\n}> = z.looseObject({\n text: z.string().max(1_000_000),\n toolResults: z.array(chatToolResultSchema).max(100).optional(),\n cards: z.array(chatCardSchema).max(100).optional(),\n pendingConfirmations: z\n .array(chatPendingConfirmationSchema)\n .max(100)\n .optional(),\n usage: z.object({\n promptTokens: z.number().int().nonnegative(),\n completionTokens: z.number().int().nonnegative(),\n totalTokens: z.number().int().nonnegative(),\n }),\n});\n\nexport type ChatActionResponse = z.output<typeof chatActionResponseSchema>;\n\nexport interface ChatApiPaths {\n stream: string;\n actions: string;\n sessions: string;\n sessionArchive: string;\n messages: string;\n uploads: string;\n contextSessions: string;\n documentAttachments: string;\n imageAttachments: string;\n jobStatus: string;\n}\n\nexport function createChatApiPaths(\n apiPath: string = DEFAULT_CHAT_API_PATH,\n): ChatApiPaths {\n const normalized = normalizeChatApiPath(apiPath);\n return {\n stream: normalized,\n actions: `${normalized}/actions`,\n sessions: `${normalized}/sessions`,\n sessionArchive: `${normalized}/sessions/archive`,\n messages: `${normalized}/messages`,\n uploads: `${normalized}/uploads`,\n contextSessions: `${normalized}/context-sessions`,\n documentAttachments: `${normalized}/attachments/document`,\n imageAttachments: `${normalized}/attachments/image`,\n jobStatus: `${normalized}/jobs/status`,\n };\n}\n\nfunction normalizeChatApiPath(apiPath: string): string {\n const trimmed = apiPath.trim();\n if (\n !trimmed.startsWith(\"/\") ||\n trimmed.startsWith(\"//\") ||\n trimmed.length > 512 ||\n /[\\s\"'<>\\\\]/u.test(trimmed) ||\n trimmed.includes(\"?\") ||\n trimmed.includes(\"#\")\n ) {\n throw new Error(\n \"Chat API path must be a same-origin absolute path without query or fragment\",\n );\n }\n const normalized = trimmed.replace(/\\/+$/, \"\");\n if (normalized.length === 0) {\n throw new Error(\"Chat API path must not be the site root\");\n }\n return normalized;\n}\n\nexport const chatContextHandoffRequestSchema: Strict<{\n version: z.ZodLiteral<1>;\n sourceId: z.ZodString;\n itemId: z.ZodString;\n titleSeed: z.ZodString;\n}> = z.strictObject({\n version: z.literal(1),\n sourceId: z\n .string()\n .trim()\n .regex(/^[a-z][a-z0-9-]*$/)\n .max(64),\n itemId: z.string().trim().min(1).max(300),\n titleSeed: z\n .string()\n .trim()\n .min(1)\n .max(160)\n .refine((value) => !/[\\p{Cc}\\p{Cf}]/u.test(value)),\n});\n\nexport type ChatContextHandoffRequest = z.output<\n typeof chatContextHandoffRequestSchema\n>;\n\nexport const chatSessionSchema: Loose<{\n id: z.ZodString;\n title: z.ZodString;\n lastActiveAt: z.ZodString;\n contextHandoff: z.ZodOptional<typeof chatContextHandoffRequestSchema>;\n}> = z.looseObject({\n id: chatIdSchema,\n title: chatTitleSchema,\n lastActiveAt: chatTimestampSchema,\n contextHandoff: chatContextHandoffRequestSchema.optional(),\n});\n\nexport type ChatSession = z.output<typeof chatSessionSchema>;\n\nexport const chatSessionsResponseSchema: Loose<{\n sessions: z.ZodArray<typeof chatSessionSchema>;\n}> = z.looseObject({\n sessions: z.array(chatSessionSchema).max(100),\n});\n\nexport type ChatSessionsResponse = z.output<typeof chatSessionsResponseSchema>;\n\nexport const chatHistoryAttachmentSourceSchema: Loose<{\n kind: z.ZodString;\n id: z.ZodString;\n}> = z.looseObject({\n kind: z.string().trim().min(1).max(64),\n id: chatIdSchema,\n});\n\nexport type ChatHistoryAttachmentSource = z.output<\n typeof chatHistoryAttachmentSourceSchema\n>;\n\nexport const chatHistoryAttachmentSchema: Loose<{\n kind: z.ZodLiteral<\"text\">;\n filename: z.ZodString;\n mediaType: z.ZodString;\n sizeBytes: z.ZodNumber;\n createdAt: z.ZodString;\n source: z.ZodOptional<typeof chatHistoryAttachmentSourceSchema>;\n}> = z.looseObject({\n kind: z.literal(\"text\"),\n filename: z.string().trim().min(1).max(255),\n mediaType: z.string().trim().min(1).max(255),\n sizeBytes: z.number().int().nonnegative(),\n createdAt: chatTimestampSchema,\n source: chatHistoryAttachmentSourceSchema.optional(),\n});\n\nexport type ChatHistoryAttachment = z.output<\n typeof chatHistoryAttachmentSchema\n>;\n\nexport const chatHistoryMessageSchema: Loose<{\n id: z.ZodString;\n role: z.ZodEnum<{ user: \"user\"; assistant: \"assistant\" }>;\n content: z.ZodString;\n attachments: z.ZodOptional<z.ZodArray<typeof chatHistoryAttachmentSchema>>;\n cards: z.ZodOptional<z.ZodArray<typeof chatCardSchema>>;\n}> = z.looseObject({\n id: chatIdSchema,\n role: z.enum([\"user\", \"assistant\"]),\n content: z.string().max(1_000_000),\n attachments: z.array(chatHistoryAttachmentSchema).max(100).optional(),\n cards: z.array(chatCardSchema).max(100).optional(),\n});\n\nexport type ChatHistoryMessage = z.output<typeof chatHistoryMessageSchema>;\n\nexport const chatMessagesResponseSchema: Loose<{\n messages: z.ZodArray<typeof chatHistoryMessageSchema>;\n}> = z.looseObject({\n messages: z.array(chatHistoryMessageSchema).max(100),\n});\n\nexport type ChatMessagesResponse = z.output<typeof chatMessagesResponseSchema>;\n\nexport const chatTextPartSchema: z.ZodObject<{\n type: z.ZodLiteral<\"text\">;\n text: z.ZodString;\n}> = z.object({\n type: z.literal(\"text\"),\n text: z.string().max(1_000_000),\n});\n\nexport type ChatTextPart = z.output<typeof chatTextPartSchema>;\n\nexport const chatFilePartSchema: z.ZodObject<{\n type: z.ZodLiteral<\"file\">;\n mediaType: z.ZodOptional<z.ZodString>;\n filename: z.ZodOptional<z.ZodString>;\n url: z.ZodString;\n}> = z.object({\n type: z.literal(\"file\"),\n mediaType: z.string().trim().min(1).max(255).optional(),\n filename: z.string().trim().min(1).max(255).optional(),\n url: z.string().min(1).max(2_000_000),\n});\n\nexport type ChatFilePart = z.output<typeof chatFilePartSchema>;\n\nexport const chatUploadRefSchema: z.ZodObject<{\n kind: z.ZodLiteral<\"upload\">;\n id: z.ZodString;\n}> = z.object({\n kind: z.literal(\"upload\"),\n id: chatUploadIdSchema,\n});\n\nexport type ChatUploadRef = z.output<typeof chatUploadRefSchema>;\n\nexport const chatUploadPartSchema: z.ZodObject<{\n type: z.ZodLiteral<\"data-upload\">;\n data: Loose<{ ref: typeof chatUploadRefSchema }>;\n}> = z.object({\n type: z.literal(\"data-upload\"),\n data: z.looseObject({ ref: chatUploadRefSchema }),\n});\n\nexport type ChatUploadPart = z.output<typeof chatUploadPartSchema>;\nexport type ChatUploadPartData = ChatUploadPart[\"data\"];\n\nexport const chatApprovalResponseSchema: z.ZodObject<{\n id: z.ZodString;\n approved: z.ZodBoolean;\n toolCallId: z.ZodOptional<z.ZodString>;\n toolName: z.ZodOptional<z.ZodString>;\n input: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;\n title: z.ZodOptional<z.ZodString>;\n}> = z.object({\n id: chatIdSchema,\n approved: z.boolean(),\n toolCallId: chatIdSchema.optional(),\n toolName: z.string().trim().min(1).max(256).optional(),\n input: z.record(z.string(), z.unknown()).optional(),\n title: z.string().max(4_096).optional(),\n});\n\nexport type ChatApprovalResponse = z.output<typeof chatApprovalResponseSchema>;\n\nexport const chatApprovalResponsePartSchema: Loose<{\n state: z.ZodLiteral<\"approval-responded\">;\n toolCallId: z.ZodOptional<z.ZodString>;\n toolName: z.ZodOptional<z.ZodString>;\n input: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;\n title: z.ZodOptional<z.ZodString>;\n approval: typeof chatApprovalResponseSchema;\n}> = z.looseObject({\n state: z.literal(\"approval-responded\"),\n toolCallId: chatIdSchema.optional(),\n toolName: z.string().trim().min(1).max(256).optional(),\n input: z.record(z.string(), z.unknown()).optional(),\n title: z.string().max(4_096).optional(),\n approval: chatApprovalResponseSchema,\n});\n\nexport type ChatApprovalResponsePart = z.output<\n typeof chatApprovalResponsePartSchema\n>;\n\nexport const chatMessageSchema: z.ZodObject<{\n id: z.ZodOptional<z.ZodString>;\n role: z.ZodEnum<{ user: \"user\"; assistant: \"assistant\"; system: \"system\" }>;\n parts: z.ZodOptional<z.ZodArray<z.ZodUnknown>>;\n content: z.ZodOptional<z.ZodString>;\n}> = z.object({\n id: chatIdSchema.optional(),\n role: z.enum([\"user\", \"assistant\", \"system\"]),\n parts: z.array(z.unknown()).max(1_000).optional(),\n content: z.string().max(1_000_000).optional(),\n});\n\nexport type ChatMessage = z.output<typeof chatMessageSchema>;\nexport type ChatMessageRole = ChatMessage[\"role\"];\n\nconst chatSafeText = (max: number): z.ZodString =>\n z\n .string()\n .trim()\n .min(1)\n .max(max)\n .refine((value) => !/[\\p{Cc}\\p{Cf}]/u.test(value));\n\nexport const chatSourceContextSchema: Strict<{\n sourceId: z.ZodString;\n itemId: z.ZodString;\n label: z.ZodString;\n}> = z.strictObject({\n sourceId: z\n .string()\n .trim()\n .regex(/^[a-z][a-z0-9-]*$/)\n .max(64),\n itemId: z.string().trim().min(1).max(300),\n label: chatSafeText(160),\n});\n\nexport type ChatSourceContext = z.output<typeof chatSourceContextSchema>;\n\nexport const chatMessageRequestSchema: Strict<{\n id: z.ZodOptional<z.ZodString>;\n messages: z.ZodArray<typeof chatMessageSchema>;\n trigger: z.ZodOptional<z.ZodString>;\n inboxContext: z.ZodOptional<typeof chatSourceContextSchema>;\n}> = z\n .object({\n id: chatIdSchema.optional(),\n messages: z.array(chatMessageSchema).min(1).max(200),\n trigger: z.string().trim().min(1).max(64).optional(),\n inboxContext: chatSourceContextSchema.optional(),\n })\n .strict();\n\nexport type ChatMessageRequest = z.output<typeof chatMessageRequestSchema>;\n\nconst chatJobStatusValueSchema: z.ZodEnum<{\n pending: \"pending\";\n processing: \"processing\";\n completed: \"completed\";\n failed: \"failed\";\n}> = z.enum([\"pending\", \"processing\", \"completed\", \"failed\"]);\n\nexport type ChatJobStatusValue = z.output<typeof chatJobStatusValueSchema>;\n\nexport const chatProgressEventSchema: Loose<{\n type: z.ZodEnum<{ job: \"job\"; batch: \"batch\" }>;\n status: typeof chatJobStatusValueSchema;\n operationType: z.ZodEnum<{\n file_operations: \"file_operations\";\n content_operations: \"content_operations\";\n data_processing: \"data_processing\";\n batch_processing: \"batch_processing\";\n }>;\n operationTarget: z.ZodOptional<z.ZodString>;\n message: z.ZodOptional<z.ZodString>;\n progress: z.ZodOptional<\n z.ZodObject<{\n current: z.ZodNumber;\n total: z.ZodNumber;\n percentage: z.ZodNumber;\n }>\n >;\n}> = z.looseObject({\n type: z.enum([\"job\", \"batch\"]),\n status: chatJobStatusValueSchema,\n operationType: z.enum([\n \"file_operations\",\n \"content_operations\",\n \"data_processing\",\n \"batch_processing\",\n ]),\n operationTarget: z.string().max(1_024).optional(),\n message: z.string().max(4_096).optional(),\n progress: z\n .object({\n current: z.number().nonnegative(),\n total: z.number().nonnegative(),\n percentage: z.number().min(0).max(100),\n })\n .optional(),\n});\n\nexport type ChatProgressEvent = z.output<typeof chatProgressEventSchema>;\n\nexport const chatToolStatusEventSchema: Loose<{\n status: z.ZodEnum<{\n \"tool-running\": \"tool-running\";\n \"tool-completed\": \"tool-completed\";\n \"tool-awaiting-approval\": \"tool-awaiting-approval\";\n \"tool-failed\": \"tool-failed\";\n }>;\n toolName: z.ZodString;\n error: z.ZodOptional<z.ZodString>;\n}> = z.looseObject({\n status: z.enum([\n \"tool-running\",\n \"tool-completed\",\n \"tool-awaiting-approval\",\n \"tool-failed\",\n ]),\n toolName: z.string().trim().min(1).max(256),\n error: z.string().max(4_096).optional(),\n});\n\nexport type ChatToolStatusEvent = z.output<typeof chatToolStatusEventSchema>;\nexport type ChatToolStatusValue = ChatToolStatusEvent[\"status\"];\n\n/**\n * Version-1 wire events emitted by the Chat stream. These are transport and\n * server-owned lifecycle facts, not assembled UI messages or host view state.\n */\nexport const chatProtocolEventSchema: z.ZodDiscriminatedUnion<\n [\n Loose<{\n type: z.ZodLiteral<\"start\">;\n messageId: z.ZodOptional<z.ZodString>;\n }>,\n Loose<{ type: z.ZodLiteral<\"start-step\"> }>,\n Loose<{ type: z.ZodLiteral<\"finish-step\"> }>,\n Loose<{\n type: z.ZodLiteral<\"finish\">;\n finishReason: z.ZodOptional<\n z.ZodEnum<{\n length: \"length\";\n error: \"error\";\n stop: \"stop\";\n \"content-filter\": \"content-filter\";\n \"tool-calls\": \"tool-calls\";\n other: \"other\";\n }>\n >;\n }>,\n Loose<{\n type: z.ZodLiteral<\"abort\">;\n reason: z.ZodOptional<z.ZodString>;\n }>,\n Loose<{ type: z.ZodLiteral<\"error\">; errorText: z.ZodString }>,\n Loose<{ type: z.ZodLiteral<\"text-start\">; id: z.ZodString }>,\n Loose<{\n type: z.ZodLiteral<\"text-delta\">;\n id: z.ZodString;\n delta: z.ZodString;\n }>,\n Loose<{ type: z.ZodLiteral<\"text-end\">; id: z.ZodString }>,\n Loose<{ type: z.ZodLiteral<\"reasoning-start\">; id: z.ZodString }>,\n Loose<{\n type: z.ZodLiteral<\"reasoning-delta\">;\n id: z.ZodString;\n delta: z.ZodString;\n }>,\n Loose<{ type: z.ZodLiteral<\"reasoning-end\">; id: z.ZodString }>,\n Loose<{\n type: z.ZodLiteral<\"tool-input-start\">;\n toolCallId: z.ZodString;\n toolName: z.ZodString;\n title: z.ZodOptional<z.ZodString>;\n }>,\n Loose<{\n type: z.ZodLiteral<\"tool-input-delta\">;\n toolCallId: z.ZodString;\n inputTextDelta: z.ZodString;\n }>,\n Loose<{\n type: z.ZodLiteral<\"tool-input-available\">;\n toolCallId: z.ZodString;\n toolName: z.ZodString;\n input: z.ZodUnknown;\n title: z.ZodOptional<z.ZodString>;\n }>,\n Loose<{\n type: z.ZodLiteral<\"tool-input-error\">;\n toolCallId: z.ZodString;\n toolName: z.ZodString;\n input: z.ZodUnknown;\n errorText: z.ZodString;\n title: z.ZodOptional<z.ZodString>;\n }>,\n Loose<{\n type: z.ZodLiteral<\"tool-approval-request\">;\n approvalId: z.ZodString;\n toolCallId: z.ZodString;\n }>,\n Loose<{\n type: z.ZodLiteral<\"tool-output-available\">;\n toolCallId: z.ZodString;\n output: z.ZodUnknown;\n preliminary: z.ZodOptional<z.ZodBoolean>;\n }>,\n Loose<{\n type: z.ZodLiteral<\"tool-output-error\">;\n toolCallId: z.ZodString;\n errorText: z.ZodString;\n }>,\n Loose<{\n type: z.ZodLiteral<\"tool-output-denied\">;\n toolCallId: z.ZodString;\n }>,\n Loose<{\n type: z.ZodLiteral<\"source-url\">;\n sourceId: z.ZodString;\n url: z.ZodString;\n title: z.ZodOptional<z.ZodString>;\n }>,\n Loose<{\n type: z.ZodLiteral<\"source-document\">;\n sourceId: z.ZodString;\n mediaType: z.ZodString;\n title: z.ZodString;\n filename: z.ZodOptional<z.ZodString>;\n }>,\n Loose<{\n type: z.ZodLiteral<\"file\">;\n url: z.ZodString;\n mediaType: z.ZodString;\n }>,\n Loose<{\n type: z.ZodLiteral<\"data-progress\">;\n id: z.ZodOptional<z.ZodString>;\n data: typeof chatProgressEventSchema;\n transient: z.ZodOptional<z.ZodBoolean>;\n }>,\n Loose<{\n type: z.ZodLiteral<\"data-status\">;\n id: z.ZodOptional<z.ZodString>;\n data: typeof chatToolStatusEventSchema;\n transient: z.ZodOptional<z.ZodBoolean>;\n }>,\n Loose<{\n type: z.ZodLiteral<\"data-tool-result\">;\n id: z.ZodOptional<z.ZodString>;\n data: typeof chatToolResultSchema;\n transient: z.ZodOptional<z.ZodBoolean>;\n }>,\n Loose<{\n type: z.ZodLiteral<\"data-actions\">;\n id: z.ZodOptional<z.ZodString>;\n data: typeof chatActionsCardSchema;\n transient: z.ZodOptional<z.ZodBoolean>;\n }>,\n Loose<{\n type: z.ZodLiteral<\"data-sources\">;\n id: z.ZodOptional<z.ZodString>;\n data: typeof chatSourcesCardSchema;\n transient: z.ZodOptional<z.ZodBoolean>;\n }>,\n Loose<{\n type: z.ZodLiteral<\"data-attachment\">;\n id: z.ZodOptional<z.ZodString>;\n data: typeof chatAttachmentCardSchema;\n transient: z.ZodOptional<z.ZodBoolean>;\n }>,\n ],\n \"type\"\n> = z.discriminatedUnion(\"type\", [\n z.looseObject({\n type: z.literal(\"start\"),\n messageId: chatIdSchema.optional(),\n }),\n z.looseObject({ type: z.literal(\"start-step\") }),\n z.looseObject({ type: z.literal(\"finish-step\") }),\n z.looseObject({\n type: z.literal(\"finish\"),\n finishReason: z\n .enum([\n \"length\",\n \"error\",\n \"stop\",\n \"content-filter\",\n \"tool-calls\",\n \"other\",\n ])\n .optional(),\n }),\n z.looseObject({\n type: z.literal(\"abort\"),\n reason: z.string().max(4_096).optional(),\n }),\n z.looseObject({\n type: z.literal(\"error\"),\n errorText: z.string().max(20_000),\n }),\n z.looseObject({ type: z.literal(\"text-start\"), id: chatIdSchema }),\n z.looseObject({\n type: z.literal(\"text-delta\"),\n id: chatIdSchema,\n delta: z.string().max(1_000_000),\n }),\n z.looseObject({ type: z.literal(\"text-end\"), id: chatIdSchema }),\n z.looseObject({\n type: z.literal(\"reasoning-start\"),\n id: chatIdSchema,\n }),\n z.looseObject({\n type: z.literal(\"reasoning-delta\"),\n id: chatIdSchema,\n delta: z.string().max(1_000_000),\n }),\n z.looseObject({\n type: z.literal(\"reasoning-end\"),\n id: chatIdSchema,\n }),\n z.looseObject({\n type: z.literal(\"tool-input-start\"),\n toolCallId: chatIdSchema,\n toolName: z.string().trim().min(1).max(256),\n title: z.string().max(4_096).optional(),\n }),\n z.looseObject({\n type: z.literal(\"tool-input-delta\"),\n toolCallId: chatIdSchema,\n inputTextDelta: z.string().max(1_000_000),\n }),\n z.looseObject({\n type: z.literal(\"tool-input-available\"),\n toolCallId: chatIdSchema,\n toolName: z.string().trim().min(1).max(256),\n input: z.unknown(),\n title: z.string().max(4_096).optional(),\n }),\n z.looseObject({\n type: z.literal(\"tool-input-error\"),\n toolCallId: chatIdSchema,\n toolName: z.string().trim().min(1).max(256),\n input: z.unknown(),\n errorText: z.string().max(20_000),\n title: z.string().max(4_096).optional(),\n }),\n z.looseObject({\n type: z.literal(\"tool-approval-request\"),\n approvalId: chatIdSchema,\n toolCallId: chatIdSchema,\n }),\n z.looseObject({\n type: z.literal(\"tool-output-available\"),\n toolCallId: chatIdSchema,\n output: z.unknown(),\n preliminary: z.boolean().optional(),\n }),\n z.looseObject({\n type: z.literal(\"tool-output-error\"),\n toolCallId: chatIdSchema,\n errorText: z.string().max(20_000),\n }),\n z.looseObject({\n type: z.literal(\"tool-output-denied\"),\n toolCallId: chatIdSchema,\n }),\n z.looseObject({\n type: z.literal(\"source-url\"),\n sourceId: chatIdSchema,\n url: chatLinkUrlSchema,\n title: z.string().max(4_096).optional(),\n }),\n z.looseObject({\n type: z.literal(\"source-document\"),\n sourceId: chatIdSchema,\n mediaType: z.string().trim().min(1).max(255),\n title: z.string().max(4_096),\n filename: z.string().trim().min(1).max(255).optional(),\n }),\n z.looseObject({\n type: z.literal(\"file\"),\n url: chatLinkUrlSchema,\n mediaType: z.string().trim().min(1).max(255),\n }),\n z.looseObject({\n type: z.literal(\"data-progress\"),\n id: chatIdSchema.optional(),\n data: chatProgressEventSchema,\n transient: z.boolean().optional(),\n }),\n z.looseObject({\n type: z.literal(\"data-status\"),\n id: chatIdSchema.optional(),\n data: chatToolStatusEventSchema,\n transient: z.boolean().optional(),\n }),\n z.looseObject({\n type: z.literal(\"data-tool-result\"),\n id: chatIdSchema.optional(),\n data: chatToolResultSchema,\n transient: z.boolean().optional(),\n }),\n z.looseObject({\n type: z.literal(\"data-actions\"),\n id: chatIdSchema.optional(),\n data: chatActionsCardSchema,\n transient: z.boolean().optional(),\n }),\n z.looseObject({\n type: z.literal(\"data-sources\"),\n id: chatIdSchema.optional(),\n data: chatSourcesCardSchema,\n transient: z.boolean().optional(),\n }),\n z.looseObject({\n type: z.literal(\"data-attachment\"),\n id: chatIdSchema.optional(),\n data: chatAttachmentCardSchema,\n transient: z.boolean().optional(),\n }),\n]);\n\nexport type ChatProtocolEvent = z.output<typeof chatProtocolEventSchema>;\n\nexport const chatContextHandoffResponseSchema: Strict<{\n conversationId: z.ZodString;\n}> = z.strictObject({\n conversationId: chatIdSchema,\n});\n\nexport type ChatContextHandoffResponse = z.output<\n typeof chatContextHandoffResponseSchema\n>;\n\nexport const renameChatSessionRequestSchema: Strict<{\n title: z.ZodString;\n}> = z\n .object({\n title: chatTitleSchema,\n })\n .strict();\n\nexport type RenameChatSessionRequest = z.output<\n typeof renameChatSessionRequestSchema\n>;\n\nexport const renameChatSessionResponseSchema: z.ZodObject<{\n renamed: z.ZodBoolean;\n title: z.ZodString;\n}> = z.object({\n renamed: z.boolean(),\n title: chatTitleSchema,\n});\n\nexport type RenameChatSessionResponse = z.output<\n typeof renameChatSessionResponseSchema\n>;\n\nexport const archiveChatSessionResponseSchema: z.ZodObject<{\n archived: z.ZodBoolean;\n}> = z.object({\n archived: z.boolean(),\n});\n\nexport type ArchiveChatSessionResponse = z.output<\n typeof archiveChatSessionResponseSchema\n>;\n\nexport const deleteChatSessionResponseSchema: z.ZodObject<{\n deleted: z.ZodBoolean;\n}> = z.object({\n deleted: z.boolean(),\n});\n\nexport type DeleteChatSessionResponse = z.output<\n typeof deleteChatSessionResponseSchema\n>;\n\nexport const chatActionRequestSchema: Strict<{\n conversationId: z.ZodString;\n action: typeof agentEventActionSchema;\n}> = z\n .object({\n conversationId: chatIdSchema,\n action: agentEventActionSchema,\n })\n .strict();\n\nexport type ChatActionRequest = z.output<typeof chatActionRequestSchema>;\n\nexport const chatJobStatusSchema: Loose<{\n id: z.ZodString;\n status: typeof chatJobStatusValueSchema;\n message: z.ZodOptional<z.ZodString>;\n}> = z.looseObject({\n id: chatIdSchema,\n status: chatJobStatusValueSchema,\n message: z.string().max(4_096).optional(),\n});\n\nexport type ChatJobStatus = z.output<typeof chatJobStatusSchema>;\n\nexport const chatUploadResponseSchema: Loose<{\n id: z.ZodString;\n ref: typeof chatUploadRefSchema;\n filename: z.ZodString;\n mediaType: z.ZodString;\n sizeBytes: z.ZodNumber;\n createdAt: z.ZodString;\n url: z.ZodString;\n downloadUrl: z.ZodString;\n}> = z\n .looseObject({\n id: chatUploadIdSchema,\n ref: chatUploadRefSchema,\n filename: z.string().trim().min(1).max(255),\n mediaType: z.string().trim().min(1).max(255),\n sizeBytes: z.number().int().nonnegative(),\n createdAt: chatTimestampSchema,\n url: chatRelativeUrlSchema,\n downloadUrl: chatRelativeUrlSchema,\n })\n .refine((upload) => upload.id === upload.ref.id, {\n path: [\"ref\", \"id\"],\n message: \"Upload response ids must match\",\n });\n\nexport type ChatUploadResponse = z.output<typeof chatUploadResponseSchema>;\n\nexport type ChatFetch = (\n input: RequestInfo | URL,\n init?: RequestInit,\n) => Promise<Response>;\n\nexport interface ChatClientOptions {\n apiPath?: string | undefined;\n fetch?: ChatFetch | undefined;\n credentials?: RequestCredentials | undefined;\n}\n\nexport interface ChatClient {\n readonly version: typeof CHAT_API_VERSION;\n readonly paths: ChatApiPaths;\n streamMessages(\n request: ChatMessageRequest,\n options?: { signal?: AbortSignal | undefined },\n ): Promise<Response>;\n listSessions(): Promise<ChatSession[]>;\n getMessages(conversationId: string): Promise<ChatHistoryMessage[]>;\n renameSession(\n conversationId: string,\n title: string,\n ): Promise<RenameChatSessionResponse>;\n archiveSession(conversationId: string): Promise<ArchiveChatSessionResponse>;\n deleteSession(conversationId: string): Promise<DeleteChatSessionResponse>;\n getJobStatus(jobId: string): Promise<ChatJobStatus>;\n openContextSession(\n request: ChatContextHandoffRequest,\n ): Promise<ChatContextHandoffResponse>;\n runAction(request: ChatActionRequest): Promise<ChatActionResponse>;\n upload(file: Blob, filename: string): Promise<ChatUploadResponse>;\n getUploadUrl(uploadId: string, download?: boolean): string;\n getDocumentAttachmentUrl(documentId: string, download?: boolean): string;\n getImageAttachmentUrl(imageId: string, download?: boolean): string;\n}\n\nexport type ChatApiErrorKind = \"http\" | \"invalid-response\";\n\nexport class ChatApiError extends Error {\n public readonly operation: string;\n public readonly status: number;\n public readonly kind: ChatApiErrorKind;\n\n public constructor(\n operation: string,\n status: number,\n kind: ChatApiErrorKind = \"http\",\n ) {\n super(`Chat API could not ${operation} (${status})`);\n this.name = \"ChatApiError\";\n this.operation = operation;\n this.status = status;\n this.kind = kind;\n }\n}\n\nfunction parseChatProtocolLine(line: string): ChatProtocolEvent | undefined {\n const normalized = line.endsWith(\"\\r\") ? line.slice(0, -1) : line;\n if (!normalized.startsWith(\"data:\")) return undefined;\n const payload = normalized.slice(5).trimStart();\n if (payload.length === 0 || payload === \"[DONE]\") return undefined;\n\n let value: unknown;\n try {\n value = JSON.parse(payload);\n } catch {\n throw new ChatApiError(\"read stream\", 502, \"invalid-response\");\n }\n const parsed = chatProtocolEventSchema.safeParse(value);\n if (!parsed.success) {\n throw new ChatApiError(\"read stream\", 502, \"invalid-response\");\n }\n return parsed.data;\n}\n\n/** Decode the versioned SSE protocol without assembling host-owned UI state. */\nexport async function* readChatProtocolEvents(\n response: Response,\n): AsyncGenerator<ChatProtocolEvent> {\n if (!response.ok) {\n throw new ChatApiError(\"read stream\", response.status);\n }\n if (!response.body) {\n throw new ChatApiError(\"read stream\", 502, \"invalid-response\");\n }\n\n const reader = response.body.getReader();\n const decoder = new TextDecoder();\n let buffered = \"\";\n try {\n for (;;) {\n const { value, done } = await reader.read();\n buffered += decoder.decode(value, { stream: !done });\n let newline = buffered.indexOf(\"\\n\");\n while (newline >= 0) {\n const line = buffered.slice(0, newline);\n buffered = buffered.slice(newline + 1);\n const event = parseChatProtocolLine(line);\n if (event) yield event;\n newline = buffered.indexOf(\"\\n\");\n }\n if (done) break;\n }\n if (buffered.length > 0) {\n const event = parseChatProtocolLine(buffered);\n if (event) yield event;\n }\n } finally {\n reader.releaseLock();\n }\n}\n\nexport function createChatClient(options: ChatClientOptions = {}): ChatClient {\n const paths = createChatApiPaths(options.apiPath);\n const fetchFn = options.fetch ?? globalThis.fetch;\n const credentials = options.credentials ?? \"include\";\n\n async function requestJson<T>(\n operation: string,\n url: string,\n schema: z.ZodType<T>,\n init?: RequestInit,\n ): Promise<T> {\n const response = await fetchFn(url, {\n ...init,\n credentials,\n });\n if (!response.ok) {\n throw new ChatApiError(operation, response.status);\n }\n\n let body: unknown;\n try {\n body = await response.json();\n } catch {\n throw new ChatApiError(operation, 502, \"invalid-response\");\n }\n const parsed = schema.safeParse(body);\n if (!parsed.success) {\n throw new ChatApiError(operation, 502, \"invalid-response\");\n }\n return parsed.data;\n }\n\n function withId(path: string, id: string): string {\n const parsedId = chatIdSchema.parse(id);\n return `${path}?id=${encodeURIComponent(parsedId)}`;\n }\n\n function withDownload(path: string, id: string, download: boolean): string {\n const base = withId(path, id);\n return download ? `${base}&download=1` : base;\n }\n\n return {\n version: CHAT_API_VERSION,\n paths,\n async streamMessages(\n request: ChatMessageRequest,\n streamOptions: { signal?: AbortSignal | undefined } = {},\n ): Promise<Response> {\n const body = chatMessageRequestSchema.parse(request);\n const response = await fetchFn(paths.stream, {\n method: \"POST\",\n credentials,\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify(body),\n ...(streamOptions.signal ? { signal: streamOptions.signal } : {}),\n });\n if (!response.ok) {\n throw new ChatApiError(\"send messages\", response.status);\n }\n return response;\n },\n async listSessions(): Promise<ChatSession[]> {\n const response = await requestJson(\n \"list sessions\",\n paths.sessions,\n chatSessionsResponseSchema,\n );\n return response.sessions;\n },\n async getMessages(conversationId: string): Promise<ChatHistoryMessage[]> {\n const response = await requestJson(\n \"load messages\",\n withId(paths.messages, conversationId),\n chatMessagesResponseSchema,\n );\n return response.messages;\n },\n async renameSession(\n conversationId: string,\n title: string,\n ): Promise<RenameChatSessionResponse> {\n const body = renameChatSessionRequestSchema.parse({ title });\n return requestJson(\n \"rename session\",\n withId(paths.sessions, conversationId),\n renameChatSessionResponseSchema,\n {\n method: \"PUT\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify(body),\n },\n );\n },\n async archiveSession(\n conversationId: string,\n ): Promise<ArchiveChatSessionResponse> {\n return requestJson(\n \"archive session\",\n withId(paths.sessionArchive, conversationId),\n archiveChatSessionResponseSchema,\n { method: \"PUT\" },\n );\n },\n async deleteSession(\n conversationId: string,\n ): Promise<DeleteChatSessionResponse> {\n return requestJson(\n \"delete session\",\n withId(paths.sessions, conversationId),\n deleteChatSessionResponseSchema,\n { method: \"DELETE\" },\n );\n },\n getJobStatus(jobId: string): Promise<ChatJobStatus> {\n return requestJson(\n \"load job status\",\n withId(paths.jobStatus, jobId),\n chatJobStatusSchema,\n );\n },\n openContextSession(\n request: ChatContextHandoffRequest,\n ): Promise<ChatContextHandoffResponse> {\n return requestJson(\n \"open context session\",\n paths.contextSessions,\n chatContextHandoffResponseSchema,\n {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify(chatContextHandoffRequestSchema.parse(request)),\n },\n );\n },\n runAction(request: ChatActionRequest): Promise<ChatActionResponse> {\n const body = chatActionRequestSchema.parse(request);\n return requestJson(\n \"run action\",\n paths.actions,\n chatActionResponseSchema,\n {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify(body),\n },\n );\n },\n async upload(file: Blob, filename: string): Promise<ChatUploadResponse> {\n const normalizedFilename = z\n .string()\n .trim()\n .min(1)\n .max(255)\n .parse(filename);\n const form = new FormData();\n form.set(\"file\", file, normalizedFilename);\n return requestJson(\n \"upload file\",\n paths.uploads,\n chatUploadResponseSchema,\n {\n method: \"POST\",\n body: form,\n },\n );\n },\n getUploadUrl(uploadId: string, download = false): string {\n return withDownload(paths.uploads, uploadId, download);\n },\n getDocumentAttachmentUrl(documentId: string, download = false): string {\n return withDownload(paths.documentAttachments, documentId, download);\n },\n getImageAttachmentUrl(imageId: string, download = false): string {\n return withDownload(paths.imageAttachments, imageId, download);\n },\n };\n}\n",
|
|
8
|
-
"/** @jsxImportSource react */\nimport { libraryStyles as library } from \"./studio-library.styles\";\nimport {\n Button,\n Dialog,\n DialogContent,\n DialogTitle,\n} from \"@brains/app-ui-react\";\nimport { chatClass, chatLayout } from \"./studio-chat-layout.styles\";\nimport {\n StudioChatDraftStore,\n studioChatDraftKey,\n type StudioChatNavigationState,\n} from \"./studio-chat-drafts\";\nimport { StudioPageHead, studioAccessRequirement } from \"./studio-page-head\";\nimport {\n createChatClient,\n readChatProtocolEvents,\n type ChatCard,\n type ChatHistoryMessage,\n type ChatMessage,\n type ChatSession,\n type ChatUploadResponse,\n} from \"@brains/contracts/chat\";\nimport { useQuery, useQueryClient } from \"@tanstack/react-query\";\nimport {\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n useSyncExternalStore,\n type ChangeEvent,\n type FormEvent,\n type KeyboardEvent,\n type ReactElement,\n} from \"react\";\nimport {\n STUDIO_CHAT_WORKSPACE_ID,\n studioChatWorkspacePath,\n} from \"../../src/chat-workspace\";\nimport type { EntityTypeInfo, StudioWorkspaceInfo } from \"./api\";\nimport type { StudioChatHandoff } from \"./operator-launch\";\nimport {\n approvalResponseMessage,\n createStudioChatStreamState,\n reduceStudioChatStream,\n streamAssistantMessage,\n type StudioChatApproval,\n type StudioChatStreamState,\n} from \"./chat-workspace-model\";\nimport { TypeSwitcher } from \"./entity-fields\";\nimport { useStudioNavigationCollapsed } from \"./studio-navigation-state\";\nimport { StudioChrome } from \"./studio-chrome\";\nimport { StudioMarkdown } from \"./studio-markdown\";\nimport {\n navigationClassName as navClass,\n navigationStyles as nav,\n} from \"./studio-navigation.styles\";\n\nconst studioChatKeys = {\n sessions: [\"studio\", \"chat\", \"sessions\"] as const,\n messages: (conversationId: string) =>\n [\"studio\", \"chat\", \"messages\", conversationId] as const,\n};\n\ntype ChatActionCard = Extract<ChatCard, { kind: \"actions\" }>;\ntype ChatSuggestedAction = ChatActionCard[\"actions\"][number];\n\nexport interface StudioChatWorkspaceProps {\n apiPath?: string | undefined;\n draftStore?: StudioChatDraftStore | undefined;\n onNavigationStateChange?:\n ((state: StudioChatNavigationState) => void) | undefined;\n studioBasePath: string;\n sessionId: string | null;\n types: EntityTypeInfo[];\n workspaces: StudioWorkspaceInfo[];\n handoff: StudioChatHandoff | null;\n navigate: (href: string, options?: { preserveWork?: boolean }) => void;\n selectEntityType: (entityType: string) => void;\n selectWorkspace: (workspaceId: string) => void;\n}\n\nexport function StudioChatWorkspace(\n props: StudioChatWorkspaceProps,\n): ReactElement {\n const queryClient = useQueryClient();\n const chatClient = useMemo(\n () =>\n createChatClient({\n apiPath: props.apiPath,\n fetch: (input, init) => globalThis.fetch(input, init),\n }),\n [props.apiPath],\n );\n const [localDraftStore] = useState(() => new StudioChatDraftStore());\n const draftStore = props.draftStore ?? localDraftStore;\n const draftKey = studioChatDraftKey(props.apiPath, props.sessionId);\n const currentDraftKey = useRef(draftKey);\n currentDraftKey.current = draftKey;\n const { text: draft, uploads } = useSyncExternalStore(\n draftStore.subscribe,\n () => draftStore.read(draftKey),\n () => draftStore.read(draftKey),\n );\n const setDraft = useCallback(\n (text: string) => draftStore.update(draftKey, { text }),\n [draftStore, draftKey],\n );\n const setUploads = useCallback(\n (\n value:\n | ChatUploadResponse[]\n | ((current: ChatUploadResponse[]) => ChatUploadResponse[]),\n ) =>\n draftStore.update(draftKey, {\n uploads:\n typeof value === \"function\"\n ? value(draftStore.read(draftKey).uploads)\n : value,\n }),\n [draftStore, draftKey],\n );\n const [pendingMessages, setPendingMessages] = useState<ChatHistoryMessage[]>(\n [],\n );\n const [stream, setStream] = useState<StudioChatStreamState | null>(null);\n const [sending, setSending] = useState(false);\n const [archiving, setArchiving] = useState(false);\n const [uploading, setUploading] = useState(false);\n const [error, setError] = useState<string | null>(null);\n useEffect(() => {\n props.onNavigationStateChange?.({\n hasDraft: Boolean(draft || uploads.length),\n busy: sending || uploading,\n });\n }, [draft, uploads, sending, uploading, props.onNavigationStateChange]);\n useEffect(\n () => (): void =>\n props.onNavigationStateChange?.({ hasDraft: false, busy: false }),\n [props.onNavigationStateChange],\n );\n const navigationCollapsed = useStudioNavigationCollapsed();\n const [contextOpen, setContextOpen] = useState(false);\n const [sessionPickerOpen, setSessionPickerOpen] = useState(false);\n const sessionPickerTrigger = useRef<HTMLSpanElement>(null);\n const threadEndRef = useRef<HTMLDivElement | null>(null);\n const activeStreamRef = useRef<AbortController | null>(null);\n const mountedRef = useRef(false);\n useEffect(() => {\n mountedRef.current = true;\n return (): void => {\n mountedRef.current = false;\n const active = activeStreamRef.current;\n activeStreamRef.current = null;\n active?.abort();\n };\n }, []);\n const handledHandoffRef = useRef<string | null>(null);\n const adoptedSessionRef = useRef<string | null>(null);\n\n const sessionsQuery = useQuery({\n queryKey: studioChatKeys.sessions,\n queryFn: () => chatClient.listSessions(),\n });\n const messagesQuery = useQuery({\n queryKey: studioChatKeys.messages(props.sessionId ?? \"\"),\n queryFn: () => chatClient.getMessages(props.sessionId ?? \"\"),\n // A newly accepted session already has an optimistic copy of its first\n // turn. Wait for the completed stream to replace that copy atomically.\n enabled:\n props.sessionId !== null && !sending && pendingMessages.length === 0,\n });\n const sessions = sessionsQuery.data ?? [];\n const showSessionRail = sessionsQuery.isPending || sessions.length > 0;\n const storedMessages = messagesQuery.data ?? [];\n const currentSession = sessions.find(\n (session) => session.id === props.sessionId,\n );\n const visibleMessages = useMemo(() => {\n const next = [...storedMessages, ...pendingMessages];\n if (stream && (stream.text || stream.cards.length > 0)) {\n next.push(streamAssistantMessage(stream));\n }\n return next;\n }, [pendingMessages, storedMessages, stream]);\n const contextCards = useMemo(\n () =>\n visibleMessages.flatMap((message) =>\n (message.cards ?? []).filter(\n (card) => card.kind === \"sources\" || card.kind === \"attachment\",\n ),\n ),\n [visibleMessages],\n );\n\n useEffect(() => {\n if (props.sessionId && adoptedSessionRef.current === props.sessionId) {\n adoptedSessionRef.current = null;\n return;\n }\n const active = activeStreamRef.current;\n activeStreamRef.current = null;\n active?.abort();\n setSending(false);\n setPendingMessages([]);\n setStream(null);\n setUploading(false);\n setArchiving(false);\n setError(null);\n }, [props.sessionId]);\n\n useEffect(() => {\n threadEndRef.current?.scrollIntoView({ block: \"end\" });\n }, [stream?.text, visibleMessages.length]);\n\n const navigateToSession = useCallback(\n (conversationId?: string, preserveWork = false): void => {\n props.navigate(\n studioChatWorkspacePath(props.studioBasePath, conversationId),\n { preserveWork },\n );\n setSessionPickerOpen(false);\n },\n [props.navigate, props.studioBasePath],\n );\n\n useEffect(() => {\n if (!props.handoff || props.sessionId) return;\n const handoffKey = `${props.handoff.sourceId}\\u0000${props.handoff.itemId}`;\n if (handledHandoffRef.current === handoffKey) return;\n handledHandoffRef.current = handoffKey;\n setDraft(props.handoff.prompt);\n setError(null);\n void chatClient\n .openContextSession({\n version: 1,\n sourceId: props.handoff.sourceId,\n itemId: props.handoff.itemId,\n titleSeed: props.handoff.label,\n })\n .then(({ conversationId }) => {\n if (\n !mountedRef.current ||\n currentDraftKey.current !== draftKey ||\n handledHandoffRef.current !== handoffKey\n )\n return;\n draftStore.adopt(\n draftKey,\n studioChatDraftKey(props.apiPath, conversationId),\n );\n navigateToSession(conversationId, true);\n })\n .catch((cause: unknown) => {\n if (\n !mountedRef.current ||\n currentDraftKey.current !== draftKey ||\n handledHandoffRef.current !== handoffKey\n )\n return;\n handledHandoffRef.current = null;\n setError(errorMessage(cause, \"Context could not be attached\"));\n });\n }, [\n chatClient,\n navigateToSession,\n props.handoff,\n props.sessionId,\n props.apiPath,\n draftStore,\n draftKey,\n setDraft,\n ]);\n\n const runStream = useCallback(\n async (\n conversationId: string,\n messages: ChatMessage[],\n onAccepted?: () => void,\n ): Promise<boolean> => {\n activeStreamRef.current?.abort();\n const controller = new AbortController();\n activeStreamRef.current = controller;\n setSending(true);\n setError(null);\n let next = createStudioChatStreamState();\n setStream(next);\n let accepted = false;\n let retained = false;\n const retainResponse = (): void => {\n if (retained || (!next.text && next.cards.length === 0)) return;\n retained = true;\n const message = streamAssistantMessage(next);\n setPendingMessages((current) => [...current, message]);\n setStream({ ...next, text: \"\", cards: [] });\n };\n try {\n const response = await chatClient.streamMessages(\n {\n id: conversationId,\n messages,\n trigger: \"submit-message\",\n },\n { signal: controller.signal },\n );\n accepted = true;\n onAccepted?.();\n for await (const event of readChatProtocolEvents(response)) {\n if (activeStreamRef.current !== controller) return accepted;\n next = reduceStudioChatStream(next, event);\n setStream(next);\n }\n if (activeStreamRef.current !== controller) return accepted;\n retainResponse();\n try {\n const authoritativeMessages =\n await chatClient.getMessages(conversationId);\n if (activeStreamRef.current !== controller) return accepted;\n queryClient.setQueryData(\n studioChatKeys.messages(conversationId),\n authoritativeMessages,\n );\n setPendingMessages([]);\n } catch {\n // The completed response remains visible from the optimistic state;\n // a later session visit can retry the authoritative history read.\n }\n await queryClient.invalidateQueries({\n queryKey: studioChatKeys.sessions,\n });\n } catch (cause) {\n if (activeStreamRef.current !== controller) return accepted;\n retainResponse();\n if (!controller.signal.aborted)\n setError(errorMessage(cause, \"Chat could not complete the response\"));\n } finally {\n if (activeStreamRef.current === controller) {\n activeStreamRef.current = null;\n setSending(false);\n }\n }\n return accepted;\n },\n [chatClient, queryClient],\n );\n\n const submitPrompt = useCallback(\n async (prompt: string): Promise<void> => {\n const text = prompt.trim();\n if ((!text && uploads.length === 0) || sending || uploading) return;\n const conversationId = props.sessionId ?? `web-${crypto.randomUUID()}`;\n const sentKey = studioChatDraftKey(props.apiPath, conversationId);\n const messageId = crypto.randomUUID();\n const uploadParts = uploads.map((upload) => ({\n type: \"data-upload\" as const,\n data: { ref: upload.ref },\n }));\n const parts = [\n ...(text ? [{ type: \"text\" as const, text }] : []),\n ...uploadParts,\n ];\n setPendingMessages((current) => [\n ...current,\n {\n id: messageId,\n role: \"user\",\n content: text || uploads.map((upload) => upload.filename).join(\", \"),\n },\n ]);\n const accepted = await runStream(\n conversationId,\n [{ id: messageId, role: \"user\", parts }],\n () => {\n if (\n !props.sessionId &&\n mountedRef.current &&\n currentDraftKey.current === draftKey\n ) {\n draftStore.adopt(draftKey, sentKey);\n adoptedSessionRef.current = conversationId;\n navigateToSession(conversationId, true);\n }\n const current = draftStore.read(sentKey);\n draftStore.update(sentKey, {\n text: current.text === prompt ? \"\" : current.text,\n uploads: current.uploads.filter(\n (upload) => !uploads.some((sent) => sent.id === upload.id),\n ),\n });\n },\n );\n if (\n !accepted &&\n (currentDraftKey.current === sentKey ||\n (!props.sessionId && currentDraftKey.current === draftKey))\n )\n setPendingMessages((current) =>\n current.filter((message) => message.id !== messageId),\n );\n },\n [\n navigateToSession,\n props.sessionId,\n props.apiPath,\n draftStore,\n draftKey,\n runStream,\n sending,\n uploading,\n uploads,\n ],\n );\n\n const submit = (event: FormEvent<HTMLFormElement>): void => {\n event.preventDefault();\n void submitPrompt(draft);\n };\n\n const respondToApproval = useCallback(\n async (approval: StudioChatApproval, approved: boolean): Promise<void> => {\n if (!props.sessionId || sending) return;\n await runStream(props.sessionId, [\n approvalResponseMessage(approval, approved),\n ]);\n },\n [props.sessionId, runStream, sending],\n );\n\n const runSuggestedAction = useCallback(\n async (action: ChatSuggestedAction): Promise<void> => {\n if (action.type === \"prompt\") {\n await submitPrompt(action.prompt);\n return;\n }\n if (!props.sessionId || sending) return;\n setSending(true);\n setError(null);\n try {\n const result = await chatClient.runAction({\n conversationId: props.sessionId,\n action: {\n type: \"event\",\n event: action.event,\n ...(action.fromState ? { fromState: action.fromState } : {}),\n },\n });\n if (!mountedRef.current || currentDraftKey.current !== draftKey) return;\n setPendingMessages((current) => [\n ...current,\n {\n id: crypto.randomUUID(),\n role: \"assistant\",\n content: result.text,\n ...(result.cards ? { cards: result.cards } : {}),\n },\n ]);\n } catch (cause) {\n if (mountedRef.current && currentDraftKey.current === draftKey)\n setError(errorMessage(cause, \"Chat action failed\"));\n } finally {\n if (mountedRef.current && currentDraftKey.current === draftKey)\n setSending(false);\n }\n },\n [chatClient, props.sessionId, sending, submitPrompt, draftKey],\n );\n\n const uploadFiles = useCallback(\n async (event: ChangeEvent<HTMLInputElement>): Promise<void> => {\n const files = Array.from(event.target.files ?? []);\n event.target.value = \"\";\n if (files.length === 0) return;\n setUploading(true);\n setError(null);\n try {\n const uploaded = await Promise.all(\n files.map((file) => chatClient.upload(file, file.name)),\n );\n setUploads((current) => [...current, ...uploaded]);\n } catch (cause) {\n if (mountedRef.current && currentDraftKey.current === draftKey)\n setError(errorMessage(cause, \"Upload failed\"));\n } finally {\n if (mountedRef.current && currentDraftKey.current === draftKey)\n setUploading(false);\n }\n },\n [chatClient, setUploads, draftKey],\n );\n\n const archiveCurrent = useCallback(async (): Promise<void> => {\n if (!props.sessionId || sending || uploading || draft || uploads.length)\n return;\n setSending(true);\n setArchiving(true);\n try {\n await chatClient.archiveSession(props.sessionId);\n await queryClient.invalidateQueries({\n queryKey: studioChatKeys.sessions,\n });\n if (mountedRef.current && currentDraftKey.current === draftKey)\n navigateToSession(undefined, true);\n } catch (cause) {\n if (mountedRef.current && currentDraftKey.current === draftKey)\n setError(errorMessage(cause, \"Conversation could not be archived\"));\n } finally {\n if (mountedRef.current && currentDraftKey.current === draftKey) {\n setSending(false);\n setArchiving(false);\n }\n }\n }, [\n chatClient,\n navigateToSession,\n props.sessionId,\n queryClient,\n sending,\n uploading,\n draft,\n uploads.length,\n draftKey,\n ]);\n\n const workspaceBadges = Object.fromEntries(\n props.workspaces.flatMap((workspace) =>\n workspace.badge === undefined ? [] : [[workspace.id, workspace.badge]],\n ),\n );\n\n return (\n <div\n className={chatClass(\"studio\", library.frame, chatLayout.root)}\n data-view=\"chat\"\n data-studio-shell=\"\"\n >\n <StudioChrome\n contextLabel=\"Chat\"\n navigation={{\n types: props.types,\n workspaces: props.workspaces,\n activeEntityType: null,\n activeWorkspaceId: STUDIO_CHAT_WORKSPACE_ID,\n workspaceBadges,\n selectEntityType: props.selectEntityType,\n selectWorkspace: props.selectWorkspace,\n }}\n />\n <div\n className={navClass(\n \"studio-chat-shell\",\n chatLayout.shell,\n nav.shell,\n navigationCollapsed && nav.shellCollapsed,\n )}\n >\n <aside className={navClass(\"rail studio-chat-studio-rail\", nav.rail)}>\n <TypeSwitcher\n renderMode=\"desktop\"\n types={props.types}\n active={null}\n onSelect={props.selectEntityType}\n workspaces={props.workspaces}\n activeWorkspace={STUDIO_CHAT_WORKSPACE_ID}\n workspaceBadges={workspaceBadges}\n onSelectWorkspace={props.selectWorkspace}\n />\n </aside>\n <main className={chatClass(\"studio-chat-workspace\", chatLayout.frame)}>\n <StudioPageHead\n model={{\n title: \"Chat\",\n totals: [],\n access: studioAccessRequirement(\"trusted\"),\n }}\n action={\n <div\n className={chatClass(\n \"studio-chat-head-actions\",\n chatLayout.actions,\n )}\n >\n <span\n ref={sessionPickerTrigger}\n className=\"studio-chat-mobile-sessions\"\n >\n <Button\n aria-expanded={sessionPickerOpen}\n aria-haspopup=\"dialog\"\n variant=\"outline\"\n type=\"button\"\n onClick={() => setSessionPickerOpen(true)}\n >\n Sessions\n </Button>\n </span>\n <Button\n variant=\"outline\"\n type=\"button\"\n onClick={() => navigateToSession()}\n >\n New conversation\n </Button>\n </div>\n }\n />\n <Dialog\n open={sessionPickerOpen}\n onOpenChange={(open) => {\n setSessionPickerOpen(open);\n }}\n >\n <DialogContent\n aria-describedby={undefined}\n onCloseAutoFocus={(event) => {\n event.preventDefault();\n sessionPickerTrigger.current?.querySelector(\"button\")?.focus();\n }}\n >\n <DialogTitle>Conversations</DialogTitle>\n <SessionRail\n popup\n activeSessionId={props.sessionId}\n loading={sessionsQuery.isPending}\n sessions={sessions}\n onNew={() => navigateToSession()}\n onSelect={navigateToSession}\n />\n </DialogContent>\n </Dialog>\n <div\n className={chatClass(\n \"studio-chat-room\",\n chatLayout.room,\n !showSessionRail && chatLayout.roomWithoutSessions,\n )}\n >\n {showSessionRail && (\n <SessionRail\n activeSessionId={props.sessionId}\n loading={sessionsQuery.isPending}\n sessions={sessions}\n onNew={() => navigateToSession()}\n onSelect={navigateToSession}\n />\n )}\n <section\n className={chatClass(\"studio-chat-thread\", chatLayout.thread)}\n aria-label=\"Conversation\"\n >\n <header\n className={chatClass(\n \"studio-chat-thread-head\",\n chatLayout.threadHead,\n !props.sessionId &&\n visibleMessages.length === 0 &&\n chatLayout.emptyThreadHead,\n )}\n >\n <div\n className={chatClass(\n \"studio-chat-head-copy\",\n chatLayout.headCopy,\n )}\n >\n <h2\n className={chatClass(\n \"studio-chat-session-heading\",\n chatLayout.title,\n )}\n >\n {currentSession?.title ?? \"New conversation\"}\n </h2>\n </div>\n {props.sessionId ? (\n <Button\n className=\"studio-chat-header-action\"\n variant=\"ghost\"\n type=\"button\"\n onClick={() => void archiveCurrent()}\n disabled={\n sending ||\n uploading ||\n Boolean(draft) ||\n uploads.length > 0\n }\n title={\n draft || uploads.length\n ? \"Send or clear the draft before archiving\"\n : undefined\n }\n >\n {archiving ? \"Archiving…\" : \"Archive\"}\n </Button>\n ) : null}\n </header>\n {(props.sessionId !== null || visibleMessages.length > 0) && (\n <details\n className={chatClass(\n \"studio-chat-working-set\",\n chatLayout.context,\n )}\n open={contextOpen}\n onToggle={(event) => setContextOpen(event.currentTarget.open)}\n >\n <summary\n className={chatClass(\n \"studio-chat-working-set-summary\",\n chatLayout.summary,\n )}\n >\n Working set\n </summary>\n <WorkingSet\n cards={contextCards}\n messages={visibleMessages}\n progress={stream?.progress ?? []}\n session={currentSession}\n />\n </details>\n )}\n <div\n className={chatClass(\n \"studio-chat-thread-scroll\",\n chatLayout.threadScroll,\n )}\n >\n <div\n className={chatClass(\n \"studio-chat-manuscript\",\n chatLayout.manuscript,\n )}\n >\n {messagesQuery.isPending &&\n props.sessionId &&\n visibleMessages.length === 0 ? (\n <p\n className={chatClass(\n \"studio-chat-empty\",\n chatLayout.empty,\n )}\n >\n Opening conversation…\n </p>\n ) : null}\n {(!props.sessionId || !messagesQuery.isPending) &&\n visibleMessages.length === 0 ? (\n <ChatEmptyState />\n ) : null}\n {visibleMessages.map((message) => (\n <ChatTurn\n key={message.id}\n message={message}\n onAction={runSuggestedAction}\n onApproval={respondToApproval}\n />\n ))}\n {stream?.approvals.map((approval) => (\n <ApprovalCard\n key={approval.approvalId}\n approval={approval}\n disabled={sending}\n onDecision={respondToApproval}\n />\n ))}\n {sending ? (\n <p\n className={chatClass(\n \"studio-chat-stream-status\",\n chatLayout.empty,\n )}\n role=\"status\"\n >\n Working…\n </p>\n ) : null}\n {error ? (\n <p\n className={chatClass(\n \"studio-chat-error\",\n chatLayout.empty,\n chatLayout.error,\n )}\n role=\"alert\"\n >\n {error}\n </p>\n ) : null}\n <div ref={threadEndRef} />\n </div>\n </div>\n <Composer\n draft={draft}\n sending={sending}\n uploading={uploading}\n uploads={uploads}\n onDraft={setDraft}\n locked={archiving}\n onRemoveUpload={(id) =>\n setUploads((current) =>\n current.filter((upload) => upload.id !== id),\n )\n }\n onFiles={uploadFiles}\n onSubmit={submit}\n onStop={\n activeStreamRef.current\n ? (): void => activeStreamRef.current?.abort()\n : undefined\n }\n />\n </section>\n </div>\n </main>\n </div>\n </div>\n );\n}\n\nfunction SessionRail(props: {\n popup?: boolean;\n sessions: ChatSession[];\n activeSessionId: string | null;\n loading: boolean;\n onNew: () => void;\n onSelect: (id: string) => void;\n}): ReactElement {\n return (\n <aside\n className={\n props.popup\n ? chatClass(\"studio-chat-session-picker\", chatLayout.picker)\n : chatClass(\"studio-chat-sessions\", chatLayout.sessions)\n }\n aria-label=\"Chat sessions\"\n >\n {props.popup && (\n <header\n className={chatClass(\n \"studio-chat-sessions-head\",\n chatLayout.threadHead,\n )}\n >\n <div\n className={chatClass(\"studio-chat-head-copy\", chatLayout.headCopy)}\n >\n <h2\n className={chatClass(\n \"studio-chat-sessions-title\",\n chatLayout.subheading,\n )}\n >\n Sessions\n </h2>\n </div>\n <button\n className={chatClass(\"studio-chat-new\", chatLayout.button)}\n type=\"button\"\n aria-label=\"New conversation\"\n onClick={props.onNew}\n >\n +\n </button>\n </header>\n )}\n <div\n className={chatClass(\n \"studio-chat-session-list\",\n chatLayout.sessionList,\n )}\n >\n {props.loading ? (\n <p className={chatClass(\"studio-chat-empty\", chatLayout.empty)}>\n Loading sessions…\n </p>\n ) : null}\n {!props.loading && props.sessions.length === 0 ? (\n <p className={chatClass(\"studio-chat-empty\", chatLayout.empty)}>\n No conversations yet.\n </p>\n ) : null}\n {props.sessions.map((session) => (\n <button\n className={chatClass(\n \"studio-chat-session\",\n chatLayout.session,\n session.id === props.activeSessionId && chatLayout.activeSession,\n )}\n data-active={\n session.id === props.activeSessionId ? \"true\" : \"false\"\n }\n type=\"button\"\n key={session.id}\n onClick={() => props.onSelect(session.id)}\n >\n <strong\n className={chatClass(\n \"studio-chat-session-title\",\n chatLayout.sessionTitle,\n )}\n >\n {session.title}\n </strong>\n <time\n className={chatClass(\n \"studio-chat-session-time\",\n chatLayout.timestamp,\n )}\n dateTime={session.lastActiveAt}\n title={session.lastActiveAt}\n >\n {formatSessionTime(session.lastActiveAt)}\n </time>\n </button>\n ))}\n </div>\n </aside>\n );\n}\n\nfunction ChatEmptyState(): ReactElement {\n return (\n <section\n className={chatClass(\n \"studio-chat-empty\",\n chatLayout.empty,\n chatLayout.emptyConversation,\n )}\n aria-label=\"New conversation\"\n >\n <p className={chatClass(\"\", chatLayout.cardText)}>\n No messages yet. Your draft stays in the composer until you send it.\n </p>\n </section>\n );\n}\n\nfunction ChatTurn(props: {\n message: ChatHistoryMessage;\n onAction: (action: ChatSuggestedAction) => Promise<void>;\n onApproval: (\n approval: StudioChatApproval,\n approved: boolean,\n ) => Promise<void>;\n}): ReactElement {\n return (\n <article\n className={chatClass(\"studio-chat-turn\", chatLayout.turn)}\n data-role={props.message.role}\n >\n <span className={chatClass(\"studio-chat-turn-label\", chatLayout.speaker)}>\n {props.message.role === \"user\" ? \"You\" : \"Brain\"}\n </span>\n <div\n className={chatClass(\n \"studio-chat-turn-body\",\n chatLayout.turnBody,\n props.message.role === \"user\" && chatLayout.userBody,\n )}\n >\n {props.message.content ? (\n props.message.role === \"assistant\" ? (\n <StudioMarkdown\n className={chatClass(\"studio-chat-prose\", chatLayout.cards)}\n presentation=\"chat\"\n >\n {props.message.content}\n </StudioMarkdown>\n ) : (\n <p className={chatClass(\"studio-chat-text\", chatLayout.paragraph)}>\n {props.message.content}\n </p>\n )\n ) : null}\n {props.message.attachments?.map((attachment) => (\n <p\n className={chatClass(\"studio-chat-upload\", chatLayout.upload)}\n key={`${attachment.filename}-${attachment.createdAt}`}\n >\n {attachment.filename}\n </p>\n ))}\n {props.message.cards?.length ? (\n <div className={chatClass(\"studio-chat-cards\", chatLayout.cards)}>\n {props.message.cards.map((card) => (\n <MessageCard\n card={card}\n key={`${card.kind}-${card.id}`}\n onAction={props.onAction}\n onApproval={props.onApproval}\n />\n ))}\n </div>\n ) : null}\n </div>\n </article>\n );\n}\n\nfunction MessageCard(props: {\n card: ChatCard;\n onAction: (action: ChatSuggestedAction) => Promise<void>;\n onApproval: (\n approval: StudioChatApproval,\n approved: boolean,\n ) => Promise<void>;\n}): ReactElement {\n const { card } = props;\n if (card.kind === \"actions\") {\n return (\n <section className={chatClass(\"studio-chat-card\", chatLayout.card)}>\n <span\n className={chatClass(\"studio-chat-card-kicker\", chatLayout.kicker)}\n >\n Actions\n </span>\n {card.title ? <strong>{card.title}</strong> : null}\n <div\n className={chatClass(\"studio-chat-card-actions\", chatLayout.actions)}\n >\n {card.actions.map((action) => (\n <button\n className={chatClass(\n \"studio-chat-card-action\",\n chatLayout.button,\n )}\n type=\"button\"\n key={action.id}\n onClick={() => void props.onAction(action)}\n >\n {action.label}\n </button>\n ))}\n </div>\n </section>\n );\n }\n if (card.kind === \"sources\") {\n return (\n <section className={chatClass(\"studio-chat-card\", chatLayout.card)}>\n <span\n className={chatClass(\"studio-chat-card-kicker\", chatLayout.kicker)}\n >\n Sources\n </span>\n <ul>\n {card.sources.map((source) => (\n <li key={source.id}>\n {source.url ? (\n <a href={source.url}>{source.title ?? source.source}</a>\n ) : (\n (source.title ?? source.source)\n )}\n </li>\n ))}\n </ul>\n </section>\n );\n }\n if (card.kind === \"attachment\") {\n return (\n <section className={chatClass(\"studio-chat-card\", chatLayout.card)}>\n <span\n className={chatClass(\"studio-chat-card-kicker\", chatLayout.kicker)}\n >\n Artifact\n </span>\n <strong>{card.title}</strong>\n {card.description ? (\n <p\n className={chatClass(\n \"studio-chat-card-description\",\n chatLayout.cardText,\n )}\n >\n {card.description}\n </p>\n ) : null}\n {card.attachment.previewUrl || card.attachment.downloadUrl ? (\n <div\n className={chatClass(\n \"studio-chat-card-actions\",\n chatLayout.actions,\n )}\n >\n <a\n className={chatClass(\n \"studio-chat-card-action\",\n chatLayout.button,\n )}\n href={card.attachment.previewUrl ?? card.attachment.downloadUrl}\n >\n Open\n </a>\n </div>\n ) : null}\n </section>\n );\n }\n const pending = card.state === \"approval-requested\";\n const approval: StudioChatApproval = {\n approvalId: card.id,\n toolCallId: card.toolCallId ?? card.id,\n toolName: card.toolName,\n ...(card.input ? { input: card.input } : {}),\n ...(card.summary ? { title: card.summary } : {}),\n };\n return (\n <section className={chatClass(\"studio-chat-card\", chatLayout.card)}>\n <span className={chatClass(\"studio-chat-card-kicker\", chatLayout.kicker)}>\n {pending ? \"Approval required\" : \"Approval record\"}\n </span>\n <strong>{card.summary}</strong>\n {card.preview ? (\n <p\n className={chatClass(\n \"studio-chat-card-preview\",\n chatLayout.paragraph,\n )}\n >\n {card.preview}\n </p>\n ) : null}\n {pending ? (\n <div\n className={chatClass(\n \"studio-chat-approval-actions\",\n chatLayout.actions,\n )}\n >\n <button\n className={chatClass(\n \"studio-chat-approval-action\",\n chatLayout.button,\n )}\n type=\"button\"\n onClick={() => void props.onApproval(approval, false)}\n >\n Decline\n </button>\n <button\n className={chatClass(\n \"studio-chat-approval-action\",\n chatLayout.button,\n chatLayout.primaryButton,\n )}\n data-primary=\"true\"\n type=\"button\"\n onClick={() => void props.onApproval(approval, true)}\n >\n Approve\n </button>\n </div>\n ) : null}\n </section>\n );\n}\n\nfunction ApprovalCard(props: {\n approval: StudioChatApproval;\n disabled: boolean;\n onDecision: (\n approval: StudioChatApproval,\n approved: boolean,\n ) => Promise<void>;\n}): ReactElement {\n return (\n <section className={chatClass(\"studio-chat-approval\", chatLayout.card)}>\n <span className={chatClass(\"studio-chat-card-kicker\", chatLayout.kicker)}>\n Approval required\n </span>\n <strong>{props.approval.title ?? props.approval.toolName}</strong>\n <div\n className={chatClass(\n \"studio-chat-approval-actions\",\n chatLayout.actions,\n )}\n >\n <button\n className={chatClass(\n \"studio-chat-approval-action\",\n chatLayout.button,\n )}\n type=\"button\"\n disabled={props.disabled}\n onClick={() => void props.onDecision(props.approval, false)}\n >\n Decline\n </button>\n <button\n className={chatClass(\n \"studio-chat-approval-action\",\n chatLayout.button,\n chatLayout.primaryButton,\n )}\n data-primary=\"true\"\n type=\"button\"\n disabled={props.disabled}\n onClick={() => void props.onDecision(props.approval, true)}\n >\n Approve\n </button>\n </div>\n </section>\n );\n}\n\nfunction Composer(props: {\n locked: boolean;\n onRemoveUpload: (id: string) => void;\n draft: string;\n uploads: ChatUploadResponse[];\n sending: boolean;\n uploading: boolean;\n onDraft: (value: string) => void;\n onFiles: (event: ChangeEvent<HTMLInputElement>) => Promise<void>;\n onSubmit: (event: FormEvent<HTMLFormElement>) => void;\n onStop?: (() => void) | undefined;\n}): ReactElement {\n const keyDown = (event: KeyboardEvent<HTMLTextAreaElement>): void => {\n if (\n event.key === \"Enter\" &&\n !event.shiftKey &&\n !event.nativeEvent.isComposing\n ) {\n event.preventDefault();\n event.currentTarget.form?.requestSubmit();\n }\n };\n return (\n <footer className={chatClass(\"studio-chat-composer\", chatLayout.composer)}>\n {props.uploads.length > 0 ? (\n <div\n className={chatClass(\n \"studio-chat-upload-list\",\n chatLayout.uploadList,\n )}\n >\n {props.uploads.map((upload) => (\n <span\n className={chatClass(\"studio-chat-upload\", chatLayout.upload)}\n key={upload.id}\n >\n {upload.filename}{\" \"}\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n aria-label={`Remove ${upload.filename} from message`}\n disabled={props.locked}\n onClick={() => props.onRemoveUpload(upload.id)}\n >\n ×\n </Button>\n </span>\n ))}\n </div>\n ) : null}\n <form\n className={chatClass(\"studio-chat-composer-form\", chatLayout.form)}\n onSubmit={props.onSubmit}\n >\n <label\n className={chatClass(\n \"studio-chat-message-label\",\n chatLayout.fieldLabel,\n )}\n >\n Message\n <textarea\n className={chatClass(\"studio-chat-message\", chatLayout.input)}\n aria-label=\"Message\"\n placeholder=\"Write to your brain…\"\n value={props.draft}\n disabled={props.locked}\n onChange={(event) => props.onDraft(event.target.value)}\n onKeyDown={keyDown}\n />\n </label>\n <div\n className={chatClass(\n \"studio-chat-composer-actions\",\n chatLayout.actions,\n )}\n >\n <label\n className={chatClass(\n \"studio-chat-composer-action\",\n chatLayout.attachButton,\n )}\n aria-label=\"Attach files\"\n >\n {props.uploading ? \"Attaching…\" : \"Attach files\"}\n <input\n className={chatClass(\n \"studio-chat-upload-input\",\n chatLayout.uploadInput,\n )}\n type=\"file\"\n multiple\n disabled={props.locked || props.sending || props.uploading}\n onChange={(event) => void props.onFiles(event)}\n />\n </label>\n {props.locked ? (\n <Button type=\"button\" disabled>\n Archiving…\n </Button>\n ) : props.sending ? (\n <Button\n type=\"button\"\n variant=\"outline\"\n onClick={props.onStop}\n disabled={!props.onStop}\n title=\"Stop receiving the response. Completed actions are not undone.\"\n >\n Stop\n </Button>\n ) : (\n <Button\n className=\"studio-chat-composer-action\"\n type=\"submit\"\n aria-label=\"Send message\"\n disabled={\n props.uploading ||\n (!props.draft.trim() && props.uploads.length === 0)\n }\n >\n Send\n </Button>\n )}\n </div>\n </form>\n </footer>\n );\n}\n\nfunction WorkingSet(props: {\n cards: ChatCard[];\n messages: ChatHistoryMessage[];\n progress: StudioChatStreamState[\"progress\"];\n session: ChatSession | undefined;\n}): ReactElement {\n return (\n <aside\n className={chatClass(\"studio-chat-context\", chatLayout.contextBody)}\n aria-label=\"Working set\"\n >\n <div className={chatClass(\"studio-chat-context-list\", chatLayout.cards)}>\n {props.session?.contextHandoff ? (\n <section\n className={chatClass(\n \"studio-chat-context-card\",\n chatLayout.contextItem,\n )}\n >\n <span\n className={chatClass(\n \"studio-chat-context-kicker\",\n chatLayout.kicker,\n )}\n >\n Linked context\n </span>\n <h3\n className={chatClass(\n \"studio-chat-context-card-title\",\n chatLayout.cardHeading,\n )}\n >\n {props.session.contextHandoff.titleSeed}\n </h3>\n <p\n className={chatClass(\n \"studio-chat-context-card-text\",\n chatLayout.cardText,\n )}\n >\n {props.session.contextHandoff.sourceId} ·{\" \"}\n {props.session.contextHandoff.itemId}\n </p>\n </section>\n ) : null}\n {props.cards.length === 0 && props.progress.length === 0 ? (\n <p className={chatClass(\"studio-chat-empty\", chatLayout.empty)}>\n Sources, artifacts, and durable jobs appear here as the conversation\n develops.\n </p>\n ) : null}\n {props.cards.map((card, index) => (\n <section\n className={chatClass(\n \"studio-chat-context-card\",\n chatLayout.contextItem,\n )}\n key={`${card.kind}-${card.id}-${index}`}\n >\n <span\n className={chatClass(\n \"studio-chat-context-kicker\",\n chatLayout.kicker,\n )}\n >\n {card.kind === \"sources\" ? \"Sources\" : \"Artifact\"}\n </span>\n <h3\n className={chatClass(\n \"studio-chat-context-card-title\",\n chatLayout.cardHeading,\n )}\n >\n {card.kind === \"sources\"\n ? (card.title ?? `${card.sources.length} consulted`)\n : card.kind === \"attachment\"\n ? card.title\n : \"Conversation context\"}\n </h3>\n {card.kind === \"sources\" ? (\n <>\n <ul>\n {card.sources.slice(0, 5).map((source) => (\n <li key={source.id}>{source.title ?? source.source}</li>\n ))}\n </ul>\n {card.sources.length > 5 ? (\n <p\n className={chatClass(\n \"studio-chat-context-card-text\",\n chatLayout.cardText,\n )}\n >\n {card.sources.length - 5} more sources in the conversation.\n </p>\n ) : null}\n </>\n ) : card.kind === \"attachment\" && card.description ? (\n <p\n className={chatClass(\n \"studio-chat-context-card-text\",\n chatLayout.cardText,\n )}\n >\n {card.description}\n </p>\n ) : null}\n </section>\n ))}\n {props.progress.map((item, index) => (\n <section\n className={chatClass(\n \"studio-chat-context-card\",\n chatLayout.contextItem,\n )}\n key={`${item.type}-${index}`}\n >\n <span\n className={chatClass(\n \"studio-chat-context-kicker\",\n chatLayout.kicker,\n )}\n >\n Durable job\n </span>\n <h3\n className={chatClass(\n \"studio-chat-context-card-title\",\n chatLayout.cardHeading,\n )}\n >\n {item.operationTarget ?? item.operationType}\n </h3>\n <p\n className={chatClass(\n \"studio-chat-context-card-text\",\n chatLayout.cardText,\n )}\n >\n {item.message ?? item.status}\n </p>\n </section>\n ))}\n {props.messages.length > 0 ? (\n <section\n className={chatClass(\n \"studio-chat-context-card\",\n chatLayout.contextItem,\n )}\n >\n <span\n className={chatClass(\n \"studio-chat-context-kicker\",\n chatLayout.kicker,\n )}\n >\n Activity\n </span>\n <h3\n className={chatClass(\n \"studio-chat-context-card-title\",\n chatLayout.cardHeading,\n )}\n >\n Visible conversation\n </h3>\n <p\n className={chatClass(\n \"studio-chat-context-card-text\",\n chatLayout.cardText,\n )}\n >\n {props.messages.length} visible messages.\n </p>\n </section>\n ) : null}\n </div>\n </aside>\n );\n}\n\nfunction formatSessionTime(value: string): string {\n const date = new Date(value);\n if (Number.isNaN(date.getTime())) return \"\";\n return new Intl.DateTimeFormat(undefined, {\n day: \"numeric\",\n year:\n date.getFullYear() === new Date().getFullYear() ? undefined : \"numeric\",\n month: \"short\",\n timeZoneName: \"short\",\n hour: \"2-digit\",\n minute: \"2-digit\",\n }).format(date);\n}\n\nfunction errorMessage(cause: unknown, fallback: string): string {\n return cause instanceof Error && cause.message ? cause.message : fallback;\n}\n",
|
|
8
|
+
"/** @jsxImportSource react */\nimport { libraryStyles as library } from \"./studio-library.styles\";\nimport {\n Button,\n Dialog,\n DialogContent,\n DialogTitle,\n} from \"@brains/app-ui-react\";\nimport { chatClass, chatLayout } from \"./studio-chat-layout.styles\";\nimport {\n StudioChatDraftStore,\n studioChatDraftKey,\n type StudioChatNavigationState,\n} from \"./studio-chat-drafts\";\nimport { StudioPageHead, studioAccessRequirement } from \"./studio-page-head\";\nimport {\n createChatClient,\n readChatProtocolEvents,\n type ChatCard,\n type ChatHistoryMessage,\n type ChatMessage,\n type ChatSession,\n type ChatUploadResponse,\n} from \"@brains/contracts/chat\";\nimport { useQuery, useQueryClient } from \"@tanstack/react-query\";\nimport {\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n useSyncExternalStore,\n type ChangeEvent,\n type FormEvent,\n type KeyboardEvent,\n type ReactElement,\n} from \"react\";\nimport {\n STUDIO_CHAT_WORKSPACE_ID,\n studioChatWorkspacePath,\n} from \"../../src/chat-workspace\";\nimport type { EntityTypeInfo, StudioWorkspaceInfo } from \"./api\";\nimport type { StudioChatHandoff } from \"./operator-launch\";\nimport {\n approvalResponseMessage,\n createStudioChatStreamState,\n reduceStudioChatStream,\n streamAssistantMessage,\n type StudioChatApproval,\n type StudioChatStreamState,\n} from \"./chat-workspace-model\";\nimport { TypeSwitcher } from \"./entity-fields\";\nimport { useStudioNavigationCollapsed } from \"./studio-navigation-state\";\nimport { StudioChrome } from \"./studio-chrome\";\nimport { StudioMarkdown } from \"./studio-markdown\";\nimport {\n navigationClassName as navClass,\n navigationStyles as nav,\n} from \"./studio-navigation.styles\";\n\nconst studioChatKeys = {\n sessions: [\"studio\", \"chat\", \"sessions\"] as const,\n messages: (conversationId: string) =>\n [\"studio\", \"chat\", \"messages\", conversationId] as const,\n};\n\ntype ChatActionCard = Extract<ChatCard, { kind: \"actions\" }>;\ntype ChatSuggestedAction = ChatActionCard[\"actions\"][number];\n\nexport interface StudioChatWorkspaceProps {\n apiPath?: string | undefined;\n draftStore?: StudioChatDraftStore | undefined;\n onNavigationStateChange?:\n ((state: StudioChatNavigationState) => void) | undefined;\n studioBasePath: string;\n sessionId: string | null;\n types: EntityTypeInfo[];\n workspaces: StudioWorkspaceInfo[];\n handoff: StudioChatHandoff | null;\n navigate: (href: string, options?: { preserveWork?: boolean }) => void;\n selectEntityType: (entityType: string) => void;\n selectWorkspace: (workspaceId: string) => void;\n}\n\nexport function StudioChatWorkspace(\n props: StudioChatWorkspaceProps,\n): ReactElement {\n const queryClient = useQueryClient();\n const chatClient = useMemo(\n () =>\n createChatClient({\n apiPath: props.apiPath,\n fetch: (input, init) => globalThis.fetch(input, init),\n }),\n [props.apiPath],\n );\n const [localDraftStore] = useState(() => new StudioChatDraftStore());\n const draftStore = props.draftStore ?? localDraftStore;\n const draftKey = studioChatDraftKey(props.apiPath, props.sessionId);\n const currentDraftKey = useRef(draftKey);\n currentDraftKey.current = draftKey;\n const { text: draft, uploads } = useSyncExternalStore(\n draftStore.subscribe,\n () => draftStore.read(draftKey),\n () => draftStore.read(draftKey),\n );\n const setDraft = useCallback(\n (text: string) => draftStore.update(draftKey, { text }),\n [draftStore, draftKey],\n );\n const setUploads = useCallback(\n (\n value:\n | ChatUploadResponse[]\n | ((current: ChatUploadResponse[]) => ChatUploadResponse[]),\n ) =>\n draftStore.update(draftKey, {\n uploads:\n typeof value === \"function\"\n ? value(draftStore.read(draftKey).uploads)\n : value,\n }),\n [draftStore, draftKey],\n );\n const [pendingMessages, setPendingMessages] = useState<ChatHistoryMessage[]>(\n [],\n );\n const [stream, setStream] = useState<StudioChatStreamState | null>(null);\n const [sending, setSending] = useState(false);\n const [archiving, setArchiving] = useState(false);\n const [uploading, setUploading] = useState(false);\n const [error, setError] = useState<string | null>(null);\n useEffect(() => {\n props.onNavigationStateChange?.({\n hasDraft: Boolean(draft || uploads.length),\n busy: sending || uploading,\n });\n }, [draft, uploads, sending, uploading, props.onNavigationStateChange]);\n useEffect(\n () => (): void =>\n props.onNavigationStateChange?.({ hasDraft: false, busy: false }),\n [props.onNavigationStateChange],\n );\n const navigationCollapsed = useStudioNavigationCollapsed();\n const [contextOpen, setContextOpen] = useState(false);\n const [sessionPickerOpen, setSessionPickerOpen] = useState(false);\n const sessionPickerTrigger = useRef<HTMLSpanElement>(null);\n const threadEndRef = useRef<HTMLDivElement | null>(null);\n const threadScrollRef = useRef<HTMLDivElement | null>(null);\n const followLatestRef = useRef(true);\n const [showJumpToLatest, setShowJumpToLatest] = useState(false);\n const activeStreamRef = useRef<AbortController | null>(null);\n const mountedRef = useRef(false);\n useEffect(() => {\n mountedRef.current = true;\n return (): void => {\n mountedRef.current = false;\n const active = activeStreamRef.current;\n activeStreamRef.current = null;\n active?.abort();\n };\n }, []);\n const handledHandoffRef = useRef<string | null>(null);\n const adoptedSessionRef = useRef<string | null>(null);\n\n const sessionsQuery = useQuery({\n queryKey: studioChatKeys.sessions,\n queryFn: () => chatClient.listSessions(),\n });\n const messagesQuery = useQuery({\n queryKey: studioChatKeys.messages(props.sessionId ?? \"\"),\n queryFn: () => chatClient.getMessages(props.sessionId ?? \"\"),\n // A newly accepted session already has an optimistic copy of its first\n // turn. Wait for the completed stream to replace that copy atomically.\n enabled:\n props.sessionId !== null && !sending && pendingMessages.length === 0,\n });\n const sessions = sessionsQuery.data ?? [];\n const showSessionRail = sessionsQuery.isPending || sessions.length > 0;\n const storedMessages = messagesQuery.data ?? [];\n const currentSession = sessions.find(\n (session) => session.id === props.sessionId,\n );\n const visibleMessages = useMemo(() => {\n const next = [...storedMessages, ...pendingMessages];\n if (stream && (stream.text || stream.cards.length > 0)) {\n next.push(streamAssistantMessage(stream));\n }\n return next;\n }, [pendingMessages, storedMessages, stream]);\n const contextCards = useMemo(\n () =>\n visibleMessages.flatMap((message) =>\n (message.cards ?? []).filter(\n (card) => card.kind === \"sources\" || card.kind === \"attachment\",\n ),\n ),\n [visibleMessages],\n );\n\n useEffect(() => {\n if (props.sessionId && adoptedSessionRef.current === props.sessionId) {\n adoptedSessionRef.current = null;\n return;\n }\n const active = activeStreamRef.current;\n activeStreamRef.current = null;\n active?.abort();\n setSending(false);\n setPendingMessages([]);\n setStream(null);\n setUploading(false);\n setArchiving(false);\n setError(null);\n }, [props.sessionId]);\n\n useEffect(() => {\n followLatestRef.current = true;\n setShowJumpToLatest(false);\n }, [props.sessionId]);\n\n useEffect(() => {\n const scroll = threadScrollRef.current;\n const manuscript = scroll?.firstElementChild;\n if (!scroll || !manuscript) return;\n const follow = (): void => {\n if (followLatestRef.current) scroll.scrollTop = scroll.scrollHeight;\n };\n follow();\n const observer = new ResizeObserver(follow);\n observer.observe(manuscript);\n return (): void => observer.disconnect();\n }, []);\n\n useEffect(() => {\n if (followLatestRef.current) {\n const scroll = threadScrollRef.current;\n if (scroll) scroll.scrollTop = scroll.scrollHeight;\n }\n }, [stream, visibleMessages.length]);\n\n const navigateToSession = useCallback(\n (conversationId?: string, preserveWork = false): void => {\n props.navigate(\n studioChatWorkspacePath(props.studioBasePath, conversationId),\n { preserveWork },\n );\n setSessionPickerOpen(false);\n },\n [props.navigate, props.studioBasePath],\n );\n\n useEffect(() => {\n if (!props.handoff || props.sessionId) return;\n const handoffKey = `${props.handoff.sourceId}\\u0000${props.handoff.itemId}`;\n if (handledHandoffRef.current === handoffKey) return;\n handledHandoffRef.current = handoffKey;\n setDraft(props.handoff.prompt);\n setError(null);\n void chatClient\n .openContextSession({\n version: 1,\n sourceId: props.handoff.sourceId,\n itemId: props.handoff.itemId,\n titleSeed: props.handoff.label,\n })\n .then(({ conversationId }) => {\n if (\n !mountedRef.current ||\n currentDraftKey.current !== draftKey ||\n handledHandoffRef.current !== handoffKey\n )\n return;\n draftStore.adopt(\n draftKey,\n studioChatDraftKey(props.apiPath, conversationId),\n );\n navigateToSession(conversationId, true);\n })\n .catch((cause: unknown) => {\n if (\n !mountedRef.current ||\n currentDraftKey.current !== draftKey ||\n handledHandoffRef.current !== handoffKey\n )\n return;\n handledHandoffRef.current = null;\n setError(errorMessage(cause, \"Context could not be attached\"));\n });\n }, [\n chatClient,\n navigateToSession,\n props.handoff,\n props.sessionId,\n props.apiPath,\n draftStore,\n draftKey,\n setDraft,\n ]);\n\n const runStream = useCallback(\n async (\n conversationId: string,\n messages: ChatMessage[],\n onAccepted?: () => void,\n ): Promise<boolean> => {\n activeStreamRef.current?.abort();\n const controller = new AbortController();\n activeStreamRef.current = controller;\n setSending(true);\n setError(null);\n let next = createStudioChatStreamState();\n setStream(next);\n let accepted = false;\n let retained = false;\n const retainResponse = (): void => {\n if (retained || (!next.text && next.cards.length === 0)) return;\n retained = true;\n const message = streamAssistantMessage(next);\n setPendingMessages((current) => [...current, message]);\n setStream({ ...next, text: \"\", cards: [] });\n };\n try {\n const response = await chatClient.streamMessages(\n {\n id: conversationId,\n messages,\n trigger: \"submit-message\",\n },\n { signal: controller.signal },\n );\n accepted = true;\n onAccepted?.();\n for await (const event of readChatProtocolEvents(response)) {\n if (activeStreamRef.current !== controller) return accepted;\n next = reduceStudioChatStream(next, event);\n setStream(next);\n }\n if (activeStreamRef.current !== controller) return accepted;\n retainResponse();\n try {\n const authoritativeMessages =\n await chatClient.getMessages(conversationId);\n if (activeStreamRef.current !== controller) return accepted;\n queryClient.setQueryData(\n studioChatKeys.messages(conversationId),\n authoritativeMessages,\n );\n setPendingMessages([]);\n } catch {\n // The completed response remains visible from the optimistic state;\n // a later session visit can retry the authoritative history read.\n }\n await queryClient.invalidateQueries({\n queryKey: studioChatKeys.sessions,\n });\n } catch (cause) {\n if (activeStreamRef.current !== controller) return accepted;\n retainResponse();\n if (!controller.signal.aborted)\n setError(errorMessage(cause, \"Chat could not complete the response\"));\n } finally {\n if (activeStreamRef.current === controller) {\n activeStreamRef.current = null;\n setSending(false);\n }\n }\n return accepted;\n },\n [chatClient, queryClient],\n );\n\n const submitPrompt = useCallback(\n async (prompt: string): Promise<void> => {\n const text = prompt.trim();\n if ((!text && uploads.length === 0) || sending || uploading) return;\n const conversationId = props.sessionId ?? `web-${crypto.randomUUID()}`;\n const sentKey = studioChatDraftKey(props.apiPath, conversationId);\n const messageId = crypto.randomUUID();\n const uploadParts = uploads.map((upload) => ({\n type: \"data-upload\" as const,\n data: { ref: upload.ref },\n }));\n const parts = [\n ...(text ? [{ type: \"text\" as const, text }] : []),\n ...uploadParts,\n ];\n setPendingMessages((current) => [\n ...current,\n {\n id: messageId,\n role: \"user\",\n content: text || uploads.map((upload) => upload.filename).join(\", \"),\n },\n ]);\n const accepted = await runStream(\n conversationId,\n [{ id: messageId, role: \"user\", parts }],\n () => {\n if (\n !props.sessionId &&\n mountedRef.current &&\n currentDraftKey.current === draftKey\n ) {\n draftStore.adopt(draftKey, sentKey);\n adoptedSessionRef.current = conversationId;\n navigateToSession(conversationId, true);\n }\n const current = draftStore.read(sentKey);\n draftStore.update(sentKey, {\n text: current.text === prompt ? \"\" : current.text,\n uploads: current.uploads.filter(\n (upload) => !uploads.some((sent) => sent.id === upload.id),\n ),\n });\n },\n );\n if (\n !accepted &&\n (currentDraftKey.current === sentKey ||\n (!props.sessionId && currentDraftKey.current === draftKey))\n )\n setPendingMessages((current) =>\n current.filter((message) => message.id !== messageId),\n );\n },\n [\n navigateToSession,\n props.sessionId,\n props.apiPath,\n draftStore,\n draftKey,\n runStream,\n sending,\n uploading,\n uploads,\n ],\n );\n\n const submit = (event: FormEvent<HTMLFormElement>): void => {\n event.preventDefault();\n void submitPrompt(draft);\n };\n\n const respondToApproval = useCallback(\n async (approval: StudioChatApproval, approved: boolean): Promise<void> => {\n if (!props.sessionId || sending) return;\n await runStream(props.sessionId, [\n approvalResponseMessage(approval, approved),\n ]);\n },\n [props.sessionId, runStream, sending],\n );\n\n const runSuggestedAction = useCallback(\n async (action: ChatSuggestedAction): Promise<void> => {\n if (action.type === \"prompt\") {\n await submitPrompt(action.prompt);\n return;\n }\n if (!props.sessionId || sending) return;\n setSending(true);\n setError(null);\n try {\n const result = await chatClient.runAction({\n conversationId: props.sessionId,\n action: {\n type: \"event\",\n event: action.event,\n ...(action.fromState ? { fromState: action.fromState } : {}),\n },\n });\n if (!mountedRef.current || currentDraftKey.current !== draftKey) return;\n setPendingMessages((current) => [\n ...current,\n {\n id: crypto.randomUUID(),\n role: \"assistant\",\n content: result.text,\n ...(result.cards ? { cards: result.cards } : {}),\n },\n ]);\n } catch (cause) {\n if (mountedRef.current && currentDraftKey.current === draftKey)\n setError(errorMessage(cause, \"Chat action failed\"));\n } finally {\n if (mountedRef.current && currentDraftKey.current === draftKey)\n setSending(false);\n }\n },\n [chatClient, props.sessionId, sending, submitPrompt, draftKey],\n );\n\n const uploadFiles = useCallback(\n async (event: ChangeEvent<HTMLInputElement>): Promise<void> => {\n const files = Array.from(event.target.files ?? []);\n event.target.value = \"\";\n if (files.length === 0) return;\n setUploading(true);\n setError(null);\n try {\n const uploaded = await Promise.all(\n files.map((file) => chatClient.upload(file, file.name)),\n );\n setUploads((current) => [...current, ...uploaded]);\n } catch (cause) {\n if (mountedRef.current && currentDraftKey.current === draftKey)\n setError(errorMessage(cause, \"Upload failed\"));\n } finally {\n if (mountedRef.current && currentDraftKey.current === draftKey)\n setUploading(false);\n }\n },\n [chatClient, setUploads, draftKey],\n );\n\n const archiveCurrent = useCallback(async (): Promise<void> => {\n if (!props.sessionId || sending || uploading || draft || uploads.length)\n return;\n setSending(true);\n setArchiving(true);\n try {\n await chatClient.archiveSession(props.sessionId);\n await queryClient.invalidateQueries({\n queryKey: studioChatKeys.sessions,\n });\n if (mountedRef.current && currentDraftKey.current === draftKey)\n navigateToSession(undefined, true);\n } catch (cause) {\n if (mountedRef.current && currentDraftKey.current === draftKey)\n setError(errorMessage(cause, \"Conversation could not be archived\"));\n } finally {\n if (mountedRef.current && currentDraftKey.current === draftKey) {\n setSending(false);\n setArchiving(false);\n }\n }\n }, [\n chatClient,\n navigateToSession,\n props.sessionId,\n queryClient,\n sending,\n uploading,\n draft,\n uploads.length,\n draftKey,\n ]);\n\n const workspaceBadges = Object.fromEntries(\n props.workspaces.flatMap((workspace) =>\n workspace.badge === undefined ? [] : [[workspace.id, workspace.badge]],\n ),\n );\n\n return (\n <div\n className={chatClass(\"studio\", library.frame, chatLayout.root)}\n data-view=\"chat\"\n data-studio-shell=\"\"\n >\n <StudioChrome\n contextLabel=\"Chat\"\n navigation={{\n types: props.types,\n workspaces: props.workspaces,\n activeEntityType: null,\n activeWorkspaceId: STUDIO_CHAT_WORKSPACE_ID,\n workspaceBadges,\n selectEntityType: props.selectEntityType,\n selectWorkspace: props.selectWorkspace,\n }}\n />\n <div\n className={navClass(\n \"studio-chat-shell\",\n chatLayout.shell,\n nav.shell,\n navigationCollapsed && nav.shellCollapsed,\n )}\n >\n <aside className={navClass(\"rail studio-chat-studio-rail\", nav.rail)}>\n <TypeSwitcher\n renderMode=\"desktop\"\n types={props.types}\n active={null}\n onSelect={props.selectEntityType}\n workspaces={props.workspaces}\n activeWorkspace={STUDIO_CHAT_WORKSPACE_ID}\n workspaceBadges={workspaceBadges}\n onSelectWorkspace={props.selectWorkspace}\n />\n </aside>\n <main className={chatClass(\"studio-chat-workspace\", chatLayout.frame)}>\n <div>\n {sessionsQuery.error && (\n <section role=\"alert\">\n <p>\n Sessions could not be refreshed. Your conversation and draft\n are still available.\n </p>\n <Button\n type=\"button\"\n variant=\"ghost\"\n disabled={sessionsQuery.isFetching}\n onClick={() => void sessionsQuery.refetch()}\n >\n Retry sessions\n </Button>\n </section>\n )}\n <StudioPageHead\n model={{\n title: \"Chat\",\n totals: [],\n access: studioAccessRequirement(\"trusted\"),\n }}\n action={\n <div\n className={chatClass(\n \"studio-chat-head-actions\",\n chatLayout.actions,\n )}\n >\n <span\n ref={sessionPickerTrigger}\n className=\"studio-chat-mobile-sessions\"\n >\n <Button\n aria-expanded={sessionPickerOpen}\n aria-haspopup=\"dialog\"\n variant=\"outline\"\n type=\"button\"\n onClick={() => setSessionPickerOpen(true)}\n >\n Sessions\n </Button>\n </span>\n <Button\n variant=\"outline\"\n type=\"button\"\n onClick={() => navigateToSession()}\n >\n New conversation\n </Button>\n </div>\n }\n />\n </div>\n <Dialog\n open={sessionPickerOpen}\n onOpenChange={(open) => {\n setSessionPickerOpen(open);\n }}\n >\n <DialogContent\n aria-describedby={undefined}\n onCloseAutoFocus={(event) => {\n event.preventDefault();\n sessionPickerTrigger.current?.querySelector(\"button\")?.focus();\n }}\n >\n <DialogTitle>Conversations</DialogTitle>\n <SessionRail\n popup\n activeSessionId={props.sessionId}\n loading={sessionsQuery.isPending}\n sessions={sessions}\n onNew={() => navigateToSession()}\n onSelect={navigateToSession}\n />\n </DialogContent>\n </Dialog>\n <div\n className={chatClass(\n \"studio-chat-room\",\n chatLayout.room,\n !showSessionRail && chatLayout.roomWithoutSessions,\n )}\n >\n {showSessionRail && (\n <SessionRail\n activeSessionId={props.sessionId}\n loading={sessionsQuery.isPending}\n sessions={sessions}\n onNew={() => navigateToSession()}\n onSelect={navigateToSession}\n />\n )}\n <section\n className={chatClass(\"studio-chat-thread\", chatLayout.thread)}\n aria-label=\"Conversation\"\n >\n <header\n className={chatClass(\n \"studio-chat-thread-head\",\n chatLayout.threadHead,\n !props.sessionId &&\n visibleMessages.length === 0 &&\n chatLayout.emptyThreadHead,\n )}\n >\n <div\n className={chatClass(\n \"studio-chat-head-copy\",\n chatLayout.headCopy,\n )}\n >\n <h2\n className={chatClass(\n \"studio-chat-session-heading\",\n chatLayout.title,\n )}\n >\n {currentSession?.title ?? \"New conversation\"}\n </h2>\n </div>\n {props.sessionId ? (\n <Button\n className=\"studio-chat-header-action\"\n variant=\"ghost\"\n type=\"button\"\n onClick={() => void archiveCurrent()}\n disabled={\n sending ||\n uploading ||\n Boolean(draft) ||\n uploads.length > 0\n }\n title={\n draft || uploads.length\n ? \"Send or clear the draft before archiving\"\n : undefined\n }\n >\n {archiving ? \"Archiving…\" : \"Archive\"}\n </Button>\n ) : null}\n </header>\n {(props.sessionId !== null || visibleMessages.length > 0) && (\n <details\n className={chatClass(\n \"studio-chat-working-set\",\n chatLayout.context,\n )}\n open={contextOpen}\n onToggle={(event) => setContextOpen(event.currentTarget.open)}\n >\n <summary\n className={chatClass(\n \"studio-chat-working-set-summary\",\n chatLayout.summary,\n )}\n >\n Working set\n </summary>\n <WorkingSet\n cards={contextCards}\n messages={visibleMessages}\n progress={stream?.progress ?? []}\n session={currentSession}\n />\n </details>\n )}\n <div\n ref={threadScrollRef}\n onScroll={(event) => {\n const scroll = event.currentTarget;\n const nearBottom =\n scroll.scrollHeight -\n scroll.clientHeight -\n scroll.scrollTop <=\n 48;\n followLatestRef.current = nearBottom;\n setShowJumpToLatest(!nearBottom);\n }}\n className={chatClass(\n \"studio-chat-thread-scroll\",\n chatLayout.threadScroll,\n )}\n >\n <div\n className={chatClass(\n \"studio-chat-manuscript\",\n chatLayout.manuscript,\n )}\n >\n {messagesQuery.error && (\n <section role=\"alert\">\n <p>\n {storedMessages.length > 0\n ? \"Showing previously loaded messages. \"\n : \"\"}\n Conversation could not be loaded.\n </p>\n <Button\n type=\"button\"\n variant=\"ghost\"\n disabled={messagesQuery.isFetching}\n onClick={() => void messagesQuery.refetch()}\n >\n Retry conversation\n </Button>\n </section>\n )}\n {messagesQuery.isPending &&\n props.sessionId &&\n visibleMessages.length === 0 ? (\n <p\n className={chatClass(\n \"studio-chat-empty\",\n chatLayout.empty,\n )}\n >\n Opening conversation…\n </p>\n ) : null}\n {!messagesQuery.error &&\n (!props.sessionId || !messagesQuery.isPending) &&\n visibleMessages.length === 0 ? (\n <ChatEmptyState />\n ) : null}\n {visibleMessages.map((message) => (\n <ChatTurn\n key={message.id}\n message={message}\n onAction={runSuggestedAction}\n onApproval={respondToApproval}\n />\n ))}\n {stream?.approvals.map((approval) => (\n <ApprovalCard\n key={approval.approvalId}\n approval={approval}\n disabled={sending}\n onDecision={respondToApproval}\n />\n ))}\n {sending ? (\n <p\n className={chatClass(\n \"studio-chat-stream-status\",\n chatLayout.empty,\n )}\n role=\"status\"\n >\n Working…\n </p>\n ) : null}\n {error ? (\n <p\n className={chatClass(\n \"studio-chat-error\",\n chatLayout.empty,\n chatLayout.error,\n )}\n role=\"alert\"\n >\n {error}\n </p>\n ) : null}\n <div ref={threadEndRef} />\n </div>\n </div>\n <Composer\n onJumpToLatest={\n showJumpToLatest\n ? (): void => {\n followLatestRef.current = true;\n setShowJumpToLatest(false);\n const scroll = threadScrollRef.current;\n if (scroll) scroll.scrollTop = scroll.scrollHeight;\n }\n : undefined\n }\n draft={draft}\n sending={sending}\n uploading={uploading}\n uploads={uploads}\n onDraft={setDraft}\n locked={archiving}\n onRemoveUpload={(id) =>\n setUploads((current) =>\n current.filter((upload) => upload.id !== id),\n )\n }\n onFiles={uploadFiles}\n onSubmit={submit}\n onStop={\n activeStreamRef.current\n ? (): void => activeStreamRef.current?.abort()\n : undefined\n }\n />\n </section>\n </div>\n </main>\n </div>\n </div>\n );\n}\n\nfunction SessionRail(props: {\n popup?: boolean;\n sessions: ChatSession[];\n activeSessionId: string | null;\n loading: boolean;\n onNew: () => void;\n onSelect: (id: string) => void;\n}): ReactElement {\n return (\n <aside\n className={\n props.popup\n ? chatClass(\"studio-chat-session-picker\", chatLayout.picker)\n : chatClass(\"studio-chat-sessions\", chatLayout.sessions)\n }\n aria-label=\"Chat sessions\"\n >\n {props.popup && (\n <header\n className={chatClass(\n \"studio-chat-sessions-head\",\n chatLayout.threadHead,\n )}\n >\n <div\n className={chatClass(\"studio-chat-head-copy\", chatLayout.headCopy)}\n >\n <h2\n className={chatClass(\n \"studio-chat-sessions-title\",\n chatLayout.subheading,\n )}\n >\n Sessions\n </h2>\n </div>\n <button\n className={chatClass(\"studio-chat-new\", chatLayout.button)}\n type=\"button\"\n aria-label=\"New conversation\"\n onClick={props.onNew}\n >\n +\n </button>\n </header>\n )}\n <div\n className={chatClass(\n \"studio-chat-session-list\",\n chatLayout.sessionList,\n )}\n >\n {props.loading ? (\n <p className={chatClass(\"studio-chat-empty\", chatLayout.empty)}>\n Loading sessions…\n </p>\n ) : null}\n {!props.loading && props.sessions.length === 0 ? (\n <p className={chatClass(\"studio-chat-empty\", chatLayout.empty)}>\n No conversations yet.\n </p>\n ) : null}\n {props.sessions.map((session) => (\n <button\n className={chatClass(\n \"studio-chat-session\",\n chatLayout.session,\n session.id === props.activeSessionId && chatLayout.activeSession,\n )}\n data-active={\n session.id === props.activeSessionId ? \"true\" : \"false\"\n }\n type=\"button\"\n key={session.id}\n onClick={() => props.onSelect(session.id)}\n >\n <strong\n className={chatClass(\n \"studio-chat-session-title\",\n chatLayout.sessionTitle,\n )}\n >\n {session.title}\n </strong>\n <time\n className={chatClass(\n \"studio-chat-session-time\",\n chatLayout.timestamp,\n )}\n dateTime={session.lastActiveAt}\n title={session.lastActiveAt}\n >\n {formatSessionTime(session.lastActiveAt)}\n </time>\n </button>\n ))}\n </div>\n </aside>\n );\n}\n\nfunction ChatEmptyState(): ReactElement {\n return (\n <section\n className={chatClass(\n \"studio-chat-empty\",\n chatLayout.empty,\n chatLayout.emptyConversation,\n )}\n aria-label=\"New conversation\"\n >\n <p className={chatClass(\"\", chatLayout.cardText)}>\n No messages yet. Your draft stays in the composer until you send it.\n </p>\n </section>\n );\n}\n\nfunction ChatTurn(props: {\n message: ChatHistoryMessage;\n onAction: (action: ChatSuggestedAction) => Promise<void>;\n onApproval: (\n approval: StudioChatApproval,\n approved: boolean,\n ) => Promise<void>;\n}): ReactElement {\n return (\n <article\n className={chatClass(\"studio-chat-turn\", chatLayout.turn)}\n data-role={props.message.role}\n >\n <span className={chatClass(\"studio-chat-turn-label\", chatLayout.speaker)}>\n {props.message.role === \"user\" ? \"You\" : \"Brain\"}\n </span>\n <div\n className={chatClass(\n \"studio-chat-turn-body\",\n chatLayout.turnBody,\n props.message.role === \"user\" && chatLayout.userBody,\n )}\n >\n {props.message.content ? (\n props.message.role === \"assistant\" ? (\n <StudioMarkdown\n className={chatClass(\"studio-chat-prose\", chatLayout.cards)}\n presentation=\"chat\"\n >\n {props.message.content}\n </StudioMarkdown>\n ) : (\n <p className={chatClass(\"studio-chat-text\", chatLayout.paragraph)}>\n {props.message.content}\n </p>\n )\n ) : null}\n {props.message.attachments?.map((attachment) => (\n <p\n className={chatClass(\"studio-chat-upload\", chatLayout.upload)}\n key={`${attachment.filename}-${attachment.createdAt}`}\n >\n {attachment.filename}\n </p>\n ))}\n {props.message.cards?.length ? (\n <div className={chatClass(\"studio-chat-cards\", chatLayout.cards)}>\n {props.message.cards.map((card) => (\n <MessageCard\n card={card}\n key={`${card.kind}-${card.id}`}\n onAction={props.onAction}\n onApproval={props.onApproval}\n />\n ))}\n </div>\n ) : null}\n </div>\n </article>\n );\n}\n\nfunction MessageCard(props: {\n card: ChatCard;\n onAction: (action: ChatSuggestedAction) => Promise<void>;\n onApproval: (\n approval: StudioChatApproval,\n approved: boolean,\n ) => Promise<void>;\n}): ReactElement {\n const { card } = props;\n if (card.kind === \"actions\") {\n return (\n <section className={chatClass(\"studio-chat-card\", chatLayout.card)}>\n <span\n className={chatClass(\"studio-chat-card-kicker\", chatLayout.kicker)}\n >\n Actions\n </span>\n {card.title ? <strong>{card.title}</strong> : null}\n <div\n className={chatClass(\"studio-chat-card-actions\", chatLayout.actions)}\n >\n {card.actions.map((action) => (\n <button\n className={chatClass(\n \"studio-chat-card-action\",\n chatLayout.button,\n )}\n type=\"button\"\n key={action.id}\n onClick={() => void props.onAction(action)}\n >\n {action.label}\n </button>\n ))}\n </div>\n </section>\n );\n }\n if (card.kind === \"sources\") {\n return (\n <section className={chatClass(\"studio-chat-card\", chatLayout.card)}>\n <span\n className={chatClass(\"studio-chat-card-kicker\", chatLayout.kicker)}\n >\n Sources\n </span>\n <ul>\n {card.sources.map((source) => (\n <li key={source.id}>\n {source.url ? (\n <a href={source.url}>{source.title ?? source.source}</a>\n ) : (\n (source.title ?? source.source)\n )}\n </li>\n ))}\n </ul>\n </section>\n );\n }\n if (card.kind === \"attachment\") {\n return (\n <section className={chatClass(\"studio-chat-card\", chatLayout.card)}>\n <span\n className={chatClass(\"studio-chat-card-kicker\", chatLayout.kicker)}\n >\n Artifact\n </span>\n <strong>{card.title}</strong>\n {card.description ? (\n <p\n className={chatClass(\n \"studio-chat-card-description\",\n chatLayout.cardText,\n )}\n >\n {card.description}\n </p>\n ) : null}\n {card.attachment.previewUrl || card.attachment.downloadUrl ? (\n <div\n className={chatClass(\n \"studio-chat-card-actions\",\n chatLayout.actions,\n )}\n >\n <a\n className={chatClass(\n \"studio-chat-card-action\",\n chatLayout.button,\n )}\n href={card.attachment.previewUrl ?? card.attachment.downloadUrl}\n >\n Open\n </a>\n </div>\n ) : null}\n </section>\n );\n }\n const pending = card.state === \"approval-requested\";\n const approval: StudioChatApproval = {\n approvalId: card.id,\n toolCallId: card.toolCallId ?? card.id,\n toolName: card.toolName,\n ...(card.input ? { input: card.input } : {}),\n ...(card.summary ? { title: card.summary } : {}),\n };\n return (\n <section className={chatClass(\"studio-chat-card\", chatLayout.card)}>\n <span className={chatClass(\"studio-chat-card-kicker\", chatLayout.kicker)}>\n {pending ? \"Approval required\" : \"Approval record\"}\n </span>\n <strong>{card.summary}</strong>\n {card.preview ? (\n <p\n className={chatClass(\n \"studio-chat-card-preview\",\n chatLayout.paragraph,\n )}\n >\n {card.preview}\n </p>\n ) : null}\n {pending ? (\n <div\n className={chatClass(\n \"studio-chat-approval-actions\",\n chatLayout.actions,\n )}\n >\n <button\n className={chatClass(\n \"studio-chat-approval-action\",\n chatLayout.button,\n )}\n type=\"button\"\n onClick={() => void props.onApproval(approval, false)}\n >\n Decline\n </button>\n <button\n className={chatClass(\n \"studio-chat-approval-action\",\n chatLayout.button,\n chatLayout.primaryButton,\n )}\n data-primary=\"true\"\n type=\"button\"\n onClick={() => void props.onApproval(approval, true)}\n >\n Approve\n </button>\n </div>\n ) : null}\n </section>\n );\n}\n\nfunction ApprovalCard(props: {\n approval: StudioChatApproval;\n disabled: boolean;\n onDecision: (\n approval: StudioChatApproval,\n approved: boolean,\n ) => Promise<void>;\n}): ReactElement {\n return (\n <section className={chatClass(\"studio-chat-approval\", chatLayout.card)}>\n <span className={chatClass(\"studio-chat-card-kicker\", chatLayout.kicker)}>\n Approval required\n </span>\n <strong>{props.approval.title ?? props.approval.toolName}</strong>\n <div\n className={chatClass(\n \"studio-chat-approval-actions\",\n chatLayout.actions,\n )}\n >\n <button\n className={chatClass(\n \"studio-chat-approval-action\",\n chatLayout.button,\n )}\n type=\"button\"\n disabled={props.disabled}\n onClick={() => void props.onDecision(props.approval, false)}\n >\n Decline\n </button>\n <button\n className={chatClass(\n \"studio-chat-approval-action\",\n chatLayout.button,\n chatLayout.primaryButton,\n )}\n data-primary=\"true\"\n type=\"button\"\n disabled={props.disabled}\n onClick={() => void props.onDecision(props.approval, true)}\n >\n Approve\n </button>\n </div>\n </section>\n );\n}\n\nfunction Composer(props: {\n locked: boolean;\n onRemoveUpload: (id: string) => void;\n draft: string;\n uploads: ChatUploadResponse[];\n sending: boolean;\n uploading: boolean;\n onDraft: (value: string) => void;\n onFiles: (event: ChangeEvent<HTMLInputElement>) => Promise<void>;\n onSubmit: (event: FormEvent<HTMLFormElement>) => void;\n onStop?: (() => void) | undefined;\n onJumpToLatest?: (() => void) | undefined;\n}): ReactElement {\n const keyDown = (event: KeyboardEvent<HTMLTextAreaElement>): void => {\n if (\n event.key === \"Enter\" &&\n !event.shiftKey &&\n !event.nativeEvent.isComposing\n ) {\n event.preventDefault();\n event.currentTarget.form?.requestSubmit();\n }\n };\n return (\n <footer className={chatClass(\"studio-chat-composer\", chatLayout.composer)}>\n {props.onJumpToLatest && (\n <Button type=\"button\" variant=\"ghost\" onClick={props.onJumpToLatest}>\n Jump to latest ↓\n </Button>\n )}\n {props.uploads.length > 0 ? (\n <div\n className={chatClass(\n \"studio-chat-upload-list\",\n chatLayout.uploadList,\n )}\n >\n {props.uploads.map((upload) => (\n <span\n className={chatClass(\"studio-chat-upload\", chatLayout.upload)}\n key={upload.id}\n >\n {upload.filename}{\" \"}\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"sm\"\n aria-label={`Remove ${upload.filename} from message`}\n disabled={props.locked}\n onClick={() => props.onRemoveUpload(upload.id)}\n >\n ×\n </Button>\n </span>\n ))}\n </div>\n ) : null}\n <form\n className={chatClass(\"studio-chat-composer-form\", chatLayout.form)}\n onSubmit={props.onSubmit}\n >\n <label\n className={chatClass(\n \"studio-chat-message-label\",\n chatLayout.fieldLabel,\n )}\n >\n Message\n <textarea\n className={chatClass(\"studio-chat-message\", chatLayout.input)}\n aria-label=\"Message\"\n placeholder=\"Write to your brain…\"\n value={props.draft}\n disabled={props.locked}\n onChange={(event) => props.onDraft(event.target.value)}\n onKeyDown={keyDown}\n />\n </label>\n <div\n className={chatClass(\n \"studio-chat-composer-actions\",\n chatLayout.actions,\n )}\n >\n <label\n className={chatClass(\n \"studio-chat-composer-action\",\n chatLayout.attachButton,\n )}\n aria-label=\"Attach files\"\n >\n {props.uploading ? \"Attaching…\" : \"Attach files\"}\n <input\n className={chatClass(\n \"studio-chat-upload-input\",\n chatLayout.uploadInput,\n )}\n type=\"file\"\n multiple\n disabled={props.locked || props.sending || props.uploading}\n onChange={(event) => void props.onFiles(event)}\n />\n </label>\n {props.locked ? (\n <Button type=\"button\" disabled>\n Archiving…\n </Button>\n ) : props.sending ? (\n <Button\n type=\"button\"\n variant=\"outline\"\n onClick={props.onStop}\n disabled={!props.onStop}\n title=\"Stop receiving the response. Completed actions are not undone.\"\n >\n Stop\n </Button>\n ) : (\n <Button\n className=\"studio-chat-composer-action\"\n type=\"submit\"\n aria-label=\"Send message\"\n disabled={\n props.uploading ||\n (!props.draft.trim() && props.uploads.length === 0)\n }\n >\n Send\n </Button>\n )}\n </div>\n </form>\n </footer>\n );\n}\n\nfunction WorkingSet(props: {\n cards: ChatCard[];\n messages: ChatHistoryMessage[];\n progress: StudioChatStreamState[\"progress\"];\n session: ChatSession | undefined;\n}): ReactElement {\n return (\n <aside\n className={chatClass(\"studio-chat-context\", chatLayout.contextBody)}\n aria-label=\"Working set\"\n >\n <div className={chatClass(\"studio-chat-context-list\", chatLayout.cards)}>\n {props.session?.contextHandoff ? (\n <section\n className={chatClass(\n \"studio-chat-context-card\",\n chatLayout.contextItem,\n )}\n >\n <span\n className={chatClass(\n \"studio-chat-context-kicker\",\n chatLayout.kicker,\n )}\n >\n Linked context\n </span>\n <h3\n className={chatClass(\n \"studio-chat-context-card-title\",\n chatLayout.cardHeading,\n )}\n >\n {props.session.contextHandoff.titleSeed}\n </h3>\n <p\n className={chatClass(\n \"studio-chat-context-card-text\",\n chatLayout.cardText,\n )}\n >\n {props.session.contextHandoff.sourceId} ·{\" \"}\n {props.session.contextHandoff.itemId}\n </p>\n </section>\n ) : null}\n {props.cards.length === 0 && props.progress.length === 0 ? (\n <p className={chatClass(\"studio-chat-empty\", chatLayout.empty)}>\n Sources, artifacts, and durable jobs appear here as the conversation\n develops.\n </p>\n ) : null}\n {props.cards.map((card, index) => (\n <section\n className={chatClass(\n \"studio-chat-context-card\",\n chatLayout.contextItem,\n )}\n key={`${card.kind}-${card.id}-${index}`}\n >\n <span\n className={chatClass(\n \"studio-chat-context-kicker\",\n chatLayout.kicker,\n )}\n >\n {card.kind === \"sources\" ? \"Sources\" : \"Artifact\"}\n </span>\n <h3\n className={chatClass(\n \"studio-chat-context-card-title\",\n chatLayout.cardHeading,\n )}\n >\n {card.kind === \"sources\"\n ? (card.title ?? `${card.sources.length} consulted`)\n : card.kind === \"attachment\"\n ? card.title\n : \"Conversation context\"}\n </h3>\n {card.kind === \"sources\" ? (\n <>\n <ul>\n {card.sources.slice(0, 5).map((source) => (\n <li key={source.id}>{source.title ?? source.source}</li>\n ))}\n </ul>\n {card.sources.length > 5 ? (\n <p\n className={chatClass(\n \"studio-chat-context-card-text\",\n chatLayout.cardText,\n )}\n >\n {card.sources.length - 5} more sources in the conversation.\n </p>\n ) : null}\n </>\n ) : card.kind === \"attachment\" && card.description ? (\n <p\n className={chatClass(\n \"studio-chat-context-card-text\",\n chatLayout.cardText,\n )}\n >\n {card.description}\n </p>\n ) : null}\n </section>\n ))}\n {props.progress.map((item, index) => (\n <section\n className={chatClass(\n \"studio-chat-context-card\",\n chatLayout.contextItem,\n )}\n key={`${item.type}-${index}`}\n >\n <span\n className={chatClass(\n \"studio-chat-context-kicker\",\n chatLayout.kicker,\n )}\n >\n Durable job\n </span>\n <h3\n className={chatClass(\n \"studio-chat-context-card-title\",\n chatLayout.cardHeading,\n )}\n >\n {item.operationTarget ?? item.operationType}\n </h3>\n <p\n className={chatClass(\n \"studio-chat-context-card-text\",\n chatLayout.cardText,\n )}\n >\n {item.message ?? item.status}\n </p>\n </section>\n ))}\n {props.messages.length > 0 ? (\n <section\n className={chatClass(\n \"studio-chat-context-card\",\n chatLayout.contextItem,\n )}\n >\n <span\n className={chatClass(\n \"studio-chat-context-kicker\",\n chatLayout.kicker,\n )}\n >\n Activity\n </span>\n <h3\n className={chatClass(\n \"studio-chat-context-card-title\",\n chatLayout.cardHeading,\n )}\n >\n Visible conversation\n </h3>\n <p\n className={chatClass(\n \"studio-chat-context-card-text\",\n chatLayout.cardText,\n )}\n >\n {props.messages.length} visible messages.\n </p>\n </section>\n ) : null}\n </div>\n </aside>\n );\n}\n\nfunction formatSessionTime(value: string): string {\n const date = new Date(value);\n if (Number.isNaN(date.getTime())) return \"\";\n return new Intl.DateTimeFormat(undefined, {\n day: \"numeric\",\n year:\n date.getFullYear() === new Date().getFullYear() ? undefined : \"numeric\",\n month: \"short\",\n timeZoneName: \"short\",\n hour: \"2-digit\",\n minute: \"2-digit\",\n }).format(date);\n}\n\nfunction errorMessage(cause: unknown, fallback: string): string {\n return cause instanceof Error && cause.message ? cause.message : fallback;\n}\n",
|
|
9
9
|
"import {\n chatMessageSchema,\n type ChatCard,\n type ChatHistoryMessage,\n type ChatMessage,\n type ChatProgressEvent,\n type ChatProtocolEvent,\n type ChatToolStatusEvent,\n} from \"@brains/contracts/chat\";\n\ninterface StudioChatToolInput {\n toolCallId: string;\n toolName: string;\n input: unknown;\n title?: string | undefined;\n}\n\nexport interface StudioChatApproval {\n approvalId: string;\n toolCallId: string;\n toolName: string;\n input?: Record<string, unknown> | undefined;\n title?: string | undefined;\n}\n\nexport interface StudioChatStreamState {\n messageId: string;\n text: string;\n cards: ChatCard[];\n approvals: StudioChatApproval[];\n progress: ChatProgressEvent[];\n statuses: ChatToolStatusEvent[];\n toolInputs: Readonly<Record<string, StudioChatToolInput>>;\n finished: boolean;\n error: string | null;\n}\n\nexport function createStudioChatStreamState(): StudioChatStreamState {\n return {\n messageId: \"assistant-stream\",\n text: \"\",\n cards: [],\n approvals: [],\n progress: [],\n statuses: [],\n toolInputs: {},\n finished: false,\n error: null,\n };\n}\n\n/** Studio-owned assembly of raw server protocol facts into one visible turn. */\nexport function reduceStudioChatStream(\n state: StudioChatStreamState,\n event: ChatProtocolEvent,\n): StudioChatStreamState {\n switch (event.type) {\n case \"start\":\n return event.messageId ? { ...state, messageId: event.messageId } : state;\n case \"text-delta\":\n return { ...state, text: `${state.text}${event.delta}` };\n case \"tool-input-available\":\n return {\n ...state,\n toolInputs: {\n ...state.toolInputs,\n [event.toolCallId]: {\n toolCallId: event.toolCallId,\n toolName: event.toolName,\n input: event.input,\n ...(event.title ? { title: event.title } : {}),\n },\n },\n };\n case \"tool-approval-request\": {\n const tool = state.toolInputs[event.toolCallId];\n const approval: StudioChatApproval = {\n approvalId: event.approvalId,\n toolCallId: event.toolCallId,\n toolName: tool?.toolName ?? \"tool\",\n ...(isRecord(tool?.input) ? { input: tool.input } : {}),\n ...(tool?.title ? { title: tool.title } : {}),\n };\n return {\n ...state,\n approvals: [\n ...state.approvals.filter(\n (item) => item.approvalId !== event.approvalId,\n ),\n approval,\n ],\n };\n }\n case \"tool-output-available\":\n case \"tool-output-error\":\n case \"tool-output-denied\":\n return {\n ...state,\n approvals: state.approvals.filter(\n (approval) => approval.toolCallId !== event.toolCallId,\n ),\n };\n case \"data-progress\":\n return { ...state, progress: [...state.progress, event.data] };\n case \"data-status\":\n return { ...state, statuses: [...state.statuses, event.data] };\n case \"data-actions\":\n case \"data-sources\":\n case \"data-attachment\":\n return { ...state, cards: [...state.cards, event.data] };\n case \"finish\":\n return { ...state, finished: true };\n case \"abort\":\n return {\n ...state,\n finished: true,\n error: event.reason ?? \"Response stopped\",\n };\n case \"error\":\n return { ...state, finished: true, error: event.errorText };\n default:\n return state;\n }\n}\n\nexport function streamAssistantMessage(\n state: StudioChatStreamState,\n): ChatHistoryMessage {\n return {\n id: state.messageId,\n role: \"assistant\",\n content: state.text,\n ...(state.cards.length > 0 ? { cards: state.cards } : {}),\n };\n}\n\nexport function approvalResponseMessage(\n approval: StudioChatApproval,\n approved: boolean,\n): ChatMessage {\n const response = {\n id: approval.approvalId,\n approved,\n toolCallId: approval.toolCallId,\n toolName: approval.toolName,\n ...(approval.input ? { input: approval.input } : {}),\n ...(approval.title ? { title: approval.title } : {}),\n };\n return chatMessageSchema.parse({\n role: \"assistant\",\n parts: [\n {\n state: \"approval-responded\",\n toolCallId: approval.toolCallId,\n toolName: approval.toolName,\n ...(approval.input ? { input: approval.input } : {}),\n ...(approval.title ? { title: approval.title } : {}),\n approval: response,\n },\n ],\n });\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n"
|
|
10
10
|
],
|
|
11
|
-
"mappings": "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",
|
|
12
|
-
"debugId": "
|
|
11
|
+
"mappings": "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",
|
|
12
|
+
"debugId": "84718F9E1CF8297664756E2164756E21",
|
|
13
13
|
"names": []
|
|
14
14
|
}
|