@eddyskywalker/dsh-chatgpt-subscription 0.36.1 → 0.37.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 (54) hide show
  1. package/CHANGELOG.md +48 -0
  2. package/README.md +23 -3
  3. package/lib/client.js +340 -47
  4. package/lib/client.js.map +1 -1
  5. package/lib/index.js +3088 -54
  6. package/lib/types/client/common/ComposerQuotaBadge.d.ts +7 -0
  7. package/lib/types/client/common/ComposerQuotaBadge.d.ts.map +1 -1
  8. package/lib/types/client/locales-ru/opendesign.d.ts.map +1 -1
  9. package/lib/types/client/locales-ru/progress-updates.d.ts.map +1 -1
  10. package/lib/types/client/locales.d.ts +4 -4
  11. package/lib/types/client/opendesign/OpenDesignComposerQuota.d.ts +6 -0
  12. package/lib/types/client/opendesign/OpenDesignComposerQuota.d.ts.map +1 -1
  13. package/lib/types/client/opendesign/OpenDesignSection.d.ts.map +1 -1
  14. package/lib/types/client/opendesign/locales.d.ts +54 -0
  15. package/lib/types/client/opendesign/locales.d.ts.map +1 -1
  16. package/lib/types/client/opendesign/styles.d.ts +5 -0
  17. package/lib/types/client/opendesign/styles.d.ts.map +1 -1
  18. package/lib/types/client/progress-updates/locales.d.ts +17 -2
  19. package/lib/types/client/progress-updates/locales.d.ts.map +1 -1
  20. package/lib/types/client/progress-updates/settings-binding.d.ts +13 -3
  21. package/lib/types/client/progress-updates/settings-binding.d.ts.map +1 -1
  22. package/lib/types/client/progress-updates/settings-section.d.ts +5 -5
  23. package/lib/types/client/progress-updates/settings-section.d.ts.map +1 -1
  24. package/lib/types/client/progress-updates/styles.d.ts.map +1 -1
  25. package/lib/types/host/claude/routes.d.ts.map +1 -1
  26. package/lib/types/host/opendesign/client.d.ts +103 -0
  27. package/lib/types/host/opendesign/client.d.ts.map +1 -1
  28. package/lib/types/host/opendesign/routes.d.ts.map +1 -1
  29. package/lib/types/host/opendesign/types.d.ts +31 -0
  30. package/lib/types/host/opendesign/types.d.ts.map +1 -1
  31. package/lib/types/host/progress-updates/index.d.ts +5 -0
  32. package/lib/types/host/progress-updates/index.d.ts.map +1 -1
  33. package/lib/types/host/progress-updates/prompt.d.ts +37 -3
  34. package/lib/types/host/progress-updates/prompt.d.ts.map +1 -1
  35. package/lib/types/host/progress-updates/tool.d.ts.map +1 -1
  36. package/lib/types/host/proxy-manager.d.ts +63 -1
  37. package/lib/types/host/proxy-manager.d.ts.map +1 -1
  38. package/lib/types/host/widget-board/line-contracts.d.ts +192 -0
  39. package/lib/types/host/widget-board/line-contracts.d.ts.map +1 -0
  40. package/lib/types/host/widget-board/line-quota.d.ts +284 -0
  41. package/lib/types/host/widget-board/line-quota.d.ts.map +1 -0
  42. package/lib/types/host/widget-board/line-registry.d.ts +402 -0
  43. package/lib/types/host/widget-board/line-registry.d.ts.map +1 -0
  44. package/lib/types/host/widget-board/provider.d.ts +140 -0
  45. package/lib/types/host/widget-board/provider.d.ts.map +1 -0
  46. package/lib/types/index.d.ts +10 -0
  47. package/lib/types/index.d.ts.map +1 -1
  48. package/lib/types/shared/opendesign-contracts.d.ts +47 -0
  49. package/lib/types/shared/opendesign-contracts.d.ts.map +1 -1
  50. package/package.json +2 -1
  51. package/widgets/line-flip/index.html +58 -0
  52. package/widgets/line-flip/main.js +1102 -0
  53. package/widgets/line-flip/style.css +729 -0
  54. package/widgets/line-flip/widget.json +555 -0
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/host/progress-updates/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AA8BH,sCAAsC;AACtC,MAAM,WAAW,uBAAuB;IACtC,WAAW;IACX,OAAO,EAAE,OAAO,CAAA;IAChB,mCAAmC;IACnC,cAAc,EAAE,MAAM,CAAA;CACvB;AAED;;;;;;GAMG;AACH,UAAU,SAAS,CAAC,CAAC;IACnB,iBAAiB;IACjB,GAAG,IAAI,CAAC,GAAG,SAAS,CAAA;CACrB;AAED,sBAAsB;AACtB,MAAM,MAAM,0BAA0B,CAAC,CAAC,IAAI,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,SAAS,CAAA;AAExE,mCAAmC;AACnC,MAAM,WAAW,2BAA2B;IAC1C,aAAa;IACb,eAAe,CAAC,EAAE,0BAA0B,CAAC,OAAO,CAAC,CAAA;IACrD,eAAe;IACf,6BAA6B,CAAC,EAAE,0BAA0B,CAAC,MAAM,CAAC,CAAA;CACnE;AAED;;;;GAIG;AACH,wBAAgB,uBAAuB,CAAC,CAAC,EAAE,KAAK,EAAE,0BAA0B,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,SAAS,CAM9F;AAED;;;;GAIG;AACH,wBAAgB,8BAA8B,CAAC,MAAM,CAAC,EAAE,2BAA2B,GAAG,uBAAuB,CAU5G;AAED,YAAY;AACZ,MAAM,WAAW,sBAAsB;IACrC;;;;;;OAMG;IACH,QAAQ,EAAE,MAAM,uBAAuB,CAAA;CACxC;AAED,kDAAkD;AAClD,MAAM,WAAW,sBAAsB;IACrC,6CAA6C;IAC7C,MAAM,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,MAAM,CAAC,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAA;IACrD,oBAAoB;IACpB,EAAE,CAAC,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,GAAG,IAAI,EAAE,KAAK,EAAE,KAAK,OAAO,GAAG,MAAM,IAAI,CAAA;IACvE,uCAAuC;IACvC,GAAG,CAAC,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAA;CAC5B;AAuJD;;;;;GAKG;AACH,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,sBAAsB,EAAE,OAAO,EAAE,sBAAsB,GAAG,MAAM,IAAI,CA6O/G"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/host/progress-updates/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AAaH,OAAO,EAKL,KAAK,sBAAsB,EAC5B,MAAM,aAAa,CAAA;AAiBpB,sCAAsC;AACtC,MAAM,WAAW,uBAAuB;IACtC,WAAW;IACX,OAAO,EAAE,OAAO,CAAA;IAChB,mCAAmC;IACnC,cAAc,EAAE,MAAM,CAAA;IACtB,sCAAsC;IACtC,QAAQ,EAAE,sBAAsB,CAAA;CACjC;AAED;;;;;;GAMG;AACH,UAAU,SAAS,CAAC,CAAC;IACnB,iBAAiB;IACjB,GAAG,IAAI,CAAC,GAAG,SAAS,CAAA;CACrB;AAED,sBAAsB;AACtB,MAAM,MAAM,0BAA0B,CAAC,CAAC,IAAI,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,SAAS,CAAA;AAExE,mCAAmC;AACnC,MAAM,WAAW,2BAA2B;IAC1C,aAAa;IACb,eAAe,CAAC,EAAE,0BAA0B,CAAC,OAAO,CAAC,CAAA;IACrD,eAAe;IACf,6BAA6B,CAAC,EAAE,0BAA0B,CAAC,MAAM,CAAC,CAAA;IAClE,cAAc;IACd,uBAAuB,CAAC,EAAE,0BAA0B,CAAC,sBAAsB,CAAC,CAAA;CAC7E;AAED;;;;GAIG;AACH,wBAAgB,uBAAuB,CAAC,CAAC,EAAE,KAAK,EAAE,0BAA0B,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,SAAS,CAM9F;AAED;;;;GAIG;AACH,wBAAgB,8BAA8B,CAAC,MAAM,CAAC,EAAE,2BAA2B,GAAG,uBAAuB,CAc5G;AAED,YAAY;AACZ,MAAM,WAAW,sBAAsB;IACrC;;;;;;OAMG;IACH,QAAQ,EAAE,MAAM,uBAAuB,CAAA;CACxC;AAED,kDAAkD;AAClD,MAAM,WAAW,sBAAsB;IACrC,6CAA6C;IAC7C,MAAM,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,MAAM,CAAC,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAA;IACrD,oBAAoB;IACpB,EAAE,CAAC,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,GAAG,IAAI,EAAE,KAAK,EAAE,KAAK,OAAO,GAAG,MAAM,IAAI,CAAA;IACvE,uCAAuC;IACvC,GAAG,CAAC,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAA;CAC5B;AAuJD;;;;;GAKG;AACH,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,sBAAsB,EAAE,OAAO,EAAE,sBAAsB,GAAG,MAAM,IAAI,CA6O/G"}
@@ -4,6 +4,13 @@
4
4
  * 文本用函数形式提供(而不是静态字符串):开关关闭时返回空串,装配期就地
