@farm.js/agent 0.1.0-beta.3 → 0.1.0-beta.4

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.d.ts CHANGED
@@ -1,4 +1,5 @@
1
- import * as _farm_js_core from '@farm.js/core';
1
+ import * as _farm_js_core_integrations from '@farm.js/core/integrations';
2
+ import * as _farm_js_core_plugin from '@farm.js/core/plugin';
2
3
  import { AgentFramework, AgentUnitConfig } from 'agent-unit';
3
4
  export { AgentFramework } from 'agent-unit';
4
5
 
@@ -24,11 +25,11 @@ interface AgentInstance {
24
25
  * @example
25
26
  * integrations: { agent: agent({ framework: "ai-sdk", storage: { driver: "redis", url: process.env.REDIS_URL } }) }
26
27
  */
27
- declare function agent(options?: AgentOptions): _farm_js_core.DefinedIntegration<{
28
+ declare function agent(options?: AgentOptions): _farm_js_core_integrations.DefinedIntegration<{
28
29
  category: "agent";
29
30
  type: string;
30
31
  instance: AgentInstance;
31
- plugins: _farm_js_core.FarmPlugin<undefined, Record<string, never>, unknown, undefined, unknown, false, (_farm_js_core.RouteDefinition<`/${string}`, "POST", {
32
+ plugins: _farm_js_core_plugin.FarmPlugin<undefined, Record<string, never>, unknown, undefined, unknown, false, (_farm_js_core_plugin.RouteDefinition<`/${string}`, "POST", {
32
33
  __types: {
33
34
  body: unknown;
34
35
  inputBody: never;
@@ -41,8 +42,8 @@ declare function agent(options?: AgentOptions): _farm_js_core.DefinedIntegration
41
42
  };
42
43
  __path?: string;
43
44
  __method?: string;
44
- __openapi?: _farm_js_core.EndpointOpenAPIMetadata;
45
- __mcp?: _farm_js_core.EndpointMCPOptions;
45
+ __openapi?: _farm_js_core_plugin.EndpointOpenAPIMetadata;
46
+ __mcp?: _farm_js_core_plugin.EndpointMCPOptions;
46
47
  } & ((options?: {
47
48
  body?: undefined;
48
49
  query?: undefined;
@@ -52,7 +53,7 @@ declare function agent(options?: AgentOptions): _farm_js_core.DefinedIntegration
52
53
  params: {};
53
54
  inputHeaders: never;
54
55
  };
55
- }> | _farm_js_core.RouteDefinition<`/${string}`, "GET", {
56
+ }> | _farm_js_core_plugin.RouteDefinition<`/${string}`, "GET", {
56
57
  __types: {
57
58
  body: unknown;
58
59
  inputBody: never;
@@ -65,8 +66,8 @@ declare function agent(options?: AgentOptions): _farm_js_core.DefinedIntegration
65
66
  };
66
67
  __path?: string;
67
68
  __method?: string;
68
- __openapi?: _farm_js_core.EndpointOpenAPIMetadata;
69
- __mcp?: _farm_js_core.EndpointMCPOptions;
69
+ __openapi?: _farm_js_core_plugin.EndpointOpenAPIMetadata;
70
+ __mcp?: _farm_js_core_plugin.EndpointMCPOptions;
70
71
  } & ((options?: {
71
72
  body?: undefined;
72
73
  query?: undefined;
@@ -76,7 +77,7 @@ declare function agent(options?: AgentOptions): _farm_js_core.DefinedIntegration
76
77
  params: {};
77
78
  inputHeaders: never;
78
79
  };
79
- }> | _farm_js_core.RouteDefinition<`/${string}`, "DELETE", {
80
+ }> | _farm_js_core_plugin.RouteDefinition<`/${string}`, "DELETE", {
80
81
  __types: {
81
82
  body: unknown;
82
83
  inputBody: never;
@@ -89,8 +90,8 @@ declare function agent(options?: AgentOptions): _farm_js_core.DefinedIntegration
89
90
  };
90
91
  __path?: string;
91
92
  __method?: string;
92
- __openapi?: _farm_js_core.EndpointOpenAPIMetadata;
93
- __mcp?: _farm_js_core.EndpointMCPOptions;
93
+ __openapi?: _farm_js_core_plugin.EndpointOpenAPIMetadata;
94
+ __mcp?: _farm_js_core_plugin.EndpointMCPOptions;
94
95
  } & ((options?: {
95
96
  body?: undefined;
96
97
  query?: undefined;
@@ -101,6 +102,6 @@ declare function agent(options?: AgentOptions): _farm_js_core.DefinedIntegration
101
102
  inputHeaders: never;
102
103
  };
103
104
  }>)[]>[];
104
- }, _farm_js_core.FarmSchema | undefined>;
105
+ }, _farm_js_core_integrations.FarmSchema | undefined>;
105
106
 
106
107
  export { type AgentInstance, type AgentOptions, agent };
package/dist/index.js CHANGED
@@ -1,5 +1,5 @@
1
1
  // src/index.ts
2
- import { defineIntegration } from "@farm.js/core";
2
+ import { defineIntegration } from "@farm.js/core/integrations";
3
3
 
4
4
  // src/config.ts
5
5
  var AGENT_UNIT_CONFIG = /* @__PURE__ */ Symbol.for("farm.agent.config");
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/config.ts","../src/plugin.ts"],"sourcesContent":["import { defineIntegration } from \"@farm.js/core\";\nimport type { AgentFramework, AgentUnitConfig } from \"agent-unit\";\n\nimport { registerAgentUnitConfig } from \"./config.js\";\nimport { createAgentPlugin } from \"./plugin.js\";\n\nexport type { AgentFramework };\n\n/**\n * agent-unit's settings, minus what Farm owns: the host (`deploy.target`), the server and the\n * Nitro and Workers settings, which belong in farm.config.\n */\nexport interface AgentOptions extends Omit<\n AgentUnitConfig,\n \"server\" | \"preset\" | \"runtime\" | \"cloudflare\" | \"nitro\"\n> {\n /** Where the agent API is mounted, under `/api`. It owns every path under it. Default `/api/agent`. */\n basePath?: string;\n /** The folder of agent files, relative to the app root. Default `agents` in `srcDir`. */\n agentsDir?: string;\n}\n\nexport interface AgentInstance {\n readonly basePath: string;\n readonly framework?: AgentFramework;\n}\n\nconst DEFAULT_BASE_PATH = \"/api/agent\";\n\nfunction normalizeBasePath(value: string): string {\n if (!value.startsWith(\"/\")) {\n throw new Error(`@farm.js/agent: basePath must start with \"/\", got \"${value}\".`);\n }\n const basePath = value.replace(/\\/+$/, \"\");\n // The agents are API routes, so Farm's middleware and guards run for them.\n if (basePath !== \"/api\" && !basePath.startsWith(\"/api/\")) {\n throw new Error(`@farm.js/agent: basePath must be under /api, got \"${value}\".`);\n }\n return basePath;\n}\n\n/**\n * Durable agents in a Farm app: the agents in `src/agents`, written with the AI SDK, Mastra,\n * LangGraph, the OpenAI Agents SDK or agent-unit's `defineAgent`, served under `basePath` in\n * `farm dev` and built by agent-unit into every deployment target.\n *\n * @example\n * integrations: { agent: agent({ framework: \"ai-sdk\", storage: { driver: \"redis\", url: process.env.REDIS_URL } }) }\n */\nexport function agent(options: AgentOptions = {}) {\n const basePath = normalizeBasePath(options.basePath ?? DEFAULT_BASE_PATH);\n const config: AgentUnitConfig & { basePath: string } = { ...options, basePath };\n const instance: AgentInstance = { basePath, framework: options.framework };\n // agent-unit's engine reads it from the server that evaluates farm.config (see ./config).\n registerAgentUnitConfig(config);\n\n return defineIntegration({\n category: \"agent\",\n type: \"agent-unit\",\n instance,\n plugins: [createAgentPlugin(config)],\n });\n}\n","import type { AgentUnitConfig } from \"agent-unit\";\n\nconst AGENT_UNIT_CONFIG = Symbol.for(\"farm.agent.config\");\n\ntype ConfigHolder = { [AGENT_UNIT_CONFIG]?: AgentUnitConfig };\n\n/** @internal Called by `agent()` as farm.config evaluates, in Farm's process and in the server. */\nexport function registerAgentUnitConfig(config: AgentUnitConfig): void {\n (globalThis as ConfigHolder)[AGENT_UNIT_CONFIG] = config;\n}\n\n/**\n * The agent-unit config of the app's `agent()` integration. agent-unit's engine reads it when it is\n * first used: by then Farm's server has evaluated farm.config, so settings such as storage URLs and\n * `authorize` come from where the server runs.\n */\nexport default function agentUnitConfig(): AgentUnitConfig {\n const config = (globalThis as ConfigHolder)[AGENT_UNIT_CONFIG];\n if (!config) {\n throw new Error(\n \"@farm.js/agent: the server has not evaluated farm.config, so the agent() settings are missing. Mount agent() under `integrations` in farm.config.\",\n );\n }\n return config;\n}\n","import { writeFileSync } from \"node:fs\";\nimport path from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport { definePlugin } from \"@farm.js/core/plugin\";\nimport type { AgentUnitConfig } from \"agent-unit\";\nimport type { DevHandler } from \"agent-unit/build\";\nimport type { agentUnit } from \"agent-unit/nitro\";\n\ntype Nitro = Parameters<NonNullable<ReturnType<typeof agentUnit>[\"setup\"]>>[0];\n\n// agent-unit's build and dev servers load only in Farm's own process. Farm bundles farm.config into\n// the production server, and a bundler follows literal imports, so these must not be literal.\nconst loadBuildOnly = <T>(specifier: string): Promise<T> => import(/* @vite-ignore */ specifier);\n\n/** Set by the built server's agent module (see SERVER_MODULE): agent-unit's engine. */\nconst AGENT_SERVER = Symbol.for(\"farm.agent.server\");\ntype AgentServer = { handle(request: Request): Promise<Response> };\ntype ServerHolder = { [AGENT_SERVER]?: AgentServer };\n\n// Every method agent-unit answers: the run API, MCP and the internal continue and sweep endpoints.\nconst METHODS = [\"get\", \"post\", \"delete\"] as const;\n\nexport function isUnder(pathname: string, basePath: string): boolean {\n return basePath === \"/\" || pathname === basePath || pathname.startsWith(`${basePath}/`);\n}\n\n// The built server's agent module, next to agent-unit's runtime. It hands the engine to the routes\n// below, and as Nitro middleware on the agent paths it passes on the host's waitUntil, which only\n// hosts that keep work alive after the response have, as agent-unit's own entry does.\nconst SERVER_MODULE = `// Generated by @farm.js/agent. Do not edit.\nimport { AsyncLocalStorage } from \"node:async_hooks\";\nimport { getUnit } from \"./runtime.mjs\";\n\nconst hostWaitUntil = new AsyncLocalStorage();\n\nglobalThis[Symbol.for(\"farm.agent.server\")] = {\n handle(request) {\n const waitUntil = hostWaitUntil.getStore();\n return getUnit().handler(request, waitUntil ? { waitUntil } : {});\n },\n};\n\nexport default function farmAgentHost(event, next) {\n const req = event.req;\n return typeof req.waitUntil === \"function\"\n ? hostWaitUntil.run((promise) => req.waitUntil(promise), next)\n : next();\n}\n`;\n\n// Nitro's Vercel preset runs scheduled tasks from a public cron route that checks CRON_SECRET only\n// when it is set. As Nitro middleware on that route, this module rejects every call without the\n// secret, the way Farm's own cron routes do.\nconst CRON_GUARD_MODULE = `// Generated by @farm.js/agent. Do not edit.\nimport { isCronRequestAuthorized } from \"@farm.js/core/cron\";\n\nexport default function farmAgentCronGuard(event, next) {\n if (isCronRequestAuthorized(event.req)) return next();\n return Response.json({ error: \"Unauthorized cron request.\" }, { status: 401 });\n}\n`;\n\n/** Guards Nitro's Vercel cron route when agent-unit has scheduled the sweep or the app's tasks. */\nfunction guardVercelCron(nitro: Nitro, dir: string): void {\n const preset = String(nitro.options.preset ?? \"\");\n if (!preset.startsWith(\"vercel\")) return;\n if (!nitro.options.experimental?.tasks) return;\n if (Object.keys(nitro.options.scheduledTasks ?? {}).length === 0) return;\n\n const route = nitro.options.vercel?.cronHandlerRoute || \"/_vercel/cron\";\n const guard = path.posix.join(dir, \"farm-cron-guard.mjs\");\n writeFileSync(guard, CRON_GUARD_MODULE);\n nitro.options.handlers.unshift(\n { route, handler: guard, middleware: true, lazy: false },\n { route: `${route}/**`, handler: guard, middleware: true, lazy: false },\n );\n if (!process.env.CRON_SECRET) {\n nitro.logger.warn(\n `@farm.js/agent: Vercel Cron runs the agent sweep and tasks at ${route}, which rejects every call without CRON_SECRET. Set CRON_SECRET in the Vercel project's environment variables, or the scheduled runs answer 401.`,\n );\n }\n}\n\n/**\n * Serves the agents in `farm dev` and builds them into the production server, as API routes under\n * `basePath`: Farm's middleware, plugin guards and integration guards run for them as for any route.\n */\nexport function createAgentPlugin(config: AgentUnitConfig & { basePath: string }) {\n const { basePath } = config;\n // Set by `configure`, in Farm's process: farm.config also evaluates inside the server, where a\n // Worker has no working directory.\n let root: string | undefined;\n let agentsDir = config.agentsDir ?? \"agents\";\n let isDev = false;\n let devHandler: Promise<DevHandler> | undefined;\n\n const buildConfig = (): AgentUnitConfig => ({ ...config, agentsDir });\n const startDev = () =>\n (devHandler ??= loadBuildOnly<typeof import(\"agent-unit/build\")>(\"agent-unit/build\").then(\n ({ createDevHandler }) =>\n createDevHandler({ root: root ?? process.cwd(), config: buildConfig() }),\n ));\n const closeDev = async () => {\n const pending = devHandler;\n devHandler = undefined;\n await (await pending?.catch(() => undefined))?.close();\n };\n\n const handle = async (request: Request): Promise<Response> => {\n // A dev server runs the agents from source, kept across Vite restarts.\n if (isDev) return (await startDev()).fetch(request);\n const server = (globalThis as ServerHolder)[AGENT_SERVER];\n if (!server) {\n throw new Error(\n \"@farm.js/agent: this server was built without the agents. Build it with `farm build`, which adds them.\",\n );\n }\n return server.handle(request);\n };\n\n return definePlugin({\n name: \"farm:agent\",\n configure(farmConfig, context) {\n root = path.resolve(farmConfig.root ?? process.cwd());\n agentsDir = config.agentsDir ?? path.posix.join(farmConfig.srcDir ?? \"src\", \"agents\");\n isDev = context.isDev;\n },\n // Ordinary API routes, so a request passes Farm's middleware, runtime.before and integration\n // guards before it reaches the agents, in development and in every production target.\n routes: ({ route }) =>\n METHODS.flatMap((method) =>\n [basePath, `${basePath}/[...path]`].map((pattern) =>\n route[method](pattern, { handler: (request) => handle(request) }),\n ),\n ),\n router: {\n // agent-unit answers every path under basePath, so an app route there would never be reached.\n discovered(route) {\n if (route.kind !== \"api\" || !route.filePath || !isUnder(route.path, basePath)) return;\n throw new Error(\n `@farm.js/agent: ${route.filePath} is served at ${route.path}, which the agent API owns (basePath \"${basePath}\"). Move the route, or set another basePath.`,\n );\n },\n },\n build: {\n // agent-unit builds the agents into Farm's Nitro output for its preset: their framework\n // adapters, storage, the sweep and `tasks` as scheduled tasks. Its own handler for basePath\n // would answer before Farm's, so Farm's routes serve the API instead.\n async configure(nitroConfig) {\n const { agentUnit } =\n await loadBuildOnly<typeof import(\"agent-unit/nitro\")>(\"agent-unit/nitro\");\n const unit = agentUnit({\n root: root ?? process.cwd(),\n basePath,\n config: buildConfig(),\n // The module agent-unit's engine reads its config from in the built server.\n configFile: fileURLToPath(new URL(\"./config.js\", import.meta.url)),\n });\n const module: typeof unit = {\n name: unit.name,\n async setup(nitro) {\n const before = nitro.options.handlers.length;\n await unit.setup!(nitro);\n const added = nitro.options.handlers.splice(before);\n const entry = added.find((handler) => handler.handler.endsWith(\"entry.mjs\"))?.handler;\n if (!entry) {\n throw new Error(\n \"@farm.js/agent: agent-unit's Nitro module did not mount its handler. Install the agent-unit version @farm.js/agent supports.\",\n );\n }\n nitro.options.handlers.push(...added.filter((handler) => handler.handler !== entry));\n // Nitro writes handler paths into generated imports, so keep them in forward-slash\n // form; a Windows `D:\\…` path would lose its backslashes there.\n const server = path.posix.join(\n path.posix.dirname(entry.replaceAll(\"\\\\\", \"/\")),\n \"farm-server.mjs\",\n );\n writeFileSync(server, SERVER_MODULE);\n guardVercelCron(nitro, path.posix.dirname(server));\n nitro.options.handlers.push(\n { route: basePath, handler: server, middleware: true, lazy: false },\n { route: `${basePath}/**`, handler: server, middleware: true, lazy: false },\n );\n },\n };\n return { ...nitroConfig, modules: [...(nitroConfig.modules ?? []), module] };\n },\n },\n dev: {\n server(_viteServer, { lifecycle }) {\n void startDev().catch(() => {});\n lifecycle.onShutdown(closeDev);\n },\n },\n runtime: {\n close: closeDev,\n },\n });\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../src/index.ts","../src/config.ts","../src/plugin.ts"],"sourcesContent":["import { defineIntegration } from \"@farm.js/core/integrations\";\nimport type { AgentFramework, AgentUnitConfig } from \"agent-unit\";\n\nimport { registerAgentUnitConfig } from \"./config.js\";\nimport { createAgentPlugin } from \"./plugin.js\";\n\nexport type { AgentFramework };\n\n/**\n * agent-unit's settings, minus what Farm owns: the host (`deploy.target`), the server and the\n * Nitro and Workers settings, which belong in farm.config.\n */\nexport interface AgentOptions extends Omit<\n AgentUnitConfig,\n \"server\" | \"preset\" | \"runtime\" | \"cloudflare\" | \"nitro\"\n> {\n /** Where the agent API is mounted, under `/api`. It owns every path under it. Default `/api/agent`. */\n basePath?: string;\n /** The folder of agent files, relative to the app root. Default `agents` in `srcDir`. */\n agentsDir?: string;\n}\n\nexport interface AgentInstance {\n readonly basePath: string;\n readonly framework?: AgentFramework;\n}\n\nconst DEFAULT_BASE_PATH = \"/api/agent\";\n\nfunction normalizeBasePath(value: string): string {\n if (!value.startsWith(\"/\")) {\n throw new Error(`@farm.js/agent: basePath must start with \"/\", got \"${value}\".`);\n }\n const basePath = value.replace(/\\/+$/, \"\");\n // The agents are API routes, so Farm's middleware and guards run for them.\n if (basePath !== \"/api\" && !basePath.startsWith(\"/api/\")) {\n throw new Error(`@farm.js/agent: basePath must be under /api, got \"${value}\".`);\n }\n return basePath;\n}\n\n/**\n * Durable agents in a Farm app: the agents in `src/agents`, written with the AI SDK, Mastra,\n * LangGraph, the OpenAI Agents SDK or agent-unit's `defineAgent`, served under `basePath` in\n * `farm dev` and built by agent-unit into every deployment target.\n *\n * @example\n * integrations: { agent: agent({ framework: \"ai-sdk\", storage: { driver: \"redis\", url: process.env.REDIS_URL } }) }\n */\nexport function agent(options: AgentOptions = {}) {\n const basePath = normalizeBasePath(options.basePath ?? DEFAULT_BASE_PATH);\n const config: AgentUnitConfig & { basePath: string } = { ...options, basePath };\n const instance: AgentInstance = { basePath, framework: options.framework };\n // agent-unit's engine reads it from the server that evaluates farm.config (see ./config).\n registerAgentUnitConfig(config);\n\n return defineIntegration({\n category: \"agent\",\n type: \"agent-unit\",\n instance,\n plugins: [createAgentPlugin(config)],\n });\n}\n","import type { AgentUnitConfig } from \"agent-unit\";\n\nconst AGENT_UNIT_CONFIG = Symbol.for(\"farm.agent.config\");\n\ntype ConfigHolder = { [AGENT_UNIT_CONFIG]?: AgentUnitConfig };\n\n/** @internal Called by `agent()` as farm.config evaluates, in Farm's process and in the server. */\nexport function registerAgentUnitConfig(config: AgentUnitConfig): void {\n (globalThis as ConfigHolder)[AGENT_UNIT_CONFIG] = config;\n}\n\n/**\n * The agent-unit config of the app's `agent()` integration. agent-unit's engine reads it when it is\n * first used: by then Farm's server has evaluated farm.config, so settings such as storage URLs and\n * `authorize` come from where the server runs.\n */\nexport default function agentUnitConfig(): AgentUnitConfig {\n const config = (globalThis as ConfigHolder)[AGENT_UNIT_CONFIG];\n if (!config) {\n throw new Error(\n \"@farm.js/agent: the server has not evaluated farm.config, so the agent() settings are missing. Mount agent() under `integrations` in farm.config.\",\n );\n }\n return config;\n}\n","import { writeFileSync } from \"node:fs\";\nimport path from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport { definePlugin } from \"@farm.js/core/plugin\";\nimport type { AgentUnitConfig } from \"agent-unit\";\nimport type { DevHandler } from \"agent-unit/build\";\nimport type { agentUnit } from \"agent-unit/nitro\";\n\ntype Nitro = Parameters<NonNullable<ReturnType<typeof agentUnit>[\"setup\"]>>[0];\n\n// agent-unit's build and dev servers load only in Farm's own process. Farm bundles farm.config into\n// the production server, and a bundler follows literal imports, so these must not be literal.\nconst loadBuildOnly = <T>(specifier: string): Promise<T> => import(/* @vite-ignore */ specifier);\n\n/** Set by the built server's agent module (see SERVER_MODULE): agent-unit's engine. */\nconst AGENT_SERVER = Symbol.for(\"farm.agent.server\");\ntype AgentServer = { handle(request: Request): Promise<Response> };\ntype ServerHolder = { [AGENT_SERVER]?: AgentServer };\n\n// Every method agent-unit answers: the run API, MCP and the internal continue and sweep endpoints.\nconst METHODS = [\"get\", \"post\", \"delete\"] as const;\n\nexport function isUnder(pathname: string, basePath: string): boolean {\n return basePath === \"/\" || pathname === basePath || pathname.startsWith(`${basePath}/`);\n}\n\n// The built server's agent module, next to agent-unit's runtime. It hands the engine to the routes\n// below, and as Nitro middleware on the agent paths it passes on the host's waitUntil, which only\n// hosts that keep work alive after the response have, as agent-unit's own entry does.\nconst SERVER_MODULE = `// Generated by @farm.js/agent. Do not edit.\nimport { AsyncLocalStorage } from \"node:async_hooks\";\nimport { getUnit } from \"./runtime.mjs\";\n\nconst hostWaitUntil = new AsyncLocalStorage();\n\nglobalThis[Symbol.for(\"farm.agent.server\")] = {\n handle(request) {\n const waitUntil = hostWaitUntil.getStore();\n return getUnit().handler(request, waitUntil ? { waitUntil } : {});\n },\n};\n\nexport default function farmAgentHost(event, next) {\n const req = event.req;\n return typeof req.waitUntil === \"function\"\n ? hostWaitUntil.run((promise) => req.waitUntil(promise), next)\n : next();\n}\n`;\n\n// Nitro's Vercel preset runs scheduled tasks from a public cron route that checks CRON_SECRET only\n// when it is set. As Nitro middleware on that route, this module rejects every call without the\n// secret, the way Farm's own cron routes do.\nconst CRON_GUARD_MODULE = `// Generated by @farm.js/agent. Do not edit.\nimport { isCronRequestAuthorized } from \"@farm.js/core/cron\";\n\nexport default function farmAgentCronGuard(event, next) {\n if (isCronRequestAuthorized(event.req)) return next();\n return Response.json({ error: \"Unauthorized cron request.\" }, { status: 401 });\n}\n`;\n\n/** Guards Nitro's Vercel cron route when agent-unit has scheduled the sweep or the app's tasks. */\nfunction guardVercelCron(nitro: Nitro, dir: string): void {\n const preset = String(nitro.options.preset ?? \"\");\n if (!preset.startsWith(\"vercel\")) return;\n if (!nitro.options.experimental?.tasks) return;\n if (Object.keys(nitro.options.scheduledTasks ?? {}).length === 0) return;\n\n const route = nitro.options.vercel?.cronHandlerRoute || \"/_vercel/cron\";\n const guard = path.posix.join(dir, \"farm-cron-guard.mjs\");\n writeFileSync(guard, CRON_GUARD_MODULE);\n nitro.options.handlers.unshift(\n { route, handler: guard, middleware: true, lazy: false },\n { route: `${route}/**`, handler: guard, middleware: true, lazy: false },\n );\n if (!process.env.CRON_SECRET) {\n nitro.logger.warn(\n `@farm.js/agent: Vercel Cron runs the agent sweep and tasks at ${route}, which rejects every call without CRON_SECRET. Set CRON_SECRET in the Vercel project's environment variables, or the scheduled runs answer 401.`,\n );\n }\n}\n\n/**\n * Serves the agents in `farm dev` and builds them into the production server, as API routes under\n * `basePath`: Farm's middleware, plugin guards and integration guards run for them as for any route.\n */\nexport function createAgentPlugin(config: AgentUnitConfig & { basePath: string }) {\n const { basePath } = config;\n // Set by `configure`, in Farm's process: farm.config also evaluates inside the server, where a\n // Worker has no working directory.\n let root: string | undefined;\n let agentsDir = config.agentsDir ?? \"agents\";\n let isDev = false;\n let devHandler: Promise<DevHandler> | undefined;\n\n const buildConfig = (): AgentUnitConfig => ({ ...config, agentsDir });\n const startDev = () =>\n (devHandler ??= loadBuildOnly<typeof import(\"agent-unit/build\")>(\"agent-unit/build\").then(\n ({ createDevHandler }) =>\n createDevHandler({ root: root ?? process.cwd(), config: buildConfig() }),\n ));\n const closeDev = async () => {\n const pending = devHandler;\n devHandler = undefined;\n await (await pending?.catch(() => undefined))?.close();\n };\n\n const handle = async (request: Request): Promise<Response> => {\n // A dev server runs the agents from source, kept across Vite restarts.\n if (isDev) return (await startDev()).fetch(request);\n const server = (globalThis as ServerHolder)[AGENT_SERVER];\n if (!server) {\n throw new Error(\n \"@farm.js/agent: this server was built without the agents. Build it with `farm build`, which adds them.\",\n );\n }\n return server.handle(request);\n };\n\n return definePlugin({\n name: \"farm:agent\",\n configure(farmConfig, context) {\n root = path.resolve(farmConfig.root ?? process.cwd());\n agentsDir = config.agentsDir ?? path.posix.join(farmConfig.srcDir ?? \"src\", \"agents\");\n isDev = context.isDev;\n },\n // Ordinary API routes, so a request passes Farm's middleware, runtime.before and integration\n // guards before it reaches the agents, in development and in every production target.\n routes: ({ route }) =>\n METHODS.flatMap((method) =>\n [basePath, `${basePath}/[...path]`].map((pattern) =>\n route[method](pattern, { handler: (request) => handle(request) }),\n ),\n ),\n router: {\n // agent-unit answers every path under basePath, so an app route there would never be reached.\n discovered(route) {\n if (route.kind !== \"api\" || !route.filePath || !isUnder(route.path, basePath)) return;\n throw new Error(\n `@farm.js/agent: ${route.filePath} is served at ${route.path}, which the agent API owns (basePath \"${basePath}\"). Move the route, or set another basePath.`,\n );\n },\n },\n build: {\n // agent-unit builds the agents into Farm's Nitro output for its preset: their framework\n // adapters, storage, the sweep and `tasks` as scheduled tasks. Its own handler for basePath\n // would answer before Farm's, so Farm's routes serve the API instead.\n async configure(nitroConfig) {\n const { agentUnit } =\n await loadBuildOnly<typeof import(\"agent-unit/nitro\")>(\"agent-unit/nitro\");\n const unit = agentUnit({\n root: root ?? process.cwd(),\n basePath,\n config: buildConfig(),\n // The module agent-unit's engine reads its config from in the built server.\n configFile: fileURLToPath(new URL(\"./config.js\", import.meta.url)),\n });\n const module: typeof unit = {\n name: unit.name,\n async setup(nitro) {\n const before = nitro.options.handlers.length;\n await unit.setup!(nitro);\n const added = nitro.options.handlers.splice(before);\n const entry = added.find((handler) => handler.handler.endsWith(\"entry.mjs\"))?.handler;\n if (!entry) {\n throw new Error(\n \"@farm.js/agent: agent-unit's Nitro module did not mount its handler. Install the agent-unit version @farm.js/agent supports.\",\n );\n }\n nitro.options.handlers.push(...added.filter((handler) => handler.handler !== entry));\n // Nitro writes handler paths into generated imports, so keep them in forward-slash\n // form; a Windows `D:\\…` path would lose its backslashes there.\n const server = path.posix.join(\n path.posix.dirname(entry.replaceAll(\"\\\\\", \"/\")),\n \"farm-server.mjs\",\n );\n writeFileSync(server, SERVER_MODULE);\n guardVercelCron(nitro, path.posix.dirname(server));\n nitro.options.handlers.push(\n { route: basePath, handler: server, middleware: true, lazy: false },\n { route: `${basePath}/**`, handler: server, middleware: true, lazy: false },\n );\n },\n };\n return { ...nitroConfig, modules: [...(nitroConfig.modules ?? []), module] };\n },\n },\n dev: {\n server(_viteServer, { lifecycle }) {\n void startDev().catch(() => {});\n lifecycle.onShutdown(closeDev);\n },\n },\n runtime: {\n close: closeDev,\n },\n });\n}\n"],"mappings":"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","names":[]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@farm.js/agent",
3
- "version": "0.1.0-beta.3",
3
+ "version": "0.1.0-beta.4",
4
4
  "description": "Durable agents for Farm.js, served and built by agent-unit",
5
5
  "keywords": [
6
6
  "agent-unit",
@@ -44,7 +44,7 @@
44
44
  "typescript": "^5.3.3",
45
45
  "vite": "8.3.4",
46
46
  "vitest": "5.0.5",
47
- "@farm.js/core": "0.1.60"
47
+ "@farm.js/core": "0.1.67"
48
48
  },
49
49
  "peerDependencies": {
50
50
  "@farm.js/core": ">=0.1.50 <0.2.0"