@eddyskywalker/dsh-chatgpt-subscription 0.31.0 → 0.33.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 (131) hide show
  1. package/CHANGELOG.md +70 -0
  2. package/README.md +112 -1
  3. package/lib/client.js +34731 -3832
  4. package/lib/client.js.map +1 -1
  5. package/lib/index.js +12922 -2851
  6. package/lib/types/client/cline-pass/ClinePassComposerQuota.d.ts +20 -0
  7. package/lib/types/client/cline-pass/ClinePassComposerQuota.d.ts.map +1 -0
  8. package/lib/types/client/cline-pass/ClinePassSection.d.ts +17 -0
  9. package/lib/types/client/cline-pass/ClinePassSection.d.ts.map +1 -0
  10. package/lib/types/client/cline-pass/api.d.ts +84 -0
  11. package/lib/types/client/cline-pass/api.d.ts.map +1 -0
  12. package/lib/types/client/cline-pass/locales.d.ts +1025 -0
  13. package/lib/types/client/cline-pass/locales.d.ts.map +1 -0
  14. package/lib/types/client/cline-pass/styles.d.ts +7 -0
  15. package/lib/types/client/cline-pass/styles.d.ts.map +1 -0
  16. package/lib/types/client/hub/brand-icons.d.ts +18 -2
  17. package/lib/types/client/hub/brand-icons.d.ts.map +1 -1
  18. package/lib/types/client/hub/hub-styles.d.ts.map +1 -1
  19. package/lib/types/client/hub/providers.d.ts.map +1 -1
  20. package/lib/types/client/index.d.ts +4 -0
  21. package/lib/types/client/index.d.ts.map +1 -1
  22. package/lib/types/client/mermaid/renderer.d.ts +23 -0
  23. package/lib/types/client/mermaid/renderer.d.ts.map +1 -1
  24. package/lib/types/client/minimax-code/MinimaxVideoDocumentBody.d.ts +31 -14
  25. package/lib/types/client/minimax-code/MinimaxVideoDocumentBody.d.ts.map +1 -1
  26. package/lib/types/client/minimax-code/MinimaxVideoToolView.d.ts.map +1 -1
  27. package/lib/types/client/minimax-code/VideoFormDialog.d.ts +46 -50
  28. package/lib/types/client/minimax-code/VideoFormDialog.d.ts.map +1 -1
  29. package/lib/types/client/minimax-code/locales.d.ts +80 -20
  30. package/lib/types/client/minimax-code/locales.d.ts.map +1 -1
  31. package/lib/types/client/minimax-code/styles.d.ts.map +1 -1
  32. package/lib/types/client/minimax-code/video-command-host.d.ts +17 -11
  33. package/lib/types/client/minimax-code/video-command-host.d.ts.map +1 -1
  34. package/lib/types/client/minimax-code/video-command-icon.d.ts +38 -0
  35. package/lib/types/client/minimax-code/video-command-icon.d.ts.map +1 -0
  36. package/lib/types/client/minimax-code/video-command.d.ts +53 -59
  37. package/lib/types/client/minimax-code/video-command.d.ts.map +1 -1
  38. package/lib/types/client/minimax-code/video-contract.d.ts +36 -0
  39. package/lib/types/client/minimax-code/video-contract.d.ts.map +1 -1
  40. package/lib/types/client/minimax-code/video-media-dropzone.d.ts +57 -0
  41. package/lib/types/client/minimax-code/video-media-dropzone.d.ts.map +1 -0
  42. package/lib/types/client/minimax-code/video-media-input.d.ts +173 -0
  43. package/lib/types/client/minimax-code/video-media-input.d.ts.map +1 -0
  44. package/lib/types/client/minimax-code/video-presets.d.ts +67 -0
  45. package/lib/types/client/minimax-code/video-presets.d.ts.map +1 -0
  46. package/lib/types/client/minimax-code/video-slots.d.ts +58 -5
  47. package/lib/types/client/minimax-code/video-slots.d.ts.map +1 -1
  48. package/lib/types/client/minimax-code/video-workspace.d.ts +41 -0
  49. package/lib/types/client/minimax-code/video-workspace.d.ts.map +1 -0
  50. package/lib/types/client/progress-updates/markdown-lite.d.ts +19 -6
  51. package/lib/types/client/progress-updates/markdown-lite.d.ts.map +1 -1
  52. package/lib/types/client/qoder/QoderComposerQuota.d.ts +41 -0
  53. package/lib/types/client/qoder/QoderComposerQuota.d.ts.map +1 -0
  54. package/lib/types/client/qoder/QoderSection.d.ts +26 -0
  55. package/lib/types/client/qoder/QoderSection.d.ts.map +1 -0
  56. package/lib/types/client/qoder/api.d.ts +4 -0
  57. package/lib/types/client/qoder/api.d.ts.map +1 -0
  58. package/lib/types/client/qoder/locales.d.ts +310 -0
  59. package/lib/types/client/qoder/locales.d.ts.map +1 -0
  60. package/lib/types/client/qoder/styles.d.ts +16 -0
  61. package/lib/types/client/qoder/styles.d.ts.map +1 -0
  62. package/lib/types/client/qoder/useQoderSection.d.ts +97 -0
  63. package/lib/types/client/qoder/useQoderSection.d.ts.map +1 -0
  64. package/lib/types/host/antigravity/adapter.d.ts.map +1 -1
  65. package/lib/types/host/cline-pass/account-pool.d.ts +63 -0
  66. package/lib/types/host/cline-pass/account-pool.d.ts.map +1 -0
  67. package/lib/types/host/cline-pass/adapter.d.ts +49 -0
  68. package/lib/types/host/cline-pass/adapter.d.ts.map +1 -0
  69. package/lib/types/host/cline-pass/catalog.d.ts +49 -0
  70. package/lib/types/host/cline-pass/catalog.d.ts.map +1 -0
  71. package/lib/types/host/cline-pass/client.d.ts +118 -0
  72. package/lib/types/host/cline-pass/client.d.ts.map +1 -0
  73. package/lib/types/host/cline-pass/engine.d.ts +223 -0
  74. package/lib/types/host/cline-pass/engine.d.ts.map +1 -0
  75. package/lib/types/host/cline-pass/line.d.ts +55 -0
  76. package/lib/types/host/cline-pass/line.d.ts.map +1 -0
  77. package/lib/types/host/cline-pass/mapper.d.ts +112 -0
  78. package/lib/types/host/cline-pass/mapper.d.ts.map +1 -0
  79. package/lib/types/host/cline-pass/oauth.d.ts +134 -0
  80. package/lib/types/host/cline-pass/oauth.d.ts.map +1 -0
  81. package/lib/types/host/cline-pass/protocol.d.ts +186 -0
  82. package/lib/types/host/cline-pass/protocol.d.ts.map +1 -0
  83. package/lib/types/host/cline-pass/routes.d.ts +71 -0
  84. package/lib/types/host/cline-pass/routes.d.ts.map +1 -0
  85. package/lib/types/host/cline-pass/store.d.ts +97 -0
  86. package/lib/types/host/cline-pass/store.d.ts.map +1 -0
  87. package/lib/types/host/cline-pass/token-store.d.ts +168 -0
  88. package/lib/types/host/cline-pass/token-store.d.ts.map +1 -0
  89. package/lib/types/host/cline-pass/tools.d.ts +21 -0
  90. package/lib/types/host/cline-pass/tools.d.ts.map +1 -0
  91. package/lib/types/host/cline-pass/types.d.ts +168 -0
  92. package/lib/types/host/cline-pass/types.d.ts.map +1 -0
  93. package/lib/types/host/common/model-request-control.d.ts +1 -1
  94. package/lib/types/host/common/model-request-control.d.ts.map +1 -1
  95. package/lib/types/host/common/request-diagnostics.d.ts +1 -1
  96. package/lib/types/host/common/request-diagnostics.d.ts.map +1 -1
  97. package/lib/types/host/kimi-code/adapter.d.ts +3 -1
  98. package/lib/types/host/kimi-code/adapter.d.ts.map +1 -1
  99. package/lib/types/host/kimi-code/mapper.d.ts.map +1 -1
  100. package/lib/types/host/qoder/account-pool.d.ts +137 -0
  101. package/lib/types/host/qoder/account-pool.d.ts.map +1 -0
  102. package/lib/types/host/qoder/adapter.d.ts +134 -0
  103. package/lib/types/host/qoder/adapter.d.ts.map +1 -0
  104. package/lib/types/host/qoder/adopt.d.ts +146 -0
  105. package/lib/types/host/qoder/adopt.d.ts.map +1 -0
  106. package/lib/types/host/qoder/client.d.ts +189 -0
  107. package/lib/types/host/qoder/client.d.ts.map +1 -0
  108. package/lib/types/host/qoder/cosy.d.ts +173 -0
  109. package/lib/types/host/qoder/cosy.d.ts.map +1 -0
  110. package/lib/types/host/qoder/mapper.d.ts +235 -0
  111. package/lib/types/host/qoder/mapper.d.ts.map +1 -0
  112. package/lib/types/host/qoder/model-catalog.d.ts +185 -0
  113. package/lib/types/host/qoder/model-catalog.d.ts.map +1 -0
  114. package/lib/types/host/qoder/oauth.d.ts +134 -0
  115. package/lib/types/host/qoder/oauth.d.ts.map +1 -0
  116. package/lib/types/host/qoder/routes.d.ts +96 -0
  117. package/lib/types/host/qoder/routes.d.ts.map +1 -0
  118. package/lib/types/host/qoder/token-store.d.ts +231 -0
  119. package/lib/types/host/qoder/token-store.d.ts.map +1 -0
  120. package/lib/types/host/qoder/types.d.ts +257 -0
  121. package/lib/types/host/qoder/types.d.ts.map +1 -0
  122. package/lib/types/host/workbuddy/adapter.d.ts.map +1 -1
  123. package/lib/types/host/workbuddy/mapper.d.ts +1 -0
  124. package/lib/types/host/workbuddy/mapper.d.ts.map +1 -1
  125. package/lib/types/index.d.ts +17 -0
  126. package/lib/types/index.d.ts.map +1 -1
  127. package/lib/types/shared/cline-pass-contracts.d.ts +267 -0
  128. package/lib/types/shared/cline-pass-contracts.d.ts.map +1 -0
  129. package/lib/types/shared/qoder-contracts.d.ts +293 -0
  130. package/lib/types/shared/qoder-contracts.d.ts.map +1 -0
  131. package/package.json +2 -1
