@co0ontty/wand 4.93.0 → 4.94.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.
Files changed (172) hide show
  1. package/README.md +25 -30
  2. package/dist/ai-text-runner.d.ts +2 -10
  3. package/dist/ai-text-runner.js +13 -74
  4. package/dist/build-info.json +3 -3
  5. package/dist/cli.js +47 -9
  6. package/dist/config.d.ts +2 -3
  7. package/dist/config.js +26 -5
  8. package/dist/core-status-cli.d.ts +1 -1
  9. package/dist/core-status-cli.js +3 -1
  10. package/dist/daemon-connection.d.ts +10 -0
  11. package/dist/daemon-connection.js +28 -0
  12. package/dist/diagnostic-logs.d.ts +10 -0
  13. package/dist/diagnostic-logs.js +121 -0
  14. package/dist/employee-text.js +1 -3
  15. package/dist/git-quick-commit.d.ts +1 -1
  16. package/dist/git-quick-commit.js +2 -9
  17. package/dist/layout-tree.d.ts +3 -1
  18. package/dist/layout-tree.js +8 -0
  19. package/dist/local-model-process.js +20 -0
  20. package/dist/local-model-setup.js +5 -3
  21. package/dist/managed-temp.d.ts +32 -0
  22. package/dist/managed-temp.js +176 -0
  23. package/dist/middleware/api-scope.js +1 -0
  24. package/dist/models/shared.d.ts +0 -6
  25. package/dist/models/shared.js +0 -12
  26. package/dist/models/thinking.d.ts +0 -2
  27. package/dist/models/thinking.js +0 -2
  28. package/dist/models.d.ts +0 -1
  29. package/dist/models.js +3 -11
  30. package/dist/native-session-title.d.ts +1 -1
  31. package/dist/native-session-title.js +1 -1
  32. package/dist/pi-model-discovery.js +5 -17
  33. package/dist/pi-resource-recommendation.d.ts +1 -1
  34. package/dist/pi-resource-recommendation.js +129 -42
  35. package/dist/process-manager-native-history.js +1 -6
  36. package/dist/process-manager.d.ts +0 -1
  37. package/dist/process-manager.js +5 -18
  38. package/dist/provider-catalog.d.ts +1 -2
  39. package/dist/provider-catalog.js +1 -6
  40. package/dist/provider-cli-updater.js +1 -9
  41. package/dist/provider-history-scanner.d.ts +0 -3
  42. package/dist/provider-history-scanner.js +0 -26
  43. package/dist/render-daemon-client.js +6 -29
  44. package/dist/render-structured-client.js +2 -7
  45. package/dist/retention.js +1 -6
  46. package/dist/run-command.d.ts +5 -0
  47. package/dist/run-command.js +14 -1
  48. package/dist/server-session-lifecycle-routes.js +1 -1
  49. package/dist/server-storage-cleanup-routes.d.ts +3 -0
  50. package/dist/server-storage-cleanup-routes.js +19 -0
  51. package/dist/server-workspace-routes.d.ts +4 -1
  52. package/dist/server-workspace-routes.js +75 -9
  53. package/dist/server.js +21 -16
  54. package/dist/service-command-privilege.d.ts +17 -0
  55. package/dist/service-command-privilege.js +55 -0
  56. package/dist/service-manager/index.d.ts +3 -0
  57. package/dist/service-manager/index.js +3 -0
  58. package/dist/service-manager/launchd.d.ts +1 -0
  59. package/dist/service-manager/launchd.js +15 -0
  60. package/dist/service-manager/systemd.d.ts +1 -0
  61. package/dist/service-manager/systemd.js +11 -0
  62. package/dist/session-ai-context.js +17 -6
  63. package/dist/session-completion-state.d.ts +2 -0
  64. package/dist/session-completion-state.js +6 -2
  65. package/dist/session-logger.js +7 -1
  66. package/dist/session-model.d.ts +4 -0
  67. package/dist/session-model.js +13 -4
  68. package/dist/session-registry.d.ts +1 -1
  69. package/dist/session-registry.js +0 -3
  70. package/dist/silicon-employee-draft.js +0 -1
  71. package/dist/speech-service.js +18 -8
  72. package/dist/storage/mappers.js +6 -10
  73. package/dist/storage/migrations.js +14 -0
  74. package/dist/storage/uploads-repository.d.ts +36 -0
  75. package/dist/storage/uploads-repository.js +98 -0
  76. package/dist/storage-cleanup.d.ts +50 -0
  77. package/dist/storage-cleanup.js +344 -0
  78. package/dist/storage.d.ts +3 -1
  79. package/dist/storage.js +4 -0
  80. package/dist/structured-failure.d.ts +2 -0
  81. package/dist/structured-failure.js +9 -0
  82. package/dist/structured-grok-adapter.js +4 -4
  83. package/dist/structured-opencode-adapter.js +4 -9
  84. package/dist/structured-provider-common.d.ts +1 -2
  85. package/dist/structured-provider-common.js +3 -6
  86. package/dist/structured-session-manager-replay.js +2 -6
  87. package/dist/structured-session-manager.d.ts +1 -2
  88. package/dist/structured-session-manager.js +32 -25
  89. package/dist/task-organize-contract.d.ts +41 -0
  90. package/dist/task-organize-contract.js +4 -0
  91. package/dist/task-title-organize-service.d.ts +21 -0
  92. package/dist/task-title-organize-service.js +168 -0
  93. package/dist/task-title-organize.d.ts +77 -0
  94. package/dist/task-title-organize.js +346 -0
  95. package/dist/terminal-daemon-client.js +10 -48
  96. package/dist/time-utils.d.ts +2 -0
  97. package/dist/time-utils.js +7 -0
  98. package/dist/tui/attach.js +6 -5
  99. package/dist/tui/commands.d.ts +4 -1
  100. package/dist/tui/commands.js +36 -25
  101. package/dist/tui/index.js +2 -2
  102. package/dist/tui/service-actions.js +5 -4
  103. package/dist/tui/service-command.d.ts +6 -0
  104. package/dist/tui/service-command.js +40 -0
  105. package/dist/tui/service-panel.js +9 -8
  106. package/dist/types.d.ts +4 -4
  107. package/dist/upload-reference-guard.d.ts +4 -0
  108. package/dist/upload-reference-guard.js +29 -0
  109. package/dist/upload-routes.d.ts +4 -0
  110. package/dist/upload-routes.js +121 -21
  111. package/dist/user-profile.d.ts +1 -1
  112. package/dist/user-profile.js +8 -3
  113. package/dist/web-ui/content/ai-teams.js +9 -9
  114. package/dist/web-ui/content/module-manifest.json +1 -1
  115. package/dist/web-ui/content/modules/{2548dbe0d0783577/chat-render-EODYMQF6.js → 0051bd3d55f10ab7/chat-render-RY2I2CF3.js} +1 -1
  116. package/dist/web-ui/content/modules/{2548dbe0d0783577/chunk-ZTEQSXPA.js → 0051bd3d55f10ab7/chunk-2F6J2MKX.js} +1 -1
  117. package/dist/web-ui/content/modules/{2548dbe0d0783577/chunk-A33YPCY6.js → 0051bd3d55f10ab7/chunk-7AFM245W.js} +1 -1
  118. package/dist/web-ui/content/modules/{2548dbe0d0783577/chunk-QNUWUMKW.js → 0051bd3d55f10ab7/chunk-MHX2QXIS.js} +1 -1
  119. package/dist/web-ui/content/modules/{2548dbe0d0783577/chunk-WGADUEIT.js → 0051bd3d55f10ab7/chunk-RAAPETNH.js} +1 -1
  120. package/dist/web-ui/content/modules/{2548dbe0d0783577/chunk-I3UYDQLS.js → 0051bd3d55f10ab7/chunk-RXKBHYUR.js} +2 -2
  121. package/dist/web-ui/content/modules/{2548dbe0d0783577/chunk-3TCUG766.js → 0051bd3d55f10ab7/chunk-U4EDP4TI.js} +1 -1
  122. package/dist/web-ui/content/modules/{2548dbe0d0783577/chunk-HK7RBU3M.js → 0051bd3d55f10ab7/chunk-WHXQR7JT.js} +1 -1
  123. package/dist/web-ui/content/modules/0051bd3d55f10ab7/employee-card-NV34TZIH.js +1 -0
  124. package/dist/web-ui/content/modules/{2548dbe0d0783577/host-2PU6TV2I.js → 0051bd3d55f10ab7/host-2IVIZ2YC.js} +1 -1
  125. package/dist/web-ui/content/modules/{2548dbe0d0783577/host-BPYNMKFC.js → 0051bd3d55f10ab7/host-AZXNFCRW.js} +1 -1
  126. package/dist/web-ui/content/modules/{2548dbe0d0783577/host-HZIKPWYY.js → 0051bd3d55f10ab7/host-EPEQX22R.js} +1 -1
  127. package/dist/web-ui/content/modules/{2548dbe0d0783577/host-YELXZID4.js → 0051bd3d55f10ab7/host-FZYIMOLC.js} +1 -1
  128. package/dist/web-ui/content/modules/{2548dbe0d0783577/host-OGD6AWHL.js → 0051bd3d55f10ab7/host-G6GL4SNL.js} +1 -1
  129. package/dist/web-ui/content/modules/{2548dbe0d0783577/host-E3SCPOIU.js → 0051bd3d55f10ab7/host-PEILC5NU.js} +1 -1
  130. package/dist/web-ui/content/modules/{2548dbe0d0783577/host-OWD32FZ3.js → 0051bd3d55f10ab7/host-PHHNGVNL.js} +2 -2
  131. package/dist/web-ui/content/modules/{2548dbe0d0783577/host-CXDAFMXX.js → 0051bd3d55f10ab7/host-Q524TMSR.js} +1 -1
  132. package/dist/web-ui/content/modules/0051bd3d55f10ab7/host-RO5MB6RB.js +69 -0
  133. package/dist/web-ui/content/modules/{2548dbe0d0783577/host-J5XRAQFP.js → 0051bd3d55f10ab7/host-WOQRK6NG.js} +1 -1
  134. package/dist/web-ui/content/modules/{2548dbe0d0783577/host-HKXE2DOT.js → 0051bd3d55f10ab7/host-XNIR3NTJ.js} +1 -1
  135. package/dist/web-ui/content/modules/{2548dbe0d0783577/host-4E4H4JZJ.js → 0051bd3d55f10ab7/host-XRVOIEP6.js} +1 -1
  136. package/dist/web-ui/content/modules/0051bd3d55f10ab7/host-ZDKOQEMS.js +1 -0
  137. package/dist/web-ui/content/modules/0051bd3d55f10ab7/host-bridge-PMQZRG5G.js +1 -0
  138. package/dist/web-ui/content/modules/{2548dbe0d0783577/library-bridge-Y3Y24CPQ.js → 0051bd3d55f10ab7/library-bridge-DTMQIHVJ.js} +1 -1
  139. package/dist/web-ui/content/modules/{2548dbe0d0783577/page-GQBUU7T7.js → 0051bd3d55f10ab7/page-PY4JUL4W.js} +1 -1
  140. package/dist/web-ui/content/modules/{2548dbe0d0783577/panel-PG662OC5.js → 0051bd3d55f10ab7/panel-BBQFC55Q.js} +1 -1
  141. package/dist/web-ui/content/modules/0051bd3d55f10ab7/runtime.js +974 -0
  142. package/dist/web-ui/content/modules/0051bd3d55f10ab7/task-board-host-PXZSWBBG.js +2 -0
  143. package/dist/web-ui/content/modules/0051bd3d55f10ab7/workspace-agent-picker-DJSECSY6.js +1 -0
  144. package/dist/web-ui/content/modules/{2548dbe0d0783577/workspace-window-HV4T3WKR.js → 0051bd3d55f10ab7/workspace-window-MNMKSOBG.js} +1 -1
  145. package/dist/web-ui/content/styles.css +1 -1
  146. package/dist/web-ui/embedded-assets.d.ts +27 -27
  147. package/dist/web-ui/embedded-assets.js +4 -4
  148. package/dist/web-ui/provider-identity.d.ts +4 -5
  149. package/dist/web-ui/provider-identity.js +4 -10
  150. package/dist/web-ui/react/workspaces/sidebar-manage.d.ts +39 -0
  151. package/dist/web-ui/react/workspaces/sidebar-manage.js +149 -0
  152. package/dist/web-ui/react/workspaces/types.d.ts +408 -0
  153. package/dist/web-ui/react/workspaces/types.js +16 -0
  154. package/dist/web-ui/session-activity.js +1 -1
  155. package/package.json +2 -2
  156. package/dist/structured-gemini-adapter.d.ts +0 -40
  157. package/dist/structured-gemini-adapter.js +0 -208
  158. package/dist/web-ui/content/modules/2548dbe0d0783577/chunk-XGVT4ZWT.js +0 -1
  159. package/dist/web-ui/content/modules/2548dbe0d0783577/employee-card-LJ3TX72B.js +0 -1
  160. package/dist/web-ui/content/modules/2548dbe0d0783577/host-ITV2QZ4A.js +0 -1
  161. package/dist/web-ui/content/modules/2548dbe0d0783577/host-XNWC7KPR.js +0 -69
  162. package/dist/web-ui/content/modules/2548dbe0d0783577/host-bridge-G5HEVADT.js +0 -1
  163. package/dist/web-ui/content/modules/2548dbe0d0783577/runtime.js +0 -946
  164. package/dist/web-ui/content/modules/2548dbe0d0783577/task-board-host-RAN2Z2KR.js +0 -2
  165. package/dist/web-ui/content/modules/2548dbe0d0783577/workspace-agent-picker-FXLH6N5K.js +0 -1
  166. /package/dist/web-ui/content/modules/{2548dbe0d0783577/chunk-YX475LXO.js → 0051bd3d55f10ab7/chunk-6C6A2RHG.js} +0 -0
  167. /package/dist/web-ui/content/modules/{2548dbe0d0783577/chunk-NP35GDQ3.js → 0051bd3d55f10ab7/chunk-ECWYA3U5.js} +0 -0
  168. /package/dist/web-ui/content/modules/{2548dbe0d0783577/chunk-47EVOSJS.js → 0051bd3d55f10ab7/chunk-T35D57FW.js} +0 -0
  169. /package/dist/web-ui/content/modules/{2548dbe0d0783577 → 0051bd3d55f10ab7}/chunk-YOXXNXOX.js +0 -0
  170. /package/dist/web-ui/content/modules/{2548dbe0d0783577/chunk-C3K34WJD.js → 0051bd3d55f10ab7/chunk-YQJ6XYV7.js} +0 -0
  171. /package/dist/web-ui/content/modules/{2548dbe0d0783577/host-J6HBDK4A.js → 0051bd3d55f10ab7/host-2AQAIUNO.js} +0 -0
  172. /package/dist/web-ui/content/modules/{2548dbe0d0783577 → 0051bd3d55f10ab7}/sha256-ANXV72UC.js +0 -0
