@jinion/cli 0.0.0-stage → 0.4.524
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/CHANGELOG.md +249 -0
- package/bin/jinion.js +15 -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 +99 -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/claude-notes.js +19 -0
- package/dist/app/claude-notes.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/release-notes.js +20 -0
- package/dist/app/release-notes.js.map +1 -0
- package/dist/app/settings-file.js +7 -0
- package/dist/app/settings-file.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 +29 -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/updates.js +17 -0
- package/dist/app/updates.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 +68 -0
- package/dist/app/views.js.map +1 -0
- package/dist/main.js +124 -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/map.js +80 -0
- package/dist/panels/map.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/claude-setup-panel.js +68 -0
- package/dist/panels/onboarding/claude-setup-panel.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/release-notes.js +60 -0
- package/dist/panels/release-notes.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 +93 -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 +65 -0
- package/dist/terminal/apple-terminal.js.map +1 -0
- package/dist/ui/banner.js +36 -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-map-overview.js +27 -0
- package/dist/ui/use-map-overview.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/dist/update/updater.js +68 -0
- package/dist/update/updater.js.map +1 -0
- package/dist/update/versions.js +31 -0
- package/dist/update/versions.js.map +1 -0
- package/package.json +35 -3
- package/README.md +0 -3
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { printable, StatusMark, Text, useHovered, useTheme, useView } from '@jinion/tui';
|
|
3
|
+
import { ToolLine } from '@jinion/tui/chat';
|
|
4
|
+
import { useAtomValue } from 'jotai';
|
|
5
|
+
import { tasksAtom } from '../../../state/session.js';
|
|
6
|
+
import { plural, preciseSeconds } from '@jinion/core/lib/format';
|
|
7
|
+
import { callSummary } from '@jinion/core/agent/call-summary';
|
|
8
|
+
const LIVE_CALLS = 6;
|
|
9
|
+
export function AgentView({ entry }) {
|
|
10
|
+
const theme = useTheme();
|
|
11
|
+
const { expanded } = useView();
|
|
12
|
+
const hovered = useHovered();
|
|
13
|
+
const tasks = useAtomValue(tasksAtom);
|
|
14
|
+
if (entry.run.name !== 'agent')
|
|
15
|
+
return null;
|
|
16
|
+
// Sent to the background, it works on after its call ended, as its task says.
|
|
17
|
+
const background = entry.run.result?.background;
|
|
18
|
+
const task = background ? tasks.find((candidate) => candidate.id === background) : undefined;
|
|
19
|
+
const status = task?.status === 'running' ? 'running' : entry.status;
|
|
20
|
+
const calls = entry.children ?? [];
|
|
21
|
+
let tree;
|
|
22
|
+
if (status === 'running' || expanded) {
|
|
23
|
+
const shown = expanded ? calls : calls.slice(-LIVE_CALLS);
|
|
24
|
+
tree = shown.map((call) => ({ label: _jsx(CallLine, { call: call }) }));
|
|
25
|
+
if (shown.length < calls.length)
|
|
26
|
+
tree.unshift({ label: _jsxs(Text, { color: theme.muted, children: ["\u2026 ", calls.length - shown.length, " earlier"] }) });
|
|
27
|
+
}
|
|
28
|
+
else {
|
|
29
|
+
const took = preciseSeconds((task?.endedAt ?? entry.endedAt ?? Date.now()) - entry.startedAt);
|
|
30
|
+
tree = [{ label: _jsx(Text, { color: hovered ? undefined : theme.muted, children: `${plural(calls.length, 'tool call')} · ${took}` }) }];
|
|
31
|
+
}
|
|
32
|
+
return (_jsx(ToolLine, { status: status, name: "Agent", detail: _jsxs(Text, { children: [_jsx(Text, { color: theme.muted, children: "\u00B7 " }), entry.run.input.description, background && _jsx(Text, { color: theme.muted, children: " \u00B7 in the background" })] }), tree: tree }));
|
|
33
|
+
}
|
|
34
|
+
function CallLine({ call }) {
|
|
35
|
+
const theme = useTheme();
|
|
36
|
+
const [name, detail] = callSummary(call.run);
|
|
37
|
+
return (_jsxs(Text, { wrap: "truncate-end", children: [_jsx(StatusMark, { status: call.status }), " ", _jsx(Text, { bold: true, children: name }), detail && _jsxs(Text, { color: theme.muted, children: [" ", printable(detail)] })] }));
|
|
38
|
+
}
|
|
39
|
+
//# sourceMappingURL=agent-view.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent-view.js","sourceRoot":"","sources":["../../../../src/ui/entries/tools/agent-view.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { printable, Text, useTheme } from '@jinion/tui';
|
|
3
|
+
import { ToolLine } from '@jinion/tui/chat';
|
|
4
|
+
import { previewTree } from './result-preview.js';
|
|
5
|
+
export function McpView({ run, status, output }) {
|
|
6
|
+
const theme = useTheme();
|
|
7
|
+
const { server, tool, arguments: values } = run.input;
|
|
8
|
+
return (_jsx(ToolLine, { status: status, name: `${server}:${tool}`, detail: _jsxs(Text, { color: theme.muted, children: ["(MCP)", values && ` ${printable(values)}`] }), tree: previewTree(output) }));
|
|
9
|
+
}
|
|
10
|
+
//# sourceMappingURL=mcp-view.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp-view.js","sourceRoot":"","sources":["../../../../src/ui/entries/tools/mcp-view.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,QAAQ,EAAe,MAAM,aAAa,CAAC;AACrE,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAE5C,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAElD,MAAM,UAAU,OAAO,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,EAAgF;IAC3H,MAAM,KAAK,GAAG,QAAQ,EAAE,CAAC;IAEzB,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,GAAG,GAAG,CAAC,KAAK,CAAC;IAEtD,OAAO,CACL,KAAC,QAAQ,IACP,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,GAAG,MAAM,IAAI,IAAI,EAAE,EACzB,MAAM,EACJ,MAAC,IAAI,IAAC,KAAK,EAAE,KAAK,CAAC,KAAK,sBAChB,MAAM,IAAI,IAAI,SAAS,CAAC,MAAM,CAAC,EAAE,IAClC,EAET,IAAI,EAAE,WAAW,CAAC,MAAM,CAAC,GACzB,CACH,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { Box, ExpandHint, printable, Text, useView } from '@jinion/tui';
|
|
3
|
+
import { plural } from '@jinion/core/lib/format';
|
|
4
|
+
const PREVIEW_LINES = 3;
|
|
5
|
+
// Past this a line may not fit the screen, and is cut until the result is opened.
|
|
6
|
+
const LONG_LINE = 100;
|
|
7
|
+
export const opensFurther = (lines) => lines.length > PREVIEW_LINES || lines.slice(0, PREVIEW_LINES).some((line) => line.length > LONG_LINE);
|
|
8
|
+
export function previewTree(lines) {
|
|
9
|
+
if (lines.length === 0)
|
|
10
|
+
return [];
|
|
11
|
+
return [{ label: _jsx(ResultPreview, { lines: lines }) }];
|
|
12
|
+
}
|
|
13
|
+
function ResultPreview({ lines }) {
|
|
14
|
+
const { expanded } = useView();
|
|
15
|
+
const shown = expanded ? lines : lines.slice(0, PREVIEW_LINES);
|
|
16
|
+
const hidden = lines.length - shown.length;
|
|
17
|
+
return (_jsxs(Box, { flexDirection: "column", children: [shown.map((line, index) => (_jsx(Text, { wrap: expanded ? 'wrap' : 'truncate-end', children: printable(line) || ' ' }, index))), hidden > 0 && _jsx(ExpandHint, { children: `+${plural(hidden, 'line')}` })] }));
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=result-preview.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"result-preview.js","sourceRoot":"","sources":["../../../../src/ui/entries/tools/result-preview.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,GAAG,EAAE,UAAU,EAAE,SAAS,EAAE,IAAI,EAAE,OAAO,EAAiB,MAAM,aAAa,CAAC;AACvF,OAAO,EAAE,MAAM,EAAE,MAAM,yBAAyB,CAAC;AAEjD,MAAM,aAAa,GAAG,CAAC,CAAC;AAExB,kFAAkF;AAClF,MAAM,SAAS,GAAG,GAAG,CAAC;AAEtB,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,KAAe,EAAE,EAAE,CAC9C,KAAK,CAAC,MAAM,GAAG,aAAa,IAAI,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,aAAa,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC;AAExG,MAAM,UAAU,WAAW,CAAC,KAAe;IACzC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IAElC,OAAO,CAAC,EAAE,KAAK,EAAE,KAAC,aAAa,IAAC,KAAK,EAAE,KAAK,GAAI,EAAE,CAAC,CAAC;AACtD,CAAC;AAED,SAAS,aAAa,CAAC,EAAE,KAAK,EAAuB;IACnD,MAAM,EAAE,QAAQ,EAAE,GAAG,OAAO,EAAE,CAAC;IAE/B,MAAM,KAAK,GAAG,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,aAAa,CAAC,CAAC;IAC/D,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC;IAE3C,OAAO,CACL,MAAC,GAAG,IAAC,aAAa,EAAC,QAAQ,aACxB,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,CAC1B,KAAC,IAAI,IAAa,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,cAAc,YACvD,SAAS,CAAC,IAAI,CAAC,IAAI,GAAG,IADd,KAAK,CAET,CACR,CAAC,EACD,MAAM,GAAG,CAAC,IAAI,KAAC,UAAU,cAAE,IAAI,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,GAAc,IAClE,CACP,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { extension, printable, Text, useTheme } from '@jinion/tui';
|
|
3
|
+
import { ToolLine } from '@jinion/tui/chat';
|
|
4
|
+
import { shownPath } from '@jinion/core/attachments/paths';
|
|
5
|
+
import { plural } from '@jinion/core/lib/format';
|
|
6
|
+
const MAX_TREE_ITEMS = 6;
|
|
7
|
+
export function ReadView({ run, status }) {
|
|
8
|
+
const { files } = run.input;
|
|
9
|
+
if (files.length === 1)
|
|
10
|
+
return _jsx(ToolLine, { status: status, name: "Read", detail: _jsx(FileLabel, { file: files[0] }) });
|
|
11
|
+
return _jsx(ToolLine, { status: status, name: `Read (${files.length})`, tree: files.map((file) => ({ label: _jsx(FileLabel, { file: file }) })) });
|
|
12
|
+
}
|
|
13
|
+
export function GrepView({ run, status }) {
|
|
14
|
+
const theme = useTheme();
|
|
15
|
+
const matches = run.result?.matches ?? [];
|
|
16
|
+
const files = run.result?.files ?? [...new Set(matches.map((match) => match.file))];
|
|
17
|
+
const tree = files.map((file) => ({
|
|
18
|
+
label: _jsx(Text, { color: theme.code, children: file }),
|
|
19
|
+
children: matches
|
|
20
|
+
.filter((match) => match.file === file)
|
|
21
|
+
.map((match) => ({
|
|
22
|
+
label: (_jsxs(Text, { children: [_jsxs(Text, { color: theme.muted, children: [match.line, "|"] }), printable(match.text)] })),
|
|
23
|
+
})),
|
|
24
|
+
}));
|
|
25
|
+
return (_jsx(ToolLine, { status: status, name: "Grep:", detail: _jsxs(Text, { children: [_jsx(Text, { color: theme.code, children: run.input.pattern }), run.result && (_jsxs(Text, { color: theme.muted, children: [' ', run.result.files ? '' : `${plural(matches.length, 'match', 'matches')} - `, plural(files.length, 'file'), " - in ", run.input.path] }))] }), tree: tree }));
|
|
26
|
+
}
|
|
27
|
+
export function GlobView({ run, status }) {
|
|
28
|
+
const theme = useTheme();
|
|
29
|
+
const files = run.result?.files ?? [];
|
|
30
|
+
const tree = files.slice(0, MAX_TREE_ITEMS).map((file) => ({
|
|
31
|
+
label: (_jsxs(Text, { children: [_jsx(Text, { color: theme.muted, children: extension(file) ?? '-' }), " ", file] })),
|
|
32
|
+
}));
|
|
33
|
+
if (files.length > MAX_TREE_ITEMS) {
|
|
34
|
+
tree.push({ label: _jsxs(Text, { color: theme.muted, children: ["\u2026 ", files.length - MAX_TREE_ITEMS, " more files"] }) });
|
|
35
|
+
}
|
|
36
|
+
return (_jsx(ToolLine, { status: status, name: "Glob:", detail: _jsxs(Text, { children: [_jsx(Text, { color: theme.code, children: run.input.pattern }), run.result && _jsxs(Text, { color: theme.muted, children: [" ", plural(files.length, 'file')] })] }), tree: tree }));
|
|
37
|
+
}
|
|
38
|
+
function FileLabel({ file }) {
|
|
39
|
+
const theme = useTheme();
|
|
40
|
+
return (_jsxs(Text, { color: theme.code, children: [shownPath(file.path), file.lines && _jsxs(Text, { color: theme.muted, children: [":", file.lines] })] }));
|
|
41
|
+
}
|
|
42
|
+
//# sourceMappingURL=search.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"search.js","sourceRoot":"","sources":["../../../../src/ui/entries/tools/search.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { Fragment as _Fragment, jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { useAnimation } from '@jinion/tui';
|
|
3
|
+
import { useAtomValue } from 'jotai';
|
|
4
|
+
import { tasksAtom } from '../../../state/session.js';
|
|
5
|
+
import { preciseSeconds } from '@jinion/core/lib/format';
|
|
6
|
+
export function ShellFooter({ entry }) {
|
|
7
|
+
const running = entry.status === 'running';
|
|
8
|
+
useAnimation({ interval: 100, isActive: running });
|
|
9
|
+
if (entry.run.name !== 'bash')
|
|
10
|
+
return null;
|
|
11
|
+
if (entry.run.result?.background)
|
|
12
|
+
return _jsx(BackgroundState, { id: entry.run.result.background });
|
|
13
|
+
const { timeoutMs } = entry.run.input;
|
|
14
|
+
const timeout = timeoutMs === undefined ? '' : ` | Timeout: ${preciseSeconds(timeoutMs)}`;
|
|
15
|
+
if (running && entry.waiting)
|
|
16
|
+
return _jsxs(_Fragment, { children: ["[Waiting for your approval", timeout, "]"] });
|
|
17
|
+
// A command asked about runs from when it was allowed.
|
|
18
|
+
const started = entry.approvedAt ?? entry.startedAt;
|
|
19
|
+
if (running)
|
|
20
|
+
return _jsxs(_Fragment, { children: ["[Running: ", preciseSeconds(Date.now() - started), timeout, "]"] });
|
|
21
|
+
const took = entry.approvedAt
|
|
22
|
+
? (entry.endedAt ?? Date.now()) - entry.approvedAt
|
|
23
|
+
: (entry.run.result?.wallMs ?? (entry.endedAt ?? Date.now()) - started);
|
|
24
|
+
const wall = `Wall: ${preciseSeconds(took)}`;
|
|
25
|
+
if (entry.status === 'cancelled')
|
|
26
|
+
return _jsxs(_Fragment, { children: ["[Cancelled | ", wall, "]"] });
|
|
27
|
+
const exitCode = entry.run.result?.exitCode;
|
|
28
|
+
return (_jsxs(_Fragment, { children: ["[", exitCode ? `Exit: ${exitCode} | ` : '', wall, timeout, "]"] }));
|
|
29
|
+
}
|
|
30
|
+
function BackgroundState({ id }) {
|
|
31
|
+
const task = useAtomValue(tasksAtom).find((candidate) => candidate.id === id);
|
|
32
|
+
if (!task || task.status === 'running')
|
|
33
|
+
return _jsx(_Fragment, { children: "[In the background | ctrl+t to see it]" });
|
|
34
|
+
return _jsxs(_Fragment, { children: ["[In the background | ", task.status === 'completed' ? 'done' : task.status, "]"] });
|
|
35
|
+
}
|
|
36
|
+
//# sourceMappingURL=shell-footer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shell-footer.js","sourceRoot":"","sources":["../../../../src/ui/entries/tools/shell-footer.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAAE,YAAY,EAAE,MAAM,OAAO,CAAC;AACrC,OAAO,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAC;AAEtD,OAAO,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAEzD,MAAM,UAAU,WAAW,CAAC,EAAE,KAAK,EAAwB;IACzD,MAAM,OAAO,GAAG,KAAK,CAAC,MAAM,KAAK,SAAS,CAAC;IAE3C,YAAY,CAAC,EAAE,QAAQ,EAAE,GAAG,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC;IAEnD,IAAI,KAAK,CAAC,GAAG,CAAC,IAAI,KAAK,MAAM;QAAE,OAAO,IAAI,CAAC;IAC3C,IAAI,KAAK,CAAC,GAAG,CAAC,MAAM,EAAE,UAAU;QAAE,OAAO,KAAC,eAAe,IAAC,EAAE,EAAE,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,UAAU,GAAI,CAAC;IAE9F,MAAM,EAAE,SAAS,EAAE,GAAG,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC;IACtC,MAAM,OAAO,GAAG,SAAS,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,eAAe,cAAc,CAAC,SAAS,CAAC,EAAE,CAAC;IAC1F,IAAI,OAAO,IAAI,KAAK,CAAC,OAAO;QAAE,OAAO,4DAA6B,OAAO,SAAK,CAAC;IAE/E,uDAAuD;IACvD,MAAM,OAAO,GAAG,KAAK,CAAC,UAAU,IAAI,KAAK,CAAC,SAAS,CAAC;IACpD,IAAI,OAAO;QAAE,OAAO,4CAAa,cAAc,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,OAAO,CAAC,EAAE,OAAO,SAAK,CAAC;IAEpF,MAAM,IAAI,GAAG,KAAK,CAAC,UAAU;QAC3B,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,IAAI,IAAI,CAAC,GAAG,EAAE,CAAC,GAAG,KAAK,CAAC,UAAU;QAClD,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,IAAI,CAAC,KAAK,CAAC,OAAO,IAAI,IAAI,CAAC,GAAG,EAAE,CAAC,GAAG,OAAO,CAAC,CAAC;IAE1E,MAAM,IAAI,GAAG,SAAS,cAAc,CAAC,IAAI,CAAC,EAAE,CAAC;IAC7C,IAAI,KAAK,CAAC,MAAM,KAAK,WAAW;QAAE,OAAO,+CAAgB,IAAI,SAAK,CAAC;IAEnE,MAAM,QAAQ,GAAG,KAAK,CAAC,GAAG,CAAC,MAAM,EAAE,QAAQ,CAAC;IAE5C,OAAO,CACL,mCACI,QAAQ,CAAC,CAAC,CAAC,SAAS,QAAQ,KAAK,CAAC,CAAC,CAAC,EAAE,EACvC,IAAI,EACJ,OAAO,SACP,CACJ,CAAC;AACJ,CAAC;AAED,SAAS,eAAe,CAAC,EAAE,EAAE,EAAkB;IAC7C,MAAM,IAAI,GAAG,YAAY,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;IAC9E,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,MAAM,KAAK,SAAS;QAAE,OAAO,uEAA2C,CAAC;IAE3F,OAAO,uDAAwB,IAAI,CAAC,MAAM,KAAK,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,SAAK,CAAC;AACzF,CAAC"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import { Frame, Markdown, printable, Text, toneOf, useTheme, useView } from '@jinion/tui';
|
|
3
|
+
import { AskResult, EditBlock, ShellBlock, TodoBlock, ToolLine } from '@jinion/tui/chat';
|
|
4
|
+
import { AgentView } from './agent-view.js';
|
|
5
|
+
import { MEMORY_VERBS } from '@jinion/core/agent/call-summary';
|
|
6
|
+
import { McpView } from './mcp-view.js';
|
|
7
|
+
import { GlobView, GrepView, ReadView } from './search.js';
|
|
8
|
+
import { ShellFooter } from './shell-footer.js';
|
|
9
|
+
import { FetchView, SearchView } from './web.js';
|
|
10
|
+
export function ToolView({ entry, live }) {
|
|
11
|
+
const theme = useTheme();
|
|
12
|
+
const { expanded } = useView();
|
|
13
|
+
const { run, status } = entry;
|
|
14
|
+
switch (run.name) {
|
|
15
|
+
case 'read':
|
|
16
|
+
return _jsx(ReadView, { run: run, status: status });
|
|
17
|
+
case 'grep':
|
|
18
|
+
return _jsx(GrepView, { run: run, status: status });
|
|
19
|
+
case 'glob':
|
|
20
|
+
return _jsx(GlobView, { run: run, status: status });
|
|
21
|
+
case 'bash':
|
|
22
|
+
return (_jsx(ShellBlock, { command: run.input.command, output: entry.output, status: status, footer: _jsx(ShellFooter, { entry: entry }),
|
|
23
|
+
// Open to follow while the turn runs, down to its line count once it is over.
|
|
24
|
+
folded: !live && !expanded && status !== 'running' }));
|
|
25
|
+
case 'edit':
|
|
26
|
+
return _jsx(EditBlock, { path: run.input.path, patch: run.result?.patch ?? run.input.patch, status: status, verb: run.input.created ? 'Write' : 'Edit' });
|
|
27
|
+
case 'todo':
|
|
28
|
+
return _jsx(TodoBlock, { groups: run.input.groups, status: status });
|
|
29
|
+
case 'ask':
|
|
30
|
+
return _jsx(AskResult, { questions: run.input.questions, answers: run.result?.answers ?? [], cancelled: status === 'cancelled' });
|
|
31
|
+
case 'memory':
|
|
32
|
+
return _jsx(ToolLine, { status: status, name: MEMORY_VERBS[run.input.action], detail: _jsx(Text, { color: theme.muted, children: printable(run.input.detail) }) });
|
|
33
|
+
case 'plan':
|
|
34
|
+
return (_jsx(Frame, { title: _jsx(Text, { bold: true, children: "Plan" }), tone: toneOf(status), lead: 1, children: _jsx(Markdown, { text: run.input.plan }) }));
|
|
35
|
+
case 'fetch':
|
|
36
|
+
return _jsx(FetchView, { run: run, status: status, output: entry.output });
|
|
37
|
+
case 'search':
|
|
38
|
+
return _jsx(SearchView, { run: run, status: status });
|
|
39
|
+
case 'mcp':
|
|
40
|
+
return _jsx(McpView, { run: run, status: status, output: entry.output });
|
|
41
|
+
case 'other':
|
|
42
|
+
return (_jsx(ToolLine, { status: status, name: run.input.title, detail: run.input.detail && _jsx(Text, { color: theme.muted, children: printable(run.input.detail) }) }));
|
|
43
|
+
case 'agent':
|
|
44
|
+
return _jsx(AgentView, { entry: entry });
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
//# sourceMappingURL=tool-view.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tool-view.js","sourceRoot":"","sources":["../../../../src/ui/entries/tools/tool-view.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAC1F,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,UAAU,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAEzF,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAE,YAAY,EAAE,MAAM,iCAAiC,CAAC;AAC/D,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AACxC,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAC3D,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAEjD,MAAM,UAAU,QAAQ,CAAC,EAAE,KAAK,EAAE,IAAI,EAAuC;IAC3E,MAAM,KAAK,GAAG,QAAQ,EAAE,CAAC;IACzB,MAAM,EAAE,QAAQ,EAAE,GAAG,OAAO,EAAE,CAAC;IAE/B,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,KAAK,CAAC;IAE9B,QAAQ,GAAG,CAAC,IAAI,EAAE,CAAC;QACjB,KAAK,MAAM;YACT,OAAO,KAAC,QAAQ,IAAC,GAAG,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,GAAI,CAAC;QAEhD,KAAK,MAAM;YACT,OAAO,KAAC,QAAQ,IAAC,GAAG,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,GAAI,CAAC;QAEhD,KAAK,MAAM;YACT,OAAO,KAAC,QAAQ,IAAC,GAAG,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,GAAI,CAAC;QAEhD,KAAK,MAAM;YACT,OAAO,CACL,KAAC,UAAU,IACT,OAAO,EAAE,GAAG,CAAC,KAAK,CAAC,OAAO,EAC1B,MAAM,EAAE,KAAK,CAAC,MAAM,EACpB,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,KAAC,WAAW,IAAC,KAAK,EAAE,KAAK,GAAI;gBACrC,8EAA8E;gBAC9E,MAAM,EAAE,CAAC,IAAI,IAAI,CAAC,QAAQ,IAAI,MAAM,KAAK,SAAS,GAClD,CACH,CAAC;QAEJ,KAAK,MAAM;YACT,OAAO,KAAC,SAAS,IAAC,IAAI,EAAE,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,KAAK,IAAI,GAAG,CAAC,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,GAAI,CAAC;QAEtJ,KAAK,MAAM;YACT,OAAO,KAAC,SAAS,IAAC,MAAM,EAAE,GAAG,CAAC,KAAK,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,GAAI,CAAC;QAEjE,KAAK,KAAK;YACR,OAAO,KAAC,SAAS,IAAC,SAAS,EAAE,GAAG,CAAC,KAAK,CAAC,SAAS,EAAE,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,OAAO,IAAI,EAAE,EAAE,SAAS,EAAE,MAAM,KAAK,WAAW,GAAI,CAAC;QAE9H,KAAK,QAAQ;YACX,OAAO,KAAC,QAAQ,IAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,YAAY,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,KAAC,IAAI,IAAC,KAAK,EAAE,KAAK,CAAC,KAAK,YAAG,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,GAAQ,GAAI,CAAC;QAEpJ,KAAK,MAAM;YACT,OAAO,CACL,KAAC,KAAK,IAAC,KAAK,EAAE,KAAC,IAAI,IAAC,IAAI,2BAAY,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,CAAC,YACjE,KAAC,QAAQ,IAAC,IAAI,EAAE,GAAG,CAAC,KAAK,CAAC,IAAI,GAAI,GAC5B,CACT,CAAC;QAEJ,KAAK,OAAO;YACV,OAAO,KAAC,SAAS,IAAC,GAAG,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,GAAI,CAAC;QAEvE,KAAK,QAAQ;YACX,OAAO,KAAC,UAAU,IAAC,GAAG,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,GAAI,CAAC;QAElD,KAAK,KAAK;YACR,OAAO,KAAC,OAAO,IAAC,GAAG,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,GAAI,CAAC;QAErE,KAAK,OAAO;YACV,OAAO,CACL,KAAC,QAAQ,IACP,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,GAAG,CAAC,KAAK,CAAC,KAAK,EACrB,MAAM,EAAE,GAAG,CAAC,KAAK,CAAC,MAAM,IAAI,KAAC,IAAI,IAAC,KAAK,EAAE,KAAK,CAAC,KAAK,YAAG,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,GAAQ,GAC1F,CACH,CAAC;QAEJ,KAAK,OAAO;YACV,OAAO,KAAC,SAAS,IAAC,KAAK,EAAE,KAAK,GAAI,CAAC;IACvC,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { ExpandHint, printable, Text, useTheme, useView } from '@jinion/tui';
|
|
3
|
+
import { ToolLine } from '@jinion/tui/chat';
|
|
4
|
+
import { bytes, elapsed, plural } from '@jinion/core/lib/format';
|
|
5
|
+
import { previewTree } from './result-preview.js';
|
|
6
|
+
export const PREVIEW_HITS = 5;
|
|
7
|
+
export function FetchView({ run, status, output }) {
|
|
8
|
+
const theme = useTheme();
|
|
9
|
+
const { bytes: size, code, codeText } = run.result ?? {};
|
|
10
|
+
const received = [size === undefined ? '' : bytes(size), [code, codeText].filter(Boolean).join(' ')].filter(Boolean).join(' - ');
|
|
11
|
+
return (_jsx(ToolLine, { status: status, name: "Fetch:", detail: _jsxs(Text, { children: [_jsx(Text, { color: theme.code, children: printable(run.input.url) }), received && _jsxs(Text, { color: theme.muted, children: [" ", received] })] }), tree: previewTree(output) }));
|
|
12
|
+
}
|
|
13
|
+
export function SearchView({ run, status }) {
|
|
14
|
+
const theme = useTheme();
|
|
15
|
+
const { expanded } = useView();
|
|
16
|
+
const hits = run.result?.hits ?? [];
|
|
17
|
+
const shown = expanded ? hits : hits.slice(0, PREVIEW_HITS);
|
|
18
|
+
const tree = shown.map((hit) => ({
|
|
19
|
+
label: (_jsxs(Text, { wrap: "truncate-end", children: [printable(hit.title || hit.url), " ", _jsx(Text, { color: theme.muted, children: host(hit.url) })] })),
|
|
20
|
+
}));
|
|
21
|
+
if (hits.length > shown.length)
|
|
22
|
+
tree.push({ label: _jsx(ExpandHint, { children: `+${plural(hits.length - shown.length, 'result')}` }) });
|
|
23
|
+
return (_jsx(ToolLine, { status: status, name: "Web Search:", detail: _jsxs(Text, { children: [_jsxs(Text, { color: theme.code, children: ["\"", printable(run.input.query), "\""] }), run.result && _jsxs(Text, { color: theme.muted, children: [" ", searchSummary(run.result)] })] }), tree: tree }));
|
|
24
|
+
}
|
|
25
|
+
function searchSummary({ hits, searches, durationMs }) {
|
|
26
|
+
const parts = [plural(hits.length, 'result')];
|
|
27
|
+
if (searches !== undefined && searches > 1)
|
|
28
|
+
parts.unshift(plural(searches, 'search', 'searches'));
|
|
29
|
+
if (durationMs !== undefined)
|
|
30
|
+
parts.push(elapsed(durationMs));
|
|
31
|
+
return parts.join(' - ');
|
|
32
|
+
}
|
|
33
|
+
function host(url) {
|
|
34
|
+
try {
|
|
35
|
+
return new URL(url).hostname.replace(/^www\./, '');
|
|
36
|
+
}
|
|
37
|
+
catch {
|
|
38
|
+
return url;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
//# sourceMappingURL=web.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"web.js","sourceRoot":"","sources":["../../../../src/ui/entries/tools/web.tsx"],"names":[],"mappings":"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"}
|
package/dist/ui/modes.js
ADDED
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/** Auto stands out the most, since it acts on its own; Debug has the color of what it is after. */
|
|
2
|
+
export function modeColor(theme, mode) {
|
|
3
|
+
if (mode === 'auto')
|
|
4
|
+
return theme.warning;
|
|
5
|
+
if (mode === 'debug')
|
|
6
|
+
return theme.error;
|
|
7
|
+
if (mode === 'plan')
|
|
8
|
+
return theme.code;
|
|
9
|
+
if (mode === 'edits')
|
|
10
|
+
return theme.accent;
|
|
11
|
+
return theme.muted;
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=modes.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"modes.js","sourceRoot":"","sources":["../../src/ui/modes.ts"],"names":[],"mappings":"AAGA,mGAAmG;AACnG,MAAM,UAAU,SAAS,CAAC,KAAY,EAAE,IAAe;IACrD,IAAI,IAAI,KAAK,MAAM;QAAE,OAAO,KAAK,CAAC,OAAO,CAAC;IAC1C,IAAI,IAAI,KAAK,OAAO;QAAE,OAAO,KAAK,CAAC,KAAK,CAAC;IACzC,IAAI,IAAI,KAAK,MAAM;QAAE,OAAO,KAAK,CAAC,IAAI,CAAC;IACvC,IAAI,IAAI,KAAK,OAAO;QAAE,OAAO,KAAK,CAAC,MAAM,CAAC;IAE1C,OAAO,KAAK,CAAC,KAAK,CAAC;AACrB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"task-marks.js","sourceRoot":"","sources":["../../src/ui/task-marks.ts"],"names":[],"mappings":"AAGA,MAAM,CAAC,MAAM,UAAU,GAA6C;IAClE,OAAO,EAAE,SAAS;IAClB,SAAS,EAAE,MAAM;IACjB,MAAM,EAAE,OAAO;IACf,OAAO,EAAE,WAAW;CACrB,CAAC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { useEffect, useState } from 'react';
|
|
2
|
+
import { errorMessage } from '@jinion/core/lib/errors';
|
|
3
|
+
const PENDING = { state: 'pending' };
|
|
4
|
+
/** An answer that comes after the next load is dropped; a load that returns nothing stays pending. */
|
|
5
|
+
export function useAsync(load, deps) {
|
|
6
|
+
const [result, setResult] = useState(PENDING);
|
|
7
|
+
useEffect(() => {
|
|
8
|
+
let current = true;
|
|
9
|
+
setResult(PENDING);
|
|
10
|
+
load()?.then((value) => current && setResult({ state: 'done', value }), (error) => current && setResult({ state: 'failed', error: errorMessage(error) }));
|
|
11
|
+
return () => {
|
|
12
|
+
current = false;
|
|
13
|
+
};
|
|
14
|
+
}, deps);
|
|
15
|
+
return result;
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=use-async.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"use-async.js","sourceRoot":"","sources":["../../src/ui/use-async.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAC5C,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAIvD,MAAM,OAAO,GAAG,EAAE,KAAK,EAAE,SAAS,EAAW,CAAC;AAE9C,sGAAsG;AACtG,MAAM,UAAU,QAAQ,CAAI,IAAkC,EAAE,IAAe;IAC7E,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,QAAQ,CAAW,OAAO,CAAC,CAAC;IAExD,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,OAAO,GAAG,IAAI,CAAC;QAEnB,SAAS,CAAC,OAAO,CAAC,CAAC;QAEnB,IAAI,EAAE,EAAE,IAAI,CACV,CAAC,KAAK,EAAE,EAAE,CAAC,OAAO,IAAI,SAAS,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,EACzD,CAAC,KAAc,EAAE,EAAE,CAAC,OAAO,IAAI,SAAS,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,YAAY,CAAC,KAAK,CAAC,EAAE,CAAC,CAC1F,CAAC;QAEF,OAAO,GAAG,EAAE;YACV,OAAO,GAAG,KAAK,CAAC;QAClB,CAAC,CAAC;IACJ,CAAC,EAAE,IAAI,CAAC,CAAC;IAET,OAAO,MAAM,CAAC;AAChB,CAAC"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { useEffect, useState } from 'react';
|
|
2
|
+
import { useApi } from '../app/api.js';
|
|
3
|
+
// The core waits for the map a second at most on start, so a large project is still being read for a while after.
|
|
4
|
+
const AGAIN_MS = 1500;
|
|
5
|
+
/** What the project map read, asked again while it is still being read. */
|
|
6
|
+
export function useMapOverview() {
|
|
7
|
+
const api = useApi();
|
|
8
|
+
const [state, setState] = useState({ state: 'reading' });
|
|
9
|
+
useEffect(() => {
|
|
10
|
+
let timer;
|
|
11
|
+
let current = true;
|
|
12
|
+
const ask = () => api.request('map/overview', {}).then(({ reading, overview }) => {
|
|
13
|
+
if (!current)
|
|
14
|
+
return;
|
|
15
|
+
setState(overview ? { state: 'ready', overview } : reading ? { state: 'reading' } : { state: 'none' });
|
|
16
|
+
if (reading)
|
|
17
|
+
timer = setTimeout(ask, AGAIN_MS);
|
|
18
|
+
}, () => current && setState({ state: 'none' }));
|
|
19
|
+
void ask();
|
|
20
|
+
return () => {
|
|
21
|
+
current = false;
|
|
22
|
+
clearTimeout(timer);
|
|
23
|
+
};
|
|
24
|
+
}, []);
|
|
25
|
+
return state;
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=use-map-overview.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"use-map-overview.js","sourceRoot":"","sources":["../../src/ui/use-map-overview.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAC5C,OAAO,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AAIvC,kHAAkH;AAClH,MAAM,QAAQ,GAAG,IAAI,CAAC;AAEtB,2EAA2E;AAC3E,MAAM,UAAU,cAAc;IAC5B,MAAM,GAAG,GAAG,MAAM,EAAE,CAAC;IACrB,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAW,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC;IAEnE,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,KAAiC,CAAC;QACtC,IAAI,OAAO,GAAG,IAAI,CAAC;QAEnB,MAAM,GAAG,GAAG,GAAG,EAAE,CACf,GAAG,CAAC,OAAO,CAAC,cAAc,EAAE,EAAE,CAAC,CAAC,IAAI,CAClC,CAAC,EAAE,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE;YACxB,IAAI,CAAC,OAAO;gBAAE,OAAO;YAErB,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;YACvG,IAAI,OAAO;gBAAE,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;QACjD,CAAC,EACD,GAAG,EAAE,CAAC,OAAO,IAAI,QAAQ,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAC7C,CAAC;QAEJ,KAAK,GAAG,EAAE,CAAC;QAEX,OAAO,GAAG,EAAE;YACV,OAAO,GAAG,KAAK,CAAC;YAChB,YAAY,CAAC,KAAK,CAAC,CAAC;QACtB,CAAC,CAAC;IACJ,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,OAAO,KAAK,CAAC;AACf,CAAC"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { useState } from 'react';
|
|
2
|
+
import { useWindowSize } from '@jinion/tui';
|
|
3
|
+
export const PAGER_HINTS = [
|
|
4
|
+
['Up/Down', 'scroll'],
|
|
5
|
+
['PgUp/PgDn', 'page'],
|
|
6
|
+
];
|
|
7
|
+
export function usePager(lines, { chrome, follow = false }) {
|
|
8
|
+
const { rows } = useWindowSize();
|
|
9
|
+
// `undefined` follows the end.
|
|
10
|
+
const [top, setTop] = useState(follow ? undefined : 0);
|
|
11
|
+
const view = Math.max(3, rows - chrome);
|
|
12
|
+
const last = Math.max(0, lines - view);
|
|
13
|
+
const shown = Math.min(top ?? last, last);
|
|
14
|
+
const range = lines > view ? `lines ${shown + 1}-${Math.min(lines, shown + view)} of ${lines}` : undefined;
|
|
15
|
+
const scroll = (key) => {
|
|
16
|
+
const step = key.pageDown ? view : key.pageUp ? -view : key.downArrow ? 1 : key.upArrow ? -1 : 0;
|
|
17
|
+
if (!step)
|
|
18
|
+
return false;
|
|
19
|
+
const next = Math.min(last, Math.max(0, shown + step));
|
|
20
|
+
setTop(follow && next >= last ? undefined : next);
|
|
21
|
+
return true;
|
|
22
|
+
};
|
|
23
|
+
return { top: shown, view, scroll, range };
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=use-pager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"use-pager.js","sourceRoot":"","sources":["../../src/ui/use-pager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AACjC,OAAO,EAAE,aAAa,EAA0B,MAAM,aAAa,CAAC;AAOpE,MAAM,CAAC,MAAM,WAAW,GAAc;IACpC,CAAC,SAAS,EAAE,QAAQ,CAAC;IACrB,CAAC,WAAW,EAAE,MAAM,CAAC;CACtB,CAAC;AAEF,MAAM,UAAU,QAAQ,CAAC,KAAa,EAAE,EAAE,MAAM,EAAE,MAAM,GAAG,KAAK,EAAgB;IAC9E,MAAM,EAAE,IAAI,EAAE,GAAG,aAAa,EAAE,CAAC;IAEjC,+BAA+B;IAC/B,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,GAAG,QAAQ,CAAqB,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAE3E,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,GAAG,MAAM,CAAC,CAAC;IACxC,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,GAAG,IAAI,CAAC,CAAC;IACvC,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,IAAI,IAAI,EAAE,IAAI,CAAC,CAAC;IAC1C,MAAM,KAAK,GAAG,KAAK,GAAG,IAAI,CAAC,CAAC,CAAC,SAAS,KAAK,GAAG,CAAC,IAAI,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC,OAAO,KAAK,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;IAE3G,MAAM,MAAM,GAAG,CAAC,GAAQ,EAAE,EAAE;QAC1B,MAAM,IAAI,GAAG,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACjG,IAAI,CAAC,IAAI;YAAE,OAAO,KAAK,CAAC;QAExB,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,GAAG,IAAI,CAAC,CAAC,CAAC;QAEvD,MAAM,CAAC,MAAM,IAAI,IAAI,IAAI,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QAElD,OAAO,IAAI,CAAC;IACd,CAAC,CAAC;IAEF,OAAO,EAAE,GAAG,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC;AAC7C,CAAC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { useEffect, useState } from 'react';
|
|
2
|
+
import { useApi } from '../app/api.js';
|
|
3
|
+
import { useWorkdir } from './use-workdir.js';
|
|
4
|
+
/** The files of the folder the shown session works in, read again each time `refresh` changes. */
|
|
5
|
+
export function useProjectFiles(refresh) {
|
|
6
|
+
const api = useApi();
|
|
7
|
+
const folder = useWorkdir();
|
|
8
|
+
const [files, setFiles] = useState([]);
|
|
9
|
+
useEffect(() => {
|
|
10
|
+
let current = true;
|
|
11
|
+
api.inSession('files/list', {}).then((listed) => current && setFiles(listed), () => { });
|
|
12
|
+
return () => {
|
|
13
|
+
current = false;
|
|
14
|
+
};
|
|
15
|
+
}, [folder, refresh]);
|
|
16
|
+
return files;
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=use-project-files.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"use-project-files.js","sourceRoot":"","sources":["../../src/ui/use-project-files.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAC5C,OAAO,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AACvC,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAE9C,kGAAkG;AAClG,MAAM,UAAU,eAAe,CAAC,OAAgB;IAC9C,MAAM,GAAG,GAAG,MAAM,EAAE,CAAC;IACrB,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;IAE5B,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAW,EAAE,CAAC,CAAC;IAEjD,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,OAAO,GAAG,IAAI,CAAC;QAEnB,GAAG,CAAC,SAAS,CAAC,YAAY,EAAE,EAAE,CAAC,CAAC,IAAI,CAClC,CAAC,MAAM,EAAE,EAAE,CAAC,OAAO,IAAI,QAAQ,CAAC,MAAM,CAAC,EACvC,GAAG,EAAE,GAAE,CAAC,CACT,CAAC;QAEF,OAAO,GAAG,EAAE;YACV,OAAO,GAAG,KAAK,CAAC;QAClB,CAAC,CAAC;IACJ,CAAC,EAAE,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;IAEtB,OAAO,KAAK,CAAC;AACf,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { useAtomValue } from 'jotai';
|
|
2
|
+
import { useApi } from '../app/api.js';
|
|
3
|
+
import { worktreeAtom } from '../state/session.js';
|
|
4
|
+
/** Where the conversation works: its worktree, or the project. */
|
|
5
|
+
export function useWorkdir() {
|
|
6
|
+
const { initialized } = useApi();
|
|
7
|
+
return useAtomValue(worktreeAtom)?.folder ?? initialized.info.cwd;
|
|
8
|
+
}
|
|
9
|
+
//# sourceMappingURL=use-workdir.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"use-workdir.js","sourceRoot":"","sources":["../../src/ui/use-workdir.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,OAAO,CAAC;AACrC,OAAO,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AACvC,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAEnD,kEAAkE;AAClE,MAAM,UAAU,UAAU;IACxB,MAAM,EAAE,WAAW,EAAE,GAAG,MAAM,EAAE,CAAC;IAEjC,OAAO,YAAY,CAAC,YAAY,CAAC,EAAE,MAAM,IAAI,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC;AACpE,CAAC"}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import { execFile } from 'node:child_process';
|
|
2
|
+
import { existsSync, mkdirSync, renameSync, rmSync } from 'node:fs';
|
|
3
|
+
import { join } from 'node:path';
|
|
4
|
+
import { promisify } from 'node:util';
|
|
5
|
+
import { compareVersions } from '@jinion/core/lib/changelog';
|
|
6
|
+
import { readJson } from '@jinion/core/lib/json-file';
|
|
7
|
+
import { settingsFile } from '../app/settings-file.js';
|
|
8
|
+
import { installedVersions, mainOf, versionsDir } from './versions.js';
|
|
9
|
+
const run = promisify(execFile);
|
|
10
|
+
const PACKAGE = '@jinion/cli';
|
|
11
|
+
const FIRST_MS = 10_000;
|
|
12
|
+
const EVERY_MS = 4 * 60 * 60 * 1000;
|
|
13
|
+
/** Asks npm a little after start and every four hours; a check that fails, as offline, waits for the next. Returns the stop. */
|
|
14
|
+
export function startUpdater(options) {
|
|
15
|
+
const check = () => void updateOnce(options).catch(() => { });
|
|
16
|
+
const first = setTimeout(check, FIRST_MS);
|
|
17
|
+
const every = setInterval(check, EVERY_MS);
|
|
18
|
+
first.unref();
|
|
19
|
+
every.unref();
|
|
20
|
+
return () => {
|
|
21
|
+
clearTimeout(first);
|
|
22
|
+
clearInterval(every);
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
/** Off with `"autoUpdates": false` in the settings, or `JINION_DISABLE_AUTOUPDATER`, as in Claude Code. */
|
|
26
|
+
export function autoUpdatesOn(env = process.env) {
|
|
27
|
+
return !env.JINION_DISABLE_AUTOUPDATER && readJson(settingsFile(), {}).autoUpdates !== false;
|
|
28
|
+
}
|
|
29
|
+
/** Installs the newest version when it is newer, into a folder of its own, then keeps that one and the one running. */
|
|
30
|
+
export async function updateOnce({ version, onReady, dir = versionsDir(), latest = latestVersion, install = npmInstall }) {
|
|
31
|
+
const newest = await latest();
|
|
32
|
+
if (compareVersions(newest, version) <= 0)
|
|
33
|
+
return;
|
|
34
|
+
if (!existsSync(mainOf(newest, dir))) {
|
|
35
|
+
const part = join(dir, `${newest}.part`);
|
|
36
|
+
rmSync(part, { recursive: true, force: true });
|
|
37
|
+
mkdirSync(part, { recursive: true });
|
|
38
|
+
try {
|
|
39
|
+
await install(newest, part);
|
|
40
|
+
}
|
|
41
|
+
catch (error) {
|
|
42
|
+
rmSync(part, { recursive: true, force: true });
|
|
43
|
+
throw error;
|
|
44
|
+
}
|
|
45
|
+
rmSync(join(dir, newest), { recursive: true, force: true });
|
|
46
|
+
renameSync(part, join(dir, newest));
|
|
47
|
+
}
|
|
48
|
+
for (const old of installedVersions(dir)) {
|
|
49
|
+
if (old !== newest && old !== version)
|
|
50
|
+
rmSync(join(dir, old), { recursive: true, force: true });
|
|
51
|
+
}
|
|
52
|
+
onReady(newest);
|
|
53
|
+
}
|
|
54
|
+
/** From the registry npm itself uses, when it was given one. */
|
|
55
|
+
async function latestVersion() {
|
|
56
|
+
const registry = (process.env.npm_config_registry ?? 'https://registry.npmjs.org').replace(/\/$/, '');
|
|
57
|
+
const response = await fetch(`${registry}/${PACKAGE.replace('/', '%2F')}/latest`, { signal: AbortSignal.timeout(15_000) });
|
|
58
|
+
if (!response.ok)
|
|
59
|
+
throw new Error(`the registry answered ${response.status}`);
|
|
60
|
+
return (await response.json()).version;
|
|
61
|
+
}
|
|
62
|
+
/** Under a folder of the user's own, so it needs no `sudo` and leaves the files of the version running alone. */
|
|
63
|
+
async function npmInstall(version, folder) {
|
|
64
|
+
await run('npm', ['install', '--prefix', folder, '--no-save', '--no-audit', '--no-fund', '--omit=dev', '--loglevel=error', `${PACKAGE}@${version}`], {
|
|
65
|
+
timeout: 10 * 60 * 1000,
|
|
66
|
+
});
|
|
67
|
+
}
|
|
68
|
+
//# sourceMappingURL=updater.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"updater.js","sourceRoot":"","sources":["../../src/update/updater.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { existsSync, readdirSync } from 'node:fs';
|
|
2
|
+
import { join } from 'node:path';
|
|
3
|
+
import { fileURLToPath } from 'node:url';
|
|
4
|
+
import { compareVersions } from '@jinion/core/lib/changelog';
|
|
5
|
+
import { jinionHome } from '@jinion/core/lib/paths';
|
|
6
|
+
/** Where the updater installs each version, one folder each, beside what Jinion keeps of the user's. */
|
|
7
|
+
export function versionsDir() {
|
|
8
|
+
return join(jinionHome(), 'versions');
|
|
9
|
+
}
|
|
10
|
+
/** The CLI file a version installed there starts from. */
|
|
11
|
+
export function mainOf(version, dir = versionsDir()) {
|
|
12
|
+
return join(dir, version, 'node_modules', '@jinion', 'cli', 'dist', 'main.js');
|
|
13
|
+
}
|
|
14
|
+
/** Only an install from npm updates itself; a checkout of the repository runs what it builds. */
|
|
15
|
+
export function fromNpm(file = fileURLToPath(import.meta.url)) {
|
|
16
|
+
return file.split(/[\\/]/).includes('node_modules');
|
|
17
|
+
}
|
|
18
|
+
/** The versions installed in full; one still being installed sits in a folder ending in `.part`, so it is never run. */
|
|
19
|
+
export function installedVersions(dir = versionsDir()) {
|
|
20
|
+
if (!existsSync(dir))
|
|
21
|
+
return [];
|
|
22
|
+
return readdirSync(dir)
|
|
23
|
+
.filter((name) => /^\d+(\.\d+)*$/.test(name) && existsSync(mainOf(name, dir)))
|
|
24
|
+
.sort(compareVersions);
|
|
25
|
+
}
|
|
26
|
+
/** What `jinion` runs instead of the version npm installed: the newest the updater installed, when it is newer. */
|
|
27
|
+
export function newerInstalled(own, dir = versionsDir()) {
|
|
28
|
+
const newest = installedVersions(dir).at(-1);
|
|
29
|
+
return newest && compareVersions(newest, own) > 0 ? mainOf(newest, dir) : undefined;
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=versions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"versions.js","sourceRoot":"","sources":["../../src/update/versions.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAClD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAC7D,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAEpD,wGAAwG;AACxG,MAAM,UAAU,WAAW;IACzB,OAAO,IAAI,CAAC,UAAU,EAAE,EAAE,UAAU,CAAC,CAAC;AACxC,CAAC;AAED,0DAA0D;AAC1D,MAAM,UAAU,MAAM,CAAC,OAAe,EAAE,GAAG,GAAG,WAAW,EAAE;IACzD,OAAO,IAAI,CAAC,GAAG,EAAE,OAAO,EAAE,cAAc,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,CAAC,CAAC;AACjF,CAAC;AAED,iGAAiG;AACjG,MAAM,UAAU,OAAO,CAAC,IAAI,GAAG,aAAa,CAAC,OAAO,IAAI,CAAC,GAAG,CAAC;IAC3D,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAC;AACtD,CAAC;AAED,wHAAwH;AACxH,MAAM,UAAU,iBAAiB,CAAC,GAAG,GAAG,WAAW,EAAE;IACnD,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC;QAAE,OAAO,EAAE,CAAC;IAEhC,OAAO,WAAW,CAAC,GAAG,CAAC;SACpB,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,UAAU,CAAC,MAAM,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC;SAC7E,IAAI,CAAC,eAAe,CAAC,CAAC;AAC3B,CAAC;AAED,mHAAmH;AACnH,MAAM,UAAU,cAAc,CAAC,GAAW,EAAE,GAAG,GAAG,WAAW,EAAE;IAC7D,MAAM,MAAM,GAAG,iBAAiB,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IAE7C,OAAO,MAAM,IAAI,eAAe,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;AACtF,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,38 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@jinion/cli",
|
|
3
|
-
"version": "0.
|
|
4
|
-
"
|
|
5
|
-
"
|
|
3
|
+
"version": "0.4.524",
|
|
4
|
+
"description": "Jinion coding agent",
|
|
5
|
+
"license": "MIT",
|
|
6
|
+
"homepage": "https://jinion.co",
|
|
7
|
+
"type": "module",
|
|
8
|
+
"engines": {
|
|
9
|
+
"node": ">=22"
|
|
10
|
+
},
|
|
11
|
+
"bin": {
|
|
12
|
+
"jinion": "./bin/jinion.js"
|
|
13
|
+
},
|
|
14
|
+
"files": [
|
|
15
|
+
"bin",
|
|
16
|
+
"dist",
|
|
17
|
+
"CHANGELOG.md"
|
|
18
|
+
],
|
|
19
|
+
"dependencies": {
|
|
20
|
+
"jotai": "^3.0.1",
|
|
21
|
+
"react": "^19.3.0",
|
|
22
|
+
"@jinion/core": "0.3.0",
|
|
23
|
+
"@jinion/tui": "0.0.6"
|
|
24
|
+
},
|
|
25
|
+
"devDependencies": {
|
|
26
|
+
"@types/react": "^19.3.0",
|
|
27
|
+
"tsx": "^4.23.15",
|
|
28
|
+
"vitest": "^5.0.3"
|
|
29
|
+
},
|
|
30
|
+
"scripts": {
|
|
31
|
+
"dev": "tsx --tsconfig ../../tsconfig.json --conditions=development src/main.tsx",
|
|
32
|
+
"build": "tsc -p tsconfig.build.json",
|
|
33
|
+
"start": "node bin/jinion.js",
|
|
34
|
+
"typecheck": "tsc",
|
|
35
|
+
"test": "vitest run",
|
|
36
|
+
"test:watch": "vitest"
|
|
37
|
+
}
|
|
6
38
|
}
|
package/README.md
DELETED