@ouraihub/aether-ui 0.0.0-stage → 0.1.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 (179) hide show
  1. package/LICENSE +789 -0
  2. package/fixtures/model-classify.json +42 -0
  3. package/fixtures/pricing-cost.json +56 -0
  4. package/fixtures/reasoning-infer.json +44 -0
  5. package/fixtures/sse/anthropic-messages/chinese.sse +24 -0
  6. package/fixtures/sse/anthropic-messages/multi-tool.sse +33 -0
  7. package/fixtures/sse/anthropic-messages/single-tool.sse +39 -0
  8. package/fixtures/sse/anthropic-messages/text.sse +27 -0
  9. package/fixtures/sse/anthropic-messages/truncated.sse +21 -0
  10. package/fixtures/sse/anthropic-messages/upstream-error.sse +12 -0
  11. package/fixtures/sse/expect.json +20 -0
  12. package/fixtures/sse/openai-chat/chinese.sse +14 -0
  13. package/fixtures/sse/openai-chat/multi-tool.sse +18 -0
  14. package/fixtures/sse/openai-chat/single-tool.sse +22 -0
  15. package/fixtures/sse/openai-chat/text.sse +14 -0
  16. package/fixtures/sse/openai-chat/truncated.sse +12 -0
  17. package/fixtures/sse/openai-chat/upstream-error.sse +6 -0
  18. package/fixtures/sse/openai-responses/chinese.sse +33 -0
  19. package/fixtures/sse/openai-responses/multi-tool.sse +36 -0
  20. package/fixtures/sse/openai-responses/single-tool.sse +27 -0
  21. package/fixtures/sse/openai-responses/text.sse +33 -0
  22. package/fixtures/sse/openai-responses/truncated.sse +30 -0
  23. package/fixtures/sse/openai-responses/upstream-error.sse +9 -0
  24. package/package.json +71 -3
  25. package/src/CopyInput.svelte +33 -0
  26. package/src/KitNotifier.svelte +33 -0
  27. package/src/chat/ApprovalCard.svelte +23 -0
  28. package/src/chat/ChatPanel.svelte +2097 -0
  29. package/src/chat/MessageItem.svelte +583 -0
  30. package/src/chat/SkillPicker.svelte +126 -0
  31. package/src/chat/ToolCallItem.svelte +23 -0
  32. package/src/chat/UsageDetails.svelte +138 -0
  33. package/src/chat/index.ts +2 -0
  34. package/src/chat/run-session.svelte.ts +556 -0
  35. package/src/components/ui/alert/alert-action.svelte +20 -0
  36. package/src/components/ui/alert/alert-description.svelte +23 -0
  37. package/src/components/ui/alert/alert-title.svelte +23 -0
  38. package/src/components/ui/alert/alert.svelte +43 -0
  39. package/src/components/ui/alert/index.ts +17 -0
  40. package/src/components/ui/alert-dialog/alert-dialog-action.svelte +27 -0
  41. package/src/components/ui/alert-dialog/alert-dialog-cancel.svelte +27 -0
  42. package/src/components/ui/alert-dialog/alert-dialog-content.svelte +32 -0
  43. package/src/components/ui/alert-dialog/alert-dialog-description.svelte +17 -0
  44. package/src/components/ui/alert-dialog/alert-dialog-footer.svelte +23 -0
  45. package/src/components/ui/alert-dialog/alert-dialog-header.svelte +20 -0
  46. package/src/components/ui/alert-dialog/alert-dialog-media.svelte +20 -0
  47. package/src/components/ui/alert-dialog/alert-dialog-overlay.svelte +17 -0
  48. package/src/components/ui/alert-dialog/alert-dialog-portal.svelte +7 -0
  49. package/src/components/ui/alert-dialog/alert-dialog-title.svelte +17 -0
  50. package/src/components/ui/alert-dialog/alert-dialog-trigger.svelte +7 -0
  51. package/src/components/ui/alert-dialog/alert-dialog.svelte +7 -0
  52. package/src/components/ui/alert-dialog/index.ts +40 -0
  53. package/src/components/ui/button/button.svelte +81 -0
  54. package/src/components/ui/button/index.ts +17 -0
  55. package/src/components/ui/dialog/dialog-close.svelte +11 -0
  56. package/src/components/ui/dialog/dialog-content.svelte +48 -0
  57. package/src/components/ui/dialog/dialog-description.svelte +17 -0
  58. package/src/components/ui/dialog/dialog-footer.svelte +32 -0
  59. package/src/components/ui/dialog/dialog-header.svelte +20 -0
  60. package/src/components/ui/dialog/dialog-overlay.svelte +17 -0
  61. package/src/components/ui/dialog/dialog-portal.svelte +7 -0
  62. package/src/components/ui/dialog/dialog-title.svelte +17 -0
  63. package/src/components/ui/dialog/dialog-trigger.svelte +11 -0
  64. package/src/components/ui/dialog/dialog.svelte +7 -0
  65. package/src/components/ui/dialog/index.ts +34 -0
  66. package/src/components/ui/dropdown-menu/dropdown-menu-checkbox-group.svelte +16 -0
  67. package/src/components/ui/dropdown-menu/dropdown-menu-checkbox-item.svelte +46 -0
  68. package/src/components/ui/dropdown-menu/dropdown-menu-content.svelte +31 -0
  69. package/src/components/ui/dropdown-menu/dropdown-menu-group-heading.svelte +22 -0
  70. package/src/components/ui/dropdown-menu/dropdown-menu-group.svelte +7 -0
  71. package/src/components/ui/dropdown-menu/dropdown-menu-item.svelte +27 -0
  72. package/src/components/ui/dropdown-menu/dropdown-menu-label.svelte +24 -0
  73. package/src/components/ui/dropdown-menu/dropdown-menu-portal.svelte +7 -0
  74. package/src/components/ui/dropdown-menu/dropdown-menu-radio-group.svelte +17 -0
  75. package/src/components/ui/dropdown-menu/dropdown-menu-radio-item.svelte +36 -0
  76. package/src/components/ui/dropdown-menu/dropdown-menu-separator.svelte +17 -0
  77. package/src/components/ui/dropdown-menu/dropdown-menu-shortcut.svelte +20 -0
  78. package/src/components/ui/dropdown-menu/dropdown-menu-sub-content.svelte +31 -0
  79. package/src/components/ui/dropdown-menu/dropdown-menu-sub-trigger.svelte +29 -0
  80. package/src/components/ui/dropdown-menu/dropdown-menu-sub.svelte +7 -0
  81. package/src/components/ui/dropdown-menu/dropdown-menu-trigger.svelte +7 -0
  82. package/src/components/ui/dropdown-menu/dropdown-menu.svelte +7 -0
  83. package/src/components/ui/dropdown-menu/index.ts +54 -0
  84. package/src/components/ui/empty/empty-content.svelte +23 -0
  85. package/src/components/ui/empty/empty-description.svelte +23 -0
  86. package/src/components/ui/empty/empty-header.svelte +20 -0
  87. package/src/components/ui/empty/empty-media.svelte +41 -0
  88. package/src/components/ui/empty/empty-title.svelte +20 -0
  89. package/src/components/ui/empty/empty.svelte +23 -0
  90. package/src/components/ui/empty/index.ts +22 -0
  91. package/src/components/ui/field/field-content.svelte +20 -0
  92. package/src/components/ui/field/field-description.svelte +25 -0
  93. package/src/components/ui/field/field-error.svelte +58 -0
  94. package/src/components/ui/field/field-group.svelte +23 -0
  95. package/src/components/ui/field/field-label.svelte +25 -0
  96. package/src/components/ui/field/field-legend.svelte +24 -0
  97. package/src/components/ui/field/field-separator.svelte +35 -0
  98. package/src/components/ui/field/field-set.svelte +20 -0
  99. package/src/components/ui/field/field-title.svelte +20 -0
  100. package/src/components/ui/field/field.svelte +47 -0
  101. package/src/components/ui/field/index.ts +33 -0
  102. package/src/components/ui/input/index.ts +7 -0
  103. package/src/components/ui/input/input.svelte +48 -0
  104. package/src/components/ui/label/index.ts +7 -0
  105. package/src/components/ui/label/label.svelte +20 -0
  106. package/src/components/ui/select/index.ts +40 -0
  107. package/src/components/ui/select/select-content.svelte +45 -0
  108. package/src/components/ui/select/select-group-heading.svelte +21 -0
  109. package/src/components/ui/select/select-group.svelte +17 -0
  110. package/src/components/ui/select/select-item.svelte +43 -0
  111. package/src/components/ui/select/select-label.svelte +20 -0
  112. package/src/components/ui/select/select-portal.svelte +7 -0
  113. package/src/components/ui/select/select-scroll-down-button.svelte +20 -0
  114. package/src/components/ui/select/select-scroll-up-button.svelte +20 -0
  115. package/src/components/ui/select/select-separator.svelte +18 -0
  116. package/src/components/ui/select/select-trigger.svelte +29 -0
  117. package/src/components/ui/select/select-value.svelte +7 -0
  118. package/src/components/ui/select/select.svelte +11 -0
  119. package/src/components/ui/separator/index.ts +7 -0
  120. package/src/components/ui/separator/separator.svelte +21 -0
  121. package/src/components/ui/sonner/index.ts +1 -0
  122. package/src/components/ui/sonner/sonner.svelte +40 -0
  123. package/src/components/ui/switch/index.ts +7 -0
  124. package/src/components/ui/switch/switch.svelte +34 -0
  125. package/src/components/ui/textarea/index.ts +7 -0
  126. package/src/components/ui/textarea/textarea.svelte +22 -0
  127. package/src/context.ts +34 -0
  128. package/src/dev/Demo.svelte +45 -0
  129. package/src/dev/main.ts +7 -0
  130. package/src/i18n/en.ts +617 -0
  131. package/src/i18n/index.ts +23 -0
  132. package/src/i18n/zh-CN.ts +599 -0
  133. package/src/index.ts +10 -0
  134. package/src/logs/LogPanel.svelte +97 -0
  135. package/src/logs/LogSettings.svelte +56 -0
  136. package/src/logs/index.ts +5 -0
  137. package/src/logs/logger.ts +96 -0
  138. package/src/markdown.ts +8 -0
  139. package/src/mcp/McpClientSettings.svelte +491 -0
  140. package/src/mcp/McpServerSettings.svelte +327 -0
  141. package/src/mcp/config.ts +26 -0
  142. package/src/mcp/index.ts +3 -0
  143. package/src/mcp/input.ts +73 -0
  144. package/src/notify.svelte.ts +43 -0
  145. package/src/ports/contract.ts +165 -0
  146. package/src/ports/fake.ts +484 -0
  147. package/src/ports/index.ts +7 -0
  148. package/src/ports/search.ts +47 -0
  149. package/src/ports/skill-sources.ts +45 -0
  150. package/src/providers/EndpointKeysDialog.svelte +343 -0
  151. package/src/providers/EndpointPanel.svelte +491 -0
  152. package/src/providers/ModelPickerDialog.svelte +187 -0
  153. package/src/providers/ModelSelect.svelte +434 -0
  154. package/src/providers/ModelSettingsDialog.svelte +453 -0
  155. package/src/providers/ProvidersSettings.svelte +631 -0
  156. package/src/providers/RequestConfigDialog.svelte +250 -0
  157. package/src/providers/SecretInput.svelte +276 -0
  158. package/src/providers/draft.ts +329 -0
  159. package/src/providers/edit-session.ts +146 -0
  160. package/src/providers/index.ts +5 -0
  161. package/src/providers/reasoning.ts +41 -0
  162. package/src/providers/revision.svelte.ts +4 -0
  163. package/src/search/SearchSettings.svelte +703 -0
  164. package/src/search/index.ts +13 -0
  165. package/src/search/settings-flow.ts +62 -0
  166. package/src/session.ts +20 -0
  167. package/src/skills/SkillAdd.svelte +347 -0
  168. package/src/skills/SkillAuthoring.svelte +381 -0
  169. package/src/skills/SkillEditor.svelte +94 -0
  170. package/src/skills/SkillPreviewDialog.svelte +122 -0
  171. package/src/skills/SkillsSettings.svelte +140 -0
  172. package/src/skills/error.ts +32 -0
  173. package/src/skills/index.ts +4 -0
  174. package/src/styles/kit.css +137 -0
  175. package/src/styles/tokens.css +22 -0
  176. package/src/tauri/index.ts +282 -0
  177. package/src/utils.ts +22 -0
  178. package/src/web/index.ts +376 -0
  179. package/README.md +0 -3
