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.
Files changed (43) hide show
  1. package/README.md +9 -8
  2. package/dist/WEPSCLI-shell/agent-runtime-events.js +194 -0
  3. package/dist/WEPSCLI-shell/agent-runtime-events.js.map +1 -0
  4. package/dist/WEPSCLI-shell/agent-runtime-helpers.js +117 -0
  5. package/dist/WEPSCLI-shell/agent-runtime-helpers.js.map +1 -0
  6. package/dist/WEPSCLI-shell/agent-runtime-types.js +1 -0
  7. package/dist/WEPSCLI-shell/agent-runtime-types.js.map +1 -0
  8. package/dist/WEPSCLI-shell/agent-runtime.js +42 -294
  9. package/dist/WEPSCLI-shell/agent-runtime.js.map +1 -1
  10. package/dist/WEPSCLI-shell/approval-overlay.js.map +1 -1
  11. package/dist/WEPSCLI-shell/chat-components.js +13 -6
  12. package/dist/WEPSCLI-shell/chat-components.js.map +1 -1
  13. package/dist/WEPSCLI-shell/file-change-preview.js.map +1 -1
  14. package/dist/WEPSCLI-shell/runtime-recovery.js.map +1 -1
  15. package/dist/WEPSCLI-shell/session-consistency.js +9 -0
  16. package/dist/WEPSCLI-shell/session-consistency.js.map +1 -0
  17. package/dist/WEPSCLI-shell/shell-app.js +169 -259
  18. package/dist/WEPSCLI-shell/shell-app.js.map +1 -1
  19. package/dist/WEPSCLI-shell/shell-keyboard.js +135 -0
  20. package/dist/WEPSCLI-shell/shell-keyboard.js.map +1 -0
  21. package/dist/WEPSCLI-shell/shell-modes.js.map +1 -1
  22. package/dist/WEPSCLI-shell/shell-prompt-controller.js +93 -0
  23. package/dist/WEPSCLI-shell/shell-prompt-controller.js.map +1 -0
  24. package/dist/WEPSCLI-shell/shell-status.js +16 -0
  25. package/dist/WEPSCLI-shell/shell-status.js.map +1 -0
  26. package/dist/WEPSCLI-shell/skill-commands.js +7 -0
  27. package/dist/WEPSCLI-shell/skill-commands.js.map +1 -0
  28. package/dist/WEPSCLI-shell/slash-commands.js +68 -7
  29. package/dist/WEPSCLI-shell/slash-commands.js.map +1 -1
  30. package/dist/WEPSCLI-shell/tool-approval.js.map +1 -1
  31. package/dist/WEPSCLI-shell/tool-diff.js.map +1 -1
  32. package/dist/WEPSCLI-shell/tool-file-changes.js.map +1 -1
  33. package/dist/WEPSCLI-shell/tool-message-detail.js.map +1 -1
  34. package/dist/WEPSCLI-shell/tool-messages.js.map +1 -1
  35. package/dist/WEPSCLI-shell/transcript-panel.js.map +1 -1
  36. package/dist/config.js +3 -0
  37. package/dist/config.js.map +1 -1
  38. package/dist/main.js.map +1 -1
  39. package/dist/skills/skill-add-flow.js +88 -0
  40. package/dist/skills/skill-add-flow.js.map +1 -0
  41. package/dist/skills/skill-service.js +123 -0
  42. package/dist/skills/skill-service.js.map +1 -0
  43. 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":"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","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)) {
@@ -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","ensureAgentDir","agentDir","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 {\r\n\treturn join(getAgentDir(), \"sessions.json\");\r\n}\r\n\r\nexport function ensureAgentDir(): string {\r\n\tconst agentDir = getAgentDir();\r\n\tif (!existsSync(agentDir)) {\r\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,cAAcA,CAAA,EAAW;EACxC,MAAMC,QAAQ,GAAGT,WAAW,CAAC,CAAC;EAC9B,IAAI,CAACZ,UAAU,CAACqB,QAAQ,CAAC,EAAE;IAC1BpB,SAAS,CAACoB,QAAQ,EAAE;MAAEC,SAAS,EAAE;IAAK,CAAC,CAAC;EACzC;EACA,OAAOD,QAAQ;AAChB","ignoreList":[]}
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":"AAAA,OAAOA,KAAK,MAAM,OAAO;AACzB,SAASC,cAAc,QAAQ,SAAS;AACxC,SAASC,SAAS,QAAQ,oBAAoB;AAC9C,SAASC,aAAa,QAAQ,UAAU;AACxC,SAASC,QAAQ,EAAEC,cAAc,EAAeC,WAAW,EAAEC,gBAAgB,EAAEC,eAAe,QAAQ,aAAa;AACnH,SAASC,sBAAsB,QAAQ,8BAA8B;AACrE,SAASC,aAAa,QAAQ,gCAAgC;AAE9D,SAASC,oBAAoBA,CAACC,KAAa,EAAEC,KAAc,EAAQ;EAClE,IAAI;IACH,MAAMC,QAAQ,GAAGT,cAAc,CAAC,CAAC;IACjC,MAAMU,OAAO,GAAGF,KAAK,YAAYG,KAAK,GAAGH,KAAK,CAACI,KAAK,IAAIJ,KAAK,CAACK,OAAO,GAAGC,MAAM,CAACN,KAAK,CAAC;IACrFZ,cAAc,CAAC,GAAGa,QAAQ,qBAAqB,EAAE,IAAI,IAAIM,IAAI,CAAC,CAAC,CAACC,WAAW,CAAC,CAAC,KAAKT,KAAK,KAAKG,OAAO,MAAM,EAAE,MAAM,CAAC;EACnH,CAAC,CAAC,MAAM,CAAC;AACV;AAEA,SAASO,YAAYA,CAAA,EAAY;EAChC,OAAO,OAAOC,OAAO,CAACC,QAAQ,CAACC,GAAG,KAAK,QAAQ;AAChD;AAEA,SAASC,eAAeA,CAAA,EAAY;EACnC,MAAMC,MAAM,GAAGzB,SAAS,CAAC,KAAK,EAAE,CAAC,WAAW,CAAC,EAAE;IAC9C0B,KAAK,EAAE,QAAQ;IACfC,KAAK,EAAEN,OAAO,CAACO,QAAQ,KAAK;EAC7B,CAAC,CAAC;EACF,OAAOH,MAAM,CAACI,MAAM,KAAK,CAAC;AAC3B;AAEA,eAAeC,qBAAqBA,CAAA,EAAoB;EACvD,MAAMC,QAAQ,GAAG,MAAMC,MAAM,CAACC,IAAI,CAACC,OAAO,CAAC,wBAAwB,CAAC;EACpE,OAAOH,QAAQ,CAACI,UAAU,CAAC,OAAO,CAAC,GAAGlC,aAAa,CAAC8B,QAAQ,CAAC,GAAGA,QAAQ;AACzE;AAEA,eAAeK,aAAaA,CAAA,EAA2B;EACtD,MAAMC,KAAK,GAAGhB,OAAO,CAACiB,IAAI,CAAC,CAAC,CAAC;EAC7B,IAAI,CAACD,KAAK,EAAE;IACX,OAAO,IAAI;EACZ;EAEA,MAAME,WAAW,GAAG,MAAMT,qBAAqB,CAAC,CAAC;EACjD,MAAMU,KAAK,GAAGxC,SAAS,CAAC,KAAK,EAAE,CAAC,sBAAsB,EAAE,WAAW,EAAEuC,WAAW,EAAEF,KAAK,EAAE,GAAGhB,OAAO,CAACiB,IAAI,CAACG,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE;IACnHf,KAAK,EAAE,SAAS;IAChBgB,GAAG,EAAErB,OAAO,CAACqB,GAAG;IAChBf,KAAK,EAAEN,OAAO,CAACO,QAAQ,KAAK;EAC7B,CAAC,CAAC;EAEF,IAAI,OAAOY,KAAK,CAACX,MAAM,KAAK,QAAQ,EAAE;IACrC,OAAOW,KAAK,CAACX,MAAM;EACpB;EACA,IAAIW,KAAK,CAAC7B,KAAK,EAAE;IAChB,MAAM6B,KAAK,CAAC7B,KAAK;EAClB;EACA,OAAO,CAAC;AACT;AAEA,SAASgC,SAASA,CAAA,EAAS;EAC1BC,OAAO,CAACC,GAAG,CAAC,GAAG3C,QAAQ;AACxB;AACA;AACA,IAAIA,QAAQ;AACZ,IAAIA,QAAQ;AACZ,IAAIA,QAAQ;AACZ;AACA;AACA;AACA;AACA;AACA,CAAC,CAAC;AACF;AAEA,SAAS4C,YAAYA,CAAA,EAAS;EAC7BF,OAAO,CAACC,GAAG,CAAC,OAAO,CAAC;AACrB;AAEA,SAASE,qBAAqBA,CAAA,EAAS;EACtC,MAAMnC,QAAQ,GAAGT,cAAc,CAAC,CAAC;EACjC,MAAM6C,gBAAgB,GAAG,IAAIzC,sBAAsB,CAAC,CAAC;EACrDyC,gBAAgB,CAACC,aAAa,CAAC,CAAC;EAChC,MAAMC,QAAQ,GAAGF,gBAAgB,CAACG,YAAY,CAAC,CAAC;EAChD,MAAMC,eAAe,GAAGJ,gBAAgB,CAACK,kBAAkB,CAAC,CAAC;EAE7DT,OAAO,CAACC,GAAG,CAAC/C,KAAK,CAACwD,UAAU,CAAC,6BAA6B,CAAC,CAAC;EAC5DV,OAAO,CAACC,GAAG,CAAC,CAAC;EACbD,OAAO,CAACC,GAAG,CAAC,GAAG/C,KAAK,CAACyD,IAAI,CAAC,YAAY,CAAC,IAAI3C,QAAQ,EAAE,CAAC;EACtDgC,OAAO,CAACC,GAAG,CAAC,GAAG/C,KAAK,CAACyD,IAAI,CAAC,WAAW,CAAC,KAAKjD,eAAe,CAAC,CAAC,EAAE,CAAC;EAC/DsC,OAAO,CAACC,GAAG,CAAC,GAAG/C,KAAK,CAACyD,IAAI,CAAC,OAAO,CAAC,SAASnD,WAAW,CAAC,CAAC,EAAE,CAAC;EAC3DwC,OAAO,CAACC,GAAG,CAAC,GAAG/C,KAAK,CAACyD,IAAI,CAAC,YAAY,CAAC,IAAIlD,gBAAgB,CAAC,CAAC,EAAE,CAAC;EAChEuC,OAAO,CAACC,GAAG,CAAC,GAAG/C,KAAK,CAACyD,IAAI,CAAC,WAAW,CAAC,KAAKL,QAAQ,CAACM,MAAM,EAAE,CAAC;EAC7DZ,OAAO,CAACC,GAAG,CAAC,GAAG/C,KAAK,CAACyD,IAAI,CAAC,SAAS,CAAC,OAAOH,eAAe,CAACK,SAAS,IAAI,MAAM,EAAE,CAAC;EACjFb,OAAO,CAACC,GAAG,CAAC,CAAC;EACbD,OAAO,CAACC,GAAG,CAAC/C,KAAK,CAAC4D,GAAG,CAAC,oFAAoF,CAAC,CAAC;AAC7G;AAEA,OAAO,eAAeC,IAAIA,CAACC,IAAc,EAAiB;EACzD,IAAIA,IAAI,CAACC,QAAQ,CAAC,QAAQ,CAAC,IAAID,IAAI,CAACC,QAAQ,CAAC,IAAI,CAAC,EAAE;IACnDlB,SAAS,CAAC,CAAC;IACX;EACD;EAEA,IAAIiB,IAAI,CAACC,QAAQ,CAAC,WAAW,CAAC,IAAID,IAAI,CAACC,QAAQ,CAAC,IAAI,CAAC,EAAE;IACtDf,YAAY,CAAC,CAAC;IACd;EACD;EAEA,MAAMI,QAAQ,GAAG,IAAI3C,sBAAsB,CAAC,CAAC;EAC7C2C,QAAQ,CAACD,aAAa,CAAC,CAAC;EAExB,IAAIC,QAAQ,CAACC,YAAY,CAAC,CAAC,CAACK,MAAM,KAAK,CAAC,EAAE;IACzC,IAAI,CAACnC,OAAO,CAACyC,KAAK,CAACC,KAAK,IAAI,CAAC1C,OAAO,CAAC2C,MAAM,CAACD,KAAK,EAAE;MAClDnB,OAAO,CAACC,GAAG,CAAC/C,KAAK,CAACmE,MAAM,CAAC,yEAAyE,CAAC,CAAC;MACpGlB,qBAAqB,CAAC,CAAC;MACvB;IACD;IACA,MAAMmB,YAAY,GAAG,MAAM1D,aAAa,CAAC0C,QAAQ,CAAC;IAClDN,OAAO,CAACC,GAAG,CAAC/C,KAAK,CAACqE,WAAW,CAAC,2BAA2BD,YAAY,CAACxD,KAAK,EAAE,CAAC,CAAC;EAChF;EAEA,IAAIW,OAAO,CAACyC,KAAK,CAACC,KAAK,IAAI1C,OAAO,CAAC2C,MAAM,CAACD,KAAK,EAAE;IAChD,IAAI,CAAC3C,YAAY,CAAC,CAAC,IAAII,eAAe,CAAC,CAAC,EAAE;MACzC,MAAM4C,QAAQ,GAAG,MAAMhC,aAAa,CAAC,CAAC;MACtC,IAAI,OAAOgC,QAAQ,KAAK,QAAQ,IAAIA,QAAQ,KAAK,CAAC,EAAE;QACnD/C,OAAO,CAAC+C,QAAQ,GAAGA,QAAQ;MAC5B;MACA;IACD;IAEA,IAAI;MACH,MAAM;QAAEC;MAAgB,CAAC,GAAG,MAAM,MAAM,CAAC,0BAA0B,CAAC;MACpE,MAAMA,eAAe,CAACnB,QAAQ,CAAC;MAC/B;IACD,CAAC,CAAC,OAAOvC,KAAK,EAAE;MACf,MAAMK,OAAO,GAAGL,KAAK,YAAYG,KAAK,GAAGH,KAAK,CAACK,OAAO,GAAGC,MAAM,CAACN,KAAK,CAAC;MACtE,MAAME,OAAO,GAAGF,KAAK,YAAYG,KAAK,GAAGH,KAAK,CAACI,KAAK,IAAIJ,KAAK,CAACK,OAAO,GAAGC,MAAM,CAACN,KAAK,CAAC;MACrFF,oBAAoB,CAAC,6BAA6B,EAAEE,KAAK,CAAC;MAC1DiC,OAAO,CAACC,GAAG,CAAC/C,KAAK,CAACmE,MAAM,CAAC,qEAAqE,CAAC,CAAC;MAChGrB,OAAO,CAACC,GAAG,CAAC/C,KAAK,CAAC4D,GAAG,CAAC1C,OAAO,CAAC,CAAC;MAC/B4B,OAAO,CAACjC,KAAK,CAACb,KAAK,CAACwE,GAAG,CAAC,8BAA8B,CAAC,CAAC;MACxD1B,OAAO,CAACjC,KAAK,CAACE,OAAO,CAAC;MACtB,IAAIQ,OAAO,CAACqB,GAAG,CAAC6B,wBAAwB,KAAK,GAAG,EAAE;QACjD,MAAM5D,KAAK;MACZ;MACA,IAAI;QACH,MAAM;UAAE6D;QAAa,CAAC,GAAG,MAAM,MAAM,CAAC,sBAAsB,CAAC;QAC7D,MAAMA,YAAY,CAACtB,QAAQ,CAAC;MAC7B,CAAC,CAAC,OAAOuB,aAAa,EAAE;QACvBhE,oBAAoB,CAAC,kCAAkC,EAAEgE,aAAa,CAAC;QACvE,MAAMA,aAAa;MACpB;IACD;IACA;EACD;EAEA1B,qBAAqB,CAAC,CAAC;AACxB","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":[]}