@@ -1,6 +1,6 @@
1
- import { SESSION_PROVIDERS as PROVIDER_IDS, inferProviderFromCommand, normalizeProviderId, type SessionProvider } from "../provider-catalog.js";
2
- export { inferProviderFromCommand, providerCliCommand, providerDisplayName, isNativeThinkingEffort, NATIVE_THINKING_EFFORT_PATTERN, PROVIDER_LABELS, WAND_AGENT_LABEL, } from "../provider-catalog.js";
3
- export { PROVIDER_IDS, normalizeProviderId };
1
+ import { SESSION_PROVIDERS as PROVIDER_IDS, PROVIDER_LABELS, WAND_AGENT_LABEL, inferProviderFromCommand, isNativeThinkingEffort, NATIVE_THINKING_EFFORT_PATTERN, normalizeProviderId, providerCliCommand, providerDisplayName, type SessionProvider } from "../provider-catalog.js";
2
+ export { providerCliCommand, isNativeThinkingEffort, NATIVE_THINKING_EFFORT_PATTERN, PROVIDER_LABELS, WAND_AGENT_LABEL, };
3
+ export { PROVIDER_IDS, normalizeProviderId, inferProviderFromCommand, providerDisplayName };
4
4
  export type ProviderId = SessionProvider;
5
5
  /** 兼容旧名:浏览器层的调用点叫 inferProviderIdFromCommand。 */
