@tokentop/ttop 0.2.2 → 0.3.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 (158) hide show
  1. package/README.md +2 -5
  2. package/package.json +8 -5
  3. package/src/agents/aggregator.ts +39 -19
  4. package/src/agents/costing.ts +11 -9
  5. package/src/agents/index.ts +7 -9
  6. package/src/agents/types.ts +2 -2
  7. package/src/cli.ts +28 -23
  8. package/src/config/schema.test.ts +42 -40
  9. package/src/config/schema.ts +26 -26
  10. package/src/demo/simulator.ts +161 -122
  11. package/src/plugins/agents/index.ts +2 -2
  12. package/src/plugins/auth-sources.ts +42 -38
  13. package/src/plugins/lifecycle.ts +32 -32
  14. package/src/plugins/loader.test.ts +49 -49
  15. package/src/plugins/loader.ts +67 -63
  16. package/src/plugins/notification-bus.ts +21 -16
  17. package/src/plugins/notifications/index.ts +2 -2
  18. package/src/plugins/notifications/terminal-bell.ts +29 -23
  19. package/src/plugins/notifications/visual-flash.ts +21 -19
  20. package/src/plugins/npm-installer.ts +23 -25
  21. package/src/plugins/plugin-context-factory.ts +10 -10
  22. package/src/plugins/plugin-host.ts +12 -5
  23. package/src/plugins/providers/anthropic.ts +64 -57
  24. package/src/plugins/providers/antigravity.ts +81 -69
  25. package/src/plugins/providers/codex.ts +42 -42
  26. package/src/plugins/providers/gemini.ts +106 -87
  27. package/src/plugins/providers/github-copilot.ts +49 -45
  28. package/src/plugins/providers/index.ts +10 -12
  29. package/src/plugins/providers/minimax.ts +50 -44
  30. package/src/plugins/providers/openai-api.ts +82 -62
  31. package/src/plugins/providers/opencode-zen.ts +46 -39
  32. package/src/plugins/providers/perplexity.ts +55 -46
  33. package/src/plugins/providers/zai.ts +66 -57
  34. package/src/plugins/registry.ts +47 -43
  35. package/src/plugins/sandbox-guard.test.ts +45 -48
  36. package/src/plugins/sandbox-guard.ts +20 -25
  37. package/src/plugins/sandbox.ts +26 -48
  38. package/src/plugins/themes/catppuccin-latte.ts +29 -29
  39. package/src/plugins/themes/catppuccin-mocha.ts +29 -29
  40. package/src/plugins/themes/claude-code.ts +29 -29
  41. package/src/plugins/themes/dracula.ts +29 -29
  42. package/src/plugins/themes/github-light.ts +29 -29
  43. package/src/plugins/themes/gruvbox-dark.ts +29 -29
  44. package/src/plugins/themes/gruvbox-light.ts +29 -29
  45. package/src/plugins/themes/index.ts +15 -15
  46. package/src/plugins/themes/kanagawa.ts +29 -29
  47. package/src/plugins/themes/nord.ts +29 -29
  48. package/src/plugins/themes/one-dark.ts +29 -29
  49. package/src/plugins/themes/opencode.ts +31 -31
  50. package/src/plugins/themes/rose-pine-dawn.ts +29 -29
  51. package/src/plugins/themes/rose-pine.ts +29 -29
  52. package/src/plugins/themes/solarized-light.ts +29 -29
  53. package/src/plugins/themes/tokyo-night.ts +29 -29
  54. package/src/plugins/types/agent.ts +5 -5
  55. package/src/plugins/types/base.ts +35 -24
  56. package/src/plugins/types/index.ts +9 -9
  57. package/src/plugins/types/notification.ts +12 -12
  58. package/src/plugins/types/provider.ts +12 -8
  59. package/src/plugins/types/theme.ts +31 -23
  60. package/src/plugins/update-checker.ts +6 -6
  61. package/src/pricing/estimator.test.ts +39 -44
  62. package/src/pricing/estimator.ts +7 -13
  63. package/src/pricing/fallback.test.ts +30 -34
  64. package/src/pricing/fallback.ts +54 -27
  65. package/src/pricing/index.ts +18 -12
  66. package/src/pricing/models-dev.ts +6 -6
  67. package/src/storage/database.ts +56 -46
  68. package/src/storage/db.ts +12 -12
  69. package/src/storage/index.ts +44 -45
  70. package/src/storage/migrations/index.ts +2 -2
  71. package/src/storage/paths.ts +13 -13
  72. package/src/storage/repos/agentSessions.ts +33 -23
  73. package/src/storage/repos/providerSnapshots.ts +5 -5
  74. package/src/storage/repos/usageEvents.ts +40 -28
  75. package/src/storage/types.ts +5 -5
  76. package/src/tui/App.tsx +180 -137
  77. package/src/tui/components/CommandPalette.tsx +46 -34
  78. package/src/tui/components/DebugConsole.tsx +39 -33
  79. package/src/tui/components/DebugPanel.tsx +295 -177
  80. package/src/tui/components/FooterHints.tsx +2 -2
  81. package/src/tui/components/GhostProviderCard.tsx +37 -35
  82. package/src/tui/components/Header.tsx +68 -35
  83. package/src/tui/components/HelpOverlay.tsx +99 -29
  84. package/src/tui/components/InlineGauge.tsx +10 -7
  85. package/src/tui/components/InlineSparkline.tsx +17 -11
  86. package/src/tui/components/KpiStrip.tsx +128 -98
  87. package/src/tui/components/LimitGauge.tsx +96 -59
  88. package/src/tui/components/ModalBackdrop.tsx +4 -4
  89. package/src/tui/components/ProviderAggregateStrip.tsx +69 -38
  90. package/src/tui/components/ProviderCard.tsx +232 -226
  91. package/src/tui/components/ProviderDetailPanel.tsx +133 -58
  92. package/src/tui/components/ProviderLimitsPanel.tsx +126 -89
  93. package/src/tui/components/ProvidersList.tsx +215 -126
  94. package/src/tui/components/SessionDetailsDrawer.tsx +191 -94
  95. package/src/tui/components/SessionsTable.tsx +313 -166
  96. package/src/tui/components/SettingsModal.tsx +231 -214
  97. package/src/tui/components/SidebarBreakdown.tsx +30 -16
  98. package/src/tui/components/Skeleton.tsx +24 -17
  99. package/src/tui/components/SmartSidebar.tsx +360 -258
  100. package/src/tui/components/Sparkline.tsx +64 -52
  101. package/src/tui/components/Spinner.tsx +3 -3
  102. package/src/tui/components/StatusBar.tsx +27 -27
  103. package/src/tui/components/ThemePicker.tsx +67 -66
  104. package/src/tui/components/Toast.tsx +9 -6
  105. package/src/tui/components/UsageGauge.tsx +10 -13
  106. package/src/tui/components/index.ts +5 -5
  107. package/src/tui/contexts/AgentSessionContext.tsx +193 -144
  108. package/src/tui/contexts/ConfigContext.tsx +15 -13
  109. package/src/tui/contexts/DashboardRuntimeContext.tsx +26 -26
  110. package/src/tui/contexts/DemoModeContext.tsx +22 -15
  111. package/src/tui/contexts/DrawerContext.tsx +11 -9
  112. package/src/tui/contexts/InputContext.tsx +2 -2
  113. package/src/tui/contexts/LogContext.tsx +62 -47
  114. package/src/tui/contexts/PluginContext.tsx +232 -183
  115. package/src/tui/contexts/RealTimeActivityContext.tsx +70 -36
  116. package/src/tui/contexts/StorageContext.tsx +151 -117
  117. package/src/tui/contexts/ThemeContext.tsx +21 -16
  118. package/src/tui/contexts/TimeWindowContext.tsx +72 -61
  119. package/src/tui/contexts/ToastContext.tsx +10 -7
  120. package/src/tui/contexts/index.ts +9 -5
  121. package/src/tui/createApp.tsx +8 -12
  122. package/src/tui/debug/captureFrame.ts +25 -28
  123. package/src/tui/debug/snapshot.tsx +179 -162
  124. package/src/tui/driver/assertions.ts +30 -22
  125. package/src/tui/driver/cli.ts +231 -221
  126. package/src/tui/driver/coverage.ts +27 -44
  127. package/src/tui/driver/demo-snapshot.ts +33 -33
  128. package/src/tui/driver/diff.ts +26 -32
  129. package/src/tui/driver/driver.ts +43 -48
  130. package/src/tui/driver/index.ts +36 -40
  131. package/src/tui/driver/recorder.ts +37 -48
  132. package/src/tui/driver/test-workflow.ts +51 -51
  133. package/src/tui/driver/test.ts +25 -25
  134. package/src/tui/hooks/index.ts +24 -20
  135. package/src/tui/hooks/useAnimatedValue.ts +13 -18
  136. package/src/tui/hooks/useDashboardKeyboard.ts +118 -98
  137. package/src/tui/hooks/useDashboardState.ts +26 -24
  138. package/src/tui/hooks/useEmaActivity.ts +82 -74
  139. package/src/tui/hooks/useEntranceAnimation.ts +11 -11
  140. package/src/tui/hooks/useExitAnimation.ts +3 -3
  141. package/src/tui/hooks/usePulse.ts +4 -4
  142. package/src/tui/hooks/useSafeRenderer.ts +5 -5
  143. package/src/tui/hooks/useSessionEnrichedProviders.ts +150 -0
  144. package/src/tui/hooks/useValueFlash.ts +10 -14
  145. package/src/tui/index.tsx +29 -6
  146. package/src/tui/shutdown.ts +19 -0
  147. package/src/tui/utils/providerColor.ts +1 -1
  148. package/src/tui/views/Dashboard.tsx +127 -102
  149. package/src/tui/views/HistoricalTrendsView.tsx +579 -250
  150. package/src/tui/views/ProjectsView.tsx +466 -237
  151. package/src/tui/views/RealTimeDashboard.tsx +150 -111
  152. package/src/tui/views/SettingsView.tsx +222 -191
  153. package/src/tui/views/index.ts +2 -2
  154. package/src/types/opentui-test-utils.d.ts +7 -7
  155. package/src/utils/clipboard.ts +29 -29
  156. package/src/utils/currency.test.ts +53 -53
  157. package/src/utils/currency.ts +35 -32
  158. package/src/version.ts +1 -1
