chore: bump version to 3.15.0
This commit is contained in:
@@ -20,7 +20,7 @@
|
||||
},
|
||||
"packages/agent": {
|
||||
"name": "@oh-my-pi/pi-agent-core",
|
||||
"version": "3.14.0",
|
||||
"version": "3.15.0",
|
||||
"dependencies": {
|
||||
"@oh-my-pi/pi-ai": "workspace:*",
|
||||
"@oh-my-pi/pi-tui": "workspace:*",
|
||||
@@ -32,7 +32,7 @@
|
||||
},
|
||||
"packages/ai": {
|
||||
"name": "@oh-my-pi/pi-ai",
|
||||
"version": "3.14.0",
|
||||
"version": "3.15.0",
|
||||
"bin": {
|
||||
"pi-ai": "./src/cli.ts",
|
||||
},
|
||||
@@ -56,7 +56,7 @@
|
||||
},
|
||||
"packages/coding-agent": {
|
||||
"name": "@oh-my-pi/pi-coding-agent",
|
||||
"version": "3.14.0",
|
||||
"version": "3.15.0",
|
||||
"bin": {
|
||||
"omp": "src/cli.ts",
|
||||
},
|
||||
@@ -93,7 +93,7 @@
|
||||
},
|
||||
"packages/mom": {
|
||||
"name": "@oh-my-pi/pi-mom",
|
||||
"version": "3.14.0",
|
||||
"version": "3.15.0",
|
||||
"bin": {
|
||||
"mom": "src/main.ts",
|
||||
},
|
||||
@@ -117,7 +117,7 @@
|
||||
},
|
||||
"packages/tui": {
|
||||
"name": "@oh-my-pi/pi-tui",
|
||||
"version": "3.14.0",
|
||||
"version": "3.15.0",
|
||||
"dependencies": {
|
||||
"@types/mime-types": "^2.1.4",
|
||||
"chalk": "^5.5.0",
|
||||
@@ -132,7 +132,7 @@
|
||||
},
|
||||
"packages/web-ui": {
|
||||
"name": "@oh-my-pi/pi-web-ui",
|
||||
"version": "3.14.0",
|
||||
"version": "3.15.0",
|
||||
"dependencies": {
|
||||
"@lmstudio/sdk": "^1.5.0",
|
||||
"@oh-my-pi/pi-agent-core": "workspace:*",
|
||||
@@ -1079,7 +1079,7 @@
|
||||
|
||||
"string-width-cjs": ["string-width@4.2.3", "", { "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" } }, "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g=="],
|
||||
|
||||
"string_decoder": ["string_decoder@1.1.1", "", { "dependencies": { "safe-buffer": "~5.1.0" } }, "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg=="],
|
||||
"string_decoder": ["string_decoder@1.3.0", "", { "dependencies": { "safe-buffer": "~5.2.0" } }, "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA=="],
|
||||
|
||||
"strip-ansi": ["strip-ansi@7.1.2", "", { "dependencies": { "ansi-regex": "^6.0.1" } }, "sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA=="],
|
||||
|
||||
@@ -1253,16 +1253,12 @@
|
||||
|
||||
"concurrently/chalk": ["chalk@4.1.2", "", { "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA=="],
|
||||
|
||||
"ecdsa-sig-formatter/safe-buffer": ["safe-buffer@5.2.1", "", {}, "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ=="],
|
||||
|
||||
"form-data/mime-types": ["mime-types@2.1.35", "", { "dependencies": { "mime-db": "1.52.0" } }, "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw=="],
|
||||
|
||||
"jszip/readable-stream": ["readable-stream@2.3.8", "", { "dependencies": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", "isarray": "~1.0.0", "process-nextick-args": "~2.0.0", "safe-buffer": "~5.1.1", "string_decoder": "~1.1.1", "util-deprecate": "~1.0.1" } }, "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA=="],
|
||||
|
||||
"jwa/safe-buffer": ["safe-buffer@5.2.1", "", {}, "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ=="],
|
||||
|
||||
"jws/safe-buffer": ["safe-buffer@5.2.1", "", {}, "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ=="],
|
||||
|
||||
"katex/commander": ["commander@8.3.0", "", {}, "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww=="],
|
||||
|
||||
"micromatch/picomatch": ["picomatch@2.3.1", "", {}, "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA=="],
|
||||
@@ -1283,9 +1279,9 @@
|
||||
|
||||
"string-width-cjs/strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="],
|
||||
|
||||
"strip-ansi-cjs/ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="],
|
||||
"string_decoder/safe-buffer": ["safe-buffer@5.2.1", "", {}, "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ=="],
|
||||
|
||||
"tunnel-agent/safe-buffer": ["safe-buffer@5.2.1", "", {}, "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ=="],
|
||||
"strip-ansi-cjs/ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="],
|
||||
|
||||
"wrap-ansi/ansi-styles": ["ansi-styles@6.2.3", "", {}, "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg=="],
|
||||
|
||||
@@ -1335,6 +1331,8 @@
|
||||
|
||||
"form-data/mime-types/mime-db": ["mime-db@1.52.0", "", {}, "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg=="],
|
||||
|
||||
"jszip/readable-stream/string_decoder": ["string_decoder@1.1.1", "", { "dependencies": { "safe-buffer": "~5.1.0" } }, "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg=="],
|
||||
|
||||
"rimraf/glob/jackspeak": ["jackspeak@3.4.3", "", { "dependencies": { "@isaacs/cliui": "^8.0.2" }, "optionalDependencies": { "@pkgjs/parseargs": "^0.11.0" } }, "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw=="],
|
||||
|
||||
"rimraf/glob/minimatch": ["minimatch@9.0.5", "", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow=="],
|
||||
|
||||
@@ -2,6 +2,8 @@
|
||||
|
||||
## [Unreleased]
|
||||
|
||||
## [3.15.0] - 2026-01-05
|
||||
|
||||
## [3.14.0] - 2026-01-04
|
||||
|
||||
## [3.13.1337] - 2026-01-04
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@oh-my-pi/pi-agent-core",
|
||||
"version": "3.14.0",
|
||||
"version": "3.15.0",
|
||||
"description": "General-purpose agent with transport abstraction, state management, and attachment support",
|
||||
"type": "module",
|
||||
"main": "./src/index.ts",
|
||||
|
||||
@@ -303,7 +303,7 @@ describe("agentLoop with AgentMessage", () => {
|
||||
expect(toolStart).toBeDefined();
|
||||
expect(toolEnd).toBeDefined();
|
||||
if (toolEnd?.type === "tool_execution_end") {
|
||||
expect(toolEnd.isError).toBe(false);
|
||||
expect(toolEnd.isError).toBeFalsy();
|
||||
}
|
||||
});
|
||||
|
||||
@@ -393,7 +393,7 @@ describe("agentLoop with AgentMessage", () => {
|
||||
(e): e is Extract<AgentEvent, { type: "tool_execution_end" }> => e.type === "tool_execution_end",
|
||||
);
|
||||
expect(toolEnds.length).toBe(2);
|
||||
expect(toolEnds[0].isError).toBe(false);
|
||||
expect(toolEnds[0].isError).toBeFalsy();
|
||||
expect(toolEnds[1].isError).toBe(true);
|
||||
if (toolEnds[1].result.content[0]?.type === "text") {
|
||||
expect(toolEnds[1].result.content[0].text).toContain("Skipped due to queued user message");
|
||||
|
||||
@@ -1,6 +1,8 @@
|
||||
# Changelog
|
||||
|
||||
## [Unreleased]
|
||||
|
||||
## [3.15.0] - 2026-01-05
|
||||
### Changed
|
||||
|
||||
- Made `isError` field optional in `ToolResultMessage` interface, defaulting to non-error state
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@oh-my-pi/pi-ai",
|
||||
"version": "3.14.0",
|
||||
"version": "3.15.0",
|
||||
"description": "Unified LLM API with automatic model discovery and provider configuration",
|
||||
"type": "module",
|
||||
"main": "./src/index.ts",
|
||||
|
||||
@@ -2,6 +2,8 @@
|
||||
|
||||
## [Unreleased]
|
||||
|
||||
## [3.15.0] - 2026-01-05
|
||||
|
||||
### Added
|
||||
|
||||
- Added spinner type variants (status and activity) with distinct animation frames per symbol preset
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@oh-my-pi/pi-coding-agent",
|
||||
"version": "3.14.0",
|
||||
"version": "3.15.0",
|
||||
"description": "Coding agent CLI with read, bash, edit, write tools and session management",
|
||||
"type": "module",
|
||||
"ompConfig": {
|
||||
|
||||
@@ -2,6 +2,8 @@
|
||||
|
||||
## [Unreleased]
|
||||
|
||||
## [3.15.0] - 2026-01-05
|
||||
|
||||
## [3.14.0] - 2026-01-04
|
||||
|
||||
## [3.13.1337] - 2026-01-04
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@oh-my-pi/pi-mom",
|
||||
"version": "3.14.0",
|
||||
"version": "3.15.0",
|
||||
"description": "Slack bot that delegates messages to the omp coding agent",
|
||||
"type": "module",
|
||||
"bin": {
|
||||
|
||||
@@ -2,6 +2,8 @@
|
||||
|
||||
## [Unreleased]
|
||||
|
||||
## [3.15.0] - 2026-01-05
|
||||
|
||||
### Added
|
||||
|
||||
- Added `inputCursor` symbol for customizing the text input cursor character
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@oh-my-pi/pi-tui",
|
||||
"version": "3.14.0",
|
||||
"version": "3.15.0",
|
||||
"description": "Terminal User Interface library with differential rendering for efficient text-based applications",
|
||||
"type": "module",
|
||||
"main": "src/index.ts",
|
||||
|
||||
@@ -531,8 +531,8 @@ describe("Editor component", () => {
|
||||
});
|
||||
expect(contentLines.length).toBe(2);
|
||||
expect(contentLines[0]).toBe("日本語テス"); // 5 chars = 10 columns
|
||||
// Last line has cursor (▏) which we need to strip
|
||||
expect(contentLines[1]?.replace("▏", "")).toBe("ト"); // 1 char = 2 columns (+ cursor + padding)
|
||||
// Last line has cursor (|) which we need to strip
|
||||
expect(contentLines[1]?.replace("|", "")).toBe("ト"); // 1 char = 2 columns (+ cursor + padding)
|
||||
});
|
||||
|
||||
it("handles mixed ASCII and wide characters in wrapping", () => {
|
||||
@@ -561,7 +561,7 @@ describe("Editor component", () => {
|
||||
|
||||
// The cursor (blinking thin bar) should be visible
|
||||
const contentLine = lines[1]!;
|
||||
expect(contentLine.includes("\x1b[5m▏")).toBeTruthy();
|
||||
expect(contentLine.includes("\x1b[5m|")).toBeTruthy();
|
||||
|
||||
// Line should still be correct width
|
||||
expect(visibleWidth(contentLine)).toBe(width);
|
||||
|
||||
@@ -117,8 +117,8 @@ describe("Markdown component", () => {
|
||||
expect(plainLines.some((line) => line.includes("Alice"))).toBeTruthy();
|
||||
expect(plainLines.some((line) => line.includes("Bob"))).toBeTruthy();
|
||||
// Check for table borders
|
||||
expect(plainLines.some((line) => line.includes("│"))).toBeTruthy();
|
||||
expect(plainLines.some((line) => line.includes("─"))).toBeTruthy();
|
||||
expect(plainLines.some((line) => line.includes("|"))).toBeTruthy();
|
||||
expect(plainLines.some((line) => line.includes("-"))).toBeTruthy();
|
||||
});
|
||||
|
||||
it("should render table with alignment", () => {
|
||||
@@ -207,7 +207,7 @@ describe("Markdown component", () => {
|
||||
const plainLines = lines.map((line) => line.replace(/\x1b\[[0-9;]*m/g, "").trimEnd());
|
||||
|
||||
// Should have multiple data rows due to wrapping
|
||||
const dataRows = plainLines.filter((line) => line.startsWith("│") && !line.includes("─"));
|
||||
const dataRows = plainLines.filter((line) => line.startsWith("|") && !line.includes("-"));
|
||||
expect(dataRows.length > 2).toBeTruthy();
|
||||
|
||||
// All content should be preserved (may be split across lines)
|
||||
@@ -240,15 +240,15 @@ describe("Markdown component", () => {
|
||||
}
|
||||
|
||||
// Borders should stay intact (exactly 2 vertical borders for a 1-col table)
|
||||
const tableLines = plainLines.filter((line) => line.startsWith("│"));
|
||||
const tableLines = plainLines.filter((line) => line.startsWith("|"));
|
||||
for (const line of tableLines) {
|
||||
const borderCount = line.split("│").length - 1;
|
||||
const borderCount = line.split("|").length - 1;
|
||||
expect(borderCount).toBe(2);
|
||||
}
|
||||
|
||||
// Strip box drawing characters + whitespace so we can assert the URL is preserved
|
||||
// even if it was split across multiple wrapped lines.
|
||||
const extracted = plainLines.join("").replace(/[│├┤─\s]/g, "");
|
||||
const extracted = plainLines.join("").replace(/[|++-\s]/g, "");
|
||||
expect(extracted.includes("prefix")).toBeTruthy();
|
||||
expect(extracted.includes(url)).toBeTruthy();
|
||||
});
|
||||
@@ -276,9 +276,9 @@ describe("Markdown component", () => {
|
||||
);
|
||||
}
|
||||
|
||||
const tableLines = plainLines.filter((line) => line.startsWith("│"));
|
||||
const tableLines = plainLines.filter((line) => line.startsWith("|"));
|
||||
for (const line of tableLines) {
|
||||
const borderCount = line.split("│").length - 1;
|
||||
const borderCount = line.split("|").length - 1;
|
||||
expect(borderCount).toBe(2);
|
||||
}
|
||||
});
|
||||
@@ -323,9 +323,9 @@ describe("Markdown component", () => {
|
||||
// Should have proper table structure
|
||||
const headerLine = plainLines.find((line) => line.includes("A") && line.includes("B"));
|
||||
expect(headerLine).toBeTruthy();
|
||||
expect(headerLine?.includes("│")).toBeTruthy();
|
||||
expect(headerLine?.includes("|")).toBeTruthy();
|
||||
|
||||
const separatorLine = plainLines.find((line) => line.includes("├") && line.includes("┼"));
|
||||
const separatorLine = plainLines.find((line) => line.includes("+") && line.includes("+"));
|
||||
expect(separatorLine).toBeTruthy();
|
||||
|
||||
const dataLine = plainLines.find((line) => line.includes("1") && line.includes("2"));
|
||||
@@ -352,7 +352,7 @@ describe("Markdown component", () => {
|
||||
}
|
||||
|
||||
// Table rows should have left padding
|
||||
const tableRow = plainLines.find((line) => line.includes("│"));
|
||||
const tableRow = plainLines.find((line) => line.includes("|"));
|
||||
expect(tableRow?.startsWith(" ")).toBeTruthy();
|
||||
});
|
||||
});
|
||||
@@ -384,7 +384,7 @@ describe("Markdown component", () => {
|
||||
expect(plainLines.some((line) => line.includes(" - Nested item"))).toBeTruthy();
|
||||
// Check table
|
||||
expect(plainLines.some((line) => line.includes("Col1"))).toBeTruthy();
|
||||
expect(plainLines.some((line) => line.includes("│"))).toBeTruthy();
|
||||
expect(plainLines.some((line) => line.includes("|"))).toBeTruthy();
|
||||
});
|
||||
});
|
||||
|
||||
@@ -488,7 +488,7 @@ again, hello world`,
|
||||
const lines = markdown.render(80);
|
||||
const plainLines = lines.map((line) => line.replace(/\x1b\[[0-9;]*m/g, "").trimEnd());
|
||||
|
||||
const dividerIndex = plainLines.findIndex((line) => line.includes("─"));
|
||||
const dividerIndex = plainLines.findIndex((line) => line.includes("-"));
|
||||
expect(dividerIndex !== -1).toBeTruthy();
|
||||
|
||||
const afterDivider = plainLines.slice(dividerIndex + 1);
|
||||
|
||||
@@ -2,6 +2,8 @@
|
||||
|
||||
## [Unreleased]
|
||||
|
||||
## [3.15.0] - 2026-01-05
|
||||
|
||||
### Changed
|
||||
|
||||
- Resize large image attachments before sending (max 1920x1080 if dimension exceeds 2048) and convert >2MB images to JPEG
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@oh-my-pi/pi-web-ui",
|
||||
"version": "3.14.0",
|
||||
"version": "3.15.0",
|
||||
"description": "Reusable web UI components for AI chat interfaces powered by @oh-my-pi/pi-ai",
|
||||
"type": "module",
|
||||
"main": "src/index.ts",
|
||||
|
||||
+22
-1
@@ -88,6 +88,20 @@ async function cmdWatch(): Promise<void> {
|
||||
process.exit(success ? 0 : 1);
|
||||
}
|
||||
|
||||
function parseVersion(v: string): [number, number, number] {
|
||||
const match = v.replace(/^v/, "").match(/^(\d+)\.(\d+)\.(\d+)/);
|
||||
if (!match) throw new Error(`Invalid version: ${v}`);
|
||||
return [parseInt(match[1]), parseInt(match[2]), parseInt(match[3])];
|
||||
}
|
||||
|
||||
function compareVersions(a: string, b: string): number {
|
||||
const [aMajor, aMinor, aPatch] = parseVersion(a);
|
||||
const [bMajor, bMinor, bPatch] = parseVersion(b);
|
||||
if (aMajor !== bMajor) return aMajor - bMajor;
|
||||
if (aMinor !== bMinor) return aMinor - bMinor;
|
||||
return aPatch - bPatch;
|
||||
}
|
||||
|
||||
async function cmdRelease(version: string): Promise<void> {
|
||||
console.log("\n=== Release Script ===\n");
|
||||
|
||||
@@ -107,7 +121,14 @@ async function cmdRelease(version: string): Promise<void> {
|
||||
console.error(status);
|
||||
process.exit(1);
|
||||
}
|
||||
console.log(" Working directory clean\n");
|
||||
console.log(" Working directory clean");
|
||||
|
||||
const latestTag = (await $`git describe --tags --abbrev=0`.text()).trim();
|
||||
if (compareVersions(version, latestTag) <= 0) {
|
||||
console.error(`Error: Version ${version} must be greater than latest tag ${latestTag}`);
|
||||
process.exit(1);
|
||||
}
|
||||
console.log(` Version ${version} > ${latestTag}\n`);
|
||||
|
||||
// 2. Update package versions
|
||||
console.log(`Updating package versions to ${version}...`);
|
||||
|
||||
Reference in New Issue
Block a user