@agentic-patterns/runtime 0.1.4 → 0.1.5

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.cjs CHANGED
@@ -2280,24 +2280,60 @@ var ClaudeCodeRunner = class {
2280
2280
  };
2281
2281
 
2282
2282
  // src/runner/claude-code-api-runner.ts
2283
- var BLOCKED_TOOLS = [
2284
- "Read",
2285
- "Write",
2286
- "Edit",
2287
- "Bash",
2288
- "Glob",
2289
- "Grep",
2290
- "Agent",
2291
- "NotebookEdit",
2292
- "TodoRead",
2293
- "TodoWrite",
2294
- "WebFetch",
2295
- "WebSearch"
2296
- ];
2283
+ var import_node_child_process = require("child_process");
2284
+ var import_node_fs = require("fs");
2285
+ var import_node_os = require("os");
2286
+ var import_node_path = require("path");
2287
+ function loadMaxSubOAuth() {
2288
+ if (process.platform !== "darwin") return null;
2289
+ const user = process.env.USER;
2290
+ if (!user) return null;
2291
+ try {
2292
+ const raw = (0, import_node_child_process.execSync)(
2293
+ `security find-generic-password -a "${user}" -s "Claude Code-credentials" -w`,
2294
+ { encoding: "utf8", stdio: ["ignore", "pipe", "ignore"] }
2295
+ ).trim();
2296
+ const parsed = JSON.parse(raw);
2297
+ const oauth = parsed.claudeAiOauth;
2298
+ if (!oauth?.accessToken) return null;
2299
+ return oauth;
2300
+ } catch {
2301
+ return null;
2302
+ }
2303
+ }
2297
2304
  var ClaudeCodeAPIRunner = class extends ClaudeCodeRunner {
2305
+ _disableSandbox;
2306
+ _extraDisallowed;
2307
+ _isolatedConfigDir;
2308
+ constructor(opts) {
2309
+ super(opts);
2310
+ this._disableSandbox = opts?.disableSandbox ?? false;
2311
+ this._extraDisallowed = opts?.extraDisallowedTools ?? [];
2312
+ this._isolatedConfigDir = this._disableSandbox ? null : (0, import_node_fs.mkdtempSync)((0, import_node_path.join)((0, import_node_os.tmpdir)(), "ap-cc-api-"));
2313
+ }
2298
2314
  _buildOptions(agent, options, context) {
2299
2315
  const sdkOpts = super._buildOptions(agent, options, context);
2300
- sdkOpts.disallowedTools = [...BLOCKED_TOOLS];
2316
+ sdkOpts.tools = [];
2317
+ if (this._extraDisallowed.length > 0) {
2318
+ sdkOpts.disallowedTools = [
2319
+ ...sdkOpts.disallowedTools ?? [],
2320
+ ...this._extraDisallowed
2321
+ ];
2322
+ }
2323
+ if (!this._disableSandbox && this._isolatedConfigDir) {
2324
+ const oauth = loadMaxSubOAuth();
2325
+ if (oauth) {
2326
+ const baseEnv = Object.fromEntries(
2327
+ Object.entries(process.env).filter(([, v]) => typeof v === "string")
2328
+ );
2329
+ sdkOpts.env = {
2330
+ ...baseEnv,
2331
+ ...sdkOpts.env ?? {},
2332
+ CLAUDE_CONFIG_DIR: this._isolatedConfigDir,
2333
+ CLAUDE_CODE_OAUTH_TOKEN: oauth.accessToken
2334
+ };
2335
+ }
2336
+ }
2301
2337
  return sdkOpts;
2302
2338
  }
2303
2339
  };
@@ -2488,15 +2524,13 @@ function createToolboxExecutor(agent) {
2488
2524
  const actualName = name.includes("__") ? name.split("__").pop() : name;
2489
2525
  return tb.execute(actualName, args);
2490
2526
  }
2491
- throw new Error(
2492
- `Tool "${name}" not found. Available: ${[...lookup.keys()].join(", ")}`
2493
- );
2527
+ throw new Error(`Tool "${name}" not found. Available: ${[...lookup.keys()].join(", ")}`);
2494
2528
  }
2495
2529
  };
2496
2530
  }
2497
2531
 
2498
2532
  // src/runner/create-runner.ts