6
6
  export declare const inferProviderIdFromCommand: typeof inferProviderFromCommand;
@@ -22,7 +22,7 @@ export interface AgentToolOption {
22
22
  }
23
23
  /** Wand Agent(进程内 SDK)的选项 id;不是 provider 名,只是一个 UI 侧的稳定标识。 */
24
24
  export declare const WAND_AGENT_TOOL_ID = "wand-agent";
25
- /** 执行工具清单:顺序即 UI 顺序,与 provider-catalog 的 SESSION_PROVIDERS 保持一致。 */
25
+ /** 执行工具清单:顺序即 UI 顺序,与浏览器当前开放的 provider 保持一致。 */
26
26
  export declare const AGENT_TOOL_OPTIONS: readonly AgentToolOption[];
27
27
  /** 按选项 id 取执行工具;认不出来时返回 null(调用方自己决定回退)。 */
28
28
  export declare function agentToolOption(id: string | null | undefined): AgentToolOption | null;
@@ -40,7 +40,6 @@ export declare const CLAUDE_LOGO_PATH = "m4.7144 15.9555 4.7174-2.6471.079-.2307
40
40
  export declare const CODEX_LOGO_PATH = "M22.2819 9.8211a5.9847 5.9847 0 0 0-.5157-4.9108 6.0462 6.0462 0 0 0-6.5098-2.9A6.0651 6.0651 0 0 0 4.9807 4.1818a5.9847 5.9847 0 0 0-3.9977 2.9 6.0462 6.0462 0 0 0 .7427 7.0966 5.98 5.98 0 0 0 .511 4.9107 6.051 6.051 0 0 0 6.5146 2.9001A5.9847 5.9847 0 0 0 13.2599 24a6.0557 6.0557 0 0 0 5.7718-4.2058 5.9894 5.9894 0 0 0 3.9977-2.9001 6.0557 6.0557 0 0 0-.7475-7.0729zm-9.022 12.6081a4.4755 4.4755 0 0 1-2.8764-1.0408l.1419-.0804 4.7783-2.7582a.7948.7948 0 0 0 .3927-.6813v-6.7369l2.02 1.1686a.071.071 0 0 1 .038.052v5.5826a4.504 4.504 0 0 1-4.4945 4.4944zm-9.6607-4.1254a4.4708 4.4708 0 0 1-.5346-3.0137l.142.0852 4.783 2.7582a.7712.7712 0 0 0 .7806 0l5.8428-3.3685v2.3324a.0804.0804 0 0 1-.0332.0615L9.74 19.9502a4.4992 4.4992 0 0 1-6.1408-1.6464zM2.3408 7.8956a4.485 4.485 0 0 1 2.3655-1.9728V11.6a.7664.7664 0 0 0 .3879.6765l5.8144 3.3543-2.0201 1.1685a.0757.0757 0 0 1-.071 0l-4.8303-2.7865A4.504 4.504 0 0 1 2.3408 7.872zm16.5963 3.8558L13.1038 8.364 15.1192 7.2a.0757.0757 0 0 1 .071 0l4.8303 2.7913a4.4944 4.4944 0 0 1-.6765 8.1042v-5.6772a.79.79 0 0 0-.407-.667zm2.0107-3.0231l-.142-.0852-4.7735-2.7818a.7759.7759 0 0 0-.7854 0L9.409 9.2297V6.8974a.0662.0662 0 0 1 .0284-.0615l4.8303-2.7866a4.4992 4.4992 0 0 1 6.6802 4.66zM8.3065 12.863l-2.02-1.1638a.0804.0804 0 0 1-.038-.0567V6.0742a4.4992 4.4992 0 0 1 7.3757-3.4537l-.142.0805L8.704 5.459a.7948.7948 0 0 0-.3927.6813zm1.0976-2.3654l2.602-1.4998 2.6069 1.4998v2.9994l-2.5974 1.4997-2.6067-1.4997Z";