5
5
  * 抹掉引导,不需要重启会话、也不需要重挂插件行。
6
6
  *
7
+ * ## 为什么是英文
8
+ *
9
+ * 提示词是写给模型看的,不是写给用户看的:同一段要求在英文下最短、歧义最少,
10
+ * 也和工具描述(`tool.ts` 的 `PROGRESS_UPDATE_DESCRIPTION`,本来就是英文)保持
11
+ * 同一套措辞。用户看到的语言由 {@link progressLanguageDirective} 单独钉住——
12
+ * 「指令用英文」与「输出用中文」是两件事,不要混在一起。
13
+ *
7
14
  * @module dsh-chatgpt-subscription/host/progress-updates/prompt
8
15
  */
9
16
  /**
@@ -19,16 +26,43 @@ export declare const PROGRESS_SECTION_NAME = "plugin:progress-updates";
19
26
  * 不与它们并列。
20
27
  */
21
28
  export declare const PROGRESS_SECTION_ORDER = 220;
29
+ /**
30
+ * 进展更新的输出语言。
31
+ *
32
+ * - `auto`:跟随对话语言(默认);
33
+ * - `zh`:一律中文;
34
+ * - `en`:一律英文。
35
+ *
36
+ * 只管 `progress_update` 的标题与正文,不影响会话里其它任何输出。
37
+ */
38
+ export type ProgressUpdateLanguage = 'auto' | 'zh' | 'en';
39
+ /** 允许的取值,供设置解析做白名单校验(配置里写错就等于没写)。 */
40
+ export declare const PROGRESS_UPDATE_LANGUAGES: readonly ProgressUpdateLanguage[];
22
41
  /**
23
42
  * 引导词正文。写法对齐 Kimi 的「进展更新」:先说清多步任务早期的思路,再报
24
43
  * 有意义的结论、阶段判断、长等待与阻塞;每条给一行标题,细节放正文;不重复
25
- * 没有变化的状态。
44
+ * 没有变化的状态。开头与结尾两条被提成硬要求——没有它们,面板在任务的两端
45
+ * 都是空的。
26
46
  */
