🎩 You're Invited:Meet the Socket team at Black Hat in Las Vegas, August 3-6.RSVP
Sign In

@galya/agents

Package Overview
Dependencies
Maintainers
1
Versions
3
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

@galya/agents - npm Package Compare versions

Comparing version
0.1.0
to
0.2.2
+26
-1
dist/index.cjs

@@ -24,2 +24,4 @@ "use strict";

GALYA_AGENT_TOOL_NAMES: () => GALYA_AGENT_TOOL_NAMES,
GALYA_DEFAULT_API_ORIGIN: () => GALYA_DEFAULT_API_ORIGIN,
GALYA_DEFAULT_API_V1_BASE_URL: () => GALYA_DEFAULT_API_V1_BASE_URL,
GalyaApiClient: () => GalyaApiClient,

@@ -34,3 +36,8 @@ GalyaApiError: () => GalyaApiError,

// src/constants.ts
var GALYA_DEFAULT_API_V1_BASE_URL = "https://api.galya.io/v1";
var GALYA_DEFAULT_API_ORIGIN = "https://api.galya.io";
// src/client.ts
var import_schema = require("@galya/schema");
var GalyaApiError = class extends Error {

@@ -67,2 +74,3 @@ constructor(message, status, code, body) {

apiKey;
workspaceId;
fetchImpl;

@@ -74,4 +82,16 @@ constructor(opts) {

}
this.baseUrl = trimSlash(opts.baseUrl);
if ((0, import_schema.isAccountPublishableApiKey)(apiKey) || !(0, import_schema.isApiRouteKey)(apiKey)) {
throw new Error(
"GalyaApiClient: publishable keys are for browser ingest only; use a workspace secret (galya_wsk_\u2026) or account secret (galya_sk_\u2026)"
);
}
const workspaceId = opts.workspaceId?.trim() ?? "";
if ((0, import_schema.requiresWorkspaceIdHeader)(apiKey) && !workspaceId) {
throw new Error(
"GalyaApiClient: workspaceId is required when using account secret keys (galya_sk_\u2026); workspace secret keys (galya_wsk_\u2026) do not need it"
);
}
this.baseUrl = galyaApiV1BaseUrl(opts.baseUrl ?? GALYA_DEFAULT_API_V1_BASE_URL);
this.apiKey = apiKey;
this.workspaceId = workspaceId || void 0;
this.fetchImpl = opts.fetch ?? globalThis.fetch.bind(globalThis);

@@ -94,2 +114,5 @@ }

};
if (this.workspaceId) {
headers["X-Galya-Workspace-Id"] = this.workspaceId;
}
let body;

