open-agents-ai 0.30.2 → 0.30.3

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.
Files changed (2) hide show
  1. package/dist/index.js +472 -103
  2. package/package.json +1 -1
package/dist/index.js CHANGED
@@ -5425,8 +5425,8 @@ async function loadTranscribeCli() {
5425
5425
  const nvmBase = join13(homedir5(), ".nvm", "versions", "node");
5426
5426
  if (existsSync10(nvmBase)) {
5427
5427
  try {
5428
- const { readdirSync: readdirSync10 } = await import("node:fs");
5429
- for (const ver of readdirSync10(nvmBase)) {
5428
+ const { readdirSync: readdirSync11 } = await import("node:fs");
5429
+ for (const ver of readdirSync11(nvmBase)) {
5430
5430
  const tcPath = join13(nvmBase, ver, "lib", "node_modules", "transcribe-cli");
5431
5431
  if (existsSync10(join13(tcPath, "dist", "index.js"))) {
5432
5432
  const { createRequire: createRequire4 } = await import("node:module");
@@ -12408,8 +12408,8 @@ var init_listen = __esm({
12408
12408
  const nvmBase = join19(homedir6(), ".nvm", "versions", "node");
12409
12409
  if (existsSync13(nvmBase)) {
12410
12410
  try {
12411
- const { readdirSync: readdirSync10 } = await import("node:fs");
12412
- for (const ver of readdirSync10(nvmBase)) {
12411
+ const { readdirSync: readdirSync11 } = await import("node:fs");
12412
+ for (const ver of readdirSync11(nvmBase)) {
12413
12413
  const tcPath = join19(nvmBase, ver, "lib", "node_modules", "transcribe-cli");
12414
12414
  if (existsSync13(join19(tcPath, "dist", "index.js"))) {
12415
12415
  const { createRequire: createRequire4 } = await import("node:module");
@@ -12639,10 +12639,10 @@ transcribe-cli error: ${transcribeCliError}` : "";
12639
12639
  wordTimestamps: false
12640
12640
  });
12641
12641
  if (outputDir) {
12642
- const { basename: basename9 } = await import("node:path");
12642
+ const { basename: basename10 } = await import("node:path");
12643
12643
  const transcriptDir = join19(outputDir, ".oa", "transcripts");
12644
12644
  mkdirSync5(transcriptDir, { recursive: true });
12645
- const outFile = join19(transcriptDir, `${basename9(filePath)}.txt`);
12645
+ const outFile = join19(transcriptDir, `${basename10(filePath)}.txt`);
12646
12646
  writeFileSync5(outFile, result.text, "utf-8");
12647
12647
  }
12648
12648
  return {
@@ -15676,17 +15676,17 @@ async function handleUpdate(subcommand, ctx) {
15676
15676
  try {
15677
15677
  const { createRequire: createRequire4 } = await import("node:module");
15678
15678
  const { fileURLToPath: fileURLToPath7 } = await import("node:url");
15679
- const { dirname: dirname10, join: join32 } = await import("node:path");
15680
- const { existsSync: existsSync21 } = await import("node:fs");
15679
+ const { dirname: dirname10, join: join33 } = await import("node:path");
15680
+ const { existsSync: existsSync22 } = await import("node:fs");
15681
15681
  const req = createRequire4(import.meta.url);
15682
15682
  const thisDir = dirname10(fileURLToPath7(import.meta.url));
15683
15683
  const candidates = [
15684
- join32(thisDir, "..", "package.json"),
15685
- join32(thisDir, "..", "..", "package.json"),
15686
- join32(thisDir, "..", "..", "..", "package.json")
15684
+ join33(thisDir, "..", "package.json"),
15685
+ join33(thisDir, "..", "..", "package.json"),
15686
+ join33(thisDir, "..", "..", "..", "package.json")
15687
15687
  ];
15688
15688
  for (const pkgPath of candidates) {
15689
- if (existsSync21(pkgPath)) {
15689
+ if (existsSync22(pkgPath)) {
15690
15690
  const pkg = req(pkgPath);
15691
15691
  if (pkg.name === "open-agents-ai" || pkg.name === "@open-agents/cli") {
15692
15692
  currentVersion = pkg.version ?? "0.0.0";
@@ -16677,8 +16677,8 @@ function buildPlainRibbon(phrases, repeatWidth) {
16677
16677
  }
16678
16678
  return plain;
16679
16679
  }
16680
- function createRow(phraseIndices, speed, direction) {
16681
- const phrases = phraseIndices.map((i) => PHRASES[i % PHRASES.length]);
16680
+ function createRow(phraseIndices, speed, direction, bank) {
16681
+ const phrases = phraseIndices.map((i) => bank[i % bank.length]);
16682
16682
  return { phrases, offset: 0, speed, direction, renderedPlain: "" };
16683
16683
  }
16684
16684
  var isTTY3, PHRASES, Carousel;
@@ -16767,15 +16767,19 @@ var init_carousel = __esm({
16767
16767
  reservedRows = 4;
16768
16768
  started = false;
16769
16769
  resizeHandler = null;
16770
- constructor() {
16770
+ constructor(customPhrases) {
16771
16771
  this.width = process.stdout.columns ?? 80;
16772
- const indices0 = Array.from({ length: PHRASES.length }, (_, i) => i).sort(() => Math.random() - 0.5);
16773
- const indices1 = Array.from({ length: PHRASES.length }, (_, i) => i).sort(() => Math.random() - 0.5);
16774
- const indices2 = Array.from({ length: PHRASES.length }, (_, i) => i).sort(() => Math.random() - 0.5);
16772
+ const bank = customPhrases && customPhrases.length > 0 ? customPhrases : PHRASES;
16773
+ const indices0 = Array.from({ length: bank.length }, (_, i) => i).sort(() => Math.random() - 0.5);
16774
+ const indices1 = Array.from({ length: bank.length }, (_, i) => i).sort(() => Math.random() - 0.5);
16775
+ const indices2 = Array.from({ length: bank.length }, (_, i) => i).sort(() => Math.random() - 0.5);
16775
16776
  this.rows = [
16776
- createRow(indices0, 2, -1),
16777
- createRow(indices1, 1, 1),
16778
- createRow(indices2, 1.5, -1)
16777
+ createRow(indices0, 0.5, -1, bank),
16778
+ // Row 1: slow left
16779
+ createRow(indices1, 1, 1, bank),
16780
+ // Row 2: medium right
16781
+ createRow(indices2, 0.7, -1, bank)
16782
+ // Row 3: medium-slow left
16779
16783
  ];
16780
16784
  this.rebuildRibbons();
16781
16785
  }
@@ -16924,26 +16928,379 @@ var init_carousel = __esm({
16924
16928
  }
16925
16929
  });
16926
16930
 
16931
+ // packages/cli/dist/tui/carousel-descriptors.js
16932
+ import { existsSync as existsSync17, readFileSync as readFileSync14, writeFileSync as writeFileSync8, mkdirSync as mkdirSync8, readdirSync as readdirSync9 } from "node:fs";
16933
+ import { join as join24, basename as basename7 } from "node:path";
16934
+ function loadToolProfile(repoRoot) {
16935
+ const filePath = join24(repoRoot, OA_DIR, "context", TOOL_PROFILE_FILE);
16936
+ try {
16937
+ if (!existsSync17(filePath))
16938
+ return null;
16939
+ return JSON.parse(readFileSync14(filePath, "utf-8"));
16940
+ } catch {
16941
+ return null;
16942
+ }
16943
+ }
16944
+ function saveToolProfile(repoRoot, profile) {
16945
+ const contextDir = join24(repoRoot, OA_DIR, "context");
16946
+ mkdirSync8(contextDir, { recursive: true });
16947
+ writeFileSync8(join24(contextDir, TOOL_PROFILE_FILE), JSON.stringify(profile, null, 2), "utf-8");
16948
+ }
16949
+ function categorizeToolCall(toolName) {
16950
+ for (const cat of TOOL_CATEGORIES) {
16951
+ if (cat.tools.includes(toolName))
16952
+ return cat.name;
16953
+ }
16954
+ if (toolName.startsWith("aiwg_") || toolName.startsWith("skill_"))
16955
+ return "skill";
16956
+ if (toolName === "create_tool" || toolName === "manage_tools")
16957
+ return "toolCreate";
16958
+ return "default";
16959
+ }
16960
+ function mergeToolCalls(repoRoot, toolCalls) {
16961
+ const existing = loadToolProfile(repoRoot) ?? {
16962
+ totalCalls: 0,
16963
+ categories: {},
16964
+ updatedAt: (/* @__PURE__ */ new Date()).toISOString()
16965
+ };
16966
+ for (const call of toolCalls) {
16967
+ const cat = categorizeToolCall(call.tool);
16968
+ existing.categories[cat] = (existing.categories[cat] ?? 0) + 1;
16969
+ existing.totalCalls++;
16970
+ }
16971
+ existing.updatedAt = (/* @__PURE__ */ new Date()).toISOString();
16972
+ saveToolProfile(repoRoot, existing);
16973
+ return existing;
16974
+ }
16975
+ function weightedColor(profile) {
16976
+ if (!profile || profile.totalCalls === 0) {
16977
+ const defaultColors = TOOL_CATEGORIES.find((c3) => c3.name === "default").colors;
16978
+ return defaultColors[Math.floor(Math.random() * defaultColors.length)];
16979
+ }
16980
+ const entries = [];
16981
+ let totalWeight = 0;
16982
+ for (const cat of TOOL_CATEGORIES) {
16983
+ const weight = profile.categories[cat.name] ?? 0;
16984
+ if (weight > 0) {
16985
+ entries.push({ category: cat, weight });
16986
+ totalWeight += weight;
16987
+ }
16988
+ }
16989
+ if (totalWeight === 0) {
16990
+ const defaultColors = TOOL_CATEGORIES.find((c3) => c3.name === "default").colors;
16991
+ return defaultColors[Math.floor(Math.random() * defaultColors.length)];
16992
+ }
16993
+ let roll = Math.random() * totalWeight;
16994
+ let selectedCat = entries[0].category;
16995
+ for (const entry of entries) {
16996
+ roll -= entry.weight;
16997
+ if (roll <= 0) {
16998
+ selectedCat = entry.category;
16999
+ break;
17000
+ }
17001
+ }
17002
+ return selectedCat.colors[Math.floor(Math.random() * selectedCat.colors.length)];
17003
+ }
17004
+ function loadCachedDescriptors(repoRoot) {
17005
+ const filePath = join24(repoRoot, OA_DIR, "context", DESCRIPTOR_FILE);
17006
+ try {
17007
+ if (!existsSync17(filePath))
17008
+ return null;
17009
+ const cached = JSON.parse(readFileSync14(filePath, "utf-8"));
17010
+ return cached.phrases.length > 0 ? cached.phrases : null;
17011
+ } catch {
17012
+ return null;
17013
+ }
17014
+ }
17015
+ function saveCachedDescriptors(repoRoot, phrases, sourceHash) {
17016
+ const contextDir = join24(repoRoot, OA_DIR, "context");
17017
+ mkdirSync8(contextDir, { recursive: true });
17018
+ const cached = {
17019
+ phrases,
17020
+ generatedAt: (/* @__PURE__ */ new Date()).toISOString(),
17021
+ sourceHash
17022
+ };
17023
+ writeFileSync8(join24(contextDir, DESCRIPTOR_FILE), JSON.stringify(cached, null, 2), "utf-8");
17024
+ }
17025
+ function generateDescriptors(repoRoot) {
17026
+ const profile = loadToolProfile(repoRoot);
17027
+ const tags = [];
17028
+ extractFromPackageJson(repoRoot, tags);
17029
+ extractFromIndexMeta(repoRoot, tags);
17030
+ extractFromManifests(repoRoot, tags);
17031
+ extractFromSessions(repoRoot, tags);
17032
+ extractFromMemory(repoRoot, tags);
17033
+ extractFromToolProfile(profile, tags);
17034
+ const repoName2 = basename7(repoRoot);
17035
+ if (repoName2 && !tags.includes(repoName2)) {
17036
+ tags.push(repoName2);
17037
+ }
17038
+ const unique = [...new Set(tags.map((t) => t.toLowerCase().trim()).filter((t) => t.length > 1 && t.length < 60))];
17039
+ const phrases = unique.map((text) => ({
17040
+ text,
17041
+ color: weightedColor(profile)
17042
+ }));
17043
+ if (phrases.length < 12) {
17044
+ const fallbacks = [
17045
+ "building",
17046
+ "exploring",
17047
+ "creating",
17048
+ "refactoring",
17049
+ "testing",
17050
+ "debugging",
17051
+ "shipping",
17052
+ "iterating",
17053
+ "composing",
17054
+ "evolving",
17055
+ "crafting",
17056
+ "analyzing"
17057
+ ];
17058
+ for (const fb of fallbacks) {
17059
+ if (phrases.length >= 20)
17060
+ break;
17061
+ if (!unique.includes(fb)) {
17062
+ phrases.push({ text: fb, color: weightedColor(profile) });
17063
+ }
17064
+ }
17065
+ }
17066
+ const sourceHash = `${tags.length}-${profile?.totalCalls ?? 0}-${Date.now()}`;
17067
+ saveCachedDescriptors(repoRoot, phrases, sourceHash);
17068
+ return phrases;
17069
+ }
17070
+ function extractFromPackageJson(repoRoot, tags) {
17071
+ const pkgPath = join24(repoRoot, "package.json");
17072
+ try {
17073
+ if (!existsSync17(pkgPath))
17074
+ return;
17075
+ const pkg = JSON.parse(readFileSync14(pkgPath, "utf-8"));
17076
+ if (pkg.name && typeof pkg.name === "string") {
17077
+ const parts = pkg.name.replace(/^@/, "").split("/");
17078
+ for (const p of parts)
17079
+ tags.push(p);
17080
+ }
17081
+ if (pkg.description && typeof pkg.description === "string") {
17082
+ const words = pkg.description.toLowerCase().replace(/[^a-z0-9\s-]/g, " ").split(/\s+/).filter((w) => w.length > 3 && !STOP_WORDS.has(w));
17083
+ tags.push(...words.slice(0, 8));
17084
+ }
17085
+ if (Array.isArray(pkg.keywords)) {
17086
+ for (const kw of pkg.keywords) {
17087
+ if (typeof kw === "string")
17088
+ tags.push(kw);
17089
+ }
17090
+ }
17091
+ } catch {
17092
+ }
17093
+ }
17094
+ function extractFromIndexMeta(repoRoot, tags) {
17095
+ const meta = readIndexMeta(repoRoot);
17096
+ if (!meta)
17097
+ return;
17098
+ for (const lang of Object.keys(meta.languages)) {
17099
+ tags.push(lang.toLowerCase());
17100
+ }
17101
+ if (meta.fileCount > 0) {
17102
+ tags.push(`${meta.fileCount} files`);
17103
+ }
17104
+ }
17105
+ function extractFromManifests(repoRoot, tags) {
17106
+ const manifestChecks = [
17107
+ { file: "package.json", tag: "node.js" },
17108
+ { file: "pyproject.toml", tag: "python" },
17109
+ { file: "Cargo.toml", tag: "rust" },
17110
+ { file: "go.mod", tag: "golang" },
17111
+ { file: "pom.xml", tag: "java" },
17112
+ { file: "Gemfile", tag: "ruby" },
17113
+ { file: "Dockerfile", tag: "docker" },
17114
+ { file: "pnpm-workspace.yaml", tag: "monorepo" },
17115
+ { file: "tsconfig.json", tag: "typescript" },
17116
+ { file: ".github/workflows", tag: "ci/cd" }
17117
+ ];
17118
+ for (const check of manifestChecks) {
17119
+ if (existsSync17(join24(repoRoot, check.file))) {
17120
+ tags.push(check.tag);
17121
+ }
17122
+ }
17123
+ }
17124
+ function extractFromSessions(repoRoot, tags) {
17125
+ try {
17126
+ const sessions = loadRecentSessions(repoRoot, 10);
17127
+ for (const session of sessions) {
17128
+ if (session.task) {
17129
+ const words = session.task.toLowerCase().replace(/[^a-z0-9\s-]/g, " ").split(/\s+/).filter((w) => w.length > 3 && !STOP_WORDS.has(w));
17130
+ tags.push(...words.slice(0, 4));
17131
+ }
17132
+ if (session.summary) {
17133
+ const words = session.summary.toLowerCase().replace(/[^a-z0-9\s-]/g, " ").split(/\s+/).filter((w) => w.length > 3 && !STOP_WORDS.has(w));
17134
+ tags.push(...words.slice(0, 3));
17135
+ }
17136
+ }
17137
+ } catch {
17138
+ }
17139
+ }
17140
+ function extractFromMemory(repoRoot, tags) {
17141
+ const memoryDir = join24(repoRoot, OA_DIR, "memory");
17142
+ try {
17143
+ if (!existsSync17(memoryDir))
17144
+ return;
17145
+ const files = readdirSync9(memoryDir).filter((f) => f.endsWith(".json"));
17146
+ for (const file of files) {
17147
+ const topic = file.replace(/\.json$/, "").replace(/[-_]/g, " ");
17148
+ tags.push(topic);
17149
+ try {
17150
+ const data = JSON.parse(readFileSync14(join24(memoryDir, file), "utf-8"));
17151
+ if (data && typeof data === "object") {
17152
+ const keys = Object.keys(data).slice(0, 3);
17153
+ for (const key of keys) {
17154
+ if (typeof key === "string" && key.length > 2 && key.length < 30) {
17155
+ tags.push(key.replace(/[-_]/g, " "));
17156
+ }
17157
+ }
17158
+ }
17159
+ } catch {
17160
+ }
17161
+ }
17162
+ } catch {
17163
+ }
17164
+ }
17165
+ function extractFromToolProfile(profile, tags) {
17166
+ if (!profile)
17167
+ return;
17168
+ const sorted = Object.entries(profile.categories).sort((a, b) => b[1] - a[1]);
17169
+ for (const [cat, count] of sorted) {
17170
+ if (count > 0) {
17171
+ const label = CATEGORY_LABELS[cat] ?? cat;
17172
+ tags.push(label);
17173
+ }
17174
+ }
17175
+ }
17176
+ var TOOL_CATEGORIES, TOOL_PROFILE_FILE, DESCRIPTOR_FILE, CATEGORY_LABELS, STOP_WORDS;
17177
+ var init_carousel_descriptors = __esm({
17178
+ "packages/cli/dist/tui/carousel-descriptors.js"() {
17179
+ "use strict";
17180
+ init_oa_directory();
17181
+ TOOL_CATEGORIES = [
17182
+ {
17183
+ name: "file",
17184
+ colors: [34, 70, 71, 77, 78, 114, 150, 157],
17185
+ tools: ["file_read", "file_write", "file_edit", "file_patch", "batch_edit"]
17186
+ },
17187
+ {
17188
+ name: "shell",
17189
+ colors: [37, 73, 79, 80, 116, 117, 152, 158],
17190
+ tools: ["shell", "background_run"]
17191
+ },
17192
+ {
17193
+ name: "web",
17194
+ colors: [25, 26, 32, 33, 68, 69, 110, 153],
17195
+ tools: ["web_search", "web_fetch"]
17196
+ },
17197
+ {
17198
+ name: "search",
17199
+ colors: [60, 97, 98, 134, 135, 141, 177, 189],
17200
+ tools: ["grep_search", "find_files", "list_directory", "codebase_map", "diagnostic", "git_info"]
17201
+ },
17202
+ {
17203
+ name: "memory",
17204
+ colors: [136, 172, 178, 179, 214, 215, 220, 222],
17205
+ tools: ["memory_read", "memory_write"]
17206
+ },
17207
+ {
17208
+ name: "default",
17209
+ colors: [60, 97, 97, 141, 141, 183, 183, 189],
17210
+ tools: []
17211
+ }
17212
+ ];
17213
+ TOOL_PROFILE_FILE = "tool-profile.json";
17214
+ DESCRIPTOR_FILE = "carousel-descriptors.json";
17215
+ CATEGORY_LABELS = {
17216
+ file: "file operations",
17217
+ shell: "shell commands",
17218
+ web: "web access",
17219
+ search: "code search",
17220
+ memory: "memory management",
17221
+ skill: "skill execution",
17222
+ toolCreate: "tool creation",
17223
+ default: "general tools"
17224
+ };
17225
+ STOP_WORDS = /* @__PURE__ */ new Set([
17226
+ "the",
17227
+ "and",
17228
+ "for",
17229
+ "are",
17230
+ "but",
17231
+ "not",
17232
+ "you",
17233
+ "all",
17234
+ "can",
17235
+ "had",
17236
+ "her",
17237
+ "was",
17238
+ "one",
17239
+ "our",
17240
+ "out",
17241
+ "has",
17242
+ "have",
17243
+ "been",
17244
+ "from",
17245
+ "with",
17246
+ "they",
17247
+ "this",
17248
+ "that",
17249
+ "will",
17250
+ "each",
17251
+ "make",
17252
+ "like",
17253
+ "just",
17254
+ "over",
17255
+ "such",
17256
+ "take",
17257
+ "than",
17258
+ "them",
17259
+ "very",
17260
+ "some",
17261
+ "into",
17262
+ "most",
17263
+ "also",
17264
+ "upon",
17265
+ "what",
17266
+ "when",
17267
+ "which",
17268
+ "their",
17269
+ "said",
17270
+ "about",
17271
+ "would",
17272
+ "these",
17273
+ "other",
17274
+ "could",
17275
+ "after",
17276
+ "using",
17277
+ "used",
17278
+ "more",
17279
+ "does"
17280
+ ]);
17281
+ }
17282
+ });
17283
+
16927
17284
  // packages/cli/dist/tui/voice.js
16928
- import { existsSync as existsSync17, mkdirSync as mkdirSync8, writeFileSync as writeFileSync8, readFileSync as readFileSync14, unlinkSync as unlinkSync3 } from "node:fs";
16929
- import { join as join24 } from "node:path";
17285
+ import { existsSync as existsSync18, mkdirSync as mkdirSync9, writeFileSync as writeFileSync9, readFileSync as readFileSync15, unlinkSync as unlinkSync3 } from "node:fs";
17286
+ import { join as join25 } from "node:path";
16930
17287
  import { homedir as homedir10, tmpdir as tmpdir4, platform as platform2 } from "node:os";
16931
17288
  import { execSync as execSync15, spawn as nodeSpawn } from "node:child_process";
16932
17289
  import { createRequire } from "node:module";
16933
17290
  function voiceDir() {
16934
- return join24(homedir10(), ".open-agents", "voice");
17291
+ return join25(homedir10(), ".open-agents", "voice");
16935
17292
  }
16936
17293
  function modelsDir() {
16937
- return join24(voiceDir(), "models");
17294
+ return join25(voiceDir(), "models");
16938
17295
  }
16939
17296
  function modelDir(id) {
16940
- return join24(modelsDir(), id);
17297
+ return join25(modelsDir(), id);
16941
17298
  }
16942
17299
  function modelOnnxPath(id) {
16943
- return join24(modelDir(id), "model.onnx");
17300
+ return join25(modelDir(id), "model.onnx");
16944
17301
  }
16945
17302
  function modelConfigPath(id) {
16946
- return join24(modelDir(id), "config.json");
17303
+ return join25(modelDir(id), "config.json");
16947
17304
  }
16948
17305
  function describeToolCall(toolName, args) {
16949
17306
  const path = args["path"];
@@ -17216,7 +17573,7 @@ var init_voice = __esm({
17216
17573
  const audioData = result["output"].data;
17217
17574
  if (audioData.length === 0)
17218
17575
  return;
17219
- const wavPath = join24(tmpdir4(), `oa-voice-${Date.now()}.wav`);
17576
+ const wavPath = join25(tmpdir4(), `oa-voice-${Date.now()}.wav`);
17220
17577
  this.writeWav(audioData, this.config.audio.sample_rate, wavPath);
17221
17578
  await this.playWav(wavPath);
17222
17579
  try {
@@ -17296,7 +17653,7 @@ var init_voice = __esm({
17296
17653
  buffer.write("data", 36);
17297
17654
  buffer.writeUInt32LE(dataSize, 40);
17298
17655
  Buffer.from(int16.buffer, int16.byteOffset, int16.byteLength).copy(buffer, 44);
17299
- writeFileSync8(path, buffer);
17656
+ writeFileSync9(path, buffer);
17300
17657
  }
17301
17658
  // -------------------------------------------------------------------------
17302
17659
  // Audio playback (system default speakers)
@@ -17370,30 +17727,30 @@ var init_voice = __esm({
17370
17727
  return;
17371
17728
  const arch = process.arch;
17372
17729
  const isArmLinux = (arch === "arm64" || arch === "arm") && process.platform === "linux";
17373
- mkdirSync8(voiceDir(), { recursive: true });
17374
- const pkgPath = join24(voiceDir(), "package.json");
17730
+ mkdirSync9(voiceDir(), { recursive: true });
17731
+ const pkgPath = join25(voiceDir(), "package.json");
17375
17732
  const expectedDeps = {
17376
17733
  "onnxruntime-node": "^1.21.0",
17377
17734
  "phonemizer": "^1.2.1"
17378
17735
  };
17379
- if (existsSync17(pkgPath)) {
17736
+ if (existsSync18(pkgPath)) {
17380
17737
  try {
17381
- const existing = JSON.parse(readFileSync14(pkgPath, "utf8"));
17738
+ const existing = JSON.parse(readFileSync15(pkgPath, "utf8"));
17382
17739
  if (!existing.dependencies?.["phonemizer"]) {
17383
17740
  existing.dependencies = { ...existing.dependencies, ...expectedDeps };
17384
- writeFileSync8(pkgPath, JSON.stringify(existing, null, 2));
17741
+ writeFileSync9(pkgPath, JSON.stringify(existing, null, 2));
17385
17742
  }
17386
17743
  } catch {
17387
17744
  }
17388
17745
  }
17389
- if (!existsSync17(pkgPath)) {
17390
- writeFileSync8(pkgPath, JSON.stringify({
17746
+ if (!existsSync18(pkgPath)) {
17747
+ writeFileSync9(pkgPath, JSON.stringify({
17391
17748
  name: "open-agents-voice",
17392
17749
  private: true,
17393
17750
  dependencies: expectedDeps
17394
17751
  }, null, 2));
17395
17752
  }
17396
- const voiceRequire = createRequire(join24(voiceDir(), "index.js"));
17753
+ const voiceRequire = createRequire(join25(voiceDir(), "index.js"));
17397
17754
  try {
17398
17755
  this.ort = voiceRequire("onnxruntime-node");
17399
17756
  } catch {
@@ -17447,18 +17804,18 @@ Error: ${err instanceof Error ? err.message : String(err)}`);
17447
17804
  const dir = modelDir(id);
17448
17805
  const onnxPath = modelOnnxPath(id);
17449
17806
  const configPath = modelConfigPath(id);
17450
- if (existsSync17(onnxPath) && existsSync17(configPath))
17807
+ if (existsSync18(onnxPath) && existsSync18(configPath))
17451
17808
  return;
17452
- mkdirSync8(dir, { recursive: true });
17453
- if (!existsSync17(configPath)) {
17809
+ mkdirSync9(dir, { recursive: true });
17810
+ if (!existsSync18(configPath)) {
17454
17811
  renderInfo(`Downloading ${model.label} voice config...`);
17455
17812
  const configResp = await fetch(model.configUrl);
17456
17813
  if (!configResp.ok)
17457
17814
  throw new Error(`Failed to download config: HTTP ${configResp.status}`);
17458
17815
  const configText = await configResp.text();
17459
- writeFileSync8(configPath, configText);
17816
+ writeFileSync9(configPath, configText);
17460
17817
  }
17461
- if (!existsSync17(onnxPath)) {
17818
+ if (!existsSync18(onnxPath)) {
17462
17819
  renderInfo(`Downloading ${model.label} voice model (this may take a minute)...`);
17463
17820
  const onnxResp = await fetch(model.onnxUrl);
17464
17821
  if (!onnxResp.ok)
@@ -17482,7 +17839,7 @@ Error: ${err instanceof Error ? err.message : String(err)}`);
17482
17839
  }
17483
17840
  process.stdout.write("\r" + " ".repeat(60) + "\r");
17484
17841
  const fullBuffer = Buffer.concat(chunks);
17485
- writeFileSync8(onnxPath, fullBuffer);
17842
+ writeFileSync9(onnxPath, fullBuffer);
17486
17843
  renderInfo(`${model.label} model downloaded (${formatBytes2(fullBuffer.length)}).`);
17487
17844
  }
17488
17845
  }
@@ -17494,10 +17851,10 @@ Error: ${err instanceof Error ? err.message : String(err)}`);
17494
17851
  throw new Error("ONNX runtime not loaded");
17495
17852
  const onnxPath = modelOnnxPath(this.modelId);
17496
17853
  const configPath = modelConfigPath(this.modelId);
17497
- if (!existsSync17(onnxPath) || !existsSync17(configPath)) {
17854
+ if (!existsSync18(onnxPath) || !existsSync18(configPath)) {
17498
17855
  throw new Error(`Model files not found for ${this.modelId}`);
17499
17856
  }
17500
- this.config = JSON.parse(readFileSync14(configPath, "utf8"));
17857
+ this.config = JSON.parse(readFileSync15(configPath, "utf8"));
17501
17858
  renderInfo("Loading voice model...");
17502
17859
  this.session = await this.ort.InferenceSession.create(onnxPath, {
17503
17860
  executionProviders: ["cpu"],
@@ -17997,13 +18354,13 @@ var init_stream_renderer = __esm({
17997
18354
  });
17998
18355
 
17999
18356
  // packages/cli/dist/tui/edit-history.js
18000
- import { appendFileSync, mkdirSync as mkdirSync9 } from "node:fs";
18001
- import { join as join25 } from "node:path";
18357
+ import { appendFileSync, mkdirSync as mkdirSync10 } from "node:fs";
18358
+ import { join as join26 } from "node:path";
18002
18359
  function createEditHistoryLogger(repoRoot, sessionId) {
18003
- const historyDir = join25(repoRoot, ".oa", "history");
18004
- const logPath = join25(historyDir, "edits.jsonl");
18360
+ const historyDir = join26(repoRoot, ".oa", "history");
18361
+ const logPath = join26(historyDir, "edits.jsonl");
18005
18362
  try {
18006
- mkdirSync9(historyDir, { recursive: true });
18363
+ mkdirSync10(historyDir, { recursive: true });
18007
18364
  } catch {
18008
18365
  }
18009
18366
  function logToolCall(toolName, toolArgs, success) {
@@ -18112,8 +18469,8 @@ var init_edit_history = __esm({
18112
18469
  });
18113
18470
 
18114
18471
  // packages/cli/dist/tui/dream-engine.js
18115
- import { mkdirSync as mkdirSync10, writeFileSync as writeFileSync9, readFileSync as readFileSync15, existsSync as existsSync18, cpSync, rmSync, readdirSync as readdirSync9 } from "node:fs";
18116
- import { join as join26, basename as basename7 } from "node:path";
18472
+ import { mkdirSync as mkdirSync11, writeFileSync as writeFileSync10, readFileSync as readFileSync16, existsSync as existsSync19, cpSync, rmSync, readdirSync as readdirSync10 } from "node:fs";
18473
+ import { join as join27, basename as basename8 } from "node:path";
18117
18474
  import { execSync as execSync16 } from "node:child_process";
18118
18475
  function adaptTool(tool) {
18119
18476
  return {
@@ -18288,14 +18645,14 @@ var init_dream_engine = __esm({
18288
18645
  const content = String(args["content"] ?? "");
18289
18646
  if (!rawPath)
18290
18647
  return { success: false, output: "", error: "path is required", durationMs: Date.now() - start };
18291
- const targetPath = rawPath.startsWith("/") || rawPath.startsWith(".oa/dreams") ? join26(this.dreamsDir, basename7(rawPath)) : join26(this.dreamsDir, rawPath);
18648
+ const targetPath = rawPath.startsWith("/") || rawPath.startsWith(".oa/dreams") ? join27(this.dreamsDir, basename8(rawPath)) : join27(this.dreamsDir, rawPath);
18292
18649
  if (!targetPath.startsWith(this.dreamsDir)) {
18293
18650
  return { success: false, output: "", error: "Dream mode: writes are confined to .oa/dreams/", durationMs: Date.now() - start };
18294
18651
  }
18295
18652
  try {
18296
- const dir = join26(targetPath, "..");
18297
- mkdirSync10(dir, { recursive: true });
18298
- writeFileSync9(targetPath, content, "utf-8");
18653
+ const dir = join27(targetPath, "..");
18654
+ mkdirSync11(dir, { recursive: true });
18655
+ writeFileSync10(targetPath, content, "utf-8");
18299
18656
  return { success: true, output: `Wrote ${content.length} bytes to ${rawPath}`, durationMs: Date.now() - start };
18300
18657
  } catch (err) {
18301
18658
  return { success: false, output: "", error: String(err), durationMs: Date.now() - start };
@@ -18323,20 +18680,20 @@ var init_dream_engine = __esm({
18323
18680
  const rawPath = String(args["path"] ?? "");
18324
18681
  const oldStr = String(args["old_string"] ?? "");
18325
18682
  const newStr = String(args["new_string"] ?? "");
18326
- const targetPath = rawPath.startsWith("/") || rawPath.startsWith(".oa/dreams") ? join26(this.dreamsDir, basename7(rawPath)) : join26(this.dreamsDir, rawPath);
18683
+ const targetPath = rawPath.startsWith("/") || rawPath.startsWith(".oa/dreams") ? join27(this.dreamsDir, basename8(rawPath)) : join27(this.dreamsDir, rawPath);
18327
18684
  if (!targetPath.startsWith(this.dreamsDir)) {
18328
18685
  return { success: false, output: "", error: "Dream mode: edits are confined to .oa/dreams/", durationMs: Date.now() - start };
18329
18686
  }
18330
18687
  try {
18331
- if (!existsSync18(targetPath)) {
18688
+ if (!existsSync19(targetPath)) {
18332
18689
  return { success: false, output: "", error: `File not found: ${rawPath}`, durationMs: Date.now() - start };
18333
18690
  }
18334
- let content = readFileSync15(targetPath, "utf-8");
18691
+ let content = readFileSync16(targetPath, "utf-8");
18335
18692
  if (!content.includes(oldStr)) {
18336
18693
  return { success: false, output: "", error: "old_string not found in file", durationMs: Date.now() - start };
18337
18694
  }
18338
18695
  content = content.replace(oldStr, newStr);
18339
- writeFileSync9(targetPath, content, "utf-8");
18696
+ writeFileSync10(targetPath, content, "utf-8");
18340
18697
  return { success: true, output: `Edited ${rawPath}`, durationMs: Date.now() - start };
18341
18698
  } catch (err) {
18342
18699
  return { success: false, output: "", error: String(err), durationMs: Date.now() - start };
@@ -18390,7 +18747,7 @@ var init_dream_engine = __esm({
18390
18747
  constructor(config, repoRoot) {
18391
18748
  this.config = config;
18392
18749
  this.repoRoot = repoRoot;
18393
- this.dreamsDir = join26(repoRoot, ".oa", "dreams");
18750
+ this.dreamsDir = join27(repoRoot, ".oa", "dreams");
18394
18751
  this.state = {
18395
18752
  mode: "default",
18396
18753
  active: false,
@@ -18421,7 +18778,7 @@ var init_dream_engine = __esm({
18421
18778
  startedAt: (/* @__PURE__ */ new Date()).toISOString(),
18422
18779
  results: []
18423
18780
  };
18424
- mkdirSync10(this.dreamsDir, { recursive: true });
18781
+ mkdirSync11(this.dreamsDir, { recursive: true });
18425
18782
  this.saveDreamState();
18426
18783
  try {
18427
18784
  for (let cycle = 1; cycle <= totalCycles; cycle++) {
@@ -18462,8 +18819,8 @@ ${result.summary}`;
18462
18819
  if (mode !== "default" || cycle === totalCycles) {
18463
18820
  renderDreamContraction(cycle);
18464
18821
  const cycleSummary = this.buildCycleSummary(cycle, previousFindings);
18465
- const summaryPath = join26(this.dreamsDir, `cycle-${cycle}-summary.md`);
18466
- writeFileSync9(summaryPath, cycleSummary, "utf-8");
18822
+ const summaryPath = join27(this.dreamsDir, `cycle-${cycle}-summary.md`);
18823
+ writeFileSync10(summaryPath, cycleSummary, "utf-8");
18467
18824
  }
18468
18825
  if (mode === "lucid" && !this.abortController.signal.aborted) {
18469
18826
  this.saveVersionCheckpoint(cycle);
@@ -18585,9 +18942,9 @@ Dreams directory: ${this.dreamsDir}`);
18585
18942
  }
18586
18943
  /** Save workspace backup for lucid mode */
18587
18944
  saveVersionCheckpoint(cycle) {
18588
- const checkpointDir = join26(this.dreamsDir, "checkpoints", `cycle-${cycle}`);
18945
+ const checkpointDir = join27(this.dreamsDir, "checkpoints", `cycle-${cycle}`);
18589
18946
  try {
18590
- mkdirSync10(checkpointDir, { recursive: true });
18947
+ mkdirSync11(checkpointDir, { recursive: true });
18591
18948
  try {
18592
18949
  const gitStatus = execSync16("git status --porcelain", {
18593
18950
  cwd: this.repoRoot,
@@ -18604,10 +18961,10 @@ Dreams directory: ${this.dreamsDir}`);
18604
18961
  encoding: "utf-8",
18605
18962
  timeout: 5e3
18606
18963
  }).trim();
18607
- writeFileSync9(join26(checkpointDir, "git-status.txt"), gitStatus, "utf-8");
18608
- writeFileSync9(join26(checkpointDir, "git-diff.patch"), gitDiff, "utf-8");
18609
- writeFileSync9(join26(checkpointDir, "git-hash.txt"), gitHash, "utf-8");
18610
- writeFileSync9(join26(checkpointDir, "checkpoint.json"), JSON.stringify({
18964
+ writeFileSync10(join27(checkpointDir, "git-status.txt"), gitStatus, "utf-8");
18965
+ writeFileSync10(join27(checkpointDir, "git-diff.patch"), gitDiff, "utf-8");
18966
+ writeFileSync10(join27(checkpointDir, "git-hash.txt"), gitHash, "utf-8");
18967
+ writeFileSync10(join27(checkpointDir, "checkpoint.json"), JSON.stringify({
18611
18968
  cycle,
18612
18969
  timestamp: (/* @__PURE__ */ new Date()).toISOString(),
18613
18970
  gitHash,
@@ -18615,7 +18972,7 @@ Dreams directory: ${this.dreamsDir}`);
18615
18972
  }, null, 2), "utf-8");
18616
18973
  renderInfo(`Checkpoint saved: cycle ${cycle} (${gitHash.slice(0, 8)})`);
18617
18974
  } catch {
18618
- writeFileSync9(join26(checkpointDir, "checkpoint.json"), JSON.stringify({ cycle, timestamp: (/* @__PURE__ */ new Date()).toISOString(), mode: this.state.mode }, null, 2), "utf-8");
18975
+ writeFileSync10(join27(checkpointDir, "checkpoint.json"), JSON.stringify({ cycle, timestamp: (/* @__PURE__ */ new Date()).toISOString(), mode: this.state.mode }, null, 2), "utf-8");
18619
18976
  renderInfo(`Checkpoint saved: cycle ${cycle} (no git)`);
18620
18977
  }
18621
18978
  } catch (err) {
@@ -18652,7 +19009,7 @@ Each proposal includes implementation entrypoints and estimated effort.
18652
19009
  /** Update the master proposal index */
18653
19010
  updateProposalIndex() {
18654
19011
  try {
18655
- const files = readdirSync9(this.dreamsDir).filter((f) => f.endsWith(".md") && f !== "PROPOSAL-INDEX.md" && f !== "dream-state.json").sort();
19012
+ const files = readdirSync10(this.dreamsDir).filter((f) => f.endsWith(".md") && f !== "PROPOSAL-INDEX.md" && f !== "dream-state.json").sort();
18656
19013
  const index = `# Dream Proposals Index
18657
19014
 
18658
19015
  **Last updated**: ${(/* @__PURE__ */ new Date()).toISOString().split("T")[0]}
@@ -18673,14 +19030,14 @@ ${files.map((f) => `- [\`${f}\`](./${f})`).join("\n")}
18673
19030
  ---
18674
19031
  *Auto-generated by open-agents dream engine*
18675
19032
  `;
18676
- writeFileSync9(join26(this.dreamsDir, "PROPOSAL-INDEX.md"), index, "utf-8");
19033
+ writeFileSync10(join27(this.dreamsDir, "PROPOSAL-INDEX.md"), index, "utf-8");
18677
19034
  } catch {
18678
19035
  }
18679
19036
  }
18680
19037
  /** Save dream state for resume/inspection */
18681
19038
  saveDreamState() {
18682
19039
  try {
18683
- writeFileSync9(join26(this.dreamsDir, "dream-state.json"), JSON.stringify(this.state, null, 2) + "\n", "utf-8");
19040
+ writeFileSync10(join27(this.dreamsDir, "dream-state.json"), JSON.stringify(this.state, null, 2) + "\n", "utf-8");
18684
19041
  } catch {
18685
19042
  }
18686
19043
  }
@@ -19512,22 +19869,22 @@ var init_status_bar = __esm({
19512
19869
  import * as readline2 from "node:readline";
19513
19870
  import { Writable } from "node:stream";
19514
19871
  import { cwd } from "node:process";
19515
- import { resolve as resolve16, join as join27, dirname as dirname8, extname as extname9 } from "node:path";
19872
+ import { resolve as resolve16, join as join28, dirname as dirname8, extname as extname9 } from "node:path";
19516
19873
  import { createRequire as createRequire2 } from "node:module";
19517
19874
  import { fileURLToPath as fileURLToPath5 } from "node:url";
19518
- import { readFileSync as readFileSync16 } from "node:fs";
19519
- import { existsSync as existsSync19 } from "node:fs";
19875
+ import { readFileSync as readFileSync17 } from "node:fs";
19876
+ import { existsSync as existsSync20 } from "node:fs";
19520
19877
  function getVersion() {
19521
19878
  try {
19522
19879
  const require2 = createRequire2(import.meta.url);
19523
19880
  const thisDir = dirname8(fileURLToPath5(import.meta.url));
19524
19881
  const candidates = [
19525
- join27(thisDir, "..", "package.json"),
19526
- join27(thisDir, "..", "..", "package.json"),
19527
- join27(thisDir, "..", "..", "..", "package.json")
19882
+ join28(thisDir, "..", "package.json"),
19883
+ join28(thisDir, "..", "..", "package.json"),
19884
+ join28(thisDir, "..", "..", "..", "package.json")
19528
19885
  ];
19529
19886
  for (const pkgPath of candidates) {
19530
- if (existsSync19(pkgPath)) {
19887
+ if (existsSync20(pkgPath)) {
19531
19888
  const pkg = require2(pkgPath);
19532
19889
  if (pkg.name === "open-agents-ai" || pkg.name === "@open-agents/cli") {
19533
19890
  return pkg.version ?? "0.0.0";
@@ -19909,6 +20266,12 @@ function startTask(task, config, repoRoot, voice, stream, taskStores, bruteForce
19909
20266
  } catch {
19910
20267
  }
19911
20268
  }
20269
+ if (toolSequence.length > 0) {
20270
+ try {
20271
+ mergeToolCalls(repoRoot, toolSequence);
20272
+ } catch {
20273
+ }
20274
+ }
19912
20275
  });
19913
20276
  return { runner, promise, filesTouched, get toolCallCount() {
19914
20277
  return toolSequence.length;
@@ -20004,7 +20367,12 @@ async function startInteractive(config, repoPath) {
20004
20367
  renderInfo("Use /endpoint to configure a different backend. Starting anyway...");
20005
20368
  }
20006
20369
  }
20007
- const carousel = new Carousel();
20370
+ let carouselPhrases = null;
20371
+ try {
20372
+ carouselPhrases = loadCachedDescriptors(repoRoot) ?? generateDescriptors(repoRoot);
20373
+ } catch {
20374
+ }
20375
+ const carousel = new Carousel(carouselPhrases ?? void 0);
20008
20376
  let carouselLines = 0;
20009
20377
  const version = getVersion();
20010
20378
  if (isResumed) {
@@ -20561,13 +20929,13 @@ Execute this skill now. Follow the behavioral guidance above.`;
20561
20929
  }
20562
20930
  }
20563
20931
  const cleanPath = input.replace(/^['"]|['"]$/g, "").trim();
20564
- const isImage = isImagePath(cleanPath) && existsSync19(resolve16(repoRoot, cleanPath));
20565
- const isMedia = !isImage && isTranscribablePath(cleanPath) && existsSync19(resolve16(repoRoot, cleanPath));
20932
+ const isImage = isImagePath(cleanPath) && existsSync20(resolve16(repoRoot, cleanPath));
20933
+ const isMedia = !isImage && isTranscribablePath(cleanPath) && existsSync20(resolve16(repoRoot, cleanPath));
20566
20934
  if (activeTask) {
20567
20935
  if (isImage) {
20568
20936
  try {
20569
20937
  const imgPath = resolve16(repoRoot, cleanPath);
20570
- const imgBuffer = readFileSync16(imgPath);
20938
+ const imgBuffer = readFileSync17(imgPath);
20571
20939
  const base64 = imgBuffer.toString("base64");
20572
20940
  const ext = extname9(cleanPath).toLowerCase();
20573
20941
  const mime = ext === ".png" ? "image/png" : ext === ".gif" ? "image/gif" : ext === ".webp" ? "image/webp" : "image/jpeg";
@@ -20796,6 +21164,7 @@ var init_interactive = __esm({
20796
21164
  init_oa_directory();
20797
21165
  init_render();
20798
21166
  init_carousel();
21167
+ init_carousel_descriptors();
20799
21168
  init_voice();
20800
21169
  init_stream_renderer();
20801
21170
  init_edit_history();
@@ -20837,7 +21206,7 @@ import { glob } from "glob";
20837
21206
  import ignore from "ignore";
20838
21207
  import { readFile as readFile10, stat as stat4 } from "node:fs/promises";
20839
21208
  import { createHash } from "node:crypto";
20840
- import { join as join28, relative as relative3, extname as extname10, basename as basename8 } from "node:path";
21209
+ import { join as join29, relative as relative3, extname as extname10, basename as basename9 } from "node:path";
20841
21210
  var DEFAULT_EXCLUDE, LANGUAGE_MAP, CodebaseIndexer;
20842
21211
  var init_codebase_indexer = __esm({
20843
21212
  "packages/indexer/dist/codebase-indexer.js"() {
@@ -20881,7 +21250,7 @@ var init_codebase_indexer = __esm({
20881
21250
  const ig = ignore.default();
20882
21251
  if (this.config.respectGitignore) {
20883
21252
  try {
20884
- const gitignoreContent = await readFile10(join28(this.config.rootDir, ".gitignore"), "utf-8");
21253
+ const gitignoreContent = await readFile10(join29(this.config.rootDir, ".gitignore"), "utf-8");
20885
21254
  ig.add(gitignoreContent);
20886
21255
  } catch {
20887
21256
  }
@@ -20896,7 +21265,7 @@ var init_codebase_indexer = __esm({
20896
21265
  for (const relativePath of files) {
20897
21266
  if (ig.ignores(relativePath))
20898
21267
  continue;
20899
- const fullPath = join28(this.config.rootDir, relativePath);
21268
+ const fullPath = join29(this.config.rootDir, relativePath);
20900
21269
  try {
20901
21270
  const fileStat = await stat4(fullPath);
20902
21271
  if (fileStat.size > this.config.maxFileSize)
@@ -20919,7 +21288,7 @@ var init_codebase_indexer = __esm({
20919
21288
  }
20920
21289
  buildTree(files) {
20921
21290
  const root = {
20922
- name: basename8(this.config.rootDir),
21291
+ name: basename9(this.config.rootDir),
20923
21292
  path: this.config.rootDir,
20924
21293
  type: "directory",
20925
21294
  children: []
@@ -20942,7 +21311,7 @@ var init_codebase_indexer = __esm({
20942
21311
  if (!child) {
20943
21312
  child = {
20944
21313
  name: part,
20945
- path: join28(current.path, part),
21314
+ path: join29(current.path, part),
20946
21315
  type: "directory",
20947
21316
  children: []
20948
21317
  };
@@ -21017,13 +21386,13 @@ __export(index_repo_exports, {
21017
21386
  indexRepoCommand: () => indexRepoCommand
21018
21387
  });
21019
21388
  import { resolve as resolve17 } from "node:path";
21020
- import { existsSync as existsSync20, statSync as statSync7 } from "node:fs";
21389
+ import { existsSync as existsSync21, statSync as statSync7 } from "node:fs";
21021
21390
  import { cwd as cwd2 } from "node:process";
21022
21391
  async function indexRepoCommand(opts, _config) {
21023
21392
  const repoRoot = resolve17(opts.repoPath ?? cwd2());
21024
21393
  printHeader("Index Repository");
21025
21394
  printInfo(`Indexing: ${repoRoot}`);
21026
- if (!existsSync20(repoRoot)) {
21395
+ if (!existsSync21(repoRoot)) {
21027
21396
  printError(`Path does not exist: ${repoRoot}`);
21028
21397
  process.exit(1);
21029
21398
  }
@@ -21269,7 +21638,7 @@ var config_exports = {};
21269
21638
  __export(config_exports, {
21270
21639
  configCommand: () => configCommand
21271
21640
  });
21272
- import { join as join29, resolve as resolve18 } from "node:path";
21641
+ import { join as join30, resolve as resolve18 } from "node:path";
21273
21642
  import { homedir as homedir11 } from "node:os";
21274
21643
  import { cwd as cwd3 } from "node:process";
21275
21644
  function coerceForSettings(key, value) {
@@ -21322,7 +21691,7 @@ function handleShow(opts, config) {
21322
21691
  }
21323
21692
  }
21324
21693
  printSection("Config File");
21325
- printInfo(`~/.open-agents/config.json (${join29(homedir11(), ".open-agents", "config.json")})`);
21694
+ printInfo(`~/.open-agents/config.json (${join30(homedir11(), ".open-agents", "config.json")})`);
21326
21695
  printSection("Priority Chain");
21327
21696
  printInfo(" 1. CLI flags (--model, --backend-url, etc.)");
21328
21697
  printInfo(" 2. Project .oa/settings.json (--local)");
@@ -21361,7 +21730,7 @@ function handleSet(opts, _config) {
21361
21730
  const coerced = coerceForSettings(key, value);
21362
21731
  saveProjectSettings(repoRoot, { [key]: coerced });
21363
21732
  printSuccess(`Project override set: ${key} = ${value}`);
21364
- printInfo(`Saved to ${join29(repoRoot, ".oa", "settings.json")}`);
21733
+ printInfo(`Saved to ${join30(repoRoot, ".oa", "settings.json")}`);
21365
21734
  printInfo("This override applies only when running in this workspace.");
21366
21735
  } catch (err) {
21367
21736
  printError(`Failed to save: ${err instanceof Error ? err.message : String(err)}`);
@@ -21579,8 +21948,8 @@ __export(eval_exports, {
21579
21948
  evalCommand: () => evalCommand
21580
21949
  });
21581
21950
  import { tmpdir as tmpdir5 } from "node:os";
21582
- import { mkdirSync as mkdirSync11, writeFileSync as writeFileSync10 } from "node:fs";
21583
- import { join as join30 } from "node:path";
21951
+ import { mkdirSync as mkdirSync12, writeFileSync as writeFileSync11 } from "node:fs";
21952
+ import { join as join31 } from "node:path";
21584
21953
  async function evalCommand(opts, config) {
21585
21954
  const suiteName = opts.suite ?? "basic";
21586
21955
  const suite = SUITES[suiteName];
@@ -21701,9 +22070,9 @@ async function evalCommand(opts, config) {
21701
22070
  process.exit(failed > 0 ? 1 : 0);
21702
22071
  }
21703
22072
  function createTempEvalRepo() {
21704
- const dir = join30(tmpdir5(), `open-agents-eval-${Date.now()}`);
21705
- mkdirSync11(dir, { recursive: true });
21706
- writeFileSync10(join30(dir, "package.json"), JSON.stringify({ name: "eval-repo", version: "0.0.0" }, null, 2) + "\n", "utf8");
22073
+ const dir = join31(tmpdir5(), `open-agents-eval-${Date.now()}`);
22074
+ mkdirSync12(dir, { recursive: true });
22075
+ writeFileSync11(join31(dir, "package.json"), JSON.stringify({ name: "eval-repo", version: "0.0.0" }, null, 2) + "\n", "utf8");
21707
22076
  return dir;
21708
22077
  }
21709
22078
  var BASIC_SUITE, FULL_SUITE, SUITES;
@@ -21763,7 +22132,7 @@ init_updater();
21763
22132
  import { parseArgs as nodeParseArgs2 } from "node:util";
21764
22133
  import { createRequire as createRequire3 } from "node:module";
21765
22134
  import { fileURLToPath as fileURLToPath6 } from "node:url";
21766
- import { dirname as dirname9, join as join31 } from "node:path";
22135
+ import { dirname as dirname9, join as join32 } from "node:path";
21767
22136
 
21768
22137
  // packages/cli/dist/cli.js
21769
22138
  import { createInterface } from "node:readline";
@@ -21870,7 +22239,7 @@ init_output();
21870
22239
  function getVersion2() {
21871
22240
  try {
21872
22241
  const require2 = createRequire3(import.meta.url);
21873
- const pkgPath = join31(dirname9(fileURLToPath6(import.meta.url)), "..", "package.json");
22242
+ const pkgPath = join32(dirname9(fileURLToPath6(import.meta.url)), "..", "package.json");
21874
22243
  const pkg = require2(pkgPath);
21875
22244
  return pkg.version;
21876
22245
  } catch {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "open-agents-ai",
3
- "version": "0.30.2",
3
+ "version": "0.30.3",
4
4
  "description": "AI coding agent powered by open-source models (Ollama/vLLM) — interactive TUI with agentic tool-calling loop",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",