maidang 29.4.9 → 29.4.10
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/dist/index.js +142 -2
- package/dist/index.js.map +4 -4
- package/package.json +11 -10
package/dist/index.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
|
|
3
3
|
// src/index.ts
|
|
4
|
-
import { Command as
|
|
4
|
+
import { Command as Command14 } from "commander";
|
|
5
5
|
|
|
6
6
|
// src/commands/home.ts
|
|
7
7
|
import { Command } from "commander";
|
|
@@ -1731,6 +1731,144 @@ function createWhoAmICommand() {
|
|
|
1731
1731
|
return cmd;
|
|
1732
1732
|
}
|
|
1733
1733
|
|
|
1734
|
+
// src/commands/chat.tsx
|
|
1735
|
+
import React3, { useState as useState3 } from "react";
|
|
1736
|
+
import { render as render3, Box as Box3, Text as Text3, useInput as useInput3 } from "ink";
|
|
1737
|
+
import { Command as Command13 } from "commander";
|
|
1738
|
+
import chalk12 from "chalk";
|
|
1739
|
+
|
|
1740
|
+
// src/utils/chat-api.ts
|
|
1741
|
+
var API_URL = process.env.MAIDANG_API_URL || "http://localhost:3000";
|
|
1742
|
+
function buildSystemPrompt() {
|
|
1743
|
+
return `\u4F60\u662F\u6211\u7684\u6570\u5B57\u5206\u8EAB/\u667A\u80FD\u52A9\u624B\u3002\u4F60\u7684\u76EE\u6807\u662F\u5E2E\u52A9\u4ED6\u4EBA\u4E86\u89E3\u6211\uFF0C\u56DE\u7B54\u5173\u4E8E\u6211\u7684\u95EE\u9898\uFF0C\u5E76\u63D0\u4F9B\u6709\u7528\u7684\u4FE1\u606F\u3002
|
|
1744
|
+
|
|
1745
|
+
\u5173\u4E8E\u6211\uFF1A
|
|
1746
|
+
- \u672C\u540D\uFF1A\u9EA6\u5F53
|
|
1747
|
+
- \u804C\u4E1A\uFF1A\u5168\u6808\u5DE5\u7A0B\u5E08 / \u72EC\u7ACB\u5F00\u53D1\u8005
|
|
1748
|
+
- \u6807\u7B7E\uFF1A\u6587\u79D1\u8F6C\u7801\u3001\u5168\u6808\u3001\u72EC\u7ACB\u5F00\u53D1
|
|
1749
|
+
- \u4F4D\u7F6E\uFF1A\u676D\u5DDE
|
|
1750
|
+
- \u8054\u7CFB\u65B9\u5F0F\uFF1Aborisdunk@sina.com
|
|
1751
|
+
- Blog\uFF1Ahttps://www.maidang.me
|
|
1752
|
+
|
|
1753
|
+
\u56DE\u7B54\u98CE\u683C\uFF1A
|
|
1754
|
+
- \u4EB2\u5207\uFF0C\u81EA\u7136\uFF0C\u50CF\u670B\u53CB\u4E4B\u95F4\u7684\u5BF9\u8BDD
|
|
1755
|
+
- \u7B80\u6D01\u6709\u529B\uFF0C\u4E0D\u5570\u55E6
|
|
1756
|
+
- \u5982\u679C\u4E0D\u77E5\u9053\u67D0\u4E9B\u4FE1\u606F\uFF0C\u5766\u8BDA\u8BF4\u4E0D\u77E5\u9053
|
|
1757
|
+
|
|
1758
|
+
\u8BF7\u59CB\u7EC8\u4FDD\u6301\u89D2\u8272\uFF0C\u56DE\u7B54\u95EE\u9898\u65F6\u50CF\u662F\u6211\u672C\u4EBA\u5728\u8BF4\u8BDD\u3002`;
|
|
1759
|
+
}
|
|
1760
|
+
var THINK_RE = new RegExp("<think>([\\s\\S]+?)</think>([\\s\\S]*$)", "");
|
|
1761
|
+
function parseReply(raw) {
|
|
1762
|
+
const match = raw.match(THINK_RE);
|
|
1763
|
+
if (match) {
|
|
1764
|
+
const thinking = match[1].trim();
|
|
1765
|
+
const response = match[2].trim();
|
|
1766
|
+
return { thinking: thinking || null, response: response || "(\u65E0\u56DE\u590D)" };
|
|
1767
|
+
}
|
|
1768
|
+
return { thinking: null, response: raw.trim() };
|
|
1769
|
+
}
|
|
1770
|
+
async function fetchChat(message) {
|
|
1771
|
+
const messages = [{ role: "user", content: message }];
|
|
1772
|
+
const systemPrompt = buildSystemPrompt();
|
|
1773
|
+
const res = await fetch(`${API_URL}/api/chat`, {
|
|
1774
|
+
method: "POST",
|
|
1775
|
+
headers: { "Content-Type": "application/json" },
|
|
1776
|
+
body: JSON.stringify({ messages, systemPrompt })
|
|
1777
|
+
});
|
|
1778
|
+
if (!res.ok) {
|
|
1779
|
+
const err = await res.json().catch(() => ({ error: "Unknown error" }));
|
|
1780
|
+
throw new Error(err.error || `HTTP ${res.status}`);
|
|
1781
|
+
}
|
|
1782
|
+
const data = await res.json();
|
|
1783
|
+
return parseReply(data.reply || "");
|
|
1784
|
+
}
|
|
1785
|
+
|
|
1786
|
+
// src/commands/chat.tsx
|
|
1787
|
+
async function chatSync(message, json = false) {
|
|
1788
|
+
try {
|
|
1789
|
+
const { thinking, response } = await fetchChat(message);
|
|
1790
|
+
if (json) {
|
|
1791
|
+
console.log(JSON.stringify({ tool: "maidang", command: "chat", message, thinking, response }, null, 2));
|
|
1792
|
+
} else {
|
|
1793
|
+
if (thinking) {
|
|
1794
|
+
thinking.split("\n").forEach((line) => {
|
|
1795
|
+
console.log(`${chalk12.dim("\u{1F4AD}")} ${chalk12.dim(line)}`);
|
|
1796
|
+
});
|
|
1797
|
+
console.log();
|
|
1798
|
+
}
|
|
1799
|
+
console.log(response);
|
|
1800
|
+
}
|
|
1801
|
+
} catch (err) {
|
|
1802
|
+
if (json) {
|
|
1803
|
+
console.error(JSON.stringify({ tool: "maidang", command: "chat", error: err.message }, null, 2));
|
|
1804
|
+
} else {
|
|
1805
|
+
console.error(chalk12.red(`Error: ${err.message}`));
|
|
1806
|
+
process.exit(1);
|
|
1807
|
+
}
|
|
1808
|
+
}
|
|
1809
|
+
}
|
|
1810
|
+
var ChatMessage = ({ msg }) => {
|
|
1811
|
+
const prefix = msg.role === "user" ? "\u4F60" : "\u9EA6\u5F53";
|
|
1812
|
+
const color = msg.role === "user" ? "cyan" : "white";
|
|
1813
|
+
return /* @__PURE__ */ React3.createElement(Box3, { flexDirection: "column", marginY: 0 }, /* @__PURE__ */ React3.createElement(Text3, { color, bold: true }, prefix), msg.thinking && /* @__PURE__ */ React3.createElement(Box3, { flexDirection: "column", paddingLeft: 2, marginY: 0 }, /* @__PURE__ */ React3.createElement(Text3, { dimColor: true }, "\u{1F4AD} \u601D\u8003"), /* @__PURE__ */ React3.createElement(Box3, { borderStyle: "round", borderColor: "gray", paddingX: 1 }, /* @__PURE__ */ React3.createElement(Text3, { dimColor: true, wrap: "wrap" }, msg.thinking))), /* @__PURE__ */ React3.createElement(Box3, { paddingLeft: 2 }, /* @__PURE__ */ React3.createElement(Text3, { wrap: "wrap" }, msg.content)));
|
|
1814
|
+
};
|
|
1815
|
+
var ChatApp = () => {
|
|
1816
|
+
const [messages, setMessages] = useState3([]);
|
|
1817
|
+
const [input, setInput] = useState3("");
|
|
1818
|
+
const [loading, setLoading] = useState3(false);
|
|
1819
|
+
const [error, setError] = useState3(null);
|
|
1820
|
+
useInput3((char, key) => {
|
|
1821
|
+
if (key.return && !loading) {
|
|
1822
|
+
const text = input.trim();
|
|
1823
|
+
if (!text) return;
|
|
1824
|
+
setMessages((prev) => [...prev, { role: "user", content: text }]);
|
|
1825
|
+
setInput("");
|
|
1826
|
+
setLoading(true);
|
|
1827
|
+
setError(null);
|
|
1828
|
+
fetchChat(text).then(({ thinking, response }) => {
|
|
1829
|
+
setMessages((prev) => [...prev, { role: "assistant", content: response, thinking }]);
|
|
1830
|
+
}).catch((err) => {
|
|
1831
|
+
setError(err.message);
|
|
1832
|
+
}).finally(() => {
|
|
1833
|
+
setLoading(false);
|
|
1834
|
+
});
|
|
1835
|
+
return;
|
|
1836
|
+
}
|
|
1837
|
+
if (char === "\b" || char === "\x7F") {
|
|
1838
|
+
setInput((prev) => prev.slice(0, -1));
|
|
1839
|
+
return;
|
|
1840
|
+
}
|
|
1841
|
+
if (key.escape) {
|
|
1842
|
+
setInput("");
|
|
1843
|
+
return;
|
|
1844
|
+
}
|
|
1845
|
+
if (!char || char.length === 0) return;
|
|
1846
|
+
if (key.ctrl || key.meta || key.alt) return;
|
|
1847
|
+
if (key.return || key.upArrow || key.downArrow) return;
|
|
1848
|
+
setInput((prev) => prev + char);
|
|
1849
|
+
});
|
|
1850
|
+
return /* @__PURE__ */ React3.createElement(Box3, { flexDirection: "column", paddingX: 1, paddingY: 0, flexGrow: 1 }, /* @__PURE__ */ React3.createElement(Box3, { borderStyle: "single", borderColor: "cyan", paddingX: 1, marginBottom: 1, flexShrink: 0 }, /* @__PURE__ */ React3.createElement(Text3, { bold: true, color: "cyan" }, "\u9EA6\u5F53"), /* @__PURE__ */ React3.createElement(Text3, { dimColor: true }, " \xB7 chat \xB7 Ctrl+C \u9000\u51FA")), /* @__PURE__ */ React3.createElement(Box3, { flexDirection: "column", flexGrow: 1, overflow: "hidden" }, messages.length === 0 && !loading && /* @__PURE__ */ React3.createElement(Box3, { paddingY: 1 }, /* @__PURE__ */ React3.createElement(Text3, { dimColor: true }, "\u53D1\u9001\u6D88\u606F\u5F00\u59CB\u5BF9\u8BDD...")), messages.map((msg, i) => /* @__PURE__ */ React3.createElement(Box3, { key: i, flexDirection: "column", marginBottom: 1, flexShrink: 0 }, /* @__PURE__ */ React3.createElement(ChatMessage, { msg }))), loading && /* @__PURE__ */ React3.createElement(Box3, { flexDirection: "column", marginBottom: 1, flexShrink: 0 }, /* @__PURE__ */ React3.createElement(Text3, { dimColor: true }, "\u9EA6\u5F53"), /* @__PURE__ */ React3.createElement(Box3, { paddingLeft: 2 }, /* @__PURE__ */ React3.createElement(Text3, { dimColor: true }, "\u601D\u8003\u4E2D..."))), error && /* @__PURE__ */ React3.createElement(Box3, { flexDirection: "column", marginBottom: 1, flexShrink: 0 }, /* @__PURE__ */ React3.createElement(Text3, { color: "red" }, "Error: ", error))), /* @__PURE__ */ React3.createElement(Box3, { borderStyle: "single", borderColor: "gray", paddingX: 1, marginTop: 1, flexShrink: 0 }, /* @__PURE__ */ React3.createElement(Text3, { color: "cyan" }, "> "), /* @__PURE__ */ React3.createElement(Text3, null, input), /* @__PURE__ */ React3.createElement(Text3, { dimColor: true }, "\u258E")));
|
|
1851
|
+
};
|
|
1852
|
+
function createChatCommand() {
|
|
1853
|
+
const cmd = new Command13("chat").description("\u548C\u9EA6\u5F53\u5BF9\u8BDD").option("-m, --message <text>", "\u76F4\u63A5\u53D1\u9001\u6D88\u606F\uFF08\u975E\u4EA4\u4E92\u6A21\u5F0F\uFF09").option("--json", "\u8F93\u51FA JSON \u683C\u5F0F");
|
|
1854
|
+
cmd.action(async (opts) => {
|
|
1855
|
+
if (opts.json || opts.message) {
|
|
1856
|
+
if (!opts.message) {
|
|
1857
|
+
if (opts.json) {
|
|
1858
|
+
console.error(JSON.stringify({ tool: "maidang", command: "chat", error: "no message provided" }, null, 2));
|
|
1859
|
+
} else {
|
|
1860
|
+
console.error('\u8BF7\u63D0\u4F9B\u6D88\u606F\uFF1Amaidang chat -m "\u4F60\u597D"');
|
|
1861
|
+
}
|
|
1862
|
+
process.exit(1);
|
|
1863
|
+
}
|
|
1864
|
+
await chatSync(opts.message, !!opts.json);
|
|
1865
|
+
return;
|
|
1866
|
+
}
|
|
1867
|
+
render3(/* @__PURE__ */ React3.createElement(ChatApp, null));
|
|
1868
|
+
});
|
|
1869
|
+
return cmd;
|
|
1870
|
+
}
|
|
1871
|
+
|
|
1734
1872
|
// src/utils/version.ts
|
|
1735
1873
|
function getAgeVersion() {
|
|
1736
1874
|
const birthDate = new Date(1997, 2, 10);
|
|
@@ -1763,7 +1901,7 @@ function getVersionInfo() {
|
|
|
1763
1901
|
}
|
|
1764
1902
|
|
|
1765
1903
|
// src/index.ts
|
|
1766
|
-
var program = new
|
|
1904
|
+
var program = new Command14();
|
|
1767
1905
|
var versionInfo = getVersionInfo();
|
|
1768
1906
|
program.name("maidang").description("\u4E86\u89E3\u9EA6\u5F53 - \u4E00\u4E2A AI \u65F6\u4EE3\u7684\u63A2\u7D22\u8005").version(getAgeVersion(), "-v, --version", "\u663E\u793A\u9EA6\u5F53\u7684\u5E74\u9F84\u7248\u672C\u53F7");
|
|
1769
1907
|
program.command("birthday").description("\u663E\u793A\u9EA6\u5F53\u7684\u751F\u65E5\u4FE1\u606F").action(() => {
|
|
@@ -1791,6 +1929,7 @@ var contactCmd = createContactCommand();
|
|
|
1791
1929
|
var skillsCmd = createSkillsCommand();
|
|
1792
1930
|
var statusCmd = createStatusCommand();
|
|
1793
1931
|
var whoamiCmd = createWhoAmICommand();
|
|
1932
|
+
var chatCmd = createChatCommand();
|
|
1794
1933
|
program.addCommand(careerCmd);
|
|
1795
1934
|
program.addCommand(catCmd);
|
|
1796
1935
|
program.addCommand(postsCmd);
|
|
@@ -1802,6 +1941,7 @@ program.addCommand(contactCmd);
|
|
|
1802
1941
|
program.addCommand(skillsCmd);
|
|
1803
1942
|
program.addCommand(statusCmd);
|
|
1804
1943
|
program.addCommand(whoamiCmd);
|
|
1944
|
+
program.addCommand(chatCmd);
|
|
1805
1945
|
if (!process.argv.slice(2).length) {
|
|
1806
1946
|
const homeCmd = createHomeCommand();
|
|
1807
1947
|
homeCmd.parse(process.argv);
|
package/dist/index.js.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
|
-
"sources": ["../src/index.ts", "../src/commands/home.ts", "../src/utils/display.ts", "../src/commands/career.ts", "../src/data/career.json", "../src/commands/cat.ts", "../src/commands/posts.tsx", "../src/commands/songs.tsx", "../src/data/songs.json", "../src/utils/clipboard.ts", "../src/commands/links.ts", "../src/commands/projects.ts", "../src/commands/tools.ts", "../src/commands/contact.ts", "../src/commands/skills.ts", "../src/commands/status.ts", "../src/commands/whoami.ts", "../src/utils/version.ts"],
|
|
4
|
-
"sourcesContent": ["#!/usr/bin/env node\n\nimport { Command } from 'commander';\nimport { createHomeCommand } from './commands/home';\nimport { createCareerCommand } from './commands/career';\nimport { createCatCommand } from './commands/cat';\nimport { createPostsCommand } from './commands/posts';\nimport { createSongsCommand } from './commands/songs';\nimport { createLinksCommand } from './commands/links';\nimport { createProjectsCommand } from './commands/projects';\nimport { createToolsCommand } from './commands/tools';\nimport { createContactCommand } from './commands/contact';\nimport { createSkillsCommand } from './commands/skills';\nimport { createStatusCommand } from './commands/status';\nimport { createWhoAmICommand } from './commands/whoami';\nimport { getAgeVersion, getVersionInfo } from './utils/version';\n\nconst program = new Command();\n\n// \u52A8\u6001\u8BA1\u7B97\u5E74\u9F84\u7248\u672C\u53F7\nconst versionInfo = getVersionInfo();\n\nprogram\n .name('maidang')\n .description('\u4E86\u89E3\u9EA6\u5F53 - \u4E00\u4E2A AI \u65F6\u4EE3\u7684\u63A2\u7D22\u8005')\n .version(getAgeVersion(), '-v, --version', '\u663E\u793A\u9EA6\u5F53\u7684\u5E74\u9F84\u7248\u672C\u53F7');\n\n// \u6DFB\u52A0\u4E00\u4E2A\u7279\u6B8A\u7684\u751F\u65E5\u4FE1\u606F\u547D\u4EE4\nprogram\n .command('birthday')\n .description('\u663E\u793A\u9EA6\u5F53\u7684\u751F\u65E5\u4FE1\u606F')\n .action(() => {\n const { birthDate, currentAge, nextBirthday, version } = versionInfo;\n\n console.log(`\uD83C\uDF82 \u9EA6\u5F53\u7684\u751F\u65E5\u4FE1\u606F`);\n console.log('');\n console.log(`\u51FA\u751F\u65E5\u671F: ${birthDate.toLocaleDateString('zh-CN', { year: 'numeric', month: 'long', day: 'numeric' })}`);\n console.log(`\u5F53\u524D\u5E74\u9F84: ${currentAge} \u5C81`);\n console.log(`\u5F53\u524D\u7248\u672C: ${version} (\u5E74\u9F84\u7248\u672C)`);\n console.log(`\u4E0B\u4E00\u4E2A\u751F\u65E5: ${nextBirthday.toLocaleDateString('zh-CN', { year: 'numeric', month: 'long', day: 'numeric' })}`);\n\n const daysUntilNextBirthday = Math.ceil((nextBirthday.getTime() - new Date().getTime()) / (1000 * 60 * 60 * 24));\n console.log(`\u8DDD\u79BB\u751F\u65E5\u8FD8\u6709: ${daysUntilNextBirthday} \u5929`);\n\n if (daysUntilNextBirthday <= 30) {\n console.log(`\uD83C\uDF89 \u5FEB\u8981\u8FC7\u751F\u65E5\u4E86\uFF01`);\n }\n });\n\nconst careerCmd = createCareerCommand();\nconst catCmd = createCatCommand();\nconst postsCmd = createPostsCommand();\nconst songsCmd = createSongsCommand();\nconst linksCmd = createLinksCommand();\nconst projectsCmd = createProjectsCommand();\nconst toolsCmd = createToolsCommand();\nconst contactCmd = createContactCommand();\nconst skillsCmd = createSkillsCommand();\nconst statusCmd = createStatusCommand();\nconst whoamiCmd = createWhoAmICommand();\n\nprogram.addCommand(careerCmd);\nprogram.addCommand(catCmd);\nprogram.addCommand(postsCmd);\nprogram.addCommand(songsCmd);\nprogram.addCommand(linksCmd);\nprogram.addCommand(projectsCmd);\nprogram.addCommand(toolsCmd);\nprogram.addCommand(contactCmd);\nprogram.addCommand(skillsCmd);\nprogram.addCommand(statusCmd);\nprogram.addCommand(whoamiCmd);\n\nif (!process.argv.slice(2).length) {\n const homeCmd = createHomeCommand();\n homeCmd.parse(process.argv);\n} else {\n program.parse(process.argv);\n}\n", "import { Command } from 'commander';\nimport chalk from 'chalk';\nimport { createSpinner } from '../utils/display';\n\nconst commands = [\n { name: 'whoami', desc: '\u4E86\u89E3\u6211' },\n { name: 'skills', desc: '\u6280\u80FD & \u5174\u8DA3' },\n { name: 'career', desc: '\u5DE5\u4F5C' },\n { name: 'posts', desc: '\u63A8\u6587' },\n { name: 'songs', desc: '\u5E74\u5EA6\u6B4C\u5355' },\n { name: 'links', desc: '\u94FE\u63A5' },\n { name: 'projects', desc: '\u9879\u76EE' },\n { name: 'cat | meow', desc: '\u9EA6\u9EA6' },\n];\n\nexport function createHomeCommand(): Command {\n const cmd = new Command('maidang')\n .description('\u6B22\u8FCE\u6765\u5230\u9EA6\u5F53\u7684\u4E16\u754C')\n .action(async () => {\n const spinner = createSpinner('\u6B63\u5728\u53EC\u5524...');\n spinner.start();\n\n await new Promise(resolve => setTimeout(resolve, 800));\n\n spinner.stop();\n console.clear();\n\n console.log(chalk.bold('\u6211\u662F \u9EA6\u5F53'));\n console.log(chalk.dim('\u6587\u79D1\u8F6C\u7801 / \u5168\u6808 / \u72EC\u7ACB\u5F00\u53D1\u3002\u676D\u5DDE\uFF0C\u71D5\u9EA6\u62FF\u94C1\u7231\u597D\u8005\uFF0C\u4E3E\u94C1\uFF0C\u98DE\u76D8\uFF0C\u5076\u5C14\u5F39\u7434\u3002'));\n console.log('');\n console.log(chalk.dim('\u2500'.repeat(40)));\n console.log('');\n\n for (const cmd of commands) {\n console.log(` ${chalk.white(cmd.name.padEnd(12))} ${chalk.dim(cmd.desc)}`);\n }\n\n console.log('');\n console.log(chalk.dim('\u2500'.repeat(40)));\n console.log('');\n });\n\n return cmd;\n}\n", "import chalk from 'chalk';\nimport boxen from 'boxen';\nimport figlet from 'figlet';\nimport ora, { Ora } from 'ora';\n\nexport async function displayTitle(text: string): Promise<void> {\n return new Promise((resolve) => {\n figlet.text(text, {\n font: 'Big',\n horizontalLayout: 'default',\n verticalLayout: 'default'\n }, (err, data) => {\n if (err) {\n console.log(chalk.cyan.bold(text));\n } else {\n console.log(chalk.cyan(data));\n }\n resolve();\n });\n });\n}\n\nexport function displayBox(content: string, options?: {\n title?: string;\n borderColor?: string;\n padding?: number;\n}): void {\n const borderOptions: any = {\n padding: options?.padding || 1,\n borderColor: options?.borderColor || 'cyan',\n borderStyle: 'round'\n };\n\n if (options?.title) {\n borderOptions.title = options.title;\n borderOptions.titleAlignment = 'center';\n }\n\n console.log(boxen(content, borderOptions));\n}\n\nexport function createSpinner(text: string): Ora {\n return ora({\n text,\n color: 'cyan'\n });\n}\n\nexport function displaySeparator(char: string = '\u2500', length: number = 50): void {\n console.log(chalk.gray(char.repeat(length)));\n}\n\nexport function displayItem(icon: string, text: string, color: string = 'cyan'): void {\n const colorMethod = (chalk as any)[color];\n if (colorMethod) {\n console.log(colorMethod(icon), text);\n } else {\n console.log(chalk.cyan(icon), text);\n }\n}\n\nexport function displaySection(title: string): void {\n displaySeparator();\n console.log(chalk.bold.cyan(`\\n${title}`));\n displaySeparator();\n}\n", "import { Command } from 'commander';\nimport chalk from 'chalk';\nimport careerData from '../data/career.json';\nimport { displaySection } from '../utils/display';\n\nexport function createCareerCommand(): Command {\n const cmd = new Command('career')\n .description('\u67E5\u770B\u6211\u7684\u5DE5\u4F5C\u7ECF\u5386 (--json \u8F93\u51FA\u7ED3\u6784\u5316\u6570\u636E)')\n .option('--json', '\u8F93\u51FA JSON \u683C\u5F0F')\n .action((opts) => {\n if (opts.json) {\n console.log(JSON.stringify({ tool: 'maidang', command: 'career', data: careerData }, null, 2));\n return;\n }\n\n displaySection('\uD83D\uDCBC \u5DE5\u4F5C\u7ECF\u5386');\n\n careerData.career.forEach((job, index) => {\n console.log('');\n\n console.log(chalk.yellow.bold(`\uD83D\uDCCB ${job.company}`));\n console.log(chalk.cyan(` ${job.role}`));\n console.log(chalk.gray(` ${job.period}`));\n console.log('');\n\n console.log(chalk.white(' \uD83D\uDCDD ' + job.description));\n console.log('');\n\n if (job.achievements && job.achievements.length > 0) {\n console.log(chalk.gray(' \u4E3B\u8981\u6210\u5C31:'));\n job.achievements.forEach(achievement => {\n console.log(chalk.green(' \u2713 ' + achievement));\n });\n }\n\n if (index < careerData.career.length - 1) {\n console.log('');\n console.log(chalk.gray('\u2500'.repeat(40)));\n }\n });\n\n console.log('');\n });\n\n return cmd;\n}\n", "{\n \"career\": [\n {\n \"company\": \"\u5F71\u5200 RPA\uFF08AI Power \u56E2\u961F\uFF09\",\n \"role\": \"\u5168\u6808\u5DE5\u7A0B\u5E08 / AI Agent \u5F00\u53D1\u8005\",\n \"period\": \"2025.10 - \u81F3\u4ECA\",\n \"description\": \"\u805A\u7126 AI \u5DE5\u4F5C\u6D41\u5EFA\u8BBE\uFF0C\u4E3B\u5BFC AI Agent \u65B9\u6848\u8BBE\u8BA1\u4E0E\u843D\u5730\uFF0C\u63A8\u52A8\u4E1A\u52A1\u4ECE\u529F\u80FD\u5F00\u53D1\u8D70\u5411\u667A\u80FD\u5316\u6D41\u7A0B\u7F16\u6392\u3002\",\n \"achievements\": [\n \"\u8D1F\u8D23 AI \u5DE5\u4F5C\u6D41\u76F8\u5173\u80FD\u529B\u5EFA\u8BBE\uFF0C\u63A8\u52A8\u56E2\u961F\u5F62\u6210\u53EF\u590D\u7528\u7684\u6D41\u7A0B\u5316\u4EA4\u4ED8\u65B9\u5F0F\",\n \"\u62C5\u4EFB AI Agent \u6838\u5FC3\u5F00\u53D1\u8005\uFF0C\u8986\u76D6\u4ECE\u9700\u6C42\u62C6\u89E3\u3001\u63D0\u793A\u8BCD\u8BBE\u8BA1\u5230\u670D\u52A1\u7AEF\u843D\u5730\u7684\u5B8C\u6574\u94FE\u8DEF\",\n \"\u4EE5\u5168\u6808\u65B9\u5F0F\u534F\u540C\u524D\u540E\u7AEF\u5F00\u53D1\uFF0C\u63D0\u5347\u590D\u6742\u4E1A\u52A1\u5728\u7814\u53D1\u4FA7\u7684\u843D\u5730\u6548\u7387\",\n \"\u5728\u56E2\u961F\u5185\u63A8\u8FDB AI \u5DE5\u7A0B\u5316\u5B9E\u8DF5\uFF0C\u6301\u7EED\u63D0\u5347\u9879\u76EE\u7A33\u5B9A\u6027\u4E0E\u8FED\u4EE3\u901F\u5EA6\"\n ]\n },\n {\n \"company\": \"\u676D\u5DDE\u4E0D\u5FD8\u667A\u80FD\u79D1\u6280\u6709\u9650\u516C\u53F8\",\n \"role\": \"\u5168\u6808\u5F00\u53D1\u5DE5\u7A0B\u5E08\",\n \"period\": \"2024.10 - 2025.09\",\n \"description\": \"\u53C2\u4E0E AI \u89C6\u9891\u751F\u6210\u4E0E\u5E7F\u544A\u6295\u653E\u4EA7\u54C1\u5EFA\u8BBE\uFF0C\u8D1F\u8D23\u524D\u540E\u7AEF\u8054\u52A8\u548C\u6838\u5FC3\u529F\u80FD\u843D\u5730\u3002\",\n \"achievements\": [\n \"\u57FA\u4E8E Next.js + React + Node.js \u53C2\u4E0E\u9AD8\u4EA4\u4E92\u5E94\u7528\u4E0E\u4E2D\u53F0\u670D\u52A1\u5F00\u53D1\",\n \"\u53C2\u4E0E ASR\u3001LLM\u3001\u89C6\u9891\u4EFB\u52A1\u94FE\u8DEF\u7B49 AI \u76F8\u5173\u529F\u80FD\u5EFA\u8BBE\",\n \"\u53C2\u4E0E\u81EA\u52A8\u5316\u6295\u653E\u4E0E\u5DE5\u7A0B\u5316\u6D41\u7A0B\u5EFA\u8BBE\uFF0C\u63D0\u5347\u4E1A\u52A1\u5904\u7406\u6548\u7387\"\n ]\n },\n {\n \"company\": \"\u676D\u5DDE\u89C6\u674F\u79D1\u6280\u6709\u9650\u516C\u53F8\",\n \"role\": \"\u524D\u7AEF\u5F00\u53D1\u5DE5\u7A0B\u5E08\",\n \"period\": \"2022.10 - 2024.06\",\n \"description\": \"\u8D1F\u8D23\u524D\u7AEF\u5DE5\u7A0B\u5316\u3001\u4E1A\u52A1\u7CFB\u7EDF\u5F00\u53D1\u4E0E\u56E2\u961F\u534F\u4F5C\u6D41\u7A0B\u4F18\u5316\u3002\",\n \"achievements\": [\n \"\u63A8\u52A8\u89C4\u8303\u4F53\u7CFB\u843D\u5730\uFF08Lint\u3001Commit \u89C4\u8303\u3001\u811A\u624B\u67B6\u7B49\uFF09\uFF0C\u63D0\u5347\u56E2\u961F\u7814\u53D1\u4E00\u81F4\u6027\",\n \"\u53C2\u4E0E\u6784\u5EFA\u79C1\u6709\u5E93\u4E0E\u5DE5\u7A0B\u5316\u4F53\u7CFB\uFF0C\u63D0\u5347\u591A\u9879\u76EE\u590D\u7528\u6548\u7387\",\n \"\u652F\u6491\u540E\u53F0\u7CFB\u7EDF\u4E0E\u6838\u5FC3\u4E1A\u52A1\u9875\u9762\u7684\u6301\u7EED\u8FED\u4EE3\"\n ]\n },\n {\n \"company\": \"\u534E\u76D6\u5BB6\u5C45\u3001\u9177\u5BB6\u4E50\uFF08\u4E0D\u540C\u516C\u53F8\uFF09\",\n \"role\": \"\u524D\u7AEF\u5F00\u53D1\u5DE5\u7A0B\u5E08\",\n \"period\": \"2020.11 - 2022.06\",\n \"description\": \"\u65E9\u671F\u7ECF\u5386\uFF0C\u4E3B\u8981\u8D1F\u8D23 2D Canvas \u76F8\u5173\u529F\u80FD\u5F00\u53D1\u4E0E\u7EF4\u62A4\u3002\",\n \"achievements\": [\n \"\u53C2\u4E0E 2D \u8BBE\u8BA1\u5DE5\u5177\u4E0E\u4E3B\u7AD9\u76F8\u5173\u524D\u7AEF\u529F\u80FD\u5F00\u53D1\",\n \"\u8D1F\u8D23\u753B\u5E03\u4EA4\u4E92\u3001\u5386\u53F2\u8BB0\u5F55\u4E0E\u5FEB\u6377\u952E\u7B49\u80FD\u529B\u8FED\u4EE3\",\n \"\u4E0E\u4EA7\u54C1\u3001\u8BBE\u8BA1\u3001\u6D4B\u8BD5\u534F\u4F5C\u63A8\u8FDB\u7248\u672C\u4EA4\u4ED8\"\n ]\n }\n ]\n}\n", "import { Command } from 'commander';\nimport chalk from 'chalk';\nimport path from 'path';\nimport fs from 'fs';\n\nconst RETRO_PIXEL_WIDTH = 28;\nconst RETRO_PIXEL_HEIGHT = 16;\n\nconst resolveExecutableDir = (): string => {\n if (!process.argv[1]) {\n return process.cwd();\n }\n\n const executablePath = path.resolve(process.argv[1]);\n try {\n const resolvedExecutablePath = fs.realpathSync(executablePath);\n return path.dirname(resolvedExecutablePath);\n } catch {\n return path.dirname(executablePath);\n }\n};\n\nconst resolveCatImagePath = (): string | null => {\n const executableDir = resolveExecutableDir();\n const packageRootDir = path.resolve(executableDir, '..');\n const candidatePaths = [\n path.resolve(process.cwd(), 'src/assets/cat.jpg'),\n path.resolve(packageRootDir, 'src/assets/cat.jpg'),\n path.resolve(packageRootDir, 'dist/assets/cat.jpg'),\n path.resolve(executableDir, 'assets/cat.jpg'),\n path.resolve(executableDir, '../assets/cat.jpg')\n ];\n\n for (const candidatePath of candidatePaths) {\n if (fs.existsSync(candidatePath)) {\n return candidatePath;\n }\n }\n\n return null;\n};\n\nexport function createCatCommand(): Command {\n const cmd = new Command('cat')\n .alias('meow')\n .description('\u67E5\u770B\u9EA6\u9EA6')\n .action(async () => {\n console.log(chalk.yellow.bold('\u9EA6\u9EA6'));\n console.log('');\n\n try {\n const catImagePath = resolveCatImagePath();\n\n if (catImagePath) {\n try {\n const { default: terminalImage } = await import('terminal-image');\n const image = await terminalImage.file(catImagePath, {\n width: RETRO_PIXEL_WIDTH,\n height: RETRO_PIXEL_HEIGHT,\n preserveAspectRatio: true\n });\n\n console.log(image);\n } catch (error) {\n console.log(chalk.red('\u56FE\u7247\u6E32\u67D3\u5931\u8D25'));\n }\n } else {\n console.log(chalk.gray('\u8BF7\u5C06\u732B\u54AA\u56FE\u7247\u653E\u5728 src/assets/cat.jpg'));\n }\n } catch (error) {\n console.log(chalk.gray('\uD83D\uDCF8 \u8BF7\u5C06\u732B\u54AA\u56FE\u7247\u653E\u5728 src/assets/cat.jpg'));\n }\n\n console.log('');\n });\n\n return cmd;\n}\n", "import React, { useState, useEffect } from 'react';\nimport { render, Box, Text, useInput } from 'ink';\nimport { Command } from 'commander';\n\ninterface PostItem {\n slug: string;\n title?: string | null;\n content: string;\n summary?: string | null;\n author?: string | null;\n handle?: string | null;\n date?: string | null;\n time?: string | null;\n tags?: string[];\n publishedAt?: string | null;\n}\n\ntype View = 'LIST' | 'DETAIL';\n\n// \u2500\u2500 List view \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nconst ListView: React.FC<{\n posts: PostItem[];\n selectedIndex: number;\n onSelect: (index: number) => void;\n onEnter: () => void;\n onQuit: () => void;\n}> = ({ posts, selectedIndex, onSelect, onEnter, onQuit }) => {\n useInput((input, key) => {\n if (input === 'q' || input === 'Q') {\n onQuit();\n return;\n }\n if (key.upArrow) {\n onSelect(Math.max(0, selectedIndex - 1));\n } else if (key.downArrow) {\n onSelect(Math.min(posts.length - 1, selectedIndex + 1));\n } else if (key.return) {\n onEnter();\n }\n });\n\n return (\n <Box flexDirection=\"column\" paddingX={2} paddingY={1}>\n <Box marginBottom={1}>\n <Text bold color=\"cyan\">\uD83D\uDC26 \u63A8\u6587\u5217\u8868</Text>\n <Text dimColor> \u00B7 {posts.length} \u6761</Text>\n </Box>\n <Text dimColor marginBottom={1}>\u2191\u2193 \u9009\u62E9 \u00B7 Enter \u67E5\u770B\u8BE6\u60C5 \u00B7 q \u9000\u51FA</Text>\n\n <Box flexDirection=\"column\" borderStyle=\"single\" borderColor=\"gray\" paddingX={0} paddingY={0}>\n {posts.map((post, index) => {\n const isSelected = selectedIndex === index;\n const num = String(index + 1).padStart(2, ' ');\n const title = post.title || post.summary?.substring(0, 40) || post.content.substring(0, 40);\n const meta = [post.date, post.time].filter(Boolean).join(' ');\n return (\n <Box\n key={post.slug}\n paddingX={1}\n paddingY={0}\n marginY={0}\n borderStyle=\"single\"\n borderColor={isSelected ? 'cyan' : 'gray'}\n >\n <Text dimColor>{num}</Text>\n <Text dimColor> \u2502 </Text>\n <Box flexDirection=\"column\" flexGrow={1}>\n <Text bold={isSelected} color={isSelected ? 'cyan' : undefined}>\n {title}\n </Text>\n {meta && (\n <Text dimColor>{meta}</Text>\n )}\n </Box>\n {isSelected && (\n <Text dimColor> \u2190</Text>\n )}\n </Box>\n );\n })}\n </Box>\n </Box>\n );\n};\n\n// \u2500\u2500 Detail view \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nconst DetailView: React.FC<{\n post: PostItem;\n onBack: () => void;\n onQuit: () => void;\n onPrev: () => void;\n onNext: () => void;\n hasPrev: boolean;\n hasNext: boolean;\n}> = ({ post, onBack, onQuit, onPrev, onNext, hasPrev, hasNext }) => {\n useInput((input, key) => {\n if (input === 'q' || input === 'Q') {\n onQuit();\n return;\n }\n if (key.escape || input === 'b' || input === 'B') {\n onBack();\n return;\n }\n if (key.leftArrow && hasPrev) {\n onPrev();\n } else if (key.rightArrow && hasNext) {\n onNext();\n }\n });\n\n const paragraphs = post.content\n .split('\\n')\n .reduce<string[][]>((acc, line) => {\n if (line.trim() === '') {\n acc.push([]);\n } else {\n if (acc.length === 0 || acc[acc.length - 1].length === 0) {\n acc.push([line]);\n } else {\n acc[acc.length - 1].push(line);\n }\n }\n return acc;\n }, [])\n .filter(p => p.length > 0);\n\n const tags = post.tags || [];\n const meta = [post.date, post.time].filter(Boolean).join(' ');\n\n return (\n <Box flexDirection=\"column\" paddingX={2} paddingY={1} flexShrink={0}>\n {/* Header */}\n <Box marginBottom={1}>\n <Text bold color=\"cyan\">\uD83D\uDCC4 \u63A8\u6587\u8BE6\u60C5</Text>\n <Text dimColor> \u00B7 Esc/q \u8FD4\u56DE \u00B7 \u2190\u2192 \u5207\u6362</Text>\n </Box>\n\n {/* Meta */}\n <Box flexDirection=\"column\" borderStyle=\"single\" borderColor=\"cyan\" paddingX={1} marginBottom={0} flexShrink={0}>\n <Box>\n <Text bold color=\"white\">{post.author || '\u9EA6\u5F53'}</Text>\n <Text dimColor> {post.handle || '@maidang'}</Text>\n {meta && <Text dimColor> \u00B7 {meta}</Text>}\n </Box>\n {post.title && (\n <Text bold color=\"cyan\">{post.title}</Text>\n )}\n </Box>\n\n {/* Content */}\n <Box\n flexDirection=\"column\"\n borderStyle=\"single\"\n borderColor=\"gray\"\n paddingX={1}\n marginY={0}\n flexShrink={1}\n overflow=\"hidden\"\n >\n {paragraphs.map((para, pi) => (\n <Box key={pi} flexDirection=\"column\" marginBottom={pi < paragraphs.length - 1 ? 1 : 0} flexShrink={0}>\n {para.map((line, li) => (\n <Text key={li} wrap=\"wrap\">{line}</Text>\n ))}\n </Box>\n ))}\n </Box>\n\n {/* Tags */}\n {tags.length > 0 && (\n <Box borderStyle=\"single\" borderColor=\"gray\" paddingX={1} marginY={0} flexShrink={0}>\n <Text dimColor>\n {tags.map(tag => <Text key={tag} color=\"cyan\">#{tag} </Text>)}\n </Text>\n </Box>\n )}\n\n {/* Footer */}\n <Box marginTop={1} flexShrink={0}>\n <Text dimColor>\n \u2190 {hasPrev ? '\u4E0A\u4E00\u7BC7' : '\u65E0'}\u3000\u3000\u2192 {hasNext ? '\u4E0B\u4E00\u7BC7' : '\u65E0'}\u3000\u3000Esc \u8FD4\u56DE\n </Text>\n </Box>\n </Box>\n );\n};\n\n// \u2500\u2500 App \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nconst PostsApp: React.FC<{ apiUrl: string }> = ({ apiUrl }) => {\n const [posts, setPosts] = useState<PostItem[]>([]);\n const [selectedIndex, setSelectedIndex] = useState(0);\n const [view, setView] = useState<View>('LIST');\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<string | null>(null);\n\n useEffect(() => {\n fetch(apiUrl)\n .then((res) => {\n if (!res.ok) throw new Error(`HTTP ${res.status}`);\n return res.json();\n })\n .then((data) => {\n setPosts(data);\n setLoading(false);\n })\n .catch((err) => {\n setError(err.message);\n setLoading(false);\n });\n }, [apiUrl]);\n\n const handleQuit = () => {\n process.exit(0);\n };\n\n const handleEnter = () => {\n setView('DETAIL');\n };\n\n const handleBack = () => {\n setView('LIST');\n };\n\n const handlePrev = () => {\n setSelectedIndex(i => Math.max(0, i - 1));\n };\n\n const handleNext = () => {\n setSelectedIndex(i => Math.min(posts.length - 1, i + 1));\n };\n\n if (loading) {\n return (\n <Box flexDirection=\"column\" paddingX={2} paddingY={1}>\n <Text dimColor>\u52A0\u8F7D\u4E2D...</Text>\n </Box>\n );\n }\n\n if (error) {\n return (\n <Box flexDirection=\"column\" paddingX={2} paddingY={1}>\n <Text color=\"red\">\u52A0\u8F7D\u5931\u8D25: {error}</Text>\n <Text dimColor>\u8BF7\u68C0\u67E5\u7F51\u7EDC\u6216API\u5730\u5740</Text>\n </Box>\n );\n }\n\n if (posts.length === 0) {\n return (\n <Box flexDirection=\"column\" paddingX={2} paddingY={1}>\n <Text color=\"yellow\">\u6682\u65E0\u63A8\u6587</Text>\n </Box>\n );\n }\n\n if (view === 'DETAIL') {\n return (\n <DetailView\n post={posts[selectedIndex]}\n onBack={handleBack}\n onQuit={handleQuit}\n onPrev={handlePrev}\n onNext={handleNext}\n hasPrev={selectedIndex > 0}\n hasNext={selectedIndex < posts.length - 1}\n />\n );\n }\n\n return (\n <ListView\n posts={posts}\n selectedIndex={selectedIndex}\n onSelect={setSelectedIndex}\n onEnter={handleEnter}\n onQuit={handleQuit}\n />\n );\n};\n\nexport function createPostsCommand(): Command {\n const apiUrl = 'https://www.maidang.me/api/social-posts?type=social';\n const cmd = new Command('posts')\n .description('\u63A8\u6587\u5217\u8868\uFF0C\u8FDB\u5165\u540E\u53EF\u67E5\u770B\u8BE6\u60C5 (--json \u8F93\u51FA\u7ED3\u6784\u5316\u6570\u636E)')\n .option('--json', '\u8F93\u51FA JSON \u683C\u5F0F');\n\n cmd.action((opts) => {\n const wantsJson = opts.json;\n\n if (wantsJson) {\n fetch(apiUrl)\n .then(res => res.json())\n .then(data => console.log(JSON.stringify({ tool: 'maidang', command: 'posts', data }, null, 2)))\n .catch(err => { console.error(err); process.exit(1); });\n return;\n }\n\n render(<PostsApp apiUrl={apiUrl} />);\n });\n\n return cmd;\n}\n", "import React, { useState, useEffect, useRef } from 'react';\nimport { render, Box, Text, useInput } from 'ink';\nimport { Command } from 'commander';\nimport songsData from '../data/songs.json';\nimport { copyToClipboard } from '../utils/clipboard';\n\ninterface Song {\n id: string;\n originalId: number;\n name: string;\n duration: number;\n artists: string[];\n album: string;\n}\n\ninterface YearEntry {\n year: number;\n songs: Song[];\n}\n\ninterface PlaylistMeta {\n name: string;\n trackCount: number;\n year: number;\n}\n\nconst ALL_YEARS: YearEntry[] = songsData.data;\nconst AVAILABLE_YEARS: number[] = songsData.years;\nconst ALL_META: PlaylistMeta[] = songsData.meta;\n\nfunction formatDuration(ms: number): string {\n const s = Math.round(ms / 1000);\n const m = Math.floor(s / 60);\n const sec = s % 60;\n return `${m}:${sec.toString().padStart(2, '0')}`;\n}\n\n// \u2500\u2500 Year picker view \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nconst YearPicker: React.FC<{\n selectedIndex: number;\n onSelect: (index: number) => void;\n onConfirm: () => void;\n onQuit: () => void;\n}> = ({ selectedIndex, onSelect, onConfirm, onQuit }) => {\n useInput((input, key) => {\n if (input === 'q' || input === 'Q') { onQuit(); return; }\n if (key.upArrow) { onSelect(Math.max(0, selectedIndex - 1)); }\n else if (key.downArrow) { onSelect(Math.min(ALL_YEARS.length - 1, selectedIndex + 1)); }\n else if (key.return) { onConfirm(); }\n });\n\n return (\n <Box flexDirection=\"column\" paddingX={2} paddingY={1}>\n <Box marginBottom={1}>\n <Text bold color=\"cyan\">\uD83C\uDFB5 \u5E74\u5EA6\u6B4C\u5355</Text>\n <Text dimColor> \u00B7 {ALL_YEARS.length} \u4E2A\u5E74\u4EFD</Text>\n </Box>\n <Text dimColor marginBottom={1}>\u2191\u2193 \u9009\u62E9\u5E74\u4EFD \u00B7 Enter \u8FDB\u5165 \u00B7 q \u9000\u51FA</Text>\n\n <Box flexDirection=\"column\" borderStyle=\"single\" borderColor=\"gray\" paddingX={0} paddingY={0}>\n {ALL_YEARS.map((entry, index) => {\n const isSelected = selectedIndex === index;\n const meta = ALL_META.find(m => m.year === entry.year);\n const preview = entry.songs[0]\n ? `${entry.songs[0].artists[0] || ''} \u00B7 ${entry.songs[0].name}`\n : '';\n return (\n <Box\n key={entry.year}\n paddingX={1}\n paddingY={0}\n marginY={0}\n borderStyle=\"single\"\n borderColor={isSelected ? 'cyan' : 'gray'}\n >\n <Text dimColor>{entry.year}</Text>\n <Text dimColor> \u2502 </Text>\n <Box flexDirection=\"column\" flexGrow={1}>\n <Text bold={isSelected} color={isSelected ? 'cyan' : undefined}>{entry.year} \u5E74\u5EA6\u6B4C\u5355</Text>\n <Text dimColor>{meta?.trackCount || entry.songs.length} \u9996 {preview ? `\u00B7 ${preview}` : ''}</Text>\n </Box>\n {isSelected && <Text dimColor> \u2190</Text>}\n </Box>\n );\n })}\n </Box>\n </Box>\n );\n};\n\n// \u2500\u2500 Song list view \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nconst SongList: React.FC<{\n entry: YearEntry;\n selectedIndex: number;\n onSelect: (index: number) => void;\n onEnter: () => void;\n onBack: () => void;\n onQuit: () => void;\n}> = ({ entry, selectedIndex, onSelect, onEnter, onBack, onQuit }) => {\n useInput((input, key) => {\n if (input === 'q' || input === 'Q') { onQuit(); return; }\n if (key.escape || input === 'b' || input === 'B') { onBack(); return; }\n if (key.upArrow) { onSelect(Math.max(0, selectedIndex - 1)); }\n else if (key.downArrow) { onSelect(Math.min(entry.songs.length - 1, selectedIndex + 1)); }\n else if (key.return) { onEnter(); }\n });\n\n return (\n <Box flexDirection=\"column\" paddingX={2} paddingY={1}>\n <Box marginBottom={1}>\n <Text bold color=\"cyan\">\uD83C\uDFB5 {entry.year} \u5E74\u5EA6\u6B4C\u5355</Text>\n <Text dimColor> \u00B7 {entry.songs.length} \u9996 \u00B7 Esc \u8FD4\u56DE</Text>\n </Box>\n <Text dimColor marginBottom={1}>\u2191\u2193 \u9009\u62E9 \u00B7 Enter \u67E5\u770B\u8BE6\u60C5 \u00B7 q \u9000\u51FA</Text>\n\n <Box flexDirection=\"column\" borderStyle=\"single\" borderColor=\"gray\" paddingX={0} paddingY={0}>\n {entry.songs.map((song, index) => {\n const isSelected = selectedIndex === index;\n const num = String(index + 1).padStart(2, ' ');\n const artists = song.artists.join(', ');\n const dur = formatDuration(song.duration);\n return (\n <Box\n key={song.id}\n paddingX={1}\n paddingY={0}\n marginY={0}\n borderStyle=\"single\"\n borderColor={isSelected ? 'cyan' : 'gray'}\n >\n <Text dimColor>{num}</Text>\n <Text dimColor> \u2502 </Text>\n <Box flexDirection=\"column\" flexGrow={1}>\n <Text bold={isSelected} color={isSelected ? 'cyan' : undefined}>{song.name}</Text>\n <Text dimColor>{artists} \u00B7 {dur}</Text>\n </Box>\n {isSelected && <Text dimColor> \u2190</Text>}\n </Box>\n );\n })}\n </Box>\n </Box>\n );\n};\n\n// \u2500\u2500 Song detail view \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nconst SongDetail: React.FC<{\n song: Song;\n year: number;\n onBack: () => void;\n onQuit: () => void;\n onPrev: () => void;\n onNext: () => void;\n hasPrev: boolean;\n hasNext: boolean;\n}> = ({ song, year, onBack, onQuit, onPrev, onNext, hasPrev, hasNext }) => {\n const [copied, setCopied] = useState(false);\n const timerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n useInput((input, key) => {\n if (input === 'q' || input === 'Q') { onQuit(); return; }\n if (key.escape || input === 'b' || input === 'B') { onBack(); return; }\n if (key.return) {\n copyToClipboard(song.name);\n setCopied(true);\n if (timerRef.current) clearTimeout(timerRef.current);\n timerRef.current = setTimeout(() => setCopied(false), 1500);\n return;\n }\n if (key.leftArrow && hasPrev) { onPrev(); }\n else if (key.rightArrow && hasNext) { onNext(); }\n });\n\n return (\n <Box flexDirection=\"column\" paddingX={2} paddingY={1} flexShrink={0}>\n <Box marginBottom={1}>\n <Text bold color=\"cyan\">\uD83C\uDFB5 {year} \u5E74\u5EA6\u6B4C\u5355</Text>\n <Text dimColor> \u00B7 Esc/q \u8FD4\u56DE \u00B7 \u2190\u2192 \u5207\u6362</Text>\n </Box>\n\n <Box flexDirection=\"column\" borderStyle=\"single\" borderColor=\"cyan\" paddingX={1} marginBottom={1} flexShrink={0}>\n <Text bold color=\"white\">{song.name}</Text>\n <Text dimColor>{song.artists.join(', ')}</Text>\n <Text dimColor>\u4E13\u8F91: {song.album}</Text>\n <Text dimColor>\u65F6\u957F: {formatDuration(song.duration)}</Text>\n </Box>\n\n <Box marginTop={1} flexShrink={0}>\n <Text dimColor>\n \u2190 {hasPrev ? '\u4E0A\u4E00\u9996' : '\u65E0'}\u3000\u3000\u2192 {hasNext ? '\u4E0B\u4E00\u9996' : '\u65E0'}\u3000\u3000Esc \u8FD4\u56DE\u3000\u3000Enter {copied ? '\u2713 \u5DF2\u590D\u5236' : '\u590D\u5236\u6B4C\u540D'}\n </Text>\n </Box>\n </Box>\n );\n};\n\n// \u2500\u2500 App \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\ntype View = 'YEAR_PICK' | 'SONG_LIST' | 'SONG_DETAIL';\n\nconst SongsApp: React.FC<{ defaultYearIndex?: number }> = ({ defaultYearIndex }) => {\n const [selectedYearIndex, setSelectedYearIndex] = useState(defaultYearIndex ?? 0);\n const [selectedSongIndex, setSelectedSongIndex] = useState(0);\n const [view, setView] = useState<View>('YEAR_PICK');\n\n const handleQuit = () => process.exit(0);\n\n const currentEntry = ALL_YEARS[selectedYearIndex];\n\n if (view === 'SONG_DETAIL') {\n const song = currentEntry.songs[selectedSongIndex];\n if (!song) return null;\n return (\n <SongDetail\n song={song}\n year={currentEntry.year}\n onBack={() => setView('SONG_LIST')}\n onQuit={handleQuit}\n onPrev={() => setSelectedSongIndex(i => Math.max(0, i - 1))}\n onNext={() => setSelectedSongIndex(i => Math.min(currentEntry.songs.length - 1, i + 1))}\n hasPrev={selectedSongIndex > 0}\n hasNext={selectedSongIndex < currentEntry.songs.length - 1}\n />\n );\n }\n\n if (view === 'SONG_LIST') {\n return (\n <SongList\n entry={currentEntry}\n selectedIndex={selectedSongIndex}\n onSelect={setSelectedSongIndex}\n onEnter={() => setView('SONG_DETAIL')}\n onBack={() => { setSelectedSongIndex(0); setView('YEAR_PICK'); }}\n onQuit={handleQuit}\n />\n );\n }\n\n // YEAR_PICK\n return (\n <YearPicker\n selectedIndex={selectedYearIndex}\n onSelect={(i) => { setSelectedYearIndex(i); setSelectedSongIndex(0); }}\n onConfirm={() => { setSelectedSongIndex(0); setView('SONG_LIST'); }}\n onQuit={handleQuit}\n />\n );\n};\n\nexport function createSongsCommand(): Command {\n const cmd = new Command('songs')\n .description(`\u5E74\u5EA6\u6B4C\u5355\uFF0C\u652F\u6301: ${AVAILABLE_YEARS.join(', ')} (--json \u8F93\u51FA\u7ED3\u6784\u5316\u6570\u636E)`)\n .option('--json', '\u8F93\u51FA JSON \u683C\u5F0F')\n .option('--year <year>', `\u8DF3\u8F6C\u81F3\u6307\u5B9A\u5E74\u4EFD\u7684\u6B4C\u66F2\u5217\u8868`);\n\n cmd.action((opts) => {\n if (opts.json) {\n if (opts.year) {\n const year = parseInt(opts.year, 10);\n const entry = ALL_YEARS.find(e => e.year === year);\n if (!entry) {\n console.error(`\u6CA1\u6709 ${year} \u5E74\u7684\u6B4C\u5355`);\n process.exit(1);\n }\n const meta = ALL_META.find(m => m.year === year);\n console.log(JSON.stringify({ tool: 'maidang', command: 'songs', meta, data: entry.songs }, null, 2));\n } else {\n console.log(JSON.stringify({ tool: 'maidang', command: 'songs', years: AVAILABLE_YEARS, meta: ALL_META, data: ALL_YEARS }, null, 2));\n }\n return;\n }\n\n let defaultYearIndex: number | undefined;\n if (opts.year) {\n const year = parseInt(opts.year, 10);\n defaultYearIndex = ALL_YEARS.findIndex(e => e.year === year);\n if (defaultYearIndex < 0) {\n console.error(`\u6CA1\u6709 ${year} \u5E74\u7684\u6B4C\u5355`);\n process.exit(1);\n }\n }\n\n render(<SongsApp defaultYearIndex={defaultYearIndex} />);\n });\n\n return cmd;\n}\n", "{\n \"years\": [\n 2025,\n 2024,\n 2023,\n 2022,\n 2021,\n 2020,\n 2019,\n 2018\n ],\n \"meta\": [\n {\n \"year\": 2025,\n \"name\": \"2025 \u5E74\u5EA6\u6B4C\u5355\",\n \"trackCount\": 10\n },\n {\n \"year\": 2024,\n \"name\": \"2024 \u5E74\u5EA6\u6B4C\u5355\",\n \"trackCount\": 9\n },\n {\n \"year\": 2023,\n \"name\": \"2023 \u5E74\u5EA6\u6B4C\u5355\",\n \"trackCount\": 9\n },\n {\n \"year\": 2022,\n \"name\": \"2022 \u5E74\u5EA6\u6B4C\u5355\",\n \"trackCount\": 10\n },\n {\n \"year\": 2021,\n \"name\": \"2021 \u5E74\u5EA6\u6B4C\u5355\",\n \"trackCount\": 10\n },\n {\n \"year\": 2020,\n \"name\": \"2020 \u5E74\u5EA6\u6B4C\u5355\",\n \"trackCount\": 10\n },\n {\n \"year\": 2019,\n \"name\": \"2019 \u5E74\u5EA6\u6B4C\u5355\",\n \"trackCount\": 10\n },\n {\n \"year\": 2018,\n \"name\": \"2018 \u5E74\u5EA6\u6B4C\u5355\",\n \"trackCount\": 9\n }\n ],\n \"data\": [\n {\n \"year\": 2025,\n \"songs\": [\n {\n \"id\": \"26A4BC62792A618D36B77D386EB5528E\",\n \"originalId\": 208953,\n \"name\": \"\u98CE\u5439\u8FC7\u4E0B\u96E8\u5929\",\n \"duration\": 213695,\n \"artists\": [\n \"\u66F9\u65B9\"\n ],\n \"album\": \"\u9047\u89C1\u6211\"\n },\n {\n \"id\": \"202438C91A8F858AFE777A5258D41985\",\n \"originalId\": 21162546,\n \"name\": \"Summertime\",\n \"duration\": 246720,\n \"artists\": [\n \"My Chemical Romance\"\n ],\n \"album\": \"Danger Days: The True Lives of the Fabulous Killjoys\"\n },\n {\n \"id\": \"077BE501A0DBEA3B645566A9EC53C2C2\",\n \"originalId\": 208961,\n \"name\": \"\u79CB\u51C9\",\n \"duration\": 225666,\n \"artists\": [\n \"\u66F9\u65B9\"\n ],\n \"album\": \"\u9047\u89C1\u6211\"\n },\n {\n \"id\": \"97A47B44F4B629CADC7A207886F07335\",\n \"originalId\": 329368,\n \"name\": \"\u7A7A\u5FC3\u5409\u4ED6\",\n \"duration\": 226000,\n \"artists\": [\n \"\u5F20\u7389\u534E\"\n ],\n \"album\": \"\u5F20\u7389\u534E\"\n },\n {\n \"id\": \"AC7A29D8222A1C994E1969EA7B11FCDE\",\n \"originalId\": 1415697454,\n \"name\": \"\u4E00\u5982\u5F80\u5E38\",\n \"duration\": 246543,\n \"artists\": [\n \"\u9003\u8D70\u9B91\u4F2F\"\n ],\n \"album\": \"demo\"\n },\n {\n \"id\": \"7941CAC4F6C0362DA7F30CDADABAE46D\",\n \"originalId\": 2727809377,\n \"name\": \"\u642C\u5BB6\",\n \"duration\": 241019,\n \"artists\": [\n \"\u5F20\u9707\u5CB3\"\n ],\n \"album\": \"\u8DDF\u7740\u611F\u89C9\u8D70\"\n },\n {\n \"id\": \"10E2A444DFC54597344C898FBA9E876F\",\n \"originalId\": 1859245776,\n \"name\": \"STAY\",\n \"duration\": 141810,\n \"artists\": [\n \"The Kid LAROI\",\n \"Justin Bieber\"\n ],\n \"album\": \"STAY\"\n },\n {\n \"id\": \"B42ADFF1A172A263EFFE553EFE433114\",\n \"originalId\": 1830419924,\n \"name\": \"Peaches\",\n \"duration\": 198080,\n \"artists\": [\n \"Justin Bieber\",\n \"Daniel Caesar\",\n \"GIV\u0112ON\"\n ],\n \"album\": \"Justice (\u4E2D\u56FD\u8C6A\u534E\u7279\u522B\u7248)\"\n },\n {\n \"id\": \"FF7064D18235C45528BB731D79D45A49\",\n \"originalId\": 1695347,\n \"name\": \"The Kids from Yesterday\",\n \"duration\": 324973,\n \"artists\": [\n \"My Chemical Romance\"\n ],\n \"album\": \"The Kids From Yesterday\"\n },\n {\n \"id\": \"E9C718C585E0465BA300011D46829D60\",\n \"originalId\": 17926871,\n \"name\": \"Name\",\n \"duration\": 270000,\n \"artists\": [\n \"The Goo Goo Dolls\"\n ],\n \"album\": \"A Boy Named Goo\"\n }\n ]\n },\n {\n \"year\": 2024,\n \"songs\": [\n {\n \"id\": \"544C9DE72439C955867D97DAD92F3DE4\",\n \"originalId\": 22821100,\n \"name\": \"Luv(sic.) Part 3 (feat. Shing02)\",\n \"duration\": 336866,\n \"artists\": [\n \"Nujabes\",\n \"Shing02\"\n ],\n \"album\": \"modal soul\"\n },\n {\n \"id\": \"B3269B08A74C62A134CA35A1CC6A399A\",\n \"originalId\": 22778415,\n \"name\": \"Say You Love Me feat. Tamala\",\n \"duration\": 273057,\n \"artists\": [\n \"\u897F\u539F\u5065\u4E00\u90CE\"\n ],\n \"album\": \"Natural Relax presented by Folklove\"\n },\n {\n \"id\": \"6FF5F46D4444FF54BEBA07ECC525583C\",\n \"originalId\": 209397,\n \"name\": \"\u592A\u806A\u660E\",\n \"duration\": 263173,\n \"artists\": [\n \"\u9648\u7EEE\u8D1E\"\n ],\n \"album\": \"Groupies\u5409\u4ED6\u624B\"\n },\n {\n \"id\": \"26D8218BE2215B1D56AB393840F2A567\",\n \"originalId\": 135025,\n \"name\": \"\u8F7B\u719F\u5973 27\",\n \"duration\": 275320,\n \"artists\": [\n \"MC HotDog \u70ED\u72D7\",\n \"\u5173\u5F66\u6DF3\"\n ],\n \"album\": \"\u8D2B\u6C11\u767E\u4E07\u6B4C\u661F\"\n },\n {\n \"id\": \"49216D6C3AFF61F2276BBA32E6865F13\",\n \"originalId\": 2154335252,\n \"name\": \"One Day\",\n \"duration\": 298250,\n \"artists\": [\n \"OMA\",\n \"Shing02\",\n \"Uyama Hiroto\",\n \"Spin Master A-1\",\n \"Troy Everett\"\n ],\n \"album\": \"Luv(Sic) Hexalogy (OMA and Shing02 Live at Liquidroom)\"\n },\n {\n \"id\": \"70F0F220D65D8FFA6D01F18C966413BB\",\n \"originalId\": 421160850,\n \"name\": \"\u9646\u579A\u77E5\u9A6C\u4FD0\",\n \"duration\": 294276,\n \"artists\": [\n \"\u706B\u661F\u7535\u53F0\"\n ],\n \"album\": \"\u9646\u579A\u77E5\u9A6C\u4FD0\"\n },\n {\n \"id\": \"BC29D7971818C3782C305733836D4AED\",\n \"originalId\": 135111,\n \"name\": \"\u4E5D\u5C40\u4E0B\u534A\",\n \"duration\": 303826,\n \"artists\": [\n \"MC HotDog \u70ED\u72D7\"\n ],\n \"album\": \"\u4E5D\u5C40\u4E0B\u534A\"\n },\n {\n \"id\": \"62C777C19284083D8E2D6871ED7E134E\",\n \"originalId\": 18563988,\n \"name\": \"Southside Of Heaven\",\n \"duration\": 379160,\n \"artists\": [\n \"Ryan Bingham\"\n ],\n \"album\": \"Mescalito\"\n },\n {\n \"id\": \"2475F24C6460EB870FE478CBC065D949\",\n \"originalId\": 209478,\n \"name\": \"\u8FD8\u662F\u4F1A\u5BC2\u5BDE\",\n \"duration\": 272293,\n \"artists\": [\n \"\u9648\u7EEE\u8D1E\"\n ],\n \"album\": \"\u8FD8\u662F\u4F1A\u5BC2\u5BDE\"\n }\n ]\n },\n {\n \"year\": 2023,\n \"songs\": [\n {\n \"id\": \"6FF5F46D4444FF54BEBA07ECC525583C\",\n \"originalId\": 209397,\n \"name\": \"\u592A\u806A\u660E\",\n \"duration\": 263173,\n \"artists\": [\n \"\u9648\u7EEE\u8D1E\"\n ],\n \"album\": \"Groupies\u5409\u4ED6\u624B\"\n },\n {\n \"id\": \"70F0F220D65D8FFA6D01F18C966413BB\",\n \"originalId\": 421160850,\n \"name\": \"\u9646\u579A\u77E5\u9A6C\u4FD0\",\n \"duration\": 294276,\n \"artists\": [\n \"\u706B\u661F\u7535\u53F0\"\n ],\n \"album\": \"\u9646\u579A\u77E5\u9A6C\u4FD0\"\n },\n {\n \"id\": \"B42ADFF1A172A263EFFE553EFE433114\",\n \"originalId\": 1830419924,\n \"name\": \"Peaches\",\n \"duration\": 198080,\n \"artists\": [\n \"Justin Bieber\",\n \"Daniel Caesar\",\n \"GIV\u0112ON\"\n ],\n \"album\": \"Justice (\u4E2D\u56FD\u8C6A\u534E\u7279\u522B\u7248)\"\n },\n {\n \"id\": \"F505DAD72E186F071E9A653E84BB7256\",\n \"originalId\": 209400,\n \"name\": \"\u5C0F\u6B65\u821E\u66F2\",\n \"duration\": 259720,\n \"artists\": [\n \"\u9648\u7EEE\u8D1E\"\n ],\n \"album\": \"Groupies\u5409\u4ED6\u624B\"\n },\n {\n \"id\": \"65EFA9D33F3C7C116E3B23A786E1644E\",\n \"originalId\": 1907710034,\n \"name\": \"\u5927\u96E8\",\n \"duration\": 192208,\n \"artists\": [\n \"deca joins\"\n ],\n \"album\": \"\u5927\u96E8\"\n },\n {\n \"id\": \"BA183ABC5617703C68AF596D853F3D1E\",\n \"originalId\": 1906020021,\n \"name\": \"\u5206\u624B\u5427\",\n \"duration\": 300485,\n \"artists\": [\n \"\u5B59\u76DB\u5E0C\"\n ],\n \"album\": \"\u5206\u624B\u5427\"\n },\n {\n \"id\": \"2475F24C6460EB870FE478CBC065D949\",\n \"originalId\": 209478,\n \"name\": \"\u8FD8\u662F\u4F1A\u5BC2\u5BDE\",\n \"duration\": 272293,\n \"artists\": [\n \"\u9648\u7EEE\u8D1E\"\n ],\n \"album\": \"\u8FD8\u662F\u4F1A\u5BC2\u5BDE\"\n },\n {\n \"id\": \"372BBF8296D70C205588F16C0332D538\",\n \"originalId\": 209494,\n \"name\": \"\u544A\u8BC9\u6211\",\n \"duration\": 313733,\n \"artists\": [\n \"\u9648\u7EEE\u8D1E\"\n ],\n \"album\": \"\u8FD8\u662F\u4F1A\u5BC2\u5BDE\"\n },\n {\n \"id\": \"8C33BFC3568B4827AF9906E210B7F597\",\n \"originalId\": 26876993,\n \"name\": \"...passing by\",\n \"duration\": 396000,\n \"artists\": [\n \"Ulrich Schnauss\"\n ],\n \"album\": \"...Passing By EP\"\n }\n ]\n },\n {\n \"year\": 2022,\n \"songs\": [\n {\n \"id\": \"46ECCBFC254408E30F3DC8E9DD7C96B6\",\n \"originalId\": 21761474,\n \"name\": \"I Don't Love You Anymore\",\n \"duration\": 277000,\n \"artists\": [\n \"The Quireboys\"\n ],\n \"album\": \"Best Of The Quireboys\"\n },\n {\n \"id\": \"68E9C13A4909F6E9869D713D3EF46398\",\n \"originalId\": 2604360,\n \"name\": \"House of Pain\",\n \"duration\": 344613,\n \"artists\": [\n \"Faster Pussycat\"\n ],\n \"album\": \"Greatest Hits\"\n },\n {\n \"id\": \"6FF5F46D4444FF54BEBA07ECC525583C\",\n \"originalId\": 209397,\n \"name\": \"\u592A\u806A\u660E\",\n \"duration\": 263173,\n \"artists\": [\n \"\u9648\u7EEE\u8D1E\"\n ],\n \"album\": \"Groupies\u5409\u4ED6\u624B\"\n },\n {\n \"id\": \"2475F24C6460EB870FE478CBC065D949\",\n \"originalId\": 209478,\n \"name\": \"\u8FD8\u662F\u4F1A\u5BC2\u5BDE\",\n \"duration\": 272293,\n \"artists\": [\n \"\u9648\u7EEE\u8D1E\"\n ],\n \"album\": \"\u8FD8\u662F\u4F1A\u5BC2\u5BDE\"\n },\n {\n \"id\": \"F505DAD72E186F071E9A653E84BB7256\",\n \"originalId\": 209400,\n \"name\": \"\u5C0F\u6B65\u821E\u66F2\",\n \"duration\": 259720,\n \"artists\": [\n \"\u9648\u7EEE\u8D1E\"\n ],\n \"album\": \"Groupies\u5409\u4ED6\u624B\"\n },\n {\n \"id\": \"BA183ABC5617703C68AF596D853F3D1E\",\n \"originalId\": 1906020021,\n \"name\": \"\u5206\u624B\u5427\",\n \"duration\": 300485,\n \"artists\": [\n \"\u5B59\u76DB\u5E0C\"\n ],\n \"album\": \"\u5206\u624B\u5427\"\n },\n {\n \"id\": \"65EFA9D33F3C7C116E3B23A786E1644E\",\n \"originalId\": 1907710034,\n \"name\": \"\u5927\u96E8\",\n \"duration\": 192208,\n \"artists\": [\n \"deca joins\"\n ],\n \"album\": \"\u5927\u96E8\"\n },\n {\n \"id\": \"42F49BF58BBD238764968E7FB22C654E\",\n \"originalId\": 350830,\n \"name\": \"Song F\",\n \"duration\": 391373,\n \"artists\": [\n \"\u8FBE\u8FBE\u4E50\u961F\"\n ],\n \"album\": \"\u9EC4\u91D1\u65F6\u4EE3\"\n },\n {\n \"id\": \"B42ADFF1A172A263EFFE553EFE433114\",\n \"originalId\": 1830419924,\n \"name\": \"Peaches\",\n \"duration\": 198080,\n \"artists\": [\n \"Justin Bieber\",\n \"Daniel Caesar\",\n \"GIV\u0112ON\"\n ],\n \"album\": \"Justice (\u4E2D\u56FD\u8C6A\u534E\u7279\u522B\u7248)\"\n },\n {\n \"id\": \"372BBF8296D70C205588F16C0332D538\",\n \"originalId\": 209494,\n \"name\": \"\u544A\u8BC9\u6211\",\n \"duration\": 313733,\n \"artists\": [\n \"\u9648\u7EEE\u8D1E\"\n ],\n \"album\": \"\u8FD8\u662F\u4F1A\u5BC2\u5BDE\"\n }\n ]\n },\n {\n \"year\": 2021,\n \"songs\": [\n {\n \"id\": \"19CAA9B592FE619055089EA55EDB804D\",\n \"originalId\": 1806540577,\n \"name\": \"\u79D8\u5BC6\u7231\u4EBA\",\n \"duration\": 246052,\n \"artists\": [\n \"\u751C\u53C8\u4E27\u6A02\u968A\"\n ],\n \"album\": \"\u5B8C\u5168\u4EBA\"\n },\n {\n \"id\": \"1D82C894F7C10F54ED0FE08033D696E6\",\n \"originalId\": 1393632139,\n \"name\": \"\u6CA1\u6709\u4EBA\u5728\u610F\u4ED6\u7684\u773C\u775B\u91CC\",\n \"duration\": 246496,\n \"artists\": [\n \"\u6253\u5012\u4E09\u660E\u6CBB\"\n ],\n \"album\": \"Roadkill\"\n },\n {\n \"id\": \"46AA8EA5A5D2F0F6F9AB83BAA5DBCD61\",\n \"originalId\": 1813831223,\n \"name\": \"\u68A6\u7279\u522B\u5A07\",\n \"duration\": 258923,\n \"artists\": [\n \"\u56DE\u6625\u4E39\"\n ],\n \"album\": \"\u68A6\u7279\u522B\u5A07\"\n },\n {\n \"id\": \"A553C90106297DDB6794EB34162BF750\",\n \"originalId\": 551338024,\n \"name\": \"\u4F60\u7684\u57CE\u5E02\",\n \"duration\": 359786,\n \"artists\": [\n \"\u58F0\u97F3\u73A9\u5177\"\n ],\n \"album\": \"\u52B3\u52A8\u4E4B\u4F59\"\n },\n {\n \"id\": \"463C5B930C5C935FB9BE78963CF6CCFE\",\n \"originalId\": 1479507541,\n \"name\": \"\u8F6F\u5F31\",\n \"duration\": 290485,\n \"artists\": [\n \"Schoolgirl byebye\"\n ],\n \"album\": \"\u8F6F\u5F31\"\n },\n {\n \"id\": \"B6A765D90D0A936767501312E6557692\",\n \"originalId\": 367867,\n \"name\": \"\u8FD9\u90FD\u6CA1\u4EC0\u4E48\",\n \"duration\": 330240,\n \"artists\": [\n \"\u5927\u98DE\"\n ],\n \"album\": \"R&B\"\n },\n {\n \"id\": \"050B0E772847CF254E4B11367E2696B1\",\n \"originalId\": 29600457,\n \"name\": \"Farewell (Original Version)\",\n \"duration\": 462341,\n \"artists\": [\n \"\u82B1\u4F26\"\n ],\n \"album\": \"Farewell\"\n },\n {\n \"id\": \"138C871BB3D402BDDAA09139A24CBBC7\",\n \"originalId\": 367872,\n \"name\": \"\u5947\u8FF9\",\n \"duration\": 367120,\n \"artists\": [\n \"\u5927\u98DE\"\n ],\n \"album\": \"R&B\"\n },\n {\n \"id\": \"42F49BF58BBD238764968E7FB22C654E\",\n \"originalId\": 350830,\n \"name\": \"Song F\",\n \"duration\": 391373,\n \"artists\": [\n \"\u8FBE\u8FBE\u4E50\u961F\"\n ],\n \"album\": \"\u9EC4\u91D1\u65F6\u4EE3\"\n },\n {\n \"id\": \"EABA5A89671E8482BF47024D29AF57AA\",\n \"originalId\": 1422880870,\n \"name\": \"\u96F7\u8BFA\u5179\",\n \"duration\": 213857,\n \"artists\": [\n \"\u7834\u788E\u4E50\u961F\"\n ],\n \"album\": \"\u6211\u5C06\u732E\u8EAB\u4E8E\u8FD9\u4E00\u975E\u798F\u5373\u7978\u7684\u7406\u60F3\"\n }\n ]\n },\n {\n \"year\": 2020,\n \"songs\": [\n {\n \"id\": \"42F49BF58BBD238764968E7FB22C654E\",\n \"originalId\": 350830,\n \"name\": \"Song F\",\n \"duration\": 391373,\n \"artists\": [\n \"\u8FBE\u8FBE\u4E50\u961F\"\n ],\n \"album\": \"\u9EC4\u91D1\u65F6\u4EE3\"\n },\n {\n \"id\": \"B9742236287284BDD9B3BBFFB893B340\",\n \"originalId\": 408845163,\n \"name\": \"\u7ED9\u4F60\u7684\u6B4C\",\n \"duration\": 296904,\n \"artists\": [\n \"\u7834\u788E\u4E50\u961F\"\n ],\n \"album\": \"\u7ED9\u4F60\u7684\u6B4C\"\n },\n {\n \"id\": \"47579051A42B01AA0B53A342EDE8E2FF\",\n \"originalId\": 30070851,\n \"name\": \"\u4E01\u9999\",\n \"duration\": 244386,\n \"artists\": [\n \"\u66F9\u65B9\"\n ],\n \"album\": \"\u7EA2\u661F20\u53F7\"\n },\n {\n \"id\": \"3F11835DAD7DF227BD06B76AD009DFE0\",\n \"originalId\": 520460033,\n \"name\": \"\u8A00\u8868\",\n \"duration\": 236313,\n \"artists\": [\n \"\u54C1\u51A0\"\n ],\n \"album\": \"\u8A00\u5916\u4E4B\u610F\"\n },\n {\n \"id\": \"E072B953872AF774BF62FB6DFF646E3C\",\n \"originalId\": 28853012,\n \"name\": \"\u5982\u679C\u4F60\u51B7\",\n \"duration\": 253573,\n \"artists\": [\n \"\u5F20\u96E8\u751F\"\n ],\n \"album\": \"7\u5339\u72FC \u7535\u5F71\u539F\u58F0\u5E26\"\n },\n {\n \"id\": \"B940A70377BA242ED84BC2380C9BC08D\",\n \"originalId\": 1331399785,\n \"name\": \"\u591C\u6E38\u8BB0\",\n \"duration\": 285399,\n \"artists\": [\n \"\u94A2\u5FC3\"\n ],\n \"album\": \"\u591C\u6E38\u8BB0\"\n },\n {\n \"id\": \"C1392B05B1BD7A9FDC33044910DB20BD\",\n \"originalId\": 483563726,\n \"name\": \"3000\u516C\u91CC\",\n \"duration\": 309054,\n \"artists\": [\n \"\u518D\u5FAA\u73AF\u4E50\u961F\"\n ],\n \"album\": \"3000\u516C\u91CC\"\n },\n {\n \"id\": \"EA5AE8F52D20A5C63B8E4B58C75714E0\",\n \"originalId\": 1311319315,\n \"name\": \"\u676F\u4E2D\u9152\",\n \"duration\": 48065,\n \"artists\": [\n \"\u9694\u58C1\u56E2\u4E50\u961F\"\n ],\n \"album\": \"\u676F\u4E2D\u9152\"\n },\n {\n \"id\": \"4C67F31594DEE3080934BD0C7DB4A1C4\",\n \"originalId\": 28587869,\n \"name\": \"\u9C9C\u82B1\u5728\u5CB8\u4E0A\u5F00\",\n \"duration\": 310000,\n \"artists\": [\n \"\u4E94\u6761\u4EBA\"\n ],\n \"album\": \"\u4E00\u4E9B\u98CE\u666F\"\n },\n {\n \"id\": \"2F5BB2F975BB82B66E5FA3BCB01F89DB\",\n \"originalId\": 1294899223,\n \"name\": \"\u6211\u7684\u8EAB\u65C1\u662F\u4E00\u6247\u4EAE\u4E86\u53C8\u6697\u7684\u7A97\",\n \"duration\": 232807,\n \"artists\": [\n \"\u7406\u60F3\u540E\u82B1\u56ED\"\n ],\n \"album\": \"\u8FD9\u4E2A\u4E16\u754C\u8BA9\u4F60\u7D27\u5F20\u5BB3\u6015\u5417\uFF1F\"\n }\n ]\n },\n {\n \"year\": 2019,\n \"songs\": [\n {\n \"id\": \"2A97FC870A2AE62767111B352E091871\",\n \"originalId\": 343008,\n \"name\": \"\u9EC4\u91D1\u65F6\u95F4\",\n \"duration\": 206000,\n \"artists\": [\n \"AK(AK47)\u4E50\u961F\"\n ],\n \"album\": \"\u51FA\u53D1\"\n },\n {\n \"id\": \"E69C6E871E0867BEED5E4C54ECDC9F68\",\n \"originalId\": 1317457805,\n \"name\": \"\u62AB\u661F\u6234\u6708\u7684\u60F3\u4F60\",\n \"duration\": 349003,\n \"artists\": [\n \"\u544A\u4E94\u4EBA\"\n ],\n \"album\": \"\u62AB\u661F\u6234\u6708\u7684\u60F3\u4F60\"\n },\n {\n \"id\": \"B940A70377BA242ED84BC2380C9BC08D\",\n \"originalId\": 1331399785,\n \"name\": \"\u591C\u6E38\u8BB0\",\n \"duration\": 285399,\n \"artists\": [\n \"\u94A2\u5FC3\"\n ],\n \"album\": \"\u591C\u6E38\u8BB0\"\n },\n {\n \"id\": \"EAD0AAEE9A0956319C3FCE403A0D654C\",\n \"originalId\": 1336153991,\n \"name\": \"\u6865\u8C46\u9EBB\u888B\",\n \"duration\": 135113,\n \"artists\": [\n \"\u9C7C\u9AA8\u59B9\"\n ],\n \"album\": \"\u6865\u8C46\u9EBB\u888B\"\n },\n {\n \"id\": \"71CBF1E4A95A5CDEA5A068FD02264AF3\",\n \"originalId\": 417247973,\n \"name\": \"\u52A8\u8EAB\",\n \"duration\": 360066,\n \"artists\": [\n \"\u751F\u7965\u4E50\u961F\"\n ],\n \"album\": \"\u52A8\u8EAB\"\n },\n {\n \"id\": \"9D46FDD798076B279B9B032827098679\",\n \"originalId\": 2345639,\n \"name\": \"Take It to the Bridge\",\n \"duration\": 198000,\n \"artists\": [\n \"Crazy Town\"\n ],\n \"album\": \"Darkhorse\"\n },\n {\n \"id\": \"6D44B6DCE61C1C11AAB33CD29425D205\",\n \"originalId\": 35678542,\n \"name\": \"\u4E16\u754C\u60B2\",\n \"duration\": 386000,\n \"artists\": [\n \"Chinese Football\"\n ],\n \"album\": \"Chinese Football\"\n },\n {\n \"id\": \"F3E4527908237BC0241F11FD9631B36E\",\n \"originalId\": 421885313,\n \"name\": \"\u76F2\u5C71\",\n \"duration\": 316067,\n \"artists\": [\n \"\u5047\u5047\u689D\"\n ],\n \"album\": \"\u76F2\u5C71\"\n },\n {\n \"id\": \"122708386F1484C2947E5ED4E615D2CD\",\n \"originalId\": 28923460,\n \"name\": \"\u6CA1\u6709\u4F60\u966A\u6211\u7684\u591C\u665A\",\n \"duration\": 263755,\n \"artists\": [\n \"\u9694\u58C1\u56E2\u4E50\u961F\"\n ],\n \"album\": \"\u4E0D\u662F\u4E00\u8DEF\u4EBA(Demo)\"\n },\n {\n \"id\": \"AC8C645195F0330CF88974D1F5B576F9\",\n \"originalId\": 17748980,\n \"name\": \"American Capitalist\",\n \"duration\": 208546,\n \"artists\": [\n \"Five Finger Death Punch\"\n ],\n \"album\": \"American Capitalist\"\n }\n ]\n },\n {\n \"year\": 2018,\n \"songs\": [\n {\n \"id\": \"7707C860DF079306D154870266EDFABC\",\n \"originalId\": 458360071,\n \"name\": \"\u8D70\",\n \"duration\": 339000,\n \"artists\": [\n \"\u5EB7\u59C6\u58EBCOM'Z\"\n ],\n \"album\": \"\u4F60\u8981\u5982\u4F55\uFF0C\u6211\u4EEC\u5C31\u5982\u4F55\"\n },\n {\n \"id\": \"76CAD3BCF9D324DB30E10FBF819FE209\",\n \"originalId\": 474507670,\n \"name\": \"\u4E0B\u60AC\",\n \"duration\": 240865,\n \"artists\": [\n \"\u5C0F\u5DEB\u5E08\u4E50\u961F\"\n ],\n \"album\": \"\u4E0B\u60AC\"\n },\n {\n \"id\": \"C13C0553E9033870B6C510111D0DA364\",\n \"originalId\": 28923455,\n \"name\": \"\u8DEF\",\n \"duration\": 208120,\n \"artists\": [\n \"\u9694\u58C1\u56E2\u4E50\u961F\"\n ],\n \"album\": \"\u4E0D\u662F\u4E00\u8DEF\u4EBA(Demo)\"\n },\n {\n \"id\": \"7A953B40B1A2438CBDFCD0D1537B1B47\",\n \"originalId\": 474412284,\n \"name\": \"\u7D2B\u8272\",\n \"duration\": 216741,\n \"artists\": [\n \"\u5C0F\u5DEB\u5E08\u4E50\u961F\"\n ],\n \"album\": \"Little Wizard \u2160\"\n },\n {\n \"id\": \"E66ED0729A55EA73BBA60CCA304EF466\",\n \"originalId\": 22664745,\n \"name\": \"two moons\",\n \"duration\": 250253,\n \"artists\": [\n \"toe\"\n ],\n \"album\": \"For Long Tomorrow\"\n },\n {\n \"id\": \"B61BC29CF2DC3B430C61B57FC7B71454\",\n \"originalId\": 503013129,\n \"name\": \"CLOSER\",\n \"duration\": 281135,\n \"artists\": [\n \"TIMERS\"\n ],\n \"album\": \"CLOSER\"\n },\n {\n \"id\": \"0809CFD9FCBE798C93EDDAAE5AA882EE\",\n \"originalId\": 33410518,\n \"name\": \"Because I Hear You\",\n \"duration\": 281466,\n \"artists\": [\n \"toe\"\n ],\n \"album\": \"HEAR YOU\"\n },\n {\n \"id\": \"65B31542B153F26347170D647DF583A1\",\n \"originalId\": 28923461,\n \"name\": \"\u518D\u89C1\u5427!\u670B\u53CB\",\n \"duration\": 214900,\n \"artists\": [\n \"\u9694\u58C1\u56E2\u4E50\u961F\"\n ],\n \"album\": \"\u4E0D\u662F\u4E00\u8DEF\u4EBA(Demo)\"\n },\n {\n \"id\": \"41511016EC4B0186A1C077381A3EEB83\",\n \"originalId\": 472137696,\n \"name\": \"\u518D\u8C08\u8BB0\u5FC6\",\n \"duration\": 338500,\n \"artists\": [\n \"\u76D8\u5C3C\u897F\u6797\"\n ],\n \"album\": \"\u4E0E\u4E16\u754C\u6E29\u6696\u76F8\u62E5\"\n }\n ]\n }\n ]\n}\n", "import { execSync } from 'child_process';\n\nexport function copyToClipboard(text: string): void {\n execSync(`printf '${text.replace(/'/g, \"'\\\\''\")}' | pbcopy`, { stdio: 'ignore' });\n}\n", "import { Command } from 'commander';\nimport chalk from 'chalk';\n\ninterface Link {\n name: string;\n url: string;\n icon: string;\n description: string | null;\n}\n\nexport function createLinksCommand(): Command {\n const cmd = new Command('links')\n .description('\u67E5\u770B\u793E\u4EA4\u94FE\u63A5 (--json \u8F93\u51FA\u7ED3\u6784\u5316\u6570\u636E)')\n .option('--json', '\u8F93\u51FA JSON \u683C\u5F0F')\n .action(async (opts) => {\n const apiUrl = process.env.MAIDANG_API_URL || 'http://localhost:3000';\n\n try {\n const res = await fetch(`${apiUrl}/api/links`);\n if (!res.ok) throw new Error(`HTTP ${res.status}`);\n const links: Link[] = await res.json();\n\n if (opts.json) {\n console.log(JSON.stringify({ tool: 'maidang', command: 'links', data: links }, null, 2));\n return;\n }\n\n console.log(chalk.cyan.bold('\uD83C\uDF10 \u793E\u4EA4\u94FE\u63A5\\n'));\n for (const link of links) {\n console.log(` ${link.icon} ${chalk.white(link.name)} - ${chalk.gray(link.description || '')}`);\n console.log(` ${chalk.blue(link.url)}\\n`);\n }\n } catch (err) {\n console.error(chalk.red(`\u83B7\u53D6\u94FE\u63A5\u5931\u8D25: ${err instanceof Error ? err.message : err}`));\n process.exit(1);\n }\n });\n\n return cmd;\n}\n", "import { Command } from 'commander';\nimport chalk from 'chalk';\n\ninterface Project {\n name: string;\n description: string;\n url: string | null;\n icon: string;\n category: string;\n}\n\nexport function createProjectsCommand(): Command {\n const cmd = new Command('projects')\n .description('\u67E5\u770B\u4E2A\u4EBA\u9879\u76EE')\n .option('--json', '\u8F93\u51FA JSON \u683C\u5F0F')\n .action(async (opts) => {\n const apiUrl = process.env.MAIDANG_API_URL || 'http://localhost:3000';\n\n try {\n const res = await fetch(`${apiUrl}/api/projects`);\n if (!res.ok) throw new Error(`HTTP ${res.status}`);\n const projects: Project[] = await res.json();\n\n if (opts.json) {\n console.log(JSON.stringify({ tool: 'maidang', command: 'projects', data: projects }, null, 2));\n return;\n }\n\n console.log(chalk.cyan.bold('\uD83D\uDE80 \u4E2A\u4EBA\u9879\u76EE\\n'));\n for (const project of projects) {\n console.log(` ${project.icon} ${chalk.white.bold(project.name)} ${chalk.gray(`[${project.category}]`)}`);\n console.log(` ${project.description}`);\n if (project.url) {\n console.log(` ${chalk.blue(project.url)}`);\n }\n console.log('');\n }\n } catch (err) {\n console.error(chalk.red(`\u83B7\u53D6\u9879\u76EE\u5931\u8D25: ${err instanceof Error ? err.message : err}`));\n process.exit(1);\n }\n });\n\n return cmd;\n}\n", "import { Command } from 'commander';\nimport chalk from 'chalk';\n\ninterface Tool {\n name: string;\n description: string;\n icon: string;\n url: string | null;\n category: string;\n}\n\nexport function createToolsCommand(): Command {\n const cmd = new Command('tools')\n .description('\u67E5\u770B\u5E38\u7528\u5DE5\u5177')\n .option('--json', '\u8F93\u51FA JSON \u683C\u5F0F')\n .action(async (opts) => {\n const apiUrl = process.env.MAIDANG_API_URL || 'http://localhost:3000';\n\n try {\n const res = await fetch(`${apiUrl}/api/tools`);\n if (!res.ok) throw new Error(`HTTP ${res.status}`);\n const tools: Tool[] = await res.json();\n\n if (opts.json) {\n console.log(JSON.stringify({ tool: 'maidang', command: 'tools', data: tools }, null, 2));\n return;\n }\n\n const byCategory = tools.reduce((acc, tool) => {\n if (!acc[tool.category]) acc[tool.category] = [];\n acc[tool.category].push(tool);\n return acc;\n }, {} as Record<string, Tool[]>);\n\n const categoryNames: Record<string, string> = {\n software: '\u5E38\u7528\u8F6F\u4EF6',\n device: '\u8BBE\u5907',\n desktop: '\u684C\u9762\u88C5\u5907',\n };\n\n console.log(chalk.cyan.bold('\uD83D\uDD27 \u5E38\u7528\u5DE5\u5177\\n'));\n\n for (const [cat, items] of Object.entries(byCategory)) {\n console.log(chalk.white.bold(` ${categoryNames[cat] || cat}`));\n for (const tool of items) {\n const urlStr = tool.url ? ` ${chalk.blue(tool.url)}` : '';\n console.log(` ${tool.icon} ${tool.name} - ${chalk.gray(tool.description)}${urlStr}`);\n }\n console.log('');\n }\n } catch (err) {\n console.error(chalk.red(`\u83B7\u53D6\u5DE5\u5177\u5931\u8D25: ${err instanceof Error ? err.message : err}`));\n process.exit(1);\n }\n });\n\n return cmd;\n}\n", "import { Command } from 'commander';\nimport chalk from 'chalk';\n\nfunction hr(char = '\u2500', len = 40) {\n console.log(chalk.dim(char.repeat(len)));\n}\n\nexport function createContactCommand(): Command {\n const cmd = new Command('contact')\n .description('\u8054\u7CFB\u65B9\u5F0F')\n .option('--json', '\u8F93\u51FA JSON \u683C\u5F0F')\n .action((opts) => {\n const data = { email: 'borisdunk@sina.com', note: '\u56DE\u590D\u53EF\u80FD\u8F83\u6162\uFF0C\u770B\u5230\u4F1A\u56DE' };\n\n if (opts.json) {\n console.log(JSON.stringify({ tool: 'maidang', command: 'contact', data }, null, 2));\n return;\n }\n\n console.log('');\n console.log(chalk.bold('\u8054\u7CFB\u65B9\u5F0F'));\n console.log('');\n hr();\n console.log('');\n console.log(` Email ${chalk.blue('borisdunk@sina.com')}`);\n console.log('');\n console.log(` ${chalk.dim('\u56DE\u590D\u53EF\u80FD\u8F83\u6162\uFF0C\u770B\u5230\u4F1A\u56DE')}`);\n console.log('');\n });\n\n return cmd;\n}\n", "import { Command } from 'commander';\nimport chalk from 'chalk';\n\ninterface Skill {\n name: string;\n tags: string[];\n}\n\nconst skills: Skill[] = [\n // \u751F\u6D3B\u65B9\u5F0F\n { name: '\u4E3E\u94C1 / \u5065\u8EAB', tags: ['life'] },\n { name: '\u98DE\u76D8', tags: ['life'] },\n { name: '\u5409\u4ED6', tags: ['life'] },\n { name: '\u71D5\u9EA6\u62FF\u94C1', tags: ['life'] },\n // \u6280\u672F\n { name: 'TypeScript', tags: ['tech'] },\n { name: 'Next.js / React', tags: ['tech'] },\n { name: 'Node.js', tags: ['tech'] },\n { name: 'AI Agent / LLM', tags: ['tech'] },\n { name: 'CLI / TUI \u5F00\u53D1', tags: ['tech'] },\n { name: '\u524D\u7AEF\u5DE5\u7A0B\u5316', tags: ['tech'] },\n { name: 'Prisma / PostgreSQL', tags: ['tech'] },\n];\n\nfunction hr(char = '\u2500', len = 40) {\n console.log(chalk.dim(char.repeat(len)));\n}\n\nexport function createSkillsCommand(): Command {\n const cmd = new Command('skills')\n .description('\u6280\u80FD\u4E0E\u5174\u8DA3')\n .option('--json', '\u8F93\u51FA JSON \u683C\u5F0F')\n .action((opts) => {\n if (opts.json) {\n console.log(JSON.stringify({ tool: 'maidang', command: 'skills', data: skills }, null, 2));\n return;\n }\n\n const life = skills.filter(s => s.tags.includes('life'));\n const tech = skills.filter(s => s.tags.includes('tech'));\n\n console.log('');\n console.log(chalk.bold('\u751F\u6D3B'));\n console.log('');\n console.log(' ' + life.map(s => chalk.white(s.name)).join(chalk.dim(' \u00B7 ')));\n console.log('');\n hr();\n console.log('');\n console.log(chalk.bold('\u6280\u672F'));\n console.log('');\n console.log(' ' + tech.map(s => chalk.white(s.name)).join(chalk.dim(' \u00B7 ')));\n console.log('');\n });\n\n return cmd;\n}\n", "import { Command } from 'commander';\nimport chalk from 'chalk';\n\ninterface StatusInfo {\n status: 'available' | 'working' | 'busy' | 'traveling';\n label: string;\n description: string;\n updatedAt: string;\n}\n\nfunction getStatus(): StatusInfo {\n const hour = new Date().getHours();\n const isWeekend = [0, 6].includes(new Date().getDay());\n\n if (isWeekend) return { status: 'available', label: '\u5468\u672B\u53EF\u7EA6', description: '\u65F6\u95F4\u7075\u6D3B\uFF0C\u53EF\u4EE5\u804A\u804A' };\n if (hour < 9 || hour >= 22) return { status: 'available', label: '\u7A7A\u95F2\u4E2D', description: '\u975E\u5DE5\u4F5C\u65F6\u95F4' };\n if (hour >= 19) return { status: 'busy', label: '\u4E0B\u73ED\u4E86', description: '\u4F11\u606F\u4E2D\uFF0C\u770B\u5230\u4F1A\u56DE' };\n return { status: 'working', label: '\u5DE5\u4F5C\u4E2D', description: '\u6B63\u5E38\u5DE5\u4F5C\u65F6\u6BB5' };\n}\n\nfunction hr(char = '\u2500', len = 40) {\n console.log(chalk.dim(char.repeat(len)));\n}\n\nexport function createStatusCommand(): Command {\n const cmd = new Command('status')\n .description('\u5F53\u524D\u72B6\u6001')\n .option('--json', '\u8F93\u51FA JSON \u683C\u5F0F')\n .action((opts) => {\n const info = getStatus();\n\n if (opts.json) {\n console.log(JSON.stringify({ tool: 'maidang', command: 'status', data: info }, null, 2));\n return;\n }\n\n console.log('');\n console.log(chalk.bold('\u5F53\u524D\u72B6\u6001'));\n console.log('');\n hr();\n console.log('');\n console.log(` ${chalk.cyan('\u25CF')} ${chalk.white(info.label)}`);\n console.log(` ${chalk.dim(info.description)}`);\n console.log('');\n });\n\n return cmd;\n}\n", "import { Command } from 'commander';\nimport chalk from 'chalk';\n\ninterface WhoAmI {\n tagline: string;\n location: string;\n status: {\n status: 'available' | 'working' | 'busy' | 'traveling';\n label: string;\n description: string;\n };\n links: { label: string; url: string }[];\n contact: string;\n website: string;\n updatedAt: string;\n}\n\nfunction getStatus(): WhoAmI['status'] {\n const hour = new Date().getHours();\n const isWeekend = [0, 6].includes(new Date().getDay());\n\n if (isWeekend) return { status: 'available', label: '\u5468\u672B\u53EF\u7EA6', description: '\u65F6\u95F4\u7075\u6D3B\uFF0C\u53EF\u4EE5\u804A\u804A' };\n if (hour < 9 || hour >= 22) return { status: 'available', label: '\u7A7A\u95F2\u4E2D', description: '\u975E\u5DE5\u4F5C\u65F6\u95F4' };\n if (hour >= 19) return { status: 'busy', label: '\u4E0B\u73ED\u4E86', description: '\u4F11\u606F\u4E2D\uFF0C\u770B\u5230\u4F1A\u56DE' };\n return { status: 'working', label: '\u5DE5\u4F5C\u4E2D', description: '\u6B63\u5E38\u5DE5\u4F5C\u65F6\u6BB5' };\n}\n\nfunction hr(char = '\u2500', len = 40) {\n console.log(chalk.dim(char.repeat(len)));\n}\n\nexport function createWhoAmICommand(): Command {\n const cmd = new Command('whoami')\n .description('\u4E86\u89E3\u6211')\n .option('--json', '\u8F93\u51FA JSON \u683C\u5F0F')\n .action((opts) => {\n const status = getStatus();\n const whoami: WhoAmI = {\n tagline: '\u6587\u79D1\u8F6C\u7801 / \u5168\u6808 / \u72EC\u7ACB\u5F00\u53D1\u3002\u676D\u5DDE\uFF0C\u71D5\u9EA6\u62FF\u94C1\u7231\u597D\u8005\uFF0C\u4E3E\u94C1\uFF0C\u98DE\u76D8\uFF0C\u5076\u5C14\u5F39\u7434\u3002',\n location: '\u676D\u5DDE \u00B7 EFC',\n status,\n links: [\n { label: 'Blog', url: 'https://www.maidang.me' },\n ],\n contact: 'borisdunk@sina.com',\n website: 'https://www.maidang.me',\n updatedAt: new Date().toISOString(),\n };\n\n if (opts.json) {\n console.log(JSON.stringify({ tool: 'maidang', command: 'whoami', data: whoami }, null, 2));\n return;\n }\n\n console.log('');\n console.log(chalk.bold('\u6211\u662F \u9EA6\u5F53'));\n console.log('');\n console.log(' ' + whoami.tagline);\n console.log('');\n hr();\n console.log('');\n console.log(` ${chalk.cyan('\uD83D\uDCCD')} ${whoami.location}`);\n console.log(` ${chalk.cyan('\u23F1')} ${whoami.status.label} \u00B7 ${chalk.dim(whoami.status.description)}`);\n console.log('');\n hr();\n console.log('');\n console.log(` Blog ${chalk.blue.underline(whoami.website)}`);\n console.log(` Email ${chalk.blue(whoami.contact)}`);\n console.log('');\n hr();\n console.log('');\n console.log(` ${chalk.dim('\u60F3\u4E86\u89E3\u66F4\u591A\uFF1F')}`);\n console.log(` ${chalk.dim('maidang skills / career / posts / links')}`);\n console.log('');\n });\n\n return cmd;\n}\n", "/**\n * \u8BA1\u7B97\u9EA6\u5F53\u7684\u5E74\u9F84\u7248\u672C\u53F7\n * \u51FA\u751F\u65E5\u671F\uFF1A1997\u5E743\u670810\u65E5\n * \u8FD4\u56DE\u683C\u5F0F\uFF1A\u5E74\u9F84.\u5C0F\u7248\u672C\u53F7.\u8865\u4E01\u53F7\n */\nexport function getAgeVersion(): string {\n const birthDate = new Date(1997, 2, 10); // \u6708\u4EFD\u4ECE0\u5F00\u59CB\uFF0C\u6240\u4EE52\u662F3\u6708\n const today = new Date();\n\n let age = today.getFullYear() - birthDate.getFullYear();\n const monthDiff = today.getMonth() - birthDate.getMonth();\n\n // \u5982\u679C\u8FD8\u6CA1\u8FC7\u751F\u65E5\uFF0C\u5E74\u9F84\u51CF1\n if (monthDiff < 0 || (monthDiff === 0 && today.getDate() < birthDate.getDate())) {\n age--;\n }\n\n // \u8FD9\u91CC\u7684\u5C0F\u7248\u672C\u548C\u8865\u4E01\u53F7\u53EF\u4EE5\u540E\u7EED\u4ECE package.json \u8BFB\u53D6\u6216\u56FA\u5B9A\n // \u73B0\u5728\u5148\u8FD4\u56DE\u7B80\u5355\u683C\u5F0F\n return `${age}.0.0`;\n}\n\n/**\n * \u83B7\u53D6\u7248\u672C\u53F7\u548C\u751F\u65E5\u4FE1\u606F\n */\nexport function getVersionInfo(): { version: string; birthDate: Date; currentAge: number; nextBirthday: Date } {\n const birthDate = new Date(1997, 2, 10); // 1997\u5E743\u670810\u65E5\n const today = new Date();\n\n let currentAge = today.getFullYear() - birthDate.getFullYear();\n const monthDiff = today.getMonth() - birthDate.getMonth();\n\n // \u8BA1\u7B97\u4E0B\u4E00\u4E2A\u751F\u65E5\n const nextBirthday = new Date(today.getFullYear(), birthDate.getMonth(), birthDate.getDate());\n\n if (monthDiff < 0 || (monthDiff === 0 && today.getDate() < birthDate.getDate())) {\n currentAge--;\n } else {\n nextBirthday.setFullYear(today.getFullYear() + 1);\n }\n\n const version = `${currentAge}.0.0`;\n\n return {\n version,\n birthDate,\n currentAge,\n nextBirthday\n };\n}\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": ["Command", "chalk", "chalk", "cmd", "Command", "chalk", "Command", "chalk", "Command", "chalk", "Command", "React", "useState", "render", "Box", "Text", "useInput", "Command", "useInput", "React", "Box", "Text", "useState", "Command", "render", "Command", "chalk", "Command", "chalk", "Command", "chalk", "Command", "chalk", "Command", "chalk", "hr", "Command", "chalk", "hr", "Command", "chalk", "getStatus", "hr", "Command"]
|
|
3
|
+
"sources": ["../src/index.ts", "../src/commands/home.ts", "../src/utils/display.ts", "../src/commands/career.ts", "../src/data/career.json", "../src/commands/cat.ts", "../src/commands/posts.tsx", "../src/commands/songs.tsx", "../src/data/songs.json", "../src/utils/clipboard.ts", "../src/commands/links.ts", "../src/commands/projects.ts", "../src/commands/tools.ts", "../src/commands/contact.ts", "../src/commands/skills.ts", "../src/commands/status.ts", "../src/commands/whoami.ts", "../src/commands/chat.tsx", "../src/utils/chat-api.ts", "../src/utils/version.ts"],
|
|
4
|
+
"sourcesContent": ["#!/usr/bin/env node\n\nimport { Command } from 'commander';\nimport { createHomeCommand } from './commands/home';\nimport { createCareerCommand } from './commands/career';\nimport { createCatCommand } from './commands/cat';\nimport { createPostsCommand } from './commands/posts';\nimport { createSongsCommand } from './commands/songs';\nimport { createLinksCommand } from './commands/links';\nimport { createProjectsCommand } from './commands/projects';\nimport { createToolsCommand } from './commands/tools';\nimport { createContactCommand } from './commands/contact';\nimport { createSkillsCommand } from './commands/skills';\nimport { createStatusCommand } from './commands/status';\nimport { createWhoAmICommand } from './commands/whoami';\nimport { createChatCommand } from './commands/chat';\nimport { getAgeVersion, getVersionInfo } from './utils/version';\n\nconst program = new Command();\n\n// \u52A8\u6001\u8BA1\u7B97\u5E74\u9F84\u7248\u672C\u53F7\nconst versionInfo = getVersionInfo();\n\nprogram\n .name('maidang')\n .description('\u4E86\u89E3\u9EA6\u5F53 - \u4E00\u4E2A AI \u65F6\u4EE3\u7684\u63A2\u7D22\u8005')\n .version(getAgeVersion(), '-v, --version', '\u663E\u793A\u9EA6\u5F53\u7684\u5E74\u9F84\u7248\u672C\u53F7');\n\n// \u6DFB\u52A0\u4E00\u4E2A\u7279\u6B8A\u7684\u751F\u65E5\u4FE1\u606F\u547D\u4EE4\nprogram\n .command('birthday')\n .description('\u663E\u793A\u9EA6\u5F53\u7684\u751F\u65E5\u4FE1\u606F')\n .action(() => {\n const { birthDate, currentAge, nextBirthday, version } = versionInfo;\n\n console.log(`\uD83C\uDF82 \u9EA6\u5F53\u7684\u751F\u65E5\u4FE1\u606F`);\n console.log('');\n console.log(`\u51FA\u751F\u65E5\u671F: ${birthDate.toLocaleDateString('zh-CN', { year: 'numeric', month: 'long', day: 'numeric' })}`);\n console.log(`\u5F53\u524D\u5E74\u9F84: ${currentAge} \u5C81`);\n console.log(`\u5F53\u524D\u7248\u672C: ${version} (\u5E74\u9F84\u7248\u672C)`);\n console.log(`\u4E0B\u4E00\u4E2A\u751F\u65E5: ${nextBirthday.toLocaleDateString('zh-CN', { year: 'numeric', month: 'long', day: 'numeric' })}`);\n\n const daysUntilNextBirthday = Math.ceil((nextBirthday.getTime() - new Date().getTime()) / (1000 * 60 * 60 * 24));\n console.log(`\u8DDD\u79BB\u751F\u65E5\u8FD8\u6709: ${daysUntilNextBirthday} \u5929`);\n\n if (daysUntilNextBirthday <= 30) {\n console.log(`\uD83C\uDF89 \u5FEB\u8981\u8FC7\u751F\u65E5\u4E86\uFF01`);\n }\n });\n\nconst careerCmd = createCareerCommand();\nconst catCmd = createCatCommand();\nconst postsCmd = createPostsCommand();\nconst songsCmd = createSongsCommand();\nconst linksCmd = createLinksCommand();\nconst projectsCmd = createProjectsCommand();\nconst toolsCmd = createToolsCommand();\nconst contactCmd = createContactCommand();\nconst skillsCmd = createSkillsCommand();\nconst statusCmd = createStatusCommand();\nconst whoamiCmd = createWhoAmICommand();\nconst chatCmd = createChatCommand();\n\nprogram.addCommand(careerCmd);\nprogram.addCommand(catCmd);\nprogram.addCommand(postsCmd);\nprogram.addCommand(songsCmd);\nprogram.addCommand(linksCmd);\nprogram.addCommand(projectsCmd);\nprogram.addCommand(toolsCmd);\nprogram.addCommand(contactCmd);\nprogram.addCommand(skillsCmd);\nprogram.addCommand(statusCmd);\nprogram.addCommand(whoamiCmd);\nprogram.addCommand(chatCmd);\n\nif (!process.argv.slice(2).length) {\n const homeCmd = createHomeCommand();\n homeCmd.parse(process.argv);\n} else {\n program.parse(process.argv);\n}\n", "import { Command } from 'commander';\nimport chalk from 'chalk';\nimport { createSpinner } from '../utils/display';\n\nconst commands = [\n { name: 'whoami', desc: '\u4E86\u89E3\u6211' },\n { name: 'skills', desc: '\u6280\u80FD & \u5174\u8DA3' },\n { name: 'career', desc: '\u5DE5\u4F5C' },\n { name: 'posts', desc: '\u63A8\u6587' },\n { name: 'songs', desc: '\u5E74\u5EA6\u6B4C\u5355' },\n { name: 'links', desc: '\u94FE\u63A5' },\n { name: 'projects', desc: '\u9879\u76EE' },\n { name: 'cat | meow', desc: '\u9EA6\u9EA6' },\n];\n\nexport function createHomeCommand(): Command {\n const cmd = new Command('maidang')\n .description('\u6B22\u8FCE\u6765\u5230\u9EA6\u5F53\u7684\u4E16\u754C')\n .action(async () => {\n const spinner = createSpinner('\u6B63\u5728\u53EC\u5524...');\n spinner.start();\n\n await new Promise(resolve => setTimeout(resolve, 800));\n\n spinner.stop();\n console.clear();\n\n console.log(chalk.bold('\u6211\u662F \u9EA6\u5F53'));\n console.log(chalk.dim('\u6587\u79D1\u8F6C\u7801 / \u5168\u6808 / \u72EC\u7ACB\u5F00\u53D1\u3002\u676D\u5DDE\uFF0C\u71D5\u9EA6\u62FF\u94C1\u7231\u597D\u8005\uFF0C\u4E3E\u94C1\uFF0C\u98DE\u76D8\uFF0C\u5076\u5C14\u5F39\u7434\u3002'));\n console.log('');\n console.log(chalk.dim('\u2500'.repeat(40)));\n console.log('');\n\n for (const cmd of commands) {\n console.log(` ${chalk.white(cmd.name.padEnd(12))} ${chalk.dim(cmd.desc)}`);\n }\n\n console.log('');\n console.log(chalk.dim('\u2500'.repeat(40)));\n console.log('');\n });\n\n return cmd;\n}\n", "import chalk from 'chalk';\nimport boxen from 'boxen';\nimport figlet from 'figlet';\nimport ora, { Ora } from 'ora';\n\nexport async function displayTitle(text: string): Promise<void> {\n return new Promise((resolve) => {\n figlet.text(text, {\n font: 'Big',\n horizontalLayout: 'default',\n verticalLayout: 'default'\n }, (err, data) => {\n if (err) {\n console.log(chalk.cyan.bold(text));\n } else {\n console.log(chalk.cyan(data));\n }\n resolve();\n });\n });\n}\n\nexport function displayBox(content: string, options?: {\n title?: string;\n borderColor?: string;\n padding?: number;\n}): void {\n const borderOptions: any = {\n padding: options?.padding || 1,\n borderColor: options?.borderColor || 'cyan',\n borderStyle: 'round'\n };\n\n if (options?.title) {\n borderOptions.title = options.title;\n borderOptions.titleAlignment = 'center';\n }\n\n console.log(boxen(content, borderOptions));\n}\n\nexport function createSpinner(text: string): Ora {\n return ora({\n text,\n color: 'cyan'\n });\n}\n\nexport function displaySeparator(char: string = '\u2500', length: number = 50): void {\n console.log(chalk.gray(char.repeat(length)));\n}\n\nexport function displayItem(icon: string, text: string, color: string = 'cyan'): void {\n const colorMethod = (chalk as any)[color];\n if (colorMethod) {\n console.log(colorMethod(icon), text);\n } else {\n console.log(chalk.cyan(icon), text);\n }\n}\n\nexport function displaySection(title: string): void {\n displaySeparator();\n console.log(chalk.bold.cyan(`\\n${title}`));\n displaySeparator();\n}\n", "import { Command } from 'commander';\nimport chalk from 'chalk';\nimport careerData from '../data/career.json';\nimport { displaySection } from '../utils/display';\n\nexport function createCareerCommand(): Command {\n const cmd = new Command('career')\n .description('\u67E5\u770B\u6211\u7684\u5DE5\u4F5C\u7ECF\u5386 (--json \u8F93\u51FA\u7ED3\u6784\u5316\u6570\u636E)')\n .option('--json', '\u8F93\u51FA JSON \u683C\u5F0F')\n .action((opts) => {\n if (opts.json) {\n console.log(JSON.stringify({ tool: 'maidang', command: 'career', data: careerData }, null, 2));\n return;\n }\n\n displaySection('\uD83D\uDCBC \u5DE5\u4F5C\u7ECF\u5386');\n\n careerData.career.forEach((job, index) => {\n console.log('');\n\n console.log(chalk.yellow.bold(`\uD83D\uDCCB ${job.company}`));\n console.log(chalk.cyan(` ${job.role}`));\n console.log(chalk.gray(` ${job.period}`));\n console.log('');\n\n console.log(chalk.white(' \uD83D\uDCDD ' + job.description));\n console.log('');\n\n if (job.achievements && job.achievements.length > 0) {\n console.log(chalk.gray(' \u4E3B\u8981\u6210\u5C31:'));\n job.achievements.forEach(achievement => {\n console.log(chalk.green(' \u2713 ' + achievement));\n });\n }\n\n if (index < careerData.career.length - 1) {\n console.log('');\n console.log(chalk.gray('\u2500'.repeat(40)));\n }\n });\n\n console.log('');\n });\n\n return cmd;\n}\n", "{\n \"career\": [\n {\n \"company\": \"\u5F71\u5200 RPA\uFF08AI Power \u56E2\u961F\uFF09\",\n \"role\": \"\u5168\u6808\u5DE5\u7A0B\u5E08 / AI Agent \u5F00\u53D1\u8005\",\n \"period\": \"2025.10 - \u81F3\u4ECA\",\n \"description\": \"\u805A\u7126 AI \u5DE5\u4F5C\u6D41\u5EFA\u8BBE\uFF0C\u4E3B\u5BFC AI Agent \u65B9\u6848\u8BBE\u8BA1\u4E0E\u843D\u5730\uFF0C\u63A8\u52A8\u4E1A\u52A1\u4ECE\u529F\u80FD\u5F00\u53D1\u8D70\u5411\u667A\u80FD\u5316\u6D41\u7A0B\u7F16\u6392\u3002\",\n \"achievements\": [\n \"\u8D1F\u8D23 AI \u5DE5\u4F5C\u6D41\u76F8\u5173\u80FD\u529B\u5EFA\u8BBE\uFF0C\u63A8\u52A8\u56E2\u961F\u5F62\u6210\u53EF\u590D\u7528\u7684\u6D41\u7A0B\u5316\u4EA4\u4ED8\u65B9\u5F0F\",\n \"\u62C5\u4EFB AI Agent \u6838\u5FC3\u5F00\u53D1\u8005\uFF0C\u8986\u76D6\u4ECE\u9700\u6C42\u62C6\u89E3\u3001\u63D0\u793A\u8BCD\u8BBE\u8BA1\u5230\u670D\u52A1\u7AEF\u843D\u5730\u7684\u5B8C\u6574\u94FE\u8DEF\",\n \"\u4EE5\u5168\u6808\u65B9\u5F0F\u534F\u540C\u524D\u540E\u7AEF\u5F00\u53D1\uFF0C\u63D0\u5347\u590D\u6742\u4E1A\u52A1\u5728\u7814\u53D1\u4FA7\u7684\u843D\u5730\u6548\u7387\",\n \"\u5728\u56E2\u961F\u5185\u63A8\u8FDB AI \u5DE5\u7A0B\u5316\u5B9E\u8DF5\uFF0C\u6301\u7EED\u63D0\u5347\u9879\u76EE\u7A33\u5B9A\u6027\u4E0E\u8FED\u4EE3\u901F\u5EA6\"\n ]\n },\n {\n \"company\": \"\u676D\u5DDE\u4E0D\u5FD8\u667A\u80FD\u79D1\u6280\u6709\u9650\u516C\u53F8\",\n \"role\": \"\u5168\u6808\u5F00\u53D1\u5DE5\u7A0B\u5E08\",\n \"period\": \"2024.10 - 2025.09\",\n \"description\": \"\u53C2\u4E0E AI \u89C6\u9891\u751F\u6210\u4E0E\u5E7F\u544A\u6295\u653E\u4EA7\u54C1\u5EFA\u8BBE\uFF0C\u8D1F\u8D23\u524D\u540E\u7AEF\u8054\u52A8\u548C\u6838\u5FC3\u529F\u80FD\u843D\u5730\u3002\",\n \"achievements\": [\n \"\u57FA\u4E8E Next.js + React + Node.js \u53C2\u4E0E\u9AD8\u4EA4\u4E92\u5E94\u7528\u4E0E\u4E2D\u53F0\u670D\u52A1\u5F00\u53D1\",\n \"\u53C2\u4E0E ASR\u3001LLM\u3001\u89C6\u9891\u4EFB\u52A1\u94FE\u8DEF\u7B49 AI \u76F8\u5173\u529F\u80FD\u5EFA\u8BBE\",\n \"\u53C2\u4E0E\u81EA\u52A8\u5316\u6295\u653E\u4E0E\u5DE5\u7A0B\u5316\u6D41\u7A0B\u5EFA\u8BBE\uFF0C\u63D0\u5347\u4E1A\u52A1\u5904\u7406\u6548\u7387\"\n ]\n },\n {\n \"company\": \"\u676D\u5DDE\u89C6\u674F\u79D1\u6280\u6709\u9650\u516C\u53F8\",\n \"role\": \"\u524D\u7AEF\u5F00\u53D1\u5DE5\u7A0B\u5E08\",\n \"period\": \"2022.10 - 2024.06\",\n \"description\": \"\u8D1F\u8D23\u524D\u7AEF\u5DE5\u7A0B\u5316\u3001\u4E1A\u52A1\u7CFB\u7EDF\u5F00\u53D1\u4E0E\u56E2\u961F\u534F\u4F5C\u6D41\u7A0B\u4F18\u5316\u3002\",\n \"achievements\": [\n \"\u63A8\u52A8\u89C4\u8303\u4F53\u7CFB\u843D\u5730\uFF08Lint\u3001Commit \u89C4\u8303\u3001\u811A\u624B\u67B6\u7B49\uFF09\uFF0C\u63D0\u5347\u56E2\u961F\u7814\u53D1\u4E00\u81F4\u6027\",\n \"\u53C2\u4E0E\u6784\u5EFA\u79C1\u6709\u5E93\u4E0E\u5DE5\u7A0B\u5316\u4F53\u7CFB\uFF0C\u63D0\u5347\u591A\u9879\u76EE\u590D\u7528\u6548\u7387\",\n \"\u652F\u6491\u540E\u53F0\u7CFB\u7EDF\u4E0E\u6838\u5FC3\u4E1A\u52A1\u9875\u9762\u7684\u6301\u7EED\u8FED\u4EE3\"\n ]\n },\n {\n \"company\": \"\u534E\u76D6\u5BB6\u5C45\u3001\u9177\u5BB6\u4E50\uFF08\u4E0D\u540C\u516C\u53F8\uFF09\",\n \"role\": \"\u524D\u7AEF\u5F00\u53D1\u5DE5\u7A0B\u5E08\",\n \"period\": \"2020.11 - 2022.06\",\n \"description\": \"\u65E9\u671F\u7ECF\u5386\uFF0C\u4E3B\u8981\u8D1F\u8D23 2D Canvas \u76F8\u5173\u529F\u80FD\u5F00\u53D1\u4E0E\u7EF4\u62A4\u3002\",\n \"achievements\": [\n \"\u53C2\u4E0E 2D \u8BBE\u8BA1\u5DE5\u5177\u4E0E\u4E3B\u7AD9\u76F8\u5173\u524D\u7AEF\u529F\u80FD\u5F00\u53D1\",\n \"\u8D1F\u8D23\u753B\u5E03\u4EA4\u4E92\u3001\u5386\u53F2\u8BB0\u5F55\u4E0E\u5FEB\u6377\u952E\u7B49\u80FD\u529B\u8FED\u4EE3\",\n \"\u4E0E\u4EA7\u54C1\u3001\u8BBE\u8BA1\u3001\u6D4B\u8BD5\u534F\u4F5C\u63A8\u8FDB\u7248\u672C\u4EA4\u4ED8\"\n ]\n }\n ]\n}\n", "import { Command } from 'commander';\nimport chalk from 'chalk';\nimport path from 'path';\nimport fs from 'fs';\n\nconst RETRO_PIXEL_WIDTH = 28;\nconst RETRO_PIXEL_HEIGHT = 16;\n\nconst resolveExecutableDir = (): string => {\n if (!process.argv[1]) {\n return process.cwd();\n }\n\n const executablePath = path.resolve(process.argv[1]);\n try {\n const resolvedExecutablePath = fs.realpathSync(executablePath);\n return path.dirname(resolvedExecutablePath);\n } catch {\n return path.dirname(executablePath);\n }\n};\n\nconst resolveCatImagePath = (): string | null => {\n const executableDir = resolveExecutableDir();\n const packageRootDir = path.resolve(executableDir, '..');\n const candidatePaths = [\n path.resolve(process.cwd(), 'src/assets/cat.jpg'),\n path.resolve(packageRootDir, 'src/assets/cat.jpg'),\n path.resolve(packageRootDir, 'dist/assets/cat.jpg'),\n path.resolve(executableDir, 'assets/cat.jpg'),\n path.resolve(executableDir, '../assets/cat.jpg')\n ];\n\n for (const candidatePath of candidatePaths) {\n if (fs.existsSync(candidatePath)) {\n return candidatePath;\n }\n }\n\n return null;\n};\n\nexport function createCatCommand(): Command {\n const cmd = new Command('cat')\n .alias('meow')\n .description('\u67E5\u770B\u9EA6\u9EA6')\n .action(async () => {\n console.log(chalk.yellow.bold('\u9EA6\u9EA6'));\n console.log('');\n\n try {\n const catImagePath = resolveCatImagePath();\n\n if (catImagePath) {\n try {\n const { default: terminalImage } = await import('terminal-image');\n const image = await terminalImage.file(catImagePath, {\n width: RETRO_PIXEL_WIDTH,\n height: RETRO_PIXEL_HEIGHT,\n preserveAspectRatio: true\n });\n\n console.log(image);\n } catch (error) {\n console.log(chalk.red('\u56FE\u7247\u6E32\u67D3\u5931\u8D25'));\n }\n } else {\n console.log(chalk.gray('\u8BF7\u5C06\u732B\u54AA\u56FE\u7247\u653E\u5728 src/assets/cat.jpg'));\n }\n } catch (error) {\n console.log(chalk.gray('\uD83D\uDCF8 \u8BF7\u5C06\u732B\u54AA\u56FE\u7247\u653E\u5728 src/assets/cat.jpg'));\n }\n\n console.log('');\n });\n\n return cmd;\n}\n", "import React, { useState, useEffect } from 'react';\nimport { render, Box, Text, useInput } from 'ink';\nimport { Command } from 'commander';\n\ninterface PostItem {\n slug: string;\n title?: string | null;\n content: string;\n summary?: string | null;\n author?: string | null;\n handle?: string | null;\n date?: string | null;\n time?: string | null;\n tags?: string[];\n publishedAt?: string | null;\n}\n\ntype View = 'LIST' | 'DETAIL';\n\n// \u2500\u2500 List view \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nconst ListView: React.FC<{\n posts: PostItem[];\n selectedIndex: number;\n onSelect: (index: number) => void;\n onEnter: () => void;\n onQuit: () => void;\n}> = ({ posts, selectedIndex, onSelect, onEnter, onQuit }) => {\n useInput((input, key) => {\n if (input === 'q' || input === 'Q') {\n onQuit();\n return;\n }\n if (key.upArrow) {\n onSelect(Math.max(0, selectedIndex - 1));\n } else if (key.downArrow) {\n onSelect(Math.min(posts.length - 1, selectedIndex + 1));\n } else if (key.return) {\n onEnter();\n }\n });\n\n return (\n <Box flexDirection=\"column\" paddingX={2} paddingY={1}>\n <Box marginBottom={1}>\n <Text bold color=\"cyan\">\uD83D\uDC26 \u63A8\u6587\u5217\u8868</Text>\n <Text dimColor> \u00B7 {posts.length} \u6761</Text>\n </Box>\n <Text dimColor marginBottom={1}>\u2191\u2193 \u9009\u62E9 \u00B7 Enter \u67E5\u770B\u8BE6\u60C5 \u00B7 q \u9000\u51FA</Text>\n\n <Box flexDirection=\"column\" borderStyle=\"single\" borderColor=\"gray\" paddingX={0} paddingY={0}>\n {posts.map((post, index) => {\n const isSelected = selectedIndex === index;\n const num = String(index + 1).padStart(2, ' ');\n const title = post.title || post.summary?.substring(0, 40) || post.content.substring(0, 40);\n const meta = [post.date, post.time].filter(Boolean).join(' ');\n return (\n <Box\n key={post.slug}\n paddingX={1}\n paddingY={0}\n marginY={0}\n borderStyle=\"single\"\n borderColor={isSelected ? 'cyan' : 'gray'}\n >\n <Text dimColor>{num}</Text>\n <Text dimColor> \u2502 </Text>\n <Box flexDirection=\"column\" flexGrow={1}>\n <Text bold={isSelected} color={isSelected ? 'cyan' : undefined}>\n {title}\n </Text>\n {meta && (\n <Text dimColor>{meta}</Text>\n )}\n </Box>\n {isSelected && (\n <Text dimColor> \u2190</Text>\n )}\n </Box>\n );\n })}\n </Box>\n </Box>\n );\n};\n\n// \u2500\u2500 Detail view \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nconst DetailView: React.FC<{\n post: PostItem;\n onBack: () => void;\n onQuit: () => void;\n onPrev: () => void;\n onNext: () => void;\n hasPrev: boolean;\n hasNext: boolean;\n}> = ({ post, onBack, onQuit, onPrev, onNext, hasPrev, hasNext }) => {\n useInput((input, key) => {\n if (input === 'q' || input === 'Q') {\n onQuit();\n return;\n }\n if (key.escape || input === 'b' || input === 'B') {\n onBack();\n return;\n }\n if (key.leftArrow && hasPrev) {\n onPrev();\n } else if (key.rightArrow && hasNext) {\n onNext();\n }\n });\n\n const paragraphs = post.content\n .split('\\n')\n .reduce<string[][]>((acc, line) => {\n if (line.trim() === '') {\n acc.push([]);\n } else {\n if (acc.length === 0 || acc[acc.length - 1].length === 0) {\n acc.push([line]);\n } else {\n acc[acc.length - 1].push(line);\n }\n }\n return acc;\n }, [])\n .filter(p => p.length > 0);\n\n const tags = post.tags || [];\n const meta = [post.date, post.time].filter(Boolean).join(' ');\n\n return (\n <Box flexDirection=\"column\" paddingX={2} paddingY={1} flexShrink={0}>\n {/* Header */}\n <Box marginBottom={1}>\n <Text bold color=\"cyan\">\uD83D\uDCC4 \u63A8\u6587\u8BE6\u60C5</Text>\n <Text dimColor> \u00B7 Esc/q \u8FD4\u56DE \u00B7 \u2190\u2192 \u5207\u6362</Text>\n </Box>\n\n {/* Meta */}\n <Box flexDirection=\"column\" borderStyle=\"single\" borderColor=\"cyan\" paddingX={1} marginBottom={0} flexShrink={0}>\n <Box>\n <Text bold color=\"white\">{post.author || '\u9EA6\u5F53'}</Text>\n <Text dimColor> {post.handle || '@maidang'}</Text>\n {meta && <Text dimColor> \u00B7 {meta}</Text>}\n </Box>\n {post.title && (\n <Text bold color=\"cyan\">{post.title}</Text>\n )}\n </Box>\n\n {/* Content */}\n <Box\n flexDirection=\"column\"\n borderStyle=\"single\"\n borderColor=\"gray\"\n paddingX={1}\n marginY={0}\n flexShrink={1}\n overflow=\"hidden\"\n >\n {paragraphs.map((para, pi) => (\n <Box key={pi} flexDirection=\"column\" marginBottom={pi < paragraphs.length - 1 ? 1 : 0} flexShrink={0}>\n {para.map((line, li) => (\n <Text key={li} wrap=\"wrap\">{line}</Text>\n ))}\n </Box>\n ))}\n </Box>\n\n {/* Tags */}\n {tags.length > 0 && (\n <Box borderStyle=\"single\" borderColor=\"gray\" paddingX={1} marginY={0} flexShrink={0}>\n <Text dimColor>\n {tags.map(tag => <Text key={tag} color=\"cyan\">#{tag} </Text>)}\n </Text>\n </Box>\n )}\n\n {/* Footer */}\n <Box marginTop={1} flexShrink={0}>\n <Text dimColor>\n \u2190 {hasPrev ? '\u4E0A\u4E00\u7BC7' : '\u65E0'}\u3000\u3000\u2192 {hasNext ? '\u4E0B\u4E00\u7BC7' : '\u65E0'}\u3000\u3000Esc \u8FD4\u56DE\n </Text>\n </Box>\n </Box>\n );\n};\n\n// \u2500\u2500 App \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nconst PostsApp: React.FC<{ apiUrl: string }> = ({ apiUrl }) => {\n const [posts, setPosts] = useState<PostItem[]>([]);\n const [selectedIndex, setSelectedIndex] = useState(0);\n const [view, setView] = useState<View>('LIST');\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<string | null>(null);\n\n useEffect(() => {\n fetch(apiUrl)\n .then((res) => {\n if (!res.ok) throw new Error(`HTTP ${res.status}`);\n return res.json();\n })\n .then((data) => {\n setPosts(data);\n setLoading(false);\n })\n .catch((err) => {\n setError(err.message);\n setLoading(false);\n });\n }, [apiUrl]);\n\n const handleQuit = () => {\n process.exit(0);\n };\n\n const handleEnter = () => {\n setView('DETAIL');\n };\n\n const handleBack = () => {\n setView('LIST');\n };\n\n const handlePrev = () => {\n setSelectedIndex(i => Math.max(0, i - 1));\n };\n\n const handleNext = () => {\n setSelectedIndex(i => Math.min(posts.length - 1, i + 1));\n };\n\n if (loading) {\n return (\n <Box flexDirection=\"column\" paddingX={2} paddingY={1}>\n <Text dimColor>\u52A0\u8F7D\u4E2D...</Text>\n </Box>\n );\n }\n\n if (error) {\n return (\n <Box flexDirection=\"column\" paddingX={2} paddingY={1}>\n <Text color=\"red\">\u52A0\u8F7D\u5931\u8D25: {error}</Text>\n <Text dimColor>\u8BF7\u68C0\u67E5\u7F51\u7EDC\u6216API\u5730\u5740</Text>\n </Box>\n );\n }\n\n if (posts.length === 0) {\n return (\n <Box flexDirection=\"column\" paddingX={2} paddingY={1}>\n <Text color=\"yellow\">\u6682\u65E0\u63A8\u6587</Text>\n </Box>\n );\n }\n\n if (view === 'DETAIL') {\n return (\n <DetailView\n post={posts[selectedIndex]}\n onBack={handleBack}\n onQuit={handleQuit}\n onPrev={handlePrev}\n onNext={handleNext}\n hasPrev={selectedIndex > 0}\n hasNext={selectedIndex < posts.length - 1}\n />\n );\n }\n\n return (\n <ListView\n posts={posts}\n selectedIndex={selectedIndex}\n onSelect={setSelectedIndex}\n onEnter={handleEnter}\n onQuit={handleQuit}\n />\n );\n};\n\nexport function createPostsCommand(): Command {\n const apiUrl = 'https://www.maidang.me/api/social-posts?type=social';\n const cmd = new Command('posts')\n .description('\u63A8\u6587\u5217\u8868\uFF0C\u8FDB\u5165\u540E\u53EF\u67E5\u770B\u8BE6\u60C5 (--json \u8F93\u51FA\u7ED3\u6784\u5316\u6570\u636E)')\n .option('--json', '\u8F93\u51FA JSON \u683C\u5F0F');\n\n cmd.action((opts) => {\n const wantsJson = opts.json;\n\n if (wantsJson) {\n fetch(apiUrl)\n .then(res => res.json())\n .then(data => console.log(JSON.stringify({ tool: 'maidang', command: 'posts', data }, null, 2)))\n .catch(err => { console.error(err); process.exit(1); });\n return;\n }\n\n render(<PostsApp apiUrl={apiUrl} />);\n });\n\n return cmd;\n}\n", "import React, { useState, useEffect, useRef } from 'react';\nimport { render, Box, Text, useInput } from 'ink';\nimport { Command } from 'commander';\nimport songsData from '../data/songs.json';\nimport { copyToClipboard } from '../utils/clipboard';\n\ninterface Song {\n id: string;\n originalId: number;\n name: string;\n duration: number;\n artists: string[];\n album: string;\n}\n\ninterface YearEntry {\n year: number;\n songs: Song[];\n}\n\ninterface PlaylistMeta {\n name: string;\n trackCount: number;\n year: number;\n}\n\nconst ALL_YEARS: YearEntry[] = songsData.data;\nconst AVAILABLE_YEARS: number[] = songsData.years;\nconst ALL_META: PlaylistMeta[] = songsData.meta;\n\nfunction formatDuration(ms: number): string {\n const s = Math.round(ms / 1000);\n const m = Math.floor(s / 60);\n const sec = s % 60;\n return `${m}:${sec.toString().padStart(2, '0')}`;\n}\n\n// \u2500\u2500 Year picker view \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nconst YearPicker: React.FC<{\n selectedIndex: number;\n onSelect: (index: number) => void;\n onConfirm: () => void;\n onQuit: () => void;\n}> = ({ selectedIndex, onSelect, onConfirm, onQuit }) => {\n useInput((input, key) => {\n if (input === 'q' || input === 'Q') { onQuit(); return; }\n if (key.upArrow) { onSelect(Math.max(0, selectedIndex - 1)); }\n else if (key.downArrow) { onSelect(Math.min(ALL_YEARS.length - 1, selectedIndex + 1)); }\n else if (key.return) { onConfirm(); }\n });\n\n return (\n <Box flexDirection=\"column\" paddingX={2} paddingY={1}>\n <Box marginBottom={1}>\n <Text bold color=\"cyan\">\uD83C\uDFB5 \u5E74\u5EA6\u6B4C\u5355</Text>\n <Text dimColor> \u00B7 {ALL_YEARS.length} \u4E2A\u5E74\u4EFD</Text>\n </Box>\n <Text dimColor marginBottom={1}>\u2191\u2193 \u9009\u62E9\u5E74\u4EFD \u00B7 Enter \u8FDB\u5165 \u00B7 q \u9000\u51FA</Text>\n\n <Box flexDirection=\"column\" borderStyle=\"single\" borderColor=\"gray\" paddingX={0} paddingY={0}>\n {ALL_YEARS.map((entry, index) => {\n const isSelected = selectedIndex === index;\n const meta = ALL_META.find(m => m.year === entry.year);\n const preview = entry.songs[0]\n ? `${entry.songs[0].artists[0] || ''} \u00B7 ${entry.songs[0].name}`\n : '';\n return (\n <Box\n key={entry.year}\n paddingX={1}\n paddingY={0}\n marginY={0}\n borderStyle=\"single\"\n borderColor={isSelected ? 'cyan' : 'gray'}\n >\n <Text dimColor>{entry.year}</Text>\n <Text dimColor> \u2502 </Text>\n <Box flexDirection=\"column\" flexGrow={1}>\n <Text bold={isSelected} color={isSelected ? 'cyan' : undefined}>{entry.year} \u5E74\u5EA6\u6B4C\u5355</Text>\n <Text dimColor>{meta?.trackCount || entry.songs.length} \u9996 {preview ? `\u00B7 ${preview}` : ''}</Text>\n </Box>\n {isSelected && <Text dimColor> \u2190</Text>}\n </Box>\n );\n })}\n </Box>\n </Box>\n );\n};\n\n// \u2500\u2500 Song list view \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nconst SongList: React.FC<{\n entry: YearEntry;\n selectedIndex: number;\n onSelect: (index: number) => void;\n onEnter: () => void;\n onBack: () => void;\n onQuit: () => void;\n}> = ({ entry, selectedIndex, onSelect, onEnter, onBack, onQuit }) => {\n useInput((input, key) => {\n if (input === 'q' || input === 'Q') { onQuit(); return; }\n if (key.escape || input === 'b' || input === 'B') { onBack(); return; }\n if (key.upArrow) { onSelect(Math.max(0, selectedIndex - 1)); }\n else if (key.downArrow) { onSelect(Math.min(entry.songs.length - 1, selectedIndex + 1)); }\n else if (key.return) { onEnter(); }\n });\n\n return (\n <Box flexDirection=\"column\" paddingX={2} paddingY={1}>\n <Box marginBottom={1}>\n <Text bold color=\"cyan\">\uD83C\uDFB5 {entry.year} \u5E74\u5EA6\u6B4C\u5355</Text>\n <Text dimColor> \u00B7 {entry.songs.length} \u9996 \u00B7 Esc \u8FD4\u56DE</Text>\n </Box>\n <Text dimColor marginBottom={1}>\u2191\u2193 \u9009\u62E9 \u00B7 Enter \u67E5\u770B\u8BE6\u60C5 \u00B7 q \u9000\u51FA</Text>\n\n <Box flexDirection=\"column\" borderStyle=\"single\" borderColor=\"gray\" paddingX={0} paddingY={0}>\n {entry.songs.map((song, index) => {\n const isSelected = selectedIndex === index;\n const num = String(index + 1).padStart(2, ' ');\n const artists = song.artists.join(', ');\n const dur = formatDuration(song.duration);\n return (\n <Box\n key={song.id}\n paddingX={1}\n paddingY={0}\n marginY={0}\n borderStyle=\"single\"\n borderColor={isSelected ? 'cyan' : 'gray'}\n >\n <Text dimColor>{num}</Text>\n <Text dimColor> \u2502 </Text>\n <Box flexDirection=\"column\" flexGrow={1}>\n <Text bold={isSelected} color={isSelected ? 'cyan' : undefined}>{song.name}</Text>\n <Text dimColor>{artists} \u00B7 {dur}</Text>\n </Box>\n {isSelected && <Text dimColor> \u2190</Text>}\n </Box>\n );\n })}\n </Box>\n </Box>\n );\n};\n\n// \u2500\u2500 Song detail view \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nconst SongDetail: React.FC<{\n song: Song;\n year: number;\n onBack: () => void;\n onQuit: () => void;\n onPrev: () => void;\n onNext: () => void;\n hasPrev: boolean;\n hasNext: boolean;\n}> = ({ song, year, onBack, onQuit, onPrev, onNext, hasPrev, hasNext }) => {\n const [copied, setCopied] = useState(false);\n const timerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n useInput((input, key) => {\n if (input === 'q' || input === 'Q') { onQuit(); return; }\n if (key.escape || input === 'b' || input === 'B') { onBack(); return; }\n if (key.return) {\n copyToClipboard(song.name);\n setCopied(true);\n if (timerRef.current) clearTimeout(timerRef.current);\n timerRef.current = setTimeout(() => setCopied(false), 1500);\n return;\n }\n if (key.leftArrow && hasPrev) { onPrev(); }\n else if (key.rightArrow && hasNext) { onNext(); }\n });\n\n return (\n <Box flexDirection=\"column\" paddingX={2} paddingY={1} flexShrink={0}>\n <Box marginBottom={1}>\n <Text bold color=\"cyan\">\uD83C\uDFB5 {year} \u5E74\u5EA6\u6B4C\u5355</Text>\n <Text dimColor> \u00B7 Esc/q \u8FD4\u56DE \u00B7 \u2190\u2192 \u5207\u6362</Text>\n </Box>\n\n <Box flexDirection=\"column\" borderStyle=\"single\" borderColor=\"cyan\" paddingX={1} marginBottom={1} flexShrink={0}>\n <Text bold color=\"white\">{song.name}</Text>\n <Text dimColor>{song.artists.join(', ')}</Text>\n <Text dimColor>\u4E13\u8F91: {song.album}</Text>\n <Text dimColor>\u65F6\u957F: {formatDuration(song.duration)}</Text>\n </Box>\n\n <Box marginTop={1} flexShrink={0}>\n <Text dimColor>\n \u2190 {hasPrev ? '\u4E0A\u4E00\u9996' : '\u65E0'}\u3000\u3000\u2192 {hasNext ? '\u4E0B\u4E00\u9996' : '\u65E0'}\u3000\u3000Esc \u8FD4\u56DE\u3000\u3000Enter {copied ? '\u2713 \u5DF2\u590D\u5236' : '\u590D\u5236\u6B4C\u540D'}\n </Text>\n </Box>\n </Box>\n );\n};\n\n// \u2500\u2500 App \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\ntype View = 'YEAR_PICK' | 'SONG_LIST' | 'SONG_DETAIL';\n\nconst SongsApp: React.FC<{ defaultYearIndex?: number }> = ({ defaultYearIndex }) => {\n const [selectedYearIndex, setSelectedYearIndex] = useState(defaultYearIndex ?? 0);\n const [selectedSongIndex, setSelectedSongIndex] = useState(0);\n const [view, setView] = useState<View>('YEAR_PICK');\n\n const handleQuit = () => process.exit(0);\n\n const currentEntry = ALL_YEARS[selectedYearIndex];\n\n if (view === 'SONG_DETAIL') {\n const song = currentEntry.songs[selectedSongIndex];\n if (!song) return null;\n return (\n <SongDetail\n song={song}\n year={currentEntry.year}\n onBack={() => setView('SONG_LIST')}\n onQuit={handleQuit}\n onPrev={() => setSelectedSongIndex(i => Math.max(0, i - 1))}\n onNext={() => setSelectedSongIndex(i => Math.min(currentEntry.songs.length - 1, i + 1))}\n hasPrev={selectedSongIndex > 0}\n hasNext={selectedSongIndex < currentEntry.songs.length - 1}\n />\n );\n }\n\n if (view === 'SONG_LIST') {\n return (\n <SongList\n entry={currentEntry}\n selectedIndex={selectedSongIndex}\n onSelect={setSelectedSongIndex}\n onEnter={() => setView('SONG_DETAIL')}\n onBack={() => { setSelectedSongIndex(0); setView('YEAR_PICK'); }}\n onQuit={handleQuit}\n />\n );\n }\n\n // YEAR_PICK\n return (\n <YearPicker\n selectedIndex={selectedYearIndex}\n onSelect={(i) => { setSelectedYearIndex(i); setSelectedSongIndex(0); }}\n onConfirm={() => { setSelectedSongIndex(0); setView('SONG_LIST'); }}\n onQuit={handleQuit}\n />\n );\n};\n\nexport function createSongsCommand(): Command {\n const cmd = new Command('songs')\n .description(`\u5E74\u5EA6\u6B4C\u5355\uFF0C\u652F\u6301: ${AVAILABLE_YEARS.join(', ')} (--json \u8F93\u51FA\u7ED3\u6784\u5316\u6570\u636E)`)\n .option('--json', '\u8F93\u51FA JSON \u683C\u5F0F')\n .option('--year <year>', `\u8DF3\u8F6C\u81F3\u6307\u5B9A\u5E74\u4EFD\u7684\u6B4C\u66F2\u5217\u8868`);\n\n cmd.action((opts) => {\n if (opts.json) {\n if (opts.year) {\n const year = parseInt(opts.year, 10);\n const entry = ALL_YEARS.find(e => e.year === year);\n if (!entry) {\n console.error(`\u6CA1\u6709 ${year} \u5E74\u7684\u6B4C\u5355`);\n process.exit(1);\n }\n const meta = ALL_META.find(m => m.year === year);\n console.log(JSON.stringify({ tool: 'maidang', command: 'songs', meta, data: entry.songs }, null, 2));\n } else {\n console.log(JSON.stringify({ tool: 'maidang', command: 'songs', years: AVAILABLE_YEARS, meta: ALL_META, data: ALL_YEARS }, null, 2));\n }\n return;\n }\n\n let defaultYearIndex: number | undefined;\n if (opts.year) {\n const year = parseInt(opts.year, 10);\n defaultYearIndex = ALL_YEARS.findIndex(e => e.year === year);\n if (defaultYearIndex < 0) {\n console.error(`\u6CA1\u6709 ${year} \u5E74\u7684\u6B4C\u5355`);\n process.exit(1);\n }\n }\n\n render(<SongsApp defaultYearIndex={defaultYearIndex} />);\n });\n\n return cmd;\n}\n", "{\n \"years\": [\n 2025,\n 2024,\n 2023,\n 2022,\n 2021,\n 2020,\n 2019,\n 2018\n ],\n \"meta\": [\n {\n \"year\": 2025,\n \"name\": \"2025 \u5E74\u5EA6\u6B4C\u5355\",\n \"trackCount\": 10\n },\n {\n \"year\": 2024,\n \"name\": \"2024 \u5E74\u5EA6\u6B4C\u5355\",\n \"trackCount\": 9\n },\n {\n \"year\": 2023,\n \"name\": \"2023 \u5E74\u5EA6\u6B4C\u5355\",\n \"trackCount\": 9\n },\n {\n \"year\": 2022,\n \"name\": \"2022 \u5E74\u5EA6\u6B4C\u5355\",\n \"trackCount\": 10\n },\n {\n \"year\": 2021,\n \"name\": \"2021 \u5E74\u5EA6\u6B4C\u5355\",\n \"trackCount\": 10\n },\n {\n \"year\": 2020,\n \"name\": \"2020 \u5E74\u5EA6\u6B4C\u5355\",\n \"trackCount\": 10\n },\n {\n \"year\": 2019,\n \"name\": \"2019 \u5E74\u5EA6\u6B4C\u5355\",\n \"trackCount\": 10\n },\n {\n \"year\": 2018,\n \"name\": \"2018 \u5E74\u5EA6\u6B4C\u5355\",\n \"trackCount\": 9\n }\n ],\n \"data\": [\n {\n \"year\": 2025,\n \"songs\": [\n {\n \"id\": \"26A4BC62792A618D36B77D386EB5528E\",\n \"originalId\": 208953,\n \"name\": \"\u98CE\u5439\u8FC7\u4E0B\u96E8\u5929\",\n \"duration\": 213695,\n \"artists\": [\n \"\u66F9\u65B9\"\n ],\n \"album\": \"\u9047\u89C1\u6211\"\n },\n {\n \"id\": \"202438C91A8F858AFE777A5258D41985\",\n \"originalId\": 21162546,\n \"name\": \"Summertime\",\n \"duration\": 246720,\n \"artists\": [\n \"My Chemical Romance\"\n ],\n \"album\": \"Danger Days: The True Lives of the Fabulous Killjoys\"\n },\n {\n \"id\": \"077BE501A0DBEA3B645566A9EC53C2C2\",\n \"originalId\": 208961,\n \"name\": \"\u79CB\u51C9\",\n \"duration\": 225666,\n \"artists\": [\n \"\u66F9\u65B9\"\n ],\n \"album\": \"\u9047\u89C1\u6211\"\n },\n {\n \"id\": \"97A47B44F4B629CADC7A207886F07335\",\n \"originalId\": 329368,\n \"name\": \"\u7A7A\u5FC3\u5409\u4ED6\",\n \"duration\": 226000,\n \"artists\": [\n \"\u5F20\u7389\u534E\"\n ],\n \"album\": \"\u5F20\u7389\u534E\"\n },\n {\n \"id\": \"AC7A29D8222A1C994E1969EA7B11FCDE\",\n \"originalId\": 1415697454,\n \"name\": \"\u4E00\u5982\u5F80\u5E38\",\n \"duration\": 246543,\n \"artists\": [\n \"\u9003\u8D70\u9B91\u4F2F\"\n ],\n \"album\": \"demo\"\n },\n {\n \"id\": \"7941CAC4F6C0362DA7F30CDADABAE46D\",\n \"originalId\": 2727809377,\n \"name\": \"\u642C\u5BB6\",\n \"duration\": 241019,\n \"artists\": [\n \"\u5F20\u9707\u5CB3\"\n ],\n \"album\": \"\u8DDF\u7740\u611F\u89C9\u8D70\"\n },\n {\n \"id\": \"10E2A444DFC54597344C898FBA9E876F\",\n \"originalId\": 1859245776,\n \"name\": \"STAY\",\n \"duration\": 141810,\n \"artists\": [\n \"The Kid LAROI\",\n \"Justin Bieber\"\n ],\n \"album\": \"STAY\"\n },\n {\n \"id\": \"B42ADFF1A172A263EFFE553EFE433114\",\n \"originalId\": 1830419924,\n \"name\": \"Peaches\",\n \"duration\": 198080,\n \"artists\": [\n \"Justin Bieber\",\n \"Daniel Caesar\",\n \"GIV\u0112ON\"\n ],\n \"album\": \"Justice (\u4E2D\u56FD\u8C6A\u534E\u7279\u522B\u7248)\"\n },\n {\n \"id\": \"FF7064D18235C45528BB731D79D45A49\",\n \"originalId\": 1695347,\n \"name\": \"The Kids from Yesterday\",\n \"duration\": 324973,\n \"artists\": [\n \"My Chemical Romance\"\n ],\n \"album\": \"The Kids From Yesterday\"\n },\n {\n \"id\": \"E9C718C585E0465BA300011D46829D60\",\n \"originalId\": 17926871,\n \"name\": \"Name\",\n \"duration\": 270000,\n \"artists\": [\n \"The Goo Goo Dolls\"\n ],\n \"album\": \"A Boy Named Goo\"\n }\n ]\n },\n {\n \"year\": 2024,\n \"songs\": [\n {\n \"id\": \"544C9DE72439C955867D97DAD92F3DE4\",\n \"originalId\": 22821100,\n \"name\": \"Luv(sic.) Part 3 (feat. Shing02)\",\n \"duration\": 336866,\n \"artists\": [\n \"Nujabes\",\n \"Shing02\"\n ],\n \"album\": \"modal soul\"\n },\n {\n \"id\": \"B3269B08A74C62A134CA35A1CC6A399A\",\n \"originalId\": 22778415,\n \"name\": \"Say You Love Me feat. Tamala\",\n \"duration\": 273057,\n \"artists\": [\n \"\u897F\u539F\u5065\u4E00\u90CE\"\n ],\n \"album\": \"Natural Relax presented by Folklove\"\n },\n {\n \"id\": \"6FF5F46D4444FF54BEBA07ECC525583C\",\n \"originalId\": 209397,\n \"name\": \"\u592A\u806A\u660E\",\n \"duration\": 263173,\n \"artists\": [\n \"\u9648\u7EEE\u8D1E\"\n ],\n \"album\": \"Groupies\u5409\u4ED6\u624B\"\n },\n {\n \"id\": \"26D8218BE2215B1D56AB393840F2A567\",\n \"originalId\": 135025,\n \"name\": \"\u8F7B\u719F\u5973 27\",\n \"duration\": 275320,\n \"artists\": [\n \"MC HotDog \u70ED\u72D7\",\n \"\u5173\u5F66\u6DF3\"\n ],\n \"album\": \"\u8D2B\u6C11\u767E\u4E07\u6B4C\u661F\"\n },\n {\n \"id\": \"49216D6C3AFF61F2276BBA32E6865F13\",\n \"originalId\": 2154335252,\n \"name\": \"One Day\",\n \"duration\": 298250,\n \"artists\": [\n \"OMA\",\n \"Shing02\",\n \"Uyama Hiroto\",\n \"Spin Master A-1\",\n \"Troy Everett\"\n ],\n \"album\": \"Luv(Sic) Hexalogy (OMA and Shing02 Live at Liquidroom)\"\n },\n {\n \"id\": \"70F0F220D65D8FFA6D01F18C966413BB\",\n \"originalId\": 421160850,\n \"name\": \"\u9646\u579A\u77E5\u9A6C\u4FD0\",\n \"duration\": 294276,\n \"artists\": [\n \"\u706B\u661F\u7535\u53F0\"\n ],\n \"album\": \"\u9646\u579A\u77E5\u9A6C\u4FD0\"\n },\n {\n \"id\": \"BC29D7971818C3782C305733836D4AED\",\n \"originalId\": 135111,\n \"name\": \"\u4E5D\u5C40\u4E0B\u534A\",\n \"duration\": 303826,\n \"artists\": [\n \"MC HotDog \u70ED\u72D7\"\n ],\n \"album\": \"\u4E5D\u5C40\u4E0B\u534A\"\n },\n {\n \"id\": \"62C777C19284083D8E2D6871ED7E134E\",\n \"originalId\": 18563988,\n \"name\": \"Southside Of Heaven\",\n \"duration\": 379160,\n \"artists\": [\n \"Ryan Bingham\"\n ],\n \"album\": \"Mescalito\"\n },\n {\n \"id\": \"2475F24C6460EB870FE478CBC065D949\",\n \"originalId\": 209478,\n \"name\": \"\u8FD8\u662F\u4F1A\u5BC2\u5BDE\",\n \"duration\": 272293,\n \"artists\": [\n \"\u9648\u7EEE\u8D1E\"\n ],\n \"album\": \"\u8FD8\u662F\u4F1A\u5BC2\u5BDE\"\n }\n ]\n },\n {\n \"year\": 2023,\n \"songs\": [\n {\n \"id\": \"6FF5F46D4444FF54BEBA07ECC525583C\",\n \"originalId\": 209397,\n \"name\": \"\u592A\u806A\u660E\",\n \"duration\": 263173,\n \"artists\": [\n \"\u9648\u7EEE\u8D1E\"\n ],\n \"album\": \"Groupies\u5409\u4ED6\u624B\"\n },\n {\n \"id\": \"70F0F220D65D8FFA6D01F18C966413BB\",\n \"originalId\": 421160850,\n \"name\": \"\u9646\u579A\u77E5\u9A6C\u4FD0\",\n \"duration\": 294276,\n \"artists\": [\n \"\u706B\u661F\u7535\u53F0\"\n ],\n \"album\": \"\u9646\u579A\u77E5\u9A6C\u4FD0\"\n },\n {\n \"id\": \"B42ADFF1A172A263EFFE553EFE433114\",\n \"originalId\": 1830419924,\n \"name\": \"Peaches\",\n \"duration\": 198080,\n \"artists\": [\n \"Justin Bieber\",\n \"Daniel Caesar\",\n \"GIV\u0112ON\"\n ],\n \"album\": \"Justice (\u4E2D\u56FD\u8C6A\u534E\u7279\u522B\u7248)\"\n },\n {\n \"id\": \"F505DAD72E186F071E9A653E84BB7256\",\n \"originalId\": 209400,\n \"name\": \"\u5C0F\u6B65\u821E\u66F2\",\n \"duration\": 259720,\n \"artists\": [\n \"\u9648\u7EEE\u8D1E\"\n ],\n \"album\": \"Groupies\u5409\u4ED6\u624B\"\n },\n {\n \"id\": \"65EFA9D33F3C7C116E3B23A786E1644E\",\n \"originalId\": 1907710034,\n \"name\": \"\u5927\u96E8\",\n \"duration\": 192208,\n \"artists\": [\n \"deca joins\"\n ],\n \"album\": \"\u5927\u96E8\"\n },\n {\n \"id\": \"BA183ABC5617703C68AF596D853F3D1E\",\n \"originalId\": 1906020021,\n \"name\": \"\u5206\u624B\u5427\",\n \"duration\": 300485,\n \"artists\": [\n \"\u5B59\u76DB\u5E0C\"\n ],\n \"album\": \"\u5206\u624B\u5427\"\n },\n {\n \"id\": \"2475F24C6460EB870FE478CBC065D949\",\n \"originalId\": 209478,\n \"name\": \"\u8FD8\u662F\u4F1A\u5BC2\u5BDE\",\n \"duration\": 272293,\n \"artists\": [\n \"\u9648\u7EEE\u8D1E\"\n ],\n \"album\": \"\u8FD8\u662F\u4F1A\u5BC2\u5BDE\"\n },\n {\n \"id\": \"372BBF8296D70C205588F16C0332D538\",\n \"originalId\": 209494,\n \"name\": \"\u544A\u8BC9\u6211\",\n \"duration\": 313733,\n \"artists\": [\n \"\u9648\u7EEE\u8D1E\"\n ],\n \"album\": \"\u8FD8\u662F\u4F1A\u5BC2\u5BDE\"\n },\n {\n \"id\": \"8C33BFC3568B4827AF9906E210B7F597\",\n \"originalId\": 26876993,\n \"name\": \"...passing by\",\n \"duration\": 396000,\n \"artists\": [\n \"Ulrich Schnauss\"\n ],\n \"album\": \"...Passing By EP\"\n }\n ]\n },\n {\n \"year\": 2022,\n \"songs\": [\n {\n \"id\": \"46ECCBFC254408E30F3DC8E9DD7C96B6\",\n \"originalId\": 21761474,\n \"name\": \"I Don't Love You Anymore\",\n \"duration\": 277000,\n \"artists\": [\n \"The Quireboys\"\n ],\n \"album\": \"Best Of The Quireboys\"\n },\n {\n \"id\": \"68E9C13A4909F6E9869D713D3EF46398\",\n \"originalId\": 2604360,\n \"name\": \"House of Pain\",\n \"duration\": 344613,\n \"artists\": [\n \"Faster Pussycat\"\n ],\n \"album\": \"Greatest Hits\"\n },\n {\n \"id\": \"6FF5F46D4444FF54BEBA07ECC525583C\",\n \"originalId\": 209397,\n \"name\": \"\u592A\u806A\u660E\",\n \"duration\": 263173,\n \"artists\": [\n \"\u9648\u7EEE\u8D1E\"\n ],\n \"album\": \"Groupies\u5409\u4ED6\u624B\"\n },\n {\n \"id\": \"2475F24C6460EB870FE478CBC065D949\",\n \"originalId\": 209478,\n \"name\": \"\u8FD8\u662F\u4F1A\u5BC2\u5BDE\",\n \"duration\": 272293,\n \"artists\": [\n \"\u9648\u7EEE\u8D1E\"\n ],\n \"album\": \"\u8FD8\u662F\u4F1A\u5BC2\u5BDE\"\n },\n {\n \"id\": \"F505DAD72E186F071E9A653E84BB7256\",\n \"originalId\": 209400,\n \"name\": \"\u5C0F\u6B65\u821E\u66F2\",\n \"duration\": 259720,\n \"artists\": [\n \"\u9648\u7EEE\u8D1E\"\n ],\n \"album\": \"Groupies\u5409\u4ED6\u624B\"\n },\n {\n \"id\": \"BA183ABC5617703C68AF596D853F3D1E\",\n \"originalId\": 1906020021,\n \"name\": \"\u5206\u624B\u5427\",\n \"duration\": 300485,\n \"artists\": [\n \"\u5B59\u76DB\u5E0C\"\n ],\n \"album\": \"\u5206\u624B\u5427\"\n },\n {\n \"id\": \"65EFA9D33F3C7C116E3B23A786E1644E\",\n \"originalId\": 1907710034,\n \"name\": \"\u5927\u96E8\",\n \"duration\": 192208,\n \"artists\": [\n \"deca joins\"\n ],\n \"album\": \"\u5927\u96E8\"\n },\n {\n \"id\": \"42F49BF58BBD238764968E7FB22C654E\",\n \"originalId\": 350830,\n \"name\": \"Song F\",\n \"duration\": 391373,\n \"artists\": [\n \"\u8FBE\u8FBE\u4E50\u961F\"\n ],\n \"album\": \"\u9EC4\u91D1\u65F6\u4EE3\"\n },\n {\n \"id\": \"B42ADFF1A172A263EFFE553EFE433114\",\n \"originalId\": 1830419924,\n \"name\": \"Peaches\",\n \"duration\": 198080,\n \"artists\": [\n \"Justin Bieber\",\n \"Daniel Caesar\",\n \"GIV\u0112ON\"\n ],\n \"album\": \"Justice (\u4E2D\u56FD\u8C6A\u534E\u7279\u522B\u7248)\"\n },\n {\n \"id\": \"372BBF8296D70C205588F16C0332D538\",\n \"originalId\": 209494,\n \"name\": \"\u544A\u8BC9\u6211\",\n \"duration\": 313733,\n \"artists\": [\n \"\u9648\u7EEE\u8D1E\"\n ],\n \"album\": \"\u8FD8\u662F\u4F1A\u5BC2\u5BDE\"\n }\n ]\n },\n {\n \"year\": 2021,\n \"songs\": [\n {\n \"id\": \"19CAA9B592FE619055089EA55EDB804D\",\n \"originalId\": 1806540577,\n \"name\": \"\u79D8\u5BC6\u7231\u4EBA\",\n \"duration\": 246052,\n \"artists\": [\n \"\u751C\u53C8\u4E27\u6A02\u968A\"\n ],\n \"album\": \"\u5B8C\u5168\u4EBA\"\n },\n {\n \"id\": \"1D82C894F7C10F54ED0FE08033D696E6\",\n \"originalId\": 1393632139,\n \"name\": \"\u6CA1\u6709\u4EBA\u5728\u610F\u4ED6\u7684\u773C\u775B\u91CC\",\n \"duration\": 246496,\n \"artists\": [\n \"\u6253\u5012\u4E09\u660E\u6CBB\"\n ],\n \"album\": \"Roadkill\"\n },\n {\n \"id\": \"46AA8EA5A5D2F0F6F9AB83BAA5DBCD61\",\n \"originalId\": 1813831223,\n \"name\": \"\u68A6\u7279\u522B\u5A07\",\n \"duration\": 258923,\n \"artists\": [\n \"\u56DE\u6625\u4E39\"\n ],\n \"album\": \"\u68A6\u7279\u522B\u5A07\"\n },\n {\n \"id\": \"A553C90106297DDB6794EB34162BF750\",\n \"originalId\": 551338024,\n \"name\": \"\u4F60\u7684\u57CE\u5E02\",\n \"duration\": 359786,\n \"artists\": [\n \"\u58F0\u97F3\u73A9\u5177\"\n ],\n \"album\": \"\u52B3\u52A8\u4E4B\u4F59\"\n },\n {\n \"id\": \"463C5B930C5C935FB9BE78963CF6CCFE\",\n \"originalId\": 1479507541,\n \"name\": \"\u8F6F\u5F31\",\n \"duration\": 290485,\n \"artists\": [\n \"Schoolgirl byebye\"\n ],\n \"album\": \"\u8F6F\u5F31\"\n },\n {\n \"id\": \"B6A765D90D0A936767501312E6557692\",\n \"originalId\": 367867,\n \"name\": \"\u8FD9\u90FD\u6CA1\u4EC0\u4E48\",\n \"duration\": 330240,\n \"artists\": [\n \"\u5927\u98DE\"\n ],\n \"album\": \"R&B\"\n },\n {\n \"id\": \"050B0E772847CF254E4B11367E2696B1\",\n \"originalId\": 29600457,\n \"name\": \"Farewell (Original Version)\",\n \"duration\": 462341,\n \"artists\": [\n \"\u82B1\u4F26\"\n ],\n \"album\": \"Farewell\"\n },\n {\n \"id\": \"138C871BB3D402BDDAA09139A24CBBC7\",\n \"originalId\": 367872,\n \"name\": \"\u5947\u8FF9\",\n \"duration\": 367120,\n \"artists\": [\n \"\u5927\u98DE\"\n ],\n \"album\": \"R&B\"\n },\n {\n \"id\": \"42F49BF58BBD238764968E7FB22C654E\",\n \"originalId\": 350830,\n \"name\": \"Song F\",\n \"duration\": 391373,\n \"artists\": [\n \"\u8FBE\u8FBE\u4E50\u961F\"\n ],\n \"album\": \"\u9EC4\u91D1\u65F6\u4EE3\"\n },\n {\n \"id\": \"EABA5A89671E8482BF47024D29AF57AA\",\n \"originalId\": 1422880870,\n \"name\": \"\u96F7\u8BFA\u5179\",\n \"duration\": 213857,\n \"artists\": [\n \"\u7834\u788E\u4E50\u961F\"\n ],\n \"album\": \"\u6211\u5C06\u732E\u8EAB\u4E8E\u8FD9\u4E00\u975E\u798F\u5373\u7978\u7684\u7406\u60F3\"\n }\n ]\n },\n {\n \"year\": 2020,\n \"songs\": [\n {\n \"id\": \"42F49BF58BBD238764968E7FB22C654E\",\n \"originalId\": 350830,\n \"name\": \"Song F\",\n \"duration\": 391373,\n \"artists\": [\n \"\u8FBE\u8FBE\u4E50\u961F\"\n ],\n \"album\": \"\u9EC4\u91D1\u65F6\u4EE3\"\n },\n {\n \"id\": \"B9742236287284BDD9B3BBFFB893B340\",\n \"originalId\": 408845163,\n \"name\": \"\u7ED9\u4F60\u7684\u6B4C\",\n \"duration\": 296904,\n \"artists\": [\n \"\u7834\u788E\u4E50\u961F\"\n ],\n \"album\": \"\u7ED9\u4F60\u7684\u6B4C\"\n },\n {\n \"id\": \"47579051A42B01AA0B53A342EDE8E2FF\",\n \"originalId\": 30070851,\n \"name\": \"\u4E01\u9999\",\n \"duration\": 244386,\n \"artists\": [\n \"\u66F9\u65B9\"\n ],\n \"album\": \"\u7EA2\u661F20\u53F7\"\n },\n {\n \"id\": \"3F11835DAD7DF227BD06B76AD009DFE0\",\n \"originalId\": 520460033,\n \"name\": \"\u8A00\u8868\",\n \"duration\": 236313,\n \"artists\": [\n \"\u54C1\u51A0\"\n ],\n \"album\": \"\u8A00\u5916\u4E4B\u610F\"\n },\n {\n \"id\": \"E072B953872AF774BF62FB6DFF646E3C\",\n \"originalId\": 28853012,\n \"name\": \"\u5982\u679C\u4F60\u51B7\",\n \"duration\": 253573,\n \"artists\": [\n \"\u5F20\u96E8\u751F\"\n ],\n \"album\": \"7\u5339\u72FC \u7535\u5F71\u539F\u58F0\u5E26\"\n },\n {\n \"id\": \"B940A70377BA242ED84BC2380C9BC08D\",\n \"originalId\": 1331399785,\n \"name\": \"\u591C\u6E38\u8BB0\",\n \"duration\": 285399,\n \"artists\": [\n \"\u94A2\u5FC3\"\n ],\n \"album\": \"\u591C\u6E38\u8BB0\"\n },\n {\n \"id\": \"C1392B05B1BD7A9FDC33044910DB20BD\",\n \"originalId\": 483563726,\n \"name\": \"3000\u516C\u91CC\",\n \"duration\": 309054,\n \"artists\": [\n \"\u518D\u5FAA\u73AF\u4E50\u961F\"\n ],\n \"album\": \"3000\u516C\u91CC\"\n },\n {\n \"id\": \"EA5AE8F52D20A5C63B8E4B58C75714E0\",\n \"originalId\": 1311319315,\n \"name\": \"\u676F\u4E2D\u9152\",\n \"duration\": 48065,\n \"artists\": [\n \"\u9694\u58C1\u56E2\u4E50\u961F\"\n ],\n \"album\": \"\u676F\u4E2D\u9152\"\n },\n {\n \"id\": \"4C67F31594DEE3080934BD0C7DB4A1C4\",\n \"originalId\": 28587869,\n \"name\": \"\u9C9C\u82B1\u5728\u5CB8\u4E0A\u5F00\",\n \"duration\": 310000,\n \"artists\": [\n \"\u4E94\u6761\u4EBA\"\n ],\n \"album\": \"\u4E00\u4E9B\u98CE\u666F\"\n },\n {\n \"id\": \"2F5BB2F975BB82B66E5FA3BCB01F89DB\",\n \"originalId\": 1294899223,\n \"name\": \"\u6211\u7684\u8EAB\u65C1\u662F\u4E00\u6247\u4EAE\u4E86\u53C8\u6697\u7684\u7A97\",\n \"duration\": 232807,\n \"artists\": [\n \"\u7406\u60F3\u540E\u82B1\u56ED\"\n ],\n \"album\": \"\u8FD9\u4E2A\u4E16\u754C\u8BA9\u4F60\u7D27\u5F20\u5BB3\u6015\u5417\uFF1F\"\n }\n ]\n },\n {\n \"year\": 2019,\n \"songs\": [\n {\n \"id\": \"2A97FC870A2AE62767111B352E091871\",\n \"originalId\": 343008,\n \"name\": \"\u9EC4\u91D1\u65F6\u95F4\",\n \"duration\": 206000,\n \"artists\": [\n \"AK(AK47)\u4E50\u961F\"\n ],\n \"album\": \"\u51FA\u53D1\"\n },\n {\n \"id\": \"E69C6E871E0867BEED5E4C54ECDC9F68\",\n \"originalId\": 1317457805,\n \"name\": \"\u62AB\u661F\u6234\u6708\u7684\u60F3\u4F60\",\n \"duration\": 349003,\n \"artists\": [\n \"\u544A\u4E94\u4EBA\"\n ],\n \"album\": \"\u62AB\u661F\u6234\u6708\u7684\u60F3\u4F60\"\n },\n {\n \"id\": \"B940A70377BA242ED84BC2380C9BC08D\",\n \"originalId\": 1331399785,\n \"name\": \"\u591C\u6E38\u8BB0\",\n \"duration\": 285399,\n \"artists\": [\n \"\u94A2\u5FC3\"\n ],\n \"album\": \"\u591C\u6E38\u8BB0\"\n },\n {\n \"id\": \"EAD0AAEE9A0956319C3FCE403A0D654C\",\n \"originalId\": 1336153991,\n \"name\": \"\u6865\u8C46\u9EBB\u888B\",\n \"duration\": 135113,\n \"artists\": [\n \"\u9C7C\u9AA8\u59B9\"\n ],\n \"album\": \"\u6865\u8C46\u9EBB\u888B\"\n },\n {\n \"id\": \"71CBF1E4A95A5CDEA5A068FD02264AF3\",\n \"originalId\": 417247973,\n \"name\": \"\u52A8\u8EAB\",\n \"duration\": 360066,\n \"artists\": [\n \"\u751F\u7965\u4E50\u961F\"\n ],\n \"album\": \"\u52A8\u8EAB\"\n },\n {\n \"id\": \"9D46FDD798076B279B9B032827098679\",\n \"originalId\": 2345639,\n \"name\": \"Take It to the Bridge\",\n \"duration\": 198000,\n \"artists\": [\n \"Crazy Town\"\n ],\n \"album\": \"Darkhorse\"\n },\n {\n \"id\": \"6D44B6DCE61C1C11AAB33CD29425D205\",\n \"originalId\": 35678542,\n \"name\": \"\u4E16\u754C\u60B2\",\n \"duration\": 386000,\n \"artists\": [\n \"Chinese Football\"\n ],\n \"album\": \"Chinese Football\"\n },\n {\n \"id\": \"F3E4527908237BC0241F11FD9631B36E\",\n \"originalId\": 421885313,\n \"name\": \"\u76F2\u5C71\",\n \"duration\": 316067,\n \"artists\": [\n \"\u5047\u5047\u689D\"\n ],\n \"album\": \"\u76F2\u5C71\"\n },\n {\n \"id\": \"122708386F1484C2947E5ED4E615D2CD\",\n \"originalId\": 28923460,\n \"name\": \"\u6CA1\u6709\u4F60\u966A\u6211\u7684\u591C\u665A\",\n \"duration\": 263755,\n \"artists\": [\n \"\u9694\u58C1\u56E2\u4E50\u961F\"\n ],\n \"album\": \"\u4E0D\u662F\u4E00\u8DEF\u4EBA(Demo)\"\n },\n {\n \"id\": \"AC8C645195F0330CF88974D1F5B576F9\",\n \"originalId\": 17748980,\n \"name\": \"American Capitalist\",\n \"duration\": 208546,\n \"artists\": [\n \"Five Finger Death Punch\"\n ],\n \"album\": \"American Capitalist\"\n }\n ]\n },\n {\n \"year\": 2018,\n \"songs\": [\n {\n \"id\": \"7707C860DF079306D154870266EDFABC\",\n \"originalId\": 458360071,\n \"name\": \"\u8D70\",\n \"duration\": 339000,\n \"artists\": [\n \"\u5EB7\u59C6\u58EBCOM'Z\"\n ],\n \"album\": \"\u4F60\u8981\u5982\u4F55\uFF0C\u6211\u4EEC\u5C31\u5982\u4F55\"\n },\n {\n \"id\": \"76CAD3BCF9D324DB30E10FBF819FE209\",\n \"originalId\": 474507670,\n \"name\": \"\u4E0B\u60AC\",\n \"duration\": 240865,\n \"artists\": [\n \"\u5C0F\u5DEB\u5E08\u4E50\u961F\"\n ],\n \"album\": \"\u4E0B\u60AC\"\n },\n {\n \"id\": \"C13C0553E9033870B6C510111D0DA364\",\n \"originalId\": 28923455,\n \"name\": \"\u8DEF\",\n \"duration\": 208120,\n \"artists\": [\n \"\u9694\u58C1\u56E2\u4E50\u961F\"\n ],\n \"album\": \"\u4E0D\u662F\u4E00\u8DEF\u4EBA(Demo)\"\n },\n {\n \"id\": \"7A953B40B1A2438CBDFCD0D1537B1B47\",\n \"originalId\": 474412284,\n \"name\": \"\u7D2B\u8272\",\n \"duration\": 216741,\n \"artists\": [\n \"\u5C0F\u5DEB\u5E08\u4E50\u961F\"\n ],\n \"album\": \"Little Wizard \u2160\"\n },\n {\n \"id\": \"E66ED0729A55EA73BBA60CCA304EF466\",\n \"originalId\": 22664745,\n \"name\": \"two moons\",\n \"duration\": 250253,\n \"artists\": [\n \"toe\"\n ],\n \"album\": \"For Long Tomorrow\"\n },\n {\n \"id\": \"B61BC29CF2DC3B430C61B57FC7B71454\",\n \"originalId\": 503013129,\n \"name\": \"CLOSER\",\n \"duration\": 281135,\n \"artists\": [\n \"TIMERS\"\n ],\n \"album\": \"CLOSER\"\n },\n {\n \"id\": \"0809CFD9FCBE798C93EDDAAE5AA882EE\",\n \"originalId\": 33410518,\n \"name\": \"Because I Hear You\",\n \"duration\": 281466,\n \"artists\": [\n \"toe\"\n ],\n \"album\": \"HEAR YOU\"\n },\n {\n \"id\": \"65B31542B153F26347170D647DF583A1\",\n \"originalId\": 28923461,\n \"name\": \"\u518D\u89C1\u5427!\u670B\u53CB\",\n \"duration\": 214900,\n \"artists\": [\n \"\u9694\u58C1\u56E2\u4E50\u961F\"\n ],\n \"album\": \"\u4E0D\u662F\u4E00\u8DEF\u4EBA(Demo)\"\n },\n {\n \"id\": \"41511016EC4B0186A1C077381A3EEB83\",\n \"originalId\": 472137696,\n \"name\": \"\u518D\u8C08\u8BB0\u5FC6\",\n \"duration\": 338500,\n \"artists\": [\n \"\u76D8\u5C3C\u897F\u6797\"\n ],\n \"album\": \"\u4E0E\u4E16\u754C\u6E29\u6696\u76F8\u62E5\"\n }\n ]\n }\n ]\n}\n", "import { execSync } from 'child_process';\n\nexport function copyToClipboard(text: string): void {\n execSync(`printf '${text.replace(/'/g, \"'\\\\''\")}' | pbcopy`, { stdio: 'ignore' });\n}\n", "import { Command } from 'commander';\nimport chalk from 'chalk';\n\ninterface Link {\n name: string;\n url: string;\n icon: string;\n description: string | null;\n}\n\nexport function createLinksCommand(): Command {\n const cmd = new Command('links')\n .description('\u67E5\u770B\u793E\u4EA4\u94FE\u63A5 (--json \u8F93\u51FA\u7ED3\u6784\u5316\u6570\u636E)')\n .option('--json', '\u8F93\u51FA JSON \u683C\u5F0F')\n .action(async (opts) => {\n const apiUrl = process.env.MAIDANG_API_URL || 'http://localhost:3000';\n\n try {\n const res = await fetch(`${apiUrl}/api/links`);\n if (!res.ok) throw new Error(`HTTP ${res.status}`);\n const links: Link[] = await res.json();\n\n if (opts.json) {\n console.log(JSON.stringify({ tool: 'maidang', command: 'links', data: links }, null, 2));\n return;\n }\n\n console.log(chalk.cyan.bold('\uD83C\uDF10 \u793E\u4EA4\u94FE\u63A5\\n'));\n for (const link of links) {\n console.log(` ${link.icon} ${chalk.white(link.name)} - ${chalk.gray(link.description || '')}`);\n console.log(` ${chalk.blue(link.url)}\\n`);\n }\n } catch (err) {\n console.error(chalk.red(`\u83B7\u53D6\u94FE\u63A5\u5931\u8D25: ${err instanceof Error ? err.message : err}`));\n process.exit(1);\n }\n });\n\n return cmd;\n}\n", "import { Command } from 'commander';\nimport chalk from 'chalk';\n\ninterface Project {\n name: string;\n description: string;\n url: string | null;\n icon: string;\n category: string;\n}\n\nexport function createProjectsCommand(): Command {\n const cmd = new Command('projects')\n .description('\u67E5\u770B\u4E2A\u4EBA\u9879\u76EE')\n .option('--json', '\u8F93\u51FA JSON \u683C\u5F0F')\n .action(async (opts) => {\n const apiUrl = process.env.MAIDANG_API_URL || 'http://localhost:3000';\n\n try {\n const res = await fetch(`${apiUrl}/api/projects`);\n if (!res.ok) throw new Error(`HTTP ${res.status}`);\n const projects: Project[] = await res.json();\n\n if (opts.json) {\n console.log(JSON.stringify({ tool: 'maidang', command: 'projects', data: projects }, null, 2));\n return;\n }\n\n console.log(chalk.cyan.bold('\uD83D\uDE80 \u4E2A\u4EBA\u9879\u76EE\\n'));\n for (const project of projects) {\n console.log(` ${project.icon} ${chalk.white.bold(project.name)} ${chalk.gray(`[${project.category}]`)}`);\n console.log(` ${project.description}`);\n if (project.url) {\n console.log(` ${chalk.blue(project.url)}`);\n }\n console.log('');\n }\n } catch (err) {\n console.error(chalk.red(`\u83B7\u53D6\u9879\u76EE\u5931\u8D25: ${err instanceof Error ? err.message : err}`));\n process.exit(1);\n }\n });\n\n return cmd;\n}\n", "import { Command } from 'commander';\nimport chalk from 'chalk';\n\ninterface Tool {\n name: string;\n description: string;\n icon: string;\n url: string | null;\n category: string;\n}\n\nexport function createToolsCommand(): Command {\n const cmd = new Command('tools')\n .description('\u67E5\u770B\u5E38\u7528\u5DE5\u5177')\n .option('--json', '\u8F93\u51FA JSON \u683C\u5F0F')\n .action(async (opts) => {\n const apiUrl = process.env.MAIDANG_API_URL || 'http://localhost:3000';\n\n try {\n const res = await fetch(`${apiUrl}/api/tools`);\n if (!res.ok) throw new Error(`HTTP ${res.status}`);\n const tools: Tool[] = await res.json();\n\n if (opts.json) {\n console.log(JSON.stringify({ tool: 'maidang', command: 'tools', data: tools }, null, 2));\n return;\n }\n\n const byCategory = tools.reduce((acc, tool) => {\n if (!acc[tool.category]) acc[tool.category] = [];\n acc[tool.category].push(tool);\n return acc;\n }, {} as Record<string, Tool[]>);\n\n const categoryNames: Record<string, string> = {\n software: '\u5E38\u7528\u8F6F\u4EF6',\n device: '\u8BBE\u5907',\n desktop: '\u684C\u9762\u88C5\u5907',\n };\n\n console.log(chalk.cyan.bold('\uD83D\uDD27 \u5E38\u7528\u5DE5\u5177\\n'));\n\n for (const [cat, items] of Object.entries(byCategory)) {\n console.log(chalk.white.bold(` ${categoryNames[cat] || cat}`));\n for (const tool of items) {\n const urlStr = tool.url ? ` ${chalk.blue(tool.url)}` : '';\n console.log(` ${tool.icon} ${tool.name} - ${chalk.gray(tool.description)}${urlStr}`);\n }\n console.log('');\n }\n } catch (err) {\n console.error(chalk.red(`\u83B7\u53D6\u5DE5\u5177\u5931\u8D25: ${err instanceof Error ? err.message : err}`));\n process.exit(1);\n }\n });\n\n return cmd;\n}\n", "import { Command } from 'commander';\nimport chalk from 'chalk';\n\nfunction hr(char = '\u2500', len = 40) {\n console.log(chalk.dim(char.repeat(len)));\n}\n\nexport function createContactCommand(): Command {\n const cmd = new Command('contact')\n .description('\u8054\u7CFB\u65B9\u5F0F')\n .option('--json', '\u8F93\u51FA JSON \u683C\u5F0F')\n .action((opts) => {\n const data = { email: 'borisdunk@sina.com', note: '\u56DE\u590D\u53EF\u80FD\u8F83\u6162\uFF0C\u770B\u5230\u4F1A\u56DE' };\n\n if (opts.json) {\n console.log(JSON.stringify({ tool: 'maidang', command: 'contact', data }, null, 2));\n return;\n }\n\n console.log('');\n console.log(chalk.bold('\u8054\u7CFB\u65B9\u5F0F'));\n console.log('');\n hr();\n console.log('');\n console.log(` Email ${chalk.blue('borisdunk@sina.com')}`);\n console.log('');\n console.log(` ${chalk.dim('\u56DE\u590D\u53EF\u80FD\u8F83\u6162\uFF0C\u770B\u5230\u4F1A\u56DE')}`);\n console.log('');\n });\n\n return cmd;\n}\n", "import { Command } from 'commander';\nimport chalk from 'chalk';\n\ninterface Skill {\n name: string;\n tags: string[];\n}\n\nconst skills: Skill[] = [\n // \u751F\u6D3B\u65B9\u5F0F\n { name: '\u4E3E\u94C1 / \u5065\u8EAB', tags: ['life'] },\n { name: '\u98DE\u76D8', tags: ['life'] },\n { name: '\u5409\u4ED6', tags: ['life'] },\n { name: '\u71D5\u9EA6\u62FF\u94C1', tags: ['life'] },\n // \u6280\u672F\n { name: 'TypeScript', tags: ['tech'] },\n { name: 'Next.js / React', tags: ['tech'] },\n { name: 'Node.js', tags: ['tech'] },\n { name: 'AI Agent / LLM', tags: ['tech'] },\n { name: 'CLI / TUI \u5F00\u53D1', tags: ['tech'] },\n { name: '\u524D\u7AEF\u5DE5\u7A0B\u5316', tags: ['tech'] },\n { name: 'Prisma / PostgreSQL', tags: ['tech'] },\n];\n\nfunction hr(char = '\u2500', len = 40) {\n console.log(chalk.dim(char.repeat(len)));\n}\n\nexport function createSkillsCommand(): Command {\n const cmd = new Command('skills')\n .description('\u6280\u80FD\u4E0E\u5174\u8DA3')\n .option('--json', '\u8F93\u51FA JSON \u683C\u5F0F')\n .action((opts) => {\n if (opts.json) {\n console.log(JSON.stringify({ tool: 'maidang', command: 'skills', data: skills }, null, 2));\n return;\n }\n\n const life = skills.filter(s => s.tags.includes('life'));\n const tech = skills.filter(s => s.tags.includes('tech'));\n\n console.log('');\n console.log(chalk.bold('\u751F\u6D3B'));\n console.log('');\n console.log(' ' + life.map(s => chalk.white(s.name)).join(chalk.dim(' \u00B7 ')));\n console.log('');\n hr();\n console.log('');\n console.log(chalk.bold('\u6280\u672F'));\n console.log('');\n console.log(' ' + tech.map(s => chalk.white(s.name)).join(chalk.dim(' \u00B7 ')));\n console.log('');\n });\n\n return cmd;\n}\n", "import { Command } from 'commander';\nimport chalk from 'chalk';\n\ninterface StatusInfo {\n status: 'available' | 'working' | 'busy' | 'traveling';\n label: string;\n description: string;\n updatedAt: string;\n}\n\nfunction getStatus(): StatusInfo {\n const hour = new Date().getHours();\n const isWeekend = [0, 6].includes(new Date().getDay());\n\n if (isWeekend) return { status: 'available', label: '\u5468\u672B\u53EF\u7EA6', description: '\u65F6\u95F4\u7075\u6D3B\uFF0C\u53EF\u4EE5\u804A\u804A' };\n if (hour < 9 || hour >= 22) return { status: 'available', label: '\u7A7A\u95F2\u4E2D', description: '\u975E\u5DE5\u4F5C\u65F6\u95F4' };\n if (hour >= 19) return { status: 'busy', label: '\u4E0B\u73ED\u4E86', description: '\u4F11\u606F\u4E2D\uFF0C\u770B\u5230\u4F1A\u56DE' };\n return { status: 'working', label: '\u5DE5\u4F5C\u4E2D', description: '\u6B63\u5E38\u5DE5\u4F5C\u65F6\u6BB5' };\n}\n\nfunction hr(char = '\u2500', len = 40) {\n console.log(chalk.dim(char.repeat(len)));\n}\n\nexport function createStatusCommand(): Command {\n const cmd = new Command('status')\n .description('\u5F53\u524D\u72B6\u6001')\n .option('--json', '\u8F93\u51FA JSON \u683C\u5F0F')\n .action((opts) => {\n const info = getStatus();\n\n if (opts.json) {\n console.log(JSON.stringify({ tool: 'maidang', command: 'status', data: info }, null, 2));\n return;\n }\n\n console.log('');\n console.log(chalk.bold('\u5F53\u524D\u72B6\u6001'));\n console.log('');\n hr();\n console.log('');\n console.log(` ${chalk.cyan('\u25CF')} ${chalk.white(info.label)}`);\n console.log(` ${chalk.dim(info.description)}`);\n console.log('');\n });\n\n return cmd;\n}\n", "import { Command } from 'commander';\nimport chalk from 'chalk';\n\ninterface WhoAmI {\n tagline: string;\n location: string;\n status: {\n status: 'available' | 'working' | 'busy' | 'traveling';\n label: string;\n description: string;\n };\n links: { label: string; url: string }[];\n contact: string;\n website: string;\n updatedAt: string;\n}\n\nfunction getStatus(): WhoAmI['status'] {\n const hour = new Date().getHours();\n const isWeekend = [0, 6].includes(new Date().getDay());\n\n if (isWeekend) return { status: 'available', label: '\u5468\u672B\u53EF\u7EA6', description: '\u65F6\u95F4\u7075\u6D3B\uFF0C\u53EF\u4EE5\u804A\u804A' };\n if (hour < 9 || hour >= 22) return { status: 'available', label: '\u7A7A\u95F2\u4E2D', description: '\u975E\u5DE5\u4F5C\u65F6\u95F4' };\n if (hour >= 19) return { status: 'busy', label: '\u4E0B\u73ED\u4E86', description: '\u4F11\u606F\u4E2D\uFF0C\u770B\u5230\u4F1A\u56DE' };\n return { status: 'working', label: '\u5DE5\u4F5C\u4E2D', description: '\u6B63\u5E38\u5DE5\u4F5C\u65F6\u6BB5' };\n}\n\nfunction hr(char = '\u2500', len = 40) {\n console.log(chalk.dim(char.repeat(len)));\n}\n\nexport function createWhoAmICommand(): Command {\n const cmd = new Command('whoami')\n .description('\u4E86\u89E3\u6211')\n .option('--json', '\u8F93\u51FA JSON \u683C\u5F0F')\n .action((opts) => {\n const status = getStatus();\n const whoami: WhoAmI = {\n tagline: '\u6587\u79D1\u8F6C\u7801 / \u5168\u6808 / \u72EC\u7ACB\u5F00\u53D1\u3002\u676D\u5DDE\uFF0C\u71D5\u9EA6\u62FF\u94C1\u7231\u597D\u8005\uFF0C\u4E3E\u94C1\uFF0C\u98DE\u76D8\uFF0C\u5076\u5C14\u5F39\u7434\u3002',\n location: '\u676D\u5DDE \u00B7 EFC',\n status,\n links: [\n { label: 'Blog', url: 'https://www.maidang.me' },\n ],\n contact: 'borisdunk@sina.com',\n website: 'https://www.maidang.me',\n updatedAt: new Date().toISOString(),\n };\n\n if (opts.json) {\n console.log(JSON.stringify({ tool: 'maidang', command: 'whoami', data: whoami }, null, 2));\n return;\n }\n\n console.log('');\n console.log(chalk.bold('\u6211\u662F \u9EA6\u5F53'));\n console.log('');\n console.log(' ' + whoami.tagline);\n console.log('');\n hr();\n console.log('');\n console.log(` ${chalk.cyan('\uD83D\uDCCD')} ${whoami.location}`);\n console.log(` ${chalk.cyan('\u23F1')} ${whoami.status.label} \u00B7 ${chalk.dim(whoami.status.description)}`);\n console.log('');\n hr();\n console.log('');\n console.log(` Blog ${chalk.blue.underline(whoami.website)}`);\n console.log(` Email ${chalk.blue(whoami.contact)}`);\n console.log('');\n hr();\n console.log('');\n console.log(` ${chalk.dim('\u60F3\u4E86\u89E3\u66F4\u591A\uFF1F')}`);\n console.log(` ${chalk.dim('maidang skills / career / posts / links')}`);\n console.log('');\n });\n\n return cmd;\n}\n", "import React, { useState } from 'react'\nimport { render, Box, Text, useInput } from 'ink'\nimport { Command } from 'commander'\nimport chalk from 'chalk'\nimport { fetchChat } from '../utils/chat-api.js'\n\n// \u2500\u2500 Non-TUI mode \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nexport async function chatSync(message: string, json = false): Promise<void> {\n try {\n const { thinking, response } = await fetchChat(message)\n if (json) {\n console.log(JSON.stringify({ tool: 'maidang', command: 'chat', message, thinking, response }, null, 2))\n } else {\n if (thinking) {\n thinking.split('\\n').forEach(line => {\n console.log(`${chalk.dim('\uD83D\uDCAD')} ${chalk.dim(line)}`)\n })\n console.log()\n }\n console.log(response)\n }\n } catch (err: any) {\n if (json) {\n console.error(JSON.stringify({ tool: 'maidang', command: 'chat', error: err.message }, null, 2))\n } else {\n console.error(chalk.red(`Error: ${err.message}`))\n process.exit(1)\n }\n }\n}\n\n// \u2500\u2500 TUI component \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\ninterface ChatMessageData {\n role: 'user' | 'assistant'\n content: string\n thinking?: string | null\n}\n\nconst ChatMessage: React.FC<{ msg: ChatMessageData }> = ({ msg }) => {\n const prefix = msg.role === 'user' ? '\u4F60' : '\u9EA6\u5F53'\n const color = msg.role === 'user' ? 'cyan' : 'white'\n\n return (\n <Box flexDirection=\"column\" marginY={0}>\n <Text color={color} bold>{prefix}</Text>\n {msg.thinking && (\n <Box flexDirection=\"column\" paddingLeft={2} marginY={0}>\n <Text dimColor>\uD83D\uDCAD \u601D\u8003</Text>\n <Box borderStyle=\"round\" borderColor=\"gray\" paddingX={1}>\n <Text dimColor wrap=\"wrap\">{msg.thinking}</Text>\n </Box>\n </Box>\n )}\n <Box paddingLeft={2}>\n <Text wrap=\"wrap\">{msg.content}</Text>\n </Box>\n </Box>\n )\n}\n\nconst ChatApp: React.FC = () => {\n const [messages, setMessages] = useState<ChatMessageData[]>([])\n const [input, setInput] = useState('')\n const [loading, setLoading] = useState(false)\n const [error, setError] = useState<string | null>(null)\n\n useInput((char, key) => {\n if (key.return && !loading) {\n const text = input.trim()\n if (!text) return\n setMessages(prev => [...prev, { role: 'user', content: text }])\n setInput('')\n setLoading(true)\n setError(null)\n fetchChat(text)\n .then(({ thinking, response }) => {\n setMessages(prev => [...prev, { role: 'assistant', content: response, thinking }])\n })\n .catch((err: Error) => {\n setError(err.message)\n })\n .finally(() => {\n setLoading(false)\n })\n return\n }\n\n if (char === '\\b' || char === '\\x7f') {\n setInput(prev => prev.slice(0, -1))\n return\n }\n\n if (key.escape) {\n setInput('')\n return\n }\n\n if (!char || char.length === 0) return\n if (key.ctrl || key.meta || key.alt) return\n if (key.return || key.upArrow || key.downArrow) return\n\n setInput(prev => prev + char)\n })\n\n return (\n <Box flexDirection=\"column\" paddingX={1} paddingY={0} flexGrow={1}>\n <Box borderStyle=\"single\" borderColor=\"cyan\" paddingX={1} marginBottom={1} flexShrink={0}>\n <Text bold color=\"cyan\">\u9EA6\u5F53</Text>\n <Text dimColor> \u00B7 chat \u00B7 Ctrl+C \u9000\u51FA</Text>\n </Box>\n\n <Box flexDirection=\"column\" flexGrow={1} overflow=\"hidden\">\n {messages.length === 0 && !loading && (\n <Box paddingY={1}>\n <Text dimColor>\u53D1\u9001\u6D88\u606F\u5F00\u59CB\u5BF9\u8BDD...</Text>\n </Box>\n )}\n {messages.map((msg, i) => (\n <Box key={i} flexDirection=\"column\" marginBottom={1} flexShrink={0}>\n <ChatMessage msg={msg} />\n </Box>\n ))}\n {loading && (\n <Box flexDirection=\"column\" marginBottom={1} flexShrink={0}>\n <Text dimColor>\u9EA6\u5F53</Text>\n <Box paddingLeft={2}>\n <Text dimColor>\u601D\u8003\u4E2D...</Text>\n </Box>\n </Box>\n )}\n {error && (\n <Box flexDirection=\"column\" marginBottom={1} flexShrink={0}>\n <Text color=\"red\">Error: {error}</Text>\n </Box>\n )}\n </Box>\n\n <Box borderStyle=\"single\" borderColor=\"gray\" paddingX={1} marginTop={1} flexShrink={0}>\n <Text color=\"cyan\">> </Text>\n <Text>{input}</Text>\n <Text dimColor>\u258E</Text>\n </Box>\n </Box>\n )\n}\n\n// \u2500\u2500 Command \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nexport function createChatCommand(): Command {\n const cmd = new Command('chat')\n .description('\u548C\u9EA6\u5F53\u5BF9\u8BDD')\n .option('-m, --message <text>', '\u76F4\u63A5\u53D1\u9001\u6D88\u606F\uFF08\u975E\u4EA4\u4E92\u6A21\u5F0F\uFF09')\n .option('--json', '\u8F93\u51FA JSON \u683C\u5F0F')\n\n cmd.action(async (opts) => {\n if (opts.json || opts.message) {\n if (!opts.message) {\n if (opts.json) {\n console.error(JSON.stringify({ tool: 'maidang', command: 'chat', error: 'no message provided' }, null, 2))\n } else {\n console.error('\u8BF7\u63D0\u4F9B\u6D88\u606F\uFF1Amaidang chat -m \"\u4F60\u597D\"')\n }\n process.exit(1)\n }\n await chatSync(opts.message, !!opts.json)\n return\n }\n\n render(<ChatApp />)\n })\n\n return cmd\n}\n", "import { Message } from '../types/chat.js'\n\nconst API_URL = process.env.MAIDANG_API_URL || 'http://localhost:3000'\n\nexport function buildSystemPrompt(): string {\n return `\u4F60\u662F\u6211\u7684\u6570\u5B57\u5206\u8EAB/\u667A\u80FD\u52A9\u624B\u3002\u4F60\u7684\u76EE\u6807\u662F\u5E2E\u52A9\u4ED6\u4EBA\u4E86\u89E3\u6211\uFF0C\u56DE\u7B54\u5173\u4E8E\u6211\u7684\u95EE\u9898\uFF0C\u5E76\u63D0\u4F9B\u6709\u7528\u7684\u4FE1\u606F\u3002\n\n\u5173\u4E8E\u6211\uFF1A\n- \u672C\u540D\uFF1A\u9EA6\u5F53\n- \u804C\u4E1A\uFF1A\u5168\u6808\u5DE5\u7A0B\u5E08 / \u72EC\u7ACB\u5F00\u53D1\u8005\n- \u6807\u7B7E\uFF1A\u6587\u79D1\u8F6C\u7801\u3001\u5168\u6808\u3001\u72EC\u7ACB\u5F00\u53D1\n- \u4F4D\u7F6E\uFF1A\u676D\u5DDE\n- \u8054\u7CFB\u65B9\u5F0F\uFF1Aborisdunk@sina.com\n- Blog\uFF1Ahttps://www.maidang.me\n\n\u56DE\u7B54\u98CE\u683C\uFF1A\n- \u4EB2\u5207\uFF0C\u81EA\u7136\uFF0C\u50CF\u670B\u53CB\u4E4B\u95F4\u7684\u5BF9\u8BDD\n- \u7B80\u6D01\u6709\u529B\uFF0C\u4E0D\u5570\u55E6\n- \u5982\u679C\u4E0D\u77E5\u9053\u67D0\u4E9B\u4FE1\u606F\uFF0C\u5766\u8BDA\u8BF4\u4E0D\u77E5\u9053\n\n\u8BF7\u59CB\u7EC8\u4FDD\u6301\u89D2\u8272\uFF0C\u56DE\u7B54\u95EE\u9898\u65F6\u50CF\u662F\u6211\u672C\u4EBA\u5728\u8BF4\u8BDD\u3002`\n}\n\nconst THINK_RE = new RegExp('<think>([\\\\s\\\\S]+?)</think>([\\\\s\\\\S]*$)', '')\n\nexport function parseReply(raw: string): { thinking: string | null; response: string } {\n const match = raw.match(THINK_RE)\n if (match) {\n const thinking = match[1].trim()\n const response = match[2].trim()\n return { thinking: thinking || null, response: response || '(\u65E0\u56DE\u590D)' }\n }\n return { thinking: null, response: raw.trim() }\n}\n\nexport async function fetchChat(message: string): Promise<{ thinking: string | null; response: string }> {\n const messages: Message[] = [{ role: 'user', content: message }]\n const systemPrompt = buildSystemPrompt()\n\n const res = await fetch(`${API_URL}/api/chat`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ messages, systemPrompt }),\n })\n\n if (!res.ok) {\n const err = await res.json().catch(() => ({ error: 'Unknown error' }))\n throw new Error(err.error || `HTTP ${res.status}`)\n }\n\n const data = await res.json()\n return parseReply(data.reply || '')\n}\n", "/**\n * \u8BA1\u7B97\u9EA6\u5F53\u7684\u5E74\u9F84\u7248\u672C\u53F7\n * \u51FA\u751F\u65E5\u671F\uFF1A1997\u5E743\u670810\u65E5\n * \u8FD4\u56DE\u683C\u5F0F\uFF1A\u5E74\u9F84.\u5C0F\u7248\u672C\u53F7.\u8865\u4E01\u53F7\n */\nexport function getAgeVersion(): string {\n const birthDate = new Date(1997, 2, 10); // \u6708\u4EFD\u4ECE0\u5F00\u59CB\uFF0C\u6240\u4EE52\u662F3\u6708\n const today = new Date();\n\n let age = today.getFullYear() - birthDate.getFullYear();\n const monthDiff = today.getMonth() - birthDate.getMonth();\n\n // \u5982\u679C\u8FD8\u6CA1\u8FC7\u751F\u65E5\uFF0C\u5E74\u9F84\u51CF1\n if (monthDiff < 0 || (monthDiff === 0 && today.getDate() < birthDate.getDate())) {\n age--;\n }\n\n // \u8FD9\u91CC\u7684\u5C0F\u7248\u672C\u548C\u8865\u4E01\u53F7\u53EF\u4EE5\u540E\u7EED\u4ECE package.json \u8BFB\u53D6\u6216\u56FA\u5B9A\n // \u73B0\u5728\u5148\u8FD4\u56DE\u7B80\u5355\u683C\u5F0F\n return `${age}.0.0`;\n}\n\n/**\n * \u83B7\u53D6\u7248\u672C\u53F7\u548C\u751F\u65E5\u4FE1\u606F\n */\nexport function getVersionInfo(): { version: string; birthDate: Date; currentAge: number; nextBirthday: Date } {\n const birthDate = new Date(1997, 2, 10); // 1997\u5E743\u670810\u65E5\n const today = new Date();\n\n let currentAge = today.getFullYear() - birthDate.getFullYear();\n const monthDiff = today.getMonth() - birthDate.getMonth();\n\n // \u8BA1\u7B97\u4E0B\u4E00\u4E2A\u751F\u65E5\n const nextBirthday = new Date(today.getFullYear(), birthDate.getMonth(), birthDate.getDate());\n\n if (monthDiff < 0 || (monthDiff === 0 && today.getDate() < birthDate.getDate())) {\n currentAge--;\n } else {\n nextBirthday.setFullYear(today.getFullYear() + 1);\n }\n\n const version = `${currentAge}.0.0`;\n\n return {\n version,\n birthDate,\n currentAge,\n nextBirthday\n };\n}\n"],
|
|
5
|
+
"mappings": ";;;AAEA,SAAS,WAAAA,iBAAe;;;ACFxB,SAAS,eAAe;AACxB,OAAOC,YAAW;;;ACDlB,OAAO,WAAW;AAClB,OAAO,WAAW;AAClB,OAAO,YAAY;AACnB,OAAO,SAAkB;AAsClB,SAAS,cAAc,MAAmB;AAC/C,SAAO,IAAI;AAAA,IACT;AAAA,IACA,OAAO;AAAA,EACT,CAAC;AACH;AAEO,SAAS,iBAAiB,OAAe,UAAK,SAAiB,IAAU;AAC9E,UAAQ,IAAI,MAAM,KAAK,KAAK,OAAO,MAAM,CAAC,CAAC;AAC7C;AAWO,SAAS,eAAe,OAAqB;AAClD,mBAAiB;AACjB,UAAQ,IAAI,MAAM,KAAK,KAAK;AAAA,EAAK,KAAK,EAAE,CAAC;AACzC,mBAAiB;AACnB;;;AD7DA,IAAM,WAAW;AAAA,EACf,EAAE,MAAM,UAAU,MAAM,qBAAM;AAAA,EAC9B,EAAE,MAAM,UAAU,MAAM,8BAAU;AAAA,EAClC,EAAE,MAAM,UAAU,MAAM,eAAK;AAAA,EAC7B,EAAE,MAAM,SAAS,MAAM,eAAK;AAAA,EAC5B,EAAE,MAAM,SAAS,MAAM,2BAAO;AAAA,EAC9B,EAAE,MAAM,SAAS,MAAM,eAAK;AAAA,EAC5B,EAAE,MAAM,YAAY,MAAM,eAAK;AAAA,EAC/B,EAAE,MAAM,cAAc,MAAM,eAAK;AACnC;AAEO,SAAS,oBAA6B;AAC3C,QAAM,MAAM,IAAI,QAAQ,SAAS,EAC9B,YAAY,wDAAW,EACvB,OAAO,YAAY;AAClB,UAAM,UAAU,cAAc,6BAAS;AACvC,YAAQ,MAAM;AAEd,UAAM,IAAI,QAAQ,aAAW,WAAW,SAAS,GAAG,CAAC;AAErD,YAAQ,KAAK;AACb,YAAQ,MAAM;AAEd,YAAQ,IAAIC,OAAM,KAAK,2BAAO,CAAC;AAC/B,YAAQ,IAAIA,OAAM,IAAI,8MAAyC,CAAC;AAChE,YAAQ,IAAI,EAAE;AACd,YAAQ,IAAIA,OAAM,IAAI,SAAI,OAAO,EAAE,CAAC,CAAC;AACrC,YAAQ,IAAI,EAAE;AAEd,eAAWC,QAAO,UAAU;AAC1B,cAAQ,IAAI,KAAKD,OAAM,MAAMC,KAAI,KAAK,OAAO,EAAE,CAAC,CAAC,IAAID,OAAM,IAAIC,KAAI,IAAI,CAAC,EAAE;AAAA,IAC5E;AAEA,YAAQ,IAAI,EAAE;AACd,YAAQ,IAAID,OAAM,IAAI,SAAI,OAAO,EAAE,CAAC,CAAC;AACrC,YAAQ,IAAI,EAAE;AAAA,EAChB,CAAC;AAEH,SAAO;AACT;;;AE3CA,SAAS,WAAAE,gBAAe;AACxB,OAAOC,YAAW;;;ACDlB;AAAA,EACE,QAAU;AAAA,IACR;AAAA,MACE,SAAW;AAAA,MACX,MAAQ;AAAA,MACR,QAAU;AAAA,MACV,aAAe;AAAA,MACf,cAAgB;AAAA,QACd;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAAA,IACA;AAAA,MACE,SAAW;AAAA,MACX,MAAQ;AAAA,MACR,QAAU;AAAA,MACV,aAAe;AAAA,MACf,cAAgB;AAAA,QACd;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAAA,IACA;AAAA,MACE,SAAW;AAAA,MACX,MAAQ;AAAA,MACR,QAAU;AAAA,MACV,aAAe;AAAA,MACf,cAAgB;AAAA,QACd;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAAA,IACA;AAAA,MACE,SAAW;AAAA,MACX,MAAQ;AAAA,MACR,QAAU;AAAA,MACV,aAAe;AAAA,MACf,cAAgB;AAAA,QACd;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;;;AD3CO,SAAS,sBAA+B;AAC7C,QAAM,MAAM,IAAIC,SAAQ,QAAQ,EAC7B,YAAY,sGAA2B,EACvC,OAAO,UAAU,gCAAY,EAC7B,OAAO,CAAC,SAAS;AAChB,QAAI,KAAK,MAAM;AACb,cAAQ,IAAI,KAAK,UAAU,EAAE,MAAM,WAAW,SAAS,UAAU,MAAM,eAAW,GAAG,MAAM,CAAC,CAAC;AAC7F;AAAA,IACF;AAEA,mBAAe,oCAAS;AAExB,mBAAW,OAAO,QAAQ,CAAC,KAAK,UAAU;AACxC,cAAQ,IAAI,EAAE;AAEd,cAAQ,IAAIC,OAAM,OAAO,KAAK,aAAM,IAAI,OAAO,EAAE,CAAC;AAClD,cAAQ,IAAIA,OAAM,KAAK,MAAM,IAAI,IAAI,EAAE,CAAC;AACxC,cAAQ,IAAIA,OAAM,KAAK,MAAM,IAAI,MAAM,EAAE,CAAC;AAC1C,cAAQ,IAAI,EAAE;AAEd,cAAQ,IAAIA,OAAM,MAAM,kBAAW,IAAI,WAAW,CAAC;AACnD,cAAQ,IAAI,EAAE;AAEd,UAAI,IAAI,gBAAgB,IAAI,aAAa,SAAS,GAAG;AACnD,gBAAQ,IAAIA,OAAM,KAAK,8BAAU,CAAC;AAClC,YAAI,aAAa,QAAQ,iBAAe;AACtC,kBAAQ,IAAIA,OAAM,MAAM,eAAU,WAAW,CAAC;AAAA,QAChD,CAAC;AAAA,MACH;AAEA,UAAI,QAAQ,eAAW,OAAO,SAAS,GAAG;AACxC,gBAAQ,IAAI,EAAE;AACd,gBAAQ,IAAIA,OAAM,KAAK,SAAI,OAAO,EAAE,CAAC,CAAC;AAAA,MACxC;AAAA,IACF,CAAC;AAED,YAAQ,IAAI,EAAE;AAAA,EAChB,CAAC;AAEH,SAAO;AACT;;;AE7CA,SAAS,WAAAC,gBAAe;AACxB,OAAOC,YAAW;AAClB,OAAO,UAAU;AACjB,OAAO,QAAQ;AAEf,IAAM,oBAAoB;AAC1B,IAAM,qBAAqB;AAE3B,IAAM,uBAAuB,MAAc;AACzC,MAAI,CAAC,QAAQ,KAAK,CAAC,GAAG;AACpB,WAAO,QAAQ,IAAI;AAAA,EACrB;AAEA,QAAM,iBAAiB,KAAK,QAAQ,QAAQ,KAAK,CAAC,CAAC;AACnD,MAAI;AACF,UAAM,yBAAyB,GAAG,aAAa,cAAc;AAC7D,WAAO,KAAK,QAAQ,sBAAsB;AAAA,EAC5C,QAAQ;AACN,WAAO,KAAK,QAAQ,cAAc;AAAA,EACpC;AACF;AAEA,IAAM,sBAAsB,MAAqB;AAC/C,QAAM,gBAAgB,qBAAqB;AAC3C,QAAM,iBAAiB,KAAK,QAAQ,eAAe,IAAI;AACvD,QAAM,iBAAiB;AAAA,IACrB,KAAK,QAAQ,QAAQ,IAAI,GAAG,oBAAoB;AAAA,IAChD,KAAK,QAAQ,gBAAgB,oBAAoB;AAAA,IACjD,KAAK,QAAQ,gBAAgB,qBAAqB;AAAA,IAClD,KAAK,QAAQ,eAAe,gBAAgB;AAAA,IAC5C,KAAK,QAAQ,eAAe,mBAAmB;AAAA,EACjD;AAEA,aAAW,iBAAiB,gBAAgB;AAC1C,QAAI,GAAG,WAAW,aAAa,GAAG;AAChC,aAAO;AAAA,IACT;AAAA,EACF;AAEA,SAAO;AACT;AAEO,SAAS,mBAA4B;AAC1C,QAAM,MAAM,IAAID,SAAQ,KAAK,EAC1B,MAAM,MAAM,EACZ,YAAY,0BAAM,EAClB,OAAO,YAAY;AAClB,YAAQ,IAAIC,OAAM,OAAO,KAAK,cAAI,CAAC;AACnC,YAAQ,IAAI,EAAE;AAEd,QAAI;AACF,YAAM,eAAe,oBAAoB;AAEzC,UAAI,cAAc;AAChB,YAAI;AACF,gBAAM,EAAE,SAAS,cAAc,IAAI,MAAM,OAAO,gBAAgB;AAChE,gBAAM,QAAQ,MAAM,cAAc,KAAK,cAAc;AAAA,YACnD,OAAO;AAAA,YACP,QAAQ;AAAA,YACR,qBAAqB;AAAA,UACvB,CAAC;AAED,kBAAQ,IAAI,KAAK;AAAA,QACnB,SAAS,OAAO;AACd,kBAAQ,IAAIA,OAAM,IAAI,sCAAQ,CAAC;AAAA,QACjC;AAAA,MACF,OAAO;AACL,gBAAQ,IAAIA,OAAM,KAAK,qEAA6B,CAAC;AAAA,MACvD;AAAA,IACF,SAAS,OAAO;AACd,cAAQ,IAAIA,OAAM,KAAK,+EAAgC,CAAC;AAAA,IAC1D;AAEA,YAAQ,IAAI,EAAE;AAAA,EAChB,CAAC;AAEH,SAAO;AACT;;;AC7EA,OAAO,SAAS,UAAU,iBAAiB;AAC3C,SAAS,QAAQ,KAAK,MAAM,gBAAgB;AAC5C,SAAS,WAAAC,gBAAe;AAmBxB,IAAM,WAMD,CAAC,EAAE,OAAO,eAAe,UAAU,SAAS,OAAO,MAAM;AAC5D,WAAS,CAAC,OAAO,QAAQ;AACvB,QAAI,UAAU,OAAO,UAAU,KAAK;AAClC,aAAO;AACP;AAAA,IACF;AACA,QAAI,IAAI,SAAS;AACf,eAAS,KAAK,IAAI,GAAG,gBAAgB,CAAC,CAAC;AAAA,IACzC,WAAW,IAAI,WAAW;AACxB,eAAS,KAAK,IAAI,MAAM,SAAS,GAAG,gBAAgB,CAAC,CAAC;AAAA,IACxD,WAAW,IAAI,QAAQ;AACrB,cAAQ;AAAA,IACV;AAAA,EACF,CAAC;AAED,SACE,oCAAC,OAAI,eAAc,UAAS,UAAU,GAAG,UAAU,KACjD,oCAAC,OAAI,cAAc,KACjB,oCAAC,QAAK,MAAI,MAAC,OAAM,UAAO,oCAAO,GAC/B,oCAAC,QAAK,UAAQ,QAAC,UAAI,MAAM,QAAO,SAAE,CACpC,GACA,oCAAC,QAAK,UAAQ,MAAC,cAAc,KAAG,mFAAyB,GAEzD,oCAAC,OAAI,eAAc,UAAS,aAAY,UAAS,aAAY,QAAO,UAAU,GAAG,UAAU,KACxF,MAAM,IAAI,CAAC,MAAM,UAAU;AAC1B,UAAM,aAAa,kBAAkB;AACrC,UAAM,MAAM,OAAO,QAAQ,CAAC,EAAE,SAAS,GAAG,GAAG;AAC7C,UAAM,QAAQ,KAAK,SAAS,KAAK,SAAS,UAAU,GAAG,EAAE,KAAK,KAAK,QAAQ,UAAU,GAAG,EAAE;AAC1F,UAAM,OAAO,CAAC,KAAK,MAAM,KAAK,IAAI,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG;AAC5D,WACE;AAAA,MAAC;AAAA;AAAA,QACC,KAAK,KAAK;AAAA,QACV,UAAU;AAAA,QACV,UAAU;AAAA,QACV,SAAS;AAAA,QACT,aAAY;AAAA,QACZ,aAAa,aAAa,SAAS;AAAA;AAAA,MAEnC,oCAAC,QAAK,UAAQ,QAAE,GAAI;AAAA,MACpB,oCAAC,QAAK,UAAQ,QAAC,UAAG;AAAA,MAClB,oCAAC,OAAI,eAAc,UAAS,UAAU,KACpC,oCAAC,QAAK,MAAM,YAAY,OAAO,aAAa,SAAS,UAClD,KACH,GACC,QACC,oCAAC,QAAK,UAAQ,QAAE,IAAK,CAEzB;AAAA,MACC,cACC,oCAAC,QAAK,UAAQ,QAAC,SAAE;AAAA,IAErB;AAAA,EAEJ,CAAC,CACH,CACF;AAEJ;AAIA,IAAM,aAQD,CAAC,EAAE,MAAM,QAAQ,QAAQ,QAAQ,QAAQ,SAAS,QAAQ,MAAM;AACnE,WAAS,CAAC,OAAO,QAAQ;AACvB,QAAI,UAAU,OAAO,UAAU,KAAK;AAClC,aAAO;AACP;AAAA,IACF;AACA,QAAI,IAAI,UAAU,UAAU,OAAO,UAAU,KAAK;AAChD,aAAO;AACP;AAAA,IACF;AACA,QAAI,IAAI,aAAa,SAAS;AAC5B,aAAO;AAAA,IACT,WAAW,IAAI,cAAc,SAAS;AACpC,aAAO;AAAA,IACT;AAAA,EACF,CAAC;AAED,QAAM,aAAa,KAAK,QACrB,MAAM,IAAI,EACV,OAAmB,CAAC,KAAK,SAAS;AACjC,QAAI,KAAK,KAAK,MAAM,IAAI;AACtB,UAAI,KAAK,CAAC,CAAC;AAAA,IACb,OAAO;AACL,UAAI,IAAI,WAAW,KAAK,IAAI,IAAI,SAAS,CAAC,EAAE,WAAW,GAAG;AACxD,YAAI,KAAK,CAAC,IAAI,CAAC;AAAA,MACjB,OAAO;AACL,YAAI,IAAI,SAAS,CAAC,EAAE,KAAK,IAAI;AAAA,MAC/B;AAAA,IACF;AACA,WAAO;AAAA,EACT,GAAG,CAAC,CAAC,EACJ,OAAO,OAAK,EAAE,SAAS,CAAC;AAE3B,QAAM,OAAO,KAAK,QAAQ,CAAC;AAC3B,QAAM,OAAO,CAAC,KAAK,MAAM,KAAK,IAAI,EAAE,OAAO,OAAO,EAAE,KAAK,GAAG;AAE5D,SACE,oCAAC,OAAI,eAAc,UAAS,UAAU,GAAG,UAAU,GAAG,YAAY,KAEhE,oCAAC,OAAI,cAAc,KACjB,oCAAC,QAAK,MAAI,MAAC,OAAM,UAAO,oCAAO,GAC/B,oCAAC,QAAK,UAAQ,QAAC,yDAAmB,CACpC,GAGA,oCAAC,OAAI,eAAc,UAAS,aAAY,UAAS,aAAY,QAAO,UAAU,GAAG,cAAc,GAAG,YAAY,KAC5G,oCAAC,WACC,oCAAC,QAAK,MAAI,MAAC,OAAM,WAAS,KAAK,UAAU,cAAK,GAC9C,oCAAC,QAAK,UAAQ,QAAC,KAAE,KAAK,UAAU,UAAW,GAC1C,QAAQ,oCAAC,QAAK,UAAQ,QAAC,UAAI,IAAK,CACnC,GACC,KAAK,SACJ,oCAAC,QAAK,MAAI,MAAC,OAAM,UAAQ,KAAK,KAAM,CAExC,GAGA;AAAA,IAAC;AAAA;AAAA,MACC,eAAc;AAAA,MACd,aAAY;AAAA,MACZ,aAAY;AAAA,MACZ,UAAU;AAAA,MACV,SAAS;AAAA,MACT,YAAY;AAAA,MACZ,UAAS;AAAA;AAAA,IAER,WAAW,IAAI,CAAC,MAAM,OACrB,oCAAC,OAAI,KAAK,IAAI,eAAc,UAAS,cAAc,KAAK,WAAW,SAAS,IAAI,IAAI,GAAG,YAAY,KAChG,KAAK,IAAI,CAAC,MAAM,OACf,oCAAC,QAAK,KAAK,IAAI,MAAK,UAAQ,IAAK,CAClC,CACH,CACD;AAAA,EACH,GAGC,KAAK,SAAS,KACb,oCAAC,OAAI,aAAY,UAAS,aAAY,QAAO,UAAU,GAAG,SAAS,GAAG,YAAY,KAChF,oCAAC,QAAK,UAAQ,QACX,KAAK,IAAI,SAAO,oCAAC,QAAK,KAAK,KAAK,OAAM,UAAO,KAAE,KAAI,GAAC,CAAO,CAC9D,CACF,GAIF,oCAAC,OAAI,WAAW,GAAG,YAAY,KAC7B,oCAAC,QAAK,UAAQ,QAAC,WACV,UAAU,uBAAQ,UAAI,uBAAK,UAAU,uBAAQ,UAAI,8BACtD,CACF,CACF;AAEJ;AAIA,IAAM,WAAyC,CAAC,EAAE,OAAO,MAAM;AAC7D,QAAM,CAAC,OAAO,QAAQ,IAAI,SAAqB,CAAC,CAAC;AACjD,QAAM,CAAC,eAAe,gBAAgB,IAAI,SAAS,CAAC;AACpD,QAAM,CAAC,MAAM,OAAO,IAAI,SAAe,MAAM;AAC7C,QAAM,CAAC,SAAS,UAAU,IAAI,SAAS,IAAI;AAC3C,QAAM,CAAC,OAAO,QAAQ,IAAI,SAAwB,IAAI;AAEtD,YAAU,MAAM;AACd,UAAM,MAAM,EACT,KAAK,CAAC,QAAQ;AACb,UAAI,CAAC,IAAI,GAAI,OAAM,IAAI,MAAM,QAAQ,IAAI,MAAM,EAAE;AACjD,aAAO,IAAI,KAAK;AAAA,IAClB,CAAC,EACA,KAAK,CAAC,SAAS;AACd,eAAS,IAAI;AACb,iBAAW,KAAK;AAAA,IAClB,CAAC,EACA,MAAM,CAAC,QAAQ;AACd,eAAS,IAAI,OAAO;AACpB,iBAAW,KAAK;AAAA,IAClB,CAAC;AAAA,EACL,GAAG,CAAC,MAAM,CAAC;AAEX,QAAM,aAAa,MAAM;AACvB,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,QAAM,cAAc,MAAM;AACxB,YAAQ,QAAQ;AAAA,EAClB;AAEA,QAAM,aAAa,MAAM;AACvB,YAAQ,MAAM;AAAA,EAChB;AAEA,QAAM,aAAa,MAAM;AACvB,qBAAiB,OAAK,KAAK,IAAI,GAAG,IAAI,CAAC,CAAC;AAAA,EAC1C;AAEA,QAAM,aAAa,MAAM;AACvB,qBAAiB,OAAK,KAAK,IAAI,MAAM,SAAS,GAAG,IAAI,CAAC,CAAC;AAAA,EACzD;AAEA,MAAI,SAAS;AACX,WACE,oCAAC,OAAI,eAAc,UAAS,UAAU,GAAG,UAAU,KACjD,oCAAC,QAAK,UAAQ,QAAC,uBAAM,CACvB;AAAA,EAEJ;AAEA,MAAI,OAAO;AACT,WACE,oCAAC,OAAI,eAAc,UAAS,UAAU,GAAG,UAAU,KACjD,oCAAC,QAAK,OAAM,SAAM,8BAAO,KAAM,GAC/B,oCAAC,QAAK,UAAQ,QAAC,qDAAW,CAC5B;AAAA,EAEJ;AAEA,MAAI,MAAM,WAAW,GAAG;AACtB,WACE,oCAAC,OAAI,eAAc,UAAS,UAAU,GAAG,UAAU,KACjD,oCAAC,QAAK,OAAM,YAAS,0BAAI,CAC3B;AAAA,EAEJ;AAEA,MAAI,SAAS,UAAU;AACrB,WACE;AAAA,MAAC;AAAA;AAAA,QACC,MAAM,MAAM,aAAa;AAAA,QACzB,QAAQ;AAAA,QACR,QAAQ;AAAA,QACR,QAAQ;AAAA,QACR,QAAQ;AAAA,QACR,SAAS,gBAAgB;AAAA,QACzB,SAAS,gBAAgB,MAAM,SAAS;AAAA;AAAA,IAC1C;AAAA,EAEJ;AAEA,SACE;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA;AAAA,MACA,UAAU;AAAA,MACV,SAAS;AAAA,MACT,QAAQ;AAAA;AAAA,EACV;AAEJ;AAEO,SAAS,qBAA8B;AAC5C,QAAM,SAAS;AACf,QAAM,MAAM,IAAIA,SAAQ,OAAO,EAC5B,YAAY,oIAAgC,EAC5C,OAAO,UAAU,gCAAY;AAEhC,MAAI,OAAO,CAAC,SAAS;AACnB,UAAM,YAAY,KAAK;AAEvB,QAAI,WAAW;AACb,YAAM,MAAM,EACT,KAAK,SAAO,IAAI,KAAK,CAAC,EACtB,KAAK,UAAQ,QAAQ,IAAI,KAAK,UAAU,EAAE,MAAM,WAAW,SAAS,SAAS,KAAK,GAAG,MAAM,CAAC,CAAC,CAAC,EAC9F,MAAM,SAAO;AAAE,gBAAQ,MAAM,GAAG;AAAG,gBAAQ,KAAK,CAAC;AAAA,MAAG,CAAC;AACxD;AAAA,IACF;AAEA,WAAO,oCAAC,YAAS,QAAgB,CAAE;AAAA,EACrC,CAAC;AAED,SAAO;AACT;;;AClTA,OAAOC,UAAS,YAAAC,WAAqB,cAAc;AACnD,SAAS,UAAAC,SAAQ,OAAAC,MAAK,QAAAC,OAAM,YAAAC,iBAAgB;AAC5C,SAAS,WAAAC,gBAAe;;;ACFxB;AAAA,EACE,OAAS;AAAA,IACP;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EACA,MAAQ;AAAA,IACN;AAAA,MACE,MAAQ;AAAA,MACR,MAAQ;AAAA,MACR,YAAc;AAAA,IAChB;AAAA,IACA;AAAA,MACE,MAAQ;AAAA,MACR,MAAQ;AAAA,MACR,YAAc;AAAA,IAChB;AAAA,IACA;AAAA,MACE,MAAQ;AAAA,MACR,MAAQ;AAAA,MACR,YAAc;AAAA,IAChB;AAAA,IACA;AAAA,MACE,MAAQ;AAAA,MACR,MAAQ;AAAA,MACR,YAAc;AAAA,IAChB;AAAA,IACA;AAAA,MACE,MAAQ;AAAA,MACR,MAAQ;AAAA,MACR,YAAc;AAAA,IAChB;AAAA,IACA;AAAA,MACE,MAAQ;AAAA,MACR,MAAQ;AAAA,MACR,YAAc;AAAA,IAChB;AAAA,IACA;AAAA,MACE,MAAQ;AAAA,MACR,MAAQ;AAAA,MACR,YAAc;AAAA,IAChB;AAAA,IACA;AAAA,MACE,MAAQ;AAAA,MACR,MAAQ;AAAA,MACR,YAAc;AAAA,IAChB;AAAA,EACF;AAAA,EACA,MAAQ;AAAA,IACN;AAAA,MACE,MAAQ;AAAA,MACR,OAAS;AAAA,QACP;AAAA,UACE,IAAM;AAAA,UACN,YAAc;AAAA,UACd,MAAQ;AAAA,UACR,UAAY;AAAA,UACZ,SAAW;AAAA,YACT;AAAA,UACF;AAAA,UACA,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,IAAM;AAAA,UACN,YAAc;AAAA,UACd,MAAQ;AAAA,UACR,UAAY;AAAA,UACZ,SAAW;AAAA,YACT;AAAA,UACF;AAAA,UACA,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,IAAM;AAAA,UACN,YAAc;AAAA,UACd,MAAQ;AAAA,UACR,UAAY;AAAA,UACZ,SAAW;AAAA,YACT;AAAA,UACF;AAAA,UACA,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,IAAM;AAAA,UACN,YAAc;AAAA,UACd,MAAQ;AAAA,UACR,UAAY;AAAA,UACZ,SAAW;AAAA,YACT;AAAA,UACF;AAAA,UACA,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,IAAM;AAAA,UACN,YAAc;AAAA,UACd,MAAQ;AAAA,UACR,UAAY;AAAA,UACZ,SAAW;AAAA,YACT;AAAA,UACF;AAAA,UACA,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,IAAM;AAAA,UACN,YAAc;AAAA,UACd,MAAQ;AAAA,UACR,UAAY;AAAA,UACZ,SAAW;AAAA,YACT;AAAA,UACF;AAAA,UACA,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,IAAM;AAAA,UACN,YAAc;AAAA,UACd,MAAQ;AAAA,UACR,UAAY;AAAA,UACZ,SAAW;AAAA,YACT;AAAA,YACA;AAAA,UACF;AAAA,UACA,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,IAAM;AAAA,UACN,YAAc;AAAA,UACd,MAAQ;AAAA,UACR,UAAY;AAAA,UACZ,SAAW;AAAA,YACT;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,UACA,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,IAAM;AAAA,UACN,YAAc;AAAA,UACd,MAAQ;AAAA,UACR,UAAY;AAAA,UACZ,SAAW;AAAA,YACT;AAAA,UACF;AAAA,UACA,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,IAAM;AAAA,UACN,YAAc;AAAA,UACd,MAAQ;AAAA,UACR,UAAY;AAAA,UACZ,SAAW;AAAA,YACT;AAAA,UACF;AAAA,UACA,OAAS;AAAA,QACX;AAAA,MACF;AAAA,IACF;AAAA,IACA;AAAA,MACE,MAAQ;AAAA,MACR,OAAS;AAAA,QACP;AAAA,UACE,IAAM;AAAA,UACN,YAAc;AAAA,UACd,MAAQ;AAAA,UACR,UAAY;AAAA,UACZ,SAAW;AAAA,YACT;AAAA,YACA;AAAA,UACF;AAAA,UACA,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,IAAM;AAAA,UACN,YAAc;AAAA,UACd,MAAQ;AAAA,UACR,UAAY;AAAA,UACZ,SAAW;AAAA,YACT;AAAA,UACF;AAAA,UACA,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,IAAM;AAAA,UACN,YAAc;AAAA,UACd,MAAQ;AAAA,UACR,UAAY;AAAA,UACZ,SAAW;AAAA,YACT;AAAA,UACF;AAAA,UACA,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,IAAM;AAAA,UACN,YAAc;AAAA,UACd,MAAQ;AAAA,UACR,UAAY;AAAA,UACZ,SAAW;AAAA,YACT;AAAA,YACA;AAAA,UACF;AAAA,UACA,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,IAAM;AAAA,UACN,YAAc;AAAA,UACd,MAAQ;AAAA,UACR,UAAY;AAAA,UACZ,SAAW;AAAA,YACT;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,UACA,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,IAAM;AAAA,UACN,YAAc;AAAA,UACd,MAAQ;AAAA,UACR,UAAY;AAAA,UACZ,SAAW;AAAA,YACT;AAAA,UACF;AAAA,UACA,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,IAAM;AAAA,UACN,YAAc;AAAA,UACd,MAAQ;AAAA,UACR,UAAY;AAAA,UACZ,SAAW;AAAA,YACT;AAAA,UACF;AAAA,UACA,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,IAAM;AAAA,UACN,YAAc;AAAA,UACd,MAAQ;AAAA,UACR,UAAY;AAAA,UACZ,SAAW;AAAA,YACT;AAAA,UACF;AAAA,UACA,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,IAAM;AAAA,UACN,YAAc;AAAA,UACd,MAAQ;AAAA,UACR,UAAY;AAAA,UACZ,SAAW;AAAA,YACT;AAAA,UACF;AAAA,UACA,OAAS;AAAA,QACX;AAAA,MACF;AAAA,IACF;AAAA,IACA;AAAA,MACE,MAAQ;AAAA,MACR,OAAS;AAAA,QACP;AAAA,UACE,IAAM;AAAA,UACN,YAAc;AAAA,UACd,MAAQ;AAAA,UACR,UAAY;AAAA,UACZ,SAAW;AAAA,YACT;AAAA,UACF;AAAA,UACA,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,IAAM;AAAA,UACN,YAAc;AAAA,UACd,MAAQ;AAAA,UACR,UAAY;AAAA,UACZ,SAAW;AAAA,YACT;AAAA,UACF;AAAA,UACA,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,IAAM;AAAA,UACN,YAAc;AAAA,UACd,MAAQ;AAAA,UACR,UAAY;AAAA,UACZ,SAAW;AAAA,YACT;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,UACA,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,IAAM;AAAA,UACN,YAAc;AAAA,UACd,MAAQ;AAAA,UACR,UAAY;AAAA,UACZ,SAAW;AAAA,YACT;AAAA,UACF;AAAA,UACA,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,IAAM;AAAA,UACN,YAAc;AAAA,UACd,MAAQ;AAAA,UACR,UAAY;AAAA,UACZ,SAAW;AAAA,YACT;AAAA,UACF;AAAA,UACA,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,IAAM;AAAA,UACN,YAAc;AAAA,UACd,MAAQ;AAAA,UACR,UAAY;AAAA,UACZ,SAAW;AAAA,YACT;AAAA,UACF;AAAA,UACA,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,IAAM;AAAA,UACN,YAAc;AAAA,UACd,MAAQ;AAAA,UACR,UAAY;AAAA,UACZ,SAAW;AAAA,YACT;AAAA,UACF;AAAA,UACA,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,IAAM;AAAA,UACN,YAAc;AAAA,UACd,MAAQ;AAAA,UACR,UAAY;AAAA,UACZ,SAAW;AAAA,YACT;AAAA,UACF;AAAA,UACA,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,IAAM;AAAA,UACN,YAAc;AAAA,UACd,MAAQ;AAAA,UACR,UAAY;AAAA,UACZ,SAAW;AAAA,YACT;AAAA,UACF;AAAA,UACA,OAAS;AAAA,QACX;AAAA,MACF;AAAA,IACF;AAAA,IACA;AAAA,MACE,MAAQ;AAAA,MACR,OAAS;AAAA,QACP;AAAA,UACE,IAAM;AAAA,UACN,YAAc;AAAA,UACd,MAAQ;AAAA,UACR,UAAY;AAAA,UACZ,SAAW;AAAA,YACT;AAAA,UACF;AAAA,UACA,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,IAAM;AAAA,UACN,YAAc;AAAA,UACd,MAAQ;AAAA,UACR,UAAY;AAAA,UACZ,SAAW;AAAA,YACT;AAAA,UACF;AAAA,UACA,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,IAAM;AAAA,UACN,YAAc;AAAA,UACd,MAAQ;AAAA,UACR,UAAY;AAAA,UACZ,SAAW;AAAA,YACT;AAAA,UACF;AAAA,UACA,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,IAAM;AAAA,UACN,YAAc;AAAA,UACd,MAAQ;AAAA,UACR,UAAY;AAAA,UACZ,SAAW;AAAA,YACT;AAAA,UACF;AAAA,UACA,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,IAAM;AAAA,UACN,YAAc;AAAA,UACd,MAAQ;AAAA,UACR,UAAY;AAAA,UACZ,SAAW;AAAA,YACT;AAAA,UACF;AAAA,UACA,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,IAAM;AAAA,UACN,YAAc;AAAA,UACd,MAAQ;AAAA,UACR,UAAY;AAAA,UACZ,SAAW;AAAA,YACT;AAAA,UACF;AAAA,UACA,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,IAAM;AAAA,UACN,YAAc;AAAA,UACd,MAAQ;AAAA,UACR,UAAY;AAAA,UACZ,SAAW;AAAA,YACT;AAAA,UACF;AAAA,UACA,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,IAAM;AAAA,UACN,YAAc;AAAA,UACd,MAAQ;AAAA,UACR,UAAY;AAAA,UACZ,SAAW;AAAA,YACT;AAAA,UACF;AAAA,UACA,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,IAAM;AAAA,UACN,YAAc;AAAA,UACd,MAAQ;AAAA,UACR,UAAY;AAAA,UACZ,SAAW;AAAA,YACT;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,UACA,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,IAAM;AAAA,UACN,YAAc;AAAA,UACd,MAAQ;AAAA,UACR,UAAY;AAAA,UACZ,SAAW;AAAA,YACT;AAAA,UACF;AAAA,UACA,OAAS;AAAA,QACX;AAAA,MACF;AAAA,IACF;AAAA,IACA;AAAA,MACE,MAAQ;AAAA,MACR,OAAS;AAAA,QACP;AAAA,UACE,IAAM;AAAA,UACN,YAAc;AAAA,UACd,MAAQ;AAAA,UACR,UAAY;AAAA,UACZ,SAAW;AAAA,YACT;AAAA,UACF;AAAA,UACA,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,IAAM;AAAA,UACN,YAAc;AAAA,UACd,MAAQ;AAAA,UACR,UAAY;AAAA,UACZ,SAAW;AAAA,YACT;AAAA,UACF;AAAA,UACA,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,IAAM;AAAA,UACN,YAAc;AAAA,UACd,MAAQ;AAAA,UACR,UAAY;AAAA,UACZ,SAAW;AAAA,YACT;AAAA,UACF;AAAA,UACA,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,IAAM;AAAA,UACN,YAAc;AAAA,UACd,MAAQ;AAAA,UACR,UAAY;AAAA,UACZ,SAAW;AAAA,YACT;AAAA,UACF;AAAA,UACA,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,IAAM;AAAA,UACN,YAAc;AAAA,UACd,MAAQ;AAAA,UACR,UAAY;AAAA,UACZ,SAAW;AAAA,YACT;AAAA,UACF;AAAA,UACA,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,IAAM;AAAA,UACN,YAAc;AAAA,UACd,MAAQ;AAAA,UACR,UAAY;AAAA,UACZ,SAAW;AAAA,YACT;AAAA,UACF;AAAA,UACA,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,IAAM;AAAA,UACN,YAAc;AAAA,UACd,MAAQ;AAAA,UACR,UAAY;AAAA,UACZ,SAAW;AAAA,YACT;AAAA,UACF;AAAA,UACA,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,IAAM;AAAA,UACN,YAAc;AAAA,UACd,MAAQ;AAAA,UACR,UAAY;AAAA,UACZ,SAAW;AAAA,YACT;AAAA,UACF;AAAA,UACA,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,IAAM;AAAA,UACN,YAAc;AAAA,UACd,MAAQ;AAAA,UACR,UAAY;AAAA,UACZ,SAAW;AAAA,YACT;AAAA,UACF;AAAA,UACA,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,IAAM;AAAA,UACN,YAAc;AAAA,UACd,MAAQ;AAAA,UACR,UAAY;AAAA,UACZ,SAAW;AAAA,YACT;AAAA,UACF;AAAA,UACA,OAAS;AAAA,QACX;AAAA,MACF;AAAA,IACF;AAAA,IACA;AAAA,MACE,MAAQ;AAAA,MACR,OAAS;AAAA,QACP;AAAA,UACE,IAAM;AAAA,UACN,YAAc;AAAA,UACd,MAAQ;AAAA,UACR,UAAY;AAAA,UACZ,SAAW;AAAA,YACT;AAAA,UACF;AAAA,UACA,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,IAAM;AAAA,UACN,YAAc;AAAA,UACd,MAAQ;AAAA,UACR,UAAY;AAAA,UACZ,SAAW;AAAA,YACT;AAAA,UACF;AAAA,UACA,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,IAAM;AAAA,UACN,YAAc;AAAA,UACd,MAAQ;AAAA,UACR,UAAY;AAAA,UACZ,SAAW;AAAA,YACT;AAAA,UACF;AAAA,UACA,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,IAAM;AAAA,UACN,YAAc;AAAA,UACd,MAAQ;AAAA,UACR,UAAY;AAAA,UACZ,SAAW;AAAA,YACT;AAAA,UACF;AAAA,UACA,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,IAAM;AAAA,UACN,YAAc;AAAA,UACd,MAAQ;AAAA,UACR,UAAY;AAAA,UACZ,SAAW;AAAA,YACT;AAAA,UACF;AAAA,UACA,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,IAAM;AAAA,UACN,YAAc;AAAA,UACd,MAAQ;AAAA,UACR,UAAY;AAAA,UACZ,SAAW;AAAA,YACT;AAAA,UACF;AAAA,UACA,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,IAAM;AAAA,UACN,YAAc;AAAA,UACd,MAAQ;AAAA,UACR,UAAY;AAAA,UACZ,SAAW;AAAA,YACT;AAAA,UACF;AAAA,UACA,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,IAAM;AAAA,UACN,YAAc;AAAA,UACd,MAAQ;AAAA,UACR,UAAY;AAAA,UACZ,SAAW;AAAA,YACT;AAAA,UACF;AAAA,UACA,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,IAAM;AAAA,UACN,YAAc;AAAA,UACd,MAAQ;AAAA,UACR,UAAY;AAAA,UACZ,SAAW;AAAA,YACT;AAAA,UACF;AAAA,UACA,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,IAAM;AAAA,UACN,YAAc;AAAA,UACd,MAAQ;AAAA,UACR,UAAY;AAAA,UACZ,SAAW;AAAA,YACT;AAAA,UACF;AAAA,UACA,OAAS;AAAA,QACX;AAAA,MACF;AAAA,IACF;AAAA,IACA;AAAA,MACE,MAAQ;AAAA,MACR,OAAS;AAAA,QACP;AAAA,UACE,IAAM;AAAA,UACN,YAAc;AAAA,UACd,MAAQ;AAAA,UACR,UAAY;AAAA,UACZ,SAAW;AAAA,YACT;AAAA,UACF;AAAA,UACA,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,IAAM;AAAA,UACN,YAAc;AAAA,UACd,MAAQ;AAAA,UACR,UAAY;AAAA,UACZ,SAAW;AAAA,YACT;AAAA,UACF;AAAA,UACA,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,IAAM;AAAA,UACN,YAAc;AAAA,UACd,MAAQ;AAAA,UACR,UAAY;AAAA,UACZ,SAAW;AAAA,YACT;AAAA,UACF;AAAA,UACA,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,IAAM;AAAA,UACN,YAAc;AAAA,UACd,MAAQ;AAAA,UACR,UAAY;AAAA,UACZ,SAAW;AAAA,YACT;AAAA,UACF;AAAA,UACA,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,IAAM;AAAA,UACN,YAAc;AAAA,UACd,MAAQ;AAAA,UACR,UAAY;AAAA,UACZ,SAAW;AAAA,YACT;AAAA,UACF;AAAA,UACA,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,IAAM;AAAA,UACN,YAAc;AAAA,UACd,MAAQ;AAAA,UACR,UAAY;AAAA,UACZ,SAAW;AAAA,YACT;AAAA,UACF;AAAA,UACA,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,IAAM;AAAA,UACN,YAAc;AAAA,UACd,MAAQ;AAAA,UACR,UAAY;AAAA,UACZ,SAAW;AAAA,YACT;AAAA,UACF;AAAA,UACA,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,IAAM;AAAA,UACN,YAAc;AAAA,UACd,MAAQ;AAAA,UACR,UAAY;AAAA,UACZ,SAAW;AAAA,YACT;AAAA,UACF;AAAA,UACA,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,IAAM;AAAA,UACN,YAAc;AAAA,UACd,MAAQ;AAAA,UACR,UAAY;AAAA,UACZ,SAAW;AAAA,YACT;AAAA,UACF;AAAA,UACA,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,IAAM;AAAA,UACN,YAAc;AAAA,UACd,MAAQ;AAAA,UACR,UAAY;AAAA,UACZ,SAAW;AAAA,YACT;AAAA,UACF;AAAA,UACA,OAAS;AAAA,QACX;AAAA,MACF;AAAA,IACF;AAAA,IACA;AAAA,MACE,MAAQ;AAAA,MACR,OAAS;AAAA,QACP;AAAA,UACE,IAAM;AAAA,UACN,YAAc;AAAA,UACd,MAAQ;AAAA,UACR,UAAY;AAAA,UACZ,SAAW;AAAA,YACT;AAAA,UACF;AAAA,UACA,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,IAAM;AAAA,UACN,YAAc;AAAA,UACd,MAAQ;AAAA,UACR,UAAY;AAAA,UACZ,SAAW;AAAA,YACT;AAAA,UACF;AAAA,UACA,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,IAAM;AAAA,UACN,YAAc;AAAA,UACd,MAAQ;AAAA,UACR,UAAY;AAAA,UACZ,SAAW;AAAA,YACT;AAAA,UACF;AAAA,UACA,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,IAAM;AAAA,UACN,YAAc;AAAA,UACd,MAAQ;AAAA,UACR,UAAY;AAAA,UACZ,SAAW;AAAA,YACT;AAAA,UACF;AAAA,UACA,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,IAAM;AAAA,UACN,YAAc;AAAA,UACd,MAAQ;AAAA,UACR,UAAY;AAAA,UACZ,SAAW;AAAA,YACT;AAAA,UACF;AAAA,UACA,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,IAAM;AAAA,UACN,YAAc;AAAA,UACd,MAAQ;AAAA,UACR,UAAY;AAAA,UACZ,SAAW;AAAA,YACT;AAAA,UACF;AAAA,UACA,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,IAAM;AAAA,UACN,YAAc;AAAA,UACd,MAAQ;AAAA,UACR,UAAY;AAAA,UACZ,SAAW;AAAA,YACT;AAAA,UACF;AAAA,UACA,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,IAAM;AAAA,UACN,YAAc;AAAA,UACd,MAAQ;AAAA,UACR,UAAY;AAAA,UACZ,SAAW;AAAA,YACT;AAAA,UACF;AAAA,UACA,OAAS;AAAA,QACX;AAAA,QACA;AAAA,UACE,IAAM;AAAA,UACN,YAAc;AAAA,UACd,MAAQ;AAAA,UACR,UAAY;AAAA,UACZ,SAAW;AAAA,YACT;AAAA,UACF;AAAA,UACA,OAAS;AAAA,QACX;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;;;AC92BA,SAAS,gBAAgB;AAElB,SAAS,gBAAgB,MAAoB;AAClD,WAAS,WAAW,KAAK,QAAQ,MAAM,OAAO,CAAC,cAAc,EAAE,OAAO,SAAS,CAAC;AAClF;;;AFsBA,IAAM,YAAyB,cAAU;AACzC,IAAM,kBAA4B,cAAU;AAC5C,IAAM,WAA2B,cAAU;AAE3C,SAAS,eAAe,IAAoB;AAC1C,QAAM,IAAI,KAAK,MAAM,KAAK,GAAI;AAC9B,QAAM,IAAI,KAAK,MAAM,IAAI,EAAE;AAC3B,QAAM,MAAM,IAAI;AAChB,SAAO,GAAG,CAAC,IAAI,IAAI,SAAS,EAAE,SAAS,GAAG,GAAG,CAAC;AAChD;AAIA,IAAM,aAKD,CAAC,EAAE,eAAe,UAAU,WAAW,OAAO,MAAM;AACvD,EAAAC,UAAS,CAAC,OAAO,QAAQ;AACvB,QAAI,UAAU,OAAO,UAAU,KAAK;AAAE,aAAO;AAAG;AAAA,IAAQ;AACxD,QAAI,IAAI,SAAS;AAAE,eAAS,KAAK,IAAI,GAAG,gBAAgB,CAAC,CAAC;AAAA,IAAG,WACpD,IAAI,WAAW;AAAE,eAAS,KAAK,IAAI,UAAU,SAAS,GAAG,gBAAgB,CAAC,CAAC;AAAA,IAAG,WAC9E,IAAI,QAAQ;AAAE,gBAAU;AAAA,IAAG;AAAA,EACtC,CAAC;AAED,SACE,gBAAAC,OAAA,cAACC,MAAA,EAAI,eAAc,UAAS,UAAU,GAAG,UAAU,KACjD,gBAAAD,OAAA,cAACC,MAAA,EAAI,cAAc,KACjB,gBAAAD,OAAA,cAACE,OAAA,EAAK,MAAI,MAAC,OAAM,UAAO,oCAAO,GAC/B,gBAAAF,OAAA,cAACE,OAAA,EAAK,UAAQ,QAAC,UAAI,UAAU,QAAO,qBAAI,CAC1C,GACA,gBAAAF,OAAA,cAACE,OAAA,EAAK,UAAQ,MAAC,cAAc,KAAG,mFAAyB,GAEzD,gBAAAF,OAAA,cAACC,MAAA,EAAI,eAAc,UAAS,aAAY,UAAS,aAAY,QAAO,UAAU,GAAG,UAAU,KACxF,UAAU,IAAI,CAAC,OAAO,UAAU;AAC/B,UAAM,aAAa,kBAAkB;AACrC,UAAM,OAAO,SAAS,KAAK,OAAK,EAAE,SAAS,MAAM,IAAI;AACrD,UAAM,UAAU,MAAM,MAAM,CAAC,IACzB,GAAG,MAAM,MAAM,CAAC,EAAE,QAAQ,CAAC,KAAK,EAAE,SAAM,MAAM,MAAM,CAAC,EAAE,IAAI,KAC3D;AACJ,WACE,gBAAAD,OAAA;AAAA,MAACC;AAAA,MAAA;AAAA,QACC,KAAK,MAAM;AAAA,QACX,UAAU;AAAA,QACV,UAAU;AAAA,QACV,SAAS;AAAA,QACT,aAAY;AAAA,QACZ,aAAa,aAAa,SAAS;AAAA;AAAA,MAEnC,gBAAAD,OAAA,cAACE,OAAA,EAAK,UAAQ,QAAE,MAAM,IAAK;AAAA,MAC3B,gBAAAF,OAAA,cAACE,OAAA,EAAK,UAAQ,QAAC,UAAG;AAAA,MAClB,gBAAAF,OAAA,cAACC,MAAA,EAAI,eAAc,UAAS,UAAU,KACpC,gBAAAD,OAAA,cAACE,OAAA,EAAK,MAAM,YAAY,OAAO,aAAa,SAAS,UAAY,MAAM,MAAK,2BAAK,GACjF,gBAAAF,OAAA,cAACE,OAAA,EAAK,UAAQ,QAAE,MAAM,cAAc,MAAM,MAAM,QAAO,YAAI,UAAU,QAAK,OAAO,KAAK,EAAG,CAC3F;AAAA,MACC,cAAc,gBAAAF,OAAA,cAACE,OAAA,EAAK,UAAQ,QAAC,SAAE;AAAA,IAClC;AAAA,EAEJ,CAAC,CACH,CACF;AAEJ;AAIA,IAAM,WAOD,CAAC,EAAE,OAAO,eAAe,UAAU,SAAS,QAAQ,OAAO,MAAM;AACpE,EAAAH,UAAS,CAAC,OAAO,QAAQ;AACvB,QAAI,UAAU,OAAO,UAAU,KAAK;AAAE,aAAO;AAAG;AAAA,IAAQ;AACxD,QAAI,IAAI,UAAU,UAAU,OAAO,UAAU,KAAK;AAAE,aAAO;AAAG;AAAA,IAAQ;AACtE,QAAI,IAAI,SAAS;AAAE,eAAS,KAAK,IAAI,GAAG,gBAAgB,CAAC,CAAC;AAAA,IAAG,WACpD,IAAI,WAAW;AAAE,eAAS,KAAK,IAAI,MAAM,MAAM,SAAS,GAAG,gBAAgB,CAAC,CAAC;AAAA,IAAG,WAChF,IAAI,QAAQ;AAAE,cAAQ;AAAA,IAAG;AAAA,EACpC,CAAC;AAED,SACE,gBAAAC,OAAA,cAACC,MAAA,EAAI,eAAc,UAAS,UAAU,GAAG,UAAU,KACjD,gBAAAD,OAAA,cAACC,MAAA,EAAI,cAAc,KACjB,gBAAAD,OAAA,cAACE,OAAA,EAAK,MAAI,MAAC,OAAM,UAAO,cAAI,MAAM,MAAK,2BAAK,GAC5C,gBAAAF,OAAA,cAACE,OAAA,EAAK,UAAQ,QAAC,UAAI,MAAM,MAAM,QAAO,+BAAW,CACnD,GACA,gBAAAF,OAAA,cAACE,OAAA,EAAK,UAAQ,MAAC,cAAc,KAAG,mFAAyB,GAEzD,gBAAAF,OAAA,cAACC,MAAA,EAAI,eAAc,UAAS,aAAY,UAAS,aAAY,QAAO,UAAU,GAAG,UAAU,KACxF,MAAM,MAAM,IAAI,CAAC,MAAM,UAAU;AAChC,UAAM,aAAa,kBAAkB;AACrC,UAAM,MAAM,OAAO,QAAQ,CAAC,EAAE,SAAS,GAAG,GAAG;AAC7C,UAAM,UAAU,KAAK,QAAQ,KAAK,IAAI;AACtC,UAAM,MAAM,eAAe,KAAK,QAAQ;AACxC,WACE,gBAAAD,OAAA;AAAA,MAACC;AAAA,MAAA;AAAA,QACC,KAAK,KAAK;AAAA,QACV,UAAU;AAAA,QACV,UAAU;AAAA,QACV,SAAS;AAAA,QACT,aAAY;AAAA,QACZ,aAAa,aAAa,SAAS;AAAA;AAAA,MAEnC,gBAAAD,OAAA,cAACE,OAAA,EAAK,UAAQ,QAAE,GAAI;AAAA,MACpB,gBAAAF,OAAA,cAACE,OAAA,EAAK,UAAQ,QAAC,UAAG;AAAA,MAClB,gBAAAF,OAAA,cAACC,MAAA,EAAI,eAAc,UAAS,UAAU,KACpC,gBAAAD,OAAA,cAACE,OAAA,EAAK,MAAM,YAAY,OAAO,aAAa,SAAS,UAAY,KAAK,IAAK,GAC3E,gBAAAF,OAAA,cAACE,OAAA,EAAK,UAAQ,QAAE,SAAQ,UAAI,GAAI,CAClC;AAAA,MACC,cAAc,gBAAAF,OAAA,cAACE,OAAA,EAAK,UAAQ,QAAC,SAAE;AAAA,IAClC;AAAA,EAEJ,CAAC,CACH,CACF;AAEJ;AAIA,IAAM,aASD,CAAC,EAAE,MAAM,MAAM,QAAQ,QAAQ,QAAQ,QAAQ,SAAS,QAAQ,MAAM;AACzE,QAAM,CAAC,QAAQ,SAAS,IAAIC,UAAS,KAAK;AAC1C,QAAM,WAAW,OAA6C,IAAI;AAElE,EAAAJ,UAAS,CAAC,OAAO,QAAQ;AACvB,QAAI,UAAU,OAAO,UAAU,KAAK;AAAE,aAAO;AAAG;AAAA,IAAQ;AACxD,QAAI,IAAI,UAAU,UAAU,OAAO,UAAU,KAAK;AAAE,aAAO;AAAG;AAAA,IAAQ;AACtE,QAAI,IAAI,QAAQ;AACd,sBAAgB,KAAK,IAAI;AACzB,gBAAU,IAAI;AACd,UAAI,SAAS,QAAS,cAAa,SAAS,OAAO;AACnD,eAAS,UAAU,WAAW,MAAM,UAAU,KAAK,GAAG,IAAI;AAC1D;AAAA,IACF;AACA,QAAI,IAAI,aAAa,SAAS;AAAE,aAAO;AAAA,IAAG,WACjC,IAAI,cAAc,SAAS;AAAE,aAAO;AAAA,IAAG;AAAA,EAClD,CAAC;AAED,SACE,gBAAAC,OAAA,cAACC,MAAA,EAAI,eAAc,UAAS,UAAU,GAAG,UAAU,GAAG,YAAY,KAChE,gBAAAD,OAAA,cAACC,MAAA,EAAI,cAAc,KACjB,gBAAAD,OAAA,cAACE,OAAA,EAAK,MAAI,MAAC,OAAM,UAAO,cAAI,MAAK,2BAAK,GACtC,gBAAAF,OAAA,cAACE,OAAA,EAAK,UAAQ,QAAC,yDAAmB,CACpC,GAEA,gBAAAF,OAAA,cAACC,MAAA,EAAI,eAAc,UAAS,aAAY,UAAS,aAAY,QAAO,UAAU,GAAG,cAAc,GAAG,YAAY,KAC5G,gBAAAD,OAAA,cAACE,OAAA,EAAK,MAAI,MAAC,OAAM,WAAS,KAAK,IAAK,GACpC,gBAAAF,OAAA,cAACE,OAAA,EAAK,UAAQ,QAAE,KAAK,QAAQ,KAAK,IAAI,CAAE,GACxC,gBAAAF,OAAA,cAACE,OAAA,EAAK,UAAQ,QAAC,kBAAK,KAAK,KAAM,GAC/B,gBAAAF,OAAA,cAACE,OAAA,EAAK,UAAQ,QAAC,kBAAK,eAAe,KAAK,QAAQ,CAAE,CACpD,GAEA,gBAAAF,OAAA,cAACC,MAAA,EAAI,WAAW,GAAG,YAAY,KAC7B,gBAAAD,OAAA,cAACE,OAAA,EAAK,UAAQ,QAAC,WACV,UAAU,uBAAQ,UAAI,uBAAK,UAAU,uBAAQ,UAAI,kDAAiB,SAAS,8BAAU,0BAC1F,CACF,CACF;AAEJ;AAMA,IAAM,WAAoD,CAAC,EAAE,iBAAiB,MAAM;AAClF,QAAM,CAAC,mBAAmB,oBAAoB,IAAIC,UAAS,oBAAoB,CAAC;AAChF,QAAM,CAAC,mBAAmB,oBAAoB,IAAIA,UAAS,CAAC;AAC5D,QAAM,CAAC,MAAM,OAAO,IAAIA,UAAe,WAAW;AAElD,QAAM,aAAa,MAAM,QAAQ,KAAK,CAAC;AAEvC,QAAM,eAAe,UAAU,iBAAiB;AAEhD,MAAI,SAAS,eAAe;AAC1B,UAAM,OAAO,aAAa,MAAM,iBAAiB;AACjD,QAAI,CAAC,KAAM,QAAO;AAClB,WACE,gBAAAH,OAAA;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACA,MAAM,aAAa;AAAA,QACnB,QAAQ,MAAM,QAAQ,WAAW;AAAA,QACjC,QAAQ;AAAA,QACR,QAAQ,MAAM,qBAAqB,OAAK,KAAK,IAAI,GAAG,IAAI,CAAC,CAAC;AAAA,QAC1D,QAAQ,MAAM,qBAAqB,OAAK,KAAK,IAAI,aAAa,MAAM,SAAS,GAAG,IAAI,CAAC,CAAC;AAAA,QACtF,SAAS,oBAAoB;AAAA,QAC7B,SAAS,oBAAoB,aAAa,MAAM,SAAS;AAAA;AAAA,IAC3D;AAAA,EAEJ;AAEA,MAAI,SAAS,aAAa;AACxB,WACE,gBAAAA,OAAA;AAAA,MAAC;AAAA;AAAA,QACC,OAAO;AAAA,QACP,eAAe;AAAA,QACf,UAAU;AAAA,QACV,SAAS,MAAM,QAAQ,aAAa;AAAA,QACpC,QAAQ,MAAM;AAAE,+BAAqB,CAAC;AAAG,kBAAQ,WAAW;AAAA,QAAG;AAAA,QAC/D,QAAQ;AAAA;AAAA,IACV;AAAA,EAEJ;AAGA,SACE,gBAAAA,OAAA;AAAA,IAAC;AAAA;AAAA,MACC,eAAe;AAAA,MACf,UAAU,CAAC,MAAM;AAAE,6BAAqB,CAAC;AAAG,6BAAqB,CAAC;AAAA,MAAG;AAAA,MACrE,WAAW,MAAM;AAAE,6BAAqB,CAAC;AAAG,gBAAQ,WAAW;AAAA,MAAG;AAAA,MAClE,QAAQ;AAAA;AAAA,EACV;AAEJ;AAEO,SAAS,qBAA8B;AAC5C,QAAM,MAAM,IAAII,SAAQ,OAAO,EAC5B,YAAY,+CAAY,gBAAgB,KAAK,IAAI,CAAC,sDAAmB,EACrE,OAAO,UAAU,gCAAY,EAC7B,OAAO,iBAAiB,0EAAc;AAEzC,MAAI,OAAO,CAAC,SAAS;AACnB,QAAI,KAAK,MAAM;AACb,UAAI,KAAK,MAAM;AACb,cAAM,OAAO,SAAS,KAAK,MAAM,EAAE;AACnC,cAAM,QAAQ,UAAU,KAAK,OAAK,EAAE,SAAS,IAAI;AACjD,YAAI,CAAC,OAAO;AACV,kBAAQ,MAAM,gBAAM,IAAI,2BAAO;AAC/B,kBAAQ,KAAK,CAAC;AAAA,QAChB;AACA,cAAM,OAAO,SAAS,KAAK,OAAK,EAAE,SAAS,IAAI;AAC/C,gBAAQ,IAAI,KAAK,UAAU,EAAE,MAAM,WAAW,SAAS,SAAS,MAAM,MAAM,MAAM,MAAM,GAAG,MAAM,CAAC,CAAC;AAAA,MACrG,OAAO;AACL,gBAAQ,IAAI,KAAK,UAAU,EAAE,MAAM,WAAW,SAAS,SAAS,OAAO,iBAAiB,MAAM,UAAU,MAAM,UAAU,GAAG,MAAM,CAAC,CAAC;AAAA,MACrI;AACA;AAAA,IACF;AAEA,QAAI;AACJ,QAAI,KAAK,MAAM;AACb,YAAM,OAAO,SAAS,KAAK,MAAM,EAAE;AACnC,yBAAmB,UAAU,UAAU,OAAK,EAAE,SAAS,IAAI;AAC3D,UAAI,mBAAmB,GAAG;AACxB,gBAAQ,MAAM,gBAAM,IAAI,2BAAO;AAC/B,gBAAQ,KAAK,CAAC;AAAA,MAChB;AAAA,IACF;AAEA,IAAAC,QAAO,gBAAAL,OAAA,cAAC,YAAS,kBAAoC,CAAE;AAAA,EACzD,CAAC;AAED,SAAO;AACT;;;AGlSA,SAAS,WAAAM,gBAAe;AACxB,OAAOC,YAAW;AASX,SAAS,qBAA8B;AAC5C,QAAM,MAAM,IAAID,SAAQ,OAAO,EAC5B,YAAY,0FAAyB,EACrC,OAAO,UAAU,gCAAY,EAC7B,OAAO,OAAO,SAAS;AACtB,UAAM,SAAS,QAAQ,IAAI,mBAAmB;AAE9C,QAAI;AACF,YAAM,MAAM,MAAM,MAAM,GAAG,MAAM,YAAY;AAC7C,UAAI,CAAC,IAAI,GAAI,OAAM,IAAI,MAAM,QAAQ,IAAI,MAAM,EAAE;AACjD,YAAM,QAAgB,MAAM,IAAI,KAAK;AAErC,UAAI,KAAK,MAAM;AACb,gBAAQ,IAAI,KAAK,UAAU,EAAE,MAAM,WAAW,SAAS,SAAS,MAAM,MAAM,GAAG,MAAM,CAAC,CAAC;AACvF;AAAA,MACF;AAEA,cAAQ,IAAIC,OAAM,KAAK,KAAK,sCAAW,CAAC;AACxC,iBAAW,QAAQ,OAAO;AACxB,gBAAQ,IAAI,KAAK,KAAK,IAAI,IAAIA,OAAM,MAAM,KAAK,IAAI,CAAC,MAAMA,OAAM,KAAK,KAAK,eAAe,EAAE,CAAC,EAAE;AAC9F,gBAAQ,IAAI,OAAOA,OAAM,KAAK,KAAK,GAAG,CAAC;AAAA,CAAI;AAAA,MAC7C;AAAA,IACF,SAAS,KAAK;AACZ,cAAQ,MAAMA,OAAM,IAAI,yCAAW,eAAe,QAAQ,IAAI,UAAU,GAAG,EAAE,CAAC;AAC9E,cAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF,CAAC;AAEH,SAAO;AACT;;;ACvCA,SAAS,WAAAC,gBAAe;AACxB,OAAOC,YAAW;AAUX,SAAS,wBAAiC;AAC/C,QAAM,MAAM,IAAID,SAAQ,UAAU,EAC/B,YAAY,sCAAQ,EACpB,OAAO,UAAU,gCAAY,EAC7B,OAAO,OAAO,SAAS;AACtB,UAAM,SAAS,QAAQ,IAAI,mBAAmB;AAE9C,QAAI;AACF,YAAM,MAAM,MAAM,MAAM,GAAG,MAAM,eAAe;AAChD,UAAI,CAAC,IAAI,GAAI,OAAM,IAAI,MAAM,QAAQ,IAAI,MAAM,EAAE;AACjD,YAAM,WAAsB,MAAM,IAAI,KAAK;AAE3C,UAAI,KAAK,MAAM;AACb,gBAAQ,IAAI,KAAK,UAAU,EAAE,MAAM,WAAW,SAAS,YAAY,MAAM,SAAS,GAAG,MAAM,CAAC,CAAC;AAC7F;AAAA,MACF;AAEA,cAAQ,IAAIC,OAAM,KAAK,KAAK,sCAAW,CAAC;AACxC,iBAAW,WAAW,UAAU;AAC9B,gBAAQ,IAAI,KAAK,QAAQ,IAAI,IAAIA,OAAM,MAAM,KAAK,QAAQ,IAAI,CAAC,IAAIA,OAAM,KAAK,IAAI,QAAQ,QAAQ,GAAG,CAAC,EAAE;AACxG,gBAAQ,IAAI,OAAO,QAAQ,WAAW,EAAE;AACxC,YAAI,QAAQ,KAAK;AACf,kBAAQ,IAAI,OAAOA,OAAM,KAAK,QAAQ,GAAG,CAAC,EAAE;AAAA,QAC9C;AACA,gBAAQ,IAAI,EAAE;AAAA,MAChB;AAAA,IACF,SAAS,KAAK;AACZ,cAAQ,MAAMA,OAAM,IAAI,yCAAW,eAAe,QAAQ,IAAI,UAAU,GAAG,EAAE,CAAC;AAC9E,cAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF,CAAC;AAEH,SAAO;AACT;;;AC5CA,SAAS,WAAAC,gBAAe;AACxB,OAAOC,YAAW;AAUX,SAAS,qBAA8B;AAC5C,QAAM,MAAM,IAAID,SAAQ,OAAO,EAC5B,YAAY,sCAAQ,EACpB,OAAO,UAAU,gCAAY,EAC7B,OAAO,OAAO,SAAS;AACtB,UAAM,SAAS,QAAQ,IAAI,mBAAmB;AAE9C,QAAI;AACF,YAAM,MAAM,MAAM,MAAM,GAAG,MAAM,YAAY;AAC7C,UAAI,CAAC,IAAI,GAAI,OAAM,IAAI,MAAM,QAAQ,IAAI,MAAM,EAAE;AACjD,YAAM,QAAgB,MAAM,IAAI,KAAK;AAErC,UAAI,KAAK,MAAM;AACb,gBAAQ,IAAI,KAAK,UAAU,EAAE,MAAM,WAAW,SAAS,SAAS,MAAM,MAAM,GAAG,MAAM,CAAC,CAAC;AACvF;AAAA,MACF;AAEA,YAAM,aAAa,MAAM,OAAO,CAAC,KAAK,SAAS;AAC7C,YAAI,CAAC,IAAI,KAAK,QAAQ,EAAG,KAAI,KAAK,QAAQ,IAAI,CAAC;AAC/C,YAAI,KAAK,QAAQ,EAAE,KAAK,IAAI;AAC5B,eAAO;AAAA,MACT,GAAG,CAAC,CAA2B;AAE/B,YAAM,gBAAwC;AAAA,QAC5C,UAAU;AAAA,QACV,QAAQ;AAAA,QACR,SAAS;AAAA,MACX;AAEA,cAAQ,IAAIC,OAAM,KAAK,KAAK,sCAAW,CAAC;AAExC,iBAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,UAAU,GAAG;AACrD,gBAAQ,IAAIA,OAAM,MAAM,KAAK,KAAK,cAAc,GAAG,KAAK,GAAG,EAAE,CAAC;AAC9D,mBAAW,QAAQ,OAAO;AACxB,gBAAM,SAAS,KAAK,MAAM,IAAIA,OAAM,KAAK,KAAK,GAAG,CAAC,KAAK;AACvD,kBAAQ,IAAI,OAAO,KAAK,IAAI,IAAI,KAAK,IAAI,MAAMA,OAAM,KAAK,KAAK,WAAW,CAAC,GAAG,MAAM,EAAE;AAAA,QACxF;AACA,gBAAQ,IAAI,EAAE;AAAA,MAChB;AAAA,IACF,SAAS,KAAK;AACZ,cAAQ,MAAMA,OAAM,IAAI,yCAAW,eAAe,QAAQ,IAAI,UAAU,GAAG,EAAE,CAAC;AAC9E,cAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF,CAAC;AAEH,SAAO;AACT;;;ACzDA,SAAS,WAAAC,gBAAe;AACxB,OAAOC,YAAW;AAElB,SAAS,GAAG,OAAO,UAAK,MAAM,IAAI;AAChC,UAAQ,IAAIA,OAAM,IAAI,KAAK,OAAO,GAAG,CAAC,CAAC;AACzC;AAEO,SAAS,uBAAgC;AAC9C,QAAM,MAAM,IAAID,SAAQ,SAAS,EAC9B,YAAY,0BAAM,EAClB,OAAO,UAAU,gCAAY,EAC7B,OAAO,CAAC,SAAS;AAChB,UAAM,OAAO,EAAE,OAAO,sBAAsB,MAAM,qEAAc;AAEhE,QAAI,KAAK,MAAM;AACb,cAAQ,IAAI,KAAK,UAAU,EAAE,MAAM,WAAW,SAAS,WAAW,KAAK,GAAG,MAAM,CAAC,CAAC;AAClF;AAAA,IACF;AAEA,YAAQ,IAAI,EAAE;AACd,YAAQ,IAAIC,OAAM,KAAK,0BAAM,CAAC;AAC9B,YAAQ,IAAI,EAAE;AACd,OAAG;AACH,YAAQ,IAAI,EAAE;AACd,YAAQ,IAAI,YAAYA,OAAM,KAAK,oBAAoB,CAAC,EAAE;AAC1D,YAAQ,IAAI,EAAE;AACd,YAAQ,IAAI,KAAKA,OAAM,IAAI,oEAAa,CAAC,EAAE;AAC3C,YAAQ,IAAI,EAAE;AAAA,EAChB,CAAC;AAEH,SAAO;AACT;;;AC/BA,SAAS,WAAAC,iBAAe;AACxB,OAAOC,YAAW;AAOlB,IAAM,SAAkB;AAAA;AAAA,EAEtB,EAAE,MAAM,+BAAW,MAAM,CAAC,MAAM,EAAE;AAAA,EAClC,EAAE,MAAM,gBAAM,MAAM,CAAC,MAAM,EAAE;AAAA,EAC7B,EAAE,MAAM,gBAAM,MAAM,CAAC,MAAM,EAAE;AAAA,EAC7B,EAAE,MAAM,4BAAQ,MAAM,CAAC,MAAM,EAAE;AAAA;AAAA,EAE/B,EAAE,MAAM,cAAc,MAAM,CAAC,MAAM,EAAE;AAAA,EACrC,EAAE,MAAM,mBAAmB,MAAM,CAAC,MAAM,EAAE;AAAA,EAC1C,EAAE,MAAM,WAAW,MAAM,CAAC,MAAM,EAAE;AAAA,EAClC,EAAE,MAAM,kBAAkB,MAAM,CAAC,MAAM,EAAE;AAAA,EACzC,EAAE,MAAM,0BAAgB,MAAM,CAAC,MAAM,EAAE;AAAA,EACvC,EAAE,MAAM,kCAAS,MAAM,CAAC,MAAM,EAAE;AAAA,EAChC,EAAE,MAAM,uBAAuB,MAAM,CAAC,MAAM,EAAE;AAChD;AAEA,SAASC,IAAG,OAAO,UAAK,MAAM,IAAI;AAChC,UAAQ,IAAID,OAAM,IAAI,KAAK,OAAO,GAAG,CAAC,CAAC;AACzC;AAEO,SAAS,sBAA+B;AAC7C,QAAM,MAAM,IAAID,UAAQ,QAAQ,EAC7B,YAAY,gCAAO,EACnB,OAAO,UAAU,gCAAY,EAC7B,OAAO,CAAC,SAAS;AAChB,QAAI,KAAK,MAAM;AACb,cAAQ,IAAI,KAAK,UAAU,EAAE,MAAM,WAAW,SAAS,UAAU,MAAM,OAAO,GAAG,MAAM,CAAC,CAAC;AACzF;AAAA,IACF;AAEA,UAAM,OAAO,OAAO,OAAO,OAAK,EAAE,KAAK,SAAS,MAAM,CAAC;AACvD,UAAM,OAAO,OAAO,OAAO,OAAK,EAAE,KAAK,SAAS,MAAM,CAAC;AAEvD,YAAQ,IAAI,EAAE;AACd,YAAQ,IAAIC,OAAM,KAAK,cAAI,CAAC;AAC5B,YAAQ,IAAI,EAAE;AACd,YAAQ,IAAI,OAAO,KAAK,IAAI,OAAKA,OAAM,MAAM,EAAE,IAAI,CAAC,EAAE,KAAKA,OAAM,IAAI,QAAK,CAAC,CAAC;AAC5E,YAAQ,IAAI,EAAE;AACd,IAAAC,IAAG;AACH,YAAQ,IAAI,EAAE;AACd,YAAQ,IAAID,OAAM,KAAK,cAAI,CAAC;AAC5B,YAAQ,IAAI,EAAE;AACd,YAAQ,IAAI,OAAO,KAAK,IAAI,OAAKA,OAAM,MAAM,EAAE,IAAI,CAAC,EAAE,KAAKA,OAAM,IAAI,QAAK,CAAC,CAAC;AAC5E,YAAQ,IAAI,EAAE;AAAA,EAChB,CAAC;AAEH,SAAO;AACT;;;ACvDA,SAAS,WAAAE,iBAAe;AACxB,OAAOC,aAAW;AASlB,SAAS,YAAwB;AAC/B,QAAM,QAAO,oBAAI,KAAK,GAAE,SAAS;AACjC,QAAM,YAAY,CAAC,GAAG,CAAC,EAAE,UAAS,oBAAI,KAAK,GAAE,OAAO,CAAC;AAErD,MAAI,UAAW,QAAO,EAAE,QAAQ,aAAa,OAAO,4BAAQ,aAAa,yDAAY;AACrF,MAAI,OAAO,KAAK,QAAQ,GAAI,QAAO,EAAE,QAAQ,aAAa,OAAO,sBAAO,aAAa,iCAAQ;AAC7F,MAAI,QAAQ,GAAI,QAAO,EAAE,QAAQ,QAAQ,OAAO,sBAAO,aAAa,mDAAW;AAC/E,SAAO,EAAE,QAAQ,WAAW,OAAO,sBAAO,aAAa,uCAAS;AAClE;AAEA,SAASC,IAAG,OAAO,UAAK,MAAM,IAAI;AAChC,UAAQ,IAAID,QAAM,IAAI,KAAK,OAAO,GAAG,CAAC,CAAC;AACzC;AAEO,SAAS,sBAA+B;AAC7C,QAAM,MAAM,IAAID,UAAQ,QAAQ,EAC7B,YAAY,0BAAM,EAClB,OAAO,UAAU,gCAAY,EAC7B,OAAO,CAAC,SAAS;AAChB,UAAM,OAAO,UAAU;AAEvB,QAAI,KAAK,MAAM;AACb,cAAQ,IAAI,KAAK,UAAU,EAAE,MAAM,WAAW,SAAS,UAAU,MAAM,KAAK,GAAG,MAAM,CAAC,CAAC;AACvF;AAAA,IACF;AAEA,YAAQ,IAAI,EAAE;AACd,YAAQ,IAAIC,QAAM,KAAK,0BAAM,CAAC;AAC9B,YAAQ,IAAI,EAAE;AACd,IAAAC,IAAG;AACH,YAAQ,IAAI,EAAE;AACd,YAAQ,IAAI,KAAKD,QAAM,KAAK,QAAG,CAAC,IAAIA,QAAM,MAAM,KAAK,KAAK,CAAC,EAAE;AAC7D,YAAQ,IAAI,OAAOA,QAAM,IAAI,KAAK,WAAW,CAAC,EAAE;AAChD,YAAQ,IAAI,EAAE;AAAA,EAChB,CAAC;AAEH,SAAO;AACT;;;AC/CA,SAAS,WAAAE,iBAAe;AACxB,OAAOC,aAAW;AAgBlB,SAASC,aAA8B;AACrC,QAAM,QAAO,oBAAI,KAAK,GAAE,SAAS;AACjC,QAAM,YAAY,CAAC,GAAG,CAAC,EAAE,UAAS,oBAAI,KAAK,GAAE,OAAO,CAAC;AAErD,MAAI,UAAW,QAAO,EAAE,QAAQ,aAAa,OAAO,4BAAQ,aAAa,yDAAY;AACrF,MAAI,OAAO,KAAK,QAAQ,GAAI,QAAO,EAAE,QAAQ,aAAa,OAAO,sBAAO,aAAa,iCAAQ;AAC7F,MAAI,QAAQ,GAAI,QAAO,EAAE,QAAQ,QAAQ,OAAO,sBAAO,aAAa,mDAAW;AAC/E,SAAO,EAAE,QAAQ,WAAW,OAAO,sBAAO,aAAa,uCAAS;AAClE;AAEA,SAASC,IAAG,OAAO,UAAK,MAAM,IAAI;AAChC,UAAQ,IAAIF,QAAM,IAAI,KAAK,OAAO,GAAG,CAAC,CAAC;AACzC;AAEO,SAAS,sBAA+B;AAC7C,QAAM,MAAM,IAAID,UAAQ,QAAQ,EAC7B,YAAY,oBAAK,EACjB,OAAO,UAAU,gCAAY,EAC7B,OAAO,CAAC,SAAS;AAChB,UAAM,SAASE,WAAU;AACzB,UAAM,SAAiB;AAAA,MACrB,SAAS;AAAA,MACT,UAAU;AAAA,MACV;AAAA,MACA,OAAO;AAAA,QACL,EAAE,OAAO,QAAQ,KAAK,yBAAyB;AAAA,MACjD;AAAA,MACA,SAAS;AAAA,MACT,SAAS;AAAA,MACT,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,IACpC;AAEA,QAAI,KAAK,MAAM;AACb,cAAQ,IAAI,KAAK,UAAU,EAAE,MAAM,WAAW,SAAS,UAAU,MAAM,OAAO,GAAG,MAAM,CAAC,CAAC;AACzF;AAAA,IACF;AAEA,YAAQ,IAAI,EAAE;AACd,YAAQ,IAAID,QAAM,KAAK,2BAAO,CAAC;AAC/B,YAAQ,IAAI,EAAE;AACd,YAAQ,IAAI,OAAO,OAAO,OAAO;AACjC,YAAQ,IAAI,EAAE;AACd,IAAAE,IAAG;AACH,YAAQ,IAAI,EAAE;AACd,YAAQ,IAAI,KAAKF,QAAM,KAAK,WAAI,CAAC,IAAI,OAAO,QAAQ,EAAE;AACtD,YAAQ,IAAI,KAAKA,QAAM,KAAK,QAAG,CAAC,IAAI,OAAO,OAAO,KAAK,SAAMA,QAAM,IAAI,OAAO,OAAO,WAAW,CAAC,EAAE;AACnG,YAAQ,IAAI,EAAE;AACd,IAAAE,IAAG;AACH,YAAQ,IAAI,EAAE;AACd,YAAQ,IAAI,YAAYF,QAAM,KAAK,UAAU,OAAO,OAAO,CAAC,EAAE;AAC9D,YAAQ,IAAI,YAAYA,QAAM,KAAK,OAAO,OAAO,CAAC,EAAE;AACpD,YAAQ,IAAI,EAAE;AACd,IAAAE,IAAG;AACH,YAAQ,IAAI,EAAE;AACd,YAAQ,IAAI,KAAKF,QAAM,IAAI,sCAAQ,CAAC,EAAE;AACtC,YAAQ,IAAI,KAAKA,QAAM,IAAI,yCAAyC,CAAC,EAAE;AACvE,YAAQ,IAAI,EAAE;AAAA,EAChB,CAAC;AAEH,SAAO;AACT;;;AC7EA,OAAOG,UAAS,YAAAC,iBAAgB;AAChC,SAAS,UAAAC,SAAQ,OAAAC,MAAK,QAAAC,OAAM,YAAAC,iBAAgB;AAC5C,SAAS,WAAAC,iBAAe;AACxB,OAAOC,aAAW;;;ACDlB,IAAM,UAAU,QAAQ,IAAI,mBAAmB;AAExC,SAAS,oBAA4B;AAC1C,SAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAgBT;AAEA,IAAM,WAAW,IAAI,OAAO,2CAA2C,EAAE;AAElE,SAAS,WAAW,KAA4D;AACrF,QAAM,QAAQ,IAAI,MAAM,QAAQ;AAChC,MAAI,OAAO;AACT,UAAM,WAAW,MAAM,CAAC,EAAE,KAAK;AAC/B,UAAM,WAAW,MAAM,CAAC,EAAE,KAAK;AAC/B,WAAO,EAAE,UAAU,YAAY,MAAM,UAAU,YAAY,uBAAQ;AAAA,EACrE;AACA,SAAO,EAAE,UAAU,MAAM,UAAU,IAAI,KAAK,EAAE;AAChD;AAEA,eAAsB,UAAU,SAAyE;AACvG,QAAM,WAAsB,CAAC,EAAE,MAAM,QAAQ,SAAS,QAAQ,CAAC;AAC/D,QAAM,eAAe,kBAAkB;AAEvC,QAAM,MAAM,MAAM,MAAM,GAAG,OAAO,aAAa;AAAA,IAC7C,QAAQ;AAAA,IACR,SAAS,EAAE,gBAAgB,mBAAmB;AAAA,IAC9C,MAAM,KAAK,UAAU,EAAE,UAAU,aAAa,CAAC;AAAA,EACjD,CAAC;AAED,MAAI,CAAC,IAAI,IAAI;AACX,UAAM,MAAM,MAAM,IAAI,KAAK,EAAE,MAAM,OAAO,EAAE,OAAO,gBAAgB,EAAE;AACrE,UAAM,IAAI,MAAM,IAAI,SAAS,QAAQ,IAAI,MAAM,EAAE;AAAA,EACnD;AAEA,QAAM,OAAO,MAAM,IAAI,KAAK;AAC5B,SAAO,WAAW,KAAK,SAAS,EAAE;AACpC;;;AD5CA,eAAsB,SAAS,SAAiB,OAAO,OAAsB;AAC3E,MAAI;AACF,UAAM,EAAE,UAAU,SAAS,IAAI,MAAM,UAAU,OAAO;AACtD,QAAI,MAAM;AACR,cAAQ,IAAI,KAAK,UAAU,EAAE,MAAM,WAAW,SAAS,QAAQ,SAAS,UAAU,SAAS,GAAG,MAAM,CAAC,CAAC;AAAA,IACxG,OAAO;AACL,UAAI,UAAU;AACZ,iBAAS,MAAM,IAAI,EAAE,QAAQ,UAAQ;AACnC,kBAAQ,IAAI,GAAGC,QAAM,IAAI,WAAI,CAAC,IAAIA,QAAM,IAAI,IAAI,CAAC,EAAE;AAAA,QACrD,CAAC;AACD,gBAAQ,IAAI;AAAA,MACd;AACA,cAAQ,IAAI,QAAQ;AAAA,IACtB;AAAA,EACF,SAAS,KAAU;AACjB,QAAI,MAAM;AACR,cAAQ,MAAM,KAAK,UAAU,EAAE,MAAM,WAAW,SAAS,QAAQ,OAAO,IAAI,QAAQ,GAAG,MAAM,CAAC,CAAC;AAAA,IACjG,OAAO;AACL,cAAQ,MAAMA,QAAM,IAAI,UAAU,IAAI,OAAO,EAAE,CAAC;AAChD,cAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF;AACF;AAUA,IAAM,cAAkD,CAAC,EAAE,IAAI,MAAM;AACnE,QAAM,SAAS,IAAI,SAAS,SAAS,WAAM;AAC3C,QAAM,QAAQ,IAAI,SAAS,SAAS,SAAS;AAE7C,SACE,gBAAAC,OAAA,cAACC,MAAA,EAAI,eAAc,UAAS,SAAS,KACnC,gBAAAD,OAAA,cAACE,OAAA,EAAK,OAAc,MAAI,QAAE,MAAO,GAChC,IAAI,YACH,gBAAAF,OAAA,cAACC,MAAA,EAAI,eAAc,UAAS,aAAa,GAAG,SAAS,KACnD,gBAAAD,OAAA,cAACE,OAAA,EAAK,UAAQ,QAAC,wBAAK,GACpB,gBAAAF,OAAA,cAACC,MAAA,EAAI,aAAY,SAAQ,aAAY,QAAO,UAAU,KACpD,gBAAAD,OAAA,cAACE,OAAA,EAAK,UAAQ,MAAC,MAAK,UAAQ,IAAI,QAAS,CAC3C,CACF,GAEF,gBAAAF,OAAA,cAACC,MAAA,EAAI,aAAa,KAChB,gBAAAD,OAAA,cAACE,OAAA,EAAK,MAAK,UAAQ,IAAI,OAAQ,CACjC,CACF;AAEJ;AAEA,IAAM,UAAoB,MAAM;AAC9B,QAAM,CAAC,UAAU,WAAW,IAAIC,UAA4B,CAAC,CAAC;AAC9D,QAAM,CAAC,OAAO,QAAQ,IAAIA,UAAS,EAAE;AACrC,QAAM,CAAC,SAAS,UAAU,IAAIA,UAAS,KAAK;AAC5C,QAAM,CAAC,OAAO,QAAQ,IAAIA,UAAwB,IAAI;AAEtD,EAAAC,UAAS,CAAC,MAAM,QAAQ;AACtB,QAAI,IAAI,UAAU,CAAC,SAAS;AAC1B,YAAM,OAAO,MAAM,KAAK;AACxB,UAAI,CAAC,KAAM;AACX,kBAAY,UAAQ,CAAC,GAAG,MAAM,EAAE,MAAM,QAAQ,SAAS,KAAK,CAAC,CAAC;AAC9D,eAAS,EAAE;AACX,iBAAW,IAAI;AACf,eAAS,IAAI;AACb,gBAAU,IAAI,EACX,KAAK,CAAC,EAAE,UAAU,SAAS,MAAM;AAChC,oBAAY,UAAQ,CAAC,GAAG,MAAM,EAAE,MAAM,aAAa,SAAS,UAAU,SAAS,CAAC,CAAC;AAAA,MACnF,CAAC,EACA,MAAM,CAAC,QAAe;AACrB,iBAAS,IAAI,OAAO;AAAA,MACtB,CAAC,EACA,QAAQ,MAAM;AACb,mBAAW,KAAK;AAAA,MAClB,CAAC;AACH;AAAA,IACF;AAEA,QAAI,SAAS,QAAQ,SAAS,QAAQ;AACpC,eAAS,UAAQ,KAAK,MAAM,GAAG,EAAE,CAAC;AAClC;AAAA,IACF;AAEA,QAAI,IAAI,QAAQ;AACd,eAAS,EAAE;AACX;AAAA,IACF;AAEA,QAAI,CAAC,QAAQ,KAAK,WAAW,EAAG;AAChC,QAAI,IAAI,QAAQ,IAAI,QAAQ,IAAI,IAAK;AACrC,QAAI,IAAI,UAAU,IAAI,WAAW,IAAI,UAAW;AAEhD,aAAS,UAAQ,OAAO,IAAI;AAAA,EAC9B,CAAC;AAED,SACE,gBAAAJ,OAAA,cAACC,MAAA,EAAI,eAAc,UAAS,UAAU,GAAG,UAAU,GAAG,UAAU,KAC9D,gBAAAD,OAAA,cAACC,MAAA,EAAI,aAAY,UAAS,aAAY,QAAO,UAAU,GAAG,cAAc,GAAG,YAAY,KACrF,gBAAAD,OAAA,cAACE,OAAA,EAAK,MAAI,MAAC,OAAM,UAAO,cAAE,GAC1B,gBAAAF,OAAA,cAACE,OAAA,EAAK,UAAQ,QAAC,qCAAmB,CACpC,GAEA,gBAAAF,OAAA,cAACC,MAAA,EAAI,eAAc,UAAS,UAAU,GAAG,UAAS,YAC/C,SAAS,WAAW,KAAK,CAAC,WACzB,gBAAAD,OAAA,cAACC,MAAA,EAAI,UAAU,KACb,gBAAAD,OAAA,cAACE,OAAA,EAAK,UAAQ,QAAC,qDAAW,CAC5B,GAED,SAAS,IAAI,CAAC,KAAK,MAClB,gBAAAF,OAAA,cAACC,MAAA,EAAI,KAAK,GAAG,eAAc,UAAS,cAAc,GAAG,YAAY,KAC/D,gBAAAD,OAAA,cAAC,eAAY,KAAU,CACzB,CACD,GACA,WACC,gBAAAA,OAAA,cAACC,MAAA,EAAI,eAAc,UAAS,cAAc,GAAG,YAAY,KACvD,gBAAAD,OAAA,cAACE,OAAA,EAAK,UAAQ,QAAC,cAAE,GACjB,gBAAAF,OAAA,cAACC,MAAA,EAAI,aAAa,KAChB,gBAAAD,OAAA,cAACE,OAAA,EAAK,UAAQ,QAAC,uBAAM,CACvB,CACF,GAED,SACC,gBAAAF,OAAA,cAACC,MAAA,EAAI,eAAc,UAAS,cAAc,GAAG,YAAY,KACvD,gBAAAD,OAAA,cAACE,OAAA,EAAK,OAAM,SAAM,WAAQ,KAAM,CAClC,CAEJ,GAEA,gBAAAF,OAAA,cAACC,MAAA,EAAI,aAAY,UAAS,aAAY,QAAO,UAAU,GAAG,WAAW,GAAG,YAAY,KAClF,gBAAAD,OAAA,cAACE,OAAA,EAAK,OAAM,UAAO,IAAK,GACxB,gBAAAF,OAAA,cAACE,OAAA,MAAM,KAAM,GACb,gBAAAF,OAAA,cAACE,OAAA,EAAK,UAAQ,QAAC,QAAC,CAClB,CACF;AAEJ;AAIO,SAAS,oBAA6B;AAC3C,QAAM,MAAM,IAAIG,UAAQ,MAAM,EAC3B,YAAY,gCAAO,EACnB,OAAO,wBAAwB,gFAAe,EAC9C,OAAO,UAAU,gCAAY;AAEhC,MAAI,OAAO,OAAO,SAAS;AACzB,QAAI,KAAK,QAAQ,KAAK,SAAS;AAC7B,UAAI,CAAC,KAAK,SAAS;AACjB,YAAI,KAAK,MAAM;AACb,kBAAQ,MAAM,KAAK,UAAU,EAAE,MAAM,WAAW,SAAS,QAAQ,OAAO,sBAAsB,GAAG,MAAM,CAAC,CAAC;AAAA,QAC3G,OAAO;AACL,kBAAQ,MAAM,oEAA4B;AAAA,QAC5C;AACA,gBAAQ,KAAK,CAAC;AAAA,MAChB;AACA,YAAM,SAAS,KAAK,SAAS,CAAC,CAAC,KAAK,IAAI;AACxC;AAAA,IACF;AAEA,IAAAC,QAAO,gBAAAN,OAAA,cAAC,aAAQ,CAAE;AAAA,EACpB,CAAC;AAED,SAAO;AACT;;;AEzKO,SAAS,gBAAwB;AACtC,QAAM,YAAY,IAAI,KAAK,MAAM,GAAG,EAAE;AACtC,QAAM,QAAQ,oBAAI,KAAK;AAEvB,MAAI,MAAM,MAAM,YAAY,IAAI,UAAU,YAAY;AACtD,QAAM,YAAY,MAAM,SAAS,IAAI,UAAU,SAAS;AAGxD,MAAI,YAAY,KAAM,cAAc,KAAK,MAAM,QAAQ,IAAI,UAAU,QAAQ,GAAI;AAC/E;AAAA,EACF;AAIA,SAAO,GAAG,GAAG;AACf;AAKO,SAAS,iBAA+F;AAC7G,QAAM,YAAY,IAAI,KAAK,MAAM,GAAG,EAAE;AACtC,QAAM,QAAQ,oBAAI,KAAK;AAEvB,MAAI,aAAa,MAAM,YAAY,IAAI,UAAU,YAAY;AAC7D,QAAM,YAAY,MAAM,SAAS,IAAI,UAAU,SAAS;AAGxD,QAAM,eAAe,IAAI,KAAK,MAAM,YAAY,GAAG,UAAU,SAAS,GAAG,UAAU,QAAQ,CAAC;AAE5F,MAAI,YAAY,KAAM,cAAc,KAAK,MAAM,QAAQ,IAAI,UAAU,QAAQ,GAAI;AAC/E;AAAA,EACF,OAAO;AACL,iBAAa,YAAY,MAAM,YAAY,IAAI,CAAC;AAAA,EAClD;AAEA,QAAM,UAAU,GAAG,UAAU;AAE7B,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;;;AnB/BA,IAAM,UAAU,IAAIO,UAAQ;AAG5B,IAAM,cAAc,eAAe;AAEnC,QACG,KAAK,SAAS,EACd,YAAY,iFAAqB,EACjC,QAAQ,cAAc,GAAG,iBAAiB,8DAAY;AAGzD,QACG,QAAQ,UAAU,EAClB,YAAY,wDAAW,EACvB,OAAO,MAAM;AACZ,QAAM,EAAE,WAAW,YAAY,cAAc,QAAQ,IAAI;AAEzD,UAAQ,IAAI,sDAAY;AACxB,UAAQ,IAAI,EAAE;AACd,UAAQ,IAAI,6BAAS,UAAU,mBAAmB,SAAS,EAAE,MAAM,WAAW,OAAO,QAAQ,KAAK,UAAU,CAAC,CAAC,EAAE;AAChH,UAAQ,IAAI,6BAAS,UAAU,SAAI;AACnC,UAAQ,IAAI,6BAAS,OAAO,6BAAS;AACrC,UAAQ,IAAI,mCAAU,aAAa,mBAAmB,SAAS,EAAE,MAAM,WAAW,OAAO,QAAQ,KAAK,UAAU,CAAC,CAAC,EAAE;AAEpH,QAAM,wBAAwB,KAAK,MAAM,aAAa,QAAQ,KAAI,oBAAI,KAAK,GAAE,QAAQ,MAAM,MAAO,KAAK,KAAK,GAAG;AAC/G,UAAQ,IAAI,yCAAW,qBAAqB,SAAI;AAEhD,MAAI,yBAAyB,IAAI;AAC/B,YAAQ,IAAI,sDAAY;AAAA,EAC1B;AACF,CAAC;AAEH,IAAM,YAAY,oBAAoB;AACtC,IAAM,SAAS,iBAAiB;AAChC,IAAM,WAAW,mBAAmB;AACpC,IAAM,WAAW,mBAAmB;AACpC,IAAM,WAAW,mBAAmB;AACpC,IAAM,cAAc,sBAAsB;AAC1C,IAAM,WAAW,mBAAmB;AACpC,IAAM,aAAa,qBAAqB;AACxC,IAAM,YAAY,oBAAoB;AACtC,IAAM,YAAY,oBAAoB;AACtC,IAAM,YAAY,oBAAoB;AACtC,IAAM,UAAU,kBAAkB;AAElC,QAAQ,WAAW,SAAS;AAC5B,QAAQ,WAAW,MAAM;AACzB,QAAQ,WAAW,QAAQ;AAC3B,QAAQ,WAAW,QAAQ;AAC3B,QAAQ,WAAW,QAAQ;AAC3B,QAAQ,WAAW,WAAW;AAC9B,QAAQ,WAAW,QAAQ;AAC3B,QAAQ,WAAW,UAAU;AAC7B,QAAQ,WAAW,SAAS;AAC5B,QAAQ,WAAW,SAAS;AAC5B,QAAQ,WAAW,SAAS;AAC5B,QAAQ,WAAW,OAAO;AAE1B,IAAI,CAAC,QAAQ,KAAK,MAAM,CAAC,EAAE,QAAQ;AACjC,QAAM,UAAU,kBAAkB;AAClC,UAAQ,MAAM,QAAQ,IAAI;AAC5B,OAAO;AACL,UAAQ,MAAM,QAAQ,IAAI;AAC5B;",
|
|
6
|
+
"names": ["Command", "chalk", "chalk", "cmd", "Command", "chalk", "Command", "chalk", "Command", "chalk", "Command", "React", "useState", "render", "Box", "Text", "useInput", "Command", "useInput", "React", "Box", "Text", "useState", "Command", "render", "Command", "chalk", "Command", "chalk", "Command", "chalk", "Command", "chalk", "Command", "chalk", "hr", "Command", "chalk", "hr", "Command", "chalk", "getStatus", "hr", "React", "useState", "render", "Box", "Text", "useInput", "Command", "chalk", "chalk", "React", "Box", "Text", "useState", "useInput", "Command", "render", "Command"]
|
|
7
7
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "maidang",
|
|
3
|
-
"version": "29.4.
|
|
3
|
+
"version": "29.4.10",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"description": "一个展示个人信息与职业经历的命令行工具",
|
|
6
6
|
"main": "dist/index.js",
|
|
@@ -10,6 +10,15 @@
|
|
|
10
10
|
"bin": {
|
|
11
11
|
"maidang": "dist/index.js"
|
|
12
12
|
},
|
|
13
|
+
"scripts": {
|
|
14
|
+
"build": "esbuild src/index.ts --bundle --platform=node --format=esm --outfile=dist/index.js --sourcemap --loader:.tsx=tsx --external:commander --external:chalk --external:boxen --external:figlet --external:ora --external:terminal-image --external:ink --external:react && node scripts/copy-assets.mjs",
|
|
15
|
+
"dev": "tsx src/index.ts",
|
|
16
|
+
"start": "node dist/index.js",
|
|
17
|
+
"test": "jest",
|
|
18
|
+
"test:watch": "jest --watch",
|
|
19
|
+
"test:coverage": "jest --coverage",
|
|
20
|
+
"prepublishOnly": "pnpm build"
|
|
21
|
+
},
|
|
13
22
|
"keywords": [
|
|
14
23
|
"cli",
|
|
15
24
|
"maidang",
|
|
@@ -44,13 +53,5 @@
|
|
|
44
53
|
"ts-jest": "^29.4.6",
|
|
45
54
|
"tsx": "^4.21.0",
|
|
46
55
|
"typescript": "^5.9.3"
|
|
47
|
-
},
|
|
48
|
-
"scripts": {
|
|
49
|
-
"build": "esbuild src/index.ts --bundle --platform=node --format=esm --outfile=dist/index.js --sourcemap --loader:.tsx=tsx --external:commander --external:chalk --external:boxen --external:figlet --external:ora --external:terminal-image --external:ink --external:react && node scripts/copy-assets.mjs",
|
|
50
|
-
"dev": "tsx src/index.ts",
|
|
51
|
-
"start": "node dist/index.js",
|
|
52
|
-
"test": "jest",
|
|
53
|
-
"test:watch": "jest --watch",
|
|
54
|
-
"test:coverage": "jest --coverage"
|
|
55
56
|
}
|
|
56
|
-
}
|
|
57
|
+
}
|