viveworker 0.4.5 → 0.4.6
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/package.json +1 -1
- package/scripts/a2a-relay-client.mjs +18 -0
- package/scripts/viveworker-bridge.mjs +22 -1
- package/scripts/viveworker.mjs +65 -0
- package/web/app.js +68 -4
- package/web/i18n.js +50 -2
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "viveworker",
|
|
3
|
-
"version": "0.4.
|
|
3
|
+
"version": "0.4.6",
|
|
4
4
|
"description": "Local mobile companion for Codex Desktop and Claude Desktop — approvals, code review, Moltbook drafts, and A2A (Agent-to-Agent) task relay on your LAN.",
|
|
5
5
|
"author": "Yuta Hoshino <hoshino.lireneo@gmail.com>",
|
|
6
6
|
"license": "MIT",
|
|
@@ -29,6 +29,8 @@ const A2A_ENV_FILE = path.join(os.homedir(), ".viveworker", "a2a.env");
|
|
|
29
29
|
|
|
30
30
|
let pollTimer = null;
|
|
31
31
|
let isPolling = false;
|
|
32
|
+
let lastPollOk = false;
|
|
33
|
+
let lastPollAtMs = 0;
|
|
32
34
|
|
|
33
35
|
// ---------------------------------------------------------------------------
|
|
34
36
|
// Registration
|
|
@@ -164,6 +166,17 @@ export function stopRelayPolling() {
|
|
|
164
166
|
console.log("[a2a-relay] Polling stopped");
|
|
165
167
|
}
|
|
166
168
|
|
|
169
|
+
/**
|
|
170
|
+
* Return current relay connection status for the settings UI.
|
|
171
|
+
*/
|
|
172
|
+
export function getRelayStatus() {
|
|
173
|
+
return {
|
|
174
|
+
polling: pollTimer !== null,
|
|
175
|
+
lastPollOk,
|
|
176
|
+
lastPollAtMs,
|
|
177
|
+
};
|
|
178
|
+
}
|
|
179
|
+
|
|
167
180
|
/**
|
|
168
181
|
* Single poll cycle: fetch pending tasks from the relay and ingest them.
|
|
169
182
|
*/
|
|
@@ -186,9 +199,14 @@ async function pollOnce({ config, runtime, state, helpers }) {
|
|
|
186
199
|
if (!res.ok) {
|
|
187
200
|
const text = await res.text().catch(() => "");
|
|
188
201
|
console.error(`[a2a-relay] Poll failed: HTTP ${res.status} ${text.slice(0, 200)}`);
|
|
202
|
+
lastPollOk = false;
|
|
203
|
+
lastPollAtMs = Date.now();
|
|
189
204
|
return;
|
|
190
205
|
}
|
|
191
206
|
|
|
207
|
+
lastPollOk = true;
|
|
208
|
+
lastPollAtMs = Date.now();
|
|
209
|
+
|
|
192
210
|
const data = await res.json();
|
|
193
211
|
const tasks = data.tasks || [];
|
|
194
212
|
|
|
@@ -17,7 +17,7 @@ import { DEFAULT_LOCALE, SUPPORTED_LOCALES, localeDisplayName, normalizeLocale,
|
|
|
17
17
|
import { generatePairingCredentials, shouldRotatePairing, upsertEnvText } from "./lib/pairing.mjs";
|
|
18
18
|
import { renderMarkdownHtml } from "./lib/markdown-render.mjs";
|
|
19
19
|
import { buildAgentCard, handleA2ARequest, resolveA2ATaskDecision, completeA2ATask, failA2ATask } from "./a2a-handler.mjs";
|
|
20
|
-
import { registerWithRelay, startRelayPolling, stopRelayPolling, postRelayResult } from "./a2a-relay-client.mjs";
|
|
20
|
+
import { registerWithRelay, startRelayPolling, stopRelayPolling, postRelayResult, getRelayStatus } from "./a2a-relay-client.mjs";
|
|
21
21
|
|
|
22
22
|
const __filename = fileURLToPath(import.meta.url);
|
|
23
23
|
const __dirname = path.dirname(__filename);
|
|
@@ -11128,6 +11128,27 @@ function createNativeApprovalServer({ config, runtime, state }) {
|
|
|
11128
11128
|
}
|
|
11129
11129
|
}
|
|
11130
11130
|
|
|
11131
|
+
// A2A relay status for the settings UI.
|
|
11132
|
+
if (url.pathname === "/api/a2a/relay-status" && req.method === "GET") {
|
|
11133
|
+
const session = requireApiSession(req, res, config, state);
|
|
11134
|
+
if (!session) return;
|
|
11135
|
+
const relayEnabled = Boolean(config.a2aRelayUrl && config.a2aRelayUserId);
|
|
11136
|
+
if (!relayEnabled) {
|
|
11137
|
+
return writeJson(res, 200, { enabled: false });
|
|
11138
|
+
}
|
|
11139
|
+
const relay = getRelayStatus();
|
|
11140
|
+
return writeJson(res, 200, {
|
|
11141
|
+
enabled: true,
|
|
11142
|
+
connected: relay.polling && relay.lastPollOk,
|
|
11143
|
+
polling: relay.polling,
|
|
11144
|
+
lastPollOk: relay.lastPollOk,
|
|
11145
|
+
lastPollAtMs: relay.lastPollAtMs,
|
|
11146
|
+
userId: config.a2aRelayUserId,
|
|
11147
|
+
relayUrl: config.a2aRelayUrl,
|
|
11148
|
+
apiKeyConfigured: Boolean(config.a2aApiKey),
|
|
11149
|
+
});
|
|
11150
|
+
}
|
|
11151
|
+
|
|
11131
11152
|
// Activity summary for compose (original post) drafting.
|
|
11132
11153
|
// Supports ?slot=morning|noon|evening and ?date=YYYY-MM-DD for
|
|
11133
11154
|
// time-slot-based compose. Defaults to full-day today.
|
package/scripts/viveworker.mjs
CHANGED
|
@@ -82,6 +82,9 @@ async function main(cliOptions) {
|
|
|
82
82
|
case "doctor":
|
|
83
83
|
await runDoctor(cliOptions);
|
|
84
84
|
return;
|
|
85
|
+
case "update":
|
|
86
|
+
await runUpdate(cliOptions);
|
|
87
|
+
return;
|
|
85
88
|
case "help":
|
|
86
89
|
default:
|
|
87
90
|
printHelp();
|
|
@@ -846,6 +849,67 @@ async function runDoctor(cliOptions) {
|
|
|
846
849
|
}
|
|
847
850
|
}
|
|
848
851
|
|
|
852
|
+
async function runUpdate(cliOptions) {
|
|
853
|
+
const locale = await resolveCliLocale(cliOptions);
|
|
854
|
+
const progress = createCliProgressReporter(locale);
|
|
855
|
+
|
|
856
|
+
// 1. Check current vs latest version
|
|
857
|
+
progress.update("cli.update.progress.checkVersion");
|
|
858
|
+
const pkg = JSON.parse(await fs.readFile(path.join(packageRoot, "package.json"), "utf8"));
|
|
859
|
+
const currentVersion = pkg.version;
|
|
860
|
+
const { stdout: latestRaw } = await execCommand(["npm", "view", "viveworker", "version"], { ignoreError: true });
|
|
861
|
+
const latestVersion = (latestRaw || "").trim();
|
|
862
|
+
|
|
863
|
+
if (!latestVersion) {
|
|
864
|
+
progress.done("cli.update.checkFailed");
|
|
865
|
+
return;
|
|
866
|
+
}
|
|
867
|
+
|
|
868
|
+
if (currentVersion === latestVersion) {
|
|
869
|
+
progress.done("cli.update.alreadyLatest", { version: currentVersion });
|
|
870
|
+
return;
|
|
871
|
+
}
|
|
872
|
+
|
|
873
|
+
console.log(t(locale, "cli.update.versionInfo", { current: currentVersion, latest: latestVersion }));
|
|
874
|
+
|
|
875
|
+
// 2. Clear npx cache and re-fetch
|
|
876
|
+
progress.update("cli.update.progress.install");
|
|
877
|
+
const npxCacheResult = await execCommand(["npx", "--yes", "viveworker@latest", "--version"], { ignoreError: true });
|
|
878
|
+
if (!npxCacheResult.ok) {
|
|
879
|
+
// Fallback: try global install
|
|
880
|
+
await execCommand(["npm", "install", "-g", "viveworker@latest"], { ignoreError: true });
|
|
881
|
+
}
|
|
882
|
+
|
|
883
|
+
// 3. Restart bridge
|
|
884
|
+
const launchAgentPath = resolvePath(cliOptions.launchAgentPath || defaultLaunchAgentPath);
|
|
885
|
+
if (await fileExists(launchAgentPath)) {
|
|
886
|
+
progress.update("cli.update.progress.restartBridge");
|
|
887
|
+
await execCommand(["launchctl", "bootout", `gui/${process.getuid()}`, launchAgentPath], { ignoreError: true });
|
|
888
|
+
await execCommand(["launchctl", "bootstrap", `gui/${process.getuid()}`, launchAgentPath], { ignoreError: true });
|
|
889
|
+
await execCommand(["launchctl", "kickstart", "-k", `gui/${process.getuid()}/${defaultLabel}`], { ignoreError: true });
|
|
890
|
+
}
|
|
891
|
+
|
|
892
|
+
// 4. Restart moltbook-watcher if present
|
|
893
|
+
const watcherLabel = "com.viveworker.moltbook-watcher";
|
|
894
|
+
const watcherPlistPath = path.join(os.homedir(), "Library", "LaunchAgents", `${watcherLabel}.plist`);
|
|
895
|
+
if (await fileExists(watcherPlistPath)) {
|
|
896
|
+
progress.update("cli.update.progress.restartWatcher");
|
|
897
|
+
await execCommand(["launchctl", "bootout", `gui/${process.getuid()}`, watcherPlistPath], { ignoreError: true });
|
|
898
|
+
await execCommand(["launchctl", "bootstrap", `gui/${process.getuid()}`, watcherPlistPath], { ignoreError: true });
|
|
899
|
+
}
|
|
900
|
+
|
|
901
|
+
// 5. Restart moltbook-scout if present
|
|
902
|
+
const scoutLabel = "com.viveworker.moltbook-scout";
|
|
903
|
+
const scoutPlistPath = path.join(os.homedir(), "Library", "LaunchAgents", `${scoutLabel}.plist`);
|
|
904
|
+
if (await fileExists(scoutPlistPath)) {
|
|
905
|
+
progress.update("cli.update.progress.restartScout");
|
|
906
|
+
await execCommand(["launchctl", "bootout", `gui/${process.getuid()}`, scoutPlistPath], { ignoreError: true });
|
|
907
|
+
await execCommand(["launchctl", "bootstrap", `gui/${process.getuid()}`, scoutPlistPath], { ignoreError: true });
|
|
908
|
+
}
|
|
909
|
+
|
|
910
|
+
progress.done("cli.update.done", { version: latestVersion });
|
|
911
|
+
}
|
|
912
|
+
|
|
849
913
|
function parseArgs(argv) {
|
|
850
914
|
const parsed = {
|
|
851
915
|
command: "help",
|
|
@@ -1019,6 +1083,7 @@ ${t(locale, "cli.help.commands")}
|
|
|
1019
1083
|
${t(locale, "cli.help.stop")}
|
|
1020
1084
|
${t(locale, "cli.help.status")}
|
|
1021
1085
|
${t(locale, "cli.help.doctor")}
|
|
1086
|
+
${t(locale, "cli.help.update")}
|
|
1022
1087
|
|
|
1023
1088
|
${t(locale, "cli.help.commonOptions")}
|
|
1024
1089
|
--port <n>
|
package/web/app.js
CHANGED
|
@@ -48,6 +48,7 @@ const state = {
|
|
|
48
48
|
pairNotice: "",
|
|
49
49
|
pushStatus: null,
|
|
50
50
|
moltbookScoutStatus: null,
|
|
51
|
+
a2aRelayStatus: null,
|
|
51
52
|
pushNotice: "",
|
|
52
53
|
pushError: "",
|
|
53
54
|
deviceNotice: "",
|
|
@@ -214,6 +215,7 @@ async function refreshAuthenticatedState() {
|
|
|
214
215
|
await refreshDevices();
|
|
215
216
|
await refreshPushStatus();
|
|
216
217
|
await fetchMoltbookScoutStatus();
|
|
218
|
+
await fetchA2aRelayStatus();
|
|
217
219
|
ensureCurrentSelection();
|
|
218
220
|
}
|
|
219
221
|
|
|
@@ -331,6 +333,18 @@ async function fetchMoltbookScoutStatus() {
|
|
|
331
333
|
}
|
|
332
334
|
}
|
|
333
335
|
|
|
336
|
+
async function fetchA2aRelayStatus() {
|
|
337
|
+
if (!state.session?.a2aRelayEnabled) {
|
|
338
|
+
state.a2aRelayStatus = null;
|
|
339
|
+
return;
|
|
340
|
+
}
|
|
341
|
+
try {
|
|
342
|
+
state.a2aRelayStatus = await apiGet("/api/a2a/relay-status");
|
|
343
|
+
} catch {
|
|
344
|
+
state.a2aRelayStatus = null;
|
|
345
|
+
}
|
|
346
|
+
}
|
|
347
|
+
|
|
334
348
|
async function getClientPushState() {
|
|
335
349
|
const registration = state.serviceWorkerRegistration || (await navigator.serviceWorker?.ready.catch(() => null));
|
|
336
350
|
if (registration) {
|
|
@@ -2754,6 +2768,7 @@ function buildSettingsContext() {
|
|
|
2754
2768
|
serverEnabled,
|
|
2755
2769
|
}),
|
|
2756
2770
|
moltbookScout: state.moltbookScoutStatus,
|
|
2771
|
+
a2aRelay: state.a2aRelayStatus,
|
|
2757
2772
|
};
|
|
2758
2773
|
}
|
|
2759
2774
|
|
|
@@ -2907,6 +2922,13 @@ function settingsPageMeta(page) {
|
|
|
2907
2922
|
description: L("settings.moltbook.copy"),
|
|
2908
2923
|
icon: "item",
|
|
2909
2924
|
};
|
|
2925
|
+
case "a2aRelay":
|
|
2926
|
+
return {
|
|
2927
|
+
id: "a2aRelay",
|
|
2928
|
+
title: L("settings.a2aRelay.title"),
|
|
2929
|
+
description: L("settings.a2aRelay.copy"),
|
|
2930
|
+
icon: "link",
|
|
2931
|
+
};
|
|
2910
2932
|
default:
|
|
2911
2933
|
return settingsPageMeta("notifications");
|
|
2912
2934
|
}
|
|
@@ -2976,15 +2998,22 @@ function renderSettingsRoot(context, { mobile }) {
|
|
|
2976
2998
|
`
|
|
2977
2999
|
}
|
|
2978
3000
|
${renderSettingsGroup(L("settings.group.general"), generalRows)}
|
|
2979
|
-
${state.session?.moltbookEnabled ? renderSettingsGroup(L("
|
|
2980
|
-
renderSettingsNavRow({
|
|
3001
|
+
${(state.session?.moltbookEnabled || state.session?.a2aRelayEnabled) ? renderSettingsGroup(L("settings.group.integrations"), [
|
|
3002
|
+
state.session?.moltbookEnabled ? renderSettingsNavRow({
|
|
2981
3003
|
page: "moltbook",
|
|
2982
3004
|
icon: "item",
|
|
2983
3005
|
title: L("settings.moltbook.title"),
|
|
2984
3006
|
subtitle: L("settings.moltbook.subtitle"),
|
|
2985
3007
|
value: context.moltbookScout?.enabled ? `${context.moltbookScout.sentToday} / ${context.moltbookScout.maxDaily}` : "",
|
|
2986
|
-
}),
|
|
2987
|
-
|
|
3008
|
+
}) : "",
|
|
3009
|
+
state.session?.a2aRelayEnabled ? renderSettingsNavRow({
|
|
3010
|
+
page: "a2aRelay",
|
|
3011
|
+
icon: "link",
|
|
3012
|
+
title: L("settings.a2aRelay.title"),
|
|
3013
|
+
subtitle: L("settings.a2aRelay.subtitle"),
|
|
3014
|
+
value: context.a2aRelay?.connected ? L("settings.status.connected") : L("settings.a2aRelay.status.disconnected"),
|
|
3015
|
+
}) : "",
|
|
3016
|
+
].filter(Boolean)) : ""}
|
|
2988
3017
|
${renderSettingsGroup(L("settings.pairing.title"), deviceRows)}
|
|
2989
3018
|
${renderSettingsGroup(L("settings.group.advanced"), advancedRows)}
|
|
2990
3019
|
</div>
|
|
@@ -3031,6 +3060,9 @@ function renderSettingsSubpage(context, { mobile }) {
|
|
|
3031
3060
|
case "moltbook":
|
|
3032
3061
|
content = renderSettingsMoltbookPage(context);
|
|
3033
3062
|
break;
|
|
3063
|
+
case "a2aRelay":
|
|
3064
|
+
content = renderSettingsA2aRelayPage(context);
|
|
3065
|
+
break;
|
|
3034
3066
|
default:
|
|
3035
3067
|
content = "";
|
|
3036
3068
|
}
|
|
@@ -3282,6 +3314,38 @@ function renderSettingsMoltbookPage(context) {
|
|
|
3282
3314
|
`;
|
|
3283
3315
|
}
|
|
3284
3316
|
|
|
3317
|
+
function renderSettingsA2aRelayPage(context) {
|
|
3318
|
+
const relay = context.a2aRelay;
|
|
3319
|
+
if (!relay?.enabled) {
|
|
3320
|
+
return `
|
|
3321
|
+
<div class="settings-page">
|
|
3322
|
+
<p class="settings-page-copy muted">${escapeHtml(L("settings.a2aRelay.unavailable"))}</p>
|
|
3323
|
+
</div>
|
|
3324
|
+
`;
|
|
3325
|
+
}
|
|
3326
|
+
const statusLabel = relay.connected
|
|
3327
|
+
? L("settings.status.connected")
|
|
3328
|
+
: relay.polling
|
|
3329
|
+
? L("settings.a2aRelay.status.polling")
|
|
3330
|
+
: L("settings.a2aRelay.status.disconnected");
|
|
3331
|
+
const profileUrl = `${relay.relayUrl}/${relay.userId}`;
|
|
3332
|
+
const userIdLink = `<a href="${escapeHtml(profileUrl)}" target="_blank" rel="noopener">${escapeHtml(relay.userId)}</a>`;
|
|
3333
|
+
const relayHost = (() => { try { return new URL(relay.relayUrl).host; } catch { return relay.relayUrl; } })();
|
|
3334
|
+
return `
|
|
3335
|
+
<div class="settings-page">
|
|
3336
|
+
${renderSettingsGroup("", [
|
|
3337
|
+
renderSettingsInfoRow(L("settings.row.a2aStatus"), statusLabel),
|
|
3338
|
+
renderSettingsInfoRow(L("settings.row.a2aUserId"), userIdLink, { rawValue: true }),
|
|
3339
|
+
renderSettingsInfoRow(L("settings.row.a2aRelay"), relayHost),
|
|
3340
|
+
renderSettingsInfoRow(L("settings.row.a2aApiKey"), relay.apiKeyConfigured ? L("settings.a2aRelay.apiKey.configured") : L("settings.a2aRelay.apiKey.notConfigured")),
|
|
3341
|
+
relay.lastPollAtMs
|
|
3342
|
+
? renderSettingsInfoRow(L("settings.row.a2aLastPoll"), new Date(relay.lastPollAtMs).toLocaleString(state.locale))
|
|
3343
|
+
: "",
|
|
3344
|
+
].filter(Boolean))}
|
|
3345
|
+
</div>
|
|
3346
|
+
`;
|
|
3347
|
+
}
|
|
3348
|
+
|
|
3285
3349
|
function renderSettingsInfoRow(label, value, options = {}) {
|
|
3286
3350
|
const rowClassName = ["settings-info-row", options.rowClassName || ""].filter(Boolean).join(" ");
|
|
3287
3351
|
const valueClassName = ["settings-info-row__value", options.valueClassName || ""].filter(Boolean).join(" ");
|
package/web/i18n.js
CHANGED
|
@@ -373,6 +373,20 @@ const translations = {
|
|
|
373
373
|
"moltbook.draft.greetNoon": "Nice progress! Ready to share your morning work?",
|
|
374
374
|
"moltbook.draft.greetEvening": "Great work today! Let's share what you built.",
|
|
375
375
|
"moltbook.draft.greetFallback": "New post ready for review",
|
|
376
|
+
"settings.group.integrations": "Integrations",
|
|
377
|
+
"settings.a2aRelay.title": "A2A Relay",
|
|
378
|
+
"settings.a2aRelay.subtitle": "Agent-to-Agent relay connection",
|
|
379
|
+
"settings.a2aRelay.copy": "View your A2A relay connection status and configuration.",
|
|
380
|
+
"settings.a2aRelay.unavailable": "A2A Relay is not configured.",
|
|
381
|
+
"settings.a2aRelay.status.disconnected": "Disconnected",
|
|
382
|
+
"settings.a2aRelay.status.polling": "Connecting...",
|
|
383
|
+
"settings.a2aRelay.apiKey.configured": "Configured",
|
|
384
|
+
"settings.a2aRelay.apiKey.notConfigured": "Not configured",
|
|
385
|
+
"settings.row.a2aStatus": "Status",
|
|
386
|
+
"settings.row.a2aUserId": "User ID",
|
|
387
|
+
"settings.row.a2aRelay": "Relay",
|
|
388
|
+
"settings.row.a2aApiKey": "API Key",
|
|
389
|
+
"settings.row.a2aLastPoll": "Last poll",
|
|
376
390
|
"a2a.task.eyebrow": "A2A Task Request",
|
|
377
391
|
"a2a.task.from": "From",
|
|
378
392
|
"a2a.task.instruction": "Task",
|
|
@@ -485,13 +499,23 @@ const translations = {
|
|
|
485
499
|
"server.page.choiceMissing": "Choice input token not found",
|
|
486
500
|
"server.page.approvalHandled": "Approval already handled",
|
|
487
501
|
"server.page.detailMissing": "Completion detail not found",
|
|
488
|
-
"cli.help.usage": "Usage: viveworker <setup|start|stop|status|doctor> [options]",
|
|
502
|
+
"cli.help.usage": "Usage: viveworker <setup|start|stop|status|doctor|update> [options]",
|
|
489
503
|
"cli.help.commands": "Commands:",
|
|
490
504
|
"cli.help.setup": "setup Create config, generate pairing info, register launchd, start the bridge",
|
|
491
505
|
"cli.help.start": "start Start the bridge using the saved config",
|
|
492
506
|
"cli.help.stop": "stop Stop the bridge",
|
|
493
507
|
"cli.help.status": "status Print launchd/background status and health",
|
|
494
508
|
"cli.help.doctor": "doctor Diagnose the local setup",
|
|
509
|
+
"cli.help.update": "update Update to the latest version and restart all services",
|
|
510
|
+
"cli.update.progress.checkVersion": "Checking for updates...",
|
|
511
|
+
"cli.update.progress.install": "Installing latest version...",
|
|
512
|
+
"cli.update.progress.restartBridge": "Restarting bridge...",
|
|
513
|
+
"cli.update.progress.restartWatcher": "Restarting Moltbook watcher...",
|
|
514
|
+
"cli.update.progress.restartScout": "Restarting Moltbook scout...",
|
|
515
|
+
"cli.update.checkFailed": "Could not check the latest version from npm",
|
|
516
|
+
"cli.update.alreadyLatest": "Already up to date (v{version})",
|
|
517
|
+
"cli.update.versionInfo": "Updating v{current} -> v{latest}",
|
|
518
|
+
"cli.update.done": "Updated to v{version} — all services restarted",
|
|
495
519
|
"cli.help.commonOptions": "Common options:",
|
|
496
520
|
"cli.setup.complete": "viveworker setup complete",
|
|
497
521
|
"cli.setup.progress.prepare": "Preparing local viveworker setup...",
|
|
@@ -962,6 +986,20 @@ const translations = {
|
|
|
962
986
|
"moltbook.draft.greetNoon": "午前中お疲れ様でした!進捗をシェアしませんか?",
|
|
963
987
|
"moltbook.draft.greetEvening": "今日もお疲れ様でした!成果をシェアしませんか?",
|
|
964
988
|
"moltbook.draft.greetFallback": "投稿ドラフトができました",
|
|
989
|
+
"settings.group.integrations": "連携サービス",
|
|
990
|
+
"settings.a2aRelay.title": "A2A Relay",
|
|
991
|
+
"settings.a2aRelay.subtitle": "Agent-to-Agent リレー接続",
|
|
992
|
+
"settings.a2aRelay.copy": "A2A リレーの接続状態と設定を確認できます。",
|
|
993
|
+
"settings.a2aRelay.unavailable": "A2A Relay が設定されていません。",
|
|
994
|
+
"settings.a2aRelay.status.disconnected": "切断",
|
|
995
|
+
"settings.a2aRelay.status.polling": "接続中...",
|
|
996
|
+
"settings.a2aRelay.apiKey.configured": "設定済み",
|
|
997
|
+
"settings.a2aRelay.apiKey.notConfigured": "未設定",
|
|
998
|
+
"settings.row.a2aStatus": "ステータス",
|
|
999
|
+
"settings.row.a2aUserId": "ユーザー ID",
|
|
1000
|
+
"settings.row.a2aRelay": "リレー",
|
|
1001
|
+
"settings.row.a2aApiKey": "API キー",
|
|
1002
|
+
"settings.row.a2aLastPoll": "最終ポーリング",
|
|
965
1003
|
"a2a.task.eyebrow": "A2A タスクリクエスト",
|
|
966
1004
|
"a2a.task.from": "送信元",
|
|
967
1005
|
"a2a.task.instruction": "タスク内容",
|
|
@@ -1074,13 +1112,23 @@ const translations = {
|
|
|
1074
1112
|
"server.page.choiceMissing": "選択入力トークンが見つかりません",
|
|
1075
1113
|
"server.page.approvalHandled": "この承認はすでに処理済みです",
|
|
1076
1114
|
"server.page.detailMissing": "完了詳細が見つかりません",
|
|
1077
|
-
"cli.help.usage": "Usage: viveworker <setup|start|stop|status|doctor> [options]",
|
|
1115
|
+
"cli.help.usage": "Usage: viveworker <setup|start|stop|status|doctor|update> [options]",
|
|
1078
1116
|
"cli.help.commands": "Commands:",
|
|
1079
1117
|
"cli.help.setup": "setup 設定を作成し、ペアリング情報を生成し、launchd に登録して bridge を起動します",
|
|
1080
1118
|
"cli.help.start": "start 保存済み設定で bridge を起動します",
|
|
1081
1119
|
"cli.help.stop": "stop bridge を停止します",
|
|
1082
1120
|
"cli.help.status": "status launchd / バックグラウンド状態と health を表示します",
|
|
1083
1121
|
"cli.help.doctor": "doctor ローカル設定を診断します",
|
|
1122
|
+
"cli.help.update": "update 最新バージョンに更新し、全サービスを再起動します",
|
|
1123
|
+
"cli.update.progress.checkVersion": "更新を確認しています...",
|
|
1124
|
+
"cli.update.progress.install": "最新バージョンをインストールしています...",
|
|
1125
|
+
"cli.update.progress.restartBridge": "bridge を再起動しています...",
|
|
1126
|
+
"cli.update.progress.restartWatcher": "Moltbook watcher を再起動しています...",
|
|
1127
|
+
"cli.update.progress.restartScout": "Moltbook scout を再起動しています...",
|
|
1128
|
+
"cli.update.checkFailed": "npm から最新バージョンを確認できませんでした",
|
|
1129
|
+
"cli.update.alreadyLatest": "すでに最新です (v{version})",
|
|
1130
|
+
"cli.update.versionInfo": "v{current} -> v{latest} に更新します",
|
|
1131
|
+
"cli.update.done": "v{version} に更新しました — 全サービスを再起動しました",
|
|
1084
1132
|
"cli.help.commonOptions": "共通オプション:",
|
|
1085
1133
|
"cli.setup.complete": "viveworker の setup が完了しました",
|
|
1086
1134
|
"cli.setup.progress.prepare": "viveworker のローカル設定を準備しています...",
|