@@ -1 +1 @@
1
- {"version":3,"file":"locales.d.ts","sourceRoot":"","sources":["../../../../src/client/minimax-code/locales.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,eAAe,qBAAqB,CAAA;AAEjD,eAAO,MAAM,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA0LL,CAAA;AAEV,eAAO,MAAM,EAAE,EAAE,MAAM,CAAC,MAAM,OAAO,EAAE,EAAE,MAAM,CAiL9C,CAAA;AAED,eAAO,MAAM,YAAY;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAKxB,CAAA;AAED,MAAM,MAAM,oBAAoB,GAAG,MAAM,OAAO,EAAE,CAAA"}
1
+ {"version":3,"file":"locales.d.ts","sourceRoot":"","sources":["../../../../src/client/minimax-code/locales.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,eAAe,qBAAqB,CAAA;AAEjD,eAAO,MAAM,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA8ML,CAAA;AAEV,eAAO,MAAM,EAAE,EAAE,MAAM,CAAC,MAAM,OAAO,EAAE,EAAE,MAAM,CAqM9C,CAAA;AAED,eAAO,MAAM,YAAY;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAKxB,CAAA;AAED,MAAM,MAAM,oBAAoB,GAAG,MAAM,OAAO,EAAE,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"styles.d.ts","sourceRoot":"","sources":["../../../../src/client/minimax-code/styles.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,QAAQ,oCAAoC,CAAA;AAEzD;;;;;;;;GAQG;AACH,wBAAgB,wBAAwB,IAAI,IAAI,CAoF/C"}
1
+ {"version":3,"file":"styles.d.ts","sourceRoot":"","sources":["../../../../src/client/minimax-code/styles.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,QAAQ,oCAAoC,CAAA;AAEzD;;;;;;;;GAQG;AACH,wBAAgB,wBAAwB,IAAI,IAAI,CAgK/C"}
@@ -1,19 +1,25 @@
1
1
  /**
2
- * 「/video 命令 + 参数弹窗」的挂载点,由 `src/client/index.tsx` 调用。
2
+ * 「/video 命令 + 参数面板」的挂载点,由 `src/client/index.tsx` 调用。
3
3
  *
4
4
  * 挂两样东西:
5
5
  *
6
- * 1. **弹窗的渲染座位**:一个客户端容器,portal 到 `document.body`。它不挂在任何
7
- * 会话槽位上——弹窗是**全局**的,而 `/video` 命令的回调在一段没有 React 树的
6
+ * 1. **面板的渲染座位**:一个客户端容器,portal 到 `document.body`。它不挂在任何
7
+ * 会话槽位上——面板是**全局**的,而 `/video` 命令的回调在一段没有 React 树的
8
8
  * 代码里;把两者连起来的是这个容器持有的 `open` 状态加一个模块级句柄。
9
- * 2. **命令本体**:`createVideoCommand` 产出的 popupSelect 贡献,注册到
9
+ * 2. **命令本体**:`createVideoCommand` 产出的 action 贡献,注册到
10
10
  * `ctx.commandUi`,与宿主 `ui-message-feedback` 的 `/feedback` 装饰同一形状。
11
11
  *
12
12
  * ## 为什么命令回调要经过一个句柄
13
13
  *
14
- * `CommandUiSpec` 的回调是普通函数,不是 React 组件,拿不到 setState。所以容器把
15
- * 自己的 `openForm` 登记到一个模块级的可变引用上,命令回调通过它打开弹窗。容器
16
- * 卸载时把这个引用清掉(只清自己那一个),回调因此永远调不到一个已卸载的组件。
14
+ * 命令的回调是普通函数,不是 React 组件,拿不到 setState。所以容器把自己的
15
+ * `openForm` 登记到一个模块级的可变引用上,命令回调通过它打开面板。容器卸载时
16
+ * 把这个引用清掉(只清自己那一个),回调因此永远调不到一个已卸载的组件。
17
+ *
18
+ * ## 打开面板时顺手读一次输入框
19
+ *
20
+ * 用户常常先写了一句话才想起要用面板。命令回调在这里取一次
21
+ * {@link composerDraftOf},交给面板当初始的「画面描述」——省掉一次抄写。读不到
22
+ * 就是空串,面板照常以空白打开。
17
23
  *
18
24
  * ## 注册失败了怎么办
19
25
  *
@@ -25,7 +31,7 @@
25
31
  import type { Context as ClientContext } from '@deepseek-ai/cordis';
26
32
  import { type VideoDefaults } from './video-form-rules.ts';
27
33
  /**
28
- * 打开参数弹窗。
34
+ * 打开参数面板。
29
35
  *
30
36
  * 没有容器挂着时什么也不做——插件被禁用、或页面还没挂载时调到这里,静默即可;
31
37
  * 抛错只会让一次斜杠菜单点击变成控制台里的一条异常。
@@ -35,10 +41,10 @@ import { type VideoDefaults } from './video-form-rules.ts';
35
41
  */
36
42
  export declare function openVideoForm(sessionId: string, defaults: VideoDefaults): void;
37
43
  /**
38
- * 构造弹窗容器。
44
+ * 构造面板容器。
39
45
  *
40
- * 常驻挂载、`open` 为 false 时渲染出 null,而不是按需创建:请求来自命令回调,那时
41
- * 组件树已经渲染完了,没有第二次渲染去创建它。
46
+ * 常驻挂载、`open` 为 false 时渲染出 null,而不是按需创建:请求来自命令回调,
47
+ * 那时组件树已经渲染完了,没有第二次渲染去创建它。
42
48
  *
43
49
  * @param ctx - 浏览器根上下文;提交时用它把文本写进对应会话的输入框。
44
50
  * @returns 一个不需要 props 的组件。
@@ -1 +1 @@
1
- {"version":3,"file":"video-command-host.d.ts","sourceRoot":"","sources":["../../../../src/client/minimax-code/video-command-host.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAGH,OAAO,KAAK,EAAE,OAAO,IAAI,aAAa,EAAE,MAAM,qBAAqB,CAAA;AAInE,OAAO,EAA0B,KAAK,aAAa,EAAE,MAAM,uBAAuB,CAAA;AAmBlF;;;;;;;;GAQG;AACH,wBAAgB,aAAa,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,aAAa,GAAG,IAAI,CAE9E;AAED;;;;;;;;GAQG;AACH,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,aAAa,GAAG,MAAM,KAAK,CAAC,GAAG,CAAC,OAAO,GAAG,IAAI,CAqCzF;AA8BD;;;;;;;;;;;;GAYG;AACH,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,aAAa,GAAG,MAAM,IAAI,CA6BlE"}
1
+ {"version":3,"file":"video-command-host.d.ts","sourceRoot":"","sources":["../../../../src/client/minimax-code/video-command-host.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AAGH,OAAO,KAAK,EAAE,OAAO,IAAI,aAAa,EAAE,MAAM,qBAAqB,CAAA;AAKnE,OAAO,EAA0B,KAAK,aAAa,EAAE,MAAM,uBAAuB,CAAA;AAmBlF;;;;;;;;GAQG;AACH,wBAAgB,aAAa,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,aAAa,GAAG,IAAI,CAE9E;AAED;;;;;;;;GAQG;AACH,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,aAAa,GAAG,MAAM,KAAK,CAAC,GAAG,CAAC,OAAO,GAAG,IAAI,CAoDzF;AA8BD;;;;;;;;;;;;GAYG;AACH,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,aAAa,GAAG,MAAM,IAAI,CA6BlE"}
@@ -0,0 +1,38 @@
1
+ /**
2
+ * `/video` 在斜杠菜单里的字形。
3
+ *
4
+ * ## 为什么是自己画一个,而不是从宿主图标集里取
5
+ *
6
+ * 宿主的 `CommandContribution.icon` 收的是 `ComponentType<IconProps>`
7
+ * (`ui-commands/src/client/contract.ts:109`),而 `IconProps` 只活在
8
+ * `@deepseek-ai/dsh-client-ui-primitives` 里——那个包的 `lib` 是宿主装配产物,
9
+ * 本插件装不到(同 `progress-updates/markdown-lite.tsx:6` 记下的理由,也是
10
+ * `VideoFormDialog` 自己 portal 而不是用宿主 `Modal` 的同一个原因)。
11
+ *
12
+ * 宿主渲染时只传 `{ size, className }` 两个 prop(`MenuView.tsx:179-184`),所以
13
+ * 一个**结构上同形**的组件就够了:同样的 props、`currentColor` 描边、同样的
14
+ * 16 格视框与 1px 线宽——放在宿主那排图标里看不出是外来的。
15
+ *
16
+ * ## 为什么是「播放三角 + 画框」
17
+ *
18
+ * 菜单里已经有「压缩 / 权限 / 模型 / 导出」,字形都是线稿。播放三角说明这是
19
+ * 「产出画面」的入口,外框让它和纯播放按钮区分开:这是**生成**视频。
20
+ *
21
+ * @module @eddyskywalker/dsh-chatgpt-subscription/client/minimax-code/video-command-icon
22
+ */
23
+ import type { ComponentType } from 'react';
24
+ /** 宿主图标的 props 形状(`@deepseek-ai/dsh-client-ui-primitives` 的 `IconProps`)。 */
25
+ export interface CommandIconProps {
26
+ /** 边长像素;缺省用字形自己的绘制尺寸。 */
27
+ readonly size?: number | undefined;
28
+ /** 布局用的额外 class;颜色一律走 `currentColor`。 */
29
+ readonly className?: string | undefined;
30
+ }
31
+ /**
32
+ * `/video` 的菜单字形:画框里一枚播放三角。
33
+ *
34
+ * @param props - 尺寸与额外 class。
35
+ * @returns 一个 16 格视框的线稿图标。
36
+ */
37
+ export declare const VideoCommandIcon: ComponentType<CommandIconProps>;
38
+ //# sourceMappingURL=video-command-icon.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"video-command-icon.d.ts","sourceRoot":"","sources":["../../../../src/client/minimax-code/video-command-icon.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,OAAO,CAAA;AAE1C,6EAA6E;AAC7E,MAAM,WAAW,gBAAgB;IAC/B,yBAAyB;IACzB,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;IAClC,yCAAyC;IACzC,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;CACxC;AAED;;;;;GAKG;AACH,eAAO,MAAM,gBAAgB,EAAE,aAAa,CAAC,gBAAgB,CAc5D,CAAA"}
@@ -1,57 +1,43 @@
1
1
  /**
2
- * `/video` 命令:让用户**看见**视频工具有哪些参数,再把选好的参数填进输入框。
2
+ * `/video` 命令:一个入口,直接打开参数面板。
3
3
  *
4
- * ## 形态:popupSelect 作为入口,自建弹窗作为表单
4
+ * ## 形态:action,而不是 popupSelect
5
5
  *
6
- * 视频工具(`minimax_generate_video` / `minimax_understand_video`)是**模型自主
7
- * 调用**的,用户唯一的入口是自然语言。这带来两个问题:用户不知道有哪些参数,
8
- * 而且这些参数有联动规则(首帧→比例被强制成 `adaptive`、纯文本→`adaptive` 不
9
- * 可用)。
6
+ * 这里曾经是两级——popupSelect 列几条预设档,选中后把一段模板写进输入框,
7
+ * 「自定义…」那一行才打开面板。两个问题:
10
8
  *
11
- * 宿主给了两种命令 UI(`packages/client/ui-commands/src/client/contract.ts`):
9
+ * 1. **模板会占用输入框**。用户点了「H3 · 4 秒 · 768P」,输入框里立刻出现一整段
10
+ * `用 minimax_generate_video 生成视频:prompt=(在这里写画面描述)…`,他还得
11
+ * 回到那段话里找哪一处该改。命令的职责是**帮他配参数**,不是替他起草消息。
12
+ * 2. **档位在面板里本来就有**。面板顶部现在就是一排档位胶囊,先弹一次列表等于
13
+ * 让同一件事发生两遍。
12
14
  *
13
- * - `PopupSelectSpec`(`:64-75`):只有 `options()` + `onSelect()`,**单选**;
14
- * - `ActionSpec`(`:82-89`):`run(session)`,契约明写它「不提交任何东西」。
15
+ * 所以现在只有一个动作:打开面板。面板自己负责档位、参数与描述,用户点「填入
16
+ * 输入框」之后才产生文本——而且那段文本是把描述与参数压成一条请求的**成品**,
17
+ * 不是留了占位符的模板。
15
18
  *
16
- * 单选的 popupSelect 装不下「提示词 + 模型 + 比例 + 时长 + 分辨率 + 四类参考
17
- * 文件 + 水印」,所以这里是**两级**:popupSelect 列出几条预设档,「自定义…」那
18
- * 一行打开 `VideoFormDialog`。预设档没有覆盖的定制组合因此仍然可达,而最常见
19
- * 的几种是一键的。
19
+ * ## 为什么不是「/video 后面直接写描述」
20
20
  *
21
- * ## 填进输入框,而不是直接发送
22
- *
23
- * `ActionSpec` 不能提交,这是宿主的限制;但即使能提交,**直接发起一次计费生成
24
- * 也仍然是错的**:用户看不到自己填的参数被联动规则改写成了什么。所以走
25
- * `SessionInput.setDraft`,把参数拼成一句话放进输入框,用户看一眼再发送。
21
+ * 宿主的命令解析只在**裸命令**时把一行交给客户端贡献:`/video 描述…` 这一行
22
+ * 已经带了参数,`ui-commands` 会把它当成普通消息(`service.ts` 的
23
+ * `matchEnter`:`if (!bare) return undefined`)。所以「像 skill 一样接续输入」
24
+ * 在这个宿主版本里做不到;面板把这件事补上:**输入框里已有的文字会被当成画面
25
+ * 描述带进来**,效果接近「先写一句话,再叫面板」。
26
26
  *
27
27
  * ## `available` 怎么判「这条会话在 minimax-code 上」
28
28
  *
29
- * `ClientSessionContext` 只有 `sessionId`(`ui-input-trigger/src/types.ts:29`),
30
- * 没有 provider。路由要从 `ctx.sessions` 上按 id 取:
31
- *
32
- * ```ts
33
- * ctx.sessions.binding(id)?.session.projections.faceOf('modelSelection').getSnapshot()
34
- * ```
35
- *
36
- * 这是宿主自己读当前模型的方式(`ui-conversation/src/client/input/hub.ts:104-113`
37
- * 的 `submissionState`),投影值形如 `{ next?, lastUsed? }`,每项带
38
- * `{ provider, model, reasoningEffort? }`。
39
- *
40
- * **任何一步拿不到就返回 false,绝不抛错**:`available` 在每次打开斜杠菜单时都
41
- * 会被调用,它抛一次就会让整个菜单塌掉;而一个刚建好的会话、或宿主还没回落
42
- * 投影时,这些读取本来就会是空的。
29
+ * `ClientSessionContext` 只有 `sessionId`,没有 provider。路由要从 `ctx.sessions`
30
+ * 上按 id 取投影。**任何一步拿不到就返回 false,绝不抛错**:`available` 在每次
31
+ * 打开斜杠菜单时都会被调用,它抛一次就会让整个菜单塌掉。
43
32
  *
44
33
  * @module @eddyskywalker/dsh-chatgpt-subscription/client/minimax-code/video-command
45
34
  */
46
35
  import type { Context as ClientContext } from '@deepseek-ai/cordis';
47
36
  import type { CommandContribution } from './commands-contract.ts';
48
37
  import { type VideoDefaults } from './video-form-rules.ts';
49
- import { type VideoPreset } from './VideoFormDialog.tsx';
50
38
  import { type MinimaxCodeLocaleKey } from './locales.ts';
51
39
  /** 本线路的 provider id(宿主 `PROVIDER_ID` 的同值副本)。 */
52
40
  export declare const MINIMAX_CODE_PROVIDER = "minimax-code";
53
- /** `/video` 里「自定义…」那一行的 id。 */
54
- export declare const CUSTOM_OPTION_ID = "custom";
55
41
  /** 本模块登记的命令名。 */
56
42
  export declare const VIDEO_COMMAND_NAME = "video";
57
43
  /** 翻译函数座位。 */
@@ -73,13 +59,35 @@ export interface SessionRoute {
73
59
  * @returns 形如 `{ provider, model }` 的路由,或 undefined。
74
60
  */
75
61
  export declare function sessionRouteOf(ctx: ClientContext, sessionId: string): SessionRoute | undefined;
62
+ /**
63
+ * 去掉输入框文字开头那一截命令 token。
64
+ *
65
+ * 从菜单里点命令时,token 由宿主消费,输入框里通常已经干净;但用户也可能是
66
+ * 先把 `/video` 打出来、再从菜单里点一次,此时草稿里还留着那个 token。把
67
+ * `/video` 当成画面描述带进面板显然不对,所以在这里剥掉**开头任意一截**命令
68
+ * token——只剥开头,正文里的斜杠是用户自己的内容。
69
+ *
70
+ * @param draft - 输入框里的文字。
71
+ * @returns 去掉前导命令 token 与首尾空白后的文字。
72
+ */
73
+ export declare function stripLeadingCommandToken(draft: string): string;
74
+ /**
75
+ * 这条会话输入框里**已经有的文字**。
76
+ *
77
+ * 走宿主的 `SessionInput.state`(`ui-conversation/src/client/contract/input.ts`
78
+ * 的 `InputState.draft`):那是编辑器内容的投影,不是一次发送。读不到就返回空串
79
+ * ——面板会以空描述打开,而不是报错。
80
+ *
81
+ * @param ctx - 浏览器根上下文。
82
+ * @param sessionId - 目标会话。
83
+ * @returns 输入框里的文字。
84
+ */
85
+ export declare function composerDraftOf(ctx: ClientContext, sessionId: string): string;
76
86
  /**
77
87
  * 把一段文本写进该会话的输入框。
78
88
  *
79
- * 走宿主的 `SessionInput.setDraft`(`ui-conversation/src/client/contract/input.ts:186`),
80
- * 不是 `prompt`:后者会绕过输入框直接把一条用户消息发出去,用户就看不见自己填了
81
- * 什么。`for(actx)` 要求一个**会话作用域的 Context**,正是
82
- * `ctx.sessions.binding(id).ctx`(见 `session-controller/src/client/sessions/service.ts:101-108`)。
89
+ * 走宿主的 `SessionInput.setDraft`,不是 `prompt`:后者会绕过输入框直接把一条
90
+ * 用户消息发出去,用户就看不见自己填了什么。
83
91
  *
84
92
  * @param ctx - 浏览器根上下文。
85
93
  * @param sessionId - 目标会话。
@@ -87,31 +95,17 @@ export declare function sessionRouteOf(ctx: ClientContext, sessionId: string): S
87
95
  * @returns 是否真的填进去了。
88
96
  */
89
97
  export declare function fillComposer(ctx: ClientContext, sessionId: string, text: string): boolean;
90
- /** `/video` 命令需要外部给的两件事。 */
98
+ /** `/video` 命令需要外部给的东西。 */
91
99
  export interface VideoCommandOptions {
92
- /** 打开参数弹窗。「自定义…」这一行调它。 */
100
+ /** 打开参数面板。 */
93
101
  readonly openForm: (sessionId: string, defaults: VideoDefaults) => void;
94
- /**
95
- * 预设档直接填输入框时用的通道。
96
- *
97
- * 缺省是 `fillComposer`,测试注入一个假的来断言「填进去的那段话是什么」。
98
- */
99
- readonly fill?: (sessionId: string, text: string) => boolean;
100
- /** 设置页里的默认参数。每次打开菜单时现取。 */
102
+ /** 设置页里的默认参数。每次打开时现取。 */
101
103
  readonly defaults?: () => VideoDefaults;
102
104
  /** 翻译;缺省走本线路的中文兜底。 */
103
105
  readonly translate?: VideoCommandTranslate;
104
106
  }
105
- /**
106
- * 把一条预设档拼成填进输入框的那段话。
107
- *
108
- * 提示词留一条**待填的占位**,而不是随便编一句:用户选了「H3 · 4秒 · 768P」之后,
109
- * 真正缺的只有画面描述,那一条应当由他来写。
110
- *
111
- * @param preset - 选中的预设档。
112
- * @returns 填进输入框的文本。
113
- */
114
- export declare function presetDraftText(preset: VideoPreset): string;
107
+ /** 兜底翻译:只在没有 locale 服务时用到(测试、以及菜单渲染早于字典注册)。 */
108
+ export declare function fallbackTranslate(key: MinimaxCodeLocaleKey, params?: Record<string, string | number>): string;
115
109
  /**
116
110
  * 构造 `/video` 的 `CommandContribution`。
117
111
  *
@@ -119,7 +113,7 @@ export declare function presetDraftText(preset: VideoPreset): string;
119
113
  * `ui-message-feedback` 的 `/feedback` 装饰同一种接线方式。
120
114
  *
121
115
  * @param ctx - 浏览器根上下文。
122
- * @param options - 打开弹窗与填输入框的通道。
116
+ * @param options - 打开面板的通道。
123
117
  * @returns 一份可直接交给 `commandUi.register` 的贡献。
124
118
  */
125
119
  export declare function createVideoCommand(ctx: ClientContext, options: VideoCommandOptions): CommandContribution;
@@ -1 +1 @@
1
- {"version":3,"file":"video-command.d.ts","sourceRoot":"","sources":["../../../../src/client/minimax-code/video-command.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4CG;AAEH,OAAO,KAAK,EAAE,OAAO,IAAI,aAAa,EAAE,MAAM,qBAAqB,CAAA;AAInE,OAAO,KAAK,EAAE,mBAAmB,EAAgB,MAAM,wBAAwB,CAAA;AAE/E,OAAO,EAGL,KAAK,aAAa,EAEnB,MAAM,uBAAuB,CAAA;AAC9B,OAAO,EAAgB,KAAK,WAAW,EAAE,MAAM,uBAAuB,CAAA;AACtE,OAAO,EAAM,KAAK,oBAAoB,EAAE,MAAM,cAAc,CAAA;AAE5D,gDAAgD;AAChD,eAAO,MAAM,qBAAqB,iBAAiB,CAAA;AAEnD,+BAA+B;AAC/B,eAAO,MAAM,gBAAgB,WAAW,CAAA;AAExC,iBAAiB;AACjB,eAAO,MAAM,kBAAkB,UAAU,CAAA;AAEzC,cAAc;AACd,MAAM,MAAM,qBAAqB,GAAG,CAAC,GAAG,EAAE,oBAAoB,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,KAAK,MAAM,CAAA;AAEnH,cAAc;AACd,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAA;IACzB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;CACvB;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,cAAc,CAAC,GAAG,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,GAAG,YAAY,GAAG,SAAS,CAuB9F;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,YAAY,CAAC,GAAG,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAkBzF;AAED,4BAA4B;AAC5B,MAAM,WAAW,mBAAmB;IAClC,0BAA0B;IAC1B,QAAQ,CAAC,QAAQ,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,aAAa,KAAK,IAAI,CAAA;IACvE;;;;OAIG;IACH,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,KAAK,OAAO,CAAA;IAC5D,2BAA2B;IAC3B,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,aAAa,CAAA;IACvC,sBAAsB;IACtB,QAAQ,CAAC,SAAS,CAAC,EAAE,qBAAqB,CAAA;CAC3C;AASD;;;;;;;;GAQG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,WAAW,GAAG,MAAM,CAU3D;AAED;;;;;;;;;GASG;AACH,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,aAAa,EAAE,OAAO,EAAE,mBAAmB,GAAG,mBAAmB,CAwCxG"}
1
+ {"version":3,"file":"video-command.d.ts","sourceRoot":"","sources":["../../../../src/client/minimax-code/video-command.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCG;AAEH,OAAO,KAAK,EAAE,OAAO,IAAI,aAAa,EAAE,MAAM,qBAAqB,CAAA;AAInE,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAA;AAEjE,OAAO,EAA0B,KAAK,aAAa,EAAE,MAAM,uBAAuB,CAAA;AAElF,OAAO,EAAM,KAAK,oBAAoB,EAAE,MAAM,cAAc,CAAA;AAE5D,gDAAgD;AAChD,eAAO,MAAM,qBAAqB,iBAAiB,CAAA;AAEnD,iBAAiB;AACjB,eAAO,MAAM,kBAAkB,UAAU,CAAA;AAEzC,cAAc;AACd,MAAM,MAAM,qBAAqB,GAAG,CAAC,GAAG,EAAE,oBAAoB,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,KAAK,MAAM,CAAA;AAEnH,cAAc;AACd,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAA;IACzB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;CACvB;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,cAAc,CAAC,GAAG,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,GAAG,YAAY,GAAG,SAAS,CAuB9F;AAyBD;;;;;;;;;;GAUG;AACH,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAE9D;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,eAAe,CAAC,GAAG,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAS7E;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,YAAY,CAAC,GAAG,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CASzF;AAED,2BAA2B;AAC3B,MAAM,WAAW,mBAAmB;IAClC,cAAc;IACd,QAAQ,CAAC,QAAQ,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,aAAa,KAAK,IAAI,CAAA;IACvE,yBAAyB;IACzB,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,aAAa,CAAA;IACvC,sBAAsB;IACtB,QAAQ,CAAC,SAAS,CAAC,EAAE,qBAAqB,CAAA;CAC3C;AAED,+CAA+C;AAC/C,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,oBAAoB,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,GAAG,MAAM,CAI7G;AAED;;;;;;;;;GASG;AACH,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,aAAa,EAAE,OAAO,EAAE,mBAAmB,GAAG,mBAAmB,CAoBxG"}
@@ -24,6 +24,7 @@
24
24
  *
25
25
  * @module @eddyskywalker/dsh-chatgpt-subscription/client/minimax-code/video-contract
26
26
  */
27
+ import type { RemoteBytes, RemoteResult } from './video-slots.ts';
27
28
  /**
28
29
  * `minimax_generate_video` 的线上工具名。
29
30
  *
@@ -93,6 +94,41 @@ export declare function absoluteVideoPath(cwd: string | undefined, videoPath: st
93
94
  * @returns 整段文件字节。
94
95
  */
95
96
  export type ReadVideoBytes = (sessionId: string, path: string, signal?: AbortSignal) => Promise<Uint8Array>;
97
+ /**
98
+ * 一次远端取字节的结果 → 字节。
99
+ *
100
+ * 远端调用**不抛异常**:它把结果装成 `{ ok: true, value }` 或
101
+ * `{ ok: false, error }`(见 `@deepseek-ai/dsh-typert-protocol` 的
102
+ * `RemoteResult`)。所以字节在 `value.data`,而不是结果对象的 `data`——
103
+ * 直接读 `(await call()).data` 拿到的是 `undefined`,界面会把它显示成
104
+ * 「一直在读」。
105
+ *
106
+ * 失败那一支**抛出去**:卡片按 `code` 与 `details.limit` 区分「文件太大」和
107
+ * 「读不到」,那需要一条真正的异常(`RemoteError` 本身就是带这两个字段的
108
+ * `Error`)。
109
+ *
110
+ * **载荷有两代形状**:≤0.1.6 的宿主给 base64 字符串,≥0.1.7 的宿主给
111
+ * `Uint8Array`。两种都认,否则旧世代会拿到一串 base64 而不是字节。
112
+ *
113
+ * @param result - 远端返回的结果。
114
+ * @returns 整段文件字节。
115
+ * @throws 远端声明的失败,或一份「成功却没有字节」的结果。
116
+ */
117
+ export declare function unwrapVideoBytes(result: RemoteResult<{
118
+ readonly data: RemoteBytes;
119
+ }>): Uint8Array;
120
+ /**
121
+ * 宿主的字节载荷 → 浏览器要用的字节。
122
+ *
123
+ * ≥0.1.7 的宿主直接给 `Uint8Array`;≤0.1.6 的宿主给 base64 字符串,
124
+ * 宿主自己的预览也是用 `atob` 解的(`ui-sidebar-documentpreview/src/client/rpc.ts`
125
+ * 的 `documentFileBytes`)。这里照抄同一套判定。
126
+ *
127
+ * @param data - 远端交回的载荷。
128
+ * @returns 整段文件字节。
129
+ * @throws 载荷既不是字节也不是可解的 base64。
130
+ */
131
+ export declare function decodeVideoBytes(data: RemoteBytes): Uint8Array;
96
132
  /**
97
133
  * 一次取字节失败的原因。
98
134
  *
@@ -1 +1 @@
1
- {"version":3,"file":"video-contract.d.ts","sourceRoot":"","sources":["../../../../src/client/minimax-code/video-contract.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAEH;;;;;GAKG;AACH,eAAO,MAAM,uBAAuB,2BAA2B,CAAA;AAE/D;;;;;;GAMG;AACH,MAAM,WAAW,4BAA4B;IAC3C,mCAAmC;IACnC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;IAC1B,kDAAkD;IAClD,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;IAC1B,yBAAyB;IACzB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;IACtB,gCAAgC;IAChC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;IACtB,kCAAkC;IAClC,QAAQ,CAAC,eAAe,CAAC,EAAE,MAAM,CAAA;IACjC,uBAAuB;IACvB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;CACxB;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,OAAO,GAAG,4BAA4B,GAAG,SAAS,CAqBrF;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAQpF;AAED;;;;;;;;;;;GAWG;AACH,MAAM,MAAM,cAAc,GAAG,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,WAAW,KAAK,OAAO,CAAC,UAAU,CAAC,CAAA;AAE3G;;;;;;GAMG;AACH,MAAM,MAAM,gBAAgB,GAAG,WAAW,GAAG,YAAY,CAAA;AAEzD,sDAAsD;AACtD,eAAO,MAAM,wBAAwB,6BAA6B,CAAA;AAElE;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,OAAO,GAAG,gBAAgB,CAKnE;AAED;;;;;;;;;GASG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,GAAG,SAAS,CAMnE;AAED;;;;;;;GAOG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAcjD;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,iBAAiB,CAC/B,CAAC,EAAE,CAAC,GAAG,EAAE,eAAe,KAAK,MAAM,EACnC,KAAK,EAAE,MAAM,GAAG,SAAS,GACxB,MAAM,CAER;AAED;;;;;;GAMG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAOtD;AAED;;;;GAIG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAI/C"}
1
+ {"version":3,"file":"video-contract.d.ts","sourceRoot":"","sources":["../../../../src/client/minimax-code/video-contract.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAA;AAEjE;;;;;GAKG;AACH,eAAO,MAAM,uBAAuB,2BAA2B,CAAA;AAE/D;;;;;;GAMG;AACH,MAAM,WAAW,4BAA4B;IAC3C,mCAAmC;IACnC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;IAC1B,kDAAkD;IAClD,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;IAC1B,yBAAyB;IACzB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;IACtB,gCAAgC;IAChC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;IACtB,kCAAkC;IAClC,QAAQ,CAAC,eAAe,CAAC,EAAE,MAAM,CAAA;IACjC,uBAAuB;IACvB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;CACxB;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,OAAO,GAAG,4BAA4B,GAAG,SAAS,CAqBrF;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAQpF;AAED;;;;;;;;;;;GAWG;AACH,MAAM,MAAM,cAAc,GAAG,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,WAAW,KAAK,OAAO,CAAC,UAAU,CAAC,CAAA;AAE3G;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,YAAY,CAAC;IAAE,QAAQ,CAAC,IAAI,EAAE,WAAW,CAAA;CAAE,CAAC,GAAG,UAAU,CAGjG;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,WAAW,GAAG,UAAU,CAW9D;AAED;;;;;;GAMG;AACH,MAAM,MAAM,gBAAgB,GAAG,WAAW,GAAG,YAAY,CAAA;AAEzD,sDAAsD;AACtD,eAAO,MAAM,wBAAwB,6BAA6B,CAAA;AAElE;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,OAAO,GAAG,gBAAgB,CAKnE;AAED;;;;;;;;;GASG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,GAAG,SAAS,CAMnE;AAED;;;;;;;GAOG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAcjD;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,iBAAiB,CAC/B,CAAC,EAAE,CAAC,GAAG,EAAE,eAAe,KAAK,MAAM,EACnC,KAAK,EAAE,MAAM,GAAG,SAAS,GACxB,MAAM,CAER;AAED;;;;;;GAMG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAOtD;AAED;;;;GAIG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAI/C"}
@@ -0,0 +1,57 @@
1
+ /**
2
+ * 参考媒体的**输入区**:浏览、拖拽、粘贴三个入口共用一个落脚点。
3
+ *
4
+ * ## 为什么是一个自建组件而不是三个输入框
5
+ *
6
+ * 参数面板里四类参考媒体(首帧、末帧、参考图/视频/音频)此前是四排纯文本框,
7
+ * 用户要自己去资源管理器里复制路径。现在每一类都变成一块「媒体块」:一条条已收下
8
+ * 的路径显示成可移除的标签,右上角是「浏览…」,整块可以拖入文件,也可以直接
9
+ * 粘贴路径或链接。
10
+ *
11
+ * ## 「浏览」为什么用 `<input type="file">`
12
+ *
13
+ * 桌面端没有向网页暴露「选文件」的原生对话框 IPC(只有目录选择器)。而浏览器
14
+ * 自带的 `<input type="file">` 在桌面端同样能拿到文件对象——本机路径由宿主桥
15
+ * `__DSH_HOST_PATHS__.pathFor` 还原。网页端拿不到路径时如实提示,而不是让用户
16
+ * 以为已经加上了。
17
+ *
18
+ * @module @eddyskywalker/dsh-chatgpt-subscription/client/minimax-code/video-media-dropzone
19
+ */
20
+ import type { WorkspaceLister } from './video-workspace.ts';
21
+ import type { MinimaxCodeLocaleKey } from './locales.ts';
22
+ /** 翻译座位(与 VideoFormDialog 同一形状)。 */
23
+ type Translate = (key: MinimaxCodeLocaleKey, params?: Record<string, string | number>) => string;
24
+ /** 媒体块的入参。 */
25
+ export interface MediaDropZoneProps {
26
+ /** 区块标题。 */
27
+ readonly label: string;
28
+ /** 已收下的路径,按顺序。 */
29
+ readonly paths: readonly string[];
30
+ /** 路径整组变化(拖入、粘贴、浏览、移除都走这里)。 */
31
+ readonly onChange: (paths: readonly string[]) => void;
32
+ /** 浏览按钮接受的类型,如 `image/*`。 */
33
+ readonly accept: string;
34
+ /** 输入元素的 id,用于标签关联。 */
35
+ readonly id: string;
36
+ /** 翻译。 */
37
+ readonly t: Translate;
38
+ /** 额外的一行说明(可选)。 */
39
+ readonly hint?: string;
40
+ /** 是否允许多选;首帧/末帧只有一格,所以那里传 false。 */
41
+ readonly multiple?: boolean;
42
+ /**
43
+ * 列出某个工作区目录的子项,供 `@` 补全。
44
+ *
45
+ * 缺席(宿主没装 remote、或还没挂载)时就只是没有候选列表:输入照样能填路径。
46
+ */
47
+ readonly listWorkspace?: WorkspaceLister | undefined;
48
+ }
49
+ /**
50
+ * 一块媒体输入:已收下的条目 + 浏览按钮 + 拖拽与粘贴。
51
+ *
52
+ * @param props - 标题、当前路径、变更回调、接受的类型。
53
+ * @returns 媒体块。
54
+ */
55
+ export declare function MediaDropZone({ label, paths, onChange, accept, id, t, hint, multiple, listWorkspace, }: MediaDropZoneProps): React.JSX.Element;
56
+ export {};
57
+ //# sourceMappingURL=video-media-dropzone.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"video-media-dropzone.d.ts","sourceRoot":"","sources":["../../../../src/client/minimax-code/video-media-dropzone.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAWH,OAAO,KAAK,EAAkB,eAAe,EAAE,MAAM,sBAAsB,CAAA;AAE3E,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAA;AAExD,oCAAoC;AACpC,KAAK,SAAS,GAAG,CAAC,GAAG,EAAE,oBAAoB,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,KAAK,MAAM,CAAA;AAEhG,cAAc;AACd,MAAM,WAAW,kBAAkB;IACjC,YAAY;IACZ,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;IACtB,kBAAkB;IAClB,QAAQ,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,CAAA;IACjC,+BAA+B;IAC/B,QAAQ,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,KAAK,IAAI,CAAA;IACrD,6BAA6B;IAC7B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;IACvB,uBAAuB;IACvB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAA;IACnB,UAAU;IACV,QAAQ,CAAC,CAAC,EAAE,SAAS,CAAA;IACrB,mBAAmB;IACnB,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAA;IACtB,oCAAoC;IACpC,QAAQ,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAA;IAC3B;;;;OAIG;IACH,QAAQ,CAAC,aAAa,CAAC,EAAE,eAAe,GAAG,SAAS,CAAA;CACrD;AAED;;;;;GAKG;AACH,wBAAgB,aAAa,CAAC,EAC5B,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,EAAE,IAAI,EAAE,QAAe,EAAE,aAAa,GAC5E,EAAE,kBAAkB,GAAG,KAAK,CAAC,GAAG,CAAC,OAAO,CAyOxC"}
@@ -0,0 +1,173 @@
1
+ /**
2
+ * 参考媒体的**入口归一化**:把「拖进来的文件」「粘贴板里的文字」「浏览选中的文件」
3
+ * 变成一张路径列表。
4
+ *
5
+ * ## 为什么需要一个纯函数模块
6
+ *
7
+ * 这三种入口最终都要回答同一个问题:**这一条是不是服务端认识的本机路径**。宿主
8
+ * 的 `minimax_generate_video` 只接受本机文件(`video-tool.ts` 里逐条校验),
9
+ * 网页链接和 `data:` 内联串在服务端一律被拒。如果这里放行,用户会看到「填好了」
10
+ * 然后被计费前的校验打回来——那正是这个入口要避免的体验。
11
+ *
12
+ * 所以判定写在纯函数里,事件绑定留在组件里:判定能被测试钉死,DOM 细节不必。
13
+ *
14
+ * ## 「真实路径」是怎么来的
15
+ *
16
+ * 浏览器的 `File` 对象**没有**路径字段(安全模型如此)。DSH 桌面端额外暴露出
17
+ * `window.__DSH_HOST_PATHS__.pathFor(file)`(Electron `webUtils.getPathForFile`),
18
+ * 本插件按鸭子类型取用:拿得到就是绝对路径,拿不到就如实返回空串,由界面提示
19
+ * 用户改用粘贴——**绝不编一条看起来像路径的字符串**。
20
+ *
21
+ * @module @eddyskywalker/dsh-chatgpt-subscription/client/minimax-code/video-media-input
22
+ */
23
+ /** 一次归一化的结果。 */
24
+ export interface MediaIntake {
25
+ /** 可以直接写进表单的路径,按输入顺序、已去重。 */
26
+ readonly paths: readonly string[];
27
+ /** 被拒绝的网页链接(不是本机路径)。 */
28
+ readonly rejectedUrls: readonly string[];
29
+ /** 拿不到本机路径的文件个数(浏览器里拖进来的网页图片、内联字节等)。 */
30
+ readonly withoutPath: number;
31
+ }
32
+ /** 空结果,供调用方省一次判断。 */
33
+ export declare const EMPTY_INTAKE: MediaIntake;
34
+ /** 桌面端宿主路径桥的形状(`apps/desktop/src/preload-app.ts` 暴露的那一个)。 */
35
+ interface HostPathBridge {
36
+ readonly pathFor?: (file: File) => string;
37
+ }
38
+ /**
39
+ * 取一个 `File` 的本机绝对路径。
40
+ *
41
+ * 桌面端由宿主桥给出;网页端、或宿主那一版没有这个桥时返回空串。**任何异常都
42
+ * 吞掉**:拖进一个文件不该把面板带崩。
43
+ *
44
+ * @param file - 拖入或浏览选中的文件。
45
+ * @param bridge - 取值来源;缺省读 `globalThis`,测试注入一个假的。
46
+ * @returns 绝对路径,或空串。
47
+ */
48
+ export declare function hostPathForFile(file: File, bridge?: HostPathBridge | undefined): string;
49
+ /**
50
+ * 服务端唯一会被读的 URL 主机(宿主 `MINIMAX_CDN_HOST`,实测结论)。
51
+ *
52
+ * 其他公网地址在服务端会被拒——`video-tool.ts` 的 `prepareMediaInput` 里
53
+ * `assertMinimaxCdnUrl` 先拦一道,第三方链接根本到不了模型。所以这一条不是
54
+ * 保守,而是把事实写进入口。
55
+ */
56
+ export declare const MINIMAX_CDN_HOST = "cdn.hailuoai.com";
57
+ /**
58
+ * 这条 URL 是不是 MiniMax 自己的 CDN 地址。
59
+ *
60
+ * @param text - 一条 URL。
61
+ * @returns 主机名匹配时为 true。
62
+ */
63
+ export declare function isMinimaxCdnUrl(text: string): boolean;
64
+ /**
65
+ * 一条文本是不是「有协议头的 URL」。
66
+ *
67
+ * 只看形如 `scheme://…` 与 `scheme:…` 的写法;Windows 盘符(`C:\…`)只有一个
68
+ * 字母,会被这条规则误伤,所以单字母 scheme 除外。
69
+ *
70
+ * @param text - 一行文本。
71
+ * @returns 命中的协议名(小写),没有则 undefined。
72
+ */
73
+ export declare function urlSchemeOf(text: string): string | undefined;
74
+ /**
75
+ * 把 `file://` 地址还原成本机路径。
76
+ *
77
+ * 只处理最常见的两种写法:`file:///C:/x/y.png`(Windows)与
78
+ * `file:///home/u/a.png`(POSIX)。解不出来就原样返回,让调用方按 URL 拒绝。
79
+ *
80
+ * @param url - 一条 `file:` 地址。
81
+ * @returns 本机路径,或空串。
82
+ */
83
+ export declare function pathFromFileUrl(url: string): string;
84
+ /**
85
+ * 把一行文本归一化成一条本机路径。
86
+ *
87
+ * 空行、`file:` 地址、普通路径都接受;其余带协议的(`http:`、`data:`、
88
+ * `blob:`…)一律判为「网页链接」,由调用方提示用户先下载。
89
+ *
90
+ * @param line - 一行原始文本。
91
+ * @returns 判定结果。
92
+ */
93
+ export declare function normalizeMediaLine(line: string): {
94
+ path: string;
95
+ } | {
96
+ rejectedUrl: string;
97
+ } | undefined;
98
+ /**
99
+ * 去掉输入框里引用工作区文件的那一个 `@`。
100
+ *
101
+ * `@docs/a.png` 是**对话框**里引用文件的写法,而工具参数收的是普通路径。用户
102
+ * 从对话里原样复制一行过来时,这个前缀跟着一起来,所以在这里去掉——只去一个,
103
+ * 且只在它后面还有内容时去(`@` 本身不是路径)。
104
+ *
105
+ * @param text - 一行原始文本。
106
+ * @returns 去掉前导 `@` 的文本。
107
+ */
108
+ export declare function stripReferencePrefix(text: string): string;
109
+ /**
110
+ * 把粘贴板里的一段文字归一化成路径。
111
+ *
112
+ * 支持多行、去重;`text/uri-list` 的注释行(以 `#` 开头)按规范忽略。
113
+ *
114
+ * @param text - 粘贴板文字。
115
+ * @returns 归一化结果。
116
+ */
117
+ export declare function intakeFromText(text: string): MediaIntake;
118
+ /**
119
+ * 把一批 `File` 归一化成路径。
120
+ *
121
+ * 拿不到路径的文件计入 `withoutPath`,**不进** `paths`:界面据此说一句实话,而
122
+ * 不是塞一条空路径进表单。
123
+ *
124
+ * @param files - 拖入或选中的文件。
125
+ * @param bridge - 路径来源,缺省读宿主桥。
126
+ * @returns 归一化结果。
127
+ */
128
+ export declare function intakeFromFiles(files: readonly File[], bridge?: HostPathBridge | undefined): MediaIntake;
129
+ /**
130
+ * 合并两份归一化结果。
131
+ *
132
+ * @param left - 先到的。
133
+ * @param right - 后到的。
134
+ * @returns 合并结果(去重顺序保持)。
135
+ */
136
+ export declare function mergeIntake(left: MediaIntake, right: MediaIntake): MediaIntake;
137
+ /** 媒体类别:决定一条路径进哪一栏。 */
138
+ export type MediaKind = 'image' | 'video' | 'audio' | 'unknown';
139
+ /**
140
+ * 按后缀判断一条路径属于哪一栏。
141
+ *
142
+ * 只看后缀名:浏览器里没有文件系统,问不了 MIME;而服务端本来就按路径读盘,
143
+ * 后缀是它唯一能用的线索。
144
+ *
145
+ * @param path - 一条路径。
146
+ * @returns 类别;认不出时是 `unknown`。
147
+ */
148
+ export declare function mediaKindOf(path: string): MediaKind;
149
+ /** 一条已经收下的参考媒体:路径 + 它在界面上显示的名字。 */
150
+ export interface MediaEntry {
151
+ readonly path: string;
152
+ readonly name: string;
153
+ }
154
+ /**
155
+ * 从一条路径取出显示名(最后一段,兼容两种分隔符)。
156
+ *
157
+ * @param path - 一条路径。
158
+ * @returns 用于界面上的名字。
159
+ */
160
+ /**
161
+ * 一条路径是不是「需要单独给时长」的远端视频。
162
+ *
163
+ * 本机文件由宿主从容器里读时长;CDN 上的链接读不到(宿主不下拉去量),所以
164
+ * 那一条必须在旁边写一个秒数,否则提交会被 `MINIMAX_VIDEO_REFERENCE_DURATION_REQUIRED`
165
+ * 拒掉。
166
+ *
167
+ * @param path - 一条路径或 URL。
168
+ * @returns 需要用户手填时长时为 true。
169
+ */
170
+ export declare function needsDuration(path: string): boolean;
171
+ export declare function mediaNameOf(path: string): string;
172
+ export {};
173
+ //# sourceMappingURL=video-media-input.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"video-media-input.d.ts","sourceRoot":"","sources":["../../../../src/client/minimax-code/video-media-input.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH,gBAAgB;AAChB,MAAM,WAAW,WAAW;IAC1B,6BAA6B;IAC7B,QAAQ,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,CAAA;IACjC,wBAAwB;IACxB,QAAQ,CAAC,YAAY,EAAE,SAAS,MAAM,EAAE,CAAA;IACxC,wCAAwC;IACxC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAA;CAC7B;AAED,qBAAqB;AACrB,eAAO,MAAM,YAAY,EAAE,WAA6D,CAAA;AAExF,6DAA6D;AAC7D,UAAU,cAAc;IACtB,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,KAAK,MAAM,CAAA;CAC1C;AAED;;;;;;;;;GASG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,CAAC,EAAE,cAAc,GAAG,SAAS,GAAG,MAAM,CAQvF;AAED;;;;;;GAMG;AACH,eAAO,MAAM,gBAAgB,qBAAqB,CAAA;AAElD;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAOrD;AAED;;;;;;;;GAQG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAG5D;AAED;;;;;;;;GAQG;AACH,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAUnD;AAED;;;;;;;;GAQG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,GAAG;IAAE,WAAW,EAAE,MAAM,CAAA;CAAE,GAAG,SAAS,CAavG;AAED;;;;;;;;;GASG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEzD;AAED;;;;;;;GAOG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,WAAW,CAcxD;AAED;;;;;;;;;GASG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,SAAS,IAAI,EAAE,EAAE,MAAM,CAAC,EAAE,cAAc,GAAG,SAAS,GAAG,WAAW,CASxG;AAED;;;;;;GAMG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,WAAW,EAAE,KAAK,EAAE,WAAW,GAAG,WAAW,CAM9E;AAED,uBAAuB;AACvB,MAAM,MAAM,SAAS,GAAG,OAAO,GAAG,OAAO,GAAG,OAAO,GAAG,SAAS,CAAA;AAM/D;;;;;;;;GAQG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,CAQnD;AAED,mCAAmC;AACnC,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;CACtB;AAED;;;;;GAKG;AACH;;;;;;;;;GASG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAEnD;AAED,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAGhD"}