Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion apps/api/config.ts
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ const DEFAULT_PORT = 3760;
const DEFAULT_GATEWAY_PORT = 31879;
const DEFAULT_GATEWAY_BASE_PATH = '/tracevane';
const DEFAULT_BIND_HOST = '127.0.0.1';
const TRACEVANE_VERSION_FALLBACK = '0.2.7';
const TRACEVANE_VERSION_FALLBACK = '0.2.8';

let cachedTracevaneVersion: string | null = null;

Expand Down
2 changes: 1 addition & 1 deletion apps/api/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "tracevane-api",
"version": "0.2.7",
"version": "0.2.8",
"private": true,
"type": "module",
"scripts": {
Expand Down
2 changes: 1 addition & 1 deletion apps/web/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "tracevane-web",
"version": "0.2.7",
"version": "0.2.8",
"private": true,
"type": "module",
"scripts": {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -114,7 +114,7 @@ function accountTemplate(platform: "feishu" | "octo"): ChannelConnectorAccount {
id,
platform,
displayName: platform === "feishu" ? "新飞书机器人" : "新 Octo 账号",
lifecycle: "draft",
lifecycle: platform === "octo" ? "enabled" : "draft",
externalAccountId: null,
botId: null,
credentials: {},
Expand Down Expand Up @@ -451,7 +451,11 @@ function AccountEditor({
});
} else if (draft.platform === "octo") {
octoSmoke.mutate({ action: "register", binding }, {
onSuccess: (result) => setPreflight({ ok: result.transport.ok === true, message: result.transport.error || `HTTP ${result.transport.statusCode ?? "ok"}` }),
onSuccess: (result) => {
const ok = result.transport.ok === true;
setPreflight({ ok, message: result.transport.error || `HTTP ${result.transport.statusCode ?? "ok"}` });
if (ok) setDraft((current) => ({ ...current, lifecycle: "enabled" }));
},
onError: (error) => setPreflight({ ok: false, message: error.message }),
});
}
Expand Down Expand Up @@ -606,7 +610,7 @@ function AccountEditor({
</section>

<section className="flex flex-wrap items-center gap-2 border-t border-line pt-4">
<Button type="button" variant="outline" size="sm" disabled={!credentialsReady || smokePending || secretsLoading} onClick={runSmoke}>{smokePending ? <Loader2 className="animate-spin" /> : <Zap />}验证平台凭据</Button>
<Button type="button" variant="outline" size="sm" disabled={!credentialsReady || smokePending || secretsLoading} onClick={runSmoke}>{smokePending ? <Loader2 className="animate-spin" /> : <Zap />}{draft.platform === "octo" ? "验证并启用" : "验证平台凭据"}</Button>
{preflight && <Badge variant={preflight.ok ? "ok" : "warn"}>{preflight.ok ? "凭据验证通过" : "验证失败"} · {preflight.message}</Badge>}
{enabled && !preflight?.ok && <span className="text-xs text-subtle">保存成功不代表已能收消息;启用后还需在运行中心验证真实入站。</span>}
</section>
Expand Down
2 changes: 1 addition & 1 deletion apps/web/vite.config.ts
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ const tracevaneBasePath = process.env.TRACEVANE_BASE_PATH || "";
const tracevaneSmokeDisableWatch = process.env.TRACEVANE_SMOKE_DISABLE_WATCH === "1";
const webConfigDir = path.dirname(fileURLToPath(import.meta.url));
const tracevaneRootDir = path.resolve(webConfigDir, "..", "..");
const TRACEVANE_PACKAGE_VERSION_FALLBACK = "0.2.7";
const TRACEVANE_PACKAGE_VERSION_FALLBACK = "0.2.8";
const tracevanePackageVersionOverride =
process.env.TRACEVANE_BUILD_VERSION?.trim() || "";
const tracevanePackageVersion = (() => {
Expand Down
2 changes: 1 addition & 1 deletion index.html
Original file line number Diff line number Diff line change
Expand Up @@ -311,7 +311,7 @@ <h3 data-i18n="install.manualTitle">Or run the installer yourself</h3>
</footer>

<script>
const TRACEVANE_VERSION = "0.2.7";
const TRACEVANE_VERSION = "0.2.8";
const OPENCLAW_MIN_VERSION = "2026.5.28";

const translations = {
Expand Down
2 changes: 1 addition & 1 deletion install-tracevane.sh
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
set -euo pipefail

SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd -P)"
TRACEVANE_DEFAULT_VERSION="${TRACEVANE_DEFAULT_VERSION:-0.2.7}"
TRACEVANE_DEFAULT_VERSION="${TRACEVANE_DEFAULT_VERSION:-0.2.8}"
VERSION_EXPLICIT=0
PACKAGE_URL_EXPLICIT=0
GATEWAY_BIND_EXPLICIT=0
Expand Down
2 changes: 1 addition & 1 deletion openclaw.plugin.json
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
"id": "tracevane",
"name": "Tracevane",
"description": "Tracevane 本地 AI Agent 控制工作台,聚焦 Gateway、Channel Connectors、CLI Agent 和运行态自愈。",
"version": "0.2.7",
"version": "0.2.8",
"homepage": "https://github.com/binbin/tracevane",
"activation": {
"onStartup": true
Expand Down
8 changes: 4 additions & 4 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@binbin/tracevane",
"version": "0.2.7",
"version": "0.2.8",
"description": "Tracevane - Local AI Agent Control Workbench",
"private": true,
"repository": {
Expand Down
10 changes: 10 additions & 0 deletions tests/system/web-channel-connectors.test.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -117,6 +117,16 @@ test("channel account editor owns credentials, default target, exceptions, and a
assert.match(accounts, /未界面化扩展字段/);
});

test("Octo verification enables the account for its persistent WebSocket", () => {
const accounts = read(`${VIEWS_DIR}/V3AccountsView.tsx`);
assert.match(accounts, /lifecycle:\s*platform === "octo" \? "enabled" : "draft"/);
assert.match(
accounts,
/if \(ok\) setDraft\(\(current\) => \(\{ \.\.\.current, lifecycle: "enabled" \}\)\);/,
);
assert.match(accounts, /验证并启用/);
});

test("channel account plan opens only after planning succeeds", () => {
const accounts = read(`${VIEWS_DIR}/V3AccountsView.tsx`);
assert.doesNotMatch(accounts, /setPlanOpen\(true\);\s*planMutation\.mutate/);
Expand Down
Loading