@buzzni/saycode-cli 0.9.1 → 0.9.2

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.
@@ -240,6 +240,23 @@ const EXTENSION_PANEL_SURFACE_SIZES = ["compact", "standard", "wide"];
240
240
  function isExtensionPanelSurfaceSize(value) {
241
241
  return EXTENSION_PANEL_SURFACE_SIZES.some((size) => size === value);
242
242
  }
243
+ function parseExtensionProjectTools(value, apiVersion) {
244
+ if (apiVersion < 3) fail$5("manifest.contributes.projectTools", "requires Extension API version 3");
245
+ return contributionList(value, "manifest.contributes.projectTools", ["id", "title", "command"], (entry, path2) => ({
246
+ id: id(entry.id, `${path2}.id`),
247
+ title: string(entry.title, `${path2}.title`),
248
+ command: id(entry.command, `${path2}.command`)
249
+ }));
250
+ }
251
+ function assertExtensionProjectToolTargets(extensionId2, tools, commands) {
252
+ for (const [index, tool] of tools.entries()) {
253
+ const path2 = `manifest.contributes.projectTools[${index}]`;
254
+ if (!tool.id.startsWith(`${extensionId2}.`)) fail$5(`${path2}.id`, "expected an id declared by the same extension");
255
+ const command = tool.command.startsWith(`${extensionId2}.`) ? commands.find((candidate) => candidate.id === tool.command) : void 0;
256
+ if (!command) fail$5(`${path2}.command`, "expected a command declared by the same extension");
257
+ if (!command.panelId) fail$5(`${path2}.command`, "expected a command that opens a panel");
258
+ }
259
+ }
243
260
  const EXTENSION_ARTIFACT_ACTION_OPERATIONS = ["publishPublic"];
244
261
  const EXTENSION_ARTIFACT_SOURCE_TYPES = ["project-file", "personal-chat-file"];
245
262
  const ID_PATTERN$1 = /^[a-z0-9](?:[a-z0-9.-]*[a-z0-9])?$/;
@@ -501,7 +518,7 @@ const EXTENSION_PERMISSIONS = [
501
518
  const SAYCODE_EXTENSION_API_VERSION = 3;
502
519
  const SAYCODE_EXTENSION_MINIMUM_API_VERSION = 2;
503
520
  const MAX_EXTENSION_API_WINDOW_WIDTH = 2;
504
- const SAYCODE_EXTENSION_ENGINE_VERSION = "1.1.0";
521
+ const SAYCODE_EXTENSION_ENGINE_VERSION = "1.2.0";
505
522
  const SAYCODE_CHANNEL_API_VERSION = CHANNEL_API_VERSION;
506
523
  const SAYCODE_CHANNEL_MINIMUM_API_VERSION = CHANNEL_MINIMUM_API_VERSION;
507
524
  class UnsupportedChannelApiVersionError extends Error {
@@ -524,7 +541,7 @@ const SEMVER_PATTERN = /^\d+\.\d+\.\d+(?:-[0-9A-Za-z.-]+)?(?:\+[0-9A-Za-z.-]+)?$
524
541
  const ENGINE_RANGE_PATTERN = /^(?:\^|~|>=|<=|>|<)?\d+\.\d+\.\d+(?:-[0-9A-Za-z.-]+)?$/;
525
542
  const ENTRYPOINT_PATTERN = /\.(?:cjs|mjs|js)$/;
526
543
  const LOCALE_PATTERN = /^[a-z]{2,3}(?:-[A-Z]{2})?$/;
527
- const CONTRIBUTION_KEYS = /* @__PURE__ */ new Set(["commands", "settings", "panels", "projectTemplates", "machineActions", "artifactActions", "channels"]);
544
+ const CONTRIBUTION_KEYS = /* @__PURE__ */ new Set(["commands", "settings", "panels", "projectTemplates", "machineActions", "projectTools", "artifactActions", "channels"]);
528
545
  const V2_PERMISSIONS = /* @__PURE__ */ new Set([
529
546
  "browserViewer.open",
530
547
  "browserViewer.install",
@@ -731,6 +748,7 @@ function parseContributions(value, apiVersion, channelApiVersion) {
731
748
  }
732
749
  );
733
750
  }
751
+ if (parsed.projectTools !== void 0) result.projectTools = parseExtensionProjectTools(parsed.projectTools, apiVersion);
734
752
  if (parsed.artifactActions !== void 0) {
735
753
  result.artifactActions = parseExtensionArtifactActions(parsed.artifactActions);
736
754
  }
@@ -743,6 +761,7 @@ function parseContributions(value, apiVersion, channelApiVersion) {
743
761
  ...result.panels ?? [],
744
762
  ...result.projectTemplates ?? [],
745
763
  ...result.machineActions ?? [],
764
+ ...result.projectTools ?? [],
746
765
  ...result.artifactActions ?? [],
747
766
  ...result.channels ?? []
748
767
  ].map((entry) => entry.id);
@@ -846,6 +865,7 @@ function parseExtensionManifest(value, options) {
846
865
  );
847
866
  }
848
867
  }