27
47
  export declare const PROGRESS_GUIDANCE: string;
48
+ /**
49
+ * 每个语言档位对应的一句指令。
50
+ *
51
+ * 只约束输出的标题与正文,不约束引导词本身;三条都必须自洽——`auto` 不许在
52
+ * 用户说中文时滑回英文,`zh`/`en` 则明确压过对话语言。
53
+ */
54
+ export declare const PROGRESS_LANGUAGE_DIRECTIVES: Readonly<Record<ProgressUpdateLanguage, string>>;
55
+ /**
56
+ * 取一个语言档位的指令文本;未知取值按 `auto` 处理。
57
+ * @param language - 配置里读到的语言档位。
58
+ * @returns 追加到引导词末尾的一句指令。
59
+ */
60
+ export declare function progressLanguageDirective(language: ProgressUpdateLanguage): string;
28
61
  /**
29
62
  * 生成提示词分节的文本提供者。
30
63
  * @param isEnabled - 读取当前开关状态的函数(每次装配重新求值)。
31
- * @returns 开关打开时返回引导词,关闭时返回空串。
64
+ * @param language - 读取当前输出语言的函数;缺省按 `auto` 处理。
65
+ * @returns 开关打开时返回引导词加语言指令,关闭时返回空串。
32
66
  */
33
- export declare function progressSectionText(isEnabled: () => boolean): () => string;
67
+ export declare function progressSectionText(isEnabled: () => boolean, language?: () => ProgressUpdateLanguage): () => string;
34
68
  //# sourceMappingURL=prompt.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"prompt.d.ts","sourceRoot":"","sources":["../../../../src/host/progress-updates/prompt.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH;;;;;GAKG;AACH,eAAO,MAAM,qBAAqB,4BAA4B,CAAA;AAE9D;;;;GAIG;AACH,eAAO,MAAM,sBAAsB,MAAM,CAAA;AAEzC;;;;GAIG;AACH,eAAO,MAAM,iBAAiB,QAmBlB,CAAA;AAEZ;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,SAAS,EAAE,MAAM,OAAO,GAAG,MAAM,MAAM,CAE1E"}
