@olares/lares-core 0.15.7 → 0.15.10
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2 -1
- package/brand/identity.js +33 -3
- package/drive/cat.js +62 -0
- package/drive/download.js +3 -3
- package/drive/execute.js +8 -2
- package/drive/files-path.js +33 -0
- package/drive/flowstudio-files.js +87 -0
- package/drive/ls.js +3 -3
- package/drive/paths.js +23 -13
- package/drive/tools.js +4 -2
- package/entrance/surface.js +96 -0
- package/files/app-link.js +64 -0
- package/files/backend-client.js +266 -0
- package/files/deliverables.js +55 -1
- package/files/intake.js +0 -63
- package/files/mention.js +1 -51
- package/files/preview-groups.js +71 -3
- package/files/preview-local.js +69 -0
- package/files/preview-workspace.js +114 -13
- package/files/preview.js +171 -16
- package/files/produced-gate.js +197 -0
- package/files/produced-mentions.js +19 -0
- package/files/published-tools.js +69 -0
- package/files/published-turn-data.js +84 -0
- package/i18n/chat-model.js +5 -5
- package/i18n/mcp.js +83 -0
- package/i18n/mobile.js +96 -2
- package/i18n/preview.js +10 -0
- package/i18n/search.js +13 -7
- package/i18n/skills.js +31 -0
- package/i18n/voice.js +88 -19
- package/larepass/chat.js +9 -0
- package/larepass/host.js +7 -2
- package/larepass/mux.js +210 -2
- package/larepass/process-fold.js +239 -0
- package/larepass/queue.js +44 -0
- package/larepass/rpc.js +50 -3
- package/larepass/runtime.js +215 -83
- package/larepass/session-cache.js +6 -0
- package/larepass/settings.js +15 -7
- package/larepass/transcript.js +49 -11
- package/log/report.js +46 -0
- package/mcp/approval.js +152 -0
- package/mcp/client.js +38 -0
- package/mcp/config.js +139 -0
- package/media/catalog-row.js +244 -0
- package/media/generation.js +707 -0
- package/media/tool.js +92 -0
- package/olares/entrance.js +67 -15
- package/olares/identity.js +13 -136
- package/olares/session-identity.js +12 -12
- package/olares/trusted-host.js +0 -29
- package/package.json +49 -4
- package/router/catalog-cache.d.ts +1 -1
- package/router/catalog-cache.js +25 -14
- package/router/catalog-sync.js +8 -3
- package/router/catalog.d.ts +6 -1
- package/router/catalog.js +18 -2
- package/router/gateway.d.ts +9 -1
- package/router/gateway.js +40 -4
- package/router/gemini-schema.js +125 -0
- package/router/generation-guard.js +82 -0
- package/router/models.d.ts +6 -0
- package/router/models.js +22 -3
- package/router/search.js +10 -2
- package/router/session-model.js +53 -0
- package/router/shim.js +104 -3
- package/router/sref.js +126 -0
- package/router/stt.js +43 -12
- package/router/tts.js +118 -0
- package/search/client.js +5 -3
- package/search/config.js +53 -39
- package/search/menu.js +45 -10
- package/skills/client.js +42 -0
- package/skills/packs.js +40 -0
- package/skills/state.d.ts +22 -0
- package/skills/state.js +142 -0
- package/tools/crypto-uuid.js +3 -6
- package/tools/head-script.js +15 -0
- package/voice/agent.js +50 -0
- package/voice/capture.js +250 -0
- package/voice/client.js +126 -24
- package/voice/config.js +11 -1
- package/voice/duplex.js +44 -0
- package/voice/endpoint.js +57 -0
- package/voice/host/bluetooth-ready.py +1196 -0
- package/voice/host/install-host.sh +102 -0
- package/voice/input.js +4 -0
- package/voice/install.js +146 -0
- package/voice/languages.js +11 -1
- package/voice/link.js +86 -0
- package/voice/pcm.js +100 -0
- package/voice/playback.js +7 -0
- package/voice/problem.js +46 -0
- package/voice/recorder.js +79 -4
- package/voice/script.js +35 -0
- package/voice/service.js +253 -10
- package/voice/session.js +128 -0
- package/voice/speech.js +93 -0
- package/files/preview-cache.js +0 -100
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import { isMediaDeliverablePath } from "./preview-groups.js";
|
|
2
|
+
|
|
3
|
+
export const LARES_PUBLISH_TOOLS = new Set([
|
|
4
|
+
"drive_fetch",
|
|
5
|
+
"ffmpeg_encode",
|
|
6
|
+
"url_fetch",
|
|
7
|
+
"workspace_publish",
|
|
8
|
+
]);
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* Parse tool-call arguments from either the persisted JSON wire shape or the
|
|
12
|
+
* in-process object used while a tool is executing.
|
|
13
|
+
*/
|
|
14
|
+
export function parseToolArguments(raw) {
|
|
15
|
+
if (raw && typeof raw === "object" && !Array.isArray(raw)) return raw;
|
|
16
|
+
if (typeof raw !== "string" || raw.trim() === "") return null;
|
|
17
|
+
try {
|
|
18
|
+
const parsed = JSON.parse(raw);
|
|
19
|
+
return parsed && typeof parsed === "object" && !Array.isArray(parsed) ? parsed : null;
|
|
20
|
+
} catch {
|
|
21
|
+
return null;
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* User-facing path declared by one Lares artifact tool. Research downloads
|
|
27
|
+
* are intentionally excluded; only media fetched into the workspace is a
|
|
28
|
+
* durable deliverable.
|
|
29
|
+
*/
|
|
30
|
+
export function durablePathFromToolCall(name, args) {
|
|
31
|
+
if (!args) return null;
|
|
32
|
+
if (name === "write" || name === "edit") {
|
|
33
|
+
const path = String(args.file_path ?? "").trim().replace(/\\/g, "/");
|
|
34
|
+
return path || null;
|
|
35
|
+
}
|
|
36
|
+
if (name === "workspace_publish") {
|
|
37
|
+
const path = String(args.path ?? "").trim().replace(/\\/g, "/");
|
|
38
|
+
return path || null;
|
|
39
|
+
}
|
|
40
|
+
if (name === "url_fetch" || name === "drive_fetch") {
|
|
41
|
+
const destination = String(args.destination ?? "").trim().replace(/\\/g, "/");
|
|
42
|
+
if (!destination || !isMediaDeliverablePath(destination)) return null;
|
|
43
|
+
return destination;
|
|
44
|
+
}
|
|
45
|
+
if (name === "ffmpeg_encode") {
|
|
46
|
+
const destination = String(args.destination ?? "").trim().replace(/\\/g, "/");
|
|
47
|
+
return destination || null;
|
|
48
|
+
}
|
|
49
|
+
return null;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
/**
|
|
53
|
+
* Every path one successful artifact tool call published. media_generate is
|
|
54
|
+
* the one whose paths come from its result, since the outputs do not exist
|
|
55
|
+
* until the generation finishes.
|
|
56
|
+
*/
|
|
57
|
+
export function publishedPathsFromToolCall(name, args, value) {
|
|
58
|
+
if (name === "media_generate") {
|
|
59
|
+
return Array.isArray(value?.files) ? value.files.filter((path) => typeof path === "string" && path) : [];
|
|
60
|
+
}
|
|
61
|
+
const path = durablePathFromToolCall(name, args);
|
|
62
|
+
return path ? [path] : [];
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
export function toolResultIsError(event) {
|
|
66
|
+
const content = event?.data?.message?.content;
|
|
67
|
+
if (!Array.isArray(content) || content.length === 0) return true;
|
|
68
|
+
return content.some((block) => block?.type === "tool-result" && block.isError === true);
|
|
69
|
+
}
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
import {
|
|
2
|
+
LARES_PUBLISH_TOOLS,
|
|
3
|
+
durablePathFromToolCall,
|
|
4
|
+
parseToolArguments,
|
|
5
|
+
toolResultIsError,
|
|
6
|
+
} from "./published-tools.js";
|
|
7
|
+
|
|
8
|
+
export const LARES_PUBLISHED_KEY = "lares-published";
|
|
9
|
+
|
|
10
|
+
function durableSurfaceResult(event) {
|
|
11
|
+
return event?.type === "tool/result" && event.surfaceOp !== "replace";
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* Replayable projection for artifacts declared by Lares-specific tools.
|
|
16
|
+
*
|
|
17
|
+
* Unlike dsh's first-party deliverables projection, this definition recognizes
|
|
18
|
+
* workspace_publish and the Lares fetch/encode tools. It derives only from
|
|
19
|
+
* persisted events, so sessions created before the dsh 0.1.5 migration regain
|
|
20
|
+
* the same turn-tail previews when history is reopened.
|
|
21
|
+
*/
|
|
22
|
+
export const laresPublishedDefinition = {
|
|
23
|
+
kind: LARES_PUBLISHED_KEY,
|
|
24
|
+
match(event) {
|
|
25
|
+
if (event?.type === "turn/start") {
|
|
26
|
+
return { id: String(event.data.turn), role: "start" };
|
|
27
|
+
}
|
|
28
|
+
if (event?.type === "tool/call" && LARES_PUBLISH_TOOLS.has(event.data.name)) {
|
|
29
|
+
return { id: String(event.data.turn), role: "update" };
|
|
30
|
+
}
|
|
31
|
+
if (durableSurfaceResult(event)) {
|
|
32
|
+
return { id: String(event.data.turn), role: "update" };
|
|
33
|
+
}
|
|
34
|
+
return null;
|
|
35
|
+
},
|
|
36
|
+
start(_context, match) {
|
|
37
|
+
if (match.event.type !== "turn/start") {
|
|
38
|
+
throw new Error("lares-published start requires turn/start");
|
|
39
|
+
}
|
|
40
|
+
return {
|
|
41
|
+
turn: match.event.data.turn,
|
|
42
|
+
calls: new Map(),
|
|
43
|
+
published: [],
|
|
44
|
+
};
|
|
45
|
+
},
|
|
46
|
+
update(context, match) {
|
|
47
|
+
const event = match.event;
|
|
48
|
+
if (event.type === "tool/call") {
|
|
49
|
+
const calls = new Map(context.state.calls);
|
|
50
|
+
calls.set(
|
|
51
|
+
String(event.data.callId),
|
|
52
|
+
durablePathFromToolCall(event.data.name, parseToolArguments(event.data.arguments)),
|
|
53
|
+
);
|
|
54
|
+
return { ...context.state, calls };
|
|
55
|
+
}
|
|
56
|
+
if (event.type !== "tool/result" || toolResultIsError(event)) return context.state;
|
|
57
|
+
const callId = String(event.data?.message?.source?.callId ?? "");
|
|
58
|
+
const path = context.state.calls.get(callId);
|
|
59
|
+
if (!path || context.state.published.some((item) => item.path === path)) {
|
|
60
|
+
return context.state;
|
|
61
|
+
}
|
|
62
|
+
return {
|
|
63
|
+
...context.state,
|
|
64
|
+
published: [...context.state.published, { seq: event.seq, path, callId }],
|
|
65
|
+
};
|
|
66
|
+
},
|
|
67
|
+
buildLocationData(context, scope, previous) {
|
|
68
|
+
if (scope !== "turn" || context.state === undefined) return null;
|
|
69
|
+
if (
|
|
70
|
+
previous?.kind === "turn"
|
|
71
|
+
&& previous.turn === context.state.turn
|
|
72
|
+
&& previous.key === LARES_PUBLISHED_KEY
|
|
73
|
+
&& previous.value.published === context.state.published
|
|
74
|
+
) {
|
|
75
|
+
return previous;
|
|
76
|
+
}
|
|
77
|
+
return {
|
|
78
|
+
kind: "turn",
|
|
79
|
+
turn: context.state.turn,
|
|
80
|
+
key: LARES_PUBLISHED_KEY,
|
|
81
|
+
value: { published: context.state.published },
|
|
82
|
+
};
|
|
83
|
+
},
|
|
84
|
+
};
|
package/i18n/chat-model.js
CHANGED
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
export const ZH = {
|
|
2
2
|
"settings.nav": "模型配置",
|
|
3
3
|
"settings.title": "模型",
|
|
4
|
-
"settings.intro": "
|
|
4
|
+
"settings.intro": "模型由 Olares Router 提供。新会话默认使用所选模型,会话中也可在输入框上方随时切换。",
|
|
5
5
|
"settings.loading": "正在读取模型列表…",
|
|
6
6
|
"settings.refresh": "刷新",
|
|
7
7
|
"settings.refreshing": "刷新中…",
|
|
8
8
|
"settings.router": "Router 控制台",
|
|
9
9
|
"settings.status.ready": "对话可用 · 默认模型 {model}",
|
|
10
|
-
"settings.status.notReady": "
|
|
10
|
+
"settings.status.notReady": "暂无可用对话模型,请在 Olares 模型控制台配置",
|
|
11
11
|
"settings.empty": "Router 暂时没有可用的对话模型。",
|
|
12
12
|
"settings.default": "默认",
|
|
13
13
|
"settings.setDefault": "设为默认",
|
|
@@ -19,16 +19,16 @@ export const ZH = {
|
|
|
19
19
|
};
|
|
20
20
|
|
|
21
21
|
export const EN = {
|
|
22
|
-
"settings.nav": "
|
|
22
|
+
"settings.nav": "Models",
|
|
23
23
|
"settings.title": "Models",
|
|
24
24
|
"settings.intro":
|
|
25
|
-
"Models
|
|
25
|
+
"Models are provided by Olares Router. New sessions use the selected model by default. You can switch models anytime from the menu above the input box.",
|
|
26
26
|
"settings.loading": "Loading models…",
|
|
27
27
|
"settings.refresh": "Refresh",
|
|
28
28
|
"settings.refreshing": "Refreshing…",
|
|
29
29
|
"settings.router": "Router console",
|
|
30
30
|
"settings.status.ready": "Chat ready · default model {model}",
|
|
31
|
-
"settings.status.notReady": "
|
|
31
|
+
"settings.status.notReady": "No chat models available. Configure one in Olares Model Console.",
|
|
32
32
|
"settings.empty": "Router serves no chat model right now.",
|
|
33
33
|
"settings.default": "Default",
|
|
34
34
|
"settings.setDefault": "Set as default",
|
package/i18n/mcp.js
ADDED
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
export const ZH = {
|
|
2
|
+
"settings.nav": "MCP",
|
|
3
|
+
"settings.title": "MCP 服务器",
|
|
4
|
+
"settings.intro": "连接远程或本地 MCP 服务器,将它们提供的工具加入 Lares 会话。",
|
|
5
|
+
"settings.loading": "正在载入 MCP 服务器…",
|
|
6
|
+
"settings.empty": "还没有配置 MCP 服务器。",
|
|
7
|
+
"settings.add": "添加服务器",
|
|
8
|
+
"settings.edit": "编辑",
|
|
9
|
+
"settings.delete": "删除",
|
|
10
|
+
"settings.enable": "启用",
|
|
11
|
+
"settings.disable": "停用",
|
|
12
|
+
"settings.disabled": "已停用",
|
|
13
|
+
"settings.runtimeError": "加载失败:{msg}",
|
|
14
|
+
"settings.loadFailed": "载入失败:{msg}",
|
|
15
|
+
"settings.saveFailed": "保存失败:{msg}",
|
|
16
|
+
"settings.removeFailed": "删除失败:{msg}",
|
|
17
|
+
"settings.cancel": "取消",
|
|
18
|
+
"settings.save": "保存",
|
|
19
|
+
"settings.saving": "正在保存…",
|
|
20
|
+
"settings.back": "返回 MCP 服务器",
|
|
21
|
+
"settings.formTitle.add": "添加 MCP 服务器",
|
|
22
|
+
"settings.formTitle.edit": "编辑 MCP 服务器",
|
|
23
|
+
"settings.formIntro": "填写连接信息,保存后 Lares 会立即连接并加载该服务器的工具。",
|
|
24
|
+
"settings.serverName": "服务器名称",
|
|
25
|
+
"settings.serverNameHint": "工具名前缀:1–32 位字母、数字、下划线或连字符。",
|
|
26
|
+
"settings.transport": "连接方式",
|
|
27
|
+
"settings.transportHint": "远程服务器用 HTTP,本机进程用 stdio。",
|
|
28
|
+
"settings.http": "Streamable HTTP",
|
|
29
|
+
"settings.stdio": "本地命令(stdio)",
|
|
30
|
+
"settings.url": "MCP URL",
|
|
31
|
+
"settings.headers": "请求头",
|
|
32
|
+
"settings.headersHint": "JSON 对象,例如鉴权用的 Authorization。",
|
|
33
|
+
"settings.command": "命令",
|
|
34
|
+
"settings.args": "参数",
|
|
35
|
+
"settings.argsHint": "JSON 数组,例如 [\"-y\", \"@scope/pkg\"]。",
|
|
36
|
+
"settings.env": "环境变量",
|
|
37
|
+
"settings.envHint": "JSON 对象,进程启动时注入。",
|
|
38
|
+
"settings.cwd": "工作目录(可选)",
|
|
39
|
+
"settings.invalidJson": "{field} 不是有效的 JSON",
|
|
40
|
+
"settings.confirmDelete": "确定删除 MCP 服务器“{name}”吗?",
|
|
41
|
+
};
|
|
42
|
+
|
|
43
|
+
export const EN = {
|
|
44
|
+
"settings.nav": "MCP",
|
|
45
|
+
"settings.title": "MCP servers",
|
|
46
|
+
"settings.intro": "Connect remote or local MCP servers and make their tools available in Lares sessions.",
|
|
47
|
+
"settings.loading": "Loading MCP servers…",
|
|
48
|
+
"settings.empty": "No MCP servers configured.",
|
|
49
|
+
"settings.add": "Add server",
|
|
50
|
+
"settings.edit": "Edit",
|
|
51
|
+
"settings.delete": "Delete",
|
|
52
|
+
"settings.enable": "Enable",
|
|
53
|
+
"settings.disable": "Disable",
|
|
54
|
+
"settings.disabled": "Disabled",
|
|
55
|
+
"settings.runtimeError": "Failed to load: {msg}",
|
|
56
|
+
"settings.loadFailed": "Failed to load: {msg}",
|
|
57
|
+
"settings.saveFailed": "Failed to save: {msg}",
|
|
58
|
+
"settings.removeFailed": "Failed to delete: {msg}",
|
|
59
|
+
"settings.cancel": "Cancel",
|
|
60
|
+
"settings.save": "Save",
|
|
61
|
+
"settings.saving": "Saving…",
|
|
62
|
+
"settings.back": "Back to MCP servers",
|
|
63
|
+
"settings.formTitle.add": "Add MCP server",
|
|
64
|
+
"settings.formTitle.edit": "Edit MCP server",
|
|
65
|
+
"settings.formIntro": "Fill in the connection details; Lares connects and loads the server's tools right after saving.",
|
|
66
|
+
"settings.serverName": "Server name",
|
|
67
|
+
"settings.serverNameHint": "Tool name prefix: 1–32 letters, numbers, _ or -.",
|
|
68
|
+
"settings.transport": "Transport",
|
|
69
|
+
"settings.transportHint": "HTTP for remote servers, stdio for local processes.",
|
|
70
|
+
"settings.http": "Streamable HTTP",
|
|
71
|
+
"settings.stdio": "Local command (stdio)",
|
|
72
|
+
"settings.url": "MCP URL",
|
|
73
|
+
"settings.headers": "Headers",
|
|
74
|
+
"settings.headersHint": "JSON object, e.g. an Authorization header.",
|
|
75
|
+
"settings.command": "Command",
|
|
76
|
+
"settings.args": "Arguments",
|
|
77
|
+
"settings.argsHint": "JSON array, e.g. [\"-y\", \"@scope/pkg\"].",
|
|
78
|
+
"settings.env": "Environment variables",
|
|
79
|
+
"settings.envHint": "JSON object injected when the process starts.",
|
|
80
|
+
"settings.cwd": "Working directory (optional)",
|
|
81
|
+
"settings.invalidJson": "{field} is not valid JSON",
|
|
82
|
+
"settings.confirmDelete": "Delete MCP server “{name}”?",
|
|
83
|
+
};
|
package/i18n/mobile.js
CHANGED
|
@@ -11,7 +11,7 @@ export const ZH = {
|
|
|
11
11
|
"probe.retry": "重新探测",
|
|
12
12
|
"probe.entrance": "入口 {origin}",
|
|
13
13
|
"chat.empty": "发一条消息开始对话",
|
|
14
|
-
"chat.placeholder": "
|
|
14
|
+
"chat.placeholder": "发消息",
|
|
15
15
|
"chat.placeholderDesktop": "给智能体发送消息",
|
|
16
16
|
"chat.placeholderNewSession": "描述你想构建的内容",
|
|
17
17
|
"chat.placeholderPlan": "描述要规划的任务",
|
|
@@ -63,6 +63,8 @@ export const ZH = {
|
|
|
63
63
|
"references.directory": "文件夹",
|
|
64
64
|
"references.session": "Session",
|
|
65
65
|
"chat.sending": "正在回复…",
|
|
66
|
+
"chat.deepDiving": "深度求索中",
|
|
67
|
+
"chat.deepDivingFor": "深度求索中,用时 {duration} ···",
|
|
66
68
|
"action.copy": "复制",
|
|
67
69
|
"action.copied": "已复制",
|
|
68
70
|
"action.like": "点赞",
|
|
@@ -73,9 +75,12 @@ export const ZH = {
|
|
|
73
75
|
"composer.removeAttachment": "移除 {name}",
|
|
74
76
|
"composer.previewAttachment": "查看 {name}",
|
|
75
77
|
"composer.voice": "语音输入",
|
|
78
|
+
"composer.holdToTalk": "按住说话",
|
|
79
|
+
"composer.keyboard": "键盘",
|
|
76
80
|
"composer.think": "深度思考",
|
|
77
81
|
"composer.search": "智能搜索",
|
|
78
82
|
"composer.hold": "松开发送",
|
|
83
|
+
"composer.opening": "正在打开麦克风…",
|
|
79
84
|
"composer.searchFailed": "无法切换智能搜索",
|
|
80
85
|
"chat.failed": "发送失败:{error}",
|
|
81
86
|
"chat.openFailed": "打不开会话:{error}",
|
|
@@ -90,16 +95,58 @@ export const ZH = {
|
|
|
90
95
|
"message.retry.delay": "Retry delay: ",
|
|
91
96
|
"message.retry.failure": "Failure reason: ",
|
|
92
97
|
"message.ranFor": "用时 {duration}",
|
|
98
|
+
"message.turnProcess.worked": "已完成",
|
|
99
|
+
"message.turnProcess.took": "已完成,用时 {duration}",
|
|
100
|
+
"message.turnProcess.failed": "处理失败",
|
|
101
|
+
"message.stopped": "已停止",
|
|
102
|
+
"message.turnProcess.separator": " · ",
|
|
103
|
+
"message.stepProcess.thinking": "正在分析请求",
|
|
104
|
+
"message.stepProcess.read": "正在读取文件",
|
|
105
|
+
"message.stepProcess.readImage": "正在读取图片",
|
|
106
|
+
"message.stepProcess.write": "正在写入文件",
|
|
107
|
+
"message.stepProcess.search": "正在搜索代码",
|
|
108
|
+
"message.stepProcess.edit": "正在编辑文件",
|
|
109
|
+
"message.stepProcess.commands": "正在运行命令",
|
|
110
|
+
"message.stepProcess.code": "正在运行代码",
|
|
111
|
+
"message.stepProcess.webSearch": "正在搜索网页",
|
|
112
|
+
"message.stepProcess.webFetch": "正在访问网页",
|
|
113
|
+
"message.stepProcess.subagents": "正在协调子智能体",
|
|
114
|
+
"message.stepProcess.plan": "正在更新计划",
|
|
115
|
+
"message.stepProcess.questions": "等待你的操作",
|
|
116
|
+
"message.stepProcess.tools": "正在调用工具",
|
|
117
|
+
"message.stepProcess.done.thinking": "已完成分析",
|
|
118
|
+
"message.stepProcess.done.read": "已读取文件",
|
|
119
|
+
"message.stepProcess.done.readImage": "已读取图片",
|
|
120
|
+
"message.stepProcess.done.write": "已写入文件",
|
|
121
|
+
"message.stepProcess.done.search": "已搜索代码",
|
|
122
|
+
"message.stepProcess.done.edit": "修改了文件",
|
|
123
|
+
"message.stepProcess.done.commands": "执行了命令",
|
|
124
|
+
"message.stepProcess.done.code": "运行了代码",
|
|
125
|
+
"message.stepProcess.done.webSearch": "已搜索网页",
|
|
126
|
+
"message.stepProcess.done.webFetch": "已访问网页",
|
|
127
|
+
"message.stepProcess.done.subagents": "已协调子智能体",
|
|
128
|
+
"message.stepProcess.done.plan": "更新了计划",
|
|
129
|
+
"message.stepProcess.done.questions": "向用户提出了问题",
|
|
130
|
+
"message.stepProcess.done.tools": "已调用工具",
|
|
131
|
+
"message.stepProcess.joinTwo": "{first}并{second}",
|
|
132
|
+
"message.stepProcess.comma": ",",
|
|
133
|
+
"message.stepProcess.sharedPrefix": "已",
|
|
134
|
+
"message.stepProcess.more": "{title}等",
|
|
93
135
|
"message.ttft": "首 token {seconds}秒",
|
|
94
136
|
"message.tokensPerSecond": "{tps} tok/s",
|
|
95
137
|
"duration.seconds": "{seconds}秒",
|
|
96
138
|
"duration.minutes": "{minutes}分{seconds}秒",
|
|
139
|
+
"duration.secondUnit": "秒",
|
|
140
|
+
"duration.minuteUnit": "分",
|
|
141
|
+
"duration.hourUnit": "小时",
|
|
97
142
|
"clock.md": "{m}月{d}日",
|
|
98
143
|
"clock.ymd": "{y}年{m}月{d}日",
|
|
99
144
|
"bar.history": "历史",
|
|
100
145
|
"bar.menu": "菜单",
|
|
101
146
|
"bar.new": "新对话",
|
|
102
147
|
"bar.newAria": "新对话",
|
|
148
|
+
"bar.speakOn": "关闭语音播报",
|
|
149
|
+
"bar.speakOff": "开启语音播报",
|
|
103
150
|
"history.empty": "还没有其他对话",
|
|
104
151
|
"history.untitled": "新对话",
|
|
105
152
|
"history.loading": "正在加载对话列表…",
|
|
@@ -183,7 +230,7 @@ export const EN = {
|
|
|
183
230
|
"probe.retry": "Probe again",
|
|
184
231
|
"probe.entrance": "Entrance {origin}",
|
|
185
232
|
"chat.empty": "Send a message to start chatting",
|
|
186
|
-
"chat.placeholder": "Message
|
|
233
|
+
"chat.placeholder": "Message",
|
|
187
234
|
"chat.placeholderDesktop": "Send a message to the agent",
|
|
188
235
|
"chat.placeholderNewSession": "Describe what you want to build",
|
|
189
236
|
"chat.placeholderPlan": "Describe the task to plan",
|
|
@@ -234,6 +281,8 @@ export const EN = {
|
|
|
234
281
|
"references.directory": "Folder",
|
|
235
282
|
"references.session": "Session",
|
|
236
283
|
"chat.sending": "Replying…",
|
|
284
|
+
"chat.deepDiving": "Deep diving",
|
|
285
|
+
"chat.deepDivingFor": "Deep diving for {duration} ···",
|
|
237
286
|
"action.copy": "Copy",
|
|
238
287
|
"action.copied": "Copied",
|
|
239
288
|
"action.like": "Like",
|
|
@@ -244,9 +293,12 @@ export const EN = {
|
|
|
244
293
|
"composer.removeAttachment": "Remove {name}",
|
|
245
294
|
"composer.previewAttachment": "View {name}",
|
|
246
295
|
"composer.voice": "Voice input",
|
|
296
|
+
"composer.holdToTalk": "Hold to talk",
|
|
297
|
+
"composer.keyboard": "Keyboard",
|
|
247
298
|
"composer.think": "Deep think",
|
|
248
299
|
"composer.search": "Search",
|
|
249
300
|
"composer.hold": "Release to send",
|
|
301
|
+
"composer.opening": "Opening the microphone…",
|
|
250
302
|
"composer.searchFailed": "Could not toggle search",
|
|
251
303
|
"chat.failed": "Send failed: {error}",
|
|
252
304
|
"chat.openFailed": "Could not open a session: {error}",
|
|
@@ -261,16 +313,58 @@ export const EN = {
|
|
|
261
313
|
"message.retry.delay": "Retry delay: ",
|
|
262
314
|
"message.retry.failure": "Failure reason: ",
|
|
263
315
|
"message.ranFor": "Ran for {duration}",
|
|
316
|
+
"message.turnProcess.worked": "Completed",
|
|
317
|
+
"message.turnProcess.took": "Completed in {duration}",
|
|
318
|
+
"message.turnProcess.failed": "Failed",
|
|
319
|
+
"message.stopped": "Stopped",
|
|
320
|
+
"message.turnProcess.separator": " · ",
|
|
321
|
+
"message.stepProcess.thinking": "Analyzing the request",
|
|
322
|
+
"message.stepProcess.read": "Reading files",
|
|
323
|
+
"message.stepProcess.readImage": "Reading images",
|
|
324
|
+
"message.stepProcess.write": "Writing files",
|
|
325
|
+
"message.stepProcess.search": "Searching code",
|
|
326
|
+
"message.stepProcess.edit": "Editing files",
|
|
327
|
+
"message.stepProcess.commands": "Running commands",
|
|
328
|
+
"message.stepProcess.code": "Running code",
|
|
329
|
+
"message.stepProcess.webSearch": "Searching the web",
|
|
330
|
+
"message.stepProcess.webFetch": "Visiting web pages",
|
|
331
|
+
"message.stepProcess.subagents": "Coordinating subagents",
|
|
332
|
+
"message.stepProcess.plan": "Updating the plan",
|
|
333
|
+
"message.stepProcess.questions": "Waiting for your action",
|
|
334
|
+
"message.stepProcess.tools": "Calling tools",
|
|
335
|
+
"message.stepProcess.done.thinking": "Analysis completed",
|
|
336
|
+
"message.stepProcess.done.read": "Read files",
|
|
337
|
+
"message.stepProcess.done.readImage": "Read images",
|
|
338
|
+
"message.stepProcess.done.write": "Wrote files",
|
|
339
|
+
"message.stepProcess.done.search": "Searched code",
|
|
340
|
+
"message.stepProcess.done.edit": "Edited files",
|
|
341
|
+
"message.stepProcess.done.commands": "Ran commands",
|
|
342
|
+
"message.stepProcess.done.code": "Ran code",
|
|
343
|
+
"message.stepProcess.done.webSearch": "Searched the web",
|
|
344
|
+
"message.stepProcess.done.webFetch": "Visited web pages",
|
|
345
|
+
"message.stepProcess.done.subagents": "Coordinated subagents",
|
|
346
|
+
"message.stepProcess.done.plan": "Updated the plan",
|
|
347
|
+
"message.stepProcess.done.questions": "Asked questions",
|
|
348
|
+
"message.stepProcess.done.tools": "Called tools",
|
|
349
|
+
"message.stepProcess.joinTwo": "{first} and {second}",
|
|
350
|
+
"message.stepProcess.comma": ", ",
|
|
351
|
+
"message.stepProcess.sharedPrefix": "",
|
|
352
|
+
"message.stepProcess.more": "{title}, etc.",
|
|
264
353
|
"message.ttft": "TTFT {seconds}s",
|
|
265
354
|
"message.tokensPerSecond": "{tps} tok/s",
|
|
266
355
|
"duration.seconds": "{seconds}s",
|
|
267
356
|
"duration.minutes": "{minutes}m {seconds}s",
|
|
357
|
+
"duration.secondUnit": "s",
|
|
358
|
+
"duration.minuteUnit": "m ",
|
|
359
|
+
"duration.hourUnit": "h ",
|
|
268
360
|
"clock.md": "{m}/{d}",
|
|
269
361
|
"clock.ymd": "{y}/{m}/{d}",
|
|
270
362
|
"bar.history": "History",
|
|
271
363
|
"bar.menu": "Menu",
|
|
272
364
|
"bar.new": "New chat",
|
|
273
365
|
"bar.newAria": "New chat",
|
|
366
|
+
"bar.speakOn": "Turn off speech playback",
|
|
367
|
+
"bar.speakOff": "Turn on speech playback",
|
|
274
368
|
"history.empty": "No other chats yet",
|
|
275
369
|
"history.untitled": "New chat",
|
|
276
370
|
"history.loading": "Loading chats…",
|
package/i18n/preview.js
CHANGED
|
@@ -7,6 +7,8 @@ export const ZH = {
|
|
|
7
7
|
produced: "产物",
|
|
8
8
|
mediaLoading: "正在准备媒体预览…",
|
|
9
9
|
openInTab: "在标签中打开",
|
|
10
|
+
viewMedia: "查看",
|
|
11
|
+
openInFiles: "在 Files 打开",
|
|
10
12
|
download: "下载",
|
|
11
13
|
close: "关闭 {name}",
|
|
12
14
|
evicted: "已关闭最久未使用的文件 {name}",
|
|
@@ -27,6 +29,9 @@ export const ZH = {
|
|
|
27
29
|
"error.workspace_not_found": "当前会话没有可用工作区",
|
|
28
30
|
"error.workspace_unavailable": "当前工作区不可用",
|
|
29
31
|
"error.file_preview_failed": "文件预览加载失败",
|
|
32
|
+
"error.files_no_credential": "当前浏览器没有可用的 Olares 登录凭证",
|
|
33
|
+
"error.files_unauthenticated": "Olares 登录已失效,请重新登录后重试",
|
|
34
|
+
"error.files_unavailable": "暂时无法访问 Olares Files",
|
|
30
35
|
};
|
|
31
36
|
|
|
32
37
|
export const EN = {
|
|
@@ -38,6 +43,8 @@ export const EN = {
|
|
|
38
43
|
produced: "Produced",
|
|
39
44
|
mediaLoading: "Preparing media preview…",
|
|
40
45
|
openInTab: "Open in tab",
|
|
46
|
+
viewMedia: "View",
|
|
47
|
+
openInFiles: "Open in Files",
|
|
41
48
|
download: "Download",
|
|
42
49
|
close: "Close {name}",
|
|
43
50
|
evicted: "Closed least recently used file {name}",
|
|
@@ -58,4 +65,7 @@ export const EN = {
|
|
|
58
65
|
"error.workspace_not_found": "No workspace is available for this session",
|
|
59
66
|
"error.workspace_unavailable": "The current workspace is unavailable",
|
|
60
67
|
"error.file_preview_failed": "File preview failed to load",
|
|
68
|
+
"error.files_no_credential": "This browser has no usable Olares credential",
|
|
69
|
+
"error.files_unauthenticated": "Your Olares sign-in expired; sign in and try again",
|
|
70
|
+
"error.files_unavailable": "Olares Files is temporarily unavailable",
|
|
61
71
|
};
|
package/i18n/search.js
CHANGED
|
@@ -5,11 +5,14 @@ export const ZH = {
|
|
|
5
5
|
"settings.refreshing": "刷新中…",
|
|
6
6
|
"settings.router": "Router 控制台",
|
|
7
7
|
"settings.loading": "正在读取 Router 搜索服务…",
|
|
8
|
+
"settings.status.router": "网络搜索可用 · 跟随 Router 的默认搜索服务",
|
|
8
9
|
"settings.status.ready": "网络搜索可用 · 默认服务 {model}",
|
|
9
|
-
"settings.status.
|
|
10
|
+
"settings.status.empty": "Router 中还没有可用的搜索服务,请先在 Olares Router 配置一个",
|
|
11
|
+
"settings.status.notReady": "Router 中已找不到 {model},请另选一个搜索服务",
|
|
12
|
+
"settings.status.off": "网络搜索已关闭",
|
|
10
13
|
"settings.default": "默认搜索服务",
|
|
11
|
-
"settings.default.
|
|
12
|
-
"settings.default.
|
|
14
|
+
"settings.default.router": "跟随 Router 默认",
|
|
15
|
+
"settings.default.off": "关闭",
|
|
13
16
|
"settings.loadFailed": "读取 Router 搜索服务失败:{msg}",
|
|
14
17
|
"settings.refreshFailed": "刷新 Router 搜索服务失败:{msg}",
|
|
15
18
|
"settings.saveFailed": "设置默认搜索服务失败:{msg}",
|
|
@@ -17,16 +20,19 @@ export const ZH = {
|
|
|
17
20
|
|
|
18
21
|
export const EN = {
|
|
19
22
|
"settings.title": "Web search",
|
|
20
|
-
"settings.intro": "Use a search service configured in Router without entering its credentials
|
|
23
|
+
"settings.intro": "Use a search service configured in Router without re-entering its credentials.",
|
|
21
24
|
"settings.refresh": "Refresh",
|
|
22
25
|
"settings.refreshing": "Refreshing…",
|
|
23
26
|
"settings.router": "Router console",
|
|
24
27
|
"settings.loading": "Loading Router search services…",
|
|
28
|
+
"settings.status.router": "Web search ready · following Router's default service",
|
|
25
29
|
"settings.status.ready": "Web search ready · default service {model}",
|
|
26
|
-
"settings.status.
|
|
30
|
+
"settings.status.empty": "No search service is available in Router yet; configure one in Olares Router",
|
|
31
|
+
"settings.status.notReady": "Router no longer lists {model}; pick another search service",
|
|
32
|
+
"settings.status.off": "Web search is off",
|
|
27
33
|
"settings.default": "Default search service",
|
|
28
|
-
"settings.default.
|
|
29
|
-
"settings.default.
|
|
34
|
+
"settings.default.router": "Follow Router default",
|
|
35
|
+
"settings.default.off": "Off",
|
|
30
36
|
"settings.loadFailed": "Failed to load Router search services: {msg}",
|
|
31
37
|
"settings.refreshFailed": "Failed to refresh Router search services: {msg}",
|
|
32
38
|
"settings.saveFailed": "Failed to set the default search service: {msg}",
|
package/i18n/skills.js
ADDED
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
export const ZH = {
|
|
2
|
+
"settings.nav": "技能",
|
|
3
|
+
"settings.group.builtin": "系统内置",
|
|
4
|
+
"settings.initializing": "初始化中…",
|
|
5
|
+
"settings.download": "下载",
|
|
6
|
+
"settings.downloading": "下载中…",
|
|
7
|
+
"settings.enable": "打开",
|
|
8
|
+
"settings.disable": "关闭",
|
|
9
|
+
"settings.enabling": "打开中…",
|
|
10
|
+
"settings.disabling": "关闭中…",
|
|
11
|
+
"settings.loadFailed": "读取技能包失败:{msg}",
|
|
12
|
+
"settings.saveFailed": "更新技能包失败:{msg}",
|
|
13
|
+
"pack.ha.title": "Home Assistant",
|
|
14
|
+
"pack.ha.intro": "连接并控制 Home Assistant 中的灯光、空调、自动化和仪表盘。",
|
|
15
|
+
};
|
|
16
|
+
|
|
17
|
+
export const EN = {
|
|
18
|
+
"settings.nav": "Skills",
|
|
19
|
+
"settings.group.builtin": "Built-in",
|
|
20
|
+
"settings.initializing": "Initializing…",
|
|
21
|
+
"settings.download": "Download",
|
|
22
|
+
"settings.downloading": "Downloading…",
|
|
23
|
+
"settings.enable": "Open",
|
|
24
|
+
"settings.disable": "Close",
|
|
25
|
+
"settings.enabling": "Opening…",
|
|
26
|
+
"settings.disabling": "Closing…",
|
|
27
|
+
"settings.loadFailed": "Failed to load skill packs: {msg}",
|
|
28
|
+
"settings.saveFailed": "Failed to update skill packs: {msg}",
|
|
29
|
+
"pack.ha.title": "Home Assistant",
|
|
30
|
+
"pack.ha.intro": "Connect and control lights, climate, automations, and dashboards in Home Assistant.",
|
|
31
|
+
};
|