@choiceopen/atomemo-plugin-sdk-js 0.1.0 → 0.1.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.mjs +20 -12
- package/dist/index.mjs.map +1 -1
- package/package.json +2 -2
package/dist/index.mjs
CHANGED
|
@@ -21,11 +21,13 @@ function isNil(x) {
|
|
|
21
21
|
//#endregion
|
|
22
22
|
//#region src/env.ts
|
|
23
23
|
const EnvSchema = z$1.object({
|
|
24
|
-
|
|
24
|
+
HUB_MODE: z$1.enum(["debug", "release"]).default("debug").meta({ description: `The Hub Server runtime mode. This will be "debug" by default.` }),
|
|
25
|
+
HUB_WS_URL: z$1.url({
|
|
25
26
|
protocol: /wss?/,
|
|
26
|
-
error: "
|
|
27
|
+
error: "HUB_WS_URL must be a valid WebSocket URL."
|
|
27
28
|
}),
|
|
28
|
-
|
|
29
|
+
HUB_DEBUG_API_KEY: z$1.string({ error: "HUB_DEBUG_API_KEY must be a string." }).meta({ description: `The API key for the Hub Server` }),
|
|
30
|
+
HUB_ORGANIZATION_ID: z$1.string().optional().meta({ description: `The organization ID for the plugin.` }),
|
|
29
31
|
DEBUG: z$1.string().optional().transform((value) => {
|
|
30
32
|
return isNil(value) ? process.env.NODE_ENV !== "production" : value.toLowerCase() === "true";
|
|
31
33
|
}).meta({ description: `Whether to enable debug mode. This will be enabled automatically when NODE_ENV is not "production". The value must be "true" (case-insensitive) to enable debug mode, otherwise it will be treated as false.` }),
|
|
@@ -33,8 +35,7 @@ const EnvSchema = z$1.object({
|
|
|
33
35
|
"development",
|
|
34
36
|
"production",
|
|
35
37
|
"test"
|
|
36
|
-
]).default("development").meta({ description: `The environment mode. This will be "development" by default.` })
|
|
37
|
-
ORGANIZATION_ID: z$1.string().optional().meta({ description: `The organization ID for the plugin.` })
|
|
38
|
+
]).default("development").meta({ description: `The environment mode. This will be "development" by default.` })
|
|
38
39
|
});
|
|
39
40
|
let env;
|
|
40
41
|
function getEnv() {
|
|
@@ -206,7 +207,7 @@ function createRegistry(plugin) {
|
|
|
206
207
|
*/
|
|
207
208
|
function createTransporter(options = {}) {
|
|
208
209
|
const env$1 = getEnv();
|
|
209
|
-
const socket = new Socket(env$1.
|
|
210
|
+
const socket = new Socket(`${env$1.HUB_WS_URL}/${env$1.HUB_MODE}_socket`, {
|
|
210
211
|
debug: env$1.DEBUG,
|
|
211
212
|
heartbeatIntervalMs: options.heartbeatIntervalMs ?? 30 * 1e3,
|
|
212
213
|
logger(kind, message, data) {
|
|
@@ -216,7 +217,7 @@ function createTransporter(options = {}) {
|
|
|
216
217
|
const inspection = data ? Bun.inspect(data, { colors: true }) : "";
|
|
217
218
|
console.debug(`${timestamp} ${coloredKind} ${coloredMessage}`, inspection);
|
|
218
219
|
},
|
|
219
|
-
params: { api_key: env$1.
|
|
220
|
+
params: { api_key: env$1.HUB_DEBUG_API_KEY }
|
|
220
221
|
});
|
|
221
222
|
socket.onOpen(() => {
|
|
222
223
|
options.onOpen?.();
|
|
@@ -267,7 +268,8 @@ const ToolInvokeMessage = z.object({
|
|
|
267
268
|
request_id: z.string(),
|
|
268
269
|
plugin_name: z.string(),
|
|
269
270
|
tool_name: z.string(),
|
|
270
|
-
parameters: z.json()
|
|
271
|
+
parameters: z.json(),
|
|
272
|
+
credentials: z.json()
|
|
271
273
|
});
|
|
272
274
|
/**
|
|
273
275
|
* Creates a new plugin instance with the specified options.
|
|
@@ -277,14 +279,14 @@ const ToolInvokeMessage = z.object({
|
|
|
277
279
|
*/
|
|
278
280
|
async function createPlugin(options) {
|
|
279
281
|
const env$1 = getEnv();
|
|
280
|
-
if (!env$1.
|
|
282
|
+
if (!env$1.HUB_ORGANIZATION_ID) {
|
|
281
283
|
console.error("DEBUG API Key is invalid. Please run `atomemo plugin refresh-key`");
|
|
282
284
|
process.exit(1);
|
|
283
285
|
}
|
|
284
286
|
let user;
|
|
285
287
|
try {
|
|
286
288
|
user = (await getSession()).user;
|
|
287
|
-
if (user.inherentOrganizationId !== env$1.
|
|
289
|
+
if (user.inherentOrganizationId !== env$1.HUB_ORGANIZATION_ID) {
|
|
288
290
|
console.info("Atomemo does not currently support developing plugins for other organizations. Please wait for official support.");
|
|
289
291
|
process.exit(0);
|
|
290
292
|
}
|
|
@@ -296,6 +298,7 @@ async function createPlugin(options) {
|
|
|
296
298
|
const registry = createRegistry(Object.assign(plugin, {
|
|
297
299
|
author: user.name,
|
|
298
300
|
email: user.email,
|
|
301
|
+
organization_id: env$1.HUB_ORGANIZATION_ID,
|
|
299
302
|
version
|
|
300
303
|
}));
|
|
301
304
|
const transporter = createTransporter(transporterOptions);
|
|
@@ -314,12 +317,17 @@ async function createPlugin(options) {
|
|
|
314
317
|
},
|
|
315
318
|
run: async () => {
|
|
316
319
|
const { channel, dispose } = await transporter.connect(`debug_plugin:${registry.plugin.name}`);
|
|
317
|
-
channel.push("register_plugin", registry.serialize().plugin);
|
|
320
|
+
if (env$1.HUB_MODE === "debug") channel.push("register_plugin", registry.serialize().plugin);
|
|
318
321
|
channel.on("invoke_tool", async (message) => {
|
|
319
322
|
const request_id = message.request_id;
|
|
320
323
|
try {
|
|
321
324
|
const event = ToolInvokeMessage.parse(message);
|
|
322
|
-
const
|
|
325
|
+
const tool = registry.resolve("tool", event.tool_name);
|
|
326
|
+
const { credentials, parameters } = event;
|
|
327
|
+
const data = await tool.invoke({ args: {
|
|
328
|
+
credentials,
|
|
329
|
+
parameters
|
|
330
|
+
} });
|
|
323
331
|
channel.push("invoke_tool_response", {
|
|
324
332
|
request_id,
|
|
325
333
|
data
|
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.mjs","names":["z","env","env"],"sources":["../node_modules/es-toolkit/dist/predicate/isFunction.mjs","../node_modules/es-toolkit/dist/predicate/isNil.mjs","../src/env.ts","../src/config.ts","../src/oneauth.ts","../node_modules/es-toolkit/dist/util/invariant.mjs","../src/utils/serialize-feature.ts","../src/registry.ts","../src/transporter.ts","../src/plugin.ts"],"sourcesContent":["function isFunction(value) {\n return typeof value === 'function';\n}\n\nexport { isFunction };\n","function isNil(x) {\n return x == null;\n}\n\nexport { isNil };\n","import { isNil } from \"es-toolkit/predicate\"\nimport z from \"zod\"\n\ndeclare module \"bun\" {\n interface Env {\n /** The URL of the Hub Server WebSocket. */\n readonly HUB_SERVER_WS_URL: string | undefined\n /** Whether to enable debug mode. */\n readonly DEBUG: boolean\n /** The API key for the Hub Server. */\n readonly DEBUG_API_KEY: string | undefined\n /** The organization ID for the plugin. */\n readonly ORGANIZATION_ID: string | undefined\n }\n}\n\nconst EnvSchema = z.object({\n HUB_SERVER_WS_URL: z.url({\n protocol: /wss?/,\n error: \"HUB_SERVER_WS_URL must be a valid WebSocket URL.\",\n }),\n DEBUG_API_KEY: z\n .string({\n error: \"DEBUG_API_KEY must be a string.\",\n })\n .meta({ description: `The API key for the Hub Server` }),\n DEBUG: z\n .string()\n .optional()\n .transform((value) => {\n return isNil(value) ? process.env.NODE_ENV !== \"production\" : value.toLowerCase() === \"true\"\n })\n .meta({\n description: `Whether to enable debug mode. This will be enabled automatically when NODE_ENV is not \"production\". The value must be \"true\" (case-insensitive) to enable debug mode, otherwise it will be treated as false.`,\n }),\n NODE_ENV: z.enum([\"development\", \"production\", \"test\"]).default(\"development\").meta({\n description: `The environment mode. This will be \"development\" by default.`,\n }),\n ORGANIZATION_ID: z\n .string()\n .optional()\n .meta({ description: `The organization ID for the plugin.` }),\n})\n\nlet env: z.infer<typeof EnvSchema> | undefined\n\nexport function getEnv() {\n if (isNil(env)) {\n const result = EnvSchema.safeParse(process.env)\n\n if (!result.success) {\n console.error(z.prettifyError(result.error))\n process.exit(1)\n }\n\n env = result.data\n }\n\n return env\n}\n","import { readFileSync } from \"node:fs\"\nimport { homedir } from \"node:os\"\nimport { join } from \"node:path\"\nimport { z } from \"zod\"\n\nconst ConfigSchema = z.object({\n auth: z\n .object({\n endpoint: z.url().optional(),\n access_token: z.string().optional(),\n })\n .optional(),\n hub: z\n .object({\n endpoint: z.url().optional(),\n })\n .optional(),\n})\n\nexport type Config = z.infer<typeof ConfigSchema>\n\nconst CONFIG_PATH = join(homedir(), \".choiceform\", \"atomemo.json\")\n\n/**\n * Reads and parses the atomemo.json config file from the user's home directory.\n *\n * @returns The parsed config object, or undefined if the file doesn't exist.\n * @throws If the file exists but contains invalid JSON or doesn't match the schema.\n */\nexport function readConfig(): Config | undefined {\n try {\n const content = readFileSync(CONFIG_PATH, \"utf-8\")\n const json = JSON.parse(content)\n return ConfigSchema.parse(json)\n } catch (error) {\n if (error && typeof error === \"object\" && \"code\" in error && error.code === \"ENOENT\") {\n // File doesn't exist\n return undefined\n }\n // Re-throw other errors (parse errors, schema validation errors, etc.)\n throw error\n }\n}\n","import { z } from \"zod\"\nimport { readConfig } from \"./config\"\n\nconst SessionSchema = z.object({\n id: z.string().optional(),\n expiresAt: z.string(),\n token: z.string(),\n createdAt: z.string(),\n updatedAt: z.string(),\n ipAddress: z.string().optional(),\n userAgent: z.string().optional(),\n userId: z.string(),\n impersonatedBy: z.string().nullish(),\n activeOrganizationId: z.string().nullish(),\n activeTeamId: z.string().nullish(),\n})\n\nconst UserSchema = z.object({\n id: z.string().optional(),\n name: z.string(),\n email: z.string(),\n emailVerified: z.boolean().optional(),\n image: z.string().optional(),\n createdAt: z.string(),\n updatedAt: z.string(),\n role: z.string().optional(),\n banned: z.boolean().optional(),\n banReason: z.string().nullish(),\n banExpires: z.string().nullish(),\n lastLoginMethod: z.string().optional(),\n inherentOrganizationId: z.string(),\n inherentTeamId: z.string(),\n metadata: z.unknown().optional(),\n stripeCustomerId: z.string().nullish(),\n})\n\nconst GetSessionResponseSchema = z.object({\n session: SessionSchema,\n user: UserSchema,\n})\n\nexport type Session = z.infer<typeof SessionSchema>\nexport type User = z.infer<typeof UserSchema>\nexport type GetSessionResponse = z.infer<typeof GetSessionResponseSchema>\n\nconst DEFAULT_ENDPOINT = \"https://oneauth.choiceform.io\"\n\n/**\n * Fetches the current session and user information from the OneAuth API.\n *\n * @returns The session and user information.\n * @throws If the config file is missing, access token is missing, or the API request fails.\n */\nexport async function getSession(): Promise<GetSessionResponse> {\n const config = readConfig()\n\n if (!config?.auth?.access_token) {\n throw new Error(\n \"Access token not found. Please ensure ~/.choiceform/atomemo.json contains auth.access_token\",\n )\n }\n\n const endpoint = config.auth.endpoint || DEFAULT_ENDPOINT\n const url = new URL(\"/v1/auth/get-session\", endpoint).toString()\n\n const response = await fetch(url, {\n method: \"GET\",\n headers: {\n Authorization: `Bearer ${config.auth.access_token}`,\n \"Content-Type\": \"application/json\",\n },\n })\n\n if (!response.ok) {\n const errorText = await response.text().catch(() => \"Unknown error\")\n throw new Error(\n `OneAuth API request failed: ${response.status} ${response.statusText}. ${errorText}`,\n )\n }\n\n const data = await response.json()\n return GetSessionResponseSchema.parse(data)\n}\n","function invariant(condition, message) {\n if (condition) {\n return;\n }\n if (typeof message === 'string') {\n throw new Error(message);\n }\n throw message;\n}\n\nexport { invariant };\n","import { isFunction } from \"es-toolkit/predicate\"\nimport type { JsonValue } from \"type-fest\"\n\n/**\n * Serializes a Feature object by removing any function-type properties.\n *\n * @param feature - The Feature object to serialize.\n * @returns An object with only non-function properties of the Feature.\n */\nexport const serializeFeature = (feature: Record<string, unknown>) => {\n return Object.keys(feature).reduce<Record<string, JsonValue>>((finale, key) => {\n const value = feature[key]\n\n if (isFunction(value)) {\n return finale\n }\n\n return Object.assign(finale, { [key]: value as JsonValue })\n }, {})\n}\n","import type {\n CredentialDefinitionSchema,\n ModelDefinitionSchema,\n ToolDefinitionSchema,\n} from \"@choiceopen/atomemo-plugin-schema/schemas\"\nimport type {\n DataSourceDefinition,\n PluginDefinition,\n} from \"@choiceopen/atomemo-plugin-schema/types\"\nimport { assert } from \"es-toolkit\"\nimport type { JsonValue, Simplify } from \"type-fest\"\nimport type { z } from \"zod\"\nimport type { TransporterOptions } from \"./transporter\"\nimport { serializeFeature } from \"./utils/serialize-feature\"\n\ntype PluginRegistry = Simplify<\n Omit<PluginDefinition<string[], TransporterOptions>, \"transporterOptions\">\n>\n\ntype CredentialDefinition = z.infer<typeof CredentialDefinitionSchema>\ntype ModelDefinition = z.infer<typeof ModelDefinitionSchema>\ntype ToolDefinition = z.infer<typeof ToolDefinitionSchema>\ntype Feature = CredentialDefinition | DataSourceDefinition | ModelDefinition | ToolDefinition\n\ninterface RegistryStore {\n plugin: PluginRegistry\n credential: Map<CredentialDefinition[\"name\"], CredentialDefinition>\n // data_source: Map<DataSourceDefinition[\"name\"], DataSourceDefinition>\n model: Map<ModelDefinition[\"name\"], ModelDefinition>\n tool: Map<ToolDefinition[\"name\"], ToolDefinition>\n}\n\nexport type FeatureType = keyof Pick<RegistryStore, \"credential\" | \"model\" | \"tool\">\n\nexport interface Registry {\n /**\n * The plugin metadata and definitions, excluding transporter options.\n */\n plugin: PluginRegistry\n\n /**\n * Registers a feature (credential, data source, model, or tool) into the registry.\n *\n * @param type - The type of the feature to register (\"credential\", \"data_source\", \"model\", or \"tool\").\n * @param feature - The feature definition to register.\n */\n register: {\n (type: \"credential\", feature: CredentialDefinition): void\n // (type: \"data_source\", feature: DataSourceDefinition): void\n (type: \"model\", feature: ModelDefinition): void\n (type: \"tool\", feature: ToolDefinition): void\n }\n\n /**\n * Resolves and retrieves a registered feature (credential, data source, model, or tool) by its type and name.\n *\n * @param type - The type of the feature (\"credential\", \"data_source\", \"model\", or \"tool\").\n * @param featureName - The name of the feature to resolve.\n * @returns The resolved feature definition.\n * @throws If the feature is not registered.\n */\n resolve: {\n (type: \"credential\", featureName: string): CredentialDefinition\n // (type: \"data_source\", featureName: string): DataSourceDefinition\n (type: \"model\", featureName: string): ModelDefinition\n (type: \"tool\", featureName: string): ToolDefinition\n }\n\n /**\n * Serializes the registry into a JSON-like object.\n *\n * @returns The serialized registry.\n */\n serialize: () => {\n plugin: PluginRegistry & Record<`${FeatureType}s`, Array<Record<string, JsonValue>>>\n }\n}\n\nexport function createRegistry(plugin: PluginRegistry): Registry {\n const store: RegistryStore = {\n plugin,\n credential: new Map(),\n // data_source: new Map(),\n model: new Map(),\n tool: new Map(),\n }\n\n function register(type: \"credential\", feature: CredentialDefinition): void\n // function register(type: \"data_source\", feature: DataSourceDefinition): void\n function register(type: \"model\", feature: ModelDefinition): void\n function register(type: \"tool\", feature: ToolDefinition): void\n // biome-ignore lint/suspicious/noExplicitAny: any is used to avoid type errors\n function register(type: FeatureType, feature: any): void {\n store[type].set(feature.name, feature)\n }\n\n function resolve(type: \"credential\", featureName: string): CredentialDefinition\n // function resolve(type: \"data_source\", featureName: string): DataSourceDefinition\n function resolve(type: \"model\", featureName: string): ModelDefinition\n function resolve(type: \"tool\", featureName: string): ToolDefinition\n function resolve(type: FeatureType, featureName: string): Feature {\n const feature = store[type].get(featureName)\n assert(feature, `Feature \"${featureName}\" not registered`)\n return feature\n }\n\n return {\n plugin: store.plugin,\n register,\n resolve,\n serialize: () => {\n assert(store.plugin, \"Plugin is not registered\")\n\n return {\n plugin: Object.assign(store.plugin, {\n credentials: Array.from(store.credential.values()).map(serializeFeature),\n // data_sources: Array.from(store.data_source.values()).map(serializeFeature),\n models: Array.from(store.model.values()).map(serializeFeature),\n tools: Array.from(store.tool.values()).map(serializeFeature),\n }),\n }\n },\n }\n}\n","import chalk from \"chalk\"\nimport { type Channel, Socket, type SocketConnectOption } from \"phoenix\"\nimport { getEnv } from \"./env\"\n\nexport interface TransporterOptions\n extends Partial<Pick<SocketConnectOption, \"heartbeatIntervalMs\">> {\n onOpen?: Parameters<Socket[\"onOpen\"]>[0]\n onClose?: Parameters<Socket[\"onClose\"]>[0]\n onError?: Parameters<Socket[\"onError\"]>[0]\n onMessage?: Parameters<Socket[\"onMessage\"]>[0]\n}\n\n/**\n * Creates a network transporter for communication with the Hub Server.\n *\n * @param options - The options for the transporter.\n * @returns An object with a connect method to establish the connection and a dispose method to close it.\n */\nexport function createTransporter(options: TransporterOptions = {}) {\n const env = getEnv()\n\n const socket = new Socket(env.HUB_SERVER_WS_URL, {\n debug: env.DEBUG,\n heartbeatIntervalMs: options.heartbeatIntervalMs ?? 30 * 1000,\n logger(kind, message: unknown, data) {\n const timestamp = chalk.bgGrey(` ${new Date().toLocaleString()} `)\n const coloredKind = chalk.underline.bold.yellow(kind.toUpperCase())\n const coloredMessage =\n message instanceof Object && \"message\" in message\n ? chalk.italic.red(message.message)\n : chalk.italic.dim(message)\n const inspection = data ? Bun.inspect(data, { colors: true }) : \"\"\n console.debug(`${timestamp} ${coloredKind} ${coloredMessage}`, inspection)\n },\n params: { api_key: env.DEBUG_API_KEY },\n })\n\n socket.onOpen(() => {\n options.onOpen?.()\n })\n\n socket.onClose((event) => {\n options.onClose?.(event)\n })\n\n socket.onError((error, transport, establishedConnections) => {\n if (error instanceof ErrorEvent && error.message.includes(\"failed: Expected 101 status code\")) {\n console.error(\"Error: Can't connect to the Plugin Hub server.\\n\")\n console.error(\"This is usually because the Debug API Key is missing or has expired.\\n\")\n console.error(\"Run `atomemo plugin refresh-key` to get a new key.\\n\")\n process.exit(1)\n }\n options.onError?.(error, transport, establishedConnections)\n })\n\n socket.onMessage((message) => {\n options.onMessage?.(message)\n })\n\n socket.connect()\n\n return {\n /**\n * Connects to the specified channel and returns a channel object and a dispose function.\n *\n * @returns An object with a channel property and a dispose function.\n */\n connect: (channelName: string) => {\n return new Promise<{ channel: Channel; dispose: () => void }>((resolve, reject) => {\n const channel = socket.channel(channelName, {})\n\n channel\n .join()\n .receive(\"ok\", (response) => {\n socket.log(\"channel:joined\", `Joined ${channelName} successfully`, response)\n\n resolve({\n channel,\n dispose: () => {\n channel.leave()\n socket.disconnect()\n process.exit(0)\n },\n })\n })\n .receive(\"error\", (response) => {\n socket.log(\"channel:error\", `Failed to join ${channelName}`, response)\n\n reject(new Error(`Failed to join ${channelName}: ${response.reason}`))\n })\n .receive(\"timeout\", (response) => {\n socket.log(\"channel:timeout\", `Timeout while joining ${channelName}`, response)\n reject(new Error(`Timeout while joining ${channelName}`))\n })\n })\n },\n }\n}\n","import {\n CredentialDefinitionSchema,\n ModelDefinitionSchema,\n ToolDefinitionSchema,\n} from \"@choiceopen/atomemo-plugin-schema/schemas\"\nimport type { PluginDefinition } from \"@choiceopen/atomemo-plugin-schema/types\"\nimport { z } from \"zod\"\nimport { getEnv } from \"./env\"\nimport { getSession } from \"./oneauth\"\nimport { createRegistry } from \"./registry\"\nimport { createTransporter, type TransporterOptions } from \"./transporter\"\n\nconst ToolInvokeMessage = z.object({\n request_id: z.string(),\n plugin_name: z.string(),\n tool_name: z.string(),\n parameters: z.json(),\n})\n\ntype CredentialDefinition = z.infer<typeof CredentialDefinitionSchema>\ntype ToolDefinition = z.infer<typeof ToolDefinitionSchema>\ntype ModelDefinition = z.infer<typeof ModelDefinitionSchema>\n\n/**\n * Creates a new plugin instance with the specified options.\n *\n * @param options - The options for configuring the plugin instance.\n * @returns An object containing methods to define providers and run the plugin process.\n */\nexport async function createPlugin<Locales extends string[]>(\n options: PluginDefinition<Locales, TransporterOptions>,\n) {\n // Validate organization ID before creating registry\n const env = getEnv()\n if (!env.ORGANIZATION_ID) {\n console.error(\"DEBUG API Key is invalid. Please run `atomemo plugin refresh-key`\")\n process.exit(1)\n }\n\n // Fetch user session and validate organization\n let user: { name: string; email: string; inherentOrganizationId?: string }\n try {\n const sessionData = await getSession()\n user = sessionData.user\n\n if (user.inherentOrganizationId !== env.ORGANIZATION_ID) {\n console.info(\n \"Atomemo does not currently support developing plugins for other organizations. Please wait for official support.\",\n )\n process.exit(0)\n }\n } catch (error) {\n console.error(\"Failed to fetch session:\", error instanceof Error ? error.message : error)\n process.exit(1)\n }\n\n // Merge user info into plugin options\n const { transporterOptions, version = process.env.npm_package_version, ...plugin } = options\n const pluginDefinition = Object.assign(plugin, {\n author: user.name,\n email: user.email,\n version,\n })\n\n const registry = createRegistry(pluginDefinition)\n const transporter = createTransporter(transporterOptions)\n\n return {\n /**\n * Adds a new credential definition in the registry.\n *\n * @param credential - The credential to add.\n * @throws Error if the credential is not registered.\n */\n addCredential: (credential: CredentialDefinition) => {\n const definition = CredentialDefinitionSchema.parse(credential)\n registry.register(\"credential\", definition)\n },\n\n /**\n * Adds a new tool definition in the registry.\n *\n * @param tool - The tool to add.\n * @throws Error if the tool is not registered.\n */\n addTool: (tool: ToolDefinition) => {\n const definition = ToolDefinitionSchema.parse(tool)\n registry.register(\"tool\", definition)\n },\n\n /**\n * Adds a new model definition in the registry.\n *\n * @param model - The model to add.\n * @throws Error if the model is not registered.\n */\n addModel: (model: ModelDefinition) => {\n const definition = ModelDefinitionSchema.parse(model)\n registry.register(\"model\", definition)\n },\n\n /**\n * Starts the plugin's main process. This establishes the transporter connection and\n * sets up signal handlers for graceful shutdown on SIGINT and SIGTERM.\n */\n run: async () => {\n const { channel, dispose } = await transporter.connect(`debug_plugin:${registry.plugin.name}`)\n\n channel.push(\"register_plugin\", registry.serialize().plugin)\n\n channel.on(\"invoke_tool\", async (message) => {\n const request_id = message.request_id\n\n try {\n const event = ToolInvokeMessage.parse(message)\n const tool = registry.resolve(\"tool\", event.tool_name)\n const data = await tool.invoke({ args: event.parameters })\n channel.push(\"invoke_tool_response\", { request_id, data })\n } catch (error) {\n if (error instanceof Error) {\n channel.push(\"invoke_tool_error\", { request_id, ...error })\n } else {\n channel.push(\"invoke_tool_error\", { request_id, message: \"Unexpected Error\" })\n }\n }\n })\n\n void [\"SIGINT\", \"SIGTERM\"].forEach((signal) => {\n void process.on(signal, dispose)\n })\n },\n }\n}\n"],"x_google_ignoreList":[0,1,5],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.mjs","names":["z","env","env"],"sources":["../node_modules/es-toolkit/dist/predicate/isFunction.mjs","../node_modules/es-toolkit/dist/predicate/isNil.mjs","../src/env.ts","../src/config.ts","../src/oneauth.ts","../node_modules/es-toolkit/dist/util/invariant.mjs","../src/utils/serialize-feature.ts","../src/registry.ts","../src/transporter.ts","../src/plugin.ts"],"sourcesContent":["function isFunction(value) {\n return typeof value === 'function';\n}\n\nexport { isFunction };\n","function isNil(x) {\n return x == null;\n}\n\nexport { isNil };\n","import { isNil } from \"es-toolkit/predicate\"\nimport z from \"zod\"\n\ndeclare module \"bun\" {\n interface Env {\n /** The Hub Server runtime mode. */\n readonly HUB_MODE: \"debug\" | \"release\"\n /** The URL of the Hub Server WebSocket. */\n readonly HUB_WS_URL: string | undefined\n /** Whether to enable debug mode. */\n readonly DEBUG: boolean\n /** The API key for the Hub Server. */\n readonly HUB_DEBUG_API_KEY: string | undefined\n /** The organization ID for the plugin. */\n readonly HUB_ORGANIZATION_ID: string | undefined\n }\n}\n\nconst EnvSchema = z.object({\n HUB_MODE: z.enum([\"debug\", \"release\"]).default(\"debug\").meta({\n description: `The Hub Server runtime mode. This will be \"debug\" by default.`,\n }),\n HUB_WS_URL: z.url({\n protocol: /wss?/,\n error: \"HUB_WS_URL must be a valid WebSocket URL.\",\n }),\n HUB_DEBUG_API_KEY: z\n .string({\n error: \"HUB_DEBUG_API_KEY must be a string.\",\n })\n .meta({ description: `The API key for the Hub Server` }),\n HUB_ORGANIZATION_ID: z\n .string()\n .optional()\n .meta({ description: `The organization ID for the plugin.` }),\n DEBUG: z\n .string()\n .optional()\n .transform((value) => {\n return isNil(value) ? process.env.NODE_ENV !== \"production\" : value.toLowerCase() === \"true\"\n })\n .meta({\n description: `Whether to enable debug mode. This will be enabled automatically when NODE_ENV is not \"production\". The value must be \"true\" (case-insensitive) to enable debug mode, otherwise it will be treated as false.`,\n }),\n NODE_ENV: z.enum([\"development\", \"production\", \"test\"]).default(\"development\").meta({\n description: `The environment mode. This will be \"development\" by default.`,\n }),\n})\n\nlet env: z.infer<typeof EnvSchema> | undefined\n\nexport function getEnv() {\n if (isNil(env)) {\n const result = EnvSchema.safeParse(process.env)\n\n if (!result.success) {\n console.error(z.prettifyError(result.error))\n process.exit(1)\n }\n\n env = result.data\n }\n\n return env\n}\n","import { readFileSync } from \"node:fs\"\nimport { homedir } from \"node:os\"\nimport { join } from \"node:path\"\nimport { z } from \"zod\"\n\nconst ConfigSchema = z.object({\n auth: z\n .object({\n endpoint: z.url().optional(),\n access_token: z.string().optional(),\n })\n .optional(),\n hub: z\n .object({\n endpoint: z.url().optional(),\n })\n .optional(),\n})\n\nexport type Config = z.infer<typeof ConfigSchema>\n\nconst CONFIG_PATH = join(homedir(), \".choiceform\", \"atomemo.json\")\n\n/**\n * Reads and parses the atomemo.json config file from the user's home directory.\n *\n * @returns The parsed config object, or undefined if the file doesn't exist.\n * @throws If the file exists but contains invalid JSON or doesn't match the schema.\n */\nexport function readConfig(): Config | undefined {\n try {\n const content = readFileSync(CONFIG_PATH, \"utf-8\")\n const json = JSON.parse(content)\n return ConfigSchema.parse(json)\n } catch (error) {\n if (error && typeof error === \"object\" && \"code\" in error && error.code === \"ENOENT\") {\n // File doesn't exist\n return undefined\n }\n // Re-throw other errors (parse errors, schema validation errors, etc.)\n throw error\n }\n}\n","import { z } from \"zod\"\nimport { readConfig } from \"./config\"\n\nconst SessionSchema = z.object({\n id: z.string().optional(),\n expiresAt: z.string(),\n token: z.string(),\n createdAt: z.string(),\n updatedAt: z.string(),\n ipAddress: z.string().optional(),\n userAgent: z.string().optional(),\n userId: z.string(),\n impersonatedBy: z.string().nullish(),\n activeOrganizationId: z.string().nullish(),\n activeTeamId: z.string().nullish(),\n})\n\nconst UserSchema = z.object({\n id: z.string().optional(),\n name: z.string(),\n email: z.string(),\n emailVerified: z.boolean().optional(),\n image: z.string().optional(),\n createdAt: z.string(),\n updatedAt: z.string(),\n role: z.string().optional(),\n banned: z.boolean().optional(),\n banReason: z.string().nullish(),\n banExpires: z.string().nullish(),\n lastLoginMethod: z.string().optional(),\n inherentOrganizationId: z.string(),\n inherentTeamId: z.string(),\n metadata: z.unknown().optional(),\n stripeCustomerId: z.string().nullish(),\n})\n\nconst GetSessionResponseSchema = z.object({\n session: SessionSchema,\n user: UserSchema,\n})\n\nexport type Session = z.infer<typeof SessionSchema>\nexport type User = z.infer<typeof UserSchema>\nexport type GetSessionResponse = z.infer<typeof GetSessionResponseSchema>\n\nconst DEFAULT_ENDPOINT = \"https://oneauth.choiceform.io\"\n\n/**\n * Fetches the current session and user information from the OneAuth API.\n *\n * @returns The session and user information.\n * @throws If the config file is missing, access token is missing, or the API request fails.\n */\nexport async function getSession(): Promise<GetSessionResponse> {\n const config = readConfig()\n\n if (!config?.auth?.access_token) {\n throw new Error(\n \"Access token not found. Please ensure ~/.choiceform/atomemo.json contains auth.access_token\",\n )\n }\n\n const endpoint = config.auth.endpoint || DEFAULT_ENDPOINT\n const url = new URL(\"/v1/auth/get-session\", endpoint).toString()\n\n const response = await fetch(url, {\n method: \"GET\",\n headers: {\n Authorization: `Bearer ${config.auth.access_token}`,\n \"Content-Type\": \"application/json\",\n },\n })\n\n if (!response.ok) {\n const errorText = await response.text().catch(() => \"Unknown error\")\n throw new Error(\n `OneAuth API request failed: ${response.status} ${response.statusText}. ${errorText}`,\n )\n }\n\n const data = await response.json()\n return GetSessionResponseSchema.parse(data)\n}\n","function invariant(condition, message) {\n if (condition) {\n return;\n }\n if (typeof message === 'string') {\n throw new Error(message);\n }\n throw message;\n}\n\nexport { invariant };\n","import { isFunction } from \"es-toolkit/predicate\"\nimport type { JsonValue } from \"type-fest\"\n\n/**\n * Serializes a Feature object by removing any function-type properties.\n *\n * @param feature - The Feature object to serialize.\n * @returns An object with only non-function properties of the Feature.\n */\nexport const serializeFeature = (feature: Record<string, unknown>) => {\n return Object.keys(feature).reduce<Record<string, JsonValue>>((finale, key) => {\n const value = feature[key]\n\n if (isFunction(value)) {\n return finale\n }\n\n return Object.assign(finale, { [key]: value as JsonValue })\n }, {})\n}\n","import type {\n CredentialDefinitionSchema,\n ModelDefinitionSchema,\n ToolDefinitionSchema,\n} from \"@choiceopen/atomemo-plugin-schema/schemas\"\nimport type {\n DataSourceDefinition,\n PluginDefinition,\n} from \"@choiceopen/atomemo-plugin-schema/types\"\nimport { assert } from \"es-toolkit\"\nimport type { JsonValue, Simplify } from \"type-fest\"\nimport type { z } from \"zod\"\nimport type { TransporterOptions } from \"./transporter\"\nimport { serializeFeature } from \"./utils/serialize-feature\"\n\ntype PluginRegistry = Simplify<\n Omit<PluginDefinition<string[], TransporterOptions>, \"transporterOptions\">\n>\n\ntype CredentialDefinition = z.infer<typeof CredentialDefinitionSchema>\ntype ModelDefinition = z.infer<typeof ModelDefinitionSchema>\ntype ToolDefinition = z.infer<typeof ToolDefinitionSchema>\ntype Feature = CredentialDefinition | DataSourceDefinition | ModelDefinition | ToolDefinition\n\ninterface RegistryStore {\n plugin: PluginRegistry\n credential: Map<CredentialDefinition[\"name\"], CredentialDefinition>\n // data_source: Map<DataSourceDefinition[\"name\"], DataSourceDefinition>\n model: Map<ModelDefinition[\"name\"], ModelDefinition>\n tool: Map<ToolDefinition[\"name\"], ToolDefinition>\n}\n\nexport type FeatureType = keyof Pick<RegistryStore, \"credential\" | \"model\" | \"tool\">\n\nexport interface Registry {\n /**\n * The plugin metadata and definitions, excluding transporter options.\n */\n plugin: PluginRegistry\n\n /**\n * Registers a feature (credential, data source, model, or tool) into the registry.\n *\n * @param type - The type of the feature to register (\"credential\", \"data_source\", \"model\", or \"tool\").\n * @param feature - The feature definition to register.\n */\n register: {\n (type: \"credential\", feature: CredentialDefinition): void\n // (type: \"data_source\", feature: DataSourceDefinition): void\n (type: \"model\", feature: ModelDefinition): void\n (type: \"tool\", feature: ToolDefinition): void\n }\n\n /**\n * Resolves and retrieves a registered feature (credential, data source, model, or tool) by its type and name.\n *\n * @param type - The type of the feature (\"credential\", \"data_source\", \"model\", or \"tool\").\n * @param featureName - The name of the feature to resolve.\n * @returns The resolved feature definition.\n * @throws If the feature is not registered.\n */\n resolve: {\n (type: \"credential\", featureName: string): CredentialDefinition\n // (type: \"data_source\", featureName: string): DataSourceDefinition\n (type: \"model\", featureName: string): ModelDefinition\n (type: \"tool\", featureName: string): ToolDefinition\n }\n\n /**\n * Serializes the registry into a JSON-like object.\n *\n * @returns The serialized registry.\n */\n serialize: () => {\n plugin: PluginRegistry & Record<`${FeatureType}s`, Array<Record<string, JsonValue>>>\n }\n}\n\nexport function createRegistry(plugin: PluginRegistry): Registry {\n const store: RegistryStore = {\n plugin,\n credential: new Map(),\n // data_source: new Map(),\n model: new Map(),\n tool: new Map(),\n }\n\n function register(type: \"credential\", feature: CredentialDefinition): void\n // function register(type: \"data_source\", feature: DataSourceDefinition): void\n function register(type: \"model\", feature: ModelDefinition): void\n function register(type: \"tool\", feature: ToolDefinition): void\n // biome-ignore lint/suspicious/noExplicitAny: any is used to avoid type errors\n function register(type: FeatureType, feature: any): void {\n store[type].set(feature.name, feature)\n }\n\n function resolve(type: \"credential\", featureName: string): CredentialDefinition\n // function resolve(type: \"data_source\", featureName: string): DataSourceDefinition\n function resolve(type: \"model\", featureName: string): ModelDefinition\n function resolve(type: \"tool\", featureName: string): ToolDefinition\n function resolve(type: FeatureType, featureName: string): Feature {\n const feature = store[type].get(featureName)\n assert(feature, `Feature \"${featureName}\" not registered`)\n return feature\n }\n\n return {\n plugin: store.plugin,\n register,\n resolve,\n serialize: () => {\n assert(store.plugin, \"Plugin is not registered\")\n\n return {\n plugin: Object.assign(store.plugin, {\n credentials: Array.from(store.credential.values()).map(serializeFeature),\n // data_sources: Array.from(store.data_source.values()).map(serializeFeature),\n models: Array.from(store.model.values()).map(serializeFeature),\n tools: Array.from(store.tool.values()).map(serializeFeature),\n }),\n }\n },\n }\n}\n","import chalk from \"chalk\"\nimport { type Channel, Socket, type SocketConnectOption } from \"phoenix\"\nimport { getEnv } from \"./env\"\n\nexport interface TransporterOptions\n extends Partial<Pick<SocketConnectOption, \"heartbeatIntervalMs\">> {\n onOpen?: Parameters<Socket[\"onOpen\"]>[0]\n onClose?: Parameters<Socket[\"onClose\"]>[0]\n onError?: Parameters<Socket[\"onError\"]>[0]\n onMessage?: Parameters<Socket[\"onMessage\"]>[0]\n}\n\n/**\n * Creates a network transporter for communication with the Hub Server.\n *\n * @param options - The options for the transporter.\n * @returns An object with a connect method to establish the connection and a dispose method to close it.\n */\nexport function createTransporter(options: TransporterOptions = {}) {\n const env = getEnv()\n\n const url = `${env.HUB_WS_URL}/${env.HUB_MODE}_socket`\n const socket = new Socket(url, {\n debug: env.DEBUG,\n heartbeatIntervalMs: options.heartbeatIntervalMs ?? 30 * 1000,\n logger(kind, message: unknown, data) {\n const timestamp = chalk.bgGrey(` ${new Date().toLocaleString()} `)\n const coloredKind = chalk.underline.bold.yellow(kind.toUpperCase())\n const coloredMessage =\n message instanceof Object && \"message\" in message\n ? chalk.italic.red(message.message)\n : chalk.italic.dim(message)\n const inspection = data ? Bun.inspect(data, { colors: true }) : \"\"\n console.debug(`${timestamp} ${coloredKind} ${coloredMessage}`, inspection)\n },\n params: { api_key: env.HUB_DEBUG_API_KEY },\n })\n\n socket.onOpen(() => {\n options.onOpen?.()\n })\n\n socket.onClose((event) => {\n options.onClose?.(event)\n })\n\n socket.onError((error, transport, establishedConnections) => {\n if (error instanceof ErrorEvent && error.message.includes(\"failed: Expected 101 status code\")) {\n console.error(\"Error: Can't connect to the Plugin Hub server.\\n\")\n console.error(\"This is usually because the Debug API Key is missing or has expired.\\n\")\n console.error(\"Run `atomemo plugin refresh-key` to get a new key.\\n\")\n process.exit(1)\n }\n options.onError?.(error, transport, establishedConnections)\n })\n\n socket.onMessage((message) => {\n options.onMessage?.(message)\n })\n\n socket.connect()\n\n return {\n /**\n * Connects to the specified channel and returns a channel object and a dispose function.\n *\n * @returns An object with a channel property and a dispose function.\n */\n connect: (channelName: string) => {\n return new Promise<{ channel: Channel; dispose: () => void }>((resolve, reject) => {\n const channel = socket.channel(channelName, {})\n\n channel\n .join()\n .receive(\"ok\", (response) => {\n socket.log(\"channel:joined\", `Joined ${channelName} successfully`, response)\n\n resolve({\n channel,\n dispose: () => {\n channel.leave()\n socket.disconnect()\n process.exit(0)\n },\n })\n })\n .receive(\"error\", (response) => {\n socket.log(\"channel:error\", `Failed to join ${channelName}`, response)\n\n reject(new Error(`Failed to join ${channelName}: ${response.reason}`))\n })\n .receive(\"timeout\", (response) => {\n socket.log(\"channel:timeout\", `Timeout while joining ${channelName}`, response)\n reject(new Error(`Timeout while joining ${channelName}`))\n })\n })\n },\n }\n}\n","import {\n CredentialDefinitionSchema,\n ModelDefinitionSchema,\n ToolDefinitionSchema,\n} from \"@choiceopen/atomemo-plugin-schema/schemas\"\nimport type { PluginDefinition } from \"@choiceopen/atomemo-plugin-schema/types\"\nimport { z } from \"zod\"\nimport { getEnv } from \"./env\"\nimport { getSession } from \"./oneauth\"\nimport { createRegistry } from \"./registry\"\nimport { createTransporter, type TransporterOptions } from \"./transporter\"\n\nconst ToolInvokeMessage = z.object({\n request_id: z.string(),\n plugin_name: z.string(),\n tool_name: z.string(),\n parameters: z.json(),\n credentials: z.json(),\n})\n\ntype CredentialDefinition = z.infer<typeof CredentialDefinitionSchema>\ntype ToolDefinition = z.infer<typeof ToolDefinitionSchema>\ntype ModelDefinition = z.infer<typeof ModelDefinitionSchema>\n\n/**\n * Creates a new plugin instance with the specified options.\n *\n * @param options - The options for configuring the plugin instance.\n * @returns An object containing methods to define providers and run the plugin process.\n */\nexport async function createPlugin<Locales extends string[]>(\n options: PluginDefinition<Locales, TransporterOptions>,\n) {\n // Validate organization ID before creating registry\n const env = getEnv()\n if (!env.HUB_ORGANIZATION_ID) {\n console.error(\"DEBUG API Key is invalid. Please run `atomemo plugin refresh-key`\")\n process.exit(1)\n }\n\n // Fetch user session and validate organization\n let user: { name: string; email: string; inherentOrganizationId?: string }\n try {\n const sessionData = await getSession()\n user = sessionData.user\n\n if (user.inherentOrganizationId !== env.HUB_ORGANIZATION_ID) {\n console.info(\n \"Atomemo does not currently support developing plugins for other organizations. Please wait for official support.\",\n )\n process.exit(0)\n }\n } catch (error) {\n console.error(\"Failed to fetch session:\", error instanceof Error ? error.message : error)\n process.exit(1)\n }\n\n // Merge user info into plugin options\n const { transporterOptions, version = process.env.npm_package_version, ...plugin } = options\n const pluginDefinition = Object.assign(plugin, {\n author: user.name,\n email: user.email,\n organization_id: env.HUB_ORGANIZATION_ID,\n version,\n })\n\n const registry = createRegistry(pluginDefinition)\n const transporter = createTransporter(transporterOptions)\n\n return {\n /**\n * Adds a new credential definition in the registry.\n *\n * @param credential - The credential to add.\n * @throws Error if the credential is not registered.\n */\n addCredential: (credential: CredentialDefinition) => {\n const definition = CredentialDefinitionSchema.parse(credential)\n registry.register(\"credential\", definition)\n },\n\n /**\n * Adds a new tool definition in the registry.\n *\n * @param tool - The tool to add.\n * @throws Error if the tool is not registered.\n */\n addTool: (tool: ToolDefinition) => {\n const definition = ToolDefinitionSchema.parse(tool)\n registry.register(\"tool\", definition)\n },\n\n /**\n * Adds a new model definition in the registry.\n *\n * @param model - The model to add.\n * @throws Error if the model is not registered.\n */\n addModel: (model: ModelDefinition) => {\n const definition = ModelDefinitionSchema.parse(model)\n registry.register(\"model\", definition)\n },\n\n /**\n * Starts the plugin's main process. This establishes the transporter connection and\n * sets up signal handlers for graceful shutdown on SIGINT and SIGTERM.\n */\n run: async () => {\n const { channel, dispose } = await transporter.connect(`debug_plugin:${registry.plugin.name}`)\n\n if (env.HUB_MODE === \"debug\") {\n channel.push(\"register_plugin\", registry.serialize().plugin)\n }\n\n channel.on(\"invoke_tool\", async (message) => {\n const request_id = message.request_id\n\n try {\n const event = ToolInvokeMessage.parse(message)\n const tool = registry.resolve(\"tool\", event.tool_name)\n const { credentials, parameters } = event\n const data = await tool.invoke({ args: { credentials, parameters } })\n channel.push(\"invoke_tool_response\", { request_id, data })\n } catch (error) {\n if (error instanceof Error) {\n channel.push(\"invoke_tool_error\", { request_id, ...error })\n } else {\n channel.push(\"invoke_tool_error\", { request_id, message: \"Unexpected Error\" })\n }\n }\n })\n\n void [\"SIGINT\", \"SIGTERM\"].forEach((signal) => {\n void process.on(signal, dispose)\n })\n },\n }\n}\n"],"x_google_ignoreList":[0,1,5],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@choiceopen/atomemo-plugin-sdk-js",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.2",
|
|
4
4
|
"description": "JavaScript/TypeScript SDK for developing Choiceform Atomemo plugins",
|
|
5
5
|
"homepage": "https://github.com/choice-open/atomemo-plugin-sdk-js#readme",
|
|
6
6
|
"bugs": {
|
|
@@ -37,7 +37,7 @@
|
|
|
37
37
|
"typecheck": "tsc --noEmit"
|
|
38
38
|
},
|
|
39
39
|
"dependencies": {
|
|
40
|
-
"@choiceopen/atomemo-plugin-schema": "^0.1.
|
|
40
|
+
"@choiceopen/atomemo-plugin-schema": "^0.1.8",
|
|
41
41
|
"phoenix": "^1.8.3",
|
|
42
42
|
"pino": "^10.2.1",
|
|
43
43
|
"pino-pretty": "^13.1.3",
|