open-agents-ai 0.30.1 → 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 +487 -116
- 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
|
}
|
|
@@ -19347,16 +19704,15 @@ var init_status_bar = __esm({
|
|
|
19347
19704
|
for (let i = 0; i < heightDelta; i++)
|
|
19348
19705
|
scrollUp += "\n";
|
|
19349
19706
|
process.stdout.write(scrollUp);
|
|
19707
|
+
process.stdout.write(`\x1B[${this.scrollRegionTop};${pos.scrollEnd}r`);
|
|
19350
19708
|
} else {
|
|
19351
|
-
const
|
|
19352
|
-
|
|
19353
|
-
|
|
19354
|
-
|
|
19355
|
-
|
|
19356
|
-
|
|
19357
|
-
process.stdout.write(clear);
|
|
19709
|
+
const absD = Math.abs(heightDelta);
|
|
19710
|
+
process.stdout.write(`\x1B[${this.scrollRegionTop};${pos.scrollEnd}r`);
|
|
19711
|
+
let scrollDown = `\x1B[${this.scrollRegionTop};1H`;
|
|
19712
|
+
for (let i = 0; i < absD; i++)
|
|
19713
|
+
scrollDown += "\x1BM";
|
|
19714
|
+
process.stdout.write(scrollDown);
|
|
19358
19715
|
}
|
|
19359
|
-
process.stdout.write(`\x1B[${this.scrollRegionTop};${pos.scrollEnd}r`);
|
|
19360
19716
|
}
|
|
19361
19717
|
const sep = c2.dim("\u2500".repeat(w));
|
|
19362
19718
|
const inputWrap = this.wrapInput(w);
|
|
@@ -19420,13 +19776,14 @@ var init_status_bar = __esm({
|
|
|
19420
19776
|
buf += `\x1B[${oldScrollEnd};1H`;
|
|
19421
19777
|
for (let i = 0; i < heightDelta; i++)
|
|
19422
19778
|
buf += "\n";
|
|
19779
|
+
buf += `\x1B[${this.scrollRegionTop};${pos.scrollEnd}r`;
|
|
19423
19780
|
} else {
|
|
19424
|
-
const
|
|
19425
|
-
|
|
19426
|
-
|
|
19427
|
-
|
|
19781
|
+
const absD = Math.abs(heightDelta);
|
|
19782
|
+
buf += `\x1B[${this.scrollRegionTop};${pos.scrollEnd}r`;
|
|
19783
|
+
buf += `\x1B[${this.scrollRegionTop};1H`;
|
|
19784
|
+
for (let i = 0; i < absD; i++)
|
|
19785
|
+
buf += "\x1BM";
|
|
19428
19786
|
}
|
|
19429
|
-
buf += `\x1B[${this.scrollRegionTop};${pos.scrollEnd}r`;
|
|
19430
19787
|
buf += "\x1B[?7l";
|
|
19431
19788
|
const sep = c2.dim("\u2500".repeat(w));
|
|
19432
19789
|
buf += `\x1B[${pos.bufferRow};1H\x1B[2K${this.buildBufferContent(w)}`;
|
|
@@ -19442,6 +19799,8 @@ var init_status_bar = __esm({
|
|
|
19442
19799
|
buf += "\x1B8";
|
|
19443
19800
|
if (heightDelta > 0) {
|
|
19444
19801
|
buf += `\x1B[${heightDelta}A`;
|
|
19802
|
+
} else {
|
|
19803
|
+
buf += `\x1B[${Math.abs(heightDelta)}B`;
|
|
19445
19804
|
}
|
|
19446
19805
|
process.stdout.write(buf);
|
|
19447
19806
|
} else {
|
|
@@ -19510,22 +19869,22 @@ var init_status_bar = __esm({
|
|
|
19510
19869
|
import * as readline2 from "node:readline";
|
|
19511
19870
|
import { Writable } from "node:stream";
|
|
19512
19871
|
import { cwd } from "node:process";
|
|
19513
|
-
import { resolve as resolve16, join as
|
|
19872
|
+
import { resolve as resolve16, join as join28, dirname as dirname8, extname as extname9 } from "node:path";
|
|
19514
19873
|
import { createRequire as createRequire2 } from "node:module";
|
|
19515
19874
|
import { fileURLToPath as fileURLToPath5 } from "node:url";
|
|
19516
|
-
import { readFileSync as
|
|
19517
|
-
import { existsSync as
|
|
19875
|
+
import { readFileSync as readFileSync17 } from "node:fs";
|
|
19876
|
+
import { existsSync as existsSync20 } from "node:fs";
|
|
19518
19877
|
function getVersion() {
|
|
19519
19878
|
try {
|
|
19520
19879
|
const require2 = createRequire2(import.meta.url);
|
|
19521
19880
|
const thisDir = dirname8(fileURLToPath5(import.meta.url));
|
|
19522
19881
|
const candidates = [
|
|
19523
|
-
|
|
19524
|
-
|
|
19525
|
-
|
|
19882
|
+
join28(thisDir, "..", "package.json"),
|
|
19883
|
+
join28(thisDir, "..", "..", "package.json"),
|
|
19884
|
+
join28(thisDir, "..", "..", "..", "package.json")
|
|
19526
19885
|
];
|
|
19527
19886
|
for (const pkgPath of candidates) {
|
|
19528
|
-
if (
|
|
19887
|
+
if (existsSync20(pkgPath)) {
|
|
19529
19888
|
const pkg = require2(pkgPath);
|
|
19530
19889
|
if (pkg.name === "open-agents-ai" || pkg.name === "@open-agents/cli") {
|
|
19531
19890
|
return pkg.version ?? "0.0.0";
|
|
@@ -19907,6 +20266,12 @@ function startTask(task, config, repoRoot, voice, stream, taskStores, bruteForce
|
|
|
19907
20266
|
} catch {
|
|
19908
20267
|
}
|
|
19909
20268
|
}
|
|
20269
|
+
if (toolSequence.length > 0) {
|
|
20270
|
+
try {
|
|
20271
|
+
mergeToolCalls(repoRoot, toolSequence);
|
|
20272
|
+
} catch {
|
|
20273
|
+
}
|
|
20274
|
+
}
|
|
19910
20275
|
});
|
|
19911
20276
|
return { runner, promise, filesTouched, get toolCallCount() {
|
|
19912
20277
|
return toolSequence.length;
|
|
@@ -20002,7 +20367,12 @@ async function startInteractive(config, repoPath) {
|
|
|
20002
20367
|
renderInfo("Use /endpoint to configure a different backend. Starting anyway...");
|
|
20003
20368
|
}
|
|
20004
20369
|
}
|
|
20005
|
-
|
|
20370
|
+
let carouselPhrases = null;
|
|
20371
|
+
try {
|
|
20372
|
+
carouselPhrases = loadCachedDescriptors(repoRoot) ?? generateDescriptors(repoRoot);
|
|
20373
|
+
} catch {
|
|
20374
|
+
}
|
|
20375
|
+
const carousel = new Carousel(carouselPhrases ?? void 0);
|
|
20006
20376
|
let carouselLines = 0;
|
|
20007
20377
|
const version = getVersion();
|
|
20008
20378
|
if (isResumed) {
|
|
@@ -20559,13 +20929,13 @@ Execute this skill now. Follow the behavioral guidance above.`;
|
|
|
20559
20929
|
}
|
|
20560
20930
|
}
|
|
20561
20931
|
const cleanPath = input.replace(/^['"]|['"]$/g, "").trim();
|
|
20562
|
-
const isImage = isImagePath(cleanPath) &&
|
|
20563
|
-
const isMedia = !isImage && isTranscribablePath(cleanPath) &&
|
|
20932
|
+
const isImage = isImagePath(cleanPath) && existsSync20(resolve16(repoRoot, cleanPath));
|
|
20933
|
+
const isMedia = !isImage && isTranscribablePath(cleanPath) && existsSync20(resolve16(repoRoot, cleanPath));
|
|
20564
20934
|
if (activeTask) {
|
|
20565
20935
|
if (isImage) {
|
|
20566
20936
|
try {
|
|
20567
20937
|
const imgPath = resolve16(repoRoot, cleanPath);
|
|
20568
|
-
const imgBuffer =
|
|
20938
|
+
const imgBuffer = readFileSync17(imgPath);
|
|
20569
20939
|
const base64 = imgBuffer.toString("base64");
|
|
20570
20940
|
const ext = extname9(cleanPath).toLowerCase();
|
|
20571
20941
|
const mime = ext === ".png" ? "image/png" : ext === ".gif" ? "image/gif" : ext === ".webp" ? "image/webp" : "image/jpeg";
|
|
@@ -20794,6 +21164,7 @@ var init_interactive = __esm({
|
|
|
20794
21164
|
init_oa_directory();
|
|
20795
21165
|
init_render();
|
|
20796
21166
|
init_carousel();
|
|
21167
|
+
init_carousel_descriptors();
|
|
20797
21168
|
init_voice();
|
|
20798
21169
|
init_stream_renderer();
|
|
20799
21170
|
init_edit_history();
|
|
@@ -20835,7 +21206,7 @@ import { glob } from "glob";
|
|
|
20835
21206
|
import ignore from "ignore";
|
|
20836
21207
|
import { readFile as readFile10, stat as stat4 } from "node:fs/promises";
|
|
20837
21208
|
import { createHash } from "node:crypto";
|
|
20838
|
-
import { join as
|
|
21209
|
+
import { join as join29, relative as relative3, extname as extname10, basename as basename9 } from "node:path";
|
|
20839
21210
|
var DEFAULT_EXCLUDE, LANGUAGE_MAP, CodebaseIndexer;
|
|
20840
21211
|
var init_codebase_indexer = __esm({
|
|
20841
21212
|
"packages/indexer/dist/codebase-indexer.js"() {
|
|
@@ -20879,7 +21250,7 @@ var init_codebase_indexer = __esm({
|
|
|
20879
21250
|
const ig = ignore.default();
|
|
20880
21251
|
if (this.config.respectGitignore) {
|
|
20881
21252
|
try {
|
|
20882
|
-
const gitignoreContent = await readFile10(
|
|
21253
|
+
const gitignoreContent = await readFile10(join29(this.config.rootDir, ".gitignore"), "utf-8");
|
|
20883
21254
|
ig.add(gitignoreContent);
|
|
20884
21255
|
} catch {
|
|
20885
21256
|
}
|
|
@@ -20894,7 +21265,7 @@ var init_codebase_indexer = __esm({
|
|
|
20894
21265
|
for (const relativePath of files) {
|
|
20895
21266
|
if (ig.ignores(relativePath))
|
|
20896
21267
|
continue;
|
|
20897
|
-
const fullPath =
|
|
21268
|
+
const fullPath = join29(this.config.rootDir, relativePath);
|
|
20898
21269
|
try {
|
|
20899
21270
|
const fileStat = await stat4(fullPath);
|
|
20900
21271
|
if (fileStat.size > this.config.maxFileSize)
|
|
@@ -20917,7 +21288,7 @@ var init_codebase_indexer = __esm({
|
|
|
20917
21288
|
}
|
|
20918
21289
|
buildTree(files) {
|
|
20919
21290
|
const root = {
|
|
20920
|
-
name:
|
|
21291
|
+
name: basename9(this.config.rootDir),
|
|
20921
21292
|
path: this.config.rootDir,
|
|
20922
21293
|
type: "directory",
|
|
20923
21294
|
children: []
|
|
@@ -20940,7 +21311,7 @@ var init_codebase_indexer = __esm({
|
|
|
20940
21311
|
if (!child) {
|
|
20941
21312
|
child = {
|
|
20942
21313
|
name: part,
|
|
20943
|
-
path:
|
|
21314
|
+
path: join29(current.path, part),
|
|
20944
21315
|
type: "directory",
|
|
20945
21316
|
children: []
|
|
20946
21317
|
};
|
|
@@ -21015,13 +21386,13 @@ __export(index_repo_exports, {
|
|
|
21015
21386
|
indexRepoCommand: () => indexRepoCommand
|
|
21016
21387
|
});
|
|
21017
21388
|
import { resolve as resolve17 } from "node:path";
|
|
21018
|
-
import { existsSync as
|
|
21389
|
+
import { existsSync as existsSync21, statSync as statSync7 } from "node:fs";
|
|
21019
21390
|
import { cwd as cwd2 } from "node:process";
|
|
21020
21391
|
async function indexRepoCommand(opts, _config) {
|
|
21021
21392
|
const repoRoot = resolve17(opts.repoPath ?? cwd2());
|
|
21022
21393
|
printHeader("Index Repository");
|
|
21023
21394
|
printInfo(`Indexing: ${repoRoot}`);
|
|
21024
|
-
if (!
|
|
21395
|
+
if (!existsSync21(repoRoot)) {
|
|
21025
21396
|
printError(`Path does not exist: ${repoRoot}`);
|
|
21026
21397
|
process.exit(1);
|
|
21027
21398
|
}
|
|
@@ -21267,7 +21638,7 @@ var config_exports = {};
|
|
|
21267
21638
|
__export(config_exports, {
|
|
21268
21639
|
configCommand: () => configCommand
|
|
21269
21640
|
});
|
|
21270
|
-
import { join as
|
|
21641
|
+
import { join as join30, resolve as resolve18 } from "node:path";
|
|
21271
21642
|
import { homedir as homedir11 } from "node:os";
|
|
21272
21643
|
import { cwd as cwd3 } from "node:process";
|
|
21273
21644
|
function coerceForSettings(key, value) {
|
|
@@ -21320,7 +21691,7 @@ function handleShow(opts, config) {
|
|
|
21320
21691
|
}
|
|
21321
21692
|
}
|
|
21322
21693
|
printSection("Config File");
|
|
21323
|
-
printInfo(`~/.open-agents/config.json (${
|
|
21694
|
+
printInfo(`~/.open-agents/config.json (${join30(homedir11(), ".open-agents", "config.json")})`);
|
|
21324
21695
|
printSection("Priority Chain");
|
|
21325
21696
|
printInfo(" 1. CLI flags (--model, --backend-url, etc.)");
|
|
21326
21697
|
printInfo(" 2. Project .oa/settings.json (--local)");
|
|
@@ -21359,7 +21730,7 @@ function handleSet(opts, _config) {
|
|
|
21359
21730
|
const coerced = coerceForSettings(key, value);
|
|
21360
21731
|
saveProjectSettings(repoRoot, { [key]: coerced });
|
|
21361
21732
|
printSuccess(`Project override set: ${key} = ${value}`);
|
|
21362
|
-
printInfo(`Saved to ${
|
|
21733
|
+
printInfo(`Saved to ${join30(repoRoot, ".oa", "settings.json")}`);
|
|
21363
21734
|
printInfo("This override applies only when running in this workspace.");
|
|
21364
21735
|
} catch (err) {
|
|
21365
21736
|
printError(`Failed to save: ${err instanceof Error ? err.message : String(err)}`);
|
|
@@ -21577,8 +21948,8 @@ __export(eval_exports, {
|
|
|
21577
21948
|
evalCommand: () => evalCommand
|
|
21578
21949
|
});
|
|
21579
21950
|
import { tmpdir as tmpdir5 } from "node:os";
|
|
21580
|
-
import { mkdirSync as
|
|
21581
|
-
import { join as
|
|
21951
|
+
import { mkdirSync as mkdirSync12, writeFileSync as writeFileSync11 } from "node:fs";
|
|
21952
|
+
import { join as join31 } from "node:path";
|
|
21582
21953
|
async function evalCommand(opts, config) {
|
|
21583
21954
|
const suiteName = opts.suite ?? "basic";
|
|
21584
21955
|
const suite = SUITES[suiteName];
|
|
@@ -21699,9 +22070,9 @@ async function evalCommand(opts, config) {
|
|
|
21699
22070
|
process.exit(failed > 0 ? 1 : 0);
|
|
21700
22071
|
}
|
|
21701
22072
|
function createTempEvalRepo() {
|
|
21702
|
-
const dir =
|
|
21703
|
-
|
|
21704
|
-
|
|
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");
|
|
21705
22076
|
return dir;
|
|
21706
22077
|
}
|
|
21707
22078
|
var BASIC_SUITE, FULL_SUITE, SUITES;
|
|
@@ -21761,7 +22132,7 @@ init_updater();
|
|
|
21761
22132
|
import { parseArgs as nodeParseArgs2 } from "node:util";
|
|
21762
22133
|
import { createRequire as createRequire3 } from "node:module";
|
|
21763
22134
|
import { fileURLToPath as fileURLToPath6 } from "node:url";
|
|
21764
|
-
import { dirname as dirname9, join as
|
|
22135
|
+
import { dirname as dirname9, join as join32 } from "node:path";
|
|
21765
22136
|
|
|
21766
22137
|
// packages/cli/dist/cli.js
|
|
21767
22138
|
import { createInterface } from "node:readline";
|
|
@@ -21868,7 +22239,7 @@ init_output();
|
|
|
21868
22239
|
function getVersion2() {
|
|
21869
22240
|
try {
|
|
21870
22241
|
const require2 = createRequire3(import.meta.url);
|
|
21871
|
-
const pkgPath =
|
|
22242
|
+
const pkgPath = join32(dirname9(fileURLToPath6(import.meta.url)), "..", "package.json");
|
|
21872
22243
|
const pkg = require2(pkgPath);
|
|
21873
22244
|
return pkg.version;
|
|
21874
22245
|
} catch {
|
package/package.json
CHANGED