@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.
- package/bin/jinion.js +4 -0
- package/dist/app/activity.js +50 -0
- package/dist/app/activity.js.map +1 -0
- package/dist/app/announcements.js +21 -0
- package/dist/app/announcements.js.map +1 -0
- package/dist/app/api.js +26 -0
- package/dist/app/api.js.map +1 -0
- package/dist/app/app.js +91 -0
- package/dist/app/app.js.map +1 -0
- package/dist/app/aside.js +52 -0
- package/dist/app/aside.js.map +1 -0
- package/dist/app/dialogs.js +43 -0
- package/dist/app/dialogs.js.map +1 -0
- package/dist/app/keys.js +79 -0
- package/dist/app/keys.js.map +1 -0
- package/dist/app/prompt-area.js +56 -0
- package/dist/app/prompt-area.js.map +1 -0
- package/dist/app/shortcuts.js +31 -0
- package/dist/app/shortcuts.js.map +1 -0
- package/dist/app/sidebar.js +50 -0
- package/dist/app/sidebar.js.map +1 -0
- package/dist/app/status-line.js +23 -0
- package/dist/app/status-line.js.map +1 -0
- package/dist/app/task-line.js +19 -0
- package/dist/app/task-line.js.map +1 -0
- package/dist/app/use-screen.js +24 -0
- package/dist/app/use-screen.js.map +1 -0
- package/dist/app/views.js +62 -0
- package/dist/app/views.js.map +1 -0
- package/dist/main.js +122 -0
- package/dist/main.js.map +1 -0
- package/dist/panels/account/account-picker.js +118 -0
- package/dist/panels/account/account-picker.js.map +1 -0
- package/dist/panels/account/describe.js +14 -0
- package/dist/panels/account/describe.js.map +1 -0
- package/dist/panels/account/sign-in-view.js +8 -0
- package/dist/panels/account/sign-in-view.js.map +1 -0
- package/dist/panels/account/use-sign-in.js +46 -0
- package/dist/panels/account/use-sign-in.js.map +1 -0
- package/dist/panels/context.js +55 -0
- package/dist/panels/context.js.map +1 -0
- package/dist/panels/diff/change-list.js +48 -0
- package/dist/panels/diff/change-list.js.map +1 -0
- package/dist/panels/diff/current-view.js +47 -0
- package/dist/panels/diff/current-view.js.map +1 -0
- package/dist/panels/diff/diff-panel.js +22 -0
- package/dist/panels/diff/diff-panel.js.map +1 -0
- package/dist/panels/diff/file-diff.js +19 -0
- package/dist/panels/diff/file-diff.js.map +1 -0
- package/dist/panels/diff/views.js +29 -0
- package/dist/panels/diff/views.js.map +1 -0
- package/dist/panels/feedback.js +67 -0
- package/dist/panels/feedback.js.map +1 -0
- package/dist/panels/help.js +79 -0
- package/dist/panels/help.js.map +1 -0
- package/dist/panels/mcp.js +129 -0
- package/dist/panels/mcp.js.map +1 -0
- package/dist/panels/memory.js +55 -0
- package/dist/panels/memory.js.map +1 -0
- package/dist/panels/mode.js +36 -0
- package/dist/panels/mode.js.map +1 -0
- package/dist/panels/model.js +20 -0
- package/dist/panels/model.js.map +1 -0
- package/dist/panels/onboarding/onboarding-panel.js +56 -0
- package/dist/panels/onboarding/onboarding-panel.js.map +1 -0
- package/dist/panels/onboarding/use-onboarding.js +65 -0
- package/dist/panels/onboarding/use-onboarding.js.map +1 -0
- package/dist/panels/profile.js +31 -0
- package/dist/panels/profile.js.map +1 -0
- package/dist/panels/resume.js +52 -0
- package/dist/panels/resume.js.map +1 -0
- package/dist/panels/rewind/changes.js +20 -0
- package/dist/panels/rewind/changes.js.map +1 -0
- package/dist/panels/rewind/rewind-panel.js +93 -0
- package/dist/panels/rewind/rewind-panel.js.map +1 -0
- package/dist/panels/sign-in/sign-in-panel.js +56 -0
- package/dist/panels/sign-in/sign-in-panel.js.map +1 -0
- package/dist/panels/sign-in/use-jinion-sign-in.js +69 -0
- package/dist/panels/sign-in/use-jinion-sign-in.js.map +1 -0
- package/dist/panels/statusline.js +94 -0
- package/dist/panels/statusline.js.map +1 -0
- package/dist/panels/tasks/output.js +23 -0
- package/dist/panels/tasks/output.js.map +1 -0
- package/dist/panels/tasks/task-output.js +29 -0
- package/dist/panels/tasks/task-output.js.map +1 -0
- package/dist/panels/tasks/tasks-panel.js +75 -0
- package/dist/panels/tasks/tasks-panel.js.map +1 -0
- package/dist/panels/terminal-setup.js +41 -0
- package/dist/panels/terminal-setup.js.map +1 -0
- package/dist/panels/usage/section.js +16 -0
- package/dist/panels/usage/section.js.map +1 -0
- package/dist/panels/usage/stats-view.js +52 -0
- package/dist/panels/usage/stats-view.js.map +1 -0
- package/dist/panels/usage/usage-panel.js +68 -0
- package/dist/panels/usage/usage-panel.js.map +1 -0
- package/dist/panels/usage/usage-view.js +51 -0
- package/dist/panels/usage/usage-view.js.map +1 -0
- package/dist/prompt/attachments.js +91 -0
- package/dist/prompt/attachments.js.map +1 -0
- package/dist/prompt/draft.js +24 -0
- package/dist/prompt/draft.js.map +1 -0
- package/dist/prompt/images.js +84 -0
- package/dist/prompt/images.js.map +1 -0
- package/dist/prompt/pasted-path.js +19 -0
- package/dist/prompt/pasted-path.js.map +1 -0
- package/dist/prompt/use-prompt.js +62 -0
- package/dist/prompt/use-prompt.js.map +1 -0
- package/dist/serve.js +38 -0
- package/dist/serve.js.map +1 -0
- package/dist/state/session.js +91 -0
- package/dist/state/session.js.map +1 -0
- package/dist/status/data.js +39 -0
- package/dist/status/data.js.map +1 -0
- package/dist/status/git.js +18 -0
- package/dist/status/git.js.map +1 -0
- package/dist/status/items.js +8 -0
- package/dist/status/items.js.map +1 -0
- package/dist/status/line.js +25 -0
- package/dist/status/line.js.map +1 -0
- package/dist/status/saved.js +8 -0
- package/dist/status/saved.js.map +1 -0
- package/dist/status/segment.js +2 -0
- package/dist/status/segment.js.map +1 -0
- package/dist/status/segments/conversation.js +71 -0
- package/dist/status/segments/conversation.js.map +1 -0
- package/dist/status/segments/git.js +33 -0
- package/dist/status/segments/git.js.map +1 -0
- package/dist/status/segments/identity.js +71 -0
- package/dist/status/segments/identity.js.map +1 -0
- package/dist/status/segments/index.js +27 -0
- package/dist/status/segments/index.js.map +1 -0
- package/dist/status/segments/usage.js +61 -0
- package/dist/status/segments/usage.js.map +1 -0
- package/dist/terminal/apple-terminal.js +68 -0
- package/dist/terminal/apple-terminal.js.map +1 -0
- package/dist/ui/banner.js +24 -0
- package/dist/ui/banner.js.map +1 -0
- package/dist/ui/entries/changes-card.js +27 -0
- package/dist/ui/entries/changes-card.js.map +1 -0
- package/dist/ui/entries/entry-view.js +82 -0
- package/dist/ui/entries/entry-view.js.map +1 -0
- package/dist/ui/entries/status-entries.js +33 -0
- package/dist/ui/entries/status-entries.js.map +1 -0
- package/dist/ui/entries/tools/agent-view.js +39 -0
- package/dist/ui/entries/tools/agent-view.js.map +1 -0
- package/dist/ui/entries/tools/mcp-view.js +10 -0
- package/dist/ui/entries/tools/mcp-view.js.map +1 -0
- package/dist/ui/entries/tools/result-preview.js +19 -0
- package/dist/ui/entries/tools/result-preview.js.map +1 -0
- package/dist/ui/entries/tools/search.js +42 -0
- package/dist/ui/entries/tools/search.js.map +1 -0
- package/dist/ui/entries/tools/shell-footer.js +36 -0
- package/dist/ui/entries/tools/shell-footer.js.map +1 -0
- package/dist/ui/entries/tools/tool-view.js +47 -0
- package/dist/ui/entries/tools/tool-view.js.map +1 -0
- package/dist/ui/entries/tools/web.js +41 -0
- package/dist/ui/entries/tools/web.js.map +1 -0
- package/dist/ui/modes.js +13 -0
- package/dist/ui/modes.js.map +1 -0
- package/dist/ui/task-marks.js +7 -0
- package/dist/ui/task-marks.js.map +1 -0
- package/dist/ui/use-async.js +17 -0
- package/dist/ui/use-async.js.map +1 -0
- package/dist/ui/use-pager.js +25 -0
- package/dist/ui/use-pager.js.map +1 -0
- package/dist/ui/use-project-files.js +18 -0
- package/dist/ui/use-project-files.js.map +1 -0
- package/dist/ui/use-workdir.js +9 -0
- package/dist/ui/use-workdir.js.map +1 -0
- package/package.json +34 -3
- 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
|
package/dist/main.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"main.js","sourceRoot":"","sources":["../src/main.tsx"],"names":[],"mappings":"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"}
|
|
@@ -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":"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"}
|
|
@@ -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":";AAAA,OAAO,EAAE,GAAG,EAAE,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,EAAc,MAAM,aAAa,CAAC;AACjG,OAAO,EAAE,YAAY,EAAE,MAAM,OAAO,CAAC;AAErC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AACvC,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAC/D,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAE9C,MAAM,UAAU,YAAY;IAC1B,MAAM,GAAG,GAAG,MAAM,EAAE,CAAC;IACrB,MAAM,KAAK,GAAG,QAAQ,EAAE,CAAC;IACzB,MAAM,EAAE,KAAK,EAAE,GAAG,QAAQ,EAAE,CAAC;IAC7B,MAAM,SAAS,GAAG,YAAY,CAAC,aAAa,CAAC,CAAC;IAC9C,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,YAAY,CAAC,SAAS,CAAC,CAAC;IAEnD,MAAM,IAAI,GAAG,QAAQ,CAAC,OAAO,CAAC;IAC9B,MAAM,KAAK,GAAG,QAAQ,CAAC,GAAG,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,iBAAiB,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,EAAE,EAAE,CAAC,CAAC;IAC5F,MAAM,MAAM,GAAG,KAAK,CAAC,KAAK,KAAK,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC;IAEhE,QAAQ,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,EAAE;QAClB,IAAI,GAAG,CAAC,MAAM,IAAI,GAAG,CAAC,MAAM;YAAE,KAAK,EAAE,CAAC;IACxC,CAAC,CAAC,CAAC;IAEH,OAAO,CACL,KAAC,KAAK,IACJ,KAAK,EAAC,SAAS,EACf,QAAQ,EACN,MAAM,IAAI,GAAG,SAAS,MAAM,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,aAAa,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,CAAC,EAAE,EAEjI,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC,YAExB,CAAC,IAAI,CAAC,CAAC,CAAC,CACP,MAAC,IAAI,IAAC,KAAK,EAAE,KAAK,CAAC,KAAK,aAAG,IAAI,4CAA4C,CAC5E,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,CAC7B,MAAC,IAAI,IAAC,KAAK,EAAE,KAAK,CAAC,KAAK,8BACR,IAAI,0BAAsB,KAAK,CAAC,KAAK,IAC9C,CACR,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CACZ,MAAC,IAAI,IAAC,KAAK,EAAE,KAAK,CAAC,KAAK,wBAAU,IAAI,qCAAgC,CACvE,CAAC,CAAC,CAAC,CACF,KAAC,YAAY,IAAC,KAAK,EAAE,MAAM,GAAI,CAChC,GACK,CACT,CAAC;AACJ,CAAC;AAED,SAAS,YAAY,CAAC,EAAE,KAAK,EAA2B;IACtD,MAAM,KAAK,GAAG,QAAQ,EAAE,CAAC;IAEzB,MAAM,OAAO,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;IAC9B,MAAM,KAAK,GAAG,KAAK,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,IAAI,KAAK,UAAU,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IACzG,MAAM,QAAQ,GAAG,KAAK,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,IAAI,KAAK,UAAU,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IAE5G,OAAO,CACL,MAAC,GAAG,IAAC,aAAa,EAAC,QAAQ,aACzB,KAAC,MAAM,IACL,MAAM,QACN,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;oBAC9B,KAAK,EAAE,QAAQ,CAAC,IAAI;oBACpB,KAAK,EAAE,QAAQ,CAAC,MAAM;oBACtB,KAAK,EAAE,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC;oBAC7B,IAAI,EAAE,CACJ,MAAC,IAAI,IAAC,KAAK,EAAE,KAAK,CAAC,KAAK,aACrB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,qBAAY,OAAO,CAAC,QAAQ,CAAC,MAAM,EAAE,KAAK,CAAC,MAAM,CAAC,IACtE,CACR;iBACF,CAAC,CAAC,GACH,EACF,MAAC,GAAG,IAAC,SAAS,EAAE,CAAC,EAAE,aAAa,EAAC,QAAQ,aACvC,KAAC,IAAI,IAAC,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,IAAI,EAAC,cAAc,YAC1C,KAAK,CAAC,SAAS;4BACd,CAAC,CAAC,0BAA0B,OAAO,CAAC,KAAK,CAAC,SAAS,CAAC,YAAY,OAAO,CAAC,KAAK,CAAC,SAAS,EAAE,KAAK,CAAC,MAAM,CAAC,wDAAwD;4BAC9J,CAAC,CAAC,gFAAgF,GAC/E,EACN,QAAQ,CAAC,MAAM,GAAG,CAAC,IAAI,CACtB,MAAC,IAAI,IAAC,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,IAAI,EAAC,cAAc,+EACoB,GAAG,EACjE,QAAQ,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,GAAG,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,gBAAgB,EAAE,EAAE,CAAC,IAAI,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,IAChH,CACR,IACG,IACF,CACP,CAAC;AACJ,CAAC;AAED,mGAAmG;AACnG,SAAS,MAAM,CAAC,KAAY;IAC1B,MAAM,KAAK,GAA2B;QACpC,eAAe,EAAE,KAAK,CAAC,MAAM;QAC7B,cAAc,EAAE,KAAK,CAAC,IAAI;QAC1B,yBAAyB,EAAE,KAAK,CAAC,MAAM,CAAC,QAAQ;QAChD,WAAW,EAAE,KAAK,CAAC,MAAM,CAAC,QAAQ;QAClC,eAAe,EAAE,KAAK,CAAC,MAAM,CAAC,IAAI;QAClC,cAAc,EAAE,KAAK,CAAC,OAAO;QAC7B,MAAM,EAAE,KAAK,CAAC,OAAO;QACrB,QAAQ,EAAE,KAAK,CAAC,MAAM,CAAC,MAAM;QAC7B,YAAY,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;QAC3B,oBAAoB,EAAE,KAAK,CAAC,MAAM;KACnC,CAAC;IAEF,MAAM,IAAI,GAAG,CAAC,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC;IACxE,IAAI,IAAI,GAAG,CAAC,CAAC;IAEb,OAAO,CAAC,IAAY,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,EAAE,GAAG,IAAI,CAAC,MAAM,CAAE,CAAC;AACtE,CAAC"}
|
|
@@ -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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"}
|