41
41
  export declare const PI_LOGO_PATH = "M165.29 165.29H517.36V400H400V517.36H282.65V634.72H165.29ZM282.65 282.65V400H400V282.65Z";
42
42
  export declare const PI_LOGO_DOT_PATH = "M517.36 400H634.72V634.72H517.36Z";
43
- export declare const GEMINI_LOGO_PATH = "M11.04 19.32Q12 21.51 12 24q0-2.49.93-4.68.96-2.19 2.58-3.81t3.81-2.55Q21.51 12 24 12q-2.49 0-4.68-.93a12.3 12.3 0 0 1-3.81-2.58 12.3 12.3 0 0 1-2.58-3.81Q12 2.49 12 0q0 2.49-.96 4.68-.93 2.19-2.55 3.81a12.3 12.3 0 0 1-3.81 2.58Q2.49 12 0 12q2.49 0 4.68.96 2.19.93 3.81 2.55t2.55 3.81";
44
43
  export declare const GROK_LOGO_PATHS: readonly ["M13.2371 21.0407L24.3186 12.8506C24.8619 12.4491 25.6384 12.6057 25.8973 13.2294C27.2597 16.5185 26.651 20.4712 23.9403 23.1851C21.2297 25.8989 17.4581 26.4941 14.0108 25.1386L10.2449 26.8843C15.6463 30.5806 22.2053 29.6665 26.304 25.5601C29.5551 22.3051 30.562 17.8683 29.6205 13.8673L29.629 13.8758C28.2637 7.99809 29.9647 5.64871 33.449.844576C33.5314.730667 33.6139.616757 33.6964.5L29.1113 5.09055V5.07631L13.2343 21.0436Z", "M10.9503 23.0313C7.07343 19.3235 7.74185 13.5853 11.0498 10.2763C13.4959 7.82722 17.5036 6.82767 21.0021 8.2971L24.7595 6.55998C24.0826 6.07017 23.215 5.54334 22.2195 5.17313C17.7198 3.31926 12.3326 4.24192 8.67479 7.90126C5.15635 11.4239 4.0499 16.8403 5.94992 21.4622C7.36924 24.9165 5.04257 27.3598 2.69884 29.826C1.86829 30.7002 1.0349 31.5745.36364 32.5L10.9474 23.0341Z"];
