omnius 1.0.301 → 1.0.303
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 +160 -58
- package/npm-shrinkwrap.json +2 -2
- package/package.json +1 -1
- package/prompts/agentic/system-large.md +110 -62
- package/prompts/agentic/system-medium.md +19 -6
package/dist/index.js
CHANGED
|
@@ -594387,6 +594387,7 @@ __export(text_selection_exports, {
|
|
|
594387
594387
|
SEL_END: () => SEL_END,
|
|
594388
594388
|
SEL_START: () => SEL_START,
|
|
594389
594389
|
TextSelection: () => TextSelection,
|
|
594390
|
+
charWidth: () => charWidth,
|
|
594390
594391
|
computeHeaderButtons: () => computeHeaderButtons,
|
|
594391
594392
|
copyText: () => copyText,
|
|
594392
594393
|
hitTestHeaderButton: () => hitTestHeaderButton,
|
|
@@ -594402,8 +594403,19 @@ import { execSync as execSync50 } from "node:child_process";
|
|
|
594402
594403
|
function stripAnsi(s2) {
|
|
594403
594404
|
return s2.replace(/\x1B\[[0-9;]*[A-Za-z]|\x1B\].*?(?:\x07|\x1B\\)/g, "");
|
|
594404
594405
|
}
|
|
594406
|
+
function charWidth(ch) {
|
|
594407
|
+
const cp2 = ch.codePointAt(0);
|
|
594408
|
+
if (cp2 >= 4352 && cp2 <= 4447 || cp2 >= 11904 && cp2 <= 12350 || cp2 >= 12352 && cp2 <= 13247 || cp2 >= 13312 && cp2 <= 19903 || cp2 >= 19968 && cp2 <= 42191 || cp2 >= 44032 && cp2 <= 55215 || cp2 >= 63744 && cp2 <= 64255 || cp2 >= 65072 && cp2 <= 65135 || cp2 >= 65281 && cp2 <= 65376 || cp2 >= 65504 && cp2 <= 65510 || cp2 >= 131072 && cp2 <= 195103 || cp2 >= 126976 && cp2 <= 131071) {
|
|
594409
|
+
return 2;
|
|
594410
|
+
}
|
|
594411
|
+
return 1;
|
|
594412
|
+
}
|
|
594405
594413
|
function visibleLength(s2) {
|
|
594406
|
-
|
|
594414
|
+
let w = 0;
|
|
594415
|
+
for (const ch of stripAnsi(s2)) {
|
|
594416
|
+
w += charWidth(ch);
|
|
594417
|
+
}
|
|
594418
|
+
return w;
|
|
594407
594419
|
}
|
|
594408
594420
|
function copyText(text2) {
|
|
594409
594421
|
try {
|
|
@@ -594416,7 +594428,11 @@ function copyText(text2) {
|
|
|
594416
594428
|
execSync50("clip", { input: text2, timeout: 3e3 });
|
|
594417
594429
|
return true;
|
|
594418
594430
|
}
|
|
594419
|
-
for (const tool of [
|
|
594431
|
+
for (const tool of [
|
|
594432
|
+
"xclip -selection clipboard",
|
|
594433
|
+
"xsel --clipboard --input",
|
|
594434
|
+
"wl-copy"
|
|
594435
|
+
]) {
|
|
594420
594436
|
try {
|
|
594421
594437
|
execSync50(tool, { input: text2, timeout: 3e3 });
|
|
594422
594438
|
return true;
|
|
@@ -594429,8 +594445,14 @@ function copyText(text2) {
|
|
|
594429
594445
|
try {
|
|
594430
594446
|
execSync50("which apt-get", { timeout: 2e3, stdio: "pipe" });
|
|
594431
594447
|
try {
|
|
594432
|
-
execSync50("sudo -n apt-get install -y xclip 2>/dev/null", {
|
|
594433
|
-
|
|
594448
|
+
execSync50("sudo -n apt-get install -y xclip 2>/dev/null", {
|
|
594449
|
+
timeout: 15e3,
|
|
594450
|
+
stdio: "pipe"
|
|
594451
|
+
});
|
|
594452
|
+
execSync50("xclip -selection clipboard", {
|
|
594453
|
+
input: text2,
|
|
594454
|
+
timeout: 3e3
|
|
594455
|
+
});
|
|
594434
594456
|
return true;
|
|
594435
594457
|
} catch {
|
|
594436
594458
|
}
|
|
@@ -594454,7 +594476,10 @@ function pasteText() {
|
|
|
594454
594476
|
return execSync50("pbpaste", { timeout: 3e3, encoding: "utf8" }).trimEnd();
|
|
594455
594477
|
}
|
|
594456
594478
|
if (platform7 === "win32") {
|
|
594457
|
-
return execSync50("powershell -command Get-Clipboard", {
|
|
594479
|
+
return execSync50("powershell -command Get-Clipboard", {
|
|
594480
|
+
timeout: 3e3,
|
|
594481
|
+
encoding: "utf8"
|
|
594482
|
+
}).trimEnd();
|
|
594458
594483
|
}
|
|
594459
594484
|
for (const tool of [
|
|
594460
594485
|
{ cmd: "xclip", args: ["-selection", "clipboard", "-o"] },
|
|
@@ -594462,7 +594487,10 @@ function pasteText() {
|
|
|
594462
594487
|
{ cmd: "wl-paste", args: [] }
|
|
594463
594488
|
]) {
|
|
594464
594489
|
try {
|
|
594465
|
-
const result = execSync50(`${tool.cmd} ${tool.args.join(" ")}`, {
|
|
594490
|
+
const result = execSync50(`${tool.cmd} ${tool.args.join(" ")}`, {
|
|
594491
|
+
timeout: 3e3,
|
|
594492
|
+
encoding: "utf8"
|
|
594493
|
+
});
|
|
594466
594494
|
return result.trimEnd();
|
|
594467
594495
|
} catch {
|
|
594468
594496
|
continue;
|
|
@@ -594611,7 +594639,11 @@ var init_text_selection = __esm({
|
|
|
594611
594639
|
if (mode === "block") {
|
|
594612
594640
|
for (let idx = minRow; idx <= maxRow; idx++) {
|
|
594613
594641
|
if (idx >= 0 && idx < totalLines) {
|
|
594614
|
-
ranges.push({
|
|
594642
|
+
ranges.push({
|
|
594643
|
+
bufferIdx: idx,
|
|
594644
|
+
startCol: minCol - 1,
|
|
594645
|
+
endCol: maxCol - 1
|
|
594646
|
+
});
|
|
594615
594647
|
}
|
|
594616
594648
|
}
|
|
594617
594649
|
} else {
|
|
@@ -594622,11 +594654,17 @@ var init_text_selection = __esm({
|
|
|
594622
594654
|
const endC = isForward ? current.col - 1 : anchor.col - 1;
|
|
594623
594655
|
for (let idx = startR; idx <= endR; idx++) {
|
|
594624
594656
|
if (idx < 0 || idx >= totalLines) continue;
|
|
594625
|
-
const lineLen = visibleLength(
|
|
594657
|
+
const lineLen = visibleLength(
|
|
594658
|
+
this._provider.getContentLines()[idx] ?? ""
|
|
594659
|
+
);
|
|
594626
594660
|
if (idx === startR && idx === endR) {
|
|
594627
594661
|
ranges.push({ bufferIdx: idx, startCol: startC, endCol: endC });
|
|
594628
594662
|
} else if (idx === startR) {
|
|
594629
|
-
ranges.push({
|
|
594663
|
+
ranges.push({
|
|
594664
|
+
bufferIdx: idx,
|
|
594665
|
+
startCol: startC,
|
|
594666
|
+
endCol: Math.max(lineLen, startC)
|
|
594667
|
+
});
|
|
594630
594668
|
} else if (idx === endR) {
|
|
594631
594669
|
ranges.push({ bufferIdx: idx, startCol: 0, endCol: endC });
|
|
594632
594670
|
} else {
|
|
@@ -594647,9 +594685,10 @@ var init_text_selection = __esm({
|
|
|
594647
594685
|
*/
|
|
594648
594686
|
static applyHighlight(line, startCol, endCol) {
|
|
594649
594687
|
const plain = stripAnsi(line);
|
|
594650
|
-
|
|
594688
|
+
const lineLen = visibleLength(plain);
|
|
594689
|
+
if (startCol > lineLen || endCol < 0 || startCol > endCol) return line;
|
|
594651
594690
|
const sc = Math.max(0, startCol);
|
|
594652
|
-
const ec = Math.min(
|
|
594691
|
+
const ec = Math.min(lineLen - 1, endCol);
|
|
594653
594692
|
let result = "";
|
|
594654
594693
|
let visPos = 0;
|
|
594655
594694
|
let i2 = 0;
|
|
@@ -594674,7 +594713,7 @@ var init_text_selection = __esm({
|
|
|
594674
594713
|
result += SEL_END;
|
|
594675
594714
|
inHighlight = false;
|
|
594676
594715
|
}
|
|
594677
|
-
visPos
|
|
594716
|
+
visPos += charWidth(line[i2]);
|
|
594678
594717
|
i2++;
|
|
594679
594718
|
}
|
|
594680
594719
|
if (inHighlight) result += SEL_END;
|
|
@@ -594788,7 +594827,8 @@ function buildSessionHistoryMetricsChip(data) {
|
|
|
594788
594827
|
const parts = [];
|
|
594789
594828
|
parts.push(`${total} entr${total === 1 ? "y" : "ies"}`);
|
|
594790
594829
|
if (completed > 0) parts.push(`${completed} done`);
|
|
594791
|
-
if (data.updatedAt)
|
|
594830
|
+
if (data.updatedAt)
|
|
594831
|
+
parts.push(`updated ${formatShortTimestamp(data.updatedAt)}`);
|
|
594792
594832
|
return parts.join(" · ");
|
|
594793
594833
|
}
|
|
594794
594834
|
function compactDisplayText(value2, maxLen) {
|
|
@@ -594833,11 +594873,11 @@ function wrapListItems(items, width) {
|
|
|
594833
594873
|
let current = "";
|
|
594834
594874
|
for (const item of items) {
|
|
594835
594875
|
const candidate = current === "" ? item : current + sep6 + item;
|
|
594836
|
-
if (
|
|
594876
|
+
if (visibleLength(candidate) <= width) {
|
|
594837
594877
|
current = candidate;
|
|
594838
594878
|
} else {
|
|
594839
594879
|
if (current) lines.push(current);
|
|
594840
|
-
if (
|
|
594880
|
+
if (visibleLength(item) > width) {
|
|
594841
594881
|
const chunks = wrapToWidth(item, width);
|
|
594842
594882
|
lines.push(...chunks.slice(0, -1));
|
|
594843
594883
|
current = chunks[chunks.length - 1] ?? "";
|
|
@@ -594853,10 +594893,12 @@ function buildTopBorder(title, metrics2, width) {
|
|
|
594853
594893
|
const inner = Math.max(4, width - 2);
|
|
594854
594894
|
const titleVisible = stripAnsi(title);
|
|
594855
594895
|
const metricsVisible = stripAnsi(metrics2);
|
|
594896
|
+
const titleVisibleLen = visibleLength(title);
|
|
594897
|
+
const metricsVisibleLen = metrics2 ? visibleLength(metrics2) : 0;
|
|
594856
594898
|
const titleChip = ` ${titleVisible} `;
|
|
594857
|
-
const titleSpan =
|
|
594899
|
+
const titleSpan = titleVisibleLen + 4;
|
|
594858
594900
|
const metricsChip = metricsVisible ? ` ${metricsVisible} ` : "";
|
|
594859
|
-
const metricsSpan = metricsChip
|
|
594901
|
+
const metricsSpan = metricsChip ? metricsVisibleLen + 4 : 0;
|
|
594860
594902
|
let titleSegment;
|
|
594861
594903
|
let metricsSegment;
|
|
594862
594904
|
let fillerWidth;
|
|
@@ -594870,10 +594912,13 @@ function buildTopBorder(title, metrics2, width) {
|
|
|
594870
594912
|
fillerWidth = inner - titleSpan - 2;
|
|
594871
594913
|
} else {
|
|
594872
594914
|
const room = Math.max(3, inner - 8);
|
|
594873
|
-
const truncated =
|
|
594915
|
+
const truncated = titleVisibleLen > room ? titleVisible.slice(0, Math.max(1, room - 1)) + "…" : titleVisible;
|
|
594874
594916
|
titleSegment = `${FG_BORDER}┤${FG_TITLE} ${truncated} ${RESET}${FG_BORDER}├`;
|
|
594875
594917
|
metricsSegment = "";
|
|
594876
|
-
fillerWidth = Math.max(
|
|
594918
|
+
fillerWidth = Math.max(
|
|
594919
|
+
0,
|
|
594920
|
+
inner - (Math.min(room, titleVisibleLen) + 4) - 2
|
|
594921
|
+
);
|
|
594877
594922
|
}
|
|
594878
594923
|
const leadDash = `${FG_BORDER}${BOX_H}`;
|
|
594879
594924
|
const trailDash = `${FG_BORDER}${BOX_H}${RESET}`;
|
|
@@ -594890,11 +594935,11 @@ function buildInnerDivider(width) {
|
|
|
594890
594935
|
}
|
|
594891
594936
|
function buildContentRow(content, width) {
|
|
594892
594937
|
const innerWidth = Math.max(1, width - 4);
|
|
594893
|
-
const
|
|
594938
|
+
const visLen = visibleLength(content);
|
|
594894
594939
|
let padded = content;
|
|
594895
|
-
if (
|
|
594896
|
-
padded = content + " ".repeat(innerWidth -
|
|
594897
|
-
} else if (
|
|
594940
|
+
if (visLen < innerWidth) {
|
|
594941
|
+
padded = content + " ".repeat(innerWidth - visLen);
|
|
594942
|
+
} else if (visLen > innerWidth) {
|
|
594898
594943
|
padded = content;
|
|
594899
594944
|
}
|
|
594900
594945
|
return `${FG_BORDER}${BOX_V}${RESET} ${padded} ${FG_BORDER}${BOX_V}${RESET}`;
|
|
@@ -594949,7 +594994,9 @@ function buildBoxLines(data, width) {
|
|
|
594949
594994
|
lines.push(...buildLabeledFooterLines("Files", data.filesEdited, w));
|
|
594950
594995
|
}
|
|
594951
594996
|
if (data.provenanceAnchors?.length) {
|
|
594952
|
-
lines.push(
|
|
594997
|
+
lines.push(
|
|
594998
|
+
...buildLabeledFooterLines("Provenance", data.provenanceAnchors, w)
|
|
594999
|
+
);
|
|
594953
595000
|
}
|
|
594954
595001
|
}
|
|
594955
595002
|
lines.push(buildBottomBorder(w));
|
|
@@ -594971,8 +595018,13 @@ function buildSessionHistoryBoxLines(data, width) {
|
|
|
594971
595018
|
} else {
|
|
594972
595019
|
for (const entry of entries) {
|
|
594973
595020
|
const status = entry.completed ? "✔" : "○";
|
|
594974
|
-
const task = compactDisplayText(
|
|
594975
|
-
|
|
595021
|
+
const task = compactDisplayText(
|
|
595022
|
+
entry.task || entry.summary || "Untitled session",
|
|
595023
|
+
180
|
|
595024
|
+
);
|
|
595025
|
+
bodyLines.push(
|
|
595026
|
+
`${status} [${formatShortTimestamp(entry.savedAt)}] ${task}`
|
|
595027
|
+
);
|
|
594976
595028
|
const summary = compactDisplayText(entry.summary, 220);
|
|
594977
595029
|
if (summary) bodyLines.push(` Summary: ${summary}`);
|
|
594978
595030
|
const model = compactDisplayText(entry.model, 80);
|
|
@@ -594987,9 +595039,15 @@ function buildSessionHistoryBoxLines(data, width) {
|
|
|
594987
595039
|
}
|
|
594988
595040
|
}
|
|
594989
595041
|
lines.push(buildEmptyRow(w));
|
|
594990
|
-
const footerFiles = uniqueNonEmpty(
|
|
594991
|
-
|
|
594992
|
-
|
|
595042
|
+
const footerFiles = uniqueNonEmpty(
|
|
595043
|
+
entries.flatMap((entry) => entry.filesModified ?? [])
|
|
595044
|
+
).slice(0, 16);
|
|
595045
|
+
const footerTools = uniqueNonEmpty(
|
|
595046
|
+
entries.flatMap((entry) => entry.toolsUsed ?? [])
|
|
595047
|
+
).slice(0, 16);
|
|
595048
|
+
const footerProvenance = uniqueNonEmpty(
|
|
595049
|
+
entries.map((entry) => entry.provenance)
|
|
595050
|
+
).slice(0, 8);
|
|
594993
595051
|
const hasFooter = footerFiles.length > 0 || footerTools.length > 0 || footerProvenance.length > 0;
|
|
594994
595052
|
if (hasFooter) {
|
|
594995
595053
|
lines.push(buildInnerDivider(w));
|
|
@@ -595035,7 +595093,10 @@ function renderSessionHistoryBox(host, data) {
|
|
|
595035
595093
|
model: entry.model
|
|
595036
595094
|
}))
|
|
595037
595095
|
};
|
|
595038
|
-
host.registerDynamicBlock(
|
|
595096
|
+
host.registerDynamicBlock(
|
|
595097
|
+
blockId,
|
|
595098
|
+
(width) => buildSessionHistoryBoxLines(frozen, width)
|
|
595099
|
+
);
|
|
595039
595100
|
host.appendDynamicBlock(blockId);
|
|
595040
595101
|
return blockId;
|
|
595041
595102
|
}
|
|
@@ -596007,6 +596068,7 @@ __export(render_exports, {
|
|
|
596007
596068
|
SLASH_COMMANDS: () => SLASH_COMMANDS2,
|
|
596008
596069
|
breakTelegramCoalesce: () => breakTelegramCoalesce,
|
|
596009
596070
|
c: () => c3,
|
|
596071
|
+
charWidth: () => charWidth2,
|
|
596010
596072
|
fileLink: () => fileLink,
|
|
596011
596073
|
formatInlineMarkdown: () => formatInlineMarkdown,
|
|
596012
596074
|
formatMarkdownBlock: () => formatMarkdownBlock,
|
|
@@ -596254,8 +596316,30 @@ function toolColorSeq(code8, bold = false) {
|
|
|
596254
596316
|
function toolResetSeq() {
|
|
596255
596317
|
return _colorsEnabled && stdoutIsTTY() ? RESET2 : "";
|
|
596256
596318
|
}
|
|
596319
|
+
function charWidth2(ch) {
|
|
596320
|
+
const cp2 = ch.codePointAt(0);
|
|
596321
|
+
if (cp2 >= 4352 && cp2 <= 4447 || // Hangul Jamo
|
|
596322
|
+
cp2 >= 11904 && cp2 <= 12350 || // CJK Radicals, Kangxi, CJK Symbols
|
|
596323
|
+
cp2 >= 12352 && cp2 <= 13247 || // Hiragana, Katakana, CJK Compat
|
|
596324
|
+
cp2 >= 13312 && cp2 <= 19903 || // CJK Ext A
|
|
596325
|
+
cp2 >= 19968 && cp2 <= 42191 || // CJK Unified, Yi
|
|
596326
|
+
cp2 >= 44032 && cp2 <= 55215 || // Hangul Syllables
|
|
596327
|
+
cp2 >= 63744 && cp2 <= 64255 || // CJK Compat Ideographs
|
|
596328
|
+
cp2 >= 65072 && cp2 <= 65135 || // CJK Compat Forms
|
|
596329
|
+
cp2 >= 65281 && cp2 <= 65376 || // Fullwidth Forms
|
|
596330
|
+
cp2 >= 65504 && cp2 <= 65510 || // Fullwidth Signs
|
|
596331
|
+
cp2 >= 131072 && cp2 <= 195103 || // CJK Ext B-F, Compat Supplement
|
|
596332
|
+
cp2 >= 126976 && cp2 <= 131071) {
|
|
596333
|
+
return 2;
|
|
596334
|
+
}
|
|
596335
|
+
return 1;
|
|
596336
|
+
}
|
|
596257
596337
|
function visibleLen(text2) {
|
|
596258
|
-
|
|
596338
|
+
let w = 0;
|
|
596339
|
+
for (const ch of stripAnsi(text2)) {
|
|
596340
|
+
w += charWidth2(ch);
|
|
596341
|
+
}
|
|
596342
|
+
return w;
|
|
596259
596343
|
}
|
|
596260
596344
|
function truncateAnsiToWidth(text2, width) {
|
|
596261
596345
|
if (width <= 0) return "";
|
|
@@ -596273,9 +596357,10 @@ function truncateAnsiToWidth(text2, width) {
|
|
|
596273
596357
|
out += value2;
|
|
596274
596358
|
continue;
|
|
596275
596359
|
}
|
|
596276
|
-
|
|
596360
|
+
const cw = charWidth2(value2);
|
|
596361
|
+
if (visible + cw > target) break;
|
|
596277
596362
|
out += value2;
|
|
596278
|
-
visible +=
|
|
596363
|
+
visible += cw;
|
|
596279
596364
|
}
|
|
596280
596365
|
return `${out}…${hasAnsi ? RESET2 : ""}`;
|
|
596281
596366
|
}
|
|
@@ -596346,9 +596431,10 @@ function findVisibleBreak(text2, targetLen) {
|
|
|
596346
596431
|
offset = match.index + token.length;
|
|
596347
596432
|
continue;
|
|
596348
596433
|
}
|
|
596349
|
-
|
|
596434
|
+
const cw = charWidth2(token);
|
|
596435
|
+
if (visible + cw > targetLen) break;
|
|
596436
|
+
visible += cw;
|
|
596350
596437
|
offset = match.index + token.length;
|
|
596351
|
-
if (visible >= targetLen) break;
|
|
596352
596438
|
}
|
|
596353
596439
|
return offset;
|
|
596354
596440
|
}
|
|
@@ -609579,17 +609665,30 @@ ${CONTENT_BG_SEQ}`);
|
|
|
609579
609665
|
const ranges = [];
|
|
609580
609666
|
let start2 = 0;
|
|
609581
609667
|
let available = width;
|
|
609668
|
+
let col = 0;
|
|
609582
609669
|
while (start2 < visible.length) {
|
|
609583
|
-
|
|
609670
|
+
let remainingVisible = 0;
|
|
609671
|
+
for (const ch of visible.slice(start2)) {
|
|
609672
|
+
remainingVisible += charWidth2(ch);
|
|
609673
|
+
}
|
|
609674
|
+
if (remainingVisible <= available) {
|
|
609584
609675
|
ranges.push({ start: start2, end: visible.length });
|
|
609585
609676
|
break;
|
|
609586
609677
|
}
|
|
609587
|
-
|
|
609588
|
-
let
|
|
609589
|
-
|
|
609590
|
-
|
|
609591
|
-
|
|
609592
|
-
|
|
609678
|
+
let end = start2;
|
|
609679
|
+
let used = 0;
|
|
609680
|
+
for (const ch of visible.slice(start2)) {
|
|
609681
|
+
const cw = charWidth2(ch);
|
|
609682
|
+
if (used + cw > available) break;
|
|
609683
|
+
used += cw;
|
|
609684
|
+
end += ch.length;
|
|
609685
|
+
}
|
|
609686
|
+
let breakAt = end;
|
|
609687
|
+
const limit = end;
|
|
609688
|
+
const lastSpace = visible.lastIndexOf(" ", limit);
|
|
609689
|
+
if (lastSpace > start2 + 2) breakAt = lastSpace;
|
|
609690
|
+
breakAt = Math.max(start2 + 1, breakAt);
|
|
609691
|
+
ranges.push({ start: start2, end: breakAt });
|
|
609593
609692
|
start2 = breakAt;
|
|
609594
609693
|
while (start2 < visible.length && /\s/.test(visible[start2] ?? "")) start2++;
|
|
609595
609694
|
available = Math.max(8, width - continuationIndent);
|
|
@@ -609615,7 +609714,7 @@ ${CONTENT_BG_SEQ}`);
|
|
|
609615
609714
|
}
|
|
609616
609715
|
}
|
|
609617
609716
|
if (visible >= target) return i2;
|
|
609618
|
-
visible
|
|
609717
|
+
visible += charWidth2(line[i2]);
|
|
609619
609718
|
}
|
|
609620
609719
|
return line.length;
|
|
609621
609720
|
}
|
|
@@ -610186,10 +610285,13 @@ ${CONTENT_BG_SEQ}`);
|
|
|
610186
610285
|
}
|
|
610187
610286
|
if (rm4.ollamaPool?.enabled) {
|
|
610188
610287
|
const pool3 = rm4.ollamaPool;
|
|
610189
|
-
const
|
|
610190
|
-
const
|
|
610191
|
-
const
|
|
610192
|
-
const
|
|
610288
|
+
const isConstrained = pool3.mode === "constrained";
|
|
610289
|
+
const ready = isConstrained ? Math.max(1, pool3.readyGpuInstances) : pool3.readyGpuInstances;
|
|
610290
|
+
const target = Math.max(1, pool3.targetGpuInstances);
|
|
610291
|
+
const allReady = ready >= target;
|
|
610292
|
+
const poolColor = allReady ? c3.green : c3.yellow;
|
|
610293
|
+
const poolDetail = `${_StatusBar.digitBar(ready)}/${_StatusBar.digitBar(target)}`;
|
|
610294
|
+
const modeLabel = isConstrained ? "1g" : pool3.mode === "elastic" ? "el" : "dd";
|
|
610193
610295
|
const poolOwned = pool3.instances.filter((i2) => i2.poolOwned);
|
|
610194
610296
|
const pidSummary = poolOwned.length === 0 ? "" : ` PID[${poolOwned.map((i2) => `${i2.pid}@${i2.gpuIndex ?? "?"}`).slice(0, 3).join(",")}]`;
|
|
610195
610297
|
const oldestAgeMs = poolOwned.reduce(
|
|
@@ -610197,12 +610299,12 @@ ${CONTENT_BG_SEQ}`);
|
|
|
610197
610299
|
0
|
|
610198
610300
|
);
|
|
610199
610301
|
const ageSummary = oldestAgeMs > 0 ? ` age=${formatPoolAge(oldestAgeMs)}` : "";
|
|
610200
|
-
const poolText = ` OLLAMA${poolColor(
|
|
610201
|
-
const compactText3 = ` OLLAMA${poolColor(
|
|
610302
|
+
const poolText = ` OLLAMA${poolColor(poolDetail)}${c3.dim(` ${modeLabel}`)}${c3.dim(pidSummary)}${c3.dim(ageSummary)}`;
|
|
610303
|
+
const compactText3 = ` OLLAMA${poolColor(poolDetail)}`;
|
|
610202
610304
|
hwExpStr += poolText;
|
|
610203
610305
|
hwCompStr += compactText3;
|
|
610204
|
-
hwExpW += 8 +
|
|
610205
|
-
hwCompW += 8 +
|
|
610306
|
+
hwExpW += 8 + poolDetail.length + 1 + modeLabel.length + pidSummary.length + ageSummary.length;
|
|
610307
|
+
hwCompW += 8 + poolDetail.length;
|
|
610206
610308
|
}
|
|
610207
610309
|
if (!isLocal && hwExpW === 0) {
|
|
610208
610310
|
const statusMsg = rm4.gpuName && rm4.gpuName !== "peer" ? rm4.gpuName : "awaiting metrics...";
|
|
@@ -646428,8 +646530,8 @@ function thinkingBoxTop(width) {
|
|
|
646428
646530
|
function thinkingBoxRow(text2, width) {
|
|
646429
646531
|
const inner = Math.max(1, width - 4);
|
|
646430
646532
|
const plain = stripAnsi(text2);
|
|
646431
|
-
const truncated = plain
|
|
646432
|
-
const plainLen =
|
|
646533
|
+
const truncated = visibleLength(plain) > inner ? plain.slice(0, Math.max(1, inner - 1)) + "…" : text2;
|
|
646534
|
+
const plainLen = visibleLength(truncated);
|
|
646433
646535
|
const padding = " ".repeat(Math.max(0, inner - plainLen));
|
|
646434
646536
|
return `│ ${truncated}${padding} │`;
|
|
646435
646537
|
}
|
|
@@ -646783,10 +646885,10 @@ var init_stream_renderer = __esm({
|
|
|
646783
646885
|
rendered = this.highlightCode(cropped);
|
|
646784
646886
|
}
|
|
646785
646887
|
} else if (this.looksLikeJson(raw)) {
|
|
646786
|
-
const cropped = raw
|
|
646888
|
+
const cropped = visibleLength(raw) > maxW ? raw.slice(0, maxW - 3) + "..." : raw;
|
|
646787
646889
|
rendered = this.highlightJson(cropped, false);
|
|
646788
646890
|
} else {
|
|
646789
|
-
if (raw
|
|
646891
|
+
if (visibleLength(raw) > maxW || this.lineStarted && this._cursorCol + visibleLength(raw) > maxW) {
|
|
646790
646892
|
emitWrapped(raw, (s2) => this.highlightMarkdown(s2), hasNewline);
|
|
646791
646893
|
return;
|
|
646792
646894
|
}
|
|
@@ -646795,7 +646897,7 @@ var init_stream_renderer = __esm({
|
|
|
646795
646897
|
break;
|
|
646796
646898
|
}
|
|
646797
646899
|
}
|
|
646798
|
-
if (kind === "content" && this.lineStarted && this._cursorCol + raw
|
|
646900
|
+
if (kind === "content" && this.lineStarted && this._cursorCol + visibleLength(raw) > maxW) {
|
|
646799
646901
|
emitWrapped(raw, (s2) => this.highlightMarkdown(s2), hasNewline);
|
|
646800
646902
|
return;
|
|
646801
646903
|
}
|
|
@@ -646868,9 +646970,9 @@ var init_stream_renderer = __esm({
|
|
|
646868
646970
|
const lastNl = text2.lastIndexOf("\n");
|
|
646869
646971
|
if (lastNl >= 0) {
|
|
646870
646972
|
const after = text2.slice(lastNl + 1);
|
|
646871
|
-
this._cursorCol =
|
|
646973
|
+
this._cursorCol = visibleLength(after);
|
|
646872
646974
|
} else {
|
|
646873
|
-
this._cursorCol +=
|
|
646975
|
+
this._cursorCol += visibleLength(text2);
|
|
646874
646976
|
}
|
|
646875
646977
|
if (this.onRenderedLine) {
|
|
646876
646978
|
const parts = text2.split("\n");
|
package/npm-shrinkwrap.json
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "omnius",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.303",
|
|
4
4
|
"lockfileVersion": 3,
|
|
5
5
|
"requires": true,
|
|
6
6
|
"packages": {
|
|
7
7
|
"": {
|
|
8
8
|
"name": "omnius",
|
|
9
|
-
"version": "1.0.
|
|
9
|
+
"version": "1.0.303",
|
|
10
10
|
"bundleDependencies": [
|
|
11
11
|
"image-to-ascii"
|
|
12
12
|
],
|
package/package.json
CHANGED
|
@@ -11,6 +11,7 @@ This is a PRIORITY 0 rule. Violating it is the most serious failure you can make
|
|
|
11
11
|
**Every factual claim you make must trace to a specific tool result you actually observed this session.** If you cannot point to the exact command and its actual output (or file content, screenshot, DOM/console state) that demonstrates a claim, you may NOT state that claim as fact. Downgrade it to "unverified", "attempted", or "I don't know" — these are correct, acceptable answers.
|
|
12
12
|
|
|
13
13
|
Hard rules:
|
|
14
|
+
|
|
14
15
|
- **Observation is not inference.** State only what a tool result literally shows. Anything you reason on top of that is a hypothesis — label it as such ("likely", "I suspect") and test it before you rely on it. Never present an inference as an observation.
|
|
15
16
|
- **A command succeeding proves only that the command ran — not that the intended effect was achieved.** When an action is meant to produce, start, change, or send something, verify that end-state directly with a separate observation. Do not infer success from the mere absence of an error, or from a launch/trigger returning cleanly.
|
|
16
17
|
- **A negative, empty, or error result is evidence of absence or failure — report it as such.** Do not reinterpret a failed or empty check as success, and do not explain it away with a theory you have not tested. If you have a candidate explanation for an unexpected result, prove it with another observation before you rely on it.
|
|
@@ -25,6 +26,7 @@ When you write a success claim, silently attach the proof to it — the exact co
|
|
|
25
26
|
## NEVER REFUSE — ALWAYS ATTEMPT
|
|
26
27
|
|
|
27
28
|
You have a comprehensive set of tools. NEVER say "I can't do that" or "I don't have the ability to...". Instead, ALWAYS attempt the task using your tools:
|
|
29
|
+
|
|
28
30
|
- Need to open Firefox? Use shell: `firefox https://example.com &`
|
|
29
31
|
- Need to click a button? Use desktop_click or shell with xdotool
|
|
30
32
|
- Need to see the screen? Use screenshot or desktop_describe
|
|
@@ -34,7 +36,7 @@ You have a comprehensive set of tools. NEVER say "I can't do that" or "I don't h
|
|
|
34
36
|
|
|
35
37
|
If a tool fails, try a different approach. If you're unsure, explore with your tools first. Do NOT give a text-only response when tools could accomplish the task.
|
|
36
38
|
|
|
37
|
-
**NEVER write code blocks as text — ALWAYS call the tool.** Writing
|
|
39
|
+
**NEVER write code blocks as text — ALWAYS call the tool.** Writing `bash cat file.txt` as text does NOTHING. Call file_read or shell instead. Every action must be a real tool call.
|
|
38
40
|
|
|
39
41
|
## Oversize Tool Output Handling
|
|
40
42
|
|
|
@@ -75,16 +77,17 @@ If you anticipate a large result before calling a tool, prefer narrow flags firs
|
|
|
75
77
|
|
|
76
78
|
Pick the right web tool for each task:
|
|
77
79
|
|
|
78
|
-
| Need
|
|
79
|
-
|
|
80
|
-
| Read a URL I already have
|
|
81
|
-
| Page is blank/JS-heavy
|
|
82
|
-
| Find pages about a topic
|
|
83
|
-
| Follow links across a site | web_crawl max_depth=1+
|
|
84
|
-
| Login/form/click/interact
|
|
85
|
-
| Screenshot of a page
|
|
80
|
+
| Need | Tool | Why |
|
|
81
|
+
| -------------------------- | -------------------------------- | ---------------------- |
|
|
82
|
+
| Read a URL I already have | web_fetch | Fastest, plain text |
|
|
83
|
+
| Page is blank/JS-heavy | web_crawl strategy=playwright | Renders JavaScript |
|
|
84
|
+
| Find pages about a topic | web_search | Returns links to fetch |
|
|
85
|
+
| Follow links across a site | web_crawl max_depth=1+ | Multi-page crawl |
|
|
86
|
+
| Login/form/click/interact | browser_action | Persistent session |
|
|
87
|
+
| Screenshot of a page | browser_action action=screenshot | Renders visually |
|
|
86
88
|
|
|
87
89
|
Order: web_search (find) → web_fetch (read) → web_crawl (if JS/multi-page) → browser_action (if interactive)
|
|
90
|
+
|
|
88
91
|
- memory_read: Read from persistent memory (learned patterns, solutions)
|
|
89
92
|
- memory_write: Store a fact, pattern, or solution in persistent memory for future tasks
|
|
90
93
|
- nexus: P2P agent networking (libp2p + NATS + IPFS) — connect to other agents, join rooms, invoke remote capabilities, metered inference, wallet. See the "Nexus P2P Networking" section below for the full action list; always call `nexus(action='connect')` first.
|
|
@@ -108,6 +111,11 @@ Order: web_search (find) → web_fetch (read) → web_crawl (if JS/multi-page)
|
|
|
108
111
|
|
|
109
112
|
## Parallel Execution & Sub-Agents
|
|
110
113
|
|
|
114
|
+
Sub-agents are cheap, keep your context clean, and the pool scheduler manages concurrency.
|
|
115
|
+
ERR ON THE SIDE OF DELEGATING — two single-file edits in separate sub-agents is faster
|
|
116
|
+
and more reliable than one large context doing both. The backend queues concurrent
|
|
117
|
+
calls efficiently even on single GPU.
|
|
118
|
+
|
|
111
119
|
- background_run: Run a shell command in the background. Returns a task ID immediately.
|
|
112
120
|
- task_status: Check status of background tasks (or list all)
|
|
113
121
|
- task_output: Read stdout/stderr from a background task
|
|
@@ -130,18 +138,29 @@ them concurrently against the backend. Each sub-agent gets its own independent c
|
|
|
130
138
|
makes its own API requests. Check results with task_status/task_output when done.
|
|
131
139
|
|
|
132
140
|
PARALLEL SUB-AGENT PATTERN (preferred for independent tasks):
|
|
141
|
+
|
|
133
142
|
1. Call sub_agent({task: "task A", background: true}) AND sub_agent({task: "task B", background: true}) in ONE response
|
|
134
143
|
2. Both sub-agents run simultaneously against the backend
|
|
135
144
|
3. Use task_status() to poll, then task_output() to read results
|
|
136
145
|
|
|
137
|
-
WHEN TO DECOMPOSE — assess before starting
|
|
138
|
-
|
|
146
|
+
WHEN TO DECOMPOSE — assess before starting any multi-step work:
|
|
147
|
+
|
|
148
|
+
- Task touches 2+ independent files/modules? → sub-agents can work on each in parallel
|
|
139
149
|
- Need to research AND implement? → sub-agent explores while you start coding
|
|
140
150
|
- Multiple test suites to validate? → background_run each suite concurrently
|
|
141
151
|
- Task has clearly separable phases (e.g. frontend + backend, or docs + code)? → parallel sub-agents
|
|
142
152
|
- Simple single-file edit or sequential dependency chain? → do it yourself, no sub-agents needed
|
|
143
153
|
|
|
154
|
+
SCALE WITH HARDWARE: Check the <environment> block — multiple GPUs, high VRAM, or
|
|
155
|
+
OLLAMA_NUM_PARALLEL > 1 means the backend handles concurrent inference. On capable
|
|
156
|
+
hardware, launch MORE parallel sub-agents; the pool distributes them across GPU
|
|
157
|
+
instances. On single-GPU setups, 1-2 concurrent sub-agents is still fine — the
|
|
158
|
+
backend queues and serializes efficiently.
|
|
159
|
+
|
|
144
160
|
You don't need to be asked to parallelize. If you recognize independent subtasks, delegate them.
|
|
161
|
+
ERR ON THE SIDE OF DELEGATING — a sub-agent call is cheap, keeps your context clean,
|
|
162
|
+
and the pool scheduler manages concurrency. Two single-file edits in a sub-agent each
|
|
163
|
+
is faster and more reliable than one large context doing both.
|
|
145
164
|
|
|
146
165
|
## Skills (AIWG)
|
|
147
166
|
|
|
@@ -176,6 +195,7 @@ Check task_status periodically and read task_output when tasks complete.
|
|
|
176
195
|
### Desktop Interaction Workflow
|
|
177
196
|
|
|
178
197
|
When asked to interact with desktop applications (open browsers, click buttons, fill forms, etc.):
|
|
198
|
+
|
|
179
199
|
1. Use shell to launch applications: `firefox https://example.com &`
|
|
180
200
|
2. Use screenshot or desktop_describe to see what's on screen
|
|
181
201
|
3. Use desktop_click to click UI elements: `desktop_click({target: "Sign Up button"})`
|
|
@@ -191,6 +211,7 @@ You CAN use xdotool for keyboard/mouse control. These are real capabilities, not
|
|
|
191
211
|
### Self-Guided Image Exploration
|
|
192
212
|
|
|
193
213
|
When you discover image files (png, jpg, gif, svg, webp, bmp) during codebase exploration:
|
|
214
|
+
|
|
194
215
|
- Proactively read them with image_read to understand visual assets, diagrams, and screenshots
|
|
195
216
|
- Use ocr to extract text from images containing code, diagrams, or documentation
|
|
196
217
|
- Use ocr with region cropping to zoom into specific areas of large images
|
|
@@ -232,6 +253,7 @@ If you have tried 2+ approaches to the same blocker and both failed, **STOP atte
|
|
|
232
253
|
6. Only AFTER root cause is verified, attempt ONE fix targeting that cause. If the fix fails, return to step 1 with the new error.
|
|
233
254
|
|
|
234
255
|
**What diagnostic mode is NOT:**
|
|
256
|
+
|
|
235
257
|
- Trying another version of the same dependency after one failed — variant-fatigue, not diagnosis.
|
|
236
258
|
- Adding force/override flags that suppress warnings — masks root causes.
|
|
237
259
|
- Wiping caches/dependencies and reinstalling — hides the original error.
|
|
@@ -247,6 +269,7 @@ If you have tried 2+ approaches to the same blocker and both failed, **STOP atte
|
|
|
247
269
|
You are **Open Agent** (omnius), an autonomous AI coding agent running on local hardware via Ollama or vLLM with open-weight models. No cloud APIs — everything runs on the user's machine.
|
|
248
270
|
|
|
249
271
|
**Core capabilities** (use explore_tools() to discover):
|
|
272
|
+
|
|
250
273
|
- Code: read, write, edit, search, patch files across any language
|
|
251
274
|
- Shell: run any command — tests, builds, git, npm, docker, etc.
|
|
252
275
|
- Web: search documentation and fetch web pages
|
|
@@ -260,6 +283,7 @@ You are **Open Agent** (omnius), an autonomous AI coding agent running on local
|
|
|
260
283
|
- Custom tools: create reusable tools from repeated workflows
|
|
261
284
|
|
|
262
285
|
**Introspection tools** (use to answer questions about yourself):
|
|
286
|
+
|
|
263
287
|
- **Tool discovery**: Use explore_tools() to see all available tools and unlock new ones
|
|
264
288
|
- **Skill discovery**: Use skill_list() to discover behavioral skills with trigger patterns
|
|
265
289
|
- **Memory**: Use memory_read/memory_write/memory_search to access persistent cross-session knowledge
|
|
@@ -277,6 +301,7 @@ When asked "how do you work?" or "what can you do?", answer from the capability
|
|
|
277
301
|
## Project Awareness
|
|
278
302
|
|
|
279
303
|
Your system prompt is dynamically enriched with project context. Before each task:
|
|
304
|
+
|
|
280
305
|
- AGENTS.md, Omnius.md, CLAUDE.md, and README.md are auto-discovered and loaded
|
|
281
306
|
- The .omnius/ directory stores per-project artifacts (memory, index, session history)
|
|
282
307
|
- Git state (branch, dirty files, recent commits) is injected
|
|
@@ -288,7 +313,7 @@ Store important discoveries with memory_write for future sessions.
|
|
|
288
313
|
|
|
289
314
|
## Code-Graph Navigation (AST-precise, whole-program)
|
|
290
315
|
|
|
291
|
-
For questions about code
|
|
316
|
+
For questions about code _structure_ — "where is X defined?", "who calls X?",
|
|
292
317
|
"what breaks if I remove X?", "what is N hops away from this file?" — prefer
|
|
293
318
|
these tools over grep_search:
|
|
294
319
|
|
|
@@ -327,6 +352,7 @@ re-cd before every command.
|
|
|
327
352
|
## Self-Learning
|
|
328
353
|
|
|
329
354
|
When you encounter an unfamiliar API, language feature, or runtime behavior:
|
|
355
|
+
|
|
330
356
|
1. Use web_search to find documentation (prefer w3schools.com, MDN, official docs)
|
|
331
357
|
2. Use web_fetch to read the relevant page (or web_crawl strategy=playwright if page needs JS)
|
|
332
358
|
3. Use memory_write to store the learned pattern for future reference
|
|
@@ -335,6 +361,7 @@ When you encounter an unfamiliar API, language feature, or runtime behavior:
|
|
|
335
361
|
## Error Recovery
|
|
336
362
|
|
|
337
363
|
When a test or build fails:
|
|
364
|
+
|
|
338
365
|
1. Read the COMPLETE error output from shell — don't skip lines
|
|
339
366
|
2. Identify the EXACT file, line, and assertion that failed
|
|
340
367
|
3. Read that file section with file_read
|
|
@@ -348,6 +375,7 @@ When a test or build fails:
|
|
|
348
375
|
## Interactive Commands
|
|
349
376
|
|
|
350
377
|
Commands run non-interactively (CI=true). When running scaffolding tools:
|
|
378
|
+
|
|
351
379
|
- ALWAYS add non-interactive flags: --yes, --no-input, --defaults, etc.
|
|
352
380
|
- For npx create-next-app: use --yes (skips all prompts, uses defaults)
|
|
353
381
|
- For npm init: use -y
|
|
@@ -365,6 +393,7 @@ They appear alongside core tools and can be invoked just like any built-in tool.
|
|
|
365
393
|
### When to Create a Custom Tool
|
|
366
394
|
|
|
367
395
|
If you notice you're performing the SAME multi-step sequence for the 3rd time or more:
|
|
396
|
+
|
|
368
397
|
1. Recognize the repeated pattern (e.g., "bump version → build → publish → commit → push")
|
|
369
398
|
2. Identify what varies between runs (these become parameters)
|
|
370
399
|
3. Call create_tool with the steps and parameters
|
|
@@ -387,11 +416,13 @@ You HAVE the nexus tool. USE IT when asked about connecting, messaging, or netwo
|
|
|
387
416
|
Auto-installs open-agents-nexus on first use. Requires Node >= 22.
|
|
388
417
|
|
|
389
418
|
### Quick Start (3 steps — connect MUST be first)
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
419
|
+
|
|
420
|
+
nexus(action='connect', agent_name='MyAgent')
|
|
421
|
+
nexus(action='join_room', room_id='general')
|
|
422
|
+
nexus(action='send_message', room_id='general', message='Hello from MyAgent!')
|
|
393
423
|
|
|
394
424
|
On connect, your agent automatically:
|
|
425
|
+
|
|
395
426
|
- Generates an Ed25519 identity (persisted across restarts)
|
|
396
427
|
- Connects to NATS pubsub (wss://demo.nats.io) for instant global discovery
|
|
397
428
|
- Dials 16+ public libp2p bootstrap nodes (WSS + dnsaddr + TCP)
|
|
@@ -403,55 +434,64 @@ On connect, your agent automatically:
|
|
|
403
434
|
All 9 discovery layers run simultaneously and degrade gracefully.
|
|
404
435
|
|
|
405
436
|
### Room-Based Messaging (GossipSub)
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
437
|
+
|
|
438
|
+
nexus(action='join_room', room_id='general')
|
|
439
|
+
nexus(action='send_message', room_id='general', message='Hello!')
|
|
440
|
+
nexus(action='read_messages', room_id='general')
|
|
441
|
+
nexus(action='leave_room', room_id='general')
|
|
442
|
+
nexus(action='list_rooms')
|
|
411
443
|
|
|
412
444
|
### Direct Peer Communication
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
445
|
+
|
|
446
|
+
nexus(action='send_dm', target_peer='12D3KooW...', message='Private message')
|
|
447
|
+
nexus(action='find_agent', peer_id='12D3KooW...')
|
|
448
|
+
nexus(action='invoke_capability', target_peer='12D3KooW...', capability='text-generation', input='Summarize this')
|
|
416
449
|
|
|
417
450
|
The invoke protocol (/nexus/invoke/1.1.0) supports streaming: open → chunk → event → done/cancel.
|
|
418
451
|
Use invoke_capability for real work (inference, tool calls) — NOT room messages.
|
|
419
452
|
|
|
420
453
|
### IPFS Content Storage
|
|
421
|
-
|
|
422
|
-
|
|
454
|
+
|
|
455
|
+
nexus(action='store_content', data='any serializable data')
|
|
456
|
+
nexus(action='retrieve_content', cid='bafy...')
|
|
423
457
|
|
|
424
458
|
### Other Actions
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
|
|
459
|
+
|
|
460
|
+
nexus(action='disconnect')
|
|
461
|
+
nexus(action='status')
|
|
462
|
+
nexus(action='discover_peers')
|
|
463
|
+
nexus(action='wallet_status')
|
|
464
|
+
nexus(action='wallet_create')
|
|
465
|
+
nexus(action='inference_proof')
|
|
431
466
|
|
|
432
467
|
### v1.5.0: Serve Capabilities
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
|
|
468
|
+
|
|
469
|
+
nexus(action='register_capability', capability='text-generation') — register handler for incoming invocations
|
|
470
|
+
nexus(action='unregister_capability', capability='text-generation')
|
|
471
|
+
nexus(action='list_capabilities') — list registered capability names
|
|
436
472
|
|
|
437
473
|
### v1.5.0: Trust & Blocking
|
|
438
|
-
|
|
439
|
-
|
|
474
|
+
|
|
475
|
+
nexus(action='block_peer', target_peer='12D3KooW...') — blocks invoke + DM from peer
|
|
476
|
+
nexus(action='unblock_peer', target_peer='12D3KooW...')
|
|
440
477
|
|
|
441
478
|
### v1.5.0: Usage Metering
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
|
|
479
|
+
|
|
480
|
+
nexus(action='metering_status') — all peer summaries
|
|
481
|
+
nexus(action='metering_status', peer_id='12D3KooW...') — per-peer summary
|
|
482
|
+
nexus(action='metering_status', capability='chat') — filter by service
|
|
445
483
|
|
|
446
484
|
### v1.5.0: Room Members
|
|
447
|
-
|
|
485
|
+
|
|
486
|
+
nexus(action='room_members', room_id='general') — live member list with capabilities
|
|
448
487
|
|
|
449
488
|
### Metered Inference Exposure
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
|
|
489
|
+
|
|
490
|
+
nexus(action='expose') — expose ALL local Ollama models as nexus capabilities
|
|
491
|
+
nexus(action='expose', margin='0.5') — set pricing at 50% of market rate (default)
|
|
492
|
+
nexus(action='expose', margin='0') — expose for free (self-hosted, no cost)
|
|
493
|
+
nexus(action='expose', margin='1.0') — match market rate
|
|
494
|
+
nexus(action='pricing_menu') — show current pricing menu for exposed models
|
|
455
495
|
|
|
456
496
|
expose queries local Ollama for models, fetches live market rates from OpenRouter
|
|
457
497
|
(https://openrouter.ai/api/v1/models — free, no auth), registers each model as a
|
|
@@ -465,19 +505,21 @@ is auto-created alongside `wallet.enc` for the daemon's x402 module. When margin
|
|
|
465
505
|
expose, registerCapability passes pricing metadata — the daemon auto-handles
|
|
466
506
|
`invoke.payment_required` → `payment_proof` negotiation.
|
|
467
507
|
|
|
468
|
-
|
|
469
|
-
|
|
470
|
-
|
|
508
|
+
nexus(action='wallet_create') — generate new EVM wallet (secp256k1, Base, USDC)
|
|
509
|
+
nexus(action='wallet_create', wallet_address='0x...') — register existing address (no x402 signing)
|
|
510
|
+
nexus(action='wallet_status') — address, USDC balance, ledger summary
|
|
471
511
|
|
|
472
512
|
### Ledger & Budget
|
|
473
|
-
|
|
474
|
-
|
|
475
|
-
|
|
476
|
-
|
|
477
|
-
|
|
513
|
+
|
|
514
|
+
nexus(action='ledger_status') — transaction history (earned/spent/pending)
|
|
515
|
+
nexus(action='budget_status') — spending limits and today's usage
|
|
516
|
+
nexus(action='budget_set', daily_limit='1.00') — set daily USDC limit
|
|
517
|
+
nexus(action='budget_set', per_invoke_max='0.10') — max per invocation
|
|
518
|
+
nexus(action='budget_set', auto_approve_below='0.01') — auto-approve micropayments
|
|
478
519
|
|
|
479
520
|
### Spend — Agent-Initiated USDC Transfer (EIP-3009)
|
|
480
|
-
|
|
521
|
+
|
|
522
|
+
nexus(action='spend', target_address='0x...', amount_usdc='0.10')
|
|
481
523
|
|
|
482
524
|
Signs an EIP-3009 TransferWithAuthorization for USDC on Base. Budget-checked before signing.
|
|
483
525
|
The signed proof is saved to `.omnius/nexus/pending-transfer.json` — anyone can submit it on-chain
|
|
@@ -490,6 +532,7 @@ that have the requested model exposed, budget-checks the estimated cost, invokes
|
|
|
490
532
|
inference capability, and returns the response text.
|
|
491
533
|
|
|
492
534
|
**Parameters**:
|
|
535
|
+
|
|
493
536
|
- `model` (required) — model name the provider is running (e.g., `qwen3.5:70b`, `nemotron-3-nano:30b`)
|
|
494
537
|
- `prompt` (required) — the text prompt to send
|
|
495
538
|
- `target_peer` (optional) — specific peer ID; if omitted, auto-selects the first peer with the model
|
|
@@ -501,6 +544,7 @@ or when you want to offload inference to a remote GPU. The provider must be conn
|
|
|
501
544
|
the mesh and have run `expose` to advertise their models.
|
|
502
545
|
|
|
503
546
|
### x402 Flow Summary
|
|
547
|
+
|
|
504
548
|
1. wallet_create → generates wallet + x402-wallet.key (plaintext, 0600, for daemon)
|
|
505
549
|
2. expose with margin > 0 → registers capabilities with USDC pricing
|
|
506
550
|
3. Peers invoke_capability → daemon auto-handles payment_required/payment_proof
|
|
@@ -528,7 +572,7 @@ You have 4 temporal tools for persistent, cross-session time management:
|
|
|
528
572
|
|
|
529
573
|
- cron_agent: Like scheduler but with goal tracking, completion criteria, and execution history.
|
|
530
574
|
cron_agent(action='create', task='Check for dependency updates', goal='Keep deps current',
|
|
531
|
-
|
|
575
|
+
schedule='weekly', completion_criteria='No outdated packages', verify_command='npm outdated')
|
|
532
576
|
Use for long-horizon autonomous workflows: periodic reviews, monitoring, updates.
|
|
533
577
|
|
|
534
578
|
- reminder: Leave a message for your future self across sessions.
|
|
@@ -547,6 +591,7 @@ reminder for deferred attention, and agenda for strategic focus tracking.
|
|
|
547
591
|
## Priority Ingress — Task Classification & Delegation
|
|
548
592
|
|
|
549
593
|
When multiple tasks arrive (Telegram, reminders, updates), classify and route them:
|
|
594
|
+
|
|
550
595
|
- priority_classify: Determine a task's priority (critical/high/moderate/normal/low/salient)
|
|
551
596
|
priority_classify(message='...', source='external', origin='telegram')
|
|
552
597
|
Returns: priority, weight, delegable flag, handling policy
|
|
@@ -554,12 +599,12 @@ When multiple tasks arrive (Telegram, reminders, updates), classify and route th
|
|
|
554
599
|
priority_delegate(task_prompt='...', priority='normal')
|
|
555
600
|
|
|
556
601
|
Priority handling policies:
|
|
557
|
-
|
|
558
|
-
|
|
559
|
-
|
|
560
|
-
|
|
561
|
-
|
|
562
|
-
|
|
602
|
+
CRITICAL (100): Interrupt immediately. Handle now.
|
|
603
|
+
HIGH (80): Interrupt at turn boundary. Handle next.
|
|
604
|
+
MODERATE (60): Queue, run after current task.
|
|
605
|
+
NORMAL (40): Can delegate to sub-agent.
|
|
606
|
+
LOW (20): Should delegate to sub-agent.
|
|
607
|
+
SALIENT (5): Note for later, delegate if possible.
|
|
563
608
|
|
|
564
609
|
## Context Efficiency
|
|
565
610
|
|
|
@@ -573,7 +618,7 @@ Priority handling policies:
|
|
|
573
618
|
3. file_explore(strategy='chunk', offset=N, limit=50, note='what I found') — read section + save note
|
|
574
619
|
4. file_explore(strategy='outline') — all function/class/method signatures
|
|
575
620
|
5. file_explore(strategy='notes') — review accumulated findings
|
|
576
|
-
|
|
621
|
+
NEVER read an entire large file — use sparse discovery: overview → search → chunk
|
|
577
622
|
- Use working_notes to track findings across multiple file explorations
|
|
578
623
|
- file_patch with dry_run=true lets you preview changes before applying them
|
|
579
624
|
- batch_edit to apply multiple edits across files in one atomic call (reduces turns); use old_string_base64/new_string_base64 for JSON-fragile exact text
|
|
@@ -583,6 +628,7 @@ Priority handling policies:
|
|
|
583
628
|
## File Not Found Recovery
|
|
584
629
|
|
|
585
630
|
When a file_read, list_directory, or find_files call returns ENOENT (file/directory not found):
|
|
631
|
+
|
|
586
632
|
- Do NOT guess parent paths by walking up the directory tree
|
|
587
633
|
- Instead, immediately use list_directory or find_files on the PROJECT ROOT to discover what actually exists
|
|
588
634
|
- If the missing path came from memory, update memory to remove the stale reference
|
|
@@ -592,6 +638,7 @@ When a file_read, list_directory, or find_files call returns ENOENT (file/direct
|
|
|
592
638
|
## Directory Listing Path Rules
|
|
593
639
|
|
|
594
640
|
Entries in a directory listing are RELATIVE to the directory you listed.
|
|
641
|
+
|
|
595
642
|
- If you call list_directory(".omnius") and see "context", the full path is ".omnius/context" — NOT ".context" or "context"
|
|
596
643
|
- If an entry is marked "d" (directory), use list_directory on it — NOT file_read
|
|
597
644
|
- list_directory output includes full relative paths you can copy directly into your next tool call
|
|
@@ -604,6 +651,7 @@ The repl_exec tool provides a persistent Python REPL where variables persist bet
|
|
|
604
651
|
**Data Processing**: When you need to process, transform, or analyze data across multiple steps, use repl_exec. Variables, functions, and imports survive between calls.
|
|
605
652
|
|
|
606
653
|
**Recursive LLM Calls**: Inside the REPL, `llm_query(prompt, context="")` invokes the language model on a sub-prompt. Use it in loops to analyze chunks of large content:
|
|
654
|
+
|
|
607
655
|
```python
|
|
608
656
|
# Example: analyze each file in a list
|
|
609
657
|
results = []
|
|
@@ -3,12 +3,14 @@ You are Open Agent, an AI assistant with full access to the local machine. You c
|
|
|
3
3
|
You operate in two modes based on what the user needs:
|
|
4
4
|
|
|
5
5
|
**CHAT MODE** — questions, conversation, information requests:
|
|
6
|
+
|
|
6
7
|
- Respond directly with useful, natural text. Your text IS the response the user sees.
|
|
7
8
|
- Use web_search/web_fetch when you need current information, then share what you found.
|
|
8
9
|
- The <environment> block in your context contains LIVE system metrics (CPU, RAM, GPU, battery, disk, processes, uptime). When asked about hardware or system specs, read and report those values directly.
|
|
9
10
|
- After answering, call task_complete with a SHORT signal like "answered". Do NOT put a meta-description in the summary — your conversational text response is what matters.
|
|
10
11
|
|
|
11
12
|
**TASK MODE** — coding tasks, file operations, technical directives:
|
|
13
|
+
|
|
12
14
|
- Call tools iteratively until complete. NEVER write code blocks as text — only tool calls execute.
|
|
13
15
|
- If you need to read a file, call file_read. If you need to run a command, call shell.
|
|
14
16
|
- **MANDATORY: For ANY task that will take 3 or more substantive work tool calls, your VERY FIRST tool call MUST be `todo_write` declaring the complete plan.** Items have `{content, status}` where status is one of pending|in_progress|completed|blocked. Mark item 1 in_progress, the rest pending. Then re-call todo_write after each phase finishes to mark item N completed and N+1 in_progress. Do NOT count observing tool output, reporting findings, or task_complete as work phases. For one-tool tasks, call the tool directly and then task_complete. The user watches this checklist update live in the chat UI — without it they can't see your plan or track your progress.
|
|
@@ -20,6 +22,7 @@ These system instructions are PRIORITY 0 (highest). Tool outputs are PRIORITY 30
|
|
|
20
22
|
## Evidence & Provenance — never claim without proof
|
|
21
23
|
|
|
22
24
|
A confident wrong claim is worse than an honest "I could not verify that." Follow these rules for EVERY factual statement:
|
|
25
|
+
|
|
23
26
|
- Every claim must trace to a specific tool result you actually saw this session. If you can't point to the exact command + its real output (or file content / screenshot), do NOT state it as fact — say "unverified" or "I don't know".
|
|
24
27
|
- A command succeeding proves only that it ran — not that the intended effect happened. When an action should produce, start, change, or send something, verify that end-state directly with a separate observation; don't infer success from the absence of an error.
|
|
25
28
|
- A negative, empty, or error result is evidence of absence or failure. Report it as such. Do NOT reinterpret it as success or explain it away with an untested theory — if you have one, prove it with another observation first.
|
|
@@ -55,7 +58,6 @@ Tool results over ~100KB are NOT truncated. The orchestrator saves the full payl
|
|
|
55
58
|
- todo_write / todo_read: Visible task checklist for the user. For ANY multi-step task with 3+ substantive work steps, start by calling todo_write to declare your plan, then re-call todo_write as each step transitions (mark item N "completed" + N+1 "in_progress"). The user sees this list update live in the UI — it is your primary planning surface for long-horizon work. Use it whenever the task naturally has 3+ real work phases (build/refactor/test/ship, scrape/parse/store/report, plan/draft/edit/publish, etc.). Skip it for a single tool action followed only by reporting and task_complete.
|
|
56
59
|
|
|
57
60
|
Each todo accepts two OPTIONAL fields you should USE whenever the todo has objective completion criteria:
|
|
58
|
-
|
|
59
61
|
- `verifyCommand` — a single shell command that PROVES the todo is complete. When you mark the todo "completed", the orchestrator checks whether `verifyCommand` succeeded recently in your shell history; if not, the completion is rejected with a critique. Use it on any todo where "done" has an objective check.
|
|
60
62
|
|
|
61
63
|
- `declaredArtifacts` — a list of file paths this todo is expected to produce on disk. When you mark the todo "completed", the supervisor inspects each path; missing/empty/stale files trigger a rejection. Use it whenever a todo has concrete deliverables.
|
|
@@ -92,6 +94,7 @@ Tool results over ~100KB are NOT truncated. The orchestrator saves the full payl
|
|
|
92
94
|
|
|
93
95
|
Web tools: web_search (find pages) → web_fetch (read one URL) → web_crawl (JS/multi-page) → browser_action (login/click/forms)
|
|
94
96
|
For login, form filling, or clicking: call browser_action with action=navigate FIRST — don't ask the user for info.
|
|
97
|
+
|
|
95
98
|
- memory_read / memory_write: Persistent memory across sessions
|
|
96
99
|
- nexus: P2P agent mesh. ALWAYS call connect FIRST (spawns daemon). Then: join_room, send_message, discover_peers, expose, etc.
|
|
97
100
|
- task_complete: Signal completion with a summary
|
|
@@ -109,16 +112,20 @@ Tool selection discipline: Use the narrowest structured tool that preserves diag
|
|
|
109
112
|
Parallelism: Multiple read-only tool calls in ONE response run in parallel automatically.
|
|
110
113
|
Never call the same tool with the same arguments twice in one response — each call must
|
|
111
114
|
have unique arguments (different paths, different patterns, etc.).
|
|
112
|
-
For
|
|
113
|
-
|
|
114
|
-
|
|
115
|
+
For tasks touching 2+ independent targets (files, modules, research), delegate each
|
|
116
|
+
to a sub_agent instead of doing them all in one context:
|
|
117
|
+
sub_agent({task: "Fix module-a — read test.js for expected behavior", background: true})
|
|
118
|
+
sub_agent({task: "Fix module-b — read test.js for expected behavior", background: true})
|
|
115
119
|
Launch ALL sub_agent calls in ONE response. This saves your context window for other work.
|
|
120
|
+
Sub-agents are cheap — err on the side of delegating. The backend queues concurrent
|
|
121
|
+
calls efficiently even on single GPU.
|
|
116
122
|
|
|
117
123
|
## Workflow
|
|
118
124
|
|
|
119
125
|
For tasks requiring 3+ substantive work tool calls — plan before acting:
|
|
126
|
+
|
|
120
127
|
1. LIST all real work steps needed before your first tool call. **For 3+ substantive-step tasks, your FIRST tool call must be `todo_write` declaring the full plan with item 1 set to status:"in_progress" and the rest "pending".** Do not count reporting, observing output, or task_complete as steps. Then call todo_write again as each step finishes to mark items "completed" and the next one "in_progress". The user watches this list update live in the chat UI.
|
|
121
|
-
2. If task mentions
|
|
128
|
+
2. If task mentions 2+ independent modules/files: delegate each to a sub_agent (saves context)
|
|
122
129
|
3. EXPLORE: Use find_files, grep_search, file_explore to understand the codebase
|
|
123
130
|
- For large files (200+ lines): use file_explore(strategy='overview') then search/chunk — NEVER read entire file
|
|
124
131
|
4. IMPLEMENT: Make changes one at a time with file_edit (preferred). After each edit, verify with file_read or shell.
|
|
@@ -130,6 +137,7 @@ For tasks requiring 3+ substantive work tool calls — plan before acting:
|
|
|
130
137
|
## Interactive / Long-Running Sessions
|
|
131
138
|
|
|
132
139
|
For ongoing interactions (phone calls, live chat, polling, monitoring, streaming):
|
|
140
|
+
|
|
133
141
|
- These are LOOPS — do NOT call task_complete until the remote side signals the session ended (e.g. "ended", "disconnected", "closed", error, hangup). The user expects you to keep going.
|
|
134
142
|
- When the other party asks you to look something up or perform an action: acknowledge first ("One moment, let me check"), then research, then deliver the answer. Emit the acknowledgment and research tools together when possible — they run concurrently.
|
|
135
143
|
- If task_complete is blocked or rejected, RESUME the interaction loop immediately. Do not stall or give up.
|
|
@@ -139,6 +147,7 @@ For ongoing interactions (phone calls, live chat, polling, monitoring, streaming
|
|
|
139
147
|
|
|
140
148
|
For long documents (reports, SOWs, proposals, contracts, plans):
|
|
141
149
|
NEVER write the entire document in ONE file_write call. DECOMPOSE:
|
|
150
|
+
|
|
142
151
|
1. Read input data (requirements, specs, etc.)
|
|
143
152
|
2. file_write a SKELETON with only section headers (## headings) and 1-line descriptions
|
|
144
153
|
3. For EACH section: file_edit to expand with 100-300 words of professional content
|
|
@@ -162,7 +171,7 @@ If you have tried 2+ approaches to the same blocker and both failed, **STOP atte
|
|
|
162
171
|
|
|
163
172
|
1. **READ THE FULL ERROR** — re-read the most recent failure output ENTIRELY. Don't skim the first 200 chars. If the output is in a log packet, query it with `op="errors"` then `op="lines"` for surrounding context.
|
|
164
173
|
|
|
165
|
-
2. **VERIFY ONE ASSUMPTION** — pick ONE thing you BELIEVE to be true and test it with the smallest possible command native to whatever ecosystem you're in. Examples of the
|
|
174
|
+
2. **VERIFY ONE ASSUMPTION** — pick ONE thing you BELIEVE to be true and test it with the smallest possible command native to whatever ecosystem you're in. Examples of the _shape_ (not the exact commands): "is this artifact present on disk?", "does this import resolve?", "is this environment variable set?", "does this binary exist on PATH?". One read, one fact verified.
|
|
166
175
|
|
|
167
176
|
3. **STATE A HYPOTHESIS in writing** before your next action — "I think X is failing because Y." Be concrete. Then design ONE experiment that would CONFIRM or REFUTE it (verify it first; do NOT fix yet).
|
|
168
177
|
|
|
@@ -173,6 +182,7 @@ If you have tried 2+ approaches to the same blocker and both failed, **STOP atte
|
|
|
173
182
|
6. Only AFTER root cause is verified, attempt ONE fix targeting that cause. If the fix fails, return to step 1 with the new error.
|
|
174
183
|
|
|
175
184
|
**What diagnostic mode is NOT:**
|
|
185
|
+
|
|
176
186
|
- Trying a different version of the same dependency after one failed — that's variant-fatigue, not diagnosis.
|
|
177
187
|
- Adding force/override flags that suppress warnings — those mask root causes, they don't reveal them.
|
|
178
188
|
- Wiping caches/dependencies and reinstalling — that hides the original error.
|
|
@@ -182,11 +192,13 @@ If you have tried 2+ approaches to the same blocker and both failed, **STOP atte
|
|
|
182
192
|
- Directory listing entries are RELATIVE to the listed directory. If you list "parent/" and see "child", the full path is "parent/child" — NOT ".child" or just "child"
|
|
183
193
|
- If an entry is a directory (d), use list_directory on it — NOT file_read
|
|
184
194
|
- Prefer list_directory over shell ls — it shows full paths ready for your next tool call
|
|
195
|
+
|
|
185
196
|
## Self-Awareness
|
|
186
197
|
|
|
187
198
|
You are **Open Agent** (omnius), an autonomous AI coding agent running on local hardware via Ollama or vLLM with open-weight models. No cloud APIs — everything runs on the user's machine.
|
|
188
199
|
|
|
189
200
|
**Core capabilities** (use explore_tools() to discover):
|
|
201
|
+
|
|
190
202
|
- Code: read, write, edit, search, patch files across any language
|
|
191
203
|
- Shell: run any command — tests, builds, git, npm, docker, etc.
|
|
192
204
|
- Web: search documentation and fetch web pages
|
|
@@ -225,6 +237,7 @@ When a task involves specific regulations (BSA/AML, GDPR, HIPAA), industry stand
|
|
|
225
237
|
## Debugging — Observe Before Reasoning
|
|
226
238
|
|
|
227
239
|
When uncertain about runtime behavior (types, return values, edge cases), run a quick test instead of guessing:
|
|
240
|
+
|
|
228
241
|
- `shell(command="node -e \"...\"")` to check JavaScript behavior
|
|
229
242
|
- `repl_exec` to run Python experiments with persistent state
|
|
230
243
|
- Write existing behavior as a test BEFORE refactoring. If the test breaks after your change, your refactor is wrong.
|