viveworker 0.8.2 → 0.8.4

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
@@ -2755,6 +2755,39 @@ pre code {
2755
2755
  color: rgba(236, 248, 255, 0.66);
2756
2756
  }
2757
2757
 
2758
+ .timeline-entry--activity {
2759
+ cursor: default;
2760
+ border-color: rgba(121, 196, 255, 0.18);
2761
+ background:
2762
+ linear-gradient(180deg, rgba(121, 196, 255, 0.11), rgba(20, 31, 40, 0.94)),
2763
+ var(--card);
2764
+ }
2765
+
2766
+ .timeline-entry__activity-pulse {
2767
+ width: 0.58rem;
2768
+ height: 0.58rem;
2769
+ flex: 0 0 auto;
2770
+ border-radius: 999px;
2771
+ background: rgba(121, 196, 255, 0.9);
2772
+ box-shadow: 0 0 0 0 rgba(121, 196, 255, 0.26);
2773
+ animation: timeline-activity-pulse 1.6s ease-out infinite;
2774
+ }
2775
+
2776
+ @keyframes timeline-activity-pulse {
2777
+ 0% {
2778
+ box-shadow: 0 0 0 0 rgba(121, 196, 255, 0.26);
2779
+ opacity: 0.95;
2780
+ }
2781
+ 70% {
2782
+ box-shadow: 0 0 0 0.56rem rgba(121, 196, 255, 0);
2783
+ opacity: 0.72;
2784
+ }
2785
+ 100% {
2786
+ box-shadow: 0 0 0 0 rgba(121, 196, 255, 0);
2787
+ opacity: 0.95;
2788
+ }
2789
+ }
2790
+
2758
2791
  .timeline-entry--message .timeline-entry__title {
2759
2792
  font-size: 1.03rem;
2760
2793
  line-height: 1.55;
package/web/app.js CHANGED
@@ -43,6 +43,7 @@ const DETAIL_REFRESH_FALLBACK_TIMEOUT_MS = 2_500;
43
43
  const DETAIL_STICKY_LAN_PROBE_TIMEOUT_MS = 350;
44
44
  const COMPLETION_REPLY_SEND_TIMEOUT_MS = 22_000;
45
45
  const COMPLETION_REPLY_OPTIMISTIC_SENT_MS = 1_600;
46
+ const LAN_FETCH_TIMEOUT_MESSAGE = "LAN fetch timed out";
46
47
  const TIMELINE_REFRESH_TIMEOUT_MS = 8_000;
47
48
  const TIMELINE_POLL_TIMEOUT_MS = 4_500;
48
49
  const FAST_POLL_STEP_TIMEOUT_MS = 4_500;
@@ -897,7 +898,7 @@ async function forceAppRefreshFromLan() {
897
898
  const keys = await caches.keys();
898
899
  await Promise.all(
899
900
  keys
900
- .filter((key) => /^viveworker-v/.test(key))
901
+ .filter((key) => /^viveworker-/u.test(key))
901
902
  .map((key) => caches.delete(key))
902
903
  );
903
904
  }
@@ -1930,17 +1931,26 @@ function currentTimelineKindFilterOption() {
1930
1931
 
1931
1932
  function timelineEntryMatchesKindFilter(entry, filterId) {
1932
1933
  const kind = normalizeClientText(entry?.kind || entry?.item?.kind || "");
1934
+ const fileEventType = normalizeClientText(entry?.fileEventType || entry?.item?.fileEventType || "");
1935
+ const activityPhase = normalizeClientText(entry?.activityPhase || entry?.item?.activityPhase || "");
1933
1936
  switch (filterId) {
1934
1937
  case "messages":
1935
- return TIMELINE_MESSAGE_KINDS.has(kind);
1938
+ return TIMELINE_MESSAGE_KINDS.has(kind) || (kind === "activity_status" && activityPhase === "thinking");
1936
1939
  case "suggestions":
1937
1940
  return kind === "ambient_suggestions";
1938
1941
  case "files":
1939
- return kind === "file_event";
1942
+ return (
1943
+ (kind === "file_event" && fileEventType !== "git") ||
1944
+ (kind === "activity_status" && ["reading", "searching", "editing"].includes(activityPhase))
1945
+ );
1940
1946
  case "commands":
1941
- return kind === "command_event";
1947
+ return (
1948
+ kind === "command_event" ||
1949
+ (kind === "file_event" && fileEventType === "git") ||
1950
+ (kind === "activity_status" && activityPhase === "running_command")
1951
+ );
1942
1952
  case "approvals":
1943
- return kind === "approval";
1953
+ return kind === "approval" || (kind === "activity_status" && activityPhase === "awaiting_approval");
1944
1954
  case "plans":
1945
1955
  return kind === "plan" || kind === "plan_ready";
1946
1956
  case "choices":
@@ -2746,6 +2756,11 @@ function completionReplyWarningMatchesSentText(error, text, attachmentCount = 0)
2746
2756
  return Boolean(warningText && sentText && warningText === sentText);
2747
2757
  }
2748
2758
 
2759
+ function isCompletionReplyLateNetworkResult(error) {
2760
+ return error?.errorKey === "request-timeout" ||
2761
+ error?.message === LAN_FETCH_TIMEOUT_MESSAGE;
2762
+ }
2763
+
2749
2764
  function normalizeCompletionReplyAttachments(values) {
2750
2765
  const rawValues = Array.isArray(values)
2751
2766
  ? values
@@ -3773,6 +3788,7 @@ function renderTimelineEntry(entry, { desktop }) {
3773
3788
  const isMessageLike = TIMELINE_MESSAGE_KINDS.has(item.kind) || isMoltbookOrA2A;
3774
3789
  const isFileEvent = item.kind === "file_event";
3775
3790
  const isCommandEvent = item.kind === "command_event";
3791
+ const isActivityStatus = item.kind === "activity_status";
3776
3792
  const imageUrls = Array.isArray(item.imageUrls) ? item.imageUrls.filter(Boolean) : [];
3777
3793
  const fileRefs = normalizeClientFileRefs(item.fileRefs);
3778
3794
  const primaryText = timelineEntryPrimaryText(item, entry.status, { isMessageLike, isFileEvent, isCommandEvent });
@@ -3783,13 +3799,15 @@ function renderTimelineEntry(entry, { desktop }) {
3783
3799
  const fileEventFileSummary = isFileEvent ? timelineFileEventFileSummary(item) : "";
3784
3800
  const fileEventDiffStatsHtml = isFileEvent ? renderDiffEntryStatsHtml(item) : "";
3785
3801
  const toolEventCommand = timelineToolEventCommand(item);
3802
+ const tagName = isActivityStatus ? "div" : "button";
3803
+ const openAttrs = isActivityStatus
3804
+ ? `role="status" aria-live="polite"`
3805
+ : `data-open-item-kind="${escapeHtml(item.kind)}" data-open-item-token="${escapeHtml(item.token)}" data-source-tab="timeline"`;
3786
3806
 
3787
3807
  return `
3788
- <button
3789
- class="timeline-entry timeline-entry--${kindClassName} timeline-entry--kind-${kindNameClass} ${isMessageLike ? "timeline-entry--message" : "timeline-entry--operational"}"
3790
- data-open-item-kind="${escapeHtml(item.kind)}"
3791
- data-open-item-token="${escapeHtml(item.token)}"
3792
- data-source-tab="timeline"
3808
+ <${tagName}
3809
+ class="timeline-entry timeline-entry--${kindClassName} timeline-entry--kind-${kindNameClass} ${isMessageLike ? "timeline-entry--message" : "timeline-entry--operational"} ${isActivityStatus ? "timeline-entry--activity" : ""}"
3810
+ ${openAttrs}
3793
3811
  >
3794
3812
  <div class="timeline-entry__meta">
3795
3813
  <span class="timeline-entry__kind">
@@ -3799,7 +3817,7 @@ function renderTimelineEntry(entry, { desktop }) {
3799
3817
  </span>
3800
3818
  <span class="timeline-entry__meta-right">
3801
3819
  <span class="timeline-entry__time">${escapeHtml(timestampLabel)}</span>
3802
- <span class="timeline-entry__chevron" aria-hidden="true">${renderIcon("chevron-right")}</span>
3820
+ ${isActivityStatus ? `<span class="timeline-entry__activity-pulse" aria-hidden="true"></span>` : `<span class="timeline-entry__chevron" aria-hidden="true">${renderIcon("chevron-right")}</span>`}
3803
3821
  </span>
3804
3822
  </div>
3805
3823
  ${threadLabel ? `<p class="timeline-entry__thread">${escapeHtml(threadLabel)}</p>` : ""}
@@ -3821,7 +3839,7 @@ function renderTimelineEntry(entry, { desktop }) {
3821
3839
  ${isFileEvent ? "" : renderTimelineEntryFileStrip(fileRefs)}
3822
3840
  </div>
3823
3841
  ${statusLabel ? `<div class="timeline-entry__footer"><span class="timeline-entry__status">${escapeHtml(statusLabel)}</span></div>` : ""}
3824
- </button>
3842
+ </${tagName}>
3825
3843
  `;
3826
3844
  }
3827
3845
 
@@ -4059,10 +4077,13 @@ function shouldRenderFileEventCommand(item) {
4059
4077
  if (item?.kind !== "file_event") {
4060
4078
  return false;
4061
4079
  }
4062
- return ["read", "search"].includes(normalizeClientText(item?.fileEventType || ""));
4080
+ return ["read", "search", "git"].includes(normalizeClientText(item?.fileEventType || ""));
4063
4081
  }
4064
4082
 
4065
4083
  function timelineToolEventCommand(item) {
4084
+ if (item?.kind === "activity_status") {
4085
+ return truncateUiText(item?.commandText || "", 220);
4086
+ }
4066
4087
  if (item?.kind === "command_event") {
4067
4088
  return timelineCommandEventCommand(item);
4068
4089
  }
@@ -4078,6 +4099,8 @@ function fileEventDisplayLabel(fileEventType) {
4078
4099
  return L("fileEvent.read");
4079
4100
  case "search":
4080
4101
  return L("fileEvent.search");
4102
+ case "git":
4103
+ return L("fileEvent.command");
4081
4104
  case "command":
4082
4105
  return L("fileEvent.command");
4083
4106
  case "write":
@@ -4095,15 +4118,24 @@ function fileEventDisplayLabel(fileEventType) {
4095
4118
 
4096
4119
  function fileEventTimelineCountLabel(item) {
4097
4120
  const fileEventType = normalizeClientText(item?.fileEventType || "");
4098
- const count = normalizeClientFileRefs(item?.fileRefs).length;
4121
+ const fileRefs = normalizeClientFileRefs(item?.fileRefs);
4122
+ const count = fileRefs.length;
4099
4123
  if (count <= 0) {
4100
4124
  return fileEventDisplayLabel(fileEventType) || L("common.fileEvent");
4101
4125
  }
4102
4126
  switch (fileEventType) {
4103
4127
  case "read":
4128
+ if (count === 1) {
4129
+ return L("fileEvent.read");
4130
+ }
4104
4131
  return L("fileEvent.timeline.read", { count });
4105
4132
  case "search":
4133
+ if (count === 1) {
4134
+ return L("fileEvent.search");
4135
+ }
4106
4136
  return L("fileEvent.timeline.search", { count });
4137
+ case "git":
4138
+ return L("fileEvent.timeline.command", { count });
4107
4139
  case "command":
4108
4140
  return L("fileEvent.timeline.command", { count });
4109
4141
  case "write":
@@ -5448,20 +5480,29 @@ function recentAutoPilotEntries(limit = 5) {
5448
5480
  }
5449
5481
 
5450
5482
  function isAutoPilotApprovalEntry(entry) {
5483
+ const mode = normalizeClientText(entry?.autoPilotMode || "");
5451
5484
  const stableId = normalizeClientText(entry?.stableId || "");
5452
5485
  return (
5453
5486
  normalizeClientText(entry?.kind || "") === "approval" &&
5454
5487
  normalizeClientText(entry?.outcome || "") === "approved" &&
5455
- (stableId.endsWith(":autopilot") || stableId.includes(":autopilot-write"))
5488
+ (mode === "read" || mode === "write" || stableId.endsWith(":autopilot") || stableId.includes(":autopilot-write"))
5456
5489
  );
5457
5490
  }
5458
5491
 
5459
5492
  function autoPilotEntryMode(item) {
5493
+ const mode = normalizeClientText(item?.autoPilotMode || "");
5494
+ if (mode === "read" || mode === "write") {
5495
+ return mode;
5496
+ }
5460
5497
  const stableId = normalizeClientText(item?.stableId || "");
5461
5498
  return stableId.includes(":autopilot-write") ? "write" : "read";
5462
5499
  }
5463
5500
 
5464
5501
  function autoPilotEntryWriteLane(item) {
5502
+ const projected = normalizeClientText(item?.autoPilotWriteLane || "");
5503
+ if (projected) {
5504
+ return projected;
5505
+ }
5465
5506
  const stableId = normalizeClientText(item?.stableId || "");
5466
5507
  const match = stableId.match(/:autopilot-write:([a-z_-]+)$/u);
5467
5508
  return normalizeClientText(match?.[1] || "");
@@ -7627,7 +7668,7 @@ function renderMoltbookDraftComposer(detail, options = {}) {
7627
7668
  ? `
7628
7669
  <div class="actions actions--stack${options.mobile ? " actions--sticky" : ""}">
7629
7670
  <button type="submit" data-action="approve" class="primary primary--wide">${escapeHtml(approveLabel)}</button>
7630
- <button type="submit" data-action="deny" class="danger danger--wide">Deny</button>
7671
+ <button type="submit" data-action="deny" class="danger danger--wide">${escapeHtml(L("moltbook.draft.deny"))}</button>
7631
7672
  </div>
7632
7673
  `
7633
7674
  : `<p class="muted reply-composer__description">${escapeHtml(L("moltbook.draft.resolved"))}</p>`;
@@ -8800,7 +8841,7 @@ function bindShellInteractions() {
8800
8841
  buildActionOutcomeDetail({
8801
8842
  kind: "approval",
8802
8843
  title: state.currentDetail?.title,
8803
- message: approvalOutcomeMessage(actionUrl, activeItem?.provider),
8844
+ message: approvalOutcomeMessage(actionUrl, state.currentDetail?.provider || activeItem?.provider),
8804
8845
  })
8805
8846
  );
8806
8847
  await renderShell();
@@ -9712,7 +9753,9 @@ for (const button of document.querySelectorAll("[data-wallet-address-copy]")) {
9712
9753
  labelCache.set(btn, btn.innerHTML);
9713
9754
  btn.disabled = true;
9714
9755
  if (btn.dataset.action === submittedAction) {
9715
- btn.innerHTML = submittedAction === "approve" ? "送信中…" : "処理中…";
9756
+ btn.innerHTML = submittedAction === "approve"
9757
+ ? escapeHtml(L("moltbook.draft.submittingApprove"))
9758
+ : escapeHtml(L("moltbook.draft.submittingDeny"));
9716
9759
  btn.classList.add("is-loading");
9717
9760
  } else {
9718
9761
  btn.classList.add("is-dimmed");
@@ -9990,7 +10033,7 @@ for (const button of document.querySelectorAll("[data-wallet-address-copy]")) {
9990
10033
  } catch (error) {
9991
10034
  const optimisticDraft = getCompletionReplyDraft(token);
9992
10035
  if (
9993
- error.errorKey === "request-timeout" &&
10036
+ isCompletionReplyLateNetworkResult(error) &&
9994
10037
  optimisticDraft.collapsedAfterSend &&
9995
10038
  optimisticDraft.sentText === text
9996
10039
  ) {
@@ -10582,6 +10625,8 @@ function kindMeta(kind, item) {
10582
10625
  return { label: L("common.assistantCommentary"), tone: "plan", icon: "assistant-commentary" };
10583
10626
  case "assistant_final":
10584
10627
  return { label: L("common.assistantFinal"), tone: "completion", icon: "assistant-final" };
10628
+ case "activity_status":
10629
+ return { label: L("server.title.activityStatus"), tone: "plan", icon: activityStatusIcon(item?.activityPhase) };
10585
10630
  case "ambient_suggestions":
10586
10631
  return { label: L("common.ambientSuggestions"), tone: "neutral", icon: "suggestions" };
10587
10632
  case "approval":
@@ -10596,6 +10641,9 @@ function kindMeta(kind, item) {
10596
10641
  case "diff_thread":
10597
10642
  return { label: L("common.diff"), tone: "neutral", icon: "diff" };
10598
10643
  case "file_event":
10644
+ if (normalizeClientText(item?.fileEventType || "") === "git") {
10645
+ return { label: L("common.commandEvent"), tone: "neutral", icon: "command" };
10646
+ }
10599
10647
  return { label: L("common.fileEvent"), tone: "neutral", icon: "file-event" };
10600
10648
  case "command_event":
10601
10649
  return { label: L("common.commandEvent"), tone: "neutral", icon: "command" };
@@ -10616,6 +10664,24 @@ function kindMeta(kind, item) {
10616
10664
  }
10617
10665
  }
10618
10666
 
10667
+ function activityStatusIcon(phase) {
10668
+ switch (normalizeClientText(phase || "")) {
10669
+ case "reading":
10670
+ return "file-event";
10671
+ case "searching":
10672
+ return "filter";
10673
+ case "editing":
10674
+ return "diff";
10675
+ case "running_command":
10676
+ return "command";
10677
+ case "awaiting_approval":
10678
+ return "approval";
10679
+ case "thinking":
10680
+ default:
10681
+ return "pending";
10682
+ }
10683
+ }
10684
+
10619
10685
  function renderTypePillContent(kindInfo) {
10620
10686
  return `
10621
10687
  <span class="type-pill__icon" aria-hidden="true">${renderIcon(kindInfo.icon)}</span>
@@ -11444,6 +11510,7 @@ function localizeApiError(value) {
11444
11510
  "completion-reply-image-limit": "error.completionReplyImageLimit",
11445
11511
  "completion-reply-image-invalid-upload": "error.completionReplyImageInvalidUpload",
11446
11512
  "codex-ipc-not-connected": "error.codexIpcNotConnected",
11513
+ "codex-client-not-found": "error.codexClientNotFound",
11447
11514
  "approval-not-found": "error.approvalNotFound",
11448
11515
  "approval-already-handled": "error.approvalAlreadyHandled",
11449
11516
  "plan-request-not-found": "error.planRequestNotFound",
package/web/build-id.js CHANGED
@@ -1 +1 @@
1
- export const APP_BUILD_ID = "20260505-command-event-fast-approval-v1";
1
+ export const APP_BUILD_ID = "20260514-lan-timeout-reply-ack";
package/web/i18n.js CHANGED
@@ -463,7 +463,7 @@ const translations = {
463
463
  "settings.row.defaultLanguage": "Setup default",
464
464
  "settings.moltbook.title": "Moltbook",
465
465
  "settings.moltbook.subtitle": "Auto-scout & notifications",
466
- "settings.moltbook.copy": "View your daily auto-scout posting status and quota.",
466
+ "settings.moltbook.copy": "View incoming reply drafts, feed scouting, and today's posting quota.",
467
467
  "settings.moltbook.unavailable": "Moltbook is not configured.",
468
468
  "settings.row.moltbookAccount": "Profile",
469
469
  "settings.row.moltbookQuota": "Replies today",
@@ -484,6 +484,9 @@ const translations = {
484
484
  "moltbook.draft.titleLabel": "Title",
485
485
  "moltbook.draft.approvePost": "Approve & publish",
486
486
  "moltbook.draft.approveReply": "Approve & post",
487
+ "moltbook.draft.deny": "Deny",
488
+ "moltbook.draft.submittingApprove": "Publishing...",
489
+ "moltbook.draft.submittingDeny": "Denying...",
487
490
  "moltbook.draft.editHint": "Edit if needed, then approve to publish or deny to skip.",
488
491
  "moltbook.draft.resolved": "This draft has already been resolved.",
489
492
  "moltbook.draft.greetMorning": "Good morning! Share yesterday's highlights?",
@@ -755,6 +758,7 @@ const translations = {
755
758
  "error.completionReplyImageLimit": "Attach up to {count} images at a time.",
756
759
  "error.completionReplyImageInvalidUpload": "That image could not be uploaded.",
757
760
  "error.codexIpcNotConnected": "Codex desktop is not connected right now.",
761
+ "error.codexClientNotFound": "Codex changed its active client. Reopen the thread on your PC and try again.",
758
762
  "error.approvalNotFound": "This approval is no longer available.",
759
763
  "error.approvalAlreadyHandled": "This approval was already handled.",
760
764
  "error.planRequestNotFound": "This plan request is no longer available.",
@@ -780,6 +784,7 @@ const translations = {
780
784
  "server.title.userMessage": "User",
781
785
  "server.title.assistantCommentary": "Update",
782
786
  "server.title.assistantFinal": "Final reply",
787
+ "server.title.activityStatus": "Working",
783
788
  "server.title.ambientSuggestions": "Suggested next steps",
784
789
  "server.title.threadShare": "Thread Share",
785
790
  "server.action.review": "Review",
@@ -814,6 +819,13 @@ const translations = {
814
819
  "server.message.choiceSummarySubmitted": "Selected answers sent.",
815
820
  "server.message.choiceSummaryReceivedTest": "Test answers received.",
816
821
  "server.message.questionAnswered": "Your answer was sent to {provider}.",
822
+ "server.activity.thinking": "Thinking...",
823
+ "server.activity.reading": "Reading files...",
824
+ "server.activity.searching": "Searching...",
825
+ "server.activity.editing": "Editing...",
826
+ "server.activity.runningCommand": "Running command...",
827
+ "server.activity.awaitingApproval": "Waiting for approval...",
828
+ "server.activity.working": "Working...",
817
829
  "claudePlan.title": "Plan from {provider}",
818
830
  "claudePlan.approve": "Approve plan",
819
831
  "claudePlan.reject": "Reject plan",
@@ -1529,7 +1541,7 @@ const translations = {
1529
1541
  "settings.row.defaultLanguage": "setup 時の既定値",
1530
1542
  "settings.moltbook.title": "Moltbook",
1531
1543
  "settings.moltbook.subtitle": "自動スカウト・通知連携",
1532
- "settings.moltbook.copy": "本日の自動スカウト投稿状況と上限を確認できます。",
1544
+ "settings.moltbook.copy": "自分宛コメントの返信案、フィード巡回、本日の投稿上限を確認できます。",
1533
1545
  "settings.moltbook.unavailable": "Moltbook が設定されていません。",
1534
1546
  "settings.row.moltbookAccount": "プロフィール",
1535
1547
  "settings.row.moltbookQuota": "本日の返信数",
@@ -1550,6 +1562,9 @@ const translations = {
1550
1562
  "moltbook.draft.titleLabel": "タイトル",
1551
1563
  "moltbook.draft.approvePost": "承認して投稿",
1552
1564
  "moltbook.draft.approveReply": "承認して返信",
1565
+ "moltbook.draft.deny": "拒否",
1566
+ "moltbook.draft.submittingApprove": "投稿中…",
1567
+ "moltbook.draft.submittingDeny": "拒否中…",
1553
1568
  "moltbook.draft.editHint": "必要に応じて編集し、承認して投稿するか、拒否してスキップします。",
1554
1569
  "moltbook.draft.resolved": "このドラフトは既に処理済みです。",
1555
1570
  "moltbook.draft.greetMorning": "おはようございます!昨日の成果をシェアしませんか?",
@@ -1821,6 +1836,7 @@ const translations = {
1821
1836
  "error.completionReplyImageLimit": "画像は最大 {count} 枚まで添付できます。",
1822
1837
  "error.completionReplyImageInvalidUpload": "この画像はアップロードできませんでした。",
1823
1838
  "error.codexIpcNotConnected": "いまは Codex desktop に接続できていません。",
1839
+ "error.codexClientNotFound": "Codex 側の接続先が切り替わりました。PC で対象スレッドを開き直して、もう一度送信してください。",
1824
1840
  "error.approvalNotFound": "この承認はもう利用できません。",
1825
1841
  "error.approvalAlreadyHandled": "この承認はすでに処理済みです。",
1826
1842
  "error.planRequestNotFound": "このプラン確認はもう利用できません。",
@@ -1846,6 +1862,7 @@ const translations = {
1846
1862
  "server.title.userMessage": "ユーザー",
1847
1863
  "server.title.assistantCommentary": "途中経過",
1848
1864
  "server.title.assistantFinal": "最終回答",
1865
+ "server.title.activityStatus": "作業中",
1849
1866
  "server.title.ambientSuggestions": "次の候補",
1850
1867
  "server.title.threadShare": "スレッド共有",
1851
1868
  "server.action.review": "判断する",
@@ -1880,6 +1897,13 @@ const translations = {
1880
1897
  "server.message.choiceSummarySubmitted": "選択内容を送信しました。",
1881
1898
  "server.message.choiceSummaryReceivedTest": "テスト回答を受信しました。",
1882
1899
  "server.message.questionAnswered": "回答を {provider} に送信しました。",
1900
+ "server.activity.thinking": "考え中...",
1901
+ "server.activity.reading": "ファイルを読んでいます...",
1902
+ "server.activity.searching": "検索しています...",
1903
+ "server.activity.editing": "編集中...",
1904
+ "server.activity.runningCommand": "コマンドを実行中...",
1905
+ "server.activity.awaitingApproval": "承認待ち...",
1906
+ "server.activity.working": "作業中...",
1883
1907
  "claudePlan.title": "{provider} からのプラン",
1884
1908
  "claudePlan.approve": "プランを承認",
1885
1909
  "claudePlan.reject": "プランを却下",