@@ -1,47 +1,47 @@
1
- import type { ThemePlugin } from '../types/theme.ts';
1
+ import type { ThemePlugin } from "../types/theme.ts";
2
2
 
3
3
  export const opencodeTheme: ThemePlugin = {
4
4
  apiVersion: 2,
5
- id: 'opencode',
6
- type: 'theme',
7
- name: 'OpenCode',
8
- family: 'opencode',
9
- version: '1.0.0',
5
+ id: "opencode",
6
+ type: "theme",
7
+ name: "OpenCode",
8
+ family: "opencode",
9
+ version: "1.0.0",
10
10
  permissions: {},
11
11
 
12
- colorScheme: 'dark',
12
+ colorScheme: "dark",
13
13
 
14
14
  colors: {
15
- background: '#111116',
16
- foreground: '#1a1b22',
17
- text: '#d4d4d8',
18
- textMuted: '#636670',
19
- textSubtle: '#3e4048',
20
- primary: '#56b6c2',
21
- secondary: '#5c9cf5',
22
- accent: '#e5c07b',
23
- success: '#7fd88f',
24
- warning: '#f5a742',
25
- error: '#e06c75',
26
- info: '#56b6c2',
27
- border: '#2e303a',
28
- borderMuted: '#222230',
29
- selection: '#252530',
30
- highlight: '#1a1b22',
31
- gaugeBackground: '#1a1b22',
32
- gaugeFill: '#56b6c2',
33
- gaugeWarning: '#f5a742',
34
- gaugeDanger: '#e06c75',
15
+ background: "#111116",
16
+ foreground: "#1a1b22",
17
+ text: "#d4d4d8",
18
+ textMuted: "#636670",
19
+ textSubtle: "#3e4048",
20
+ primary: "#56b6c2",
21
+ secondary: "#5c9cf5",
22
+ accent: "#e5c07b",
23
+ success: "#7fd88f",
24
+ warning: "#f5a742",
25
+ error: "#e06c75",
26
+ info: "#56b6c2",
27
+ border: "#2e303a",
28
+ borderMuted: "#222230",
29
+ selection: "#252530",
30
+ highlight: "#1a1b22",
31
+ gaugeBackground: "#1a1b22",
32
+ gaugeFill: "#56b6c2",
33
+ gaugeWarning: "#f5a742",
34
+ gaugeDanger: "#e06c75",
35
35
  },
36
36
 
37
37
  components: {
38
38
  header: {
39
- background: '#0a0a0e',
40
- titleColor: '#636670',
41
- titleAccentColor: '#e0e0e0',
39
+ background: "#0a0a0e",
40
+ titleColor: "#636670",
41
+ titleAccentColor: "#e0e0e0",
42
42
  },
43
43
  statusBar: {
44
- background: '#0a0a0e',
44
+ background: "#0a0a0e",
45
45
  },
46
46
  },
47
47
  };
