@icen.ai/ui 0.5.0 → 0.8.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 (138) hide show
  1. package/AGENTS.md +256 -0
  2. package/README.md +47 -13
  3. package/dist/base.css +31 -4
  4. package/dist/behaviors/accordion.d.mts +4 -0
  5. package/dist/behaviors/accordion.mjs +4 -3
  6. package/dist/behaviors/ai-chat.d.mts +57 -0
  7. package/dist/behaviors/ai-chat.mjs +557 -0
  8. package/dist/behaviors/ai-composer.d.mts +112 -0
  9. package/dist/behaviors/ai-composer.mjs +2032 -0
  10. package/dist/behaviors/ai-core.d.mts +151 -0
  11. package/dist/behaviors/ai-core.mjs +491 -0
  12. package/dist/behaviors/ai-diff.d.mts +53 -0
  13. package/dist/behaviors/ai-diff.mjs +282 -0
  14. package/dist/behaviors/ai-panel.d.mts +98 -0
  15. package/dist/behaviors/ai-panel.mjs +1012 -0
  16. package/dist/behaviors/ai-provider.d.mts +198 -0
  17. package/dist/behaviors/ai-provider.mjs +1055 -0
  18. package/dist/behaviors/ai-tool.d.mts +18 -0
  19. package/dist/behaviors/ai-tool.mjs +2125 -0
  20. package/dist/behaviors/ai-tools.d.mts +81 -0
  21. package/dist/behaviors/ai-tools.mjs +1658 -0
  22. package/dist/behaviors/back-top.d.mts +20 -0
  23. package/dist/behaviors/back-top.mjs +49 -32
  24. package/dist/behaviors/carousel.d.mts +4 -0
  25. package/dist/behaviors/carousel.mjs +34 -16
  26. package/dist/behaviors/charts.d.mts +250 -0
  27. package/dist/behaviors/charts.mjs +1301 -448
  28. package/dist/behaviors/command-palette.d.mts +8 -0
  29. package/dist/behaviors/command-palette.mjs +24 -12
  30. package/dist/behaviors/context-menu.d.mts +36 -0
  31. package/dist/behaviors/context-menu.mjs +6 -2
  32. package/dist/behaviors/copy.d.mts +4 -0
  33. package/dist/behaviors/copy.mjs +7 -6
  34. package/dist/behaviors/datatable.d.mts +78 -0
  35. package/dist/behaviors/datatable.mjs +54 -11
  36. package/dist/behaviors/date-picker.d.mts +4 -0
  37. package/dist/behaviors/date-picker.mjs +104 -36
  38. package/dist/behaviors/dropdown.d.mts +4 -0
  39. package/dist/behaviors/dropdown.mjs +7 -3
  40. package/dist/behaviors/input.d.mts +4 -0
  41. package/dist/behaviors/input.mjs +29 -22
  42. package/dist/behaviors/modal.d.mts +11 -0
  43. package/dist/behaviors/modal.mjs +11 -6
  44. package/dist/behaviors/nav.d.mts +7 -0
  45. package/dist/behaviors/nav.mjs +25 -9
  46. package/dist/behaviors/notification.d.mts +172 -0
  47. package/dist/behaviors/notification.mjs +243 -89
  48. package/dist/behaviors/popover.d.mts +46 -0
  49. package/dist/behaviors/popover.mjs +2 -1
  50. package/dist/behaviors/select.d.mts +4 -0
  51. package/dist/behaviors/select.mjs +131 -26
  52. package/dist/behaviors/sidebar.d.mts +4 -0
  53. package/dist/behaviors/sidebar.mjs +4 -3
  54. package/dist/behaviors/slider.d.mts +4 -0
  55. package/dist/behaviors/slider.mjs +4 -3
  56. package/dist/behaviors/split-pane.d.mts +4 -0
  57. package/dist/behaviors/split-pane.mjs +13 -13
  58. package/dist/behaviors/tabs.d.mts +8 -0
  59. package/dist/behaviors/tabs.mjs +44 -19
  60. package/dist/behaviors/tag-input.d.mts +4 -0
  61. package/dist/behaviors/tag-input.mjs +12 -3
  62. package/dist/behaviors/theme.d.mts +25 -0
  63. package/dist/behaviors/theme.mjs +3 -1
  64. package/dist/behaviors/toast.d.mts +26 -0
  65. package/dist/behaviors/toast.mjs +24 -18
  66. package/dist/behaviors/tree.d.mts +4 -0
  67. package/dist/behaviors/tree.mjs +4 -3
  68. package/dist/behaviors/upload.d.mts +4 -0
  69. package/dist/behaviors/upload.mjs +63 -26
  70. package/dist/components/ai-chat.css +1037 -0
  71. package/dist/components/ai-chat.mjs +3 -0
  72. package/dist/components/ai-composer.mjs +3 -0
  73. package/dist/components/ai-context.mjs +2 -0
  74. package/dist/components/ai-diff.css +311 -0
  75. package/dist/components/ai-diff.mjs +3 -0
  76. package/dist/components/ai-files.mjs +3 -0
  77. package/dist/components/ai-message.mjs +3 -0
  78. package/dist/components/ai-panel.css +682 -0
  79. package/dist/components/ai-reasoning.mjs +3 -0
  80. package/dist/components/ai-subagent.mjs +2 -0
  81. package/dist/components/ai-todo.mjs +2 -0
  82. package/dist/components/ai-tool-call.mjs +2 -0
  83. package/dist/components/ai-tool.css +532 -0
  84. package/dist/components/ai-usage.mjs +3 -0
  85. package/dist/components/badge.css +4 -8
  86. package/dist/components/breadcrumb.css +1 -5
  87. package/dist/components/btn.css +4 -7
  88. package/dist/components/card.css +3 -6
  89. package/dist/components/chart-bar.css +10 -0
  90. package/dist/components/chart-calendar.mjs +5 -0
  91. package/dist/components/chart-gauge.css +1 -1
  92. package/dist/components/chart-heatmap.css +40 -0
  93. package/dist/components/chart-scatter.css +24 -0
  94. package/dist/components/chart-scatter.mjs +4 -0
  95. package/dist/components/charts.css +86 -1
  96. package/dist/components/charts.mjs +1 -0
  97. package/dist/components/command-palette.css +2 -2
  98. package/dist/components/content.css +8 -9
  99. package/dist/components/copy.css +8 -8
  100. package/dist/components/datatable.css +4 -8
  101. package/dist/components/date-picker.css +3 -7
  102. package/dist/components/empty.css +0 -4
  103. package/dist/components/feedback.css +10 -17
  104. package/dist/components/form.css +13 -14
  105. package/dist/components/input.css +2 -2
  106. package/dist/components/layout.css +36 -36
  107. package/dist/components/media.css +12 -8
  108. package/dist/components/menu.css +2 -2
  109. package/dist/components/modal.css +1 -1
  110. package/dist/components/nav.css +11 -6
  111. package/dist/components/notification.css +28 -28
  112. package/dist/components/pagination.css +1 -1
  113. package/dist/components/panel.css +16 -16
  114. package/dist/components/pill.css +15 -15
  115. package/dist/components/segmented.css +5 -5
  116. package/dist/components/segmented.mjs +1 -0
  117. package/dist/components/select.css +12 -20
  118. package/dist/components/sidebar.css +1 -1
  119. package/dist/components/split-pane.css +0 -1
  120. package/dist/components/stat.css +14 -18
  121. package/dist/components/steps.css +2 -2
  122. package/dist/components/switch.css +8 -12
  123. package/dist/components/table.css +46 -47
  124. package/dist/components/tabs.css +35 -46
  125. package/dist/components/tag-input.css +4 -4
  126. package/dist/components/toast.css +16 -13
  127. package/dist/components/tooltip.css +2 -2
  128. package/dist/index.d.mts +37 -0
  129. package/dist/index.mjs +7890 -1199
  130. package/dist/registry.json +113 -4
  131. package/dist/retro-effects.css +21 -17
  132. package/dist/tokens/colors.css +4 -1
  133. package/dist/tokens/retro-effects.css +21 -17
  134. package/dist/tokens/style-profiles.css +21 -0
  135. package/dist/tokens.css +25 -1
  136. package/dist/ui.css +3168 -433
  137. package/docs/spec/ai-native.md +659 -0
  138. package/package.json +15 -5
