{"version":3,"sources":["../../agent/server/builder.ts","../../plugins/defaults/memories/server/builder.ts","../../plugins/defaults/stores/builder.ts","../../plugins/server/builder.ts","../../shared/messages.ts","../../plugins/defaults/generation/server/config.ts","../../plugins/defaults/generation/server/context.ts","../../plugins/defaults/generation/server/status.ts","../../plugins/defaults/generation/server/events.ts","../../models/llm/resources.ts","../../plugins/defaults/generation/server/orchestrator.ts","../../plugins/defaults/generation/server/generation.ts","../../plugins/defaults/generation/server/index.ts","../../plugins/defaults/memories/server/config.ts","../../plugins/defaults/memories/server/context.ts","../../plugins/defaults/memories/server/events.ts","../../plugins/defaults/memories/server/index.ts","../../plugins/defaults/stores/server.ts","../../exports/server.ts"],"sourcesContent":["import { z } from \"zod\";\nimport type { agentServerConfig } from \"@/agent/server/config\";\nimport { defaults } from \"@/exports/server\";\nimport type { PluginConfig, PluginDefinition } from \"@/plugins/server/types\";\nimport { toMethodName } from \"@/shared/method-name\";\nimport type { Override } from \"@/shared/types\";\nimport type { AgentDefinition, AgentScopeDefinition, TypedAgentBuilder } from \"./types\";\n\nexport class AgentBuilder<const AgentDef extends AgentDefinition, Excluded extends string = never> {\n  readonly def: AgentDef;\n\n  constructor(definition: AgentDef) {\n    this.def = definition;\n  }\n\n  config(config: z.input<typeof agentServerConfig.schema>) {\n    const builder = new AgentBuilder({ ...this.def, config });\n    const builderWithPlugins = AgentBuilder.withPluginsMethods(builder);\n    return builderWithPlugins as unknown as TypedAgentBuilder<AgentDef, Excluded | \"config\">;\n  }\n\n  scope<Schema extends z.ZodObject>(scope: AgentScopeDefinition<Schema>) {\n    const builder = new AgentBuilder({ ...this.def, scope });\n    const builderWithPlugins = AgentBuilder.withPluginsMethods(builder) as never;\n    return builderWithPlugins as TypedAgentBuilder<\n      Override<AgentDef, \"scope\", AgentScopeDefinition<Schema>>,\n      Excluded | \"scope\"\n    >;\n  }\n\n  /**\n   * Register plugins to extend the agent server features.\n   * Defaults to `[generation, memories, stores, actions, percepts]` plugins if not specified.\n   *\n   * In case you want to register custom plugins and still keep the defaults you can do:\n   * ```ts\n   * import { defaults } from \"life/client\";\n   *\n   * defineAgentClient(\"my-agent\").plugins([...defaults.plugins, myCustomPlugin]);\n   * ```\n   *\n   * Or if you want only some of the defaults, you can do:\n   * ```ts\n   * import { defaults } from \"life/client\";\n   *\n   * defineAgentClient(\"my-agent\").plugins([defaults.plugins.generation, defaults.plugins.memories]);\n   * ```\n   */\n  plugins<Plugins extends { def: PluginDefinition }[]>(plugins: Plugins) {\n    const builder = new AgentBuilder({ ...this.def, plugins: plugins.map((p) => p.def) });\n    const builderWithPlugins = AgentBuilder.withPluginsMethods(builder) as never;\n    return builderWithPlugins as TypedAgentBuilder<\n      Override<\n        Override<\n          AgentDef,\n          \"plugins\",\n          {\n            [K in keyof Plugins]: Plugins[K][\"def\"];\n          }\n        >,\n        \"pluginConfigs\",\n        {\n          [K in Plugins[number] as K[\"def\"][\"name\"]]: PluginConfig<K[\"def\"][\"config\"], \"output\">;\n        }\n      >,\n      Excluded | \"plugins\"\n    >;\n  }\n\n  // biome-ignore lint/suspicious/noExplicitAny: reason\n  static withPluginsMethods<Builder extends AgentBuilder<any, any>>(builder: Builder) {\n    for (const plugin of builder.def.plugins) {\n      Object.assign(builder, {\n        [toMethodName(plugin.name)]: (\n          config: z.input<PluginDefinition[\"config\"][\"schema\"]>,\n        ): unknown => {\n          const newBuilder = new AgentBuilder({\n            ...builder.def,\n            pluginConfigs: {\n              ...(builder.def.pluginConfigs ?? {}),\n              [plugin.name]: config,\n            },\n          });\n          return AgentBuilder.withPluginsMethods(newBuilder);\n        },\n      });\n    }\n    return builder;\n  }\n}\n\nexport function defineAgent<const Name extends string>(name: Name) {\n  const defaultDefinition = {\n    name,\n    config: {},\n    scope: { schema: z.object(), hasAccess: () => true },\n    plugins: [...defaults.plugins].map((p) => p.def),\n    pluginConfigs: {},\n  } as const satisfies AgentDefinition;\n  const builder = new AgentBuilder(defaultDefinition);\n  const builderWithPlugins = AgentBuilder.withPluginsMethods(builder);\n  return builderWithPlugins as TypedAgentBuilder<typeof builderWithPlugins.def, never>;\n}\n","import { z } from \"zod\";\nimport type { Message } from \"@/shared/messages\";\n\n// Dependencies\ninterface _MemoryDependenciesDefinition {\n  stores: { name: string }[];\n  collections: { name: string }[];\n}\n\ntype MemoryDependenciesDefinition =\n  | _MemoryDependenciesDefinition\n  | { _definition: _MemoryDependenciesDefinition };\n\n// Config\nexport const memoryConfigSchema = z.object({\n  behavior: z.enum([\"blocking\", \"non-blocking\"]).prefault(\"blocking\"),\n});\n\nexport type MemoryConfig<T extends \"input\" | \"output\"> = T extends \"input\"\n  ? z.input<typeof memoryConfigSchema>\n  : z.output<typeof memoryConfigSchema>;\n\n// Definition\nexport interface MemoryDefinition {\n  name: string;\n  config: MemoryConfig<\"output\">;\n  output?: Message[] | ((params: { messages: Message[] }) => Message[] | Promise<Message[]>);\n  onHistoryChange?: (params: { messages: Message[] }) => void;\n  dependencies: MemoryDependenciesDefinition;\n}\n\n// Builder\nexport class MemoryDefinitionBuilder<\n  const Definition extends MemoryDefinition,\n  Excluded extends string = never,\n> {\n  _definition: Definition;\n\n  constructor(def: Definition) {\n    this._definition = def;\n  }\n\n  dependencies<Dependencies extends MemoryDependenciesDefinition>(dependencies: Dependencies) {\n    type NewExcluded = Excluded | \"dependencies\";\n    return new MemoryDefinitionBuilder({\n      ...this._definition,\n      dependencies: \"_definition\" in dependencies ? dependencies._definition : dependencies,\n    }) as Omit<\n      MemoryDefinitionBuilder<Definition & { dependencies: Dependencies }, NewExcluded>,\n      NewExcluded\n    >;\n  }\n\n  config(config: MemoryConfig<\"input\">) {\n    const parsedConfig = memoryConfigSchema.parse(config);\n    type NewExcluded = Excluded | \"config\";\n    return new MemoryDefinitionBuilder({\n      ...this._definition,\n      config: parsedConfig,\n    }) as Omit<\n      MemoryDefinitionBuilder<Definition & { config: typeof parsedConfig }, NewExcluded>,\n      NewExcluded\n    >;\n  }\n\n  output(\n    // biome-ignore lint/nursery/noShadow: expected here\n    params: Message[] | ((params: { messages: Message[] }) => Message[] | Promise<Message[]>),\n  ) {\n    type NewExcluded = Excluded | \"output\";\n    return new MemoryDefinitionBuilder({\n      ...this._definition,\n      output: params,\n    }) as Omit<\n      MemoryDefinitionBuilder<Definition & { output: typeof params }, NewExcluded>,\n      NewExcluded\n    >;\n  }\n  // biome-ignore lint/nursery/noShadow: expected here\n  onHistoryChange(params: (params: { messages: Message[] }) => void) {\n    type NewExcluded = Excluded | \"onHistoryChange\";\n    return new MemoryDefinitionBuilder({\n      ...this._definition,\n      onHistoryChange: params,\n    }) as Omit<\n      MemoryDefinitionBuilder<Definition & { onHistoryChange: typeof params }, NewExcluded>,\n      NewExcluded\n    >;\n  }\n}\n\nexport function defineMemory<const Name extends string>(name: Name) {\n  return new MemoryDefinitionBuilder({\n    name,\n    config: memoryConfigSchema.parse({}), // Will default to { behavior: \"blocking\" }\n    dependencies: {\n      stores: [],\n      collections: [],\n    },\n  });\n}\n","import { z } from \"zod\";\nimport type { serializableValueSchema } from \"@/shared/canon\";\n\n// - Config\nconst commonStoreConfigSchema = z.object({\n  schema: z.custom<\n    | z.ZodRecord<z.ZodString, typeof serializableValueSchema>\n    | z.ZodArray<typeof serializableValueSchema>\n  >((val) => {\n    if (val instanceof z.ZodArray || val instanceof z.ZodRecord) return true;\n    return false;\n  }),\n});\n\nexport const controlledStoreConfigSchema = commonStoreConfigSchema.extend({\n  type: z.literal(\"controlled\"),\n\n  ttl: z.number().optional(),\n});\n\nexport const freeformStoreConfigSchema = commonStoreConfigSchema.extend({\n  type: z.literal(\"freeform\"),\n});\n\nexport const storeConfigSchema = z.union([controlledStoreConfigSchema, freeformStoreConfigSchema]);\n\nexport type StoreConfig<T extends \"input\" | \"output\"> = T extends \"input\"\n  ? z.input<typeof storeConfigSchema>\n  : z.output<typeof storeConfigSchema>;\n\n// - Retrieve\nexport type StoreRetrieve<Config extends StoreConfig<\"output\">> = () =>\n  | z.infer<Config[\"schema\"]>\n  | Promise<z.infer<Config[\"schema\"]>>;\n\n// - Definition\nexport interface StoreDefinition {\n  name: string;\n  config: StoreConfig<\"output\">;\n  retrieve?: () => unknown | Promise<unknown>;\n}\n\n// Builder class\nexport class StoreDefinitionBuilder<\n  const Definition extends StoreDefinition,\n  Excluded extends string = never,\n> {\n  _definition: Definition;\n\n  constructor(def: Definition) {\n    this._definition = def;\n  }\n\n  config<Config extends StoreConfig<\"input\">>(config: Config) {\n    const parsedConfig = storeConfigSchema.parse(config);\n    type NewExcluded =\n      | Excluded\n      | \"config\"\n      | (Config[\"type\"] extends \"controlled\" ? never : \"retrieve\");\n    return new StoreDefinitionBuilder({\n      ...this._definition,\n      config: parsedConfig,\n    }) as Omit<StoreDefinitionBuilder<Definition & { config: Config }, NewExcluded>, NewExcluded>;\n  }\n\n  retrieve(retrieve: StoreRetrieve<Definition[\"config\"]>) {\n    type NewExcluded = Excluded | \"retrieve\";\n    return new StoreDefinitionBuilder({\n      ...this._definition,\n      retrieve,\n    }) as Omit<\n      StoreDefinitionBuilder<\n        Definition & { retrieve: StoreRetrieve<Definition[\"config\"]> },\n        NewExcluded\n      >,\n      NewExcluded\n    >;\n  }\n}\n\nexport function defineStore<const Name extends string>(name: Name) {\n  return new StoreDefinitionBuilder({ name, config: storeConfigSchema.parse({}) });\n}\n\n// const store = defineStore(\"store\")\n//   .config({\n//     type: \"controlled\",\n//     schema: z.object({\n//       name: z.string(),\n//     }),\n//     ttl: 1000,\n//   })\n//   .retrieve(() => {\n//     return { name: \"test\" };\n//   });\n","import { z } from \"zod\";\nimport type { Override, Without } from \"@/shared/types\";\nimport { type ZodObjectWithTelemetry, zodObjectWithTelemetry } from \"@/telemetry/helpers/zod\";\nimport {\n  type FilterHandlersByName,\n  internalEventsDef,\n  type PluginConfigDefinition,\n  type PluginContextDefinition,\n  type PluginDefinition,\n  type PluginEventsDefinition,\n  type PluginHandlerDefinition,\n  type PluginHandlerStateDefinition,\n  type TypedPluginBuilder,\n} from \"./types\";\n\n/**\n * ### `definePluginConfig()`\n *\n * Standalone version of `definePlugin().config()` used to break down plugin definition.\n *\n * Its output must then be passed to `definePlugin().$config()`.\n *\n * @example\n * ```ts\n * const configDef = definePluginConfig({ schema: z.object({ name: z.string() }) });\n * const plugin = definePlugin(\"my-plugin\").$config(configDef); // <-- Here\n *\n * // Equivalent to:\n * const plugin = definePlugin(\"my-plugin\").config({ schema: z.object({ name: z.string() }) }); // <-- Here\n * ```\n * &nbsp;\n *\n * ---\n * @returns The config definition.\n */\nexport const definePluginConfig = <Schema extends z.ZodObject>(\n  definition: ZodObjectWithTelemetry<Schema, \"input\">,\n) => zodObjectWithTelemetry(definition);\n\n/**\n * ### `definePluginContext()`\n *\n * Standalone version of `definePlugin().context()` used to break down plugin definition.\n *\n * Its output must then be passed to `definePlugin().$context()`.\n *\n * @example\n * ```ts\n * const contextDef = definePluginContext(z.object({ name: z.string() }));\n * const plugin = definePlugin(\"my-plugin\").$context(contextDef);\n *\n * // Equivalent to:\n * const plugin = definePlugin(\"my-plugin\").context(z.object({ name: z.string() }));\n * ```\n * &nbsp;\n *\n * ---\n * @returns\n */\nexport const definePluginContext = <Schema extends z.ZodObject>(\n  definition: ZodObjectWithTelemetry<Schema, \"input\">,\n) => zodObjectWithTelemetry(definition);\n\n/**\n * ### `definePluginEvents()`\n *\n * Standalone version of `definePlugin().events()` used to break down plugin definition.\n *\n * Its output must then be passed to `definePlugin().$events()`.\n *\n * @example\n * ```ts\n * const eventsDef = definePluginEvents([{ name: \"my-event\" }]);\n * const plugin = definePlugin(\"my-plugin\").$events(eventsDef);\n *\n * // Equivalent to:\n * const plugin = definePlugin(\"my-plugin\").events([{ name: \"my-event\" }]);\n * ```\n * &nbsp;\n *\n * ---\n * @returns The events definition.\n */\nexport const definePluginEvents = <\n  const Names extends string[],\n  EventsDef extends PluginEventsDefinition<Names>,\n>(\n  ...events: EventsDef\n) => [...internalEventsDef, ...events] as unknown as typeof internalEventsDef | EventsDef;\n\n/**\n * Builder class for the plugin definition.\n * Do not use directly, use `definePlugin()` instead.\n */\nexport class PluginBuilder<PluginDef extends PluginDefinition, Excluded extends string = never> {\n  readonly def: PluginDef;\n\n  constructor(definition: PluginDef) {\n    this.def = definition;\n  }\n\n  /**\n   * ### `.dependencies()`\n   *\n   * Specify other plugins as required by this plugin.\n   *\n   * Their context, events, and config can then be accessed from `dependencies.*` inside handlers.\n   *\n   * @see TODO: Add docs link\n   *\n   * @example\n   * ```ts\n   * const plugin = definePlugin(\"my-plugin\")\n   *    .dependencies([anotherPlugin]);\n   *    .addHandler({\n   *        name: \"handler-1\",\n   *        mode: \"block\",\n   *        onEvent: ({ dependencies }) => {\n   *            if (dependencies.anotherPlugin.config.delayMs > 10) { // <-- Here\n   *              // ...\n   *            }\n   *        },\n   *    });\n   * ```\n   * &nbsp;\n   *\n   * ---\n   * @param plugins - The dependencies definitions.\n   * @returns TypedPluginBuilder\n   */\n  dependencies<Plugins extends { def: PluginDefinition }[]>(plugins: Plugins) {\n    const dependencies = plugins.map((p) => p.def);\n    const builder = new PluginBuilder({ ...this.def, dependencies });\n    return builder as TypedPluginBuilder<\n      Override<\n        PluginDef,\n        \"dependencies\",\n        {\n          [K in keyof Plugins]: Without<Plugins[K][\"def\"], \"dependencies\">;\n        }\n      >,\n      Excluded | \"dependencies\"\n    >;\n  }\n\n  /**\n   * ### `.config()`\n   *\n   * Add a configuration that users can provide to tweak plugin's behavior.\n   *\n   * @see TODO: Add docs link\n   *\n   * @example\n   * ```ts\n   * const myPlugin = definePlugin(\"my-plugin\")\n   *    .config({ schema: z.object({ enableVoice: z.boolean() }) });\n   *\n   * const myAgent = defineAgent(\"my-agent\")\n   *    .plugins([myPlugin])\n   *    .myPlugin({ enableVoice: true }); // <-- Here\n   * ```\n   * &nbsp;\n   *\n   * ---\n   *\n   * The provided config can then be accessed from `plugin.config` inside handlers.\n   *\n   * @example\n   * ```ts\n   * const plugin = definePlugin(\"my-plugin\")\n   *    .config({ schema: z.object({ enableVoice: z.boolean() }) });\n   *    .addHandler({\n   *      name: \"handler-1\",\n   *      mode: \"block\",\n   *      onEvent: ({ plugin }) => {\n   *        if (plugin.config.enableVoice) { // <-- Here\n   *          // ...\n   *        }\n   *      },\n   *    });\n   *\n   * ```\n   * &nbsp;\n   *\n   * ---\n   * @param config - The config definition.\n   * @returns TypedPluginBuilder\n   */\n  config<Schema extends z.ZodObject>(config: ZodObjectWithTelemetry<Schema, \"input\">) {\n    return this.$config(zodObjectWithTelemetry(config));\n  }\n\n  /**\n   * ### `.$config()`\n   *\n   * Define plugin config from the output of `definePluginConfig()`.\n   *\n   * @see TODO: Add docs link for `definePluginConfig()`\n   *\n   * ---\n   * @param config - The config definition.\n   * @returns TypedPluginBuilder\n   */\n  $config<ConfigDef extends PluginConfigDefinition>(config: ConfigDef) {\n    const builder = new PluginBuilder({ ...this.def, config });\n    return builder as TypedPluginBuilder<\n      Override<PluginDef, \"config\", ConfigDef>,\n      Excluded | \"config\" | \"$config\"\n    >;\n  }\n\n  /**\n   * ### `.context()`\n   *\n   * Add an in-memory object that handlers can read/write to share data without race conditions.\n   *\n   * Context is also exposed to dependent plugins and synced to the frontend via RPC.\n   *\n   * The context must be serializable, and thus cannot contain functions, instances, etc.\n   * Use `state` property in handlers for non-serializable data instead.\n   *\n   * @see TODO: Add docs link\n   *\n   * @example\n   * ```ts\n   * const plugin = definePlugin(\"my-plugin\")\n   *    .context(z.object({ name: z.string() }));\n   * ```\n   * &nbsp;\n   *\n   * ---\n   * @param context - The context definition.\n   */\n  context<Schema extends z.ZodObject>(context: ZodObjectWithTelemetry<Schema, \"input\">) {\n    return this.$context(zodObjectWithTelemetry(context));\n  }\n\n  /**\n   * ### `.$context()`\n   *\n   * Define plugin context from the output of `definePluginContext()`.\n   *\n   * @see TODO: Add docs link for `definePluginContext()`\n   *\n   * ---\n   * @param context - The context definition.\n   * @returns TypedPluginBuilder\n   */\n  $context<ContextDef extends PluginContextDefinition>(context: ContextDef) {\n    const builder = new PluginBuilder({ ...this.def, context });\n    return builder as TypedPluginBuilder<\n      Override<PluginDef, \"context\", ContextDef>,\n      Excluded | \"context\" | \"$context\"\n    >;\n  }\n\n  /**\n   * ### `.events()`\n   *\n   * Add events that handlers can emit and observe to communicate with each other.\n   *\n   * Each plugin has a single event queue enforcing the order of execution, making\n   * plugins more predictable and easier to write and maintain.\n   *\n   * @see TODO: Add docs link\n   *\n   * @example\n   * ```ts\n   * const plugin = definePlugin(\"my-plugin\")\n   *    .events([{ name: \"my-event\" }])\n   *    .addHandler({\n   *      name: \"handler-1\",\n   *      mode: \"block\",\n   *      onEvent: ({ event, plugin }) => {\n   *        // Emit 'my-event' when the plugin starts\n   *        if (event.name === \"plugin.start\") {\n   *          plugin.events.emit({ name: \"my-event\" });\n   *        }\n   *      },\n   *    })\n   *    .addHandler({\n   *      name: \"handler-2\",\n   *      mode: \"block\",\n   *      onEvent: ({ event, plugin }) => {\n   *        // Listen to 'my-event' from handler-1\n   *        if (event.name === \"my-event\") {\n   *          // Do something...\n   *        }\n   *      },\n   *    });\n   * ```\n   * &nbsp;\n   *\n   * ---\n   * @param events - The events definition.\n   * @returns TypedPluginBuilder\n   */\n  events<const Names extends string[], EventsDef extends PluginEventsDefinition<Names>>(\n    ...events: EventsDef\n  ) {\n    return this.$events([...internalEventsDef, ...events] as unknown as\n      | typeof internalEventsDef\n      | EventsDef);\n  }\n\n  /**\n   * ### `.$events()`\n   *\n   * Define plugin events from the output of `definePluginEvents()`.\n   *\n   * @see TODO: Add docs link for `definePluginEvents()`\n   *\n   * ---\n   * @param events - The events definition.\n   * @returns TypedPluginBuilder\n   */\n  $events<EventsDef extends PluginEventsDefinition>(events: EventsDef) {\n    const builder = new PluginBuilder({ ...this.def, events });\n    return builder as TypedPluginBuilder<\n      Override<PluginDef, \"events\", EventsDef>,\n      Excluded | \"events\" | \"$events\"\n    >;\n  }\n\n  /**\n   * ### `.addHandler()`\n   *\n   * Add a handler function to react to events from this plugin or dependent plugins.\n   *\n   * @see TODO: Add docs link\n   *\n   * @example\n   * ```ts\n   * const plugin = definePlugin(\"my-plugin\")\n   *    .addHandler({\n   *      name: \"handler-1\",\n   *      mode: \"block\",\n   *      onEvent: ({ event, plugin }) => {\n   *        // Do something...\n   *      },\n   *    });\n   * ```\n   * &nbsp;\n   *\n   * ---\n   *\n   * Handlers can return a value, which can be retrieved using the `events.waitForResult(eventId, handlerName)` method.\n   *\n   * @example\n   * ```ts\n   * const plugin = definePlugin(\"my-plugin\")\n   *    .events([{ name: \"my-event\" }])\n   *    .addHandler({\n   *      name: \"handler-1\",\n   *      mode: \"block\",\n   *      onEvent: () => 123;\n   *    })\n   *    .addHandler({\n   *      name: \"handler-2\",\n   *      mode: \"block\",\n   *      onEvent: ({ event, plugin }) => {\n   *        if (event.name === \"my-event\") {\n   *          const eventId = plugin.events.emit({ name: \"my-event\" });\n   *          const result = await plugin.events.waitForResult(eventId, \"handler-1\");\n   *          // result: string (type-safe!)\n   *        }\n   *      },\n   *    })\n   * ```\n   * &nbsp;\n   *\n   * ---\n   * @param handler - The handler definition.\n   * @returns TypedPluginBuilder\n   */\n  addHandler<\n    Name extends string,\n    Handler extends PluginHandlerDefinition<PluginDef, Name, StateDef>,\n    StateDef extends PluginHandlerStateDefinition<PluginDef>,\n  >(handler: Handler & { state?: StateDef }) {\n    const handlers = [...(this.def.handlers ?? []), handler];\n    const builder = new PluginBuilder({ ...this.def, handlers });\n    return builder as TypedPluginBuilder<\n      // @ts-expect-error - type narrowing complaint, but works fine as is\n      Override<\n        PluginDef,\n        \"handlers\",\n        [\n          ...PluginDef[\"handlers\"],\n          {\n            name: Handler[\"name\"];\n            mode: Handler[\"mode\"];\n            state: never; // State is internal, no need to store its type\n            onEvent: (params: unknown) => ReturnType<Handler[\"onEvent\"]>; // Omit params to reduce type explosion\n          },\n        ]\n      >,\n      Excluded\n    >;\n  }\n\n  /**\n   * ### `.removeHandler()`\n   *\n   * Remove a previously added handler from the plugin.\n   *\n   * @see TODO: Add docs link\n   *\n   * @example\n   * ```ts\n   * const plugin = definePlugin(\"my-plugin\")\n   *    .addHandler({\n   *      name: \"handler-1\",\n   *      mode: \"block\",\n   *      onEvent: ({ event, plugin }) => void 0,\n   *    });\n   *\n   * const pluginWithoutHandler1 = plugin.removeHandler(\"handler-1\");\n   * ```\n   * &nbsp;\n   *\n   * ---\n   * @param name - The name of the handler to remove.\n   * @returns TypedPluginBuilder\n   */\n  removeHandler<const Name extends PluginDef[\"handlers\"][number][\"name\"]>(name: Name) {\n    const handlers = this.def.handlers.filter((h) => h.name !== name);\n    const builder = new PluginBuilder({ ...this.def, handlers });\n    return builder as TypedPluginBuilder<\n      Override<PluginDef, \"handlers\", FilterHandlersByName<PluginDef[\"handlers\"], Name>>,\n      Excluded\n    >;\n  }\n}\n\n/**\n * ### `definePlugin()`\n *\n * Define a new Life.js plugin.\n *\n * @see TODO: Add docs link\n */\nexport function definePlugin<const Name extends string>(name: Name) {\n  return new PluginBuilder({\n    name,\n    dependencies: [],\n    config: zodObjectWithTelemetry({ schema: z.object() }),\n    context: zodObjectWithTelemetry({ schema: z.object() }),\n    events: internalEventsDef,\n    handlers: [],\n  });\n}\n","import { z } from \"zod\";\nimport { deepClone } from \"@/shared/deep-clone\";\nimport * as op from \"@/shared/operation\";\nimport { newId } from \"@/shared/prefixed-id\";\n\n// Base message\nexport const baseMessageSchema = {\n  id: z.string(),\n  createdAt: z.number(),\n  lastUpdated: z.number(),\n};\n\n// User message\nexport const userMessageSchema = z.object({\n  ...baseMessageSchema,\n  role: z.literal(\"user\"),\n  content: z.string().prefault(\"\"),\n});\nexport type UserMessage = z.output<typeof userMessageSchema>;\n\n// System message\nexport const systemMessageSchema = z.object({\n  ...baseMessageSchema,\n  role: z.literal(\"system\"),\n  content: z.string().prefault(\"\"),\n});\nexport type SystemMessage = z.output<typeof systemMessageSchema>;\n\n// Tool request\nexport const agentToolRequestSchema = z.object({\n  toolRequestId: z.string(),\n  toolName: z.string(),\n  toolInput: z.record(z.string(), z.any()),\n});\nexport type AgentToolRequest = z.output<typeof agentToolRequestSchema>;\n\n// Agent message\nexport const agentMessageSchema = z.object({\n  ...baseMessageSchema,\n  role: z.literal(\"agent\"),\n  content: z.string().prefault(\"\"),\n  toolsRequests: z.array(agentToolRequestSchema).prefault([]),\n});\nexport type AgentMessage = z.output<typeof agentMessageSchema>;\n\n// Tool response message\nexport const toolResponseMessageSchema = z.object({\n  ...baseMessageSchema,\n  role: z.literal(\"tool\"),\n  toolRequestId: z.string(),\n  toolName: z.string(),\n  toolSuccess: z.boolean(),\n  toolOutput: z.record(z.string(), z.any()).optional(),\n  toolError: z.string().optional(),\n});\n\nexport type ToolResponseMessage = z.output<typeof toolResponseMessageSchema>;\n\n// Message\nexport const messageSchema = z.discriminatedUnion(\"role\", [\n  userMessageSchema,\n  systemMessageSchema,\n  agentMessageSchema,\n  toolResponseMessageSchema,\n]);\n\nexport type Message = z.output<typeof messageSchema>;\n\n// Create message input\nconst createOmitFields = { createdAt: true, lastUpdated: true, id: true } as const;\nexport const createMessageInputSchema = z.discriminatedUnion(\"role\", [\n  userMessageSchema.omit(createOmitFields),\n  systemMessageSchema.omit(createOmitFields),\n  agentMessageSchema.omit(createOmitFields),\n  toolResponseMessageSchema.omit(createOmitFields),\n]);\nexport type CreateMessageInput = z.input<typeof createMessageInputSchema>;\n\n// Update message input\nconst updateOmitFields = { createdAt: true, lastUpdated: true, id: true } as const;\nexport const updateMessageInputSchema = z.discriminatedUnion(\"role\", [\n  userMessageSchema\n    .omit(updateOmitFields)\n    .partial()\n    .extend({ role: z.literal(\"user\") }),\n  systemMessageSchema\n    .omit(updateOmitFields)\n    .partial()\n    .extend({ role: z.literal(\"system\") }),\n  agentMessageSchema\n    .omit(updateOmitFields)\n    .partial()\n    .extend({ role: z.literal(\"agent\") }),\n  toolResponseMessageSchema\n    .omit(updateOmitFields)\n    .partial()\n    .extend({ role: z.literal(\"tool\") }),\n]);\nexport type UpdateMessageInput<T extends Message[\"role\"]> = Extract<\n  z.input<typeof updateMessageInputSchema>,\n  { role: T }\n>;\n\n// export type AgentMessageUpdateInput = Extract<UpdateMessageInput<\"agent\">, { role: \"agent\" }>;\n\n/**\n * A helper class aimed at facilitating safe and efficient\n * manipulation of an array of messages.\n * @param messages - Optionally, the messages to initialize the list with.\n */\nexport class MessageList {\n  #messages: Message[] = [];\n\n  constructor(messages?: Message[]) {\n    this.#messages = deepClone(messages ?? []);\n  }\n\n  getAll() {\n    return op.attempt(() => deepClone(this.#messages));\n  }\n\n  get(id: string) {\n    const [err, messages] = this.getAll();\n    if (err) return op.failure(err);\n    return op.success(messages.find((message) => message.id === id));\n  }\n\n  findLastFromRoles<R extends Message[\"role\"]>(roles: readonly R[]) {\n    const [err, messages] = this.getAll();\n    if (err) return op.failure(err);\n    const lastMessage = messages.reverse().find((message) => roles.includes(message.role as R)) as\n      | Extract<Message, { role: R }>\n      | undefined;\n    return op.success(lastMessage);\n  }\n\n  create(message: CreateMessageInput) {\n    // Validate the message input\n    const { data: validatedMessage, error: validatedMessageError } =\n      createMessageInputSchema.safeParse(message);\n    if (validatedMessageError)\n      return op.failure({\n        code: \"Validation\",\n        message: \"Invalid message shape.\",\n        cause: validatedMessageError,\n      });\n\n    // Else, create and insert the message\n    const newMessage: Message = {\n      ...validatedMessage,\n      id: newId(\"message\"),\n      createdAt: Date.now(),\n      lastUpdated: Date.now(),\n    };\n    this.#messages.push(newMessage);\n\n    // Return the message id\n    return op.success(newMessage.id);\n  }\n\n  update<Role extends Message[\"role\"]>(\n    id: string,\n    role: Role,\n    message: Omit<UpdateMessageInput<Role>, \"role\">,\n  ) {\n    // Validate the message input (include role for discriminated union)\n    const { data: validatedMessage, error: validationError } = updateMessageInputSchema.safeParse({\n      ...message,\n      role,\n    });\n    if (validationError)\n      return op.failure({\n        code: \"Validation\",\n        message: \"Invalid message shape.\",\n        cause: validationError,\n      });\n\n    // If the message does not exist, return a failure\n    const [err, existingMessage] = this.get(id);\n    if (err) return op.failure(err);\n    if (!existingMessage)\n      return op.failure({\n        code: \"NotFound\",\n        message: `Message with id '${id}' does not exist.`,\n      });\n\n    // Ensure the role is matching the message role\n    if (existingMessage.role !== role)\n      return op.failure({\n        code: \"Validation\",\n        message: \"Invalid message role provided.\",\n        cause: new Error(`Message with id '${id}' is not a ${role} message.`),\n      });\n\n    // Build the new message object\n    const newMessage = {\n      ...existingMessage,\n      ...validatedMessage,\n      lastUpdated: Date.now(),\n    } as Message;\n\n    // Update the message in the list\n    this.#messages = this.#messages.map((m) => (m.id === id ? newMessage : m));\n\n    // Return the message id\n    return op.success(id);\n  }\n}\n","import z from \"zod\";\nimport { definePluginConfig } from \"@/plugins/server/builder\";\nimport type { PluginConfig } from \"@/plugins/server/types\";\n\nexport const generationPluginConfigDef = definePluginConfig({\n  schema: z.object({\n    voiceDetection: z\n      .object({\n        /**\n         * VAD score threshold for detecting voice activity during speech (0.0-1.0).\n         * Uses hysteresis: once voice is detected, this higher threshold must be exceeded\n         * to continue considering audio as speech. This prevents flickering between\n         * speech/silence states during continuous speaking.\n         */\n        scoreInThreshold: z.number().prefault(0.5),\n        /**\n         * VAD score threshold for detecting end of voice activity (0.0-1.0).\n         * When voice is active, audio must fall below this lower threshold to be\n         * considered silence. Lower than `scoreInThreshold` to provide hysteresis.\n         */\n        scoreOutThreshold: z.number().prefault(0.25),\n        /**\n         * Number of silent audio chunks to buffer before voice starts (default: 100 ≈ 1s).\n         * These chunks are emitted when voice is detected, ensuring the first syllables\n         * and word onsets are captured for better STT accuracy.\n         *\n         * Can slightly impact STT latency, as increases the amount of audio to be processed.\n         */\n        prePaddingChunks: z.number().prefault(100),\n        /**\n         * Number of silent chunks to append after voice ends before finalizing (default: 200 ≈ 2s).\n         *\n         * Most STT providers require silence padding to finalize transcription. For example,\n         * Deepgram with `endpointing: 0` and `no_delay: true` still needs substantial\n         * silence to return results. Too few chunks may cause the STT to hang indefinitely.\n         *\n         * This default (200) balances latency and stability across providers. If your STT\n         * finalizes transcripts quickly, consider lowering this value. Benchmark carefully.\n         */\n        postPaddingChunks: z.number().prefault(200),\n        /**\n         * Minimum duration (in ms) of continuous voice to trigger agent interruption.\n         * Uses a sliding window to accumulate voice chunks and filter out VAD false positives.\n         * Only when accumulated voice duration exceeds this threshold, the agent will be interrupted.\n         */\n        minVoiceInterruptionMs: z.number().prefault(50),\n      })\n      .prefault({}),\n    endOfTurnDetection: z\n      .object({\n        /**\n         * Probability threshold (0.0-1.0) that determines when the user has finished speaking.\n         * If EOU model confidence >= threshold, agent responds immediately. Otherwise, waits\n         * with an adaptive timeout (see min/maxTimeoutMs below).\n         *\n         * Tuning considerations:\n         * - Too low: Agent may interrupt users mid-sentence, creating awkward overlaps\n         * - Too high: Agent waits longer before responding, increasing perceived latency\n         * - Default (0.6): Balanced trade-off between responsiveness and avoiding interruptions\n         */\n        threshold: z.number().prefault(0.6),\n        /**\n         * Fallback timeout (in ms) ensuring the agent eventually responds even when EOU\n         * confidence stays low. Prevents the agent from waiting indefinitely if the model\n         * never reaches the threshold (e.g., incomplete sentences, uncertain patterns).\n         */\n        minTimeoutMs: z.number().prefault(300),\n        /**\n         * Maximum wait time (in ms) when EOU confidence is at or near zero. As confidence\n         * increases, the timeout shrinks adaptively toward minTimeoutMs using:\n         * `timeout = max(minTimeoutMs, maxTimeoutMs * (1 - probability / threshold))`\n         *\n         * This creates natural turn-taking: high confidence = quick response, low confidence = patient waiting.\n         */\n        maxTimeoutMs: z.number().prefault(5000),\n      })\n      .prefault({}),\n  }),\n});\n\nexport type GenerationPluginConfig<T extends \"input\" | \"output\"> = PluginConfig<\n  typeof generationPluginConfigDef,\n  T\n>;\n","import z from \"zod\";\nimport { definePluginContext } from \"@/plugins/server/builder\";\nimport type { PluginContext } from \"@/plugins/server/types\";\nimport { messageSchema } from \"@/shared/messages\";\nimport { generationStatusSchema } from \"./status\";\n\nexport const generationPluginContextDef = definePluginContext({\n  schema: z.object({\n    /**\n     * The entire history of messages handled by the generation plugin.\n     */\n    messages: z.array(messageSchema).prefault([\n      {\n        id: \"system-1\",\n        createdAt: Date.now(),\n        lastUpdated: Date.now(),\n        role: \"system\",\n        content: `        \n# General Instructions\nThe below instructions define your general behavior and attitude as an agent.\nFurther down, you'll find more specific instructions about your role, your context, and your capabilities.\n\n## Attitude\nThe user is speaking to you using their voice and/or by typing on a chat interface (if available).\nYour answers are streamed back to the user as text and/or voice as well. \n\nAs a multimodal agent, your answers must sound natural when converted to voice, but also when read as text.\nHere's how to produce **spoken language**:\n\n- Use a natural, informal, conversational vocabulary and tone. You're original, have your own personality.\n  Example: \"Yeah I think I got your point, but are you sure this would work for all configurations?\"\n\n- Include filler words and hesitations (e.g., \"um\", \"uh\", \"like\", \"oh\", \"ah\") where appropriate.\n  Example: \"Um, let me think... maybe we could try that approach?\"\n  \n- Embrace incomplete sentences or broken thoughts to simulate true speech patterns.\n  Example: \"Maybe we should... oh wait, here's another idea...\"\n\n- If a user asks something like \"can you hear me?\", say yes, you can hear them.\n\n- Remember that the user can interrupt you at any time, handle that gracefully.\n\n- Show traits of emotional intelligence like self-awareness, empathy, humor, excitment.\n\n- Employ small-talks, both at the beginning and during the conversation, as long as it doesn't disrupt the conversation flow.\n\n- Relate to the user's answers, so they feel heard. Don't repeat their entire answers, but just small notes and summaries showing that you're listening and keeping track of the conversation.\n\n- Tend to mirror the user's expression, words, etc. It is proven that it increases the rapport.\n\n- Overall, be positive, open and warm to the users ideas, encourage them to talk more about themselves.\n\n## Markdown\nYour answers can include Markdown following the CommonMark, GFM, LaTex, and Mermaid specifications.\n\nBefore being converted to voice with a TTS model, your answers will be pre-processed as follows:\n\n- Markdown symbols will be stripped out, e.g., \"**bold**\" becomes \"bold\"\n\n- The following blocks will be entirely ignored from the TTS speech: table, code blocks, LaTeX blocks and Mermaid blocks.\n  So if you need to include comment about such a block, do it right before or after the block.\n  Example: \n  \\`\\`\\`markdown\n  You were right, there is a **huge** spike in February!\n  | Month | Value |\n  |-------|-------|\n  | January | 100   |\n  | February | 1380 (huge spike)   |\n  | March | 300   |\n  | April | 350   |\n  | May | 200   |\n  \n  Do you want me to investigate further?\n  \\`\\`\\`\n  will be converted as voice as \"You were right, there is a huge spike in February! Do you want me to investigate further?\"\n  with a short pause in speech when the table is being rendered.\n\n- While LaTeX blocks are excluded from speech, inline LaTeX is converted into spoken form.\n  Example: \"$x^2$\" becomes \"x squared\", \"$y = x^2 + 1$\" becomes \"y equals x squared plus one\".\n  Avoid using long inline LaTeX, only simple and short formulas or variable names. Use LaTeX blocks for the rest.\n\n- While code blocks are excluded from speech, inline code is converted into plain text with symbol stripped out.\n  Example: \"Call the \\`generate()\\` function\" becomes \"Call the generate function\".\n  Avoid using long inline code, only simple and short code snippets, like variables or functions names. Use code blocks for the rest.\n\n- Links, images, and their references are converted into just the alt or title text when provided.\n  Example: \"[link](https://example.com)\" becomes \"link\", \"![image](https://example.com/image.png)\" becomes \"image\".\n  If an alt of title is not provided, the image or link won't appear in the speech.\n  Example: \"Can you check https://example.com ?\" becomes \"Can you check ?\" which might be confusing.\n\n- List are converted into plain text, without delimiters symbols, even for ordered lists. So make your list items content sounding natural when read.\n  Example:\n  \"Here are the steps to follow:\n  1. First, open the app.\n  2. Then, click on the \"+\" button.\n  3. Finally, reload the page.\n  \"\n  will be converted as voice as \"Here are the steps to follow: First, open the app. Then, click on the plus button. Finally, reload the page.\"\n\nSo for ordered lists for example, when numbering matters, \n\n## Bug / Error handling\nIf something doesn't work as expected, retry with the user 2 times, then if it still doesn't work:\n- Notify the developers by sending them a message using the \"notify_developers\" tool.\n- Then only, explain to the user that there might be some temporary issue right now, that you've notified the developers, and ask the user to try again later.\n- Don't bother the user with too many retry back and forth, if you see that it's not working after two retries, just notify the devs and move on.\n        `,\n      },\n    ]),\n    /**\n     * The current generation status.\n     * Contains { listening, thinking, speaking } flags.\n     */\n    status: generationStatusSchema,\n    /**\n     * Whether the generation plugin should generate and stream voice back\n     * to the user. If true, solely text chunks will be emitted.\n     */\n    voiceEnabled: z.boolean().prefault(true),\n  }),\n});\n\nexport type GenerationPluginContext<T extends \"input\" | \"output\"> = PluginContext<\n  typeof generationPluginContextDef,\n  T\n>;\n","import z from \"zod\";\nimport * as op from \"@/shared/operation\";\n\nexport const generationStatusSchema = z\n  .object({\n    listening: z.boolean().prefault(true),\n    thinking: z.boolean().prefault(false),\n    speaking: z.boolean().prefault(false),\n  })\n  .prefault({});\n\nexport type GenerationStatus = z.infer<typeof generationStatusSchema>;\n\nexport const computeStatus = (oldStatus: GenerationStatus, eventType: string) => {\n  try {\n    if (eventType === \"agent.thinking-start\") {\n      return op.success({ ...oldStatus, listening: false, thinking: true });\n    } else if (eventType === \"agent.thinking-end\") {\n      return op.success({ ...oldStatus, thinking: false });\n    } else if (eventType === \"agent.speaking-end\") {\n      return op.success({ ...oldStatus, listening: true, thinking: false, speaking: false });\n    } else if (eventType === \"agent.speaking-start\") {\n      return op.success({ ...oldStatus, listening: false, speaking: true });\n    }\n    return op.success(oldStatus);\n  } catch (error) {\n    return op.failure({ code: \"Unknown\", cause: error });\n  }\n};\n","import z from \"zod\";\nimport { llmResourcesSchema } from \"@/models/llm/resources\";\nimport { definePluginEvents } from \"@/plugins/server/builder\";\nimport type { PluginEvent } from \"@/plugins/server/types\";\nimport { agentToolRequestSchema, createMessageInputSchema, messageSchema } from \"@/shared/messages\";\n\nconst insertEventBaseSchema = z.object({\n  interrupt: z.enum([\"abrupt\", \"smooth\"]).or(z.literal(false)).prefault(\"abrupt\"),\n  preventInterruption: z.boolean().prefault(false),\n});\n\nexport const generationPluginEventsDef = definePluginEvents(\n  { name: \"messages.create\", dataSchema: z.object({ message: createMessageInputSchema }) },\n  {\n    name: \"messages.update\",\n    dataSchema: z.object({\n      id: z.string(),\n      role: z.enum([\"user\", \"system\", \"agent\", \"tool\"]),\n      message: createMessageInputSchema,\n    }),\n  },\n\n  { name: \"user.audio-chunk\", dataSchema: z.object({ audioChunk: z.custom<Int16Array>() }) },\n  { name: \"user.voice-start\" },\n  {\n    name: \"user.voice-chunk\",\n    dataSchema: z.discriminatedUnion(\"type\", [\n      z.object({ type: z.literal(\"voice\"), voiceChunk: z.custom<Int16Array>() }),\n      z.object({\n        type: z.literal(\"padding\"),\n        voiceChunk: z.custom<Int16Array>(),\n        paddingSide: z.enum([\"pre\", \"post\"]),\n        paddingIndex: z.number(),\n      }),\n    ]),\n  },\n  { name: \"user.voice-end\" },\n  { name: \"user.text-chunk\", dataSchema: z.object({ textChunk: z.string() }) },\n  { name: \"user.interrupted\" },\n\n  { name: \"agent.thinking-start\" },\n  { name: \"agent.thinking-end\" },\n  { name: \"agent.speaking-start\" },\n  { name: \"agent.speaking-end\" },\n  { name: \"agent.continue\", dataSchema: insertEventBaseSchema },\n  {\n    name: \"agent.decide\",\n    dataSchema: insertEventBaseSchema.extend({ messages: z.array(messageSchema) }),\n  },\n  {\n    name: \"agent.say\",\n    dataSchema: insertEventBaseSchema.extend({ text: z.string() }),\n  },\n  {\n    name: \"agent.interrupt\",\n    dataSchema: z.object({\n      reason: z.string(),\n      author: z.enum([\"user\", \"application\"]),\n      force: z.boolean().prefault(false),\n    }),\n  },\n  { name: \"agent.resources-request\" },\n  {\n    name: \"agent.resources-response\",\n    dataSchema: z.object({ requestId: z.string(), resources: llmResourcesSchema }),\n  },\n  {\n    name: \"agent.tool-requests\",\n    dataSchema: z.object({ requests: z.array(agentToolRequestSchema) }),\n  },\n  {\n    name: \"agent.interrupted\",\n    dataSchema: z.object({\n      reason: z.string(),\n      forced: z.boolean(),\n      author: z.enum([\"user\", \"application\"]),\n    }),\n  },\n  { name: \"agent.text-chunk\", dataSchema: z.object({ textChunk: z.string() }) },\n  { name: \"agent.voice-chunk\", dataSchema: z.object({ voiceChunk: z.custom<Int16Array>() }) },\n);\n\nexport type GenerationPluginEvent<T extends \"input\" | \"output\"> = PluginEvent<\n  typeof generationPluginEventsDef,\n  T\n>;\n","import z from \"zod\";\nimport { messageSchema } from \"@/shared/messages\";\n\n// Tools\nexport const llmToolSchema = z.object({\n  name: z.string(),\n  description: z.string(),\n  schema: z.object({\n    input: z.instanceof(z.ZodObject),\n    output: z.instanceof(z.ZodObject),\n  }),\n  run: z.function({\n    input: [z.record(z.string(), z.any())],\n    output: z.union([\n      z.object({\n        success: z.boolean(),\n        output: z.record(z.string(), z.any()).optional(),\n        error: z.string().optional(),\n      }),\n      z.promise(\n        z.object({\n          success: z.boolean(),\n          output: z.record(z.string(), z.any()).optional(),\n          error: z.string().optional(),\n        }),\n      ),\n    ]),\n  }),\n});\n\n/**\n * Represents a tool definition for an LLM.\n */\nexport type LLMToolDefinition = z.infer<typeof llmToolSchema>;\n\n// Resources\nexport const llmResourcesSchema = z.object({\n  messages: z.array(messageSchema),\n  tools: z.array(llmToolSchema),\n});\n\n/**\n * Represents the common set of resources passed to an LLM for a generation job.\n */\nexport type LLMResources = z.infer<typeof llmResourcesSchema>;\n","import { z } from \"zod\";\nimport type { AgentServer } from \"@/agent/server/class\";\nimport type { LLMResources } from \"@/models/llm/resources\";\nimport type { PluginAccessor } from \"@/plugins/server/types\";\nimport { AsyncQueue } from \"@/shared/async-queue\";\nimport type * as op from \"@/shared/operation\";\nimport { newId } from \"@/shared/prefixed-id\";\nimport type { generationPlugin } from \".\";\nimport type { GenerationPluginEvent } from \"./events\";\nimport { Generation, type GenerationChunk } from \"./generation\";\n\n// Orchestrator\nexport class GenerationOrchestrator {\n  readonly #agent: op.ToPublic<AgentServer>;\n  readonly #plugin: op.ToPublic<\n    PluginAccessor<(typeof generationPlugin)[\"def\"], { type: \"server\"; name: string }>\n  >;\n  readonly #eventsQueue = new AsyncQueue<GenerationPluginEvent<\"output\">>();\n  readonly #generationsQueue: AsyncQueue<Generation> = new AsyncQueue();\n  #generations: Generation[] = [];\n  #decidePromises: {\n    id: string;\n    event: Extract<GenerationPluginEvent<\"output\">, { name: \"agent.decide\" }>;\n    promise: Promise<void>;\n    cancel: () => Extract<GenerationPluginEvent<\"output\">, { name: \"agent.decide\" }>;\n  }[] = [];\n  readonly #generationsResourcesRequestsIds: Record<string, string> = {};\n  readonly #resourcesResponses: Record<string, LLMResources> = {};\n\n  constructor(params: {\n    plugin: op.ToPublic<\n      PluginAccessor<(typeof generationPlugin)[\"def\"], { type: \"server\"; name: string }>\n    >;\n    agent: op.ToPublic<AgentServer>;\n  }) {\n    this.#agent = params.agent;\n    this.#plugin = params.plugin;\n  }\n\n  pushEvent(event: GenerationPluginEvent<\"output\">) {\n    this.#eventsQueue.push(event);\n  }\n\n  async start() {\n    // Start consuming generations\n    this.#consumeGenerations();\n\n    // Start processing generation even, process it\n    for await (const event of this.#eventsQueue) {\n      if (this.#isGenerationEvent(event)) await this.#processGenerationEvent(event);\n    }\n  }\n\n  #createGeneration() {\n    // Create the generation\n    const generation = new Generation({\n      agent: this.#agent,\n      voiceEnabled: this.#plugin.context.get().voiceEnabled,\n    });\n    this.#generations.push(generation);\n\n    // On generation status change, try to update the thinking status\n    generation.onStatusChange(() => {\n      const runningCount = this.#generations.filter((g) => g.progress === \"started\").length;\n      // - If the agent is thinking, but no generation is running, emit thinking end\n      if (this.#plugin.context.get().status.thinking) {\n        if (runningCount === 0)\n          this.#plugin.events.emit({ name: \"agent.thinking-end\", urgent: true });\n      }\n      // - Or if the agent is not thinking, but a generation is running, emit thinking start\n      else if (runningCount > 0)\n        this.#plugin.events.emit({ name: \"agent.thinking-start\", urgent: true });\n    });\n\n    return generation;\n  }\n\n  async #processGenerationEvent(event: GenerationPluginEvent<\"output\">) {\n    // Retrieve or create the first idle generation\n    let generation = this.#generations.find((g) => g.progress === \"idle\");\n    if (!generation) generation = await this.#createGeneration();\n\n    // Process the event\n    if (event.name === \"agent.continue\") this.#processInsertEvent(generation, event);\n    else if (event.name === \"agent.say\") this.#processInsertEvent(generation, event);\n    else if (event.name === \"agent.decide\") this.#processDecideEvent(generation, event);\n    else if (event.name === \"agent.interrupt\") this.#processInterruptEvent(event);\n    else if (event.name === \"agent.resources-response\") this.#processResourcesResponseEvent(event);\n\n    // If the generation is not ready to start yet, return\n    if (!generation.canStart()) return;\n\n    // If there are remaining generation events to process, wait\n    if (this.#isQueueBusy()) return;\n\n    // If that was a continue operation, request resources\n    if (event.name === \"agent.continue\") {\n      const requestId = this.#plugin.events.emit({ name: \"agent.resources-request\" });\n      this.#generationsResourcesRequestsIds[generation.id] = requestId;\n    }\n\n    // If the generation has continue but no resources yet, wait\n    if (\n      generation.params.needContinue &&\n      !((this.#generationsResourcesRequestsIds[generation.id] ?? \"\") in this.#resourcesResponses)\n    )\n      return;\n\n    // Find any currently running generation\n    const runningGeneration = this.#generations.find((g) => g.progress !== \"idle\");\n\n    if (runningGeneration) {\n      // DO NOTHING FOR NOW\n      // if g.status === \"ended\" -> g.queue.length() is equal to remaining chunks to stream\n      // - If the running generation is about to end, start the next one\n      // - If smooth interruption is requested, sync both generations for a smooth transition\n      //   - If not possible interrupt abruptly\n    }\n\n    // Or if there is no running generation, start the generation immediately\n    else {\n      const resourceRequestId = this.#generationsResourcesRequestsIds[generation.id];\n      const resources = resourceRequestId ? this.#resourcesResponses[resourceRequestId] : undefined;\n      generation.start(resources);\n      this.#generationsQueue.push(generation);\n    }\n  }\n\n  #processInterruptEvent(\n    event: Extract<GenerationPluginEvent<\"output\">, { name: \"agent.interrupt\" }>,\n  ) {\n    let interrupted = false;\n    // Try interrupting all generations\n    for (const generation of this.#generations) {\n      if (generation.canBeInterrupted() || event.data.force) {\n        // Schedule the early end of the generation\n        generation.end(true);\n\n        // If the generation was already partially or entirely consumed by the orchestrator\n        // consider that the agent was interrupted during its speech\n        if (generation.queue.totalLength() > generation.queue.length()) interrupted = true;\n      }\n    }\n\n    // If at least one generation was interrupted, notify the interruption\n    if (interrupted) {\n      this.#plugin.events.emit({\n        name: \"agent.interrupted\",\n        data: {\n          reason: event.data.reason,\n          forced: event.data.force ?? false,\n          author: event.data.author,\n        },\n      });\n    }\n  }\n\n  #processResourcesResponseEvent(\n    event: Extract<GenerationPluginEvent<\"output\">, { name: \"agent.resources-response\" }>,\n  ) {\n    this.#resourcesResponses[event.data.requestId] = event.data.resources;\n  }\n\n  #processDecideEvent(\n    generation: Generation,\n    event: Extract<GenerationPluginEvent<\"output\">, { name: \"agent.decide\" }>,\n  ) {\n    const id = newId(\"decide\");\n    this.#decidePromises.push({\n      id,\n      event,\n      promise: (async () => {\n        const result = await this.#agent.models.llm.generateObject({\n          messages: [\n            {\n              id: newId(\"message\"),\n              createdAt: Date.now(),\n              lastUpdated: Date.now(),\n              role: \"system\",\n              content: `\n                    # Instructions\n                    You're a decision assistant helping another assistant itself directly discussing with\n                    the user and interacting with the application. A new system information has been received\n                    and your role is to decide whether the other assistant should react to this new information,\n                    or just be passive. You'll be provided the conversation history including the new information,\n                    as part of the last system messages.\n\n                    ## Output\n                    Once you've taken your decision, you'll output a 'shouldReact' boolean, indicating whether\n                    that new information is worth reacting to and could help the conversation goal.\n\n                    ## Recent conversation history\n                    Here is the recent conversation history, including the new information.\n                    Should the agent react to the most recent system messages?\n\n                    ${event.data.messages\n                      .map((message) => {\n                        if (\n                          message.role === \"user\" ||\n                          message.role === \"system\" ||\n                          message.role === \"agent\"\n                        )\n                          return `${message.role}: ${message.content}`;\n                        else return \"\";\n                      })\n                      .join(\"\\n\")}\n                    `,\n            },\n          ],\n          schema: z.object({\n            shouldContinue: z.boolean(),\n          }),\n        });\n\n        if (\n          result.type === \"content\" &&\n          result.data.shouldContinue &&\n          generation.progress === \"idle\"\n        ) {\n          this.#plugin.events.emit({\n            name: \"agent.continue\",\n            data: event.data,\n            urgent: true,\n          });\n        }\n\n        // Remove the promise from the list\n        this.#decidePromises = this.#decidePromises.filter((decide) => decide.id !== id);\n      })(),\n      cancel: () => {\n        this.#decidePromises = this.#decidePromises.filter((decide) => decide.id !== id);\n        return event;\n      },\n    });\n  }\n\n  #processInsertEvent(\n    generation: Generation,\n    event: Extract<GenerationPluginEvent<\"output\">, { name: \"agent.continue\" | \"agent.say\" }>,\n  ) {\n    // In case an abrupt intrerupt insert is requested, try first interrupting the current generation\n    if (event.data.interrupt === \"abrupt\")\n      this.#processInterruptEvent({\n        id: newId(\"event\"),\n        name: \"agent.interrupt\",\n        data: {\n          reason: \"Interrupted by another operation.\",\n          author: \"application\",\n          force: false,\n        },\n        urgent: true,\n        created: {\n          at: Date.now(),\n          by: {\n            type: \"handler\",\n            plugin: \"generation\",\n            handler: \"orchestrator\",\n            event: \"unknown\",\n          },\n        },\n        edited: false,\n        dropped: false,\n        contextChanges: [],\n      });\n\n    // - Cancel and merge ongoing decide promises\n    for (const decide of this.#decidePromises) {\n      decide.cancel();\n      generation.addInsertEvent({\n        id: newId(\"event\"),\n        name: \"agent.continue\",\n        data: decide.event.data,\n        urgent: true,\n        created: {\n          at: Date.now(),\n          by: {\n            type: \"handler\",\n            plugin: \"generation\",\n            handler: \"orchestrator\",\n            event: \"unknown\",\n          },\n        },\n        edited: false,\n        dropped: false,\n        contextChanges: [],\n      });\n    }\n\n    // - Add the initial operation to the generation\n    generation.addInsertEvent(event);\n\n    // If a smooth interruption is requested, notify the scheduler\n    return event.data.interrupt === \"smooth\";\n  }\n\n  #isGenerationEvent(event: GenerationPluginEvent<\"output\">) {\n    return (\n      event.name === \"agent.continue\" ||\n      event.name === \"agent.say\" ||\n      event.name === \"agent.decide\" ||\n      event.name === \"agent.resources-response\" ||\n      event.name === \"agent.interrupt\" ||\n      event.name === \"agent.speaking-end\"\n    );\n  }\n\n  #isQueueBusy() {\n    return this.#eventsQueue.some((event) => this.#isGenerationEvent(event));\n  }\n\n  async #consumeGenerations() {\n    // Add a throttle to send max. 150ms of upfront chunks to the user\n    // This allows keeping interruptions management on the server.\n    // Note: This will have no effect if voice is disabled. Text-only chunks will be emitted immediately.\n    const limiter = throttledGenerationQueue(150);\n\n    for await (const generation of this.#generationsQueue) {\n      for await (const chunk of limiter(generation.queue)) {\n        // Set speaking status on first content chunk\n        if (!this.#plugin.context.get().status.speaking && chunk.type === \"content\") {\n          this.#plugin.events.emit({ name: \"agent.speaking-start\", urgent: true });\n        }\n\n        // Forward content chunks to core\n        if (chunk.type === \"content\") {\n          if (chunk.textChunk.length)\n            this.#plugin.events.emit({\n              name: \"agent.text-chunk\",\n              data: { textChunk: chunk.textChunk },\n            });\n          if (this.#plugin.context.get().voiceEnabled && chunk.voiceChunk?.length)\n            this.#plugin.events.emit({\n              name: \"agent.voice-chunk\",\n              data: { voiceChunk: chunk.voiceChunk },\n            });\n        }\n\n        // Forward tool requests to core\n        else if (chunk.type === \"tool-requests\") {\n          if (chunk.requests.length)\n            this.#plugin.events.emit({\n              name: \"agent.tool-requests\",\n              data: { requests: chunk.requests },\n              urgent: true,\n            });\n        }\n\n        // Or if this is the end of the generation\n        else if (chunk.type === \"end\") {\n          // Remove the generation from the list\n          this.#generations = this.#generations.filter((g) => g.id !== generation.id);\n\n          // If this is the last generation, notify the end of speaking\n          if (this.#plugin.context.get().status.speaking && this.#generationsQueue.length() === 0) {\n            this.#plugin.events.emit({ name: \"agent.speaking-end\", urgent: true });\n          }\n\n          // Move to the next generation (if any)\n          break;\n        }\n      }\n    }\n  }\n}\n\n/**\n * Specialized throttling function for generation chunks that uses actual audio durations\n * instead of fixed cadence. This prevents too much audio from being buffered upfront.\n *\n * @param leadMs Maximum positive/negative lead you will allow.\n * @param sampleRate Sample rate of the audio chunks (default: 16000)\n */\nfunction throttledGenerationQueue(leadMs = 300, sampleRate = 16_000) {\n  /** Wall-clock time we pegged the *first* chunk to. */\n  let anchorWallTime = Date.now();\n\n  /** Total audio duration we have *already* forwarded in milliseconds. */\n  let totalAudioDurationMs = 0;\n\n  /** Small helper: wait `ms` milliseconds. */\n  const sleep = (ms: number) => new Promise((r) => setTimeout(r, ms));\n\n  return async function* <T extends GenerationChunk>(source: AsyncIterable<T>): AsyncIterable<T> {\n    for await (const chunk of source) {\n      // For content chunks, use actual audio duration\n      if (chunk.type === \"content\" && chunk.voiceChunk) {\n        // Calculate actual audio duration in milliseconds\n        const chunkDurationMs = (chunk.voiceChunk.length / sampleRate) * 1000;\n\n        // ----- 1. Compute current lead ---------------------------------------\n        const wallElapsed = Date.now() - anchorWallTime;\n        let lead = totalAudioDurationMs - wallElapsed; // +ahead / –behind\n\n        // ----- 2. If we're *too far behind*, slide the anchor forward --------\n        if (lead < -leadMs) {\n          anchorWallTime += -lead - leadMs; // move anchor just enough\n          lead = -leadMs; // now clamped to lower bound\n        }\n\n        // ----- 3. If we're *too far ahead*, pause until we're inside window --\n        if (lead > leadMs) {\n          await sleep(lead - leadMs); // throttle down\n        }\n\n        // ----- 4. Emit the chunk and advance counters ------------------------\n        yield chunk;\n        totalAudioDurationMs += chunkDurationMs;\n      } else {\n        // For non-content chunks (tool-requests, resources-request, end), emit immediately\n        yield chunk;\n      }\n    }\n  };\n}\n","import type { AgentServer } from \"@/agent/server/class\";\nimport type { LLMGenerateMessageJob } from \"@/models/llm/base\";\nimport type { LLMResources } from \"@/models/llm/resources\";\nimport type { TTSJob } from \"@/models/tts/base\";\nimport { AsyncQueue } from \"@/shared/async-queue\";\nimport type { AgentToolRequest } from \"@/shared/messages\";\nimport type * as op from \"@/shared/operation\";\nimport { newId } from \"@/shared/prefixed-id\";\nimport type { GenerationPluginEvent } from \"./events\";\n\nexport type GenerationChunk =\n  | { type: \"content\"; textChunk: string; voiceChunk?: Int16Array }\n  | { type: \"tool-requests\"; requests: AgentToolRequest[] }\n  | { type: \"end\" };\n\ntype GenerationProgress = \"idle\" | \"started\" | \"ended\";\n\nexport type GenerationParams = {\n  prefix?: string;\n  needContinue?: boolean;\n  preventInterruption?: boolean;\n};\n\nexport class Generation {\n  id = newId(\"generation\");\n  queue: AsyncQueue<GenerationChunk> = new AsyncQueue();\n  progress: GenerationProgress = \"idle\";\n  params: GenerationParams = { prefix: \"\", needContinue: false, preventInterruption: false };\n\n  readonly #agent: op.ToPublic<AgentServer>;\n  readonly #voiceEnabled: boolean;\n  #llmJob: LLMGenerateMessageJob | null = null;\n  #ttsJob: TTSJob | null = null;\n  #toolRequests: AgentToolRequest[] | null = null;\n  readonly #statusChangeCallbacks: ((status: GenerationProgress) => void)[] = [];\n\n  constructor(params: { agent: op.ToPublic<AgentServer>; voiceEnabled: boolean }) {\n    this.#agent = params.agent;\n    this.#voiceEnabled = params.voiceEnabled;\n  }\n\n  onStatusChange(callback: () => void) {\n    this.#statusChangeCallbacks.push(callback);\n  }\n\n  canBeInterrupted() {\n    return (\n      !this.params.preventInterruption && (this.progress === \"started\" || this.queue.length() > 0)\n    );\n  }\n\n  canStart() {\n    return this.progress === \"idle\" && (this.params.prefix || this.params.needContinue);\n  }\n\n  addInsertEvent(\n    event: Extract<GenerationPluginEvent<\"output\">, { name: \"agent.continue\" | \"agent.say\" }>,\n  ) {\n    // Error if not idle, the orchestrator should not append insert events to a non-idle generation\n    if (this.progress !== \"idle\")\n      throw new Error(\"Cannot add continue/say operation when not idle or waiting.\");\n\n    // Set the continue, prefix, and interruptions attributes\n    if (event.name === \"agent.continue\") this.params.needContinue = true;\n    else if (event.name === \"agent.say\") this.params.prefix += event.data.text;\n    if (!this.params.preventInterruption)\n      this.params.preventInterruption = event.data.preventInterruption ?? false;\n  }\n\n  async start(resources?: LLMResources) {\n    // Throw the generation is already running, shouldn't happen\n    if (this.progress !== \"idle\") throw new Error(\"Cannot start generation when not idle.\");\n\n    // Set status to running\n    this.progress = \"started\";\n\n    // Start generations jobs\n    if (this.#voiceEnabled) {\n      this.#ttsJob = await this.#agent.models.tts.generate();\n      this.#startTTS();\n    }\n    this.#startLLM(resources);\n\n    // Call the start callbacks\n    for (const callback of this.#statusChangeCallbacks) callback(\"started\");\n  }\n\n  async #startTTS() {\n    if (!this.#ttsJob) throw new Error(\"TTS job not initialized, should not happen.\");\n\n    // Process TTS stream (queue will be consumed by the orchestrator)\n    for await (const chunk of this.#ttsJob.stream) {\n      if (chunk.type === \"content\")\n        this.queue.push({\n          type: \"content\",\n          textChunk: chunk.textChunk,\n          voiceChunk: chunk.voiceChunk,\n        });\n      else if (chunk.type === \"end\") {\n        if (this.#toolRequests) {\n          this.queue.push({ type: \"tool-requests\", requests: this.#toolRequests });\n        }\n        this.end();\n        break;\n      } else if (chunk.type === \"error\") console.error(\"TTS error\", JSON.stringify(chunk));\n    }\n  }\n\n  async #startLLM(resources?: LLMResources) {\n    // If a transcribe prefix is provided, push it to the TTS job\n    if (this.params.prefix) {\n      if (this.#voiceEnabled) await this.#ttsJob?.inputText(this.params.prefix);\n      else this.queue.push({ type: \"content\", textChunk: this.params.prefix });\n    }\n\n    // If doesn't need to continue, end generation\n    if (!this.params.needContinue) {\n      if (this.#voiceEnabled) await this.#ttsJob?.inputText(\"\", true);\n      else this.end();\n      return;\n    }\n\n    // Errors if continue is requested but no resources are provided\n    if (!resources) throw new Error(\"Resources are required to continue LLM generation.\");\n\n    // Start LLM generation\n    this.#llmJob = await this.#agent.models.llm.generateMessage(resources);\n\n    // Forward stream chunks to TTS\n    let hasContent = false;\n    for await (const chunk of this.#llmJob.stream) {\n      // Handle error chunks\n      if (chunk.type === \"error\") console.error(\"LLM error\", chunk);\n      // If voice is enabled, forward chunks to TTS job\n      else if (this.#voiceEnabled) {\n        // - Content\n        if (chunk.type === \"content\") {\n          await this.#ttsJob?.inputText(chunk.content);\n          hasContent = true;\n        }\n        // - Tools\n        else if (chunk.type === \"tools\") {\n          if (hasContent) this.#toolRequests = chunk.tools;\n          else {\n            this.queue.push({ type: \"tool-requests\", requests: chunk.tools });\n            break;\n          }\n        }\n        // - End\n        else if (chunk.type === \"end\") {\n          await this.#ttsJob?.inputText(\"\", true);\n          break;\n        }\n      }\n      // Else if text-only is required, push chunks directly to the queue\n      // - Content\n      else if (chunk.type === \"content\")\n        this.queue.push({ type: \"content\", textChunk: chunk.content });\n      // - Tools\n      else if (chunk.type === \"tools\") {\n        this.queue.push({ type: \"tool-requests\", requests: chunk.tools });\n        this.end();\n        break;\n      }\n      // - End\n      else if (chunk.type === \"end\") {\n        this.end();\n        break;\n      }\n    }\n  }\n\n  // Called by the orchestrator when end chunks are consumed\n  end(early = false) {\n    // Cancel any ongoing LLM job\n    if (this.#llmJob) this.#llmJob.cancel();\n\n    // Cancel any ongoing TTS job\n    if (this.#ttsJob) this.#ttsJob.cancel();\n\n    // Push an end chunk and update status\n    if (early) this.queue.pushFirst({ type: \"end\" });\n    else this.queue.push({ type: \"end\" });\n\n    // Push an end chunk and update status\n    this.progress = \"ended\";\n\n    // Call the end callbacks\n    for (const callback of this.#statusChangeCallbacks) callback(\"ended\");\n  }\n}\n","import type { STTJob } from \"@/models/stt/base\";\nimport type { VADChunk, VADJob } from \"@/models/vad/base\";\nimport { definePlugin } from \"@/plugins/server/builder\";\nimport { audioChunkToMs } from \"@/shared/audio-chunk-to-ms\";\nimport { lifeError } from \"@/shared/error\";\nimport { MessageList } from \"@/shared/messages\";\nimport * as op from \"@/shared/operation\";\nimport { RollingBuffer } from \"@/shared/rolling-buffer\";\nimport { generationPluginConfigDef } from \"./config\";\nimport { generationPluginContextDef } from \"./context\";\nimport { type GenerationPluginEvent, generationPluginEventsDef } from \"./events\";\nimport { GenerationOrchestrator } from \"./orchestrator\";\nimport { computeStatus } from \"./status\";\n\nexport const generationPlugin = definePlugin(\"generation\")\n  .$config(generationPluginConfigDef)\n  .$events(generationPluginEventsDef)\n  .$context(generationPluginContextDef)\n\n  // 1. Re-compute status based on events\n  .addHandler({\n    name: \"maintain-status\",\n    mode: \"block\",\n    onEvent: ({ plugin, event }) => {\n      if (!/^agent\\.(thinking|speaking)/.test(event.name)) return;\n      const status = op.dataOrThrow(computeStatus(plugin.context.get().status, event.name));\n      plugin.context.set((ctx) => ({ ...ctx, status }));\n    },\n  })\n\n  // 2. Update the messages history based on events\n  .addHandler({\n    name: \"maintain-messages\",\n    mode: \"block\",\n    /**\n     * @returns The id of the created or updated message (if any).\n     */\n    onEvent: ({ event, plugin }) => {\n      const messages = new MessageList(plugin.context.get().messages);\n      let updatedMessageId: string | undefined;\n\n      // Handle create/update message requests\n      if (event.name === \"messages.create\") {\n        updatedMessageId = op.dataOrThrow(messages.create(event.data.message));\n      } else if (event.name === \"messages.update\") {\n        updatedMessageId = op.dataOrThrow(\n          messages.update(event.data.id, event.data.role, event.data.message),\n        );\n      }\n\n      // Handle user text chunks: If the user was the last role to speak, append, else create a new user message\n      else if (event.name === \"user.text-chunk\") {\n        const message = op.dataOrThrow(messages.findLastFromRoles([\"user\", \"agent\", \"tool\"]));\n        if (message?.role === \"user\") {\n          const content = `${message.content}${event.data.textChunk}`;\n          updatedMessageId = op.dataOrThrow(messages.update(message.id, \"user\", { content }));\n        } else\n          updatedMessageId = op.dataOrThrow(\n            messages.create({ role: \"user\", content: event.data.textChunk }),\n          );\n      }\n\n      // Handle user interruptions\n      else if (event.name === \"user.interrupted\") {\n        const message = op.dataOrThrow(messages.findLastFromRoles([\"user\"]));\n        if (!message) return;\n        const content = `${message.content} [You interrupted the user, you might want to quickly apologize and mention that you're caring about what the user said]`;\n        updatedMessageId = op.dataOrThrow(messages.update(message.id, \"user\", { content }));\n      }\n\n      // Handle agent tool requests\n      else if (event.name === \"agent.tool-requests\") {\n        const message = op.dataOrThrow(messages.findLastFromRoles([\"user\", \"agent\"]));\n        if (message?.role === \"agent\") {\n          const toolsRequests = [...message.toolsRequests, ...event.data.requests];\n          updatedMessageId = op.dataOrThrow(\n            messages.update(message.id, \"agent\", { toolsRequests }),\n          );\n        } else {\n          updatedMessageId = op.dataOrThrow(\n            messages.create({ role: \"agent\", toolsRequests: event.data.requests }),\n          );\n        }\n      }\n\n      // Handle agent interruptions\n      else if (event.name === \"agent.interrupted\") {\n        const message = op.dataOrThrow(messages.findLastFromRoles([\"agent\"]));\n        if (!message)\n          throw lifeError({\n            code: \"NotFound\",\n            message: \"No agent message found. Should not happen.\",\n          });\n        if (!message.content.includes(\"[Interrupted\")) {\n          const content = `${message.content} [Interrupted by ${event.data.author}]`;\n          updatedMessageId = op.dataOrThrow(messages.update(message.id, \"agent\", { content }));\n        }\n      }\n\n      // Handle agent text chunks\n      else if (event.name === \"agent.text-chunk\") {\n        const message = op.dataOrThrow(messages.findLastFromRoles([\"user\", \"agent\", \"tool\"]));\n        if (message?.role === \"agent\" && !message.content.includes(\"[Interrupted\")) {\n          const content = `${message.content}${event.data.textChunk}`;\n          updatedMessageId = op.dataOrThrow(messages.update(message.id, \"agent\", { content }));\n        }\n      } else if (event.name === \"agent.thinking-start\") {\n        updatedMessageId = op.dataOrThrow(messages.create({ role: \"agent\" }));\n      }\n\n      // Save the modified messages\n      const messagesRaw = op.dataOrThrow(messages.getAll());\n      plugin.context.set((ctx) => ({ ...ctx, messages: messagesRaw }));\n      return updatedMessageId;\n    },\n  })\n\n  // 3. Consume incoming audio chunks from the WebRTC room\n  .addHandler({\n    name: \"receive-user-audio\",\n    mode: \"block\",\n    state: { unsubscribe: null as (() => void) | null, count: 9 },\n    onEvent: ({ event, plugin, state, agent }) => {\n      if (event.name === \"plugin.start\") {\n        state.unsubscribe = agent.transport.on(\"audio-chunk\", (evt) => {\n          plugin.events.emit({ name: \"user.audio-chunk\", data: { audioChunk: evt.chunk } });\n        });\n      } else if (event.name === \"plugin.stop\") state?.unsubscribe?.();\n    },\n  })\n\n  // 4. Use VAD model to detect user voice activity in incoming audio chunks\n  .addHandler({\n    name: \"detect-user-voice\",\n    mode: \"stream\",\n    state: ({ config }) => ({\n      inSpeech: false,\n      prePaddingBuffer: new RollingBuffer<Int16Array>(config.voiceDetection.prePaddingChunks),\n      postPaddingCountdown: 0,\n      // Keeps track of 3x the min. interruption duration in audio chunks\n      interruptBuffer: new RollingBuffer<Int16Array>(\n        (config.voiceDetection.minVoiceInterruptionMs / 10) * 3,\n      ),\n      voiceWindow: [] as Array<{ timestamp: number; duration: number }>,\n      vadJob: null as VADJob | null,\n    }),\n    onEvent: async ({ event, state, agent, plugin }) => {\n      // Helper to process VAD model results\n      const processVADResults = (chunk: VADChunk) => {\n        // Helper method to emit a voice chunk\n        const emitVoiceChunk = (\n          data: Extract<GenerationPluginEvent<\"output\">, { name: \"user.voice-chunk\" }>[\"data\"],\n        ) => plugin.events.emit({ name: \"user.voice-chunk\", data });\n        // Helper to calculate current interrupt duration from sliding window\n        const getCurrentInterruptDuration = () => {\n          const now = Date.now();\n          // Remove chunks older than the voice window\n          const voiceWindowMs = plugin.config.voiceDetection.minVoiceInterruptionMs * 2; // twice the min. interruption duration\n          state.voiceWindow = state.voiceWindow.filter((c) => now - c.timestamp <= voiceWindowMs);\n          // Sum up durations of remaining chunks\n          return state.voiceWindow.reduce((sum, chk) => sum + chk.duration, 0);\n        };\n        // Check if the chunk contains voice\n        const inSpeechBefore = state.inSpeech;\n        state.inSpeech =\n          chunk.score >\n          (state.inSpeech\n            ? plugin.config.voiceDetection.scoreInThreshold\n            : plugin.config.voiceDetection.scoreOutThreshold);\n        const inSpeechChanged = state.inSpeech !== inSpeechBefore;\n        // If the agent is currently listening\n        if (plugin.context.get().status.listening) {\n          // If the current chunk contains voice\n          if (state.inSpeech) {\n            // Reset post-padding count for the new voice session\n            state.postPaddingCountdown = plugin.config.voiceDetection.postPaddingChunks;\n            // Emit the voice start event\n            if (inSpeechChanged && state.prePaddingBuffer.length() > 0)\n              plugin.events.emit({ name: \"user.voice-start\" });\n            // Emit the pre-padding chunks\n            for (let i = state.prePaddingBuffer.length() - 1; i >= 0; i--) {\n              const voiceChunk = state.prePaddingBuffer.get()[i];\n              if (!voiceChunk) continue;\n              emitVoiceChunk({\n                type: \"padding\",\n                voiceChunk,\n                paddingSide: \"pre\",\n                paddingIndex: i,\n              });\n            }\n            state.prePaddingBuffer.empty();\n            // Emit the voice chunk\n            emitVoiceChunk({ type: \"voice\", voiceChunk: chunk.chunk });\n          }\n          // Else, emit the current chunk if post-padding limit is not met yet\n          else if (state.postPaddingCountdown > 0) {\n            emitVoiceChunk({\n              type: \"padding\",\n              voiceChunk: chunk.chunk,\n              paddingSide: \"post\",\n              paddingIndex: state.postPaddingCountdown,\n            });\n            state.postPaddingCountdown--;\n            if (state.postPaddingCountdown === 0) plugin.events.emit({ name: \"user.voice-end\" });\n          }\n          // Else, add the current chunk to the pre-padding buffer\n          else state.prePaddingBuffer.add(chunk.chunk);\n        }\n        // Or if the agent wasn't listening already\n        else {\n          // Buffer the audio chunk\n          state.interruptBuffer.add(chunk.chunk);\n          // If voice is detected, add to sliding window\n          if (state.inSpeech) {\n            const duration = audioChunkToMs(chunk.chunk);\n            state.voiceWindow.push({\n              timestamp: Date.now(),\n              duration,\n            });\n          }\n          // If the interruption duration is long enough, abort and emit all accumulated voice chunks\n          if (\n            getCurrentInterruptDuration() >= plugin.config.voiceDetection.minVoiceInterruptionMs\n          ) {\n            plugin.events.emit({\n              name: \"agent.interrupt\",\n              data: { reason: \"The user is speaking\", author: \"user\" },\n              urgent: true,\n            });\n            plugin.events.emit({ name: \"user.voice-start\" });\n            for (const voiceChunk of state.interruptBuffer.get()) {\n              emitVoiceChunk({ type: \"voice\", voiceChunk });\n            }\n            state.interruptBuffer.empty();\n            state.voiceWindow.length = 0; // Clear the sliding window\n          }\n        }\n      };\n\n      // Create the VAD job on plugin start, and consume results\n      if (event.name === \"plugin.start\") {\n        state.vadJob = await agent.models.vad.detect();\n        (async () => {\n          for await (const chunk of state.vadJob?.stream ?? []) {\n            processVADResults(chunk);\n          }\n        })();\n      }\n      // Clean up VAD job on plugin stop\n      else if (event.name === \"plugin.stop\") state?.vadJob?.cancel();\n      // Push audio chunk to VAD model\n      else if (event.name === \"user.audio-chunk\") {\n        state.vadJob?.inputVoice(event.data.audioChunk);\n      }\n    },\n  })\n\n  // 5. Use STT model to transcribe user voice chunks\n  .addHandler({\n    name: \"transcribe-user-voice\",\n    mode: \"stream\",\n    state: { sttJob: null as STTJob | null },\n    onEvent: async ({ event, plugin, state, agent }) => {\n      // Create the STT job on plugin start, and consume results\n      if (event.name === \"plugin.start\") {\n        state.sttJob = await agent.models.stt.generate();\n        (async () => {\n          for await (const chunk of state.sttJob?.stream ?? []) {\n            if (chunk.type === \"content\") {\n              plugin.events.emit({ name: \"user.text-chunk\", data: { textChunk: chunk.textChunk } });\n            }\n          }\n        })();\n      }\n      // Clean up STT job on plugin stop\n      else if (event.name === \"plugin.stop\") state?.sttJob?.cancel();\n\n      // Stream voice chunks to the STT model\n      if (event.name !== \"user.voice-chunk\") return;\n      state.sttJob?.inputVoice(event.data.voiceChunk);\n    },\n  })\n\n  // 6. Use EOU model to detect user's end of turn\n  .addHandler({\n    name: \"detect-end-of-turn\",\n    mode: \"stream\",\n    state: {\n      userIsSpeaking: false,\n      timeoutId: null as NodeJS.Timeout | null,\n      lastMessageBuffer: \"\",\n    },\n    onEvent: async ({ event, plugin, state, agent }) => {\n      // Helper method to check if the agent can answer\n      const canAnswer = () => {\n        if (state.userIsSpeaking) return false;\n        if (!state.lastMessageBuffer.trim().length) return false;\n        return true;\n      };\n\n      // Helper method to emit the current message buffer\n      const answer = () => {\n        if (state.timeoutId) clearTimeout(state.timeoutId);\n        if (!canAnswer()) return;\n        plugin.events.emit({ name: \"agent.continue\", data: { interrupt: \"abrupt\" }, urgent: true });\n        state.lastMessageBuffer = \"\";\n      };\n\n      // If the agent is not listening, return\n      if (!plugin.context.get().status.listening) return;\n\n      // Handle voice related events and text chunks\n      if (event.name === \"user.voice-start\") state.userIsSpeaking = true;\n      else if (event.name === \"user.voice-end\") state.userIsSpeaking = false;\n      else if (event.name === \"user.text-chunk\") state.lastMessageBuffer += event.data.textChunk;\n      else return;\n\n      // Clear the timeout if it exists\n      if (state.timeoutId) clearTimeout(state.timeoutId);\n\n      // If the agent can't answer yet, continue\n      if (!canAnswer()) return;\n\n      // Determine if the user has finished speaking\n      const endOfTurnProbability = await agent.models.eou.predict(plugin.context.get().messages);\n\n      // Emit the message if the user has finished speaking\n      if (endOfTurnProbability >= plugin.config.endOfTurnDetection.threshold) answer();\n      // Else, set a timeout to emit the message after a delay\n      else {\n        state.timeoutId = setTimeout(\n          answer,\n          Math.max(\n            plugin.config.endOfTurnDetection.minTimeoutMs,\n            plugin.config.endOfTurnDetection.maxTimeoutMs *\n              (1 - endOfTurnProbability / plugin.config.endOfTurnDetection.threshold),\n          ),\n        );\n      }\n    },\n  })\n\n  // 7. Generate agent response generation operations\n  .addHandler({\n    name: \"generate-agent-response\",\n    mode: \"block\",\n    state: { orchestrator: null as null | GenerationOrchestrator },\n    onEvent: ({ event, plugin, state, agent }) => {\n      if (event.name === \"plugin.start\") {\n        // @ts-expect-error - here not all handlers are available yet in the type, but it's fine\n        state.orchestrator = new GenerationOrchestrator({ plugin, agent });\n        state.orchestrator.start();\n      }\n      state?.orchestrator?.pushEvent(event);\n    },\n  })\n\n  // 8. Handle resources requests\n  .addHandler({\n    name: \"handle-resources-requests\",\n    mode: \"block\",\n    onEvent: ({ event, plugin }) => {\n      if (event.name !== \"agent.resources-request\") return;\n      plugin.events.emit({\n        name: \"agent.resources-response\",\n        data: {\n          requestId: event.id,\n          resources: { messages: plugin.context.get().messages, tools: [] },\n        },\n      });\n    },\n  })\n\n  // 9. Handle tools requests\n  .addHandler({\n    name: \"handle-tools-requests\",\n    mode: \"block\",\n    onEvent: ({ event, plugin }) => {\n      if (event.name !== \"agent.tool-requests\") return;\n      for (const request of event.data.requests) {\n        plugin.events.emit({\n          name: \"messages.create\",\n          data: {\n            message: {\n              role: \"tool\",\n              toolRequestId: request.toolRequestId,\n              toolName: request.toolName,\n              toolSuccess: false,\n              toolError: \"Tool calling is not implemented.\",\n            },\n          },\n        });\n      }\n    },\n  })\n\n  // 10. Stream agent speech to the user\n  .addHandler({\n    name: \"stream-outgoing-audio\",\n    mode: \"stream\",\n    onEvent: ({ event, agent }) => {\n      if (event.name !== \"agent.voice-chunk\") return;\n      agent.transport.streamAudioChunk(event.data.voiceChunk);\n    },\n  });\n","import z from \"zod\";\nimport { definePluginConfig } from \"@/plugins/server/builder\";\nimport type { MemoryDefinition } from \"./builder\";\n\nexport const memoriesPluginConfigDef = definePluginConfig({\n  schema: z.object({\n    items: z.array(z.custom<{ _definition: MemoryDefinition }>()).prefault([]),\n  }),\n  toTelemetry: (config) => {\n    // Rewrite items to only keep their configs\n    config.items = config.items.map((item) => ({\n      config: item._definition.config,\n    })) as never;\n    return config;\n  },\n});\n","import z from \"zod\";\nimport { definePluginContext } from \"@/plugins/server/builder\";\nimport type { Message } from \"@/shared/messages\";\n\nexport const memoriesPluginContextDef = definePluginContext({\n  schema: z.object({\n    memoriesLastResults: z.custom<Map<string, Message[]>>().prefault(new Map()),\n    memoriesLastTimestamp: z.custom<Map<string, number>>().prefault(new Map()),\n    processedRequestsIds: z.custom<Set<string>>().prefault(new Set<string>()),\n    computedMemoriesCache: z\n      .custom<Map<string, { hash: string; memories: Message[] }>>()\n      .prefault(new Map()),\n  }),\n});\n","import z from \"zod\";\nimport { definePluginEvents } from \"@/plugins/server/builder\";\nimport type { PluginEvent } from \"@/plugins/server/types\";\nimport { messageSchema } from \"@/shared/messages\";\n\nexport const memoriesPluginEventsDef = definePluginEvents(\n  {\n    name: \"cache-build\",\n    dataSchema: z.object({\n      messagesHash: z.string(),\n      memories: z.array(messageSchema),\n    }),\n  },\n  {\n    name: \"cache-memory\",\n    dataSchema: z.object({\n      name: z.string(),\n      messages: z.array(messageSchema),\n      timestamp: z.number(),\n    }),\n  },\n);\n\nexport type MemoriesPluginEvent<T extends \"input\" | \"output\"> = PluginEvent<\n  typeof memoriesPluginEventsDef,\n  T\n>;\n","import { definePlugin } from \"@/plugins/server/builder\";\nimport { generationPlugin } from \"../../generation/server\";\nimport { memoriesPluginConfigDef } from \"./config\";\nimport { memoriesPluginContextDef } from \"./context\";\nimport { memoriesPluginEventsDef } from \"./events\";\n\n// Helper function to build a memory and get its output messages\n// async function buildMemory(\n//   memory: { _definition: MemoryDefinition },\n//   messages: Message[],\n// ): Promise<Message[]> {\n//   const { output } = memory._definition;\n//   if (typeof output === \"function\") return await output({ messages });\n//   return output ?? [];\n// }\n\nexport const memoriesPlugin = definePlugin(\"memories\")\n  .dependencies([generationPlugin])\n  .$config(memoriesPluginConfigDef)\n  .$events(memoriesPluginEventsDef)\n  .$context(memoriesPluginContextDef);\n\n// Intercept the 'agent.resources-response' from generation plugin to emit blocking build-request\n// .addInterceptor(\n//   \"intercept-generation-resources-response\",\n//   ({ event, drop, dependency, current }) => {\n//     if (dependency.name !== \"generation\" || event.name !== \"agent.resources-response\") return;\n\n//     // Ignore already processed requests\n//     if (current.context.get().processedRequestsIds.has(event.data.requestId)) return;\n\n//     // Drop the agent.resources-response event\n//     drop(\"Will be re-emitted by memories later.\");\n\n//     // Emit a build-request event\n//     current.events.emit({ type: \"build-request\", data: event.data });\n//   },\n// )\n\n// // Build non-blocking memories when build-request is received\n// .addService(\"build-non-blocking-memories\", async ({ queue, plugin }) => {\n//   plugin.dependencies.generation.context.onChange(\n//     (ctx) => ctx.messages,\n//     (ctx) => {\n//       const timestamp = Date.now();\n\n//       // Update each non-blocking memory asynchronously\n//       for (const item of plugin.config.items) {\n//         const def = item._definition;\n//         if (def.config.behavior !== \"non-blocking\") continue;\n\n//         // Fire and forget - don't await\n//         buildMemory(item, ctx.messages)\n//           .then((messages) => {\n//             plugin.events.emit({\n//               name: \"cache-memory\",\n//               data: { name: def.name, messages, timestamp },\n//             });\n//           })\n//           .catch((error) => {\n//             console.error(`Failed to update non-blocking memory '${def.name}':`, error);\n//           });\n//       }\n//     },\n//   );\n\n//   for await (const _ of queue) if (_) continue;\n// })\n// // Build memories messages and emit build response\n// .addService(\"build-memories\", async ({ config, events, queue, context }) => {\n//   for await (const event of queue) {\n//     if (event.name !== \"build-request\") continue;\n\n//     // Compute hash of input messages to check cache\n//     const [errHash, messagesHash] = await canon.sha256({ messages: event.data.messages });\n//     if (errHash) {\n//       // TODO: Log error\n//       events.emit({ type: \"build-response\", data: { ...event.data, messages: [] } });\n//       continue;\n//     }\n\n//     // Check if we've already computed memories for these messages\n//     const cachedResult = context.get().computedMemoriesCache.get(messagesHash);\n//     if (cachedResult) {\n//       // Use cached result\n//       events.emit({\n//         type: \"build-response\",\n//         data: {\n//           ...event.data,\n//           messages: cachedResult.memories,\n//         },\n//       });\n//       continue;\n//     }\n\n//     // Process memories in the order they were defined\n//     const memoriesMessages: Message[] = [];\n\n//     const timestamp = Date.now();\n\n//     // Build all blocking memories concurrently\n//     const blockingResults = new Map<number, Message[]>();\n//     const blockingPromises = config.items.map(async (item, index) => {\n//       const def = item._definition;\n//       if (def.config.behavior !== \"blocking\") return;\n\n//       const messages = await buildMemory(item, event.data.messages);\n//       blockingResults.set(index, messages);\n//       events.emit({\n//         type: \"cache-memory\",\n//         data: { name: def.name, messages, timestamp },\n//       });\n//     });\n\n//     await Promise.all(blockingPromises);\n\n//     // Build final array in original order\n//     for (let i = 0; i < config.items.length; i++) {\n//       const item = config.items[i];\n//       if (!item) continue;\n\n//       const def = item._definition;\n//       if (def.config.behavior === \"blocking\") {\n//         const messages = blockingResults.get(i) ?? [];\n//         memoriesMessages.push(...messages);\n//       } else {\n//         const cached = context.get().memoriesLastResults.get(def.name) ?? [];\n//         memoriesMessages.push(...cached);\n//       }\n//     }\n\n//     // Emit cache update event\n//     events.emit({\n//       type: \"cache-build\",\n//       data: { messagesHash, memories: memoriesMessages },\n//     });\n\n//     // Re-emit the resources response with the memories messages\n//     events.emit({\n//       type: \"build-response\",\n//       data: {\n//         ...event.data,\n//         messages: memoriesMessages,\n//       },\n//     });\n//   }\n// })\n// // Store memory results in context (only if newer than existing)\n// .addEffect(\"handle-memory-cache\", ({ event, context }) => {\n//   if (event.name !== \"cache-memory\") return;\n//   const currentTimestamp = context.get().memoriesLastTimestamp.get(event.data.name) ?? 0;\n//   if (event.data.timestamp >= currentTimestamp) {\n//     context.set((ctx) => {\n//       const newMap = new Map(ctx.memoriesLastResults);\n//       newMap.set(event.data.name, event.data.messages);\n//       return { ...ctx, memoriesLastResults: newMap };\n//     });\n//     context.set((ctx) => {\n//       const newMap = new Map(ctx.memoriesLastTimestamp);\n//       newMap.set(event.data.name, event.data.timestamp);\n//       return { ...ctx, memoriesLastTimestamp: newMap };\n//     });\n//   }\n// })\n// // Update the computed memories cache\n// .addEffect(\"handle-build-cache\", ({ event, plugin }) => {\n//   if (event.name !== \"cache-build\") return;\n\n//   plugin.context.set((ctx) => {\n//     const newMap = new Map(ctx.computedMemoriesCache);\n//     newMap.set(event.data.messagesHash, {\n//       hash: event.data.messagesHash,\n//       memories: event.data.memories,\n//     });\n//     return { ...ctx, computedMemoriesCache: newMap };\n//   });\n// })\n// // Re-emit the build-response event\n// .addEffect(\"re-emit-build-response\", ({ event, plugin }) => {\n//   if (event.name !== \"build-response\") return;\n//   // Add the request id to the processed requests ids\n//   plugin.context.set((ctx) => {\n//     const newSet = new Set(ctx.processedRequestsIds);\n//     newSet.add(event.data.requestId);\n//     return { ...ctx, processedRequestsIds: newSet };\n//   });\n//   // Re-emit the resources response event\n//   plugin.dependencies.generation.events.emit({\n//     type: \"agent.resources-response\",\n//     data: event.data,\n//   });\n// });\n","// import * as Y from \"yjs\";\nimport { z } from \"zod\";\nimport { definePlugin } from \"../../server/builder\";\nimport { generationPlugin } from \"../generation/server\";\nimport type { StoreDefinition } from \"./builder\";\n\n// Helper: Convert plain JS values to Yjs structures recursively\n// function plainToYjs(value: unknown): unknown {\n//   if (Array.isArray(value)) {\n//     const yArray = new Y.Array();\n//     for (const item of value) yArray.push([plainToYjs(item)]);\n//     return yArray;\n//   }\n//   if (value && typeof value === \"object\" && value.constructor === Object) {\n//     const yMap = new Y.Map();\n//     for (const [k, v] of Object.entries(value)) yMap.set(k, plainToYjs(v));\n//     return yMap;\n//   }\n//   return value;\n// }\n\nexport const storesPlugin = definePlugin(\"stores\")\n  .dependencies([generationPlugin])\n  .config({\n    schema: z.object({\n      items: z.array(z.custom<{ _definition: StoreDefinition }>()).prefault([]),\n    }),\n    toTelemetry: (config) => {\n      // Rewrite items to only keep their configs\n      config.items = config.items.map((item) => ({\n        config: item._definition.config,\n      })) as never;\n\n      return config;\n    },\n  })\n  .events(\n    {\n      name: \"update-store-data\",\n      dataSchema: z.object({\n        name: z.string(),\n        data: z.any(),\n      }),\n    },\n    {\n      name: \"retrieve-store-data\",\n      dataSchema: z.object({\n        name: z.string(),\n      }),\n    },\n  )\n  .context({\n    schema: z.object({\n      storesData: z.record(z.string(), z.any()).prefault({}),\n    }),\n  });\n// .addService(\"crdt-manager\", async ({ queue, events, config }) => {\n//   const docs = new Map<string, { doc: Y.Doc; isArray: boolean }>();\n//   // Initialize CRDT stores from config\n//   for (const item of config.items) {\n//     const store = item._definition;\n//     if (store.config.type === \"freeform\") {\n//       const doc = new Y.Doc();\n//       const isArray = store.config.schema instanceof z.ZodArray;\n//       docs.set(store.name, { doc, isArray });\n\n//       // Observe changes and emit updates\n//       doc.on(\"update\", () => {\n//         const data = isArray ? doc.getArray(\"root\").toJSON() : doc.getMap(\"root\").toJSON();\n//         events.emit({ type: \"update-store-data\", data: { name: store.name, data } });\n//       });\n//     }\n//   }\n\n//   // Handle store updates\n//   for await (const event of queue) {\n//     if (event.name === \"update-store-data\") {\n//       const storeInfo = docs.get(event.data.name);\n//       if (!storeInfo) continue;\n\n//       storeInfo.doc.transact(() => {\n//         if (storeInfo.isArray) {\n//           const rootArray = storeInfo.doc.getArray(\"root\");\n//           // Replace array contents with properly converted items\n//           rootArray.delete(0, rootArray.length);\n//           for (const item of event.data.data) {\n//             rootArray.push([plainToYjs(item)]);\n//           }\n//         } else {\n//           const rootMap = storeInfo.doc.getMap(\"root\");\n//           // Merge object updates with proper conversion\n//           for (const [key, value] of Object.entries(event.data.data)) {\n//             rootMap.set(key, plainToYjs(value));\n//           }\n//         }\n//       });\n//     }\n//   }\n// })\n// .addEffect(\"sync-store-context\", ({ event, context }) => {\n//   if (event.name === \"update-store-data\") {\n//     context.set((ctx) => ({\n//       ...ctx,\n//       storesData: { ...ctx.storesData, [event.data.name]: event.data.data },\n//     }));\n//   }\n// });\n","export { defineAgent } from \"@/agent/server/builder\";\nexport { defineConfig } from \"@/agent/server/config\";\nexport { defineMemory } from \"@/plugins/defaults/memories/server/builder\";\nexport { defineStore } from \"@/plugins/defaults/stores/builder\";\nexport { definePlugin } from \"@/plugins/server/builder\";\n\nimport { generationPlugin } from \"@/plugins/defaults/generation/server\";\nimport { memoriesPlugin } from \"@/plugins/defaults/memories/server\";\nimport { storesPlugin } from \"@/plugins/defaults/stores/server\";\n\n// Explicit typing is required to avoid type size explosion with the iterator\ntype ServerDefaults = {\n  readonly generation: typeof generationPlugin;\n  readonly memories: typeof memoriesPlugin;\n  readonly stores: typeof storesPlugin;\n  readonly [Symbol.iterator]: () => Generator<\n    typeof generationPlugin | typeof memoriesPlugin | typeof storesPlugin,\n    void,\n    unknown\n  >;\n};\n\nexport const defaults: { readonly plugins: ServerDefaults } = {\n  plugins: {\n    generation: generationPlugin,\n    memories: memoriesPlugin,\n    stores: storesPlugin,\n    // Allows defaults to be used as an iterable, e.g., [...defaults.plugins]\n    *[Symbol.iterator]() {\n      for (const entry of Object.values(this)) yield entry;\n    },\n  },\n} as const;\n"],"mappings":"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","names":["z","z","z","z","z","z","z","z","z","z","z","z","z","z","z","z","z","z","z","z","z","z","z","z","z","z","z","z"]}