@dxos/compute 0.9.0 → 0.9.1-main.c7dcc2e112

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -806,7 +806,7 @@ var Routine = Schema6.Struct({
806
806
  output: JsonSchema.JsonSchema.pipe(Annotation3.FormInputAnnotation.set(false)).annotations({
807
807
  description: "Output schema"
808
808
  }),
809
- instructions: Ref2.Ref(Text2.Text).pipe(Format.FormatAnnotation.set(Format.TypeFormat.Markdown), Schema6.annotations({
809
+ instructions: Ref2.Ref(Text2.Text).pipe(Annotation3.FormInputAnnotation.set(false), Format.FormatAnnotation.set(Format.TypeFormat.Markdown), Schema6.annotations({
810
810
  title: "Instructions",
811
811
  description: "Agent instructions"
812
812
  })),
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/Blueprint.ts", "../../../src/McpServer.ts", "../../../src/Template.ts", "../../../src/Credential.ts", "../../../src/Header.ts", "../../../src/LayerSpec.ts", "../../../src/OperationRegistry.ts", "../../../src/Process.ts", "../../../src/Trace.ts", "../../../src/Routine.ts", "../../../src/Script.ts", "../../../src/ServiceResolver.ts", "../../../src/Trigger.ts", "../../../src/TriggerEvent.ts"],
4
- "sourcesContent": ["//\n// Copyright 2025 DXOS.org\n//\n\n// @import-as-namespace\n\nimport * as Effect from 'effect/Effect';\nimport * as Schema from 'effect/Schema';\n\nimport { ToolId } from '@dxos/ai';\nimport { DXN, Annotation, Database, Filter, Migration, Obj, Registry, Type, URI } from '@dxos/echo';\nimport { BaseError } from '@dxos/errors';\n\nimport * as McpServer from './McpServer';\nimport * as Operation from './Operation';\nimport * as Template from './Template';\n\n/**\n * Blueprint schema defines the structure for AI assistant blueprints.\n * Blueprints contain instructions, tools, and artifacts that guide the AI's behavior.\n * Blueprints may use tools to create and read artifacts, which are managed by the assistant.\n *\n * The registry `key` and `version` are stored in the object meta — access them via\n * `Obj.getMeta(blueprint).key` and `Obj.getMeta(blueprint).version`.\n */\n// TODO(burdon): Rename Skill?\nexport const Blueprint = Schema.Struct({\n /**\n * Human-readable name of the blueprint.\n */\n name: Schema.String.annotations({\n description: 'Human-readable name of the blueprint',\n }),\n\n /**\n * Description of the blueprint's purpose and functionality.\n */\n description: Schema.optional(Schema.String).annotations({\n description: \"Description of the blueprint's purpose and functionality\",\n }),\n\n /**\n * Instructions that guide the AI assistant's behavior and responses.\n * These are system prompts or guidelines that the AI should follow.\n */\n instructions: Template.Template.annotations({\n description: \"Instructions that guide the AI assistant's behavior and responses\",\n }),\n\n /**\n * Array of tools that the AI assistant can use when this blueprint is active.\n */\n tools: Schema.Array(ToolId).annotations({\n description: 'Array of tools that the AI assistant can use when this blueprint is active',\n }),\n\n /**\n * Whether an agent is allowed to auto-enable this blueprint in a conversation.\n */\n agentCanEnable: Schema.optional(Schema.Boolean).annotations({\n description: 'Whether an agent is allowed to auto-enable this blueprint in a conversation.',\n }),\n\n /**\n * Array of MCP servers that the AI assistant can use when this blueprint is active.\n */\n mcpServers: Schema.optional(Schema.Array(McpServer.McpServer)),\n}).pipe(\n Annotation.LabelAnnotation.set(['name']),\n Annotation.IconAnnotation.set({ icon: 'ph--blueprint--regular', hue: 'sky' }),\n Type.makeObject(DXN.make('org.dxos.type.blueprint', '0.2.0')),\n);\n\n/**\n * TypeScript type for Blueprint.\n */\nexport type Blueprint = Type.InstanceType<typeof Blueprint>;\n\ntype MakeProps = { key: string; version?: string; name: string } & Partial<Blueprint>;\n\n/**\n * Create a new Blueprint.\n * The `key` (and optional `version`) are stored in the object meta.\n */\nexport const make = ({ key, version, tools = [], instructions = Template.make(), ...props }: MakeProps) =>\n Obj.make(Blueprint, {\n [Obj.Meta]: { key, version },\n tools,\n instructions,\n ...props,\n });\n\n/**\n * Get the registry key for a blueprint.\n */\nexport const getKey = (blueprint: Blueprint): string => {\n const key = Obj.getMeta(blueprint).key;\n if (key === undefined) {\n throw new Error('Blueprint is missing the meta key.');\n }\n return key;\n};\n\n/**\n * Get the registry version for a blueprint, if any.\n */\nexport const getVersion = (blueprint: Blueprint): string | undefined => Obj.getMeta(blueprint).version;\n\n/**\n * Util to create tool definitions for a blueprint.\n */\nexport const toolDefinitions = ({\n tools = [],\n operations = [],\n}: {\n tools?: string[];\n operations?: Operation.Definition.Any[];\n}) => [...operations.map((op) => ToolId.make(DXN.getName(op.meta.key))), ...tools.map((tool) => ToolId.make(tool))];\n\n/**\n * Factory for the blueprints.\n */\nexport type Definition = {\n key: string;\n make: () => Blueprint;\n};\n\n/**\n * Returns the canonical URI used to reference this blueprint in the registry.\n * Valid DXN keys produce `dxn:<key>`; other keys use the raw key as a URI.\n * Use this URI with `Ref.fromURI` to bind a blueprint without cloning it to the DB.\n *\n * TODO(wittjosiah): Should use Obj.getURI instead once it supports options to prefer meta key over EID.\n */\nexport const registryURI = (key: string): URI.URI => (DXN.tryMake(`dxn:${key}`) ?? URI.make(key)) as URI.URI;\n\n/**\n * Resolves a blueprint from the registry by its meta key.\n * Does not check the local database for the blueprint.\n */\nexport const resolve = (key: string): Effect.Effect<Blueprint, NotFoundError, Registry.Service> =>\n Effect.gen(function* () {\n const results = yield* Registry.runQuery(Filter.and(Filter.type(Blueprint), Filter.key(key)));\n const blueprint = results[0];\n if (!blueprint) {\n return yield* Effect.fail(new NotFoundError({ context: { key } }));\n }\n return blueprint;\n });\n\n/**\n * Upserts a blueprint into the database.\n * If the blueprint already exists in the database, the local (possibly forked) copy is returned as-is.\n * Otherwise, a fresh copy is cloned from the registry and added.\n * @deprecated Since we're using a registry we no longer need to store blueprints in the database.\n */\n// TODO(dmaretskyi): Remove.\nexport const upsert = (key: string): Effect.Effect<Blueprint, NotFoundError, Registry.Service | Database.Service> =>\n Effect.gen(function* () {\n const local = yield* Database.query(Filter.and(Filter.type(Blueprint), Filter.key(key))).run;\n if (local.length > 0) {\n return local[0];\n }\n return yield* Database.add(Obj.clone(yield* resolve(key), { deep: true }));\n });\n\nexport class NotFoundError extends BaseError.extend('BlueprintNotFound', 'Blueprint not found') {}\n\n//\n// Legacy schemas and migrations.\n//\n\n/**\n * Blueprint schema v0.1.0 — `key` is stored as a data property.\n * @deprecated Use {@link Blueprint} (v0.2.0) instead; the `key` and `version` now live in the object meta.\n */\nexport const Blueprint_v0_1_0 = Schema.Struct({\n /**\n * Global registry ID.\n * NOTE: The `key` property refers to the original registry entry.\n */\n key: Schema.String.annotations({\n description: 'Unique registration key for the blueprint',\n }),\n\n name: Schema.String.annotations({\n description: 'Human-readable name of the blueprint',\n }),\n\n description: Schema.optional(Schema.String),\n\n instructions: Template.Template,\n\n tools: Schema.Array(ToolId),\n\n agentCanEnable: Schema.optional(Schema.Boolean),\n\n mcpServers: Schema.optional(Schema.Array(McpServer.McpServer)),\n}).pipe(Type.makeObject(DXN.make('org.dxos.type.blueprint', '0.1.0')));\n\nexport type Blueprint_v0_1_0 = Type.InstanceType<typeof Blueprint_v0_1_0>;\n/**\n * Migration from {@link Blueprint_v0_1_0} (v0.1.0) to {@link Blueprint} (v0.2.0).\n * Moves `key` from the data section into the object meta.\n */\nconst _migration = Migration.define({\n from: Blueprint_v0_1_0,\n to: Blueprint,\n transform: async (from) => ({\n [Obj.Meta]: { key: from.key, version: '0.1.0' },\n name: from.name,\n description: from.description,\n instructions: from.instructions,\n tools: from.tools,\n agentCanEnable: from.agentCanEnable,\n mcpServers: from.mcpServers,\n }),\n});\n\n/**\n * Schema migrations exported by this module.\n * Exported as an array for extensibility — append future versions here.\n */\nexport const migrations = [_migration];\n", "//\n// Copyright 2025 DXOS.org\n//\n\n// @import-as-namespace\n\nimport * as Schema from 'effect/Schema';\n\n/**\n * MCP server connection spec — the minimal fields needed to dial an MCP server.\n *\n * Used as a value type embedded in blueprints and passed to runtime session connect logic.\n * The user-facing ECHO object (`@dxos/assistant-toolkit` `McpServer`) composes this struct\n * and adds instance-level fields (`name`, `enabled`) and ECHO annotations.\n */\nexport const McpServer = Schema.Struct({\n name: Schema.String.pipe(Schema.optional).annotations({\n description: 'Human-readable name of the MCP server',\n }),\n\n url: Schema.String.annotations({\n description: 'URL of the MCP server',\n }),\n\n /**\n * Transport protocol. Prefer `'http'` (Streamable HTTP) for new servers; `'sse'` is\n * kept for compatibility with servers that haven't migrated and is deprecated per\n * the MCP SDK. Clients support both during the migration period.\n */\n protocol: Schema.Union(Schema.Literal('http'), Schema.Literal('sse')).annotations({\n description: 'Transport protocol of the MCP server (prefer \"http\"; \"sse\" deprecated)',\n }),\n\n /**\n * Optional API key sent with requests.\n * Persisted in plaintext when stored on a space-replicated ECHO object — see the\n * `@dxos/assistant-toolkit` `McpServer` type for security implications.\n */\n apiKey: Schema.optional(Schema.String).annotations({\n description: 'Optional API key sent with requests',\n }),\n});\n\nexport type McpServer = Schema.Schema.Type<typeof McpServer>;\n", "//\n// Copyright 2024 DXOS.org\n//\n\n// @import-as-namespace\n\nimport * as Effect from 'effect/Effect';\nimport * as Schema from 'effect/Schema';\n\nimport { Database, DXN, Filter, Ref, Registry } from '@dxos/echo';\nimport type { EntityNotFoundError } from '@dxos/echo/Err';\nimport { assertArgument, invariant } from '@dxos/invariant';\nimport { log } from '@dxos/log';\nimport { Text } from '@dxos/schema';\nimport Handlebars from '@dxos/vendor-kbn-handlebars';\n\nimport { FunctionNotFoundError } from './errors';\nimport * as Operation from './Operation';\n\n/**\n * Template input kind determines how template variables are resolved.\n */\nexport const InputKind = Schema.Literal(\n 'value', // Literal value.\n 'operation',\n // 'pass-through',\n // 'retriever',\n // 'query',\n // 'resolver',\n // 'context',\n // 'schema',\n);\n\nexport type InputKind = Schema.Schema.Type<typeof InputKind>;\n\n/**\n * Template input variable.\n * E.g., {{foo}}\n */\nexport const Input = Schema.Struct({\n name: Schema.String,\n kind: InputKind,\n default: Schema.optional(Schema.Any),\n /**\n * Operation key invoked when `kind === 'operation'`. The referenced operation must accept void input —\n * template inputs have no mechanism for passing arguments.\n */\n operation: Schema.optional(Schema.String),\n});\n\nexport type Input = Schema.Schema.Type<typeof Input>;\n\n/**\n * Template type.\n */\nexport const Template = Schema.Struct({\n source: Ref.Ref(Text.Text).annotations({ description: 'Markdown + Handlebars template.' }),\n\n /**\n * NOTE: We use an array rather than map so that updating variable names in the template doesn't disconnect existing inputs.\n */\n inputs: Schema.optional(Schema.Array(Input)),\n});\n\nexport type Template = Schema.Schema.Type<typeof Template>;\nexport type MakeProps = Partial<{ id: string; source: string; inputs: Input[] }>;\n\nexport const make = ({ id, source, inputs = [] }: MakeProps = {}): Template => ({\n source: Ref.make(Text.make({ id, content: source })),\n inputs,\n});\n\n/**\n * Process Handlebars template.\n */\nexport const process = <Options extends {}>(source: string, variables: Partial<Options> = {}): string => {\n assertArgument(typeof source === 'string', 'source');\n let section = 0;\n const handlebars = Handlebars.create();\n handlebars.registerHelper('section', () => String(++section));\n const template = handlebars.compileAST(source.trim());\n const output = template(variables);\n return output.trim().replace(/(\\n\\s*){3,}/g, '\\n\\n');\n};\n\nexport const processTemplate = (\n template: Template,\n): Effect.Effect<string, EntityNotFoundError | FunctionNotFoundError, Registry.Service | Operation.Service> =>\n Effect.gen(function* () {\n const entries = yield* Effect.forEach(template.inputs ?? [], (input) =>\n Effect.gen(function* () {\n switch (input.kind) {\n case 'value': {\n return [input.name, input.default] as const;\n }\n\n case 'operation': {\n invariant(input.operation);\n // Normalize to a full DXN key so Filter.key matches the stored meta key.\n const key = DXN.isDXN(input.operation) ? input.operation : `dxn:${input.operation}`;\n const results = yield* Registry.runQuery(\n Filter.and(Filter.type(Operation.PersistentOperation), Filter.key(key)),\n );\n if (results.length === 0) {\n return yield* Effect.fail(new FunctionNotFoundError(input.operation));\n }\n const fn = Operation.deserialize(results[0]);\n\n // NOTE: Operations referenced by template inputs must accept void input — see `Input.operation`.\n const result = yield* Operation.invoke(fn, undefined as any).pipe(Effect.orDie);\n return [input.name, result] as const;\n }\n\n default: {\n return yield* Effect.dieMessage(`Unsupported input kind: ${input.kind}`);\n }\n }\n }),\n );\n\n const variables = Object.fromEntries(entries);\n\n log('processTemplate', { variables });\n return process((yield* Database.load(template.source)).content, variables);\n });\n", "//\n// Copyright 2025 DXOS.org\n//\n\n// @import-as-namespace\n\nimport * as Context from 'effect/Context';\nimport * as Effect from 'effect/Effect';\nimport * as Redacted from 'effect/Redacted';\n\nexport type CredentialQuery = {\n service?: string;\n};\n\n// TODO(dmaretskyi): Unify with other apis.\n// packages/sdk/schema/src/common/access-token.ts\nexport type ServiceCredential = {\n service: string;\n\n // TODO(dmaretskyi): Build out.\n apiKey?: string;\n};\n\nexport class CredentialsService extends Context.Tag('@dxos/functions/CredentialsService')<\n CredentialsService,\n {\n /**\n * Query all.\n */\n queryCredentials: (query: CredentialQuery) => Promise<ServiceCredential[]>;\n\n /**\n * Get a single credential.\n * @throws {Error} If no credential is found.\n */\n getCredential: (query: CredentialQuery) => Promise<ServiceCredential>;\n }\n>() {\n static getCredential = (query: CredentialQuery): Effect.Effect<ServiceCredential, never, CredentialsService> =>\n Effect.gen(function* () {\n const credentials = yield* CredentialsService;\n return yield* Effect.promise(() => credentials.getCredential(query));\n });\n\n static getApiKey = (query: CredentialQuery): Effect.Effect<Redacted.Redacted<string>, never, CredentialsService> =>\n Effect.gen(function* () {\n const credential = yield* CredentialsService.getCredential(query);\n if (!credential.apiKey) {\n throw new Error(`API key not found for service: ${query.service}`);\n }\n return Redacted.make(credential.apiKey);\n });\n}\n", "//\n// Copyright 2026 DXOS.org\n//\n\n// @import-as-namespace\n\nimport * as HttpClient from '@effect/platform/HttpClient';\nimport * as HttpClientRequest from '@effect/platform/HttpClientRequest';\nimport * as Effect from 'effect/Effect';\nimport * as Layer from 'effect/Layer';\n\nimport { BYOK_HEADER } from '@dxos/protocols';\n\nimport * as Credential from './Credential';\n\n/**\n * Wraps an `HttpClient` so outbound requests carry `X-BYOK: <apiKey>` whenever the active space\n * has an `AccessToken` for `providerHost`. Lookup failures pass the request through unchanged.\n */\nexport const byokLayer = (\n providerHost: string,\n): Layer.Layer<HttpClient.HttpClient, never, HttpClient.HttpClient | Credential.CredentialsService> =>\n Layer.effect(\n HttpClient.HttpClient,\n Effect.gen(function* () {\n const client = yield* HttpClient.HttpClient;\n const credentials = yield* Credential.CredentialsService;\n return HttpClient.mapRequestEffect(client, (request) =>\n Effect.gen(function* () {\n const matches = yield* Effect.tryPromise(() => credentials.queryCredentials({ service: providerHost })).pipe(\n Effect.orElseSucceed((): Credential.ServiceCredential[] => []),\n );\n const apiKey = matches.find((credential) => credential.apiKey)?.apiKey;\n return apiKey ? HttpClientRequest.setHeader(request, BYOK_HEADER, apiKey) : request;\n }),\n );\n }),\n );\n", "//\n// Copyright 2026 DXOS.org\n//\n\nimport * as Context from 'effect/Context';\nimport * as Layer from 'effect/Layer';\nimport * as Types from 'effect/Types';\n\nimport { SpaceId, type URI } from '@dxos/keys';\n\nimport type * as Process from './Process';\n\n// @import-as-namespace\n\nexport const TypeId = '~@dxos/functions/LayerSpec' as const;\nexport type TypeId = typeof TypeId;\n\n/**\n * Opaque layer with introspectable tags.\n */\nexport interface LayerSpec {\n readonly [TypeId]: TypeId;\n\n readonly affinity: Affinity;\n readonly requires: readonly Context.Tag<any, any>[];\n readonly provides: readonly Context.Tag<any, any>[];\n\n // opaque service creation function, layer provides the specified services and requires the specified requirements.\n readonly make: (context: LayerContext) => Layer.Layer<unknown, never, unknown>;\n}\n\n/**\n * Affinity defines the lifetime and scope of a service.\n *\n * - `application` - single service instance is available throughout the entire application.\n * - `space` - service is instantiated per space.\n * - `process` - separate service instance is created and destroyed for each process.\n */\nexport type Affinity = 'application' | 'space' | 'process';\n\n/**\n * Provides context for service resolution.\n */\n// TODO(dmaretskyi): Consider making this type dependant on the specified service affinity.\nexport interface LayerContext {\n /**\n * Under which space the process is running.\n * Space affinity and up only.\n */\n readonly space?: SpaceId;\n\n /**\n * URI of the conversation feed the process is running in.\n * Process affinity only.\n */\n readonly conversation?: URI.URI;\n\n /**\n * Under which process the process is running.\n * Process affinity only.\n */\n readonly process?: Process.ID;\n}\n\ninterface MakeOpts {\n readonly affinity: Affinity;\n readonly requires: readonly Context.Tag<any, any>[];\n readonly provides: readonly Context.Tag<any, any>[];\n}\n\n/**\n * Make a service.\n */\nexport const make = <const Opts extends Types.NoExcessProperties<MakeOpts, Opts>>(\n opts: Opts,\n make: (\n context: LayerContext,\n ) => Layer.Layer<\n Context.Tag.Identifier<Opts['provides'][number]>,\n never,\n Context.Tag.Identifier<Opts['requires'][number]>\n >,\n): LayerSpec => {\n return {\n [TypeId]: TypeId,\n affinity: opts.affinity,\n requires: opts.requires,\n provides: opts.provides,\n make: make as any,\n };\n};\n", "//\n// Copyright 2026 DXOS.org\n//\n\n// @import-as-namespace\n\nimport * as Context from 'effect/Context';\nimport * as Effect from 'effect/Effect';\nimport * as Layer from 'effect/Layer';\nimport * as Option from 'effect/Option';\n\nimport { Database, Filter, Query } from '@dxos/echo';\n\nimport * as Operation from './Operation';\nimport * as OperationHandlerSet from './OperationHandlerSet';\n\nexport interface OperationRegistry {\n /**\n * Resolve an operation by key.\n */\n resolve(key: string): Effect.Effect<Option.Option<Operation.Definition.Any>>;\n}\n\nexport class Service extends Context.Tag('@dxos/operation/OperationRegistry')<Service, OperationRegistry>() {}\n\n/**\n * Resolve an operation by key.\n */\nexport const resolve: (key: string) => Effect.Effect<Option.Option<Operation.Definition.Any>, never, Service> =\n Effect.serviceFunctionEffect(Service, (service) => service.resolve);\n\nexport const layer: Layer.Layer<Service, never, Database.Service | OperationHandlerSet.OperationHandlerProvider> =\n Layer.effect(\n Service,\n Effect.gen(function* () {\n const database = yield* Database.Service;\n const handlerSet = yield* OperationHandlerSet.OperationHandlerProvider;\n return {\n resolve: (key: string) =>\n Database.query(Query.select(Filter.and(Filter.type(Operation.PersistentOperation), Filter.key(key))))\n .first.pipe(\n Effect.flatten,\n Effect.map(Operation.deserialize),\n Effect.catchTag('NoSuchElementException', () => OperationHandlerSet.getHandlerByKey(handlerSet, key)),\n Effect.option,\n )\n .pipe(Effect.provideService(Database.Service, database)),\n };\n }),\n );\n", "//\n// Copyright 2026 DXOS.org\n//\n\n// @import-as-namespace\n\nimport type { Atom } from '@effect-atom/atom';\nimport * as Context from 'effect/Context';\nimport * as Effect from 'effect/Effect';\nimport type * as Exit from 'effect/Exit';\nimport * as Option from 'effect/Option';\nimport * as Schema from 'effect/Schema';\nimport * as Scope from 'effect/Scope';\nimport type * as Types from 'effect/Types';\n\nimport { assertArgument } from '@dxos/invariant';\nimport { DXN, type URI } from '@dxos/keys';\nimport { log } from '@dxos/log';\n\nimport * as Operation from './Operation';\nimport * as OperationHandlerSet from './OperationHandlerSet';\nimport * as StorageService from './StorageService';\nimport * as Trace from './Trace';\n\n//\n// Process.\n//\n\n/** Opaque process id (arbitrary string). */\nexport const ID = Schema.String.pipe(Schema.brand('ProcessId'));\nexport type ID = Schema.Schema.Type<typeof ID>;\n\n/**\n * A running process callbacks.\n *\n * Process lifecycle: Initial -> Running <-> Suspended -> Terminated.\n *\n * - onSpawn -> called once when the process is spawned.\n * - onInput -> called for every input submitted to the process.\n * - onAlarm -> called for processes scheduling alarms.\n * - onChildEvent -> called when child process produces output or exits.\n */\nexport interface Callbacks<I, O, R> {\n /**\n * Called when the process is spawned.\n * Not called for processes that are resumed from a previously suspended state.\n *\n * @returns A signal indicating to the runtime whether the process is finished, or should be resumed later.\n * @throws Throwing in the handler will terminate the process with an error.\n *\n * Note: This function should aim to complete in under 5 seconds to avoid exceeding limits in serverless environments.\n */\n onSpawn(): Effect.Effect<void, never, R | BaseServices>;\n\n /**\n * Called when there's input available to process.\n *\n * The function can be called in parallel.\n *\n * @returns A signal indicating to the runtime whether the process is finished, or should be resumed later.\n * @throws Throwing in the handler will terminate the process with an error.\n *\n * Note: This function should aim to complete in under 5 seconds to avoid exceeding limits in serverless environments.\n */\n onInput(input: I): Effect.Effect<void, never, R | BaseServices>;\n\n /**\n * Called when the process's alarm is triggered.\n *\n * @throws Throwing in the handler will terminate the process with an error.\n */\n onAlarm(): Effect.Effect<void, never, R | BaseServices>;\n\n /**\n * Called when the process's child process produces output or exits.\n *\n * This allows the parent process to hibernate while a long-running child process is running.\n */\n onChildEvent(event: ChildEvent<unknown>): Effect.Effect<void, never, R | BaseServices>;\n}\n\n/**\n * Services that are always available to all processes.\n * Provided unconditionally by the runtime, so handlers may use them without declaring them\n * in {@link MakeProcessOpts.services}.\n */\nexport type BaseServices = Trace.TraceService | StorageService.StorageService;\n\nexport type ChildEvent<T> =\n | {\n readonly _tag: 'output';\n readonly pid: ID;\n readonly data: T;\n }\n | {\n readonly _tag: 'exited';\n readonly pid: ID;\n readonly result: Exit.Exit<void>;\n };\n\nexport interface ProcessContext<I, O> {\n readonly id: ID;\n\n /**\n * Parameters assigned during process creation.\n */\n readonly params: Params;\n\n /**\n * Complete this process with sucessful result.\n * No additional events will be pushed to the process.\n */\n succeed(): void;\n\n /**\n * Complete this process with an error.\n * No additional events will be pushed to the process.\n */\n fail(error: Error): void;\n\n /**\n * Submit output of the process.\n */\n submitOutput(output: O): void;\n\n /**\n * Set an alarm for the process to be woken up later.\n *\n * @param timeout - Optional timeout in milliseconds. If not provided, the process is woken up as soon as possible.\n */\n setAlarm(timeout?: number): void;\n}\n\n/**\n * Generic parameters for a all processes.\n */\nexport interface Params {\n /**\n * Process name for debugging purposes.\n */\n readonly name: string | null;\n\n /**\n * URI of the target this process is assigned to.\n */\n readonly target: URI.URI | null;\n\n /**\n * User-facing notifications requested for this process's lifecycle phases.\n * Surfaced on {@link Info} so a notification tracker can subscribe to the process monitor.\n */\n readonly notify?: Operation.NotifyOptions;\n}\n\n//\n// Executable.\n//\n\nexport const ProcessTypeId = '~@dxos/functions/Process' as const;\nexport type ProcessTypeId = typeof ProcessTypeId;\n\n/**\n * A process (factory).\n * Can be instantiated mutlitple times to produce new runtime instance with separate state and callbacks.\n * `create` is used to instantiate a new process.\n * Can store runtime state in scope of `create` function.\n */\nexport interface Process<I, O, R> extends Process.Variance<I, O, R> {\n /**\n * Unique identifier for the executable in the reverse DNS format.\n */\n readonly key: string;\n\n /**\n * Human-readable label from {@link MakeExecutableOpts.name} when provided.\n */\n readonly name?: string;\n\n readonly services: readonly Context.Tag<any, any>[];\n\n /**\n * Create a new instance of the process.\n */\n create(ctx: ProcessContext<I, O>): Effect.Effect<Callbacks<I, O, R>, never, R | BaseServices | Scope.Scope>;\n}\n\nexport const isProcess = (executable: unknown): executable is Process.Any =>\n typeof executable === 'object' && executable !== null && ProcessTypeId in executable;\n\nexport namespace Process {\n export interface Variance<I, O, R> {\n readonly [ProcessTypeId]: {\n readonly _Input: Types.Contravariant<I>;\n readonly _Output: Types.Covariant<O>;\n readonly _Requirements: Types.Covariant<R>;\n };\n }\n\n export type Any = Process<any, any, never>;\n}\n\nexport interface MakeProcessOpts {\n /**\n * Unique identifier for the process in the reverse DNS format.\n */\n readonly key: string;\n\n readonly input: Schema.Schema.AnyNoContext;\n readonly output: Schema.Schema.AnyNoContext;\n readonly services: readonly Context.Tag<any, any>[];\n}\n\nexport const make = <const Opts extends Types.NoExcessProperties<MakeProcessOpts, Opts>>(\n opts: Opts,\n create: (\n ctx: ProcessContext<Schema.Schema.Type<Opts['input']>, Schema.Schema.Type<Opts['output']>>,\n ) => Effect.Effect<\n Partial<\n Callbacks<\n Schema.Schema.Type<Opts['input']>,\n Schema.Schema.Type<Opts['output']>,\n Context.Tag.Identifier<NonNullable<Opts['services']>[number]>\n >\n >,\n never,\n Context.Tag.Identifier<NonNullable<Opts['services']>[number]> | BaseServices | Scope.Scope\n >,\n): Process<\n Schema.Schema.Type<Opts['input']>,\n Schema.Schema.Type<Opts['output']>,\n Context.Tag.Identifier<NonNullable<Opts['services']>[number]>\n> => {\n assertArgument(/^[a-z0-9]([a-z0-9.\\-/]*[a-z0-9])?$/i.test(opts.key), 'key', 'Invalid key');\n return {\n [ProcessTypeId]: {} as any,\n ...opts,\n create: (ctx) =>\n create(ctx).pipe(\n Effect.map((partial) => ({\n onSpawn: () => Effect.void,\n onInput: () => Effect.void,\n onAlarm: () => Effect.void,\n onChildEvent: () => Effect.void,\n ...partial,\n })),\n ),\n };\n};\n\n/**\n * Durable marker recording that an operation's input handler has begun executing.\n * Persisted before the handler runs so that, after an interruption (suspend/restart), a\n * re-delivered input can tell that the previous attempt was in-flight. Cleared automatically\n * when the process reaches a terminal state (the runtime clears the process's storage).\n */\nconst OperationStartedKey = StorageService.key(Schema.parseJson(Schema.Boolean), 'operation/started').pipe(\n StorageService.withDefault(() => false),\n);\n\nexport const fromOperation = <const Op extends Operation.Definition.Any>(\n op: Op,\n handler: OperationHandlerSet.OperationHandlerSet,\n): Process<Operation.Definition.Input<Op>, Operation.Definition.Output<Op>, Operation.Definition.Services<Op>> =>\n make(\n {\n key: DXN.getName(op.meta.key),\n input: op.input,\n output: op.output,\n services: op.services,\n },\n (ctx) =>\n Effect.gen(function* () {\n const semaphore = yield* Effect.makeSemaphore(1);\n // The process runtime assumes handlers are idempotent and always re-delivers an input\n // whose handler was interrupted. Non-idempotent operations opt out of that retry here:\n // a re-delivery that observes the durable \"started\" marker fails instead of repeating\n // side effects. Idempotent operations skip the marker and are simply re-run.\n const idempotent = Operation.isIdempotent(op);\n\n return {\n onInput: (input: Operation.Definition.Input<Op>) =>\n Effect.gen(function* () {\n if (!idempotent) {\n const started = yield* OperationStartedKey.get;\n if (started) {\n return yield* Effect.die(\n new Error(`non-idempotent operation \"${op.meta.key}\" was interrupted; cannot retry safely`),\n );\n }\n yield* OperationStartedKey.set(true);\n }\n\n // Emit operation start event.\n log('operation process invoking', { key: op.meta.key, name: op.meta.name });\n yield* Trace.write(Trace.OperationStart, {\n key: op.meta.key,\n name: op.meta.name,\n icon: op.meta.icon,\n });\n // Emit ephemeral operation input event for live subscribers\n // (history tracker, devtools) without persisting raw input.\n yield* Trace.write(Trace.OperationInput, {\n key: op.meta.key,\n name: op.meta.name,\n input,\n });\n\n const opHandler = yield* OperationHandlerSet.getHandler(handler, op).pipe(Effect.orDie);\n const output = yield* opHandler\n .handler(input)\n .pipe(Effect.orDie, Effect.withSpan(op.meta.key)) as Effect.Effect<\n Operation.Definition.Output<Op>,\n never,\n never\n >;\n\n ctx.submitOutput(output);\n ctx.succeed();\n\n // Emit ephemeral operation output event before the persisted\n // end event so subscribers see output + completion together.\n yield* Trace.write(Trace.OperationOutput, {\n key: op.meta.key,\n name: op.meta.name,\n output,\n });\n // Emit operation end event with success after side-effects complete.\n yield* Trace.write(Trace.OperationEnd, {\n key: op.meta.key,\n name: op.meta.name,\n icon: op.meta.icon,\n outcome: 'success',\n });\n }).pipe(\n Effect.catchAllDefect((defect) =>\n Effect.gen(function* () {\n // Emit operation end event with failure.\n const errorMessage = defect instanceof Error ? defect.message : String(defect);\n yield* Trace.write(Trace.OperationEnd, {\n key: op.meta.key,\n name: op.meta.name,\n icon: op.meta.icon,\n outcome: 'failure',\n error: errorMessage,\n });\n return yield* Effect.die(defect);\n }),\n ),\n semaphore.withPermits(1),\n ),\n };\n }),\n );\n\n/**\n * Runtime state of a process.\n */\nexport enum State {\n // Process is actively running.\n RUNNING = 'RUNNING',\n\n // Process is waiting for a child process to complete or an alarm to trigger.\n HYBERNATING = 'HYBERNATING',\n\n // Process is waiting for input. It will only resume when input is submitted.\n IDLE = 'IDLE',\n\n // Process is terminating and will transition to TERMINATED state.\n // TODO(dmaretskyi): Consider removing.\n TERMINATING = 'TERMINATING',\n\n // Process has been externally terminated.\n TERMINATED = 'TERMINATED',\n\n // Process has completed successfully.\n SUCCEEDED = 'SUCCEEDED',\n\n // Process has failed.\n FAILED = 'FAILED',\n}\n\n/**\n * Read-only view of a process tree\n */\nexport interface Monitor {\n /**\n * Get the current state of the process tree.\n */\n processTree: Effect.Effect<readonly Info[]>;\n\n /**\n * Atom for the process tree.\n */\n processTreeAtom: Atom.Atom<readonly Info[]>;\n}\n\nexport class ProcessMonitorService extends Context.Tag('@dxos/functions/ProcessMonitorService')<\n ProcessMonitorService,\n Monitor\n>() {}\n\nexport interface Info {\n readonly pid: ID;\n readonly parentPid: ID | null;\n\n /**\n * Key of the process.\n *\n * NOTE: There might be multiple running processes with the same key.\n */\n readonly key: string;\n\n /**\n * Parameters of the process.\n */\n readonly params: Params;\n\n /**\n * State of the process.\n */\n readonly state: State;\n\n /**\n * Error of the process.\n * Only for process in FAILED state.\n */\n readonly error: string | null;\n\n /**\n * UNIX timestamp in milliseconds.\n */\n readonly startedAt: number;\n\n /**\n * UNIX timestamp in milliseconds.\n */\n readonly completedAt: Option.Option<number>;\n\n readonly metrics: {\n /**\n * Total wall time of all handler invocations of the process in milliseconds.\n */\n readonly wallTime: number;\n\n /**\n * Total number of inputs submitted to the process.\n */\n readonly inputCount: number;\n\n /**\n * Total number of outputs submitted to the process.\n */\n readonly outputCount: number;\n };\n}\n\n/**\n * New process is spawned.\n */\nexport const SpawnedEvent = Trace.EventType('process.spawned', {\n schema: Schema.Void,\n isEphemeral: false,\n});\n\n/**\n * Process has reached a terminal state.\n */\nexport const ExitedEvent = Trace.EventType('process.exited', {\n schema: Schema.Struct({\n outcome: Schema.Literal('succeeded', 'failed', 'terminated'),\n }),\n isEphemeral: false,\n});\n\n/**\n * Renders spawned processes as a forest: top-level rows use \"- \", nested rows use ├── / └── / │.\n */\nexport const prettyProcessTree = (tree: readonly Info[]): string => {\n if (tree.length === 0) {\n return '';\n }\n\n const pidSet = new Set(tree.map((node) => node.pid));\n const childrenByParent = new Map<string, Info[]>();\n const roots: Info[] = [];\n\n for (const node of tree) {\n const parent = node.parentPid;\n if (parent === null || !pidSet.has(parent)) {\n roots.push(node);\n continue;\n }\n const key = String(parent);\n const siblings = childrenByParent.get(key) ?? [];\n siblings.push(node);\n childrenByParent.set(key, siblings);\n }\n\n const byPid = (a: Info, b: Info) => String(a.pid).localeCompare(String(b.pid));\n roots.sort(byPid);\n for (const siblings of childrenByParent.values()) {\n siblings.sort(byPid);\n }\n\n const formatLabel = (node: Info): string => {\n const idShort = String(node.pid).slice(0, 6);\n const parts = [idShort, node.state];\n if (node.params.name != null && node.params.name !== '') {\n parts.push(node.params.name);\n }\n if (node.error != null) {\n parts.push(`(${node.error})`);\n }\n const { inputCount, outputCount, wallTime } = node.metrics;\n parts.push(`[in:${inputCount} out:${outputCount} wall:${Math.round(wallTime)}ms]`);\n return parts.join(' ');\n };\n\n const lines: string[] = [];\n\n const walk = (node: Info, prefix: string, isLast: boolean, isRoot: boolean): void => {\n if (isRoot) {\n lines.push(`- ${formatLabel(node)}`);\n } else {\n const branch = isLast ? '└── ' : '├── ';\n lines.push(`${prefix}${branch}${formatLabel(node)}`);\n }\n\n const children = childrenByParent.get(String(node.pid)) ?? [];\n const nextPrefix = isRoot ? ' ' : `${prefix}${isLast ? ' ' : '│ '}`;\n children.forEach((child, index) => {\n walk(child, nextPrefix, index === children.length - 1, false);\n });\n };\n\n for (const root of roots) {\n walk(root, '', true, true);\n }\n\n return lines.join('\\n');\n};\n", "//\n// Copyright 2026 DXOS.org\n//\n\n// @import-as-namespace\n\nimport * as Context from 'effect/Context';\nimport * as Effect from 'effect/Effect';\nimport * as Layer from 'effect/Layer';\nimport * as Schema from 'effect/Schema';\n\nimport { DXN, Annotation, Obj, Type } from '@dxos/echo';\nimport { log } from '@dxos/log';\n\n/**\n * Writes ephemeral or persistent events to the trace.\n * Exposed to processes and operations to record events to the trace.\n */\nexport interface TraceWriter {\n write<T>(eventType: EventType<T>, payload: NoInfer<T>): void;\n}\n\n/**\n * Service that writes events to the trace.\n * Exposed to processes and operations to record events to the trace.\n */\nexport class TraceService extends Context.Tag('@dxos/functions/TraceService')<TraceService, TraceWriter>() {}\n\n/**\n * Writes an event to the trace.\n */\nexport function write<T>(eventType: EventType<T>, payload: NoInfer<T>): Effect.Effect<void, never, TraceService> {\n return Effect.gen(function* () {\n log('trace write', { key: eventType.key, isEphemeral: eventType.isEphemeral });\n const writer = yield* TraceService;\n writer.write(eventType, payload);\n });\n}\n\n/**\n * Defines an event type for the trace.\n */\nexport interface EventType<T> {\n readonly key: string;\n readonly schema: Schema.Schema<T, any>;\n readonly isEphemeral: boolean;\n}\n\nexport const EventType = <T>(\n key: string,\n opts: { schema: Schema.Schema<T, any>; isEphemeral: boolean },\n): EventType<T> => {\n return {\n key,\n schema: opts.schema,\n isEphemeral: opts.isEphemeral,\n };\n};\n\n/**\n * Extracts the payload type from an event type.\n */\nexport type PayloadType<E extends EventType<any>> = E extends EventType<infer T> ? T : never;\n\nexport const Event = Schema.Struct({\n timestamp: Schema.Number,\n type: Schema.String,\n data: Schema.Unknown, // Type-specific payload;\n});\nexport type Event = Schema.Schema.Type<typeof Event>;\n/**\n * Checks if an event is of a given type.\n */\nexport const isOfType = <T, E extends Event>(eventType: EventType<T>, event: E): event is E & { data: T } => {\n return event.type === eventType.key;\n};\n\n/**\n * Extensible name informing which runtime executed the code that produced the event.\n */\nexport const RuntimeName = Schema.String.pipe(Schema.brand('@dxos/compute/Trace/RuntimeName'));\nexport type RuntimeName = Schema.Schema.Type<typeof RuntimeName>;\n\n/**\n * Common runtime names.\n */\nexport const CommonRuntimeName = {\n /**\n * Web app / CLI / Desktop app / Mobile app.\n */\n local: RuntimeName.make('local'),\n edgeIntrinsic: RuntimeName.make('edge-intrinsic'),\n edgeWorkerLoader: RuntimeName.make('edge-worker-loader'),\n edgeWorkerForPlatforms: RuntimeName.make('edge-worker-for-platforms'),\n};\n\n/**\n * Metadata on the context of a trace message.\n */\n// TODO(dmaretskyi): Expand on this: conversation id, tool call id, etc.\nexport const Meta = Schema.Struct({\n pid: Schema.optional(Schema.String), // NOTE: Not Process.ID to avoid circular dependency.\n parentPid: Schema.optional(Schema.String),\n processName: Schema.optional(Schema.String),\n\n /**\n * Space the message was produced in.\n * Stored as a string to avoid circular dependency on `@dxos/keys`.\n */\n space: Schema.optional(Schema.String),\n\n /**\n * ID of the conversation feed object if present.\n */\n conversationId: Schema.optional(Obj.ID),\n\n /**\n * ID of the trigger object if invocation resulted from a trigger.\n */\n triggerId: Schema.optional(Obj.ID),\n\n /**\n * ID of the tool call that created the current process.\n */\n toolCallId: Schema.optional(Schema.String),\n\n /**\n * Extensible name informing which runtime executed the code that produced the event.\n */\n runtimeName: Schema.optional(RuntimeName),\n});\nexport type Meta = Schema.Schema.Type<typeof Meta>;\n/**\n * Checks if a runtime is an edge runtime.\n */\nexport const isEdgeRuntime = (name: RuntimeName): boolean =>\n name === CommonRuntimeName.edgeIntrinsic ||\n name === CommonRuntimeName.edgeWorkerLoader ||\n name === CommonRuntimeName.edgeWorkerForPlatforms;\n\n/**\n * Envelope for a set of events.\n */\nexport const MessageData = Schema.Struct({\n meta: Meta,\n\n isEphemeral: Schema.Boolean,\n events: Schema.Array(Event),\n});\nexport type MessageData = Schema.Schema.Type<typeof MessageData>;\nexport const Message = MessageData.pipe(\n Annotation.IconAnnotation.set({ icon: 'ph--note--regular', hue: 'rose' }),\n Annotation.HiddenAnnotation.set(true),\n Type.makeObject(DXN.make('org.dxos.type.traceMessage', '0.1.0')),\n);\nexport type Message = Type.InstanceType<typeof Message>;\n/**\n * Flattened representation of a signle event in a trace message.\n * Events are stored in batched messages for efficiency, but flat representation is more convenient for consumption.\n */\nexport interface FlatEvent extends Event {\n readonly meta: Meta;\n readonly isEphemeral: boolean;\n}\n\n/**\n * Flattens a trace message into a list of flat events.\n */\nexport const flatten = (message: Message): FlatEvent[] => {\n return message.events.map((event) => ({\n ...event,\n meta: message.meta,\n isEphemeral: message.isEphemeral,\n }));\n};\n\n/**\n * Sink for complete trace messages.\n */\nexport interface Sink {\n write(message: Message): void;\n}\n\n/**\n * Sink for complete trace messages.\n * The Process Manager forwards trace messages to it.\n */\n// TODO(dmaretskyi): Consider moving sink to the Process Manager.\nexport class TraceSink extends Context.Tag('@dxos/functions/TraceSink')<TraceSink, Sink>() {}\n\nexport const noopWriter: TraceWriter = {\n write: () => {},\n};\n\nexport const writerLayerNoop: Layer.Layer<TraceService> = Layer.succeed(TraceService, noopWriter);\n\nexport const noopSink: Sink = {\n write: () => {},\n};\n\nexport const layerNoop: Layer.Layer<TraceSink> = Layer.succeed(TraceSink, noopSink);\n\nexport const layerConsole: Layer.Layer<TraceSink> = Layer.succeed(TraceSink, {\n write: (message) => {\n console.log(message);\n },\n});\n\n/**\n * Merge a set of sinks into a single sink.\n *\n * Each message is forwarded to every sink in order. Failures in one sink do not\n * prevent downstream sinks from receiving the message.\n */\nexport const mergeSinks = (sinks: readonly Sink[]): Sink => {\n if (sinks.length === 0) {\n return noopSink;\n }\n // Intentionally no singleton fast path: the guarded wrapper is the\n // contract of `mergeSinks`, so a throwing sink is always caught and\n // logged regardless of how many sinks were passed in.\n return {\n write: (message) => {\n for (const sink of sinks) {\n try {\n sink.write(message);\n } catch (err) {\n // Intentional: do not let one sink break the chain.\n // eslint-disable-next-line no-console\n console.error('[trace] sink.write threw', err);\n }\n }\n },\n };\n};\n\n/**\n * Builds a {@link TraceService} layer that wraps each `write` into a fresh {@link Message}\n * and forwards it to the provided {@link TraceSink}. Intended for tests and lightweight\n * fixtures.\n *\n * Options:\n * - `meta`: stamped on every emitted message (defaults to `{}`).\n * - `clock`: timestamp source (defaults to {@link Date.now}). Pass a monotonic counter\n * in tests to make event ordering deterministic when many writes happen in the same\n * millisecond.\n */\nexport const testTraceService = (\n opts: { meta?: Meta; clock?: () => number } = {},\n): Layer.Layer<TraceService, never, TraceSink> =>\n Layer.effect(\n TraceService,\n Effect.gen(function* () {\n const sink = yield* TraceSink;\n const clock = opts.clock ?? Date.now;\n return {\n write: (event, data) => {\n sink.write(\n Obj.make(Message, {\n meta: opts.meta ?? {},\n isEphemeral: event.isEphemeral,\n events: [{ type: event.key, timestamp: clock(), data }],\n }),\n );\n },\n };\n }),\n );\n\n//\n// Operation Trace Events\n//\n\n/**\n * Outcome of an operation invocation.\n */\nexport type OperationOutcome = 'success' | 'failure';\n\n/**\n * Operation invocation started.\n */\nexport const OperationStart = EventType('operation.start', {\n schema: Schema.Struct({\n /** Operation key. */\n key: Schema.String,\n /** Human-readable operation name. */\n name: Schema.optional(Schema.String),\n /** Phosphor icon identifier in `ph--<name>--<variant>` format. */\n icon: Schema.optional(Schema.String),\n }),\n isEphemeral: false,\n});\n\n/**\n * Operation invocation ended.\n */\nexport const OperationEnd = EventType('operation.end', {\n schema: Schema.Struct({\n /** Operation key. */\n key: Schema.String,\n /** Human-readable operation name. */\n name: Schema.optional(Schema.String),\n /** Phosphor icon identifier in `ph--<name>--<variant>` format. */\n icon: Schema.optional(Schema.String),\n /** Outcome of the operation. */\n outcome: Schema.Literal('success', 'failure'),\n /** Error message if the operation failed. */\n error: Schema.optional(Schema.String),\n }),\n isEphemeral: false,\n});\n\n/**\n * Operation input. Emitted as an ephemeral event alongside {@link OperationStart}\n * so subscribers (such as the undo/redo history tracker) can observe the raw\n * input payload without persisting it to long-lived sinks.\n */\nexport const OperationInput = EventType('operation.input', {\n schema: Schema.Struct({\n /** Operation key. */\n key: Schema.String,\n /** Human-readable operation name. */\n name: Schema.optional(Schema.String),\n /** Raw operation input. Shape determined by the operation definition. */\n input: Schema.Unknown,\n }),\n isEphemeral: true,\n});\n\n/**\n * Operation output. Emitted as an ephemeral event just before\n * {@link OperationEnd} for successful invocations so subscribers (such as the\n * undo/redo history tracker) can observe the raw output payload without\n * persisting it to long-lived sinks.\n */\nexport const OperationOutput = EventType('operation.output', {\n schema: Schema.Struct({\n /** Operation key. */\n key: Schema.String,\n /** Human-readable operation name. */\n name: Schema.optional(Schema.String),\n /** Raw operation output. Shape determined by the operation definition. */\n output: Schema.Unknown,\n }),\n isEphemeral: true,\n});\n\n/**\n * Human-readable status update emitted by an agent or operation.\n */\nexport const StatusUpdate = EventType('status.update', {\n schema: Schema.Struct({\n /** Human-readable status message. */\n message: Schema.String,\n }),\n isEphemeral: true,\n});\n\n/**\n * Emit the current human-readable execution status to the trace.\n */\nexport const emitStatus: (message: string) => Effect.Effect<void, never, TraceService> = (message) =>\n write(StatusUpdate, { message });\n", "//\n// Copyright 2025 DXOS.org\n//\n\n// @import-as-namespace\n\nimport * as Schema from 'effect/Schema';\n\nimport { DXN, Annotation, JsonSchema, Obj, Ref, Type, Format } from '@dxos/echo';\nimport { Text } from '@dxos/schema';\n\nimport * as Blueprint from './Blueprint';\n\n/**\n * Prompt-based operation.\n * May reference blueprints and additional context.\n */\nexport const Routine = Schema.Struct({\n name: Schema.optional(Schema.String),\n description: Schema.optional(Schema.String),\n input: JsonSchema.JsonSchema.pipe(Annotation.FormInputAnnotation.set(false)).annotations({\n description: 'Input schema',\n }),\n output: JsonSchema.JsonSchema.pipe(Annotation.FormInputAnnotation.set(false)).annotations({\n description: 'Output schema',\n }),\n instructions: Ref.Ref(Text.Text).pipe(\n Format.FormatAnnotation.set(Format.TypeFormat.Markdown),\n Schema.annotations({ title: 'Instructions', description: 'Agent instructions' }),\n ),\n blueprints: Schema.Array(Ref.Ref(Blueprint.Blueprint)),\n context: Schema.Array(Schema.Any).pipe(Annotation.FormInputAnnotation.set(false)),\n}).pipe(\n Annotation.LabelAnnotation.set(['name']),\n Annotation.IconAnnotation.set({ icon: 'ph--scroll--regular', hue: 'sky' }),\n Type.makeObject(DXN.make('org.dxos.type.routine', '0.1.0')),\n);\n\nexport type Routine = Type.InstanceType<typeof Routine>;\n\nexport type MakeProps = {\n name?: string;\n description?: string;\n input?: Schema.Schema.AnyNoContext;\n output?: Schema.Schema.AnyNoContext;\n instructions?: string;\n blueprints?: Ref.Ref<Blueprint.Blueprint>[];\n context?: any[];\n};\n\nexport const make = ({\n name,\n description,\n input,\n output,\n instructions,\n blueprints = [],\n context = [],\n}: MakeProps): Routine =>\n Obj.make(Routine, {\n name,\n description,\n input: JsonSchema.toJsonSchema(input ?? Schema.Void),\n output: JsonSchema.toJsonSchema(output ?? Schema.Void),\n instructions: Ref.make(Text.make({ content: instructions ?? '' })),\n blueprints,\n context,\n });\n", "//\n// Copyright 2025 DXOS.org\n//\n\n// @import-as-namespace\n\nimport * as Schema from 'effect/Schema';\n\nimport { DXN, Annotation, Obj, Ref, Type } from '@dxos/echo';\nimport { FormInputAnnotation } from '@dxos/echo/Annotation';\nimport { Text } from '@dxos/schema';\n\n/**\n * Source script.\n */\nexport const Script = Schema.Struct({\n name: Schema.String.pipe(Schema.optional),\n description: Schema.String.pipe(Schema.optional),\n // TODO(burdon): Change to hash of deployed content.\n // Whether source has changed since last deploy.\n changed: Schema.Boolean.pipe(FormInputAnnotation.set(false), Schema.optional),\n source: Ref.Ref(Text.Text).pipe(FormInputAnnotation.set(false)),\n}).pipe(\n Annotation.LabelAnnotation.set(['name']),\n Annotation.IconAnnotation.set({ icon: 'ph--code--regular', hue: 'sky' }),\n Type.makeObject(DXN.make('org.dxos.type.script', '0.1.0')),\n);\n\nexport type Script = Type.InstanceType<typeof Script>;\ntype Props = Omit<Obj.MakeProps<typeof Script>, 'source'> & { source?: string };\n\nexport const make = ({ source = '', ...props }: Props = {}): Script =>\n Obj.make(Script, { ...props, source: Ref.make(Text.make({ content: source })) });\n", "//\n// Copyright 2026 DXOS.org\n//\n\n// @import-as-namespace\n\nimport * as Context from 'effect/Context';\nimport * as Effect from 'effect/Effect';\nimport * as Either from 'effect/Either';\nimport * as Layer from 'effect/Layer';\nimport * as Option from 'effect/Option';\nimport * as Scope from 'effect/Scope';\n\nimport type { SpaceId, URI } from '@dxos/keys';\n\nimport { ServiceNotAvailableError } from './errors';\nimport * as Process from './Process';\n\nconst ServiceResolverTypeId = '~@dxos/functions/ServiceResolver' as const;\ntype ServiceResolverTypeId = typeof ServiceResolverTypeId;\n\nexport interface ServiceResolver {\n readonly [ServiceResolverTypeId]: ServiceResolverTypeId;\n\n /**\n * Resolve a set of services identified by their tags.\n * Returns a Context containing all requested services, or fails with ServiceNotAvailableError.\n */\n resolve<Tag extends Context.Tag<any, any>>(\n tag: Tag,\n context: ResolutionContext,\n ): Effect.Effect<Context.Tag.Service<Tag>, ServiceNotAvailableError, Scope.Scope>;\n}\n\n/**\n * Tag for the ServiceResolver service.\n */\nexport const ServiceResolver = Context.GenericTag<ServiceResolver>('@dxos/functions/ServiceResolver');\n\nexport const resolve: {\n <Tag extends Context.Tag<any, any>>(\n tag: Tag,\n context: ResolutionContext,\n ): Effect.Effect<Context.Tag.Service<Tag>, ServiceNotAvailableError, Scope.Scope | ServiceResolver>;\n} = Effect.serviceFunctionEffect(ServiceResolver, (_) => _.resolve);\n\nexport const resolveAll = <const Tags extends readonly Context.Tag<any, any>[]>(\n tags: Tags,\n context: ResolutionContext,\n): Effect.Effect<Context.Context<Tags[number]>, ServiceNotAvailableError, Scope.Scope | ServiceResolver> =>\n Effect.gen(function* () {\n const services = yield* Effect.forEach(tags, (tag) =>\n resolve(tag, context).pipe(Effect.map((service) => Context.make(tag, service))),\n );\n return Context.mergeAll(...services);\n });\n\n/**\n * Provides context for service resolution.\n */\nexport interface ResolutionContext {\n /**\n * Under which identity the process is running.\n */\n readonly identity?: string;\n\n /**\n * Under which space the process is running.\n */\n readonly space?: SpaceId;\n\n /**\n * URI of the conversation feed the process is running in. Today always an EID;\n * narrow with `EID.parse` at the point of use.\n */\n readonly conversation?: URI.URI;\n\n /**\n * Under which process the process is running.\n */\n readonly process?: Process.ID;\n}\n\nexport const succeed = <I, S>(\n tag: Context.Tag<I, S>,\n getService: (context: ResolutionContext) => Effect.Effect<S, ServiceNotAvailableError, Scope.Scope>,\n): ServiceResolver => {\n return make((tag1, context) => {\n if (tag1.key !== tag.key) {\n return Effect.fail(new ServiceNotAvailableError(`Service not available: ${String(tag.key ?? tag)}`));\n }\n const service = getService(context);\n return service as any;\n });\n};\n\n/**\n * Create a ServiceResolver from a custom resolution function.\n */\nexport const make = (\n resolveFn: <I, S>(\n tag: Context.Tag<I, S>,\n context: ResolutionContext,\n ) => Effect.Effect<S, ServiceNotAvailableError, Scope.Scope>,\n): ServiceResolver => ({\n [ServiceResolverTypeId]: ServiceResolverTypeId,\n resolve: resolveFn,\n});\n\n/**\n * Create a ServiceResolver backed by a static Context.\n * Tags present in the context are resolved; missing tags fail with ServiceNotAvailableError.\n */\nexport const fromContext = <Services>(ctx: Context.Context<Services>): ServiceResolver =>\n make((tag, context) =>\n Effect.gen(function* () {\n const service = Context.getOption(ctx, tag);\n if (Option.isNone(service)) {\n return yield* Effect.fail(new ServiceNotAvailableError(String(tag.key ?? tag)));\n }\n return service.value;\n }),\n );\n\n/**\n * Create a ServiceResolver that resolves tags from the current Effect context.\n * Only the specified tags are available; requests for other tags fail.\n */\nexport const fromRequirements = <const Tags extends readonly Context.Tag<any, any>[]>(\n ...tags: Tags\n): Effect.Effect<ServiceResolver, never, Context.Tag.Identifier<Tags[number]>> =>\n Effect.contextWith((parentCtx: Context.Context<any>) => {\n const available = new Set(tags.map((tag) => tag.key));\n return make((tag, context) =>\n Effect.gen(function* () {\n let result: Context.Context<never> = Context.empty() as Context.Context<never>;\n if (!available.has(tag.key)) {\n return yield* Effect.fail(new ServiceNotAvailableError(String(tag.key ?? tag)));\n }\n const service = Context.getOption(parentCtx, tag);\n if (Option.isNone(service)) {\n return yield* Effect.fail(new ServiceNotAvailableError(String(tag.key ?? tag)));\n }\n return service.value;\n }),\n );\n });\n\n/**\n * Like {@link fromRequirements} but returns a Layer that provides ServiceResolver.\n */\nexport const layerRequirements = <const Tags extends readonly Context.Tag<any, any>[]>(\n ...tags: Tags\n): Layer.Layer<ServiceResolver, never, Context.Tag.Identifier<Tags[number]>> =>\n Layer.effect(ServiceResolver, fromRequirements(...tags));\n\n/**\n * Build a {@link Layer} that materialises the requested services by calling\n * {@link resolveAll} against the {@link ServiceResolver} currently in context.\n *\n * The returned layer manages its own {@link Scope.Scope} and requires only a\n * {@link ServiceResolver} (typically supplied by the process-manager runtime).\n *\n * @example\n * ```ts\n * processManagerRuntime.runPromise(\n * myEffect.pipe(Effect.provide(ServiceResolver.provide({ space }, Database.Service, Feed.FeedService))),\n * );\n * ```\n */\nexport const provide = <const Tags extends readonly Context.Tag<any, any>[]>(\n context: ResolutionContext,\n ...tags: Tags\n): Layer.Layer<Context.Tag.Identifier<Tags[number]>, ServiceNotAvailableError, ServiceResolver> =>\n Layer.scopedContext(resolveAll(tags, context));\n\n/**\n * Compose multiple resolvers left to right. Earlier resolvers take precedence:\n * the first resolver that can satisfy a tag wins.\n */\nexport const compose = (...resolvers: readonly ServiceResolver[]): ServiceResolver =>\n make((tag, context) =>\n Effect.gen(function* () {\n for (const resolver of resolvers) {\n const single = yield* resolver.resolve(tag, context).pipe(Effect.either);\n if (Either.isRight(single)) {\n return single.right;\n }\n }\n\n return yield* Effect.fail(new ServiceNotAvailableError(String(tag.key ?? tag)));\n }),\n );\n\n/**\n * An empty resolver that fails for any requested service.\n */\nexport const empty: ServiceResolver = make((tag, context) => {\n return Effect.fail(new ServiceNotAvailableError(String(tag.key ?? tag)));\n});\n", "//\n// Copyright 2023 DXOS.org\n//\n\n// @import-as-namespace\n\nimport * as Schema from 'effect/Schema';\nimport * as SchemaAST from 'effect/SchemaAST';\n\nimport { DXN, Annotation, Feed, Obj, QueryAST, Ref, Type, type Query } from '@dxos/echo';\nimport { HiddenAnnotation } from '@dxos/echo/Annotation';\nimport { OptionsAnnotationId } from '@dxos/echo/Format';\n\n/**\n * Type discriminator for TriggerType.\n * Every spec has a type field of type TriggerKind that we can use to understand which type we're working with.\n * https://www.typescriptlang.org/docs/handbook/2/narrowing.html#discriminated-unions\n */\nexport const Kinds = ['email', 'feed', 'subscription', 'timer', 'webhook'] as const;\nexport type Kind = (typeof Kinds)[number];\n\nconst kindLiteralAnnotations = { title: 'Kind' };\n\nexport const EmailSpec = Schema.Struct({\n kind: Schema.Literal('email').annotations(kindLiteralAnnotations),\n});\nexport type EmailSpec = Schema.Schema.Type<typeof EmailSpec>;\n\n/**\n * Construct an Email trigger spec.\n */\nexport const specEmail = (): EmailSpec => ({ kind: 'email' });\n\n// TODO(wittjosiah): Remove. Migrate to Subscription triggers once EDGE supports them for feed queries.\nexport const FeedSpec = Schema.Struct({\n kind: Schema.Literal('feed').annotations(kindLiteralAnnotations),\n feed: Schema.optional(Ref.Ref(Feed.Feed).annotations({ title: 'Feed' })),\n});\nexport type FeedSpec = Schema.Schema.Type<typeof FeedSpec>;\n\n/**\n * Construct a Feed trigger spec from a Feed object.\n */\nexport const specFeed = (feed: Feed.Feed): FeedSpec => ({\n kind: 'feed',\n feed: Ref.make(feed),\n});\n\n/**\n * Subscription.\n */\nexport const SubscriptionSpec = Schema.Struct({\n kind: Schema.Literal('subscription').annotations(kindLiteralAnnotations),\n query: Schema.Struct({\n raw: Schema.optional(Schema.String.annotations({ title: 'Query' })),\n ast: QueryAST.Query,\n }),\n options: Schema.optional(\n Schema.Struct({\n // Watch changes to object (not just creation).\n deep: Schema.optional(Schema.Boolean.annotations({ title: 'Nested' })),\n // Debounce changes (delay in ms).\n delay: Schema.optional(Schema.Number.annotations({ title: 'Delay' })),\n }).annotations({ title: 'Options' }),\n ),\n});\nexport type SubscriptionSpec = Schema.Schema.Type<typeof SubscriptionSpec>;\n\n/**\n * Construct a Subscription trigger spec from a Query object.\n */\nexport const specSubscription = (\n query: Query.Query<any>,\n options?: { deep?: boolean; delay?: number },\n): SubscriptionSpec => ({\n kind: 'subscription',\n query: {\n ast: query.ast,\n },\n options: options\n ? {\n deep: options.deep,\n delay: options.delay,\n }\n : undefined,\n});\n\n/**\n * Cron timer.\n */\nexport const TimerSpec = Schema.Struct({\n kind: Schema.Literal('timer').annotations(kindLiteralAnnotations),\n cron: Schema.String.annotations({\n title: 'Cron',\n [SchemaAST.ExamplesAnnotationId]: ['0 0 * * *'],\n }),\n});\nexport type TimerSpec = Schema.Schema.Type<typeof TimerSpec>;\n\n/**\n * Construct a Timer trigger spec from a cron string.\n */\nexport const specTimer = (cron: string): TimerSpec => ({ kind: 'timer', cron });\n\n/**\n * Webhook.\n */\nexport const WebhookSpec = Schema.Struct({\n kind: Schema.Literal('webhook').annotations(kindLiteralAnnotations),\n method: Schema.optional(\n Schema.String.annotations({\n title: 'Method',\n [OptionsAnnotationId]: ['GET', 'POST'],\n }),\n ),\n port: Schema.optional(\n Schema.Number.annotations({\n title: 'Port',\n }),\n ),\n});\nexport type WebhookSpec = Schema.Schema.Type<typeof WebhookSpec>;\n\n/**\n * Construct a Webhook trigger spec from a method and port.\n */\nexport const specWebhook = (opts?: { method?: string; port?: number }): WebhookSpec => ({\n kind: 'webhook',\n method: opts?.method,\n port: opts?.port,\n});\n\n/**\n * Trigger schema.\n */\nexport const Spec = Schema.Union(EmailSpec, FeedSpec, SubscriptionSpec, TimerSpec, WebhookSpec).annotations({\n title: 'Trigger',\n});\nexport type Spec = Schema.Schema.Type<typeof Spec>;\n\n/**\n * Function trigger.\n * Function is invoked with the `payload` passed as input data.\n * The event that triggers the function is available in the function context.\n */\nconst TriggerSchema = Schema.Struct({\n /**\n * Function or workflow to invoke.\n */\n // TODO(dmaretskyi): Can be a Ref(FunctionType) or Ref(ComputeGraphType).\n function: Schema.optional(Ref.Ref(Obj.Unknown).annotations({ title: 'Function' })),\n\n /**\n * Only used for workflowSchema.\n * Specifies the input node in the circuit.\n * @deprecated Remove and enforce a single input node in all compute graphSchema.\n */\n inputNodeId: Schema.optional(Schema.String.annotations({ title: 'Input Node ID' })),\n\n // TODO(burdon): NO BOOLEAN PROPERTIES (enabld/disabled/paused, etc.)\n // Need lint rule; or agent rule to require PR review for \"boolean\" key word.\n enabled: Schema.optional(Schema.Boolean.annotations({ title: 'Enabled' })),\n\n spec: Schema.optional(Spec),\n\n concurrency: Schema.optional(\n Schema.Number.annotations({\n title: 'Concurrency',\n default: 1,\n description:\n 'Maximum number of concurrent invocations of the trigger. For Feed triggers, this will process Feed items in parallel.',\n }),\n ),\n\n /**\n * Passed as the input data to the function.\n * Must match the function's input schema.\n *\n * @example\n * {\n * item: '{{event.item}}',\n * instructions: 'Summarize and perform entity-extraction'\n * mailbox: { '/': 'echo://AAA/ZZZ' }\n * }\n */\n input: Schema.optional(Schema.Record({ key: Schema.String, value: Schema.Any })),\n}).pipe(\n Annotation.IconAnnotation.set({ icon: 'ph--lightning--regular', hue: 'yellow' }),\n HiddenAnnotation.set(true),\n Type.makeObject(DXN.make('org.dxos.type.trigger', '0.1.0')),\n);\n\nexport type Trigger = Type.InstanceType<typeof TriggerSchema>;\nexport const Trigger: Type.Obj<Trigger> = TriggerSchema as any;\n\nexport const make = (props: Obj.MakeProps<typeof Trigger>) => Obj.make(Trigger, props);\n", "//\n// Copyright 2025 DXOS.org\n//\n\n// @import-as-namespace\n\nimport * as Schema from 'effect/Schema';\n\nimport { Feed, Obj, Ref } from '@dxos/echo';\n\n// TODO(wittjosiah): Review this type.\n// - Should be discriminated union.\n// - Should be more consistent (e.g. subject vs item).\n// - Should re-use schemas if possible.\n\n// TODO(burdon): Reuse trigger schema from @dxos/functions (TriggerType).\nexport const EmailEvent = Schema.Struct({\n from: Schema.String,\n to: Schema.String,\n subject: Schema.String,\n created: Schema.String,\n body: Schema.String,\n});\nexport type EmailEvent = Schema.Schema.Type<typeof EmailEvent>;\n\nexport const FeedEvent = Schema.Struct({\n feed: Ref.Ref(Feed.Feed),\n item: Schema.Any,\n cursor: Schema.String,\n});\nexport type FeedEvent = Schema.Schema.Type<typeof FeedEvent>;\n\nexport const SubscriptionEvent = Schema.Struct({\n /**\n * Type of the mutation.\n */\n // TODO(dmaretskyi): Specify enum.\n type: Schema.String,\n\n /**\n * Reference to the object that was changed or created.\n */\n subject: Ref.Ref(Obj.Unknown),\n\n /**\n * @deprecated\n */\n changedObjectId: Schema.optional(Schema.String),\n});\nexport type SubscriptionEvent = Schema.Schema.Type<typeof SubscriptionEvent>;\n\nexport const TimerEvent = Schema.Struct({ tick: Schema.Number });\nexport type TimerEvent = Schema.Schema.Type<typeof TimerEvent>;\n\nexport const WebhookEvent = Schema.Struct({\n url: Schema.String,\n method: Schema.Literal('GET', 'POST'),\n headers: Schema.Record({ key: Schema.String, value: Schema.String }),\n bodyText: Schema.String,\n});\nexport type WebhookEvent = Schema.Schema.Type<typeof WebhookEvent>;\n\nexport const TriggerEvent = Schema.Union(EmailEvent, FeedEvent, SubscriptionEvent, TimerEvent, WebhookEvent);\nexport type TriggerEvent = Schema.Schema.Type<typeof TriggerEvent>;\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["//\n// Copyright 2025 DXOS.org\n//\n\n// @import-as-namespace\n\nimport * as Effect from 'effect/Effect';\nimport * as Schema from 'effect/Schema';\n\nimport { ToolId } from '@dxos/ai';\nimport { DXN, Annotation, Database, Filter, Migration, Obj, Registry, Type, URI } from '@dxos/echo';\nimport { BaseError } from '@dxos/errors';\n\nimport * as McpServer from './McpServer';\nimport * as Operation from './Operation';\nimport * as Template from './Template';\n\n/**\n * Blueprint schema defines the structure for AI assistant blueprints.\n * Blueprints contain instructions, tools, and artifacts that guide the AI's behavior.\n * Blueprints may use tools to create and read artifacts, which are managed by the assistant.\n *\n * The registry `key` and `version` are stored in the object meta — access them via\n * `Obj.getMeta(blueprint).key` and `Obj.getMeta(blueprint).version`.\n */\n// TODO(burdon): Rename Skill?\nexport const Blueprint = Schema.Struct({\n /**\n * Human-readable name of the blueprint.\n */\n name: Schema.String.annotations({\n description: 'Human-readable name of the blueprint',\n }),\n\n /**\n * Description of the blueprint's purpose and functionality.\n */\n description: Schema.optional(Schema.String).annotations({\n description: \"Description of the blueprint's purpose and functionality\",\n }),\n\n /**\n * Instructions that guide the AI assistant's behavior and responses.\n * These are system prompts or guidelines that the AI should follow.\n */\n instructions: Template.Template.annotations({\n description: \"Instructions that guide the AI assistant's behavior and responses\",\n }),\n\n /**\n * Array of tools that the AI assistant can use when this blueprint is active.\n */\n tools: Schema.Array(ToolId).annotations({\n description: 'Array of tools that the AI assistant can use when this blueprint is active',\n }),\n\n /**\n * Whether an agent is allowed to auto-enable this blueprint in a conversation.\n */\n agentCanEnable: Schema.optional(Schema.Boolean).annotations({\n description: 'Whether an agent is allowed to auto-enable this blueprint in a conversation.',\n }),\n\n /**\n * Array of MCP servers that the AI assistant can use when this blueprint is active.\n */\n mcpServers: Schema.optional(Schema.Array(McpServer.McpServer)),\n}).pipe(\n Annotation.LabelAnnotation.set(['name']),\n Annotation.IconAnnotation.set({ icon: 'ph--blueprint--regular', hue: 'sky' }),\n Type.makeObject(DXN.make('org.dxos.type.blueprint', '0.2.0')),\n);\n\n/**\n * TypeScript type for Blueprint.\n */\nexport type Blueprint = Type.InstanceType<typeof Blueprint>;\n\ntype MakeProps = { key: string; version?: string; name: string } & Partial<Blueprint>;\n\n/**\n * Create a new Blueprint.\n * The `key` (and optional `version`) are stored in the object meta.\n */\nexport const make = ({ key, version, tools = [], instructions = Template.make(), ...props }: MakeProps) =>\n Obj.make(Blueprint, {\n [Obj.Meta]: { key, version },\n tools,\n instructions,\n ...props,\n });\n\n/**\n * Get the registry key for a blueprint.\n */\nexport const getKey = (blueprint: Blueprint): string => {\n const key = Obj.getMeta(blueprint).key;\n if (key === undefined) {\n throw new Error('Blueprint is missing the meta key.');\n }\n return key;\n};\n\n/**\n * Get the registry version for a blueprint, if any.\n */\nexport const getVersion = (blueprint: Blueprint): string | undefined => Obj.getMeta(blueprint).version;\n\n/**\n * Util to create tool definitions for a blueprint.\n */\nexport const toolDefinitions = ({\n tools = [],\n operations = [],\n}: {\n tools?: string[];\n operations?: Operation.Definition.Any[];\n}) => [...operations.map((op) => ToolId.make(DXN.getName(op.meta.key))), ...tools.map((tool) => ToolId.make(tool))];\n\n/**\n * Factory for the blueprints.\n */\nexport type Definition = {\n key: string;\n make: () => Blueprint;\n};\n\n/**\n * Returns the canonical URI used to reference this blueprint in the registry.\n * Valid DXN keys produce `dxn:<key>`; other keys use the raw key as a URI.\n * Use this URI with `Ref.fromURI` to bind a blueprint without cloning it to the DB.\n *\n * TODO(wittjosiah): Should use Obj.getURI instead once it supports options to prefer meta key over EID.\n */\nexport const registryURI = (key: string): URI.URI => (DXN.tryMake(`dxn:${key}`) ?? URI.make(key)) as URI.URI;\n\n/**\n * Resolves a blueprint from the registry by its meta key.\n * Does not check the local database for the blueprint.\n */\nexport const resolve = (key: string): Effect.Effect<Blueprint, NotFoundError, Registry.Service> =>\n Effect.gen(function* () {\n const results = yield* Registry.runQuery(Filter.and(Filter.type(Blueprint), Filter.key(key)));\n const blueprint = results[0];\n if (!blueprint) {\n return yield* Effect.fail(new NotFoundError({ context: { key } }));\n }\n return blueprint;\n });\n\n/**\n * Upserts a blueprint into the database.\n * If the blueprint already exists in the database, the local (possibly forked) copy is returned as-is.\n * Otherwise, a fresh copy is cloned from the registry and added.\n * @deprecated Since we're using a registry we no longer need to store blueprints in the database.\n */\n// TODO(dmaretskyi): Remove.\nexport const upsert = (key: string): Effect.Effect<Blueprint, NotFoundError, Registry.Service | Database.Service> =>\n Effect.gen(function* () {\n const local = yield* Database.query(Filter.and(Filter.type(Blueprint), Filter.key(key))).run;\n if (local.length > 0) {\n return local[0];\n }\n return yield* Database.add(Obj.clone(yield* resolve(key), { deep: true }));\n });\n\nexport class NotFoundError extends BaseError.extend('BlueprintNotFound', 'Blueprint not found') {}\n\n//\n// Legacy schemas and migrations.\n//\n\n/**\n * Blueprint schema v0.1.0 — `key` is stored as a data property.\n * @deprecated Use {@link Blueprint} (v0.2.0) instead; the `key` and `version` now live in the object meta.\n */\nexport const Blueprint_v0_1_0 = Schema.Struct({\n /**\n * Global registry ID.\n * NOTE: The `key` property refers to the original registry entry.\n */\n key: Schema.String.annotations({\n description: 'Unique registration key for the blueprint',\n }),\n\n name: Schema.String.annotations({\n description: 'Human-readable name of the blueprint',\n }),\n\n description: Schema.optional(Schema.String),\n\n instructions: Template.Template,\n\n tools: Schema.Array(ToolId),\n\n agentCanEnable: Schema.optional(Schema.Boolean),\n\n mcpServers: Schema.optional(Schema.Array(McpServer.McpServer)),\n}).pipe(Type.makeObject(DXN.make('org.dxos.type.blueprint', '0.1.0')));\n\nexport type Blueprint_v0_1_0 = Type.InstanceType<typeof Blueprint_v0_1_0>;\n/**\n * Migration from {@link Blueprint_v0_1_0} (v0.1.0) to {@link Blueprint} (v0.2.0).\n * Moves `key` from the data section into the object meta.\n */\nconst _migration = Migration.define({\n from: Blueprint_v0_1_0,\n to: Blueprint,\n transform: async (from) => ({\n [Obj.Meta]: { key: from.key, version: '0.1.0' },\n name: from.name,\n description: from.description,\n instructions: from.instructions,\n tools: from.tools,\n agentCanEnable: from.agentCanEnable,\n mcpServers: from.mcpServers,\n }),\n});\n\n/**\n * Schema migrations exported by this module.\n * Exported as an array for extensibility — append future versions here.\n */\nexport const migrations = [_migration];\n", "//\n// Copyright 2025 DXOS.org\n//\n\n// @import-as-namespace\n\nimport * as Schema from 'effect/Schema';\n\n/**\n * MCP server connection spec — the minimal fields needed to dial an MCP server.\n *\n * Used as a value type embedded in blueprints and passed to runtime session connect logic.\n * The user-facing ECHO object (`@dxos/assistant-toolkit` `McpServer`) composes this struct\n * and adds instance-level fields (`name`, `enabled`) and ECHO annotations.\n */\nexport const McpServer = Schema.Struct({\n name: Schema.String.pipe(Schema.optional).annotations({\n description: 'Human-readable name of the MCP server',\n }),\n\n url: Schema.String.annotations({\n description: 'URL of the MCP server',\n }),\n\n /**\n * Transport protocol. Prefer `'http'` (Streamable HTTP) for new servers; `'sse'` is\n * kept for compatibility with servers that haven't migrated and is deprecated per\n * the MCP SDK. Clients support both during the migration period.\n */\n protocol: Schema.Union(Schema.Literal('http'), Schema.Literal('sse')).annotations({\n description: 'Transport protocol of the MCP server (prefer \"http\"; \"sse\" deprecated)',\n }),\n\n /**\n * Optional API key sent with requests.\n * Persisted in plaintext when stored on a space-replicated ECHO object — see the\n * `@dxos/assistant-toolkit` `McpServer` type for security implications.\n */\n apiKey: Schema.optional(Schema.String).annotations({\n description: 'Optional API key sent with requests',\n }),\n});\n\nexport type McpServer = Schema.Schema.Type<typeof McpServer>;\n", "//\n// Copyright 2024 DXOS.org\n//\n\n// @import-as-namespace\n\nimport * as Effect from 'effect/Effect';\nimport * as Schema from 'effect/Schema';\n\nimport { Database, DXN, Filter, Ref, Registry } from '@dxos/echo';\nimport type { EntityNotFoundError } from '@dxos/echo/Err';\nimport { assertArgument, invariant } from '@dxos/invariant';\nimport { log } from '@dxos/log';\nimport { Text } from '@dxos/schema';\nimport Handlebars from '@dxos/vendor-kbn-handlebars';\n\nimport { FunctionNotFoundError } from './errors';\nimport * as Operation from './Operation';\n\n/**\n * Template input kind determines how template variables are resolved.\n */\nexport const InputKind = Schema.Literal(\n 'value', // Literal value.\n 'operation',\n // 'pass-through',\n // 'retriever',\n // 'query',\n // 'resolver',\n // 'context',\n // 'schema',\n);\n\nexport type InputKind = Schema.Schema.Type<typeof InputKind>;\n\n/**\n * Template input variable.\n * E.g., {{foo}}\n */\nexport const Input = Schema.Struct({\n name: Schema.String,\n kind: InputKind,\n default: Schema.optional(Schema.Any),\n /**\n * Operation key invoked when `kind === 'operation'`. The referenced operation must accept void input —\n * template inputs have no mechanism for passing arguments.\n */\n operation: Schema.optional(Schema.String),\n});\n\nexport type Input = Schema.Schema.Type<typeof Input>;\n\n/**\n * Template type.\n */\nexport const Template = Schema.Struct({\n source: Ref.Ref(Text.Text).annotations({ description: 'Markdown + Handlebars template.' }),\n\n /**\n * NOTE: We use an array rather than map so that updating variable names in the template doesn't disconnect existing inputs.\n */\n inputs: Schema.optional(Schema.Array(Input)),\n});\n\nexport type Template = Schema.Schema.Type<typeof Template>;\nexport type MakeProps = Partial<{ id: string; source: string; inputs: Input[] }>;\n\nexport const make = ({ id, source, inputs = [] }: MakeProps = {}): Template => ({\n source: Ref.make(Text.make({ id, content: source })),\n inputs,\n});\n\n/**\n * Process Handlebars template.\n */\nexport const process = <Options extends {}>(source: string, variables: Partial<Options> = {}): string => {\n assertArgument(typeof source === 'string', 'source');\n let section = 0;\n const handlebars = Handlebars.create();\n handlebars.registerHelper('section', () => String(++section));\n const template = handlebars.compileAST(source.trim());\n const output = template(variables);\n return output.trim().replace(/(\\n\\s*){3,}/g, '\\n\\n');\n};\n\nexport const processTemplate = (\n template: Template,\n): Effect.Effect<string, EntityNotFoundError | FunctionNotFoundError, Registry.Service | Operation.Service> =>\n Effect.gen(function* () {\n const entries = yield* Effect.forEach(template.inputs ?? [], (input) =>\n Effect.gen(function* () {\n switch (input.kind) {\n case 'value': {\n return [input.name, input.default] as const;\n }\n\n case 'operation': {\n invariant(input.operation);\n // Normalize to a full DXN key so Filter.key matches the stored meta key.\n const key = DXN.isDXN(input.operation) ? input.operation : `dxn:${input.operation}`;\n const results = yield* Registry.runQuery(\n Filter.and(Filter.type(Operation.PersistentOperation), Filter.key(key)),\n );\n if (results.length === 0) {\n return yield* Effect.fail(new FunctionNotFoundError(input.operation));\n }\n const fn = Operation.deserialize(results[0]);\n\n // NOTE: Operations referenced by template inputs must accept void input — see `Input.operation`.\n const result = yield* Operation.invoke(fn, undefined as any).pipe(Effect.orDie);\n return [input.name, result] as const;\n }\n\n default: {\n return yield* Effect.dieMessage(`Unsupported input kind: ${input.kind}`);\n }\n }\n }),\n );\n\n const variables = Object.fromEntries(entries);\n\n log('processTemplate', { variables });\n return process((yield* Database.load(template.source)).content, variables);\n });\n", "//\n// Copyright 2025 DXOS.org\n//\n\n// @import-as-namespace\n\nimport * as Context from 'effect/Context';\nimport * as Effect from 'effect/Effect';\nimport * as Redacted from 'effect/Redacted';\n\nexport type CredentialQuery = {\n service?: string;\n};\n\n// TODO(dmaretskyi): Unify with other apis.\n// packages/sdk/schema/src/common/access-token.ts\nexport type ServiceCredential = {\n service: string;\n\n // TODO(dmaretskyi): Build out.\n apiKey?: string;\n};\n\nexport class CredentialsService extends Context.Tag('@dxos/functions/CredentialsService')<\n CredentialsService,\n {\n /**\n * Query all.\n */\n queryCredentials: (query: CredentialQuery) => Promise<ServiceCredential[]>;\n\n /**\n * Get a single credential.\n * @throws {Error} If no credential is found.\n */\n getCredential: (query: CredentialQuery) => Promise<ServiceCredential>;\n }\n>() {\n static getCredential = (query: CredentialQuery): Effect.Effect<ServiceCredential, never, CredentialsService> =>\n Effect.gen(function* () {\n const credentials = yield* CredentialsService;\n return yield* Effect.promise(() => credentials.getCredential(query));\n });\n\n static getApiKey = (query: CredentialQuery): Effect.Effect<Redacted.Redacted<string>, never, CredentialsService> =>\n Effect.gen(function* () {\n const credential = yield* CredentialsService.getCredential(query);\n if (!credential.apiKey) {\n throw new Error(`API key not found for service: ${query.service}`);\n }\n return Redacted.make(credential.apiKey);\n });\n}\n", "//\n// Copyright 2026 DXOS.org\n//\n\n// @import-as-namespace\n\nimport * as HttpClient from '@effect/platform/HttpClient';\nimport * as HttpClientRequest from '@effect/platform/HttpClientRequest';\nimport * as Effect from 'effect/Effect';\nimport * as Layer from 'effect/Layer';\n\nimport { BYOK_HEADER } from '@dxos/protocols';\n\nimport * as Credential from './Credential';\n\n/**\n * Wraps an `HttpClient` so outbound requests carry `X-BYOK: <apiKey>` whenever the active space\n * has an `AccessToken` for `providerHost`. Lookup failures pass the request through unchanged.\n */\nexport const byokLayer = (\n providerHost: string,\n): Layer.Layer<HttpClient.HttpClient, never, HttpClient.HttpClient | Credential.CredentialsService> =>\n Layer.effect(\n HttpClient.HttpClient,\n Effect.gen(function* () {\n const client = yield* HttpClient.HttpClient;\n const credentials = yield* Credential.CredentialsService;\n return HttpClient.mapRequestEffect(client, (request) =>\n Effect.gen(function* () {\n const matches = yield* Effect.tryPromise(() => credentials.queryCredentials({ service: providerHost })).pipe(\n Effect.orElseSucceed((): Credential.ServiceCredential[] => []),\n );\n const apiKey = matches.find((credential) => credential.apiKey)?.apiKey;\n return apiKey ? HttpClientRequest.setHeader(request, BYOK_HEADER, apiKey) : request;\n }),\n );\n }),\n );\n", "//\n// Copyright 2026 DXOS.org\n//\n\nimport * as Context from 'effect/Context';\nimport * as Layer from 'effect/Layer';\nimport * as Types from 'effect/Types';\n\nimport { SpaceId, type URI } from '@dxos/keys';\n\nimport type * as Process from './Process';\n\n// @import-as-namespace\n\nexport const TypeId = '~@dxos/functions/LayerSpec' as const;\nexport type TypeId = typeof TypeId;\n\n/**\n * Opaque layer with introspectable tags.\n */\nexport interface LayerSpec {\n readonly [TypeId]: TypeId;\n\n readonly affinity: Affinity;\n readonly requires: readonly Context.Tag<any, any>[];\n readonly provides: readonly Context.Tag<any, any>[];\n\n // opaque service creation function, layer provides the specified services and requires the specified requirements.\n readonly make: (context: LayerContext) => Layer.Layer<unknown, never, unknown>;\n}\n\n/**\n * Affinity defines the lifetime and scope of a service.\n *\n * - `application` - single service instance is available throughout the entire application.\n * - `space` - service is instantiated per space.\n * - `process` - separate service instance is created and destroyed for each process.\n */\nexport type Affinity = 'application' | 'space' | 'process';\n\n/**\n * Provides context for service resolution.\n */\n// TODO(dmaretskyi): Consider making this type dependant on the specified service affinity.\nexport interface LayerContext {\n /**\n * Under which space the process is running.\n * Space affinity and up only.\n */\n readonly space?: SpaceId;\n\n /**\n * URI of the conversation feed the process is running in.\n * Process affinity only.\n */\n readonly conversation?: URI.URI;\n\n /**\n * Under which process the process is running.\n * Process affinity only.\n */\n readonly process?: Process.ID;\n}\n\ninterface MakeOpts {\n readonly affinity: Affinity;\n readonly requires: readonly Context.Tag<any, any>[];\n readonly provides: readonly Context.Tag<any, any>[];\n}\n\n/**\n * Make a service.\n */\nexport const make = <const Opts extends Types.NoExcessProperties<MakeOpts, Opts>>(\n opts: Opts,\n make: (\n context: LayerContext,\n ) => Layer.Layer<\n Context.Tag.Identifier<Opts['provides'][number]>,\n never,\n Context.Tag.Identifier<Opts['requires'][number]>\n >,\n): LayerSpec => {\n return {\n [TypeId]: TypeId,\n affinity: opts.affinity,\n requires: opts.requires,\n provides: opts.provides,\n make: make as any,\n };\n};\n", "//\n// Copyright 2026 DXOS.org\n//\n\n// @import-as-namespace\n\nimport * as Context from 'effect/Context';\nimport * as Effect from 'effect/Effect';\nimport * as Layer from 'effect/Layer';\nimport * as Option from 'effect/Option';\n\nimport { Database, Filter, Query } from '@dxos/echo';\n\nimport * as Operation from './Operation';\nimport * as OperationHandlerSet from './OperationHandlerSet';\n\nexport interface OperationRegistry {\n /**\n * Resolve an operation by key.\n */\n resolve(key: string): Effect.Effect<Option.Option<Operation.Definition.Any>>;\n}\n\nexport class Service extends Context.Tag('@dxos/operation/OperationRegistry')<Service, OperationRegistry>() {}\n\n/**\n * Resolve an operation by key.\n */\nexport const resolve: (key: string) => Effect.Effect<Option.Option<Operation.Definition.Any>, never, Service> =\n Effect.serviceFunctionEffect(Service, (service) => service.resolve);\n\nexport const layer: Layer.Layer<Service, never, Database.Service | OperationHandlerSet.OperationHandlerProvider> =\n Layer.effect(\n Service,\n Effect.gen(function* () {\n const database = yield* Database.Service;\n const handlerSet = yield* OperationHandlerSet.OperationHandlerProvider;\n return {\n resolve: (key: string) =>\n Database.query(Query.select(Filter.and(Filter.type(Operation.PersistentOperation), Filter.key(key))))\n .first.pipe(\n Effect.flatten,\n Effect.map(Operation.deserialize),\n Effect.catchTag('NoSuchElementException', () => OperationHandlerSet.getHandlerByKey(handlerSet, key)),\n Effect.option,\n )\n .pipe(Effect.provideService(Database.Service, database)),\n };\n }),\n );\n", "//\n// Copyright 2026 DXOS.org\n//\n\n// @import-as-namespace\n\nimport type { Atom } from '@effect-atom/atom';\nimport * as Context from 'effect/Context';\nimport * as Effect from 'effect/Effect';\nimport type * as Exit from 'effect/Exit';\nimport * as Option from 'effect/Option';\nimport * as Schema from 'effect/Schema';\nimport * as Scope from 'effect/Scope';\nimport type * as Types from 'effect/Types';\n\nimport { assertArgument } from '@dxos/invariant';\nimport { DXN, type URI } from '@dxos/keys';\nimport { log } from '@dxos/log';\n\nimport * as Operation from './Operation';\nimport * as OperationHandlerSet from './OperationHandlerSet';\nimport * as StorageService from './StorageService';\nimport * as Trace from './Trace';\n\n//\n// Process.\n//\n\n/** Opaque process id (arbitrary string). */\nexport const ID = Schema.String.pipe(Schema.brand('ProcessId'));\nexport type ID = Schema.Schema.Type<typeof ID>;\n\n/**\n * A running process callbacks.\n *\n * Process lifecycle: Initial -> Running <-> Suspended -> Terminated.\n *\n * - onSpawn -> called once when the process is spawned.\n * - onInput -> called for every input submitted to the process.\n * - onAlarm -> called for processes scheduling alarms.\n * - onChildEvent -> called when child process produces output or exits.\n */\nexport interface Callbacks<I, O, R> {\n /**\n * Called when the process is spawned.\n * Not called for processes that are resumed from a previously suspended state.\n *\n * @returns A signal indicating to the runtime whether the process is finished, or should be resumed later.\n * @throws Throwing in the handler will terminate the process with an error.\n *\n * Note: This function should aim to complete in under 5 seconds to avoid exceeding limits in serverless environments.\n */\n onSpawn(): Effect.Effect<void, never, R | BaseServices>;\n\n /**\n * Called when there's input available to process.\n *\n * The function can be called in parallel.\n *\n * @returns A signal indicating to the runtime whether the process is finished, or should be resumed later.\n * @throws Throwing in the handler will terminate the process with an error.\n *\n * Note: This function should aim to complete in under 5 seconds to avoid exceeding limits in serverless environments.\n */\n onInput(input: I): Effect.Effect<void, never, R | BaseServices>;\n\n /**\n * Called when the process's alarm is triggered.\n *\n * @throws Throwing in the handler will terminate the process with an error.\n */\n onAlarm(): Effect.Effect<void, never, R | BaseServices>;\n\n /**\n * Called when the process's child process produces output or exits.\n *\n * This allows the parent process to hibernate while a long-running child process is running.\n */\n onChildEvent(event: ChildEvent<unknown>): Effect.Effect<void, never, R | BaseServices>;\n}\n\n/**\n * Services that are always available to all processes.\n * Provided unconditionally by the runtime, so handlers may use them without declaring them\n * in {@link MakeProcessOpts.services}.\n */\nexport type BaseServices = Trace.TraceService | StorageService.StorageService;\n\nexport type ChildEvent<T> =\n | {\n readonly _tag: 'output';\n readonly pid: ID;\n readonly data: T;\n }\n | {\n readonly _tag: 'exited';\n readonly pid: ID;\n readonly result: Exit.Exit<void>;\n };\n\nexport interface ProcessContext<I, O> {\n readonly id: ID;\n\n /**\n * Parameters assigned during process creation.\n */\n readonly params: Params;\n\n /**\n * Complete this process with sucessful result.\n * No additional events will be pushed to the process.\n */\n succeed(): void;\n\n /**\n * Complete this process with an error.\n * No additional events will be pushed to the process.\n */\n fail(error: Error): void;\n\n /**\n * Submit output of the process.\n */\n submitOutput(output: O): void;\n\n /**\n * Set an alarm for the process to be woken up later.\n *\n * @param timeout - Optional timeout in milliseconds. If not provided, the process is woken up as soon as possible.\n */\n setAlarm(timeout?: number): void;\n}\n\n/**\n * Generic parameters for a all processes.\n */\nexport interface Params {\n /**\n * Process name for debugging purposes.\n */\n readonly name: string | null;\n\n /**\n * URI of the target this process is assigned to.\n */\n readonly target: URI.URI | null;\n\n /**\n * User-facing notifications requested for this process's lifecycle phases.\n * Surfaced on {@link Info} so a notification tracker can subscribe to the process monitor.\n */\n readonly notify?: Operation.NotifyOptions;\n}\n\n//\n// Executable.\n//\n\nexport const ProcessTypeId = '~@dxos/functions/Process' as const;\nexport type ProcessTypeId = typeof ProcessTypeId;\n\n/**\n * A process (factory).\n * Can be instantiated mutlitple times to produce new runtime instance with separate state and callbacks.\n * `create` is used to instantiate a new process.\n * Can store runtime state in scope of `create` function.\n */\nexport interface Process<I, O, R> extends Process.Variance<I, O, R> {\n /**\n * Unique identifier for the executable in the reverse DNS format.\n */\n readonly key: string;\n\n /**\n * Human-readable label from {@link MakeExecutableOpts.name} when provided.\n */\n readonly name?: string;\n\n readonly services: readonly Context.Tag<any, any>[];\n\n /**\n * Create a new instance of the process.\n */\n create(ctx: ProcessContext<I, O>): Effect.Effect<Callbacks<I, O, R>, never, R | BaseServices | Scope.Scope>;\n}\n\nexport const isProcess = (executable: unknown): executable is Process.Any =>\n typeof executable === 'object' && executable !== null && ProcessTypeId in executable;\n\nexport namespace Process {\n export interface Variance<I, O, R> {\n readonly [ProcessTypeId]: {\n readonly _Input: Types.Contravariant<I>;\n readonly _Output: Types.Covariant<O>;\n readonly _Requirements: Types.Covariant<R>;\n };\n }\n\n export type Any = Process<any, any, never>;\n}\n\nexport interface MakeProcessOpts {\n /**\n * Unique identifier for the process in the reverse DNS format.\n */\n readonly key: string;\n\n readonly input: Schema.Schema.AnyNoContext;\n readonly output: Schema.Schema.AnyNoContext;\n readonly services: readonly Context.Tag<any, any>[];\n}\n\nexport const make = <const Opts extends Types.NoExcessProperties<MakeProcessOpts, Opts>>(\n opts: Opts,\n create: (\n ctx: ProcessContext<Schema.Schema.Type<Opts['input']>, Schema.Schema.Type<Opts['output']>>,\n ) => Effect.Effect<\n Partial<\n Callbacks<\n Schema.Schema.Type<Opts['input']>,\n Schema.Schema.Type<Opts['output']>,\n Context.Tag.Identifier<NonNullable<Opts['services']>[number]>\n >\n >,\n never,\n Context.Tag.Identifier<NonNullable<Opts['services']>[number]> | BaseServices | Scope.Scope\n >,\n): Process<\n Schema.Schema.Type<Opts['input']>,\n Schema.Schema.Type<Opts['output']>,\n Context.Tag.Identifier<NonNullable<Opts['services']>[number]>\n> => {\n assertArgument(/^[a-z0-9]([a-z0-9.\\-/]*[a-z0-9])?$/i.test(opts.key), 'key', 'Invalid key');\n return {\n [ProcessTypeId]: {} as any,\n ...opts,\n create: (ctx) =>\n create(ctx).pipe(\n Effect.map((partial) => ({\n onSpawn: () => Effect.void,\n onInput: () => Effect.void,\n onAlarm: () => Effect.void,\n onChildEvent: () => Effect.void,\n ...partial,\n })),\n ),\n };\n};\n\n/**\n * Durable marker recording that an operation's input handler has begun executing.\n * Persisted before the handler runs so that, after an interruption (suspend/restart), a\n * re-delivered input can tell that the previous attempt was in-flight. Cleared automatically\n * when the process reaches a terminal state (the runtime clears the process's storage).\n */\nconst OperationStartedKey = StorageService.key(Schema.parseJson(Schema.Boolean), 'operation/started').pipe(\n StorageService.withDefault(() => false),\n);\n\nexport const fromOperation = <const Op extends Operation.Definition.Any>(\n op: Op,\n handler: OperationHandlerSet.OperationHandlerSet,\n): Process<Operation.Definition.Input<Op>, Operation.Definition.Output<Op>, Operation.Definition.Services<Op>> =>\n make(\n {\n key: DXN.getName(op.meta.key),\n input: op.input,\n output: op.output,\n services: op.services,\n },\n (ctx) =>\n Effect.gen(function* () {\n const semaphore = yield* Effect.makeSemaphore(1);\n // The process runtime assumes handlers are idempotent and always re-delivers an input\n // whose handler was interrupted. Non-idempotent operations opt out of that retry here:\n // a re-delivery that observes the durable \"started\" marker fails instead of repeating\n // side effects. Idempotent operations skip the marker and are simply re-run.\n const idempotent = Operation.isIdempotent(op);\n\n return {\n onInput: (input: Operation.Definition.Input<Op>) =>\n Effect.gen(function* () {\n if (!idempotent) {\n const started = yield* OperationStartedKey.get;\n if (started) {\n return yield* Effect.die(\n new Error(`non-idempotent operation \"${op.meta.key}\" was interrupted; cannot retry safely`),\n );\n }\n yield* OperationStartedKey.set(true);\n }\n\n // Emit operation start event.\n log('operation process invoking', { key: op.meta.key, name: op.meta.name });\n yield* Trace.write(Trace.OperationStart, {\n key: op.meta.key,\n name: op.meta.name,\n icon: op.meta.icon,\n });\n // Emit ephemeral operation input event for live subscribers\n // (history tracker, devtools) without persisting raw input.\n yield* Trace.write(Trace.OperationInput, {\n key: op.meta.key,\n name: op.meta.name,\n input,\n });\n\n const opHandler = yield* OperationHandlerSet.getHandler(handler, op).pipe(Effect.orDie);\n const output = yield* opHandler\n .handler(input)\n .pipe(Effect.orDie, Effect.withSpan(op.meta.key)) as Effect.Effect<\n Operation.Definition.Output<Op>,\n never,\n never\n >;\n\n ctx.submitOutput(output);\n ctx.succeed();\n\n // Emit ephemeral operation output event before the persisted\n // end event so subscribers see output + completion together.\n yield* Trace.write(Trace.OperationOutput, {\n key: op.meta.key,\n name: op.meta.name,\n output,\n });\n // Emit operation end event with success after side-effects complete.\n yield* Trace.write(Trace.OperationEnd, {\n key: op.meta.key,\n name: op.meta.name,\n icon: op.meta.icon,\n outcome: 'success',\n });\n }).pipe(\n Effect.catchAllDefect((defect) =>\n Effect.gen(function* () {\n // Emit operation end event with failure.\n const errorMessage = defect instanceof Error ? defect.message : String(defect);\n yield* Trace.write(Trace.OperationEnd, {\n key: op.meta.key,\n name: op.meta.name,\n icon: op.meta.icon,\n outcome: 'failure',\n error: errorMessage,\n });\n return yield* Effect.die(defect);\n }),\n ),\n semaphore.withPermits(1),\n ),\n };\n }),\n );\n\n/**\n * Runtime state of a process.\n */\nexport enum State {\n // Process is actively running.\n RUNNING = 'RUNNING',\n\n // Process is waiting for a child process to complete or an alarm to trigger.\n HYBERNATING = 'HYBERNATING',\n\n // Process is waiting for input. It will only resume when input is submitted.\n IDLE = 'IDLE',\n\n // Process is terminating and will transition to TERMINATED state.\n // TODO(dmaretskyi): Consider removing.\n TERMINATING = 'TERMINATING',\n\n // Process has been externally terminated.\n TERMINATED = 'TERMINATED',\n\n // Process has completed successfully.\n SUCCEEDED = 'SUCCEEDED',\n\n // Process has failed.\n FAILED = 'FAILED',\n}\n\n/**\n * Read-only view of a process tree\n */\nexport interface Monitor {\n /**\n * Get the current state of the process tree.\n */\n processTree: Effect.Effect<readonly Info[]>;\n\n /**\n * Atom for the process tree.\n */\n processTreeAtom: Atom.Atom<readonly Info[]>;\n}\n\nexport class ProcessMonitorService extends Context.Tag('@dxos/functions/ProcessMonitorService')<\n ProcessMonitorService,\n Monitor\n>() {}\n\nexport interface Info {\n readonly pid: ID;\n readonly parentPid: ID | null;\n\n /**\n * Key of the process.\n *\n * NOTE: There might be multiple running processes with the same key.\n */\n readonly key: string;\n\n /**\n * Parameters of the process.\n */\n readonly params: Params;\n\n /**\n * State of the process.\n */\n readonly state: State;\n\n /**\n * Error of the process.\n * Only for process in FAILED state.\n */\n readonly error: string | null;\n\n /**\n * UNIX timestamp in milliseconds.\n */\n readonly startedAt: number;\n\n /**\n * UNIX timestamp in milliseconds.\n */\n readonly completedAt: Option.Option<number>;\n\n readonly metrics: {\n /**\n * Total wall time of all handler invocations of the process in milliseconds.\n */\n readonly wallTime: number;\n\n /**\n * Total number of inputs submitted to the process.\n */\n readonly inputCount: number;\n\n /**\n * Total number of outputs submitted to the process.\n */\n readonly outputCount: number;\n };\n}\n\n/**\n * New process is spawned.\n */\nexport const SpawnedEvent = Trace.EventType('process.spawned', {\n schema: Schema.Void,\n isEphemeral: false,\n});\n\n/**\n * Process has reached a terminal state.\n */\nexport const ExitedEvent = Trace.EventType('process.exited', {\n schema: Schema.Struct({\n outcome: Schema.Literal('succeeded', 'failed', 'terminated'),\n }),\n isEphemeral: false,\n});\n\n/**\n * Renders spawned processes as a forest: top-level rows use \"- \", nested rows use ├── / └── / │.\n */\nexport const prettyProcessTree = (tree: readonly Info[]): string => {\n if (tree.length === 0) {\n return '';\n }\n\n const pidSet = new Set(tree.map((node) => node.pid));\n const childrenByParent = new Map<string, Info[]>();\n const roots: Info[] = [];\n\n for (const node of tree) {\n const parent = node.parentPid;\n if (parent === null || !pidSet.has(parent)) {\n roots.push(node);\n continue;\n }\n const key = String(parent);\n const siblings = childrenByParent.get(key) ?? [];\n siblings.push(node);\n childrenByParent.set(key, siblings);\n }\n\n const byPid = (a: Info, b: Info) => String(a.pid).localeCompare(String(b.pid));\n roots.sort(byPid);\n for (const siblings of childrenByParent.values()) {\n siblings.sort(byPid);\n }\n\n const formatLabel = (node: Info): string => {\n const idShort = String(node.pid).slice(0, 6);\n const parts = [idShort, node.state];\n if (node.params.name != null && node.params.name !== '') {\n parts.push(node.params.name);\n }\n if (node.error != null) {\n parts.push(`(${node.error})`);\n }\n const { inputCount, outputCount, wallTime } = node.metrics;\n parts.push(`[in:${inputCount} out:${outputCount} wall:${Math.round(wallTime)}ms]`);\n return parts.join(' ');\n };\n\n const lines: string[] = [];\n\n const walk = (node: Info, prefix: string, isLast: boolean, isRoot: boolean): void => {\n if (isRoot) {\n lines.push(`- ${formatLabel(node)}`);\n } else {\n const branch = isLast ? '└── ' : '├── ';\n lines.push(`${prefix}${branch}${formatLabel(node)}`);\n }\n\n const children = childrenByParent.get(String(node.pid)) ?? [];\n const nextPrefix = isRoot ? ' ' : `${prefix}${isLast ? ' ' : '│ '}`;\n children.forEach((child, index) => {\n walk(child, nextPrefix, index === children.length - 1, false);\n });\n };\n\n for (const root of roots) {\n walk(root, '', true, true);\n }\n\n return lines.join('\\n');\n};\n", "//\n// Copyright 2026 DXOS.org\n//\n\n// @import-as-namespace\n\nimport * as Context from 'effect/Context';\nimport * as Effect from 'effect/Effect';\nimport * as Layer from 'effect/Layer';\nimport * as Schema from 'effect/Schema';\n\nimport { DXN, Annotation, Obj, Type } from '@dxos/echo';\nimport { log } from '@dxos/log';\n\n/**\n * Writes ephemeral or persistent events to the trace.\n * Exposed to processes and operations to record events to the trace.\n */\nexport interface TraceWriter {\n write<T>(eventType: EventType<T>, payload: NoInfer<T>): void;\n}\n\n/**\n * Service that writes events to the trace.\n * Exposed to processes and operations to record events to the trace.\n */\nexport class TraceService extends Context.Tag('@dxos/functions/TraceService')<TraceService, TraceWriter>() {}\n\n/**\n * Writes an event to the trace.\n */\nexport function write<T>(eventType: EventType<T>, payload: NoInfer<T>): Effect.Effect<void, never, TraceService> {\n return Effect.gen(function* () {\n log('trace write', { key: eventType.key, isEphemeral: eventType.isEphemeral });\n const writer = yield* TraceService;\n writer.write(eventType, payload);\n });\n}\n\n/**\n * Defines an event type for the trace.\n */\nexport interface EventType<T> {\n readonly key: string;\n readonly schema: Schema.Schema<T, any>;\n readonly isEphemeral: boolean;\n}\n\nexport const EventType = <T>(\n key: string,\n opts: { schema: Schema.Schema<T, any>; isEphemeral: boolean },\n): EventType<T> => {\n return {\n key,\n schema: opts.schema,\n isEphemeral: opts.isEphemeral,\n };\n};\n\n/**\n * Extracts the payload type from an event type.\n */\nexport type PayloadType<E extends EventType<any>> = E extends EventType<infer T> ? T : never;\n\nexport const Event = Schema.Struct({\n timestamp: Schema.Number,\n type: Schema.String,\n data: Schema.Unknown, // Type-specific payload;\n});\nexport type Event = Schema.Schema.Type<typeof Event>;\n/**\n * Checks if an event is of a given type.\n */\nexport const isOfType = <T, E extends Event>(eventType: EventType<T>, event: E): event is E & { data: T } => {\n return event.type === eventType.key;\n};\n\n/**\n * Extensible name informing which runtime executed the code that produced the event.\n */\nexport const RuntimeName = Schema.String.pipe(Schema.brand('@dxos/compute/Trace/RuntimeName'));\nexport type RuntimeName = Schema.Schema.Type<typeof RuntimeName>;\n\n/**\n * Common runtime names.\n */\nexport const CommonRuntimeName = {\n /**\n * Web app / CLI / Desktop app / Mobile app.\n */\n local: RuntimeName.make('local'),\n edgeIntrinsic: RuntimeName.make('edge-intrinsic'),\n edgeWorkerLoader: RuntimeName.make('edge-worker-loader'),\n edgeWorkerForPlatforms: RuntimeName.make('edge-worker-for-platforms'),\n};\n\n/**\n * Metadata on the context of a trace message.\n */\n// TODO(dmaretskyi): Expand on this: conversation id, tool call id, etc.\nexport const Meta = Schema.Struct({\n pid: Schema.optional(Schema.String), // NOTE: Not Process.ID to avoid circular dependency.\n parentPid: Schema.optional(Schema.String),\n processName: Schema.optional(Schema.String),\n\n /**\n * Space the message was produced in.\n * Stored as a string to avoid circular dependency on `@dxos/keys`.\n */\n space: Schema.optional(Schema.String),\n\n /**\n * ID of the conversation feed object if present.\n */\n conversationId: Schema.optional(Obj.ID),\n\n /**\n * ID of the trigger object if invocation resulted from a trigger.\n */\n triggerId: Schema.optional(Obj.ID),\n\n /**\n * ID of the tool call that created the current process.\n */\n toolCallId: Schema.optional(Schema.String),\n\n /**\n * Extensible name informing which runtime executed the code that produced the event.\n */\n runtimeName: Schema.optional(RuntimeName),\n});\nexport type Meta = Schema.Schema.Type<typeof Meta>;\n/**\n * Checks if a runtime is an edge runtime.\n */\nexport const isEdgeRuntime = (name: RuntimeName): boolean =>\n name === CommonRuntimeName.edgeIntrinsic ||\n name === CommonRuntimeName.edgeWorkerLoader ||\n name === CommonRuntimeName.edgeWorkerForPlatforms;\n\n/**\n * Envelope for a set of events.\n */\nexport const MessageData = Schema.Struct({\n meta: Meta,\n\n isEphemeral: Schema.Boolean,\n events: Schema.Array(Event),\n});\nexport type MessageData = Schema.Schema.Type<typeof MessageData>;\nexport const Message = MessageData.pipe(\n Annotation.IconAnnotation.set({ icon: 'ph--note--regular', hue: 'rose' }),\n Annotation.HiddenAnnotation.set(true),\n Type.makeObject(DXN.make('org.dxos.type.traceMessage', '0.1.0')),\n);\nexport type Message = Type.InstanceType<typeof Message>;\n/**\n * Flattened representation of a signle event in a trace message.\n * Events are stored in batched messages for efficiency, but flat representation is more convenient for consumption.\n */\nexport interface FlatEvent extends Event {\n readonly meta: Meta;\n readonly isEphemeral: boolean;\n}\n\n/**\n * Flattens a trace message into a list of flat events.\n */\nexport const flatten = (message: Message): FlatEvent[] => {\n return message.events.map((event) => ({\n ...event,\n meta: message.meta,\n isEphemeral: message.isEphemeral,\n }));\n};\n\n/**\n * Sink for complete trace messages.\n */\nexport interface Sink {\n write(message: Message): void;\n}\n\n/**\n * Sink for complete trace messages.\n * The Process Manager forwards trace messages to it.\n */\n// TODO(dmaretskyi): Consider moving sink to the Process Manager.\nexport class TraceSink extends Context.Tag('@dxos/functions/TraceSink')<TraceSink, Sink>() {}\n\nexport const noopWriter: TraceWriter = {\n write: () => {},\n};\n\nexport const writerLayerNoop: Layer.Layer<TraceService> = Layer.succeed(TraceService, noopWriter);\n\nexport const noopSink: Sink = {\n write: () => {},\n};\n\nexport const layerNoop: Layer.Layer<TraceSink> = Layer.succeed(TraceSink, noopSink);\n\nexport const layerConsole: Layer.Layer<TraceSink> = Layer.succeed(TraceSink, {\n write: (message) => {\n console.log(message);\n },\n});\n\n/**\n * Merge a set of sinks into a single sink.\n *\n * Each message is forwarded to every sink in order. Failures in one sink do not\n * prevent downstream sinks from receiving the message.\n */\nexport const mergeSinks = (sinks: readonly Sink[]): Sink => {\n if (sinks.length === 0) {\n return noopSink;\n }\n // Intentionally no singleton fast path: the guarded wrapper is the\n // contract of `mergeSinks`, so a throwing sink is always caught and\n // logged regardless of how many sinks were passed in.\n return {\n write: (message) => {\n for (const sink of sinks) {\n try {\n sink.write(message);\n } catch (err) {\n // Intentional: do not let one sink break the chain.\n // eslint-disable-next-line no-console\n console.error('[trace] sink.write threw', err);\n }\n }\n },\n };\n};\n\n/**\n * Builds a {@link TraceService} layer that wraps each `write` into a fresh {@link Message}\n * and forwards it to the provided {@link TraceSink}. Intended for tests and lightweight\n * fixtures.\n *\n * Options:\n * - `meta`: stamped on every emitted message (defaults to `{}`).\n * - `clock`: timestamp source (defaults to {@link Date.now}). Pass a monotonic counter\n * in tests to make event ordering deterministic when many writes happen in the same\n * millisecond.\n */\nexport const testTraceService = (\n opts: { meta?: Meta; clock?: () => number } = {},\n): Layer.Layer<TraceService, never, TraceSink> =>\n Layer.effect(\n TraceService,\n Effect.gen(function* () {\n const sink = yield* TraceSink;\n const clock = opts.clock ?? Date.now;\n return {\n write: (event, data) => {\n sink.write(\n Obj.make(Message, {\n meta: opts.meta ?? {},\n isEphemeral: event.isEphemeral,\n events: [{ type: event.key, timestamp: clock(), data }],\n }),\n );\n },\n };\n }),\n );\n\n//\n// Operation Trace Events\n//\n\n/**\n * Outcome of an operation invocation.\n */\nexport type OperationOutcome = 'success' | 'failure';\n\n/**\n * Operation invocation started.\n */\nexport const OperationStart = EventType('operation.start', {\n schema: Schema.Struct({\n /** Operation key. */\n key: Schema.String,\n /** Human-readable operation name. */\n name: Schema.optional(Schema.String),\n /** Phosphor icon identifier in `ph--<name>--<variant>` format. */\n icon: Schema.optional(Schema.String),\n }),\n isEphemeral: false,\n});\n\n/**\n * Operation invocation ended.\n */\nexport const OperationEnd = EventType('operation.end', {\n schema: Schema.Struct({\n /** Operation key. */\n key: Schema.String,\n /** Human-readable operation name. */\n name: Schema.optional(Schema.String),\n /** Phosphor icon identifier in `ph--<name>--<variant>` format. */\n icon: Schema.optional(Schema.String),\n /** Outcome of the operation. */\n outcome: Schema.Literal('success', 'failure'),\n /** Error message if the operation failed. */\n error: Schema.optional(Schema.String),\n }),\n isEphemeral: false,\n});\n\n/**\n * Operation input. Emitted as an ephemeral event alongside {@link OperationStart}\n * so subscribers (such as the undo/redo history tracker) can observe the raw\n * input payload without persisting it to long-lived sinks.\n */\nexport const OperationInput = EventType('operation.input', {\n schema: Schema.Struct({\n /** Operation key. */\n key: Schema.String,\n /** Human-readable operation name. */\n name: Schema.optional(Schema.String),\n /** Raw operation input. Shape determined by the operation definition. */\n input: Schema.Unknown,\n }),\n isEphemeral: true,\n});\n\n/**\n * Operation output. Emitted as an ephemeral event just before\n * {@link OperationEnd} for successful invocations so subscribers (such as the\n * undo/redo history tracker) can observe the raw output payload without\n * persisting it to long-lived sinks.\n */\nexport const OperationOutput = EventType('operation.output', {\n schema: Schema.Struct({\n /** Operation key. */\n key: Schema.String,\n /** Human-readable operation name. */\n name: Schema.optional(Schema.String),\n /** Raw operation output. Shape determined by the operation definition. */\n output: Schema.Unknown,\n }),\n isEphemeral: true,\n});\n\n/**\n * Human-readable status update emitted by an agent or operation.\n */\nexport const StatusUpdate = EventType('status.update', {\n schema: Schema.Struct({\n /** Human-readable status message. */\n message: Schema.String,\n }),\n isEphemeral: true,\n});\n\n/**\n * Emit the current human-readable execution status to the trace.\n */\nexport const emitStatus: (message: string) => Effect.Effect<void, never, TraceService> = (message) =>\n write(StatusUpdate, { message });\n", "//\n// Copyright 2025 DXOS.org\n//\n\n// @import-as-namespace\n\nimport * as Schema from 'effect/Schema';\n\nimport { DXN, Annotation, JsonSchema, Obj, Ref, Type, Format } from '@dxos/echo';\nimport { Text } from '@dxos/schema';\n\nimport * as Blueprint from './Blueprint';\n\n/**\n * Prompt-based operation.\n * May reference blueprints and additional context.\n */\nexport const Routine = Schema.Struct({\n name: Schema.optional(Schema.String),\n description: Schema.optional(Schema.String),\n input: JsonSchema.JsonSchema.pipe(Annotation.FormInputAnnotation.set(false)).annotations({\n description: 'Input schema',\n }),\n output: JsonSchema.JsonSchema.pipe(Annotation.FormInputAnnotation.set(false)).annotations({\n description: 'Output schema',\n }),\n instructions: Ref.Ref(Text.Text).pipe(\n Annotation.FormInputAnnotation.set(false),\n Format.FormatAnnotation.set(Format.TypeFormat.Markdown),\n Schema.annotations({ title: 'Instructions', description: 'Agent instructions' }),\n ),\n blueprints: Schema.Array(Ref.Ref(Blueprint.Blueprint)),\n context: Schema.Array(Schema.Any).pipe(Annotation.FormInputAnnotation.set(false)),\n}).pipe(\n Annotation.LabelAnnotation.set(['name']),\n Annotation.IconAnnotation.set({ icon: 'ph--scroll--regular', hue: 'sky' }),\n Type.makeObject(DXN.make('org.dxos.type.routine', '0.1.0')),\n);\n\nexport type Routine = Type.InstanceType<typeof Routine>;\n\nexport type MakeProps = {\n name?: string;\n description?: string;\n input?: Schema.Schema.AnyNoContext;\n output?: Schema.Schema.AnyNoContext;\n instructions?: string;\n blueprints?: Ref.Ref<Blueprint.Blueprint>[];\n context?: any[];\n};\n\nexport const make = ({\n name,\n description,\n input,\n output,\n instructions,\n blueprints = [],\n context = [],\n}: MakeProps): Routine =>\n Obj.make(Routine, {\n name,\n description,\n input: JsonSchema.toJsonSchema(input ?? Schema.Void),\n output: JsonSchema.toJsonSchema(output ?? Schema.Void),\n instructions: Ref.make(Text.make({ content: instructions ?? '' })),\n blueprints,\n context,\n });\n", "//\n// Copyright 2025 DXOS.org\n//\n\n// @import-as-namespace\n\nimport * as Schema from 'effect/Schema';\n\nimport { DXN, Annotation, Obj, Ref, Type } from '@dxos/echo';\nimport { FormInputAnnotation } from '@dxos/echo/Annotation';\nimport { Text } from '@dxos/schema';\n\n/**\n * Source script.\n */\nexport const Script = Schema.Struct({\n name: Schema.String.pipe(Schema.optional),\n description: Schema.String.pipe(Schema.optional),\n // TODO(burdon): Change to hash of deployed content.\n // Whether source has changed since last deploy.\n changed: Schema.Boolean.pipe(FormInputAnnotation.set(false), Schema.optional),\n source: Ref.Ref(Text.Text).pipe(FormInputAnnotation.set(false)),\n}).pipe(\n Annotation.LabelAnnotation.set(['name']),\n Annotation.IconAnnotation.set({ icon: 'ph--code--regular', hue: 'sky' }),\n Type.makeObject(DXN.make('org.dxos.type.script', '0.1.0')),\n);\n\nexport type Script = Type.InstanceType<typeof Script>;\ntype Props = Omit<Obj.MakeProps<typeof Script>, 'source'> & { source?: string };\n\nexport const make = ({ source = '', ...props }: Props = {}): Script =>\n Obj.make(Script, { ...props, source: Ref.make(Text.make({ content: source })) });\n", "//\n// Copyright 2026 DXOS.org\n//\n\n// @import-as-namespace\n\nimport * as Context from 'effect/Context';\nimport * as Effect from 'effect/Effect';\nimport * as Either from 'effect/Either';\nimport * as Layer from 'effect/Layer';\nimport * as Option from 'effect/Option';\nimport * as Scope from 'effect/Scope';\n\nimport type { SpaceId, URI } from '@dxos/keys';\n\nimport { ServiceNotAvailableError } from './errors';\nimport * as Process from './Process';\n\nconst ServiceResolverTypeId = '~@dxos/functions/ServiceResolver' as const;\ntype ServiceResolverTypeId = typeof ServiceResolverTypeId;\n\nexport interface ServiceResolver {\n readonly [ServiceResolverTypeId]: ServiceResolverTypeId;\n\n /**\n * Resolve a set of services identified by their tags.\n * Returns a Context containing all requested services, or fails with ServiceNotAvailableError.\n */\n resolve<Tag extends Context.Tag<any, any>>(\n tag: Tag,\n context: ResolutionContext,\n ): Effect.Effect<Context.Tag.Service<Tag>, ServiceNotAvailableError, Scope.Scope>;\n}\n\n/**\n * Tag for the ServiceResolver service.\n */\nexport const ServiceResolver = Context.GenericTag<ServiceResolver>('@dxos/functions/ServiceResolver');\n\nexport const resolve: {\n <Tag extends Context.Tag<any, any>>(\n tag: Tag,\n context: ResolutionContext,\n ): Effect.Effect<Context.Tag.Service<Tag>, ServiceNotAvailableError, Scope.Scope | ServiceResolver>;\n} = Effect.serviceFunctionEffect(ServiceResolver, (_) => _.resolve);\n\nexport const resolveAll = <const Tags extends readonly Context.Tag<any, any>[]>(\n tags: Tags,\n context: ResolutionContext,\n): Effect.Effect<Context.Context<Tags[number]>, ServiceNotAvailableError, Scope.Scope | ServiceResolver> =>\n Effect.gen(function* () {\n const services = yield* Effect.forEach(tags, (tag) =>\n resolve(tag, context).pipe(Effect.map((service) => Context.make(tag, service))),\n );\n return Context.mergeAll(...services);\n });\n\n/**\n * Provides context for service resolution.\n */\nexport interface ResolutionContext {\n /**\n * Under which identity the process is running.\n */\n readonly identity?: string;\n\n /**\n * Under which space the process is running.\n */\n readonly space?: SpaceId;\n\n /**\n * URI of the conversation feed the process is running in. Today always an EID;\n * narrow with `EID.parse` at the point of use.\n */\n readonly conversation?: URI.URI;\n\n /**\n * Under which process the process is running.\n */\n readonly process?: Process.ID;\n}\n\nexport const succeed = <I, S>(\n tag: Context.Tag<I, S>,\n getService: (context: ResolutionContext) => Effect.Effect<S, ServiceNotAvailableError, Scope.Scope>,\n): ServiceResolver => {\n return make((tag1, context) => {\n if (tag1.key !== tag.key) {\n return Effect.fail(new ServiceNotAvailableError(`Service not available: ${String(tag.key ?? tag)}`));\n }\n const service = getService(context);\n return service as any;\n });\n};\n\n/**\n * Create a ServiceResolver from a custom resolution function.\n */\nexport const make = (\n resolveFn: <I, S>(\n tag: Context.Tag<I, S>,\n context: ResolutionContext,\n ) => Effect.Effect<S, ServiceNotAvailableError, Scope.Scope>,\n): ServiceResolver => ({\n [ServiceResolverTypeId]: ServiceResolverTypeId,\n resolve: resolveFn,\n});\n\n/**\n * Create a ServiceResolver backed by a static Context.\n * Tags present in the context are resolved; missing tags fail with ServiceNotAvailableError.\n */\nexport const fromContext = <Services>(ctx: Context.Context<Services>): ServiceResolver =>\n make((tag, context) =>\n Effect.gen(function* () {\n const service = Context.getOption(ctx, tag);\n if (Option.isNone(service)) {\n return yield* Effect.fail(new ServiceNotAvailableError(String(tag.key ?? tag)));\n }\n return service.value;\n }),\n );\n\n/**\n * Create a ServiceResolver that resolves tags from the current Effect context.\n * Only the specified tags are available; requests for other tags fail.\n */\nexport const fromRequirements = <const Tags extends readonly Context.Tag<any, any>[]>(\n ...tags: Tags\n): Effect.Effect<ServiceResolver, never, Context.Tag.Identifier<Tags[number]>> =>\n Effect.contextWith((parentCtx: Context.Context<any>) => {\n const available = new Set(tags.map((tag) => tag.key));\n return make((tag, context) =>\n Effect.gen(function* () {\n let result: Context.Context<never> = Context.empty() as Context.Context<never>;\n if (!available.has(tag.key)) {\n return yield* Effect.fail(new ServiceNotAvailableError(String(tag.key ?? tag)));\n }\n const service = Context.getOption(parentCtx, tag);\n if (Option.isNone(service)) {\n return yield* Effect.fail(new ServiceNotAvailableError(String(tag.key ?? tag)));\n }\n return service.value;\n }),\n );\n });\n\n/**\n * Like {@link fromRequirements} but returns a Layer that provides ServiceResolver.\n */\nexport const layerRequirements = <const Tags extends readonly Context.Tag<any, any>[]>(\n ...tags: Tags\n): Layer.Layer<ServiceResolver, never, Context.Tag.Identifier<Tags[number]>> =>\n Layer.effect(ServiceResolver, fromRequirements(...tags));\n\n/**\n * Build a {@link Layer} that materialises the requested services by calling\n * {@link resolveAll} against the {@link ServiceResolver} currently in context.\n *\n * The returned layer manages its own {@link Scope.Scope} and requires only a\n * {@link ServiceResolver} (typically supplied by the process-manager runtime).\n *\n * @example\n * ```ts\n * processManagerRuntime.runPromise(\n * myEffect.pipe(Effect.provide(ServiceResolver.provide({ space }, Database.Service, Feed.FeedService))),\n * );\n * ```\n */\nexport const provide = <const Tags extends readonly Context.Tag<any, any>[]>(\n context: ResolutionContext,\n ...tags: Tags\n): Layer.Layer<Context.Tag.Identifier<Tags[number]>, ServiceNotAvailableError, ServiceResolver> =>\n Layer.scopedContext(resolveAll(tags, context));\n\n/**\n * Compose multiple resolvers left to right. Earlier resolvers take precedence:\n * the first resolver that can satisfy a tag wins.\n */\nexport const compose = (...resolvers: readonly ServiceResolver[]): ServiceResolver =>\n make((tag, context) =>\n Effect.gen(function* () {\n for (const resolver of resolvers) {\n const single = yield* resolver.resolve(tag, context).pipe(Effect.either);\n if (Either.isRight(single)) {\n return single.right;\n }\n }\n\n return yield* Effect.fail(new ServiceNotAvailableError(String(tag.key ?? tag)));\n }),\n );\n\n/**\n * An empty resolver that fails for any requested service.\n */\nexport const empty: ServiceResolver = make((tag, context) => {\n return Effect.fail(new ServiceNotAvailableError(String(tag.key ?? tag)));\n});\n", "//\n// Copyright 2023 DXOS.org\n//\n\n// @import-as-namespace\n\nimport * as Schema from 'effect/Schema';\nimport * as SchemaAST from 'effect/SchemaAST';\n\nimport { DXN, Annotation, Feed, Obj, QueryAST, Ref, Type, type Query } from '@dxos/echo';\nimport { HiddenAnnotation } from '@dxos/echo/Annotation';\nimport { OptionsAnnotationId } from '@dxos/echo/Format';\n\n/**\n * Type discriminator for TriggerType.\n * Every spec has a type field of type TriggerKind that we can use to understand which type we're working with.\n * https://www.typescriptlang.org/docs/handbook/2/narrowing.html#discriminated-unions\n */\nexport const Kinds = ['email', 'feed', 'subscription', 'timer', 'webhook'] as const;\nexport type Kind = (typeof Kinds)[number];\n\nconst kindLiteralAnnotations = { title: 'Kind' };\n\nexport const EmailSpec = Schema.Struct({\n kind: Schema.Literal('email').annotations(kindLiteralAnnotations),\n});\nexport type EmailSpec = Schema.Schema.Type<typeof EmailSpec>;\n\n/**\n * Construct an Email trigger spec.\n */\nexport const specEmail = (): EmailSpec => ({ kind: 'email' });\n\n// TODO(wittjosiah): Remove. Migrate to Subscription triggers once EDGE supports them for feed queries.\nexport const FeedSpec = Schema.Struct({\n kind: Schema.Literal('feed').annotations(kindLiteralAnnotations),\n feed: Schema.optional(Ref.Ref(Feed.Feed).annotations({ title: 'Feed' })),\n});\nexport type FeedSpec = Schema.Schema.Type<typeof FeedSpec>;\n\n/**\n * Construct a Feed trigger spec from a Feed object.\n */\nexport const specFeed = (feed: Feed.Feed): FeedSpec => ({\n kind: 'feed',\n feed: Ref.make(feed),\n});\n\n/**\n * Subscription.\n */\nexport const SubscriptionSpec = Schema.Struct({\n kind: Schema.Literal('subscription').annotations(kindLiteralAnnotations),\n query: Schema.Struct({\n raw: Schema.optional(Schema.String.annotations({ title: 'Query' })),\n ast: QueryAST.Query,\n }),\n options: Schema.optional(\n Schema.Struct({\n // Watch changes to object (not just creation).\n deep: Schema.optional(Schema.Boolean.annotations({ title: 'Nested' })),\n // Debounce changes (delay in ms).\n delay: Schema.optional(Schema.Number.annotations({ title: 'Delay' })),\n }).annotations({ title: 'Options' }),\n ),\n});\nexport type SubscriptionSpec = Schema.Schema.Type<typeof SubscriptionSpec>;\n\n/**\n * Construct a Subscription trigger spec from a Query object.\n */\nexport const specSubscription = (\n query: Query.Query<any>,\n options?: { deep?: boolean; delay?: number },\n): SubscriptionSpec => ({\n kind: 'subscription',\n query: {\n ast: query.ast,\n },\n options: options\n ? {\n deep: options.deep,\n delay: options.delay,\n }\n : undefined,\n});\n\n/**\n * Cron timer.\n */\nexport const TimerSpec = Schema.Struct({\n kind: Schema.Literal('timer').annotations(kindLiteralAnnotations),\n cron: Schema.String.annotations({\n title: 'Cron',\n [SchemaAST.ExamplesAnnotationId]: ['0 0 * * *'],\n }),\n});\nexport type TimerSpec = Schema.Schema.Type<typeof TimerSpec>;\n\n/**\n * Construct a Timer trigger spec from a cron string.\n */\nexport const specTimer = (cron: string): TimerSpec => ({ kind: 'timer', cron });\n\n/**\n * Webhook.\n */\nexport const WebhookSpec = Schema.Struct({\n kind: Schema.Literal('webhook').annotations(kindLiteralAnnotations),\n method: Schema.optional(\n Schema.String.annotations({\n title: 'Method',\n [OptionsAnnotationId]: ['GET', 'POST'],\n }),\n ),\n port: Schema.optional(\n Schema.Number.annotations({\n title: 'Port',\n }),\n ),\n});\nexport type WebhookSpec = Schema.Schema.Type<typeof WebhookSpec>;\n\n/**\n * Construct a Webhook trigger spec from a method and port.\n */\nexport const specWebhook = (opts?: { method?: string; port?: number }): WebhookSpec => ({\n kind: 'webhook',\n method: opts?.method,\n port: opts?.port,\n});\n\n/**\n * Trigger schema.\n */\nexport const Spec = Schema.Union(EmailSpec, FeedSpec, SubscriptionSpec, TimerSpec, WebhookSpec).annotations({\n title: 'Trigger',\n});\nexport type Spec = Schema.Schema.Type<typeof Spec>;\n\n/**\n * Function trigger.\n * Function is invoked with the `payload` passed as input data.\n * The event that triggers the function is available in the function context.\n */\nconst TriggerSchema = Schema.Struct({\n /**\n * Function or workflow to invoke.\n */\n // TODO(dmaretskyi): Can be a Ref(FunctionType) or Ref(ComputeGraphType).\n function: Schema.optional(Ref.Ref(Obj.Unknown).annotations({ title: 'Function' })),\n\n /**\n * Only used for workflowSchema.\n * Specifies the input node in the circuit.\n * @deprecated Remove and enforce a single input node in all compute graphSchema.\n */\n inputNodeId: Schema.optional(Schema.String.annotations({ title: 'Input Node ID' })),\n\n // TODO(burdon): NO BOOLEAN PROPERTIES (enabld/disabled/paused, etc.)\n // Need lint rule; or agent rule to require PR review for \"boolean\" key word.\n enabled: Schema.optional(Schema.Boolean.annotations({ title: 'Enabled' })),\n\n spec: Schema.optional(Spec),\n\n concurrency: Schema.optional(\n Schema.Number.annotations({\n title: 'Concurrency',\n default: 1,\n description:\n 'Maximum number of concurrent invocations of the trigger. For Feed triggers, this will process Feed items in parallel.',\n }),\n ),\n\n /**\n * Passed as the input data to the function.\n * Must match the function's input schema.\n *\n * @example\n * {\n * item: '{{event.item}}',\n * instructions: 'Summarize and perform entity-extraction'\n * mailbox: { '/': 'echo://AAA/ZZZ' }\n * }\n */\n input: Schema.optional(Schema.Record({ key: Schema.String, value: Schema.Any })),\n}).pipe(\n Annotation.IconAnnotation.set({ icon: 'ph--lightning--regular', hue: 'yellow' }),\n HiddenAnnotation.set(true),\n Type.makeObject(DXN.make('org.dxos.type.trigger', '0.1.0')),\n);\n\nexport type Trigger = Type.InstanceType<typeof TriggerSchema>;\nexport const Trigger: Type.Obj<Trigger> = TriggerSchema as any;\n\nexport const make = (props: Obj.MakeProps<typeof Trigger>) => Obj.make(Trigger, props);\n", "//\n// Copyright 2025 DXOS.org\n//\n\n// @import-as-namespace\n\nimport * as Schema from 'effect/Schema';\n\nimport { Feed, Obj, Ref } from '@dxos/echo';\n\n// TODO(wittjosiah): Review this type.\n// - Should be discriminated union.\n// - Should be more consistent (e.g. subject vs item).\n// - Should re-use schemas if possible.\n\n// TODO(burdon): Reuse trigger schema from @dxos/functions (TriggerType).\nexport const EmailEvent = Schema.Struct({\n from: Schema.String,\n to: Schema.String,\n subject: Schema.String,\n created: Schema.String,\n body: Schema.String,\n});\nexport type EmailEvent = Schema.Schema.Type<typeof EmailEvent>;\n\nexport const FeedEvent = Schema.Struct({\n feed: Ref.Ref(Feed.Feed),\n item: Schema.Any,\n cursor: Schema.String,\n});\nexport type FeedEvent = Schema.Schema.Type<typeof FeedEvent>;\n\nexport const SubscriptionEvent = Schema.Struct({\n /**\n * Type of the mutation.\n */\n // TODO(dmaretskyi): Specify enum.\n type: Schema.String,\n\n /**\n * Reference to the object that was changed or created.\n */\n subject: Ref.Ref(Obj.Unknown),\n\n /**\n * @deprecated\n */\n changedObjectId: Schema.optional(Schema.String),\n});\nexport type SubscriptionEvent = Schema.Schema.Type<typeof SubscriptionEvent>;\n\nexport const TimerEvent = Schema.Struct({ tick: Schema.Number });\nexport type TimerEvent = Schema.Schema.Type<typeof TimerEvent>;\n\nexport const WebhookEvent = Schema.Struct({\n url: Schema.String,\n method: Schema.Literal('GET', 'POST'),\n headers: Schema.Record({ key: Schema.String, value: Schema.String }),\n bodyText: Schema.String,\n});\nexport type WebhookEvent = Schema.Schema.Type<typeof WebhookEvent>;\n\nexport const TriggerEvent = Schema.Union(EmailEvent, FeedEvent, SubscriptionEvent, TimerEvent, WebhookEvent);\nexport type TriggerEvent = Schema.Schema.Type<typeof TriggerEvent>;\n"],
5
+ "mappings": "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",
6
6
  "names": ["make", "Effect", "Schema", "ToolId", "DXN", "Annotation", "Database", "Filter", "Migration", "Obj", "Registry", "Type", "URI", "BaseError", "Schema", "McpServer", "Struct", "name", "String", "pipe", "optional", "annotations", "description", "url", "protocol", "Union", "Literal", "apiKey", "Effect", "Schema", "Database", "DXN", "Filter", "Ref", "Registry", "assertArgument", "invariant", "log", "Text", "Handlebars", "InputKind", "default", "Schema", "description", "inputs", "id", "content", "source", "section", "handlebars", "Handlebars", "create", "registerHelper", "template", "compileAST", "output", "variables", "trim", "processTemplate", "Effect", "kind", "input", "key", "isDXN", "operation", "results", "length", "FunctionNotFoundError", "Operation", "deserialize", "result", "invoke", "fn", "undefined", "Blueprint", "Struct", "name", "String", "annotations", "description", "optional", "instructions", "Template", "tools", "Array", "ToolId", "agentCanEnable", "Boolean", "mcpServers", "McpServer", "pipe", "Annotation", "LabelAnnotation", "set", "IconAnnotation", "icon", "hue", "Type", "makeObject", "DXN", "make", "key", "version", "props", "Obj", "Meta", "getKey", "blueprint", "getMeta", "undefined", "Error", "getVersion", "toolDefinitions", "operations", "map", "op", "getName", "meta", "tool", "registryURI", "tryMake", "URI", "resolve", "gen", "results", "Registry", "runQuery", "Filter", "and", "type", "fail", "NotFoundError", "context", "upsert", "local", "Database", "query", "run", "length", "add", "clone", "deep", "BaseError", "extend", "Blueprint_v0_1_0", "_migration", "Migration", "define", "from", "to", "transform", "migrations", "Context", "Effect", "Redacted", "CredentialsService", "Tag", "getCredential", "query", "gen", "credentials", "promise", "getApiKey", "credential", "apiKey", "Error", "service", "make", "HttpClient", "HttpClientRequest", "Effect", "Layer", "BYOK_HEADER", "byokLayer", "providerHost", "effect", "HttpClient", "gen", "client", "credentials", "CredentialsService", "mapRequestEffect", "request", "matches", "tryPromise", "queryCredentials", "service", "pipe", "orElseSucceed", "apiKey", "find", "credential", "setHeader", "BYOK_HEADER", "make", "TypeId", "opts", "affinity", "requires", "provides", "resolve", "Context", "Effect", "Layer", "Database", "Filter", "Query", "Service", "Tag", "resolve", "serviceFunctionEffect", "service", "layer", "effect", "gen", "database", "Database", "handlerSet", "OperationHandlerProvider", "key", "query", "Query", "select", "Filter", "and", "type", "PersistentOperation", "first", "pipe", "flatten", "map", "deserialize", "catchTag", "getHandlerByKey", "option", "provideService", "make", "Context", "Effect", "Schema", "assertArgument", "DXN", "log", "flatten", "Context", "Effect", "Layer", "Schema", "DXN", "Annotation", "Obj", "Type", "log", "__dxlog_file", "eventType", "isEphemeral", "TraceService", "writer", "payload", "key", "schema", "type", "data", "Unknown", "edgeWorkerLoader", "RuntimeName", "make", "edgeWorkerForPlatforms", "parentPid", "optional", "processName", "events", "Message", "MessageData", "hue", "event", "message", "meta", "noopWriter", "writerLayerNoop", "write", "layerNoop", "console", "noopSink", "sink", "clock", "Date", "opts", "String", "outcome", "Literal", "__dxlog_file", "make", "create", "assertArgument", "ProcessTypeId", "opts", "ctx", "onInput", "Effect", "onAlarm", "void", "onChildEvent", "partial", "key", "input", "output", "op", "services", "semaphore", "gen", "started", "OperationStartedKey", "set", "log", "name", "Trace", "write", "meta", "icon", "submitOutput", "succeed", "outcome", "catchAllDefect", "errorMessage", "defect", "Error", "message", "error", "State", "isEphemeral", "Schema", "pidSet", "roots", "parent", "node", "siblings", "push", "childrenByParent", "b", "String", "a", "localeCompare", "sort", "formatLabel", "idShort", "params", "inputCount", "outputCount", "parts", "lines", "isRoot", "branch", "isLast", "children", "get", "pid", "index", "walk", "nextPrefix", "length", "join", "make", "Schema", "DXN", "Annotation", "JsonSchema", "Obj", "Ref", "Type", "Format", "Text", "Routine", "Struct", "name", "optional", "String", "description", "input", "JsonSchema", "pipe", "Annotation", "FormInputAnnotation", "set", "annotations", "output", "instructions", "Ref", "Text", "Format", "FormatAnnotation", "TypeFormat", "Markdown", "title", "blueprints", "Array", "Blueprint", "context", "Any", "LabelAnnotation", "IconAnnotation", "icon", "hue", "Type", "makeObject", "DXN", "make", "Obj", "toJsonSchema", "Void", "content", "make", "Schema", "DXN", "Annotation", "Obj", "Ref", "Type", "FormInputAnnotation", "Text", "Script", "Struct", "name", "String", "pipe", "optional", "description", "changed", "Boolean", "set", "source", "LabelAnnotation", "IconAnnotation", "icon", "hue", "makeObject", "props", "content", "empty", "make", "resolve", "succeed", "Context", "Effect", "Either", "Layer", "Option", "ServiceResolverTypeId", "ServiceResolver", "GenericTag", "resolve", "serviceFunctionEffect", "_", "resolveAll", "tags", "context", "gen", "services", "forEach", "tag", "pipe", "map", "service", "make", "mergeAll", "succeed", "getService", "tag1", "key", "fail", "ServiceNotAvailableError", "String", "resolveFn", "fromContext", "ctx", "getOption", "isNone", "value", "fromRequirements", "contextWith", "parentCtx", "available", "Set", "result", "empty", "has", "layerRequirements", "effect", "provide", "scopedContext", "compose", "resolvers", "resolver", "single", "either", "isRight", "right", "make", "Schema", "SchemaAST", "DXN", "Annotation", "Feed", "Obj", "QueryAST", "Ref", "Type", "HiddenAnnotation", "OptionsAnnotationId", "Kinds", "kindLiteralAnnotations", "title", "EmailSpec", "Struct", "kind", "Literal", "annotations", "specEmail", "FeedSpec", "feed", "optional", "specFeed", "SubscriptionSpec", "query", "raw", "String", "ast", "Query", "options", "deep", "Boolean", "delay", "Number", "specSubscription", "undefined", "TimerSpec", "cron", "ExamplesAnnotationId", "specTimer", "WebhookSpec", "method", "port", "specWebhook", "opts", "Spec", "Union", "TriggerSchema", "function", "Unknown", "inputNodeId", "enabled", "spec", "concurrency", "default", "description", "input", "Record", "key", "value", "Any", "pipe", "IconAnnotation", "set", "icon", "hue", "makeObject", "Trigger", "props", "Schema", "Feed", "Obj", "Ref", "EmailEvent", "Struct", "from", "String", "to", "subject", "created", "body", "FeedEvent", "feed", "item", "Any", "cursor", "SubscriptionEvent", "type", "Unknown", "changedObjectId", "optional", "TimerEvent", "tick", "Number", "WebhookEvent", "url", "method", "Literal", "headers", "Record", "key", "value", "bodyText", "TriggerEvent", "Union"]
7
7
  }