wepscli 0.1.0 → 0.1.5
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/README.md +9 -8
- package/dist/WEPSCLI-shell/agent-runtime-events.js +194 -0
- package/dist/WEPSCLI-shell/agent-runtime-events.js.map +1 -0
- package/dist/WEPSCLI-shell/agent-runtime-helpers.js +117 -0
- package/dist/WEPSCLI-shell/agent-runtime-helpers.js.map +1 -0
- package/dist/WEPSCLI-shell/agent-runtime-types.js +1 -0
- package/dist/WEPSCLI-shell/agent-runtime-types.js.map +1 -0
- package/dist/WEPSCLI-shell/agent-runtime.js +42 -294
- package/dist/WEPSCLI-shell/agent-runtime.js.map +1 -1
- package/dist/WEPSCLI-shell/approval-overlay.js.map +1 -1
- package/dist/WEPSCLI-shell/chat-components.js +13 -6
- package/dist/WEPSCLI-shell/chat-components.js.map +1 -1
- package/dist/WEPSCLI-shell/file-change-preview.js.map +1 -1
- package/dist/WEPSCLI-shell/runtime-recovery.js.map +1 -1
- package/dist/WEPSCLI-shell/session-consistency.js +9 -0
- package/dist/WEPSCLI-shell/session-consistency.js.map +1 -0
- package/dist/WEPSCLI-shell/shell-app.js +169 -259
- package/dist/WEPSCLI-shell/shell-app.js.map +1 -1
- package/dist/WEPSCLI-shell/shell-keyboard.js +135 -0
- package/dist/WEPSCLI-shell/shell-keyboard.js.map +1 -0
- package/dist/WEPSCLI-shell/shell-modes.js.map +1 -1
- package/dist/WEPSCLI-shell/shell-prompt-controller.js +93 -0
- package/dist/WEPSCLI-shell/shell-prompt-controller.js.map +1 -0
- package/dist/WEPSCLI-shell/shell-status.js +16 -0
- package/dist/WEPSCLI-shell/shell-status.js.map +1 -0
- package/dist/WEPSCLI-shell/skill-commands.js +7 -0
- package/dist/WEPSCLI-shell/skill-commands.js.map +1 -0
- package/dist/WEPSCLI-shell/slash-commands.js +68 -7
- package/dist/WEPSCLI-shell/slash-commands.js.map +1 -1
- package/dist/WEPSCLI-shell/tool-approval.js.map +1 -1
- package/dist/WEPSCLI-shell/tool-diff.js.map +1 -1
- package/dist/WEPSCLI-shell/tool-file-changes.js.map +1 -1
- package/dist/WEPSCLI-shell/tool-message-detail.js.map +1 -1
- package/dist/WEPSCLI-shell/tool-messages.js.map +1 -1
- package/dist/WEPSCLI-shell/transcript-panel.js.map +1 -1
- package/dist/config.js +3 -0
- package/dist/config.js.map +1 -1
- package/dist/main.js.map +1 -1
- package/dist/skills/skill-add-flow.js +88 -0
- package/dist/skills/skill-add-flow.js.map +1 -0
- package/dist/skills/skill-service.js +123 -0
- package/dist/skills/skill-service.js.map +1 -0
- package/package.json +28 -24
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["extractToolFileChanges","formatToolDiffDeltaStats","formatToolDiffStats","toolFileChangeLocation","normalizeDisplayText","value","replace","trim","formatUnknownValue","JSON","stringify","String","extractContentBlocks","map","block","type","text","thinking","filter","Boolean","join","extractContentValue","Array","isArray","content","extracted","firstNonEmptyLine","split","line","find","formatToolArgs","args","formatToolOutput","result","createToolMessageState","toolCallId","toolName","status","argsText","outputText","fileChanges","undefined","rawArgs","updateToolMessageState","tool","update","nextRawArgs","nextRawOutput","output","rawOutput","nextArgsText","nextOutputText","nextFileChanges","change","index","previousChange","kind","path","firstChangedLine","diffText","diffLines","diffStats","previewText","length","toolStatusLabel","toolStatusTone","toolCardPreview","firstFileChange","heading","lines","outputLine","argsLine","push","toolDetailText","fileChangeDetails","flatMap","toUpperCase","summary"],"sources":["tool-messages.ts"],"sourcesContent":["import {\n\textractToolFileChanges,\n\tformatToolDiffDeltaStats,\n\tformatToolDiffStats,\n\ttoolFileChangeLocation,\n\ttype ToolFileChange,\n} from \"./tool-file-changes.js\";\n\nexport type ToolMessageStatus = \"awaiting_approval\" | \"running\" | \"completed\" | \"failed\";\n\nexport interface ToolMessageState {\n\ttoolCallId: string;\n\ttoolName: string;\n\tstatus: ToolMessageStatus;\n\targsText: string;\n\toutputText: string;\n\tfileChanges: ToolFileChange[];\n\trawArgs?: unknown;\n\trawOutput?: unknown;\n}\n\ntype ContentBlock = {\n\ttype?: string;\n\ttext?: string;\n\tthinking?: string;\n\tmimeType?: string;\n\tdata?: string;\n\t[key: string]: unknown;\n};\n\nfunction normalizeDisplayText(value: string): string {\n\treturn value.replace(/\\r/g, \"\").trim();\n}\n\nfunction formatUnknownValue(value: unknown): string {\n\tif (typeof value === \"string\") {\n\t\treturn normalizeDisplayText(value);\n\t}\n\tif (value == null) {\n\t\treturn \"\";\n\t}\n\ttry {\n\t\treturn normalizeDisplayText(JSON.stringify(value, null, 2));\n\t} catch {\n\t\treturn normalizeDisplayText(String(value));\n\t}\n}\n\nfunction extractContentBlocks(value: ContentBlock[]): string {\n\treturn value\n\t\t.map((block) => {\n\t\t\tif (block.type === \"text\" && typeof block.text === \"string\") {\n\t\t\t\treturn block.text;\n\t\t\t}\n\t\t\tif (block.type === \"thinking\" && typeof block.thinking === \"string\") {\n\t\t\t\treturn block.thinking;\n\t\t\t}\n\t\t\tif (block.type === \"image\") {\n\t\t\t\treturn \"[image]\";\n\t\t\t}\n\t\t\tif (block.type === \"audio\") {\n\t\t\t\treturn \"[audio]\";\n\t\t\t}\n\t\t\treturn \"\";\n\t\t})\n\t\t.filter(Boolean)\n\t\t.join(\"\\n\\n\")\n\t\t.trim();\n}\n\nfunction extractContentValue(value: unknown): string {\n\tif (\n\t\ttypeof value === \"object\" &&\n\t\tvalue !== null &&\n\t\t\"content\" in value &&\n\t\tArray.isArray((value as { content?: unknown }).content)\n\t) {\n\t\tconst extracted = extractContentBlocks((value as { content: ContentBlock[] }).content);\n\t\tif (extracted) {\n\t\t\treturn extracted;\n\t\t}\n\t}\n\treturn formatUnknownValue(value);\n}\n\nfunction firstNonEmptyLine(value: string): string | undefined {\n\treturn value\n\t\t.split(\"\\n\")\n\t\t.map((line) => line.trim())\n\t\t.find(Boolean);\n}\n\nexport function formatToolArgs(args: unknown): string {\n\treturn extractContentValue(args) || \"No arguments\";\n}\n\nexport function formatToolOutput(result: unknown): string {\n\treturn extractContentValue(result);\n}\n\nexport function createToolMessageState(toolCallId: string, toolName: string, args: unknown): ToolMessageState {\n\treturn {\n\t\ttoolCallId,\n\t\ttoolName,\n\t\tstatus: \"running\",\n\t\targsText: formatToolArgs(args),\n\t\toutputText: \"\",\n\t\tfileChanges: extractToolFileChanges(toolName, args, undefined),\n\t\trawArgs: args,\n\t};\n}\n\nexport function updateToolMessageState(\n\ttool: ToolMessageState,\n\tupdate: {\n\t\tstatus?: ToolMessageStatus;\n\t\targs?: unknown;\n\t\toutput?: unknown;\n\t},\n): ToolMessageState {\n\tconst nextRawArgs = update.args === undefined ? tool.rawArgs : update.args;\n\tconst nextRawOutput = update.output === undefined ? tool.rawOutput : update.output;\n\tconst nextArgsText = nextRawArgs === undefined ? tool.argsText : formatToolArgs(nextRawArgs);\n\tconst nextOutputText = nextRawOutput === undefined ? tool.outputText : formatToolOutput(nextRawOutput);\n\tconst nextFileChanges = extractToolFileChanges(tool.toolName, nextRawArgs, nextRawOutput).map((change, index) => {\n\t\tconst previousChange = tool.fileChanges[index];\n\t\tif (!previousChange || previousChange.kind !== change.kind || previousChange.path !== change.path) {\n\t\t\treturn change;\n\t\t}\n\n\t\treturn {\n\t\t\t...change,\n\t\t\tfirstChangedLine: change.firstChangedLine ?? previousChange.firstChangedLine,\n\t\t\tdiffText: change.diffText ?? previousChange.diffText,\n\t\t\tdiffLines: change.diffLines ?? previousChange.diffLines,\n\t\t\tdiffStats: change.diffStats ?? previousChange.diffStats,\n\t\t\tpreviewText: change.previewText ?? previousChange.previewText,\n\t\t};\n\t});\n\n\treturn {\n\t\t...tool,\n\t\tstatus: update.status ?? tool.status,\n\t\targsText: nextArgsText || tool.argsText,\n\t\toutputText: nextOutputText || tool.outputText,\n\t\tfileChanges: nextFileChanges.length > 0 ? nextFileChanges : tool.fileChanges,\n\t\trawArgs: nextRawArgs,\n\t\trawOutput: nextRawOutput,\n\t};\n}\n\nexport function toolStatusLabel(status: ToolMessageStatus): string {\n\tswitch (status) {\n\t\tcase \"awaiting_approval\":\n\t\t\treturn \"Needs Approval\";\n\t\tcase \"running\":\n\t\t\treturn \"Running\";\n\t\tcase \"completed\":\n\t\t\treturn \"Done\";\n\t\tcase \"failed\":\n\t\t\treturn \"Failed\";\n\t}\n}\n\nexport function toolStatusTone(status: ToolMessageStatus): \"accent\" | \"success\" | \"danger\" | \"warning\" {\n\tswitch (status) {\n\t\tcase \"awaiting_approval\":\n\t\t\treturn \"warning\";\n\t\tcase \"running\":\n\t\t\treturn \"accent\";\n\t\tcase \"completed\":\n\t\t\treturn \"success\";\n\t\tcase \"failed\":\n\t\t\treturn \"danger\";\n\t}\n}\n\nexport function toolCardPreview(tool: ToolMessageState): string {\n\tconst firstFileChange = tool.fileChanges[0];\n\tif (firstFileChange && tool.status === \"completed\") {\n\t\tconst heading = `${tool.toolName} ${toolFileChangeLocation(firstFileChange)}`;\n\t\tconst diffStats = formatToolDiffDeltaStats(firstFileChange.diffStats);\n\t\treturn [heading, diffStats].filter(Boolean).join(\"\\n\");\n\t}\n\n\tconst lines: string[] = [`${toolStatusLabel(tool.status)}: ${tool.toolName}`];\n\tconst outputLine = firstNonEmptyLine(tool.outputText);\n\tconst argsLine = firstNonEmptyLine(tool.argsText);\n\n\tif (outputLine) {\n\t\tlines.push(outputLine);\n\t} else if (tool.status === \"awaiting_approval\") {\n\t\tlines.push(\"Waiting for approval...\");\n\t} else if (tool.status === \"running\") {\n\t\tlines.push(\"Waiting for tool output...\");\n\t}\n\n\tif (argsLine) {\n\t\tlines.push(`Args: ${argsLine}`);\n\t}\n\n\treturn lines.join(\"\\n\");\n}\n\nexport function toolDetailText(tool: ToolMessageState): string {\n\tif (tool.fileChanges.length > 0) {\n\t\tconst fileChangeDetails = tool.fileChanges.flatMap((change) => [\n\t\t\t`${change.kind.toUpperCase()}: ${toolFileChangeLocation(change)}`,\n\t\t\tchange.summary,\n\t\t\tchange.kind === \"edit\" && formatToolDiffStats(change.diffStats)\n\t\t\t\t? `Stats: ${formatToolDiffStats(change.diffStats)}`\n\t\t\t\t: undefined,\n\t\t\tchange.diffText ? \"Diff:\" : undefined,\n\t\t\tchange.diffText,\n\t\t\t!change.diffText && change.previewText ? \"Preview:\" : undefined,\n\t\t\t!change.diffText ? change.previewText : undefined,\n\t\t\t\"\",\n\t\t]);\n\n\t\treturn [\n\t\t\t`Tool: ${tool.toolName}`,\n\t\t\t`Status: ${toolStatusLabel(tool.status)}`,\n\t\t\t`Call ID: ${tool.toolCallId}`,\n\t\t\t\"\",\n\t\t\t\"File Changes:\",\n\t\t\t...fileChangeDetails,\n\t\t]\n\t\t\t.filter(Boolean)\n\t\t\t.join(\"\\n\");\n\t}\n\n\treturn [\n\t\t`Tool: ${tool.toolName}`,\n\t\t`Status: ${toolStatusLabel(tool.status)}`,\n\t\t`Call ID: ${tool.toolCallId}`,\n\t\t\"\",\n\t\t\"Arguments:\",\n\t\ttool.argsText || \"No arguments\",\n\t\t\"\",\n\t\t\"Output:\",\n\t\ttool.outputText ||\n\t\t\t(tool.status === \"awaiting_approval\"\n\t\t\t\t? \"Waiting for user approval before execution.\"\n\t\t\t\t: tool.status === \"running\"\n\t\t\t\t\t? \"Waiting for tool output...\"\n\t\t\t\t\t: \"No tool output.\"),\n\t].join(\"\\n\");\n}\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"names":["extractToolFileChanges","formatToolDiffDeltaStats","formatToolDiffStats","toolFileChangeLocation","normalizeDisplayText","value","replace","trim","formatUnknownValue","JSON","stringify","String","extractContentBlocks","map","block","type","text","thinking","filter","Boolean","join","extractContentValue","Array","isArray","content","extracted","firstNonEmptyLine","split","line","find","formatToolArgs","args","formatToolOutput","result","createToolMessageState","toolCallId","toolName","status","argsText","outputText","fileChanges","undefined","rawArgs","updateToolMessageState","tool","update","nextRawArgs","nextRawOutput","output","rawOutput","nextArgsText","nextOutputText","nextFileChanges","change","index","previousChange","kind","path","firstChangedLine","diffText","diffLines","diffStats","previewText","length","toolStatusLabel","toolStatusTone","toolCardPreview","firstFileChange","heading","lines","outputLine","argsLine","push","toolDetailText","fileChangeDetails","flatMap","toUpperCase","summary"],"sources":["tool-messages.ts"],"sourcesContent":["import {\r\n\textractToolFileChanges,\r\n\tformatToolDiffDeltaStats,\r\n\tformatToolDiffStats,\r\n\ttoolFileChangeLocation,\r\n\ttype ToolFileChange,\r\n} from \"./tool-file-changes.js\";\r\n\r\nexport type ToolMessageStatus = \"awaiting_approval\" | \"running\" | \"completed\" | \"failed\";\r\n\r\nexport interface ToolMessageState {\r\n\ttoolCallId: string;\r\n\ttoolName: string;\r\n\tstatus: ToolMessageStatus;\r\n\targsText: string;\r\n\toutputText: string;\r\n\tfileChanges: ToolFileChange[];\r\n\trawArgs?: unknown;\r\n\trawOutput?: unknown;\r\n}\r\n\r\ntype ContentBlock = {\r\n\ttype?: string;\r\n\ttext?: string;\r\n\tthinking?: string;\r\n\tmimeType?: string;\r\n\tdata?: string;\r\n\t[key: string]: unknown;\r\n};\r\n\r\nfunction normalizeDisplayText(value: string): string {\r\n\treturn value.replace(/\\r/g, \"\").trim();\r\n}\r\n\r\nfunction formatUnknownValue(value: unknown): string {\r\n\tif (typeof value === \"string\") {\r\n\t\treturn normalizeDisplayText(value);\r\n\t}\r\n\tif (value == null) {\r\n\t\treturn \"\";\r\n\t}\r\n\ttry {\r\n\t\treturn normalizeDisplayText(JSON.stringify(value, null, 2));\r\n\t} catch {\r\n\t\treturn normalizeDisplayText(String(value));\r\n\t}\r\n}\r\n\r\nfunction extractContentBlocks(value: ContentBlock[]): string {\r\n\treturn value\r\n\t\t.map((block) => {\r\n\t\t\tif (block.type === \"text\" && typeof block.text === \"string\") {\r\n\t\t\t\treturn block.text;\r\n\t\t\t}\r\n\t\t\tif (block.type === \"thinking\" && typeof block.thinking === \"string\") {\r\n\t\t\t\treturn block.thinking;\r\n\t\t\t}\r\n\t\t\tif (block.type === \"image\") {\r\n\t\t\t\treturn \"[image]\";\r\n\t\t\t}\r\n\t\t\tif (block.type === \"audio\") {\r\n\t\t\t\treturn \"[audio]\";\r\n\t\t\t}\r\n\t\t\treturn \"\";\r\n\t\t})\r\n\t\t.filter(Boolean)\r\n\t\t.join(\"\\n\\n\")\r\n\t\t.trim();\r\n}\r\n\r\nfunction extractContentValue(value: unknown): string {\r\n\tif (\r\n\t\ttypeof value === \"object\" &&\r\n\t\tvalue !== null &&\r\n\t\t\"content\" in value &&\r\n\t\tArray.isArray((value as { content?: unknown }).content)\r\n\t) {\r\n\t\tconst extracted = extractContentBlocks((value as { content: ContentBlock[] }).content);\r\n\t\tif (extracted) {\r\n\t\t\treturn extracted;\r\n\t\t}\r\n\t}\r\n\treturn formatUnknownValue(value);\r\n}\r\n\r\nfunction firstNonEmptyLine(value: string): string | undefined {\r\n\treturn value\r\n\t\t.split(\"\\n\")\r\n\t\t.map((line) => line.trim())\r\n\t\t.find(Boolean);\r\n}\r\n\r\nexport function formatToolArgs(args: unknown): string {\r\n\treturn extractContentValue(args) || \"No arguments\";\r\n}\r\n\r\nexport function formatToolOutput(result: unknown): string {\r\n\treturn extractContentValue(result);\r\n}\r\n\r\nexport function createToolMessageState(toolCallId: string, toolName: string, args: unknown): ToolMessageState {\r\n\treturn {\r\n\t\ttoolCallId,\r\n\t\ttoolName,\r\n\t\tstatus: \"running\",\r\n\t\targsText: formatToolArgs(args),\r\n\t\toutputText: \"\",\r\n\t\tfileChanges: extractToolFileChanges(toolName, args, undefined),\r\n\t\trawArgs: args,\r\n\t};\r\n}\r\n\r\nexport function updateToolMessageState(\r\n\ttool: ToolMessageState,\r\n\tupdate: {\r\n\t\tstatus?: ToolMessageStatus;\r\n\t\targs?: unknown;\r\n\t\toutput?: unknown;\r\n\t},\r\n): ToolMessageState {\r\n\tconst nextRawArgs = update.args === undefined ? tool.rawArgs : update.args;\r\n\tconst nextRawOutput = update.output === undefined ? tool.rawOutput : update.output;\r\n\tconst nextArgsText = nextRawArgs === undefined ? tool.argsText : formatToolArgs(nextRawArgs);\r\n\tconst nextOutputText = nextRawOutput === undefined ? tool.outputText : formatToolOutput(nextRawOutput);\r\n\tconst nextFileChanges = extractToolFileChanges(tool.toolName, nextRawArgs, nextRawOutput).map((change, index) => {\r\n\t\tconst previousChange = tool.fileChanges[index];\r\n\t\tif (!previousChange || previousChange.kind !== change.kind || previousChange.path !== change.path) {\r\n\t\t\treturn change;\r\n\t\t}\r\n\r\n\t\treturn {\r\n\t\t\t...change,\r\n\t\t\tfirstChangedLine: change.firstChangedLine ?? previousChange.firstChangedLine,\r\n\t\t\tdiffText: change.diffText ?? previousChange.diffText,\r\n\t\t\tdiffLines: change.diffLines ?? previousChange.diffLines,\r\n\t\t\tdiffStats: change.diffStats ?? previousChange.diffStats,\r\n\t\t\tpreviewText: change.previewText ?? previousChange.previewText,\r\n\t\t};\r\n\t});\r\n\r\n\treturn {\r\n\t\t...tool,\r\n\t\tstatus: update.status ?? tool.status,\r\n\t\targsText: nextArgsText || tool.argsText,\r\n\t\toutputText: nextOutputText || tool.outputText,\r\n\t\tfileChanges: nextFileChanges.length > 0 ? nextFileChanges : tool.fileChanges,\r\n\t\trawArgs: nextRawArgs,\r\n\t\trawOutput: nextRawOutput,\r\n\t};\r\n}\r\n\r\nexport function toolStatusLabel(status: ToolMessageStatus): string {\r\n\tswitch (status) {\r\n\t\tcase \"awaiting_approval\":\r\n\t\t\treturn \"Needs Approval\";\r\n\t\tcase \"running\":\r\n\t\t\treturn \"Running\";\r\n\t\tcase \"completed\":\r\n\t\t\treturn \"Done\";\r\n\t\tcase \"failed\":\r\n\t\t\treturn \"Failed\";\r\n\t}\r\n}\r\n\r\nexport function toolStatusTone(status: ToolMessageStatus): \"accent\" | \"success\" | \"danger\" | \"warning\" {\r\n\tswitch (status) {\r\n\t\tcase \"awaiting_approval\":\r\n\t\t\treturn \"warning\";\r\n\t\tcase \"running\":\r\n\t\t\treturn \"accent\";\r\n\t\tcase \"completed\":\r\n\t\t\treturn \"success\";\r\n\t\tcase \"failed\":\r\n\t\t\treturn \"danger\";\r\n\t}\r\n}\r\n\r\nexport function toolCardPreview(tool: ToolMessageState): string {\r\n\tconst firstFileChange = tool.fileChanges[0];\r\n\tif (firstFileChange && tool.status === \"completed\") {\r\n\t\tconst heading = `${tool.toolName} ${toolFileChangeLocation(firstFileChange)}`;\r\n\t\tconst diffStats = formatToolDiffDeltaStats(firstFileChange.diffStats);\r\n\t\treturn [heading, diffStats].filter(Boolean).join(\"\\n\");\r\n\t}\r\n\r\n\tconst lines: string[] = [`${toolStatusLabel(tool.status)}: ${tool.toolName}`];\r\n\tconst outputLine = firstNonEmptyLine(tool.outputText);\r\n\tconst argsLine = firstNonEmptyLine(tool.argsText);\r\n\r\n\tif (outputLine) {\r\n\t\tlines.push(outputLine);\r\n\t} else if (tool.status === \"awaiting_approval\") {\r\n\t\tlines.push(\"Waiting for approval...\");\r\n\t} else if (tool.status === \"running\") {\r\n\t\tlines.push(\"Waiting for tool output...\");\r\n\t}\r\n\r\n\tif (argsLine) {\r\n\t\tlines.push(`Args: ${argsLine}`);\r\n\t}\r\n\r\n\treturn lines.join(\"\\n\");\r\n}\r\n\r\nexport function toolDetailText(tool: ToolMessageState): string {\r\n\tif (tool.fileChanges.length > 0) {\r\n\t\tconst fileChangeDetails = tool.fileChanges.flatMap((change) => [\r\n\t\t\t`${change.kind.toUpperCase()}: ${toolFileChangeLocation(change)}`,\r\n\t\t\tchange.summary,\r\n\t\t\tchange.kind === \"edit\" && formatToolDiffStats(change.diffStats)\r\n\t\t\t\t? `Stats: ${formatToolDiffStats(change.diffStats)}`\r\n\t\t\t\t: undefined,\r\n\t\t\tchange.diffText ? \"Diff:\" : undefined,\r\n\t\t\tchange.diffText,\r\n\t\t\t!change.diffText && change.previewText ? \"Preview:\" : undefined,\r\n\t\t\t!change.diffText ? change.previewText : undefined,\r\n\t\t\t\"\",\r\n\t\t]);\r\n\r\n\t\treturn [\r\n\t\t\t`Tool: ${tool.toolName}`,\r\n\t\t\t`Status: ${toolStatusLabel(tool.status)}`,\r\n\t\t\t`Call ID: ${tool.toolCallId}`,\r\n\t\t\t\"\",\r\n\t\t\t\"File Changes:\",\r\n\t\t\t...fileChangeDetails,\r\n\t\t]\r\n\t\t\t.filter(Boolean)\r\n\t\t\t.join(\"\\n\");\r\n\t}\r\n\r\n\treturn [\r\n\t\t`Tool: ${tool.toolName}`,\r\n\t\t`Status: ${toolStatusLabel(tool.status)}`,\r\n\t\t`Call ID: ${tool.toolCallId}`,\r\n\t\t\"\",\r\n\t\t\"Arguments:\",\r\n\t\ttool.argsText || \"No arguments\",\r\n\t\t\"\",\r\n\t\t\"Output:\",\r\n\t\ttool.outputText ||\r\n\t\t\t(tool.status === \"awaiting_approval\"\r\n\t\t\t\t? \"Waiting for user approval before execution.\"\r\n\t\t\t\t: tool.status === \"running\"\r\n\t\t\t\t\t? \"Waiting for tool output...\"\r\n\t\t\t\t\t: \"No tool output.\"),\r\n\t].join(\"\\n\");\r\n}\r\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["For","Show","truncate","wepscliShellTheme","theme","toolFileChangeLocation","toolStatusLabel","toolStatusTone","ToolMessageDetail","COLLAPSIBLE_MESSAGE_LINES","isMessageOverflowing","message","content","split","length","isInlineSummaryMessage","kind","getVisibleMessageContent","collapsible","expanded","slice","join","transcriptBorderColor","border","muted","role","accent","success","transcriptRoleColor","tool","toneColor","status","warning","tone","danger","firstNonEmptyLine","value","map","line","trim","find","Boolean","inlinePrefix","toolName","inlineSnippet","outputText","argsText","inlineSummary","width","reserved","Math","max","floor","maxLength","toolInlineLabel","firstFileChange","fileChanges","toolInlineDiffStats","undefined","stats","diffStats","added","removed","useStructuredToolSummary","TranscriptPanel","props","_el$","_$createElement","_el$2","_el$3","_el$5","_el$6","_el$7","_$insertNode","_$setProp","_$createTextNode","_$insert","activeModelLabel","_ref$","scrollRef","_$use","_$createComponent","when","messages","fallback","_el$8","_el$9","_el$1","_el$11","_$effect","_p$","_v$5","panelAlt","_v$6","_v$7","accentStrong","_v$8","text","_v$9","e","t","a","o","i","children","each","_el$13","_el$14","_el$15","_el$16","onToggleMessage","id","_c$","_$memo","_el$18","_el$19","_el$20","_$p","_el$21","_el$22","time","_el$17","_c$2","_el$23","_v$0","panelMuted","_v$1","_v$10","_v$11","_el$24","_el$25","_el$26","_el$27","_el$28","toUpperCase","_el$29","_v$12","_v$13","_v$14","_v$15","_v$16","_v$17","n","_v$","panel","_v$2","_v$3","_v$4"],"sources":["transcript-panel.tsx"],"sourcesContent":["import { For, Show } from \"solid-js\";\nimport type { ChatMessage } from \"./chat-components.js\";\nimport { truncate } from \"./helpers.js\";\nimport { wepscliShellTheme as theme } from \"./theme.js\";\nimport { toolFileChangeLocation } from \"./tool-file-changes.js\";\nimport { toolStatusLabel, toolStatusTone } from \"./tool-messages.js\";\nimport { ToolMessageDetail } from \"./tool-message-detail.js\";\n\r\nconst COLLAPSIBLE_MESSAGE_LINES = 3;\r\n\r\nfunction isMessageOverflowing(message: ChatMessage): boolean {\r\n\treturn message.content.split(\"\\n\").length > COLLAPSIBLE_MESSAGE_LINES;\r\n}\r\n\r\nfunction isInlineSummaryMessage(message: ChatMessage): boolean {\r\n\treturn message.kind === \"tool\" || message.kind === \"reasoning\";\r\n}\r\n\r\nfunction getVisibleMessageContent(message: ChatMessage): string {\r\n\tif (!message.collapsible || message.expanded || !isMessageOverflowing(message)) {\r\n\t\treturn message.content;\r\n\t}\r\n\treturn [...message.content.split(\"\\n\").slice(0, COLLAPSIBLE_MESSAGE_LINES), \"...\"].join(\"\\n\");\r\n}\r\n\r\nfunction transcriptBorderColor(message: ChatMessage): string {\r\n\tif (message.kind === \"tool\") {\r\n\t\treturn theme.border;\r\n\t}\r\n\tif (message.kind === \"reasoning\") {\r\n\t\treturn theme.muted;\r\n\t}\r\n\treturn message.role === \"user\" ? theme.accent : message.role === \"assistant\" ? theme.success : theme.muted;\r\n}\r\n\r\nfunction transcriptRoleColor(message: ChatMessage): string {\r\n\tif (message.kind === \"tool\") {\r\n\t\treturn message.tool ? toneColor(toolStatusTone(message.tool.status)) : theme.accent;\r\n\t}\r\n\tif (message.kind === \"reasoning\") {\r\n\t\treturn theme.warning;\r\n\t}\r\n\treturn message.role === \"user\" ? theme.accent : message.role === \"assistant\" ? theme.success : theme.muted;\r\n}\r\n\r\nfunction toneColor(tone: \"accent\" | \"success\" | \"warning\" | \"danger\" | \"muted\"): string {\r\n\tswitch (tone) {\r\n\t\tcase \"accent\":\r\n\t\t\treturn theme.accent;\r\n\t\tcase \"success\":\r\n\t\t\treturn theme.success;\r\n\t\tcase \"warning\":\r\n\t\t\treturn theme.warning;\r\n\t\tcase \"danger\":\r\n\t\t\treturn theme.danger;\r\n\t\tcase \"muted\":\r\n\t\t\treturn theme.muted;\r\n\t}\r\n}\r\n\r\nfunction firstNonEmptyLine(value: string): string | undefined {\r\n\treturn value\r\n\t\t.split(\"\\n\")\r\n\t\t.map((line) => line.trim())\r\n\t\t.find(Boolean);\r\n}\r\n\r\nfunction inlinePrefix(message: ChatMessage): string {\r\n\tif (message.kind === \"tool\" && message.tool) {\r\n\t\treturn `${toolStatusLabel(message.tool.status)} ${message.tool.toolName}`;\r\n\t}\r\n\tif (message.kind === \"reasoning\") {\r\n\t\treturn \"Thought\";\r\n\t}\r\n\treturn message.role;\r\n}\r\n\r\nfunction inlineSnippet(message: ChatMessage): string {\r\n\tif (message.kind === \"tool\" && message.tool) {\r\n\t\treturn (\r\n\t\t\tfirstNonEmptyLine(message.tool.outputText) ??\r\n\t\t\tfirstNonEmptyLine(message.tool.argsText) ??\r\n\t\t\t(message.tool.status === \"awaiting_approval\" ? \"Waiting for approval...\" : \"Waiting for tool output...\")\r\n\t\t);\r\n\t}\r\n\treturn firstNonEmptyLine(message.content) ?? (message.kind === \"reasoning\" ? \"Thinking...\" : message.content);\r\n}\r\n\r\nfunction inlineSummary(message: ChatMessage, width: number): string {\n\tconst reserved = Math.max(16, Math.floor(width * 0.2));\n\tconst maxLength = Math.max(24, width - reserved);\n\treturn truncate(`${inlinePrefix(message)} | ${inlineSnippet(message)}`, maxLength);\n}\n\nfunction toolInlineLabel(message: ChatMessage, width: number): string {\n\tconst tool = message.tool;\n\tif (!tool) {\n\t\treturn inlineSummary(message, width);\n\t}\n\n\tconst firstFileChange = tool.fileChanges[0];\n\tif (!firstFileChange) {\n\t\treturn inlineSummary(message, width);\n\t}\n\n\tconst reserved = Math.max(16, Math.floor(width * 0.22));\n\tconst maxLength = Math.max(24, width - reserved);\n\treturn truncate(`${tool.toolName} ${toolFileChangeLocation(firstFileChange)}`, maxLength);\n}\n\nfunction toolInlineDiffStats(message: ChatMessage): { added?: string; removed?: string } | undefined {\n\tconst tool = message.tool;\n\tconst firstFileChange = tool?.fileChanges[0];\n\tif (!tool || !firstFileChange) {\n\t\treturn undefined;\n\t}\n\n\tconst stats = firstFileChange.diffStats;\n\treturn {\n\t\tadded: stats?.added ? `+${stats.added}` : undefined,\n\t\tremoved: stats?.removed ? `-${stats.removed}` : undefined,\n\t};\n}\n\nfunction useStructuredToolSummary(message: ChatMessage): boolean {\n\treturn (\n\t\tmessage.kind === \"tool\" &&\n\t\tmessage.tool?.status === \"completed\" &&\n\t\t!!message.tool.fileChanges[0]\n\t);\n}\n\r\nexport function TranscriptPanel(props: {\n\tmessages: ChatMessage[];\r\n\tactiveModelLabel: string;\r\n\twidth: number;\r\n\tscrollRef: (ref: { scrollTo(position: number): void; scrollHeight: number; isDestroyed?: boolean }) => void;\r\n\tonToggleMessage: (messageId: string) => void;\r\n}) {\r\n\treturn (\r\n\t\t<box flexGrow={1} minHeight={0} backgroundColor={theme.panel} border={[\"top\", \"right\", \"bottom\", \"left\"]} borderColor={theme.border} padding={1} flexDirection=\"column\" gap={1}>\r\n\t\t\t<box flexDirection=\"row\" justifyContent=\"space-between\" gap={1}>\r\n\t\t\t\t<text fg={theme.accent}>Conversation</text>\r\n\t\t\t\t<text fg={theme.muted}>{truncate(props.activeModelLabel, 32)}</text>\r\n\t\t\t</box>\r\n\t\t\t<scrollbox ref={props.scrollRef} flexGrow={1} minHeight={0}>\r\n\t\t\t\t<box flexDirection=\"column\" gap={1}>\r\n\t\t\t\t\t<Show\r\n\t\t\t\t\t\twhen={props.messages.length > 0}\r\n\t\t\t\t\t\tfallback={\r\n\t\t\t\t\t\t\t<box backgroundColor={theme.panelAlt} border={[\"top\", \"right\", \"bottom\", \"left\"]} borderColor={theme.border} padding={1} flexDirection=\"column\" gap={1}>\r\n\t\t\t\t\t\t\t\t<text fg={theme.accentStrong}>Ready for a task</text>\r\n\t\t\t\t\t\t\t\t<text fg={theme.text} wrapMode=\"word\">Start with a prompt. This minimal shell keeps the layout compact while we bring interaction back.</text>\r\n\t\t\t\t\t\t\t\t<text fg={theme.muted} wrapMode=\"word\">Enter a prompt below, or type / for commands.</text>\r\n\t\t\t\t\t\t\t</box>\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t>\r\n\t\t\t\t\t\t<For each={props.messages}>\r\n\t\t\t\t\t\t\t{(message) =>\r\n\t\t\t\t\t\t\t\tisInlineSummaryMessage(message) ? (\r\n\t\t\t\t\t\t\t\t\t<box\r\n\t\t\t\t\t\t\t\t\t\tbackgroundColor={theme.panelMuted}\r\n\t\t\t\t\t\t\t\t\t\tborder={[\"left\"]}\r\n\t\t\t\t\t\t\t\t\t\tborderColor={transcriptBorderColor(message)}\r\n\t\t\t\t\t\t\t\t\t\tpaddingLeft={1}\r\n\t\t\t\t\t\t\t\t\t\tpaddingRight={1}\r\n\t\t\t\t\t\t\t\t\t\tpaddingTop={0}\r\n\t\t\t\t\t\t\t\t\t\tpaddingBottom={0}\r\n\t\t\t\t\t\t\t\t\t\tflexDirection=\"column\"\r\n\t\t\t\t\t\t\t\t\t\tgap={message.expanded ? 1 : 0}\n\t\t\t\t\t\t\t\t\t\tonMouseUp={() => props.onToggleMessage(message.id)}\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t<box flexDirection=\"row\" justifyContent=\"space-between\" gap={1}>\n\t\t\t\t\t\t\t\t\t\t\t{useStructuredToolSummary(message) ? (\n\t\t\t\t\t\t\t\t\t\t\t\t<box flexDirection=\"row\" gap={1} flexGrow={1} minWidth={0}>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<text fg={transcriptRoleColor(message)}>{toolInlineLabel(message, props.width)}</text>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<Show when={toolInlineDiffStats(message)?.added}>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<text fg={theme.success}>{toolInlineDiffStats(message)!.added}</text>\n\t\t\t\t\t\t\t\t\t\t\t\t\t</Show>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<Show when={toolInlineDiffStats(message)?.removed}>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<text fg={theme.danger}>{toolInlineDiffStats(message)!.removed}</text>\n\t\t\t\t\t\t\t\t\t\t\t\t\t</Show>\n\t\t\t\t\t\t\t\t\t\t\t\t</box>\n\t\t\t\t\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t\t\t\t\t<text fg={transcriptRoleColor(message)}>{inlineSummary(message, props.width)}</text>\n\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t\t<text fg={theme.muted}>{message.expanded ? \"hide\" : \"more\"} {truncate(message.time, 8)}</text>\n\t\t\t\t\t\t\t\t\t\t</box>\n\t\t\t\t\t\t\t\t\t\t<Show when={message.expanded}>\n\t\t\t\t\t\t\t\t\t\t\t<box paddingLeft={1} paddingBottom={1}>\n\t\t\t\t\t\t\t\t\t\t\t\t{message.kind === \"tool\" && message.tool ? (\n\t\t\t\t\t\t\t\t\t\t\t\t\t<ToolMessageDetail tool={message.tool} />\n\t\t\t\t\t\t\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t\t\t\t\t\t\t<text fg={theme.text} wrapMode=\"word\">{message.content}</text>\n\t\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t\t</box>\n\t\t\t\t\t\t\t\t\t\t</Show>\n\t\t\t\t\t\t\t\t\t</box>\n\t\t\t\t\t\t\t\t) : (\r\n\t\t\t\t\t\t\t\t\t<box\r\n\t\t\t\t\t\t\t\t\t\tbackgroundColor={theme.panelAlt}\r\n\t\t\t\t\t\t\t\t\t\tborder={[\"top\", \"right\", \"bottom\", \"left\"]}\r\n\t\t\t\t\t\t\t\t\t\tborderColor={transcriptBorderColor(message)}\r\n\t\t\t\t\t\t\t\t\t\tpadding={1}\r\n\t\t\t\t\t\t\t\t\t\tflexDirection=\"column\"\r\n\t\t\t\t\t\t\t\t\t\tgap={1}\r\n\t\t\t\t\t\t\t\t\t\tonMouseUp={message.collapsible && isMessageOverflowing(message) ? () => props.onToggleMessage(message.id) : undefined}\r\n\t\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t\t<box flexDirection=\"row\" justifyContent=\"space-between\" gap={1}>\r\n\t\t\t\t\t\t\t\t\t\t\t<text fg={transcriptRoleColor(message)}>{message.role.toUpperCase()}</text>\r\n\t\t\t\t\t\t\t\t\t\t\t<text fg={theme.muted}>{truncate(message.time, 12)}</text>\r\n\t\t\t\t\t\t\t\t\t\t</box>\r\n\t\t\t\t\t\t\t\t\t\t<text fg={theme.text} wrapMode=\"word\">{getVisibleMessageContent(message)}</text>\r\n\t\t\t\t\t\t\t\t\t\t<Show when={message.collapsible && isMessageOverflowing(message)}>\r\n\t\t\t\t\t\t\t\t\t\t\t<text fg={theme.muted}>{message.expanded ? \"Click to collapse\" : \"Click to expand\"}</text>\r\n\t\t\t\t\t\t\t\t\t\t</Show>\r\n\t\t\t\t\t\t\t\t\t</box>\r\n\t\t\t\t\t\t\t\t)\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t</For>\r\n\t\t\t\t\t</Show>\r\n\t\t\t\t</box>\r\n\t\t\t</scrollbox>\r\n\t\t</box>\r\n\t);\r\n}\r\n"],"mappings":";;;;;;;;;AAAA,SAASA,GAAG,EAAEC,IAAI,QAAQ,UAAU;AAEpC,SAASC,QAAQ,QAAQ,cAAc;AACvC,SAASC,iBAAiB,IAAIC,KAAK,QAAQ,YAAY;AACvD,SAASC,sBAAsB,QAAQ,wBAAwB;AAC/D,SAASC,eAAe,EAAEC,cAAc,QAAQ,oBAAoB;AACpE,SAASC,iBAAiB,QAAQ,0BAA0B;AAE5D,MAAMC,yBAAyB,GAAG,CAAC;AAEnC,SAASC,oBAAoBA,CAACC,OAAoB,EAAW;EAC5D,OAAOA,OAAO,CAACC,OAAO,CAACC,KAAK,CAAC,IAAI,CAAC,CAACC,MAAM,GAAGL,yBAAyB;AACtE;AAEA,SAASM,sBAAsBA,CAACJ,OAAoB,EAAW;EAC9D,OAAOA,OAAO,CAACK,IAAI,KAAK,MAAM,IAAIL,OAAO,CAACK,IAAI,KAAK,WAAW;AAC/D;AAEA,SAASC,wBAAwBA,CAACN,OAAoB,EAAU;EAC/D,IAAI,CAACA,OAAO,CAACO,WAAW,IAAIP,OAAO,CAACQ,QAAQ,IAAI,CAACT,oBAAoB,CAACC,OAAO,CAAC,EAAE;IAC/E,OAAOA,OAAO,CAACC,OAAO;EACvB;EACA,OAAO,CAAC,GAAGD,OAAO,CAACC,OAAO,CAACC,KAAK,CAAC,IAAI,CAAC,CAACO,KAAK,CAAC,CAAC,EAAEX,yBAAyB,CAAC,EAAE,KAAK,CAAC,CAACY,IAAI,CAAC,IAAI,CAAC;AAC9F;AAEA,SAASC,qBAAqBA,CAACX,OAAoB,EAAU;EAC5D,IAAIA,OAAO,CAACK,IAAI,KAAK,MAAM,EAAE;IAC5B,OAAOZ,KAAK,CAACmB,MAAM;EACpB;EACA,IAAIZ,OAAO,CAACK,IAAI,KAAK,WAAW,EAAE;IACjC,OAAOZ,KAAK,CAACoB,KAAK;EACnB;EACA,OAAOb,OAAO,CAACc,IAAI,KAAK,MAAM,GAAGrB,KAAK,CAACsB,MAAM,GAAGf,OAAO,CAACc,IAAI,KAAK,WAAW,GAAGrB,KAAK,CAACuB,OAAO,GAAGvB,KAAK,CAACoB,KAAK;AAC3G;AAEA,SAASI,mBAAmBA,CAACjB,OAAoB,EAAU;EAC1D,IAAIA,OAAO,CAACK,IAAI,KAAK,MAAM,EAAE;IAC5B,OAAOL,OAAO,CAACkB,IAAI,GAAGC,SAAS,CAACvB,cAAc,CAACI,OAAO,CAACkB,IAAI,CAACE,MAAM,CAAC,CAAC,GAAG3B,KAAK,CAACsB,MAAM;EACpF;EACA,IAAIf,OAAO,CAACK,IAAI,KAAK,WAAW,EAAE;IACjC,OAAOZ,KAAK,CAAC4B,OAAO;EACrB;EACA,OAAOrB,OAAO,CAACc,IAAI,KAAK,MAAM,GAAGrB,KAAK,CAACsB,MAAM,GAAGf,OAAO,CAACc,IAAI,KAAK,WAAW,GAAGrB,KAAK,CAACuB,OAAO,GAAGvB,KAAK,CAACoB,KAAK;AAC3G;AAEA,SAASM,SAASA,CAACG,IAA2D,EAAU;EACvF,QAAQA,IAAI;IACX,KAAK,QAAQ;MACZ,OAAO7B,KAAK,CAACsB,MAAM;IACpB,KAAK,SAAS;MACb,OAAOtB,KAAK,CAACuB,OAAO;IACrB,KAAK,SAAS;MACb,OAAOvB,KAAK,CAAC4B,OAAO;IACrB,KAAK,QAAQ;MACZ,OAAO5B,KAAK,CAAC8B,MAAM;IACpB,KAAK,OAAO;MACX,OAAO9B,KAAK,CAACoB,KAAK;EACpB;AACD;AAEA,SAASW,iBAAiBA,CAACC,KAAa,EAAsB;EAC7D,OAAOA,KAAK,CACVvB,KAAK,CAAC,IAAI,CAAC,CACXwB,GAAG,CAAEC,IAAI,IAAKA,IAAI,CAACC,IAAI,CAAC,CAAC,CAAC,CAC1BC,IAAI,CAACC,OAAO,CAAC;AAChB;AAEA,SAASC,YAAYA,CAAC/B,OAAoB,EAAU;EACnD,IAAIA,OAAO,CAACK,IAAI,KAAK,MAAM,IAAIL,OAAO,CAACkB,IAAI,EAAE;IAC5C,OAAO,GAAGvB,eAAe,CAACK,OAAO,CAACkB,IAAI,CAACE,MAAM,CAAC,IAAIpB,OAAO,CAACkB,IAAI,CAACc,QAAQ,EAAE;EAC1E;EACA,IAAIhC,OAAO,CAACK,IAAI,KAAK,WAAW,EAAE;IACjC,OAAO,SAAS;EACjB;EACA,OAAOL,OAAO,CAACc,IAAI;AACpB;AAEA,SAASmB,aAAaA,CAACjC,OAAoB,EAAU;EACpD,IAAIA,OAAO,CAACK,IAAI,KAAK,MAAM,IAAIL,OAAO,CAACkB,IAAI,EAAE;IAC5C,OACCM,iBAAiB,CAACxB,OAAO,CAACkB,IAAI,CAACgB,UAAU,CAAC,IAC1CV,iBAAiB,CAACxB,OAAO,CAACkB,IAAI,CAACiB,QAAQ,CAAC,KACvCnC,OAAO,CAACkB,IAAI,CAACE,MAAM,KAAK,mBAAmB,GAAG,yBAAyB,GAAG,4BAA4B,CAAC;EAE1G;EACA,OAAOI,iBAAiB,CAACxB,OAAO,CAACC,OAAO,CAAC,KAAKD,OAAO,CAACK,IAAI,KAAK,WAAW,GAAG,aAAa,GAAGL,OAAO,CAACC,OAAO,CAAC;AAC9G;AAEA,SAASmC,aAAaA,CAACpC,OAAoB,EAAEqC,KAAa,EAAU;EACnE,MAAMC,QAAQ,GAAGC,IAAI,CAACC,GAAG,CAAC,EAAE,EAAED,IAAI,CAACE,KAAK,CAACJ,KAAK,GAAG,GAAG,CAAC,CAAC;EACtD,MAAMK,SAAS,GAAGH,IAAI,CAACC,GAAG,CAAC,EAAE,EAAEH,KAAK,GAAGC,QAAQ,CAAC;EAChD,OAAO/C,QAAQ,CAAC,GAAGwC,YAAY,CAAC/B,OAAO,CAAC,MAAMiC,aAAa,CAACjC,OAAO,CAAC,EAAE,EAAE0C,SAAS,CAAC;AACnF;AAEA,SAASC,eAAeA,CAAC3C,OAAoB,EAAEqC,KAAa,EAAU;EACrE,MAAMnB,IAAI,GAAGlB,OAAO,CAACkB,IAAI;EACzB,IAAI,CAACA,IAAI,EAAE;IACV,OAAOkB,aAAa,CAACpC,OAAO,EAAEqC,KAAK,CAAC;EACrC;EAEA,MAAMO,eAAe,GAAG1B,IAAI,CAAC2B,WAAW,CAAC,CAAC,CAAC;EAC3C,IAAI,CAACD,eAAe,EAAE;IACrB,OAAOR,aAAa,CAACpC,OAAO,EAAEqC,KAAK,CAAC;EACrC;EAEA,MAAMC,QAAQ,GAAGC,IAAI,CAACC,GAAG,CAAC,EAAE,EAAED,IAAI,CAACE,KAAK,CAACJ,KAAK,GAAG,IAAI,CAAC,CAAC;EACvD,MAAMK,SAAS,GAAGH,IAAI,CAACC,GAAG,CAAC,EAAE,EAAEH,KAAK,GAAGC,QAAQ,CAAC;EAChD,OAAO/C,QAAQ,CAAC,GAAG2B,IAAI,CAACc,QAAQ,IAAItC,sBAAsB,CAACkD,eAAe,CAAC,EAAE,EAAEF,SAAS,CAAC;AAC1F;AAEA,SAASI,mBAAmBA,CAAC9C,OAAoB,EAAoD;EACpG,MAAMkB,IAAI,GAAGlB,OAAO,CAACkB,IAAI;EACzB,MAAM0B,eAAe,GAAG1B,IAAI,EAAE2B,WAAW,CAAC,CAAC,CAAC;EAC5C,IAAI,CAAC3B,IAAI,IAAI,CAAC0B,eAAe,EAAE;IAC9B,OAAOG,SAAS;EACjB;EAEA,MAAMC,KAAK,GAAGJ,eAAe,CAACK,SAAS;EACvC,OAAO;IACNC,KAAK,EAAEF,KAAK,EAAEE,KAAK,GAAG,IAAIF,KAAK,CAACE,KAAK,EAAE,GAAGH,SAAS;IACnDI,OAAO,EAAEH,KAAK,EAAEG,OAAO,GAAG,IAAIH,KAAK,CAACG,OAAO,EAAE,GAAGJ;EACjD,CAAC;AACF;AAEA,SAASK,wBAAwBA,CAACpD,OAAoB,EAAW;EAChE,OACCA,OAAO,CAACK,IAAI,KAAK,MAAM,IACvBL,OAAO,CAACkB,IAAI,EAAEE,MAAM,KAAK,WAAW,IACpC,CAAC,CAACpB,OAAO,CAACkB,IAAI,CAAC2B,WAAW,CAAC,CAAC,CAAC;AAE/B;AAEA,OAAO,SAASQ,eAAeA,CAACC,KAM/B,EAAE;EACF;IAAA,IAAAC,IAAA,GAAAC,eAAA;MAAAC,KAAA,GAAAD,eAAA;MAAAE,KAAA,GAAAF,eAAA;MAAAG,KAAA,GAAAH,eAAA;MAAAI,KAAA,GAAAJ,eAAA;MAAAK,KAAA,GAAAL,eAAA;IAAAM,YAAA,CAAAP,IAAA,EAAAE,KAAA;IAAAK,YAAA,CAAAP,IAAA,EAAAK,KAAA;IAAAG,SAAA,CAAAR,IAAA,cACgB,CAAC;IAAAQ,SAAA,CAAAR,IAAA,eAAa,CAAC;IAAAQ,SAAA,CAAAR,IAAA,YAAwC,CAAC,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,CAAC;IAAAQ,SAAA,CAAAR,IAAA,aAAsC,CAAC;IAAAQ,SAAA,CAAAR,IAAA,mBAAgB,QAAQ;IAAAQ,SAAA,CAAAR,IAAA,SAAM,CAAC;IAAAO,YAAA,CAAAL,KAAA,EAAAC,KAAA;IAAAI,YAAA,CAAAL,KAAA,EAAAE,KAAA;IAAAI,SAAA,CAAAN,KAAA,mBAC1J,KAAK;IAAAM,SAAA,CAAAN,KAAA,oBAAgB,eAAe;IAAAM,SAAA,CAAAN,KAAA,SAAM,CAAC;IAAAK,YAAA,CAAAJ,KAAA,EAAAM,gBAAA;IAAAC,QAAA,CAAAN,KAAA,QAErCpE,QAAQ,CAAC+D,KAAK,CAACY,gBAAgB,EAAE,EAAE,CAAC;IAAAJ,YAAA,CAAAF,KAAA,EAAAC,KAAA;IAAA,IAAAM,KAAA,GAE7Cb,KAAK,CAACc,SAAS;IAAA,OAAAD,KAAA,kBAAAE,KAAA,CAAAF,KAAA,EAAAP,KAAA,IAAfN,KAAK,CAACc,SAAS,GAAAR,KAAA;IAAAG,SAAA,CAAAH,KAAA,cAAY,CAAC;IAAAG,SAAA,CAAAH,KAAA,eAAa,CAAC;IAAAG,SAAA,CAAAF,KAAA,mBACtC,QAAQ;IAAAE,SAAA,CAAAF,KAAA,SAAM,CAAC;IAAAI,QAAA,CAAAJ,KAAA,EAAAS,iBAAA,CAChChF,IAAI;MAAA,IACJiF,IAAIA,CAAA;QAAA,OAAEjB,KAAK,CAACkB,QAAQ,CAACrE,MAAM,GAAG,CAAC;MAAA;MAAA,IAC/BsE,QAAQA,CAAA;QAAA;UAAA,IAAAC,KAAA,GAAAlB,eAAA;YAAAmB,KAAA,GAAAnB,eAAA;YAAAoB,KAAA,GAAApB,eAAA;YAAAqB,MAAA,GAAArB,eAAA;UAAAM,YAAA,CAAAY,KAAA,EAAAC,KAAA;UAAAb,YAAA,CAAAY,KAAA,EAAAE,KAAA;UAAAd,YAAA,CAAAY,KAAA,EAAAG,MAAA;UAAAd,SAAA,CAAAW,KAAA,YACuC,CAAC,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,CAAC;UAAAX,SAAA,CAAAW,KAAA,aAAsC,CAAC;UAAAX,SAAA,CAAAW,KAAA,mBAAgB,QAAQ;UAAAX,SAAA,CAAAW,KAAA,SAAM,CAAC;UAAAZ,YAAA,CAAAa,KAAA,EAAAX,gBAAA;UAAAF,YAAA,CAAAc,KAAA,EAAAZ,gBAAA;UAAAD,SAAA,CAAAa,KAAA,cAEtH,MAAM;UAAAd,YAAA,CAAAe,MAAA,EAAAb,gBAAA;UAAAD,SAAA,CAAAc,MAAA,cACL,MAAM;UAAAC,QAAA,CAAAC,GAAA;YAAA,IAAAC,IAAA,GAHjBvF,KAAK,CAACwF,QAAQ;cAAAC,IAAA,GAA2DzF,KAAK,CAACmB,MAAM;cAAAuE,IAAA,GAChG1F,KAAK,CAAC2F,YAAY;cAAAC,IAAA,GAClB5F,KAAK,CAAC6F,IAAI;cAAAC,IAAA,GACV9F,KAAK,CAACoB,KAAK;YAAAmE,IAAA,KAAAD,GAAA,CAAAS,CAAA,KAAAT,GAAA,CAAAS,CAAA,GAAAzB,SAAA,CAAAW,KAAA,qBAAAM,IAAA,EAAAD,GAAA,CAAAS,CAAA;YAAAN,IAAA,KAAAH,GAAA,CAAAU,CAAA,KAAAV,GAAA,CAAAU,CAAA,GAAA1B,SAAA,CAAAW,KAAA,iBAAAQ,IAAA,EAAAH,GAAA,CAAAU,CAAA;YAAAN,IAAA,KAAAJ,GAAA,CAAAW,CAAA,KAAAX,GAAA,CAAAW,CAAA,GAAA3B,SAAA,CAAAY,KAAA,QAAAQ,IAAA,EAAAJ,GAAA,CAAAW,CAAA;YAAAL,IAAA,KAAAN,GAAA,CAAAY,CAAA,KAAAZ,GAAA,CAAAY,CAAA,GAAA5B,SAAA,CAAAa,KAAA,QAAAS,IAAA,EAAAN,GAAA,CAAAY,CAAA;YAAAJ,IAAA,KAAAR,GAAA,CAAAa,CAAA,KAAAb,GAAA,CAAAa,CAAA,GAAA7B,SAAA,CAAAc,MAAA,QAAAU,IAAA,EAAAR,GAAA,CAAAa,CAAA;YAAA,OAAAb,GAAA;UAAA;YAAAS,CAAA,EAAAzC,SAAA;YAAA0C,CAAA,EAAA1C,SAAA;YAAA2C,CAAA,EAAA3C,SAAA;YAAA4C,CAAA,EAAA5C,SAAA;YAAA6C,CAAA,EAAA7C;UAAA;UAAA,OAAA2B,KAAA;QAAA;MAAA;MAAA,IAAAmB,SAAA;QAAA,OAAAvB,iBAAA,CAItBjF,GAAG;UAAA,IAACyG,IAAIA,CAAA;YAAA,OAAExC,KAAK,CAACkB,QAAQ;UAAA;UAAAqB,QAAA,EACtB7F,OAAO,IACRI,sBAAsB,CAACJ,OAAO,CAAC;YAAA,IAAA+F,MAAA,GAAAvC,eAAA;cAAAwC,MAAA,GAAAxC,eAAA;cAAAyC,MAAA,GAAAzC,eAAA;cAAA0C,MAAA,GAAAlC,gBAAA;YAAAF,YAAA,CAAAiC,MAAA,EAAAC,MAAA;YAAAjC,SAAA,CAAAgC,MAAA,YAGrB,CAAC,MAAM,CAAC;YAAAhC,SAAA,CAAAgC,MAAA,iBAEH,CAAC;YAAAhC,SAAA,CAAAgC,MAAA,kBACA,CAAC;YAAAhC,SAAA,CAAAgC,MAAA,gBACH,CAAC;YAAAhC,SAAA,CAAAgC,MAAA,mBACE,CAAC;YAAAhC,SAAA,CAAAgC,MAAA,mBACF,QAAQ;YAAAhC,SAAA,CAAAgC,MAAA,eAEX,MAAMzC,KAAK,CAAC6C,eAAe,CAACnG,OAAO,CAACoG,EAAE,CAAC;YAAAtC,YAAA,CAAAkC,MAAA,EAAAC,MAAA;YAAAlC,SAAA,CAAAiC,MAAA,mBAE/B,KAAK;YAAAjC,SAAA,CAAAiC,MAAA,oBAAgB,eAAe;YAAAjC,SAAA,CAAAiC,MAAA,SAAM,CAAC;YAAA/B,QAAA,CAAA+B,MAAA;cAAA,IAAAK,GAAA,GAAAC,MAAA,SAC5DlD,wBAAwB,CAACpD,OAAO,CAAC;cAAA,aAAjCqG,GAAA;gBAAA,IAAAE,MAAA,GAAA/C,eAAA;kBAAAgD,MAAA,GAAAhD,eAAA;gBAAAM,YAAA,CAAAyC,MAAA,EAAAC,MAAA;gBAAAzC,SAAA,CAAAwC,MAAA,mBACmB,KAAK;gBAAAxC,SAAA,CAAAwC,MAAA,SAAM,CAAC;gBAAAxC,SAAA,CAAAwC,MAAA,cAAY,CAAC;gBAAAxC,SAAA,CAAAwC,MAAA,cAAY,CAAC;gBAAAtC,QAAA,CAAAuC,MAAA,QACf7D,eAAe,CAAC3C,OAAO,EAAEsD,KAAK,CAACjB,KAAK,CAAC;gBAAA4B,QAAA,CAAAsC,MAAA,EAAAjC,iBAAA,CAC7EhF,IAAI;kBAAA,IAACiF,IAAIA,CAAA;oBAAA,OAAEzB,mBAAmB,CAAC9C,OAAO,CAAC,EAAEkD,KAAK;kBAAA;kBAAA,IAAA2C,SAAA;oBAAA,IAAAY,MAAA,GAAAjD,eAAA;oBAAAS,QAAA,CAAAwC,MAAA,QACpB3D,mBAAmB,CAAC9C,OAAO,CAAC,CAAEkD,KAAK;oBAAA4B,QAAA,CAAA4B,GAAA,IAAA3C,SAAA,CAAA0C,MAAA,QAAnDhH,KAAK,CAACuB,OAAO,EAAA0F,GAAA;oBAAA,OAAAD,MAAA;kBAAA;gBAAA;gBAAAxC,QAAA,CAAAsC,MAAA,EAAAjC,iBAAA,CAEvBhF,IAAI;kBAAA,IAACiF,IAAIA,CAAA;oBAAA,OAAEzB,mBAAmB,CAAC9C,OAAO,CAAC,EAAEmD,OAAO;kBAAA;kBAAA,IAAA0C,SAAA;oBAAA,IAAAc,MAAA,GAAAnD,eAAA;oBAAAS,QAAA,CAAA0C,MAAA,QACvB7D,mBAAmB,CAAC9C,OAAO,CAAC,CAAEmD,OAAO;oBAAA2B,QAAA,CAAA4B,GAAA,IAAA3C,SAAA,CAAA4C,MAAA,QAApDlH,KAAK,CAAC8B,MAAM,EAAAmF,GAAA;oBAAA,OAAAC,MAAA;kBAAA;gBAAA;gBAAA7B,QAAA,CAAA4B,GAAA,IAAA3C,SAAA,CAAAyC,MAAA,QALbvF,mBAAmB,CAACjB,OAAO,CAAC,EAAA0G,GAAA;gBAAA,OAAAH,MAAA;cAAA;gBAAA,IAAAK,MAAA,GAAApD,eAAA;gBAAAS,QAAA,CAAA2C,MAAA,QASExE,aAAa,CAACpC,OAAO,EAAEsD,KAAK,CAACjB,KAAK,CAAC;gBAAAyC,QAAA,CAAA4B,GAAA,IAAA3C,SAAA,CAAA6C,MAAA,QAAlE3F,mBAAmB,CAACjB,OAAO,CAAC,EAAA0G,GAAA;gBAAA,OAAAE,MAAA;cAAA,IACtC;YAAA,MAAAX,MAAA;YAAAnC,YAAA,CAAAmC,MAAA,EAAAC,MAAA;YAAAjC,QAAA,CAAAgC,MAAA,QACuBjG,OAAO,CAACQ,QAAQ,GAAG,MAAM,GAAG,MAAM,EAAA0F,MAAA;YAAAjC,QAAA,CAAAgC,MAAA,QAAG1G,QAAQ,CAACS,OAAO,CAAC6G,IAAI,EAAE,CAAC,CAAC;YAAA5C,QAAA,CAAA8B,MAAA,EAAAzB,iBAAA,CAEtFhF,IAAI;cAAA,IAACiF,IAAIA,CAAA;gBAAA,OAAEvE,OAAO,CAACQ,QAAQ;cAAA;cAAA,IAAAqF,SAAA;gBAAA,IAAAiB,MAAA,GAAAtD,eAAA;gBAAAO,SAAA,CAAA+C,MAAA,iBACT,CAAC;gBAAA/C,SAAA,CAAA+C,MAAA,mBAAiB,CAAC;gBAAA7C,QAAA,CAAA6C,MAAA;kBAAA,IAAAC,IAAA,GAAAT,MAAA,UACnCtG,OAAO,CAACK,IAAI,KAAK,MAAM,IAAIL,OAAO,CAACkB,IAAI;kBAAA,aAAvC6F,IAAA,KAAAzC,iBAAA,CACCzE,iBAAiB;oBAAA,IAACqB,IAAIA,CAAA;sBAAA,OAAElB,OAAO,CAACkB,IAAI;oBAAA;kBAAA;oBAAA,IAAA8F,MAAA,GAAAxD,eAAA;oBAAAO,SAAA,CAAAiD,MAAA,cAEN,MAAM;oBAAA/C,QAAA,CAAA+C,MAAA,QAAEhH,OAAO,CAACC,OAAO;oBAAA6E,QAAA,CAAA4B,GAAA,IAAA3C,SAAA,CAAAiD,MAAA,QAA5CvH,KAAK,CAAC6F,IAAI,EAAAoB,GAAA;oBAAA,OAAAM,MAAA;kBAAA,IACpB;gBAAA;gBAAA,OAAAF,MAAA;cAAA;YAAA;YAAAhC,QAAA,CAAAC,GAAA;cAAA,IAAAkC,IAAA,GAjCcxH,KAAK,CAACyH,UAAU;gBAAAC,IAAA,GAEpBxG,qBAAqB,CAACX,OAAO,CAAC;gBAAAoH,KAAA,GAMtCpH,OAAO,CAACQ,QAAQ,GAAG,CAAC,GAAG,CAAC;gBAAA6G,KAAA,GAiBlB5H,KAAK,CAACoB,KAAK;cAAAoG,IAAA,KAAAlC,GAAA,CAAAS,CAAA,KAAAT,GAAA,CAAAS,CAAA,GAAAzB,SAAA,CAAAgC,MAAA,qBAAAkB,IAAA,EAAAlC,GAAA,CAAAS,CAAA;cAAA2B,IAAA,KAAApC,GAAA,CAAAU,CAAA,KAAAV,GAAA,CAAAU,CAAA,GAAA1B,SAAA,CAAAgC,MAAA,iBAAAoB,IAAA,EAAApC,GAAA,CAAAU,CAAA;cAAA2B,KAAA,KAAArC,GAAA,CAAAW,CAAA,KAAAX,GAAA,CAAAW,CAAA,GAAA3B,SAAA,CAAAgC,MAAA,SAAAqB,KAAA,EAAArC,GAAA,CAAAW,CAAA;cAAA2B,KAAA,KAAAtC,GAAA,CAAAY,CAAA,KAAAZ,GAAA,CAAAY,CAAA,GAAA5B,SAAA,CAAAkC,MAAA,QAAAoB,KAAA,EAAAtC,GAAA,CAAAY,CAAA;cAAA,OAAAZ,GAAA;YAAA;cAAAS,CAAA,EAAAzC,SAAA;cAAA0C,CAAA,EAAA1C,SAAA;cAAA2C,CAAA,EAAA3C,SAAA;cAAA4C,CAAA,EAAA5C;YAAA;YAAA,OAAAgD,MAAA;UAAA;YAAA,IAAAuB,MAAA,GAAA9D,eAAA;cAAA+D,MAAA,GAAA/D,eAAA;cAAAgE,MAAA,GAAAhE,eAAA;cAAAiE,MAAA,GAAAjE,eAAA;cAAAkE,MAAA,GAAAlE,eAAA;YAAAM,YAAA,CAAAwD,MAAA,EAAAC,MAAA;YAAAzD,YAAA,CAAAwD,MAAA,EAAAI,MAAA;YAAA3D,SAAA,CAAAuD,MAAA,YAed,CAAC,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,CAAC;YAAAvD,SAAA,CAAAuD,MAAA,aAEjC,CAAC;YAAAvD,SAAA,CAAAuD,MAAA,mBACI,QAAQ;YAAAvD,SAAA,CAAAuD,MAAA,SACjB,CAAC;YAAAxD,YAAA,CAAAyD,MAAA,EAAAC,MAAA;YAAA1D,YAAA,CAAAyD,MAAA,EAAAE,MAAA;YAAA1D,SAAA,CAAAwD,MAAA,mBAGa,KAAK;YAAAxD,SAAA,CAAAwD,MAAA,oBAAgB,eAAe;YAAAxD,SAAA,CAAAwD,MAAA,SAAM,CAAC;YAAAtD,QAAA,CAAAuD,MAAA,QACpBxH,OAAO,CAACc,IAAI,CAAC6G,WAAW,CAAC,CAAC;YAAA1D,QAAA,CAAAwD,MAAA,QAC3ClI,QAAQ,CAACS,OAAO,CAAC6G,IAAI,EAAE,EAAE,CAAC;YAAA9C,SAAA,CAAA2D,MAAA,cAEpB,MAAM;YAAAzD,QAAA,CAAAyD,MAAA,QAAEpH,wBAAwB,CAACN,OAAO,CAAC;YAAAiE,QAAA,CAAAqD,MAAA,EAAAhD,iBAAA,CACvEhF,IAAI;cAAA,IAACiF,IAAIA,CAAA;gBAAA,OAAE+B,MAAA,SAAAtG,OAAO,CAACO,WAAW,OAAIR,oBAAoB,CAACC,OAAO,CAAC;cAAA;cAAA,IAAA6F,SAAA;gBAAA,IAAA+B,MAAA,GAAApE,eAAA;gBAAAS,QAAA,CAAA2D,MAAA,QACvC5H,OAAO,CAACQ,QAAQ,GAAG,mBAAmB,GAAG,iBAAiB;gBAAAsE,QAAA,CAAA4B,GAAA,IAAA3C,SAAA,CAAA6D,MAAA,QAAxEnI,KAAK,CAACoB,KAAK,EAAA6F,GAAA;gBAAA,OAAAkB,MAAA;cAAA;YAAA;YAAA9C,QAAA,CAAAC,GAAA;cAAA,IAAA8C,KAAA,GAdLpI,KAAK,CAACwF,QAAQ;gBAAA6C,KAAA,GAElBnH,qBAAqB,CAACX,OAAO,CAAC;gBAAA+H,KAAA,GAIhC/H,OAAO,CAACO,WAAW,IAAIR,oBAAoB,CAACC,OAAO,CAAC,GAAG,MAAMsD,KAAK,CAAC6C,eAAe,CAACnG,OAAO,CAACoG,EAAE,CAAC,GAAGrD,SAAS;gBAAAiF,KAAA,GAG1G/G,mBAAmB,CAACjB,OAAO,CAAC;gBAAAiI,KAAA,GAC5BxI,KAAK,CAACoB,KAAK;gBAAAqH,KAAA,GAEZzI,KAAK,CAAC6F,IAAI;cAAAuC,KAAA,KAAA9C,GAAA,CAAAS,CAAA,KAAAT,GAAA,CAAAS,CAAA,GAAAzB,SAAA,CAAAuD,MAAA,qBAAAO,KAAA,EAAA9C,GAAA,CAAAS,CAAA;cAAAsC,KAAA,KAAA/C,GAAA,CAAAU,CAAA,KAAAV,GAAA,CAAAU,CAAA,GAAA1B,SAAA,CAAAuD,MAAA,iBAAAQ,KAAA,EAAA/C,GAAA,CAAAU,CAAA;cAAAsC,KAAA,KAAAhD,GAAA,CAAAW,CAAA,KAAAX,GAAA,CAAAW,CAAA,GAAA3B,SAAA,CAAAuD,MAAA,eAAAS,KAAA,EAAAhD,GAAA,CAAAW,CAAA;cAAAsC,KAAA,KAAAjD,GAAA,CAAAY,CAAA,KAAAZ,GAAA,CAAAY,CAAA,GAAA5B,SAAA,CAAAyD,MAAA,QAAAQ,KAAA,EAAAjD,GAAA,CAAAY,CAAA;cAAAsC,KAAA,KAAAlD,GAAA,CAAAa,CAAA,KAAAb,GAAA,CAAAa,CAAA,GAAA7B,SAAA,CAAA0D,MAAA,QAAAQ,KAAA,EAAAlD,GAAA,CAAAa,CAAA;cAAAsC,KAAA,KAAAnD,GAAA,CAAAoD,CAAA,KAAApD,GAAA,CAAAoD,CAAA,GAAApE,SAAA,CAAA2D,MAAA,QAAAQ,KAAA,EAAAnD,GAAA,CAAAoD,CAAA;cAAA,OAAApD,GAAA;YAAA;cAAAS,CAAA,EAAAzC,SAAA;cAAA0C,CAAA,EAAA1C,SAAA;cAAA2C,CAAA,EAAA3C,SAAA;cAAA4C,CAAA,EAAA5C,SAAA;cAAA6C,CAAA,EAAA7C,SAAA;cAAAoF,CAAA,EAAApF;YAAA;YAAA,OAAAuE,MAAA;UAAA;QAKrB;MAAA;IAAA;IAAAxC,QAAA,CAAAC,GAAA;MAAA,IAAAqD,GAAA,GA7E0C3I,KAAK,CAAC4I,KAAK;QAAAC,IAAA,GAA2D7I,KAAK,CAACmB,MAAM;QAAA2H,IAAA,GAEvH9I,KAAK,CAACsB,MAAM;QAAAyH,IAAA,GACZ/I,KAAK,CAACoB,KAAK;MAAAuH,GAAA,KAAArD,GAAA,CAAAS,CAAA,KAAAT,GAAA,CAAAS,CAAA,GAAAzB,SAAA,CAAAR,IAAA,qBAAA6E,GAAA,EAAArD,GAAA,CAAAS,CAAA;MAAA8C,IAAA,KAAAvD,GAAA,CAAAU,CAAA,KAAAV,GAAA,CAAAU,CAAA,GAAA1B,SAAA,CAAAR,IAAA,iBAAA+E,IAAA,EAAAvD,GAAA,CAAAU,CAAA;MAAA8C,IAAA,KAAAxD,GAAA,CAAAW,CAAA,KAAAX,GAAA,CAAAW,CAAA,GAAA3B,SAAA,CAAAL,KAAA,QAAA6E,IAAA,EAAAxD,GAAA,CAAAW,CAAA;MAAA8C,IAAA,KAAAzD,GAAA,CAAAY,CAAA,KAAAZ,GAAA,CAAAY,CAAA,GAAA5B,SAAA,CAAAJ,KAAA,QAAA6E,IAAA,EAAAzD,GAAA,CAAAY,CAAA;MAAA,OAAAZ,GAAA;IAAA;MAAAS,CAAA,EAAAzC,SAAA;MAAA0C,CAAA,EAAA1C,SAAA;MAAA2C,CAAA,EAAA3C,SAAA;MAAA4C,CAAA,EAAA5C;IAAA;IAAA,OAAAQ,IAAA;EAAA;AAkFzB","ignoreList":[]}
|
|
1
|
+
{"version":3,"names":["For","Show","truncate","wepscliShellTheme","theme","toolFileChangeLocation","toolStatusLabel","toolStatusTone","ToolMessageDetail","COLLAPSIBLE_MESSAGE_LINES","isMessageOverflowing","message","content","split","length","isInlineSummaryMessage","kind","getVisibleMessageContent","collapsible","expanded","slice","join","transcriptBorderColor","border","muted","role","accent","success","transcriptRoleColor","tool","toneColor","status","warning","tone","danger","firstNonEmptyLine","value","map","line","trim","find","Boolean","inlinePrefix","toolName","inlineSnippet","outputText","argsText","inlineSummary","width","reserved","Math","max","floor","maxLength","toolInlineLabel","firstFileChange","fileChanges","toolInlineDiffStats","undefined","stats","diffStats","added","removed","useStructuredToolSummary","TranscriptPanel","props","_el$","_$createElement","_el$2","_el$3","_el$5","_el$6","_el$7","_$insertNode","_$setProp","_$createTextNode","_$insert","activeModelLabel","_ref$","scrollRef","_$use","_$createComponent","when","messages","fallback","_el$8","_el$9","_el$1","_el$11","_$effect","_p$","_v$5","panelAlt","_v$6","_v$7","accentStrong","_v$8","text","_v$9","e","t","a","o","i","children","each","_el$13","_el$14","_el$15","_el$16","onToggleMessage","id","_c$","_$memo","_el$18","_el$19","_el$20","_$p","_el$21","_el$22","time","_el$17","_c$2","_el$23","_v$0","panelMuted","_v$1","_v$10","_v$11","_el$24","_el$25","_el$26","_el$27","_el$28","toUpperCase","_el$29","_v$12","_v$13","_v$14","_v$15","_v$16","_v$17","n","_v$","panel","_v$2","_v$3","_v$4"],"sources":["transcript-panel.tsx"],"sourcesContent":["import { For, Show } from \"solid-js\";\r\nimport type { ChatMessage } from \"./chat-components.js\";\r\nimport { truncate } from \"./helpers.js\";\r\nimport { wepscliShellTheme as theme } from \"./theme.js\";\r\nimport { toolFileChangeLocation } from \"./tool-file-changes.js\";\r\nimport { toolStatusLabel, toolStatusTone } from \"./tool-messages.js\";\r\nimport { ToolMessageDetail } from \"./tool-message-detail.js\";\r\n\r\nconst COLLAPSIBLE_MESSAGE_LINES = 3;\r\n\r\nfunction isMessageOverflowing(message: ChatMessage): boolean {\r\n\treturn message.content.split(\"\\n\").length > COLLAPSIBLE_MESSAGE_LINES;\r\n}\r\n\r\nfunction isInlineSummaryMessage(message: ChatMessage): boolean {\r\n\treturn message.kind === \"tool\" || message.kind === \"reasoning\";\r\n}\r\n\r\nfunction getVisibleMessageContent(message: ChatMessage): string {\r\n\tif (!message.collapsible || message.expanded || !isMessageOverflowing(message)) {\r\n\t\treturn message.content;\r\n\t}\r\n\treturn [...message.content.split(\"\\n\").slice(0, COLLAPSIBLE_MESSAGE_LINES), \"...\"].join(\"\\n\");\r\n}\r\n\r\nfunction transcriptBorderColor(message: ChatMessage): string {\r\n\tif (message.kind === \"tool\") {\r\n\t\treturn theme.border;\r\n\t}\r\n\tif (message.kind === \"reasoning\") {\r\n\t\treturn theme.muted;\r\n\t}\r\n\treturn message.role === \"user\" ? theme.accent : message.role === \"assistant\" ? theme.success : theme.muted;\r\n}\r\n\r\nfunction transcriptRoleColor(message: ChatMessage): string {\r\n\tif (message.kind === \"tool\") {\r\n\t\treturn message.tool ? toneColor(toolStatusTone(message.tool.status)) : theme.accent;\r\n\t}\r\n\tif (message.kind === \"reasoning\") {\r\n\t\treturn theme.warning;\r\n\t}\r\n\treturn message.role === \"user\" ? theme.accent : message.role === \"assistant\" ? theme.success : theme.muted;\r\n}\r\n\r\nfunction toneColor(tone: \"accent\" | \"success\" | \"warning\" | \"danger\" | \"muted\"): string {\r\n\tswitch (tone) {\r\n\t\tcase \"accent\":\r\n\t\t\treturn theme.accent;\r\n\t\tcase \"success\":\r\n\t\t\treturn theme.success;\r\n\t\tcase \"warning\":\r\n\t\t\treturn theme.warning;\r\n\t\tcase \"danger\":\r\n\t\t\treturn theme.danger;\r\n\t\tcase \"muted\":\r\n\t\t\treturn theme.muted;\r\n\t}\r\n}\r\n\r\nfunction firstNonEmptyLine(value: string): string | undefined {\r\n\treturn value\r\n\t\t.split(\"\\n\")\r\n\t\t.map((line) => line.trim())\r\n\t\t.find(Boolean);\r\n}\r\n\r\nfunction inlinePrefix(message: ChatMessage): string {\r\n\tif (message.kind === \"tool\" && message.tool) {\r\n\t\treturn `${toolStatusLabel(message.tool.status)} ${message.tool.toolName}`;\r\n\t}\r\n\tif (message.kind === \"reasoning\") {\r\n\t\treturn \"Thought\";\r\n\t}\r\n\treturn message.role;\r\n}\r\n\r\nfunction inlineSnippet(message: ChatMessage): string {\r\n\tif (message.kind === \"tool\" && message.tool) {\r\n\t\treturn (\r\n\t\t\tfirstNonEmptyLine(message.tool.outputText) ??\r\n\t\t\tfirstNonEmptyLine(message.tool.argsText) ??\r\n\t\t\t(message.tool.status === \"awaiting_approval\" ? \"Waiting for approval...\" : \"Waiting for tool output...\")\r\n\t\t);\r\n\t}\r\n\treturn firstNonEmptyLine(message.content) ?? (message.kind === \"reasoning\" ? \"Thinking...\" : message.content);\r\n}\r\n\r\nfunction inlineSummary(message: ChatMessage, width: number): string {\r\n\tconst reserved = Math.max(16, Math.floor(width * 0.2));\r\n\tconst maxLength = Math.max(24, width - reserved);\r\n\treturn truncate(`${inlinePrefix(message)} | ${inlineSnippet(message)}`, maxLength);\r\n}\r\n\r\nfunction toolInlineLabel(message: ChatMessage, width: number): string {\r\n\tconst tool = message.tool;\r\n\tif (!tool) {\r\n\t\treturn inlineSummary(message, width);\r\n\t}\r\n\r\n\tconst firstFileChange = tool.fileChanges[0];\r\n\tif (!firstFileChange) {\r\n\t\treturn inlineSummary(message, width);\r\n\t}\r\n\r\n\tconst reserved = Math.max(16, Math.floor(width * 0.22));\r\n\tconst maxLength = Math.max(24, width - reserved);\r\n\treturn truncate(`${tool.toolName} ${toolFileChangeLocation(firstFileChange)}`, maxLength);\r\n}\r\n\r\nfunction toolInlineDiffStats(message: ChatMessage): { added?: string; removed?: string } | undefined {\r\n\tconst tool = message.tool;\r\n\tconst firstFileChange = tool?.fileChanges[0];\r\n\tif (!tool || !firstFileChange) {\r\n\t\treturn undefined;\r\n\t}\r\n\r\n\tconst stats = firstFileChange.diffStats;\r\n\treturn {\r\n\t\tadded: stats?.added ? `+${stats.added}` : undefined,\r\n\t\tremoved: stats?.removed ? `-${stats.removed}` : undefined,\r\n\t};\r\n}\r\n\r\nfunction useStructuredToolSummary(message: ChatMessage): boolean {\r\n\treturn (\r\n\t\tmessage.kind === \"tool\" &&\r\n\t\tmessage.tool?.status === \"completed\" &&\r\n\t\t!!message.tool.fileChanges[0]\r\n\t);\r\n}\r\n\r\nexport function TranscriptPanel(props: {\r\n\tmessages: ChatMessage[];\r\n\tactiveModelLabel: string;\r\n\twidth: number;\r\n\tscrollRef: (ref: { scrollTo(position: number): void; scrollHeight: number; isDestroyed?: boolean }) => void;\r\n\tonToggleMessage: (messageId: string) => void;\r\n}) {\r\n\treturn (\r\n\t\t<box flexGrow={1} minHeight={0} backgroundColor={theme.panel} border={[\"top\", \"right\", \"bottom\", \"left\"]} borderColor={theme.border} padding={1} flexDirection=\"column\" gap={1}>\r\n\t\t\t<box flexDirection=\"row\" justifyContent=\"space-between\" gap={1}>\r\n\t\t\t\t<text fg={theme.accent}>Conversation</text>\r\n\t\t\t\t<text fg={theme.muted}>{truncate(props.activeModelLabel, 32)}</text>\r\n\t\t\t</box>\r\n\t\t\t<scrollbox ref={props.scrollRef} flexGrow={1} minHeight={0}>\r\n\t\t\t\t<box flexDirection=\"column\" gap={1}>\r\n\t\t\t\t\t<Show\r\n\t\t\t\t\t\twhen={props.messages.length > 0}\r\n\t\t\t\t\t\tfallback={\r\n\t\t\t\t\t\t\t<box backgroundColor={theme.panelAlt} border={[\"top\", \"right\", \"bottom\", \"left\"]} borderColor={theme.border} padding={1} flexDirection=\"column\" gap={1}>\r\n\t\t\t\t\t\t\t\t<text fg={theme.accentStrong}>Ready for a task</text>\r\n\t\t\t\t\t\t\t\t<text fg={theme.text} wrapMode=\"word\">Start with a prompt. This minimal shell keeps the layout compact while we bring interaction back.</text>\r\n\t\t\t\t\t\t\t\t<text fg={theme.muted} wrapMode=\"word\">Enter a prompt below, or type / for commands.</text>\r\n\t\t\t\t\t\t\t</box>\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t>\r\n\t\t\t\t\t\t<For each={props.messages}>\r\n\t\t\t\t\t\t\t{(message) =>\r\n\t\t\t\t\t\t\t\tisInlineSummaryMessage(message) ? (\r\n\t\t\t\t\t\t\t\t\t<box\r\n\t\t\t\t\t\t\t\t\t\tbackgroundColor={theme.panelMuted}\r\n\t\t\t\t\t\t\t\t\t\tborder={[\"left\"]}\r\n\t\t\t\t\t\t\t\t\t\tborderColor={transcriptBorderColor(message)}\r\n\t\t\t\t\t\t\t\t\t\tpaddingLeft={1}\r\n\t\t\t\t\t\t\t\t\t\tpaddingRight={1}\r\n\t\t\t\t\t\t\t\t\t\tpaddingTop={0}\r\n\t\t\t\t\t\t\t\t\t\tpaddingBottom={0}\r\n\t\t\t\t\t\t\t\t\t\tflexDirection=\"column\"\r\n\t\t\t\t\t\t\t\t\t\tgap={message.expanded ? 1 : 0}\r\n\t\t\t\t\t\t\t\t\t\tonMouseUp={() => props.onToggleMessage(message.id)}\r\n\t\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t\t<box flexDirection=\"row\" justifyContent=\"space-between\" gap={1}>\r\n\t\t\t\t\t\t\t\t\t\t\t{useStructuredToolSummary(message) ? (\r\n\t\t\t\t\t\t\t\t\t\t\t\t<box flexDirection=\"row\" gap={1} flexGrow={1} minWidth={0}>\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t<text fg={transcriptRoleColor(message)}>{toolInlineLabel(message, props.width)}</text>\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t<Show when={toolInlineDiffStats(message)?.added}>\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<text fg={theme.success}>{toolInlineDiffStats(message)!.added}</text>\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t</Show>\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t<Show when={toolInlineDiffStats(message)?.removed}>\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<text fg={theme.danger}>{toolInlineDiffStats(message)!.removed}</text>\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t</Show>\r\n\t\t\t\t\t\t\t\t\t\t\t\t</box>\r\n\t\t\t\t\t\t\t\t\t\t\t) : (\r\n\t\t\t\t\t\t\t\t\t\t\t\t<text fg={transcriptRoleColor(message)}>{inlineSummary(message, props.width)}</text>\r\n\t\t\t\t\t\t\t\t\t\t\t)}\r\n\t\t\t\t\t\t\t\t\t\t\t<text fg={theme.muted}>{message.expanded ? \"hide\" : \"more\"} {truncate(message.time, 8)}</text>\r\n\t\t\t\t\t\t\t\t\t\t</box>\r\n\t\t\t\t\t\t\t\t\t\t<Show when={message.expanded}>\r\n\t\t\t\t\t\t\t\t\t\t\t<box paddingLeft={1} paddingBottom={1}>\r\n\t\t\t\t\t\t\t\t\t\t\t\t{message.kind === \"tool\" && message.tool ? (\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t<ToolMessageDetail tool={message.tool} />\r\n\t\t\t\t\t\t\t\t\t\t\t\t) : (\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t<text fg={theme.text} wrapMode=\"word\">{message.content}</text>\r\n\t\t\t\t\t\t\t\t\t\t\t\t)}\r\n\t\t\t\t\t\t\t\t\t\t\t</box>\r\n\t\t\t\t\t\t\t\t\t\t</Show>\r\n\t\t\t\t\t\t\t\t\t</box>\r\n\t\t\t\t\t\t\t\t) : (\r\n\t\t\t\t\t\t\t\t\t<box\r\n\t\t\t\t\t\t\t\t\t\tbackgroundColor={theme.panelAlt}\r\n\t\t\t\t\t\t\t\t\t\tborder={[\"top\", \"right\", \"bottom\", \"left\"]}\r\n\t\t\t\t\t\t\t\t\t\tborderColor={transcriptBorderColor(message)}\r\n\t\t\t\t\t\t\t\t\t\tpadding={1}\r\n\t\t\t\t\t\t\t\t\t\tflexDirection=\"column\"\r\n\t\t\t\t\t\t\t\t\t\tgap={1}\r\n\t\t\t\t\t\t\t\t\t\tonMouseUp={message.collapsible && isMessageOverflowing(message) ? () => props.onToggleMessage(message.id) : undefined}\r\n\t\t\t\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\t\t\t\t<box flexDirection=\"row\" justifyContent=\"space-between\" gap={1}>\r\n\t\t\t\t\t\t\t\t\t\t\t<text fg={transcriptRoleColor(message)}>{message.role.toUpperCase()}</text>\r\n\t\t\t\t\t\t\t\t\t\t\t<text fg={theme.muted}>{truncate(message.time, 12)}</text>\r\n\t\t\t\t\t\t\t\t\t\t</box>\r\n\t\t\t\t\t\t\t\t\t\t<text fg={theme.text} wrapMode=\"word\">{getVisibleMessageContent(message)}</text>\r\n\t\t\t\t\t\t\t\t\t\t<Show when={message.collapsible && isMessageOverflowing(message)}>\r\n\t\t\t\t\t\t\t\t\t\t\t<text fg={theme.muted}>{message.expanded ? \"Click to collapse\" : \"Click to expand\"}</text>\r\n\t\t\t\t\t\t\t\t\t\t</Show>\r\n\t\t\t\t\t\t\t\t\t</box>\r\n\t\t\t\t\t\t\t\t)\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t</For>\r\n\t\t\t\t\t</Show>\r\n\t\t\t\t</box>\r\n\t\t\t</scrollbox>\r\n\t\t</box>\r\n\t);\r\n}\r\n"],"mappings":"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","ignoreList":[]}
|
package/dist/config.js
CHANGED
|
@@ -29,6 +29,9 @@ export function getProvidersPath() {
|
|
|
29
29
|
export function getSessionsPath() {
|
|
30
30
|
return join(getAgentDir(), "sessions.json");
|
|
31
31
|
}
|
|
32
|
+
export function getSkillsDir(agentDir = getAgentDir()) {
|
|
33
|
+
return join(agentDir, "skills");
|
|
34
|
+
}
|
|
32
35
|
export function ensureAgentDir() {
|
|
33
36
|
const agentDir = getAgentDir();
|
|
34
37
|
if (!existsSync(agentDir)) {
|
package/dist/config.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["existsSync","mkdirSync","homedir","join","APP_NAME","CONFIG_DIR_NAME","ENV_AGENT_DIR","ENV_SHELL_DEBUG_LOG","expandHome","pathValue","startsWith","slice","getAgentDir","envDir","process","env","getSettingsPath","getAuthPath","getProvidersPath","getSessionsPath","
|
|
1
|
+
{"version":3,"names":["existsSync","mkdirSync","homedir","join","APP_NAME","CONFIG_DIR_NAME","ENV_AGENT_DIR","ENV_SHELL_DEBUG_LOG","expandHome","pathValue","startsWith","slice","getAgentDir","envDir","process","env","getSettingsPath","getAuthPath","getProvidersPath","getSessionsPath","getSkillsDir","agentDir","ensureAgentDir","recursive"],"sources":["config.ts"],"sourcesContent":["import { existsSync, mkdirSync } from \"fs\";\r\nimport { homedir } from \"os\";\r\nimport { join } from \"path\";\r\n\r\nexport const APP_NAME = \"wepscli\";\r\nexport const CONFIG_DIR_NAME = \".wepscli\";\r\nexport const ENV_AGENT_DIR = \"WEPSCLI_AGENT_DIR\";\r\nexport const ENV_SHELL_DEBUG_LOG = \"WEPSCLI_SHELL_DEBUG_LOG\";\r\n\r\nfunction expandHome(pathValue: string): string {\r\n\tif (pathValue === \"~\") return homedir();\r\n\tif (pathValue.startsWith(\"~/\")) return join(homedir(), pathValue.slice(2));\r\n\treturn pathValue;\r\n}\r\n\r\nexport function getAgentDir(): string {\r\n\tconst envDir = process.env[ENV_AGENT_DIR];\r\n\tif (envDir) {\r\n\t\treturn expandHome(envDir);\r\n\t}\r\n\treturn join(homedir(), CONFIG_DIR_NAME, \"agent\");\r\n}\r\n\r\nexport function getSettingsPath(): string {\r\n\treturn join(getAgentDir(), \"settings.json\");\r\n}\r\n\r\nexport function getAuthPath(): string {\r\n\treturn join(getAgentDir(), \"auth.json\");\r\n}\r\n\r\nexport function getProvidersPath(): string {\r\n\treturn join(getAgentDir(), \"providers.json\");\r\n}\r\n\r\nexport function getSessionsPath(): string {\n\treturn join(getAgentDir(), \"sessions.json\");\n}\n\nexport function getSkillsDir(agentDir: string = getAgentDir()): string {\n\treturn join(agentDir, \"skills\");\n}\n\nexport function ensureAgentDir(): string {\n\tconst agentDir = getAgentDir();\n\tif (!existsSync(agentDir)) {\n\t\tmkdirSync(agentDir, { recursive: true });\r\n\t}\r\n\treturn agentDir;\r\n}\r\n"],"mappings":"AAAA,SAASA,UAAU,EAAEC,SAAS,QAAQ,IAAI;AAC1C,SAASC,OAAO,QAAQ,IAAI;AAC5B,SAASC,IAAI,QAAQ,MAAM;AAE3B,OAAO,MAAMC,QAAQ,GAAG,SAAS;AACjC,OAAO,MAAMC,eAAe,GAAG,UAAU;AACzC,OAAO,MAAMC,aAAa,GAAG,mBAAmB;AAChD,OAAO,MAAMC,mBAAmB,GAAG,yBAAyB;AAE5D,SAASC,UAAUA,CAACC,SAAiB,EAAU;EAC9C,IAAIA,SAAS,KAAK,GAAG,EAAE,OAAOP,OAAO,CAAC,CAAC;EACvC,IAAIO,SAAS,CAACC,UAAU,CAAC,IAAI,CAAC,EAAE,OAAOP,IAAI,CAACD,OAAO,CAAC,CAAC,EAAEO,SAAS,CAACE,KAAK,CAAC,CAAC,CAAC,CAAC;EAC1E,OAAOF,SAAS;AACjB;AAEA,OAAO,SAASG,WAAWA,CAAA,EAAW;EACrC,MAAMC,MAAM,GAAGC,OAAO,CAACC,GAAG,CAACT,aAAa,CAAC;EACzC,IAAIO,MAAM,EAAE;IACX,OAAOL,UAAU,CAACK,MAAM,CAAC;EAC1B;EACA,OAAOV,IAAI,CAACD,OAAO,CAAC,CAAC,EAAEG,eAAe,EAAE,OAAO,CAAC;AACjD;AAEA,OAAO,SAASW,eAAeA,CAAA,EAAW;EACzC,OAAOb,IAAI,CAACS,WAAW,CAAC,CAAC,EAAE,eAAe,CAAC;AAC5C;AAEA,OAAO,SAASK,WAAWA,CAAA,EAAW;EACrC,OAAOd,IAAI,CAACS,WAAW,CAAC,CAAC,EAAE,WAAW,CAAC;AACxC;AAEA,OAAO,SAASM,gBAAgBA,CAAA,EAAW;EAC1C,OAAOf,IAAI,CAACS,WAAW,CAAC,CAAC,EAAE,gBAAgB,CAAC;AAC7C;AAEA,OAAO,SAASO,eAAeA,CAAA,EAAW;EACzC,OAAOhB,IAAI,CAACS,WAAW,CAAC,CAAC,EAAE,eAAe,CAAC;AAC5C;AAEA,OAAO,SAASQ,YAAYA,CAACC,QAAgB,GAAGT,WAAW,CAAC,CAAC,EAAU;EACtE,OAAOT,IAAI,CAACkB,QAAQ,EAAE,QAAQ,CAAC;AAChC;AAEA,OAAO,SAASC,cAAcA,CAAA,EAAW;EACxC,MAAMD,QAAQ,GAAGT,WAAW,CAAC,CAAC;EAC9B,IAAI,CAACZ,UAAU,CAACqB,QAAQ,CAAC,EAAE;IAC1BpB,SAAS,CAACoB,QAAQ,EAAE;MAAEE,SAAS,EAAE;IAAK,CAAC,CAAC;EACzC;EACA,OAAOF,QAAQ;AAChB","ignoreList":[]}
|
package/dist/main.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["chalk","appendFileSync","spawnSync","fileURLToPath","APP_NAME","ensureAgentDir","getAuthPath","getProvidersPath","getSettingsPath","ProviderProfileService","runOnboarding","writeStartupErrorLog","label","error","agentDir","details","Error","stack","message","String","Date","toISOString","isBunRuntime","process","versions","bun","hasBunAvailable","result","stdio","shell","platform","status","resolveBunPreloadPath","resolved","import","meta","resolve","startsWith","relaunchInBun","entry","argv","preloadPath","child","slice","env","printHelp","console","log","printVersion","printBootstrapSummary","providerProfiles","ensureStorage","profiles","listProfiles","activeSelection","getActiveSelection","cyanBright","bold","length","profileId","dim","main","args","includes","stdin","isTTY","stdout","yellow","savedProfile","greenBright","exitCode","runWepscliShell","red","WEPSCLI_DISABLE_FALLBACK","runWorkbench","fallbackError"],"sources":["main.ts"],"sourcesContent":["import chalk from \"chalk\";\nimport { appendFileSync } from \"node:fs\";\nimport { spawnSync } from \"node:child_process\";\nimport { fileURLToPath } from \"node:url\";\nimport { APP_NAME, ensureAgentDir, getAgentDir, getAuthPath, getProvidersPath, getSettingsPath } from \"./config.js\";\nimport { ProviderProfileService } from \"./provider-profiles/index.js\";\nimport { runOnboarding } from \"./onboarding/run-onboarding.js\";\n\r\nfunction writeStartupErrorLog(label: string, error: unknown): void {\r\n\ttry {\r\n\t\tconst agentDir = ensureAgentDir();\r\n\t\tconst details = error instanceof Error ? error.stack ?? error.message : String(error);\r\n\t\tappendFileSync(`${agentDir}\\\\startup-error.log`, `[${new Date().toISOString()}] ${label}\\n${details}\\n\\n`, \"utf8\");\r\n\t} catch {}\r\n}\r\n\r\nfunction isBunRuntime(): boolean {\r\n\treturn typeof process.versions.bun === \"string\";\r\n}\r\n\r\nfunction hasBunAvailable(): boolean {\n\tconst result = spawnSync(\"bun\", [\"--version\"], {\n\t\tstdio: \"ignore\",\n\t\tshell: process.platform === \"win32\",\n\t});\n\treturn result.status === 0;\n}\n\nasync function resolveBunPreloadPath(): Promise<string> {\n\tconst resolved = await import.meta.resolve(\"@opentui/solid/preload\");\n\treturn resolved.startsWith(\"file:\") ? fileURLToPath(resolved) : resolved;\n}\n\nasync function relaunchInBun(): Promise<number | null> {\n\tconst entry = process.argv[1];\n\tif (!entry) {\n\t\treturn null;\n\t}\n\n\tconst preloadPath = await resolveBunPreloadPath();\n\tconst child = spawnSync(\"bun\", [\"--conditions=browser\", \"--preload\", preloadPath, entry, ...process.argv.slice(2)], {\n\t\tstdio: \"inherit\",\n\t\tenv: process.env,\n\t\tshell: process.platform === \"win32\",\n\t});\n\r\n\tif (typeof child.status === \"number\") {\r\n\t\treturn child.status;\r\n\t}\r\n\tif (child.error) {\r\n\t\tthrow child.error;\r\n\t}\r\n\treturn 0;\r\n}\r\n\r\nfunction printHelp(): void {\r\n\tconsole.log(`${APP_NAME} - TUI-first coding agent CLI\r\n\r\nUsage:\r\n ${APP_NAME}\r\n ${APP_NAME} --help\r\n ${APP_NAME} --version\r\n\r\nCurrent status:\r\n Provider profiles and onboarding are implemented.\r\n The current shell direction is the OpenTUI-based WEPSCLI-shell rebuild.\r\n Interactive shell launch now prefers Bun automatically when it is available.\r\n`);\r\n}\r\n\r\nfunction printVersion(): void {\r\n\tconsole.log(\"0.1.0\");\r\n}\r\n\r\nfunction printBootstrapSummary(): void {\r\n\tconst agentDir = ensureAgentDir();\r\n\tconst providerProfiles = new ProviderProfileService();\r\n\tproviderProfiles.ensureStorage();\r\n\tconst profiles = providerProfiles.listProfiles();\r\n\tconst activeSelection = providerProfiles.getActiveSelection();\r\n\r\n\tconsole.log(chalk.cyanBright(\"WEPSCLI bootstrap is ready.\"));\r\n\tconsole.log();\r\n\tconsole.log(`${chalk.bold(\"Agent dir:\")} ${agentDir}`);\r\n\tconsole.log(`${chalk.bold(\"Settings:\")} ${getSettingsPath()}`);\r\n\tconsole.log(`${chalk.bold(\"Auth:\")} ${getAuthPath()}`);\r\n\tconsole.log(`${chalk.bold(\"Providers:\")} ${getProvidersPath()}`);\r\n\tconsole.log(`${chalk.bold(\"Profiles:\")} ${profiles.length}`);\r\n\tconsole.log(`${chalk.bold(\"Active:\")} ${activeSelection.profileId ?? \"none\"}`);\r\n\tconsole.log();\r\n\tconsole.log(chalk.dim(\"Next step: use an interactive terminal to complete onboarding or launch the shell.\"));\r\n}\r\n\r\nexport async function main(args: string[]): Promise<void> {\r\n\tif (args.includes(\"--help\") || args.includes(\"-h\")) {\r\n\t\tprintHelp();\r\n\t\treturn;\r\n\t}\r\n\r\n\tif (args.includes(\"--version\") || args.includes(\"-v\")) {\r\n\t\tprintVersion();\r\n\t\treturn;\r\n\t}\r\n\r\n\tconst profiles = new ProviderProfileService();\r\n\tprofiles.ensureStorage();\r\n\r\n\tif (profiles.listProfiles().length === 0) {\r\n\t\tif (!process.stdin.isTTY || !process.stdout.isTTY) {\r\n\t\t\tconsole.log(chalk.yellow(\"WEPSCLI needs an interactive terminal to complete first-run onboarding.\"));\r\n\t\t\tprintBootstrapSummary();\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tconst savedProfile = await runOnboarding(profiles);\r\n\t\tconsole.log(chalk.greenBright(`Saved provider profile: ${savedProfile.label}`));\r\n\t}\r\n\r\n\tif (process.stdin.isTTY && process.stdout.isTTY) {\n\t\tif (!isBunRuntime() && hasBunAvailable()) {\n\t\t\tconst exitCode = await relaunchInBun();\n\t\t\tif (typeof exitCode === \"number\" && exitCode !== 0) {\n\t\t\t\tprocess.exitCode = exitCode;\n\t\t\t}\n\t\t\treturn;\n\t\t}\r\n\r\n\t\ttry {\r\n\t\t\tconst { runWepscliShell } = await import(\"./WEPSCLI-shell/index.js\");\r\n\t\t\tawait runWepscliShell(profiles);\r\n\t\t\treturn;\r\n\t\t} catch (error) {\r\n\t\t\tconst message = error instanceof Error ? error.message : String(error);\r\n\t\t\tconst details = error instanceof Error ? error.stack ?? error.message : String(error);\r\n\t\t\twriteStartupErrorLog(\"WEPSCLI-shell startup error\", error);\r\n\t\t\tconsole.log(chalk.yellow(\"WEPSCLI-shell could not start. Falling back to the temporary shell.\"));\r\n\t\t\tconsole.log(chalk.dim(message));\r\n\t\t\tconsole.error(chalk.red(\"WEPSCLI-shell startup error:\"));\r\n\t\t\tconsole.error(details);\r\n\t\t\tif (process.env.WEPSCLI_DISABLE_FALLBACK === \"1\") {\r\n\t\t\t\tthrow error;\r\n\t\t\t}\r\n\t\t\ttry {\r\n\t\t\t\tconst { runWorkbench } = await import(\"./workbench/index.js\");\r\n\t\t\t\tawait runWorkbench(profiles);\r\n\t\t\t} catch (fallbackError) {\r\n\t\t\t\twriteStartupErrorLog(\"Fallback workbench startup error\", fallbackError);\r\n\t\t\t\tthrow fallbackError;\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn;\r\n\t}\r\n\r\n\tprintBootstrapSummary();\r\n}\r\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"names":["chalk","appendFileSync","spawnSync","fileURLToPath","APP_NAME","ensureAgentDir","getAuthPath","getProvidersPath","getSettingsPath","ProviderProfileService","runOnboarding","writeStartupErrorLog","label","error","agentDir","details","Error","stack","message","String","Date","toISOString","isBunRuntime","process","versions","bun","hasBunAvailable","result","stdio","shell","platform","status","resolveBunPreloadPath","resolved","import","meta","resolve","startsWith","relaunchInBun","entry","argv","preloadPath","child","slice","env","printHelp","console","log","printVersion","printBootstrapSummary","providerProfiles","ensureStorage","profiles","listProfiles","activeSelection","getActiveSelection","cyanBright","bold","length","profileId","dim","main","args","includes","stdin","isTTY","stdout","yellow","savedProfile","greenBright","exitCode","runWepscliShell","red","WEPSCLI_DISABLE_FALLBACK","runWorkbench","fallbackError"],"sources":["main.ts"],"sourcesContent":["import chalk from \"chalk\";\r\nimport { appendFileSync } from \"node:fs\";\r\nimport { spawnSync } from \"node:child_process\";\r\nimport { fileURLToPath } from \"node:url\";\r\nimport { APP_NAME, ensureAgentDir, getAgentDir, getAuthPath, getProvidersPath, getSettingsPath } from \"./config.js\";\r\nimport { ProviderProfileService } from \"./provider-profiles/index.js\";\r\nimport { runOnboarding } from \"./onboarding/run-onboarding.js\";\r\n\r\nfunction writeStartupErrorLog(label: string, error: unknown): void {\r\n\ttry {\r\n\t\tconst agentDir = ensureAgentDir();\r\n\t\tconst details = error instanceof Error ? error.stack ?? error.message : String(error);\r\n\t\tappendFileSync(`${agentDir}\\\\startup-error.log`, `[${new Date().toISOString()}] ${label}\\n${details}\\n\\n`, \"utf8\");\r\n\t} catch {}\r\n}\r\n\r\nfunction isBunRuntime(): boolean {\r\n\treturn typeof process.versions.bun === \"string\";\r\n}\r\n\r\nfunction hasBunAvailable(): boolean {\r\n\tconst result = spawnSync(\"bun\", [\"--version\"], {\r\n\t\tstdio: \"ignore\",\r\n\t\tshell: process.platform === \"win32\",\r\n\t});\r\n\treturn result.status === 0;\r\n}\r\n\r\nasync function resolveBunPreloadPath(): Promise<string> {\r\n\tconst resolved = await import.meta.resolve(\"@opentui/solid/preload\");\r\n\treturn resolved.startsWith(\"file:\") ? fileURLToPath(resolved) : resolved;\r\n}\r\n\r\nasync function relaunchInBun(): Promise<number | null> {\r\n\tconst entry = process.argv[1];\r\n\tif (!entry) {\r\n\t\treturn null;\r\n\t}\r\n\r\n\tconst preloadPath = await resolveBunPreloadPath();\r\n\tconst child = spawnSync(\"bun\", [\"--conditions=browser\", \"--preload\", preloadPath, entry, ...process.argv.slice(2)], {\r\n\t\tstdio: \"inherit\",\r\n\t\tenv: process.env,\r\n\t\tshell: process.platform === \"win32\",\r\n\t});\r\n\r\n\tif (typeof child.status === \"number\") {\r\n\t\treturn child.status;\r\n\t}\r\n\tif (child.error) {\r\n\t\tthrow child.error;\r\n\t}\r\n\treturn 0;\r\n}\r\n\r\nfunction printHelp(): void {\r\n\tconsole.log(`${APP_NAME} - TUI-first coding agent CLI\r\n\r\nUsage:\r\n ${APP_NAME}\r\n ${APP_NAME} --help\r\n ${APP_NAME} --version\r\n\r\nCurrent status:\r\n Provider profiles and onboarding are implemented.\r\n The current shell direction is the OpenTUI-based WEPSCLI-shell rebuild.\r\n Interactive shell launch now prefers Bun automatically when it is available.\r\n`);\r\n}\r\n\r\nfunction printVersion(): void {\r\n\tconsole.log(\"0.1.0\");\r\n}\r\n\r\nfunction printBootstrapSummary(): void {\r\n\tconst agentDir = ensureAgentDir();\r\n\tconst providerProfiles = new ProviderProfileService();\r\n\tproviderProfiles.ensureStorage();\r\n\tconst profiles = providerProfiles.listProfiles();\r\n\tconst activeSelection = providerProfiles.getActiveSelection();\r\n\r\n\tconsole.log(chalk.cyanBright(\"WEPSCLI bootstrap is ready.\"));\r\n\tconsole.log();\r\n\tconsole.log(`${chalk.bold(\"Agent dir:\")} ${agentDir}`);\r\n\tconsole.log(`${chalk.bold(\"Settings:\")} ${getSettingsPath()}`);\r\n\tconsole.log(`${chalk.bold(\"Auth:\")} ${getAuthPath()}`);\r\n\tconsole.log(`${chalk.bold(\"Providers:\")} ${getProvidersPath()}`);\r\n\tconsole.log(`${chalk.bold(\"Profiles:\")} ${profiles.length}`);\r\n\tconsole.log(`${chalk.bold(\"Active:\")} ${activeSelection.profileId ?? \"none\"}`);\r\n\tconsole.log();\r\n\tconsole.log(chalk.dim(\"Next step: use an interactive terminal to complete onboarding or launch the shell.\"));\r\n}\r\n\r\nexport async function main(args: string[]): Promise<void> {\r\n\tif (args.includes(\"--help\") || args.includes(\"-h\")) {\r\n\t\tprintHelp();\r\n\t\treturn;\r\n\t}\r\n\r\n\tif (args.includes(\"--version\") || args.includes(\"-v\")) {\r\n\t\tprintVersion();\r\n\t\treturn;\r\n\t}\r\n\r\n\tconst profiles = new ProviderProfileService();\r\n\tprofiles.ensureStorage();\r\n\r\n\tif (profiles.listProfiles().length === 0) {\r\n\t\tif (!process.stdin.isTTY || !process.stdout.isTTY) {\r\n\t\t\tconsole.log(chalk.yellow(\"WEPSCLI needs an interactive terminal to complete first-run onboarding.\"));\r\n\t\t\tprintBootstrapSummary();\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tconst savedProfile = await runOnboarding(profiles);\r\n\t\tconsole.log(chalk.greenBright(`Saved provider profile: ${savedProfile.label}`));\r\n\t}\r\n\r\n\tif (process.stdin.isTTY && process.stdout.isTTY) {\r\n\t\tif (!isBunRuntime() && hasBunAvailable()) {\r\n\t\t\tconst exitCode = await relaunchInBun();\r\n\t\t\tif (typeof exitCode === \"number\" && exitCode !== 0) {\r\n\t\t\t\tprocess.exitCode = exitCode;\r\n\t\t\t}\r\n\t\t\treturn;\r\n\t\t}\r\n\r\n\t\ttry {\r\n\t\t\tconst { runWepscliShell } = await import(\"./WEPSCLI-shell/index.js\");\r\n\t\t\tawait runWepscliShell(profiles);\r\n\t\t\treturn;\r\n\t\t} catch (error) {\r\n\t\t\tconst message = error instanceof Error ? error.message : String(error);\r\n\t\t\tconst details = error instanceof Error ? error.stack ?? error.message : String(error);\r\n\t\t\twriteStartupErrorLog(\"WEPSCLI-shell startup error\", error);\r\n\t\t\tconsole.log(chalk.yellow(\"WEPSCLI-shell could not start. Falling back to the temporary shell.\"));\r\n\t\t\tconsole.log(chalk.dim(message));\r\n\t\t\tconsole.error(chalk.red(\"WEPSCLI-shell startup error:\"));\r\n\t\t\tconsole.error(details);\r\n\t\t\tif (process.env.WEPSCLI_DISABLE_FALLBACK === \"1\") {\r\n\t\t\t\tthrow error;\r\n\t\t\t}\r\n\t\t\ttry {\r\n\t\t\t\tconst { runWorkbench } = await import(\"./workbench/index.js\");\r\n\t\t\t\tawait runWorkbench(profiles);\r\n\t\t\t} catch (fallbackError) {\r\n\t\t\t\twriteStartupErrorLog(\"Fallback workbench startup error\", fallbackError);\r\n\t\t\t\tthrow fallbackError;\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn;\r\n\t}\r\n\r\n\tprintBootstrapSummary();\r\n}\r\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
import { createComponent as _$createComponent } from "@opentui/solid";
|
|
2
|
+
import { createEffect, createSignal } from "solid-js";
|
|
3
|
+
import { OverlayNotice, OverlayTextInput } from "../WEPSCLI-shell/config-overlays.js";
|
|
4
|
+
import { installSkillFromPath } from "./skill-service.js";
|
|
5
|
+
export function createSkillAddFlow(options) {
|
|
6
|
+
const [active, setActive] = createSignal(false);
|
|
7
|
+
const [pathValue, setPathValue] = createSignal("");
|
|
8
|
+
const [error, setError] = createSignal(undefined);
|
|
9
|
+
const [installing, setInstalling] = createSignal(false);
|
|
10
|
+
let inputRef;
|
|
11
|
+
createEffect(() => {
|
|
12
|
+
if (active() && !installing()) {
|
|
13
|
+
setTimeout(() => inputRef?.focus(), 0);
|
|
14
|
+
}
|
|
15
|
+
});
|
|
16
|
+
function reset() {
|
|
17
|
+
setPathValue("");
|
|
18
|
+
setError(undefined);
|
|
19
|
+
setInstalling(false);
|
|
20
|
+
}
|
|
21
|
+
function close() {
|
|
22
|
+
setActive(false);
|
|
23
|
+
reset();
|
|
24
|
+
options.onClose();
|
|
25
|
+
}
|
|
26
|
+
function open() {
|
|
27
|
+
setActive(true);
|
|
28
|
+
reset();
|
|
29
|
+
}
|
|
30
|
+
async function submit(value) {
|
|
31
|
+
const trimmed = value.trim();
|
|
32
|
+
if (!trimmed) {
|
|
33
|
+
setError("Enter a skill directory path or a SKILL.md path.");
|
|
34
|
+
return;
|
|
35
|
+
}
|
|
36
|
+
setInstalling(true);
|
|
37
|
+
setError(undefined);
|
|
38
|
+
try {
|
|
39
|
+
const result = await installSkillFromPath(trimmed, {
|
|
40
|
+
cwd: options.cwd,
|
|
41
|
+
agentDir: options.agentDir
|
|
42
|
+
});
|
|
43
|
+
await options.onInstalled({
|
|
44
|
+
skill: result.skill,
|
|
45
|
+
targetDir: result.targetDir,
|
|
46
|
+
diagnostics: result.diagnostics
|
|
47
|
+
});
|
|
48
|
+
close();
|
|
49
|
+
} catch (installError) {
|
|
50
|
+
setInstalling(false);
|
|
51
|
+
setError(installError instanceof Error ? installError.message : String(installError));
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
return {
|
|
55
|
+
open,
|
|
56
|
+
close,
|
|
57
|
+
isActive: active,
|
|
58
|
+
render: () => !active() ? null : installing() ? _$createComponent(OverlayNotice, {
|
|
59
|
+
title: "Install Skill",
|
|
60
|
+
description: "Copying the skill into the WEPSCLI skills directory and validating it.",
|
|
61
|
+
status: "Installing skill...",
|
|
62
|
+
onClose: () => {}
|
|
63
|
+
}) : _$createComponent(OverlayTextInput, {
|
|
64
|
+
title: "Install Skill",
|
|
65
|
+
description: "Enter a skill directory or SKILL.md path. WEPSCLI will copy the whole skill directory into ~/.wepscli/agent/skills.",
|
|
66
|
+
label: "Skill path",
|
|
67
|
+
get value() {
|
|
68
|
+
return pathValue();
|
|
69
|
+
},
|
|
70
|
+
placeholder: "Example: D:\\\\skills\\\\my-skill or D:\\\\skills\\\\my-skill\\\\SKILL.md",
|
|
71
|
+
get error() {
|
|
72
|
+
return error();
|
|
73
|
+
},
|
|
74
|
+
hint: "Enter install | Esc cancel",
|
|
75
|
+
inputRef: ref => {
|
|
76
|
+
inputRef = ref;
|
|
77
|
+
},
|
|
78
|
+
onInput: nextValue => {
|
|
79
|
+
setPathValue(nextValue);
|
|
80
|
+
setError(undefined);
|
|
81
|
+
},
|
|
82
|
+
onSubmit: nextValue => {
|
|
83
|
+
void submit(nextValue);
|
|
84
|
+
},
|
|
85
|
+
onClose: close
|
|
86
|
+
})
|
|
87
|
+
};
|
|
88
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["createEffect","createSignal","OverlayNotice","OverlayTextInput","installSkillFromPath","createSkillAddFlow","options","active","setActive","pathValue","setPathValue","error","setError","undefined","installing","setInstalling","inputRef","setTimeout","focus","reset","close","onClose","open","submit","value","trimmed","trim","result","cwd","agentDir","onInstalled","skill","targetDir","diagnostics","installError","Error","message","String","isActive","render","_$createComponent","title","description","status","label","placeholder","hint","ref","onInput","nextValue","onSubmit"],"sources":["skill-add-flow.tsx"],"sourcesContent":["import { createEffect, createSignal } from \"solid-js\";\nimport { OverlayNotice, OverlayTextInput } from \"../WEPSCLI-shell/config-overlays.js\";\nimport type { ComposerInputRef } from \"../WEPSCLI-shell/chat-components.js\";\nimport type { ResourceDiagnostic, Skill } from \"./skill-service.js\";\nimport { installSkillFromPath } from \"./skill-service.js\";\n\nexport interface SkillAddFlow {\n\topen: () => void;\n\tclose: () => void;\n\tisActive: () => boolean;\n\trender: () => any;\n}\n\nexport function createSkillAddFlow(options: {\n\tcwd?: string;\n\tagentDir?: string;\n\tonInstalled: (result: { skill: Skill; targetDir: string; diagnostics: ResourceDiagnostic[] }) => Promise<void> | void;\n\tonClose: () => void;\n}): SkillAddFlow {\n\tconst [active, setActive] = createSignal(false);\n\tconst [pathValue, setPathValue] = createSignal(\"\");\n\tconst [error, setError] = createSignal<string | undefined>(undefined);\n\tconst [installing, setInstalling] = createSignal(false);\n\tlet inputRef: ComposerInputRef | undefined;\n\n\tcreateEffect(() => {\n\t\tif (active() && !installing()) {\n\t\t\tsetTimeout(() => inputRef?.focus(), 0);\n\t\t}\n\t});\n\n\tfunction reset(): void {\n\t\tsetPathValue(\"\");\n\t\tsetError(undefined);\n\t\tsetInstalling(false);\n\t}\n\n\tfunction close(): void {\n\t\tsetActive(false);\n\t\treset();\n\t\toptions.onClose();\n\t}\n\n\tfunction open(): void {\n\t\tsetActive(true);\n\t\treset();\n\t}\n\n\tasync function submit(value: string): Promise<void> {\n\t\tconst trimmed = value.trim();\n\t\tif (!trimmed) {\n\t\t\tsetError(\"Enter a skill directory path or a SKILL.md path.\");\n\t\t\treturn;\n\t\t}\n\n\t\t\tsetInstalling(true);\n\t\tsetError(undefined);\n\t\ttry {\n\t\t\tconst result = await installSkillFromPath(trimmed, { cwd: options.cwd, agentDir: options.agentDir });\n\t\t\tawait options.onInstalled({\n\t\t\t\tskill: result.skill,\n\t\t\t\ttargetDir: result.targetDir,\n\t\t\t\tdiagnostics: result.diagnostics,\n\t\t\t});\n\t\t\tclose();\n\t\t} catch (installError) {\n\t\t\tsetInstalling(false);\n\t\t\tsetError(installError instanceof Error ? installError.message : String(installError));\n\t\t}\n\t}\n\n\treturn {\n\t\topen,\n\t\tclose,\n\t\tisActive: active,\n\t\trender: () =>\n\t\t\t!active() ? null : installing() ? (\n\t\t\t\t<OverlayNotice\n\t\t\t\t\ttitle=\"Install Skill\"\n\t\t\t\t\tdescription=\"Copying the skill into the WEPSCLI skills directory and validating it.\"\n\t\t\t\t\tstatus=\"Installing skill...\"\n\t\t\t\t\tonClose={() => {}}\n\t\t\t\t/>\n\t\t\t) : (\n\t\t\t\t<OverlayTextInput\n\t\t\t\t\ttitle=\"Install Skill\"\n\t\t\t\t\tdescription=\"Enter a skill directory or SKILL.md path. WEPSCLI will copy the whole skill directory into ~/.wepscli/agent/skills.\"\n\t\t\t\t\tlabel=\"Skill path\"\n\t\t\t\t\tvalue={pathValue()}\n\t\t\t\t\tplaceholder=\"Example: D:\\\\skills\\\\my-skill or D:\\\\skills\\\\my-skill\\\\SKILL.md\"\n\t\t\t\t\terror={error()}\n\t\t\t\t\thint=\"Enter install | Esc cancel\"\n\t\t\t\t\tinputRef={(ref) => {\n\t\t\t\t\t\tinputRef = ref;\n\t\t\t\t\t}}\n\t\t\t\t\tonInput={(nextValue) => {\n\t\t\t\t\t\tsetPathValue(nextValue);\n\t\t\t\t\t\tsetError(undefined);\n\t\t\t\t\t}}\n\t\t\t\t\tonSubmit={(nextValue) => {\n\t\t\t\t\t\tvoid submit(nextValue);\n\t\t\t\t\t}}\n\t\t\t\t\tonClose={close}\n\t\t\t\t/>\n\t\t\t),\n\t};\n}\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
import { cpSync, existsSync, mkdirSync, rmSync, statSync } from "node:fs";
|
|
2
|
+
import { homedir } from "node:os";
|
|
3
|
+
import { dirname, isAbsolute, join, resolve } from "node:path";
|
|
4
|
+
import { getAgentDir, getSkillsDir } from "../config.js";
|
|
5
|
+
let skillModulePromise;
|
|
6
|
+
async function loadSkillModule() {
|
|
7
|
+
if (!skillModulePromise) {
|
|
8
|
+
skillModulePromise = import("@mariozechner/pi-coding-agent").then(module => module);
|
|
9
|
+
}
|
|
10
|
+
return skillModulePromise;
|
|
11
|
+
}
|
|
12
|
+
function normalizePath(input) {
|
|
13
|
+
const trimmed = input.trim();
|
|
14
|
+
if (trimmed === "~") {
|
|
15
|
+
return homedir();
|
|
16
|
+
}
|
|
17
|
+
if (trimmed.startsWith("~/")) {
|
|
18
|
+
return resolve(homedir(), trimmed.slice(2));
|
|
19
|
+
}
|
|
20
|
+
return trimmed;
|
|
21
|
+
}
|
|
22
|
+
function resolveInputPath(input, cwd) {
|
|
23
|
+
const normalized = normalizePath(input);
|
|
24
|
+
return isAbsolute(normalized) ? normalized : resolve(cwd, normalized);
|
|
25
|
+
}
|
|
26
|
+
function resolveSkillSourceDir(pathValue, cwd) {
|
|
27
|
+
const resolved = resolveInputPath(pathValue, cwd);
|
|
28
|
+
if (!existsSync(resolved)) {
|
|
29
|
+
throw new Error(`Skill path does not exist: ${resolved}`);
|
|
30
|
+
}
|
|
31
|
+
const stats = statSync(resolved);
|
|
32
|
+
if (stats.isDirectory()) {
|
|
33
|
+
if (!existsSync(join(resolved, "SKILL.md"))) {
|
|
34
|
+
throw new Error(`Skill directory must contain SKILL.md: ${resolved}`);
|
|
35
|
+
}
|
|
36
|
+
return resolved;
|
|
37
|
+
}
|
|
38
|
+
if (stats.isFile() && resolved.endsWith("SKILL.md")) {
|
|
39
|
+
return dirname(resolved);
|
|
40
|
+
}
|
|
41
|
+
throw new Error(`Path must point to a skill directory or SKILL.md: ${resolved}`);
|
|
42
|
+
}
|
|
43
|
+
async function validateSkillSource(sourceDir) {
|
|
44
|
+
const result = (await loadSkillModule()).loadSkillsFromDir({
|
|
45
|
+
dir: sourceDir,
|
|
46
|
+
source: "path"
|
|
47
|
+
});
|
|
48
|
+
const skill = result.skills.find(item => resolve(item.filePath) === resolve(join(sourceDir, "SKILL.md")));
|
|
49
|
+
if (!skill) {
|
|
50
|
+
const detail = result.diagnostics[0]?.message;
|
|
51
|
+
throw new Error(detail ? `Skill validation failed: ${detail}` : `No valid skill found in ${sourceDir}`);
|
|
52
|
+
}
|
|
53
|
+
return {
|
|
54
|
+
skill,
|
|
55
|
+
diagnostics: result.diagnostics
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
export async function listInstalledSkills(agentDir = getAgentDir()) {
|
|
59
|
+
return (await loadSkillModule()).loadSkillsFromDir({
|
|
60
|
+
dir: getSkillsDir(agentDir),
|
|
61
|
+
source: "user"
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
export async function formatInstalledSkillsSummary(agentDir = getAgentDir()) {
|
|
65
|
+
const result = await listInstalledSkills(agentDir);
|
|
66
|
+
if (result.skills.length === 0 && result.diagnostics.length === 0) {
|
|
67
|
+
return `No skills are installed in ${getSkillsDir(agentDir)}.`;
|
|
68
|
+
}
|
|
69
|
+
const lines = [`Installed skills (${result.skills.length}):`];
|
|
70
|
+
for (const skill of result.skills) {
|
|
71
|
+
lines.push(`- ${skill.name} | ${skill.filePath}`);
|
|
72
|
+
lines.push(` ${skill.description}`);
|
|
73
|
+
}
|
|
74
|
+
if (result.diagnostics.length > 0) {
|
|
75
|
+
lines.push("");
|
|
76
|
+
lines.push("Diagnostics:");
|
|
77
|
+
for (const diagnostic of result.diagnostics) {
|
|
78
|
+
lines.push(`- ${diagnostic.type}: ${diagnostic.message}${diagnostic.path ? ` | ${diagnostic.path}` : ""}`);
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
return lines.join("\n");
|
|
82
|
+
}
|
|
83
|
+
export async function installSkillFromPath(pathValue, options = {}) {
|
|
84
|
+
const cwd = options.cwd ?? process.cwd();
|
|
85
|
+
const agentDir = options.agentDir ?? getAgentDir();
|
|
86
|
+
const sourceDir = resolveSkillSourceDir(pathValue, cwd);
|
|
87
|
+
const {
|
|
88
|
+
skill,
|
|
89
|
+
diagnostics
|
|
90
|
+
} = await validateSkillSource(sourceDir);
|
|
91
|
+
const skillsDir = getSkillsDir(agentDir);
|
|
92
|
+
const targetDir = join(skillsDir, skill.name);
|
|
93
|
+
mkdirSync(skillsDir, {
|
|
94
|
+
recursive: true
|
|
95
|
+
});
|
|
96
|
+
if (existsSync(targetDir)) {
|
|
97
|
+
throw new Error(`A skill named ${skill.name} is already installed at ${targetDir}`);
|
|
98
|
+
}
|
|
99
|
+
let copied = false;
|
|
100
|
+
try {
|
|
101
|
+
cpSync(sourceDir, targetDir, {
|
|
102
|
+
recursive: true,
|
|
103
|
+
force: false,
|
|
104
|
+
errorOnExist: true
|
|
105
|
+
});
|
|
106
|
+
copied = true;
|
|
107
|
+
const installed = await validateSkillSource(targetDir);
|
|
108
|
+
return {
|
|
109
|
+
skill: installed.skill,
|
|
110
|
+
sourceDir,
|
|
111
|
+
targetDir,
|
|
112
|
+
diagnostics: [...diagnostics, ...installed.diagnostics]
|
|
113
|
+
};
|
|
114
|
+
} catch (error) {
|
|
115
|
+
if (copied) {
|
|
116
|
+
rmSync(targetDir, {
|
|
117
|
+
recursive: true,
|
|
118
|
+
force: true
|
|
119
|
+
});
|
|
120
|
+
}
|
|
121
|
+
throw error;
|
|
122
|
+
}
|
|
123
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["cpSync","existsSync","mkdirSync","rmSync","statSync","homedir","dirname","isAbsolute","join","resolve","getAgentDir","getSkillsDir","skillModulePromise","loadSkillModule","then","module","normalizePath","input","trimmed","trim","startsWith","slice","resolveInputPath","cwd","normalized","resolveSkillSourceDir","pathValue","resolved","Error","stats","isDirectory","isFile","endsWith","validateSkillSource","sourceDir","result","loadSkillsFromDir","dir","source","skill","skills","find","item","filePath","detail","diagnostics","message","listInstalledSkills","agentDir","formatInstalledSkillsSummary","length","lines","push","name","description","diagnostic","type","path","installSkillFromPath","options","process","skillsDir","targetDir","recursive","copied","force","errorOnExist","installed","error"],"sources":["skill-service.ts"],"sourcesContent":["import { cpSync, existsSync, mkdirSync, rmSync, statSync } from \"node:fs\";\nimport { homedir } from \"node:os\";\nimport { dirname, isAbsolute, join, resolve } from \"node:path\";\nimport { getAgentDir, getSkillsDir } from \"../config.js\";\n\nexport interface ResourceDiagnostic {\n\ttype: string;\n\tmessage: string;\n\tpath?: string;\n}\n\nexport interface Skill {\n\tname: string;\n\tdescription: string;\n\tfilePath: string;\n\tbaseDir: string;\n\tsource: string;\n\tdisableModelInvocation: boolean;\n}\n\nexport interface LoadSkillsResult {\n\tskills: Skill[];\n\tdiagnostics: ResourceDiagnostic[];\n}\n\nexport interface InstalledSkillResult {\n\tskill: Skill;\n\tsourceDir: string;\n\ttargetDir: string;\n\tdiagnostics: ResourceDiagnostic[];\n}\n\ntype CodingAgentSkillModule = {\n\tloadSkillsFromDir(options: { dir: string; source: string }): LoadSkillsResult;\n};\n\nlet skillModulePromise: Promise<CodingAgentSkillModule> | undefined;\n\nasync function loadSkillModule(): Promise<CodingAgentSkillModule> {\n\tif (!skillModulePromise) {\n\t\tskillModulePromise = import(\"@mariozechner/pi-coding-agent\").then((module) => module as unknown as CodingAgentSkillModule);\n\t}\n\treturn skillModulePromise;\n}\n\nfunction normalizePath(input: string): string {\n\tconst trimmed = input.trim();\n\tif (trimmed === \"~\") {\n\t\treturn homedir();\n\t}\n\tif (trimmed.startsWith(\"~/\")) {\n\t\treturn resolve(homedir(), trimmed.slice(2));\n\t}\n\treturn trimmed;\n}\n\nfunction resolveInputPath(input: string, cwd: string): string {\n\tconst normalized = normalizePath(input);\n\treturn isAbsolute(normalized) ? normalized : resolve(cwd, normalized);\n}\n\nfunction resolveSkillSourceDir(pathValue: string, cwd: string): string {\n\tconst resolved = resolveInputPath(pathValue, cwd);\n\tif (!existsSync(resolved)) {\n\t\tthrow new Error(`Skill path does not exist: ${resolved}`);\n\t}\n\n\tconst stats = statSync(resolved);\n\tif (stats.isDirectory()) {\n\t\tif (!existsSync(join(resolved, \"SKILL.md\"))) {\n\t\t\tthrow new Error(`Skill directory must contain SKILL.md: ${resolved}`);\n\t\t}\n\t\treturn resolved;\n\t}\n\n\tif (stats.isFile() && resolved.endsWith(\"SKILL.md\")) {\n\t\treturn dirname(resolved);\n\t}\n\n\tthrow new Error(`Path must point to a skill directory or SKILL.md: ${resolved}`);\n}\n\nasync function validateSkillSource(sourceDir: string): Promise<{ skill: Skill; diagnostics: ResourceDiagnostic[] }> {\n\tconst result = (await loadSkillModule()).loadSkillsFromDir({ dir: sourceDir, source: \"path\" });\n\tconst skill = result.skills.find((item) => resolve(item.filePath) === resolve(join(sourceDir, \"SKILL.md\")));\n\tif (!skill) {\n\t\tconst detail = result.diagnostics[0]?.message;\n\t\tthrow new Error(detail ? `Skill validation failed: ${detail}` : `No valid skill found in ${sourceDir}`);\n\t}\n\treturn { skill, diagnostics: result.diagnostics };\n}\n\nexport async function listInstalledSkills(agentDir: string = getAgentDir()): Promise<LoadSkillsResult> {\n\treturn (await loadSkillModule()).loadSkillsFromDir({ dir: getSkillsDir(agentDir), source: \"user\" });\n}\n\nexport async function formatInstalledSkillsSummary(agentDir: string = getAgentDir()): Promise<string> {\n\tconst result = await listInstalledSkills(agentDir);\n\tif (result.skills.length === 0 && result.diagnostics.length === 0) {\n\t\treturn `No skills are installed in ${getSkillsDir(agentDir)}.`;\n\t}\n\n\tconst lines = [`Installed skills (${result.skills.length}):`];\n\tfor (const skill of result.skills) {\n\t\tlines.push(`- ${skill.name} | ${skill.filePath}`);\n\t\tlines.push(` ${skill.description}`);\n\t}\n\tif (result.diagnostics.length > 0) {\n\t\tlines.push(\"\");\n\t\tlines.push(\"Diagnostics:\");\n\t\tfor (const diagnostic of result.diagnostics) {\n\t\t\tlines.push(`- ${diagnostic.type}: ${diagnostic.message}${diagnostic.path ? ` | ${diagnostic.path}` : \"\"}`);\n\t\t}\n\t}\n\treturn lines.join(\"\\n\");\n}\n\nexport async function installSkillFromPath(\n\tpathValue: string,\n\toptions: { cwd?: string; agentDir?: string } = {},\n): Promise<InstalledSkillResult> {\n\tconst cwd = options.cwd ?? process.cwd();\n\tconst agentDir = options.agentDir ?? getAgentDir();\n\tconst sourceDir = resolveSkillSourceDir(pathValue, cwd);\n\tconst { skill, diagnostics } = await validateSkillSource(sourceDir);\n\tconst skillsDir = getSkillsDir(agentDir);\n\tconst targetDir = join(skillsDir, skill.name);\n\n\tmkdirSync(skillsDir, { recursive: true });\n\tif (existsSync(targetDir)) {\n\t\tthrow new Error(`A skill named ${skill.name} is already installed at ${targetDir}`);\n\t}\n\n\tlet copied = false;\n\ttry {\n\t\tcpSync(sourceDir, targetDir, { recursive: true, force: false, errorOnExist: true });\n\t\tcopied = true;\n\t\tconst installed = await validateSkillSource(targetDir);\n\t\treturn {\n\t\t\tskill: installed.skill,\n\t\t\tsourceDir,\n\t\t\ttargetDir,\n\t\t\tdiagnostics: [...diagnostics, ...installed.diagnostics],\n\t\t};\n\t} catch (error) {\n\t\tif (copied) {\n\t\t\trmSync(targetDir, { recursive: true, force: true });\n\t\t}\n\t\tthrow error;\n\t}\n}\n"],"mappings":"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","ignoreList":[]}
|