@jinion/cli 0.0.0-stage → 0.3.491

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 (171) hide show
  1. package/bin/jinion.js +4 -0
  2. package/dist/app/activity.js +50 -0
  3. package/dist/app/activity.js.map +1 -0
  4. package/dist/app/announcements.js +21 -0
  5. package/dist/app/announcements.js.map +1 -0
  6. package/dist/app/api.js +26 -0
  7. package/dist/app/api.js.map +1 -0
  8. package/dist/app/app.js +91 -0
  9. package/dist/app/app.js.map +1 -0
  10. package/dist/app/aside.js +52 -0
  11. package/dist/app/aside.js.map +1 -0
  12. package/dist/app/dialogs.js +43 -0
  13. package/dist/app/dialogs.js.map +1 -0
  14. package/dist/app/keys.js +79 -0
  15. package/dist/app/keys.js.map +1 -0
  16. package/dist/app/prompt-area.js +56 -0
  17. package/dist/app/prompt-area.js.map +1 -0
  18. package/dist/app/shortcuts.js +31 -0
  19. package/dist/app/shortcuts.js.map +1 -0
  20. package/dist/app/sidebar.js +50 -0
  21. package/dist/app/sidebar.js.map +1 -0
  22. package/dist/app/status-line.js +23 -0
  23. package/dist/app/status-line.js.map +1 -0
  24. package/dist/app/task-line.js +19 -0
  25. package/dist/app/task-line.js.map +1 -0
  26. package/dist/app/use-screen.js +24 -0
  27. package/dist/app/use-screen.js.map +1 -0
  28. package/dist/app/views.js +62 -0
  29. package/dist/app/views.js.map +1 -0
  30. package/dist/main.js +122 -0
  31. package/dist/main.js.map +1 -0
  32. package/dist/panels/account/account-picker.js +118 -0
  33. package/dist/panels/account/account-picker.js.map +1 -0
  34. package/dist/panels/account/describe.js +14 -0
  35. package/dist/panels/account/describe.js.map +1 -0
  36. package/dist/panels/account/sign-in-view.js +8 -0
  37. package/dist/panels/account/sign-in-view.js.map +1 -0
  38. package/dist/panels/account/use-sign-in.js +46 -0
  39. package/dist/panels/account/use-sign-in.js.map +1 -0
  40. package/dist/panels/context.js +55 -0
  41. package/dist/panels/context.js.map +1 -0
  42. package/dist/panels/diff/change-list.js +48 -0
  43. package/dist/panels/diff/change-list.js.map +1 -0
  44. package/dist/panels/diff/current-view.js +47 -0
  45. package/dist/panels/diff/current-view.js.map +1 -0
  46. package/dist/panels/diff/diff-panel.js +22 -0
  47. package/dist/panels/diff/diff-panel.js.map +1 -0
  48. package/dist/panels/diff/file-diff.js +19 -0
  49. package/dist/panels/diff/file-diff.js.map +1 -0
  50. package/dist/panels/diff/views.js +29 -0
  51. package/dist/panels/diff/views.js.map +1 -0
  52. package/dist/panels/feedback.js +67 -0
  53. package/dist/panels/feedback.js.map +1 -0
  54. package/dist/panels/help.js +79 -0
  55. package/dist/panels/help.js.map +1 -0
  56. package/dist/panels/mcp.js +129 -0
  57. package/dist/panels/mcp.js.map +1 -0
  58. package/dist/panels/memory.js +55 -0
  59. package/dist/panels/memory.js.map +1 -0
  60. package/dist/panels/mode.js +36 -0
  61. package/dist/panels/mode.js.map +1 -0
  62. package/dist/panels/model.js +20 -0
  63. package/dist/panels/model.js.map +1 -0
  64. package/dist/panels/onboarding/onboarding-panel.js +56 -0
  65. package/dist/panels/onboarding/onboarding-panel.js.map +1 -0
  66. package/dist/panels/onboarding/use-onboarding.js +65 -0
  67. package/dist/panels/onboarding/use-onboarding.js.map +1 -0
  68. package/dist/panels/profile.js +31 -0
  69. package/dist/panels/profile.js.map +1 -0
  70. package/dist/panels/resume.js +52 -0
  71. package/dist/panels/resume.js.map +1 -0
  72. package/dist/panels/rewind/changes.js +20 -0
  73. package/dist/panels/rewind/changes.js.map +1 -0
  74. package/dist/panels/rewind/rewind-panel.js +93 -0
  75. package/dist/panels/rewind/rewind-panel.js.map +1 -0
  76. package/dist/panels/sign-in/sign-in-panel.js +56 -0
  77. package/dist/panels/sign-in/sign-in-panel.js.map +1 -0
  78. package/dist/panels/sign-in/use-jinion-sign-in.js +69 -0
  79. package/dist/panels/sign-in/use-jinion-sign-in.js.map +1 -0
  80. package/dist/panels/statusline.js +94 -0
  81. package/dist/panels/statusline.js.map +1 -0
  82. package/dist/panels/tasks/output.js +23 -0
  83. package/dist/panels/tasks/output.js.map +1 -0
  84. package/dist/panels/tasks/task-output.js +29 -0
  85. package/dist/panels/tasks/task-output.js.map +1 -0
  86. package/dist/panels/tasks/tasks-panel.js +75 -0
  87. package/dist/panels/tasks/tasks-panel.js.map +1 -0
  88. package/dist/panels/terminal-setup.js +41 -0
  89. package/dist/panels/terminal-setup.js.map +1 -0
  90. package/dist/panels/usage/section.js +16 -0
  91. package/dist/panels/usage/section.js.map +1 -0
  92. package/dist/panels/usage/stats-view.js +52 -0
  93. package/dist/panels/usage/stats-view.js.map +1 -0
  94. package/dist/panels/usage/usage-panel.js +68 -0
  95. package/dist/panels/usage/usage-panel.js.map +1 -0
  96. package/dist/panels/usage/usage-view.js +51 -0
  97. package/dist/panels/usage/usage-view.js.map +1 -0
  98. package/dist/prompt/attachments.js +91 -0
  99. package/dist/prompt/attachments.js.map +1 -0
  100. package/dist/prompt/draft.js +24 -0
  101. package/dist/prompt/draft.js.map +1 -0
  102. package/dist/prompt/images.js +84 -0
  103. package/dist/prompt/images.js.map +1 -0
  104. package/dist/prompt/pasted-path.js +19 -0
  105. package/dist/prompt/pasted-path.js.map +1 -0
  106. package/dist/prompt/use-prompt.js +62 -0
  107. package/dist/prompt/use-prompt.js.map +1 -0
  108. package/dist/serve.js +38 -0
  109. package/dist/serve.js.map +1 -0
  110. package/dist/state/session.js +91 -0
  111. package/dist/state/session.js.map +1 -0
  112. package/dist/status/data.js +39 -0
  113. package/dist/status/data.js.map +1 -0
  114. package/dist/status/git.js +18 -0
  115. package/dist/status/git.js.map +1 -0
  116. package/dist/status/items.js +8 -0
  117. package/dist/status/items.js.map +1 -0
  118. package/dist/status/line.js +25 -0
  119. package/dist/status/line.js.map +1 -0
  120. package/dist/status/saved.js +8 -0
  121. package/dist/status/saved.js.map +1 -0
  122. package/dist/status/segment.js +2 -0
  123. package/dist/status/segment.js.map +1 -0
  124. package/dist/status/segments/conversation.js +71 -0
  125. package/dist/status/segments/conversation.js.map +1 -0
  126. package/dist/status/segments/git.js +33 -0
  127. package/dist/status/segments/git.js.map +1 -0
  128. package/dist/status/segments/identity.js +71 -0
  129. package/dist/status/segments/identity.js.map +1 -0
  130. package/dist/status/segments/index.js +27 -0
  131. package/dist/status/segments/index.js.map +1 -0
  132. package/dist/status/segments/usage.js +61 -0
  133. package/dist/status/segments/usage.js.map +1 -0
  134. package/dist/terminal/apple-terminal.js +68 -0
  135. package/dist/terminal/apple-terminal.js.map +1 -0
  136. package/dist/ui/banner.js +24 -0
  137. package/dist/ui/banner.js.map +1 -0
  138. package/dist/ui/entries/changes-card.js +27 -0
  139. package/dist/ui/entries/changes-card.js.map +1 -0
  140. package/dist/ui/entries/entry-view.js +82 -0
  141. package/dist/ui/entries/entry-view.js.map +1 -0
  142. package/dist/ui/entries/status-entries.js +33 -0
  143. package/dist/ui/entries/status-entries.js.map +1 -0
  144. package/dist/ui/entries/tools/agent-view.js +39 -0
  145. package/dist/ui/entries/tools/agent-view.js.map +1 -0
  146. package/dist/ui/entries/tools/mcp-view.js +10 -0
  147. package/dist/ui/entries/tools/mcp-view.js.map +1 -0
  148. package/dist/ui/entries/tools/result-preview.js +19 -0
  149. package/dist/ui/entries/tools/result-preview.js.map +1 -0
  150. package/dist/ui/entries/tools/search.js +42 -0
  151. package/dist/ui/entries/tools/search.js.map +1 -0
  152. package/dist/ui/entries/tools/shell-footer.js +36 -0
  153. package/dist/ui/entries/tools/shell-footer.js.map +1 -0
  154. package/dist/ui/entries/tools/tool-view.js +47 -0
  155. package/dist/ui/entries/tools/tool-view.js.map +1 -0
  156. package/dist/ui/entries/tools/web.js +41 -0
  157. package/dist/ui/entries/tools/web.js.map +1 -0
  158. package/dist/ui/modes.js +13 -0
  159. package/dist/ui/modes.js.map +1 -0
  160. package/dist/ui/task-marks.js +7 -0
  161. package/dist/ui/task-marks.js.map +1 -0
  162. package/dist/ui/use-async.js +17 -0
  163. package/dist/ui/use-async.js.map +1 -0
  164. package/dist/ui/use-pager.js +25 -0
  165. package/dist/ui/use-pager.js.map +1 -0
  166. package/dist/ui/use-project-files.js +18 -0
  167. package/dist/ui/use-project-files.js.map +1 -0
  168. package/dist/ui/use-workdir.js +9 -0
  169. package/dist/ui/use-workdir.js.map +1 -0
  170. package/package.json +34 -3
  171. package/README.md +0 -3
