viveworker 0.5.5 → 0.7.0-beta.0

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/web/app.css CHANGED
@@ -623,12 +623,15 @@ code {
623
623
  white-space: nowrap;
624
624
  }
625
625
 
626
+ /* When a badge renders an SVG icon instead of a text label (e.g. the
627
+ * password / paid markers on the File Share settings page), tighten the
628
+ * padding and size the icon to match the surrounding line height. The SVG
629
+ * inherits color via currentColor, so the badge's `color` rule drives it. */
626
630
  .settings-compose-badge svg {
627
631
  width: 0.85rem;
628
632
  height: 0.85rem;
629
633
  display: block;
630
634
  }
631
-
632
635
  .settings-compose-badge:has(> svg) {
633
636
  padding: 0.18rem 0.3rem;
634
637
  }
@@ -643,6 +646,13 @@ code {
643
646
  color: rgba(190, 160, 255, 0.92);
644
647
  }
645
648
 
649
+ /* Paid-share marker on the A2A Share settings page. Amber tone echoes the
650
+ * 💰 emoji and the CLOSED BETA banner on the 402 HTML. */
651
+ .settings-compose-badge--paid {
652
+ background: rgba(240, 180, 40, 0.2);
653
+ color: rgba(255, 210, 110, 0.95);
654
+ }
655
+
646
656
  .settings-compose-entry {
647
657
  display: flex;
648
658
  flex-direction: column;
package/web/app.js CHANGED
@@ -3316,7 +3316,7 @@ function renderSettingsDevicePage(context) {
3316
3316
  </div>
3317
3317
  <div class="settings-command-card">
3318
3318
  <span class="settings-command-card__label">${escapeHtml(L("settings.device.addAnother.commandLabel"))}</span>
3319
- <code class="settings-command-card__value">npx viveworker setup --pair</code>
3319
+ <code class="settings-command-card__value">npx viveworker pair</code>
3320
3320
  </div>
3321
3321
  </div>
3322
3322
  </section>
@@ -3619,10 +3619,27 @@ function renderSettingsA2aSharePage(context) {
3619
3619
  const visible = items.slice(0, visibleCount);
3620
3620
  const hasMore = items.length > visibleCount;
3621
3621
  const filesList = visible.map((item) => {
3622
+ // Badges use SVG icons (see renderIcon "lock" / "coin") to match the
3623
+ // rest of the settings UI. `title` drives the hover tooltip;
3624
+ // `aria-label` names the span for screen readers since the SVG itself
3625
+ // is decorative.
3622
3626
  const passwordLabel = L("settings.a2aShare.passwordProtected");
3623
3627
  const lock = item.hasPassword
3624
3628
  ? `<span class="settings-compose-badge settings-compose-badge--reply" role="img" title="${escapeHtml(passwordLabel)}" aria-label="${escapeHtml(passwordLabel)}">${renderIcon("lock")}</span>`
3625
3629
  : "";
3630
+ // Paid-share badge. `price` is atomic USDC (6-decimals) on the item.
3631
+ // Mutually exclusive with hasPassword at upload time, so the two badges
3632
+ // never both render, but the HTML doesn't assume that — it just renders
3633
+ // whichever are set.
3634
+ const paidLabel = item.price
3635
+ ? L("settings.a2aShare.paidShare", {
3636
+ price: formatUsdcAtomic(item.price),
3637
+ network: item.network || "?",
3638
+ })
3639
+ : "";
3640
+ const paid = item.price
3641
+ ? `<span class="settings-compose-badge settings-compose-badge--paid" role="img" title="${escapeHtml(paidLabel)}" aria-label="${escapeHtml(paidLabel)}">${renderIcon("coin")}</span>`
3642
+ : "";
3626
3643
  const label = escapeHtml(item.originalName || item.slug);
3627
3644
  const link = item.url
3628
3645
  ? `<a href="${escapeHtml(item.url)}" target="_blank" rel="noopener">${label}</a>`
@@ -3641,7 +3658,7 @@ function renderSettingsA2aSharePage(context) {
3641
3658
  <span class="settings-icon-entry__body">
3642
3659
  <span class="settings-icon-entry__title-row">
3643
3660
  <span class="settings-compose-entry__title">${link}</span>
3644
- ${lock}
3661
+ ${lock}${paid}
3645
3662
  </span>
3646
3663
  ${meta ? `<span class="settings-compose-entry__meta muted">${meta}</span>` : ""}
3647
3664
  </span>
@@ -3718,6 +3735,24 @@ function formatExpiresIn(ms) {
3718
3735
  return rtf ? rtf.format(hr, "hour") : `in ${hr}h`;
3719
3736
  }
3720
3737
 
3738
+ // USDC has 6 decimals, stored as atomic units in a string (e.g. "100000" ⇒
3739
+ // $0.10). Mirrors formatUsdc() in scripts/share-cli.mjs — kept as a small
3740
+ // standalone helper rather than a shared module since the app bundle has no
3741
+ // build step that pulls from scripts/.
3742
+ function formatUsdcAtomic(atomic) {
3743
+ let n;
3744
+ try {
3745
+ n = BigInt(String(atomic ?? "0"));
3746
+ } catch {
3747
+ return "0.00";
3748
+ }
3749
+ if (n < 0n) n = -n;
3750
+ const whole = n / 1_000_000n;
3751
+ const frac = (n % 1_000_000n).toString().padStart(6, "0").replace(/0+$/u, "");
3752
+ if (!frac) return `${whole}.00`;
3753
+ return `${whole}.${frac.padEnd(2, "0")}`;
3754
+ }
3755
+
3721
3756
  function renderSettingsInfoRow(label, value, options = {}) {
3722
3757
  const rowClassName = ["settings-info-row", options.rowClassName || ""].filter(Boolean).join(" ");
3723
3758
  const valueClassName = ["settings-info-row__value", options.valueClassName || ""].filter(Boolean).join(" ");
@@ -6860,6 +6895,8 @@ function renderIcon(name) {
6860
6895
  return `<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.2" stroke-linecap="round" stroke-linejoin="round"><path d="m6.8 12.5 3.2 3.2 7.2-7.4"/></svg>`;
6861
6896
  case "lock":
6862
6897
  return `<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.9" stroke-linecap="round" stroke-linejoin="round"><rect x="5.5" y="10.5" width="13" height="9" rx="2"/><path d="M8 10.5V7.5a4 4 0 0 1 8 0v3"/></svg>`;
6898
+ case "coin":
6899
+ return `<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="12" r="8.5"/><path d="M12 7v10"/><path d="M14.5 9.3c-.6-.8-1.5-1.3-2.5-1.3-1.4 0-2.5 1-2.5 2.2 0 1.3 1.1 2 2.5 2s2.5.7 2.5 2c0 1.2-1.1 2.2-2.5 2.2-1 0-1.9-.5-2.5-1.3"/></svg>`;
6863
6900
  case "back":
6864
6901
  return `<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="m15 18-6-6 6-6"/></svg>`;
6865
6902
  case "chevron-down":
package/web/i18n.js CHANGED
@@ -333,8 +333,8 @@ const translations = {
333
333
  "settings.device.section.current": "This device",
334
334
  "settings.device.section.other": "Other trusted devices",
335
335
  "settings.device.thisDevice": "This device",
336
- "settings.device.emptyCurrent": "This device is not listed right now.",
337
- "settings.device.emptyOther": "No other trusted devices are active.",
336
+ "settings.device.emptyCurrent": "This device is not in the active trusted-device list right now. Its previous trust may have expired or been revoked. Re-pair it from your Mac with `npx viveworker pair` if needed.",
337
+ "settings.device.emptyOther": "No other trusted devices are active. Expired or revoked devices are hidden here. Re-pair another device from your Mac with `npx viveworker pair` if needed.",
338
338
  "settings.device.addAnother.title": "Add another device",
339
339
  "settings.device.addAnother.heading": "Add a new device or browser",
340
340
  "settings.device.addAnother.copy":
@@ -455,6 +455,7 @@ const translations = {
455
455
  "settings.a2aShare.days": ({ count }) => `${count} ${count === 1 ? "day" : "days"}`,
456
456
  "settings.a2aShare.ratePerHour": ({ count }) => `${count} / hour`,
457
457
  "settings.a2aShare.passwordProtected": "Password protected",
458
+ "settings.a2aShare.paidShare": ({ price, network }) => `Paid — ${price} USDC on ${network}`,
458
459
  "settings.a2aShare.showMore": "{count} more…",
459
460
  "settings.a2aShare.showLess": "Show less",
460
461
  "settings.a2aShare.expired": "Expired",
@@ -585,9 +586,11 @@ const translations = {
585
586
  "server.page.choiceMissing": "Choice input token not found",
586
587
  "server.page.approvalHandled": "Approval already handled",
587
588
  "server.page.detailMissing": "Completion detail not found",
588
- "cli.help.usage": "Usage: viveworker <setup|start|stop|status|doctor|update> [options]",
589
+ "cli.help.usage": "Usage: viveworker <setup|pair|enable|start|stop|status|doctor|update> [options]",
589
590
  "cli.help.commands": "Commands:",
590
- "cli.help.setup": "setup Create config, generate pairing info, register launchd, start the bridge",
591
+ "cli.help.setup": "setup Create config, register launchd, and start the base viveworker bridge",
592
+ "cli.help.pair": "pair Refresh pairing info for another trusted device",
593
+ "cli.help.enable": "enable Enable an optional integration or feature",
591
594
  "cli.help.start": "start Start the bridge using the saved config",
592
595
  "cli.help.stop": "stop Stop the bridge",
593
596
  "cli.help.status": "status Print launchd/background status and health",
@@ -602,7 +605,28 @@ const translations = {
602
605
  "cli.update.alreadyLatest": "Already up to date (v{version})",
603
606
  "cli.update.versionInfo": "Updating v{current} -> v{latest}",
604
607
  "cli.update.done": "Updated to v{version} — all services restarted",
608
+ "cli.update.title": "viveworker updated",
609
+ "cli.update.changedVersion": "Version updated from v{current} to v{latest}",
610
+ "cli.update.changedBridge": "Bridge was restarted",
611
+ "cli.update.changedWatcher": "Moltbook watcher was restarted",
612
+ "cli.update.changedScout": "Moltbook scout was restarted",
613
+ "cli.update.next": "Run `npx viveworker status` if you want to verify the restarted services.",
605
614
  "cli.help.commonOptions": "Common options:",
615
+ "cli.help.featureOptions": "Feature examples:",
616
+ "cli.help.enableClaude": "enable claude [--settings-file <path>]",
617
+ "cli.help.enableA2a": "enable a2a --user-id <id> [--description <text>] [--skills <csv>]",
618
+ "cli.help.enableMoltbook": "enable moltbook --api-key <key> --agent-id <id> [--agent-name <name>] [--no-scout]",
619
+ "cli.help.enableScout": "enable scout [--interval <seconds>] [--harness auto|codex|claude|manual] [--uninstall]",
620
+ "cli.help.doctorFix": "doctor --fix Repair common local issues and restart the bridge",
621
+ "cli.section.ready": "Ready",
622
+ "cli.section.changed": "Changed",
623
+ "cli.section.needsAttention": "Needs attention",
624
+ "cli.section.next": "Next",
625
+ "cli.section.details": "Details",
626
+ "cli.section.pairingLinks": "Pairing links",
627
+ "cli.section.caDownload": "CA download",
628
+ "cli.section.qrPairing": "Pairing QR",
629
+ "cli.section.qrCaDownload": "rootCA.pem download QR",
606
630
  "cli.setup.complete": "viveworker setup complete",
607
631
  "cli.setup.progress.prepare": "Preparing local viveworker setup...",
608
632
  "cli.setup.progress.installCa": "Installing or refreshing the local CA ({stores})...",
@@ -610,6 +634,7 @@ const translations = {
610
634
  "cli.setup.progress.generateCert": "Generating local HTTPS certificate...",
611
635
  "cli.setup.progress.generateVapid": "Generating Web Push keys...",
612
636
  "cli.setup.progress.writeConfig": "Writing config files...",
637
+ "cli.setup.progress.providers": "Checking Codex and Claude integrations...",
613
638
  "cli.setup.progress.launchd": "Registering and starting the launchd service...",
614
639
  "cli.setup.progress.startBridge": "Starting the local bridge...",
615
640
  "cli.setup.progress.health": "Waiting for viveworker to respond...",
@@ -627,6 +652,31 @@ const translations = {
627
652
  "cli.setup.webPushEnabled": "Web Push: enabled (HTTPS)",
628
653
  "cli.setup.webPushDisabled": "Web Push: disabled",
629
654
  "cli.setup.claudeHooksSkipped": "Claude hooks skipped (no ~/.claude directory detected). Install Claude Desktop and re-run `viveworker setup` to enable Claude integration.",
655
+ "cli.setup.providers.title": "Provider setup:",
656
+ "cli.setup.providers.codexReady": "Codex detected: ready (no extra setup needed).",
657
+ "cli.setup.providers.codexNotDetected": "Codex not detected: viveworker is still ready; Codex support will appear when Codex Desktop is installed.",
658
+ "cli.setup.providers.claudeEnabled": "Claude detected: hooks enabled at {path}.",
659
+ "cli.setup.providers.claudeNotDetected": "Claude not detected: run `npx viveworker enable claude` later if you install Claude Desktop.",
660
+ "cli.setup.providers.claudeSkipped": "Claude auto-setup skipped (--no-auto-claude).",
661
+ "cli.setup.providers.claudeFailed": "Claude was detected, but hooks could not be installed automatically: {message}",
662
+ "cli.setup.legacyFeatureFlags": "Legacy setup feature flags are still running for compatibility. Next time, use: {commands}",
663
+ "cli.pair.done": "Pairing refreshed",
664
+ "cli.enable.claude.title": "Claude enabled",
665
+ "cli.enable.claude.changed": "Hooks installed at {path}",
666
+ "cli.enable.claude.next": "Open Claude Desktop and trigger one prompt to confirm the hooks are active.",
667
+ "cli.enable.moltbook.title": "Moltbook enabled",
668
+ "cli.enable.moltbook.watcher": "Watcher installed at {path}",
669
+ "cli.enable.moltbook.env": "Environment saved at {path}",
670
+ "cli.enable.moltbook.scout": "Auto-scout installed on a {interval}s interval",
671
+ "cli.enable.moltbook.watcherOnly": "Watcher-only mode enabled (auto-scout is off)",
672
+ "cli.enable.moltbook.personaTip": "No persona file was found. Run `npx viveworker moltbook persona init` to improve draft quality.",
673
+ "cli.enable.moltbook.next": "Open Settings > Moltbook in the phone app and confirm that watcher status, quota, and drafts appear.",
674
+ "cli.enable.scout.title": "Moltbook scout enabled",
675
+ "cli.enable.scout.removed": "Moltbook scout removed",
676
+ "cli.enable.scout.installed": "Scout schedule installed on a {interval}s interval",
677
+ "cli.enable.scout.harness": "Draft harness: {path}",
678
+ "cli.enable.scout.manualHarness": "Draft harness is in manual mode until Codex CLI or Claude Code CLI is installed.",
679
+ "cli.enable.scout.next": "Watch the next scout cycle in the phone app, or tune it later with `npx viveworker enable scout --interval ...`.",
630
680
  "cli.setup.completePending": "viveworker setup finished, but health has not responded yet.",
631
681
  "cli.setup.caFlow.title": "Before opening viveworker on your device, install and trust the local root certificate if needed:",
632
682
  "cli.setup.caFlow.step1": "1. Open the CA download URL or scan the QR code below on your device.",
@@ -659,7 +709,7 @@ const translations = {
659
709
  "cli.setup.error.mkcertInstallPermission":
660
710
  "Homebrew is installed, but its prefix is not writable by your current user, so viveworker could not auto-install mkcert.",
661
711
  "cli.setup.error.mkcertInstallNext":
662
- "Fix your Homebrew permissions, then rerun `npx viveworker setup --install-mkcert`, or install mkcert manually first.",
712
+ "Fix your Homebrew permissions, then rerun `npx viveworker setup`, or install mkcert manually first.",
663
713
  "cli.setup.error.mkcertInstallExample": "Example: brew install mkcert && mkcert -install",
664
714
  "cli.start.progress.prepare": "Loading saved viveworker config...",
665
715
  "cli.start.progress.refreshPairing": "Refreshing expired pairing credentials...",
@@ -671,6 +721,14 @@ const translations = {
671
721
  "cli.start.launchdStartedPending": "viveworker launchd service started, but health has not responded yet.",
672
722
  "cli.start.bridgeStarted": "viveworker bridge started in background.",
673
723
  "cli.start.bridgeStartedPending": "viveworker bridge started in background, but health has not responded yet.",
724
+ "cli.start.title": "viveworker started",
725
+ "cli.start.readyLaunchd": "launchd service is running",
726
+ "cli.start.readyBridge": "background bridge process started",
727
+ "cli.start.nextPairing": "Use the refreshed pairing link below only if you are adding another device.",
728
+ "cli.stop.title": "viveworker stopped",
729
+ "cli.stop.alreadyStopped": "viveworker is already stopped",
730
+ "cli.stop.changedLaunchd": "launchd service was stopped",
731
+ "cli.stop.changedPid": "Background process {pid} was stopped",
674
732
  "cli.stop.launchdStopped": "viveworker launchd service stopped.",
675
733
  "cli.stop.noProcess": "No background viveworker process found.",
676
734
  "cli.stop.stopped": "Stopped background viveworker process {pid}.",
@@ -690,7 +748,10 @@ const translations = {
690
748
  "cli.status.notRunning": "not running",
691
749
  "cli.status.ok": "ok",
692
750
  "cli.status.failed": "failed",
751
+ "cli.status.title": "viveworker status",
693
752
  "cli.doctor.ok": "viveworker doctor: ok",
753
+ "cli.doctor.titleIssues": "Doctor found issues",
754
+ "cli.doctor.titleFix": "Doctor repaired the local setup",
694
755
  "cli.doctor.foundIssues": "viveworker doctor found issues:",
695
756
  "cli.doctor.issue.envMissing": "env file is missing",
696
757
  "cli.doctor.issue.sessionSecretMissing": "SESSION_SECRET is missing",
@@ -704,6 +765,25 @@ const translations = {
704
765
  "cli.doctor.issue.vapidPrivateMissing": "WEB_PUSH_VAPID_PRIVATE_KEY is missing",
705
766
  "cli.doctor.issue.healthHttps": "health endpoint is not reachable over HTTPS",
706
767
  "cli.doctor.issue.health": "health endpoint is not reachable",
768
+ "cli.doctor.fixing": "viveworker doctor is repairing the local setup...",
769
+ "cli.doctor.fixed": "viveworker doctor applied repairs.",
770
+ "cli.doctor.nextFix": "Run `npx viveworker doctor --fix` to repair the issues automatically.",
771
+ "cli.doctor.nextRestarting": "viveworker is now restarting so the repaired setup takes effect.",
772
+ "cli.doctor.fixed.sessionSecret": "SESSION_SECRET was regenerated",
773
+ "cli.doctor.fixed.pairing": "Pairing credentials were refreshed",
774
+ "cli.doctor.fixed.locale": "Default locale was written",
775
+ "cli.doctor.fixed.host": "Bridge host was restored",
776
+ "cli.doctor.fixed.port": "Bridge port was restored",
777
+ "cli.doctor.fixed.hostname": "Hostname was restored",
778
+ "cli.doctor.fixed.deviceTrust": "Device trust TTL was restored",
779
+ "cli.doctor.fixed.webUi": "WEB_UI_ENABLED was restored",
780
+ "cli.doctor.fixed.auth": "AUTH_REQUIRED was restored",
781
+ "cli.doctor.fixed.choicePageSize": "CHOICE_PAGE_SIZE was restored",
782
+ "cli.doctor.fixed.maxHistory": "MAX_HISTORY_ITEMS was restored",
783
+ "cli.doctor.fixed.nativeApprovals": "NATIVE_APPROVALS was restored",
784
+ "cli.doctor.fixed.baseUrl": "Public base URL was restored",
785
+ "cli.doctor.fixed.webPushAssets": "TLS certificate and Web Push keys were refreshed",
786
+ "cli.doctor.fixed.webPushSubject": "WEB_PUSH_SUBJECT was restored",
707
787
  },
708
788
  ja: {
709
789
  "common.codex": "Codex",
@@ -1032,8 +1112,8 @@ const translations = {
1032
1112
  "settings.device.section.current": "この端末",
1033
1113
  "settings.device.section.other": "他の信頼済み端末",
1034
1114
  "settings.device.thisDevice": "この端末",
1035
- "settings.device.emptyCurrent": "この端末の情報はまだ表示できません。",
1036
- "settings.device.emptyOther": "他に有効な信頼済み端末はありません。",
1115
+ "settings.device.emptyCurrent": "この端末は現在の有効な信頼済み端末一覧には入っていません。以前の信頼期限が切れたか、削除された可能性があります。必要なら Mac で `npx viveworker pair` を実行して再ペアリングしてください。",
1116
+ "settings.device.emptyOther": "他に有効な信頼済み端末はありません。期限切れまたは削除済みの端末はここには表示されません。必要なら Mac で `npx viveworker pair` を実行して再ペアリングしてください。",
1037
1117
  "settings.device.addAnother.title": "端末を追加する",
1038
1118
  "settings.device.addAnother.heading": "新しい端末 / ブラウザを追加",
1039
1119
  "settings.device.addAnother.copy":
@@ -1154,6 +1234,7 @@ const translations = {
1154
1234
  "settings.a2aShare.days": ({ count }) => `${count} 日`,
1155
1235
  "settings.a2aShare.ratePerHour": ({ count }) => `${count} 件 / 1 時間`,
1156
1236
  "settings.a2aShare.passwordProtected": "パスワード保護",
1237
+ "settings.a2aShare.paidShare": ({ price, network }) => `有料 — ${price} USDC (${network})`,
1157
1238
  "settings.a2aShare.showMore": "さらに {count} 件…",
1158
1239
  "settings.a2aShare.showLess": "閉じる",
1159
1240
  "settings.a2aShare.expired": "期限切れ",
@@ -1284,9 +1365,11 @@ const translations = {
1284
1365
  "server.page.choiceMissing": "選択入力トークンが見つかりません",
1285
1366
  "server.page.approvalHandled": "この承認はすでに処理済みです",
1286
1367
  "server.page.detailMissing": "完了詳細が見つかりません",
1287
- "cli.help.usage": "Usage: viveworker <setup|start|stop|status|doctor|update> [options]",
1368
+ "cli.help.usage": "Usage: viveworker <setup|pair|enable|start|stop|status|doctor|update> [options]",
1288
1369
  "cli.help.commands": "Commands:",
1289
- "cli.help.setup": "setup 設定を作成し、ペアリング情報を生成し、launchd に登録して bridge を起動します",
1370
+ "cli.help.setup": "setup base の設定を作成し、launchd に登録して viveworker bridge を起動します",
1371
+ "cli.help.pair": "pair 追加する信頼済み端末向けに pairing 情報を更新します",
1372
+ "cli.help.enable": "enable オプション機能や連携を有効化します",
1290
1373
  "cli.help.start": "start 保存済み設定で bridge を起動します",
1291
1374
  "cli.help.stop": "stop bridge を停止します",
1292
1375
  "cli.help.status": "status launchd / バックグラウンド状態と health を表示します",
@@ -1301,7 +1384,28 @@ const translations = {
1301
1384
  "cli.update.alreadyLatest": "すでに最新です (v{version})",
1302
1385
  "cli.update.versionInfo": "v{current} -> v{latest} に更新します",
1303
1386
  "cli.update.done": "v{version} に更新しました — 全サービスを再起動しました",
1387
+ "cli.update.title": "viveworker updated",
1388
+ "cli.update.changedVersion": "バージョンを v{current} から v{latest} に更新しました",
1389
+ "cli.update.changedBridge": "bridge を再起動しました",
1390
+ "cli.update.changedWatcher": "Moltbook watcher を再起動しました",
1391
+ "cli.update.changedScout": "Moltbook scout を再起動しました",
1392
+ "cli.update.next": "`npx viveworker status` を実行すると、再起動後の状態を確認できます。",
1304
1393
  "cli.help.commonOptions": "共通オプション:",
1394
+ "cli.help.featureOptions": "機能ごとの例:",
1395
+ "cli.help.enableClaude": "enable claude [--settings-file <path>]",
1396
+ "cli.help.enableA2a": "enable a2a --user-id <id> [--description <text>] [--skills <csv>]",
1397
+ "cli.help.enableMoltbook": "enable moltbook --api-key <key> --agent-id <id> [--agent-name <name>] [--no-scout]",
1398
+ "cli.help.enableScout": "enable scout [--interval <seconds>] [--harness auto|codex|claude|manual] [--uninstall]",
1399
+ "cli.help.doctorFix": "doctor --fix よくあるローカル問題を修復し、bridge を再起動します",
1400
+ "cli.section.ready": "Ready",
1401
+ "cli.section.changed": "Changed",
1402
+ "cli.section.needsAttention": "Needs attention",
1403
+ "cli.section.next": "Next",
1404
+ "cli.section.details": "Details",
1405
+ "cli.section.pairingLinks": "Pairing links",
1406
+ "cli.section.caDownload": "CA download",
1407
+ "cli.section.qrPairing": "Pairing QR",
1408
+ "cli.section.qrCaDownload": "rootCA.pem download QR",
1305
1409
  "cli.setup.complete": "viveworker の setup が完了しました",
1306
1410
  "cli.setup.progress.prepare": "viveworker のローカル設定を準備しています...",
1307
1411
  "cli.setup.progress.installCa": "ローカル CA をインストールまたは更新しています ({stores})...",
@@ -1309,6 +1413,7 @@ const translations = {
1309
1413
  "cli.setup.progress.generateCert": "ローカル HTTPS 証明書を生成しています...",
1310
1414
  "cli.setup.progress.generateVapid": "Web Push の鍵を生成しています...",
1311
1415
  "cli.setup.progress.writeConfig": "設定ファイルを書き込んでいます...",
1416
+ "cli.setup.progress.providers": "Codex / Claude 連携を確認しています...",
1312
1417
  "cli.setup.progress.launchd": "launchd サービスを登録して起動しています...",
1313
1418
  "cli.setup.progress.startBridge": "ローカル bridge を起動しています...",
1314
1419
  "cli.setup.progress.health": "viveworker の応答を待っています...",
@@ -1326,6 +1431,31 @@ const translations = {
1326
1431
  "cli.setup.webPushEnabled": "Web Push: enabled (HTTPS)",
1327
1432
  "cli.setup.webPushDisabled": "Web Push: disabled",
1328
1433
  "cli.setup.claudeHooksSkipped": "Claude hooks はスキップしました(~/.claude ディレクトリが見つかりません)。Claude Desktop をインストール後に `viveworker setup` を再実行すると Claude 連携が有効になります。",
1434
+ "cli.setup.providers.title": "Provider setup:",
1435
+ "cli.setup.providers.codexReady": "Codex を検出しました: 追加設定なしで使えます。",
1436
+ "cli.setup.providers.codexNotDetected": "Codex はまだ見つかっていません: viveworker 自体はこのまま使えます。Codex Desktop を入れると Codex 連携も有効になります。",
1437
+ "cli.setup.providers.claudeEnabled": "Claude を検出しました: hooks を {path} に有効化しました。",
1438
+ "cli.setup.providers.claudeNotDetected": "Claude はまだ見つかっていません: Claude Desktop を入れたあとで `npx viveworker enable claude` を実行してください。",
1439
+ "cli.setup.providers.claudeSkipped": "Claude の自動セットアップはスキップしました (--no-auto-claude)。",
1440
+ "cli.setup.providers.claudeFailed": "Claude は見つかりましたが、hooks を自動設定できませんでした: {message}",
1441
+ "cli.setup.legacyFeatureFlags": "旧 setup フラグは互換のため引き続き実行します。次回からは {commands} を使ってください。",
1442
+ "cli.pair.done": "Pairing refreshed",
1443
+ "cli.enable.claude.title": "Claude enabled",
1444
+ "cli.enable.claude.changed": "Hooks を {path} に設定しました",
1445
+ "cli.enable.claude.next": "Claude Desktop で一度プロンプトを動かして、hooks が有効になっていることを確認してください。",
1446
+ "cli.enable.moltbook.title": "Moltbook enabled",
1447
+ "cli.enable.moltbook.watcher": "Watcher を {path} に設定しました",
1448
+ "cli.enable.moltbook.env": "環境設定を {path} に保存しました",
1449
+ "cli.enable.moltbook.scout": "{interval} 秒間隔で auto-scout を設定しました",
1450
+ "cli.enable.moltbook.watcherOnly": "Watcher-only mode で有効化しました (auto-scout は OFF です)",
1451
+ "cli.enable.moltbook.personaTip": "persona file が見つかりません。`npx viveworker moltbook persona init` を実行すると draft の質が上がります。",
1452
+ "cli.enable.moltbook.next": "端末アプリの Settings > Moltbook を開き、watcher status / quota / drafts が見えることを確認してください。",
1453
+ "cli.enable.scout.title": "Moltbook scout enabled",
1454
+ "cli.enable.scout.removed": "Moltbook scout removed",
1455
+ "cli.enable.scout.installed": "{interval} 秒間隔で scout schedule を設定しました",
1456
+ "cli.enable.scout.harness": "Draft harness: {path}",
1457
+ "cli.enable.scout.manualHarness": "Codex CLI か Claude Code CLI が入るまでは manual mode で動きます。",
1458
+ "cli.enable.scout.next": "次の scout cycle を端末アプリで確認するか、`npx viveworker enable scout --interval ...` であとから調整してください。",
1329
1459
  "cli.setup.completePending": "viveworker の setup は完了しましたが、まだ health 応答は確認できていません。",
1330
1460
  "cli.setup.caFlow.title": "端末で viveworker を開く前に、必要ならローカルの証明書をインストールしてください:",
1331
1461
  "cli.setup.caFlow.step1": "1. 下の CA download URL を開くか QR を読み取り、端末で rootCA.pem を取得します。",
@@ -1358,7 +1488,7 @@ const translations = {
1358
1488
  "cli.setup.error.mkcertInstallPermission":
1359
1489
  "Homebrew は見つかりましたが、その prefix に現在のユーザーの書き込み権限がないため、viveworker が mkcert を自動インストールできませんでした。",
1360
1490
  "cli.setup.error.mkcertInstallNext":
1361
- "`npx viveworker setup --install-mkcert` をやり直す前に Homebrew の権限を直すか、先に mkcert を手動でインストールしてください。",
1491
+ "Homebrew の権限を直してから `npx viveworker setup` をやり直すか、先に mkcert を手動でインストールしてください。",
1362
1492
  "cli.setup.error.mkcertInstallExample": "例: brew install mkcert && mkcert -install",
1363
1493
  "cli.start.progress.prepare": "保存済みの viveworker 設定を読み込んでいます...",
1364
1494
  "cli.start.progress.refreshPairing": "期限切れの pairing 情報を更新しています...",
@@ -1370,6 +1500,14 @@ const translations = {
1370
1500
  "cli.start.launchdStartedPending": "viveworker の launchd サービスは開始しましたが、まだ health 応答は確認できていません。",
1371
1501
  "cli.start.bridgeStarted": "viveworker bridge をバックグラウンドで起動しました。",
1372
1502
  "cli.start.bridgeStartedPending": "viveworker bridge はバックグラウンドで起動しましたが、まだ health 応答は確認できていません。",
1503
+ "cli.start.title": "viveworker started",
1504
+ "cli.start.readyLaunchd": "launchd service が動作中です",
1505
+ "cli.start.readyBridge": "background bridge process を起動しました",
1506
+ "cli.start.nextPairing": "追加する端末があるときだけ、下の refreshed pairing link を使ってください。",
1507
+ "cli.stop.title": "viveworker stopped",
1508
+ "cli.stop.alreadyStopped": "viveworker is already stopped",
1509
+ "cli.stop.changedLaunchd": "launchd service を停止しました",
1510
+ "cli.stop.changedPid": "background process {pid} を停止しました",
1373
1511
  "cli.stop.launchdStopped": "viveworker の launchd サービスを停止しました。",
1374
1512
  "cli.stop.noProcess": "バックグラウンドの viveworker プロセスは見つかりませんでした。",
1375
1513
  "cli.stop.stopped": "バックグラウンドの viveworker プロセス {pid} を停止しました。",
@@ -1389,7 +1527,10 @@ const translations = {
1389
1527
  "cli.status.notRunning": "停止中",
1390
1528
  "cli.status.ok": "ok",
1391
1529
  "cli.status.failed": "failed",
1530
+ "cli.status.title": "viveworker status",
1392
1531
  "cli.doctor.ok": "viveworker doctor: ok",
1532
+ "cli.doctor.titleIssues": "Doctor found issues",
1533
+ "cli.doctor.titleFix": "Doctor repaired the local setup",
1393
1534
  "cli.doctor.foundIssues": "viveworker doctor で問題が見つかりました:",
1394
1535
  "cli.doctor.issue.envMissing": "env ファイルが見つかりません",
1395
1536
  "cli.doctor.issue.sessionSecretMissing": "SESSION_SECRET がありません",
@@ -1403,6 +1544,25 @@ const translations = {
1403
1544
  "cli.doctor.issue.vapidPrivateMissing": "WEB_PUSH_VAPID_PRIVATE_KEY がありません",
1404
1545
  "cli.doctor.issue.healthHttps": "health endpoint に HTTPS で到達できません",
1405
1546
  "cli.doctor.issue.health": "health endpoint に到達できません",
1547
+ "cli.doctor.fixing": "viveworker doctor がローカル設定を修復しています...",
1548
+ "cli.doctor.fixed": "viveworker doctor が修復を適用しました。",
1549
+ "cli.doctor.nextFix": "`npx viveworker doctor --fix` を実行すると自動で修復できます。",
1550
+ "cli.doctor.nextRestarting": "修復内容を反映するため、いま viveworker を再起動しています。",
1551
+ "cli.doctor.fixed.sessionSecret": "SESSION_SECRET を再生成しました",
1552
+ "cli.doctor.fixed.pairing": "pairing credentials を更新しました",
1553
+ "cli.doctor.fixed.locale": "DEFAULT_LOCALE を補いました",
1554
+ "cli.doctor.fixed.host": "bridge host を補いました",
1555
+ "cli.doctor.fixed.port": "bridge port を補いました",
1556
+ "cli.doctor.fixed.hostname": "hostname を補いました",
1557
+ "cli.doctor.fixed.deviceTrust": "device trust TTL を補いました",
1558
+ "cli.doctor.fixed.webUi": "WEB_UI_ENABLED を補いました",
1559
+ "cli.doctor.fixed.auth": "AUTH_REQUIRED を補いました",
1560
+ "cli.doctor.fixed.choicePageSize": "CHOICE_PAGE_SIZE を補いました",
1561
+ "cli.doctor.fixed.maxHistory": "MAX_HISTORY_ITEMS を補いました",
1562
+ "cli.doctor.fixed.nativeApprovals": "NATIVE_APPROVALS を補いました",
1563
+ "cli.doctor.fixed.baseUrl": "public base URL を補いました",
1564
+ "cli.doctor.fixed.webPushAssets": "TLS 証明書と Web Push 鍵を更新しました",
1565
+ "cli.doctor.fixed.webPushSubject": "WEB_PUSH_SUBJECT を補いました",
1406
1566
  },
1407
1567
  };
1408
1568