@@ -0,0 +1,23 @@
1
+ <script lang="ts">
2
+ // One tool call collapsed to a line (docs/16 §4.2): calling, then its outcome and summary.
3
+ import { getKitContext } from '../context'
4
+ import type { ToolItem } from './run-session.svelte'
5
+
6
+ let { tool }: { tool: ToolItem } = $props()
7
+ const { t } = getKitContext().i18n
8
+ const name = $derived(tool.server ? `${tool.name} · ${tool.server}` : tool.name)
9
+ </script>
10
+
11
+ <p class="text-muted-foreground truncate text-kit-sm">
12
+ {#if tool.outcome === null}
13
+ {t('chat.tool.calling', { name })}
14
+ {:else if tool.outcome === 'denied'}
15
+ {t('chat.tool.denied', { name })}
16
+ {:else if tool.outcome === 'unknown'}
17
+ {t('chat.tool.unknown', { name })}
18
+ {:else if tool.outcome === 'error'}
19
+ {t('chat.tool.error', { name, summary: tool.summary })}
20
+ {:else}
21
+ {t('chat.tool.ok', { name, summary: tool.summary })}
22
+ {/if}
23
+ </p>
@@ -0,0 +1,138 @@
1
+ <script lang="ts">
2
+ import type { ContextUsage, Cost, TokenUsage } from '../ports'
3
+ import { getKitContext } from '../context'
4
+ import ChartNoAxesColumnIcon from '@lucide/svelte/icons/chart-no-axes-column'
5
+ let details = $state<HTMLDetailsElement | null>(null)
6
+ interface Props {
7
+ context: ContextUsage | null
8
+ usage: TokenUsage | null
9
+ total: TokenUsage
10
+ /** Last turn's cost; null when its model has no pricing or a round lacked token counts. */
11
+ cost: Cost | null
12
+ /** Session total per currency. */
13
+ totalCost: Cost[]
14
+ }
15
+ let { context, usage, total, cost, totalCost }: Props = $props()
16
+ const { t } = getKitContext().i18n
17
+ const percent = $derived(
18
+ context?.tokens != null && context.contextWindow != null && context.contextWindow > 0
19
+ ? Math.min(100, Math.max(0, (context.tokens / context.contextWindow) * 100))
20
+ : null,
21
+ )
22
+ const fields = ['inputTokens', 'outputTokens', 'cacheReadTokens', 'cacheWriteTokens', 'reasoningTokens'] as const
23
+ const money = ({ amount, currency }: Cost) => `${currency === 'CNY' ? '¥' : '$'}${amount.toFixed(4)}`
24
+ </script>
25
+
26
+ <!-- svelte-ignore a11y_no_noninteractive_element_interactions (Esc closes this disclosure first) -->
27
+ <details
28
+ class="usage-details"
29
+ bind:this={details}
30
+ aria-label={t('chat.usage')}
31
+ onkeydown={(e) => {
32
+ if (e.key === 'Escape' && details?.open) {
33
+ details.open = false
34
+ e.preventDefault()
35
+ e.stopPropagation()
36
+ }
37
+ }}
38
+ >
39
+ <summary aria-label={t('chat.usage')} title={t('chat.contextUsage')}>
40
+ <ChartNoAxesColumnIcon aria-hidden="true" />
41
+ <span>{percent === null ? t('chat.unknown') : `${percent.toFixed(1)}%`}</span>
42
+ </summary>
43
+ <div class="usage-content">
44
+ <p>
45
+ {t('chat.contextUsage')}: {context?.tokens ?? t('chat.unknown')}{#if context?.contextWindow != null}
46
+ / {context.contextWindow}{/if} · {t(
47
+ context?.source === 'reported'
48
+ ? 'chat.reported'
49
+ : context?.source === 'estimated'
50
+ ? 'chat.estimated'
51
+ : 'chat.unknown',
52
+ )}
53
+ </p>
54
+ {#if percent !== null}<meter min="0" max="100" value={percent} aria-label={t('chat.contextUsage')}></meter>{/if}
55
+ <table>
56
+ <thead
57
+ ><tr
58
+ ><th scope="col">{t('chat.usage')}</th><th scope="col">{t('chat.currentUsage')}</th><th scope="col"
59
+ >{t('chat.totalUsage')}</th
60
+ ></tr
61
+ ></thead
62
+ >
63
+ <tbody
64
+ >{#each fields as field (field)}<tr
65
+ ><th scope="row">{t(`chat.usage.${field}`)}</th><td>{usage?.[field] ?? t('chat.unknown')}</td><td
66
+ >{total[field] ?? t('chat.unknown')}</td
67
+ ></tr
68
+ >{/each}<tr
69
+ ><th scope="row">{t('chat.cost')}</th><td>{cost ? money(cost) : t('chat.unknown')}</td><td
70
+ >{totalCost.length ? totalCost.map(money).join(' + ') : t('chat.unknown')}</td
71
+ ></tr
72
+ ></tbody
73
+ >
74
+ </table>
75
+ <p>{t('chat.usageHint')}</p>
76
+ </div>
77
+ </details>
78
+
79
+ <style>
80
+ .usage-details {
81
+ position: relative;
82
+ min-width: 0;
83
+ color: var(--color-muted-foreground);
84
+ font-size: var(--kit-font-size-sm, 0.8125rem);
85
+ }
86
+ summary {
87
+ display: flex;
88
+ align-items: center;
89
+ gap: 0.25rem;
90
+ cursor: pointer;
91
+ padding: 0.25rem;
92
+ border-radius: var(--kit-radius, var(--radius));
93
+ }
94
+ summary::-webkit-details-marker {
95
+ display: none;
96
+ }
97
+ summary:focus-visible {
98
+ outline: 2px solid var(--color-ring);
99
+ }
100
+ summary :global(svg) {
101
+ width: 1rem;
102
+ height: 1rem;
103
+ flex-shrink: 0;
104
+ }
105
+ .usage-content {
106
+ position: absolute;
107
+ bottom: calc(100% + 0.5rem);
108
+ right: 0;
109
+ width: min(20rem, calc(100cqw - 5rem));
110
+ max-height: 45cqh;
111
+ overflow: auto;
112
+ display: flex;
113
+ flex-direction: column;
114
+ gap: 0.5rem;
115
+ padding: 0.75rem;
116
+ border: 1px solid var(--color-border);
117
+ border-radius: var(--kit-radius, var(--radius));
118
+ background: var(--color-popover);
119
+ color: var(--color-popover-foreground);
120
+ }
121
+ p {
122
+ margin: 0;
123
+ overflow-wrap: anywhere;
124
+ }
125
+ table {
126
+ width: 100%;
127
+ border-collapse: collapse;
128
+ }
129
+ th,
130
+ td {
131
+ padding: 0.25rem;
132
+ text-align: left;
133
+ overflow-wrap: anywhere;
134
+ }
135
+ meter {
136
+ width: 100%;
137
+ }
138
+ </style>
@@ -0,0 +1,2 @@
1
+ // ChatPanel (docs/16 §4.2); it renders ToolCallItem, ApprovalCard and SkillPicker itself.
2
+ export { default as ChatPanel } from './ChatPanel.svelte'