868
+ assertExtensionProjectToolTargets(parsedId, contributes.projectTools ?? [], contributes.commands ?? []);
849
869
  return {
850
870
  id: parsedId,
851
871
  version,
package/index.mjs CHANGED
@@ -49,7 +49,7 @@ function _mergeNamespaces(n, m) {
49
49
  }
50
50
  return Object.freeze(Object.defineProperty(n, Symbol.toStringTag, { value: "Module" }));
51
51
  }
52
- const version$3 = "0.9.1";
52
+ const version$3 = "0.9.2";
53
53
  const manifest = {
54
54
  version: version$3
55
55
  };
@@ -3194,7 +3194,39 @@ const projectScopeKo = {
3194
3194
  "projectScope.grantRevoked": "파일 접근 권한을 철회하고 세션을 다시 시작했습니다.",
3195
3195
  "projectScope.daemonUpgradeRequired": "Aplus CLI 업데이트 후 다시 시도해 주세요."
3196
3196
  };
3197
+ const machineSettingsLabelsKo = {
3198
+ "machineSettings.listRefreshed": "작업PC 목록을 새로 불러왔어요.",
3199
+ "machineSettings.codeGenerated": "등록 코드를 만들었어요.",
3200
+ "machineSettings.nameSaved": "작업PC 이름을 저장했어요.",
3201
+ "machineSettings.nameCleared": "작업PC 이름을 지웠어요.",
3202
+ "machineSettings.nameSaveFailed": "작업PC 이름을 저장하지 못했어요.",
3203
+ "machineSettings.removed": "{name}을(를) 목록에서 삭제했어요.",
3204
+ "machineSettings.zrokStopped": "zrok 공유를 멈췄어요.",
3205
+ "machineSettings.zrokStart": "zrok 시작",
3206
+ "machineSettings.zrokStarting": "zrok 시작 중",
3207
+ "machineSettings.zrokStop": "zrok 멈추기",
3208
+ "machineSettings.externalServerUrl": "외부 서버 주소",
3209
+ "machineSettings.externalServerUrlPlaceholder": "{url}의 zrok 주소",
3210
+ "machineSettings.liveModeOnly": "작업PC 등록과 삭제는 실제 연결에서만 할 수 있어요.",
3211
+ "machineSettings.issuedCodes": "발급한 코드",
3212
+ "machineSettings.generateCode": "등록 코드 만들기",
3213
+ "machineSettings.registrationCode": "등록 코드",
3214
+ "machineSettings.expiresAt": "{time}에 만료",
3215
+ "machineSettings.expired": "만료됨",
3216
+ "machineSettings.copyCommand": "명령 복사",
3217
+ "machineSettings.commandCopied": "복사됨",
3218
+ "machineSettings.loadingCodes": "코드를 불러오는 중…",
3219
+ "machineSettings.loadingMachines": "작업PC를 불러오는 중…",
3220
+ "machineSettings.emptyTitle": "작업PC 없음",
3221
+ "machineSettings.emptyOrganization": "선택한 조직에서 쓸 수 있는 작업PC가 없어요.",
3222
+ "machineSettings.emptyWorkspace": "현재 작업공간에서 쓸 수 있는 작업PC가 없어요.",
3223
+ "machineSettings.rename": "이름 변경",
3224
+ "machineSettings.delete": "삭제",
3225
+ "machineSettings.confirmDelete": "삭제 확인",
3226
+ "machineSettings.organization": "조직"
3227
+ };
3197
3228
  const machineSettingsConsoleKo = {
3229
+ ...machineSettingsLabelsKo,
3198
3230
  "machineConsole.showDetails": "작업PC 상세 정보 보이기",
3199
3231
  "machineConsole.showDetailsHint": "작업PC 선택 목록에서 마우스를 올리거나 키보드로 이동하면 상세 정보를 보여 줍니다.",
3200
3232
  "machineConsole.environmentStatus": "환경·상태",
@@ -6967,6 +6999,7 @@ const ko = {
6967
6999
  "runtimeEvent.claudeNotFound": "Claude Code를 시작하지 못했어요. 이 작업PC에서 실행 파일을 찾지 못했어요. 이 작업PC에 happy-cli를 다시 설치해 주세요.",
6968
7000
  "runtimeEvent.claudeStoppedBySignal": "Claude Code를 시작하지 못했어요. 예기치 않게 멈췄어요({signal}). 이 작업PC의 daemon 로그를 확인해 주세요.",
6969
7001
  "runtimeEvent.claudeCouldNotStart": "이 작업PC에서 Claude Code를 시작하지 못했어요. 자세한 내용은 이 작업PC의 daemon 로그를 확인해 주세요.",
7002
+ "runtimeEvent.claudeNotSignedIn": "이 작업PC에서 Claude Code에 로그인되어 있지 않아요. 이 작업PC의 daemon을 실행하는 사용자로 로그인한 뒤(`claude` 실행 후 /login) 메시지를 다시 보내 주세요.",
6970
7003
  "runtimeEvent.compactionCompleted": "대화 요약을 마쳤습니다. 이제 요약본을 맥락으로 이어갑니다.",
6971
7004
  "runtimeEvent.codexError": "Codex 오류: {detail}",
6972
7005
  "runtimeEvent.codexNoImages": "Codex 로 보낼 수 있는 이미지가 없었습니다.",
@@ -19511,6 +19544,7 @@ const CLAUDE_PROVIDER_PATTERN = /rate.?limit|too many requests|overloaded|model[
19511
19544
  const INACTIVITY_PREFIX = "stopped automatically";
19512
19545
  const PROCESS_EXITED_NOTICE = "process exited unexpectedly";
19513
19546
  const CLAUDE_OAUTH_FAILURE = /^Failed to authenticate\. API Error: 401 OAuth access token is invalid\.$/i;
19547
+ const CLAUDE_NOT_SIGNED_IN = /^(?:Not logged in · Please run \/login|Claude Code is not signed in on this machine\.)/i;
19514
19548
  const CLAUDE_SUBSCRIPTION_REFUSAL = /^Your organization has disabled Claude subscription access for Claude Code(?:\s*[·.—-]\s*Use an Anthropic API key instead, or ask your admin to enable access)?\.?$/i;
19515
19549
  function unsupportedModelSurface(text2) {
19516
19550
  if (detectModelLimitNotice(text2) || text2.toLowerCase().includes("requires a newer version of codex")) return null;
@@ -19526,7 +19560,7 @@ function messageErrorSurface(message) {
19526
19560
  if (message.role !== "agent" || message.thinking || message.toolCall) return null;
19527
19561
  const text2 = message.content?.trim() ?? "";
19528
19562
  if (CLAUDE_SUBSCRIPTION_REFUSAL.test(text2)) return { layer: "auth", code: "subscription_access_disabled", retryable: false };
19529
- if (CLAUDE_OAUTH_FAILURE.test(text2)) return { layer: "auth", code: "auth_failed", retryable: false };
19563
+ if (CLAUDE_OAUTH_FAILURE.test(text2) || CLAUDE_NOT_SIGNED_IN.test(text2)) return { layer: "auth", code: "auth_failed", retryable: false };
19530
19564
  return /^(you['’]ve|you have) reached your [a-z0-9.-]+ limit\./i.test(text2) && detectModelLimitNotice(text2) ? { layer: "provider", code: "model_limit", retryable: true } : null;
19531
19565
  }
19532
19566
  function classifyErrorSurface(rawText) {
@@ -19536,7 +19570,7 @@ function classifyErrorSurface(rawText) {
19536
19570
  if (text2 === "") return null;
19537
19571
  const lower = text2.toLowerCase();
19538
19572
  if (CLAUDE_SUBSCRIPTION_REFUSAL.test(text2)) return { layer: "auth", code: "subscription_access_disabled", retryable: false };
19539
- if (CLAUDE_OAUTH_FAILURE.test(text2)) return { layer: "auth", code: "auth_failed", retryable: false };
19573
+ if (CLAUDE_OAUTH_FAILURE.test(text2) || CLAUDE_NOT_SIGNED_IN.test(text2)) return { layer: "auth", code: "auth_failed", retryable: false };
19540
19574
  if (detectModelLimitNotice(text2)) {
19541
19575
  return { layer: "provider", code: "model_limit", retryable: true };
19542
19576
  }
@@ -19573,6 +19607,8 @@ const KNOWN_NOTICES = [
19573
19607
  ["Claude Code could not start: it refuses to run with permission prompts skipped as root. Run this machine's daemon as a regular user.", "runtimeEvent.claudeRootRefused"],
19574
19608
  ["Claude Code could not start: its executable could not be found on this machine. Reinstall happy-cli on it.", "runtimeEvent.claudeNotFound"],
19575
19609
  ["Claude Code could not start on this machine. Check this machine's daemon log for details.", "runtimeEvent.claudeCouldNotStart"],
19610
+ // happy-cli `CLAUDE_NOT_SIGNED_IN_NOTICE` (R36).
19611
+ ["Claude Code is not signed in on this machine. Sign in as the user that runs this machine's daemon (run `claude`, then /login) and send the message again.", "runtimeEvent.claudeNotSignedIn"],
19576
19612
  ["No supported images were available to send to Codex.", "runtimeEvent.codexNoImages"],
19577
19613
  [
19578
19614
  "Force-stopped active task after interrupt timeout. Codex backend was restarted and the previous thread was resumed.",
@@ -33107,6 +33143,10 @@ function renderTurnEnd(status, reason) {
33107
33143
  const TOOL_SUMMARY_MAX_LENGTH = 80;
33108
33144
  const TOOL_PROGRESS_VISIBLE_LINES = 3;
33109
33145
  const TOOL_SUMMARY_KEYS = ["command", "file_path", "path", "pattern", "query", "url", "prompt"];
33146
+ const TITLE_TOOL = "mcp__happy__change_title";
33147
+ function isInternalTitleCall(name, args) {
33148
+ return name === TITLE_TOOL || name === "ToolSearch" && args.query === `select:${TITLE_TOOL}`;
33149
+ }
33110
33150
  function truncate(value2, max) {
33111
33151
  if (value2.length <= max) return value2;
33112
33152
  return `${value2.slice(0, max - 1)}…`;
@@ -33136,6 +33176,10 @@ function renderSessionEvent(ev, envelopeRole, progressByCall, options) {
33136
33176
  case "service":
33137
33177
  return textLines(ev.text, "status");
33138
33178
  case "tool-call-start": {
33179
+ if (isInternalTitleCall(ev.name, ev.args)) {
33180
+ progressByCall.set(ev.call, { shown: 0, hidden: 0, lastHidden: null, muted: true });
33181
+ return [];
33182
+ }
33139
33183
  progressByCall.set(ev.call, { shown: 0, hidden: 0, lastHidden: null });
33140
33184
  const summary = summarizeToolArgs(ev.args) ?? (ev.description?.trim() || null);
33141
33185
  return [{ style: "tool", text: summary ? `⏺ ${ev.name}(${summary})` : `⏺ ${ev.name}` }];
@@ -33143,6 +33187,7 @@ function renderSessionEvent(ev, envelopeRole, progressByCall, options) {
33143
33187
  case "tool-call-progress": {
33144
33188
  const state = progressByCall.get(ev.call) ?? { shown: 0, hidden: 0, lastHidden: null };
33145
33189
  progressByCall.set(ev.call, state);
33190
+ if (state.muted) return [];
33146
33191
  const lines = [];
33147
33192
  for (const line2 of ev.lines) {
33148
33193
  if (ev.stream === "stderr") lines.push({ style: "error", text: ` │ ${line2}` });
@@ -40676,9 +40721,9 @@ function serverLogWriter(layout, name) {
40676
40721
  };
40677
40722
  }
40678
40723
  const happyCliPackageName = "@buzzni/happy-cli";
40679
- const happyCliVersion = "1.1.10-aplus.317";
40680
- const happyCliTag = "happy-cli-v1.1.10-aplus.317";
40681
- const vendorCommit = "d5fcae31b2fd14942813f1937a2e141c39b6d412";
40724
+ const happyCliVersion = "1.1.10-aplus.318";
40725
+ const happyCliTag = "happy-cli-v1.1.10-aplus.318";
40726
+ const vendorCommit = "236706106627e00c5b212fab7f9f98ce3ea05d97";
40682
40727
  const saycodeCliVersion = "0.8.2";
40683
40728
  const happyServerVersion = "0.1.2";
40684
40729
  const releaseFeatures = { "mcpRuntimeRecovery": { "enabled": true, "releaseState": "released", "sourceBranch": "main", "sourceHead": "a79a10e288cf7775cb15955f716693c6a7df1640", "requiredCommit": "975e32cf" } };
@@ -57241,7 +57286,39 @@ const projectScopeEn = {
57241
57286
  "projectScope.grantRevoked": "File access was revoked and the session restarted.",
57242
57287
  "projectScope.daemonUpgradeRequired": "Update Aplus CLI, then try again."
57243
57288
  };
57289
+ const machineSettingsLabelsEn = {
57290
+ "machineSettings.listRefreshed": "Machine list refreshed.",
57291
+ "machineSettings.codeGenerated": "Registration code generated.",
57292
+ "machineSettings.nameSaved": "Machine name saved.",
57293
+ "machineSettings.nameCleared": "Machine name cleared.",
57294
+ "machineSettings.nameSaveFailed": "Could not save the machine name.",
57295
+ "machineSettings.removed": "{name} was removed.",
57296
+ "machineSettings.zrokStopped": "zrok share stopped.",
57297
+ "machineSettings.zrokStart": "Start zrok",
57298
+ "machineSettings.zrokStarting": "Starting zrok",
57299
+ "machineSettings.zrokStop": "Stop zrok",
57300
+ "machineSettings.externalServerUrl": "External server URL",
57301
+ "machineSettings.externalServerUrlPlaceholder": "zrok URL for {url}",
57302
+ "machineSettings.liveModeOnly": "Machine registration and deletion are available in live mode.",
57303
+ "machineSettings.issuedCodes": "Issued codes",
57304
+ "machineSettings.generateCode": "Generate code",
57305
+ "machineSettings.registrationCode": "Registration code",
57306
+ "machineSettings.expiresAt": "Expires {time}",
57307
+ "machineSettings.expired": "Expired",
57308
+ "machineSettings.copyCommand": "Copy command",
57309
+ "machineSettings.commandCopied": "Copied",
57310
+ "machineSettings.loadingCodes": "Loading codes…",
57311
+ "machineSettings.loadingMachines": "Loading machines…",
57312
+ "machineSettings.emptyTitle": "No machines",
57313
+ "machineSettings.emptyOrganization": "No machines are available for the selected organization.",
57314
+ "machineSettings.emptyWorkspace": "No machines are available in the current workspace.",
57315
+ "machineSettings.rename": "Rename",
57316
+ "machineSettings.delete": "Delete",
57317
+ "machineSettings.confirmDelete": "Confirm delete",
57318
+ "machineSettings.organization": "Organization"
57319
+ };
57244
57320
  const machineSettingsConsoleEn = {
57321
+ ...machineSettingsLabelsEn,
57245
57322
  "machineConsole.showDetails": "Show machine details",
57246
57323
  "machineConsole.showDetailsHint": "Show details when hovering over or focusing a machine in the machine picker.",
57247
57324
  "machineConsole.environmentStatus": "Environment",
@@ -60949,6 +61026,7 @@ const en = {
60949
61026
  "runtimeEvent.claudeNotFound": "Claude Code could not start: its executable could not be found on this machine. Reinstall happy-cli on it.",
60950
61027
  "runtimeEvent.claudeStoppedBySignal": "Claude Code could not start: it stopped unexpectedly ({signal}). Check this machine's daemon log.",
60951
61028
  "runtimeEvent.claudeCouldNotStart": "Claude Code could not start on this machine. Check this machine's daemon log for details.",
61029
+ "runtimeEvent.claudeNotSignedIn": "Claude Code is not signed in on this machine. Sign in as the user that runs this machine's daemon (run `claude`, then /login) and send the message again.",
60952
61030
  "runtimeEvent.compactionCompleted": "Finished summarizing. The conversation continues from that summary.",
60953
61031
  "runtimeEvent.codexError": "Codex error: {detail}",
60954
61032
  "runtimeEvent.codexNoImages": "There were no images that could be sent to Codex.",
@@ -64544,7 +64622,39 @@ const projectScopeZh = {
64544
64622
  "projectScope.grantRevoked": "文件访问权限已撤销,会话已重新启动。",
64545
64623
  "projectScope.daemonUpgradeRequired": "请更新 Aplus CLI 后重试。"
64546
64624
  };
64625
+ const machineSettingsLabelsZh = {
64626
+ "machineSettings.listRefreshed": "已刷新电脑列表。",
64627
+ "machineSettings.codeGenerated": "已生成注册码。",
64628
+ "machineSettings.nameSaved": "已保存电脑名称。",
64629
+ "machineSettings.nameCleared": "已清除电脑名称。",
64630
+ "machineSettings.nameSaveFailed": "无法保存电脑名称。",
64631
+ "machineSettings.removed": "已删除 {name}。",
64632
+ "machineSettings.zrokStopped": "已停止 zrok 共享。",
64633
+ "machineSettings.zrokStart": "启动 zrok",
64634
+ "machineSettings.zrokStarting": "正在启动 zrok",
64635
+ "machineSettings.zrokStop": "停止 zrok",
64636
+ "machineSettings.externalServerUrl": "外部服务器地址",
64637
+ "machineSettings.externalServerUrlPlaceholder": "{url} 的 zrok 地址",
64638
+ "machineSettings.liveModeOnly": "只能在实时模式下注册和删除电脑。",
64639
+ "machineSettings.issuedCodes": "已发放的代码",
64640
+ "machineSettings.generateCode": "生成注册码",
64641
+ "machineSettings.registrationCode": "注册码",
64642
+ "machineSettings.expiresAt": "{time} 过期",
64643
+ "machineSettings.expired": "已过期",
64644
+ "machineSettings.copyCommand": "复制命令",
64645
+ "machineSettings.commandCopied": "已复制",
64646
+ "machineSettings.loadingCodes": "正在加载代码…",
64647
+ "machineSettings.loadingMachines": "正在加载电脑…",
64648
+ "machineSettings.emptyTitle": "没有电脑",
64649
+ "machineSettings.emptyOrganization": "所选组织中没有可用的电脑。",
64650
+ "machineSettings.emptyWorkspace": "当前工作空间中没有可用的电脑。",
64651
+ "machineSettings.rename": "重命名",
64652
+ "machineSettings.delete": "删除",
64653
+ "machineSettings.confirmDelete": "确认删除",
64654
+ "machineSettings.organization": "组织"
64655
+ };
64547
64656
  const machineSettingsConsoleZh = {
64657
+ ...machineSettingsLabelsZh,
64548
64658
  "machineConsole.showDetails": "显示机器详细信息",
64549
64659
  "machineConsole.showDetailsHint": "在机器选择列表中悬停或用键盘聚焦时显示详细信息。",
64550
64660
  "machineConsole.environmentStatus": "环境·状态",
@@ -68219,6 +68329,7 @@ const zh = {
68219
68329
  "runtimeEvent.claudeNotFound": "无法启动 Claude Code:在这台机器上找不到可执行文件。请在这台机器上重新安装 happy-cli。",
68220
68330
  "runtimeEvent.claudeStoppedBySignal": "无法启动 Claude Code:它意外停止了({signal})。请查看这台机器的 daemon 日志。",
68221
68331
  "runtimeEvent.claudeCouldNotStart": "无法在这台机器上启动 Claude Code。详情请查看这台机器的 daemon 日志。",
68332
+ "runtimeEvent.claudeNotSignedIn": "这台机器上的 Claude Code 尚未登录。请以运行这台机器 daemon 的用户登录(运行 `claude` 后执行 /login),然后重新发送消息。",
68222
68333
  "runtimeEvent.compactionCompleted": "对话摘要已完成,之后将以该摘要作为上下文继续。",
68223
68334
  "runtimeEvent.codexError": "Codex 错误:{detail}",
68224
68335
  "runtimeEvent.codexNoImages": "没有可发送给 Codex 的图片。",
@@ -71847,7 +71958,39 @@ const projectScopeJa = {
71847
71958
  "projectScope.grantRevoked": "ファイルアクセスを取り消してセッションを再起動しました。",
71848
71959
  "projectScope.daemonUpgradeRequired": "Aplus CLI を更新してから、もう一度お試しください。"
71849
71960
  };
71961
+ const machineSettingsLabelsJa = {
71962
+ "machineSettings.listRefreshed": "マシン一覧を更新しました。",
71963
+ "machineSettings.codeGenerated": "登録コードを作成しました。",
71964
+ "machineSettings.nameSaved": "マシン名を保存しました。",
71965
+ "machineSettings.nameCleared": "マシン名を消去しました。",
71966
+ "machineSettings.nameSaveFailed": "マシン名を保存できませんでした。",
71967
+ "machineSettings.removed": "{name}を削除しました。",
71968
+ "machineSettings.zrokStopped": "zrok共有を停止しました。",
71969
+ "machineSettings.zrokStart": "zrokを開始",
71970
+ "machineSettings.zrokStarting": "zrokを開始中",
71971
+ "machineSettings.zrokStop": "zrokを停止",
71972
+ "machineSettings.externalServerUrl": "外部サーバーURL",
71973
+ "machineSettings.externalServerUrlPlaceholder": "{url}のzrok URL",
71974
+ "machineSettings.liveModeOnly": "マシンの登録と削除はライブモードでのみ利用できます。",
71975
+ "machineSettings.issuedCodes": "発行したコード",
71976
+ "machineSettings.generateCode": "登録コードを作成",
71977
+ "machineSettings.registrationCode": "登録コード",
71978
+ "machineSettings.expiresAt": "{time}に期限切れ",
71979
+ "machineSettings.expired": "期限切れ",
71980
+ "machineSettings.copyCommand": "コマンドをコピー",
71981
+ "machineSettings.commandCopied": "コピーしました",
71982
+ "machineSettings.loadingCodes": "コードを読み込み中…",
71983
+ "machineSettings.loadingMachines": "マシンを読み込み中…",
71984
+ "machineSettings.emptyTitle": "マシンがありません",
71985
+ "machineSettings.emptyOrganization": "選択した組織で使えるマシンがありません。",
71986
+ "machineSettings.emptyWorkspace": "現在のワークスペースで使えるマシンがありません。",
71987
+ "machineSettings.rename": "名前を変更",
71988
+ "machineSettings.delete": "削除",
71989
+ "machineSettings.confirmDelete": "削除を確認",
71990
+ "machineSettings.organization": "組織"
71991
+ };
71850
71992
  const machineSettingsConsoleJa = {
71993
+ ...machineSettingsLabelsJa,
71851
71994
  "machineConsole.showDetails": "マシンの詳細を表示",
71852
71995
  "machineConsole.showDetailsHint": "マシン選択でカーソルを合わせるかキーボードで移動すると詳細を表示します。",
71853
71996
  "machineConsole.environmentStatus": "環境・状態",
@@ -75522,6 +75665,7 @@ const ja = {
75522
75665
  "runtimeEvent.claudeNotFound": "Claude Codeを起動できませんでした。このマシンで実行ファイルが見つかりません。このマシンにhappy-cliを再インストールしてください。",
75523
75666
  "runtimeEvent.claudeStoppedBySignal": "Claude Codeを起動できませんでした。予期せず停止しました({signal})。このマシンのdaemonログを確認してください。",
75524
75667
  "runtimeEvent.claudeCouldNotStart": "このマシンでClaude Codeを起動できませんでした。詳しくはこのマシンのdaemonログを確認してください。",
75668
+ "runtimeEvent.claudeNotSignedIn": "このマシンではClaude Codeにログインしていません。このマシンのdaemonを実行しているユーザーでログインしてから(`claude`を実行して/login)、メッセージをもう一度送信してください。",
75525
75669
  "runtimeEvent.compactionCompleted": "会話の要約が完了しました。これ以降は要約をコンテキストとして続けます。",
75526
75670
  "runtimeEvent.codexError": "Codex エラー: {detail}",
75527
75671
  "runtimeEvent.codexNoImages": "Codex に送れる画像がありませんでした。",
@@ -83375,6 +83519,23 @@ const EXTENSION_PANEL_SURFACE_SIZES = ["compact", "standard", "wide"];
83375
83519
  function isExtensionPanelSurfaceSize(value2) {
83376
83520
  return EXTENSION_PANEL_SURFACE_SIZES.some((size) => size === value2);
83377
83521
  }
83522
+ function parseExtensionProjectTools(value2, apiVersion) {
83523
+ if (apiVersion < 3) fail$7("manifest.contributes.projectTools", "requires Extension API version 3");
83524
+ return contributionList(value2, "manifest.contributes.projectTools", ["id", "title", "command"], (entry, path2) => ({
83525
+ id: id$1(entry.id, `${path2}.id`),
83526
+ title: string(entry.title, `${path2}.title`),
83527
+ command: id$1(entry.command, `${path2}.command`)
83528
+ }));
83529
+ }
83530
+ function assertExtensionProjectToolTargets(extensionId, tools, commands) {
83531
+ for (const [index, tool] of tools.entries()) {
83532
+ const path2 = `manifest.contributes.projectTools[${index}]`;
83533
+ if (!tool.id.startsWith(`${extensionId}.`)) fail$7(`${path2}.id`, "expected an id declared by the same extension");
83534
+ const command = tool.command.startsWith(`${extensionId}.`) ? commands.find((candidate) => candidate.id === tool.command) : void 0;
83535
+ if (!command) fail$7(`${path2}.command`, "expected a command declared by the same extension");
83536
+ if (!command.panelId) fail$7(`${path2}.command`, "expected a command that opens a panel");
83537
+ }
83538
+ }
83378
83539
  const EXTENSION_ARTIFACT_ACTION_OPERATIONS = ["publishPublic"];
83379
83540
  const EXTENSION_ARTIFACT_SOURCE_TYPES = ["project-file", "personal-chat-file"];
83380
83541
  const ID_PATTERN$2 = /^[a-z0-9](?:[a-z0-9.-]*[a-z0-9])?$/;
@@ -83863,7 +84024,7 @@ const EXTENSION_PERMISSIONS = [
83863
84024
  const SAYCODE_EXTENSION_API_VERSION = 3;
83864
84025
  const SAYCODE_EXTENSION_MINIMUM_API_VERSION = 2;
83865
84026
  const MAX_EXTENSION_API_WINDOW_WIDTH = 2;
83866
- const SAYCODE_EXTENSION_ENGINE_VERSION = "1.1.0";
84027
+ const SAYCODE_EXTENSION_ENGINE_VERSION = "1.2.0";
83867
84028
  const SAYCODE_CHANNEL_API_VERSION = CHANNEL_API_VERSION;
83868
84029
  const SAYCODE_CHANNEL_MINIMUM_API_VERSION = CHANNEL_MINIMUM_API_VERSION;
83869
84030
  class UnsupportedChannelApiVersionError2 extends Error {
@@ -83886,7 +84047,7 @@ const SEMVER_PATTERN$1 = /^\d+\.\d+\.\d+(?:-[0-9A-Za-z.-]+)?(?:\+[0-9A-Za-z.-]+)
83886
84047
  const ENGINE_RANGE_PATTERN = /^(?:\^|~|>=|<=|>|<)?\d+\.\d+\.\d+(?:-[0-9A-Za-z.-]+)?$/;
83887
84048
  const ENTRYPOINT_PATTERN = /\.(?:cjs|mjs|js)$/;
83888
84049
  const LOCALE_PATTERN = /^[a-z]{2,3}(?:-[A-Z]{2})?$/;
83889
- const CONTRIBUTION_KEYS = /* @__PURE__ */ new Set(["commands", "settings", "panels", "projectTemplates", "machineActions", "artifactActions", "channels"]);
84050
+ const CONTRIBUTION_KEYS = /* @__PURE__ */ new Set(["commands", "settings", "panels", "projectTemplates", "machineActions", "projectTools", "artifactActions", "channels"]);
83890
84051
  const V2_PERMISSIONS = /* @__PURE__ */ new Set([
83891
84052
  "browserViewer.open",
83892
84053
  "browserViewer.install",
@@ -84093,6 +84254,7 @@ function parseContributions(value2, apiVersion, channelApiVersion) {
84093
84254
  }
84094
84255
  );
84095
84256
  }
84257
+ if (parsed2.projectTools !== void 0) result2.projectTools = parseExtensionProjectTools(parsed2.projectTools, apiVersion);
84096
84258
  if (parsed2.artifactActions !== void 0) {
84097
84259
  result2.artifactActions = parseExtensionArtifactActions(parsed2.artifactActions);
84098
84260
  }
@@ -84105,6 +84267,7 @@ function parseContributions(value2, apiVersion, channelApiVersion) {
84105
84267
  ...result2.panels ?? [],
84106
84268
  ...result2.projectTemplates ?? [],
84107
84269
  ...result2.machineActions ?? [],
84270
+ ...result2.projectTools ?? [],
84108
84271
  ...result2.artifactActions ?? [],
84109
84272
  ...result2.channels ?? []
84110
84273
  ].map((entry) => entry.id);
@@ -84208,6 +84371,7 @@ function parseExtensionManifest(value2, options) {
84208
84371
  );
84209
84372
  }
84210
84373
  }
84374
+ assertExtensionProjectToolTargets(parsedId, contributes.projectTools ?? [], contributes.commands ?? []);
84211
84375
  return {
84212
84376
  id: parsedId,
84213
84377
  version: version2,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@buzzni/saycode-cli",
3
- "version": "0.9.1",
3
+ "version": "0.9.2",
4
4
  "description": "Drive Saycode sessions across your machines from the terminal.",
5
5
  "type": "module",
6
6
  "bin": {