@@ -0,0 +1,198 @@
1
+ import { AiContent, AiUsage, AiContentPart } from './ai-core.js';
2
+
3
+ interface AiProviderModel {
4
+ id: string;
5
+ label: string;
6
+ /** 上下文窗口 token 数(模型选择弹层展示如 1M) */
7
+ context?: number;
8
+ /** 单次输出上限 token 数 */
9
+ outputLimit?: number;
10
+ /** 定价(USD / MTok,2026-10 调研近似值);缺省 = 不猜价(estimateCost 返回 undefined) */
11
+ pricing?: AiPricing;
12
+ }
13
+ /** 定价(USD / MTok):cacheRead 缺省按 input 价;cacheWrite 缺省按 input × 1.25(cache 写溢价惯例) */
14
+ interface AiPricing {
15
+ input: number;
16
+ output: number;
17
+ cacheRead?: number;
18
+ cacheWrite?: number;
19
+ }
20
+ interface AiProviderDef {
21
+ id: string;
22
+ label: string;
23
+ /** 单色 svg 字母章(渲染时经 ai-core svgIcon() 消毒) */
24
+ icon: string;
25
+ /** 默认 API 基址;createAiClient 可覆盖(自定义网关/代理是一等公民) */
26
+ baseURL: string;
27
+ /** /chat/completions | /messages */
28
+ chatPath: string;
29
+ /** 线协议族:openai 族(OpenAI/DeepSeek/GLM/Kimi)| anthropic 族 */
30
+ wire: 'openai' | 'anthropic';
31
+ /** bearer → Authorization: Bearer;x-api-key → x-api-key 头 */
32
+ auth: 'bearer' | 'x-api-key';
33
+ /** 附加请求头(如 anthropic-version / dangerous-direct-browser-access) */
34
+ extraHeaders?: Record<string, string>;
35
+ models: AiProviderModel[];
36
+ /** 浏览器直连 CORS:'yes'(Anthropic 官方支持)/ 'no'(OpenAI 官方禁止)/ 'unknown'(无承诺,建议代理) */
37
+ browserDirect: 'yes' | 'no' | 'unknown';
38
+ }
39
+ /** 注册(或覆盖)一个 provider;第三方/自建网关注册入口。 */
40
+ declare function registerAiProvider(def: AiProviderDef): void;
41
+ /** 取 provider 定义;未注册返回 undefined。 */
42
+ declare function getAiProvider(id: string): AiProviderDef | undefined;
43
+ /** 全部已注册 provider(副本数组,内置在前)。 */
44
+ declare function listAiProviders(): AiProviderDef[];
45
+ /** 按注册表定价估算一次用量的成本(USD):cacheRead 缺省按 input 价、cacheWrite 缺省按 input × 1.25。 */
46
+ declare function estimateCost(usage: AiUsage, provider: string, model: string): number | undefined;
47
+ declare class AiProviderError extends Error {
48
+ readonly provider: string;
49
+ /** HTTP 状态码;网络层失败为 0 */
50
+ readonly status: number;
51
+ /** 归一错误类型:provider 的 error.type/code,或 network / cancelled / parse / http_error */
52
+ readonly type: string;
53
+ /** 原始错误体(HTTP body / 异常对象),排障用 */
54
+ readonly raw?: unknown;
55
+ constructor(init: {
56
+ provider: string;
57
+ status: number;
58
+ type: string;
59
+ message: string;
60
+ raw?: unknown;
61
+ });
62
+ }
63
+ interface AiAuditEntry {
64
+ id: string;
65
+ /** epoch 毫秒 */
66
+ ts: number;
67
+ provider: string;
68
+ model: string;
69
+ baseURL: string;
70
+ /** 是否流式请求 */
71
+ stream: boolean;
72
+ status: 'ok' | 'error';
73
+ durationMs: number;
74
+ /** 首 token 延迟(流式;非流式缺省) */
75
+ ttftMs?: number;
76
+ /** 本次成本(USD,定价表命中时) */
77
+ cost?: number;
78
+ /** 归一 usage(错误且无用量信息时缺省) */
79
+ usage?: AiUsage;
80
+ /** 错误信息(含取消:'请求已取消') */
81
+ error?: string;
82
+ }
83
+ /** 审计聚合汇总(spec §12.2) */
84
+ interface AiAuditTotals {
85
+ usage: AiUsage;
86
+ cost: number;
87
+ requests: number;
88
+ errors: number;
89
+ /** 平均首 token 延迟(有 ttft 记录的条目) */
90
+ avgTtftMs?: number;
91
+ }
92
+ interface AiAuditor {
93
+ log(entry: AiAuditEntry): void;
94
+ /** 全部记录(时间升序,副本) */
95
+ list(): AiAuditEntry[];
96
+ clear(): void;
97
+ /** 全量聚合(各段求和)——直接喂 renderAiUsage / renderAiUsageRing */
98
+ summary(): AiUsage;
99
+ /** 完整汇总:usage + cost + 计数 + 平均 TTFT——喂 renderAiAudit 的 totals 行 */
100
+ totals(): AiAuditTotals;
101
+ /** 按 `${provider}/${model}` 分组聚合 */
102
+ byModel(): Record<string, AiUsage>;
103
+ }
104
+ interface AiAuditorOptions {
105
+ /** localStorage key:给则持久化(写读该 key);SSR/隐私模式下静默降级为内存环形 */
106
+ persist?: string;
107
+ /** 环形上限,默认 100;超出丢弃最旧 */
108
+ max?: number;
109
+ }
110
+ /** 环形审计器:max 条封顶;persist 给 localStorage key 则写读它(SSR 安全)。 */
111
+ declare function createAiAuditor(opts?: AiAuditorOptions): AiAuditor;
112
+ type AiChatRole = 'system' | 'user' | 'assistant' | 'tool';
113
+ interface AiChatMessage {
114
+ role: AiChatRole;
115
+ /** 标准化内容(spec §10):字符串(纯文本)或 AiContentPart[](多模态) */
116
+ content: AiContent;
117
+ /** role 'tool' 时必填:openai 族 → tool_call_id;anthropic 族 → 映射为 user 的 tool_result block(真回灌) */
118
+ toolCallId?: string;
119
+ /** anthropic 族:本消息末块打 cache_control 断点(prompt 缓存一等公民);openai 族自动缓存、忽略 */
120
+ cacheControl?: boolean;
121
+ }
122
+ interface AiChatRequest {
123
+ messages: AiChatMessage[];
124
+ /** 覆盖客户端默认模型 */
125
+ model?: string;
126
+ temperature?: number;
127
+ /** anthropic 族必填(API 层),缺省 4096 */
128
+ maxTokens?: number;
129
+ /** 外部中止信号(与 stream 会话的 cancel() 叠加生效) */
130
+ signal?: AbortSignal;
131
+ }
132
+ interface AiChatResult {
133
+ text: string;
134
+ /** ai-core normalizeUsage 归一;无任何用量信息时为 {} */
135
+ usage: AiUsage;
136
+ /** 定价表命中时的本次成本(USD) */
137
+ cost?: number;
138
+ /** 响应内容部件(非流式且响应为 content parts 数组时归一出,含图/文件等多模态回执) */
139
+ parts?: AiContentPart[];
140
+ finishReason?: string;
141
+ /** 原始 usage 对象(流式=最终快照;排障用) */
142
+ raw?: unknown;
143
+ }
144
+ type AiStreamChunk = {
145
+ type: 'text';
146
+ delta: string;
147
+ } | {
148
+ type: 'done';
149
+ } | {
150
+ type: 'error';
151
+ message: string;
152
+ };
153
+ interface AiStreamSession extends AsyncIterable<AiStreamChunk> {
154
+ /** 中止本次流式请求(幂等);done 会以已累积的部分结果结算 */
155
+ cancel(): void;
156
+ /** 流式完成后结算:始终 resolve(含错误/取消,text/usage 为已累积部分) */
157
+ done: Promise<AiChatResult>;
158
+ }
159
+ interface AiClientConfig {
160
+ readonly provider: string;
161
+ readonly baseURL: string;
162
+ readonly model: string;
163
+ }
164
+ interface AiClientOptions {
165
+ /** 注册表 id(listAiProviders/getAiProvider 可查);未注册抛错 */
166
+ provider: string;
167
+ apiKey: string;
168
+ /** 覆盖 provider 默认基址(自定义网关/代理) */
169
+ baseURL?: string;
170
+ /** 缺省取 provider.models[0].id */
171
+ model?: string;
172
+ /** 每次请求产出审计记录(回调形式) */
173
+ onAudit?: (entry: AiAuditEntry) => void;
174
+ /** 传 auditor 实例则每次请求自动 log */
175
+ auditor?: AiAuditor;
176
+ /** mock fetch 注入(AI SDK 同款)——单测与文档站离线 demo 用 */
177
+ fetch?: typeof fetch;
178
+ }
179
+ interface AiClient {
180
+ chat(req: AiChatRequest): Promise<AiChatResult>;
181
+ stream(req: AiChatRequest): AiStreamSession;
182
+ readonly config: AiClientConfig;
183
+ }
184
+ /** icen:ai-done 的 detail(spec §5;绑定层 bindComposer 的驱动事件) */
185
+ interface AiDoneEventDetail {
186
+ status: 'ok' | 'error' | 'cancelled';
187
+ provider: string;
188
+ model: string;
189
+ stream: boolean;
190
+ usage?: AiUsage;
191
+ cost?: number;
192
+ error?: string;
193
+ durationMs: number;
194
+ ttftMs?: number;
195
+ }
196
+ declare function createAiClient(options: AiClientOptions): AiClient;
197
+
198
+ export { type AiAuditEntry, type AiAuditTotals, type AiAuditor, type AiAuditorOptions, type AiChatMessage, type AiChatRequest, type AiChatResult, type AiChatRole, type AiClient, type AiClientConfig, type AiClientOptions, type AiDoneEventDetail, type AiPricing, type AiProviderDef, AiProviderError, type AiProviderModel, type AiStreamChunk, type AiStreamSession, createAiAuditor, createAiClient, estimateCost, getAiProvider, listAiProviders, registerAiProvider };