@@ -624,2 +647,4 @@ if (init?.body !== void 0) {

GALYA_AGENT_TOOL_NAMES,
GALYA_DEFAULT_API_ORIGIN,
GALYA_DEFAULT_API_V1_BASE_URL,
GalyaApiClient,

@@ -626,0 +651,0 @@ GalyaApiError,

+1
-1

@@ -1,1 +0,1 @@

{"version":3,"sources":["../src/index.ts","../src/client.ts","../src/tools.ts"],"sourcesContent":["export * from \"./types.js\";\nexport {\n GalyaApiClient,\n GalyaApiError,\n galyaApiV1BaseUrl,\n type GalyaApiClientOptions,\n} from \"./client.js\";\nexport {\n GALYA_AGENT_TOOL_NAMES,\n executeGalyaAgentTool,\n galyaAgentToolDefinitions,\n openAiFunctionTools,\n type GalyaAgentToolDefinition,\n type GalyaAgentToolName,\n type OpenAiFunctionTool,\n type ToolParametersSchema,\n} from \"./tools.js\";\n","import type { ApiErrorBody } from \"./types.js\";\nimport type {\n AskRequest,\n Cluster,\n ContentObject,\n CreateEntityRequest,\n CreateEntityResult,\n DeleteEntityResult,\n Domain,\n Entity,\n ExplainRequest,\n ExplainResult,\n IndexBatchRequest,\n IndexBatchResult,\n IndexRequest,\n IndexResult,\n ListClustersResult,\n RerankRequest,\n RerankResult,\n SearchRequest,\n SearchResult,\n Task,\n} from \"./types.js\";\n\nexport class GalyaApiError extends Error {\n constructor(\n message: string,\n readonly status: number,\n readonly code?: string,\n readonly body?: unknown,\n ) {\n super(message);\n this.name = \"GalyaApiError\";\n }\n}\n\nexport type GalyaApiClientOptions = {\n /** Base URL including `/v1`, e.g. `https://api.galya-ai.com/v1` or your Worker `/v1` URL. */\n baseUrl: string;\n /** Sent as `X-API-Key` (same secret as dashboard / KV). */\n apiKey: string;\n /** Override fetch (tests, edge proxies). */\n fetch?: typeof fetch;\n};\n\nfunction trimSlash(s: string): string {\n return s.replace(/\\/+$/, \"\");\n}\n\n/** Normalize user input so requests hit `/v1/...` paths. */\nexport function galyaApiV1BaseUrl(input: string): string {\n const t = input.trim();\n if (!t) {\n throw new Error(\"galyaApiV1BaseUrl: empty URL\");\n }\n const noTrail = trimSlash(t);\n return noTrail.endsWith(\"/v1\") ? noTrail : `${noTrail}/v1`;\n}\n\nfunction joinUrl(base: string, path: string): string {\n const b = trimSlash(base);\n const p = path.startsWith(\"/\") ? path : `/${path}`;\n return `${b}${p}`;\n}\n\nexport class GalyaApiClient {\n private readonly baseUrl: string;\n private readonly apiKey: string;\n private readonly fetchImpl: typeof fetch;\n\n constructor(opts: GalyaApiClientOptions) {\n const apiKey = opts.apiKey.trim();\n if (!apiKey) {\n throw new Error(\"GalyaApiClient: apiKey is required\");\n }\n this.baseUrl = trimSlash(opts.baseUrl);\n this.apiKey = apiKey;\n this.fetchImpl = opts.fetch ?? globalThis.fetch.bind(globalThis);\n }\n\n private async request<T>(\n method: string,\n path: string,\n init?: { query?: Record<string, string | undefined>; body?: unknown },\n ): Promise<T> {\n let url = joinUrl(this.baseUrl, path);\n if (init?.query) {\n const u = new URL(url);\n for (const [k, v] of Object.entries(init.query)) {\n if (v !== undefined && v !== \"\") {\n u.searchParams.set(k, v);\n }\n }\n url = u.toString();\n }\n const headers: Record<string, string> = {\n \"X-API-Key\": this.apiKey,\n Accept: \"application/json\",\n };\n let body: string | undefined;\n if (init?.body !== undefined) {\n headers[\"Content-Type\"] = \"application/json\";\n body = JSON.stringify(init.body);\n }\n const res = await this.fetchImpl(url, { method, headers, body });\n const text = await res.text();\n let parsed: unknown = null;\n if (text) {\n try {\n parsed = JSON.parse(text) as unknown;\n } catch {\n parsed = text;\n }\n }\n if (!res.ok) {\n const errObj =\n parsed && typeof parsed === \"object\" && parsed !== null && \"error\" in parsed\n ? (parsed as ApiErrorBody)\n : undefined;\n throw new GalyaApiError(\n errObj?.error ?? `HTTP ${res.status}`,\n res.status,\n errObj?.code,\n parsed,\n );\n }\n return parsed as T;\n }\n\n async search(\n params: {\n relativeToEntityId: string;\n inTermsOfEntityType: string;\n },\n body: SearchRequest,\n ): Promise<SearchResult> {\n return this.request<SearchResult>(\"POST\", \"/search\", {\n query: {\n relative_to_entity_id: params.relativeToEntityId,\n in_terms_of_entity_type: params.inTermsOfEntityType,\n },\n body,\n });\n }\n\n async rerank(\n params: {\n relativeToEntityId: string;\n inTermsOfEntityType: string;\n },\n body: RerankRequest,\n ): Promise<RerankResult> {\n return this.request<RerankResult>(\"POST\", \"/rerank\", {\n query: {\n relative_to_entity_id: params.relativeToEntityId,\n in_terms_of_entity_type: params.inTermsOfEntityType,\n },\n body,\n });\n }\n\n async ask(\n params: {\n relativeToEntityId: string;\n inTermsOfEntityType: string;\n },\n body: AskRequest,\n ): Promise<unknown> {\n return this.request<unknown>(\"POST\", \"/ask\", {\n query: {\n relative_to_entity_id: params.relativeToEntityId,\n in_terms_of_entity_type: params.inTermsOfEntityType,\n },\n body,\n });\n }\n\n async explain(\n params: {\n relativeToEntityId: string;\n inTermsOfEntityType: string;\n domain?: Domain;\n task?: Task;\n },\n body: ExplainRequest,\n ): Promise<ExplainResult> {\n return this.request<ExplainResult>(\"POST\", \"/explain\", {\n query: {\n relative_to_entity_id: params.relativeToEntityId,\n in_terms_of_entity_type: params.inTermsOfEntityType,\n domain: params.domain,\n task: params.task,\n },\n body,\n });\n }\n\n async indexContent(body: IndexRequest): Promise<IndexResult> {\n return this.request<IndexResult>(\"POST\", \"/index\", { body });\n }\n\n async indexContentBatch(body: IndexBatchRequest): Promise<IndexBatchResult> {\n return this.request<IndexBatchResult>(\"POST\", \"/index/batch\", { body });\n }\n\n async createEntity(body: CreateEntityRequest): Promise<CreateEntityResult> {\n return this.request<CreateEntityResult>(\"POST\", \"/entity\", { body });\n }\n\n async getEntity(entityId: string): Promise<Entity> {\n return this.request<Entity>(\"GET\", \"/entity\", {\n query: { entity_id: entityId },\n });\n }\n\n async deleteEntity(entityId: string): Promise<DeleteEntityResult> {\n return this.request<DeleteEntityResult>(\"DELETE\", \"/entity\", {\n query: { entity_id: entityId },\n });\n }\n\n async registerEntityType(entityType: string): Promise<{ success?: boolean }> {\n return this.request<{ success?: boolean }>(\"POST\", \"/entity/type\", {\n body: { entity_type: entityType },\n });\n }\n\n async getEntityType(entityType: string): Promise<unknown> {\n return this.request<unknown>(\"GET\", \"/entity/type\", {\n query: { entity_type: entityType },\n });\n }\n\n async listClusters(params?: {\n limit?: number;\n offset?: number;\n entityType?: string;\n }): Promise<ListClustersResult> {\n const q: Record<string, string | undefined> = {};\n if (params?.limit !== undefined) {\n q.limit = String(params.limit);\n }\n if (params?.offset !== undefined) {\n q.offset = String(params.offset);\n }\n if (params?.entityType) {\n q.entity_type = params.entityType;\n }\n return this.request<ListClustersResult>(\"GET\", \"/clusters\", { query: q });\n }\n\n async getCluster(clusterId: string): Promise<Cluster> {\n return this.request<Cluster>(\"GET\", \"/cluster\", {\n query: { cluster_id: clusterId },\n });\n }\n\n /**\n * Typed helper for rerank/search when candidates come from tool args as plain JSON.\n * Ensures each candidate has required `url` and `type`.\n */\n normalizeCandidates(raw: unknown): ContentObject[] {\n if (!Array.isArray(raw)) {\n return [];\n }\n const out: ContentObject[] = [];\n for (const item of raw) {\n if (!item || typeof item !== \"object\") continue;\n const o = item as Record<string, unknown>;\n const url = typeof o.url === \"string\" ? o.url : \"\";\n const typeRaw = o.type;\n const type =\n typeRaw === \"image\" || typeRaw === \"text\" || typeRaw === \"audio\" || typeRaw === \"video\"\n ? typeRaw\n : \"text\";\n if (!url.trim()) continue;\n out.push({\n id: typeof o.id === \"string\" ? o.id : undefined,\n title: typeof o.title === \"string\" ? o.title : undefined,\n description: typeof o.description === \"string\" ? o.description : undefined,\n url,\n content: typeof o.content === \"string\" ? o.content : undefined,\n type,\n });\n }\n return out;\n }\n}\n","import type { GalyaApiClient } from \"./client.js\";\n\n/** JSON Schema–style object passed to OpenAI / Anthropic–compatible tool routers */\nexport type ToolParametersSchema = {\n type: \"object\";\n properties: Record<string, unknown>;\n required?: string[];\n additionalProperties?: boolean;\n};\n\nexport type GalyaAgentToolDefinition = {\n name: GalyaAgentToolName;\n description: string;\n parameters: ToolParametersSchema;\n};\n\nexport const GALYA_AGENT_TOOL_NAMES = [\n \"galya_search\",\n \"galya_rerank\",\n \"galya_ask\",\n \"galya_explain\",\n \"galya_index_content\",\n \"galya_index_content_batch\",\n \"galya_create_entity\",\n \"galya_get_entity\",\n \"galya_delete_entity\",\n \"galya_register_entity_type\",\n \"galya_get_entity_type\",\n \"galya_list_clusters\",\n \"galya_get_cluster\",\n] as const;\n\nexport type GalyaAgentToolName = (typeof GALYA_AGENT_TOOL_NAMES)[number];\n\nconst entityTypeEnum = [\"content\", \"place\", \"brand\", \"user\", \"website\", \"file\"] as const;\n\nconst contentTypeEnum = [\"image\", \"text\", \"audio\", \"video\"] as const;\n\nconst contentObjectSchema: Record<string, unknown> = {\n type: \"object\",\n properties: {\n id: { type: \"string\", description: \"Optional stable id for this artifact.\" },\n title: { type: \"string\" },\n description: { type: \"string\" },\n url: { type: \"string\", description: \"Required. Canonical URL for dedup / identity.\" },\n content: { type: \"string\", description: \"Inline body text when no public URL.\" },\n type: { type: \"string\", enum: [...contentTypeEnum], description: \"MIME-ish media class.\" },\n },\n required: [\"url\", \"type\"],\n};\n\n/** Stable ordering for agent prompts — matches {@link GALYA_AGENT_TOOL_NAMES} intent */\nexport const galyaAgentToolDefinitions: GalyaAgentToolDefinition[] = [\n {\n name: \"galya_search\",\n description:\n \"Search the Galya taste graph for entities ranked by affinity to a reference entity. Sends POST /v1/search.\",\n parameters: {\n type: \"object\",\n properties: {\n relative_to_entity_id: {\n type: \"string\",\n description: \"Entity id whose taste profile anchors ranking.\",\n },\n in_terms_of_entity_type: {\n type: \"string\",\n enum: [...entityTypeEnum],\n description: \"Restrict results to this entity type.\",\n },\n query: { type: \"string\", description: \"Natural-language query.\" },\n additional_candidates: {\n type: \"array\",\n description: \"Optional unindexed content rows scored at query time (not persisted).\",\n items: contentObjectSchema,\n },\n },\n required: [\"relative_to_entity_id\", \"in_terms_of_entity_type\", \"query\"],\n additionalProperties: false,\n },\n },\n {\n name: \"galya_rerank\",\n description:\n \"Rerank caller-supplied content candidates by affinity to a reference entity (POST /v1/rerank). Candidates are not persisted.\",\n parameters: {\n type: \"object\",\n properties: {\n relative_to_entity_id: { type: \"string\" },\n in_terms_of_entity_type: { type: \"string\", enum: [...entityTypeEnum] },\n candidates: {\n type: \"array\",\n items: contentObjectSchema,\n description: \"Each item must include url and type.\",\n },\n },\n required: [\"relative_to_entity_id\", \"in_terms_of_entity_type\", \"candidates\"],\n additionalProperties: false,\n },\n },\n {\n name: \"galya_ask\",\n description:\n \"Taste-personalized answer (POST /v1/ask). Server may return 501 until LLM routing is implemented.\",\n parameters: {\n type: \"object\",\n properties: {\n relative_to_entity_id: { type: \"string\" },\n in_terms_of_entity_type: { type: \"string\", enum: [...entityTypeEnum] },\n query: { type: \"string\" },\n },\n required: [\"relative_to_entity_id\", \"in_terms_of_entity_type\", \"query\"],\n additionalProperties: false,\n },\n },\n {\n name: \"galya_explain\",\n description:\n \"Explain entity affinities for agents (POST /v1/explain). Optional domain/task hints.\",\n parameters: {\n type: \"object\",\n properties: {\n relative_to_entity_id: { type: \"string\" },\n in_terms_of_entity_type: { type: \"string\", enum: [...entityTypeEnum] },\n query: { type: \"string\" },\n domain: {\n type: \"string\",\n enum: [\"discovery\", \"design\", \"decisions\", \"data\"],\n },\n task: {\n type: \"string\",\n enum: [\"coding-agent\", \"commerce-agent\", \"design-agent\", \"insight-agent\"],\n },\n },\n required: [\"relative_to_entity_id\", \"in_terms_of_entity_type\", \"query\"],\n additionalProperties: false,\n },\n },\n {\n name: \"galya_index_content\",\n description:\n \"Index or resolve a content URL into a content entity (POST /v1/index). May be 501 until indexing pipeline exists.\",\n parameters: {\n type: \"object\",\n properties: {\n content: contentObjectSchema,\n entity_id: {\n type: \"string\",\n description: \"Optional graph node to attach after indexing.\",\n },\n },\n required: [\"content\"],\n additionalProperties: false,\n },\n },\n {\n name: \"galya_index_content_batch\",\n description: \"Batch index content objects (POST /v1/index/batch). Same semantics as single index per item.\",\n parameters: {\n type: \"object\",\n properties: {\n content: { type: \"array\", items: contentObjectSchema },\n entity_ids: {\n type: \"array\",\n description: \"Parallel optional attachment ids; use null for standalone rows.\",\n items: {\n anyOf: [{ type: \"string\" }, { type: \"null\" }],\n },\n },\n },\n required: [\"content\"],\n additionalProperties: false,\n },\n },\n {\n name: \"galya_create_entity\",\n description:\n \"Create a non-content entity (POST /v1/entity). Content entities must use index_content instead.\",\n parameters: {\n type: \"object\",\n properties: {\n entity_type: { type: \"string\", enum: [...entityTypeEnum] },\n name: { type: \"string\" },\n description: { type: \"string\" },\n },\n required: [\"entity_type\", \"name\"],\n additionalProperties: false,\n },\n },\n {\n name: \"galya_get_entity\",\n description: \"Fetch one entity by id (GET /v1/entity).\",\n parameters: {\n type: \"object\",\n properties: {\n entity_id: { type: \"string\" },\n },\n required: [\"entity_id\"],\n additionalProperties: false,\n },\n },\n {\n name: \"galya_delete_entity\",\n description: \"Delete an entity by id (DELETE /v1/entity).\",\n parameters: {\n type: \"object\",\n properties: {\n entity_id: { type: \"string\" },\n },\n required: [\"entity_id\"],\n additionalProperties: false,\n },\n },\n {\n name: \"galya_register_entity_type\",\n description: \"Register a custom entity type (POST /v1/entity/type). May be 501 on server.\",\n parameters: {\n type: \"object\",\n properties: {\n entity_type: { type: \"string\" },\n },\n required: [\"entity_type\"],\n additionalProperties: false,\n },\n },\n {\n name: \"galya_get_entity_type\",\n description: \"Fetch custom type metadata (GET /v1/entity/type).\",\n parameters: {\n type: \"object\",\n properties: {\n entity_type: { type: \"string\" },\n },\n required: [\"entity_type\"],\n additionalProperties: false,\n },\n },\n {\n name: \"galya_list_clusters\",\n description: \"List clusters in the workspace (GET /v1/clusters).\",\n parameters: {\n type: \"object\",\n properties: {\n limit: { type: \"integer\" },\n offset: { type: \"integer\" },\n entity_type: { type: \"string\", enum: [...entityTypeEnum] },\n },\n additionalProperties: false,\n },\n },\n {\n name: \"galya_get_cluster\",\n description: \"Fetch one cluster by id (GET /v1/cluster). May be 501 on server.\",\n parameters: {\n type: \"object\",\n properties: {\n cluster_id: { type: \"string\" },\n },\n required: [\"cluster_id\"],\n additionalProperties: false,\n },\n },\n];\n\n/** OpenAI Chat Completions `tools[]` entry shape (also works with many proxies). */\nexport type OpenAiFunctionTool = {\n type: \"function\";\n function: {\n name: string;\n description: string;\n parameters: Record<string, unknown>;\n };\n};\n\nexport function openAiFunctionTools(defs: GalyaAgentToolDefinition[] = galyaAgentToolDefinitions): OpenAiFunctionTool[] {\n return defs.map((t) => ({\n type: \"function\",\n function: {\n name: t.name,\n description: t.description,\n parameters: t.parameters as unknown as Record<string, unknown>,\n },\n }));\n}\n\nfunction asRecord(args: unknown): Record<string, unknown> {\n if (!args || typeof args !== \"object\" || Array.isArray(args)) {\n throw new Error(\"tool arguments must be a JSON object\");\n }\n return args as Record<string, unknown>;\n}\n\nfunction reqStr(o: Record<string, unknown>, key: string): string {\n const v = o[key];\n if (typeof v !== \"string\" || !v.trim()) {\n throw new Error(`${key} must be a non-empty string`);\n }\n return v.trim();\n}\n\nfunction optStr(o: Record<string, unknown>, key: string): string | undefined {\n const v = o[key];\n if (v === undefined || v === null) return undefined;\n if (typeof v !== \"string\") {\n throw new Error(`${key} must be a string`);\n }\n const t = v.trim();\n return t === \"\" ? undefined : t;\n}\n\nfunction optNum(o: Record<string, unknown>, key: string): number | undefined {\n const v = o[key];\n if (v === undefined || v === null) return undefined;\n if (typeof v !== \"number\" || !Number.isFinite(v)) {\n throw new Error(`${key} must be a finite number`);\n }\n return v;\n}\n\nfunction parseContentObject(raw: unknown): import(\"./types.js\").ContentObject {\n const o = asRecord(raw);\n return {\n id: optStr(o, \"id\"),\n title: optStr(o, \"title\"),\n description: optStr(o, \"description\"),\n url: reqStr(o, \"url\"),\n content: optStr(o, \"content\"),\n type: reqStr(o, \"type\") as import(\"./types.js\").ContentObject[\"type\"],\n };\n}\n\n/**\n * Dispatch a tool call by name. Suitable for wiring `tool_calls` from OpenAI / Anthropic / Gemini.\n *\n * @returns Parsed JSON-serializable API response (throw {@link GalyaApiError} on HTTP errors).\n */\nexport async function executeGalyaAgentTool(\n client: GalyaApiClient,\n name: string,\n args: unknown,\n): Promise<unknown> {\n const o = asRecord(args);\n\n switch (name as GalyaAgentToolName) {\n case \"galya_search\": {\n const additional = o.additional_candidates;\n const candidates =\n Array.isArray(additional) ? additional.map(parseContentObject) : undefined;\n return client.search(\n {\n relativeToEntityId: reqStr(o, \"relative_to_entity_id\"),\n inTermsOfEntityType: reqStr(o, \"in_terms_of_entity_type\"),\n },\n {\n query: reqStr(o, \"query\"),\n ...(candidates?.length ? { additional_candidates: candidates } : {}),\n },\n );\n }\n case \"galya_rerank\": {\n const raw = o.candidates;\n if (!Array.isArray(raw)) {\n throw new Error(\"candidates must be an array\");\n }\n return client.rerank(\n {\n relativeToEntityId: reqStr(o, \"relative_to_entity_id\"),\n inTermsOfEntityType: reqStr(o, \"in_terms_of_entity_type\"),\n },\n { candidates: raw.map(parseContentObject) },\n );\n }\n case \"galya_ask\":\n return client.ask(\n {\n relativeToEntityId: reqStr(o, \"relative_to_entity_id\"),\n inTermsOfEntityType: reqStr(o, \"in_terms_of_entity_type\"),\n },\n { query: reqStr(o, \"query\") },\n );\n case \"galya_explain\":\n return client.explain(\n {\n relativeToEntityId: reqStr(o, \"relative_to_entity_id\"),\n inTermsOfEntityType: reqStr(o, \"in_terms_of_entity_type\"),\n domain: optStr(o, \"domain\") as import(\"./types.js\").Domain | undefined,\n task: optStr(o, \"task\") as import(\"./types.js\").Task | undefined,\n },\n { query: reqStr(o, \"query\") },\n );\n case \"galya_index_content\":\n return client.indexContent({\n content: parseContentObject(o.content),\n entity_id: optStr(o, \"entity_id\"),\n });\n case \"galya_index_content_batch\": {\n const items = o.content;\n if (!Array.isArray(items)) {\n throw new Error(\"content must be an array\");\n }\n const entityIdsRaw = o.entity_ids;\n let entity_ids: (string | null)[] | undefined;\n if (entityIdsRaw !== undefined) {\n if (!Array.isArray(entityIdsRaw)) {\n throw new Error(\"entity_ids must be an array\");\n }\n entity_ids = entityIdsRaw.map((x) => {\n if (x === null) return null;\n if (typeof x === \"string\") return x;\n throw new Error(\"entity_ids entries must be string or null\");\n });\n }\n return client.indexContentBatch({\n content: items.map(parseContentObject),\n ...(entity_ids ? { entity_ids } : {}),\n });\n }\n case \"galya_create_entity\":\n return client.createEntity({\n entity_type: reqStr(o, \"entity_type\") as import(\"./types.js\").EntityType,\n name: reqStr(o, \"name\"),\n description: optStr(o, \"description\"),\n });\n case \"galya_get_entity\":\n return client.getEntity(reqStr(o, \"entity_id\"));\n case \"galya_delete_entity\":\n return client.deleteEntity(reqStr(o, \"entity_id\"));\n case \"galya_register_entity_type\":\n return client.registerEntityType(reqStr(o, \"entity_type\"));\n case \"galya_get_entity_type\":\n return client.getEntityType(reqStr(o, \"entity_type\"));\n case \"galya_list_clusters\":\n return client.listClusters({\n limit: optNum(o, \"limit\"),\n offset: optNum(o, \"offset\"),\n entityType: optStr(o, \"entity_type\"),\n });\n case \"galya_get_cluster\":\n return client.getCluster(reqStr(o, \"cluster_id\"));\n default:\n throw new Error(`Unknown Galya tool: ${name}`);\n }\n}\n"],"mappings":"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","names":[]}
{"version":3,"sources":["../src/index.ts","../src/constants.ts","../src/client.ts","../src/tools.ts"],"sourcesContent":["export * from \"./types.js\";\nexport {\n GALYA_DEFAULT_API_ORIGIN,\n GALYA_DEFAULT_API_V1_BASE_URL,\n} from \"./constants.js\";\nexport {\n GalyaApiClient,\n GalyaApiError,\n galyaApiV1BaseUrl,\n type GalyaApiClientOptions,\n} from \"./client.js\";\nexport {\n GALYA_AGENT_TOOL_NAMES,\n executeGalyaAgentTool,\n galyaAgentToolDefinitions,\n openAiFunctionTools,\n type GalyaAgentToolDefinition,\n type GalyaAgentToolName,\n type OpenAiFunctionTool,\n type ToolParametersSchema,\n} from \"./tools.js\";\n","/** Default production Galya API base URL (includes `/v1`). */\nexport const GALYA_DEFAULT_API_V1_BASE_URL = \"https://api.galya.io/v1\";\n\n/** Origin without path (no trailing slash). */\nexport const GALYA_DEFAULT_API_ORIGIN = \"https://api.galya.io\";\n","import { isAccountPublishableApiKey, isApiRouteKey, requiresWorkspaceIdHeader } from \"@galya/schema\";\nimport { GALYA_DEFAULT_API_V1_BASE_URL } from \"./constants.js\";\nimport type { ApiErrorBody } from \"./types.js\";\nimport type {\n AskRequest,\n Cluster,\n ContentObject,\n CreateEntityRequest,\n CreateEntityResult,\n DeleteEntityResult,\n Domain,\n Entity,\n ExplainRequest,\n ExplainResult,\n IndexBatchRequest,\n IndexBatchResult,\n IndexRequest,\n IndexResult,\n ListClustersResult,\n RerankRequest,\n RerankResult,\n SearchRequest,\n SearchResult,\n Task,\n} from \"./types.js\";\n\nexport class GalyaApiError extends Error {\n constructor(\n message: string,\n readonly status: number,\n readonly code?: string,\n readonly body?: unknown,\n ) {\n super(message);\n this.name = \"GalyaApiError\";\n }\n}\n\nexport type GalyaApiClientOptions = {\n /**\n * Base URL including `/v1`. Defaults to {@link GALYA_DEFAULT_API_V1_BASE_URL}\n * (`https://api.galya.io/v1`).\n */\n baseUrl?: string;\n /** Workspace secret `galya_wsk_…` or account secret `galya_sk_…` (sent as `X-API-Key`). */\n apiKey: string;\n /** Required for account secret keys — workspace `publicId` (`X-Galya-Workspace-Id`). */\n workspaceId?: string;\n /** Override fetch (tests, edge proxies). */\n fetch?: typeof fetch;\n};\n\nfunction trimSlash(s: string): string {\n return s.replace(/\\/+$/, \"\");\n}\n\n/** Normalize user input so requests hit `/v1/...` paths. */\nexport function galyaApiV1BaseUrl(input: string): string {\n const t = input.trim();\n if (!t) {\n throw new Error(\"galyaApiV1BaseUrl: empty URL\");\n }\n const noTrail = trimSlash(t);\n return noTrail.endsWith(\"/v1\") ? noTrail : `${noTrail}/v1`;\n}\n\nfunction joinUrl(base: string, path: string): string {\n const b = trimSlash(base);\n const p = path.startsWith(\"/\") ? path : `/${path}`;\n return `${b}${p}`;\n}\n\nexport class GalyaApiClient {\n private readonly baseUrl: string;\n private readonly apiKey: string;\n private readonly workspaceId?: string;\n private readonly fetchImpl: typeof fetch;\n\n constructor(opts: GalyaApiClientOptions) {\n const apiKey = opts.apiKey.trim();\n if (!apiKey) {\n throw new Error(\"GalyaApiClient: apiKey is required\");\n }\n if (isAccountPublishableApiKey(apiKey) || !isApiRouteKey(apiKey)) {\n throw new Error(\n \"GalyaApiClient: publishable keys are for browser ingest only; use a workspace secret (galya_wsk_…) or account secret (galya_sk_…)\",\n );\n }\n const workspaceId = opts.workspaceId?.trim() ?? \"\";\n if (requiresWorkspaceIdHeader(apiKey) && !workspaceId) {\n throw new Error(\n \"GalyaApiClient: workspaceId is required when using account secret keys (galya_sk_…); workspace secret keys (galya_wsk_…) do not need it\",\n );\n }\n this.baseUrl = galyaApiV1BaseUrl(opts.baseUrl ?? GALYA_DEFAULT_API_V1_BASE_URL);\n this.apiKey = apiKey;\n this.workspaceId = workspaceId || undefined;\n this.fetchImpl = opts.fetch ?? globalThis.fetch.bind(globalThis);\n }\n\n private async request<T>(\n method: string,\n path: string,\n init?: { query?: Record<string, string | undefined>; body?: unknown },\n ): Promise<T> {\n let url = joinUrl(this.baseUrl, path);\n if (init?.query) {\n const u = new URL(url);\n for (const [k, v] of Object.entries(init.query)) {\n if (v !== undefined && v !== \"\") {\n u.searchParams.set(k, v);\n }\n }\n url = u.toString();\n }\n const headers: Record<string, string> = {\n \"X-API-Key\": this.apiKey,\n Accept: \"application/json\",\n };\n if (this.workspaceId) {\n headers[\"X-Galya-Workspace-Id\"] = this.workspaceId;\n }\n let body: string | undefined;\n if (init?.body !== undefined) {\n headers[\"Content-Type\"] = \"application/json\";\n body = JSON.stringify(init.body);\n }\n const res = await this.fetchImpl(url, { method, headers, body });\n const text = await res.text();\n let parsed: unknown = null;\n if (text) {\n try {\n parsed = JSON.parse(text) as unknown;\n } catch {\n parsed = text;\n }\n }\n if (!res.ok) {\n const errObj =\n parsed && typeof parsed === \"object\" && parsed !== null && \"error\" in parsed\n ? (parsed as ApiErrorBody)\n : undefined;\n throw new GalyaApiError(\n errObj?.error ?? `HTTP ${res.status}`,\n res.status,\n errObj?.code,\n parsed,\n );\n }\n return parsed as T;\n }\n\n async search(\n params: {\n relativeToEntityId: string;\n inTermsOfEntityType: string;\n },\n body: SearchRequest,\n ): Promise<SearchResult> {\n return this.request<SearchResult>(\"POST\", \"/search\", {\n query: {\n relative_to_entity_id: params.relativeToEntityId,\n in_terms_of_entity_type: params.inTermsOfEntityType,\n },\n body,\n });\n }\n\n async rerank(\n params: {\n relativeToEntityId: string;\n inTermsOfEntityType: string;\n },\n body: RerankRequest,\n ): Promise<RerankResult> {\n return this.request<RerankResult>(\"POST\", \"/rerank\", {\n query: {\n relative_to_entity_id: params.relativeToEntityId,\n in_terms_of_entity_type: params.inTermsOfEntityType,\n },\n body,\n });\n }\n\n async ask(\n params: {\n relativeToEntityId: string;\n inTermsOfEntityType: string;\n },\n body: AskRequest,\n ): Promise<unknown> {\n return this.request<unknown>(\"POST\", \"/ask\", {\n query: {\n relative_to_entity_id: params.relativeToEntityId,\n in_terms_of_entity_type: params.inTermsOfEntityType,\n },\n body,\n });\n }\n\n async explain(\n params: {\n relativeToEntityId: string;\n inTermsOfEntityType: string;\n domain?: Domain;\n task?: Task;\n },\n body: ExplainRequest,\n ): Promise<ExplainResult> {\n return this.request<ExplainResult>(\"POST\", \"/explain\", {\n query: {\n relative_to_entity_id: params.relativeToEntityId,\n in_terms_of_entity_type: params.inTermsOfEntityType,\n domain: params.domain,\n task: params.task,\n },\n body,\n });\n }\n\n async indexContent(body: IndexRequest): Promise<IndexResult> {\n return this.request<IndexResult>(\"POST\", \"/index\", { body });\n }\n\n async indexContentBatch(body: IndexBatchRequest): Promise<IndexBatchResult> {\n return this.request<IndexBatchResult>(\"POST\", \"/index/batch\", { body });\n }\n\n async createEntity(body: CreateEntityRequest): Promise<CreateEntityResult> {\n return this.request<CreateEntityResult>(\"POST\", \"/entity\", { body });\n }\n\n async getEntity(entityId: string): Promise<Entity> {\n return this.request<Entity>(\"GET\", \"/entity\", {\n query: { entity_id: entityId },\n });\n }\n\n async deleteEntity(entityId: string): Promise<DeleteEntityResult> {\n return this.request<DeleteEntityResult>(\"DELETE\", \"/entity\", {\n query: { entity_id: entityId },\n });\n }\n\n async registerEntityType(entityType: string): Promise<{ success?: boolean }> {\n return this.request<{ success?: boolean }>(\"POST\", \"/entity/type\", {\n body: { entity_type: entityType },\n });\n }\n\n async getEntityType(entityType: string): Promise<unknown> {\n return this.request<unknown>(\"GET\", \"/entity/type\", {\n query: { entity_type: entityType },\n });\n }\n\n async listClusters(params?: {\n limit?: number;\n offset?: number;\n entityType?: string;\n }): Promise<ListClustersResult> {\n const q: Record<string, string | undefined> = {};\n if (params?.limit !== undefined) {\n q.limit = String(params.limit);\n }\n if (params?.offset !== undefined) {\n q.offset = String(params.offset);\n }\n if (params?.entityType) {\n q.entity_type = params.entityType;\n }\n return this.request<ListClustersResult>(\"GET\", \"/clusters\", { query: q });\n }\n\n async getCluster(clusterId: string): Promise<Cluster> {\n return this.request<Cluster>(\"GET\", \"/cluster\", {\n query: { cluster_id: clusterId },\n });\n }\n\n /**\n * Typed helper for rerank/search when candidates come from tool args as plain JSON.\n * Ensures each candidate has required `url` and `type`.\n */\n normalizeCandidates(raw: unknown): ContentObject[] {\n if (!Array.isArray(raw)) {\n return [];\n }\n const out: ContentObject[] = [];\n for (const item of raw) {\n if (!item || typeof item !== \"object\") continue;\n const o = item as Record<string, unknown>;\n const url = typeof o.url === \"string\" ? o.url : \"\";\n const typeRaw = o.type;\n const type =\n typeRaw === \"image\" || typeRaw === \"text\" || typeRaw === \"audio\" || typeRaw === \"video\"\n ? typeRaw\n : \"text\";\n if (!url.trim()) continue;\n out.push({\n id: typeof o.id === \"string\" ? o.id : undefined,\n title: typeof o.title === \"string\" ? o.title : undefined,\n description: typeof o.description === \"string\" ? o.description : undefined,\n url,\n content: typeof o.content === \"string\" ? o.content : undefined,\n type,\n });\n }\n return out;\n }\n}\n","import type { GalyaApiClient } from \"./client.js\";\n\n/** JSON Schema–style object passed to OpenAI / Anthropic–compatible tool routers */\nexport type ToolParametersSchema = {\n type: \"object\";\n properties: Record<string, unknown>;\n required?: string[];\n additionalProperties?: boolean;\n};\n\nexport type GalyaAgentToolDefinition = {\n name: GalyaAgentToolName;\n description: string;\n parameters: ToolParametersSchema;\n};\n\nexport const GALYA_AGENT_TOOL_NAMES = [\n \"galya_search\",\n \"galya_rerank\",\n \"galya_ask\",\n \"galya_explain\",\n \"galya_index_content\",\n \"galya_index_content_batch\",\n \"galya_create_entity\",\n \"galya_get_entity\",\n \"galya_delete_entity\",\n \"galya_register_entity_type\",\n \"galya_get_entity_type\",\n \"galya_list_clusters\",\n \"galya_get_cluster\",\n] as const;\n\nexport type GalyaAgentToolName = (typeof GALYA_AGENT_TOOL_NAMES)[number];\n\nconst entityTypeEnum = [\"content\", \"place\", \"brand\", \"user\", \"website\", \"file\"] as const;\n\nconst contentTypeEnum = [\"image\", \"text\", \"audio\", \"video\"] as const;\n\nconst contentObjectSchema: Record<string, unknown> = {\n type: \"object\",\n properties: {\n id: { type: \"string\", description: \"Optional stable id for this artifact.\" },\n title: { type: \"string\" },\n description: { type: \"string\" },\n url: { type: \"string\", description: \"Required. Canonical URL for dedup / identity.\" },\n content: { type: \"string\", description: \"Inline body text when no public URL.\" },\n type: { type: \"string\", enum: [...contentTypeEnum], description: \"MIME-ish media class.\" },\n },\n required: [\"url\", \"type\"],\n};\n\n/** Stable ordering for agent prompts — matches {@link GALYA_AGENT_TOOL_NAMES} intent */\nexport const galyaAgentToolDefinitions: GalyaAgentToolDefinition[] = [\n {\n name: \"galya_search\",\n description:\n \"Search the Galya taste graph for entities ranked by affinity to a reference entity. Sends POST /v1/search.\",\n parameters: {\n type: \"object\",\n properties: {\n relative_to_entity_id: {\n type: \"string\",\n description: \"Entity id whose taste profile anchors ranking.\",\n },\n in_terms_of_entity_type: {\n type: \"string\",\n enum: [...entityTypeEnum],\n description: \"Restrict results to this entity type.\",\n },\n query: { type: \"string\", description: \"Natural-language query.\" },\n additional_candidates: {\n type: \"array\",\n description: \"Optional unindexed content rows scored at query time (not persisted).\",\n items: contentObjectSchema,\n },\n },\n required: [\"relative_to_entity_id\", \"in_terms_of_entity_type\", \"query\"],\n additionalProperties: false,\n },\n },\n {\n name: \"galya_rerank\",\n description:\n \"Rerank caller-supplied content candidates by affinity to a reference entity (POST /v1/rerank). Candidates are not persisted.\",\n parameters: {\n type: \"object\",\n properties: {\n relative_to_entity_id: { type: \"string\" },\n in_terms_of_entity_type: { type: \"string\", enum: [...entityTypeEnum] },\n candidates: {\n type: \"array\",\n items: contentObjectSchema,\n description: \"Each item must include url and type.\",\n },\n },\n required: [\"relative_to_entity_id\", \"in_terms_of_entity_type\", \"candidates\"],\n additionalProperties: false,\n },\n },\n {\n name: \"galya_ask\",\n description:\n \"Taste-personalized answer (POST /v1/ask). Server may return 501 until LLM routing is implemented.\",\n parameters: {\n type: \"object\",\n properties: {\n relative_to_entity_id: { type: \"string\" },\n in_terms_of_entity_type: { type: \"string\", enum: [...entityTypeEnum] },\n query: { type: \"string\" },\n },\n required: [\"relative_to_entity_id\", \"in_terms_of_entity_type\", \"query\"],\n additionalProperties: false,\n },\n },\n {\n name: \"galya_explain\",\n description:\n \"Explain entity affinities for agents (POST /v1/explain). Optional domain/task hints.\",\n parameters: {\n type: \"object\",\n properties: {\n relative_to_entity_id: { type: \"string\" },\n in_terms_of_entity_type: { type: \"string\", enum: [...entityTypeEnum] },\n query: { type: \"string\" },\n domain: {\n type: \"string\",\n enum: [\"discovery\", \"design\", \"decisions\", \"data\"],\n },\n task: {\n type: \"string\",\n enum: [\"coding-agent\", \"commerce-agent\", \"design-agent\", \"insight-agent\"],\n },\n },\n required: [\"relative_to_entity_id\", \"in_terms_of_entity_type\", \"query\"],\n additionalProperties: false,\n },\n },\n {\n name: \"galya_index_content\",\n description:\n \"Index or resolve a content URL into a content entity (POST /v1/index). May be 501 until indexing pipeline exists.\",\n parameters: {\n type: \"object\",\n properties: {\n content: contentObjectSchema,\n entity_id: {\n type: \"string\",\n description: \"Optional graph node to attach after indexing.\",\n },\n },\n required: [\"content\"],\n additionalProperties: false,\n },\n },\n {\n name: \"galya_index_content_batch\",\n description: \"Batch index content objects (POST /v1/index/batch). Same semantics as single index per item.\",\n parameters: {\n type: \"object\",\n properties: {\n content: { type: \"array\", items: contentObjectSchema },\n entity_ids: {\n type: \"array\",\n description: \"Parallel optional attachment ids; use null for standalone rows.\",\n items: {\n anyOf: [{ type: \"string\" }, { type: \"null\" }],\n },\n },\n },\n required: [\"content\"],\n additionalProperties: false,\n },\n },\n {\n name: \"galya_create_entity\",\n description:\n \"Create a non-content entity (POST /v1/entity). Content entities must use index_content instead.\",\n parameters: {\n type: \"object\",\n properties: {\n entity_type: { type: \"string\", enum: [...entityTypeEnum] },\n name: { type: \"string\" },\n description: { type: \"string\" },\n },\n required: [\"entity_type\", \"name\"],\n additionalProperties: false,\n },\n },\n {\n name: \"galya_get_entity\",\n description: \"Fetch one entity by id (GET /v1/entity).\",\n parameters: {\n type: \"object\",\n properties: {\n entity_id: { type: \"string\" },\n },\n required: [\"entity_id\"],\n additionalProperties: false,\n },\n },\n {\n name: \"galya_delete_entity\",\n description: \"Delete an entity by id (DELETE /v1/entity).\",\n parameters: {\n type: \"object\",\n properties: {\n entity_id: { type: \"string\" },\n },\n required: [\"entity_id\"],\n additionalProperties: false,\n },\n },\n {\n name: \"galya_register_entity_type\",\n description: \"Register a custom entity type (POST /v1/entity/type). May be 501 on server.\",\n parameters: {\n type: \"object\",\n properties: {\n entity_type: { type: \"string\" },\n },\n required: [\"entity_type\"],\n additionalProperties: false,\n },\n },\n {\n name: \"galya_get_entity_type\",\n description: \"Fetch custom type metadata (GET /v1/entity/type).\",\n parameters: {\n type: \"object\",\n properties: {\n entity_type: { type: \"string\" },\n },\n required: [\"entity_type\"],\n additionalProperties: false,\n },\n },\n {\n name: \"galya_list_clusters\",\n description: \"List clusters in the workspace (GET /v1/clusters).\",\n parameters: {\n type: \"object\",\n properties: {\n limit: { type: \"integer\" },\n offset: { type: \"integer\" },\n entity_type: { type: \"string\", enum: [...entityTypeEnum] },\n },\n additionalProperties: false,\n },\n },\n {\n name: \"galya_get_cluster\",\n description: \"Fetch one cluster by id (GET /v1/cluster). May be 501 on server.\",\n parameters: {\n type: \"object\",\n properties: {\n cluster_id: { type: \"string\" },\n },\n required: [\"cluster_id\"],\n additionalProperties: false,\n },\n },\n];\n\n/** OpenAI Chat Completions `tools[]` entry shape (also works with many proxies). */\nexport type OpenAiFunctionTool = {\n type: \"function\";\n function: {\n name: string;\n description: string;\n parameters: Record<string, unknown>;\n };\n};\n\nexport function openAiFunctionTools(defs: GalyaAgentToolDefinition[] = galyaAgentToolDefinitions): OpenAiFunctionTool[] {\n return defs.map((t) => ({\n type: \"function\",\n function: {\n name: t.name,\n description: t.description,\n parameters: t.parameters as unknown as Record<string, unknown>,\n },\n }));\n}\n\nfunction asRecord(args: unknown): Record<string, unknown> {\n if (!args || typeof args !== \"object\" || Array.isArray(args)) {\n throw new Error(\"tool arguments must be a JSON object\");\n }\n return args as Record<string, unknown>;\n}\n\nfunction reqStr(o: Record<string, unknown>, key: string): string {\n const v = o[key];\n if (typeof v !== \"string\" || !v.trim()) {\n throw new Error(`${key} must be a non-empty string`);\n }\n return v.trim();\n}\n\nfunction optStr(o: Record<string, unknown>, key: string): string | undefined {\n const v = o[key];\n if (v === undefined || v === null) return undefined;\n if (typeof v !== \"string\") {\n throw new Error(`${key} must be a string`);\n }\n const t = v.trim();\n return t === \"\" ? undefined : t;\n}\n\nfunction optNum(o: Record<string, unknown>, key: string): number | undefined {\n const v = o[key];\n if (v === undefined || v === null) return undefined;\n if (typeof v !== \"number\" || !Number.isFinite(v)) {\n throw new Error(`${key} must be a finite number`);\n }\n return v;\n}\n\nfunction parseContentObject(raw: unknown): import(\"./types.js\").ContentObject {\n const o = asRecord(raw);\n return {\n id: optStr(o, \"id\"),\n title: optStr(o, \"title\"),\n description: optStr(o, \"description\"),\n url: reqStr(o, \"url\"),\n content: optStr(o, \"content\"),\n type: reqStr(o, \"type\") as import(\"./types.js\").ContentObject[\"type\"],\n };\n}\n\n/**\n * Dispatch a tool call by name. Suitable for wiring `tool_calls` from OpenAI / Anthropic / Gemini.\n *\n * @returns Parsed JSON-serializable API response (throw {@link GalyaApiError} on HTTP errors).\n */\nexport async function executeGalyaAgentTool(\n client: GalyaApiClient,\n name: string,\n args: unknown,\n): Promise<unknown> {\n const o = asRecord(args);\n\n switch (name as GalyaAgentToolName) {\n case \"galya_search\": {\n const additional = o.additional_candidates;\n const candidates =\n Array.isArray(additional) ? additional.map(parseContentObject) : undefined;\n return client.search(\n {\n relativeToEntityId: reqStr(o, \"relative_to_entity_id\"),\n inTermsOfEntityType: reqStr(o, \"in_terms_of_entity_type\"),\n },\n {\n query: reqStr(o, \"query\"),\n ...(candidates?.length ? { additional_candidates: candidates } : {}),\n },\n );\n }\n case \"galya_rerank\": {\n const raw = o.candidates;\n if (!Array.isArray(raw)) {\n throw new Error(\"candidates must be an array\");\n }\n return client.rerank(\n {\n relativeToEntityId: reqStr(o, \"relative_to_entity_id\"),\n inTermsOfEntityType: reqStr(o, \"in_terms_of_entity_type\"),\n },\n { candidates: raw.map(parseContentObject) },\n );\n }\n case \"galya_ask\":\n return client.ask(\n {\n relativeToEntityId: reqStr(o, \"relative_to_entity_id\"),\n inTermsOfEntityType: reqStr(o, \"in_terms_of_entity_type\"),\n },\n { query: reqStr(o, \"query\") },\n );\n case \"galya_explain\":\n return client.explain(\n {\n relativeToEntityId: reqStr(o, \"relative_to_entity_id\"),\n inTermsOfEntityType: reqStr(o, \"in_terms_of_entity_type\"),\n domain: optStr(o, \"domain\") as import(\"./types.js\").Domain | undefined,\n task: optStr(o, \"task\") as import(\"./types.js\").Task | undefined,\n },\n { query: reqStr(o, \"query\") },\n );\n case \"galya_index_content\":\n return client.indexContent({\n content: parseContentObject(o.content),\n entity_id: optStr(o, \"entity_id\"),\n });\n case \"galya_index_content_batch\": {\n const items = o.content;\n if (!Array.isArray(items)) {\n throw new Error(\"content must be an array\");\n }\n const entityIdsRaw = o.entity_ids;\n let entity_ids: (string | null)[] | undefined;\n if (entityIdsRaw !== undefined) {\n if (!Array.isArray(entityIdsRaw)) {\n throw new Error(\"entity_ids must be an array\");\n }\n entity_ids = entityIdsRaw.map((x) => {\n if (x === null) return null;\n if (typeof x === \"string\") return x;\n throw new Error(\"entity_ids entries must be string or null\");\n });\n }\n return client.indexContentBatch({\n content: items.map(parseContentObject),\n ...(entity_ids ? { entity_ids } : {}),\n });\n }\n case \"galya_create_entity\":\n return client.createEntity({\n entity_type: reqStr(o, \"entity_type\") as import(\"./types.js\").EntityType,\n name: reqStr(o, \"name\"),\n description: optStr(o, \"description\"),\n });\n case \"galya_get_entity\":\n return client.getEntity(reqStr(o, \"entity_id\"));\n case \"galya_delete_entity\":\n return client.deleteEntity(reqStr(o, \"entity_id\"));\n case \"galya_register_entity_type\":\n return client.registerEntityType(reqStr(o, \"entity_type\"));\n case \"galya_get_entity_type\":\n return client.getEntityType(reqStr(o, \"entity_type\"));\n case \"galya_list_clusters\":\n return client.listClusters({\n limit: optNum(o, \"limit\"),\n offset: optNum(o, \"offset\"),\n entityType: optStr(o, \"entity_type\"),\n });\n case \"galya_get_cluster\":\n return client.getCluster(reqStr(o, \"cluster_id\"));\n default:\n throw new Error(`Unknown Galya tool: ${name}`);\n }\n}\n"],"mappings":"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","names":[]}

@@ -91,2 +91,7 @@ /** Aligned with galya-api/galya-openapi.yaml */

/** Default production Galya API base URL (includes `/v1`). */
declare const GALYA_DEFAULT_API_V1_BASE_URL = "https://api.galya.io/v1";
/** Origin without path (no trailing slash). */
declare const GALYA_DEFAULT_API_ORIGIN = "https://api.galya.io";
declare class GalyaApiError extends Error {

@@ -99,6 +104,11 @@ readonly status: number;

type GalyaApiClientOptions = {
/** Base URL including `/v1`, e.g. `https://api.galya-ai.com/v1` or your Worker `/v1` URL. */
baseUrl: string;
/** Sent as `X-API-Key` (same secret as dashboard / KV). */
/**
* Base URL including `/v1`. Defaults to {@link GALYA_DEFAULT_API_V1_BASE_URL}
* (`https://api.galya.io/v1`).
*/
baseUrl?: string;
/** Workspace secret `galya_wsk_…` or account secret `galya_sk_…` (sent as `X-API-Key`). */
apiKey: string;
/** Required for account secret keys — workspace `publicId` (`X-Galya-Workspace-Id`). */
workspaceId?: string;
/** Override fetch (tests, edge proxies). */

@@ -112,2 +122,3 @@ fetch?: typeof fetch;

private readonly apiKey;
private readonly workspaceId?;
private readonly fetchImpl;

@@ -189,2 +200,2 @@ constructor(opts: GalyaApiClientOptions);

export { type Affinity, type ApiErrorBody, type AskRequest, type Cluster, type ContentObject, type ContentType, type CreateEntityRequest, type CreateEntityResult, type DeleteEntityResult, type Domain, type Entity, type EntityType, type ExplainRequest, type ExplainResult, GALYA_AGENT_TOOL_NAMES, type GalyaAgentToolDefinition, type GalyaAgentToolName, GalyaApiClient, type GalyaApiClientOptions, GalyaApiError, type IndexBatchRequest, type IndexBatchResult, type IndexRequest, type IndexResult, type ListClustersResult, type OpenAiFunctionTool, type RerankRequest, type RerankResult, type SearchRequest, type SearchResult, type Task, type ToolParametersSchema, executeGalyaAgentTool, galyaAgentToolDefinitions, galyaApiV1BaseUrl, openAiFunctionTools };
export { type Affinity, type ApiErrorBody, type AskRequest, type Cluster, type ContentObject, type ContentType, type CreateEntityRequest, type CreateEntityResult, type DeleteEntityResult, type Domain, type Entity, type EntityType, type ExplainRequest, type ExplainResult, GALYA_AGENT_TOOL_NAMES, GALYA_DEFAULT_API_ORIGIN, GALYA_DEFAULT_API_V1_BASE_URL, type GalyaAgentToolDefinition, type GalyaAgentToolName, GalyaApiClient, type GalyaApiClientOptions, GalyaApiError, type IndexBatchRequest, type IndexBatchResult, type IndexRequest, type IndexResult, type ListClustersResult, type OpenAiFunctionTool, type RerankRequest, type RerankResult, type SearchRequest, type SearchResult, type Task, type ToolParametersSchema, executeGalyaAgentTool, galyaAgentToolDefinitions, galyaApiV1BaseUrl, openAiFunctionTools };

@@ -91,2 +91,7 @@ /** Aligned with galya-api/galya-openapi.yaml */

/** Default production Galya API base URL (includes `/v1`). */
declare const GALYA_DEFAULT_API_V1_BASE_URL = "https://api.galya.io/v1";
/** Origin without path (no trailing slash). */
declare const GALYA_DEFAULT_API_ORIGIN = "https://api.galya.io";
declare class GalyaApiError extends Error {

@@ -99,6 +104,11 @@ readonly status: number;

type GalyaApiClientOptions = {
/** Base URL including `/v1`, e.g. `https://api.galya-ai.com/v1` or your Worker `/v1` URL. */
baseUrl: string;
/** Sent as `X-API-Key` (same secret as dashboard / KV). */
/**
* Base URL including `/v1`. Defaults to {@link GALYA_DEFAULT_API_V1_BASE_URL}
* (`https://api.galya.io/v1`).
*/
baseUrl?: string;
/** Workspace secret `galya_wsk_…` or account secret `galya_sk_…` (sent as `X-API-Key`). */
apiKey: string;
/** Required for account secret keys — workspace `publicId` (`X-Galya-Workspace-Id`). */
workspaceId?: string;
/** Override fetch (tests, edge proxies). */

@@ -112,2 +122,3 @@ fetch?: typeof fetch;

private readonly apiKey;
private readonly workspaceId?;
private readonly fetchImpl;

@@ -189,2 +200,2 @@ constructor(opts: GalyaApiClientOptions);

export { type Affinity, type ApiErrorBody, type AskRequest, type Cluster, type ContentObject, type ContentType, type CreateEntityRequest, type CreateEntityResult, type DeleteEntityResult, type Domain, type Entity, type EntityType, type ExplainRequest, type ExplainResult, GALYA_AGENT_TOOL_NAMES, type GalyaAgentToolDefinition, type GalyaAgentToolName, GalyaApiClient, type GalyaApiClientOptions, GalyaApiError, type IndexBatchRequest, type IndexBatchResult, type IndexRequest, type IndexResult, type ListClustersResult, type OpenAiFunctionTool, type RerankRequest, type RerankResult, type SearchRequest, type SearchResult, type Task, type ToolParametersSchema, executeGalyaAgentTool, galyaAgentToolDefinitions, galyaApiV1BaseUrl, openAiFunctionTools };
export { type Affinity, type ApiErrorBody, type AskRequest, type Cluster, type ContentObject, type ContentType, type CreateEntityRequest, type CreateEntityResult, type DeleteEntityResult, type Domain, type Entity, type EntityType, type ExplainRequest, type ExplainResult, GALYA_AGENT_TOOL_NAMES, GALYA_DEFAULT_API_ORIGIN, GALYA_DEFAULT_API_V1_BASE_URL, type GalyaAgentToolDefinition, type GalyaAgentToolName, GalyaApiClient, type GalyaApiClientOptions, GalyaApiError, type IndexBatchRequest, type IndexBatchResult, type IndexRequest, type IndexResult, type ListClustersResult, type OpenAiFunctionTool, type RerankRequest, type RerankResult, type SearchRequest, type SearchResult, type Task, type ToolParametersSchema, executeGalyaAgentTool, galyaAgentToolDefinitions, galyaApiV1BaseUrl, openAiFunctionTools };

@@ -0,2 +1,7 @@

// src/constants.ts
var GALYA_DEFAULT_API_V1_BASE_URL = "https://api.galya.io/v1";
var GALYA_DEFAULT_API_ORIGIN = "https://api.galya.io";
// src/client.ts
import { isAccountPublishableApiKey, isApiRouteKey, requiresWorkspaceIdHeader } from "@galya/schema";
var GalyaApiError = class extends Error {

@@ -33,2 +38,3 @@ constructor(message, status, code, body) {

apiKey;
workspaceId;
fetchImpl;

@@ -40,4 +46,16 @@ constructor(opts) {

}
this.baseUrl = trimSlash(opts.baseUrl);
if (isAccountPublishableApiKey(apiKey) || !isApiRouteKey(apiKey)) {
throw new Error(
"GalyaApiClient: publishable keys are for browser ingest only; use a workspace secret (galya_wsk_\u2026) or account secret (galya_sk_\u2026)"
);
}
const workspaceId = opts.workspaceId?.trim() ?? "";
if (requiresWorkspaceIdHeader(apiKey) && !workspaceId) {
throw new Error(
"GalyaApiClient: workspaceId is required when using account secret keys (galya_sk_\u2026); workspace secret keys (galya_wsk_\u2026) do not need it"
);
}
this.baseUrl = galyaApiV1BaseUrl(opts.baseUrl ?? GALYA_DEFAULT_API_V1_BASE_URL);
this.apiKey = apiKey;
this.workspaceId = workspaceId || void 0;
this.fetchImpl = opts.fetch ?? globalThis.fetch.bind(globalThis);

@@ -60,2 +78,5 @@ }

};
if (this.workspaceId) {
headers["X-Galya-Workspace-Id"] = this.workspaceId;
}
let body;

@@ -589,2 +610,4 @@ if (init?.body !== void 0) {

GALYA_AGENT_TOOL_NAMES,
GALYA_DEFAULT_API_ORIGIN,
GALYA_DEFAULT_API_V1_BASE_URL,
GalyaApiClient,

@@ -591,0 +614,0 @@ GalyaApiError,

@@ -1,1 +0,1 @@

{"version":3,"sources":["../src/client.ts","../src/tools.ts"],"sourcesContent":["import type { ApiErrorBody } from \"./types.js\";\nimport type {\n AskRequest,\n Cluster,\n ContentObject,\n CreateEntityRequest,\n CreateEntityResult,\n DeleteEntityResult,\n Domain,\n Entity,\n ExplainRequest,\n ExplainResult,\n IndexBatchRequest,\n IndexBatchResult,\n IndexRequest,\n IndexResult,\n ListClustersResult,\n RerankRequest,\n RerankResult,\n SearchRequest,\n SearchResult,\n Task,\n} from \"./types.js\";\n\nexport class GalyaApiError extends Error {\n constructor(\n message: string,\n readonly status: number,\n readonly code?: string,\n readonly body?: unknown,\n ) {\n super(message);\n this.name = \"GalyaApiError\";\n }\n}\n\nexport type GalyaApiClientOptions = {\n /** Base URL including `/v1`, e.g. `https://api.galya-ai.com/v1` or your Worker `/v1` URL. */\n baseUrl: string;\n /** Sent as `X-API-Key` (same secret as dashboard / KV). */\n apiKey: string;\n /** Override fetch (tests, edge proxies). */\n fetch?: typeof fetch;\n};\n\nfunction trimSlash(s: string): string {\n return s.replace(/\\/+$/, \"\");\n}\n\n/** Normalize user input so requests hit `/v1/...` paths. */\nexport function galyaApiV1BaseUrl(input: string): string {\n const t = input.trim();\n if (!t) {\n throw new Error(\"galyaApiV1BaseUrl: empty URL\");\n }\n const noTrail = trimSlash(t);\n return noTrail.endsWith(\"/v1\") ? noTrail : `${noTrail}/v1`;\n}\n\nfunction joinUrl(base: string, path: string): string {\n const b = trimSlash(base);\n const p = path.startsWith(\"/\") ? path : `/${path}`;\n return `${b}${p}`;\n}\n\nexport class GalyaApiClient {\n private readonly baseUrl: string;\n private readonly apiKey: string;\n private readonly fetchImpl: typeof fetch;\n\n constructor(opts: GalyaApiClientOptions) {\n const apiKey = opts.apiKey.trim();\n if (!apiKey) {\n throw new Error(\"GalyaApiClient: apiKey is required\");\n }\n this.baseUrl = trimSlash(opts.baseUrl);\n this.apiKey = apiKey;\n this.fetchImpl = opts.fetch ?? globalThis.fetch.bind(globalThis);\n }\n\n private async request<T>(\n method: string,\n path: string,\n init?: { query?: Record<string, string | undefined>; body?: unknown },\n ): Promise<T> {\n let url = joinUrl(this.baseUrl, path);\n if (init?.query) {\n const u = new URL(url);\n for (const [k, v] of Object.entries(init.query)) {\n if (v !== undefined && v !== \"\") {\n u.searchParams.set(k, v);\n }\n }\n url = u.toString();\n }\n const headers: Record<string, string> = {\n \"X-API-Key\": this.apiKey,\n Accept: \"application/json\",\n };\n let body: string | undefined;\n if (init?.body !== undefined) {\n headers[\"Content-Type\"] = \"application/json\";\n body = JSON.stringify(init.body);\n }\n const res = await this.fetchImpl(url, { method, headers, body });\n const text = await res.text();\n let parsed: unknown = null;\n if (text) {\n try {\n parsed = JSON.parse(text) as unknown;\n } catch {\n parsed = text;\n }\n }\n if (!res.ok) {\n const errObj =\n parsed && typeof parsed === \"object\" && parsed !== null && \"error\" in parsed\n ? (parsed as ApiErrorBody)\n : undefined;\n throw new GalyaApiError(\n errObj?.error ?? `HTTP ${res.status}`,\n res.status,\n errObj?.code,\n parsed,\n );\n }\n return parsed as T;\n }\n\n async search(\n params: {\n relativeToEntityId: string;\n inTermsOfEntityType: string;\n },\n body: SearchRequest,\n ): Promise<SearchResult> {\n return this.request<SearchResult>(\"POST\", \"/search\", {\n query: {\n relative_to_entity_id: params.relativeToEntityId,\n in_terms_of_entity_type: params.inTermsOfEntityType,\n },\n body,\n });\n }\n\n async rerank(\n params: {\n relativeToEntityId: string;\n inTermsOfEntityType: string;\n },\n body: RerankRequest,\n ): Promise<RerankResult> {\n return this.request<RerankResult>(\"POST\", \"/rerank\", {\n query: {\n relative_to_entity_id: params.relativeToEntityId,\n in_terms_of_entity_type: params.inTermsOfEntityType,\n },\n body,\n });\n }\n\n async ask(\n params: {\n relativeToEntityId: string;\n inTermsOfEntityType: string;\n },\n body: AskRequest,\n ): Promise<unknown> {\n return this.request<unknown>(\"POST\", \"/ask\", {\n query: {\n relative_to_entity_id: params.relativeToEntityId,\n in_terms_of_entity_type: params.inTermsOfEntityType,\n },\n body,\n });\n }\n\n async explain(\n params: {\n relativeToEntityId: string;\n inTermsOfEntityType: string;\n domain?: Domain;\n task?: Task;\n },\n body: ExplainRequest,\n ): Promise<ExplainResult> {\n return this.request<ExplainResult>(\"POST\", \"/explain\", {\n query: {\n relative_to_entity_id: params.relativeToEntityId,\n in_terms_of_entity_type: params.inTermsOfEntityType,\n domain: params.domain,\n task: params.task,\n },\n body,\n });\n }\n\n async indexContent(body: IndexRequest): Promise<IndexResult> {\n return this.request<IndexResult>(\"POST\", \"/index\", { body });\n }\n\n async indexContentBatch(body: IndexBatchRequest): Promise<IndexBatchResult> {\n return this.request<IndexBatchResult>(\"POST\", \"/index/batch\", { body });\n }\n\n async createEntity(body: CreateEntityRequest): Promise<CreateEntityResult> {\n return this.request<CreateEntityResult>(\"POST\", \"/entity\", { body });\n }\n\n async getEntity(entityId: string): Promise<Entity> {\n return this.request<Entity>(\"GET\", \"/entity\", {\n query: { entity_id: entityId },\n });\n }\n\n async deleteEntity(entityId: string): Promise<DeleteEntityResult> {\n return this.request<DeleteEntityResult>(\"DELETE\", \"/entity\", {\n query: { entity_id: entityId },\n });\n }\n\n async registerEntityType(entityType: string): Promise<{ success?: boolean }> {\n return this.request<{ success?: boolean }>(\"POST\", \"/entity/type\", {\n body: { entity_type: entityType },\n });\n }\n\n async getEntityType(entityType: string): Promise<unknown> {\n return this.request<unknown>(\"GET\", \"/entity/type\", {\n query: { entity_type: entityType },\n });\n }\n\n async listClusters(params?: {\n limit?: number;\n offset?: number;\n entityType?: string;\n }): Promise<ListClustersResult> {\n const q: Record<string, string | undefined> = {};\n if (params?.limit !== undefined) {\n q.limit = String(params.limit);\n }\n if (params?.offset !== undefined) {\n q.offset = String(params.offset);\n }\n if (params?.entityType) {\n q.entity_type = params.entityType;\n }\n return this.request<ListClustersResult>(\"GET\", \"/clusters\", { query: q });\n }\n\n async getCluster(clusterId: string): Promise<Cluster> {\n return this.request<Cluster>(\"GET\", \"/cluster\", {\n query: { cluster_id: clusterId },\n });\n }\n\n /**\n * Typed helper for rerank/search when candidates come from tool args as plain JSON.\n * Ensures each candidate has required `url` and `type`.\n */\n normalizeCandidates(raw: unknown): ContentObject[] {\n if (!Array.isArray(raw)) {\n return [];\n }\n const out: ContentObject[] = [];\n for (const item of raw) {\n if (!item || typeof item !== \"object\") continue;\n const o = item as Record<string, unknown>;\n const url = typeof o.url === \"string\" ? o.url : \"\";\n const typeRaw = o.type;\n const type =\n typeRaw === \"image\" || typeRaw === \"text\" || typeRaw === \"audio\" || typeRaw === \"video\"\n ? typeRaw\n : \"text\";\n if (!url.trim()) continue;\n out.push({\n id: typeof o.id === \"string\" ? o.id : undefined,\n title: typeof o.title === \"string\" ? o.title : undefined,\n description: typeof o.description === \"string\" ? o.description : undefined,\n url,\n content: typeof o.content === \"string\" ? o.content : undefined,\n type,\n });\n }\n return out;\n }\n}\n","import type { GalyaApiClient } from \"./client.js\";\n\n/** JSON Schema–style object passed to OpenAI / Anthropic–compatible tool routers */\nexport type ToolParametersSchema = {\n type: \"object\";\n properties: Record<string, unknown>;\n required?: string[];\n additionalProperties?: boolean;\n};\n\nexport type GalyaAgentToolDefinition = {\n name: GalyaAgentToolName;\n description: string;\n parameters: ToolParametersSchema;\n};\n\nexport const GALYA_AGENT_TOOL_NAMES = [\n \"galya_search\",\n \"galya_rerank\",\n \"galya_ask\",\n \"galya_explain\",\n \"galya_index_content\",\n \"galya_index_content_batch\",\n \"galya_create_entity\",\n \"galya_get_entity\",\n \"galya_delete_entity\",\n \"galya_register_entity_type\",\n \"galya_get_entity_type\",\n \"galya_list_clusters\",\n \"galya_get_cluster\",\n] as const;\n\nexport type GalyaAgentToolName = (typeof GALYA_AGENT_TOOL_NAMES)[number];\n\nconst entityTypeEnum = [\"content\", \"place\", \"brand\", \"user\", \"website\", \"file\"] as const;\n\nconst contentTypeEnum = [\"image\", \"text\", \"audio\", \"video\"] as const;\n\nconst contentObjectSchema: Record<string, unknown> = {\n type: \"object\",\n properties: {\n id: { type: \"string\", description: \"Optional stable id for this artifact.\" },\n title: { type: \"string\" },\n description: { type: \"string\" },\n url: { type: \"string\", description: \"Required. Canonical URL for dedup / identity.\" },\n content: { type: \"string\", description: \"Inline body text when no public URL.\" },\n type: { type: \"string\", enum: [...contentTypeEnum], description: \"MIME-ish media class.\" },\n },\n required: [\"url\", \"type\"],\n};\n\n/** Stable ordering for agent prompts — matches {@link GALYA_AGENT_TOOL_NAMES} intent */\nexport const galyaAgentToolDefinitions: GalyaAgentToolDefinition[] = [\n {\n name: \"galya_search\",\n description:\n \"Search the Galya taste graph for entities ranked by affinity to a reference entity. Sends POST /v1/search.\",\n parameters: {\n type: \"object\",\n properties: {\n relative_to_entity_id: {\n type: \"string\",\n description: \"Entity id whose taste profile anchors ranking.\",\n },\n in_terms_of_entity_type: {\n type: \"string\",\n enum: [...entityTypeEnum],\n description: \"Restrict results to this entity type.\",\n },\n query: { type: \"string\", description: \"Natural-language query.\" },\n additional_candidates: {\n type: \"array\",\n description: \"Optional unindexed content rows scored at query time (not persisted).\",\n items: contentObjectSchema,\n },\n },\n required: [\"relative_to_entity_id\", \"in_terms_of_entity_type\", \"query\"],\n additionalProperties: false,\n },\n },\n {\n name: \"galya_rerank\",\n description:\n \"Rerank caller-supplied content candidates by affinity to a reference entity (POST /v1/rerank). Candidates are not persisted.\",\n parameters: {\n type: \"object\",\n properties: {\n relative_to_entity_id: { type: \"string\" },\n in_terms_of_entity_type: { type: \"string\", enum: [...entityTypeEnum] },\n candidates: {\n type: \"array\",\n items: contentObjectSchema,\n description: \"Each item must include url and type.\",\n },\n },\n required: [\"relative_to_entity_id\", \"in_terms_of_entity_type\", \"candidates\"],\n additionalProperties: false,\n },\n },\n {\n name: \"galya_ask\",\n description:\n \"Taste-personalized answer (POST /v1/ask). Server may return 501 until LLM routing is implemented.\",\n parameters: {\n type: \"object\",\n properties: {\n relative_to_entity_id: { type: \"string\" },\n in_terms_of_entity_type: { type: \"string\", enum: [...entityTypeEnum] },\n query: { type: \"string\" },\n },\n required: [\"relative_to_entity_id\", \"in_terms_of_entity_type\", \"query\"],\n additionalProperties: false,\n },\n },\n {\n name: \"galya_explain\",\n description:\n \"Explain entity affinities for agents (POST /v1/explain). Optional domain/task hints.\",\n parameters: {\n type: \"object\",\n properties: {\n relative_to_entity_id: { type: \"string\" },\n in_terms_of_entity_type: { type: \"string\", enum: [...entityTypeEnum] },\n query: { type: \"string\" },\n domain: {\n type: \"string\",\n enum: [\"discovery\", \"design\", \"decisions\", \"data\"],\n },\n task: {\n type: \"string\",\n enum: [\"coding-agent\", \"commerce-agent\", \"design-agent\", \"insight-agent\"],\n },\n },\n required: [\"relative_to_entity_id\", \"in_terms_of_entity_type\", \"query\"],\n additionalProperties: false,\n },\n },\n {\n name: \"galya_index_content\",\n description:\n \"Index or resolve a content URL into a content entity (POST /v1/index). May be 501 until indexing pipeline exists.\",\n parameters: {\n type: \"object\",\n properties: {\n content: contentObjectSchema,\n entity_id: {\n type: \"string\",\n description: \"Optional graph node to attach after indexing.\",\n },\n },\n required: [\"content\"],\n additionalProperties: false,\n },\n },\n {\n name: \"galya_index_content_batch\",\n description: \"Batch index content objects (POST /v1/index/batch). Same semantics as single index per item.\",\n parameters: {\n type: \"object\",\n properties: {\n content: { type: \"array\", items: contentObjectSchema },\n entity_ids: {\n type: \"array\",\n description: \"Parallel optional attachment ids; use null for standalone rows.\",\n items: {\n anyOf: [{ type: \"string\" }, { type: \"null\" }],\n },\n },\n },\n required: [\"content\"],\n additionalProperties: false,\n },\n },\n {\n name: \"galya_create_entity\",\n description:\n \"Create a non-content entity (POST /v1/entity). Content entities must use index_content instead.\",\n parameters: {\n type: \"object\",\n properties: {\n entity_type: { type: \"string\", enum: [...entityTypeEnum] },\n name: { type: \"string\" },\n description: { type: \"string\" },\n },\n required: [\"entity_type\", \"name\"],\n additionalProperties: false,\n },\n },\n {\n name: \"galya_get_entity\",\n description: \"Fetch one entity by id (GET /v1/entity).\",\n parameters: {\n type: \"object\",\n properties: {\n entity_id: { type: \"string\" },\n },\n required: [\"entity_id\"],\n additionalProperties: false,\n },\n },\n {\n name: \"galya_delete_entity\",\n description: \"Delete an entity by id (DELETE /v1/entity).\",\n parameters: {\n type: \"object\",\n properties: {\n entity_id: { type: \"string\" },\n },\n required: [\"entity_id\"],\n additionalProperties: false,\n },\n },\n {\n name: \"galya_register_entity_type\",\n description: \"Register a custom entity type (POST /v1/entity/type). May be 501 on server.\",\n parameters: {\n type: \"object\",\n properties: {\n entity_type: { type: \"string\" },\n },\n required: [\"entity_type\"],\n additionalProperties: false,\n },\n },\n {\n name: \"galya_get_entity_type\",\n description: \"Fetch custom type metadata (GET /v1/entity/type).\",\n parameters: {\n type: \"object\",\n properties: {\n entity_type: { type: \"string\" },\n },\n required: [\"entity_type\"],\n additionalProperties: false,\n },\n },\n {\n name: \"galya_list_clusters\",\n description: \"List clusters in the workspace (GET /v1/clusters).\",\n parameters: {\n type: \"object\",\n properties: {\n limit: { type: \"integer\" },\n offset: { type: \"integer\" },\n entity_type: { type: \"string\", enum: [...entityTypeEnum] },\n },\n additionalProperties: false,\n },\n },\n {\n name: \"galya_get_cluster\",\n description: \"Fetch one cluster by id (GET /v1/cluster). May be 501 on server.\",\n parameters: {\n type: \"object\",\n properties: {\n cluster_id: { type: \"string\" },\n },\n required: [\"cluster_id\"],\n additionalProperties: false,\n },\n },\n];\n\n/** OpenAI Chat Completions `tools[]` entry shape (also works with many proxies). */\nexport type OpenAiFunctionTool = {\n type: \"function\";\n function: {\n name: string;\n description: string;\n parameters: Record<string, unknown>;\n };\n};\n\nexport function openAiFunctionTools(defs: GalyaAgentToolDefinition[] = galyaAgentToolDefinitions): OpenAiFunctionTool[] {\n return defs.map((t) => ({\n type: \"function\",\n function: {\n name: t.name,\n description: t.description,\n parameters: t.parameters as unknown as Record<string, unknown>,\n },\n }));\n}\n\nfunction asRecord(args: unknown): Record<string, unknown> {\n if (!args || typeof args !== \"object\" || Array.isArray(args)) {\n throw new Error(\"tool arguments must be a JSON object\");\n }\n return args as Record<string, unknown>;\n}\n\nfunction reqStr(o: Record<string, unknown>, key: string): string {\n const v = o[key];\n if (typeof v !== \"string\" || !v.trim()) {\n throw new Error(`${key} must be a non-empty string`);\n }\n return v.trim();\n}\n\nfunction optStr(o: Record<string, unknown>, key: string): string | undefined {\n const v = o[key];\n if (v === undefined || v === null) return undefined;\n if (typeof v !== \"string\") {\n throw new Error(`${key} must be a string`);\n }\n const t = v.trim();\n return t === \"\" ? undefined : t;\n}\n\nfunction optNum(o: Record<string, unknown>, key: string): number | undefined {\n const v = o[key];\n if (v === undefined || v === null) return undefined;\n if (typeof v !== \"number\" || !Number.isFinite(v)) {\n throw new Error(`${key} must be a finite number`);\n }\n return v;\n}\n\nfunction parseContentObject(raw: unknown): import(\"./types.js\").ContentObject {\n const o = asRecord(raw);\n return {\n id: optStr(o, \"id\"),\n title: optStr(o, \"title\"),\n description: optStr(o, \"description\"),\n url: reqStr(o, \"url\"),\n content: optStr(o, \"content\"),\n type: reqStr(o, \"type\") as import(\"./types.js\").ContentObject[\"type\"],\n };\n}\n\n/**\n * Dispatch a tool call by name. Suitable for wiring `tool_calls` from OpenAI / Anthropic / Gemini.\n *\n * @returns Parsed JSON-serializable API response (throw {@link GalyaApiError} on HTTP errors).\n */\nexport async function executeGalyaAgentTool(\n client: GalyaApiClient,\n name: string,\n args: unknown,\n): Promise<unknown> {\n const o = asRecord(args);\n\n switch (name as GalyaAgentToolName) {\n case \"galya_search\": {\n const additional = o.additional_candidates;\n const candidates =\n Array.isArray(additional) ? additional.map(parseContentObject) : undefined;\n return client.search(\n {\n relativeToEntityId: reqStr(o, \"relative_to_entity_id\"),\n inTermsOfEntityType: reqStr(o, \"in_terms_of_entity_type\"),\n },\n {\n query: reqStr(o, \"query\"),\n ...(candidates?.length ? { additional_candidates: candidates } : {}),\n },\n );\n }\n case \"galya_rerank\": {\n const raw = o.candidates;\n if (!Array.isArray(raw)) {\n throw new Error(\"candidates must be an array\");\n }\n return client.rerank(\n {\n relativeToEntityId: reqStr(o, \"relative_to_entity_id\"),\n inTermsOfEntityType: reqStr(o, \"in_terms_of_entity_type\"),\n },\n { candidates: raw.map(parseContentObject) },\n );\n }\n case \"galya_ask\":\n return client.ask(\n {\n relativeToEntityId: reqStr(o, \"relative_to_entity_id\"),\n inTermsOfEntityType: reqStr(o, \"in_terms_of_entity_type\"),\n },\n { query: reqStr(o, \"query\") },\n );\n case \"galya_explain\":\n return client.explain(\n {\n relativeToEntityId: reqStr(o, \"relative_to_entity_id\"),\n inTermsOfEntityType: reqStr(o, \"in_terms_of_entity_type\"),\n domain: optStr(o, \"domain\") as import(\"./types.js\").Domain | undefined,\n task: optStr(o, \"task\") as import(\"./types.js\").Task | undefined,\n },\n { query: reqStr(o, \"query\") },\n );\n case \"galya_index_content\":\n return client.indexContent({\n content: parseContentObject(o.content),\n entity_id: optStr(o, \"entity_id\"),\n });\n case \"galya_index_content_batch\": {\n const items = o.content;\n if (!Array.isArray(items)) {\n throw new Error(\"content must be an array\");\n }\n const entityIdsRaw = o.entity_ids;\n let entity_ids: (string | null)[] | undefined;\n if (entityIdsRaw !== undefined) {\n if (!Array.isArray(entityIdsRaw)) {\n throw new Error(\"entity_ids must be an array\");\n }\n entity_ids = entityIdsRaw.map((x) => {\n if (x === null) return null;\n if (typeof x === \"string\") return x;\n throw new Error(\"entity_ids entries must be string or null\");\n });\n }\n return client.indexContentBatch({\n content: items.map(parseContentObject),\n ...(entity_ids ? { entity_ids } : {}),\n });\n }\n case \"galya_create_entity\":\n return client.createEntity({\n entity_type: reqStr(o, \"entity_type\") as import(\"./types.js\").EntityType,\n name: reqStr(o, \"name\"),\n description: optStr(o, \"description\"),\n });\n case \"galya_get_entity\":\n return client.getEntity(reqStr(o, \"entity_id\"));\n case \"galya_delete_entity\":\n return client.deleteEntity(reqStr(o, \"entity_id\"));\n case \"galya_register_entity_type\":\n return client.registerEntityType(reqStr(o, \"entity_type\"));\n case \"galya_get_entity_type\":\n return client.getEntityType(reqStr(o, \"entity_type\"));\n case \"galya_list_clusters\":\n return client.listClusters({\n limit: optNum(o, \"limit\"),\n offset: optNum(o, \"offset\"),\n entityType: optStr(o, \"entity_type\"),\n });\n case \"galya_get_cluster\":\n return client.getCluster(reqStr(o, \"cluster_id\"));\n default:\n throw new Error(`Unknown Galya tool: ${name}`);\n }\n}\n"],"mappings":"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","names":[]}
{"version":3,"sources":["../src/constants.ts","../src/client.ts","../src/tools.ts"],"sourcesContent":["/** Default production Galya API base URL (includes `/v1`). */\nexport const GALYA_DEFAULT_API_V1_BASE_URL = \"https://api.galya.io/v1\";\n\n/** Origin without path (no trailing slash). */\nexport const GALYA_DEFAULT_API_ORIGIN = \"https://api.galya.io\";\n","import { isAccountPublishableApiKey, isApiRouteKey, requiresWorkspaceIdHeader } from \"@galya/schema\";\nimport { GALYA_DEFAULT_API_V1_BASE_URL } from \"./constants.js\";\nimport type { ApiErrorBody } from \"./types.js\";\nimport type {\n AskRequest,\n Cluster,\n ContentObject,\n CreateEntityRequest,\n CreateEntityResult,\n DeleteEntityResult,\n Domain,\n Entity,\n ExplainRequest,\n ExplainResult,\n IndexBatchRequest,\n IndexBatchResult,\n IndexRequest,\n IndexResult,\n ListClustersResult,\n RerankRequest,\n RerankResult,\n SearchRequest,\n SearchResult,\n Task,\n} from \"./types.js\";\n\nexport class GalyaApiError extends Error {\n constructor(\n message: string,\n readonly status: number,\n readonly code?: string,\n readonly body?: unknown,\n ) {\n super(message);\n this.name = \"GalyaApiError\";\n }\n}\n\nexport type GalyaApiClientOptions = {\n /**\n * Base URL including `/v1`. Defaults to {@link GALYA_DEFAULT_API_V1_BASE_URL}\n * (`https://api.galya.io/v1`).\n */\n baseUrl?: string;\n /** Workspace secret `galya_wsk_…` or account secret `galya_sk_…` (sent as `X-API-Key`). */\n apiKey: string;\n /** Required for account secret keys — workspace `publicId` (`X-Galya-Workspace-Id`). */\n workspaceId?: string;\n /** Override fetch (tests, edge proxies). */\n fetch?: typeof fetch;\n};\n\nfunction trimSlash(s: string): string {\n return s.replace(/\\/+$/, \"\");\n}\n\n/** Normalize user input so requests hit `/v1/...` paths. */\nexport function galyaApiV1BaseUrl(input: string): string {\n const t = input.trim();\n if (!t) {\n throw new Error(\"galyaApiV1BaseUrl: empty URL\");\n }\n const noTrail = trimSlash(t);\n return noTrail.endsWith(\"/v1\") ? noTrail : `${noTrail}/v1`;\n}\n\nfunction joinUrl(base: string, path: string): string {\n const b = trimSlash(base);\n const p = path.startsWith(\"/\") ? path : `/${path}`;\n return `${b}${p}`;\n}\n\nexport class GalyaApiClient {\n private readonly baseUrl: string;\n private readonly apiKey: string;\n private readonly workspaceId?: string;\n private readonly fetchImpl: typeof fetch;\n\n constructor(opts: GalyaApiClientOptions) {\n const apiKey = opts.apiKey.trim();\n if (!apiKey) {\n throw new Error(\"GalyaApiClient: apiKey is required\");\n }\n if (isAccountPublishableApiKey(apiKey) || !isApiRouteKey(apiKey)) {\n throw new Error(\n \"GalyaApiClient: publishable keys are for browser ingest only; use a workspace secret (galya_wsk_…) or account secret (galya_sk_…)\",\n );\n }\n const workspaceId = opts.workspaceId?.trim() ?? \"\";\n if (requiresWorkspaceIdHeader(apiKey) && !workspaceId) {\n throw new Error(\n \"GalyaApiClient: workspaceId is required when using account secret keys (galya_sk_…); workspace secret keys (galya_wsk_…) do not need it\",\n );\n }\n this.baseUrl = galyaApiV1BaseUrl(opts.baseUrl ?? GALYA_DEFAULT_API_V1_BASE_URL);\n this.apiKey = apiKey;\n this.workspaceId = workspaceId || undefined;\n this.fetchImpl = opts.fetch ?? globalThis.fetch.bind(globalThis);\n }\n\n private async request<T>(\n method: string,\n path: string,\n init?: { query?: Record<string, string | undefined>; body?: unknown },\n ): Promise<T> {\n let url = joinUrl(this.baseUrl, path);\n if (init?.query) {\n const u = new URL(url);\n for (const [k, v] of Object.entries(init.query)) {\n if (v !== undefined && v !== \"\") {\n u.searchParams.set(k, v);\n }\n }\n url = u.toString();\n }\n const headers: Record<string, string> = {\n \"X-API-Key\": this.apiKey,\n Accept: \"application/json\",\n };\n if (this.workspaceId) {\n headers[\"X-Galya-Workspace-Id\"] = this.workspaceId;\n }\n let body: string | undefined;\n if (init?.body !== undefined) {\n headers[\"Content-Type\"] = \"application/json\";\n body = JSON.stringify(init.body);\n }\n const res = await this.fetchImpl(url, { method, headers, body });\n const text = await res.text();\n let parsed: unknown = null;\n if (text) {\n try {\n parsed = JSON.parse(text) as unknown;\n } catch {\n parsed = text;\n }\n }\n if (!res.ok) {\n const errObj =\n parsed && typeof parsed === \"object\" && parsed !== null && \"error\" in parsed\n ? (parsed as ApiErrorBody)\n : undefined;\n throw new GalyaApiError(\n errObj?.error ?? `HTTP ${res.status}`,\n res.status,\n errObj?.code,\n parsed,\n );\n }\n return parsed as T;\n }\n\n async search(\n params: {\n relativeToEntityId: string;\n inTermsOfEntityType: string;\n },\n body: SearchRequest,\n ): Promise<SearchResult> {\n return this.request<SearchResult>(\"POST\", \"/search\", {\n query: {\n relative_to_entity_id: params.relativeToEntityId,\n in_terms_of_entity_type: params.inTermsOfEntityType,\n },\n body,\n });\n }\n\n async rerank(\n params: {\n relativeToEntityId: string;\n inTermsOfEntityType: string;\n },\n body: RerankRequest,\n ): Promise<RerankResult> {\n return this.request<RerankResult>(\"POST\", \"/rerank\", {\n query: {\n relative_to_entity_id: params.relativeToEntityId,\n in_terms_of_entity_type: params.inTermsOfEntityType,\n },\n body,\n });\n }\n\n async ask(\n params: {\n relativeToEntityId: string;\n inTermsOfEntityType: string;\n },\n body: AskRequest,\n ): Promise<unknown> {\n return this.request<unknown>(\"POST\", \"/ask\", {\n query: {\n relative_to_entity_id: params.relativeToEntityId,\n in_terms_of_entity_type: params.inTermsOfEntityType,\n },\n body,\n });\n }\n\n async explain(\n params: {\n relativeToEntityId: string;\n inTermsOfEntityType: string;\n domain?: Domain;\n task?: Task;\n },\n body: ExplainRequest,\n ): Promise<ExplainResult> {\n return this.request<ExplainResult>(\"POST\", \"/explain\", {\n query: {\n relative_to_entity_id: params.relativeToEntityId,\n in_terms_of_entity_type: params.inTermsOfEntityType,\n domain: params.domain,\n task: params.task,\n },\n body,\n });\n }\n\n async indexContent(body: IndexRequest): Promise<IndexResult> {\n return this.request<IndexResult>(\"POST\", \"/index\", { body });\n }\n\n async indexContentBatch(body: IndexBatchRequest): Promise<IndexBatchResult> {\n return this.request<IndexBatchResult>(\"POST\", \"/index/batch\", { body });\n }\n\n async createEntity(body: CreateEntityRequest): Promise<CreateEntityResult> {\n return this.request<CreateEntityResult>(\"POST\", \"/entity\", { body });\n }\n\n async getEntity(entityId: string): Promise<Entity> {\n return this.request<Entity>(\"GET\", \"/entity\", {\n query: { entity_id: entityId },\n });\n }\n\n async deleteEntity(entityId: string): Promise<DeleteEntityResult> {\n return this.request<DeleteEntityResult>(\"DELETE\", \"/entity\", {\n query: { entity_id: entityId },\n });\n }\n\n async registerEntityType(entityType: string): Promise<{ success?: boolean }> {\n return this.request<{ success?: boolean }>(\"POST\", \"/entity/type\", {\n body: { entity_type: entityType },\n });\n }\n\n async getEntityType(entityType: string): Promise<unknown> {\n return this.request<unknown>(\"GET\", \"/entity/type\", {\n query: { entity_type: entityType },\n });\n }\n\n async listClusters(params?: {\n limit?: number;\n offset?: number;\n entityType?: string;\n }): Promise<ListClustersResult> {\n const q: Record<string, string | undefined> = {};\n if (params?.limit !== undefined) {\n q.limit = String(params.limit);\n }\n if (params?.offset !== undefined) {\n q.offset = String(params.offset);\n }\n if (params?.entityType) {\n q.entity_type = params.entityType;\n }\n return this.request<ListClustersResult>(\"GET\", \"/clusters\", { query: q });\n }\n\n async getCluster(clusterId: string): Promise<Cluster> {\n return this.request<Cluster>(\"GET\", \"/cluster\", {\n query: { cluster_id: clusterId },\n });\n }\n\n /**\n * Typed helper for rerank/search when candidates come from tool args as plain JSON.\n * Ensures each candidate has required `url` and `type`.\n */\n normalizeCandidates(raw: unknown): ContentObject[] {\n if (!Array.isArray(raw)) {\n return [];\n }\n const out: ContentObject[] = [];\n for (const item of raw) {\n if (!item || typeof item !== \"object\") continue;\n const o = item as Record<string, unknown>;\n const url = typeof o.url === \"string\" ? o.url : \"\";\n const typeRaw = o.type;\n const type =\n typeRaw === \"image\" || typeRaw === \"text\" || typeRaw === \"audio\" || typeRaw === \"video\"\n ? typeRaw\n : \"text\";\n if (!url.trim()) continue;\n out.push({\n id: typeof o.id === \"string\" ? o.id : undefined,\n title: typeof o.title === \"string\" ? o.title : undefined,\n description: typeof o.description === \"string\" ? o.description : undefined,\n url,\n content: typeof o.content === \"string\" ? o.content : undefined,\n type,\n });\n }\n return out;\n }\n}\n","import type { GalyaApiClient } from \"./client.js\";\n\n/** JSON Schema–style object passed to OpenAI / Anthropic–compatible tool routers */\nexport type ToolParametersSchema = {\n type: \"object\";\n properties: Record<string, unknown>;\n required?: string[];\n additionalProperties?: boolean;\n};\n\nexport type GalyaAgentToolDefinition = {\n name: GalyaAgentToolName;\n description: string;\n parameters: ToolParametersSchema;\n};\n\nexport const GALYA_AGENT_TOOL_NAMES = [\n \"galya_search\",\n \"galya_rerank\",\n \"galya_ask\",\n \"galya_explain\",\n \"galya_index_content\",\n \"galya_index_content_batch\",\n \"galya_create_entity\",\n \"galya_get_entity\",\n \"galya_delete_entity\",\n \"galya_register_entity_type\",\n \"galya_get_entity_type\",\n \"galya_list_clusters\",\n \"galya_get_cluster\",\n] as const;\n\nexport type GalyaAgentToolName = (typeof GALYA_AGENT_TOOL_NAMES)[number];\n\nconst entityTypeEnum = [\"content\", \"place\", \"brand\", \"user\", \"website\", \"file\"] as const;\n\nconst contentTypeEnum = [\"image\", \"text\", \"audio\", \"video\"] as const;\n\nconst contentObjectSchema: Record<string, unknown> = {\n type: \"object\",\n properties: {\n id: { type: \"string\", description: \"Optional stable id for this artifact.\" },\n title: { type: \"string\" },\n description: { type: \"string\" },\n url: { type: \"string\", description: \"Required. Canonical URL for dedup / identity.\" },\n content: { type: \"string\", description: \"Inline body text when no public URL.\" },\n type: { type: \"string\", enum: [...contentTypeEnum], description: \"MIME-ish media class.\" },\n },\n required: [\"url\", \"type\"],\n};\n\n/** Stable ordering for agent prompts — matches {@link GALYA_AGENT_TOOL_NAMES} intent */\nexport const galyaAgentToolDefinitions: GalyaAgentToolDefinition[] = [\n {\n name: \"galya_search\",\n description:\n \"Search the Galya taste graph for entities ranked by affinity to a reference entity. Sends POST /v1/search.\",\n parameters: {\n type: \"object\",\n properties: {\n relative_to_entity_id: {\n type: \"string\",\n description: \"Entity id whose taste profile anchors ranking.\",\n },\n in_terms_of_entity_type: {\n type: \"string\",\n enum: [...entityTypeEnum],\n description: \"Restrict results to this entity type.\",\n },\n query: { type: \"string\", description: \"Natural-language query.\" },\n additional_candidates: {\n type: \"array\",\n description: \"Optional unindexed content rows scored at query time (not persisted).\",\n items: contentObjectSchema,\n },\n },\n required: [\"relative_to_entity_id\", \"in_terms_of_entity_type\", \"query\"],\n additionalProperties: false,\n },\n },\n {\n name: \"galya_rerank\",\n description:\n \"Rerank caller-supplied content candidates by affinity to a reference entity (POST /v1/rerank). Candidates are not persisted.\",\n parameters: {\n type: \"object\",\n properties: {\n relative_to_entity_id: { type: \"string\" },\n in_terms_of_entity_type: { type: \"string\", enum: [...entityTypeEnum] },\n candidates: {\n type: \"array\",\n items: contentObjectSchema,\n description: \"Each item must include url and type.\",\n },\n },\n required: [\"relative_to_entity_id\", \"in_terms_of_entity_type\", \"candidates\"],\n additionalProperties: false,\n },\n },\n {\n name: \"galya_ask\",\n description:\n \"Taste-personalized answer (POST /v1/ask). Server may return 501 until LLM routing is implemented.\",\n parameters: {\n type: \"object\",\n properties: {\n relative_to_entity_id: { type: \"string\" },\n in_terms_of_entity_type: { type: \"string\", enum: [...entityTypeEnum] },\n query: { type: \"string\" },\n },\n required: [\"relative_to_entity_id\", \"in_terms_of_entity_type\", \"query\"],\n additionalProperties: false,\n },\n },\n {\n name: \"galya_explain\",\n description:\n \"Explain entity affinities for agents (POST /v1/explain). Optional domain/task hints.\",\n parameters: {\n type: \"object\",\n properties: {\n relative_to_entity_id: { type: \"string\" },\n in_terms_of_entity_type: { type: \"string\", enum: [...entityTypeEnum] },\n query: { type: \"string\" },\n domain: {\n type: \"string\",\n enum: [\"discovery\", \"design\", \"decisions\", \"data\"],\n },\n task: {\n type: \"string\",\n enum: [\"coding-agent\", \"commerce-agent\", \"design-agent\", \"insight-agent\"],\n },\n },\n required: [\"relative_to_entity_id\", \"in_terms_of_entity_type\", \"query\"],\n additionalProperties: false,\n },\n },\n {\n name: \"galya_index_content\",\n description:\n \"Index or resolve a content URL into a content entity (POST /v1/index). May be 501 until indexing pipeline exists.\",\n parameters: {\n type: \"object\",\n properties: {\n content: contentObjectSchema,\n entity_id: {\n type: \"string\",\n description: \"Optional graph node to attach after indexing.\",\n },\n },\n required: [\"content\"],\n additionalProperties: false,\n },\n },\n {\n name: \"galya_index_content_batch\",\n description: \"Batch index content objects (POST /v1/index/batch). Same semantics as single index per item.\",\n parameters: {\n type: \"object\",\n properties: {\n content: { type: \"array\", items: contentObjectSchema },\n entity_ids: {\n type: \"array\",\n description: \"Parallel optional attachment ids; use null for standalone rows.\",\n items: {\n anyOf: [{ type: \"string\" }, { type: \"null\" }],\n },\n },\n },\n required: [\"content\"],\n additionalProperties: false,\n },\n },\n {\n name: \"galya_create_entity\",\n description:\n \"Create a non-content entity (POST /v1/entity). Content entities must use index_content instead.\",\n parameters: {\n type: \"object\",\n properties: {\n entity_type: { type: \"string\", enum: [...entityTypeEnum] },\n name: { type: \"string\" },\n description: { type: \"string\" },\n },\n required: [\"entity_type\", \"name\"],\n additionalProperties: false,\n },\n },\n {\n name: \"galya_get_entity\",\n description: \"Fetch one entity by id (GET /v1/entity).\",\n parameters: {\n type: \"object\",\n properties: {\n entity_id: { type: \"string\" },\n },\n required: [\"entity_id\"],\n additionalProperties: false,\n },\n },\n {\n name: \"galya_delete_entity\",\n description: \"Delete an entity by id (DELETE /v1/entity).\",\n parameters: {\n type: \"object\",\n properties: {\n entity_id: { type: \"string\" },\n },\n required: [\"entity_id\"],\n additionalProperties: false,\n },\n },\n {\n name: \"galya_register_entity_type\",\n description: \"Register a custom entity type (POST /v1/entity/type). May be 501 on server.\",\n parameters: {\n type: \"object\",\n properties: {\n entity_type: { type: \"string\" },\n },\n required: [\"entity_type\"],\n additionalProperties: false,\n },\n },\n {\n name: \"galya_get_entity_type\",\n description: \"Fetch custom type metadata (GET /v1/entity/type).\",\n parameters: {\n type: \"object\",\n properties: {\n entity_type: { type: \"string\" },\n },\n required: [\"entity_type\"],\n additionalProperties: false,\n },\n },\n {\n name: \"galya_list_clusters\",\n description: \"List clusters in the workspace (GET /v1/clusters).\",\n parameters: {\n type: \"object\",\n properties: {\n limit: { type: \"integer\" },\n offset: { type: \"integer\" },\n entity_type: { type: \"string\", enum: [...entityTypeEnum] },\n },\n additionalProperties: false,\n },\n },\n {\n name: \"galya_get_cluster\",\n description: \"Fetch one cluster by id (GET /v1/cluster). May be 501 on server.\",\n parameters: {\n type: \"object\",\n properties: {\n cluster_id: { type: \"string\" },\n },\n required: [\"cluster_id\"],\n additionalProperties: false,\n },\n },\n];\n\n/** OpenAI Chat Completions `tools[]` entry shape (also works with many proxies). */\nexport type OpenAiFunctionTool = {\n type: \"function\";\n function: {\n name: string;\n description: string;\n parameters: Record<string, unknown>;\n };\n};\n\nexport function openAiFunctionTools(defs: GalyaAgentToolDefinition[] = galyaAgentToolDefinitions): OpenAiFunctionTool[] {\n return defs.map((t) => ({\n type: \"function\",\n function: {\n name: t.name,\n description: t.description,\n parameters: t.parameters as unknown as Record<string, unknown>,\n },\n }));\n}\n\nfunction asRecord(args: unknown): Record<string, unknown> {\n if (!args || typeof args !== \"object\" || Array.isArray(args)) {\n throw new Error(\"tool arguments must be a JSON object\");\n }\n return args as Record<string, unknown>;\n}\n\nfunction reqStr(o: Record<string, unknown>, key: string): string {\n const v = o[key];\n if (typeof v !== \"string\" || !v.trim()) {\n throw new Error(`${key} must be a non-empty string`);\n }\n return v.trim();\n}\n\nfunction optStr(o: Record<string, unknown>, key: string): string | undefined {\n const v = o[key];\n if (v === undefined || v === null) return undefined;\n if (typeof v !== \"string\") {\n throw new Error(`${key} must be a string`);\n }\n const t = v.trim();\n return t === \"\" ? undefined : t;\n}\n\nfunction optNum(o: Record<string, unknown>, key: string): number | undefined {\n const v = o[key];\n if (v === undefined || v === null) return undefined;\n if (typeof v !== \"number\" || !Number.isFinite(v)) {\n throw new Error(`${key} must be a finite number`);\n }\n return v;\n}\n\nfunction parseContentObject(raw: unknown): import(\"./types.js\").ContentObject {\n const o = asRecord(raw);\n return {\n id: optStr(o, \"id\"),\n title: optStr(o, \"title\"),\n description: optStr(o, \"description\"),\n url: reqStr(o, \"url\"),\n content: optStr(o, \"content\"),\n type: reqStr(o, \"type\") as import(\"./types.js\").ContentObject[\"type\"],\n };\n}\n\n/**\n * Dispatch a tool call by name. Suitable for wiring `tool_calls` from OpenAI / Anthropic / Gemini.\n *\n * @returns Parsed JSON-serializable API response (throw {@link GalyaApiError} on HTTP errors).\n */\nexport async function executeGalyaAgentTool(\n client: GalyaApiClient,\n name: string,\n args: unknown,\n): Promise<unknown> {\n const o = asRecord(args);\n\n switch (name as GalyaAgentToolName) {\n case \"galya_search\": {\n const additional = o.additional_candidates;\n const candidates =\n Array.isArray(additional) ? additional.map(parseContentObject) : undefined;\n return client.search(\n {\n relativeToEntityId: reqStr(o, \"relative_to_entity_id\"),\n inTermsOfEntityType: reqStr(o, \"in_terms_of_entity_type\"),\n },\n {\n query: reqStr(o, \"query\"),\n ...(candidates?.length ? { additional_candidates: candidates } : {}),\n },\n );\n }\n case \"galya_rerank\": {\n const raw = o.candidates;\n if (!Array.isArray(raw)) {\n throw new Error(\"candidates must be an array\");\n }\n return client.rerank(\n {\n relativeToEntityId: reqStr(o, \"relative_to_entity_id\"),\n inTermsOfEntityType: reqStr(o, \"in_terms_of_entity_type\"),\n },\n { candidates: raw.map(parseContentObject) },\n );\n }\n case \"galya_ask\":\n return client.ask(\n {\n relativeToEntityId: reqStr(o, \"relative_to_entity_id\"),\n inTermsOfEntityType: reqStr(o, \"in_terms_of_entity_type\"),\n },\n { query: reqStr(o, \"query\") },\n );\n case \"galya_explain\":\n return client.explain(\n {\n relativeToEntityId: reqStr(o, \"relative_to_entity_id\"),\n inTermsOfEntityType: reqStr(o, \"in_terms_of_entity_type\"),\n domain: optStr(o, \"domain\") as import(\"./types.js\").Domain | undefined,\n task: optStr(o, \"task\") as import(\"./types.js\").Task | undefined,\n },\n { query: reqStr(o, \"query\") },\n );\n case \"galya_index_content\":\n return client.indexContent({\n content: parseContentObject(o.content),\n entity_id: optStr(o, \"entity_id\"),\n });\n case \"galya_index_content_batch\": {\n const items = o.content;\n if (!Array.isArray(items)) {\n throw new Error(\"content must be an array\");\n }\n const entityIdsRaw = o.entity_ids;\n let entity_ids: (string | null)[] | undefined;\n if (entityIdsRaw !== undefined) {\n if (!Array.isArray(entityIdsRaw)) {\n throw new Error(\"entity_ids must be an array\");\n }\n entity_ids = entityIdsRaw.map((x) => {\n if (x === null) return null;\n if (typeof x === \"string\") return x;\n throw new Error(\"entity_ids entries must be string or null\");\n });\n }\n return client.indexContentBatch({\n content: items.map(parseContentObject),\n ...(entity_ids ? { entity_ids } : {}),\n });\n }\n case \"galya_create_entity\":\n return client.createEntity({\n entity_type: reqStr(o, \"entity_type\") as import(\"./types.js\").EntityType,\n name: reqStr(o, \"name\"),\n description: optStr(o, \"description\"),\n });\n case \"galya_get_entity\":\n return client.getEntity(reqStr(o, \"entity_id\"));\n case \"galya_delete_entity\":\n return client.deleteEntity(reqStr(o, \"entity_id\"));\n case \"galya_register_entity_type\":\n return client.registerEntityType(reqStr(o, \"entity_type\"));\n case \"galya_get_entity_type\":\n return client.getEntityType(reqStr(o, \"entity_type\"));\n case \"galya_list_clusters\":\n return client.listClusters({\n limit: optNum(o, \"limit\"),\n offset: optNum(o, \"offset\"),\n entityType: optStr(o, \"entity_type\"),\n });\n case \"galya_get_cluster\":\n return client.getCluster(reqStr(o, \"cluster_id\"));\n default:\n throw new Error(`Unknown Galya tool: ${name}`);\n }\n}\n"],"mappings":";AACO,IAAM,gCAAgC;AAGtC,IAAM,2BAA2B;;;ACJxC,SAAS,4BAA4B,eAAe,iCAAiC;AA0B9E,IAAM,gBAAN,cAA4B,MAAM;AAAA,EACvC,YACE,SACS,QACA,MACA,MACT;AACA,UAAM,OAAO;AAJJ;AACA;AACA;AAGT,SAAK,OAAO;AAAA,EACd;AAAA,EANW;AAAA,EACA;AAAA,EACA;AAKb;AAgBA,SAAS,UAAU,GAAmB;AACpC,SAAO,EAAE,QAAQ,QAAQ,EAAE;AAC7B;AAGO,SAAS,kBAAkB,OAAuB;AACvD,QAAM,IAAI,MAAM,KAAK;AACrB,MAAI,CAAC,GAAG;AACN,UAAM,IAAI,MAAM,8BAA8B;AAAA,EAChD;AACA,QAAM,UAAU,UAAU,CAAC;AAC3B,SAAO,QAAQ,SAAS,KAAK,IAAI,UAAU,GAAG,OAAO;AACvD;AAEA,SAAS,QAAQ,MAAc,MAAsB;AACnD,QAAM,IAAI,UAAU,IAAI;AACxB,QAAM,IAAI,KAAK,WAAW,GAAG,IAAI,OAAO,IAAI,IAAI;AAChD,SAAO,GAAG,CAAC,GAAG,CAAC;AACjB;AAEO,IAAM,iBAAN,MAAqB;AAAA,EACT;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAEjB,YAAY,MAA6B;AACvC,UAAM,SAAS,KAAK,OAAO,KAAK;AAChC,QAAI,CAAC,QAAQ;AACX,YAAM,IAAI,MAAM,oCAAoC;AAAA,IACtD;AACA,QAAI,2BAA2B,MAAM,KAAK,CAAC,cAAc,MAAM,GAAG;AAChE,YAAM,IAAI;AAAA,QACR;AAAA,MACF;AAAA,IACF;AACA,UAAM,cAAc,KAAK,aAAa,KAAK,KAAK;AAChD,QAAI,0BAA0B,MAAM,KAAK,CAAC,aAAa;AACrD,YAAM,IAAI;AAAA,QACR;AAAA,MACF;AAAA,IACF;AACA,SAAK,UAAU,kBAAkB,KAAK,WAAW,6BAA6B;AAC9E,SAAK,SAAS;AACd,SAAK,cAAc,eAAe;AAClC,SAAK,YAAY,KAAK,SAAS,WAAW,MAAM,KAAK,UAAU;AAAA,EACjE;AAAA,EAEA,MAAc,QACZ,QACA,MACA,MACY;AACZ,QAAI,MAAM,QAAQ,KAAK,SAAS,IAAI;AACpC,QAAI,MAAM,OAAO;AACf,YAAM,IAAI,IAAI,IAAI,GAAG;AACrB,iBAAW,CAAC,GAAG,CAAC,KAAK,OAAO,QAAQ,KAAK,KAAK,GAAG;AAC/C,YAAI,MAAM,UAAa,MAAM,IAAI;AAC/B,YAAE,aAAa,IAAI,GAAG,CAAC;AAAA,QACzB;AAAA,MACF;AACA,YAAM,EAAE,SAAS;AAAA,IACnB;AACA,UAAM,UAAkC;AAAA,MACtC,aAAa,KAAK;AAAA,MAClB,QAAQ;AAAA,IACV;AACA,QAAI,KAAK,aAAa;AACpB,cAAQ,sBAAsB,IAAI,KAAK;AAAA,IACzC;AACA,QAAI;AACJ,QAAI,MAAM,SAAS,QAAW;AAC5B,cAAQ,cAAc,IAAI;AAC1B,aAAO,KAAK,UAAU,KAAK,IAAI;AAAA,IACjC;AACA,UAAM,MAAM,MAAM,KAAK,UAAU,KAAK,EAAE,QAAQ,SAAS,KAAK,CAAC;AAC/D,UAAM,OAAO,MAAM,IAAI,KAAK;AAC5B,QAAI,SAAkB;AACtB,QAAI,MAAM;AACR,UAAI;AACF,iBAAS,KAAK,MAAM,IAAI;AAAA,MAC1B,QAAQ;AACN,iBAAS;AAAA,MACX;AAAA,IACF;AACA,QAAI,CAAC,IAAI,IAAI;AACX,YAAM,SACJ,UAAU,OAAO,WAAW,YAAY,WAAW,QAAQ,WAAW,SACjE,SACD;AACN,YAAM,IAAI;AAAA,QACR,QAAQ,SAAS,QAAQ,IAAI,MAAM;AAAA,QACnC,IAAI;AAAA,QACJ,QAAQ;AAAA,QACR;AAAA,MACF;AAAA,IACF;AACA,WAAO;AAAA,EACT;AAAA,EAEA,MAAM,OACJ,QAIA,MACuB;AACvB,WAAO,KAAK,QAAsB,QAAQ,WAAW;AAAA,MACnD,OAAO;AAAA,QACL,uBAAuB,OAAO;AAAA,QAC9B,yBAAyB,OAAO;AAAA,MAClC;AAAA,MACA;AAAA,IACF,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,OACJ,QAIA,MACuB;AACvB,WAAO,KAAK,QAAsB,QAAQ,WAAW;AAAA,MACnD,OAAO;AAAA,QACL,uBAAuB,OAAO;AAAA,QAC9B,yBAAyB,OAAO;AAAA,MAClC;AAAA,MACA;AAAA,IACF,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,IACJ,QAIA,MACkB;AAClB,WAAO,KAAK,QAAiB,QAAQ,QAAQ;AAAA,MAC3C,OAAO;AAAA,QACL,uBAAuB,OAAO;AAAA,QAC9B,yBAAyB,OAAO;AAAA,MAClC;AAAA,MACA;AAAA,IACF,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,QACJ,QAMA,MACwB;AACxB,WAAO,KAAK,QAAuB,QAAQ,YAAY;AAAA,MACrD,OAAO;AAAA,QACL,uBAAuB,OAAO;AAAA,QAC9B,yBAAyB,OAAO;AAAA,QAChC,QAAQ,OAAO;AAAA,QACf,MAAM,OAAO;AAAA,MACf;AAAA,MACA;AAAA,IACF,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,aAAa,MAA0C;AAC3D,WAAO,KAAK,QAAqB,QAAQ,UAAU,EAAE,KAAK,CAAC;AAAA,EAC7D;AAAA,EAEA,MAAM,kBAAkB,MAAoD;AAC1E,WAAO,KAAK,QAA0B,QAAQ,gBAAgB,EAAE,KAAK,CAAC;AAAA,EACxE;AAAA,EAEA,MAAM,aAAa,MAAwD;AACzE,WAAO,KAAK,QAA4B,QAAQ,WAAW,EAAE,KAAK,CAAC;AAAA,EACrE;AAAA,EAEA,MAAM,UAAU,UAAmC;AACjD,WAAO,KAAK,QAAgB,OAAO,WAAW;AAAA,MAC5C,OAAO,EAAE,WAAW,SAAS;AAAA,IAC/B,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,aAAa,UAA+C;AAChE,WAAO,KAAK,QAA4B,UAAU,WAAW;AAAA,MAC3D,OAAO,EAAE,WAAW,SAAS;AAAA,IAC/B,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,mBAAmB,YAAoD;AAC3E,WAAO,KAAK,QAA+B,QAAQ,gBAAgB;AAAA,MACjE,MAAM,EAAE,aAAa,WAAW;AAAA,IAClC,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,cAAc,YAAsC;AACxD,WAAO,KAAK,QAAiB,OAAO,gBAAgB;AAAA,MAClD,OAAO,EAAE,aAAa,WAAW;AAAA,IACnC,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,aAAa,QAIa;AAC9B,UAAM,IAAwC,CAAC;AAC/C,QAAI,QAAQ,UAAU,QAAW;AAC/B,QAAE,QAAQ,OAAO,OAAO,KAAK;AAAA,IAC/B;AACA,QAAI,QAAQ,WAAW,QAAW;AAChC,QAAE,SAAS,OAAO,OAAO,MAAM;AAAA,IACjC;AACA,QAAI,QAAQ,YAAY;AACtB,QAAE,cAAc,OAAO;AAAA,IACzB;AACA,WAAO,KAAK,QAA4B,OAAO,aAAa,EAAE,OAAO,EAAE,CAAC;AAAA,EAC1E;AAAA,EAEA,MAAM,WAAW,WAAqC;AACpD,WAAO,KAAK,QAAiB,OAAO,YAAY;AAAA,MAC9C,OAAO,EAAE,YAAY,UAAU;AAAA,IACjC,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,oBAAoB,KAA+B;AACjD,QAAI,CAAC,MAAM,QAAQ,GAAG,GAAG;AACvB,aAAO,CAAC;AAAA,IACV;AACA,UAAM,MAAuB,CAAC;AAC9B,eAAW,QAAQ,KAAK;AACtB,UAAI,CAAC,QAAQ,OAAO,SAAS,SAAU;AACvC,YAAM,IAAI;AACV,YAAM,MAAM,OAAO,EAAE,QAAQ,WAAW,EAAE,MAAM;AAChD,YAAM,UAAU,EAAE;AAClB,YAAM,OACJ,YAAY,WAAW,YAAY,UAAU,YAAY,WAAW,YAAY,UAC5E,UACA;AACN,UAAI,CAAC,IAAI,KAAK,EAAG;AACjB,UAAI,KAAK;AAAA,QACP,IAAI,OAAO,EAAE,OAAO,WAAW,EAAE,KAAK;AAAA,QACtC,OAAO,OAAO,EAAE,UAAU,WAAW,EAAE,QAAQ;AAAA,QAC/C,aAAa,OAAO,EAAE,gBAAgB,WAAW,EAAE,cAAc;AAAA,QACjE;AAAA,QACA,SAAS,OAAO,EAAE,YAAY,WAAW,EAAE,UAAU;AAAA,QACrD;AAAA,MACF,CAAC;AAAA,IACH;AACA,WAAO;AAAA,EACT;AACF;;;ACtSO,IAAM,yBAAyB;AAAA,EACpC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAIA,IAAM,iBAAiB,CAAC,WAAW,SAAS,SAAS,QAAQ,WAAW,MAAM;AAE9E,IAAM,kBAAkB,CAAC,SAAS,QAAQ,SAAS,OAAO;AAE1D,IAAM,sBAA+C;AAAA,EACnD,MAAM;AAAA,EACN,YAAY;AAAA,IACV,IAAI,EAAE,MAAM,UAAU,aAAa,wCAAwC;AAAA,IAC3E,OAAO,EAAE,MAAM,SAAS;AAAA,IACxB,aAAa,EAAE,MAAM,SAAS;AAAA,IAC9B,KAAK,EAAE,MAAM,UAAU,aAAa,gDAAgD;AAAA,IACpF,SAAS,EAAE,MAAM,UAAU,aAAa,uCAAuC;AAAA,IAC/E,MAAM,EAAE,MAAM,UAAU,MAAM,CAAC,GAAG,eAAe,GAAG,aAAa,wBAAwB;AAAA,EAC3F;AAAA,EACA,UAAU,CAAC,OAAO,MAAM;AAC1B;AAGO,IAAM,4BAAwD;AAAA,EACnE;AAAA,IACE,MAAM;AAAA,IACN,aACE;AAAA,IACF,YAAY;AAAA,MACV,MAAM;AAAA,MACN,YAAY;AAAA,QACV,uBAAuB;AAAA,UACrB,MAAM;AAAA,UACN,aAAa;AAAA,QACf;AAAA,QACA,yBAAyB;AAAA,UACvB,MAAM;AAAA,UACN,MAAM,CAAC,GAAG,cAAc;AAAA,UACxB,aAAa;AAAA,QACf;AAAA,QACA,OAAO,EAAE,MAAM,UAAU,aAAa,0BAA0B;AAAA,QAChE,uBAAuB;AAAA,UACrB,MAAM;AAAA,UACN,aAAa;AAAA,UACb,OAAO;AAAA,QACT;AAAA,MACF;AAAA,MACA,UAAU,CAAC,yBAAyB,2BAA2B,OAAO;AAAA,MACtE,sBAAsB;AAAA,IACxB;AAAA,EACF;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,aACE;AAAA,IACF,YAAY;AAAA,MACV,MAAM;AAAA,MACN,YAAY;AAAA,QACV,uBAAuB,EAAE,MAAM,SAAS;AAAA,QACxC,yBAAyB,EAAE,MAAM,UAAU,MAAM,CAAC,GAAG,cAAc,EAAE;AAAA,QACrE,YAAY;AAAA,UACV,MAAM;AAAA,UACN,OAAO;AAAA,UACP,aAAa;AAAA,QACf;AAAA,MACF;AAAA,MACA,UAAU,CAAC,yBAAyB,2BAA2B,YAAY;AAAA,MAC3E,sBAAsB;AAAA,IACxB;AAAA,EACF;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,aACE;AAAA,IACF,YAAY;AAAA,MACV,MAAM;AAAA,MACN,YAAY;AAAA,QACV,uBAAuB,EAAE,MAAM,SAAS;AAAA,QACxC,yBAAyB,EAAE,MAAM,UAAU,MAAM,CAAC,GAAG,cAAc,EAAE;AAAA,QACrE,OAAO,EAAE,MAAM,SAAS;AAAA,MAC1B;AAAA,MACA,UAAU,CAAC,yBAAyB,2BAA2B,OAAO;AAAA,MACtE,sBAAsB;AAAA,IACxB;AAAA,EACF;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,aACE;AAAA,IACF,YAAY;AAAA,MACV,MAAM;AAAA,MACN,YAAY;AAAA,QACV,uBAAuB,EAAE,MAAM,SAAS;AAAA,QACxC,yBAAyB,EAAE,MAAM,UAAU,MAAM,CAAC,GAAG,cAAc,EAAE;AAAA,QACrE,OAAO,EAAE,MAAM,SAAS;AAAA,QACxB,QAAQ;AAAA,UACN,MAAM;AAAA,UACN,MAAM,CAAC,aAAa,UAAU,aAAa,MAAM;AAAA,QACnD;AAAA,QACA,MAAM;AAAA,UACJ,MAAM;AAAA,UACN,MAAM,CAAC,gBAAgB,kBAAkB,gBAAgB,eAAe;AAAA,QAC1E;AAAA,MACF;AAAA,MACA,UAAU,CAAC,yBAAyB,2BAA2B,OAAO;AAAA,MACtE,sBAAsB;AAAA,IACxB;AAAA,EACF;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,aACE;AAAA,IACF,YAAY;AAAA,MACV,MAAM;AAAA,MACN,YAAY;AAAA,QACV,SAAS;AAAA,QACT,WAAW;AAAA,UACT,MAAM;AAAA,UACN,aAAa;AAAA,QACf;AAAA,MACF;AAAA,MACA,UAAU,CAAC,SAAS;AAAA,MACpB,sBAAsB;AAAA,IACxB;AAAA,EACF;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,aAAa;AAAA,IACb,YAAY;AAAA,MACV,MAAM;AAAA,MACN,YAAY;AAAA,QACV,SAAS,EAAE,MAAM,SAAS,OAAO,oBAAoB;AAAA,QACrD,YAAY;AAAA,UACV,MAAM;AAAA,UACN,aAAa;AAAA,UACb,OAAO;AAAA,YACL,OAAO,CAAC,EAAE,MAAM,SAAS,GAAG,EAAE,MAAM,OAAO,CAAC;AAAA,UAC9C;AAAA,QACF;AAAA,MACF;AAAA,MACA,UAAU,CAAC,SAAS;AAAA,MACpB,sBAAsB;AAAA,IACxB;AAAA,EACF;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,aACE;AAAA,IACF,YAAY;AAAA,MACV,MAAM;AAAA,MACN,YAAY;AAAA,QACV,aAAa,EAAE,MAAM,UAAU,MAAM,CAAC,GAAG,cAAc,EAAE;AAAA,QACzD,MAAM,EAAE,MAAM,SAAS;AAAA,QACvB,aAAa,EAAE,MAAM,SAAS;AAAA,MAChC;AAAA,MACA,UAAU,CAAC,eAAe,MAAM;AAAA,MAChC,sBAAsB;AAAA,IACxB;AAAA,EACF;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,aAAa;AAAA,IACb,YAAY;AAAA,MACV,MAAM;AAAA,MACN,YAAY;AAAA,QACV,WAAW,EAAE,MAAM,SAAS;AAAA,MAC9B;AAAA,MACA,UAAU,CAAC,WAAW;AAAA,MACtB,sBAAsB;AAAA,IACxB;AAAA,EACF;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,aAAa;AAAA,IACb,YAAY;AAAA,MACV,MAAM;AAAA,MACN,YAAY;AAAA,QACV,WAAW,EAAE,MAAM,SAAS;AAAA,MAC9B;AAAA,MACA,UAAU,CAAC,WAAW;AAAA,MACtB,sBAAsB;AAAA,IACxB;AAAA,EACF;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,aAAa;AAAA,IACb,YAAY;AAAA,MACV,MAAM;AAAA,MACN,YAAY;AAAA,QACV,aAAa,EAAE,MAAM,SAAS;AAAA,MAChC;AAAA,MACA,UAAU,CAAC,aAAa;AAAA,MACxB,sBAAsB;AAAA,IACxB;AAAA,EACF;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,aAAa;AAAA,IACb,YAAY;AAAA,MACV,MAAM;AAAA,MACN,YAAY;AAAA,QACV,aAAa,EAAE,MAAM,SAAS;AAAA,MAChC;AAAA,MACA,UAAU,CAAC,aAAa;AAAA,MACxB,sBAAsB;AAAA,IACxB;AAAA,EACF;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,aAAa;AAAA,IACb,YAAY;AAAA,MACV,MAAM;AAAA,MACN,YAAY;AAAA,QACV,OAAO,EAAE,MAAM,UAAU;AAAA,QACzB,QAAQ,EAAE,MAAM,UAAU;AAAA,QAC1B,aAAa,EAAE,MAAM,UAAU,MAAM,CAAC,GAAG,cAAc,EAAE;AAAA,MAC3D;AAAA,MACA,sBAAsB;AAAA,IACxB;AAAA,EACF;AAAA,EACA;AAAA,IACE,MAAM;AAAA,IACN,aAAa;AAAA,IACb,YAAY;AAAA,MACV,MAAM;AAAA,MACN,YAAY;AAAA,QACV,YAAY,EAAE,MAAM,SAAS;AAAA,MAC/B;AAAA,MACA,UAAU,CAAC,YAAY;AAAA,MACvB,sBAAsB;AAAA,IACxB;AAAA,EACF;AACF;AAYO,SAAS,oBAAoB,OAAmC,2BAAiD;AACtH,SAAO,KAAK,IAAI,CAAC,OAAO;AAAA,IACtB,MAAM;AAAA,IACN,UAAU;AAAA,MACR,MAAM,EAAE;AAAA,MACR,aAAa,EAAE;AAAA,MACf,YAAY,EAAE;AAAA,IAChB;AAAA,EACF,EAAE;AACJ;AAEA,SAAS,SAAS,MAAwC;AACxD,MAAI,CAAC,QAAQ,OAAO,SAAS,YAAY,MAAM,QAAQ,IAAI,GAAG;AAC5D,UAAM,IAAI,MAAM,sCAAsC;AAAA,EACxD;AACA,SAAO;AACT;AAEA,SAAS,OAAO,GAA4B,KAAqB;AAC/D,QAAM,IAAI,EAAE,GAAG;AACf,MAAI,OAAO,MAAM,YAAY,CAAC,EAAE,KAAK,GAAG;AACtC,UAAM,IAAI,MAAM,GAAG,GAAG,6BAA6B;AAAA,EACrD;AACA,SAAO,EAAE,KAAK;AAChB;AAEA,SAAS,OAAO,GAA4B,KAAiC;AAC3E,QAAM,IAAI,EAAE,GAAG;AACf,MAAI,MAAM,UAAa,MAAM,KAAM,QAAO;AAC1C,MAAI,OAAO,MAAM,UAAU;AACzB,UAAM,IAAI,MAAM,GAAG,GAAG,mBAAmB;AAAA,EAC3C;AACA,QAAM,IAAI,EAAE,KAAK;AACjB,SAAO,MAAM,KAAK,SAAY;AAChC;AAEA,SAAS,OAAO,GAA4B,KAAiC;AAC3E,QAAM,IAAI,EAAE,GAAG;AACf,MAAI,MAAM,UAAa,MAAM,KAAM,QAAO;AAC1C,MAAI,OAAO,MAAM,YAAY,CAAC,OAAO,SAAS,CAAC,GAAG;AAChD,UAAM,IAAI,MAAM,GAAG,GAAG,0BAA0B;AAAA,EAClD;AACA,SAAO;AACT;AAEA,SAAS,mBAAmB,KAAkD;AAC5E,QAAM,IAAI,SAAS,GAAG;AACtB,SAAO;AAAA,IACL,IAAI,OAAO,GAAG,IAAI;AAAA,IAClB,OAAO,OAAO,GAAG,OAAO;AAAA,IACxB,aAAa,OAAO,GAAG,aAAa;AAAA,IACpC,KAAK,OAAO,GAAG,KAAK;AAAA,IACpB,SAAS,OAAO,GAAG,SAAS;AAAA,IAC5B,MAAM,OAAO,GAAG,MAAM;AAAA,EACxB;AACF;AAOA,eAAsB,sBACpB,QACA,MACA,MACkB;AAClB,QAAM,IAAI,SAAS,IAAI;AAEvB,UAAQ,MAA4B;AAAA,IAClC,KAAK,gBAAgB;AACnB,YAAM,aAAa,EAAE;AACrB,YAAM,aACJ,MAAM,QAAQ,UAAU,IAAI,WAAW,IAAI,kBAAkB,IAAI;AACnE,aAAO,OAAO;AAAA,QACZ;AAAA,UACE,oBAAoB,OAAO,GAAG,uBAAuB;AAAA,UACrD,qBAAqB,OAAO,GAAG,yBAAyB;AAAA,QAC1D;AAAA,QACA;AAAA,UACE,OAAO,OAAO,GAAG,OAAO;AAAA,UACxB,GAAI,YAAY,SAAS,EAAE,uBAAuB,WAAW,IAAI,CAAC;AAAA,QACpE;AAAA,MACF;AAAA,IACF;AAAA,IACA,KAAK,gBAAgB;AACnB,YAAM,MAAM,EAAE;AACd,UAAI,CAAC,MAAM,QAAQ,GAAG,GAAG;AACvB,cAAM,IAAI,MAAM,6BAA6B;AAAA,MAC/C;AACA,aAAO,OAAO;AAAA,QACZ;AAAA,UACE,oBAAoB,OAAO,GAAG,uBAAuB;AAAA,UACrD,qBAAqB,OAAO,GAAG,yBAAyB;AAAA,QAC1D;AAAA,QACA,EAAE,YAAY,IAAI,IAAI,kBAAkB,EAAE;AAAA,MAC5C;AAAA,IACF;AAAA,IACA,KAAK;AACH,aAAO,OAAO;AAAA,QACZ;AAAA,UACE,oBAAoB,OAAO,GAAG,uBAAuB;AAAA,UACrD,qBAAqB,OAAO,GAAG,yBAAyB;AAAA,QAC1D;AAAA,QACA,EAAE,OAAO,OAAO,GAAG,OAAO,EAAE;AAAA,MAC9B;AAAA,IACF,KAAK;AACH,aAAO,OAAO;AAAA,QACZ;AAAA,UACE,oBAAoB,OAAO,GAAG,uBAAuB;AAAA,UACrD,qBAAqB,OAAO,GAAG,yBAAyB;AAAA,UACxD,QAAQ,OAAO,GAAG,QAAQ;AAAA,UAC1B,MAAM,OAAO,GAAG,MAAM;AAAA,QACxB;AAAA,QACA,EAAE,OAAO,OAAO,GAAG,OAAO,EAAE;AAAA,MAC9B;AAAA,IACF,KAAK;AACH,aAAO,OAAO,aAAa;AAAA,QACzB,SAAS,mBAAmB,EAAE,OAAO;AAAA,QACrC,WAAW,OAAO,GAAG,WAAW;AAAA,MAClC,CAAC;AAAA,IACH,KAAK,6BAA6B;AAChC,YAAM,QAAQ,EAAE;AAChB,UAAI,CAAC,MAAM,QAAQ,KAAK,GAAG;AACzB,cAAM,IAAI,MAAM,0BAA0B;AAAA,MAC5C;AACA,YAAM,eAAe,EAAE;AACvB,UAAI;AACJ,UAAI,iBAAiB,QAAW;AAC9B,YAAI,CAAC,MAAM,QAAQ,YAAY,GAAG;AAChC,gBAAM,IAAI,MAAM,6BAA6B;AAAA,QAC/C;AACA,qBAAa,aAAa,IAAI,CAAC,MAAM;AACnC,cAAI,MAAM,KAAM,QAAO;AACvB,cAAI,OAAO,MAAM,SAAU,QAAO;AAClC,gBAAM,IAAI,MAAM,2CAA2C;AAAA,QAC7D,CAAC;AAAA,MACH;AACA,aAAO,OAAO,kBAAkB;AAAA,QAC9B,SAAS,MAAM,IAAI,kBAAkB;AAAA,QACrC,GAAI,aAAa,EAAE,WAAW,IAAI,CAAC;AAAA,MACrC,CAAC;AAAA,IACH;AAAA,IACA,KAAK;AACH,aAAO,OAAO,aAAa;AAAA,QACzB,aAAa,OAAO,GAAG,aAAa;AAAA,QACpC,MAAM,OAAO,GAAG,MAAM;AAAA,QACtB,aAAa,OAAO,GAAG,aAAa;AAAA,MACtC,CAAC;AAAA,IACH,KAAK;AACH,aAAO,OAAO,UAAU,OAAO,GAAG,WAAW,CAAC;AAAA,IAChD,KAAK;AACH,aAAO,OAAO,aAAa,OAAO,GAAG,WAAW,CAAC;AAAA,IACnD,KAAK;AACH,aAAO,OAAO,mBAAmB,OAAO,GAAG,aAAa,CAAC;AAAA,IAC3D,KAAK;AACH,aAAO,OAAO,cAAc,OAAO,GAAG,aAAa,CAAC;AAAA,IACtD,KAAK;AACH,aAAO,OAAO,aAAa;AAAA,QACzB,OAAO,OAAO,GAAG,OAAO;AAAA,QACxB,QAAQ,OAAO,GAAG,QAAQ;AAAA,QAC1B,YAAY,OAAO,GAAG,aAAa;AAAA,MACrC,CAAC;AAAA,IACH,KAAK;AACH,aAAO,OAAO,WAAW,OAAO,GAAG,YAAY,CAAC;AAAA,IAClD;AACE,YAAM,IAAI,MAAM,uBAAuB,IAAI,EAAE;AAAA,EACjD;AACF;","names":[]}
{
"name": "@galya/agents",
"version": "0.1.0",
"version": "0.2.2",
"publishConfig": {

@@ -38,2 +38,5 @@ "access": "public"

],
"dependencies": {
"@galya/schema": "0.2.2"
},
"devDependencies": {

@@ -40,0 +43,0 @@ "tsup": "^8.3.5",