mirror of
https://github.com/openclaw/openclaw.git
synced 2026-08-25 11:55:47 -06:00
Merge remote-tracking branch 'origin/main' into HEAD
This commit is contained in:
@@ -223,6 +223,7 @@ jobs:
|
||||
context_ref="${context_ref#refs/heads/}"
|
||||
context_ref="${context_ref#refs/tags/}"
|
||||
target_version="$(jq -er '.version | select(type == "string")' target/package.json)"
|
||||
extended_stable_line=""
|
||||
release_version_pattern=""
|
||||
expected_version=""
|
||||
identity_kind=""
|
||||
@@ -236,7 +237,7 @@ jobs:
|
||||
exit 1
|
||||
fi
|
||||
elif [[ "$context_ref" =~ ^extended-stable/([0-9]{4}\.([1-9]|1[0-2])\.33)$ ]]; then
|
||||
expected_version="${BASH_REMATCH[1]}"
|
||||
extended_stable_line="${BASH_REMATCH[1]%.33}"
|
||||
identity_kind="extended-stable branch"
|
||||
elif [[ "$context_ref" =~ ^v([0-9]{4}\.([1-9]|1[0-2])\.[1-9][0-9]*(-(alpha|beta)\.[1-9][0-9]*)?)$ ]]; then
|
||||
expected_version="${BASH_REMATCH[1]}"
|
||||
@@ -245,7 +246,14 @@ jobs:
|
||||
echo "target_context_ref must be a canonical OpenClaw release branch or tag." >&2
|
||||
exit 1
|
||||
fi
|
||||
if [[ -n "$expected_version" &&
|
||||
if [[ "$identity_kind" == "extended-stable branch" ]]; then
|
||||
if [[ ! "$target_version" =~ ^([0-9]{4}\.([1-9]|1[0-2]))\.([1-9][0-9]*)$ ]] ||
|
||||
[[ "${BASH_REMATCH[1]}" != "$extended_stable_line" ]] ||
|
||||
(( 10#${BASH_REMATCH[3]} < 33 )); then
|
||||
echo "Target package version ${target_version} does not belong to extended-stable branch ${context_ref}; expected a final ${extended_stable_line}.PATCH version with PATCH >= 33." >&2
|
||||
exit 1
|
||||
fi
|
||||
elif [[ -n "$expected_version" &&
|
||||
"$identity_kind" != "release branch" &&
|
||||
"$target_version" != "$expected_version" ]]; then
|
||||
echo "Target package version ${target_version} does not match ${identity_kind} ${context_ref}; expected ${expected_version}." >&2
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
{
|
||||
"core": 2335,
|
||||
"channel": 3582,
|
||||
"channel": 3584,
|
||||
"plugin": 3978
|
||||
}
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
1dc7e3d764338a0a789cf33b790f3605387c06ef710750a0901fdf2032c1a36c config-baseline.json
|
||||
8b8c352153a5e8e79192b38406a6a193f10a968baf56c75b2db31f4a7add3a8c config-baseline.core.json
|
||||
c89feef2a5109dc979f5f2b6b32fbafdc93174d6eb1b6a7e525ab04beb93891c config-baseline.channel.json
|
||||
a485e23c0c1db18814fbc38e78cac7650ad2d309285bd679ade63d05e153da8a config-baseline.json
|
||||
4896e6e4826ea96182e717ae5e719a82611f42a565608384bc1f1a2ab0d6be6e config-baseline.core.json
|
||||
3300f931abce160c1d6768af1a358683b8f77af479e8b728aeefd38039a61507 config-baseline.channel.json
|
||||
ed7c7e8dfe9d676ebbf60b5ee55f72d1f9e0286ffb37743f40f6c337816b166d config-baseline.plugin.json
|
||||
|
||||
@@ -72,7 +72,7 @@ run `openclaw onboard` to change the model provider or its authentication.
|
||||
Use `openclaw onboard --classic` for detailed model/auth, channel, skill,
|
||||
remote Gateway, or import setup. Adding `--install-daemon` also selects the
|
||||
classic flow and installs the background service in one step. Use `openclaw
|
||||
openclaw` for conversational non-inference setup and repair. `openclaw
|
||||
setup` for conversational non-inference setup and repair. `openclaw
|
||||
onboard --modern` is a compatibility alias that uses the same live-inference
|
||||
gate.
|
||||
|
||||
|
||||
@@ -1,6 +1,5 @@
|
||||
// OpenAI tests cover the native realtime voice bridge against the live API.
|
||||
import { describe, expect, it } from "vitest";
|
||||
import WebSocket from "ws";
|
||||
import { buildOpenAIRealtimeVoiceProvider } from "./realtime-voice-provider.js";
|
||||
|
||||
const OPENAI_API_KEY = process.env.OPENAI_API_KEY?.trim() ?? "";
|
||||
@@ -8,72 +7,6 @@ const LIVE_ENABLED = OPENAI_API_KEY.length > 0 && process.env.OPENCLAW_LIVE_TEST
|
||||
const describeLive = LIVE_ENABLED ? describe : describe.skip;
|
||||
|
||||
describeLive("OpenAI realtime voice lifecycle live", () => {
|
||||
it("emits an incomplete response and then reuses the same session", async () => {
|
||||
const socket = new WebSocket("wss://api.openai.com/v1/realtime?model=gpt-realtime-2.1", {
|
||||
headers: { Authorization: `Bearer ${OPENAI_API_KEY}` },
|
||||
});
|
||||
const outcomes: Array<{ status?: string; reason?: string }> = [];
|
||||
const sendTurn = (text: string, maxOutputTokens: number) => {
|
||||
socket.send(
|
||||
JSON.stringify({
|
||||
type: "conversation.item.create",
|
||||
item: { type: "message", role: "user", content: [{ type: "input_text", text }] },
|
||||
}),
|
||||
);
|
||||
socket.send(
|
||||
JSON.stringify({
|
||||
type: "response.create",
|
||||
response: { output_modalities: ["text"], max_output_tokens: maxOutputTokens },
|
||||
}),
|
||||
);
|
||||
};
|
||||
try {
|
||||
await new Promise<void>((resolve, reject) => {
|
||||
const timeout = setTimeout(
|
||||
() => reject(new Error("Realtime live probe timed out")),
|
||||
45_000,
|
||||
);
|
||||
socket.on("message", (data) => {
|
||||
const payload = Buffer.isBuffer(data)
|
||||
? data
|
||||
: Array.isArray(data)
|
||||
? Buffer.concat(data)
|
||||
: Buffer.from(data);
|
||||
const event = JSON.parse(payload.toString("utf8")) as {
|
||||
type?: string;
|
||||
response?: { status?: string; status_details?: { reason?: string } | null };
|
||||
error?: { message?: string };
|
||||
};
|
||||
if (event.type === "error") {
|
||||
clearTimeout(timeout);
|
||||
reject(new Error(event.error?.message ?? "Realtime API error"));
|
||||
} else if (event.type === "session.created") {
|
||||
sendTurn("Write a detailed paragraph about ocean tides.", 1);
|
||||
} else if (event.type === "response.done") {
|
||||
outcomes.push({
|
||||
status: event.response?.status,
|
||||
reason: event.response?.status_details?.reason,
|
||||
});
|
||||
if (outcomes.length === 1) {
|
||||
sendTurn("Reply with exactly one word: ok", 100);
|
||||
} else {
|
||||
clearTimeout(timeout);
|
||||
resolve();
|
||||
}
|
||||
}
|
||||
});
|
||||
socket.on("error", reject);
|
||||
});
|
||||
} finally {
|
||||
socket.close();
|
||||
}
|
||||
|
||||
expect(outcomes).toEqual([
|
||||
{ status: "incomplete", reason: "max_output_tokens" },
|
||||
{ status: "completed", reason: undefined },
|
||||
]);
|
||||
}, 60_000);
|
||||
|
||||
it("reuses a bridge after a terminal close", async () => {
|
||||
let closeCount = 0;
|
||||
let readyCount = 0;
|
||||
|
||||
@@ -72,7 +72,6 @@ describe.skipIf(process.platform === "win32")("qa scenario command real POSIX li
|
||||
it("settles within a bound after the leader writes its final result with inherited stdio open", async () => {
|
||||
const root = await mkdtemp(path.join(os.tmpdir(), "qa-command-settlement-"));
|
||||
const descendantPidPath = path.join(root, "descendant.pid");
|
||||
let descendantPid: number | undefined;
|
||||
spawnMock.mockImplementation((...args: Parameters<NonNullable<typeof actualSpawn.value>>) => {
|
||||
if (!actualSpawn.value) {
|
||||
throw new Error("real spawn unavailable");
|
||||
@@ -102,7 +101,7 @@ describe.skipIf(process.platform === "win32")("qa scenario command real POSIX li
|
||||
env: process.env,
|
||||
timeoutMs: 5_000,
|
||||
});
|
||||
descendantPid = await waitForPidFile(descendantPidPath);
|
||||
await waitForPidFile(descendantPidPath);
|
||||
const startedAt = Date.now();
|
||||
const deadline = new AbortController();
|
||||
const result = await Promise.race([
|
||||
@@ -113,20 +112,15 @@ describe.skipIf(process.platform === "win32")("qa scenario command real POSIX li
|
||||
]).finally(() => deadline.abort());
|
||||
|
||||
expect(Date.now() - startedAt).toBeLessThan(1_500);
|
||||
// The exact result proves cleanup succeeded. A later numeric PID probe can
|
||||
// race PID reuse and inspect an unrelated process.
|
||||
expect(result).toEqual({
|
||||
exitCode: 7,
|
||||
signal: null,
|
||||
stdout: "Docker scheduling finished\ndelayed descendant output\n",
|
||||
stderr: "",
|
||||
});
|
||||
if (descendantPid === undefined) {
|
||||
throw new Error("scenario command descendant did not expose its pid");
|
||||
}
|
||||
await waitForDead(descendantPid);
|
||||
} finally {
|
||||
if (descendantPid && isProcessAlive(descendantPid)) {
|
||||
process.kill(descendantPid, "SIGKILL");
|
||||
}
|
||||
await rm(root, { force: true, recursive: true });
|
||||
}
|
||||
});
|
||||
|
||||
@@ -77,8 +77,8 @@ function extractStatusSection(text, title) {
|
||||
return stripAnsi(section.join("\n"));
|
||||
}
|
||||
|
||||
function readAuthProfileStoreText(agentDir) {
|
||||
const dbPath = path.join(agentDir, "openclaw-agent.sqlite");
|
||||
function readSharedAuthProfileStoreText(stateDir) {
|
||||
const dbPath = path.join(stateDir, "state", "openclaw.sqlite");
|
||||
if (!fs.existsSync(dbPath)) {
|
||||
return "";
|
||||
}
|
||||
@@ -86,8 +86,8 @@ function readAuthProfileStoreText(agentDir) {
|
||||
try {
|
||||
db = new DatabaseSync(dbPath, { readOnly: true });
|
||||
const row = db
|
||||
.prepare("SELECT store_json FROM auth_profile_store WHERE store_key = ?")
|
||||
.get("primary");
|
||||
.prepare("SELECT store_json FROM auth_profile_stores WHERE store_key = ?")
|
||||
.get("shared");
|
||||
return typeof row?.store_json === "string" ? row.store_json : "";
|
||||
} catch {
|
||||
return "";
|
||||
@@ -100,15 +100,21 @@ function assertOnboardState() {
|
||||
const home = process.argv[3];
|
||||
const stateDir = path.join(home, ".openclaw");
|
||||
const configPath = path.join(stateDir, "openclaw.json");
|
||||
const agentDir = path.join(stateDir, "agents", "main", "agent");
|
||||
const legacyAuthDatabase = path.join(
|
||||
stateDir,
|
||||
"agents",
|
||||
"main",
|
||||
"agent",
|
||||
"openclaw-agent.sqlite",
|
||||
);
|
||||
|
||||
if (!fs.existsSync(configPath)) {
|
||||
throw new Error("onboard did not write openclaw.json");
|
||||
}
|
||||
if (!fs.existsSync(agentDir)) {
|
||||
throw new Error("onboard did not create main agent dir");
|
||||
if (fs.existsSync(legacyAuthDatabase)) {
|
||||
throw new Error("onboard created the retired main-agent auth database");
|
||||
}
|
||||
const authStoreText = readAuthProfileStoreText(agentDir);
|
||||
const authStoreText = readSharedAuthProfileStoreText(stateDir);
|
||||
if (!authStoreText) {
|
||||
throw new Error("onboard did not persist auth profile store");
|
||||
}
|
||||
|
||||
@@ -63,11 +63,14 @@ if [[ "$normalized_context_ref" =~ ^release/([0-9]{4}\.[0-9]+\.[0-9]+)$ ]]; then
|
||||
echo "Telegram candidate version ${candidate_version} does not belong to release ${release_version}." >&2
|
||||
exit 1
|
||||
fi
|
||||
elif [[ "$normalized_context_ref" =~ ^extended-stable/([0-9]{4}\.[0-9]+\.33)$ ]]; then
|
||||
elif [[ "$normalized_context_ref" =~ ^extended-stable/([0-9]{4}\.([1-9]|1[0-2])\.33)$ ]]; then
|
||||
context_version="${BASH_REMATCH[1]}"
|
||||
context_line="${context_version%.33}"
|
||||
candidate_version="$(jq -er '.version' "${candidate_root}/package.json")"
|
||||
if [[ "$candidate_version" != "$context_version" ]]; then
|
||||
echo "Telegram candidate version ${candidate_version} does not match context ${normalized_context_ref}." >&2
|
||||
if [[ ! "$candidate_version" =~ ^([0-9]{4}\.([1-9]|1[0-2]))\.([1-9][0-9]*)$ ]] ||
|
||||
[[ "${BASH_REMATCH[1]}" != "$context_line" ]] ||
|
||||
(( 10#${BASH_REMATCH[3]} < 33 )); then
|
||||
echo "Telegram candidate version ${candidate_version} does not belong to context ${normalized_context_ref}; expected a final ${context_line}.PATCH version with PATCH >= 33." >&2
|
||||
exit 1
|
||||
fi
|
||||
context_release_branch="$normalized_context_ref"
|
||||
|
||||
@@ -3,6 +3,7 @@ import { Command } from "commander";
|
||||
import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
|
||||
import {
|
||||
AgentSelectionRequiredError,
|
||||
resolveConfiguredAgentId,
|
||||
type AgentSelectionContext,
|
||||
} from "../agents/agent-scope-config.js";
|
||||
import { registerSkillsCli } from "./skills-cli.js";
|
||||
@@ -105,6 +106,9 @@ const mocks = vi.hoisted(() => {
|
||||
resolveAgentIdByWorkspacePathMock: vi.fn(
|
||||
(_configForTest: unknown, _workspacePath: string): string | undefined => undefined,
|
||||
),
|
||||
resolveConfiguredAgentIdMock: vi.fn(
|
||||
(_configForTest: unknown, agentId: string): string => agentId,
|
||||
),
|
||||
resolveAgentWorkspaceDirMock: vi.fn(
|
||||
(_configForTest: unknown, _agentId: string) => "/tmp/workspace",
|
||||
),
|
||||
@@ -134,6 +138,7 @@ const {
|
||||
loadConfigMock,
|
||||
resolveDefaultAgentIdMock,
|
||||
resolveAgentIdByWorkspacePathMock,
|
||||
resolveConfiguredAgentIdMock,
|
||||
resolveAgentWorkspaceDirMock,
|
||||
searchSkillsFromClawHubMock,
|
||||
installSkillFromClawHubMock,
|
||||
@@ -272,6 +277,8 @@ vi.mock("../config/config.js", () => ({
|
||||
vi.mock("../agents/agent-scope.js", () => ({
|
||||
resolveAgentIdByWorkspacePath: (config: unknown, workspacePath: string) =>
|
||||
mocks.resolveAgentIdByWorkspacePathMock(config, workspacePath),
|
||||
resolveConfiguredAgentId: (config: unknown, agentId: string) =>
|
||||
mocks.resolveConfiguredAgentIdMock(config, agentId),
|
||||
resolveDefaultAgentId: (config: unknown, context?: AgentSelectionContext) =>
|
||||
mocks.resolveDefaultAgentIdMock(config, context),
|
||||
resolveAgentWorkspaceDir: (config: unknown, agentId: string) =>
|
||||
@@ -347,6 +354,7 @@ describe("skills cli commands", () => {
|
||||
loadConfigMock.mockReset();
|
||||
resolveDefaultAgentIdMock.mockReset();
|
||||
resolveAgentIdByWorkspacePathMock.mockReset();
|
||||
resolveConfiguredAgentIdMock.mockReset();
|
||||
resolveAgentWorkspaceDirMock.mockReset();
|
||||
searchSkillsFromClawHubMock.mockReset();
|
||||
installSkillFromClawHubMock.mockReset();
|
||||
@@ -366,6 +374,7 @@ describe("skills cli commands", () => {
|
||||
loadConfigMock.mockReturnValue({});
|
||||
resolveDefaultAgentIdMock.mockReturnValue("main");
|
||||
resolveAgentIdByWorkspacePathMock.mockReturnValue(undefined);
|
||||
resolveConfiguredAgentIdMock.mockImplementation((_config, agentId: string) => agentId);
|
||||
resolveAgentWorkspaceDirMock.mockReturnValue("/tmp/workspace");
|
||||
searchSkillsFromClawHubMock.mockResolvedValue([]);
|
||||
installSkillFromClawHubMock.mockResolvedValue({
|
||||
@@ -1499,6 +1508,7 @@ describe("skills cli commands", () => {
|
||||
await runCommand(argv);
|
||||
});
|
||||
|
||||
expect(resolveConfiguredAgentIdMock).not.toHaveBeenCalled();
|
||||
expectStatusWorkspaceCall("/tmp/workspace-writer");
|
||||
});
|
||||
|
||||
@@ -1570,9 +1580,59 @@ describe("skills cli commands", () => {
|
||||
});
|
||||
|
||||
expect(resolveAgentIdByWorkspacePathMock).not.toHaveBeenCalled();
|
||||
expect(resolveConfiguredAgentIdMock).toHaveBeenCalledWith({}, "writer");
|
||||
expectStatusWorkspaceCall("/tmp/workspace-writer");
|
||||
});
|
||||
|
||||
it.each([
|
||||
["list", ["skills", "list", "--agent", "nope-agent"]],
|
||||
["check", ["skills", "check", "--agent", "nope-agent"]],
|
||||
["default parent option", ["skills", "--agent", "nope-agent"]],
|
||||
["install", ["skills", "install", "calendar", "--agent", "nope-agent"]],
|
||||
["verify", ["skills", "verify", "calendar", "--card", "--agent", "nope-agent"]],
|
||||
["workshop list", ["skills", "workshop", "list", "--agent", "nope-agent"]],
|
||||
["workshop inspect", ["skills", "workshop", "inspect", "proposal-id", "--agent", "nope-agent"]],
|
||||
[
|
||||
"workshop proposal",
|
||||
[
|
||||
"skills",
|
||||
"workshop",
|
||||
"propose-create",
|
||||
"--name",
|
||||
"calendar-helper",
|
||||
"--description",
|
||||
"Calendar helper",
|
||||
"--proposal",
|
||||
"/missing/proposal.md",
|
||||
"--agent",
|
||||
"nope-agent",
|
||||
],
|
||||
],
|
||||
])("rejects an unknown agent before skills %s work", async (_label, argv) => {
|
||||
resolveConfiguredAgentIdMock.mockImplementation((_config, agentId: string) =>
|
||||
resolveConfiguredAgentId({ agents: { list: [{ id: "main" }, { id: "writer" }] } }, agentId),
|
||||
);
|
||||
|
||||
await expect(runCommand(argv)).rejects.toThrow("__exit__:1");
|
||||
|
||||
expect(runtimeErrors).toStrictEqual([
|
||||
'Unknown agent id "nope-agent". Run openclaw agents list to see configured agents.',
|
||||
]);
|
||||
expect(resolveAgentWorkspaceDirMock).not.toHaveBeenCalled();
|
||||
});
|
||||
|
||||
it.each([
|
||||
["empty", ["skills", "check", "--agent", ""]],
|
||||
["whitespace-only", ["skills", "check", "--agent", " "]],
|
||||
["empty with --global", ["skills", "install", "calendar", "--global", "--agent", ""]],
|
||||
])("rejects a blank explicit skills agent (%s)", async (_label, argv) => {
|
||||
await expect(runCommand(argv)).rejects.toThrow("__exit__:1");
|
||||
|
||||
expect(runtimeErrors).toStrictEqual(["--agent must not be blank"]);
|
||||
expect(resolveConfiguredAgentIdMock).not.toHaveBeenCalled();
|
||||
expect(resolveAgentWorkspaceDirMock).not.toHaveBeenCalled();
|
||||
});
|
||||
|
||||
it("falls back to the default agent outside configured workspaces", async () => {
|
||||
routeWorkspaceByAgent();
|
||||
resolveDefaultAgentIdMock.mockReturnValue("main");
|
||||
@@ -1587,6 +1647,7 @@ describe("skills cli commands", () => {
|
||||
{},
|
||||
expect.objectContaining({ hint: "Pass --agent <id>." }),
|
||||
);
|
||||
expect(resolveConfiguredAgentIdMock).not.toHaveBeenCalled();
|
||||
expectStatusWorkspaceCall("/tmp/workspace-main");
|
||||
});
|
||||
|
||||
|
||||
+16
-7
@@ -9,6 +9,7 @@ import { sanitizeForLog } from "../../packages/terminal-core/src/ansi.js";
|
||||
import { formatDocsLink } from "../../packages/terminal-core/src/links.js";
|
||||
import { theme } from "../../packages/terminal-core/src/theme.js";
|
||||
import {
|
||||
resolveConfiguredAgentId,
|
||||
resolveAgentIdByWorkspacePath,
|
||||
resolveAgentWorkspaceDir,
|
||||
resolveDefaultAgentId,
|
||||
@@ -142,6 +143,14 @@ const GATEWAY_SKILLS_OFFLINE_LOCK_TIMEOUT_MS = 250;
|
||||
// Apply can await evaluator, proposal-change, and skill-change hook phases.
|
||||
const GATEWAY_SKILLS_APPLY_TIMEOUT_MS = 1_850_000;
|
||||
|
||||
function normalizeExplicitAgentId(agentId?: string): string | undefined {
|
||||
const normalizedAgentId = agentId?.trim();
|
||||
if (agentId !== undefined && !normalizedAgentId) {
|
||||
throw new Error("--agent must not be blank");
|
||||
}
|
||||
return normalizedAgentId;
|
||||
}
|
||||
|
||||
function resolveSkillsWorkspace(options?: ResolveSkillsWorkspaceOptions): {
|
||||
config: ReturnType<typeof getRuntimeConfig>;
|
||||
workspaceDir: string;
|
||||
@@ -151,14 +160,14 @@ function resolveSkillsWorkspace(options?: ResolveSkillsWorkspaceOptions): {
|
||||
const config = getRuntimeConfig(
|
||||
options?.skipPluginValidation ? { skipPluginValidation: true } : undefined,
|
||||
);
|
||||
const explicitAgentId = normalizeOptionalString(options?.agentId);
|
||||
const explicitAgentId = normalizeExplicitAgentId(options?.agentId);
|
||||
const inferredAgentId = explicitAgentId
|
||||
? undefined
|
||||
: resolveAgentIdByWorkspacePath(config, options?.cwd ?? process.cwd());
|
||||
const agentId =
|
||||
explicitAgentId ??
|
||||
inferredAgentId ??
|
||||
resolveDefaultAgentId(config, { surface: "the skills command", hint: "Pass --agent <id>." });
|
||||
const agentId = explicitAgentId
|
||||
? resolveConfiguredAgentId(config, explicitAgentId)
|
||||
: (inferredAgentId ??
|
||||
resolveDefaultAgentId(config, { surface: "the skills command", hint: "Pass --agent <id>." }));
|
||||
return {
|
||||
config,
|
||||
agentId,
|
||||
@@ -231,8 +240,8 @@ function resolveClawHubTargetWorkspace(
|
||||
opts: { agent?: string; global?: boolean },
|
||||
reportError: (message: string) => void = defaultRuntime.error,
|
||||
): Pick<ResolvedSkillsWorkspace, "config" | "workspaceDir"> | undefined {
|
||||
const agentId = resolveAgentOption(command, opts);
|
||||
if (opts.global && normalizeOptionalString(agentId)) {
|
||||
const agentId = normalizeExplicitAgentId(resolveAgentOption(command, opts));
|
||||
if (opts.global && agentId) {
|
||||
reportError("Use either --global or --agent, not both.");
|
||||
defaultRuntime.exit(1);
|
||||
return undefined;
|
||||
|
||||
@@ -58,6 +58,7 @@ vi.mock("../config/config.js", () => ({
|
||||
}));
|
||||
|
||||
vi.mock("../agents/agent-scope.js", () => ({
|
||||
resolveConfiguredAgentId: (_config: unknown, agentId: string) => agentId,
|
||||
resolveAgentIdByWorkspacePath: (config: unknown, workspacePath: string) =>
|
||||
mocks.resolveAgentIdByWorkspacePathMock(config, workspacePath),
|
||||
resolveDefaultAgentId: (config: unknown) => mocks.resolveDefaultAgentIdMock(config),
|
||||
|
||||
@@ -51,6 +51,7 @@ vi.mock("../config/config.js", () => ({
|
||||
resetConfigRuntimeState: () => undefined,
|
||||
}));
|
||||
vi.mock("../agents/agent-scope.js", () => ({
|
||||
resolveConfiguredAgentId: (_config: unknown, agentId: string) => agentId,
|
||||
resolveAgentIdByWorkspacePath: () => undefined,
|
||||
resolveDefaultAgentId: () => "main",
|
||||
resolveAgentWorkspaceDir: () => mocks.workspaceDir,
|
||||
|
||||
@@ -83,6 +83,7 @@ vi.mock("../config/config.js", () => ({
|
||||
}));
|
||||
|
||||
vi.mock("../agents/agent-scope.js", () => ({
|
||||
resolveConfiguredAgentId: (_config: unknown, agentId: string) => agentId,
|
||||
resolveAgentIdByWorkspacePath: () => undefined,
|
||||
resolveDefaultAgentId: () => "main",
|
||||
resolveAgentWorkspaceDir: (_config: unknown, agentId: string) => {
|
||||
|
||||
@@ -57,6 +57,33 @@ describe("runtime web channel plugin", () => {
|
||||
expect(resolvePluginRuntimeRecordByEntryBaseNames).toHaveBeenCalledOnce();
|
||||
});
|
||||
|
||||
it("shares one plugin record across light and heavy runtime activation", async () => {
|
||||
const resolvePluginRuntimeRecordByEntryBaseNames = vi.fn(() => ({
|
||||
origin: "bundled",
|
||||
source: "test",
|
||||
}));
|
||||
vi.doMock("./runtime-plugin-boundary.js", () => ({
|
||||
loadPluginBoundaryModule: (modulePath: string) =>
|
||||
modulePath.includes("light-runtime-api")
|
||||
? { resolveDefaultWebAuthDir: () => "/tmp/openclaw-auth" }
|
||||
: { startWebLoginWithQr: async () => "started" },
|
||||
resolvePluginRuntimeModulePath: (_record: unknown, entryBaseName: string) =>
|
||||
`/tmp/${entryBaseName}.js`,
|
||||
resolvePluginRuntimeRecordByEntryBaseNames,
|
||||
}));
|
||||
|
||||
const runtime = await import("./runtime-web-channel-plugin.js");
|
||||
|
||||
expect(runtime.resolveWebChannelAuthDir()).toBe("/tmp/openclaw-auth");
|
||||
await expect(runtime.startWebLoginWithQr()).resolves.toBe("started");
|
||||
expect(resolvePluginRuntimeRecordByEntryBaseNames).toHaveBeenCalledOnce();
|
||||
|
||||
const { clearPluginMetadataLifecycleCaches } = await import("../plugin-metadata-lifecycle.js");
|
||||
clearPluginMetadataLifecycleCaches();
|
||||
expect(runtime.resolveWebChannelAuthDir()).toBe("/tmp/openclaw-auth");
|
||||
expect(resolvePluginRuntimeRecordByEntryBaseNames).toHaveBeenCalledTimes(2);
|
||||
});
|
||||
|
||||
it.each(["light", "heavy"] as const)(
|
||||
"reloads replaced %s runtime artifacts and dependencies after plugin lifecycle clears",
|
||||
async (kind) => {
|
||||
|
||||
@@ -67,19 +67,30 @@ const webChannelRuntimeModuleCache = new Map<
|
||||
|
||||
const moduleLoaders: PluginModuleLoaderCache = createPluginModuleLoaderCache();
|
||||
const moduleRoots = new Map<string, string>();
|
||||
// Light and heavy modules belong to one metadata generation; resolving their
|
||||
// shared record separately repeats full manifest discovery.
|
||||
let webChannelPluginRecord: WebChannelPluginRecord | undefined;
|
||||
|
||||
registerPluginMetadataProcessMemoLifecycleClear(() => {
|
||||
webChannelPluginRecord = undefined;
|
||||
webChannelRuntimeModuleCache.clear();
|
||||
clearPluginModuleLoaderLifecycleCache({ moduleLoaders, moduleRoots });
|
||||
});
|
||||
|
||||
/** Resolves the active web-channel plugin record that provides runtime APIs. */
|
||||
function resolveWebChannelPluginRecord(): WebChannelPluginRecord {
|
||||
return resolvePluginRuntimeRecordByEntryBaseNames(["light-runtime-api", "runtime-api"], () => {
|
||||
throw new Error(
|
||||
"web channel plugin runtime is unavailable: missing plugin that provides light-runtime-api and runtime-api",
|
||||
);
|
||||
}) as WebChannelPluginRecord;
|
||||
if (webChannelPluginRecord) {
|
||||
return webChannelPluginRecord;
|
||||
}
|
||||
webChannelPluginRecord = resolvePluginRuntimeRecordByEntryBaseNames(
|
||||
["light-runtime-api", "runtime-api"],
|
||||
() => {
|
||||
throw new Error(
|
||||
"web channel plugin runtime is unavailable: missing plugin that provides light-runtime-api and runtime-api",
|
||||
);
|
||||
},
|
||||
) as WebChannelPluginRecord;
|
||||
return webChannelPluginRecord;
|
||||
}
|
||||
|
||||
function resolveWebChannelRuntimeModulePath(
|
||||
|
||||
@@ -5,7 +5,10 @@ import path from "node:path";
|
||||
import { describe, expect, it, vi } from "vitest";
|
||||
import { createWizardPrompter as buildWizardPrompter } from "../../test/helpers/wizard-prompter.js";
|
||||
import type { RuntimeEnv } from "../runtime.js";
|
||||
import { withSecureTestNodeExecPath } from "../secrets/test-node-command.test-support.js";
|
||||
import {
|
||||
withSecureTestNodeCommand,
|
||||
withSecureTestNodeExecPath,
|
||||
} from "../secrets/test-node-command.test-support.js";
|
||||
import { withEnvAsync } from "../test-utils/env.js";
|
||||
import type { WizardPrompter, WizardSelectParams } from "./prompts.js";
|
||||
|
||||
@@ -352,31 +355,30 @@ describe("configureGatewayForSetup", () => {
|
||||
{},
|
||||
{ gatewayAuth: "password", gatewayPassword: password },
|
||||
);
|
||||
const nextConfig = {
|
||||
secrets: {
|
||||
providers: {
|
||||
gatewaypasswords: {
|
||||
source: "exec" as const,
|
||||
command: process.execPath,
|
||||
args: [
|
||||
"-e",
|
||||
"let input='';process.stdin.setEncoding('utf8');process.stdin.on('data',d=>input+=d);process.stdin.on('end',()=>{const req=JSON.parse(input||'{}');const values={};for(const id of req.ids||[]){values[id]='gateway-password-from-exec';}process.stdout.write(JSON.stringify({protocolVersion:1,values}));});",
|
||||
],
|
||||
},
|
||||
},
|
||||
},
|
||||
};
|
||||
const prompter = createPrompter({
|
||||
selectQueue: ["provider", "gatewaypasswords"],
|
||||
textQueue: ["gateway/auth/password"],
|
||||
});
|
||||
|
||||
const result = await withEnvAsync({ OPENCLAW_GATEWAY_PASSWORD: undefined }, async () =>
|
||||
withSecureTestNodeExecPath(async () =>
|
||||
const result = await withSecureTestNodeCommand(async (command) =>
|
||||
withEnvAsync({ OPENCLAW_GATEWAY_PASSWORD: undefined }, async () =>
|
||||
configureGatewayForSetup({
|
||||
flow: "quickstart",
|
||||
baseConfig: {},
|
||||
nextConfig,
|
||||
nextConfig: {
|
||||
secrets: {
|
||||
providers: {
|
||||
gatewaypasswords: {
|
||||
source: "exec",
|
||||
command,
|
||||
args: [
|
||||
"-e",
|
||||
"let input='';process.stdin.setEncoding('utf8');process.stdin.on('data',d=>input+=d);process.stdin.on('end',()=>{const req=JSON.parse(input||'{}');const values={};for(const id of req.ids||[]){values[id]='gateway-password-from-exec';}process.stdout.write(JSON.stringify({protocolVersion:1,values}));});",
|
||||
],
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
localPort: 18789,
|
||||
quickstartGateway,
|
||||
secretInputMode: "ref",
|
||||
|
||||
@@ -37,12 +37,13 @@ function writeOnboardConfig(home: string): void {
|
||||
);
|
||||
}
|
||||
|
||||
function writeAuthProfileStoreSqlite(agentDir: string, store: unknown): void {
|
||||
fs.mkdirSync(agentDir, { recursive: true });
|
||||
const db = new DatabaseSync(path.join(agentDir, "openclaw-agent.sqlite"));
|
||||
function writeSharedAuthProfileStoreSqlite(home: string, store: unknown): void {
|
||||
const stateDir = path.join(home, ".openclaw", "state");
|
||||
fs.mkdirSync(stateDir, { recursive: true });
|
||||
const db = new DatabaseSync(path.join(stateDir, "openclaw.sqlite"));
|
||||
try {
|
||||
db.exec(`
|
||||
CREATE TABLE IF NOT EXISTS auth_profile_store (
|
||||
CREATE TABLE IF NOT EXISTS auth_profile_stores (
|
||||
store_key TEXT NOT NULL PRIMARY KEY,
|
||||
store_json TEXT NOT NULL,
|
||||
updated_at INTEGER NOT NULL
|
||||
@@ -50,10 +51,10 @@ function writeAuthProfileStoreSqlite(agentDir: string, store: unknown): void {
|
||||
`);
|
||||
db.prepare(
|
||||
`
|
||||
INSERT INTO auth_profile_store (store_key, store_json, updated_at)
|
||||
INSERT INTO auth_profile_stores (store_key, store_json, updated_at)
|
||||
VALUES (?, ?, ?)
|
||||
`,
|
||||
).run("primary", JSON.stringify(store), Date.now());
|
||||
).run("shared", JSON.stringify(store), Date.now());
|
||||
} finally {
|
||||
db.close();
|
||||
}
|
||||
@@ -217,13 +218,13 @@ describe("npm onboard channel agent assertions", () => {
|
||||
}
|
||||
});
|
||||
|
||||
it("validates OpenAI env refs from the SQLite auth profile store", () => {
|
||||
it("validates OpenAI env refs from the shared SQLite auth profile store", () => {
|
||||
const tempDir = fs.mkdtempSync(path.join(os.tmpdir(), "openclaw-onboard-assertions-"));
|
||||
const agentDir = path.join(tempDir, ".openclaw", "agents", "main", "agent");
|
||||
|
||||
try {
|
||||
writeOnboardConfig(tempDir);
|
||||
writeAuthProfileStoreSqlite(agentDir, {
|
||||
writeSharedAuthProfileStoreSqlite(tempDir, {
|
||||
version: 1,
|
||||
profiles: {
|
||||
"openai:api-key": {
|
||||
@@ -238,6 +239,7 @@ describe("npm onboard channel agent assertions", () => {
|
||||
|
||||
expect(result.status).toBe(0);
|
||||
expect(result.stderr).toBe("");
|
||||
expect(fs.existsSync(agentDir)).toBe(false);
|
||||
expect(fs.existsSync(path.join(agentDir, "auth-profiles.json"))).toBe(false);
|
||||
} finally {
|
||||
fs.rmSync(tempDir, { force: true, recursive: true });
|
||||
@@ -257,11 +259,10 @@ describe("npm onboard channel agent assertions", () => {
|
||||
|
||||
for (const store of cases) {
|
||||
const tempDir = fs.mkdtempSync(path.join(os.tmpdir(), "openclaw-onboard-assertions-"));
|
||||
const agentDir = path.join(tempDir, ".openclaw", "agents", "main", "agent");
|
||||
|
||||
try {
|
||||
writeOnboardConfig(tempDir);
|
||||
writeAuthProfileStoreSqlite(agentDir, store);
|
||||
writeSharedAuthProfileStoreSqlite(tempDir, store);
|
||||
|
||||
const result = runOnboardAssert(tempDir);
|
||||
|
||||
@@ -275,11 +276,9 @@ describe("npm onboard channel agent assertions", () => {
|
||||
|
||||
it("rejects inline OpenAI keys in the SQLite auth profile store", () => {
|
||||
const tempDir = fs.mkdtempSync(path.join(os.tmpdir(), "openclaw-onboard-assertions-"));
|
||||
const agentDir = path.join(tempDir, ".openclaw", "agents", "main", "agent");
|
||||
|
||||
try {
|
||||
writeOnboardConfig(tempDir);
|
||||
writeAuthProfileStoreSqlite(agentDir, {
|
||||
writeSharedAuthProfileStoreSqlite(tempDir, {
|
||||
version: 1,
|
||||
profiles: {
|
||||
"openai:api-key": {
|
||||
@@ -299,6 +298,34 @@ describe("npm onboard channel agent assertions", () => {
|
||||
}
|
||||
});
|
||||
|
||||
it("rejects a fresh install that recreates the retired main-agent auth database", () => {
|
||||
const tempDir = fs.mkdtempSync(path.join(os.tmpdir(), "openclaw-onboard-assertions-"));
|
||||
const legacyAgentDir = path.join(tempDir, ".openclaw", "agents", "main", "agent");
|
||||
|
||||
try {
|
||||
writeOnboardConfig(tempDir);
|
||||
writeSharedAuthProfileStoreSqlite(tempDir, {
|
||||
version: 1,
|
||||
profiles: {
|
||||
"openai:api-key": {
|
||||
type: "api_key",
|
||||
provider: "openai",
|
||||
keyRef: { source: "env", provider: "default", id: "OPENAI_API_KEY" },
|
||||
},
|
||||
},
|
||||
});
|
||||
fs.mkdirSync(legacyAgentDir, { recursive: true });
|
||||
new DatabaseSync(path.join(legacyAgentDir, "openclaw-agent.sqlite")).close();
|
||||
|
||||
const result = runOnboardAssert(tempDir);
|
||||
|
||||
expect(result.status).not.toBe(0);
|
||||
expect(result.stderr).toContain("onboard created the retired main-agent auth database");
|
||||
} finally {
|
||||
fs.rmSync(tempDir, { force: true, recursive: true });
|
||||
}
|
||||
});
|
||||
|
||||
it("validates channel tokens in their canonical config fields", () => {
|
||||
const tempDir = fs.mkdtempSync(path.join(os.tmpdir(), "openclaw-channel-assertions-"));
|
||||
try {
|
||||
|
||||
@@ -526,6 +526,25 @@ describe("release Telegram QA workflow", () => {
|
||||
]);
|
||||
});
|
||||
|
||||
it("accepts only same-line extended-stable successors in both provenance blocks", () => {
|
||||
for (const provenanceBlock of PROVENANCE_BLOCKS) {
|
||||
const accepted = runCandidateProvenance(provenanceBlock, {
|
||||
candidateVersion: "2026.7.35",
|
||||
targetContextRef: "extended-stable/2026.7.33",
|
||||
});
|
||||
expect(accepted.status, `${provenanceBlock.stepName}: ${accepted.stderr}`).toBe(0);
|
||||
|
||||
for (const candidateVersion of ["2026.7.32", "2026.8.35", "2026.7.35-beta.1"]) {
|
||||
const rejected = runCandidateProvenance(provenanceBlock, {
|
||||
candidateVersion,
|
||||
targetContextRef: "extended-stable/2026.7.33",
|
||||
});
|
||||
expect(rejected.status, `${provenanceBlock.stepName}: ${candidateVersion}`).toBe(1);
|
||||
expect(rejected.stderr).toContain("PATCH >= 33");
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
it("accepts only strict signed frozen beta branch heads in both provenance blocks", () => {
|
||||
for (const provenanceBlock of PROVENANCE_BLOCKS) {
|
||||
const frozen = runCandidateProvenance(provenanceBlock, {
|
||||
|
||||
@@ -4001,6 +4001,7 @@ describe("package artifact reuse", () => {
|
||||
["release/2026.8.1", "2026.8.1"],
|
||||
["release/2026.8.1", "2026.8.1-beta.3"],
|
||||
["extended-stable/2026.7.33", "2026.7.33"],
|
||||
["extended-stable/2026.7.33", "2026.7.35"],
|
||||
["v2026.8.1", "2026.8.1"],
|
||||
["v2026.8.1-alpha.2", "2026.8.1-alpha.2"],
|
||||
["v2026.8.1-beta.3", "2026.8.1-beta.3"],
|
||||
@@ -4013,7 +4014,9 @@ describe("package artifact reuse", () => {
|
||||
it.each([
|
||||
["release/2026.8.1", "2026.8.2", "does not belong to release branch"],
|
||||
["release/2026.8.1", "2026.8.1-alpha.2", "expected 2026.8.1 or a beta prerelease"],
|
||||
["extended-stable/2026.7.33", "2026.7.33-beta.1", "does not match extended-stable branch"],
|
||||
["extended-stable/2026.7.33", "2026.7.32", "PATCH >= 33"],
|
||||
["extended-stable/2026.7.33", "2026.8.35", "does not belong to extended-stable branch"],
|
||||
["extended-stable/2026.7.33", "2026.7.35-beta.1", "does not belong to extended-stable branch"],
|
||||
["v2026.8.1", "2026.8.1-beta.1", "does not match release tag"],
|
||||
["v2026.8.1-alpha.2", "2026.8.1-alpha.3", "does not match release tag"],
|
||||
])(
|
||||
@@ -4043,6 +4046,16 @@ describe("package artifact reuse", () => {
|
||||
expect(rejected.stderr).toContain("expected 2026.8.1 or a beta prerelease");
|
||||
});
|
||||
|
||||
it("validates an exact-SHA extended-stable successor against its canonical branch", () => {
|
||||
const result = runFullReleaseTargetIdentityValidation({
|
||||
targetContextRef: "extended-stable/2026.6.33",
|
||||
targetRef: "a".repeat(40),
|
||||
version: "2026.6.35",
|
||||
});
|
||||
|
||||
expect(result.status, result.stderr).toBe(0);
|
||||
});
|
||||
|
||||
it("rejects exact-SHA release contexts outside the named branch or tag", () => {
|
||||
const divergedBranch = runFullReleaseTargetIdentityValidation({
|
||||
comparisonStatus: "diverged",
|
||||
@@ -5906,11 +5919,13 @@ describe("package artifact reuse", () => {
|
||||
expect(telegramDispatch.env).toMatchObject({
|
||||
PARENT_WORKFLOW_REF: "${{ github.ref_name }}",
|
||||
PARENT_WORKFLOW_SHA: "${{ github.sha }}",
|
||||
TARGET_CONTEXT_REF: "${{ inputs.target_context_ref }}",
|
||||
});
|
||||
expect(telegramDispatch.run).toContain('--ref "$PARENT_WORKFLOW_REF"');
|
||||
expect(telegramDispatch.run).toContain(
|
||||
'-f expected_trusted_workflow_sha="$PARENT_WORKFLOW_SHA"',
|
||||
);
|
||||
expect(telegramDispatch.run).toContain('-f target_context_ref="$TARGET_CONTEXT_REF"');
|
||||
expect(telegramDispatch.run).toContain('[[ "$child_head_sha" != "$PARENT_WORKFLOW_SHA" ]]');
|
||||
expect(telegramDispatch.run).not.toContain("commits/main");
|
||||
expect(telegramDispatch.run).not.toContain("dispatch_attempt");
|
||||
|
||||
@@ -183,12 +183,26 @@ suite.define(() => {
|
||||
const composer = page.locator(".agent-chat__composer-combobox textarea");
|
||||
await page.locator(".chat-tool-msg-summary", { hasText: "Exec" }).waitFor();
|
||||
await page.getByRole("button", { name: "Stop generating" }).waitFor();
|
||||
let toolSequence = 0;
|
||||
let agentSequence = 0;
|
||||
const commentaryText = "The active commentary stays visible.";
|
||||
await gateway.emitGatewayEvent("agent", {
|
||||
data: {
|
||||
kind: "preamble",
|
||||
itemId: "active-commentary",
|
||||
progressText: commentaryText,
|
||||
},
|
||||
runId,
|
||||
seq: ++agentSequence,
|
||||
sessionKey: "main",
|
||||
stream: "item",
|
||||
ts: Date.now(),
|
||||
});
|
||||
await page.getByText(commentaryText, { exact: true }).waitFor();
|
||||
const emitTool = (data: Record<string, unknown>) =>
|
||||
gateway.emitGatewayEvent("agent", {
|
||||
data,
|
||||
runId,
|
||||
seq: ++toolSequence,
|
||||
seq: ++agentSequence,
|
||||
sessionKey: "main",
|
||||
stream: "tool",
|
||||
ts: Date.now(),
|
||||
@@ -213,6 +227,7 @@ suite.define(() => {
|
||||
steerParams.idempotencyKey,
|
||||
"steer chat send idempotency key",
|
||||
);
|
||||
await expect.poll(() => page.getByText(commentaryText, { exact: true }).count()).toBe(1);
|
||||
await gateway.resolveDeferred("chat.send", { runId: steerRunId, status: "started" });
|
||||
const steerUser = {
|
||||
__openclaw: {
|
||||
|
||||
Generated
+4
-4
@@ -1,11 +1,11 @@
|
||||
{
|
||||
"fallbackKeys": [],
|
||||
"generatedAt": "2026-08-20T19:02:49.803Z",
|
||||
"generatedAt": "2026-08-21T01:18:26.132Z",
|
||||
"locale": "ar",
|
||||
"model": "claude-opus-4-8",
|
||||
"provider": "anthropic",
|
||||
"sourceHash": "d5a09f904e7f0b71453ca09014d7a9c9439e9d0da7fd3d880b945d022a50bf6f",
|
||||
"totalKeys": 5541,
|
||||
"translatedKeys": 5541,
|
||||
"sourceHash": "a0ee507ffafb4f82ef4062c8e0fb72eeabbd197eb0b4bdd5dcd0661d511423c1",
|
||||
"totalKeys": 5542,
|
||||
"translatedKeys": 5542,
|
||||
"workflow": 1
|
||||
}
|
||||
|
||||
Generated
+1
@@ -4033,6 +4033,7 @@
|
||||
{"cache_key":"d637c706679b75a7574c106443c6116a427760548df6125f64ec2a973db52c45","model":"gpt-5.6-sol","provider":"openai","segment_id":"configForm.removeItem","source_path":"ui/src/i18n/locales/ar.ts","src_lang":"en","text":"Remove item","text_hash":"5a89edf2867d98dd75fe7d7fd924ba09743f09012868a7ccc3c17bb4841b4f79","tgt_lang":"ar","translated":"إزالة العنصر","updated_at":"2026-07-12T06:58:08.154Z"}
|
||||
{"cache_key":"d63c6a144d5e2eca19d2525e7d420ba60236e46e43408f44a894965dd702e396","model":"gpt-5.6-sol","provider":"openai","segment_id":"chat.followUpModeSteer","source_path":"ui/src/i18n/locales/ar.ts","src_lang":"en","text":"Steer into the active run","text_hash":"6a55b4c4c5eaf7c49a27de3cd1cfb19de5682c508c763cd93f3fe378dfa76777","tgt_lang":"ar","translated":"توجيهها إلى التشغيل النشط","updated_at":"2026-07-15T06:07:41.949Z"}
|
||||
{"cache_key":"d6556ea08fc2ced12058cae2b38ff761ab29c92112c7ce8db9edad73c45ee1d3","model":"gpt-5.6-sol","provider":"openai","segment_id":"common.copy","source_path":"ui/src/i18n/locales/ar.ts","src_lang":"en","text":"Copy","text_hash":"e21f935f11d7e966dbbae78da9daa378fe8142a14e7c0cd7434183005faa6c5c","tgt_lang":"ar","translated":"نسخ","updated_at":"2026-07-16T10:56:17.450Z","segment_ids":["channels.setup.copyText","modelSetup.wizard.copy","usage.sessions.copy","chat.messages.copySelection"]}
|
||||
{"cache_key":"d658f7f3e9841d6c3642cfb7bf316a7a5adacc0c7056ac5bef0ca19481b56e81","model":"claude-opus-4-8","provider":"anthropic","segment_id":"usage.providerUsage.unavailable","source_path":"ui/src/i18n/locales/ar.ts","src_lang":"en","text":"Provider usage is unavailable; the last request failed. Refresh to retry.","text_hash":"323bff3c40a5317039a7280c6aca7e16830cb2e9002f1b92ded742b831b9e8d3","tgt_lang":"ar","translated":"استخدام المزوّد غير متاح؛ فشل الطلب الأخير. حدّث للمحاولة مرة أخرى.","updated_at":"2026-08-21T01:18:26.132Z"}
|
||||
{"cache_key":"d66a2aa1fc8b7a044c4423655ec0dc75debf0d717485f3bdeff3b36be8eb8c51","model":"gpt-5.6-sol","provider":"openai","segment_id":"agentTools.profileOff","source_path":"ui/src/i18n/locales/ar.ts","src_lang":"en","text":"Profile Off","text_hash":"5d996a1b9731b141e48d00403bb7faafefdefbba600566f4b83f021360491000","tgt_lang":"ar","translated":"الملف الشخصي متوقف","updated_at":"2026-07-12T06:59:12.313Z"}
|
||||
{"cache_key":"d68064ad791acd968c1cfeaeaa500fdba5e6b48f252997e8300d367af03467d7","model":"claude-opus-4-8","provider":"anthropic","segment_id":"sessionsView.actionRequiresAdmin","source_path":"ui/src/i18n/locales/ar.ts","src_lang":"en","text":"This action requires operator.admin access.","text_hash":"518b8e1950759a90a1bd23aa2ca3c6476d2278d010e83aff6087f7469050286b","tgt_lang":"ar","translated":"يتطلب هذا الإجراء صلاحية operator.admin.","updated_at":"2026-08-06T05:31:44.820Z"}
|
||||
{"cache_key":"d6a6fd89a6ca52fb4de8c081a3b21b323ceb980fe5a3f341b5b629b547a491b3","model":"claude-opus-4-8","provider":"anthropic","segment_id":"workboard.healthReadyUnassigned","source_path":"ui/src/i18n/locales/ar.ts","src_lang":"en","text":"ready unassigned","text_hash":"1e1a31a02e9da6ffa99a459bfd82e5af723794c2175405a5a0d6a32afa955167","tgt_lang":"ar","translated":"جاهز غير مُعيَّن","updated_at":"2026-06-17T14:15:04.326Z"}
|
||||
|
||||
Generated
+1
-1
@@ -1,5 +1,5 @@
|
||||
{
|
||||
"fallbacks": {},
|
||||
"sourceHash": "d5a09f904e7f0b71453ca09014d7a9c9439e9d0da7fd3d880b945d022a50bf6f",
|
||||
"sourceHash": "a0ee507ffafb4f82ef4062c8e0fb72eeabbd197eb0b4bdd5dcd0661d511423c1",
|
||||
"version": 1
|
||||
}
|
||||
|
||||
Generated
+4
-4
@@ -1,11 +1,11 @@
|
||||
{
|
||||
"fallbackKeys": [],
|
||||
"generatedAt": "2026-08-20T18:56:36.897Z",
|
||||
"generatedAt": "2026-08-21T01:16:38.330Z",
|
||||
"locale": "de",
|
||||
"model": "claude-opus-4-8",
|
||||
"provider": "anthropic",
|
||||
"sourceHash": "d5a09f904e7f0b71453ca09014d7a9c9439e9d0da7fd3d880b945d022a50bf6f",
|
||||
"totalKeys": 5541,
|
||||
"translatedKeys": 5541,
|
||||
"sourceHash": "a0ee507ffafb4f82ef4062c8e0fb72eeabbd197eb0b4bdd5dcd0661d511423c1",
|
||||
"totalKeys": 5542,
|
||||
"translatedKeys": 5542,
|
||||
"workflow": 1
|
||||
}
|
||||
|
||||
Generated
+1
@@ -4690,6 +4690,7 @@
|
||||
{"cache_key":"f78c7fdd9510598f92a8bd305ba62b8a156d8597d3f28a795541e8c1973b4c4c","model":"claude-opus-4-8","provider":"anthropic","segment_id":"chat.permissionControls.rootLabel","source_path":"ui/src/i18n/locales/de.ts","src_lang":"en","text":"Root","text_hash":"44cb005ee2e65d9cc817b0a083579369fb6c24a4be728cb43fd9d4c3ca7f4c2e","tgt_lang":"de","translated":"Stamm","updated_at":"2026-06-16T14:13:06.672Z","segment_ids":["chat.workspaceFiles.root"]}
|
||||
{"cache_key":"f7952ddac02c599fcd91df80f41db94f74bc8ac1b5e03e35e775e69a161845f5","model":"claude-opus-4-8","provider":"anthropic","segment_id":"chat.composer.cameraPageInactive","source_path":"ui/src/i18n/locales/de.ts","src_lang":"en","text":"Cameras are unavailable while this page is inactive.","text_hash":"3b042a88aa2dd525457f3744e73786c3cceff2b0c3a6792d5b0869807b91b5a6","tgt_lang":"de","translated":"Kameras sind nicht verfügbar, während diese Seite inaktiv ist.","updated_at":"2026-07-22T15:43:21.590Z"}
|
||||
{"cache_key":"f7c13a0bf213bce41bccadab2ea124b40ec0da4d7980fbfbd4594c3e44e34629","model":"claude-opus-4-8","provider":"anthropic","segment_id":"labsPage.auditMessages.title","source_path":"ui/src/i18n/locales/de.ts","src_lang":"en","text":"Message audit metadata","text_hash":"28cf04f6aa44a7d83c87fb9f92cea02700626876ccb89479576f774e9240bd07","tgt_lang":"de","translated":"Metadaten für Nachrichten-Audit","updated_at":"2026-07-28T07:04:10.501Z"}
|
||||
{"cache_key":"f7d07e34d4d0afad843bfd39382b788b30bbe7ec11671719af61e7533023dfdb","model":"claude-opus-4-8","provider":"anthropic","segment_id":"usage.providerUsage.unavailable","source_path":"ui/src/i18n/locales/de.ts","src_lang":"en","text":"Provider usage is unavailable; the last request failed. Refresh to retry.","text_hash":"323bff3c40a5317039a7280c6aca7e16830cb2e9002f1b92ded742b831b9e8d3","tgt_lang":"de","translated":"Anbieternutzung ist nicht verfügbar; die letzte Anfrage ist fehlgeschlagen. Zum erneuten Versuch aktualisieren.","updated_at":"2026-08-21T01:16:38.330Z"}
|
||||
{"cache_key":"f7d096b6216594297729636a5f2cafb355173d4517df6c0f26d424c656bb9db1","model":"gpt-5.6-sol","provider":"openai","segment_id":"chat.progressLabels.nautiling","source_path":"ui/src/i18n/locales/de.ts","src_lang":"en","text":"Nautiling","text_hash":"8d6976fa1face9dd84cc0f059cfe2cdb098f7f197ac6280ed5769c6fc1863c2c","tgt_lang":"de","translated":"Nautilierend","updated_at":"2026-07-14T04:53:11.296Z"}
|
||||
{"cache_key":"f7fe1975ea8c8081d094d1c2f0410b6ec017df1416e0ba672a5ca7807767858c","model":"claude-opus-4-8","provider":"anthropic","segment_id":"languages.zhTW","source_path":"ui/src/i18n/locales/de.ts","src_lang":"en","text":"繁體中文 (Traditional Chinese)","text_hash":"a21d536382a8b56b077e1606933c7e417e5b66cb6333275b7ad3132ae393a2ab","tgt_lang":"de","translated":"繁體中文 (Traditionelles Chinesisch)","updated_at":"2026-07-29T10:57:42.373Z"}
|
||||
{"cache_key":"f80dabf8b1e3ca7cbbe42bcae5ce686b17fd71646672fd5775d0c973ab12370f","model":"claude-opus-4-8","provider":"anthropic","segment_id":"chat.compaction.openCheckpoints","source_path":"ui/src/i18n/locales/de.ts","src_lang":"en","text":"Open checkpoints","text_hash":"664bee399700c19a0e061a3def6baa4fb915b5a65244ca9ff581a2372291427c","tgt_lang":"de","translated":"Checkpoints öffnen","updated_at":"2026-07-12T06:29:19.539Z"}
|
||||
|
||||
Generated
+4
-4
@@ -1,11 +1,11 @@
|
||||
{
|
||||
"fallbackKeys": [],
|
||||
"generatedAt": "2026-08-20T18:59:04.937Z",
|
||||
"generatedAt": "2026-08-21T01:17:31.290Z",
|
||||
"locale": "es",
|
||||
"model": "claude-opus-4-8",
|
||||
"provider": "anthropic",
|
||||
"sourceHash": "d5a09f904e7f0b71453ca09014d7a9c9439e9d0da7fd3d880b945d022a50bf6f",
|
||||
"totalKeys": 5541,
|
||||
"translatedKeys": 5541,
|
||||
"sourceHash": "a0ee507ffafb4f82ef4062c8e0fb72eeabbd197eb0b4bdd5dcd0661d511423c1",
|
||||
"totalKeys": 5542,
|
||||
"translatedKeys": 5542,
|
||||
"workflow": 1
|
||||
}
|
||||
|
||||
Generated
+1
@@ -4794,6 +4794,7 @@
|
||||
{"cache_key":"fd607197cd5869b0c4486cab7eeaef5c6596a1f4db570e348ca5e5244d8ef369","model":"claude-opus-4-8","provider":"anthropic","segment_id":"agentTools.availableError","source_path":"ui/src/i18n/locales/es.ts","src_lang":"en","text":"Could not load available tools for this session.","text_hash":"9b6a953e54f271fb698a93b197ec42eec5c2861af23e0f41a2ae37bdb4b0862d","tgt_lang":"es","translated":"No se pudieron cargar las herramientas disponibles para esta sesión.","updated_at":"2026-08-10T11:58:55.156Z"}
|
||||
{"cache_key":"fd74fe482ba94ed8c0b5ba257b7a44b12a846891d4807ea691a81ac6eecf995f","model":"claude-opus-4-8","provider":"anthropic","segment_id":"chat.taskSuggestions.startWorktree","source_path":"ui/src/i18n/locales/es.ts","src_lang":"en","text":"Start with worktree","text_hash":"e020d20aa7c831753a734aac4a010e57b481ef40fb14f4ccbe8acc3220d589f6","tgt_lang":"es","translated":"Iniciar con worktree","updated_at":"2026-08-10T11:59:36.125Z"}
|
||||
{"cache_key":"fd8eca86f8dd31f8cabd6825434b11f32e45fa18984c03ba5cf88ba101eae9bd","model":"claude-opus-4-8","provider":"anthropic","segment_id":"pluginsPage.connectorDescriptions.maps","source_path":"ui/src/i18n/locales/es.ts","src_lang":"en","text":"Places, routing, and travel-time answers.","text_hash":"86d006fbc3fb69ebcbd1735bb635e9ddd5767f82cf7d19eae1ebd180fc1a0030","tgt_lang":"es","translated":"Respuestas sobre lugares, rutas y tiempos de viaje.","updated_at":"2026-07-12T06:34:15.765Z"}
|
||||
{"cache_key":"fd922f28e15372071f078984a8dd1316cf0489a78847a057b9f45033d365b3d0","model":"claude-opus-4-8","provider":"anthropic","segment_id":"usage.providerUsage.unavailable","source_path":"ui/src/i18n/locales/es.ts","src_lang":"en","text":"Provider usage is unavailable; the last request failed. Refresh to retry.","text_hash":"323bff3c40a5317039a7280c6aca7e16830cb2e9002f1b92ded742b831b9e8d3","tgt_lang":"es","translated":"El uso del proveedor no está disponible; la última solicitud falló. Actualiza para reintentar.","updated_at":"2026-08-21T01:17:31.290Z"}
|
||||
{"cache_key":"fd968359f805a35cb647ec2ab89f80742b73ba7bda12174dfab96c6e6bef6ba4","model":"claude-opus-4-8","provider":"anthropic","segment_id":"tasksPage.status.completed","source_path":"ui/src/i18n/locales/es.ts","src_lang":"en","text":"Completed","text_hash":"22a970d2e5b1cc233e462be7c7b64e135a275bb09d83d87683bf4236c43113a1","tgt_lang":"es","translated":"Completada","updated_at":"2026-07-29T11:01:32.940Z","segment_ids":["chat.toolCards.completed"]}
|
||||
{"cache_key":"fd99bb88b2e96edadf2bc5c2357f1e92c4193c7bfc31cf5271595a60aefe4dc3","model":"claude-opus-4-8","provider":"anthropic","segment_id":"chat.composer.preparingModel","source_path":"ui/src/i18n/locales/es.ts","src_lang":"en","text":"Preparing model...","text_hash":"d0e825a59e76bdca44389e00280be9653266aa13fc6a4f6e10d0fdd3f6ef61ae","tgt_lang":"es","translated":"Preparando modelo...","updated_at":"2026-07-12T06:35:21.802Z"}
|
||||
{"cache_key":"fdc211a7924a00c1fd29cb50648f0443f888a4f70094b39de914fe44a055688a","model":"claude-opus-4-8","provider":"anthropic","segment_id":"configView.rawDiscard","source_path":"ui/src/i18n/locales/es.ts","src_lang":"en","text":"Discard","text_hash":"eb1a70e39274bb762b5d7c1adb5debeea2b05e12af28207f21a375b596853273","tgt_lang":"es","translated":"Descartar","updated_at":"2026-07-12T06:32:54.055Z","segment_ids":["chat.detailPanel.discard"]}
|
||||
|
||||
Generated
+4
-4
@@ -1,11 +1,11 @@
|
||||
{
|
||||
"fallbackKeys": [],
|
||||
"generatedAt": "2026-08-20T19:09:55.241Z",
|
||||
"generatedAt": "2026-08-21T01:20:45.498Z",
|
||||
"locale": "fa",
|
||||
"model": "claude-opus-4-8",
|
||||
"provider": "anthropic",
|
||||
"sourceHash": "d5a09f904e7f0b71453ca09014d7a9c9439e9d0da7fd3d880b945d022a50bf6f",
|
||||
"totalKeys": 5541,
|
||||
"translatedKeys": 5541,
|
||||
"sourceHash": "a0ee507ffafb4f82ef4062c8e0fb72eeabbd197eb0b4bdd5dcd0661d511423c1",
|
||||
"totalKeys": 5542,
|
||||
"translatedKeys": 5542,
|
||||
"workflow": 1
|
||||
}
|
||||
|
||||
Generated
+1
@@ -2790,6 +2790,7 @@
|
||||
{"cache_key":"914f708ef91fa45871f58a7363b6a2e6bf19dcab3ace5bd61ee128d8c2c3a0f9","model":"claude-opus-4-8","provider":"anthropic","segment_id":"cron.form.triggerConfigured","source_path":"ui/src/i18n/locales/fa.ts","src_lang":"en","text":"Trigger configured","text_hash":"f1d5b83f3246eca160f82e1ef45d5f3c91a0c908c4b06d75e930471666cec00b","tgt_lang":"fa","translated":"راهانداز پیکربندی شد","updated_at":"2026-08-20T19:09:51.252Z"}
|
||||
{"cache_key":"916d9d4791b15230d237ed255896651e5e5d9ebe045fe46f879f875a3c59864b","model":"claude-opus-4-8","provider":"anthropic","segment_id":"mcpServers.targetInvalid","source_path":"ui/src/i18n/locales/fa.ts","src_lang":"en","text":"Enter a URL for HTTP transports or a valid command line for stdio.","text_hash":"ae5335b95b2e0eb79c8cce236d950a92325762b89080e26737a1add0898368b5","tgt_lang":"fa","translated":"برای انتقالهای HTTP یک URL یا برای stdio یک خط فرمان معتبر وارد کنید.","updated_at":"2026-07-22T15:59:30.702Z"}
|
||||
{"cache_key":"91795080ac9db782e7b37473d727e833bf682e18c467137d555cec17470f4949","model":"claude-opus-4-8","provider":"anthropic","segment_id":"subtitles.about","source_path":"ui/src/i18n/locales/fa.ts","src_lang":"en","text":"Control UI and connected Gateway build identity.","text_hash":"fd2885ca5ec93b2e9ad97b2e33f923d5e4eeb352538b54153e92767c16db3c63","tgt_lang":"fa","translated":"Control UI و Gateway متصل، هویت ساخت را تشکیل میدهند.","updated_at":"2026-07-29T11:17:55.240Z"}
|
||||
{"cache_key":"919a4daa04403803386a153bfef15c07a05a4e5d8d18ef0dacbbeb5459b08241","model":"claude-opus-4-8","provider":"anthropic","segment_id":"usage.providerUsage.unavailable","source_path":"ui/src/i18n/locales/fa.ts","src_lang":"en","text":"Provider usage is unavailable; the last request failed. Refresh to retry.","text_hash":"323bff3c40a5317039a7280c6aca7e16830cb2e9002f1b92ded742b831b9e8d3","tgt_lang":"fa","translated":"میزان استفاده از ارائهدهنده در دسترس نیست؛ آخرین درخواست ناموفق بود. برای تلاش مجدد بازخوانی کنید.","updated_at":"2026-08-21T01:20:45.498Z"}
|
||||
{"cache_key":"919fe2b21de356526a75ccb832669dbbaee0d7b5d42126aea3080c9f73403283","model":"claude-opus-4-8","provider":"anthropic","segment_id":"updates.failureReasons.notGitInstall","source_path":"ui/src/i18n/locales/fa.ts","src_lang":"en","text":"Not a git checkout. Run `openclaw update` from the CLI for a global reinstall.","text_hash":"d636671963ded65b8beebbc48374ed75803aa3f2cba0423512b08701ff9d834e","tgt_lang":"fa","translated":"این یک git checkout نیست. برای نصب مجدد سراسری، `openclaw update` را از CLI اجرا کنید.","updated_at":"2026-07-29T11:13:45.314Z"}
|
||||
{"cache_key":"91aece18dc491d677d98497e8aa7bc3a396c91b5782e64f630080bf3042aa50e","model":"claude-opus-4-8","provider":"anthropic","segment_id":"sessionsView.forkedSession","source_path":"ui/src/i18n/locales/fa.ts","src_lang":"en","text":"Forked session","text_hash":"bca77f806cc57a52c3b37047585c6d46bd603af37f4bf34782b7ea1db9a6f39b","tgt_lang":"fa","translated":"نشست انشعابیافته","updated_at":"2026-08-10T12:09:48.246Z"}
|
||||
{"cache_key":"91b2a43e31e8321e762f02d3890edee0979dacbb51c7f2eb55881b12c0c1eeae","model":"gpt-5.5","provider":"openai","segment_id":"worktrees.ownerManual","source_path":"ui/src/i18n/locales/fa.ts","src_lang":"en","text":"Manual","text_hash":"b0b9fe24ffa9629125bdc59b122f80d605ab604eb1b74485c2f2ecfde26576ae","tgt_lang":"fa","translated":"دستی","updated_at":"2026-07-10T18:00:05.730Z"}
|
||||
|
||||
Generated
+4
-4
@@ -1,11 +1,11 @@
|
||||
{
|
||||
"fallbackKeys": [],
|
||||
"generatedAt": "2026-08-20T18:59:39.695Z",
|
||||
"generatedAt": "2026-08-21T01:17:51.622Z",
|
||||
"locale": "fr",
|
||||
"model": "claude-opus-4-8",
|
||||
"provider": "anthropic",
|
||||
"sourceHash": "d5a09f904e7f0b71453ca09014d7a9c9439e9d0da7fd3d880b945d022a50bf6f",
|
||||
"totalKeys": 5541,
|
||||
"translatedKeys": 5541,
|
||||
"sourceHash": "a0ee507ffafb4f82ef4062c8e0fb72eeabbd197eb0b4bdd5dcd0661d511423c1",
|
||||
"totalKeys": 5542,
|
||||
"translatedKeys": 5542,
|
||||
"workflow": 1
|
||||
}
|
||||
|
||||
Generated
+1
@@ -4615,6 +4615,7 @@
|
||||
{"cache_key":"f587b6d9097d4c94492b33f045d17f66bed988d5f2281f6aba29fd6cdedee7cd","model":"claude-opus-4-8","provider":"anthropic","segment_id":"connection.scopeUpgrade.request","source_path":"ui/src/i18n/locales/fr.ts","src_lang":"en","text":"Request admin","text_hash":"74c61113fcf88703929147c4074d1ca434878f02473c164f1f5bb2dc08ee4744","tgt_lang":"fr","translated":"Demander l'accès admin","updated_at":"2026-08-17T10:14:46.078Z"}
|
||||
{"cache_key":"f589c22d48684a9852e079fd5d54aca2e8c810e033fa91eb7c0544b3d52f7693","model":"claude-opus-4-8","provider":"anthropic","segment_id":"memoryPage.overview.hero.keywordSearch","source_path":"ui/src/i18n/locales/fr.ts","src_lang":"en","text":"keyword search (no embeddings)","text_hash":"6efed164240b61266cdb0bb463e56e7ec177db7b6167d33fe80c91c3a9f55e66","tgt_lang":"fr","translated":"recherche par mots-clés (sans embeddings)","updated_at":"2026-07-29T10:59:51.644Z"}
|
||||
{"cache_key":"f5b8d98cfe39fcabd73cb72b2276061ee852fe7c76ae1a89d5c72e5436778f53","model":"gpt-5.6-sol","provider":"openai","segment_id":"agentScope.label","source_path":"ui/src/i18n/locales/fr.ts","src_lang":"en","text":"Agent scope","text_hash":"0833bc070d2c153692bc25fcc0b30f774cb415efdbf95fe8cd132feab8053698","tgt_lang":"fr","translated":"Portée de l’agent","updated_at":"2026-07-13T11:01:19.372Z"}
|
||||
{"cache_key":"f5c0843b9c4fd66f0c32c37bdbb2a48458d68e96745d729dcc7f6d172c94dc00","model":"claude-opus-4-8","provider":"anthropic","segment_id":"usage.providerUsage.unavailable","source_path":"ui/src/i18n/locales/fr.ts","src_lang":"en","text":"Provider usage is unavailable; the last request failed. Refresh to retry.","text_hash":"323bff3c40a5317039a7280c6aca7e16830cb2e9002f1b92ded742b831b9e8d3","tgt_lang":"fr","translated":"L'utilisation du fournisseur est indisponible ; la dernière requête a échoué. Actualisez pour réessayer.","updated_at":"2026-08-21T01:17:51.622Z"}
|
||||
{"cache_key":"f5d8645410ced8140cba0ded911b4097c15073b11f2532fb02006aaf1e3cb45c","model":"claude-opus-4-8","provider":"anthropic","segment_id":"updates.page.devPackageAutomaticHint","source_path":"ui/src/i18n/locales/fr.ts","src_lang":"en","text":"Automatic dev updates require a source (git) install. This install is a package install — use stable or beta for automatic updates.","text_hash":"b75fc28c0bbb7acb0948fc3cf55ab08b16ac154ca5dc070a147b6715f44d08fc","tgt_lang":"fr","translated":"Les mises à jour dev automatiques nécessitent une installation depuis la source (git). Cette installation est une installation par package — utilisez stable ou beta pour les mises à jour automatiques.","updated_at":"2026-08-10T11:58:17.975Z"}
|
||||
{"cache_key":"f5d9f1ab8f96f2ca6d3f26c282c87bea52d8e8369576e6cd5da648f983592292","model":"claude-opus-4-8","provider":"anthropic","segment_id":"chat.taskSuggestions.showInstructions","source_path":"ui/src/i18n/locales/fr.ts","src_lang":"en","text":"Show instructions","text_hash":"4a0e4d79a5d85d7ed639e155392b324288e384832d9d9eefc56d34015fe67741","tgt_lang":"fr","translated":"Afficher les instructions","updated_at":"2026-08-10T11:59:36.910Z"}
|
||||
{"cache_key":"f5da89e5c84aab4934486a212b2eaea82089eee4d99f03f5f1b28e7227d97a7c","model":"claude-opus-4-8","provider":"anthropic","segment_id":"configForm.sections.models.description","source_path":"ui/src/i18n/locales/fr.ts","src_lang":"en","text":"AI model configurations and providers","text_hash":"a02dc88c5366c942eb656ab00157d8b02725745aebf483d47f2d364d4b12b623","tgt_lang":"fr","translated":"Configurations et fournisseurs de modèles d'IA","updated_at":"2026-07-12T06:33:09.235Z"}
|
||||
|
||||
Generated
+4
-4
@@ -1,11 +1,11 @@
|
||||
{
|
||||
"fallbackKeys": [],
|
||||
"generatedAt": "2026-08-20T19:03:03.640Z",
|
||||
"generatedAt": "2026-08-21T01:18:23.377Z",
|
||||
"locale": "hi",
|
||||
"model": "claude-opus-4-8",
|
||||
"provider": "anthropic",
|
||||
"sourceHash": "d5a09f904e7f0b71453ca09014d7a9c9439e9d0da7fd3d880b945d022a50bf6f",
|
||||
"totalKeys": 5541,
|
||||
"translatedKeys": 5541,
|
||||
"sourceHash": "a0ee507ffafb4f82ef4062c8e0fb72eeabbd197eb0b4bdd5dcd0661d511423c1",
|
||||
"totalKeys": 5542,
|
||||
"translatedKeys": 5542,
|
||||
"workflow": 1
|
||||
}
|
||||
|
||||
Generated
+1
@@ -3598,6 +3598,7 @@
|
||||
{"cache_key":"c07aade15dc27fc835709103637ba6193bcaf708b118f3cd4e80bdaff4f5a3e7","model":"claude-opus-4-8","provider":"anthropic","segment_id":"sessionHovercard.checks.passing","source_path":"ui/src/i18n/locales/hi.ts","src_lang":"en","text":"CI checks passing","text_hash":"f049a4c175c868586c44c8f31677e6015f6bba0100b0505a44276bf5447a9291","tgt_lang":"hi","translated":"CI जाँचें पास हो रही हैं","updated_at":"2026-07-29T11:07:00.115Z","segment_ids":["chat.pullRequests.checksPassing"]}
|
||||
{"cache_key":"c07ed9ddbc4b27fbed9290e690c9c0c7ae331ad6e0ddc7c9428f459b4aa3cd0e","model":"claude-opus-4-8","provider":"anthropic","segment_id":"skillWorkshop.empty.staleBody","source_path":"ui/src/i18n/locales/hi.ts","src_lang":"en","text":"Proposals that can no longer apply cleanly will appear here.","text_hash":"cc140b15a8c376fc139829453cab08c9280f277f0796e9673ea723621772d877","tgt_lang":"hi","translated":"जो प्रस्ताव अब साफ़-सुथरे तरीके से लागू नहीं हो सकते, वे यहां दिखाई देंगे।","updated_at":"2026-07-12T06:41:59.574Z"}
|
||||
{"cache_key":"c086b6dee4f86ce2fa5eb854d73e82099d3b5a63c1695b209690b3b18ed2a26a","model":"claude-opus-4-8","provider":"anthropic","segment_id":"pluginsPage.detailPluginId","source_path":"ui/src/i18n/locales/hi.ts","src_lang":"en","text":"Plugin ID","text_hash":"32a723fa23c16a93157b972c5fad5668e2a9e91a94719b2a00a1b41ead75bf94","tgt_lang":"hi","translated":"Plugin ID","updated_at":"2026-07-29T11:07:00.115Z"}
|
||||
{"cache_key":"c0951a7addcc6752bcfd6590aa70c93cf2daa63900d61fadf1ecee59e64cdc7d","model":"claude-opus-4-8","provider":"anthropic","segment_id":"usage.providerUsage.unavailable","source_path":"ui/src/i18n/locales/hi.ts","src_lang":"en","text":"Provider usage is unavailable; the last request failed. Refresh to retry.","text_hash":"323bff3c40a5317039a7280c6aca7e16830cb2e9002f1b92ded742b831b9e8d3","tgt_lang":"hi","translated":"प्रदाता उपयोग उपलब्ध नहीं है; अंतिम अनुरोध विफल रहा। पुनः प्रयास के लिए रिफ्रेश करें।","updated_at":"2026-08-21T01:18:23.377Z"}
|
||||
{"cache_key":"c0addbc9c25b3f3dd506b797e58340cf468bc12e4ef6851eadbd14885cfde8e9","model":"claude-opus-4-8","provider":"anthropic","segment_id":"connection.scopeUpgrade.rejected","source_path":"ui/src/i18n/locales/hi.ts","src_lang":"en","text":"The administrator access request was rejected.","text_hash":"9b224f57108cee66a57c0eeeb97b138b3606a5205ae565ad161e34a24142739c","tgt_lang":"hi","translated":"प्रशासक एक्सेस अनुरोध अस्वीकार कर दिया गया।","updated_at":"2026-08-17T10:19:54.621Z"}
|
||||
{"cache_key":"c0b229c713a4201069eba83d0ca58b0e4fdda076824496e0e9f2037d1157039f","model":"claude-opus-4-8","provider":"anthropic","segment_id":"chat.composer.browserAnnotationUndoUnavailable","source_path":"ui/src/i18n/locales/hi.ts","src_lang":"en","text":"Undo is unavailable because the browser annotation limit has been reached.","text_hash":"cd5242fdb5fb1ab28028b830088361ace354b9ece71f05af2def4d7e3c70ab23","tgt_lang":"hi","translated":"ब्राउज़र एनोटेशन सीमा तक पहुँच जाने के कारण पूर्ववत करना उपलब्ध नहीं है.","updated_at":"2026-08-10T12:03:49.702Z"}
|
||||
{"cache_key":"c0b6cfe04f0250a4f64d05c75cf91b9639a41d5bda0976d682bc6b8a0856aded","model":"gpt-5.5","provider":"openai","segment_id":"newSession.local","source_path":"ui/src/i18n/locales/hi.ts","src_lang":"en","text":"Local","text_hash":"8c31e6e7223097e2e4847773c47a4efab6aaf79deeecc92a7759891c74976dde","tgt_lang":"hi","translated":"स्थानीय","updated_at":"2026-06-26T21:34:37.383Z","segment_ids":["sessionsView.groupDefaultsLocal","usage.filters.timeZoneLocal"]}
|
||||
|
||||
Generated
+4
-4
@@ -1,11 +1,11 @@
|
||||
{
|
||||
"fallbackKeys": [],
|
||||
"generatedAt": "2026-08-20T19:05:40.099Z",
|
||||
"generatedAt": "2026-08-21T01:19:15.296Z",
|
||||
"locale": "id",
|
||||
"model": "claude-opus-4-8",
|
||||
"provider": "anthropic",
|
||||
"sourceHash": "d5a09f904e7f0b71453ca09014d7a9c9439e9d0da7fd3d880b945d022a50bf6f",
|
||||
"totalKeys": 5541,
|
||||
"translatedKeys": 5541,
|
||||
"sourceHash": "a0ee507ffafb4f82ef4062c8e0fb72eeabbd197eb0b4bdd5dcd0661d511423c1",
|
||||
"totalKeys": 5542,
|
||||
"translatedKeys": 5542,
|
||||
"workflow": 1
|
||||
}
|
||||
|
||||
Generated
+1
@@ -2530,6 +2530,7 @@
|
||||
{"cache_key":"85371f5ad67a3a3b55dae36f6c3b563b56fa0407b41511b3fe72d53481c05f17","model":"claude-opus-4-8","provider":"anthropic","segment_id":"memoryImport.reviewFiles","source_path":"ui/src/i18n/locales/id.ts","src_lang":"en","text":"Review files","text_hash":"5a3ec6cc93489d7d584d0c6bb0444cf2e8859b0148d7e278d2b09718bbf511ca","tgt_lang":"id","translated":"Tinjau file","updated_at":"2026-07-29T11:11:22.777Z"}
|
||||
{"cache_key":"8539cd7b82825e0a6f8e99ea5669dd2485a53514adead040879b0951192ceda6","model":"claude-opus-4-8","provider":"anthropic","segment_id":"desktop.keyboardInput","source_path":"ui/src/i18n/locales/id.ts","src_lang":"en","text":"Remote desktop keyboard input","text_hash":"dca9ca24db2dce42375968b992c1335c163fe34371a454671ba9002ebe9f2d4e","tgt_lang":"id","translated":"Input keyboard desktop jarak jauh","updated_at":"2026-08-17T10:22:49.745Z"}
|
||||
{"cache_key":"855a847529ac51ae536632fe588f4be081c7cdcdda1bf54dd616fbe386a14fd6","model":"claude-opus-4-8","provider":"anthropic","segment_id":"cron.actions.removeConfirmTitle","source_path":"ui/src/i18n/locales/id.ts","src_lang":"en","text":"Remove \"{name}\"?","text_hash":"0ab816a9864288a486afc7c68bfca981978aefe30bf0b16bf6113e53171f63c6","tgt_lang":"id","translated":"Hapus \"{name}\"?","updated_at":"2026-08-17T10:25:22.227Z"}
|
||||
{"cache_key":"85633af7e972160072398d0efb31f8dd75eadfba8a133deb9be2b48e7fa2f02e","model":"claude-opus-4-8","provider":"anthropic","segment_id":"usage.providerUsage.unavailable","source_path":"ui/src/i18n/locales/id.ts","src_lang":"en","text":"Provider usage is unavailable; the last request failed. Refresh to retry.","text_hash":"323bff3c40a5317039a7280c6aca7e16830cb2e9002f1b92ded742b831b9e8d3","tgt_lang":"id","translated":"Penggunaan provider tidak tersedia; permintaan terakhir gagal. Segarkan untuk mencoba lagi.","updated_at":"2026-08-21T01:19:15.296Z"}
|
||||
{"cache_key":"8572cb27c7737c44bc77e0f75d8637ccf5ff06d863de9f8bdfc9eaf252965b3a","model":"claude-opus-4-8","provider":"anthropic","segment_id":"board.widget.networkCapability","source_path":"ui/src/i18n/locales/id.ts","src_lang":"en","text":"Network: {capability}","text_hash":"963bf47cdfd7ff38f26ff9d695499eb1515f8cc1976f3d1e3d3f4cc7b140ec8c","tgt_lang":"id","translated":"Jaringan: {capability}","updated_at":"2026-07-22T15:54:26.692Z"}
|
||||
{"cache_key":"857599bfe6dc2eb00e290db6eec0405a4c0a10bee342ce0e2d6ecb8ca47a1f12","model":"gpt-5.6-sol","provider":"openai","segment_id":"onboarding.memoryImport.plannedCount","source_path":"ui/src/i18n/locales/id.ts","src_lang":"en","text":"{count} ready to import","text_hash":"5cd77f8c50e67428b1824cbb86869d94a4c28d0c007c45220f298193c206f459","tgt_lang":"id","translated":"{count} siap diimpor","updated_at":"2026-07-16T12:40:06.667Z"}
|
||||
{"cache_key":"8591d72a7fd4f73c39238608b1cea45f12419ed2214ab812a9323adf2be1abc1","model":"gpt-5.5","provider":"openai","segment_id":"workboard.eventAttachmentAdded","source_path":"ui/src/i18n/locales/id.ts","src_lang":"en","text":"Attachment added","text_hash":"f39a309fb0054d8e6c512733d6f3a4791c6b63157a388d72f635574d98b49b3e","tgt_lang":"id","translated":"Lampiran ditambahkan","updated_at":"2026-05-30T15:38:39.708Z"}
|
||||
|
||||
Generated
+4
-4
@@ -1,11 +1,11 @@
|
||||
{
|
||||
"fallbackKeys": [],
|
||||
"generatedAt": "2026-08-20T19:02:31.556Z",
|
||||
"generatedAt": "2026-08-21T01:18:48.604Z",
|
||||
"locale": "it",
|
||||
"model": "claude-opus-4-8",
|
||||
"provider": "anthropic",
|
||||
"sourceHash": "d5a09f904e7f0b71453ca09014d7a9c9439e9d0da7fd3d880b945d022a50bf6f",
|
||||
"totalKeys": 5541,
|
||||
"translatedKeys": 5541,
|
||||
"sourceHash": "a0ee507ffafb4f82ef4062c8e0fb72eeabbd197eb0b4bdd5dcd0661d511423c1",
|
||||
"totalKeys": 5542,
|
||||
"translatedKeys": 5542,
|
||||
"workflow": 1
|
||||
}
|
||||
|
||||
Generated
+1
@@ -4510,6 +4510,7 @@
|
||||
{"cache_key":"ee152c0b8d7bc9e1e739a0caf3fb48f6f93e6bb89a44d6b4b85fae35fb048a78","model":"claude-opus-4-8","provider":"anthropic","segment_id":"chat.composer.menu.addMcpServerDescription","source_path":"ui/src/i18n/locales/it.ts","src_lang":"en","text":"Configure the server and choose where it is enabled.","text_hash":"f55ff09e4124382e7b9036075012e1aa6a1cb8efee8177b64fc6100ad443d079","tgt_lang":"it","translated":"Configura il server e scegli dove è abilitato.","updated_at":"2026-07-31T19:26:03.104Z"}
|
||||
{"cache_key":"ee2a542832c3ec345aa1578d7d0ff0e7435e552f57734a2cbaeacaa61d9c401c","model":"claude-opus-4-8","provider":"anthropic","segment_id":"agentTools.githubStateVerified","source_path":"ui/src/i18n/locales/it.ts","src_lang":"en","text":"Verified","text_hash":"4f7838402f37674e8ebedb6cf048c0aea66bacdb25607aa3eee4b53093d83f5c","tgt_lang":"it","translated":"Verificato","updated_at":"2026-08-18T10:38:05.867Z"}
|
||||
{"cache_key":"ee325ac91eafc78e5bf7de625d3c41d6f3bc369cda43b958fb6a15d1f2806d45","model":"claude-opus-4-8","provider":"anthropic","segment_id":"modelProviders.readiness.signedInNoModels","source_path":"ui/src/i18n/locales/it.ts","src_lang":"en","text":"You're signed in, but this account exposes no usable models. Choose another provider or account to continue.","text_hash":"8161c8ac3c1029e91facacac66caf3d159e019cb581041782fa7a9299bbe1702","tgt_lang":"it","translated":"Hai effettuato l'accesso, ma questo account non espone modelli utilizzabili. Scegli un altro provider o account per continuare.","updated_at":"2026-07-31T19:26:03.104Z"}
|
||||
{"cache_key":"ee32def16e439c9281646d3006c2e450b60d11be14ff86145a76e66b5ed4d472","model":"claude-opus-4-8","provider":"anthropic","segment_id":"usage.providerUsage.unavailable","source_path":"ui/src/i18n/locales/it.ts","src_lang":"en","text":"Provider usage is unavailable; the last request failed. Refresh to retry.","text_hash":"323bff3c40a5317039a7280c6aca7e16830cb2e9002f1b92ded742b831b9e8d3","tgt_lang":"it","translated":"L'utilizzo del provider non è disponibile; l'ultima richiesta non è riuscita. Aggiorna per riprovare.","updated_at":"2026-08-21T01:18:48.603Z"}
|
||||
{"cache_key":"ee3d598a2cb60363cb2cf46050825f6f3fd44ea47014da658de9b975d0948b1a","model":"claude-opus-4-8","provider":"anthropic","segment_id":"usage.filters.hours","source_path":"ui/src/i18n/locales/it.ts","src_lang":"en","text":"Hours","text_hash":"21e8492938abc179410c21f3598f141c4c59a8bf2d3b4e475b7d83e10adfc00f","tgt_lang":"it","translated":"Ore","updated_at":"2026-07-29T11:06:11.260Z","segment_ids":["cron.form.hours"]}
|
||||
{"cache_key":"ee4be21fa0514a061c9628abceb52ef333bc00133fa3a0645966d700e45011c3","model":"gpt-5.6-sol","provider":"openai","segment_id":"cron.runNotStarted.stopped","source_path":"ui/src/i18n/locales/it.ts","src_lang":"en","text":"The scheduler is stopped.","text_hash":"c6932b841004c92fd0e751c19bb712dc7f8a4974cf868c93dd4567a8477ec2fe","tgt_lang":"it","translated":"L'utilità di pianificazione è arrestata.","updated_at":"2026-07-13T03:19:39.741Z"}
|
||||
{"cache_key":"ee7327189eb75969b6a2dcd7dd9a88602b55451aa7fb8443af45dd62c9e18633","model":"claude-opus-4-8","provider":"anthropic","segment_id":"chat.sidebar.sortSessions","source_path":"ui/src/i18n/locales/it.ts","src_lang":"en","text":"Filter & sort","text_hash":"f6606a98df63a92e9279c7739f8b451d7beef54defdd3862da2ab7d0b8af01d4","tgt_lang":"it","translated":"Filtra e ordina","updated_at":"2026-08-18T15:42:25.894Z"}
|
||||
|
||||
Generated
+4
-4
@@ -1,11 +1,11 @@
|
||||
{
|
||||
"fallbackKeys": [],
|
||||
"generatedAt": "2026-08-20T18:59:17.520Z",
|
||||
"generatedAt": "2026-08-21T01:17:27.056Z",
|
||||
"locale": "ja-JP",
|
||||
"model": "claude-opus-4-8",
|
||||
"provider": "anthropic",
|
||||
"sourceHash": "d5a09f904e7f0b71453ca09014d7a9c9439e9d0da7fd3d880b945d022a50bf6f",
|
||||
"totalKeys": 5541,
|
||||
"translatedKeys": 5541,
|
||||
"sourceHash": "a0ee507ffafb4f82ef4062c8e0fb72eeabbd197eb0b4bdd5dcd0661d511423c1",
|
||||
"totalKeys": 5542,
|
||||
"translatedKeys": 5542,
|
||||
"workflow": 1
|
||||
}
|
||||
|
||||
Generated
+1
@@ -2073,6 +2073,7 @@
|
||||
{"cache_key":"6920e619f9f00c13a173a53f884a8ca5130f7c8c6add3b5b77b7fd0eec55a199","model":"claude-opus-4-8","provider":"anthropic","segment_id":"profilePage.identity.avatarErrors.invalid","source_path":"ui/src/i18n/locales/ja-JP.ts","src_lang":"en","text":"That image could not be processed.","text_hash":"c12675f25d8268d8f9bc495f98194cdc5c0e9b81e53c38a100c255ff01c2b712","tgt_lang":"ja-JP","translated":"その画像を処理できませんでした。","updated_at":"2026-07-22T15:45:44.803Z"}
|
||||
{"cache_key":"69477a0ef7b2d17071ffb7d00978604dc9da2a6de9979f0d15e7b0f80bff412d","model":"claude-opus-4-8","provider":"anthropic","segment_id":"sessionsView.copySessionId","source_path":"ui/src/i18n/locales/ja-JP.ts","src_lang":"en","text":"Copy session ID","text_hash":"a0901579bf376b95a95dbdaf3a3d34331bc35de433641afd8766ce47a7497cb1","tgt_lang":"ja-JP","translated":"セッションIDをコピー","updated_at":"2026-08-20T18:57:43.698Z"}
|
||||
{"cache_key":"694da70eeafe9184caa4c03d38b4b97eb916ecbc3af8a03cb6c808fd70cc29e7","model":"claude-opus-4-8","provider":"anthropic","segment_id":"modelProviders.status.expiring","source_path":"ui/src/i18n/locales/ja-JP.ts","src_lang":"en","text":"Expiring","text_hash":"ff44a401445c99df44771a1745513fdddec7d0a8baa503117bdacba5e13592e3","tgt_lang":"ja-JP","translated":"Expiring","updated_at":"2026-07-29T11:01:56.794Z"}
|
||||
{"cache_key":"694e22265b97f07bd8fefdb28eed6736bda3068261a0f74f338bf78a0435eca9","model":"claude-opus-4-8","provider":"anthropic","segment_id":"usage.providerUsage.unavailable","source_path":"ui/src/i18n/locales/ja-JP.ts","src_lang":"en","text":"Provider usage is unavailable; the last request failed. Refresh to retry.","text_hash":"323bff3c40a5317039a7280c6aca7e16830cb2e9002f1b92ded742b831b9e8d3","tgt_lang":"ja-JP","translated":"プロバイダーの使用状況を取得できません。前回のリクエストが失敗しました。更新して再試行してください。","updated_at":"2026-08-21T01:17:27.056Z"}
|
||||
{"cache_key":"69663317cbe90e4e9ed3f4bda96a7614904b30bad9f4ecaf8029b5c4596d456d","model":"claude-opus-4-8","provider":"anthropic","segment_id":"memoryImport.reviewFiles","source_path":"ui/src/i18n/locales/ja-JP.ts","src_lang":"en","text":"Review files","text_hash":"5a3ec6cc93489d7d584d0c6bb0444cf2e8859b0148d7e278d2b09718bbf511ca","tgt_lang":"ja-JP","translated":"ファイルを確認","updated_at":"2026-07-29T11:01:56.794Z"}
|
||||
{"cache_key":"697512e95c35c18efad3a642c45e6b947fe1e7af8bfcb5432a8093fd83cea26b","model":"claude-opus-4-8","provider":"anthropic","segment_id":"connection.scopeUpgrade.limited","source_path":"ui/src/i18n/locales/ja-JP.ts","src_lang":"en","text":"This browser has limited access.","text_hash":"81d5bd1dd9214110e331c247def52a91386d7315a229b8354071a513cf21eb1e","tgt_lang":"ja-JP","translated":"このブラウザのアクセスは制限されています。","updated_at":"2026-08-17T10:13:57.832Z"}
|
||||
{"cache_key":"698b3628dea0bb44aaf5a43428f7a78c291aff1f5b31e3e4e44f1f2acab2ab97","model":"claude-opus-4-8","provider":"anthropic","segment_id":"cloudWorkersPage.fields.binary","source_path":"ui/src/i18n/locales/ja-JP.ts","src_lang":"en","text":"Crabbox binary","text_hash":"1fc1198e244cf865f556c0f93d34da03d940d2b56e46ff20b3757778c85b13b0","tgt_lang":"ja-JP","translated":"Crabbox バイナリ","updated_at":"2026-08-17T10:12:50.348Z"}
|
||||
|
||||
Generated
+4
-4
@@ -1,11 +1,11 @@
|
||||
{
|
||||
"fallbackKeys": [],
|
||||
"generatedAt": "2026-08-20T18:59:48.417Z",
|
||||
"generatedAt": "2026-08-21T01:17:49.245Z",
|
||||
"locale": "ko",
|
||||
"model": "claude-opus-4-8",
|
||||
"provider": "anthropic",
|
||||
"sourceHash": "d5a09f904e7f0b71453ca09014d7a9c9439e9d0da7fd3d880b945d022a50bf6f",
|
||||
"totalKeys": 5541,
|
||||
"translatedKeys": 5541,
|
||||
"sourceHash": "a0ee507ffafb4f82ef4062c8e0fb72eeabbd197eb0b4bdd5dcd0661d511423c1",
|
||||
"totalKeys": 5542,
|
||||
"translatedKeys": 5542,
|
||||
"workflow": 1
|
||||
}
|
||||
|
||||
Generated
+1
@@ -3349,6 +3349,7 @@
|
||||
{"cache_key":"b0522a532fa04ee0acc256af97298227444a993a88b329ad33e2f3c7a40487a3","model":"claude-opus-4-8","provider":"anthropic","segment_id":"configView.appearance.importHint","source_path":"ui/src/i18n/locales/ko.ts","src_lang":"en","text":"Import a tweakcn theme into this browser-local slot","text_hash":"33161ce58ef74f8fb03a381b873572588e9d95a119863577efdac32553f31f6d","tgt_lang":"ko","translated":"tweakcn 테마를 이 브라우저 로컬 슬롯으로 가져옵니다","updated_at":"2026-07-12T06:33:48.468Z"}
|
||||
{"cache_key":"b05db251110ba1cd318787a26e43a80ff6b5c1f8dff4f20925ca1e443401aa74","model":"claude-opus-4-8","provider":"anthropic","segment_id":"cron.errors.invalidRunTime","source_path":"ui/src/i18n/locales/ko.ts","src_lang":"en","text":"Invalid run time.","text_hash":"51465fa3cb94966411a49d8d1972fe997ac028fd249e05df55db8a2179975b48","tgt_lang":"ko","translated":"잘못된 실행 시간입니다.","updated_at":"2026-07-29T11:02:21.725Z"}
|
||||
{"cache_key":"b0671fcbdaecc3f3dbaccd42db3cdb10b133724db39c97b83ca1a1b5930a3b3b","model":"claude-opus-4-8","provider":"anthropic","segment_id":"mcpServers.enable","source_path":"ui/src/i18n/locales/ko.ts","src_lang":"en","text":"Enable","text_hash":"5342e09f2729fbc6514528e727aeb9857afb31719d43568e6b18661ace7d1014","tgt_lang":"ko","translated":"활성화","updated_at":"2026-07-12T06:36:08.156Z","segment_ids":["memoryPage.engine.enable","pluginsPage.enableAction","dreaming.wiki.enablePrefix"]}
|
||||
{"cache_key":"b068c3430ce53ffe272524ad6891ea14a517ba68c431cb2b8ec43d2c211a7ac6","model":"claude-opus-4-8","provider":"anthropic","segment_id":"usage.providerUsage.unavailable","source_path":"ui/src/i18n/locales/ko.ts","src_lang":"en","text":"Provider usage is unavailable; the last request failed. Refresh to retry.","text_hash":"323bff3c40a5317039a7280c6aca7e16830cb2e9002f1b92ded742b831b9e8d3","tgt_lang":"ko","translated":"공급자 사용량을 사용할 수 없습니다. 마지막 요청이 실패했습니다. 새로 고침하여 다시 시도하세요.","updated_at":"2026-08-21T01:17:49.245Z"}
|
||||
{"cache_key":"b071dbd2be3c419c6203dafc78c8c1588e4cc3b275db83ea3198a3a6a64af921","model":"claude-opus-4-8","provider":"anthropic","segment_id":"dreaming.wiki.sectionPageSummary","source_path":"ui/src/i18n/locales/ko.ts","src_lang":"en","text":"{label}: {count}","text_hash":"141835a90fdf5c547509524b274b18de5f2e3491e14fb28673b2b858a372b083","tgt_lang":"ko","translated":"{label}: {count}","updated_at":"2026-07-29T11:01:06.880Z"}
|
||||
{"cache_key":"b089997fcef06945b47a8adaa9e07e8ed9f1e4ce0b2f646054761b188c0a90ec","model":"claude-opus-4-8","provider":"anthropic","segment_id":"cron.errors.triggerScriptRequired","source_path":"ui/src/i18n/locales/ko.ts","src_lang":"en","text":"Trigger script is required when the condition trigger is enabled.","text_hash":"32b0114dec88bd0d6ac36369d671be2551c448d3412942cccca92c9a9d784678","tgt_lang":"ko","translated":"조건 트리거가 활성화된 경우 트리거 스크립트가 필요합니다.","updated_at":"2026-08-20T18:59:44.408Z"}
|
||||
{"cache_key":"b089d87865e0e6653ff19414fb0c32e6ddd011edcb60ec3c490e075aa3da8711","model":"claude-opus-4-8","provider":"anthropic","segment_id":"agentTools.githubEffectiveScopes","source_path":"ui/src/i18n/locales/ko.ts","src_lang":"en","text":"Effective OAuth scopes","text_hash":"205c949b27569f1598bfa902d8274c79aa50aee83cacc09484b41bdff9e17a49","tgt_lang":"ko","translated":"적용 OAuth 범위","updated_at":"2026-08-20T18:58:16.078Z"}
|
||||
|
||||
Generated
+4
-4
@@ -1,11 +1,11 @@
|
||||
{
|
||||
"fallbackKeys": [],
|
||||
"generatedAt": "2026-08-20T19:08:57.901Z",
|
||||
"generatedAt": "2026-08-21T01:20:26.068Z",
|
||||
"locale": "nl",
|
||||
"model": "claude-opus-4-8",
|
||||
"provider": "anthropic",
|
||||
"sourceHash": "d5a09f904e7f0b71453ca09014d7a9c9439e9d0da7fd3d880b945d022a50bf6f",
|
||||
"totalKeys": 5541,
|
||||
"translatedKeys": 5541,
|
||||
"sourceHash": "a0ee507ffafb4f82ef4062c8e0fb72eeabbd197eb0b4bdd5dcd0661d511423c1",
|
||||
"totalKeys": 5542,
|
||||
"translatedKeys": 5542,
|
||||
"workflow": 1
|
||||
}
|
||||
|
||||
Generated
+1
@@ -3500,6 +3500,7 @@
|
||||
{"cache_key":"b9ce7bf0e4f96bb0440cb23f1247ebcfa25452838b26679992f0f4d42fea3bce","model":"claude-opus-4-8","provider":"anthropic","segment_id":"workboard.eventsLabel","source_path":"ui/src/i18n/locales/nl.ts","src_lang":"en","text":"Card events","text_hash":"7f69e0c8c586fe33047ad13effa55237af16f0f651f5d58e377db2d3ede45d94","tgt_lang":"nl","translated":"Kaartgebeurtenissen","updated_at":"2026-07-29T11:16:09.967Z"}
|
||||
{"cache_key":"b9d581edc993bbe8888decbbdfbc33273ef5d619a027a93db1496c3e78ffce46","model":"claude-opus-4-8","provider":"anthropic","segment_id":"dreaming.actions.confirmRepairDescription","source_path":"ui/src/i18n/locales/nl.ts","src_lang":"en","text":"This archives derived dream cache files and rebuilds them from clean inputs. Your dream diary stays untouched.","text_hash":"2589fde250939480a492a5f25e92fb75430cccfcb4aa9da17a4c63c5ea3efb22","tgt_lang":"nl","translated":"Hiermee worden afgeleide dream-cachebestanden gearchiveerd en opnieuw opgebouwd vanuit schone invoer. Je dream-dagboek blijft onaangeroerd.","updated_at":"2026-08-06T05:34:29.802Z"}
|
||||
{"cache_key":"b9efd0417f8e8f4a173192647cee40c7cb339c08962a3c0d39b2d0f4467fe783","model":"claude-opus-4-8","provider":"anthropic","segment_id":"quickSettings.model.thinkingLevels.high","source_path":"ui/src/i18n/locales/nl.ts","src_lang":"en","text":"High","text_hash":"c4ebc6d4a5832cd9415f906ad03661110c705a72381c8b8b145761d02e2dd23a","tgt_lang":"nl","translated":"Hoog","updated_at":"2026-07-06T20:20:02.809Z"}
|
||||
{"cache_key":"b9fcdbd8fe5fc25ed0d266a2e345f6ce72603b5bc84a8aff26581c6441e88ff4","model":"claude-opus-4-8","provider":"anthropic","segment_id":"usage.providerUsage.unavailable","source_path":"ui/src/i18n/locales/nl.ts","src_lang":"en","text":"Provider usage is unavailable; the last request failed. Refresh to retry.","text_hash":"323bff3c40a5317039a7280c6aca7e16830cb2e9002f1b92ded742b831b9e8d3","tgt_lang":"nl","translated":"Providergebruik is niet beschikbaar; het laatste verzoek is mislukt. Vernieuw om opnieuw te proberen.","updated_at":"2026-08-21T01:20:26.068Z"}
|
||||
{"cache_key":"ba1000fabf74222f12be2df9283ba2d9f95e00bf6e79fddb08aedf2ea0af08a5","model":"claude-opus-4-8","provider":"anthropic","segment_id":"chat.composer.overrides.countOne","source_path":"ui/src/i18n/locales/nl.ts","src_lang":"en","text":"{count} session override","text_hash":"7deceba67ce891831527e87d9f417f2505da30d50a046d773d238f5f33f98c49","tgt_lang":"nl","translated":"{count} sessie-overschrijving","updated_at":"2026-07-29T11:16:09.966Z"}
|
||||
{"cache_key":"ba115f496b72842fd8fd364787c057cbfcf0e992de5f087d5f3944812386beb0","model":"claude-opus-4-8","provider":"anthropic","segment_id":"languages.pl","source_path":"ui/src/i18n/locales/nl.ts","src_lang":"en","text":"Polski (Polish)","text_hash":"750f08518ed1cc9307a2ae14bc8123a7c8917e2a5da12342287752884db4922a","tgt_lang":"nl","translated":"Polski (Pools)","updated_at":"2026-07-29T11:16:09.967Z"}
|
||||
{"cache_key":"ba1b4d113785cde94d8f87f093e1df31ec2010418b046d9319e9129a0443b423","model":"gpt-5.5","provider":"openai","segment_id":"sessionsView.groupByNone","source_path":"ui/src/i18n/locales/nl.ts","src_lang":"en","text":"None","text_hash":"dc937b59892604f5a86ac96936cd7ff09e25f18ae6b758e8014a24c7fa039e91","tgt_lang":"nl","translated":"Geen","updated_at":"2026-07-05T14:40:20.847Z","segment_ids":["secretsStore.noAllowedHosts"]}
|
||||
|
||||
Generated
+4
-4
@@ -1,11 +1,11 @@
|
||||
{
|
||||
"fallbackKeys": [],
|
||||
"generatedAt": "2026-08-20T19:06:00.524Z",
|
||||
"generatedAt": "2026-08-21T01:19:48.480Z",
|
||||
"locale": "pl",
|
||||
"model": "claude-opus-4-8",
|
||||
"provider": "anthropic",
|
||||
"sourceHash": "d5a09f904e7f0b71453ca09014d7a9c9439e9d0da7fd3d880b945d022a50bf6f",
|
||||
"totalKeys": 5541,
|
||||
"translatedKeys": 5541,
|
||||
"sourceHash": "a0ee507ffafb4f82ef4062c8e0fb72eeabbd197eb0b4bdd5dcd0661d511423c1",
|
||||
"totalKeys": 5542,
|
||||
"translatedKeys": 5542,
|
||||
"workflow": 1
|
||||
}
|
||||
|
||||
Generated
+1
@@ -267,6 +267,7 @@
|
||||
{"cache_key":"0db2a84b7b8d013136c0cb2cf2ca623d91836fa98be640949ba3da71e78e0ccc","model":"claude-opus-4-8","provider":"anthropic","segment_id":"chat.queue.steerQueuedMessage","source_path":"ui/src/i18n/locales/pl.ts","src_lang":"en","text":"Steer queued message","text_hash":"293c9fefe1508e31a8b082a5a7b3cd05084f7f537e437842f6303095dee928eb","tgt_lang":"pl","translated":"Steruj wiadomością z kolejki","updated_at":"2026-07-12T06:50:12.480Z"}
|
||||
{"cache_key":"0dc39286daf853a0ca3066cf41004c24cf813632a4dbc40732b6d4eb85504809","model":"gpt-5.5","provider":"openai","segment_id":"quickSettings.appearance.lobsterdexFirstVisited","source_path":"ui/src/i18n/locales/pl.ts","src_lang":"en","text":"{name} · first visited {date}","text_hash":"706999216844c5af2e53509091e7b30b200b93c5da9fbede9e82f8b7e7526441","tgt_lang":"pl","translated":"{name} · pierwsza wizyta {date}","updated_at":"2026-07-10T04:20:42.557Z"}
|
||||
{"cache_key":"0dd16b8afa4ae34ac2fbe9318ba2a35f3abff277cc5bdce8b283cc109bc74ec9","model":"claude-opus-4-8","provider":"anthropic","segment_id":"chat.codeBlock.jsonArrayItem","source_path":"ui/src/i18n/locales/pl.ts","src_lang":"en","text":"Array ({count} item)","text_hash":"8e4d4e18fa836dce3df7ae187c90b1df690b84be14d6d0aa80103c9db8877861","tgt_lang":"pl","translated":"Tablica ({count} element)","updated_at":"2026-08-17T10:25:40.779Z"}
|
||||
{"cache_key":"0dda63685fd1f9352da33814a72c8a1b7880642e257861caf57302c408b4b8ed","model":"claude-opus-4-8","provider":"anthropic","segment_id":"usage.providerUsage.unavailable","source_path":"ui/src/i18n/locales/pl.ts","src_lang":"en","text":"Provider usage is unavailable; the last request failed. Refresh to retry.","text_hash":"323bff3c40a5317039a7280c6aca7e16830cb2e9002f1b92ded742b831b9e8d3","tgt_lang":"pl","translated":"Użycie dostawcy jest niedostępne; ostatnie żądanie nie powiodło się. Odśwież, aby spróbować ponownie.","updated_at":"2026-08-21T01:19:48.480Z"}
|
||||
{"cache_key":"0de4dc91597e976da6fa8f8a7308e6ab6c21e5558721bf02ec0717bfb88e2ffa","model":"claude-opus-4-8","provider":"anthropic","segment_id":"memoryPage.overview.schedule.lightDescription","source_path":"ui/src/i18n/locales/pl.ts","src_lang":"en","text":"Sorts fresh short-term notes and stages promising candidates without changing long-term memory.","text_hash":"788ad2b22f46a9a46aa1e3232a970ddfa39946ff9b3b97baad2ed564ba88ce0f","tgt_lang":"pl","translated":"Sortuje świeże notatki krótkoterminowe i przygotowuje obiecujących kandydatów bez zmiany pamięci długoterminowej.","updated_at":"2026-07-29T11:09:50.883Z"}
|
||||
{"cache_key":"0df93af8a88464602b79b1314a329b990e1759f9c82924ee331f949ba9e1ccd2","model":"claude-opus-4-8","provider":"anthropic","segment_id":"modelProviders.notes.addProvider","source_path":"ui/src/i18n/locales/pl.ts","src_lang":"en","text":"Add model provider {provider} from Control UI","text_hash":"761eaf8e2739e40731137b4a12e4816ac1ac192cfecbddbd85dc0e8bc58be7f7","tgt_lang":"pl","translated":"Dodaj dostawcę modeli {provider} z poziomu Control UI","updated_at":"2026-07-29T11:11:50.449Z"}
|
||||
{"cache_key":"0e12088cfa0b69b26dbb72cf7d5443e614fafd36286f9d2de4e5295da2266834","model":"claude-opus-4-8","provider":"anthropic","segment_id":"chat.composer.placeholder","source_path":"ui/src/i18n/locales/pl.ts","src_lang":"en","text":"Message {name}","text_hash":"315ea83d0a2cd04f27a16807b121d9cf206bb783b894cbe6322a640442c86820","tgt_lang":"pl","translated":"Message {name}","updated_at":"2026-07-29T11:11:50.449Z"}
|
||||
|
||||
Generated
+4
-4
@@ -1,11 +1,11 @@
|
||||
{
|
||||
"fallbackKeys": [],
|
||||
"generatedAt": "2026-08-20T18:56:24.164Z",
|
||||
"generatedAt": "2026-08-21T01:16:50.724Z",
|
||||
"locale": "pt-BR",
|
||||
"model": "claude-opus-4-8",
|
||||
"provider": "anthropic",
|
||||
"sourceHash": "d5a09f904e7f0b71453ca09014d7a9c9439e9d0da7fd3d880b945d022a50bf6f",
|
||||
"totalKeys": 5541,
|
||||
"translatedKeys": 5541,
|
||||
"sourceHash": "a0ee507ffafb4f82ef4062c8e0fb72eeabbd197eb0b4bdd5dcd0661d511423c1",
|
||||
"totalKeys": 5542,
|
||||
"translatedKeys": 5542,
|
||||
"workflow": 1
|
||||
}
|
||||
|
||||
Generated
+1
@@ -4223,6 +4223,7 @@
|
||||
{"cache_key":"dec9f5ed458530d80e1e148dcd00db78d624facf9791d94ea58899ab16b69469","model":"claude-opus-4-8","provider":"anthropic","segment_id":"modelSetup.success.openChat","source_path":"ui/src/i18n/locales/pt-BR.ts","src_lang":"en","text":"Start chatting","text_hash":"b010f6d81e5adcb6d12bf845e7aa9d10e3e20267ba2c9fa244b26919a41a9a75","tgt_lang":"pt-BR","translated":"Abrir chat","updated_at":"2026-07-29T10:57:24.690Z"}
|
||||
{"cache_key":"decd6c50c98fbc9ca1abd402de66940ae7d020898e07b96acf0b5e106b3de5ca","model":"claude-opus-4-8","provider":"anthropic","segment_id":"agentTools.profileOff","source_path":"ui/src/i18n/locales/pt-BR.ts","src_lang":"en","text":"Profile Off","text_hash":"5d996a1b9731b141e48d00403bb7faafefdefbba600566f4b83f021360491000","tgt_lang":"pt-BR","translated":"Perfil Desativado","updated_at":"2026-07-12T06:27:29.209Z"}
|
||||
{"cache_key":"ded6e3d7d3158311cb662e26f85c0b48ef769e1e29753346718738495e8354a7","model":"gpt-5.5","provider":"openai","segment_id":"chat.composer.contextUsage.latestRunTokens","source_path":"ui/src/i18n/locales/pt-BR.ts","src_lang":"en","text":"Latest run tokens","text_hash":"969b6403862b70df744bc747c801663034a7837cd04b55973b7ee6c051e2e5ca","tgt_lang":"pt-BR","translated":"Tokens da execução mais recente","updated_at":"2026-07-05T10:15:58.131Z"}
|
||||
{"cache_key":"dedc0c8f990a6f469b5b71681bd1cdd7994fcebb1bcd4b0433d4984fc0e2d7c7","model":"claude-opus-4-8","provider":"anthropic","segment_id":"usage.providerUsage.unavailable","source_path":"ui/src/i18n/locales/pt-BR.ts","src_lang":"en","text":"Provider usage is unavailable; the last request failed. Refresh to retry.","text_hash":"323bff3c40a5317039a7280c6aca7e16830cb2e9002f1b92ded742b831b9e8d3","tgt_lang":"pt-BR","translated":"O uso do provedor está indisponível; a última solicitação falhou. Atualize para tentar novamente.","updated_at":"2026-08-21T01:16:50.724Z"}
|
||||
{"cache_key":"dedf552c460baf8d4a30ddb9c9cc3738a7965610917f5386f62ba0ffd1f1139a","model":"claude-opus-4-8","provider":"anthropic","segment_id":"skillGroups.other","source_path":"ui/src/i18n/locales/pt-BR.ts","src_lang":"en","text":"Other Skills","text_hash":"9f5fa179467e417431376f5445f4bacb1ecb88c7bf93c3426d11d6059dc45879","tgt_lang":"pt-BR","translated":"Outras Skills","updated_at":"2026-07-12T06:27:40.704Z"}
|
||||
{"cache_key":"dee87937a7e121d80273072ad99fa871858b15a634fbcc0903b1c2bd7c1fc5b6","model":"claude-opus-4-8","provider":"anthropic","segment_id":"skillWorkshop.revision.title","source_path":"ui/src/i18n/locales/pt-BR.ts","src_lang":"en","text":"{verb} proposal","text_hash":"4b13b5a6d24bd3d5563d0a85beae9e17320b2a30af9a003104eff68fa2e26494","tgt_lang":"pt-BR","translated":"{verb} proposta","updated_at":"2026-07-12T06:28:23.038Z"}
|
||||
{"cache_key":"deef4733cd3725b19b13ea07006f737fa14fbda1830926bb32197f68c925a8aa","model":"claude-opus-4-8","provider":"anthropic","segment_id":"attention.alerts.modelAuthExpiredQuestion","source_path":"ui/src/i18n/locales/pt-BR.ts","src_lang":"en","text":"These model-provider credentials need attention:\n{facts}\nExplain what expired and how to re-authenticate them.","text_hash":"f47bc2dbb91a97f39263d62e15289e22082e76f3eca96cc1c8ebdc77239cb3d9","tgt_lang":"pt-BR","translated":"Estas credenciais do provedor de modelo precisam de atenção:\n{facts}\nExplique o que expirou e como reautenticá-las.","updated_at":"2026-08-20T18:56:02.853Z"}
|
||||
|
||||
Generated
+4
-4
@@ -1,11 +1,11 @@
|
||||
{
|
||||
"fallbackKeys": [],
|
||||
"generatedAt": "2026-08-20T19:11:53.693Z",
|
||||
"generatedAt": "2026-08-21T01:20:53.037Z",
|
||||
"locale": "ru",
|
||||
"model": "claude-opus-4-8",
|
||||
"provider": "anthropic",
|
||||
"sourceHash": "d5a09f904e7f0b71453ca09014d7a9c9439e9d0da7fd3d880b945d022a50bf6f",
|
||||
"totalKeys": 5541,
|
||||
"translatedKeys": 5541,
|
||||
"sourceHash": "a0ee507ffafb4f82ef4062c8e0fb72eeabbd197eb0b4bdd5dcd0661d511423c1",
|
||||
"totalKeys": 5542,
|
||||
"translatedKeys": 5542,
|
||||
"workflow": 1
|
||||
}
|
||||
|
||||
Generated
+1
@@ -1760,6 +1760,7 @@
|
||||
{"cache_key":"5dd74759febb35c5a6f000e3f0d72ecb541d221755040d3652fa6f75200fca93","model":"claude-opus-4-8","provider":"anthropic","segment_id":"devices.pairing.button","source_path":"ui/src/i18n/locales/ru.ts","src_lang":"en","text":"Pair device","text_hash":"2b1b38ee1489154edee07583c595778e6a7d742e7c8f20210bb3c383a9d2d5c2","tgt_lang":"ru","translated":"Связать устройство","updated_at":"2026-08-17T10:31:05.805Z"}
|
||||
{"cache_key":"5ddc8300905a49dcb00f134258dcf7529f745671bd8ac438af99a3ae6e0d79bd","model":"claude-opus-4-8","provider":"anthropic","segment_id":"quickSettings.security.gatewayAuth","source_path":"ui/src/i18n/locales/ru.ts","src_lang":"en","text":"Gateway auth","text_hash":"593b35c1b027b42b1f14fcd3913017dae726062941e8039a72e3af3399f728df","tgt_lang":"ru","translated":"Аутентификация Gateway","updated_at":"2026-07-12T06:59:45.649Z"}
|
||||
{"cache_key":"5ddebb9ee4dd96351bd764df16d077df0d9a71d1ba9f375239b99fd8dfbb1f24","model":"claude-opus-4-8","provider":"anthropic","segment_id":"pluginsPage.searchPlaceholder","source_path":"ui/src/i18n/locales/ru.ts","src_lang":"en","text":"Search plugins and ClawHub","text_hash":"373cb255fcd72d7b40451ddad12ebb48d6d6cf56adbadd3dc79016346b44fdab","tgt_lang":"ru","translated":"Поиск плагинов","updated_at":"2026-07-29T11:19:04.877Z"}
|
||||
{"cache_key":"5de4c64e7947c87b71c46e2ca2b4da4229175773a5536df7fe811888168e714e","model":"claude-opus-4-8","provider":"anthropic","segment_id":"usage.providerUsage.unavailable","source_path":"ui/src/i18n/locales/ru.ts","src_lang":"en","text":"Provider usage is unavailable; the last request failed. Refresh to retry.","text_hash":"323bff3c40a5317039a7280c6aca7e16830cb2e9002f1b92ded742b831b9e8d3","tgt_lang":"ru","translated":"Данные об использовании провайдера недоступны; последний запрос не удался. Обновите, чтобы повторить попытку.","updated_at":"2026-08-21T01:20:53.037Z"}
|
||||
{"cache_key":"5df2cf046dafc5ad9948fccd91a73139be255713b31346ce4c89210ba733b64c","model":"gpt-5.5","provider":"openai","segment_id":"workboard.viewReview","source_path":"ui/src/i18n/locales/ru.ts","src_lang":"en","text":"Review","text_hash":"aff0766a5290e117b8433c351bae7b7b23bed682b2369bd822d88a647cc58512","tgt_lang":"ru","translated":"Проверка","updated_at":"2026-06-26T21:39:50.999Z","segment_ids":["chat.sidePanel.review"]}
|
||||
{"cache_key":"5e05eedf8f02c0cd9c4b3a843d86c4d769bdb54cee6539412142b6391bd9819a","model":"claude-opus-4-8","provider":"anthropic","segment_id":"skillGroups.installed","source_path":"ui/src/i18n/locales/ru.ts","src_lang":"en","text":"Installed Skills","text_hash":"ed416e3fcb42c129b89f4110a1da28214ff6bcffe33e965d94e9f869511e5b70","tgt_lang":"ru","translated":"Установленные Skills","updated_at":"2026-07-12T07:01:01.353Z"}
|
||||
{"cache_key":"5e089f2ce368bcc1d780d51a1f0873f269c48967eec2d2432da3104739e085ba","model":"gpt-5.5","provider":"openai","segment_id":"sessionsView.autoThreshold","source_path":"ui/src/i18n/locales/ru.ts","src_lang":"en","text":"auto-threshold","text_hash":"1226b481f4c922e35ec4ce19374ef387fc5d7a1fc014bcb0bebd07265b2171d9","tgt_lang":"ru","translated":"автопорог","updated_at":"2026-06-26T21:38:57.762Z"}
|
||||
|
||||
Generated
+4
-4
@@ -1,11 +1,11 @@
|
||||
{
|
||||
"fallbackKeys": [],
|
||||
"generatedAt": "2026-08-20T19:07:52.092Z",
|
||||
"generatedAt": "2026-08-21T01:19:59.742Z",
|
||||
"locale": "th",
|
||||
"model": "claude-opus-4-8",
|
||||
"provider": "anthropic",
|
||||
"sourceHash": "d5a09f904e7f0b71453ca09014d7a9c9439e9d0da7fd3d880b945d022a50bf6f",
|
||||
"totalKeys": 5541,
|
||||
"translatedKeys": 5541,
|
||||
"sourceHash": "a0ee507ffafb4f82ef4062c8e0fb72eeabbd197eb0b4bdd5dcd0661d511423c1",
|
||||
"totalKeys": 5542,
|
||||
"translatedKeys": 5542,
|
||||
"workflow": 1
|
||||
}
|
||||
|
||||
Generated
+1
@@ -2774,6 +2774,7 @@
|
||||
{"cache_key":"9335e6b909126ee2e0f04d48eb293084fdd7cafe17f8a050605a2d17d3d068dd","model":"claude-opus-4-8","provider":"anthropic","segment_id":"sessionsView.actionRequiresAdmin","source_path":"ui/src/i18n/locales/th.ts","src_lang":"en","text":"This action requires operator.admin access.","text_hash":"518b8e1950759a90a1bd23aa2ca3c6476d2278d010e83aff6087f7469050286b","tgt_lang":"th","translated":"การดำเนินการนี้ต้องการสิทธิ์ operator.admin","updated_at":"2026-08-06T05:33:20.133Z"}
|
||||
{"cache_key":"93429dd3d295db856d7a634cf91c74d6c051172917cdb3a54466274158232501","model":"claude-opus-4-8","provider":"anthropic","segment_id":"sessionsView.checkpoint","source_path":"ui/src/i18n/locales/th.ts","src_lang":"en","text":"{count} Checkpoint","text_hash":"68cdc96ca56004e18961730551961cbaddab68733cb335a0c2a3be0f44fe1b2b","tgt_lang":"th","translated":"{count} เช็กพอยต์","updated_at":"2026-07-29T11:14:47.751Z"}
|
||||
{"cache_key":"934c1885c69772d6d26df8de1593d26b4fc54156f9f1b7fef937bc4503d6bef8","model":"claude-opus-4-8","provider":"anthropic","segment_id":"sessionsView.restoreCheckpointConfirm","source_path":"ui/src/i18n/locales/th.ts","src_lang":"en","text":"Restore this session to the selected compacted checkpoint?\n\nThis replaces the current active transcript for the session key.","text_hash":"12bd5ed5f21a830ac5e9abbdaf19149f5afe0f2beeb047eaff8cf20389f23ded","tgt_lang":"th","translated":"กู้คืนเซสชันนี้ไปยัง compacted checkpoint ที่เลือกหรือไม่?\n\nการดำเนินการนี้จะแทนที่บันทึกการสนทนาที่ใช้งานอยู่ปัจจุบันสำหรับ session key","updated_at":"2026-08-10T12:07:12.972Z"}
|
||||
{"cache_key":"934f6cace3d83bad844ed414df67f51fd8a049492b30e7f4446f230a6f3946f6","model":"claude-opus-4-8","provider":"anthropic","segment_id":"usage.providerUsage.unavailable","source_path":"ui/src/i18n/locales/th.ts","src_lang":"en","text":"Provider usage is unavailable; the last request failed. Refresh to retry.","text_hash":"323bff3c40a5317039a7280c6aca7e16830cb2e9002f1b92ded742b831b9e8d3","tgt_lang":"th","translated":"ไม่สามารถแสดงการใช้งานผู้ให้บริการ คำขอล่าสุดล้มเหลว รีเฟรชเพื่อลองใหม่","updated_at":"2026-08-21T01:19:59.742Z"}
|
||||
{"cache_key":"936cd1108c1652644bd78e45d4269e57d1050d54900dc2670d6c6b2aae1ac9d2","model":"claude-opus-4-8","provider":"anthropic","segment_id":"agents.setDefault","source_path":"ui/src/i18n/locales/th.ts","src_lang":"en","text":"Set Default","text_hash":"c365f1cb6d8e84e7476450255ffb4dd9360ed4a895c83b5378238bcc764e39f8","tgt_lang":"th","translated":"Set Default","updated_at":"2026-07-29T11:14:47.751Z"}
|
||||
{"cache_key":"937c2200a085fa3b71fc073a2b70a8a6534869d3b1dbbba9e9e92987bdb2c984","model":"claude-opus-4-8","provider":"anthropic","segment_id":"usage.heatmap.cellTokens","source_path":"ui/src/i18n/locales/th.ts","src_lang":"en","text":"{tokens} tokens","text_hash":"507a17952dbcbb44f1b9ffff34ec5fc71563ca5d60c07c5fa9ab68339e462139","tgt_lang":"th","translated":"{tokens} โทเคน","updated_at":"2026-07-29T11:13:10.014Z"}
|
||||
{"cache_key":"939ad2deb889dfab413326dca0aed18997f9c18ca67718ae6fd3d71706a68599","model":"gpt-5.5","provider":"openai","segment_id":"chat.backgroundTasks.collapse","source_path":"ui/src/i18n/locales/th.ts","src_lang":"en","text":"Collapse background tasks","text_hash":"e793371743248cb45412e03ad89929c99a0018f1c517a1d71f11bdc9c854f357","tgt_lang":"th","translated":"ยุบงานเบื้องหลัง","updated_at":"2026-07-11T00:45:34.273Z"}
|
||||
|
||||
Generated
+4
-4
@@ -1,11 +1,11 @@
|
||||
{
|
||||
"fallbackKeys": [],
|
||||
"generatedAt": "2026-08-20T19:03:40.957Z",
|
||||
"generatedAt": "2026-08-21T01:18:58.164Z",
|
||||
"locale": "tr",
|
||||
"model": "claude-opus-4-8",
|
||||
"provider": "anthropic",
|
||||
"sourceHash": "d5a09f904e7f0b71453ca09014d7a9c9439e9d0da7fd3d880b945d022a50bf6f",
|
||||
"totalKeys": 5541,
|
||||
"translatedKeys": 5541,
|
||||
"sourceHash": "a0ee507ffafb4f82ef4062c8e0fb72eeabbd197eb0b4bdd5dcd0661d511423c1",
|
||||
"totalKeys": 5542,
|
||||
"translatedKeys": 5542,
|
||||
"workflow": 1
|
||||
}
|
||||
|
||||
Generated
+1
@@ -1437,6 +1437,7 @@
|
||||
{"cache_key":"4d847cec4c438bf65a9a3ae05982efa9268dfc59ad6f675723fc4416862edb45","model":"claude-opus-4-8","provider":"anthropic","segment_id":"sessionsView.moveBackToGroups","source_path":"ui/src/i18n/locales/tr.ts","src_lang":"en","text":"Move back to Groups","text_hash":"92565014028ca572d8f4e6c7741b4e93140d76b86b85253aa946c3c5d41f75a6","tgt_lang":"tr","translated":"Gruplara geri taşı","updated_at":"2026-08-17T10:18:10.224Z"}
|
||||
{"cache_key":"4d84e2fe36fc96063cc432348ae4bfae03b374443c834fb46db52228329e6f63","model":"claude-opus-4-8","provider":"anthropic","segment_id":"chat.sidePanel.emptyTitle","source_path":"ui/src/i18n/locales/tr.ts","src_lang":"en","text":"Open a tab","text_hash":"ce873158c03511ced0a4d505bd0f118cb1e7fdd50169aa2fecb0a42d9f728ef7","tgt_lang":"tr","translated":"Bir sekme açın","updated_at":"2026-08-17T10:20:57.499Z"}
|
||||
{"cache_key":"4d9fe01e3798e68dc431ce84cb90427f989d8c3422e5a2a272c3ac81821d0f88","model":"claude-opus-4-8","provider":"anthropic","segment_id":"chat.sessionDiff.revealInFileTree","source_path":"ui/src/i18n/locales/tr.ts","src_lang":"en","text":"Reveal in File Tree","text_hash":"f0cb9bf8fe31f961eecc105588e240281073d4ece08609776a3e5ff69b5111e1","tgt_lang":"tr","translated":"Dosya Ağacında Göster","updated_at":"2026-08-17T10:21:23.367Z"}
|
||||
{"cache_key":"4daebd7062a5464b938b353033e7215c80a44267ff20e16452f7eb095f75b83b","model":"claude-opus-4-8","provider":"anthropic","segment_id":"usage.providerUsage.unavailable","source_path":"ui/src/i18n/locales/tr.ts","src_lang":"en","text":"Provider usage is unavailable; the last request failed. Refresh to retry.","text_hash":"323bff3c40a5317039a7280c6aca7e16830cb2e9002f1b92ded742b831b9e8d3","tgt_lang":"tr","translated":"Sağlayıcı kullanımı mevcut değil; son istek başarısız oldu. Yeniden denemek için yenileyin.","updated_at":"2026-08-21T01:18:58.163Z"}
|
||||
{"cache_key":"4db1526268ed889c949ba2d7fca411243e690d8b413b7f66db743a7cdc2db2b0","model":"claude-opus-4-8","provider":"anthropic","segment_id":"updates.page.automaticUpdates","source_path":"ui/src/i18n/locales/tr.ts","src_lang":"en","text":"Automatic updates","text_hash":"147b1b68c744476973be8ceb0d0e819752458929939743fee1b9085af464d92f","tgt_lang":"tr","translated":"Otomatik güncellemeler","updated_at":"2026-08-10T12:01:47.872Z"}
|
||||
{"cache_key":"4db28095440956d484372acdcf2f3eb3e78427c58d4959c72acbc690017f3832","model":"claude-opus-4-8","provider":"anthropic","segment_id":"cron.runs.deliveryNotRequested","source_path":"ui/src/i18n/locales/tr.ts","src_lang":"en","text":"Not requested","text_hash":"2bb186b55caf8791978bf5137df84ff6bf7e8110db38db6c85c1485679e8e679","tgt_lang":"tr","translated":"Talep edilmedi","updated_at":"2026-07-29T11:07:29.221Z"}
|
||||
{"cache_key":"4db977ac04b60adffe4a997ef985427973c1463daf76bf0e307ffeb147dbd2d7","model":"claude-opus-4-8","provider":"anthropic","segment_id":"configForm.showAdvanced","source_path":"ui/src/i18n/locales/tr.ts","src_lang":"en","text":"Show advanced","text_hash":"8d6bb0f98ef181afc62545e13f6facfde80c95a6725afc5eceb3d1d8ea2ebfc9","tgt_lang":"tr","translated":"Gelişmişi göster","updated_at":"2026-07-22T15:49:35.216Z"}
|
||||
|
||||
Generated
+4
-4
@@ -1,11 +1,11 @@
|
||||
{
|
||||
"fallbackKeys": [],
|
||||
"generatedAt": "2026-08-20T19:05:44.398Z",
|
||||
"generatedAt": "2026-08-21T01:19:30.706Z",
|
||||
"locale": "uk",
|
||||
"model": "claude-opus-4-8",
|
||||
"provider": "anthropic",
|
||||
"sourceHash": "d5a09f904e7f0b71453ca09014d7a9c9439e9d0da7fd3d880b945d022a50bf6f",
|
||||
"totalKeys": 5541,
|
||||
"translatedKeys": 5541,
|
||||
"sourceHash": "a0ee507ffafb4f82ef4062c8e0fb72eeabbd197eb0b4bdd5dcd0661d511423c1",
|
||||
"totalKeys": 5542,
|
||||
"translatedKeys": 5542,
|
||||
"workflow": 1
|
||||
}
|
||||
|
||||
Generated
+1
@@ -4247,6 +4247,7 @@
|
||||
{"cache_key":"de0e76cc20cfa7169a9f691ef9474c21c1729578af580864a88d850c5c4e586b","model":"claude-opus-4-8","provider":"anthropic","segment_id":"pluginsPage.connectorAddedEndpoint","source_path":"ui/src/i18n/locales/uk.ts","src_lang":"en","text":"Added {name}. Update the endpoint and credentials in MCP settings before use.","text_hash":"d6749b024612bd4b38efcde4caedf40a2e047939dc4a0be5434d4b679ba8354b","tgt_lang":"uk","translated":"Додано {name}. Перед використанням оновіть endpoint і облікові дані в налаштуваннях MCP.","updated_at":"2026-07-29T11:11:13.574Z"}
|
||||
{"cache_key":"de3014e01f33494d733ce018ff140bdea65037a7df1d7196a220eb124cb8b384","model":"claude-opus-4-8","provider":"anthropic","segment_id":"common.yes","source_path":"ui/src/i18n/locales/uk.ts","src_lang":"en","text":"Yes","text_hash":"85a39ab345d672ff8ca9b9c6876f3adcacf45ee7c1e2dbd2408fd338bd55e07e","tgt_lang":"uk","translated":"Так","updated_at":"2026-07-29T11:11:13.574Z"}
|
||||
{"cache_key":"de318eb33f1d6562178c834a78fe19cd5bd7e66e4b87b7d251922f32f0b96458","model":"claude-opus-4-8","provider":"anthropic","segment_id":"channels.pairing.approvedNotificationFailedNotice","source_path":"ui/src/i18n/locales/uk.ts","src_lang":"en","text":"DM access approved, but the requester notification could not be delivered.","text_hash":"c9732c25e8f0a79e951f4771ba430e734cbb6efb2667a1778061a55a6b12c16d","tgt_lang":"uk","translated":"Доступ до прямих повідомлень схвалено, але сповіщення запитувачу не вдалося доставити.","updated_at":"2026-07-22T15:52:50.604Z"}
|
||||
{"cache_key":"de4b7cbf1b8a21c4c7e38059427a21395d414e35fe98503baabb74c54cc6f9b7","model":"claude-opus-4-8","provider":"anthropic","segment_id":"usage.providerUsage.unavailable","source_path":"ui/src/i18n/locales/uk.ts","src_lang":"en","text":"Provider usage is unavailable; the last request failed. Refresh to retry.","text_hash":"323bff3c40a5317039a7280c6aca7e16830cb2e9002f1b92ded742b831b9e8d3","tgt_lang":"uk","translated":"Використання провайдера недоступне; останній запит не вдався. Оновіть, щоб повторити спробу.","updated_at":"2026-08-21T01:19:30.706Z"}
|
||||
{"cache_key":"de4d0e922cd60075996882a53728ead36c2a0a65c34b90d3164db3e92c552b9d","model":"claude-opus-4-8","provider":"anthropic","segment_id":"chat.commandResults.compaction.skippedWithReason","source_path":"ui/src/i18n/locales/uk.ts","src_lang":"en","text":"Compaction skipped: {reason}","text_hash":"343c923ccbe08d759ad876169bcb9bc8d73a6c6e03a5aa0b8b99d24aa51e8e5f","tgt_lang":"uk","translated":"Ущільнення пропущено: {reason}","updated_at":"2026-07-29T11:10:04.845Z"}
|
||||
{"cache_key":"de5d315225b96c4b03469e2f260d756bc7650474c81ee59d053c1c6537c3c5fc","model":"claude-opus-4-8","provider":"anthropic","segment_id":"skillsPage.verdict.pending","source_path":"ui/src/i18n/locales/uk.ts","src_lang":"en","text":"Pending","text_hash":"331551b0de4157c9abc7b72b61b96a2a928fd6db3cdf029c1fc44b08ad633aa6","tgt_lang":"uk","translated":"Очікується","updated_at":"2026-07-12T06:47:58.036Z","segment_ids":["chat.sessionSuggestions.state.pending"]}
|
||||
{"cache_key":"de79dadcdd9f8272a8ea0102fe954e703e1995965e124ed011ce287bdf258179","model":"claude-opus-4-8","provider":"anthropic","segment_id":"workboard.badgeLinks","source_path":"ui/src/i18n/locales/uk.ts","src_lang":"en","text":"{count} links","text_hash":"e57a08b791263efb4e5af8bb8bae8286a5432b6ae9642655aaa4c73bc45f691f","tgt_lang":"uk","translated":"{count} посилань","updated_at":"2026-07-29T11:11:13.574Z"}
|
||||
|
||||
Generated
+4
-4
@@ -1,11 +1,11 @@
|
||||
{
|
||||
"fallbackKeys": [],
|
||||
"generatedAt": "2026-08-20T19:10:27.397Z",
|
||||
"generatedAt": "2026-08-21T01:20:21.407Z",
|
||||
"locale": "vi",
|
||||
"model": "claude-opus-4-8",
|
||||
"provider": "anthropic",
|
||||
"sourceHash": "d5a09f904e7f0b71453ca09014d7a9c9439e9d0da7fd3d880b945d022a50bf6f",
|
||||
"totalKeys": 5541,
|
||||
"translatedKeys": 5541,
|
||||
"sourceHash": "a0ee507ffafb4f82ef4062c8e0fb72eeabbd197eb0b4bdd5dcd0661d511423c1",
|
||||
"totalKeys": 5542,
|
||||
"translatedKeys": 5542,
|
||||
"workflow": 1
|
||||
}
|
||||
|
||||
Generated
+1
@@ -1195,6 +1195,7 @@
|
||||
{"cache_key":"3c53ed11b11515f957129a400c0a4ccd1fa24c29975ef69e538c3a5af9184909","model":"claude-opus-4-8","provider":"anthropic","segment_id":"activity.runInspector.panels.unsupported.title","source_path":"ui/src/i18n/locales/vi.ts","src_lang":"en","text":"Run inspection unsupported","text_hash":"d1afa6a5984901c02a09df712affb595456459220c45bb14e215587901aadebc","tgt_lang":"vi","translated":"Không hỗ trợ kiểm tra lần chạy","updated_at":"2026-08-17T10:29:38.839Z"}
|
||||
{"cache_key":"3c5fa2b720dc2e3437e9024759413156ba3c1372d74bf5fc48b335bfbe90f6ad","model":"claude-opus-4-8","provider":"anthropic","segment_id":"devices.pairing.newCode","source_path":"ui/src/i18n/locales/vi.ts","src_lang":"en","text":"New code","text_hash":"3edce074d60711e799f3ebf89c7d2b12069c421558d76340108e13cdc16c6e57","tgt_lang":"vi","translated":"Mã mới","updated_at":"2026-07-29T11:16:20.202Z"}
|
||||
{"cache_key":"3c6f031df8a0271d7ae6bcf674102d21da801a22d46d6617d67ab2b5cf5f1866","model":"claude-opus-4-8","provider":"anthropic","segment_id":"talkPage.model.default","source_path":"ui/src/i18n/locales/vi.ts","src_lang":"en","text":"Provider default","text_hash":"352a25678fb9c8a3bdf12f4c0106a9c4f62f36e2398c1b3a39558935dcdf66cf","tgt_lang":"vi","translated":"Mặc định của nhà cung cấp","updated_at":"2026-07-29T11:14:03.199Z","segment_ids":["talkPage.voice.default"]}
|
||||
{"cache_key":"3c74f410e6791de915cc0af09c9d8c28ec0c9ce26dffc4e26095d06b347915a6","model":"claude-opus-4-8","provider":"anthropic","segment_id":"usage.providerUsage.unavailable","source_path":"ui/src/i18n/locales/vi.ts","src_lang":"en","text":"Provider usage is unavailable; the last request failed. Refresh to retry.","text_hash":"323bff3c40a5317039a7280c6aca7e16830cb2e9002f1b92ded742b831b9e8d3","tgt_lang":"vi","translated":"Không có dữ liệu sử dụng nhà cung cấp; yêu cầu gần nhất đã thất bại. Làm mới để thử lại.","updated_at":"2026-08-21T01:20:21.407Z"}
|
||||
{"cache_key":"3c87ddc5a86b5eec77cf83c22b85c017e6ed0825ca66f028e9b1ce89abb51c0e","model":"claude-opus-4-8","provider":"anthropic","segment_id":"palette.descriptions.verboseMode","source_path":"ui/src/i18n/locales/vi.ts","src_lang":"en","text":"Toggle verbose mode.","text_hash":"b6b4efc3c03e4f99acc1df6ba5e76c49bb41fda420480a9b8a04b948821fbeda","tgt_lang":"vi","translated":"Bật/tắt chế độ chi tiết.","updated_at":"2026-07-12T06:56:17.439Z"}
|
||||
{"cache_key":"3c8b7dcf7f0d88cb5197259082e8bf04580f7226dd0a1c020772fb7e3f48a35c","model":"claude-opus-4-8","provider":"anthropic","segment_id":"activityFeed.unresolvedIdentities","source_path":"ui/src/i18n/locales/vi.ts","src_lang":"en","text":"Unresolved identities","text_hash":"045de5e5004d9e82eacf2368a1efd94ace0d353c5cc5bea9bc9e51f18d0ac574","tgt_lang":"vi","translated":"Danh tính chưa được giải quyết","updated_at":"2026-08-20T19:08:44.792Z"}
|
||||
{"cache_key":"3c94f2a958cf5a49cbdfe89754d3c66dfe32b75d4b65953b31201394d351c25e","model":"claude-opus-4-8","provider":"anthropic","segment_id":"usage.details.expandAll","source_path":"ui/src/i18n/locales/vi.ts","src_lang":"en","text":"Expand All","text_hash":"9f5b023a413a7d0771cc3fb51b103dc0aaaafe8f7b7c88c7258d43e3bc5b243d","tgt_lang":"vi","translated":"Mở rộng tất cả","updated_at":"2026-07-29T11:16:20.202Z","segment_ids":["chat.sessionDiff.expandAll"]}
|
||||
|
||||
Generated
+4
-4
@@ -1,11 +1,11 @@
|
||||
{
|
||||
"fallbackKeys": [],
|
||||
"generatedAt": "2026-08-20T18:56:12.389Z",
|
||||
"generatedAt": "2026-08-21T01:16:37.276Z",
|
||||
"locale": "zh-CN",
|
||||
"model": "claude-opus-4-8",
|
||||
"provider": "anthropic",
|
||||
"sourceHash": "d5a09f904e7f0b71453ca09014d7a9c9439e9d0da7fd3d880b945d022a50bf6f",
|
||||
"totalKeys": 5541,
|
||||
"translatedKeys": 5541,
|
||||
"sourceHash": "a0ee507ffafb4f82ef4062c8e0fb72eeabbd197eb0b4bdd5dcd0661d511423c1",
|
||||
"totalKeys": 5542,
|
||||
"translatedKeys": 5542,
|
||||
"workflow": 1
|
||||
}
|
||||
|
||||
Generated
+1
@@ -2367,6 +2367,7 @@
|
||||
{"cache_key":"7dd2d0df6e1414acb83597d930e658cfbf0ad4f68a6d264a0a146b1720fcd794","model":"claude-opus-4-8","provider":"anthropic","segment_id":"cloudWorkersPage.fields.backendPlaceholder","source_path":"ui/src/i18n/locales/zh-CN.ts","src_lang":"en","text":"hetzner","text_hash":"294aa8d75483b8331e3ba6a7f24aea15202747f36de65197e7bc6194880b2558","tgt_lang":"zh-CN","translated":"hetzner","updated_at":"2026-08-17T10:07:58.177Z"}
|
||||
{"cache_key":"7dd7c3d194b0d35d22b10e4c7794af36a8f5e9024166a3a05995f3c5c68fe0b6","model":"claude-opus-4-8","provider":"anthropic","segment_id":"agents.createdBy","source_path":"ui/src/i18n/locales/zh-CN.ts","src_lang":"en","text":"Created by {id}","text_hash":"8815ab739c68ffc1d9ecfadf2c49d9165e52d8af87398d5b7da69e3928dfe7b0","tgt_lang":"zh-CN","translated":"由 {id} 创建","updated_at":"2026-08-17T10:07:39.167Z"}
|
||||
{"cache_key":"7de7149aa09189e31f4a7ec49bb883f004c01bdea09e93882eb47ad4bf497388","model":"claude-opus-4-8","provider":"anthropic","segment_id":"memoryPage.dreaming.unsupported.description","source_path":"ui/src/i18n/locales/zh-CN.ts","src_lang":"en","text":"The {plugin} plugin owns the memory slot and its config schema has no dreaming section, so these settings cannot be stored. Switch the engine above to edit them.","text_hash":"136d3016394ec6c944c97aa6a872a9b5f706f570288869911a9e1e37f5f4954c","tgt_lang":"zh-CN","translated":"{plugin} 插件占用了记忆槽,且其配置架构没有梦境部分,因此无法存储这些设置。请在“概览”选项卡上切换引擎以进行编辑。","updated_at":"2026-07-28T07:04:09.231Z"}
|
||||
{"cache_key":"7dedbec9dadf8c524f5d665d6dbf4bc402e852f85300184ca476c634d53b1fbf","model":"claude-opus-4-8","provider":"anthropic","segment_id":"usage.providerUsage.unavailable","source_path":"ui/src/i18n/locales/zh-CN.ts","src_lang":"en","text":"Provider usage is unavailable; the last request failed. Refresh to retry.","text_hash":"323bff3c40a5317039a7280c6aca7e16830cb2e9002f1b92ded742b831b9e8d3","tgt_lang":"zh-CN","translated":"无法获取提供方用量;上次请求失败。请刷新以重试。","updated_at":"2026-08-21T01:16:37.276Z"}
|
||||
{"cache_key":"7df991b64f40576d98069f07d87677de06f3757223abf62a50fd36f3cc6000a1","model":"claude-opus-4-8","provider":"anthropic","segment_id":"pluginsPage.policyReviewFindings","source_path":"ui/src/i18n/locales/zh-CN.ts","src_lang":"en","text":"Findings","text_hash":"e171c2ff25b55e5a2d63d081ec3a65e272d11afec9169a03822c970aac37e79e","tgt_lang":"zh-CN","translated":"发现项","updated_at":"2026-07-29T10:55:52.062Z","segment_ids":["skillWorkshop.evaluation.findings"]}
|
||||
{"cache_key":"7e05dbda7b37613f77f7989c680af3744feacc37d206f10b3c53871a855336be","model":"claude-opus-4-8","provider":"anthropic","segment_id":"sessionsView.optionalPlaceholder","source_path":"ui/src/i18n/locales/zh-CN.ts","src_lang":"en","text":"(optional)","text_hash":"0059798b7f7023e4d9e5c4595f7b9ba7ee64f69993ee524824d57e5a48b1228c","tgt_lang":"zh-CN","translated":"(可选)","updated_at":"2026-07-29T10:57:10.307Z"}
|
||||
{"cache_key":"7e080a43495f89f1792d348bb3807289cfe3ab208fe06d089d006efd7bdcfaf2","model":"claude-opus-4-8","provider":"anthropic","segment_id":"channels.nostr.notices.published","source_path":"ui/src/i18n/locales/zh-CN.ts","src_lang":"en","text":"Profile published to relays.","text_hash":"e28447ffc688772e1b203413abe57b23fdda69c033da847c3504894aa62ce9bf","tgt_lang":"zh-CN","translated":"个人资料已发布到中继。","updated_at":"2026-07-29T10:54:36.522Z"}
|
||||
|
||||
Generated
+4
-4
@@ -1,11 +1,11 @@
|
||||
{
|
||||
"fallbackKeys": [],
|
||||
"generatedAt": "2026-08-20T18:56:35.697Z",
|
||||
"generatedAt": "2026-08-21T01:16:34.459Z",
|
||||
"locale": "zh-TW",
|
||||
"model": "claude-opus-4-8",
|
||||
"provider": "anthropic",
|
||||
"sourceHash": "d5a09f904e7f0b71453ca09014d7a9c9439e9d0da7fd3d880b945d022a50bf6f",
|
||||
"totalKeys": 5541,
|
||||
"translatedKeys": 5541,
|
||||
"sourceHash": "a0ee507ffafb4f82ef4062c8e0fb72eeabbd197eb0b4bdd5dcd0661d511423c1",
|
||||
"totalKeys": 5542,
|
||||
"translatedKeys": 5542,
|
||||
"workflow": 1
|
||||
}
|
||||
|
||||
Generated
+1
@@ -724,6 +724,7 @@
|
||||
{"cache_key":"26dc116ed8d2446d2bb38ffb601e6c045044db5ef0023dd0817949f3d01de5a4","model":"claude-opus-4-8","provider":"anthropic","segment_id":"chat.selectors.modelLockedLabel","source_path":"ui/src/i18n/locales/zh-TW.ts","src_lang":"en","text":"Model selection controlled for this session","text_hash":"35c36f002a68f959ef4a333159bd7fb9c112082d8915529889d0be144c553588","tgt_lang":"zh-TW","translated":"此工作階段的模型選擇已受控管","updated_at":"2026-08-10T11:56:58.754Z"}
|
||||
{"cache_key":"26e9b24d3baf9272352e62c5118c7e6e1baf208909cfaf5957ed16a5e22c4cca","model":"claude-opus-4-8","provider":"anthropic","segment_id":"skillWorkshop.today.supportFile","source_path":"ui/src/i18n/locales/zh-TW.ts","src_lang":"en","text":"{count} support file","text_hash":"5faf7ec18071bc4b4073fe761df453253932c51db108939b0d65ae333560bc59","tgt_lang":"zh-TW","translated":"{count} 個支援檔案","updated_at":"2026-07-12T06:29:29.734Z"}
|
||||
{"cache_key":"26ec4d7140a174f6d48ba498a583512f4a66ab869fc6b6df5b3243c7918a61cf","model":"claude-opus-4-8","provider":"anthropic","segment_id":"sessionsView.limit","source_path":"ui/src/i18n/locales/zh-TW.ts","src_lang":"en","text":"Limit","text_hash":"674b0ed54bf7667356c19baaf2ec56d4432d485bf0ebc6d687ad6e50e9611880","tgt_lang":"zh-TW","translated":"限制","updated_at":"2026-07-29T10:57:26.599Z"}
|
||||
{"cache_key":"2708d520192fc95ce5cdb5509d24fabdf2afe9796289e3d68bf4e2eb7585ed2a","model":"claude-opus-4-8","provider":"anthropic","segment_id":"usage.providerUsage.unavailable","source_path":"ui/src/i18n/locales/zh-TW.ts","src_lang":"en","text":"Provider usage is unavailable; the last request failed. Refresh to retry.","text_hash":"323bff3c40a5317039a7280c6aca7e16830cb2e9002f1b92ded742b831b9e8d3","tgt_lang":"zh-TW","translated":"無法取得供應商用量;上次請求失敗。請重新整理再試一次。","updated_at":"2026-08-21T01:16:34.458Z"}
|
||||
{"cache_key":"272d8a4afb92aa3838693ee1214a12ecf190ddb61ffbf4c4a45ed6f9c3ebac6c","model":"claude-opus-4-8","provider":"anthropic","segment_id":"memoryImport.backfill.to","source_path":"ui/src/i18n/locales/zh-TW.ts","src_lang":"en","text":"To","text_hash":"f4b06ef6d3c81436f60a318c81c42f8f7e2d774d45a22f3b9b5f3b6980d28146","tgt_lang":"zh-TW","translated":"至","updated_at":"2026-07-29T10:55:10.181Z"}
|
||||
{"cache_key":"273727bf9ce5bea6dbf7f243432677f42e185ce18303fdd5cf0d3b50c947fe02","model":"claude-opus-4-8","provider":"anthropic","segment_id":"workboard.widget.cardCount","source_path":"ui/src/i18n/locales/zh-TW.ts","src_lang":"en","text":"{count} cards","text_hash":"4b3e5442ebd2f839d45fddf95b2c2a18427dbd6ac06c8b57f9d9e996dcb73607","tgt_lang":"zh-TW","translated":"{count} 張卡片","updated_at":"2026-06-17T14:13:17.815Z","segment_ids":["workboard.viewPresetCount"]}
|
||||
{"cache_key":"274574a888fab2902c5860b74ced2f687ad52305eda55db5366bd980d3b0af76","model":"claude-opus-4-8","provider":"anthropic","segment_id":"updates.page.cliFallback","source_path":"ui/src/i18n/locales/zh-TW.ts","src_lang":"en","text":"CLI fallback","text_hash":"a53edd9705f45a20915d90747ba75d5c2c7d0d94ecc8a81ac63994d0bbeaffe6","tgt_lang":"zh-TW","translated":"CLI 備援","updated_at":"2026-08-18T10:34:26.827Z"}
|
||||
|
||||
@@ -134,6 +134,15 @@ afterEach(async () => {
|
||||
});
|
||||
|
||||
describe("renderChatComposer controls", () => {
|
||||
it("labels the message input independently of its placeholder", () => {
|
||||
const { container } = renderComposer();
|
||||
const textarea = container.querySelector<HTMLTextAreaElement>("textarea");
|
||||
|
||||
expect(textarea?.getAttribute("aria-label")).toBe(
|
||||
t("chat.composer.placeholder", { name: "OpenClaw" }),
|
||||
);
|
||||
});
|
||||
|
||||
it("keeps composing enabled and explains queued delivery while offline", () => {
|
||||
const { container } = renderComposer({
|
||||
offline: true,
|
||||
|
||||
@@ -267,7 +267,10 @@ async function sendQueuedChatMessage(
|
||||
if (isVisible()) {
|
||||
host.chatSendingScopeKey = storedChatOutboxScopeKey(scope);
|
||||
host.chatSending = true;
|
||||
resetToolStream(host);
|
||||
// Steers continue the current run, so its transient commentary and tools keep that ownership.
|
||||
if (prepared.queueMode !== "steer" || !host.chatRunId) {
|
||||
resetToolStream(host);
|
||||
}
|
||||
resetChatScroll(host);
|
||||
setChatError(host, null);
|
||||
reconcileChatRunLifecycle(host, {
|
||||
|
||||
@@ -3908,6 +3908,10 @@ describe("handleSendChat", () => {
|
||||
chatRunId: "run-1",
|
||||
chatDisplayedLeafEntryId: "leaf-active",
|
||||
chatStream: "Working...",
|
||||
chatStreamSegments: [{ text: "Checking the active run", ts: 1, itemId: "active-commentary" }],
|
||||
chatToolMessages: [
|
||||
{ role: "toolResult", toolCallId: "active-tool", content: "still running" },
|
||||
],
|
||||
sessionKey: "agent:main:main",
|
||||
settings: { chatFollowUpMode: "steer" },
|
||||
});
|
||||
@@ -3927,6 +3931,12 @@ describe("handleSendChat", () => {
|
||||
);
|
||||
expect(host.chatRunId).toBe("run-1");
|
||||
expect(host.chatStream).toBe("Working...");
|
||||
expect(host.chatStreamSegments).toEqual([
|
||||
{ text: "Checking the active run", ts: 1, itemId: "active-commentary" },
|
||||
]);
|
||||
expect(host.chatToolMessages).toEqual([
|
||||
{ role: "toolResult", toolCallId: "active-tool", content: "still running" },
|
||||
]);
|
||||
expect(host.chatQueue).toEqual([
|
||||
expect.objectContaining({
|
||||
queueMode: "steer",
|
||||
@@ -3945,11 +3955,15 @@ describe("handleSendChat", () => {
|
||||
"chat.send": { status: "started", runId: "started-run" },
|
||||
},
|
||||
chatMessage: "start through steer mode",
|
||||
chatStreamSegments: [{ text: "stale commentary", ts: 1, itemId: "stale" }],
|
||||
chatToolMessages: [{ role: "toolResult", toolCallId: "stale-tool", content: "stale output" }],
|
||||
});
|
||||
|
||||
await handleSendChat(host, undefined, { followUpMode: "steer" });
|
||||
|
||||
expect(host.chatRunId).toBe("started-run");
|
||||
expect(host.chatStreamSegments).toEqual([]);
|
||||
expect(host.chatToolMessages).toEqual([]);
|
||||
});
|
||||
|
||||
it("sends a fresh mode-bearing row ahead of older outbox reconciliation", async () => {
|
||||
|
||||
@@ -419,6 +419,7 @@ export function renderChatComposerView(context: ChatComposerViewContext) {
|
||||
handleChatAttachmentPaste(event, props);
|
||||
}
|
||||
}}
|
||||
aria-label=${placeholder}
|
||||
placeholder=${placeholder}
|
||||
rows="1"
|
||||
></textarea>
|
||||
|
||||
@@ -310,6 +310,7 @@ function renderNewSessionComposer(options: NewSessionComposerOptions) {
|
||||
rows="1"
|
||||
?disabled=${options.submitting || options.messageLocked}
|
||||
placeholder=${t("newSession.messagePlaceholder")}
|
||||
aria-label=${t("newSession.messagePlaceholder")}
|
||||
.value=${options.message}
|
||||
aria-autocomplete="list"
|
||||
aria-controls=${ifDefined(skillMenuVisible ? skillMenuListboxId : undefined)}
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
import { afterEach, describe, expect, it } from "vitest";
|
||||
import { t } from "../../i18n/index.ts";
|
||||
import type { NewSessionRouteData } from "./location.ts";
|
||||
import "./new-session-page-entry.ts";
|
||||
|
||||
@@ -53,6 +54,13 @@ afterEach(() => {
|
||||
});
|
||||
|
||||
describe("new session draft route ownership", () => {
|
||||
it("labels the message input independently of its placeholder", async () => {
|
||||
const page = await mount(routeData("research"));
|
||||
const textarea = page.querySelector<HTMLTextAreaElement>(".new-session-page__message");
|
||||
|
||||
expect(textarea?.getAttribute("aria-label")).toBe(t("newSession.messagePlaceholder"));
|
||||
});
|
||||
|
||||
it("clears source draft state when destination data is still pending", async () => {
|
||||
const page = await mount(routeData("research"));
|
||||
window.history.replaceState({}, "", "/new?agent=research");
|
||||
|
||||
Reference in New Issue
Block a user