@@ -1,45 +1,45 @@
1
- import type { ThemePlugin } from '../types/theme.ts';
1
+ import type { ThemePlugin } from "../types/theme.ts";
2
2
 
3
3
  export const rosePineDawnTheme: ThemePlugin = {
4
4
  apiVersion: 2,
5
- id: 'rose-pine-dawn',
6
- type: 'theme',
7
- name: 'Rosé Pine Dawn',
8
- family: 'rose-pine',
9
- version: '1.0.0',
5
+ id: "rose-pine-dawn",
6
+ type: "theme",
7
+ name: "Rosé Pine Dawn",
8
+ family: "rose-pine",
9
+ version: "1.0.0",
10
10
  permissions: {},
11
11
 
12
- colorScheme: 'light',
12
+ colorScheme: "light",
13
13
 
14
14
  colors: {
15
- background: '#faf4ed',
16
- foreground: '#fffaf3',
17
- text: '#575279',
18
- textMuted: '#797593',
19
- textSubtle: '#9893a5',
20
- primary: '#907aa9',
21
- secondary: '#d7827e',
22
- accent: '#56949f',
23
- success: '#286983',
24
- warning: '#ea9d34',
25
- error: '#b4637a',
26
- info: '#56949f',
27
- border: '#cecacd',
28
- borderMuted: '#dfdad9',
29
- selection: '#dfdad9',
30
- highlight: '#f2e9e1',
31
- gaugeBackground: '#dfdad9',
32
- gaugeFill: '#907aa9',
33
- gaugeWarning: '#ea9d34',
34
- gaugeDanger: '#b4637a',
15
+ background: "#faf4ed",
16
+ foreground: "#fffaf3",
17
+ text: "#575279",
18
+ textMuted: "#797593",
19
+ textSubtle: "#9893a5",
20
+ primary: "#907aa9",
21
+ secondary: "#d7827e",
22
+ accent: "#56949f",
23
+ success: "#286983",
24
+ warning: "#ea9d34",
25
+ error: "#b4637a",
26
+ info: "#56949f",
27
+ border: "#cecacd",
28
+ borderMuted: "#dfdad9",
29
+ selection: "#dfdad9",
30
+ highlight: "#f2e9e1",
31
+ gaugeBackground: "#dfdad9",
32
+ gaugeFill: "#907aa9",
33
+ gaugeWarning: "#ea9d34",
34
+ gaugeDanger: "#b4637a",
35
35
  },
36
36
 
37
37
  components: {
38
38
  header: {
39
- background: '#f2e9e1',
39
+ background: "#f2e9e1",
40
40
  },
41
41
  statusBar: {
42
- background: '#f2e9e1',
42
+ background: "#f2e9e1",
43
43
  },
44
44
  },
45
45
  };