45
44
  /** Framework-free counterpart used by the legacy Shell rollback path. */
46
45
  export declare function renderProviderLogoMarkup(value: unknown): string;
@@ -1,13 +1,13 @@
1
1
  // Provider 的列表 / 别名 / 展示名 / 推断规则统一在 src/provider-catalog.ts(服务端共用)。
2
2
  // 这里只补充浏览器层特有的品牌 logo 与 HTML 渲染。
3
- import { SESSION_PROVIDERS as PROVIDER_IDS, PROVIDER_LABELS, WAND_AGENT_LABEL, inferProviderFromCommand, normalizeProviderId, providerDisplayName, } from "../provider-catalog.js";
4
- export { inferProviderFromCommand, providerCliCommand, providerDisplayName, isNativeThinkingEffort, NATIVE_THINKING_EFFORT_PATTERN, PROVIDER_LABELS, WAND_AGENT_LABEL, } from "../provider-catalog.js";
5
- export { PROVIDER_IDS, normalizeProviderId };
3
+ import { SESSION_PROVIDERS as PROVIDER_IDS, PROVIDER_LABELS, WAND_AGENT_LABEL, inferProviderFromCommand, isNativeThinkingEffort, NATIVE_THINKING_EFFORT_PATTERN, normalizeProviderId, providerCliCommand, providerDisplayName, } from "../provider-catalog.js";
4
+ export { providerCliCommand, isNativeThinkingEffort, NATIVE_THINKING_EFFORT_PATTERN, PROVIDER_LABELS, WAND_AGENT_LABEL, };
5
+ export { PROVIDER_IDS, normalizeProviderId, inferProviderFromCommand, providerDisplayName };
6
6
  /** 兼容旧名:浏览器层的调用点叫 inferProviderIdFromCommand。 */
7
7
  export const inferProviderIdFromCommand = inferProviderFromCommand;
8
8
  /** Wand Agent(进程内 SDK)的选项 id;不是 provider 名,只是一个 UI 侧的稳定标识。 */
9
9
  export const WAND_AGENT_TOOL_ID = "wand-agent";
