agent-worker 0.15.0 → 0.16.0

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.
@@ -84,7 +84,7 @@ async function createModelWithProvider(modelName, provider) {
84
84
  const pkg = PROVIDER_PACKAGES[provider];
85
85
  if (!pkg) throw new Error(`Unknown provider: ${provider}. Supported: ${Object.keys(PROVIDER_PACKAGES).join(", ")}`);
86
86
  const providerFn = await loadProvider(provider, pkg.package, pkg.export);
87
- if (!providerFn) throw new Error(`Install ${pkg.package} to use ${provider} models directly`);
87
+ if (!providerFn) throw new Error(`Failed to load ${pkg.package} for provider "${provider}". Try reinstalling agent-worker.`);
88
88
  return providerFn(modelName);
89
89
  }
90
90
  const { name, base_url, api_key } = provider;
@@ -92,7 +92,7 @@ async function createModelWithProvider(modelName, provider) {
92
92
  if (!pkg) throw new Error(`Unknown provider: ${name}. Supported: ${Object.keys(PROVIDER_PACKAGES).join(", ")}`);
93
93
  if (!base_url && !api_key) {
94
94
  const providerFn = await loadProvider(name, pkg.package, pkg.export);
95
- if (!providerFn) throw new Error(`Install ${pkg.package} to use ${name} models directly`);
95
+ if (!providerFn) throw new Error(`Failed to load ${pkg.package} for provider "${name}". Try reinstalling agent-worker.`);
96
96
  return providerFn(modelName);
97
97
  }
98
98
  const opts = {};
@@ -176,7 +176,7 @@ async function loadProviderModel(provider, modelName) {
176
176
  const config = PROVIDER_PACKAGES[provider];
177
177
  if (!config) throw new Error(`Unknown provider: ${provider}. Supported: ${Object.keys(PROVIDER_PACKAGES).join(", ")}. Or use gateway format: provider/model (e.g., openai/gpt-5.2)`);
178
178
  const providerFn = await loadProvider(provider, config.package, config.export);
179
- if (!providerFn) throw new Error(`Install ${config.package} to use ${provider} models directly`);
179
+ if (!providerFn) throw new Error(`Failed to load ${config.package} for provider "${provider}". Try reinstalling agent-worker.`);
180
180
  return providerFn(modelName);
181
181
  }
182
182
  /**
@@ -1,3 +1,3 @@
1
- import { C as CLAUDE_MODEL_MAP, D as SDK_MODEL_ALIASES, E as OPENCODE_MODEL_MAP, O as getModelForBackend, S as BACKEND_DEFAULT_MODELS, T as CURSOR_MODEL_MAP, _ as extractCodexResult, a as createMockBackend, b as execWithIdleTimeout, c as extractOpenCodeResult, d as CodexBackend, f as ClaudeCodeBackend, g as extractClaudeResult, h as createStreamParser, i as MockAIBackend, k as normalizeBackendType, l as opencodeAdapter, m as codexAdapter, n as createBackend, o as SdkBackend, p as claudeAdapter, r as listBackends, s as OpenCodeBackend, t as checkBackends, u as CursorBackend, v as formatEvent, w as CODEX_MODEL_MAP, x as DEFAULT_IDLE_TIMEOUT, y as IdleTimeoutError } from "./backends-C7pQwuAx.mjs";
1
+ import { C as CLAUDE_MODEL_MAP, D as SDK_MODEL_ALIASES, E as OPENCODE_MODEL_MAP, O as getModelForBackend, S as BACKEND_DEFAULT_MODELS, T as CURSOR_MODEL_MAP, _ as extractCodexResult, a as createMockBackend, b as execWithIdleTimeout, c as extractOpenCodeResult, d as CodexBackend, f as ClaudeCodeBackend, g as extractClaudeResult, h as createStreamParser, i as MockAIBackend, k as normalizeBackendType, l as opencodeAdapter, m as codexAdapter, n as createBackend, o as SdkBackend, p as claudeAdapter, r as listBackends, s as OpenCodeBackend, t as checkBackends, u as CursorBackend, v as formatEvent, w as CODEX_MODEL_MAP, x as DEFAULT_IDLE_TIMEOUT, y as IdleTimeoutError } from "./backends-D7DT0uox.mjs";
2
2
 
3
3
  export { listBackends };
@@ -1,5 +1,5 @@
1
1
  #!/usr/bin/env node
2
- import { A as parseModel, I as getDefaultModel, L as isAutoProvider, P as createModelAsync, R as resolveModelFallback, a as createMockBackend, j as FRONTIER_MODELS, k as normalizeBackendType, n as createBackend } from "../backends-C7pQwuAx.mjs";
2
+ import { A as parseModel, I as getDefaultModel, L as isAutoProvider, P as createModelAsync, R as resolveModelFallback, a as createMockBackend, j as FRONTIER_MODELS, k as normalizeBackendType, n as createBackend } from "../backends-D7DT0uox.mjs";
3
3
  import { t as createTool } from "../create-tool-gcUuI1FD.mjs";
4
4
  import { generateText, stepCountIs, tool } from "ai";
5
5
  import { existsSync, mkdirSync, readFileSync, readdirSync, unlinkSync, writeFileSync } from "node:fs";
@@ -2284,6 +2284,8 @@ function createAgentLoop(config) {
2284
2284
  let wakeResolver = null;
2285
2285
  let pollTimeout = null;
2286
2286
  let directRunning = false;
2287
+ let _hasFailures = false;
2288
+ let _lastError;
2287
2289
  const scheduleConfig = agent.schedule;
2288
2290
  let resolvedSchedule;
2289
2291
  if (scheduleConfig) try {
@@ -2384,6 +2386,8 @@ function createAgentLoop(config) {
2384
2386
  }
2385
2387
  }
2386
2388
  if (lastResult && !lastResult.success) {
2389
+ _hasFailures = true;
2390
+ _lastError = lastResult.error;
2387
2391
  errorLog(`ERROR max retries exhausted, acknowledging to prevent loop`);
2388
2392
  await contextProvider.ackInbox(name, latestId);
2389
2393
  }
@@ -2399,6 +2403,12 @@ function createAgentLoop(config) {
2399
2403
  get state() {
2400
2404
  return state;
2401
2405
  },
2406
+ get hasFailures() {
2407
+ return _hasFailures;
2408
+ },
2409
+ get lastError() {
2410
+ return _lastError;
2411
+ },
2402
2412
  async start() {
2403
2413
  if (state !== "stopped") throw new Error(`Loop ${name} is already running`);
2404
2414
  state = "idle";
@@ -3221,7 +3231,7 @@ function createDaemonApp(options) {
3221
3231
  const key = `${workflowName}:${tag}`;
3222
3232
  if (s.workflows.has(key)) return c.json({ error: `Workflow already running: ${key}` }, 409);
3223
3233
  try {
3224
- const { runWorkflowWithLoops } = await import("../runner-DB-b57iZ.mjs");
3234
+ const { runWorkflowWithLoops } = await import("../runner-IkYhcbio.mjs");
3225
3235
  const result = await runWorkflowWithLoops({
3226
3236
  workflow,
3227
3237
  workflowName,
@@ -3872,7 +3882,7 @@ Note: Workflow name is inferred from YAML 'name' field or filename.
3872
3882
  Workflow-defined params (see 'params:' in YAML) are passed after '--'.
3873
3883
  Set GITHUB_TOKEN env var to access private repositories.
3874
3884
  `).action(async (file, options) => {
3875
- const { parseWorkflowFile, parseWorkflowParams, formatParamHelp, runWorkflowWithLoops } = await import("../workflow-DQ6Eju4n.mjs");
3885
+ const { parseWorkflowFile, parseWorkflowParams, formatParamHelp, runWorkflowWithLoops } = await import("../workflow-Ctto0bJt.mjs");
3876
3886
  const tag = options.tag || DEFAULT_TAG;
3877
3887
  const parsedWorkflow = await parseWorkflowFile(file, { tag });
3878
3888
  const workflowName = parsedWorkflow.name;
@@ -3895,7 +3905,7 @@ Note: Workflow name is inferred from YAML 'name' field or filename.
3895
3905
  isCleaningUp = true;
3896
3906
  console.log("\nInterrupted, cleaning up...");
3897
3907
  if (loops) {
3898
- const { shutdownLoops } = await import("../workflow-DQ6Eju4n.mjs");
3908
+ const { shutdownLoops } = await import("../workflow-Ctto0bJt.mjs");
3899
3909
  const { createSilentLogger } = await Promise.resolve().then(() => logger_exports);
3900
3910
  await shutdownLoops(loops, createSilentLogger());
3901
3911
  }
@@ -3970,7 +3980,7 @@ Workflow runs inside the daemon. Use ls/stop to manage:
3970
3980
  Note: Workflow name is inferred from YAML 'name' field or filename.
3971
3981
  Workflow-defined params (see 'params:' in YAML) are passed after '--'.
3972
3982
  `).action(async (file, options) => {
3973
- const { parseWorkflowFile, parseWorkflowParams, formatParamHelp } = await import("../workflow-DQ6Eju4n.mjs");
3983
+ const { parseWorkflowFile, parseWorkflowParams, formatParamHelp } = await import("../workflow-Ctto0bJt.mjs");
3974
3984
  const { ensureDaemon } = await Promise.resolve().then(() => agent_exports);
3975
3985
  const tag = options.tag || DEFAULT_TAG;
3976
3986
  const parsedWorkflow = await parseWorkflowFile(file, { tag });
@@ -4169,7 +4179,7 @@ function registerInfoCommands(program) {
4169
4179
  console.log(`Auto: AGENT_DEFAULT_MODELS="deepseek-chat, anthropic/claude-sonnet-4-5"`);
4170
4180
  });
4171
4181
  program.command("backends").description("Check available backends (SDK, CLI tools)").action(async () => {
4172
- const { listBackends } = await import("../backends-BYWmuyF9.mjs");
4182
+ const { listBackends } = await import("../backends-DUvcm-ce.mjs");
4173
4183
  const backends = await listBackends();
4174
4184
  console.log("Backend Status:\n");
4175
4185
  for (const backend of backends) {
@@ -4249,7 +4259,7 @@ async function resolveDir(targetInput) {
4249
4259
 
4250
4260
  //#endregion
4251
4261
  //#region package.json
4252
- var version = "0.15.0";
4262
+ var version = "0.16.0";
4253
4263
 
4254
4264
  //#endregion
4255
4265
  //#region src/cli/index.ts
package/dist/index.mjs CHANGED
@@ -1,4 +1,4 @@
1
- import { F as createModelWithProvider, M as SUPPORTED_PROVIDERS, N as createModel, P as createModelAsync, a as createMockBackend, d as CodexBackend, f as ClaudeCodeBackend, i as MockAIBackend, j as FRONTIER_MODELS, n as createBackend, o as SdkBackend, r as listBackends, t as checkBackends, u as CursorBackend } from "./backends-C7pQwuAx.mjs";
1
+ import { F as createModelWithProvider, M as SUPPORTED_PROVIDERS, N as createModel, P as createModelAsync, a as createMockBackend, d as CodexBackend, f as ClaudeCodeBackend, i as MockAIBackend, j as FRONTIER_MODELS, n as createBackend, o as SdkBackend, r as listBackends, t as checkBackends, u as CursorBackend } from "./backends-D7DT0uox.mjs";
2
2
  import { t as createTool } from "./create-tool-gcUuI1FD.mjs";
3
3
  import { ToolLoopAgent, stepCountIs } from "ai";
4
4
  import { createBashTool } from "bash-tool";
@@ -1,4 +1,4 @@
1
- import "./backends-C7pQwuAx.mjs";
1
+ import "./backends-D7DT0uox.mjs";
2
2
  import "./create-tool-gcUuI1FD.mjs";
3
3
  import { K as EventLog, _ as FileContextProvider, g as runWithHttp, i as createSilentLogger, n as createWiredLoop, r as createChannelLogger, s as checkWorkflowIdle, v as createFileContextProvider, z as createContextMCPServer } from "./cli/index.mjs";
4
4
  import { n as createMemoryContextProvider } from "./memory-provider-ZLOKyCxA.mjs";
@@ -602,6 +602,26 @@ async function runWorkflowWithLoops(config) {
602
602
  }
603
603
  }
604
604
  if (isIdle) {
605
+ const failedAgents = [...loops.entries()].filter(([, loop]) => loop.hasFailures).map(([agentName, loop]) => ({
606
+ name: agentName,
607
+ error: loop.lastError
608
+ }));
609
+ if (failedAgents.length > 0) {
610
+ const elapsed = ((Date.now() - startTime) / 1e3).toFixed(1);
611
+ const details = failedAgents.map((a) => `${a.name}: ${a.error}`).join("; ");
612
+ logger.info(`Workflow failed (${elapsed}s): ${details}`);
613
+ channelWatcher?.stop();
614
+ await shutdownLoops(loops, logger);
615
+ await runtime.shutdown();
616
+ return {
617
+ success: false,
618
+ error: details,
619
+ setupResults: runtime.setupResults,
620
+ duration: Date.now() - startTime,
621
+ contextProvider: runtime.contextProvider,
622
+ feedback: runtime.getFeedback?.()
623
+ };
624
+ }
605
625
  const elapsed = ((Date.now() - startTime) / 1e3).toFixed(1);
606
626
  logger.info(`Workflow complete (${elapsed}s)`);
607
627
  break;
@@ -1,8 +1,8 @@
1
- import "./backends-C7pQwuAx.mjs";
1
+ import "./backends-D7DT0uox.mjs";
2
2
  import "./create-tool-gcUuI1FD.mjs";
3
3
  import { a as getBackendByType, b as resolveContextDir, c as createAgentLoop, d as generateWorkflowMCPConfig, f as writeBackendMcpConfig, h as LOOP_DEFAULTS, i as createSilentLogger, k as CONTEXT_DEFAULTS, l as runSdkAgent, m as formatInbox, n as createWiredLoop, o as getBackendForModel, p as buildAgentPrompt, r as createChannelLogger, s as checkWorkflowIdle, t as createMinimalRuntime, u as runMockAgent } from "./cli/index.mjs";
4
4
  import "./memory-provider-ZLOKyCxA.mjs";
5
- import { createWorkflowProvider, initWorkflow, n as interpolate, runWorkflowWithLoops, shutdownLoops, t as createContext } from "./runner-DB-b57iZ.mjs";
5
+ import { createWorkflowProvider, initWorkflow, n as interpolate, runWorkflowWithLoops, shutdownLoops, t as createContext } from "./runner-IkYhcbio.mjs";
6
6
  import { existsSync, mkdirSync, readFileSync, rmSync } from "node:fs";
7
7
  import { basename, dirname, join, resolve } from "node:path";
8
8
  import { parse } from "yaml";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "agent-worker",
3
- "version": "0.15.0",
3
+ "version": "0.16.0",
4
4
  "description": "SDK and CLI for creating and testing agent workers with Vercel AI SDK",
5
5
  "type": "module",
6
6
  "main": "./dist/index.mjs",
@@ -32,6 +32,13 @@
32
32
  "prepublishOnly": "bun run build"
33
33
  },
34
34
  "dependencies": {
35
+ "@ai-sdk/anthropic": "^3.0.0",
36
+ "@ai-sdk/deepseek": "^1.0.0",
37
+ "@ai-sdk/google": "^1.0.0",
38
+ "@ai-sdk/groq": "^1.0.0",
39
+ "@ai-sdk/mistral": "^1.0.0",
40
+ "@ai-sdk/openai": "^3.0.0",
41
+ "@ai-sdk/xai": "^1.0.0",
35
42
  "@clack/prompts": "^1.0.0",
36
43
  "@hono/node-server": "^1.19.9",
37
44
  "@modelcontextprotocol/sdk": "^1.26.0",
@@ -50,13 +57,6 @@
50
57
  "zod": "^4.3.6"
51
58
  },
52
59
  "devDependencies": {
53
- "@ai-sdk/anthropic": "^3.0.0",
54
- "@ai-sdk/deepseek": "^1.0.0",
55
- "@ai-sdk/google": "^1.0.0",
56
- "@ai-sdk/groq": "^1.0.0",
57
- "@ai-sdk/mistral": "^1.0.0",
58
- "@ai-sdk/openai": "^3.0.0",
59
- "@ai-sdk/xai": "^1.0.0",
60
60
  "@types/bun": "latest",
61
61
  "@types/node": ">=22",
62
62
  "@typescript/native-preview": "^7.0.0-dev.20260203.1",
@@ -64,39 +64,6 @@
64
64
  "oxlint": "^1.43.0",
65
65
  "tsdown": "^0.20.1"
66
66
  },
67
- "peerDependencies": {
68
- "@ai-sdk/anthropic": "^3.0.0",
69
- "@ai-sdk/deepseek": "^1.0.0",
70
- "@ai-sdk/google": "^1.0.0",
71
- "@ai-sdk/groq": "^1.0.0",
72
- "@ai-sdk/mistral": "^1.0.0",
73
- "@ai-sdk/openai": "^3.0.0",
74
- "@ai-sdk/xai": "^1.0.0",
75
- "typescript": "^5"
76
- },
77
- "peerDependenciesMeta": {
78
- "@ai-sdk/anthropic": {
79
- "optional": true
80
- },
81
- "@ai-sdk/openai": {
82
- "optional": true
83
- },
84
- "@ai-sdk/deepseek": {
85
- "optional": true
86
- },
87
- "@ai-sdk/google": {
88
- "optional": true
89
- },
90
- "@ai-sdk/groq": {
91
- "optional": true
92
- },
93
- "@ai-sdk/mistral": {
94
- "optional": true
95
- },
96
- "@ai-sdk/xai": {
97
- "optional": true
98
- }
99
- },
100
67
  "repository": {
101
68
  "type": "git",
102
69
  "url": "https://github.com/lidessen/moniro.git",