@@ -1,45 +1,45 @@
1
- import type { ThemePlugin } from '../types/theme.ts';
1
+ import type { ThemePlugin } from "../types/theme.ts";
2
2
 
3
3
  export const rosePineTheme: ThemePlugin = {
4
4
  apiVersion: 2,
5
- id: 'rose-pine',
6
- type: 'theme',
7
- name: 'Rosé Pine',
8
- family: 'rose-pine',
9
- version: '1.0.0',
5
+ id: "rose-pine",
6
+ type: "theme",
7
+ name: "Rosé Pine",
8
+ family: "rose-pine",
9
+ version: "1.0.0",
10
10
  permissions: {},
11
11
 
12
- colorScheme: 'dark',
12
+ colorScheme: "dark",
13
13
 
14
14
  colors: {
15
- background: '#191724',
16
- foreground: '#1f1d2e',
17
- text: '#e0def4',
18
- textMuted: '#908caa',
19
- textSubtle: '#6e6a86',
20
- primary: '#c4a7e7',
21
- secondary: '#ebbcba',
22
- accent: '#9ccfd8',
23
- success: '#31748f',
24
- warning: '#f6c177',
25
- error: '#eb6f92',
26
- info: '#9ccfd8',
27
- border: '#403d52',
28
- borderMuted: '#26233a',
29
- selection: '#403d52',
30
- highlight: '#26233a',
31
- gaugeBackground: '#1f1d2e',
32
- gaugeFill: '#c4a7e7',
33
- gaugeWarning: '#f6c177',
34
- gaugeDanger: '#eb6f92',
15
+ background: "#191724",
16
+ foreground: "#1f1d2e",
17
+ text: "#e0def4",
18
+ textMuted: "#908caa",
19
+ textSubtle: "#6e6a86",
20
+ primary: "#c4a7e7",
21
+ secondary: "#ebbcba",
22
+ accent: "#9ccfd8",
23
+ success: "#31748f",
24
+ warning: "#f6c177",
25
+ error: "#eb6f92",
26
+ info: "#9ccfd8",
27
+ border: "#403d52",
28
+ borderMuted: "#26233a",
29
+ selection: "#403d52",
30
+ highlight: "#26233a",
31
+ gaugeBackground: "#1f1d2e",
32
+ gaugeFill: "#c4a7e7",
33
+ gaugeWarning: "#f6c177",
34
+ gaugeDanger: "#eb6f92",
35
35
  },
36
36
 
37
37
  components: {
38
38
  header: {
39
- background: '#1f1d2e',
39
+ background: "#1f1d2e",
40
40
  },
41
41
  statusBar: {
42
- background: '#1f1d2e',
42
+ background: "#1f1d2e",
43
43
  },
44
44
  },
45
45
  };