@@ -0,0 +1,19 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { Box, printable, StatusMark, Text, useAnimation, useTheme } from '@jinion/tui';
3
+ import { useAtomValue } from 'jotai';
4
+ import { backgroundTasksAtom } from '../state/session.js';
5
+ import { elapsed } from '@jinion/core/lib/format';
6
+ import { firstLine } from '@jinion/core/lib/text';
7
+ import { TASK_MARKS } from '../ui/task-marks.js';
8
+ const RECENT_MS = 60_000;
9
+ export function TaskLine() {
10
+ const theme = useTheme();
11
+ const tasks = useAtomValue(backgroundTasksAtom);
12
+ const running = tasks.some((task) => task.status === 'running');
13
+ const shown = tasks.filter((task) => task.status === 'running' || Date.now() - (task.endedAt ?? 0) < RECENT_MS);
14
+ useAnimation({ interval: 1000, isActive: running });
15
+ if (!running)
16
+ return null;
17
+ return (_jsx(Box, { marginTop: 1, paddingX: 1, children: _jsxs(Text, { wrap: "truncate-end", children: [_jsx(Text, { color: theme.muted, children: "bg " }), shown.map((task, index) => (_jsxs(Text, { children: [index > 0 && _jsx(Text, { color: theme.muted, children: " \u00B7 " }), _jsx(StatusMark, { status: TASK_MARKS[task.status] }), " ", printable(firstLine(task.title)), task.status === 'running' && _jsxs(Text, { color: theme.muted, children: [" ", elapsed(Date.now() - task.startedAt)] })] }, task.id))), _jsx(Text, { color: theme.muted, children: " \u00B7 ctrl+t" })] }) }));
18
+ }
19
+ //# sourceMappingURL=task-line.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"task-line.js","sourceRoot":"","sources":["../../src/app/task-line.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,GAAG,EAAE,SAAS,EAAE,UAAU,EAAE,IAAI,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACvF,OAAO,EAAE,YAAY,EAAE,MAAM,OAAO,CAAC;AACrC,OAAO,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAC1D,OAAO,EAAE,OAAO,EAAE,MAAM,yBAAyB,CAAC;AAClD,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAClD,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAEjD,MAAM,SAAS,GAAG,MAAM,CAAC;AAEzB,MAAM,UAAU,QAAQ;IACtB,MAAM,KAAK,GAAG,QAAQ,EAAE,CAAC;IACzB,MAAM,KAAK,GAAG,YAAY,CAAC,mBAAmB,CAAC,CAAC;IAEhD,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC;IAChE,MAAM,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,KAAK,SAAS,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,IAAI,CAAC,OAAO,IAAI,CAAC,CAAC,GAAG,SAAS,CAAC,CAAC;IAEhH,YAAY,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC;IAEpD,IAAI,CAAC,OAAO;QAAE,OAAO,IAAI,CAAC;IAE1B,OAAO,CACL,KAAC,GAAG,IAAC,SAAS,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,YAC5B,MAAC,IAAI,IAAC,IAAI,EAAC,cAAc,aACvB,KAAC,IAAI,IAAC,KAAK,EAAE,KAAK,CAAC,KAAK,oBAAY,EACnC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,CAC1B,MAAC,IAAI,eACF,KAAK,GAAG,CAAC,IAAI,KAAC,IAAI,IAAC,KAAK,EAAE,KAAK,CAAC,KAAK,yBAAY,EAClD,KAAC,UAAU,IAAC,MAAM,EAAE,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,GAAI,OAAE,SAAS,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAChF,IAAI,CAAC,MAAM,KAAK,SAAS,IAAI,MAAC,IAAI,IAAC,KAAK,EAAE,KAAK,CAAC,KAAK,kBAAI,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,IAAQ,KAH7F,IAAI,CAAC,EAAE,CAIX,CACR,CAAC,EACF,KAAC,IAAI,IAAC,KAAK,EAAE,KAAK,CAAC,KAAK,+BAAkB,IACrC,GACH,CACP,CAAC;AACJ,CAAC"}
@@ -0,0 +1,24 @@
1
+ import { useRef, useState } from 'react';
2
+ import { useApp, usePanels, useTerminal, useView } from '@jinion/tui';
3
+ import { draftsAtom, fillDraft } from '../prompt/draft.js';
4
+ import { viewPanel } from './views.js';
5
+ /** What the core asks of the screen, made once and reading the TUI as it is now on every call. */
6
+ export function useScreen(store) {
7
+ const tui = { panels: usePanels(), terminal: useTerminal(), view: useView(), app: useApp() };
8
+ const latest = useRef(tui);
9
+ latest.current = tui;
10
+ const [screen] = useState(() => ({
11
+ view: (view) => latest.current.panels.open(viewPanel(view)),
12
+ fillPrompt: (session, text, fill) => store().set(draftsAtom, (drafts) => fillDraft(drafts, session, text, fill)),
13
+ notify: (title, body) => latest.current.terminal.notify(title, body),
14
+ expand: () => latest.current.view.toggleExpanded(),
15
+ exit: () => latest.current.app.exit(),
16
+ }));
17
+ return screen;
18
+ }
19
+ /** Opens a view the way the core's commands do, for what the app opens itself, such as `ctrl+t`. */
20
+ export function useOpenView() {
21
+ const panels = usePanels();
22
+ return (view) => panels.open(viewPanel(view));
23
+ }
24
+ //# sourceMappingURL=use-screen.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-screen.js","sourceRoot":"","sources":["../../src/app/use-screen.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AACzC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAGtE,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC3D,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAEvC,kGAAkG;AAClG,MAAM,UAAU,SAAS,CAAC,KAAkB;IAC1C,MAAM,GAAG,GAAG,EAAE,MAAM,EAAE,SAAS,EAAE,EAAE,QAAQ,EAAE,WAAW,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,GAAG,EAAE,MAAM,EAAE,EAAE,CAAC;IAC7F,MAAM,MAAM,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;IAE3B,MAAM,CAAC,OAAO,GAAG,GAAG,CAAC;IAErB,MAAM,CAAC,MAAM,CAAC,GAAG,QAAQ,CAAiB,GAAG,EAAE,CAAC,CAAC;QAC/C,IAAI,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;QAC3D,UAAU,EAAE,CAAC,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,CAAC,KAAK,EAAE,CAAC,GAAG,CAAC,UAAU,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,SAAS,CAAC,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;QAChH,MAAM,EAAE,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC;QACpE,MAAM,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,cAAc,EAAE;QAClD,IAAI,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,EAAE;KACtC,CAAC,CAAC,CAAC;IAEJ,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,oGAAoG;AACpG,MAAM,UAAU,WAAW;IACzB,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;IAE3B,OAAO,CAAC,IAA2C,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC;AACvF,CAAC"}
@@ -0,0 +1,62 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { AccountPicker } from '../panels/account/account-picker.js';
3
+ import { ContextPanel } from '../panels/context.js';
4
+ import { DiffPanel } from '../panels/diff/diff-panel.js';
5
+ import { HelpPanel } from '../panels/help.js';
6
+ import { McpPanel } from '../panels/mcp.js';
7
+ import { MemoryPanel } from '../panels/memory.js';
8
+ import { ModePicker } from '../panels/mode.js';
9
+ import { ModelPicker } from '../panels/model.js';
10
+ import { FeedbackPanel } from '../panels/feedback.js';
11
+ import { ProfilePanel } from '../panels/profile.js';
12
+ import { ResumePanel } from '../panels/resume.js';
13
+ import { RewindPanel } from '../panels/rewind/rewind-panel.js';
14
+ import { StatusLinePanel } from '../panels/statusline.js';
15
+ import { TasksPanel } from '../panels/tasks/tasks-panel.js';
16
+ import { TerminalSetupPanel } from '../panels/terminal-setup.js';
17
+ import { UsagePanel } from '../panels/usage/usage-panel.js';
18
+ import { useApi } from './api.js';
19
+ const FULLSCREEN = new Set(['resume', 'diff', 'usage']);
20
+ export const viewPanel = (view) => ({
21
+ id: view.id,
22
+ placement: FULLSCREEN.has(view.id) ? 'fullscreen' : 'bottom',
23
+ element: _jsx(ViewPanel, { view: view }),
24
+ });
25
+ function ViewPanel({ view }) {
26
+ const api = useApi();
27
+ switch (view.id) {
28
+ case 'help':
29
+ return _jsx(HelpPanel, { topic: view.topic });
30
+ case 'model':
31
+ return _jsx(ModelPicker, {});
32
+ case 'mode':
33
+ return _jsx(ModePicker, {});
34
+ case 'account':
35
+ return _jsx(AccountPicker, { signIn: view.signIn });
36
+ case 'mcp':
37
+ return _jsx(McpPanel, {});
38
+ case 'resume':
39
+ return _jsx(ResumePanel, { query: view.query });
40
+ case 'memory':
41
+ return _jsx(MemoryPanel, {});
42
+ case 'rewind':
43
+ return (_jsx(RewindPanel, { points: view.points, preview: async (point) => (await api.inSession('session/rewind-preview', { prompt: point.promptId })) ?? undefined, onRewind: (point, scope) => api.act(api.inSession('session/rewind', { point, scope })) }));
44
+ case 'diff':
45
+ return _jsx(DiffPanel, { turn: view.turn, file: view.file });
46
+ case 'context':
47
+ return _jsx(ContextPanel, {});
48
+ case 'usage':
49
+ return _jsx(UsagePanel, { tab: view.tab });
50
+ case 'tasks':
51
+ return _jsx(TasksPanel, {});
52
+ case 'statusline':
53
+ return _jsx(StatusLinePanel, {});
54
+ case 'terminal-setup':
55
+ return _jsx(TerminalSetupPanel, {});
56
+ case 'profile':
57
+ return _jsx(ProfilePanel, {});
58
+ case 'feedback':
59
+ return _jsx(FeedbackPanel, { entry: view.entry });
60
+ }
61
+ }
62
+ //# sourceMappingURL=views.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"views.js","sourceRoot":"","sources":["../../src/app/views.tsx"],"names":[],"mappings":"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"}
package/dist/main.js ADDED
@@ -0,0 +1,122 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { createRequire } from 'node:module';
3
+ import { parseArgs } from 'node:util';
4
+ import { run } from '@jinion/tui';
5
+ import { findServer } from '@jinion/core/api/server-file';
6
+ import { connectWebSocket } from '@jinion/core/api/websocket';
7
+ import { coreOptions, startCore } from '@jinion/core/host';
8
+ import { App } from './app/app.js';
9
+ import { serve } from './serve.js';
10
+ import { inAppleTerminal, offeredTerminalSetup, profilesWithoutMeta } from './terminal/apple-terminal.js';
11
+ const { version } = createRequire(import.meta.url)('../package.json');
12
+ const USAGE = `jinion ${version}
13
+
14
+ Usage: jinion [options]
15
+ jinion serve [--port <port>] [--stdio] [--origin <origin>]...
16
+
17
+ Options:
18
+ -c, --continue Continue the last conversation in this directory
19
+ -m, --model <model> Claude model alias or id (or JINION_MODEL); /model's last pick, else opus
20
+ -e, --effort <level> Effort level, e.g. low, medium, high, xhigh, max (or JINION_EFFORT)
21
+ --attach Show the conversations of the jinion serve running for this directory
22
+ --demo Play the scripted demo instead of running Claude
23
+ --debug Log what goes to Claude Code and back to ~/.jinion/logs (or JINION_DEBUG=1)
24
+ --theme <light|dark> Skip background detection (or set JINION_THEME)
25
+ -v, --version Print the version
26
+ -h, --help Show this help
27
+
28
+ jinion serve runs jinion without a screen, for other apps to drive over its API: on a WebSocket on this
29
+ machine, with a token only you can read, or over stdin and stdout with --stdio.
30
+ --port <port> The port to serve on; a free one when left out
31
+ --stdio Serve the process that started this one, over stdin and stdout
32
+ --origin <origin> A web page let in, e.g. a desktop app's; repeat for several`;
33
+ const { values, positionals } = parseArgs({
34
+ allowPositionals: true,
35
+ options: {
36
+ continue: { type: 'boolean', short: 'c' },
37
+ model: { type: 'string', short: 'm' },
38
+ effort: { type: 'string', short: 'e' },
39
+ attach: { type: 'boolean' },
40
+ demo: { type: 'boolean' },
41
+ debug: { type: 'boolean' },
42
+ theme: { type: 'string' },
43
+ port: { type: 'string' },
44
+ stdio: { type: 'boolean' },
45
+ origin: { type: 'string', multiple: true },
46
+ version: { type: 'boolean', short: 'v' },
47
+ help: { type: 'boolean', short: 'h' },
48
+ },
49
+ });
50
+ if (values.help) {
51
+ console.log(USAGE);
52
+ process.exit(0);
53
+ }
54
+ if (values.version) {
55
+ console.log(version);
56
+ process.exit(0);
57
+ }
58
+ const [command, ...rest] = positionals;
59
+ if ((command !== undefined && command !== 'serve') || rest.length > 0)
60
+ fail(`Unknown command "${positionals.join(' ')}". jinion --help lists what there is.`);
61
+ const theme = values.theme ?? process.env.JINION_THEME;
62
+ if (theme !== undefined && theme !== 'light' && theme !== 'dark')
63
+ fail(`Unknown theme "${theme}". Use light or dark.`);
64
+ const port = values.port === undefined ? undefined : Number(values.port);
65
+ if (port !== undefined && !(Number.isInteger(port) && port >= 0 && port < 65_536))
66
+ fail(`"${values.port}" is no port. Use a number up to 65535.`);
67
+ // Package managers run scripts from the package directory; INIT_CWD is where the user invoked them.
68
+ const cwd = process.env.INIT_CWD ?? process.cwd();
69
+ const scheme = theme;
70
+ const terminalSetup = inAppleTerminal() && !offeredTerminalSetup() && (await profilesWithoutMeta().catch(() => [])).length > 0;
71
+ if (values.attach) {
72
+ const server = findServer(cwd);
73
+ if (!server)
74
+ fail('No jinion serve runs for this directory. Start one with jinion serve.');
75
+ let lost = false;
76
+ const instance = await run(_jsx(App, { connect: () => connectWebSocket(server.url, server.token), version: version, offerTerminalSetup: terminalSetup, attached: true, onLost: () => (lost = true) }), { scheme });
77
+ await instance.waitUntilExit();
78
+ if (lost)
79
+ console.log(`The connection to jinion serve at ${server.url} closed.`);
80
+ process.exit(0);
81
+ }
82
+ const { options, debug, farewells } = await coreOptions({
83
+ cwd,
84
+ version,
85
+ demo: values.demo,
86
+ model: values.model ?? process.env.JINION_MODEL,
87
+ effort: values.effort ?? process.env.JINION_EFFORT,
88
+ debug: values.debug || process.env.JINION_DEBUG === '1',
89
+ continue: values.continue,
90
+ client: 'cli',
91
+ });
92
+ const core = startCore(options);
93
+ core.server.app.start();
94
+ // A crash is kept on disk before the process goes, and sent with the next start.
95
+ const crashed = (error) => {
96
+ options.signals?.error('cli', error);
97
+ console.error(error);
98
+ process.exit(1);
99
+ };
100
+ process.on('uncaughtException', crashed);
101
+ process.on('unhandledRejection', crashed);
102
+ if (command === 'serve') {
103
+ await serve(core.server, { cwd, version, port, stdio: values.stdio, origins: values.origin });
104
+ for (const backend of options.backends)
105
+ backend.close?.();
106
+ for (const message of farewells)
107
+ console.error(message);
108
+ process.exit(0);
109
+ }
110
+ const instance = await run(_jsx(App, { connect: core.connect, version: version, offerTerminalSetup: terminalSetup }), { scheme });
111
+ await instance.waitUntilExit();
112
+ for (const backend of options.backends)
113
+ backend.close?.();
114
+ for (const message of farewells)
115
+ console.log(message);
116
+ if (debug)
117
+ console.log(`Debug log: ${debug.path}`);
118
+ function fail(message) {
119
+ console.error(message);
120
+ process.exit(1);
121
+ }
122
+ //# sourceMappingURL=main.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"main.js","sourceRoot":"","sources":["../src/main.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACtC,OAAO,EAAE,GAAG,EAAoB,MAAM,aAAa,CAAC;AACpD,OAAO,EAAE,UAAU,EAAE,MAAM,8BAA8B,CAAC;AAC1D,OAAO,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;AAC9D,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAC3D,OAAO,EAAE,GAAG,EAAE,MAAM,cAAc,CAAC;AACnC,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACnC,OAAO,EAAE,eAAe,EAAE,oBAAoB,EAAE,mBAAmB,EAAE,MAAM,8BAA8B,CAAC;AAE1G,MAAM,EAAE,OAAO,EAAE,GAAG,aAAa,CAAC,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,iBAAiB,CAAwB,CAAC;AAE7F,MAAM,KAAK,GAAG,UAAU,OAAO;;;;;;;;;;;;;;;;;;;;oFAoBqD,CAAC;AAErF,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,GAAG,SAAS,CAAC;IACxC,gBAAgB,EAAE,IAAI;IACtB,OAAO,EAAE;QACP,QAAQ,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,GAAG,EAAE;QACzC,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,GAAG,EAAE;QACrC,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,GAAG,EAAE;QACtC,MAAM,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE;QAC3B,IAAI,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE;QACzB,KAAK,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE;QAC1B,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;QACzB,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;QACxB,KAAK,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE;QAC1B,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE;QAC1C,OAAO,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,GAAG,EAAE;QACxC,IAAI,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,GAAG,EAAE;KACtC;CACF,CAAC,CAAC;AAEH,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC;IAChB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IACnB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC;AAED,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;IACnB,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IACrB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC;AAED,MAAM,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,GAAG,WAAW,CAAC;AAEvC,IAAI,CAAC,OAAO,KAAK,SAAS,IAAI,OAAO,KAAK,OAAO,CAAC,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC;IAAE,IAAI,CAAC,oBAAoB,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,uCAAuC,CAAC,CAAC;AAE9J,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,IAAI,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC;AAEvD,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,OAAO,IAAI,KAAK,KAAK,MAAM;IAAE,IAAI,CAAC,kBAAkB,KAAK,uBAAuB,CAAC,CAAC;AAEvH,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;AAEzE,IAAI,IAAI,KAAK,SAAS,IAAI,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,IAAI,GAAG,MAAM,CAAC;IAAE,IAAI,CAAC,IAAI,MAAM,CAAC,IAAI,yCAAyC,CAAC,CAAC;AAElJ,oGAAoG;AACpG,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,QAAQ,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;AAClD,MAAM,MAAM,GAAG,KAAgC,CAAC;AAChD,MAAM,aAAa,GAAG,eAAe,EAAE,IAAI,CAAC,oBAAoB,EAAE,IAAI,CAAC,MAAM,mBAAmB,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC;AAE/H,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;IAClB,MAAM,MAAM,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC;IAE/B,IAAI,CAAC,MAAM;QAAE,IAAI,CAAC,uEAAuE,CAAC,CAAC;IAE3F,IAAI,IAAI,GAAG,KAAK,CAAC;IACjB,MAAM,QAAQ,GAAG,MAAM,GAAG,CAAC,KAAC,GAAG,IAAC,OAAO,EAAE,GAAG,EAAE,CAAC,gBAAgB,CAAC,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,KAAK,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,kBAAkB,EAAE,aAAa,EAAE,QAAQ,QAAC,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC,IAAI,GAAG,IAAI,CAAC,GAAI,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC;IAEtM,MAAM,QAAQ,CAAC,aAAa,EAAE,CAAC;IAC/B,IAAI,IAAI;QAAE,OAAO,CAAC,GAAG,CAAC,qCAAqC,MAAM,CAAC,GAAG,UAAU,CAAC,CAAC;IACjF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC;AAED,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,GAAG,MAAM,WAAW,CAAC;IACtD,GAAG;IACH,OAAO;IACP,IAAI,EAAE,MAAM,CAAC,IAAI;IACjB,KAAK,EAAE,MAAM,CAAC,KAAK,IAAI,OAAO,CAAC,GAAG,CAAC,YAAY;IAC/C,MAAM,EAAE,MAAM,CAAC,MAAM,IAAI,OAAO,CAAC,GAAG,CAAC,aAAa;IAClD,KAAK,EAAE,MAAM,CAAC,KAAK,IAAI,OAAO,CAAC,GAAG,CAAC,YAAY,KAAK,GAAG;IACvD,QAAQ,EAAE,MAAM,CAAC,QAAQ;IACzB,MAAM,EAAE,KAAK;CACd,CAAC,CAAC;AAEH,MAAM,IAAI,GAAG,SAAS,CAAC,OAAO,CAAC,CAAC;AAEhC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC;AAExB,iFAAiF;AACjF,MAAM,OAAO,GAAG,CAAC,KAAc,EAAE,EAAE;IACjC,OAAO,CAAC,OAAO,EAAE,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;IACrC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IACrB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC;AAEF,OAAO,CAAC,EAAE,CAAC,mBAAmB,EAAE,OAAO,CAAC,CAAC;AACzC,OAAO,CAAC,EAAE,CAAC,oBAAoB,EAAE,OAAO,CAAC,CAAC;AAE1C,IAAI,OAAO,KAAK,OAAO,EAAE,CAAC;IACxB,MAAM,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;IAC9F,KAAK,MAAM,OAAO,IAAI,OAAO,CAAC,QAAQ;QAAE,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC;IAC1D,KAAK,MAAM,OAAO,IAAI,SAAS;QAAE,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IACxD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC;AAED,MAAM,QAAQ,GAAG,MAAM,GAAG,CAAC,KAAC,GAAG,IAAC,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,kBAAkB,EAAE,aAAa,GAAI,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC;AAE5H,MAAM,QAAQ,CAAC,aAAa,EAAE,CAAC;AAC/B,KAAK,MAAM,OAAO,IAAI,OAAO,CAAC,QAAQ;IAAE,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC;AAC1D,KAAK,MAAM,OAAO,IAAI,SAAS;IAAE,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;AACtD,IAAI,KAAK;IAAE,OAAO,CAAC,GAAG,CAAC,cAAc,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;AAEnD,SAAS,IAAI,CAAC,OAAe;IAC3B,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IACvB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC"}
@@ -0,0 +1,118 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useEffect, useState } from 'react';
3
+ import { Box, ChoiceList, choiceIndent, Panel, PromptInput, Text, useChoiceList, useInput, usePanel, useTheme } from '@jinion/tui';
4
+ import { useAtomValue } from 'jotai';
5
+ import { limitsKey } from '@jinion/core/agent/usage';
6
+ import { useApi } from '../../app/api.js';
7
+ import { accountAtom, agentAtom, seenLimitsAtom } from '../../state/session.js';
8
+ import { describeAccount } from './describe.js';
9
+ import { SignInView } from './sign-in-view.js';
10
+ import { useSignIn } from './use-sign-in.js';
11
+ const ADD = '+add';
12
+ export function AccountPicker({ signIn: initial }) {
13
+ const api = useApi();
14
+ const theme = useTheme();
15
+ const { close } = usePanel();
16
+ const current = useAtomValue(accountAtom);
17
+ const seen = useAtomValue(seenLimitsAtom);
18
+ const agent = useAtomValue(agentAtom).name;
19
+ const [list, setList] = useState();
20
+ const [naming, setNaming] = useState();
21
+ const [removing, setRemoving] = useState();
22
+ const refresh = () => api.request('accounts/list', {}).then(setList, () => setList([]));
23
+ const login = useSignIn((name, signedIn) => {
24
+ if (signedIn)
25
+ choices.setFocus(name);
26
+ void refresh();
27
+ });
28
+ useEffect(() => {
29
+ void refresh();
30
+ if (initial)
31
+ login.start(initial);
32
+ }, []);
33
+ const choices = useChoiceList({
34
+ keys: [...(list ?? []).map((account) => account.name), ADD],
35
+ mode: 'single',
36
+ initialFocus: current,
37
+ isActive: !login.signing && naming === undefined,
38
+ onCancel: close,
39
+ onSubmit: ([name]) => {
40
+ if (name === ADD)
41
+ return setNaming('');
42
+ const account = list?.find((candidate) => candidate.name === name);
43
+ if (!account)
44
+ return;
45
+ if (!account.signedIn)
46
+ return login.start(account.name);
47
+ close();
48
+ if (account.name !== current)
49
+ api.act(api.request('accounts/select', { name: account.name }));
50
+ },
51
+ });
52
+ useInput((input) => {
53
+ const account = list?.find((candidate) => candidate.name === choices.focus);
54
+ if (!account || removing?.running)
55
+ return;
56
+ const { name } = account;
57
+ if (input === 'l')
58
+ return login.start(name);
59
+ if (input !== 'd')
60
+ return setRemoving(undefined);
61
+ const refused = account.own
62
+ ? `${agent}'s own login stays; l signs in again`
63
+ : name === current
64
+ ? 'in use; switch to another account first'
65
+ : undefined;
66
+ if (refused || removing?.name !== name)
67
+ return setRemoving({ name, refused });
68
+ setRemoving({ name, running: true });
69
+ const removed = api.request('accounts/remove', { name });
70
+ api.act(removed);
71
+ void removed.finally(async () => {
72
+ await refresh();
73
+ setRemoving(undefined);
74
+ });
75
+ }, { isActive: !login.signing && naming === undefined });
76
+ useInput((_, key) => {
77
+ if (!key.escape)
78
+ return;
79
+ if (login.signing)
80
+ login.cancel();
81
+ else
82
+ setNaming(undefined);
83
+ }, { isActive: login.signing !== undefined || naming !== undefined });
84
+ if (login.signing)
85
+ return _jsx(SignInView, { signing: login.signing, onType: login.type, onSend: login.send });
86
+ const rows = [
87
+ ...(list ?? []).map((account) => ({
88
+ key: account.name,
89
+ label: account.name,
90
+ description: describeAccount(account, seen[limitsKey(agent, account.name)]),
91
+ aside: removing?.name === account.name ? (_jsx(Text, { color: removing.refused ? theme.warning : theme.error, children: removing.refused ?? (removing.running ? 'signing out…' : 'press d again to remove') })) : account.name === current ? ('current') : undefined,
92
+ })),
93
+ {
94
+ key: ADD,
95
+ label: 'Add an account',
96
+ description: 'Signs another login in, in the browser',
97
+ editor: naming !== undefined ? (_jsxs(Box, { paddingLeft: choiceIndent(choices), children: [_jsx(Text, { color: theme.muted, children: "name: " }), _jsx(PromptInput, { value: naming, onChange: setNaming, onSubmit: (value) => {
98
+ const name = value.trim();
99
+ setNaming(undefined);
100
+ if (name)
101
+ login.start(name);
102
+ }, placeholder: "e.g. work or personal", paddingX: 0 })] })) : undefined,
103
+ },
104
+ ];
105
+ return (_jsx(Panel, { title: "Account", subtitle: agent, hints: naming !== undefined
106
+ ? [
107
+ ['Enter', 'sign in'],
108
+ ['Esc', 'back'],
109
+ ]
110
+ : [
111
+ ['Enter', 'switch'],
112
+ ['l', 'sign in again'],
113
+ ['d', 'remove'],
114
+ ['Up/Down', 'move'],
115
+ ['Esc', 'close'],
116
+ ], children: list === undefined ? _jsx(Text, { color: theme.muted, children: "Asking who is signed in\u2026" }) : _jsx(ChoiceList, { list: choices, choices: rows, limit: 6 }) }));
117
+ }
118
+ //# sourceMappingURL=account-picker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"account-picker.js","sourceRoot":"","sources":["../../../src/panels/account/account-picker.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAC5C,OAAO,EAAE,GAAG,EAAE,UAAU,EAAE,YAAY,EAAE,KAAK,EAAE,WAAW,EAAE,IAAI,EAAE,aAAa,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAe,MAAM,aAAa,CAAC;AAChJ,OAAO,EAAE,YAAY,EAAE,MAAM,OAAO,CAAC;AAErC,OAAO,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAC;AACrD,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAC1C,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAChF,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAE7C,MAAM,GAAG,GAAG,MAAM,CAAC;AAInB,MAAM,UAAU,aAAa,CAAC,EAAE,MAAM,EAAE,OAAO,EAAuB;IACpE,MAAM,GAAG,GAAG,MAAM,EAAE,CAAC;IACrB,MAAM,KAAK,GAAG,QAAQ,EAAE,CAAC;IACzB,MAAM,EAAE,KAAK,EAAE,GAAG,QAAQ,EAAE,CAAC;IAC7B,MAAM,OAAO,GAAG,YAAY,CAAC,WAAW,CAAC,CAAC;IAC1C,MAAM,IAAI,GAAG,YAAY,CAAC,cAAc,CAAC,CAAC;IAC1C,MAAM,KAAK,GAAG,YAAY,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC;IAE3C,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,QAAQ,EAAkB,CAAC;IACnD,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,QAAQ,EAAU,CAAC;IAC/C,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC,GAAG,QAAQ,EAAY,CAAC;IAErD,MAAM,OAAO,GAAG,GAAG,EAAE,CAAC,GAAG,CAAC,OAAO,CAAC,eAAe,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC;IAExF,MAAM,KAAK,GAAG,SAAS,CAAC,CAAC,IAAI,EAAE,QAAQ,EAAE,EAAE;QACzC,IAAI,QAAQ;YAAE,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;QACrC,KAAK,OAAO,EAAE,CAAC;IACjB,CAAC,CAAC,CAAC;IAEH,SAAS,CAAC,GAAG,EAAE;QACb,KAAK,OAAO,EAAE,CAAC;QACf,IAAI,OAAO;YAAE,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IACpC,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,MAAM,OAAO,GAAG,aAAa,CAAC;QAC5B,IAAI,EAAE,CAAC,GAAG,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,GAAG,CAAC;QAC3D,IAAI,EAAE,QAAQ;QACd,YAAY,EAAE,OAAO;QACrB,QAAQ,EAAE,CAAC,KAAK,CAAC,OAAO,IAAI,MAAM,KAAK,SAAS;QAChD,QAAQ,EAAE,KAAK;QACf,QAAQ,EAAE,CAAC,CAAC,IAAI,CAAC,EAAE,EAAE;YACnB,IAAI,IAAI,KAAK,GAAG;gBAAE,OAAO,SAAS,CAAC,EAAE,CAAC,CAAC;YAEvC,MAAM,OAAO,GAAG,IAAI,EAAE,IAAI,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC;YACnE,IAAI,CAAC,OAAO;gBAAE,OAAO;YACrB,IAAI,CAAC,OAAO,CAAC,QAAQ;gBAAE,OAAO,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;YAExD,KAAK,EAAE,CAAC;YACR,IAAI,OAAO,CAAC,IAAI,KAAK,OAAO;gBAAE,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,iBAAiB,EAAE,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;QAChG,CAAC;KACF,CAAC,CAAC;IAEH,QAAQ,CACN,CAAC,KAAK,EAAE,EAAE;QACR,MAAM,OAAO,GAAG,IAAI,EAAE,IAAI,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,IAAI,KAAK,OAAO,CAAC,KAAK,CAAC,CAAC;QAC5E,IAAI,CAAC,OAAO,IAAI,QAAQ,EAAE,OAAO;YAAE,OAAO;QAE1C,MAAM,EAAE,IAAI,EAAE,GAAG,OAAO,CAAC;QACzB,IAAI,KAAK,KAAK,GAAG;YAAE,OAAO,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAC5C,IAAI,KAAK,KAAK,GAAG;YAAE,OAAO,WAAW,CAAC,SAAS,CAAC,CAAC;QAEjD,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG;YACzB,CAAC,CAAC,GAAG,KAAK,sCAAsC;YAChD,CAAC,CAAC,IAAI,KAAK,OAAO;gBAChB,CAAC,CAAC,yCAAyC;gBAC3C,CAAC,CAAC,SAAS,CAAC;QAChB,IAAI,OAAO,IAAI,QAAQ,EAAE,IAAI,KAAK,IAAI;YAAE,OAAO,WAAW,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC;QAE9E,WAAW,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;QAErC,MAAM,OAAO,GAAG,GAAG,CAAC,OAAO,CAAC,iBAAiB,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC;QAEzD,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QAEjB,KAAK,OAAO,CAAC,OAAO,CAAC,KAAK,IAAI,EAAE;YAC9B,MAAM,OAAO,EAAE,CAAC;YAChB,WAAW,CAAC,SAAS,CAAC,CAAC;QACzB,CAAC,CAAC,CAAC;IACL,CAAC,EACD,EAAE,QAAQ,EAAE,CAAC,KAAK,CAAC,OAAO,IAAI,MAAM,KAAK,SAAS,EAAE,CACrD,CAAC;IAEF,QAAQ,CACN,CAAC,CAAC,EAAE,GAAG,EAAE,EAAE;QACT,IAAI,CAAC,GAAG,CAAC,MAAM;YAAE,OAAO;QAExB,IAAI,KAAK,CAAC,OAAO;YAAE,KAAK,CAAC,MAAM,EAAE,CAAC;;YAC7B,SAAS,CAAC,SAAS,CAAC,CAAC;IAC5B,CAAC,EACD,EAAE,QAAQ,EAAE,KAAK,CAAC,OAAO,KAAK,SAAS,IAAI,MAAM,KAAK,SAAS,EAAE,CAClE,CAAC;IAEF,IAAI,KAAK,CAAC,OAAO;QAAE,OAAO,KAAC,UAAU,IAAC,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,CAAC,IAAI,GAAI,CAAC;IAEzG,MAAM,IAAI,GAAa;QACrB,GAAG,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;YAChC,GAAG,EAAE,OAAO,CAAC,IAAI;YACjB,KAAK,EAAE,OAAO,CAAC,IAAI;YACnB,WAAW,EAAE,eAAe,CAAC,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;YAC3E,KAAK,EACH,QAAQ,EAAE,IAAI,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAChC,KAAC,IAAI,IAAC,KAAK,EAAE,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,YACxD,QAAQ,CAAC,OAAO,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,yBAAyB,CAAC,GAC/E,CACR,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,CAC7B,SAAS,CACV,CAAC,CAAC,CAAC,SAAS;SAChB,CAAC,CAAC;QACH;YACE,GAAG,EAAE,GAAG;YACR,KAAK,EAAE,gBAAgB;YACvB,WAAW,EAAE,wCAAwC;YACrD,MAAM,EACJ,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,CACrB,MAAC,GAAG,IAAC,WAAW,EAAE,YAAY,CAAC,OAAO,CAAC,aACrC,KAAC,IAAI,IAAC,KAAK,EAAE,KAAK,CAAC,KAAK,uBAAe,EACvC,KAAC,WAAW,IACV,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,SAAS,EACnB,QAAQ,EAAE,CAAC,KAAK,EAAE,EAAE;4BAClB,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;4BAE1B,SAAS,CAAC,SAAS,CAAC,CAAC;4BACrB,IAAI,IAAI;gCAAE,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;wBAC9B,CAAC,EACD,WAAW,EAAC,uBAAuB,EACnC,QAAQ,EAAE,CAAC,GACX,IACE,CACP,CAAC,CAAC,CAAC,SAAS;SAChB;KACF,CAAC;IAEF,OAAO,CACL,KAAC,KAAK,IACJ,KAAK,EAAC,SAAS,EACf,QAAQ,EAAE,KAAK,EACf,KAAK,EACH,MAAM,KAAK,SAAS;YAClB,CAAC,CAAC;gBACE,CAAC,OAAO,EAAE,SAAS,CAAC;gBACpB,CAAC,KAAK,EAAE,MAAM,CAAC;aAChB;YACH,CAAC,CAAC;gBACE,CAAC,OAAO,EAAE,QAAQ,CAAC;gBACnB,CAAC,GAAG,EAAE,eAAe,CAAC;gBACtB,CAAC,GAAG,EAAE,QAAQ,CAAC;gBACf,CAAC,SAAS,EAAE,MAAM,CAAC;gBACnB,CAAC,KAAK,EAAE,OAAO,CAAC;aACjB,YAGN,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,KAAC,IAAI,IAAC,KAAK,EAAE,KAAK,CAAC,KAAK,8CAAiC,CAAC,CAAC,CAAC,KAAC,UAAU,IAAC,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,GAAI,GAClI,CACT,CAAC;AACJ,CAAC"}
@@ -0,0 +1,14 @@
1
+ import { accountLabel } from '@jinion/core/agent/accounts';
2
+ import { ago } from '@jinion/core/lib/format';
3
+ export function describeAccount(account, seen) {
4
+ if (!account.signedIn)
5
+ return 'Not signed in; press enter to sign in';
6
+ // The email is in the label for a personal plan; a shared one shows it next to the organization.
7
+ const shared = account.plan === 'Team' || account.plan === 'Enterprise';
8
+ const who = [accountLabel(account), shared ? account.email : undefined].filter(Boolean).join(' · ');
9
+ if (!seen)
10
+ return who;
11
+ const left = seen.windows.map((window) => `${window.label} ${Math.round((1 - window.used) * 100)}% left`).join(' · ');
12
+ return `${who} · ${left} ${ago(seen.at)}`;
13
+ }
14
+ //# sourceMappingURL=describe.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"describe.js","sourceRoot":"","sources":["../../../src/panels/account/describe.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAqB,MAAM,6BAA6B,CAAC;AAC9E,OAAO,EAAE,GAAG,EAAE,MAAM,yBAAyB,CAAC;AAG9C,MAAM,UAAU,eAAe,CAAC,OAAqB,EAAE,IAA2B;IAChF,IAAI,CAAC,OAAO,CAAC,QAAQ;QAAE,OAAO,uCAAuC,CAAC;IAEtE,iGAAiG;IACjG,MAAM,MAAM,GAAG,OAAO,CAAC,IAAI,KAAK,MAAM,IAAI,OAAO,CAAC,IAAI,KAAK,YAAY,CAAC;IACxE,MAAM,GAAG,GAAG,CAAC,YAAY,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACpG,IAAI,CAAC,IAAI;QAAE,OAAO,GAAG,CAAC;IAEtB,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,GAAG,MAAM,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,GAAG,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAEtH,OAAO,GAAG,GAAG,MAAM,IAAI,IAAI,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC;AAC5C,CAAC"}
@@ -0,0 +1,8 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { Box, Panel, PromptInput, Text, useTheme } from '@jinion/tui';
3
+ export function SignInView({ signing, onType, onSend }) {
4
+ const theme = useTheme();
5
+ const { prompt } = signing;
6
+ return (_jsxs(Panel, { title: "Account", subtitle: signing.name, hints: prompt && !signing.sent ? [['Enter', 'send'], ['Esc', 'cancel']] : [['Esc', 'cancel']], children: [_jsxs(Text, { children: ["Signing in to ", _jsx(Text, { bold: true, children: signing.name }), ". Finish it in your browser."] }), signing.link && (_jsxs(Text, { children: [_jsx(Text, { color: theme.muted, children: "If the browser didn't open: " }), _jsx(Text, { color: theme.code, children: signing.link })] })), prompt && (_jsxs(Box, { flexDirection: "column", marginTop: 1, children: [prompt.problem && _jsx(Text, { color: theme.error, children: prompt.problem }), signing.sent ? (_jsx(Text, { color: theme.muted, children: "Checking the code\u2026" })) : (_jsxs(Box, { children: [_jsxs(Text, { color: theme.muted, children: [prompt.text, ": "] }), _jsx(PromptInput, { value: signing.code, onChange: onType, onSubmit: onSend, placeholder: "code", paddingX: 0 })] }))] }))] }));
7
+ }
8
+ //# sourceMappingURL=sign-in-view.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sign-in-view.js","sourceRoot":"","sources":["../../../src/panels/account/sign-in-view.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,GAAG,EAAE,KAAK,EAAE,WAAW,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAGtE,MAAM,UAAU,UAAU,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAgF;IAClI,MAAM,KAAK,GAAG,QAAQ,EAAE,CAAC;IAEzB,MAAM,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC;IAE3B,OAAO,CACL,MAAC,KAAK,IAAC,KAAK,EAAC,SAAS,EAAC,QAAQ,EAAE,OAAO,CAAC,IAAI,EAAE,KAAK,EAAE,MAAM,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,EAAE,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC,aAC1I,MAAC,IAAI,iCACW,KAAC,IAAI,IAAC,IAAI,kBAAE,OAAO,CAAC,IAAI,GAAQ,oCACzC,EACN,OAAO,CAAC,IAAI,IAAI,CACf,MAAC,IAAI,eACH,KAAC,IAAI,IAAC,KAAK,EAAE,KAAK,CAAC,KAAK,6CAAqC,EAC7D,KAAC,IAAI,IAAC,KAAK,EAAE,KAAK,CAAC,IAAI,YAAG,OAAO,CAAC,IAAI,GAAQ,IACzC,CACR,EACA,MAAM,IAAI,CACT,MAAC,GAAG,IAAC,aAAa,EAAC,QAAQ,EAAC,SAAS,EAAE,CAAC,aACrC,MAAM,CAAC,OAAO,IAAI,KAAC,IAAI,IAAC,KAAK,EAAE,KAAK,CAAC,KAAK,YAAG,MAAM,CAAC,OAAO,GAAQ,EACnE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CACd,KAAC,IAAI,IAAC,KAAK,EAAE,KAAK,CAAC,KAAK,wCAA2B,CACpD,CAAC,CAAC,CAAC,CACF,MAAC,GAAG,eACF,MAAC,IAAI,IAAC,KAAK,EAAE,KAAK,CAAC,KAAK,aAAG,MAAM,CAAC,IAAI,UAAU,EAChD,KAAC,WAAW,IAAC,KAAK,EAAE,OAAO,CAAC,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,WAAW,EAAC,MAAM,EAAC,QAAQ,EAAE,CAAC,GAAI,IACpG,CACP,IACG,CACP,IACK,CACT,CAAC;AACJ,CAAC"}
@@ -0,0 +1,46 @@
1
+ import { useEffect, useRef, useState } from 'react';
2
+ import { useApi } from '../../app/api.js';
3
+ /** Signing in runs in the core; its link and what to type come back as notifications while it waits. */
4
+ export function useSignIn(ended) {
5
+ const api = useApi();
6
+ const [signing, setSigning] = useState();
7
+ const current = useRef(undefined);
8
+ const update = (name, patch) => setSigning((now) => (now?.name === name ? { ...now, ...patch } : now));
9
+ useEffect(() => {
10
+ const stopLink = api.client.on('accounts/sign-in-link', ({ name, url }) => update(name, { link: url }));
11
+ const stopPrompt = api.client.on('accounts/sign-in-prompt', ({ name, prompt, problem }) => {
12
+ const answer = (text) => api.act(api.request('accounts/sign-in-answer', { name, text }));
13
+ update(name, { prompt: { text: prompt, answer, problem }, code: '', sent: false });
14
+ });
15
+ return () => {
16
+ stopLink();
17
+ stopPrompt();
18
+ if (current.current)
19
+ api.act(api.request('accounts/sign-in-cancel', { name: current.current }));
20
+ };
21
+ }, []);
22
+ const start = (name) => {
23
+ current.current = name;
24
+ setSigning({ name, code: '', sent: false });
25
+ void api.request('accounts/sign-in', { name }).then(({ signedIn }) => finish(name, signedIn), () => finish(name, false));
26
+ };
27
+ const finish = (name, signedIn) => {
28
+ if (current.current === name)
29
+ current.current = undefined;
30
+ setSigning(undefined);
31
+ ended(name, signedIn);
32
+ };
33
+ return {
34
+ signing,
35
+ start,
36
+ cancel: () => current.current && api.act(api.request('accounts/sign-in-cancel', { name: current.current })),
37
+ type: (code) => signing && update(signing.name, { code }),
38
+ send: (code) => {
39
+ if (!code.trim() || !signing?.prompt)
40
+ return;
41
+ signing.prompt.answer(code);
42
+ update(signing.name, { sent: true });
43
+ },
44
+ };
45
+ }
46
+ //# sourceMappingURL=use-sign-in.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-sign-in.js","sourceRoot":"","sources":["../../../src/panels/account/use-sign-in.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,55 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { Box, Panel, Text, useInput, usePanel, useTheme, Waffle } from '@jinion/tui';
3
+ import { useAtomValue } from 'jotai';
4
+ import { compact, percent } from '@jinion/core/lib/format';
5
+ import { useApi } from '../app/api.js';
6
+ import { agentAtom, modelNameAtom } from '../state/session.js';
7
+ import { useAsync } from '../ui/use-async.js';
8
+ export function ContextPanel() {
9
+ const api = useApi();
10
+ const theme = useTheme();
11
+ const { close } = usePanel();
12
+ const modelName = useAtomValue(modelNameAtom);
13
+ const { name, features } = useAtomValue(agentAtom);
14
+ const read = features.context;
15
+ const usage = useAsync(() => (read ? api.inSession('session/context', {}) : undefined), []);
16
+ const loaded = usage.state === 'done' ? usage.value : undefined;
17
+ useInput((_, key) => {
18
+ if (key.escape || key.return)
19
+ close();
20
+ });
21
+ return (_jsx(Panel, { title: "Context", subtitle: loaded && `${modelName} · ${compact(loaded.used)} of ${compact(loaded.window)} tokens · ${percent(loaded.used, loaded.window)}`, hints: [['Esc', 'close']], children: !read ? (_jsxs(Text, { color: theme.muted, children: [name, " doesn't say what fills its context."] })) : usage.state === 'failed' ? (_jsxs(Text, { color: theme.error, children: ["Couldn't ask ", name, " about its context: ", usage.error] })) : !loaded ? (_jsxs(Text, { color: theme.muted, children: ["Asking ", name, " what fills its context\u2026"] })) : (_jsx(ContextChart, { usage: loaded })) }));
22
+ }
23
+ function ContextChart({ usage }) {
24
+ const theme = useTheme();
25
+ const colorOf = colors(theme);
26
+ const shown = usage.categories.filter((category) => category.kind !== 'deferred' && category.tokens > 0);
27
+ const deferred = usage.categories.filter((category) => category.kind === 'deferred' && category.tokens > 0);
28
+ return (_jsxs(Box, { flexDirection: "column", children: [_jsx(Waffle, { legend: true, parts: shown.map((category) => ({
29
+ label: category.name,
30
+ value: category.tokens,
31
+ color: colorOf(category.name),
32
+ text: (_jsxs(Text, { color: theme.muted, children: [compact(category.tokens), " tokens \u00B7 ", percent(category.tokens, usage.window)] })),
33
+ })) }), _jsxs(Box, { marginTop: 1, flexDirection: "column", children: [_jsx(Text, { color: theme.muted, wrap: "truncate-end", children: usage.compactAt
34
+ ? `Compacts on its own at ${compact(usage.compactAt)} tokens (${percent(usage.compactAt, usage.window)}); /compact does it now, with a focus if you give one.`
35
+ : "It doesn't compact on its own; /compact does it, with a focus if you give one." }), deferred.length > 0 && (_jsxs(Text, { color: theme.muted, wrap: "truncate-end", children: ["Listed by name and loaded when used, so they take no room yet:", ' ', deferred.map((category) => `${category.name.replace(/ \(deferred\)$/, '')} ${compact(category.tokens)}`).join(' · ')] }))] })] }));
36
+ }
37
+ /** Claude Code's categories in the colors they keep here; any other takes the next of the rest. */
38
+ function colors(theme) {
39
+ const known = {
40
+ 'System prompt': theme.accent,
41
+ 'System tools': theme.code,
42
+ 'MCP server instructions': theme.syntax.variable,
43
+ 'MCP tools': theme.syntax.variable,
44
+ 'Custom agents': theme.status.cost,
45
+ 'Memory files': theme.success,
46
+ Skills: theme.heading,
47
+ Messages: theme.syntax.string,
48
+ 'Free space': theme.heat[0],
49
+ 'Autocompact buffer': theme.border,
50
+ };
51
+ const rest = [theme.warning, theme.link, theme.diff.added, theme.error];
52
+ let next = 0;
53
+ return (name) => known[name] ?? rest[next++ % rest.length];
54
+ }
55
+ //# sourceMappingURL=context.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context.js","sourceRoot":"","sources":["../../src/panels/context.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,48 @@
1
+ import { Fragment as _Fragment, jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { Box, ListRow, Panel, SelectList, Tabs, Text, useInput, useListNavigation, usePanel, useTheme, useWindowSize } from '@jinion/tui';
3
+ import { CHROME_ROWS } from './file-diff.js';
4
+ const TURNS_SHOWN = 3;
5
+ export function ChangeList({ views, active, onSwitch, onOpen }) {
6
+ const theme = useTheme();
7
+ const { close } = usePanel();
8
+ const { rows: height } = useWindowSize();
9
+ const view = views[active];
10
+ const rows = view.rows ?? [];
11
+ const groups = new Set(rows.map((row) => row.group?.label)).size;
12
+ const limit = Math.max(3, height - CHROME_ROWS - groups - (view.note ? 1 : 0));
13
+ const labelWidth = Math.min(60, Math.max(10, ...rows.map((row) => row.file.length)) + 2);
14
+ const [selected] = useListNavigation(rows.length, { wrap: false, pageSize: limit });
15
+ const hints = [
16
+ ...(views.length > 1 ? [['Left/Right', 'turn']] : []),
17
+ ['Enter', 'open'],
18
+ ['Up/Down', 'move'],
19
+ ['Esc', 'close'],
20
+ ];
21
+ useInput((_, key) => {
22
+ if (key.escape)
23
+ return close();
24
+ if (key.leftArrow)
25
+ return onSwitch(-1);
26
+ if (key.rightArrow)
27
+ return onSwitch(1);
28
+ const row = rows[selected];
29
+ if (key.return && row)
30
+ onOpen(row);
31
+ });
32
+ return (_jsx(Panel, { title: "Changes", subtitle: view.subtitle, header: views.length > 1 ? _jsx(ViewBar, { views: views, active: active }) : undefined, grow: true, hints: hints, children: !view.rows ? (_jsx(Text, { color: theme.muted, children: view.empty })) : (_jsxs(_Fragment, { children: [_jsx(SelectList, { items: rows, selected: selected, limit: limit, empty: view.empty, renderItem: (row, state) => (_jsxs(Box, { flexDirection: "column", children: [row.group && (state.first || rows[state.index - 1]?.group?.label !== row.group.label) && (_jsxs(Text, { children: [_jsx(Text, { bold: true, children: row.group.label }), row.group.aside && _jsxs(Text, { color: theme.muted, children: [" ", row.group.aside] })] })), _jsx(ListRow, { selected: state.selected, labelWidth: labelWidth, label: `${row.group ? ' ' : ''}${row.file}`, description: _jsx(ChangeStats, { row: row }), aside: row.agent ? 'agent' : undefined })] })) }), view.note && _jsx(Text, { color: theme.muted, children: view.note })] })) }));
33
+ }
34
+ function ViewBar({ views, active }) {
35
+ const theme = useTheme();
36
+ const turns = views.length - 1;
37
+ const first = Math.min(Math.max(1, active - 1), Math.max(1, turns - TURNS_SHOWN + 1));
38
+ const shown = views.slice(first, first + TURNS_SHOWN);
39
+ const before = first - 1;
40
+ const after = turns - (first - 1) - shown.length;
41
+ return (_jsxs(Text, { children: [_jsx(Tabs, { tabs: ['Current'], active: active === 0 ? 0 : -1 }), _jsx(Text, { color: theme.muted, children: before > 0 ? ` ‹ ${before} ` : ' ' }), _jsx(Tabs, { tabs: shown.map((view) => view.label), active: active - first }), after > 0 && _jsx(Text, { color: theme.muted, children: ` ${after} more ›` })] }));
42
+ }
43
+ function ChangeStats({ row }) {
44
+ const theme = useTheme();
45
+ const kind = row.kind === 'untracked' || row.kind === 'added' ? 'new' : row.kind === 'modified' ? undefined : row.kind;
46
+ return (_jsxs(Text, { children: [kind && _jsxs(Text, { color: theme.muted, children: [kind, " "] }), row.binary ? (_jsx(Text, { color: theme.muted, children: "binary" })) : (_jsxs(_Fragment, { children: [row.insertions > 0 && _jsxs(Text, { color: theme.diff.added, children: ["+", row.insertions, " "] }), row.deletions > 0 && _jsxs(Text, { color: theme.diff.removed, children: ["-", row.deletions] })] }))] }));
47
+ }
48
+ //# sourceMappingURL=change-list.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"change-list.js","sourceRoot":"","sources":["../../../src/panels/diff/change-list.tsx"],"names":[],"mappings":"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"}