UNPKG

life

Version:

Life.js is the first fullstack framework to build agentic web applications. It is minimal, extensible, and typesafe. Well, everything you love.

1 lines 23.2 kB
{"version":3,"sources":["../../agent/client/builder.ts","../../plugins/client/builder.ts","../../plugins/defaults/generation/client.ts","../../plugins/defaults/memories/client.ts","../../plugins/defaults/stores/client.ts","../../exports/client.ts"],"sourcesContent":["import type z from \"zod\";\nimport { defaults } from \"@/exports/client\";\nimport type { PluginClientConfig, PluginClientDefinition } from \"@/plugins/client/types\";\nimport { toMethodName } from \"@/shared/method-name\";\nimport type { Override } from \"@/shared/types\";\nimport type { AgentDefinition } from \"../server/types\";\nimport type { AgentClientDefinition, TypedAgentClientBuilder } from \"./types\";\n\nexport class AgentClientBuilder<\n const AgentClientDef extends AgentClientDefinition,\n Excluded extends string = never,\n> {\n readonly def: AgentClientDef;\n\n constructor(definition: AgentClientDef) {\n this.def = definition;\n }\n\n /**\n * Register plugins to extend the agent client 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/server\";\n *\n * defineAgent(\"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/server\";\n *\n * defineAgent(\"my-agent\").plugins([defaults.plugins.generation, defaults.plugins.memories]);\n * ```\n */\n plugins<const Plugins extends { def: PluginClientDefinition }[]>(plugins: Plugins) {\n const builder = new AgentClientBuilder({ ...this.def, plugins: plugins.map((p) => p.def) });\n const builderWithPlugins = AgentClientBuilder.withPluginsMethods(builder);\n return builderWithPlugins as TypedAgentClientBuilder<\n Override<\n Override<\n AgentClientDef,\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\"]]: PluginClientConfig<\n K[\"def\"][\"config\"],\n \"output\"\n >;\n }\n >,\n Excluded | \"plugins\"\n >;\n }\n\n // biome-ignore lint/suspicious/noExplicitAny: reason\n static withPluginsMethods<Builder extends AgentClientBuilder<any, any>>(builder: Builder) {\n for (const plugin of builder.def.plugins) {\n Object.assign(builder, {\n [toMethodName(plugin.name)]: (\n config: z.input<PluginClientDefinition[\"config\"][\"schema\"]>,\n ): unknown => {\n const newBuilder = new AgentClientBuilder({\n ...builder.def,\n pluginConfigs: {\n ...(builder.def.pluginConfigs ?? {}),\n [plugin.name]: config,\n },\n });\n return AgentClientBuilder.withPluginsMethods(newBuilder);\n },\n });\n }\n return builder;\n }\n}\n\n// Helper function to define a agent client\nexport function defineAgentClient<const ServerAgent extends { def: AgentDefinition }>(\n name: ServerAgent[\"def\"][\"name\"],\n) {\n const defaultDefinition = {\n name,\n plugins: [...defaults.plugins].map((p) => p.def),\n pluginConfigs: {},\n $serverDef: {} as ServerAgent[\"def\"],\n } as const satisfies AgentClientDefinition;\n const builder = new AgentClientBuilder(defaultDefinition);\n const builderWithPlugins = AgentClientBuilder.withPluginsMethods(builder);\n return builderWithPlugins as TypedAgentClientBuilder<typeof builderWithPlugins.def, never>;\n}\n","import { z } from \"zod\";\nimport type { Any, Override, Without } from \"@/shared/types\";\nimport { type ZodObjectWithTelemetry, zodObjectWithTelemetry } from \"@/telemetry/helpers/zod\";\nimport type { PluginDefinition } from \"../server/types\";\nimport type {\n PluginClientAtomsDefinition,\n PluginClientDefinition,\n PluginClientExtensionDefinition,\n TypedPluginClientBuilder,\n} from \"./types\";\n\n/**\n * ### `definePluginClientConfig()`\n *\n * Standalone version of `definePluginClient().config()` used to break down plugin client definition.\n *\n * Its output must then be passed to `definePluginClient().$config()`.\n *\n * @example\n * ```ts\n * const configDef = definePluginClientConfig({ schema: z.object({ name: z.string() }) });\n * const pluginClient = definePluginClient(\"my-plugin\").$config(configDef); // <-- Here\n *\n * // Equivalent to:\n * const pluginClient = definePluginClient(\"my-plugin\").config({ schema: z.object({ name: z.string() }) }); // <-- Here\n * ```\n * &nbsp;\n *\n * ---\n * @returns The config definition.\n */\nexport const definePluginClientConfig = <Schema extends z.ZodObject>(\n definition: ZodObjectWithTelemetry<Schema, \"input\">,\n) => zodObjectWithTelemetry(definition);\n\n/**\n * Builder class for the plugin client definition.\n * Do not use directly, use `definePluginClient()` instead.\n */\nexport class PluginClientBuilder<\n PluginClientDef extends PluginClientDefinition,\n Excluded extends string = never,\n> {\n readonly def: PluginClientDef;\n\n constructor(definition: PluginClientDef) {\n this.def = definition;\n }\n\n /**\n * ### `.dependencies()`\n *\n * Specify other plugins clients as required by this plugin client.\n *\n * Their config, atoms, and class can then be accessed from `dependencies.*` inside the plugin client's class and atoms.\n *\n * @see TODO: Add docs link\n *\n * @example\n * ```ts\n * const pluginClient = definePluginClient(\"my-plugin\")\n * .dependencies([anotherPluginClient])\n * .atoms(({ dependencies }) => {\n * // Obtain the atoms of the dependency plugin client\n * const anotherPluginAtoms = dependencies.anotherPlugin.atoms();\n * // ...\n * });\n * ```\n * &nbsp;\n *\n * ---\n * @param plugins - The dependencies definitions.\n * @returns TypedPluginClientBuilder\n */\n dependencies<Plugins extends { def: PluginClientDefinition }[]>(plugins: Plugins) {\n const dependencies = plugins.map((p) => p.def);\n const builder = new PluginClientBuilder({ ...this.def, dependencies });\n return builder as TypedPluginClientBuilder<\n Override<\n PluginClientDef,\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 client's behavior.\n *\n * @see TODO: Add docs link\n *\n * @example\n * ```ts\n * const myPluginClient = definePluginClient(\"my-plugin\")\n * .config({ schema: z.object({ refreshRate: z.number() }) });\n *\n * const myAgentClient = defineAgentClient(\"my-agent\")\n * .plugins([myPluginClient])\n * .myPlugin({ refreshRate: 1000 }); // <-- Here\n * ```\n * &nbsp;\n *\n * ---\n *\n * The provided config can then be accessed from `plugin.config` inside atoms and class.\n *\n * @example\n * ```ts\n * const pluginClient = definePluginClient(\"my-plugin\")\n * .config({ schema: z.object({ refreshRate: z.number() }) });\n * .atoms(({ config }) => {\n * const refreshRate = config.refreshRate; // <-- Here\n * });\n * ```\n * &nbsp;\n *\n * ---\n * @param config - The config definition.\n * @returns TypedPluginClientBuilder\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 client config from the output of `definePluginClientConfig()`.\n *\n * @see TODO: Add docs link for `definePluginClientConfig()`\n *\n * ---\n * @param config - The config definition.\n * @returns TypedPluginClientBuilder\n */\n $config<ConfigDef extends ZodObjectWithTelemetry<z.ZodObject, \"output\">>(config: ConfigDef) {\n const builder = new PluginClientBuilder({ ...this.def, config });\n return builder as TypedPluginClientBuilder<\n Override<PluginClientDef, \"config\", ConfigDef>,\n Excluded | \"config\" | \"$config\"\n >;\n }\n\n /**\n * ### `.class()`\n *\n * TODO\n *\n * @see TODO: Add docs link\n *\n * ---\n * @param input - The class definition.\n * @returns TypedPluginClientBuilder\n */\n class<Extension extends PluginClientExtensionDefinition<PluginClientDef, false>>(\n extension: Extension,\n ) {\n const builder = new PluginClientBuilder({ ...this.def, class: extension });\n return builder as TypedPluginClientBuilder<\n Override<PluginClientDef, \"class\", Extension>,\n Excluded | \"class\"\n >;\n }\n\n /**\n * ### `.atoms()`\n *\n * Add reactive states (atoms) that can then be consumed from various UI frameworks\n * (React, Vue, Svelte, etc.) to render the plugin data in real-time on the user interface.\n *\n * Atoms are powered by [nanostores](https://github.com/nanostores/nanostores).\n *\n * @see TODO: Add docs link\n *\n * @example\n * ```ts\n * import { onMount } from \"nanostores\";\n *\n * const pluginClient = definePluginClient(\"my-plugin\")\n * .atoms(({ plugin }) => {\n * const value = atom(0);\n * onMount(() => {\n * setInterval(async () => {\n * const context = await plugin.context.get();\n * value.set(context.value + 1);\n * }, 1000);\n * });\n * return { value };\n * });\n * ```\n * &nbsp;\n *\n * ---\n *\n * Then from a React component, you can render the `value` atom:\n * ```ts\n * import { useStore } from \"nanostores/react\";\n *\n * export default function Page() {\n * const agent = useAgent(\"my-agent\");\n * const value = useStore(agent.myPlugin.atoms.value);\n * return <div>{value}</div>;\n * };\n * ```\n * &nbsp;\n *\n * ---\n * @param definition - The atoms definition.\n * @returns TypedPluginClientBuilder\n */\n atoms<\n const Names extends string[],\n Atoms extends PluginClientAtomsDefinition<PluginClientDef, false, Names>,\n >(atoms: Atoms) {\n const builder = new PluginClientBuilder({ ...this.def, atoms });\n return builder as TypedPluginClientBuilder<\n Override<PluginClientDef, \"atoms\", Atoms>,\n Excluded | \"atoms\"\n >;\n }\n}\n\ntype ServerPluginShape = { def: PluginDefinition };\n\n/**\n * ### `definePluginClient()`\n *\n * Define a new Life.js plugin client.\n *\n * @see TODO: Add docs link\n */\nexport function definePluginClient<\n ServerPlugin extends ServerPluginShape | undefined = undefined,\n const Name extends string = ServerPlugin extends ServerPluginShape\n ? ServerPlugin[\"def\"][\"name\"]\n : string,\n>(name: Name) {\n // Extract the server definition type precisely if provided, else default to a broad type\n type ExtractServerDefinition = Without<\n ServerPlugin extends ServerPluginShape ? ServerPlugin[\"def\"] : PluginDefinition,\n \"dependencies\" // remove dependencies (unused) to reduce type explosion\n > & { dependencies: [] };\n\n // Create a default definition for the plugin client\n const defaultDefinition = {\n name,\n config: zodObjectWithTelemetry({ schema: z.object() }),\n dependencies: [],\n class: <const _ProvidedConfigs>(..._args: Any[]) => class {},\n atoms: <const _ProvidedConfigs>(..._args: Any[]) => [],\n $serverDef: null as unknown as ExtractServerDefinition,\n } as const satisfies PluginClientDefinition;\n\n // Return the builder with the extracted server definition type\n return new PluginClientBuilder<typeof defaultDefinition>(defaultDefinition);\n}\n","import { atom, onMount } from \"nanostores\";\nimport z from \"zod\";\nimport type { PluginEvent, PluginEventsDefinition } from \"@/plugins/server/types\";\nimport type { Message } from \"@/shared/messages\";\nimport { definePluginClient } from \"../../client/builder\";\nimport type { generationPlugin } from \"./server\";\nimport type { generationPluginEventsDef } from \"./server/events\";\nimport type { GenerationStatus } from \"./server/status\";\n\ntype PluginEventDataInput<\n EventsDef extends PluginEventsDefinition,\n Name extends EventsDef[number][\"name\"],\n> = Extract<PluginEvent<EventsDef, \"input\">, { name: Name }> extends { data: infer Data }\n ? Data\n : never;\n\nexport const generationPluginClient = definePluginClient<typeof generationPlugin>(\"generation\")\n .config({ schema: z.object({ enableVoice: z.boolean().prefault(false) }) })\n .class(\n ({ plugin }) =>\n class {\n async continue(\n params: PluginEventDataInput<typeof generationPluginEventsDef, \"agent.continue\">,\n ) {\n return await plugin.server.events.emit({ name: \"agent.continue\", data: params });\n }\n async decide(\n params: PluginEventDataInput<typeof generationPluginEventsDef, \"agent.decide\">,\n ) {\n return await plugin.server.events.emit({ name: \"agent.decide\", data: params });\n }\n async say(params: PluginEventDataInput<typeof generationPluginEventsDef, \"agent.say\">) {\n return await plugin.server.events.emit({ name: \"agent.say\", data: params });\n }\n async interrupt(\n params: PluginEventDataInput<typeof generationPluginEventsDef, \"agent.interrupt\">,\n ) {\n return await plugin.server.events.emit({ name: \"agent.interrupt\", data: params });\n }\n messages = {\n create: async (\n params: PluginEventDataInput<typeof generationPluginEventsDef, \"messages.create\">,\n ) => await plugin.server.events.emit({ name: \"messages.create\", data: params }),\n update: async (\n params: PluginEventDataInput<typeof generationPluginEventsDef, \"messages.update\">,\n ) => await plugin.server.events.emit({ name: \"messages.update\", data: params }),\n get: () => plugin.server.context.get().messages,\n };\n },\n )\n .atoms(({ plugin, telemetry }) => [\n {\n name: \"status\",\n create: () => {\n const store = atom<GenerationStatus | null>(null);\n\n // Subscribe to status changes\n onMount(store, () => {\n // Fetch initial status from context\n const [error, context] = plugin.server.context.safe.get();\n if (error)\n telemetry.log.error({\n message: \"Failed to fetch initial status from context.\",\n error,\n });\n if (context?.status) store.set(context.status);\n\n // Subscribe to status changes from the context\n const unsubscribe = plugin.server.context.onChange(\n (ctx) => ctx.status,\n (ctx) => store.set(ctx.status),\n );\n\n // Return cleanup function\n return () => unsubscribe?.();\n });\n\n return { store, refresh: async () => void 0 };\n },\n },\n {\n name: \"messages\",\n create: () => {\n const store = atom<Message[]>([]);\n // Subscribe to messages changes\n onMount(store, () => {\n // Fetch initial messages from context (if availabe, i.e, agent started)\n const [error, context] = plugin.server.context.safe.get();\n if (error)\n telemetry.log.error({\n message: \"Failed to fetch initial messages from context.\",\n error,\n });\n\n if (context?.messages) store.set(context.messages);\n\n // Subscribe to messages changes from the context\n const unsubscribe = plugin.server.context.onChange(\n (ctx) => ctx.messages,\n (ctx) => store.set(ctx.messages),\n );\n\n // Return cleanup function\n return () => unsubscribe?.();\n });\n\n return { store, refresh: async () => void 0 };\n },\n },\n ]);\n","import { definePluginClient } from \"../../client/builder\";\nimport { generationPluginClient } from \"../generation/client\";\nimport type { memoriesPlugin } from \"./server\";\n\nexport const memoriesPluginClient = definePluginClient<typeof memoriesPlugin>(\"memories\")\n .dependencies([generationPluginClient])\n .class((_) => class {});\n","import { definePluginClient } from \"../../client/builder\";\nimport type { storesPlugin } from \"./server\";\n\nexport const storesPluginClient = definePluginClient<typeof storesPlugin>(\"stores\");\n","export { defineAgentClient } from \"@/agent/client/builder\";\nexport { createLifeClient } from \"@/client/create\";\nexport { definePluginClient } from \"@/plugins/client/builder\";\n\nimport { generationPluginClient } from \"@/plugins/defaults/generation/client\";\nimport { memoriesPluginClient } from \"@/plugins/defaults/memories/client\";\nimport { storesPluginClient } from \"@/plugins/defaults/stores/client\";\n\n// Explicit typing is required to avoid type size explosion with the iterator\nexport type ClientPluginsDefaults = {\n readonly generation: typeof generationPluginClient;\n readonly memories: typeof memoriesPluginClient;\n readonly stores: typeof storesPluginClient;\n readonly [Symbol.iterator]: () => Generator<\n typeof generationPluginClient | typeof memoriesPluginClient | typeof storesPluginClient,\n void,\n unknown\n >;\n};\n\nexport const defaults: { readonly plugins: ClientPluginsDefaults } = {\n plugins: {\n generation: generationPluginClient,\n memories: memoriesPluginClient,\n stores: storesPluginClient,\n *[Symbol.iterator]() {\n for (const entry of Object.values(this)) yield entry;\n },\n },\n};\n\n// Types\nexport type { AgentClient } from \"@/agent/client/class\";\nexport type {\n AgentClientFromBuild,\n AgentClientParam,\n} from \"@/agent/client/types\";\nexport { parseAgentClientParam } from \"@/agent/client/types\";\nexport type { LifeClient } from \"@/client/client\";\nexport type { Message } from \"@/shared/messages\";\n"],"mappings":"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","names":["z","z"]}