import { Type } from "typebox"; import { formatAddResult, formatAuthError, formatBillingError, formatUnavailableError, formatGenericError, formatApiKeyMissingError, formatSecurityBlocked } from "../format"; import { checkContent } from "../security"; export function makeAddTool(store) { return { name: "alchemyst_context_add", label: "Alchemyst Context Add", description: "Save a decision, fact, or reference snippet to AlchemystAI's Context Layer so it's retrievable in future sessions. Use `context_type: instruction` for conventions/preferences to remember, `resource` for reference material or decisions.", parameters: Type.Object({ content: Type.String({ description: "The document content to save" }), context_type: Type.Union([ Type.Literal("resource"), Type.Literal("instruction"), ]), scope: Type.Optional( Type.Union([ Type.Literal("internal"), Type.Literal("external"), ]) ), groupName: Type.Optional(Type.Array(Type.String())), source: Type.Optional(Type.String()), }), async execute(_toolCallId, params) { if (!store.client) { return { content: [{ type: "text" as const, text: formatApiKeyMissingError() }], details: {} as const, }; } const securityCheck = checkContent(params.content); if (securityCheck.blocked) { return { content: [ { type: "text" as const, text: formatSecurityBlocked(securityCheck.category) }, ], details: {} as const, }; } const result = await store.client.add({ documents: [{ content: params.content }], context_type: params.context_type, scope: params.scope ?? "internal", source: params.source ?? `pi:${store.config.projectName}`, metadata: { groupName: params.groupName && params.groupName.length > 0 ? params.groupName : store.config.groupName, }, }); if (!result.ok) { if (result.status === 401 || result.status === 403) return { content: [{ type: "text" as const, text: formatAuthError() }], details: {} as const, }; if (result.status === 402) return { content: [{ type: "text" as const, text: formatBillingError() }], details: {} as const, }; if (result.status && result.status >= 500) return { content: [{ type: "text" as const, text: formatUnavailableError() }], details: {} as const, }; return { content: [{ type: "text" as const, text: formatGenericError(result.error) }], details: {} as const, }; } return { content: [ { type: "text" as const, text: formatAddResult( result.data.context_id, result.data.processed_documents, ), }, ], details: { contextId: result.data.context_id, documents: result.data.processed_documents } as const, }; }, }; }