@@ -1,45 +1,45 @@
1
- import type { ThemePlugin } from '../types/theme.ts';
1
+ import type { ThemePlugin } from "../types/theme.ts";
2
2
 
3
3
  export const solarizedLightTheme: ThemePlugin = {
4
4
  apiVersion: 2,
5
- id: 'solarized-light',
6
- type: 'theme',
7
- name: 'Solarized Light',
8
- family: 'solarized',
9
- version: '1.0.0',
5
+ id: "solarized-light",
6
+ type: "theme",
7
+ name: "Solarized Light",
8
+ family: "solarized",
9
+ version: "1.0.0",
10
10
  permissions: {},
11
11
 
12
- colorScheme: 'light',
12
+ colorScheme: "light",
13
13
 
14
14
  colors: {
15
- background: '#fdf6e3',
16
- foreground: '#eee8d5',
17
- text: '#657b83',
18
- textMuted: '#839496',
19
- textSubtle: '#93a1a1',
20
- primary: '#268bd2',
21
- secondary: '#6c71c4',
22
- accent: '#2aa198',
23
- success: '#859900',
24
- warning: '#b58900',
25
- error: '#dc322f',
26
- info: '#268bd2',
27
- border: '#93a1a1',
28
- borderMuted: '#eee8d5',
29
- selection: '#eee8d5',
30
- highlight: '#eee8d5',
31
- gaugeBackground: '#eee8d5',
32
- gaugeFill: '#268bd2',
33
- gaugeWarning: '#b58900',
34
- gaugeDanger: '#dc322f',
15
+ background: "#fdf6e3",
16
+ foreground: "#eee8d5",
17
+ text: "#657b83",
18
+ textMuted: "#839496",
19
+ textSubtle: "#93a1a1",
20
+ primary: "#268bd2",
21
+ secondary: "#6c71c4",
22
+ accent: "#2aa198",
23
+ success: "#859900",
24
+ warning: "#b58900",
25
+ error: "#dc322f",
26
+ info: "#268bd2",
27
+ border: "#93a1a1",
28
+ borderMuted: "#eee8d5",
29
+ selection: "#eee8d5",
30
+ highlight: "#eee8d5",
31
+ gaugeBackground: "#eee8d5",
32
+ gaugeFill: "#268bd2",
33
+ gaugeWarning: "#b58900",
34
+ gaugeDanger: "#dc322f",
35
35
  },
36
36
 
37
37
  components: {
38
38
  header: {
39
- background: '#eee8d5',
39
+ background: "#eee8d5",
40
40
  },
41
41
  statusBar: {
42
- background: '#eee8d5',
42
+ background: "#eee8d5",
43
43
  },
44
44
  },
45
45
  };