2499
- var import_node_child_process = require("child_process");
2533
+ var import_node_child_process2 = require("child_process");
2500
2534
 
2501
2535
  // src/providers/types.ts
2502
2536
  async function importProvider(pkg, provider) {
@@ -2962,7 +2996,7 @@ var ClaudeCodeLanguageModel = class {
2962
2996
  const sdkOptions = {
2963
2997
  ...this._opts.defaults ?? {},
2964
2998
  model: mapModel2(this.modelId) ?? this._opts.defaults?.model ?? this.modelId,
2965
- maxTurns: this._opts.maxTurns ?? 1,
2999
+ maxTurns: this._opts.maxTurns ?? 10,
2966
3000
  permissionMode: "default",
2967
3001
  canUseTool
2968
3002
  };
@@ -3031,6 +3065,8 @@ function resolveModelId(provider, explicitModelId, tier = "sonnet") {
3031
3065
  // src/runner/create-runner.ts
3032
3066
  async function createRunner(opts = {}) {
3033
3067
  const verbose = opts.verbose ?? true;
3068
+ const tier = opts.tier ?? envTier();
3069
+ const modelId = opts.modelId ?? process.env.AGENT_MODEL;
3034
3070
  if (opts.runner) {
3035
3071
  return log(verbose, {
3036
3072
  runner: opts.runner,
@@ -3047,11 +3083,11 @@ async function createRunner(opts = {}) {
3047
3083
  }
3048
3084
  if (opts.provider) {
3049
3085
  const provider = PROVIDERS[opts.provider];
3050
- const modelId = resolveModelId(provider, opts.modelId, opts.tier);
3051
- const model = await provider.load(modelId);
3086
+ const resolved = resolveModelId(provider, modelId, tier);
3087
+ const model = await provider.load(resolved);
3052
3088
  return log(verbose, {
3053
3089
  runner: new AgentRunner(model, opts.eventBus),
3054
- reason: `using ${opts.provider} (explicit, model=${modelId})`,
3090
+ reason: `using ${opts.provider} (explicit, model=${resolved})`,
3055
3091
  source: "explicit-provider"
3056
3092
  });
3057
3093
  }
@@ -3059,11 +3095,11 @@ async function createRunner(opts = {}) {
3059
3095
  const provider = PROVIDERS[name];
3060
3096
  const matchedEnv = provider.envVars.find((v) => process.env[v]);
3061
3097
  if (matchedEnv) {
3062
- const modelId = resolveModelId(provider, opts.modelId, opts.tier);
3063
- const model = await provider.load(modelId);
3098
+ const resolved = resolveModelId(provider, modelId, tier);
3099
+ const model = await provider.load(resolved);
3064
3100
  return log(verbose, {
3065
3101
  runner: new AgentRunner(model, opts.eventBus),
3066
- reason: `using ${name} (env ${matchedEnv}, model=${modelId})`,
3102
+ reason: `using ${name} (env ${matchedEnv}, model=${resolved})`,
3067
3103
  source: `env-${name}`
3068
3104
  });
3069
3105
  }
@@ -3101,6 +3137,10 @@ async function createRunner(opts = {}) {
3101
3137
  ].join("\n")
3102
3138
  );
3103
3139
  }
3140
+ function envTier() {
3141
+ const v = process.env.AGENT_TIER;
3142
+ return v === "opus" || v === "sonnet" || v === "haiku" ? v : void 0;
3143
+ }
3104
3144
  function log(verbose, selection) {
3105
3145
  if (verbose) {
3106
3146
  process.stdout.write(`[runner] ${selection.reason}
@@ -3112,7 +3152,7 @@ var _claudeCliCache;
3112
3152
  async function hasClaudeCli() {
3113
3153
  if (_claudeCliCache !== void 0) return _claudeCliCache;
3114
3154
  _claudeCliCache = await new Promise((resolve) => {
3115
- const child = (0, import_node_child_process.spawn)("claude", ["--version"], {
3155
+ const child = (0, import_node_child_process2.spawn)("claude", ["--version"], {
3116
3156
  stdio: "ignore",
3117
3157
  // shell: true handles Windows `.cmd` extension and generally behaves
3118
3158
  // for "is this command on PATH" probes.