1
+ {"version":3,"file":"prompt.d.ts","sourceRoot":"","sources":["../../../../src/host/progress-updates/prompt.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH;;;;;GAKG;AACH,eAAO,MAAM,qBAAqB,4BAA4B,CAAA;AAE9D;;;;GAIG;AACH,eAAO,MAAM,sBAAsB,MAAM,CAAA;AAEzC;;;;;;;;GAQG;AACH,MAAM,MAAM,sBAAsB,GAAG,MAAM,GAAG,IAAI,GAAG,IAAI,CAAA;AAEzD,qCAAqC;AACrC,eAAO,MAAM,yBAAyB,EAAE,SAAS,sBAAsB,EAAyB,CAAA;AAEhG;;;;;GAKG;AACH,eAAO,MAAM,iBAAiB,QAwBlB,CAAA;AAEZ;;;;;GAKG;AACH,eAAO,MAAM,4BAA4B,EAAE,QAAQ,CAAC,MAAM,CAAC,sBAAsB,EAAE,MAAM,CAAC,CAIzF,CAAA;AAED;;;;GAIG;AACH,wBAAgB,yBAAyB,CAAC,QAAQ,EAAE,sBAAsB,GAAG,MAAM,CAElF;AAED;;;;;GAKG;AACH,wBAAgB,mBAAmB,CACjC,SAAS,EAAE,MAAM,OAAO,EACxB,QAAQ,GAAE,MAAM,sBAAqC,GACpD,MAAM,MAAM,CAEd"}
@@ -1 +1 @@
1
- {"version":3,"file":"tool.d.ts","sourceRoot":"","sources":["../../../../src/host/progress-updates/tool.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAGH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAA;AAE5D,OAAO,EAAgB,KAAK,cAAc,EAAE,MAAM,YAAY,CAAA;AAE9D,4BAA4B;AAC5B,eAAO,MAAM,gBAAgB,oBAAoB,CAAA;AAEjD,iDAAiD;AACjD,eAAO,MAAM,oBAAoB,iEAAiE,CAAA;AAElG,iBAAiB;AACjB,eAAO,MAAM,2BAA2B,QAW7B,CAAA;AAEX,wCAAwC;AACxC,MAAM,WAAW,kBAAkB;IACjC,yBAAyB;IACzB,IAAI,CAAC,MAAM,EAAE,cAAc,GAAG,OAAO,CAAA;CACtC;AAED,sCAAsC;AACtC,MAAM,WAAW,oBAAoB;IACnC,sBAAsB;IACtB,SAAS,EAAE,OAAO,CAAA;CACnB;AAED;;;;GAIG;AACH,wBAAgB,wBAAwB,CAAC,IAAI,EAAE;IAC7C,0BAA0B;IAC1B,SAAS,EAAE,MAAM,OAAO,CAAA;IACxB,uCAAuC;IACvC,IAAI,CAAC,EAAE,MAAM,kBAAkB,GAAG,SAAS,CAAA;IAC3C,8BAA8B;IAC9B,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,MAAM,GAAG,SAAS,CAAA;CACjD,GAAG,cAAc,CAgDjB"}
1
+ {"version":3,"file":"tool.d.ts","sourceRoot":"","sources":["../../../../src/host/progress-updates/tool.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAGH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAA;AAE5D,OAAO,EAAgB,KAAK,cAAc,EAAE,MAAM,YAAY,CAAA;AAE9D,4BAA4B;AAC5B,eAAO,MAAM,gBAAgB,oBAAoB,CAAA;AAEjD,iDAAiD;AACjD,eAAO,MAAM,oBAAoB,iEAAiE,CAAA;AAElG,iBAAiB;AACjB,eAAO,MAAM,2BAA2B,QAa7B,CAAA;AAEX,wCAAwC;AACxC,MAAM,WAAW,kBAAkB;IACjC,yBAAyB;IACzB,IAAI,CAAC,MAAM,EAAE,cAAc,GAAG,OAAO,CAAA;CACtC;AAED,sCAAsC;AACtC,MAAM,WAAW,oBAAoB;IACnC,sBAAsB;IACtB,SAAS,EAAE,OAAO,CAAA;CACnB;AAED;;;;GAIG;AACH,wBAAgB,wBAAwB,CAAC,IAAI,EAAE;IAC7C,0BAA0B;IAC1B,SAAS,EAAE,MAAM,OAAO,CAAA;IACxB,uCAAuC;IACvC,IAAI,CAAC,EAAE,MAAM,kBAAkB,GAAG,SAAS,CAAA;IAC3C,8BAA8B;IAC9B,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,MAAM,GAAG,SAAS,CAAA;CACjD,GAAG,cAAc,CAgDjB"}
@@ -12,27 +12,89 @@ export interface ParseEnvProxyOptions {
12
12
  envFile?: string | null;
13
13
  }
14
14
  export declare function parseEnvProxy(env?: Record<string, string | undefined>, options?: ParseEnvProxyOptions): string | null;
15
- export declare function detectSystemProxy(platform?: NodeJS.Platform, env?: Record<string, string | undefined>): string | null;
15
+ export interface ParseNoProxyOptions {
16
+ /**
17
+ * `$DSH_HOME/.env`, consulted after the process environment; `null` disables
18
+ * the file fallback, exactly like {@link ParseEnvProxyOptions}.
19
+ */
20
+ envFile?: string | null;
21
+ }
22
+ /**
23
+ * The raw `NO_PROXY` list, or an empty string when none is configured.
24
+ *
25
+ * Read next to the proxy itself on purpose: a proxy that a line is *told* to use
26
+ * and a bypass list that lives somewhere else are how "the local gateway
27
+ * suddenly goes through Clash" happens.
28
+ */
29
+ export declare function parseNoProxy(env?: Record<string, string | undefined>, options?: ParseNoProxyOptions): string;
30
+ /**
31
+ * Whether a host is loopback, and therefore never worth a proxy hop.
32
+ *
33
+ * The whole `127.0.0.0/8` block, not just `127.0.0.1`: a second loopback alias
34
+ * is a normal way to run a local gateway, and a proxy cannot reach it any
35
+ * better than the process itself can.
36
+ */
37
+ export declare function isLoopbackHostname(hostname: string): boolean;
38
+ /**
39
+ * Standard `NO_PROXY` matching: `*`, exact hosts, domain suffixes, `host:port`.
40
+ *
41
+ * Deliberately not CIDR: a proxy configured for this plugin is a local GUI
42
+ * proxy, and the entries that matter are the ones a user types.
43
+ */
44
+ export declare function noProxyBypasses(hostname: string, port: string, list: string): boolean;
45
+ /**
46
+ * Whether a request target must skip the proxy.
47
+ *
48
+ * Loopback first: a local gateway behind a proxy hop is a request the proxy has
49
+ * to refuse (or worse, forwards to itself), and the plugin's own loopback reads
50
+ * already use a bare fetch for the same reason.
51
+ */
52
+ export declare function shouldBypassProxy(target: URL | string, noProxyList?: string): boolean;
53
+ /**
54
+ * GNOME's manual proxy, the Linux equivalent of the Windows registry read.
55
+ *
56
+ * `auto` is a PAC URL, which cannot be applied by posting through an agent, and
57
+ * `none` means no system proxy; both fall through to the environment.
58
+ */
59
+ export declare function parseLinuxSystemProxy(read: (key: string) => string | null): string | null;
60
+ export declare function detectSystemProxy(platform?: NodeJS.Platform, env?: Record<string, string | undefined>, readSettings?: (key: string) => string | null): string | null;
16
61
  /** Called with the proxy URL the first time detection reports one after a `null`. */
17
62
  export type SystemProxyListener = (proxyUrl: string) => void;
18
63
  export interface ProxyFetchOptions {
19
64
  getPreferences: () => Pick<SubscriptionPreferencesDto, 'proxyMode' | 'customProxyUrl'>;
20
65
  baseFetch?: FetchLike;
21
66
  systemProxyDetector?: () => string | null;
67
+ /**
68
+ * The `NO_PROXY` list, read per request (subject to the same TTL as the system
69
+ * proxy) so an edit takes effect without a restart. A test injects this rather
70
+ * than inheriting the machine's own bypass list.
71
+ */
72
+ noProxyReader?: () => string;
22
73
  logger?: Pick<Console, 'info' | 'warn' | 'error'>;
23
74
  }
24
75
  export declare class ProxyManager {
25
76
  private readonly getPreferences;
26
77
  private readonly baseFetch;
27
78
  private readonly systemProxyDetector;
79
+ private readonly noProxyReader;
28
80
  private readonly logger?;
29
81
  private cachedSystemProxy;
30
82
  private lastSystemProxyCheck;
83
+ private cachedNoProxy;
84
+ private lastNoProxyCheck;
31
85
  private detected;
32
86
  private readonly proxyListeners;
33
87
  private readonly agents;
34
88
  constructor(options: ProxyFetchOptions);
35
89
  getSystemProxy(force?: boolean): string | null;
90
+ /**
91
+ * The active `NO_PROXY` list, re-read at most once per TTL.
92
+ *
93
+ * A reader that throws (an unreadable `$DSH_HOME/.env`) reads as "no bypass
94
+ * list", never as "bypass everything": the wrong guess in that direction would
95
+ * take an active proxy away from every line at once.
96
+ */
97
+ getNoProxyList(force?: boolean): string;
36
98
  /**
37
99
  * Observe the system proxy becoming known.
38
100
  *
@@ -1 +1 @@
1
- {"version":3,"file":"proxy-manager.d.ts","sourceRoot":"","sources":["../../../src/host/proxy-manager.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAa,0BAA0B,EAAE,MAAM,wBAAwB,CAAA;AAEnF,MAAM,MAAM,SAAS,GAAG,OAAO,KAAK,CAAA;AAqBpC,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAOxD;AAED,wBAAgB,yBAAyB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAqCvE;AAED,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAwBnE;AAED,MAAM,WAAW,oBAAoB;IACnC;;;;OAIG;IACH,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;CACxB;AAED,wBAAgB,aAAa,CAC3B,GAAG,GAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAe,EACrD,OAAO,GAAE,oBAAyB,GACjC,MAAM,GAAG,IAAI,CA2Bf;AAED,wBAAgB,iBAAiB,CAAC,QAAQ,GAAE,MAAM,CAAC,QAA2B,EAAE,GAAG,GAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAe,GAAG,MAAM,GAAG,IAAI,CAuBpJ;AAED,qFAAqF;AACrF,MAAM,MAAM,mBAAmB,GAAG,CAAC,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAA;AAE5D,MAAM,WAAW,iBAAiB;IAChC,cAAc,EAAE,MAAM,IAAI,CAAC,0BAA0B,EAAE,WAAW,GAAG,gBAAgB,CAAC,CAAA;IACtF,SAAS,CAAC,EAAE,SAAS,CAAA;IACrB,mBAAmB,CAAC,EAAE,MAAM,MAAM,GAAG,IAAI,CAAA;IACzC,MAAM,CAAC,EAAE,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC,CAAA;CAClD;AAED,qBAAa,YAAY;IACvB,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAwE;IACvG,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAW;IACrC,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAAqB;IACzD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,CAA0C;IAElE,OAAO,CAAC,iBAAiB,CAAsB;IAC/C,OAAO,CAAC,oBAAoB,CAAI;IAChC,OAAO,CAAC,QAAQ,CAAQ;IACxB,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAiC;IAChE,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAgC;gBAE3C,OAAO,EAAE,iBAAiB;IAOtC,cAAc,CAAC,KAAK,UAAQ,GAAG,MAAM,GAAG,IAAI;IA8B5C;;;;;;;;;OASG;IACH,qBAAqB,CAAC,QAAQ,EAAE,mBAAmB,GAAG,MAAM,IAAI;IAKhE,qBAAqB,IAAI,MAAM,GAAG,IAAI;IAgBtC,OAAO,CAAC,gBAAgB;IAcxB,WAAW,IAAI,SAAS;IAsBxB,OAAO,IAAI,IAAI;CAOhB"}
1
+ {"version":3,"file":"proxy-manager.d.ts","sourceRoot":"","sources":["../../../src/host/proxy-manager.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,192 @@
1
+ /**
2
+ * Shape C: everything ONE card needs about ONE subscription line.
3
+ *
4
+ * A card is identified by \`props.line\`, so the whole answer is produced per
5
+ * line: the line's own quota windows, plus the account rows of that line's
6
+ * pool. The two halves come from different authorities and are merged here:
7
+ *
8
+ * - the account half reads this plugin's own pool objects through ONE generic
9
+ * adapter (every line's pool speaks \`listAccounts\` / \`setPrimary\` /
10
+ * \`setStrategy\`), never over HTTP;
11
+ * - the quota half reads the line's OWN \`/status\` route over loopback HTTP,
12
+ * because each line already normalizes its upstream payload into its own
13
+ * DTO and duplicating those readers here would be a second implementation
14
+ * of the same thing, free to drift.
15
+ *
16
+ * The mix is deliberate: an account list is a local document read (no upstream
17
+ * call, no credential needed), while a quota answer travels through the line's
18
+ * route, which owns its cache, its refresh flight and its error reporting.
19
+ *
20
+ * Two conventions this file fixes once, because a card must not have to know:
21
+ *
22
+ * - EVERY instant here is Unix MILLISECONDS. The lines disagree on the wire
23
+ * (codex states seconds, antigravity and cline-pass state ISO strings,
24
+ * kimi/minimax/qoder/glm/step state milliseconds); the normalizers convert,
25
+ * so a card never guesses a unit from a magnitude.
26
+ * - \`null\` means "nobody measured this", and is never 0. A window that was
27
+ * never read, a plan nobody named, a balance that could not be fetched —
28
+ * all null, all rendered as a placeholder rather than as a zero.
29
+ */
30
+ import type { AccountAuthStatus, AccountRotationStrategy } from '../../shared/account-pool-contracts.ts';
31
+ /**
32
+ * Provider name this plugin registers under: the BARE package id, without the
33
+ * `@eddyskywalker/` scope.
34
+ *
35
+ * A manifest names a data source or a capability as `<provider>:<id>`, and that
36
+ * whole string has to match the board's id regular expression
37
+ * `^[a-z][a-z0-9.-]{1,39}(?::[a-z][a-z0-9.-]{1,39})?$` — which accepts neither
38
+ * `@` nor `/`. A scoped provider name would therefore be registrable on the host
39
+ * and unreachable from every manifest, so the registration and the manifests
40
+ * must agree on this literal.
41
+ */
42
+ export declare const WIDGET_BOARD_PROVIDER = "dsh-chatgpt-subscription";
43
+ /**
44
+ * The name a widget manifest writes to reach one of this provider's
45
+ * registrations, e.g. `dsh-chatgpt-subscription:line-card`.
46
+ *
47
+ * @param id - One of the four registration ids below.
48
+ * @returns The `<provider>:<id>` spelling, which is the only one the board resolves.
49
+ */
50
+ export declare function widgetFullName(id: string): string;
51
+ /** Data source: shape C for the line named by \`props.line\`. */
52
+ export declare const LINE_CARD_DATA_SOURCE_ID = "line-card";
53
+ /** Capability: refresh one line's quota, then answer shape C. */
54
+ export declare const LINE_REFRESH_CAPABILITY_ID = "line-refresh";
55
+ /** Capability: pin one pooled account of one line, then answer shape C. */
56
+ export declare const LINE_ACCOUNT_SWITCH_CAPABILITY_ID = "line-account-switch";
57
+ /** Capability: change one line's rotation strategy, then answer shape C. */
58
+ export declare const LINE_ACCOUNT_STRATEGY_CAPABILITY_ID = "line-account-strategy";
59
+ /** One quota window of a line, already normalized for the card. */
60
+ export interface LineCardWindow {
61
+ /**
62
+ * Display name, e.g. \`5 小时\`.
63
+ *
64
+ * Filled by the line's normalizer whenever the source states it or the
65
+ * window's nominal length makes it inferable; empty when nobody said, in
66
+ * which case the card falls back to its own wording.
67
+ */
68
+ label: string;
69
+ /** Share of the window consumed, clamped to 0-100. */
70
+ usedPercent: number;
71
+ /** Nominal window length in minutes, when the source stated one. */
72
+ windowMinutes: number | null;
73
+ /** Unix MILLISECONDS the window reopens, when the source stated one. */
74
+ resetsAt: number | null;
75
+ }
76
+ /** Credit balance a line reports beside its windows. */
77
+ export interface LineCardCredits {
78
+ unlimited: boolean;
79
+ /**
80
+ * Balance as the line strings it, unit included when the line has one
81
+ * (\`"10.00"\` for provider credits, \`"12.34 USD"\` for a wallet).
82
+ *
83
+ * A string rather than a number on purpose: the units differ per line and a
84
+ * single numeric field would silently invite arithmetic across them.
85
+ */
86
+ balance: string | null;
87
+ }
88
+ /** Reset credits available to reopen a spent window. */
89
+ export interface LineCardResetCredits {
90
+ available: number;
91
+ /** Unix MILLISECONDS the earliest credit expires, when stated. */
92
+ expiresAt: number | null;
93
+ }
94
+ /**
95
+ * One line's quota.
96
+ *
97
+ * \`null\` on the card means "this line answered nothing usable" — which is a
98
+ * different statement from "this line has no windows", and the reason the whole
99
+ * object is nullable rather than an empty one.
100
+ */
101
+ export interface LineCardQuota {
102
+ windows: LineCardWindow[];
103
+ credits: LineCardCredits | null;
104
+ resetCredits: LineCardResetCredits | null;
105
+ /** Unix MILLISECONDS the snapshot was taken, when the line stated one. */
106
+ fetchedAt: number | null;
107
+ /** Whether THIS line's own refresh is running behind the answer. */
108
+ refreshing: boolean;
109
+ /** Why these numbers are missing or old, when the line said so. */
110
+ error: string | null;
111
+ }
112
+ /** One pooled account of this line, as the card renders it. */
113
+ export interface LineCardAccount {
114
+ id: string;
115
+ /** Alias when one is set, then the email, then the id. Never blank. */
116
+ label: string;
117
+ email: string | null;
118
+ primary: boolean;
119
+ /** Plan label the account's own credential states, when it states one. */
120
+ plan: string | null;
121
+ /** Unix MILLISECONDS a 429 cooldown lifts, when one is running. */
122
+ cooldownUntil: number | null;
123
+ authStatus: AccountAuthStatus | null;
124
+ /**
125
+ * Share of THIS account's own newest snapshot, shortest window.
126
+ *
127
+ * Absent together with \`resetsAt\` when the account was never read — a
128
+ * different statement from "nothing used".
129
+ */
130
+ usedPercent: number | null;
131
+ resetsAt: number | null;
132
+ /**
133
+ * Every window THIS account's own reading stated, shortest first.
134
+ *
135
+ * ABSENT, not empty, on a line with no per-account quota hook: there is
136
+ * nothing per-account to say there, and an empty list would claim "we asked
137
+ * this account and it has no windows". `[]` on a hooked line means exactly
138
+ * that — the read was made and measured nothing — which is why the list is
139
+ * never padded with a 0 % placeholder to look like data.
140
+ *
141
+ * It sits BESIDE `usedPercent` rather than replacing it: that field stays the
142
+ * headline (shortest) window's share, which the card's back face draws as one
143
+ * small bar, while this list is what the account's own detail view opens up.
144
+ */
145
+ windows?: LineCardWindow[];
146
+ }
147
+ /** Shape C: what \`line-card\` and the three line capabilities answer. */
148
+ export interface LineCardData {
149
+ /** Line id this card reads, e.g. \`codex\`. */
150
+ line: string;
151
+ /** Display name of the line, e.g. \`ChatGPT\`. */
152
+ label: string;
153
+ /** Whether the line holds any credential that could serve a request. */
154
+ signedIn: boolean;
155
+ /** Whether this plugin's pool for the line is installed at all. */
156
+ installed: boolean;
157
+ /** Plan the line is metered on (e.g. \`free\`), when stated. */
158
+ planLabel: string | null;
159
+ /** Signed-in account label, when known. */
160
+ accountLabel: string | null;
161
+ /** Accounts in this line's pool; empty when it has none. */
162
+ accounts: LineCardAccount[];
163
+ activeAccountId: string | null;
164
+ strategy: AccountRotationStrategy;
165
+ quota: LineCardQuota | null;
166
+ /**
167
+ * Why this card cannot show its numbers: the line's interface is
168
+ * unreachable, OR the line reached its upstream and reported a failure.
169
+ *
170
+ * Both cases leave the card with nothing to draw, and both need the same
171
+ * thing from the user (a reason), so they share one field instead of one of
172
+ * them being dropped — a \`quota: null\` alone would say "no data" and lose the
173
+ * sentence that explains it.
174
+ */
175
+ error: string | null;
176
+ }
177
+ /**
178
+ * The JSON Schema a capability's return value is validated against.
179
+ *
180
+ * Capability outputs only, like the two older shapes: the DATA SOURCE's answer
181
+ * is validated against the \`data\` schema of the card that reads it, which
182
+ * lives in \`widgets/<id>/widget.json\` and is therefore a second declaration of
183
+ * this shape (kept aligned by a test that compares their key sets literally).
184
+ */
185
+ export declare const LINE_CARD_SCHEMA: Record<string, unknown>;
186
+ /** Arguments of the quota-refresh capability. */
187
+ export declare const LINE_REFRESH_INPUT_SCHEMA: Record<string, unknown>;
188
+ /** Arguments of the account-switch capability. */
189
+ export declare const LINE_ACCOUNT_SWITCH_INPUT_SCHEMA: Record<string, unknown>;
190
+ /** Arguments of the account-strategy capability. */
191
+ export declare const LINE_ACCOUNT_STRATEGY_INPUT_SCHEMA: Record<string, unknown>;
192
+ //# sourceMappingURL=line-contracts.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"line-contracts.d.ts","sourceRoot":"","sources":["../../../../src/host/widget-board/line-contracts.ts"],"names":[],"mappings":"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"}