@@ -1,45 +1,45 @@
1
- import type { ThemePlugin } from '../types/theme.ts';
1
+ import type { ThemePlugin } from "../types/theme.ts";
2
2
 
3
3
  export const tokyoNightTheme: ThemePlugin = {
4
4
  apiVersion: 2,
5
- id: 'tokyo-night',
6
- type: 'theme',
7
- name: 'Tokyo Night',
8
- family: 'tokyo-night',
9
- version: '1.0.0',
5
+ id: "tokyo-night",
6
+ type: "theme",
7
+ name: "Tokyo Night",
8
+ family: "tokyo-night",
9
+ version: "1.0.0",
10
10
  permissions: {},
11
11
 
12
- colorScheme: 'dark',
12
+ colorScheme: "dark",
13
13
 
14
14
  colors: {
15
- background: '#1a1b26',
16
- foreground: '#24283b',
17
- text: '#c0caf5',
18
- textMuted: '#737aa2',
19
- textSubtle: '#565f89',
20
- primary: '#7aa2f7',
21
- secondary: '#bb9af7',
22
- accent: '#7dcfff',
23
- success: '#9ece6a',
24
- warning: '#e0af68',
25
- error: '#f7768e',
26
- info: '#7aa2f7',
27
- border: '#414868',
28
- borderMuted: '#292e42',
29
- selection: '#33467c',
30
- highlight: '#2f3549',
31
- gaugeBackground: '#24283b',
32
- gaugeFill: '#7aa2f7',
33
- gaugeWarning: '#e0af68',
34
- gaugeDanger: '#f7768e',
15
+ background: "#1a1b26",
16
+ foreground: "#24283b",
17
+ text: "#c0caf5",
18
+ textMuted: "#737aa2",
19
+ textSubtle: "#565f89",
20
+ primary: "#7aa2f7",
21
+ secondary: "#bb9af7",
22
+ accent: "#7dcfff",
23
+ success: "#9ece6a",
24
+ warning: "#e0af68",
25
+ error: "#f7768e",
26
+ info: "#7aa2f7",
27
+ border: "#414868",
28
+ borderMuted: "#292e42",
29
+ selection: "#33467c",
30
+ highlight: "#2f3549",
31
+ gaugeBackground: "#24283b",
32
+ gaugeFill: "#7aa2f7",
33
+ gaugeWarning: "#e0af68",
34
+ gaugeDanger: "#f7768e",
35
35
  },
36
36
 
37
37
  components: {
38
38
  header: {
39
- background: '#16161e',
39
+ background: "#16161e",
40
40
  },
41
41
  statusBar: {
42
- background: '#1f2335',
42
+ background: "#1f2335",
43
43
  },
44
44
  gauge: {
45
45
  height: 1,
@@ -1,6 +1,6 @@
1
- import { z } from 'zod';
2
- import type { BasePlugin, PluginHttpClient, PluginLogger } from './base.ts';
3
- import type { Credentials, OAuthCredentials, PluginContext } from './provider.ts';
1
+ import { z } from "zod";
2
+ import type { BasePlugin, PluginHttpClient, PluginLogger } from "./base.ts";
3
+ import type { Credentials, OAuthCredentials, PluginContext } from "./provider.ts";
4
4
 
5
5
  export const AgentCapabilitiesSchema = z.object({
6
6
  sessionParsing: z.boolean(),
@@ -38,7 +38,7 @@ export interface AgentProviderConfig {
38
38
 
39
39
  export interface SessionParseOptions {
40
40
  sessionId?: string;
41
- timePeriod?: 'session' | 'daily' | 'weekly' | 'monthly';
41
+ timePeriod?: "session" | "daily" | "weekly" | "monthly";
42
42
  limit?: number;
43
43
  /** Epoch ms — only return sessions updated after this timestamp. */
44
44
  since?: number;
@@ -84,7 +84,7 @@ export interface ActivityUpdate {
84
84
  export type ActivityCallback = (update: ActivityUpdate) => void;
85
85
 
86
86
  export interface AgentPlugin extends BasePlugin {
87
- readonly type: 'agent';
87
+ readonly type: "agent";
88
88
  readonly agent: AgentConfig;
89
89
  readonly capabilities: AgentCapabilities;
90
90
 
@@ -5,7 +5,7 @@
5
5
  * authoritative contract for community developers; core adapts to match.
6
6
  */
7
7
 
8
- import { z } from 'zod';
8
+ import { z } from "zod";
9
9
 
10
10
  // ---------------------------------------------------------------------------
11
11
  // Identity
@@ -14,7 +14,7 @@ import { z } from 'zod';
14
14
  /**
15
15
  * Plugin type discriminator
16
16
  */
17
- export type PluginType = 'provider' | 'agent' | 'theme' | 'notification';
17
+ export type PluginType = "provider" | "agent" | "theme" | "notification";
18
18
 
19
19
  /**
20
20
  * Current API contract version.
@@ -30,23 +30,31 @@ export const CURRENT_API_VERSION = 2;
30
30
  * Plugin permissions schema - defines what a plugin can access
31
31
  */
32
32
  export const PluginPermissionsSchema = z.object({
33
- network: z.object({
34
- enabled: z.boolean(),
35
- allowedDomains: z.array(z.string()).optional(),
36
- }).optional(),
37
- filesystem: z.object({
38
- read: z.boolean().optional(),
39
- write: z.boolean().optional(),
40
- paths: z.array(z.string()).optional(),
41
- }).optional(),
42
- env: z.object({
43
- read: z.boolean().optional(),
44
- vars: z.array(z.string()).optional(),
45
- }).optional(),
46
- system: z.object({
47
- notifications: z.boolean().optional(),
48
- clipboard: z.boolean().optional(),
49
- }).optional(),
33
+ network: z
34
+ .object({
35
+ enabled: z.boolean(),
36
+ allowedDomains: z.array(z.string()).optional(),
37
+ })
38
+ .optional(),
39
+ filesystem: z
40
+ .object({
41
+ read: z.boolean().optional(),
42
+ write: z.boolean().optional(),
43
+ paths: z.array(z.string()).optional(),
44
+ })
45
+ .optional(),
46
+ env: z
47
+ .object({
48
+ read: z.boolean().optional(),
49
+ vars: z.array(z.string()).optional(),
50
+ })
51
+ .optional(),
52
+ system: z
53
+ .object({
54
+ notifications: z.boolean().optional(),
55
+ clipboard: z.boolean().optional(),
56
+ })
57
+ .optional(),
50
58
  });
51
59
 
52
60
  export type PluginPermissions = z.infer<typeof PluginPermissionsSchema>;
@@ -95,7 +103,7 @@ export type PluginMeta = z.infer<typeof PluginMetaSchema>;
95
103
  */
96
104
  export interface ConfigField {
97
105
  /** Data type of the setting value. */
98
- type: 'string' | 'number' | 'boolean' | 'select';
106
+ type: "string" | "number" | "boolean" | "select";
99
107
  /** Label shown in the settings UI. */
100
108
  label?: string;
101
109
  /** Help text shown below the field. */
@@ -197,7 +205,10 @@ export interface BasePlugin {
197
205
  * Called when the user changes this plugin's configuration.
198
206
  * Receive the new validated config values.
199
207
  */
200
- onConfigChange?(config: Record<string, unknown>, ctx: PluginLifecycleContext): Promise<void> | void;
208
+ onConfigChange?(
209
+ config: Record<string, unknown>,
210
+ ctx: PluginLifecycleContext,
211
+ ): Promise<void> | void;
201
212
  }
202
213
 
203
214
  // ---------------------------------------------------------------------------
@@ -245,7 +256,7 @@ export interface PluginLoadResult<T extends BasePlugin = BasePlugin> {
245
256
  success: boolean;
246
257
  plugin?: T;
247
258
  error?: string;
248
- source: 'builtin' | 'local' | 'npm';
259
+ source: "builtin" | "local" | "npm";
249
260
  }
250
261
 
251
262
  // ---------------------------------------------------------------------------
@@ -259,9 +270,9 @@ export class PluginPermissionError extends Error {
259
270
  constructor(
260
271
  public readonly pluginId: string,
261
272
  public readonly permission: keyof PluginPermissions,
262
- message: string
273
+ message: string,
263
274
  ) {
264
275
  super(`Plugin "${pluginId}" permission denied: ${message}`);
265
- this.name = 'PluginPermissionError';
276
+ this.name = "PluginPermissionError";
266
277
  }
267
278
  }
@@ -1,13 +1,13 @@
1
- export * from './base.ts';
2
- export * from './provider.ts';
3
- export * from './agent.ts';
4
- export * from './theme.ts';
5
- export * from './notification.ts';
1
+ export * from "./agent.ts";
2
+ export * from "./base.ts";
3
+ export * from "./notification.ts";
4
+ export * from "./provider.ts";
5
+ export * from "./theme.ts";
6
6
 
7
- import type { ProviderPlugin } from './provider.ts';
8
- import type { AgentPlugin } from './agent.ts';
9
- import type { ThemePlugin } from './theme.ts';
10
- import type { NotificationPlugin } from './notification.ts';
7
+ import type { AgentPlugin } from "./agent.ts";
8
+ import type { NotificationPlugin } from "./notification.ts";
9
+ import type { ProviderPlugin } from "./provider.ts";
10
+ import type { ThemePlugin } from "./theme.ts";
11
11
 
12
12
  export type AnyPlugin = ProviderPlugin | AgentPlugin | ThemePlugin | NotificationPlugin;
13
13
 
@@ -1,21 +1,21 @@
1
- import type { BasePlugin, PluginLogger } from './base.ts';
1
+ import type { BasePlugin, PluginLogger } from "./base.ts";
2
2
 
3
3
  // ---------------------------------------------------------------------------
4
4
  // Notification Events
5
5
  // ---------------------------------------------------------------------------
6
6
 
7
- export type NotificationSeverity = 'info' | 'warning' | 'critical';
7
+ export type NotificationSeverity = "info" | "warning" | "critical";
8
8
 
9
9
  export type NotificationEventType =
10
- | 'budget.thresholdCrossed'
11
- | 'budget.limitReached'
12
- | 'provider.fetchFailed'
13
- | 'provider.limitReached'
14
- | 'provider.recovered'
15
- | 'plugin.crashed'
16
- | 'plugin.disabled'
17
- | 'app.started'
18
- | 'app.updated';
10
+ | "budget.thresholdCrossed"
11
+ | "budget.limitReached"
12
+ | "provider.fetchFailed"
13
+ | "provider.limitReached"
14
+ | "provider.recovered"
15
+ | "plugin.crashed"
16
+ | "plugin.disabled"
17
+ | "app.started"
18
+ | "app.updated";
19
19
 
20
20
  export interface NotificationEvent {
21
21
  type: NotificationEventType;
@@ -41,7 +41,7 @@ export interface NotificationContext {
41
41
  // ---------------------------------------------------------------------------
42
42
 
43
43
  export interface NotificationPlugin extends BasePlugin {
44
- readonly type: 'notification';
44
+ readonly type: "notification";
45
45
 
46
46
  initialize(ctx: NotificationContext): Promise<void>;
47
47
  notify(ctx: NotificationContext, event: NotificationEvent): Promise<void>;