10
- /** 执行工具清单:顺序即 UI 顺序,与 provider-catalog 的 SESSION_PROVIDERS 保持一致。 */
10
+ /** 执行工具清单:顺序即 UI 顺序,与浏览器当前开放的 provider 保持一致。 */
11
11
  export const AGENT_TOOL_OPTIONS = [
12
12
  { id: "claude", provider: "claude", label: PROVIDER_LABELS.claude, description: "Claude Code" },
13
13
  { id: "codex", provider: "codex", label: PROVIDER_LABELS.codex, description: "OpenAI Codex CLI" },
@@ -17,7 +17,6 @@ export const AGENT_TOOL_OPTIONS = [
17
17
  { id: "pi", provider: "pi", engine: "cli", label: PROVIDER_LABELS.pi, description: "Pi CLI:结构化 JSON 或 PTY 终端" },
18
18
  { id: WAND_AGENT_TOOL_ID, provider: "pi", engine: "sdk", label: WAND_AGENT_LABEL,
19
19
  description: "Wand 自带 Agent:进程内 SDK 执行,只支持结构化会话" },
20
- { id: "gemini", provider: "gemini", label: PROVIDER_LABELS.gemini, description: "Gemini CLI" },
21
20
  ];
22
21
  /** 按选项 id 取执行工具;认不出来时返回 null(调用方自己决定回退)。 */
23
22
  export function agentToolOption(id) {
@@ -55,8 +54,6 @@ export const CODEX_LOGO_PATH = "M22.2819 9.8211a5.9847 5.9847 0 0 0-.5157-4.9108
55
54
  // logos remain available when Wand is offline.
56
55
  export const PI_LOGO_PATH = "M165.29 165.29H517.36V400H400V517.36H282.65V634.72H165.29ZM282.65 282.65V400H400V282.65Z";
57
56
  export const PI_LOGO_DOT_PATH = "M517.36 400H634.72V634.72H517.36Z";
58
- // Official Google Gemini mark from simple-icons (CC0).
59
- export const GEMINI_LOGO_PATH = "M11.04 19.32Q12 21.51 12 24q0-2.49.93-4.68.96-2.19 2.58-3.81t3.81-2.55Q21.51 12 24 12q-2.49 0-4.68-.93a12.3 12.3 0 0 1-3.81-2.58 12.3 12.3 0 0 1-2.58-3.81Q12 2.49 12 0q0 2.49-.96 4.68-.93 2.19-2.55 3.81a12.3 12.3 0 0 1-3.81 2.58Q2.49 12 0 12q2.49 0 4.68.96 2.19.93 3.81 2.55t2.55 3.81";
60
57
  export const GROK_LOGO_PATHS = [
61
58
  "M13.2371 21.0407L24.3186 12.8506C24.8619 12.4491 25.6384 12.6057 25.8973 13.2294C27.2597 16.5185 26.651 20.4712 23.9403 23.1851C21.2297 25.8989 17.4581 26.4941 14.0108 25.1386L10.2449 26.8843C15.6463 30.5806 22.2053 29.6665 26.304 25.5601C29.5551 22.3051 30.562 17.8683 29.6205 13.8673L29.629 13.8758C28.2637 7.99809 29.9647 5.64871 33.449.844576C33.5314.730667 33.6139.616757 33.6964.5L29.1113 5.09055V5.07631L13.2343 21.0436Z",
62
59
  "M10.9503 23.0313C7.07343 19.3235 7.74185 13.5853 11.0498 10.2763C13.4959 7.82722 17.5036 6.82767 21.0021 8.2971L24.7595 6.55998C24.0826 6.07017 23.215 5.54334 22.2195 5.17313C17.7198 3.31926 12.3326 4.24192 8.67479 7.90126C5.15635 11.4239 4.0499 16.8403 5.94992 21.4622C7.36924 24.9165 5.04257 27.3598 2.69884 29.826C1.86829 30.7002 1.0349 31.5745.36364 32.5L10.9474 23.0341Z",
@@ -78,9 +75,6 @@ export function renderProviderLogoMarkup(value) {
78
75
  if (provider === "pi") {
79
76
  return `<svg ${common} viewBox="0 0 800 800" fill="currentColor"><path d="${PI_LOGO_PATH}" fill-rule="evenodd"/><path d="${PI_LOGO_DOT_PATH}"/></svg>`;
80
77
  }
81
- if (provider === "gemini") {
82
- return `<svg ${common} viewBox="0 0 24 24" fill="currentColor"><path d="${GEMINI_LOGO_PATH}"/></svg>`;
83
- }
84
78
  if (provider === "claude") {
85
79
  return `<svg ${common} viewBox="0 0 24 24" fill="${CLAUDE_BRAND_COLOR}"><path d="${CLAUDE_LOGO_PATH}"/></svg>`;
86
80
  }
@@ -0,0 +1,39 @@
1
+ import type { TaskDirectoryGroup } from "./types.js";
2
+ export interface SidebarManageSelection {
3
+ readonly directoryIds?: readonly string[];
4
+ readonly taskIds: readonly string[];
5
+ readonly sessionIds: readonly string[];
6
+ }
7
+ export declare const EMPTY_SIDEBAR_MANAGE_SELECTION: SidebarManageSelection;
8
+ export declare function sidebarManageCount(selection: SidebarManageSelection): number;
9
+ export declare function toggleId(ids: readonly string[], id: string): readonly string[];
10
+ export declare function toggleManagedTask(selection: SidebarManageSelection, taskId: string): SidebarManageSelection;
11
+ export declare function toggleManagedSession(selection: SidebarManageSelection, sessionId: string): SidebarManageSelection;
12
+ export declare function collectManagedIds(groups: readonly TaskDirectoryGroup[]): SidebarManageSelection;
13
+ export declare function isManagedGroupSelected(selection: SidebarManageSelection, group: TaskDirectoryGroup): boolean;
14
+ export declare function toggleManagedGroup(selection: SidebarManageSelection, group: TaskDirectoryGroup): SidebarManageSelection;
15
+ export declare function pruneManagedSelection(selection: SidebarManageSelection, groups: readonly TaskDirectoryGroup[]): SidebarManageSelection;
16
+ /**
17
+ * 任务和会话在批量操作里是同一套逻辑:主操作都是归档(软处理——终端继续跑、worktree 保留,
18
+ * 之后由保留期清理),只有显式选中的终端才走真删除。所以两个按钮分开描述,
19
+ * 不再用一句「归档任务并删除终端」把两种动作揉在一起。
20
+ */
21
+ export declare function describeManagedAction(selection: SidebarManageSelection): string;
22
+ export declare function describeManagedResult(selection: SidebarManageSelection): string;
23
+ export declare function describeOrganizeOutcome(result: {
24
+ movedSessions: readonly unknown[];
25
+ categorizedTasks: readonly unknown[];
26
+ refused: readonly {
27
+ reason: string;
28
+ }[];
29
+ eligibleTasks?: number;
30
+ skippedTasks?: number;
31
+ }): {
32
+ label: string;
33
+ reason: string;
34
+ };
35
+ export declare function standaloneManagedSessionIds(selection: SidebarManageSelection, groups?: readonly TaskDirectoryGroup[]): readonly string[];
36
+ /** 危险按钮:只在选中了真的会被关闭的终端或被删除的目录时才出现。 */
37
+ export declare function describeManagedDelete(selection: SidebarManageSelection, groups?: readonly TaskDirectoryGroup[]): string;
38
+ /** 只有真的会杀终端或删目录时才用危险样式;纯归档不该渲染成红色破坏操作。 */
39
+ export declare function managedSelectionIsDestructive(selection: SidebarManageSelection): boolean;
@@ -0,0 +1,149 @@
1
+ export const EMPTY_SIDEBAR_MANAGE_SELECTION = Object.freeze({
2
+ taskIds: [],
3
+ sessionIds: [],
4
+ });
5
+ export function sidebarManageCount(selection) {
6
+ return (selection.directoryIds?.length ?? 0) + selection.taskIds.length + selection.sessionIds.length;
7
+ }
8
+ export function toggleId(ids, id) {
9
+ return ids.includes(id) ? ids.filter((item) => item !== id) : [...ids, id];
10
+ }
11
+ export function toggleManagedTask(selection, taskId) {
12
+ return { ...selection, taskIds: toggleId(selection.taskIds, taskId) };
13
+ }
14
+ export function toggleManagedSession(selection, sessionId) {
15
+ return { ...selection, sessionIds: toggleId(selection.sessionIds, sessionId) };
16
+ }
17
+ export function collectManagedIds(groups) {
18
+ const directoryIds = [];
19
+ const taskIds = [];
20
+ const sessionIds = [];
21
+ for (const group of groups) {
22
+ if (!group.global && !group.synthetic) {
23
+ directoryIds.push(group.workspaceId);
24
+ }
25
+ for (const task of group.tasks) {
26
+ taskIds.push(task.id);
27
+ for (const session of task.sessions)
28
+ sessionIds.push(session.id);
29
+ }
30
+ for (const session of group.standaloneSessions)
31
+ sessionIds.push(session.id);
32
+ }
33
+ return { directoryIds, taskIds, sessionIds };
34
+ }
35
+ export function isManagedGroupSelected(selection, group) {
36
+ const ids = collectManagedIds([group]);
37
+ const hasItems = ids.taskIds.length + ids.sessionIds.length > 0;
38
+ if (!hasItems) {
39
+ return Boolean(selection.directoryIds?.includes(group.workspaceId));
40
+ }
41
+ return ids.taskIds.every((id) => selection.taskIds.includes(id))
42
+ && ids.sessionIds.every((id) => selection.sessionIds.includes(id));
43
+ }
44
+ export function toggleManagedGroup(selection, group) {
45
+ const ids = collectManagedIds([group]);
46
+ const currentlySelected = isManagedGroupSelected(selection, group);
47
+ const currentDirectoryIds = selection.directoryIds ?? [];
48
+ const canManageDirectory = !group.global && !group.synthetic;
49
+ const nextDirectoryIds = currentlySelected
50
+ ? currentDirectoryIds.filter((id) => id !== group.workspaceId)
51
+ : (canManageDirectory && !currentDirectoryIds.includes(group.workspaceId)
52
+ ? [...currentDirectoryIds, group.workspaceId]
53
+ : currentDirectoryIds);
54
+ const nextTaskIds = currentlySelected
55
+ ? selection.taskIds.filter((id) => !ids.taskIds.includes(id))
56
+ : [...new Set([...selection.taskIds, ...ids.taskIds])];
57
+ const nextSessionIds = currentlySelected
58
+ ? selection.sessionIds.filter((id) => !ids.sessionIds.includes(id))
59
+ : [...new Set([...selection.sessionIds, ...ids.sessionIds])];
60
+ return {
61
+ ...(nextDirectoryIds.length > 0 ? { directoryIds: nextDirectoryIds } : {}),
62
+ taskIds: nextTaskIds,
63
+ sessionIds: nextSessionIds,
64
+ };
65
+ }
66
+ export function pruneManagedSelection(selection, groups) {
67
+ const visible = collectManagedIds(groups);
68
+ const taskSet = new Set(visible.taskIds);
69
+ const sessionSet = new Set(visible.sessionIds);
70
+ const nextTaskIds = selection.taskIds.filter((id) => taskSet.has(id));
71
+ const nextSessionIds = selection.sessionIds.filter((id) => sessionSet.has(id));
72
+ const tempSelection = {
73
+ directoryIds: selection.directoryIds,
74
+ taskIds: nextTaskIds,
75
+ sessionIds: nextSessionIds,
76
+ };
77
+ const prunedDirIds = (selection.directoryIds ?? []).filter((dirId) => {
78
+ const group = groups.find((g) => g.workspaceId === dirId && !g.global && !g.synthetic);
79
+ return group ? isManagedGroupSelected(tempSelection, group) : false;
80
+ });
81
+ return {
82
+ ...(prunedDirIds.length > 0 ? { directoryIds: prunedDirIds } : {}),
83
+ taskIds: nextTaskIds,
84
+ sessionIds: nextSessionIds,
85
+ };
86
+ }
87
+ /**
88
+ * 任务和会话在批量操作里是同一套逻辑:主操作都是归档(软处理——终端继续跑、worktree 保留,
89
+ * 之后由保留期清理),只有显式选中的终端才走真删除。所以两个按钮分开描述,
90
+ * 不再用一句「归档任务并删除终端」把两种动作揉在一起。
91
+ */
92
+ export function describeManagedAction(selection) {
93
+ const tasks = selection.taskIds.length > 0;
94
+ const sessions = selection.sessionIds.length > 0;
95
+ if (tasks && sessions)
96
+ return "归档任务并归档终端";
97
+ if (tasks)
98
+ return "归档任务";
99
+ return "归档终端";
100
+ }
101
+ export function describeManagedResult(selection) {
102
+ const parts = [];
103
+ if (selection.taskIds.length > 0)
104
+ parts.push(`归档 ${selection.taskIds.length} 个任务`);
105
+ if (selection.sessionIds.length > 0)
106
+ parts.push(`归档 ${selection.sessionIds.length} 个终端`);
107
+ return parts.join("、") || "处理所选项目";
108
+ }
109
+ export function describeOrganizeOutcome(result) {
110
+ const moved = result.movedSessions.length;
111
+ const categorized = result.categorizedTasks.length;
112
+ const reason = result.refused[0]?.reason ?? "";
113
+ if (!moved && !categorized) {
114
+ return { label: reason || (result.eligibleTasks === 0 ? "没有符合归类范围的任务" : "所选标题已归类"),
115
+ reason: reason || (result.skippedTasks ? `已跳过 ${result.skippedTasks} 个用户自定标题的任务` : "") };
116
+ }
117
+ const parts = [];
118
+ if (categorized)
119
+ parts.push(`归类 ${categorized} 个任务`);
120
+ if (moved)
121
+ parts.push(`归属 ${moved} 个会话`);
122
+ return {
123
+ label: `已${parts.join("、")}`,
124
+ reason: result.refused.length ? `另有 ${result.refused.length} 项未处理:${reason}` : "",
125
+ };
126
+ }
127
+ export function standaloneManagedSessionIds(selection, groups) {
128
+ if (!groups || !selection.directoryIds || selection.directoryIds.length === 0) {
129
+ return selection.sessionIds;
130
+ }
131
+ const dirSet = new Set(selection.directoryIds);
132
+ return selection.sessionIds.filter((id) => !groups.some((g) => dirSet.has(g.workspaceId) && (g.standaloneSessions.some((s) => s.id === id) || g.tasks.some((t) => t.sessions.some((s) => s.id === id)))));
133
+ }
134
+ /** 危险按钮:只在选中了真的会被关闭的终端或被删除的目录时才出现。 */
135
+ export function describeManagedDelete(selection, groups) {
136
+ const dirs = selection.directoryIds?.length ?? 0;
137
+ const sessions = standaloneManagedSessionIds(selection, groups).length;
138
+ if (dirs > 0 && sessions > 0)
139
+ return `删除 ${dirs} 个目录与 ${sessions} 个终端`;
140
+ if (dirs > 0)
141
+ return `删除 ${dirs} 个目录`;
142
+ if (sessions > 0)
143
+ return `删除 ${sessions} 个终端`;
144
+ return "删除终端";
145
+ }
146
+ /** 只有真的会杀终端或删目录时才用危险样式;纯归档不该渲染成红色破坏操作。 */
147
+ export function managedSelectionIsDestructive(selection) {
148
+ return (selection.directoryIds?.length ?? 0) > 0 || selection.sessionIds.length > 0;
149
+ }