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.
- package/dist/index.js +472 -103
- 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:
|
|
5429
|
-
for (const ver of
|
|
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:
|
|
12412
|
-
for (const ver of
|
|
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:
|
|
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, `${
|
|
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:
|
|
15680
|
-
const { existsSync:
|
|
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
|
-
|
|
15685
|
-
|
|
15686
|
-
|
|
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 (
|
|
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) =>
|
|
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
|
|
16773
|
-
const
|
|
16774
|
-
const
|
|
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,
|
|
16777
|
-
|
|
16778
|
-
createRow(
|
|
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
|
|
16929
|
-
import { join as
|
|
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
|
|
17291
|
+
return join25(homedir10(), ".open-agents", "voice");
|
|
16935
17292
|
}
|
|
16936
17293
|
function modelsDir() {
|
|
16937
|
-
return
|
|
17294
|
+
return join25(voiceDir(), "models");
|
|
16938
17295
|
}
|
|
16939
17296
|
function modelDir(id) {
|
|
16940
|
-
return
|
|
17297
|
+
return join25(modelsDir(), id);
|
|
16941
17298
|
}
|
|
16942
17299
|
function modelOnnxPath(id) {
|
|
16943
|
-
return
|
|
17300
|
+
return join25(modelDir(id), "model.onnx");
|
|
16944
17301
|
}
|
|
16945
17302
|
function modelConfigPath(id) {
|
|
16946
|
-
return
|
|
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 =
|
|
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
|
-
|
|
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
|
-
|
|
17374
|
-
const pkgPath =
|
|
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 (
|
|
17736
|
+
if (existsSync18(pkgPath)) {
|
|
17380
17737
|
try {
|
|
17381
|
-
const existing = JSON.parse(
|
|
17738
|
+
const existing = JSON.parse(readFileSync15(pkgPath, "utf8"));
|
|
17382
17739
|
if (!existing.dependencies?.["phonemizer"]) {
|
|
17383
17740
|
existing.dependencies = { ...existing.dependencies, ...expectedDeps };
|
|
17384
|
-
|
|
17741
|
+
writeFileSync9(pkgPath, JSON.stringify(existing, null, 2));
|
|
17385
17742
|
}
|
|
17386
17743
|
} catch {
|
|
17387
17744
|
}
|
|
17388
17745
|
}
|
|
17389
|
-
if (!
|
|
17390
|
-
|
|
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(
|
|
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 (
|
|
17807
|
+
if (existsSync18(onnxPath) && existsSync18(configPath))
|
|
17451
17808
|
return;
|
|
17452
|
-
|
|
17453
|
-
if (!
|
|
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
|
-
|
|
17816
|
+
writeFileSync9(configPath, configText);
|
|
17460
17817
|
}
|
|
17461
|
-
if (!
|
|
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
|
-
|
|
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 (!
|
|
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(
|
|
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
|
|
18001
|
-
import { join as
|
|
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 =
|
|
18004
|
-
const logPath =
|
|
18360
|
+
const historyDir = join26(repoRoot, ".oa", "history");
|
|
18361
|
+
const logPath = join26(historyDir, "edits.jsonl");
|
|
18005
18362
|
try {
|
|
18006
|
-
|
|
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
|
|
18116
|
-
import { join as
|
|
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") ?
|
|
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 =
|
|
18297
|
-
|
|
18298
|
-
|
|
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") ?
|
|
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 (!
|
|
18688
|
+
if (!existsSync19(targetPath)) {
|
|
18332
18689
|
return { success: false, output: "", error: `File not found: ${rawPath}`, durationMs: Date.now() - start };
|
|
18333
18690
|
}
|
|
18334
|
-
let content =
|
|
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
|
-
|
|
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 =
|
|
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
|
-
|
|
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 =
|
|
18466
|
-
|
|
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 =
|
|
18945
|
+
const checkpointDir = join27(this.dreamsDir, "checkpoints", `cycle-${cycle}`);
|
|
18589
18946
|
try {
|
|
18590
|
-
|
|
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
|
-
|
|
18608
|
-
|
|
18609
|
-
|
|
18610
|
-
|
|
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
|
-
|
|
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 =
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
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
|
|
19519
|
-
import { existsSync as
|
|
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
|
-
|
|
19526
|
-
|
|
19527
|
-
|
|
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 (
|
|
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
|
-
|
|
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) &&
|
|
20565
|
-
const isMedia = !isImage && isTranscribablePath(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 =
|
|
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
|
|
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(
|
|
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 =
|
|
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:
|
|
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:
|
|
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
|
|
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 (!
|
|
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
|
|
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 (${
|
|
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 ${
|
|
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
|
|
21583
|
-
import { join as
|
|
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 =
|
|
21705
|
-
|
|
21706
|
-
|
|
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
|
|
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 =
|
|
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