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
@@ -0,0 +1,93 @@
1
+ import { executeSlashCommand, shouldHandleSlashCommandLocally } from "./slash-commands.js";
2
+ import { applyShellModePrompt } from "./shell-modes.js";
3
+ export function createShellPromptController(options) {
4
+ function pushSystemMessage(sessionId, content, kind = "status") {
5
+ options.pushChatMessage(sessionId, {
6
+ id: `${sessionId}:system:${Date.now()}`,
7
+ role: "system",
8
+ content,
9
+ time: new Date().toLocaleTimeString("en-US", {
10
+ hour: "2-digit",
11
+ minute: "2-digit"
12
+ }),
13
+ kind
14
+ });
15
+ }
16
+ function submitPrompt(session, trimmed) {
17
+ options.ensureSessionTranscript(session.id);
18
+ const selection = options.selectionForSession(session);
19
+ options.updatePromptSession(session, trimmed, selection);
20
+ options.setComposerValue("");
21
+ options.setComposerText("");
22
+ options.focusComposer();
23
+ const promptText = trimmed.startsWith("/skill:") ? trimmed : applyShellModePrompt(options.getCurrentMode(), trimmed);
24
+ options.runtimePrompt(session.id, promptText, selection, session.runtimeSessionFile);
25
+ options.requestRender();
26
+ }
27
+ function retryLastPrompt() {
28
+ const session = options.currentSession() ?? options.startNewSession();
29
+ const lastPrompt = session?.lastPrompt?.trim();
30
+ if (!session || !lastPrompt) {
31
+ pushSystemMessage(options.createdTransientSessionId(), "No previous prompt is available to retry in this session.");
32
+ return;
33
+ }
34
+ submitPrompt(session, lastPrompt);
35
+ }
36
+ function handleComposerSubmit(value) {
37
+ const trimmed = value.trim();
38
+ if (!trimmed) {
39
+ return;
40
+ }
41
+ const session = options.currentSession() ?? options.startNewSession();
42
+ if (!session) {
43
+ return;
44
+ }
45
+ if (trimmed.startsWith("/") && shouldHandleSlashCommandLocally(trimmed)) {
46
+ runSlashCommand(trimmed);
47
+ return;
48
+ }
49
+ submitPrompt(session, trimmed);
50
+ }
51
+ function runSlashCommand(commandId) {
52
+ if (!shouldHandleSlashCommandLocally(commandId)) {
53
+ const session = options.currentSession() ?? options.startNewSession();
54
+ submitPrompt(session, commandId);
55
+ return;
56
+ }
57
+ options.setComposerValue("");
58
+ options.setComposerText("");
59
+ executeSlashCommand(commandId, {
60
+ startNewSession: options.startNewSession,
61
+ retryLastPrompt,
62
+ openSkillAdd: options.openSkillAdd,
63
+ openOverlay: options.openOverlay,
64
+ openProviderAdd: options.openProviderAdd,
65
+ compactCurrentSession: options.compactCurrentSession,
66
+ reloadCurrentSessionResources: options.reloadCurrentSessionResources,
67
+ abortActiveRequest: options.abortActiveRequest,
68
+ setMode: options.applyShellMode,
69
+ getCurrentMode: options.getCurrentMode,
70
+ getStatusSummary: options.getStatusSummary,
71
+ showSkillsSummary: options.showSkillsSummary,
72
+ queuePromptTemplate: (title, prompt, summary) => {
73
+ const session = options.currentSession() ?? options.startNewSession();
74
+ pushSystemMessage(session.id, `${title}: ${summary}`);
75
+ options.setComposerValue(prompt);
76
+ options.setComposerText(prompt);
77
+ options.focusComposer();
78
+ options.setFocusRegionComposer();
79
+ },
80
+ pushTimeline: message => {
81
+ const session = options.currentSession() ?? options.startNewSession();
82
+ pushSystemMessage(session.id, message);
83
+ }
84
+ }, options.getAdditionalSlashCommands?.() ?? []);
85
+ }
86
+ return {
87
+ handleComposerSubmit,
88
+ pushSystemMessage,
89
+ retryLastPrompt,
90
+ runSlashCommand,
91
+ submitPrompt
92
+ };
93
+ }
@@ -0,0 +1 @@
1
+ {"version":3,"names":["executeSlashCommand","shouldHandleSlashCommandLocally","applyShellModePrompt","createShellPromptController","options","pushSystemMessage","sessionId","content","kind","pushChatMessage","id","Date","now","role","time","toLocaleTimeString","hour","minute","submitPrompt","session","trimmed","ensureSessionTranscript","selection","selectionForSession","updatePromptSession","setComposerValue","setComposerText","focusComposer","promptText","startsWith","getCurrentMode","runtimePrompt","runtimeSessionFile","requestRender","retryLastPrompt","currentSession","startNewSession","lastPrompt","trim","createdTransientSessionId","handleComposerSubmit","value","runSlashCommand","commandId","openSkillAdd","openOverlay","openProviderAdd","compactCurrentSession","reloadCurrentSessionResources","abortActiveRequest","setMode","applyShellMode","getStatusSummary","showSkillsSummary","queuePromptTemplate","title","prompt","summary","setFocusRegionComposer","pushTimeline","message","getAdditionalSlashCommands"],"sources":["shell-prompt-controller.ts"],"sourcesContent":["import type { ChatMessage } from \"./chat-components.js\";\nimport type { RuntimeSelection } from \"./agent-runtime.js\";\nimport { executeSlashCommand, shouldHandleSlashCommandLocally } from \"./slash-commands.js\";\nimport { applyShellModePrompt, type ShellModeId } from \"./shell-modes.js\";\nimport type { SlashCommandItem } from \"./types.js\";\n\nexport interface ShellPromptSession {\n\tid: string;\n\ttitle: string;\n\tlastPrompt?: string;\n\truntimeSessionFile?: string;\n}\n\ninterface ShellPromptControllerOptions<TSession extends ShellPromptSession> {\n\tcurrentSession: () => TSession | undefined;\n\tstartNewSession: () => TSession;\n\tcreatedTransientSessionId: () => string;\n\tselectionForSession: (session: TSession) => RuntimeSelection;\n\tensureSessionTranscript: (sessionId: string) => void;\n\tupdatePromptSession: (session: TSession, trimmed: string, selection: RuntimeSelection) => void;\n\tpushChatMessage: (sessionId: string, message: ChatMessage) => void;\n\tsetComposerValue: (value: string) => void;\n\tsetComposerText: (value: string) => void;\n\tfocusComposer: () => void;\n\tsetFocusRegionComposer: () => void;\n\trequestRender: () => void;\n\truntimePrompt: (sessionId: string, text: string, selection: RuntimeSelection, runtimeSessionFile?: string) => void;\n\treloadCurrentSessionResources: () => Promise<void> | void;\n\topenSkillAdd: () => void;\n\topenOverlay: (kind: \"provider\" | \"model\" | \"session\") => void;\n\topenProviderAdd: () => void;\n\tcompactCurrentSession: () => Promise<void> | void;\n\tabortActiveRequest: () => void;\n\tapplyShellMode: (modeId: ShellModeId) => void;\n\tgetCurrentMode: () => ShellModeId;\n\tgetStatusSummary: () => string;\n\tshowSkillsSummary: () => Promise<void> | void;\n\tgetAdditionalSlashCommands?: () => SlashCommandItem[];\n}\n\nexport function createShellPromptController<TSession extends ShellPromptSession>(\n\toptions: ShellPromptControllerOptions<TSession>,\n) {\n\tfunction pushSystemMessage(sessionId: string, content: string, kind: ChatMessage[\"kind\"] = \"status\"): void {\n\t\toptions.pushChatMessage(sessionId, {\n\t\t\tid: `${sessionId}:system:${Date.now()}`,\n\t\t\trole: \"system\",\n\t\t\tcontent,\n\t\t\ttime: new Date().toLocaleTimeString(\"en-US\", { hour: \"2-digit\", minute: \"2-digit\" }),\n\t\t\tkind,\n\t\t});\n\t}\n\n\tfunction submitPrompt(session: TSession, trimmed: string): void {\n\t\toptions.ensureSessionTranscript(session.id);\n\t\tconst selection = options.selectionForSession(session);\n\t\toptions.updatePromptSession(session, trimmed, selection);\n\t\toptions.setComposerValue(\"\");\n\t\toptions.setComposerText(\"\");\n\t\toptions.focusComposer();\n\t\tconst promptText = trimmed.startsWith(\"/skill:\") ? trimmed : applyShellModePrompt(options.getCurrentMode(), trimmed);\n\t\toptions.runtimePrompt(session.id, promptText, selection, session.runtimeSessionFile);\n\t\toptions.requestRender();\n\t}\n\n\tfunction retryLastPrompt(): void {\n\t\tconst session = options.currentSession() ?? options.startNewSession();\n\t\tconst lastPrompt = session?.lastPrompt?.trim();\n\t\tif (!session || !lastPrompt) {\n\t\t\tpushSystemMessage(options.createdTransientSessionId(), \"No previous prompt is available to retry in this session.\");\n\t\t\treturn;\n\t\t}\n\t\tsubmitPrompt(session, lastPrompt);\n\t}\n\n\tfunction handleComposerSubmit(value: string): void {\n\t\tconst trimmed = value.trim();\n\t\tif (!trimmed) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst session = options.currentSession() ?? options.startNewSession();\n\t\tif (!session) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (trimmed.startsWith(\"/\") && shouldHandleSlashCommandLocally(trimmed)) {\n\t\t\trunSlashCommand(trimmed);\n\t\t\treturn;\n\t\t}\n\n\t\tsubmitPrompt(session, trimmed);\n\t}\n\n\tfunction runSlashCommand(commandId: string): void {\n\t\tif (!shouldHandleSlashCommandLocally(commandId)) {\n\t\t\tconst session = options.currentSession() ?? options.startNewSession();\n\t\t\tsubmitPrompt(session, commandId);\n\t\t\treturn;\n\t\t}\n\t\toptions.setComposerValue(\"\");\n\t\toptions.setComposerText(\"\");\n\t\texecuteSlashCommand(commandId, {\n\t\t\tstartNewSession: options.startNewSession,\n\t\t\tretryLastPrompt,\n\t\t\topenSkillAdd: options.openSkillAdd,\n\t\t\topenOverlay: options.openOverlay,\n\t\t\topenProviderAdd: options.openProviderAdd,\n\t\t\tcompactCurrentSession: options.compactCurrentSession,\n\t\t\treloadCurrentSessionResources: options.reloadCurrentSessionResources,\n\t\t\tabortActiveRequest: options.abortActiveRequest,\n\t\t\tsetMode: options.applyShellMode,\n\t\t\tgetCurrentMode: options.getCurrentMode,\n\t\t\tgetStatusSummary: options.getStatusSummary,\n\t\t\tshowSkillsSummary: options.showSkillsSummary,\n\t\t\tqueuePromptTemplate: (title, prompt, summary) => {\n\t\t\t\tconst session = options.currentSession() ?? options.startNewSession();\n\t\t\t\tpushSystemMessage(session.id, `${title}: ${summary}`);\n\t\t\t\toptions.setComposerValue(prompt);\n\t\t\t\toptions.setComposerText(prompt);\n\t\t\t\toptions.focusComposer();\n\t\t\t\toptions.setFocusRegionComposer();\n\t\t\t},\n\t\t\tpushTimeline: (message) => {\n\t\t\t\tconst session = options.currentSession() ?? options.startNewSession();\n\t\t\t\tpushSystemMessage(session.id, message);\n\t\t\t},\n\t\t}, options.getAdditionalSlashCommands?.() ?? []);\n\t}\n\n\treturn {\n\t\thandleComposerSubmit,\n\t\tpushSystemMessage,\n\t\tretryLastPrompt,\n\t\trunSlashCommand,\n\t\tsubmitPrompt,\n\t};\n}\n"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,16 @@
1
+ import { runtimeStateTone } from "./runtime-status.js";
2
+ import { wepscliShellTheme as theme } from "./theme.js";
3
+ export function runtimeStatusColor(state) {
4
+ switch (runtimeStateTone(state)) {
5
+ case "accent":
6
+ return theme.accent;
7
+ case "warning":
8
+ return theme.warning;
9
+ case "danger":
10
+ return theme.danger;
11
+ case "success":
12
+ return theme.success;
13
+ case "muted":
14
+ return theme.muted;
15
+ }
16
+ }
@@ -0,0 +1 @@
1
+ {"version":3,"names":["runtimeStateTone","wepscliShellTheme","theme","runtimeStatusColor","state","accent","warning","danger","success","muted"],"sources":["shell-status.ts"],"sourcesContent":["import { runtimeStateTone, type RuntimeSessionState } from \"./runtime-status.js\";\nimport { wepscliShellTheme as theme } from \"./theme.js\";\n\nexport function runtimeStatusColor(state: RuntimeSessionState): string {\n\tswitch (runtimeStateTone(state)) {\n\t\tcase \"accent\":\n\t\t\treturn theme.accent;\n\t\tcase \"warning\":\n\t\t\treturn theme.warning;\n\t\tcase \"danger\":\n\t\t\treturn theme.danger;\n\t\tcase \"success\":\n\t\t\treturn theme.success;\n\t\tcase \"muted\":\n\t\t\treturn theme.muted;\n\t}\n}\n"],"mappings":"AAAA,SAASA,gBAAgB,QAAkC,qBAAqB;AAChF,SAASC,iBAAiB,IAAIC,KAAK,QAAQ,YAAY;AAEvD,OAAO,SAASC,kBAAkBA,CAACC,KAA0B,EAAU;EACtE,QAAQJ,gBAAgB,CAACI,KAAK,CAAC;IAC9B,KAAK,QAAQ;MACZ,OAAOF,KAAK,CAACG,MAAM;IACpB,KAAK,SAAS;MACb,OAAOH,KAAK,CAACI,OAAO;IACrB,KAAK,QAAQ;MACZ,OAAOJ,KAAK,CAACK,MAAM;IACpB,KAAK,SAAS;MACb,OAAOL,KAAK,CAACM,OAAO;IACrB,KAAK,OAAO;MACX,OAAON,KAAK,CAACO,KAAK;EACpB;AACD","ignoreList":[]}
@@ -0,0 +1,7 @@
1
+ export function buildSkillSlashCommands(skills) {
2
+ return skills.map(skill => ({
3
+ id: `/skill:${skill.name}`,
4
+ label: `/skill:${skill.name}`,
5
+ description: skill.description
6
+ }));
7
+ }
@@ -0,0 +1 @@
1
+ {"version":3,"names":["buildSkillSlashCommands","skills","map","skill","id","name","label","description"],"sources":["skill-commands.ts"],"sourcesContent":["import type { SlashCommandItem } from \"./types.js\";\nimport type { Skill } from \"../skills/skill-service.js\";\n\nexport function buildSkillSlashCommands(skills: Skill[]): SlashCommandItem[] {\n\treturn skills.map((skill) => ({\n\t\tid: `/skill:${skill.name}`,\n\t\tlabel: `/skill:${skill.name}`,\n\t\tdescription: skill.description,\n\t}));\n}\n"],"mappings":"AAGA,OAAO,SAASA,uBAAuBA,CAACC,MAAe,EAAsB;EAC5E,OAAOA,MAAM,CAACC,GAAG,CAAEC,KAAK,KAAM;IAC7BC,EAAE,EAAE,UAAUD,KAAK,CAACE,IAAI,EAAE;IAC1BC,KAAK,EAAE,UAAUH,KAAK,CAACE,IAAI,EAAE;IAC7BE,WAAW,EAAEJ,KAAK,CAACI;EACpB,CAAC,CAAC,CAAC;AACJ","ignoreList":[]}
@@ -9,6 +9,27 @@ const ALL_SLASH_COMMANDS = [{
9
9
  label: "/clear",
10
10
  description: "Start a fresh session immediately",
11
11
  keyHint: "l"
12
+ }, {
13
+ id: "/retry",
14
+ label: "/retry",
15
+ description: "Resend the last prompt in the current session",
16
+ keyHint: "y"
17
+ }, {
18
+ id: "/skills",
19
+ label: "/skills",
20
+ description: "List installed skills and validation diagnostics"
21
+ }, {
22
+ id: "/skills reload",
23
+ label: "/skills reload",
24
+ description: "Reload skills, prompts, and extensions for the current session"
25
+ }, {
26
+ id: "/skill add",
27
+ label: "/skill add",
28
+ description: "Install a skill into WEPSCLI from a local path"
29
+ }, {
30
+ id: "/provider",
31
+ label: "/provider",
32
+ description: "Open the provider picker"
12
33
  }, {
13
34
  id: "/providers",
14
35
  label: "/providers",
@@ -19,11 +40,19 @@ const ALL_SLASH_COMMANDS = [{
19
40
  label: "/provider add",
20
41
  description: "Open the guided provider setup flow",
21
42
  keyHint: "a"
43
+ }, {
44
+ id: "/model",
45
+ label: "/model",
46
+ description: "Open the model picker"
22
47
  }, {
23
48
  id: "/models",
24
49
  label: "/models",
25
50
  description: "Open the model picker",
26
51
  keyHint: "m"
52
+ }, {
53
+ id: "/session",
54
+ label: "/session",
55
+ description: "Open the session picker"
27
56
  }, {
28
57
  id: "/sessions",
29
58
  label: "/sessions",
@@ -67,35 +96,67 @@ const ALL_SLASH_COMMANDS = [{
67
96
  label: "/provider-check",
68
97
  description: "Queue a provider verification task"
69
98
  }, ...buildShellModeSlashCommands()];
70
- function helpSummary() {
71
- const lines = ["Available slash commands:", ...ALL_SLASH_COMMANDS.map(command => `${command.id} - ${command.description}`), "", "Type / to browse the full command list from the composer."];
99
+ function mergeSlashCommands(additionalCommands = []) {
100
+ const merged = [...ALL_SLASH_COMMANDS];
101
+ for (const command of additionalCommands) {
102
+ if (!merged.some(item => item.id === command.id)) {
103
+ merged.push(command);
104
+ }
105
+ }
106
+ return merged;
107
+ }
108
+ function helpSummary(additionalCommands = []) {
109
+ const commands = mergeSlashCommands(additionalCommands);
110
+ const lines = ["Available slash commands:", ...commands.map(command => `${command.id} - ${command.description}`), "", "Type / to browse the full command list from the composer."];
72
111
  return lines.join("\n");
73
112
  }
74
- export function getSlashCommands(query) {
113
+ export function getSlashCommands(query, additionalCommands = []) {
114
+ const commands = mergeSlashCommands(additionalCommands);
75
115
  const trimmed = query.trim().toLowerCase();
76
116
  if (!trimmed.startsWith("/")) {
77
117
  return [];
78
118
  }
79
119
  if (trimmed === "/") {
80
- return ALL_SLASH_COMMANDS;
120
+ return commands;
81
121
  }
82
- return ALL_SLASH_COMMANDS.filter(command => command.id.startsWith(trimmed));
122
+ return commands.filter(command => command.id.startsWith(trimmed));
123
+ }
124
+ export function shouldHandleSlashCommandLocally(commandId) {
125
+ return !commandId.startsWith("/skill:");
83
126
  }
84
- export function executeSlashCommand(commandId, handlers) {
127
+ export function shouldInsertSlashCommand(commandId) {
128
+ return commandId.startsWith("/skill:");
129
+ }
130
+ export function executeSlashCommand(commandId, handlers, additionalCommands = []) {
85
131
  switch (commandId) {
86
132
  case "/new":
87
133
  case "/clear":
88
134
  handlers.startNewSession();
89
135
  return;
136
+ case "/retry":
137
+ handlers.retryLastPrompt();
138
+ return;
139
+ case "/skills":
140
+ void handlers.showSkillsSummary();
141
+ return;
142
+ case "/skills reload":
143
+ void handlers.reloadCurrentSessionResources();
144
+ return;
145
+ case "/skill add":
146
+ handlers.openSkillAdd();
147
+ return;
148
+ case "/provider":
90
149
  case "/providers":
91
150
  handlers.openOverlay("provider");
92
151
  return;
93
152
  case "/provider add":
94
153
  handlers.openProviderAdd();
95
154
  return;
155
+ case "/model":
96
156
  case "/models":
97
157
  handlers.openOverlay("model");
98
158
  return;
159
+ case "/session":
99
160
  case "/sessions":
100
161
  case "/resume":
101
162
  handlers.openOverlay("session");
@@ -113,7 +174,7 @@ export function executeSlashCommand(commandId, handlers) {
113
174
  handlers.pushTimeline(handlers.getStatusSummary());
114
175
  return;
115
176
  case "/help":
116
- handlers.pushTimeline(helpSummary());
177
+ handlers.pushTimeline(helpSummary(additionalCommands));
117
178
  return;
118
179
  case "/review":
119
180
  handlers.queuePromptTemplate("Review current change", "Review the current implementation for bugs, regressions, and missing tests. Focus findings first, then summarize the change surface.", "Queued a review-first task from the slash menu.");
@@ -1 +1 @@
1
- {"version":3,"names":["buildShellModeSlashCommands","findShellModeByCommand","shellModeHelpMessage","ALL_SLASH_COMMANDS","id","label","description","keyHint","helpSummary","lines","map","command","join","getSlashCommands","query","trimmed","trim","toLowerCase","startsWith","filter","executeSlashCommand","commandId","handlers","startNewSession","openOverlay","openProviderAdd","compactCurrentSession","pushTimeline","getCurrentMode","abortActiveRequest","getStatusSummary","queuePromptTemplate","mode","setMode"],"sources":["slash-commands.ts"],"sourcesContent":["import type { SlashCommandItem } from \"./types.js\";\nimport { buildShellModeSlashCommands, findShellModeByCommand, shellModeHelpMessage, type ShellModeId } from \"./shell-modes.js\";\n\nconst ALL_SLASH_COMMANDS: SlashCommandItem[] = [\n\t{ id: \"/new\", label: \"/new\", description: \"Stage a new shell session\", keyHint: \"n\" },\n\t{ id: \"/clear\", label: \"/clear\", description: \"Start a fresh session immediately\", keyHint: \"l\" },\n\t{ id: \"/providers\", label: \"/providers\", description: \"Open the provider picker\", keyHint: \"p\" },\n\t{ id: \"/provider add\", label: \"/provider add\", description: \"Open the guided provider setup flow\", keyHint: \"a\" },\n\t{ id: \"/models\", label: \"/models\", description: \"Open the model picker\", keyHint: \"m\" },\n\t{ id: \"/sessions\", label: \"/sessions\", description: \"Open the session picker\", keyHint: \"s\" },\n\t{ id: \"/resume\", label: \"/resume\", description: \"Open the session picker to resume another chat\", keyHint: \"r\" },\n\t{ id: \"/compact\", label: \"/compact\", description: \"Manually compact the current session context\", keyHint: \"c\" },\n\t{ id: \"/stop\", label: \"/stop\", description: \"Interrupt the current request\", keyHint: \".\" },\n\t{ id: \"/status\", label: \"/status\", description: \"Show the current shell/provider/runtime status\", keyHint: \"t\" },\n\t{ id: \"/help\", label: \"/help\", description: \"Show a compact overview of available slash commands\", keyHint: \"h\" },\n\t{ id: \"/review\", label: \"/review\", description: \"Queue a review-first prompt template\" },\n\t{ id: \"/debug\", label: \"/debug\", description: \"Queue a debugging prompt template\" },\n\t{ id: \"/provider-check\", label: \"/provider-check\", description: \"Queue a provider verification task\" },\n\t...buildShellModeSlashCommands(),\n];\n\ninterface SlashHandlers {\n\tstartNewSession: () => void;\n\topenOverlay: (kind: \"provider\" | \"model\" | \"session\") => void;\n\topenProviderAdd: () => void;\n\tcompactCurrentSession: () => Promise<void> | void;\n\tabortActiveRequest: () => void;\n\tsetMode: (modeId: ShellModeId) => void;\n\tgetCurrentMode: () => ShellModeId;\n\tgetStatusSummary: () => string;\n\tqueuePromptTemplate: (title: string, prompt: string, summary: string) => void;\n\tpushTimeline: (message: string) => void;\n}\n\nfunction helpSummary(): string {\n\tconst lines = [\n\t\t\"Available slash commands:\",\n\t\t...ALL_SLASH_COMMANDS.map((command) => `${command.id} - ${command.description}`),\n\t\t\"\",\n\t\t\"Type / to browse the full command list from the composer.\",\n\t];\n\treturn lines.join(\"\\n\");\n}\n\nexport function getSlashCommands(query: string): SlashCommandItem[] {\n\tconst trimmed = query.trim().toLowerCase();\n\tif (!trimmed.startsWith(\"/\")) {\r\n\t\treturn [];\r\n\t}\r\n\tif (trimmed === \"/\") {\r\n\t\treturn ALL_SLASH_COMMANDS;\r\n\t}\r\n\treturn ALL_SLASH_COMMANDS.filter((command) => command.id.startsWith(trimmed));\r\n}\r\n\r\nexport function executeSlashCommand(commandId: string, handlers: SlashHandlers): void {\r\n\tswitch (commandId) {\n\t\tcase \"/new\":\n\t\tcase \"/clear\":\n\t\t\thandlers.startNewSession();\n\t\t\treturn;\n\t\tcase \"/providers\":\n\t\t\thandlers.openOverlay(\"provider\");\n\t\t\treturn;\n\t\tcase \"/provider add\":\r\n\t\t\thandlers.openProviderAdd();\r\n\t\t\treturn;\r\n\t\tcase \"/models\":\n\t\t\thandlers.openOverlay(\"model\");\n\t\t\treturn;\n\t\tcase \"/sessions\":\n\t\tcase \"/resume\":\n\t\t\thandlers.openOverlay(\"session\");\n\t\t\treturn;\n\t\tcase \"/compact\":\n\t\t\tvoid handlers.compactCurrentSession();\n\t\t\treturn;\n\t\tcase \"/mode\":\n\t\t\thandlers.pushTimeline(shellModeHelpMessage(handlers.getCurrentMode()));\n\t\t\treturn;\n\t\tcase \"/stop\":\n\t\t\thandlers.abortActiveRequest();\n\t\t\treturn;\n\t\tcase \"/status\":\n\t\t\thandlers.pushTimeline(handlers.getStatusSummary());\n\t\t\treturn;\n\t\tcase \"/help\":\n\t\t\thandlers.pushTimeline(helpSummary());\n\t\t\treturn;\n\t\tcase \"/review\":\n\t\t\thandlers.queuePromptTemplate(\n\t\t\t\t\"Review current change\",\n\t\t\t\t\"Review the current implementation for bugs, regressions, and missing tests. Focus findings first, then summarize the change surface.\",\r\n\t\t\t\t\"Queued a review-first task from the slash menu.\",\r\n\t\t\t);\r\n\t\t\treturn;\r\n\t\tcase \"/debug\":\r\n\t\t\thandlers.queuePromptTemplate(\r\n\t\t\t\t\"Debug current issue\",\r\n\t\t\t\t\"Investigate the current failure, identify the root cause, implement the minimal correct fix, and verify the result.\",\r\n\t\t\t\t\"Queued a debug-oriented task from the slash menu.\",\r\n\t\t\t);\r\n\t\t\treturn;\r\n\t\tcase \"/provider-check\":\n\t\t\thandlers.queuePromptTemplate(\n\t\t\t\t\"Check provider configuration\",\n\t\t\t\t\"Inspect the current provider and model configuration, confirm the active selection, and note any validation or cache issues that still need work.\",\n\t\t\t\t\"Queued a provider-state inspection task from the slash menu.\",\n\t\t\t);\n\t\t\treturn;\n\t\tdefault:\n\t\t\tconst mode = findShellModeByCommand(commandId);\n\t\t\tif (mode) {\n\t\t\t\thandlers.setMode(mode.id);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\thandlers.pushTimeline(`Unknown slash command: ${commandId}`);\n\t}\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["buildShellModeSlashCommands","findShellModeByCommand","shellModeHelpMessage","ALL_SLASH_COMMANDS","id","label","description","keyHint","mergeSlashCommands","additionalCommands","merged","command","some","item","push","helpSummary","commands","lines","map","join","getSlashCommands","query","trimmed","trim","toLowerCase","startsWith","filter","shouldHandleSlashCommandLocally","commandId","shouldInsertSlashCommand","executeSlashCommand","handlers","startNewSession","retryLastPrompt","showSkillsSummary","reloadCurrentSessionResources","openSkillAdd","openOverlay","openProviderAdd","compactCurrentSession","pushTimeline","getCurrentMode","abortActiveRequest","getStatusSummary","queuePromptTemplate","mode","setMode"],"sources":["slash-commands.ts"],"sourcesContent":["import type { SlashCommandItem } from \"./types.js\";\r\nimport { buildShellModeSlashCommands, findShellModeByCommand, shellModeHelpMessage, type ShellModeId } from \"./shell-modes.js\";\r\n\r\nconst ALL_SLASH_COMMANDS: SlashCommandItem[] = [\n\t{ id: \"/new\", label: \"/new\", description: \"Stage a new shell session\", keyHint: \"n\" },\n\t{ id: \"/clear\", label: \"/clear\", description: \"Start a fresh session immediately\", keyHint: \"l\" },\n\t{ id: \"/retry\", label: \"/retry\", description: \"Resend the last prompt in the current session\", keyHint: \"y\" },\n\t{ id: \"/skills\", label: \"/skills\", description: \"List installed skills and validation diagnostics\" },\n\t{ id: \"/skills reload\", label: \"/skills reload\", description: \"Reload skills, prompts, and extensions for the current session\" },\n\t{ id: \"/skill add\", label: \"/skill add\", description: \"Install a skill into WEPSCLI from a local path\" },\n\t{ id: \"/provider\", label: \"/provider\", description: \"Open the provider picker\" },\n\t{ id: \"/providers\", label: \"/providers\", description: \"Open the provider picker\", keyHint: \"p\" },\n\t{ id: \"/provider add\", label: \"/provider add\", description: \"Open the guided provider setup flow\", keyHint: \"a\" },\n\t{ id: \"/model\", label: \"/model\", description: \"Open the model picker\" },\n\t{ id: \"/models\", label: \"/models\", description: \"Open the model picker\", keyHint: \"m\" },\n\t{ id: \"/session\", label: \"/session\", description: \"Open the session picker\" },\n\t{ id: \"/sessions\", label: \"/sessions\", description: \"Open the session picker\", keyHint: \"s\" },\n\t{ id: \"/resume\", label: \"/resume\", description: \"Open the session picker to resume another chat\", keyHint: \"r\" },\n\t{ id: \"/compact\", label: \"/compact\", description: \"Manually compact the current session context\", keyHint: \"c\" },\r\n\t{ id: \"/stop\", label: \"/stop\", description: \"Interrupt the current request\", keyHint: \".\" },\r\n\t{ id: \"/status\", label: \"/status\", description: \"Show the current shell/provider/runtime status\", keyHint: \"t\" },\r\n\t{ id: \"/help\", label: \"/help\", description: \"Show a compact overview of available slash commands\", keyHint: \"h\" },\r\n\t{ id: \"/review\", label: \"/review\", description: \"Queue a review-first prompt template\" },\r\n\t{ id: \"/debug\", label: \"/debug\", description: \"Queue a debugging prompt template\" },\r\n\t{ id: \"/provider-check\", label: \"/provider-check\", description: \"Queue a provider verification task\" },\r\n\t...buildShellModeSlashCommands(),\r\n];\r\n\r\ninterface SlashHandlers {\n\tstartNewSession: () => void;\n\tretryLastPrompt: () => void;\n\topenSkillAdd: () => void;\n\topenOverlay: (kind: \"provider\" | \"model\" | \"session\") => void;\n\topenProviderAdd: () => void;\n\tcompactCurrentSession: () => Promise<void> | void;\n\treloadCurrentSessionResources: () => Promise<void> | void;\n\tabortActiveRequest: () => void;\n\tsetMode: (modeId: ShellModeId) => void;\n\tgetCurrentMode: () => ShellModeId;\n\tgetStatusSummary: () => string;\n\tshowSkillsSummary: () => Promise<void> | void;\n\tqueuePromptTemplate: (title: string, prompt: string, summary: string) => void;\n\tpushTimeline: (message: string) => void;\n}\n\r\nfunction mergeSlashCommands(additionalCommands: SlashCommandItem[] = []): SlashCommandItem[] {\n\tconst merged = [...ALL_SLASH_COMMANDS];\n\tfor (const command of additionalCommands) {\n\t\tif (!merged.some((item) => item.id === command.id)) {\n\t\t\tmerged.push(command);\n\t\t}\n\t}\n\treturn merged;\n}\n\nfunction helpSummary(additionalCommands: SlashCommandItem[] = []): string {\n\tconst commands = mergeSlashCommands(additionalCommands);\n\tconst lines = [\n\t\t\"Available slash commands:\",\n\t\t...commands.map((command) => `${command.id} - ${command.description}`),\n\t\t\"\",\n\t\t\"Type / to browse the full command list from the composer.\",\n\t];\n\treturn lines.join(\"\\n\");\n}\n\nexport function getSlashCommands(query: string, additionalCommands: SlashCommandItem[] = []): SlashCommandItem[] {\n\tconst commands = mergeSlashCommands(additionalCommands);\n\tconst trimmed = query.trim().toLowerCase();\n\tif (!trimmed.startsWith(\"/\")) {\n\t\treturn [];\n\t}\n\tif (trimmed === \"/\") {\n\t\treturn commands;\n\t}\n\treturn commands.filter((command) => command.id.startsWith(trimmed));\n}\n\nexport function shouldHandleSlashCommandLocally(commandId: string): boolean {\n\treturn !commandId.startsWith(\"/skill:\");\n}\n\nexport function shouldInsertSlashCommand(commandId: string): boolean {\n\treturn commandId.startsWith(\"/skill:\");\n}\n\nexport function executeSlashCommand(commandId: string, handlers: SlashHandlers, additionalCommands: SlashCommandItem[] = []): void {\n\tswitch (commandId) {\n\t\tcase \"/new\":\n\t\tcase \"/clear\":\n\t\t\thandlers.startNewSession();\n\t\t\treturn;\n\t\tcase \"/retry\":\n\t\t\thandlers.retryLastPrompt();\n\t\t\treturn;\n\t\tcase \"/skills\":\n\t\t\tvoid handlers.showSkillsSummary();\n\t\t\treturn;\n\t\tcase \"/skills reload\":\n\t\t\tvoid handlers.reloadCurrentSessionResources();\n\t\t\treturn;\n\t\tcase \"/skill add\":\n\t\t\thandlers.openSkillAdd();\n\t\t\treturn;\n\t\tcase \"/provider\":\n\t\tcase \"/providers\":\n\t\t\thandlers.openOverlay(\"provider\");\n\t\t\treturn;\n\t\tcase \"/provider add\":\n\t\t\thandlers.openProviderAdd();\n\t\t\treturn;\n\t\tcase \"/model\":\n\t\tcase \"/models\":\n\t\t\thandlers.openOverlay(\"model\");\n\t\t\treturn;\n\t\tcase \"/session\":\n\t\tcase \"/sessions\":\n\t\tcase \"/resume\":\n\t\t\thandlers.openOverlay(\"session\");\n\t\t\treturn;\r\n\t\tcase \"/compact\":\r\n\t\t\tvoid handlers.compactCurrentSession();\r\n\t\t\treturn;\r\n\t\tcase \"/mode\":\r\n\t\t\thandlers.pushTimeline(shellModeHelpMessage(handlers.getCurrentMode()));\r\n\t\t\treturn;\r\n\t\tcase \"/stop\":\r\n\t\t\thandlers.abortActiveRequest();\r\n\t\t\treturn;\r\n\t\tcase \"/status\":\r\n\t\t\thandlers.pushTimeline(handlers.getStatusSummary());\r\n\t\t\treturn;\r\n\t\tcase \"/help\":\n\t\t\thandlers.pushTimeline(helpSummary(additionalCommands));\n\t\t\treturn;\n\t\tcase \"/review\":\r\n\t\t\thandlers.queuePromptTemplate(\r\n\t\t\t\t\"Review current change\",\r\n\t\t\t\t\"Review the current implementation for bugs, regressions, and missing tests. Focus findings first, then summarize the change surface.\",\r\n\t\t\t\t\"Queued a review-first task from the slash menu.\",\r\n\t\t\t);\r\n\t\t\treturn;\r\n\t\tcase \"/debug\":\r\n\t\t\thandlers.queuePromptTemplate(\r\n\t\t\t\t\"Debug current issue\",\r\n\t\t\t\t\"Investigate the current failure, identify the root cause, implement the minimal correct fix, and verify the result.\",\r\n\t\t\t\t\"Queued a debug-oriented task from the slash menu.\",\r\n\t\t\t);\r\n\t\t\treturn;\r\n\t\tcase \"/provider-check\":\r\n\t\t\thandlers.queuePromptTemplate(\r\n\t\t\t\t\"Check provider configuration\",\r\n\t\t\t\t\"Inspect the current provider and model configuration, confirm the active selection, and note any validation or cache issues that still need work.\",\r\n\t\t\t\t\"Queued a provider-state inspection task from the slash menu.\",\r\n\t\t\t);\r\n\t\t\treturn;\r\n\t\tdefault:\r\n\t\t\tconst mode = findShellModeByCommand(commandId);\r\n\t\t\tif (mode) {\r\n\t\t\t\thandlers.setMode(mode.id);\r\n\t\t\t\treturn;\r\n\t\t\t}\r\n\t\t\thandlers.pushTimeline(`Unknown slash command: ${commandId}`);\r\n\t}\r\n}\r\n"],"mappings":"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","ignoreList":[]}
@@ -1 +1 @@
1
- {"version":3,"names":["formatToolDiffStats","toolFileChangeLocation","extractToolFileChanges","formatToolArgs","readRecord","args","undefined","readString","record","keys","key","value","trim","readCommand","summarizeFileChange","prefix","change","location","stats","diffStats","classifyToolRisk","toolName","fileChanges","normalized","toLowerCase","command","firstFileChange","riskLabel","reason","summary","commandText","createToolApprovalRequest","id","sessionId","toolCallId","classification","argsText","toolApprovalDecisionReason","decision","request"],"sources":["tool-approval.ts"],"sourcesContent":["import { formatToolDiffStats, toolFileChangeLocation, type ToolFileChange, extractToolFileChanges } from \"./tool-file-changes.js\";\nimport { formatToolArgs } from \"./tool-messages.js\";\n\nexport type ToolApprovalDecision = \"allow\" | \"reject\" | \"cancel\";\n\nexport interface ToolApprovalRequest {\n\tid: string;\n\tsessionId: string;\n\ttoolCallId: string;\n\ttoolName: string;\n\triskLabel: string;\n\treason: string;\n\tsummary: string;\n\targsText: string;\n\tcommandText?: string;\n\tfileChanges: ToolFileChange[];\n}\n\nfunction readRecord(args: unknown): Record<string, unknown> | undefined {\n\treturn typeof args === \"object\" && args !== null ? (args as Record<string, unknown>) : undefined;\n}\n\nfunction readString(record: Record<string, unknown> | undefined, keys: string[]): string | undefined {\n\tif (!record) {\n\t\treturn undefined;\n\t}\n\tfor (const key of keys) {\n\t\tconst value = record[key];\n\t\tif (typeof value === \"string\" && value.trim()) {\n\t\t\treturn value.trim();\n\t\t}\n\t}\n\treturn undefined;\n}\n\nfunction readCommand(args: unknown): string | undefined {\n\treturn readString(readRecord(args), [\"command\", \"cmd\", \"script\"]);\n}\n\nfunction summarizeFileChange(prefix: string, change: ToolFileChange | undefined): string {\n\tif (!change) {\n\t\treturn prefix;\n\t}\n\n\tconst location = toolFileChangeLocation(change);\n\tconst stats = formatToolDiffStats(change.diffStats);\n\treturn `${prefix} ${location}${stats ? ` (${stats})` : \"\"}`;\n}\n\nfunction classifyToolRisk(\n\ttoolName: string,\n\targs: unknown,\n\tfileChanges: ToolFileChange[],\n): {\n\triskLabel: string;\n\treason: string;\n\tsummary: string;\n\tcommandText?: string;\n} | undefined {\n\tconst normalized = toolName.toLowerCase();\n\tconst command = readCommand(args);\n\tconst firstFileChange = fileChanges[0];\n\n\tif (normalized === \"bash\" || normalized === \"shell_command\" || normalized === \"shell\" || normalized === \"exec\") {\n\t\treturn {\n\t\t\triskLabel: \"SHELL COMMAND\",\n\t\t\treason: \"This command can execute arbitrary shell operations in the workspace.\",\n\t\t\tsummary: command ? \"Run a shell command in the workspace.\" : \"Run a shell command with arbitrary side effects.\",\n\t\t\tcommandText: command,\n\t\t};\n\t}\n\n\tif (normalized === \"write\" || normalized === \"write_file\") {\n\t\treturn {\n\t\t\triskLabel: \"FILE WRITE\",\n\t\t\treason: \"This tool will create or overwrite a file on disk.\",\n\t\t\tsummary: summarizeFileChange(\"Write\", firstFileChange),\n\t\t};\n\t}\n\n\tif (normalized === \"edit\" || normalized === \"edit_file\" || normalized === \"apply_patch\" || normalized === \"patch\") {\n\t\treturn {\n\t\t\triskLabel: \"FILE EDIT\",\n\t\t\treason: \"This tool will modify existing file contents on disk.\",\n\t\t\tsummary: summarizeFileChange(\"Edit\", firstFileChange),\n\t\t};\n\t}\n\n\treturn undefined;\n}\n\nexport function createToolApprovalRequest(\n\tid: string,\n\tsessionId: string,\n\ttoolCallId: string,\n\ttoolName: string,\n\targs: unknown,\n): ToolApprovalRequest | undefined {\n\tconst fileChanges = extractToolFileChanges(toolName, args, undefined);\n\tconst classification = classifyToolRisk(toolName, args, fileChanges);\n\tif (!classification) {\n\t\treturn undefined;\n\t}\n\n\treturn {\n\t\tid,\n\t\tsessionId,\n\t\ttoolCallId,\n\t\ttoolName,\n\t\triskLabel: classification.riskLabel,\n\t\treason: classification.reason,\n\t\tsummary: classification.summary,\n\t\targsText: formatToolArgs(args),\n\t\tcommandText: classification.commandText,\n\t\tfileChanges,\n\t};\n}\n\nexport function toolApprovalDecisionReason(decision: ToolApprovalDecision, request: ToolApprovalRequest): string {\n\tswitch (decision) {\n\t\tcase \"allow\":\n\t\t\treturn \"\";\n\t\tcase \"reject\":\n\t\t\treturn `${request.toolName} was rejected by the user before execution.`;\n\t\tcase \"cancel\":\n\t\t\treturn `${request.toolName} approval was cancelled before execution.`;\n\t}\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["formatToolDiffStats","toolFileChangeLocation","extractToolFileChanges","formatToolArgs","readRecord","args","undefined","readString","record","keys","key","value","trim","readCommand","summarizeFileChange","prefix","change","location","stats","diffStats","classifyToolRisk","toolName","fileChanges","normalized","toLowerCase","command","firstFileChange","riskLabel","reason","summary","commandText","createToolApprovalRequest","id","sessionId","toolCallId","classification","argsText","toolApprovalDecisionReason","decision","request"],"sources":["tool-approval.ts"],"sourcesContent":["import { formatToolDiffStats, toolFileChangeLocation, type ToolFileChange, extractToolFileChanges } from \"./tool-file-changes.js\";\r\nimport { formatToolArgs } from \"./tool-messages.js\";\r\n\r\nexport type ToolApprovalDecision = \"allow\" | \"reject\" | \"cancel\";\r\n\r\nexport interface ToolApprovalRequest {\r\n\tid: string;\r\n\tsessionId: string;\r\n\ttoolCallId: string;\r\n\ttoolName: string;\r\n\triskLabel: string;\r\n\treason: string;\r\n\tsummary: string;\r\n\targsText: string;\r\n\tcommandText?: string;\r\n\tfileChanges: ToolFileChange[];\r\n}\r\n\r\nfunction readRecord(args: unknown): Record<string, unknown> | undefined {\r\n\treturn typeof args === \"object\" && args !== null ? (args as Record<string, unknown>) : undefined;\r\n}\r\n\r\nfunction readString(record: Record<string, unknown> | undefined, keys: string[]): string | undefined {\r\n\tif (!record) {\r\n\t\treturn undefined;\r\n\t}\r\n\tfor (const key of keys) {\r\n\t\tconst value = record[key];\r\n\t\tif (typeof value === \"string\" && value.trim()) {\r\n\t\t\treturn value.trim();\r\n\t\t}\r\n\t}\r\n\treturn undefined;\r\n}\r\n\r\nfunction readCommand(args: unknown): string | undefined {\r\n\treturn readString(readRecord(args), [\"command\", \"cmd\", \"script\"]);\r\n}\r\n\r\nfunction summarizeFileChange(prefix: string, change: ToolFileChange | undefined): string {\r\n\tif (!change) {\r\n\t\treturn prefix;\r\n\t}\r\n\r\n\tconst location = toolFileChangeLocation(change);\r\n\tconst stats = formatToolDiffStats(change.diffStats);\r\n\treturn `${prefix} ${location}${stats ? ` (${stats})` : \"\"}`;\r\n}\r\n\r\nfunction classifyToolRisk(\r\n\ttoolName: string,\r\n\targs: unknown,\r\n\tfileChanges: ToolFileChange[],\r\n): {\r\n\triskLabel: string;\r\n\treason: string;\r\n\tsummary: string;\r\n\tcommandText?: string;\r\n} | undefined {\r\n\tconst normalized = toolName.toLowerCase();\r\n\tconst command = readCommand(args);\r\n\tconst firstFileChange = fileChanges[0];\r\n\r\n\tif (normalized === \"bash\" || normalized === \"shell_command\" || normalized === \"shell\" || normalized === \"exec\") {\r\n\t\treturn {\r\n\t\t\triskLabel: \"SHELL COMMAND\",\r\n\t\t\treason: \"This command can execute arbitrary shell operations in the workspace.\",\r\n\t\t\tsummary: command ? \"Run a shell command in the workspace.\" : \"Run a shell command with arbitrary side effects.\",\r\n\t\t\tcommandText: command,\r\n\t\t};\r\n\t}\r\n\r\n\tif (normalized === \"write\" || normalized === \"write_file\") {\r\n\t\treturn {\r\n\t\t\triskLabel: \"FILE WRITE\",\r\n\t\t\treason: \"This tool will create or overwrite a file on disk.\",\r\n\t\t\tsummary: summarizeFileChange(\"Write\", firstFileChange),\r\n\t\t};\r\n\t}\r\n\r\n\tif (normalized === \"edit\" || normalized === \"edit_file\" || normalized === \"apply_patch\" || normalized === \"patch\") {\r\n\t\treturn {\r\n\t\t\triskLabel: \"FILE EDIT\",\r\n\t\t\treason: \"This tool will modify existing file contents on disk.\",\r\n\t\t\tsummary: summarizeFileChange(\"Edit\", firstFileChange),\r\n\t\t};\r\n\t}\r\n\r\n\treturn undefined;\r\n}\r\n\r\nexport function createToolApprovalRequest(\r\n\tid: string,\r\n\tsessionId: string,\r\n\ttoolCallId: string,\r\n\ttoolName: string,\r\n\targs: unknown,\r\n): ToolApprovalRequest | undefined {\r\n\tconst fileChanges = extractToolFileChanges(toolName, args, undefined);\r\n\tconst classification = classifyToolRisk(toolName, args, fileChanges);\r\n\tif (!classification) {\r\n\t\treturn undefined;\r\n\t}\r\n\r\n\treturn {\r\n\t\tid,\r\n\t\tsessionId,\r\n\t\ttoolCallId,\r\n\t\ttoolName,\r\n\t\triskLabel: classification.riskLabel,\r\n\t\treason: classification.reason,\r\n\t\tsummary: classification.summary,\r\n\t\targsText: formatToolArgs(args),\r\n\t\tcommandText: classification.commandText,\r\n\t\tfileChanges,\r\n\t};\r\n}\r\n\r\nexport function toolApprovalDecisionReason(decision: ToolApprovalDecision, request: ToolApprovalRequest): string {\r\n\tswitch (decision) {\r\n\t\tcase \"allow\":\r\n\t\t\treturn \"\";\r\n\t\tcase \"reject\":\r\n\t\t\treturn `${request.toolName} was rejected by the user before execution.`;\r\n\t\tcase \"cancel\":\r\n\t\t\treturn `${request.toolName} approval was cancelled before execution.`;\r\n\t}\r\n}\r\n"],"mappings":"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","ignoreList":[]}
@@ -1 +1 @@
1
- {"version":3,"names":["Diff","generateDiffString","oldContent","newContent","contextLines","parts","diffLines","output","oldLines","split","newLines","maxLineNum","Math","max","length","lineNumWidth","String","oldLineNum","newLineNum","lastWasChange","firstChangedLine","i","part","raw","value","pop","added","removed","undefined","line","lineNum","padStart","push","nextPartIsChange","linesToShow","skipStart","skipEnd","slice","diff","join"],"sources":["tool-diff.ts"],"sourcesContent":["import * as Diff from \"diff\";\n\nexport interface GeneratedDiff {\n\tdiff: string;\n\tfirstChangedLine: number | undefined;\n}\n\nexport function generateDiffString(\n\toldContent: string,\n\tnewContent: string,\n\tcontextLines = 4,\n): GeneratedDiff {\n\tconst parts = Diff.diffLines(oldContent, newContent);\n\tconst output: string[] = [];\n\n\tconst oldLines = oldContent.split(\"\\n\");\n\tconst newLines = newContent.split(\"\\n\");\n\tconst maxLineNum = Math.max(oldLines.length, newLines.length);\n\tconst lineNumWidth = String(maxLineNum).length;\n\n\tlet oldLineNum = 1;\n\tlet newLineNum = 1;\n\tlet lastWasChange = false;\n\tlet firstChangedLine: number | undefined;\n\n\tfor (let i = 0; i < parts.length; i++) {\n\t\tconst part = parts[i]!;\n\t\tconst raw = part.value.split(\"\\n\");\n\t\tif (raw[raw.length - 1] === \"\") {\n\t\t\traw.pop();\n\t\t}\n\n\t\tif (part.added || part.removed) {\n\t\t\tif (firstChangedLine === undefined) {\n\t\t\t\tfirstChangedLine = newLineNum;\n\t\t\t}\n\n\t\t\tfor (const line of raw) {\n\t\t\t\tif (part.added) {\n\t\t\t\t\tconst lineNum = String(newLineNum).padStart(lineNumWidth, \" \");\n\t\t\t\t\toutput.push(`+${lineNum} ${line}`);\n\t\t\t\t\tnewLineNum += 1;\n\t\t\t\t} else {\n\t\t\t\t\tconst lineNum = String(oldLineNum).padStart(lineNumWidth, \" \");\n\t\t\t\t\toutput.push(`-${lineNum} ${line}`);\n\t\t\t\t\toldLineNum += 1;\n\t\t\t\t}\n\t\t\t}\n\t\t\tlastWasChange = true;\n\t\t\tcontinue;\n\t\t}\n\n\t\tconst nextPartIsChange = i < parts.length - 1 && !!(parts[i + 1]?.added || parts[i + 1]?.removed);\n\n\t\tif (lastWasChange || nextPartIsChange) {\n\t\t\tlet linesToShow = raw;\n\t\t\tlet skipStart = 0;\n\t\t\tlet skipEnd = 0;\n\n\t\t\tif (!lastWasChange) {\n\t\t\t\tskipStart = Math.max(0, raw.length - contextLines);\n\t\t\t\tlinesToShow = raw.slice(skipStart);\n\t\t\t}\n\n\t\t\tif (!nextPartIsChange && linesToShow.length > contextLines) {\n\t\t\t\tskipEnd = linesToShow.length - contextLines;\n\t\t\t\tlinesToShow = linesToShow.slice(0, contextLines);\n\t\t\t}\n\n\t\t\tif (skipStart > 0) {\n\t\t\t\toutput.push(` ${\"\".padStart(lineNumWidth, \" \")} ...`);\n\t\t\t\toldLineNum += skipStart;\n\t\t\t\tnewLineNum += skipStart;\n\t\t\t}\n\n\t\t\tfor (const line of linesToShow) {\n\t\t\t\tconst lineNum = String(oldLineNum).padStart(lineNumWidth, \" \");\n\t\t\t\toutput.push(` ${lineNum} ${line}`);\n\t\t\t\toldLineNum += 1;\n\t\t\t\tnewLineNum += 1;\n\t\t\t}\n\n\t\t\tif (skipEnd > 0) {\n\t\t\t\toutput.push(` ${\"\".padStart(lineNumWidth, \" \")} ...`);\n\t\t\t\toldLineNum += skipEnd;\n\t\t\t\tnewLineNum += skipEnd;\n\t\t\t}\n\t\t} else {\n\t\t\toldLineNum += raw.length;\n\t\t\tnewLineNum += raw.length;\n\t\t}\n\n\t\tlastWasChange = false;\n\t}\n\n\treturn { diff: output.join(\"\\n\"), firstChangedLine };\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["Diff","generateDiffString","oldContent","newContent","contextLines","parts","diffLines","output","oldLines","split","newLines","maxLineNum","Math","max","length","lineNumWidth","String","oldLineNum","newLineNum","lastWasChange","firstChangedLine","i","part","raw","value","pop","added","removed","undefined","line","lineNum","padStart","push","nextPartIsChange","linesToShow","skipStart","skipEnd","slice","diff","join"],"sources":["tool-diff.ts"],"sourcesContent":["import * as Diff from \"diff\";\r\n\r\nexport interface GeneratedDiff {\r\n\tdiff: string;\r\n\tfirstChangedLine: number | undefined;\r\n}\r\n\r\nexport function generateDiffString(\r\n\toldContent: string,\r\n\tnewContent: string,\r\n\tcontextLines = 4,\r\n): GeneratedDiff {\r\n\tconst parts = Diff.diffLines(oldContent, newContent);\r\n\tconst output: string[] = [];\r\n\r\n\tconst oldLines = oldContent.split(\"\\n\");\r\n\tconst newLines = newContent.split(\"\\n\");\r\n\tconst maxLineNum = Math.max(oldLines.length, newLines.length);\r\n\tconst lineNumWidth = String(maxLineNum).length;\r\n\r\n\tlet oldLineNum = 1;\r\n\tlet newLineNum = 1;\r\n\tlet lastWasChange = false;\r\n\tlet firstChangedLine: number | undefined;\r\n\r\n\tfor (let i = 0; i < parts.length; i++) {\r\n\t\tconst part = parts[i]!;\r\n\t\tconst raw = part.value.split(\"\\n\");\r\n\t\tif (raw[raw.length - 1] === \"\") {\r\n\t\t\traw.pop();\r\n\t\t}\r\n\r\n\t\tif (part.added || part.removed) {\r\n\t\t\tif (firstChangedLine === undefined) {\r\n\t\t\t\tfirstChangedLine = newLineNum;\r\n\t\t\t}\r\n\r\n\t\t\tfor (const line of raw) {\r\n\t\t\t\tif (part.added) {\r\n\t\t\t\t\tconst lineNum = String(newLineNum).padStart(lineNumWidth, \" \");\r\n\t\t\t\t\toutput.push(`+${lineNum} ${line}`);\r\n\t\t\t\t\tnewLineNum += 1;\r\n\t\t\t\t} else {\r\n\t\t\t\t\tconst lineNum = String(oldLineNum).padStart(lineNumWidth, \" \");\r\n\t\t\t\t\toutput.push(`-${lineNum} ${line}`);\r\n\t\t\t\t\toldLineNum += 1;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tlastWasChange = true;\r\n\t\t\tcontinue;\r\n\t\t}\r\n\r\n\t\tconst nextPartIsChange = i < parts.length - 1 && !!(parts[i + 1]?.added || parts[i + 1]?.removed);\r\n\r\n\t\tif (lastWasChange || nextPartIsChange) {\r\n\t\t\tlet linesToShow = raw;\r\n\t\t\tlet skipStart = 0;\r\n\t\t\tlet skipEnd = 0;\r\n\r\n\t\t\tif (!lastWasChange) {\r\n\t\t\t\tskipStart = Math.max(0, raw.length - contextLines);\r\n\t\t\t\tlinesToShow = raw.slice(skipStart);\r\n\t\t\t}\r\n\r\n\t\t\tif (!nextPartIsChange && linesToShow.length > contextLines) {\r\n\t\t\t\tskipEnd = linesToShow.length - contextLines;\r\n\t\t\t\tlinesToShow = linesToShow.slice(0, contextLines);\r\n\t\t\t}\r\n\r\n\t\t\tif (skipStart > 0) {\r\n\t\t\t\toutput.push(` ${\"\".padStart(lineNumWidth, \" \")} ...`);\r\n\t\t\t\toldLineNum += skipStart;\r\n\t\t\t\tnewLineNum += skipStart;\r\n\t\t\t}\r\n\r\n\t\t\tfor (const line of linesToShow) {\r\n\t\t\t\tconst lineNum = String(oldLineNum).padStart(lineNumWidth, \" \");\r\n\t\t\t\toutput.push(` ${lineNum} ${line}`);\r\n\t\t\t\toldLineNum += 1;\r\n\t\t\t\tnewLineNum += 1;\r\n\t\t\t}\r\n\r\n\t\t\tif (skipEnd > 0) {\r\n\t\t\t\toutput.push(` ${\"\".padStart(lineNumWidth, \" \")} ...`);\r\n\t\t\t\toldLineNum += skipEnd;\r\n\t\t\t\tnewLineNum += skipEnd;\r\n\t\t\t}\r\n\t\t} else {\r\n\t\t\toldLineNum += raw.length;\r\n\t\t\tnewLineNum += raw.length;\r\n\t\t}\r\n\r\n\t\tlastWasChange = false;\r\n\t}\r\n\r\n\treturn { diff: output.join(\"\\n\"), firstChangedLine };\r\n}\r\n"],"mappings":"AAAA,OAAO,KAAKA,IAAI,MAAM,MAAM;AAO5B,OAAO,SAASC,kBAAkBA,CACjCC,UAAkB,EAClBC,UAAkB,EAClBC,YAAY,GAAG,CAAC,EACA;EAChB,MAAMC,KAAK,GAAGL,IAAI,CAACM,SAAS,CAACJ,UAAU,EAAEC,UAAU,CAAC;EACpD,MAAMI,MAAgB,GAAG,EAAE;EAE3B,MAAMC,QAAQ,GAAGN,UAAU,CAACO,KAAK,CAAC,IAAI,CAAC;EACvC,MAAMC,QAAQ,GAAGP,UAAU,CAACM,KAAK,CAAC,IAAI,CAAC;EACvC,MAAME,UAAU,GAAGC,IAAI,CAACC,GAAG,CAACL,QAAQ,CAACM,MAAM,EAAEJ,QAAQ,CAACI,MAAM,CAAC;EAC7D,MAAMC,YAAY,GAAGC,MAAM,CAACL,UAAU,CAAC,CAACG,MAAM;EAE9C,IAAIG,UAAU,GAAG,CAAC;EAClB,IAAIC,UAAU,GAAG,CAAC;EAClB,IAAIC,aAAa,GAAG,KAAK;EACzB,IAAIC,gBAAoC;EAExC,KAAK,IAAIC,CAAC,GAAG,CAAC,EAAEA,CAAC,GAAGhB,KAAK,CAACS,MAAM,EAAEO,CAAC,EAAE,EAAE;IACtC,MAAMC,IAAI,GAAGjB,KAAK,CAACgB,CAAC,CAAE;IACtB,MAAME,GAAG,GAAGD,IAAI,CAACE,KAAK,CAACf,KAAK,CAAC,IAAI,CAAC;IAClC,IAAIc,GAAG,CAACA,GAAG,CAACT,MAAM,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE;MAC/BS,GAAG,CAACE,GAAG,CAAC,CAAC;IACV;IAEA,IAAIH,IAAI,CAACI,KAAK,IAAIJ,IAAI,CAACK,OAAO,EAAE;MAC/B,IAAIP,gBAAgB,KAAKQ,SAAS,EAAE;QACnCR,gBAAgB,GAAGF,UAAU;MAC9B;MAEA,KAAK,MAAMW,IAAI,IAAIN,GAAG,EAAE;QACvB,IAAID,IAAI,CAACI,KAAK,EAAE;UACf,MAAMI,OAAO,GAAGd,MAAM,CAACE,UAAU,CAAC,CAACa,QAAQ,CAAChB,YAAY,EAAE,GAAG,CAAC;UAC9DR,MAAM,CAACyB,IAAI,CAAC,IAAIF,OAAO,IAAID,IAAI,EAAE,CAAC;UAClCX,UAAU,IAAI,CAAC;QAChB,CAAC,MAAM;UACN,MAAMY,OAAO,GAAGd,MAAM,CAACC,UAAU,CAAC,CAACc,QAAQ,CAAChB,YAAY,EAAE,GAAG,CAAC;UAC9DR,MAAM,CAACyB,IAAI,CAAC,IAAIF,OAAO,IAAID,IAAI,EAAE,CAAC;UAClCZ,UAAU,IAAI,CAAC;QAChB;MACD;MACAE,aAAa,GAAG,IAAI;MACpB;IACD;IAEA,MAAMc,gBAAgB,GAAGZ,CAAC,GAAGhB,KAAK,CAACS,MAAM,GAAG,CAAC,IAAI,CAAC,EAAET,KAAK,CAACgB,CAAC,GAAG,CAAC,CAAC,EAAEK,KAAK,IAAIrB,KAAK,CAACgB,CAAC,GAAG,CAAC,CAAC,EAAEM,OAAO,CAAC;IAEjG,IAAIR,aAAa,IAAIc,gBAAgB,EAAE;MACtC,IAAIC,WAAW,GAAGX,GAAG;MACrB,IAAIY,SAAS,GAAG,CAAC;MACjB,IAAIC,OAAO,GAAG,CAAC;MAEf,IAAI,CAACjB,aAAa,EAAE;QACnBgB,SAAS,GAAGvB,IAAI,CAACC,GAAG,CAAC,CAAC,EAAEU,GAAG,CAACT,MAAM,GAAGV,YAAY,CAAC;QAClD8B,WAAW,GAAGX,GAAG,CAACc,KAAK,CAACF,SAAS,CAAC;MACnC;MAEA,IAAI,CAACF,gBAAgB,IAAIC,WAAW,CAACpB,MAAM,GAAGV,YAAY,EAAE;QAC3DgC,OAAO,GAAGF,WAAW,CAACpB,MAAM,GAAGV,YAAY;QAC3C8B,WAAW,GAAGA,WAAW,CAACG,KAAK,CAAC,CAAC,EAAEjC,YAAY,CAAC;MACjD;MAEA,IAAI+B,SAAS,GAAG,CAAC,EAAE;QAClB5B,MAAM,CAACyB,IAAI,CAAC,IAAI,EAAE,CAACD,QAAQ,CAAChB,YAAY,EAAE,GAAG,CAAC,MAAM,CAAC;QACrDE,UAAU,IAAIkB,SAAS;QACvBjB,UAAU,IAAIiB,SAAS;MACxB;MAEA,KAAK,MAAMN,IAAI,IAAIK,WAAW,EAAE;QAC/B,MAAMJ,OAAO,GAAGd,MAAM,CAACC,UAAU,CAAC,CAACc,QAAQ,CAAChB,YAAY,EAAE,GAAG,CAAC;QAC9DR,MAAM,CAACyB,IAAI,CAAC,IAAIF,OAAO,IAAID,IAAI,EAAE,CAAC;QAClCZ,UAAU,IAAI,CAAC;QACfC,UAAU,IAAI,CAAC;MAChB;MAEA,IAAIkB,OAAO,GAAG,CAAC,EAAE;QAChB7B,MAAM,CAACyB,IAAI,CAAC,IAAI,EAAE,CAACD,QAAQ,CAAChB,YAAY,EAAE,GAAG,CAAC,MAAM,CAAC;QACrDE,UAAU,IAAImB,OAAO;QACrBlB,UAAU,IAAIkB,OAAO;MACtB;IACD,CAAC,MAAM;MACNnB,UAAU,IAAIM,GAAG,CAACT,MAAM;MACxBI,UAAU,IAAIK,GAAG,CAACT,MAAM;IACzB;IAEAK,aAAa,GAAG,KAAK;EACtB;EAEA,OAAO;IAAEmB,IAAI,EAAE/B,MAAM,CAACgC,IAAI,CAAC,IAAI,CAAC;IAAEnB;EAAiB,CAAC;AACrD","ignoreList":[]}
@@ -1 +1 @@
1
- {"version":3,"names":["existsSync","readFileSync","isAbsolute","resolve","generateDiffString","readRecord","value","undefined","readString","record","keys","key","trim","normalizeDisplayText","replace","normalizePreviewText","trimEnd","extractContentBlocks","content","map","block","type","text","thinking","filter","Boolean","join","extractContentText","Array","isArray","readPath","args","readDiffText","result","diff","details","readFirstChangedLine","firstChangedLine","Number","isFinite","parseDiffLine","line","match","kind","rawText","prefix","lineNumber","parseToolDiff","diffText","lines","split","stats","added","removed","context","meta","firstNonEmptyLine","find","summarizeWritePreview","length","resolveWorkspacePath","path","process","cwd","computeWritePreviewDiff","previewText","absolutePath","existingContent","diffResult","parsedDiff","diffLines","diffStats","computeEditPreviewDiff","oldText","newText","newContent","includes","baseContent","buildEditChange","outputText","previewDiff","summary","buildWriteChange","extractToolFileChanges","toolName","normalized","toLowerCase","toolFileChangeLocation","change","formatToolDiffStats","parts","push","formatToolDiffDeltaStats","toolFileChangeInlineSummary","location"],"sources":["tool-file-changes.ts"],"sourcesContent":["import { existsSync, readFileSync } from \"node:fs\";\nimport { isAbsolute, resolve } from \"node:path\";\nimport { generateDiffString } from \"./tool-diff.js\";\n\ntype ContentBlock = {\n\ttype?: string;\n\ttext?: string;\n\tthinking?: string;\n\t[key: string]: unknown;\n};\n\nexport type ToolFileChangeKind = \"edit\" | \"write\";\nexport type ToolDiffLineKind = \"added\" | \"removed\" | \"context\" | \"meta\";\n\nexport interface ToolDiffLine {\n\tkind: ToolDiffLineKind;\n\tlineNumber?: string;\n\tcontent: string;\n\trawText: string;\n}\n\nexport interface ToolDiffStats {\n\tadded: number;\n\tremoved: number;\n\tcontext: number;\n\tmeta: number;\n}\n\nexport interface ToolFileChange {\n\tkind: ToolFileChangeKind;\n\tpath: string;\n\tsummary: string;\n\tfirstChangedLine?: number;\n\tdiffText?: string;\n\tdiffLines?: ToolDiffLine[];\n\tdiffStats?: ToolDiffStats;\n\tpreviewText?: string;\n}\n\nfunction readRecord(value: unknown): Record<string, unknown> | undefined {\n\treturn typeof value === \"object\" && value !== null ? (value as Record<string, unknown>) : undefined;\n}\n\nfunction readString(record: Record<string, unknown> | undefined, keys: string[]): string | undefined {\n\tif (!record) {\n\t\treturn undefined;\n\t}\n\tfor (const key of keys) {\n\t\tconst value = record[key];\n\t\tif (typeof value === \"string\" && value.trim()) {\n\t\t\treturn value;\n\t\t}\n\t}\n\treturn undefined;\n}\n\nfunction normalizeDisplayText(value: string): string {\n\treturn value.replace(/\\r/g, \"\").trim();\n}\n\nfunction normalizePreviewText(value: string): string {\n\treturn value.replace(/\\r/g, \"\").trimEnd();\n}\n\nfunction extractContentBlocks(content: ContentBlock[]): string {\n\treturn content\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}\n\nfunction extractContentText(value: unknown): string {\n\tif (typeof value === \"string\") {\n\t\treturn normalizeDisplayText(value);\n\t}\n\n\tconst record = readRecord(value);\n\tif (!record) {\n\t\treturn \"\";\n\t}\n\n\tif (Array.isArray(record.content)) {\n\t\treturn normalizeDisplayText(extractContentBlocks(record.content as ContentBlock[]));\n\t}\n\n\treturn \"\";\n}\n\nfunction readPath(args: unknown): string | undefined {\n\treturn readString(readRecord(args), [\"path\", \"file_path\", \"filePath\", \"target\", \"destination\"]);\n}\n\nfunction readDiffText(result: unknown): string | undefined {\n\tconst record = readRecord(result);\n\tif (!record) {\n\t\treturn undefined;\n\t}\n\tif (typeof record.diff === \"string\" && record.diff.trim()) {\n\t\treturn record.diff;\n\t}\n\tconst details = readRecord(record.details);\n\treturn typeof details?.diff === \"string\" && details.diff.trim() ? details.diff : undefined;\n}\n\nfunction readFirstChangedLine(result: unknown): number | undefined {\n\tconst record = readRecord(result);\n\tif (!record) {\n\t\treturn undefined;\n\t}\n\tconst details = readRecord(record.details);\n\tconst value = details?.firstChangedLine ?? record.firstChangedLine;\n\treturn typeof value === \"number\" && Number.isFinite(value) ? value : undefined;\n}\n\nfunction parseDiffLine(line: string): ToolDiffLine {\n\tconst match = line.match(/^([+-\\s])(\\s*\\d*)\\s(.*)$/);\n\tif (!match) {\n\t\treturn {\n\t\t\tkind: \"meta\",\n\t\t\tcontent: line,\n\t\t\trawText: line,\n\t\t};\n\t}\n\n\tconst prefix = match[1];\n\treturn {\n\t\tkind: prefix === \"+\" ? \"added\" : prefix === \"-\" ? \"removed\" : \"context\",\n\t\tlineNumber: match[2].trim() || undefined,\n\t\tcontent: match[3],\n\t\trawText: line,\n\t};\n}\n\nexport function parseToolDiff(diffText: string): { lines: ToolDiffLine[]; stats: ToolDiffStats } {\n\tconst lines = diffText.replace(/\\r/g, \"\").split(\"\\n\").map(parseDiffLine);\n\tconst stats: ToolDiffStats = {\n\t\tadded: 0,\n\t\tremoved: 0,\n\t\tcontext: 0,\n\t\tmeta: 0,\n\t};\n\n\tfor (const line of lines) {\n\t\tswitch (line.kind) {\n\t\t\tcase \"added\":\n\t\t\t\tstats.added += 1;\n\t\t\t\tbreak;\n\t\t\tcase \"removed\":\n\t\t\t\tstats.removed += 1;\n\t\t\t\tbreak;\n\t\t\tcase \"context\":\n\t\t\t\tstats.context += 1;\n\t\t\t\tbreak;\n\t\t\tcase \"meta\":\n\t\t\t\tstats.meta += 1;\n\t\t\t\tbreak;\n\t\t}\n\t}\n\n\treturn { lines, stats };\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\nfunction summarizeWritePreview(content: string): string {\n\tconst lines = normalizePreviewText(content).split(\"\\n\");\n\tif (lines.length <= 1) {\n\t\treturn `Prepared ${content.length} characters`;\n\t}\n\treturn `Prepared ${lines.length} lines`;\n}\n\nfunction resolveWorkspacePath(path: string): string {\n\treturn isAbsolute(path) ? path : resolve(process.cwd(), path);\n}\n\nfunction computeWritePreviewDiff(\n\tpath: string,\n\tpreviewText: string,\n): Pick<ToolFileChange, \"diffText\" | \"diffLines\" | \"diffStats\" | \"firstChangedLine\"> | undefined {\n\ttry {\n\t\tconst absolutePath = resolveWorkspacePath(path);\n\t\tconst existingContent = existsSync(absolutePath) ? readFileSync(absolutePath, \"utf8\") : \"\";\n\t\tconst diffResult = generateDiffString(existingContent, previewText);\n\t\tif (!diffResult.diff) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tconst parsedDiff = parseToolDiff(diffResult.diff);\n\t\treturn {\n\t\t\tdiffText: diffResult.diff,\n\t\t\tdiffLines: parsedDiff.lines,\n\t\t\tdiffStats: parsedDiff.stats,\n\t\t\tfirstChangedLine: diffResult.firstChangedLine,\n\t\t};\n\t} catch {\n\t\treturn undefined;\n\t}\n}\n\nfunction computeEditPreviewDiff(\n\tpath: string,\n\targs: unknown,\n): Pick<ToolFileChange, \"diffText\" | \"diffLines\" | \"diffStats\" | \"firstChangedLine\"> | undefined {\n\ttry {\n\t\tconst record = readRecord(args);\n\t\tconst oldText = readString(record, [\"oldText\", \"old_text\"]);\n\t\tconst newText = readString(record, [\"newText\", \"new_text\"]);\n\t\tif (oldText === undefined || newText === undefined) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tconst absolutePath = resolveWorkspacePath(path);\n\t\tconst existingContent = existsSync(absolutePath) ? readFileSync(absolutePath, \"utf8\") : \"\";\n\t\tconst newContent = existingContent.includes(oldText)\n\t\t\t? existingContent.replace(oldText, newText)\n\t\t\t: newText;\n\t\tconst baseContent = existingContent.includes(oldText) ? existingContent : oldText;\n\t\tconst diffResult = generateDiffString(baseContent, newContent);\n\t\tif (!diffResult.diff) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tconst parsedDiff = parseToolDiff(diffResult.diff);\n\t\treturn {\n\t\t\tdiffText: diffResult.diff,\n\t\t\tdiffLines: parsedDiff.lines,\n\t\t\tdiffStats: parsedDiff.stats,\n\t\t\tfirstChangedLine: diffResult.firstChangedLine,\n\t\t};\n\t} catch {\n\t\treturn undefined;\n\t}\n}\n\nfunction buildEditChange(path: string, args: unknown, result: unknown): ToolFileChange {\n\tconst diffText = readDiffText(result);\n\tconst parsedDiff = diffText ? parseToolDiff(diffText) : undefined;\n\tconst outputText = extractContentText(result);\n\tconst previewDiff = !result ? computeEditPreviewDiff(path, args) : undefined;\n\n\treturn {\n\t\tkind: \"edit\",\n\t\tpath,\n\t\tsummary: outputText || (diffText || previewDiff ? `Updated ${path}` : `Editing ${path}`),\n\t\tfirstChangedLine: readFirstChangedLine(result) ?? previewDiff?.firstChangedLine,\n\t\tdiffText: diffText ?? previewDiff?.diffText,\n\t\tdiffLines: parsedDiff?.lines ?? previewDiff?.diffLines,\n\t\tdiffStats: parsedDiff?.stats ?? previewDiff?.diffStats,\n\t};\n}\n\nfunction buildWriteChange(path: string, args: unknown, result: unknown): ToolFileChange {\n\tconst previewText = readString(readRecord(args), [\"content\"]);\n\tconst outputText = extractContentText(result);\n\tconst previewDiff = !result && previewText ? computeWritePreviewDiff(path, previewText) : undefined;\n\n\treturn {\n\t\tkind: \"write\",\n\t\tpath,\n\t\tsummary: outputText || (previewText ? summarizeWritePreview(previewText) : `Writing ${path}`),\n\t\tpreviewText: previewText ? normalizePreviewText(previewText) : undefined,\n\t\tdiffText: previewDiff?.diffText,\n\t\tdiffLines: previewDiff?.diffLines,\n\t\tdiffStats: previewDiff?.diffStats,\n\t\tfirstChangedLine: previewDiff?.firstChangedLine,\n\t};\n}\n\nexport function extractToolFileChanges(toolName: string, args: unknown, result: unknown): ToolFileChange[] {\n\tconst normalized = toolName.toLowerCase();\n\tconst path = readPath(args);\n\tif (!path) {\n\t\treturn [];\n\t}\n\n\tif (normalized === \"edit\" || normalized === \"edit_file\" || normalized === \"apply_patch\" || normalized === \"patch\") {\n\t\treturn [buildEditChange(path, args, result)];\n\t}\n\n\tif (normalized === \"write\" || normalized === \"write_file\") {\n\t\treturn [buildWriteChange(path, args, result)];\n\t}\n\n\treturn [];\n}\n\nexport function toolFileChangeLocation(change: ToolFileChange): string {\n\treturn change.firstChangedLine ? `${change.path}:${change.firstChangedLine}` : change.path;\n}\n\nexport function formatToolDiffStats(stats: ToolDiffStats | undefined): string | undefined {\n\tif (!stats) {\n\t\treturn undefined;\n\t}\n\n\tconst parts: string[] = [];\n\tif (stats.added > 0) {\n\t\tparts.push(`+${stats.added}`);\n\t}\n\tif (stats.removed > 0) {\n\t\tparts.push(`-${stats.removed}`);\n\t}\n\tif (stats.context > 0) {\n\t\tparts.push(`${stats.context} ctx`);\n\t}\n\treturn parts.join(\" \");\n}\n\nexport function formatToolDiffDeltaStats(stats: ToolDiffStats | undefined): string | undefined {\n\tif (!stats) {\n\t\treturn undefined;\n\t}\n\n\tconst parts: string[] = [];\n\tif (stats.added > 0) {\n\t\tparts.push(`+${stats.added}`);\n\t}\n\tif (stats.removed > 0) {\n\t\tparts.push(`-${stats.removed}`);\n\t}\n\treturn parts.join(\" \");\n}\n\nexport function toolFileChangeInlineSummary(change: ToolFileChange): string {\n\tconst location = toolFileChangeLocation(change);\n\tif (change.kind === \"edit\") {\n\t\treturn `${location}${formatToolDiffDeltaStats(change.diffStats) ? ` | ${formatToolDiffDeltaStats(change.diffStats)}` : \"\"}`;\n\t}\n\tif (change.previewText) {\n\t\treturn `${location} | ${firstNonEmptyLine(change.previewText) ?? change.summary}`;\n\t}\n\treturn `${location} | ${change.summary}`;\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["existsSync","readFileSync","isAbsolute","resolve","generateDiffString","readRecord","value","undefined","readString","record","keys","key","trim","normalizeDisplayText","replace","normalizePreviewText","trimEnd","extractContentBlocks","content","map","block","type","text","thinking","filter","Boolean","join","extractContentText","Array","isArray","readPath","args","readDiffText","result","diff","details","readFirstChangedLine","firstChangedLine","Number","isFinite","parseDiffLine","line","match","kind","rawText","prefix","lineNumber","parseToolDiff","diffText","lines","split","stats","added","removed","context","meta","firstNonEmptyLine","find","summarizeWritePreview","length","resolveWorkspacePath","path","process","cwd","computeWritePreviewDiff","previewText","absolutePath","existingContent","diffResult","parsedDiff","diffLines","diffStats","computeEditPreviewDiff","oldText","newText","newContent","includes","baseContent","buildEditChange","outputText","previewDiff","summary","buildWriteChange","extractToolFileChanges","toolName","normalized","toLowerCase","toolFileChangeLocation","change","formatToolDiffStats","parts","push","formatToolDiffDeltaStats","toolFileChangeInlineSummary","location"],"sources":["tool-file-changes.ts"],"sourcesContent":["import { existsSync, readFileSync } from \"node:fs\";\r\nimport { isAbsolute, resolve } from \"node:path\";\r\nimport { generateDiffString } from \"./tool-diff.js\";\r\n\r\ntype ContentBlock = {\r\n\ttype?: string;\r\n\ttext?: string;\r\n\tthinking?: string;\r\n\t[key: string]: unknown;\r\n};\r\n\r\nexport type ToolFileChangeKind = \"edit\" | \"write\";\r\nexport type ToolDiffLineKind = \"added\" | \"removed\" | \"context\" | \"meta\";\r\n\r\nexport interface ToolDiffLine {\r\n\tkind: ToolDiffLineKind;\r\n\tlineNumber?: string;\r\n\tcontent: string;\r\n\trawText: string;\r\n}\r\n\r\nexport interface ToolDiffStats {\r\n\tadded: number;\r\n\tremoved: number;\r\n\tcontext: number;\r\n\tmeta: number;\r\n}\r\n\r\nexport interface ToolFileChange {\r\n\tkind: ToolFileChangeKind;\r\n\tpath: string;\r\n\tsummary: string;\r\n\tfirstChangedLine?: number;\r\n\tdiffText?: string;\r\n\tdiffLines?: ToolDiffLine[];\r\n\tdiffStats?: ToolDiffStats;\r\n\tpreviewText?: string;\r\n}\r\n\r\nfunction readRecord(value: unknown): Record<string, unknown> | undefined {\r\n\treturn typeof value === \"object\" && value !== null ? (value as Record<string, unknown>) : undefined;\r\n}\r\n\r\nfunction readString(record: Record<string, unknown> | undefined, keys: string[]): string | undefined {\r\n\tif (!record) {\r\n\t\treturn undefined;\r\n\t}\r\n\tfor (const key of keys) {\r\n\t\tconst value = record[key];\r\n\t\tif (typeof value === \"string\" && value.trim()) {\r\n\t\t\treturn value;\r\n\t\t}\r\n\t}\r\n\treturn undefined;\r\n}\r\n\r\nfunction normalizeDisplayText(value: string): string {\r\n\treturn value.replace(/\\r/g, \"\").trim();\r\n}\r\n\r\nfunction normalizePreviewText(value: string): string {\r\n\treturn value.replace(/\\r/g, \"\").trimEnd();\r\n}\r\n\r\nfunction extractContentBlocks(content: ContentBlock[]): string {\r\n\treturn content\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}\r\n\r\nfunction extractContentText(value: unknown): string {\r\n\tif (typeof value === \"string\") {\r\n\t\treturn normalizeDisplayText(value);\r\n\t}\r\n\r\n\tconst record = readRecord(value);\r\n\tif (!record) {\r\n\t\treturn \"\";\r\n\t}\r\n\r\n\tif (Array.isArray(record.content)) {\r\n\t\treturn normalizeDisplayText(extractContentBlocks(record.content as ContentBlock[]));\r\n\t}\r\n\r\n\treturn \"\";\r\n}\r\n\r\nfunction readPath(args: unknown): string | undefined {\r\n\treturn readString(readRecord(args), [\"path\", \"file_path\", \"filePath\", \"target\", \"destination\"]);\r\n}\r\n\r\nfunction readDiffText(result: unknown): string | undefined {\r\n\tconst record = readRecord(result);\r\n\tif (!record) {\r\n\t\treturn undefined;\r\n\t}\r\n\tif (typeof record.diff === \"string\" && record.diff.trim()) {\r\n\t\treturn record.diff;\r\n\t}\r\n\tconst details = readRecord(record.details);\r\n\treturn typeof details?.diff === \"string\" && details.diff.trim() ? details.diff : undefined;\r\n}\r\n\r\nfunction readFirstChangedLine(result: unknown): number | undefined {\r\n\tconst record = readRecord(result);\r\n\tif (!record) {\r\n\t\treturn undefined;\r\n\t}\r\n\tconst details = readRecord(record.details);\r\n\tconst value = details?.firstChangedLine ?? record.firstChangedLine;\r\n\treturn typeof value === \"number\" && Number.isFinite(value) ? value : undefined;\r\n}\r\n\r\nfunction parseDiffLine(line: string): ToolDiffLine {\r\n\tconst match = line.match(/^([+-\\s])(\\s*\\d*)\\s(.*)$/);\r\n\tif (!match) {\r\n\t\treturn {\r\n\t\t\tkind: \"meta\",\r\n\t\t\tcontent: line,\r\n\t\t\trawText: line,\r\n\t\t};\r\n\t}\r\n\r\n\tconst prefix = match[1];\r\n\treturn {\r\n\t\tkind: prefix === \"+\" ? \"added\" : prefix === \"-\" ? \"removed\" : \"context\",\r\n\t\tlineNumber: match[2].trim() || undefined,\r\n\t\tcontent: match[3],\r\n\t\trawText: line,\r\n\t};\r\n}\r\n\r\nexport function parseToolDiff(diffText: string): { lines: ToolDiffLine[]; stats: ToolDiffStats } {\r\n\tconst lines = diffText.replace(/\\r/g, \"\").split(\"\\n\").map(parseDiffLine);\r\n\tconst stats: ToolDiffStats = {\r\n\t\tadded: 0,\r\n\t\tremoved: 0,\r\n\t\tcontext: 0,\r\n\t\tmeta: 0,\r\n\t};\r\n\r\n\tfor (const line of lines) {\r\n\t\tswitch (line.kind) {\r\n\t\t\tcase \"added\":\r\n\t\t\t\tstats.added += 1;\r\n\t\t\t\tbreak;\r\n\t\t\tcase \"removed\":\r\n\t\t\t\tstats.removed += 1;\r\n\t\t\t\tbreak;\r\n\t\t\tcase \"context\":\r\n\t\t\t\tstats.context += 1;\r\n\t\t\t\tbreak;\r\n\t\t\tcase \"meta\":\r\n\t\t\t\tstats.meta += 1;\r\n\t\t\t\tbreak;\r\n\t\t}\r\n\t}\r\n\r\n\treturn { lines, stats };\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 summarizeWritePreview(content: string): string {\r\n\tconst lines = normalizePreviewText(content).split(\"\\n\");\r\n\tif (lines.length <= 1) {\r\n\t\treturn `Prepared ${content.length} characters`;\r\n\t}\r\n\treturn `Prepared ${lines.length} lines`;\r\n}\r\n\r\nfunction resolveWorkspacePath(path: string): string {\r\n\treturn isAbsolute(path) ? path : resolve(process.cwd(), path);\r\n}\r\n\r\nfunction computeWritePreviewDiff(\r\n\tpath: string,\r\n\tpreviewText: string,\r\n): Pick<ToolFileChange, \"diffText\" | \"diffLines\" | \"diffStats\" | \"firstChangedLine\"> | undefined {\r\n\ttry {\r\n\t\tconst absolutePath = resolveWorkspacePath(path);\r\n\t\tconst existingContent = existsSync(absolutePath) ? readFileSync(absolutePath, \"utf8\") : \"\";\r\n\t\tconst diffResult = generateDiffString(existingContent, previewText);\r\n\t\tif (!diffResult.diff) {\r\n\t\t\treturn undefined;\r\n\t\t}\r\n\r\n\t\tconst parsedDiff = parseToolDiff(diffResult.diff);\r\n\t\treturn {\r\n\t\t\tdiffText: diffResult.diff,\r\n\t\t\tdiffLines: parsedDiff.lines,\r\n\t\t\tdiffStats: parsedDiff.stats,\r\n\t\t\tfirstChangedLine: diffResult.firstChangedLine,\r\n\t\t};\r\n\t} catch {\r\n\t\treturn undefined;\r\n\t}\r\n}\r\n\r\nfunction computeEditPreviewDiff(\r\n\tpath: string,\r\n\targs: unknown,\r\n): Pick<ToolFileChange, \"diffText\" | \"diffLines\" | \"diffStats\" | \"firstChangedLine\"> | undefined {\r\n\ttry {\r\n\t\tconst record = readRecord(args);\r\n\t\tconst oldText = readString(record, [\"oldText\", \"old_text\"]);\r\n\t\tconst newText = readString(record, [\"newText\", \"new_text\"]);\r\n\t\tif (oldText === undefined || newText === undefined) {\r\n\t\t\treturn undefined;\r\n\t\t}\r\n\r\n\t\tconst absolutePath = resolveWorkspacePath(path);\r\n\t\tconst existingContent = existsSync(absolutePath) ? readFileSync(absolutePath, \"utf8\") : \"\";\r\n\t\tconst newContent = existingContent.includes(oldText)\r\n\t\t\t? existingContent.replace(oldText, newText)\r\n\t\t\t: newText;\r\n\t\tconst baseContent = existingContent.includes(oldText) ? existingContent : oldText;\r\n\t\tconst diffResult = generateDiffString(baseContent, newContent);\r\n\t\tif (!diffResult.diff) {\r\n\t\t\treturn undefined;\r\n\t\t}\r\n\r\n\t\tconst parsedDiff = parseToolDiff(diffResult.diff);\r\n\t\treturn {\r\n\t\t\tdiffText: diffResult.diff,\r\n\t\t\tdiffLines: parsedDiff.lines,\r\n\t\t\tdiffStats: parsedDiff.stats,\r\n\t\t\tfirstChangedLine: diffResult.firstChangedLine,\r\n\t\t};\r\n\t} catch {\r\n\t\treturn undefined;\r\n\t}\r\n}\r\n\r\nfunction buildEditChange(path: string, args: unknown, result: unknown): ToolFileChange {\r\n\tconst diffText = readDiffText(result);\r\n\tconst parsedDiff = diffText ? parseToolDiff(diffText) : undefined;\r\n\tconst outputText = extractContentText(result);\r\n\tconst previewDiff = !result ? computeEditPreviewDiff(path, args) : undefined;\r\n\r\n\treturn {\r\n\t\tkind: \"edit\",\r\n\t\tpath,\r\n\t\tsummary: outputText || (diffText || previewDiff ? `Updated ${path}` : `Editing ${path}`),\r\n\t\tfirstChangedLine: readFirstChangedLine(result) ?? previewDiff?.firstChangedLine,\r\n\t\tdiffText: diffText ?? previewDiff?.diffText,\r\n\t\tdiffLines: parsedDiff?.lines ?? previewDiff?.diffLines,\r\n\t\tdiffStats: parsedDiff?.stats ?? previewDiff?.diffStats,\r\n\t};\r\n}\r\n\r\nfunction buildWriteChange(path: string, args: unknown, result: unknown): ToolFileChange {\r\n\tconst previewText = readString(readRecord(args), [\"content\"]);\r\n\tconst outputText = extractContentText(result);\r\n\tconst previewDiff = !result && previewText ? computeWritePreviewDiff(path, previewText) : undefined;\r\n\r\n\treturn {\r\n\t\tkind: \"write\",\r\n\t\tpath,\r\n\t\tsummary: outputText || (previewText ? summarizeWritePreview(previewText) : `Writing ${path}`),\r\n\t\tpreviewText: previewText ? normalizePreviewText(previewText) : undefined,\r\n\t\tdiffText: previewDiff?.diffText,\r\n\t\tdiffLines: previewDiff?.diffLines,\r\n\t\tdiffStats: previewDiff?.diffStats,\r\n\t\tfirstChangedLine: previewDiff?.firstChangedLine,\r\n\t};\r\n}\r\n\r\nexport function extractToolFileChanges(toolName: string, args: unknown, result: unknown): ToolFileChange[] {\r\n\tconst normalized = toolName.toLowerCase();\r\n\tconst path = readPath(args);\r\n\tif (!path) {\r\n\t\treturn [];\r\n\t}\r\n\r\n\tif (normalized === \"edit\" || normalized === \"edit_file\" || normalized === \"apply_patch\" || normalized === \"patch\") {\r\n\t\treturn [buildEditChange(path, args, result)];\r\n\t}\r\n\r\n\tif (normalized === \"write\" || normalized === \"write_file\") {\r\n\t\treturn [buildWriteChange(path, args, result)];\r\n\t}\r\n\r\n\treturn [];\r\n}\r\n\r\nexport function toolFileChangeLocation(change: ToolFileChange): string {\r\n\treturn change.firstChangedLine ? `${change.path}:${change.firstChangedLine}` : change.path;\r\n}\r\n\r\nexport function formatToolDiffStats(stats: ToolDiffStats | undefined): string | undefined {\r\n\tif (!stats) {\r\n\t\treturn undefined;\r\n\t}\r\n\r\n\tconst parts: string[] = [];\r\n\tif (stats.added > 0) {\r\n\t\tparts.push(`+${stats.added}`);\r\n\t}\r\n\tif (stats.removed > 0) {\r\n\t\tparts.push(`-${stats.removed}`);\r\n\t}\r\n\tif (stats.context > 0) {\r\n\t\tparts.push(`${stats.context} ctx`);\r\n\t}\r\n\treturn parts.join(\" \");\r\n}\r\n\r\nexport function formatToolDiffDeltaStats(stats: ToolDiffStats | undefined): string | undefined {\r\n\tif (!stats) {\r\n\t\treturn undefined;\r\n\t}\r\n\r\n\tconst parts: string[] = [];\r\n\tif (stats.added > 0) {\r\n\t\tparts.push(`+${stats.added}`);\r\n\t}\r\n\tif (stats.removed > 0) {\r\n\t\tparts.push(`-${stats.removed}`);\r\n\t}\r\n\treturn parts.join(\" \");\r\n}\r\n\r\nexport function toolFileChangeInlineSummary(change: ToolFileChange): string {\r\n\tconst location = toolFileChangeLocation(change);\r\n\tif (change.kind === \"edit\") {\r\n\t\treturn `${location}${formatToolDiffDeltaStats(change.diffStats) ? ` | ${formatToolDiffDeltaStats(change.diffStats)}` : \"\"}`;\r\n\t}\r\n\tif (change.previewText) {\r\n\t\treturn `${location} | ${firstNonEmptyLine(change.previewText) ?? change.summary}`;\r\n\t}\r\n\treturn `${location} | ${change.summary}`;\r\n}\r\n"],"mappings":"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","ignoreList":[]}
@@ -1 +1 @@
1
- {"version":3,"names":["Show","FileChangeCardList","wepscliShellTheme","theme","toolStatusLabel","toolStatusTone","toneColor","tone","accent","success","warning","danger","muted","ToolTextSection","props","_el$","_$createElement","_el$2","_el$3","_el$4","_$insertNode","_$setProp","_$insert","title","body","_$effect","_p$","_v$","_v$2","panelAlt","_v$3","border","_v$4","text","e","t","a","o","undefined","ToolMessageDetail","hasFileChanges","tool","fileChanges","length","_el$5","_el$6","_el$7","_el$8","_el$9","_el$0","_$createTextNode","toolName","status","toolCallId","_$createComponent","when","children","changes","argsText","_$memo","outputText","_v$5","_v$6","_v$7"],"sources":["tool-message-detail.tsx"],"sourcesContent":["import { Show } from \"solid-js\";\nimport { FileChangeCardList } from \"./file-change-preview.js\";\nimport { wepscliShellTheme as theme } from \"./theme.js\";\nimport { toolStatusLabel, toolStatusTone, type ToolMessageState } from \"./tool-messages.js\";\n\nfunction toneColor(tone: \"accent\" | \"success\" | \"warning\" | \"danger\" | \"muted\"): string {\n\tswitch (tone) {\n\t\tcase \"accent\":\n\t\t\treturn theme.accent;\n\t\tcase \"success\":\n\t\t\treturn theme.success;\n\t\tcase \"warning\":\n\t\t\treturn theme.warning;\n\t\tcase \"danger\":\n\t\t\treturn theme.danger;\n\t\tcase \"muted\":\n\t\t\treturn theme.muted;\n\t}\n}\n\nfunction ToolTextSection(props: { title: string; body: string }) {\n\treturn (\n\t\t<box flexDirection=\"column\" gap={1}>\n\t\t\t<text fg={theme.accent}>{props.title}</text>\n\t\t\t<box backgroundColor={theme.panelAlt} border={[\"left\"]} borderColor={theme.border} paddingLeft={1}>\n\t\t\t\t<text fg={theme.text} wrapMode=\"word\">{props.body}</text>\n\t\t\t</box>\n\t\t</box>\n\t);\n}\n\nexport function ToolMessageDetail(props: { tool: ToolMessageState }) {\n\tconst hasFileChanges = () => props.tool.fileChanges.length > 0;\n\n\treturn (\n\t\t<box flexDirection=\"column\" gap={1}>\n\t\t\t<box flexDirection=\"row\" justifyContent=\"space-between\" gap={1}>\n\t\t\t\t<text fg={theme.accent}>{props.tool.toolName}</text>\n\t\t\t\t<text fg={toneColor(toolStatusTone(props.tool.status))}>{toolStatusLabel(props.tool.status)}</text>\n\t\t\t</box>\n\t\t\t<text fg={theme.muted}>Call ID: {props.tool.toolCallId}</text>\n\t\t\t<Show when={props.tool.fileChanges.length > 0}>\n\t\t\t\t<FileChangeCardList changes={props.tool.fileChanges} title=\"File Changes\" />\n\t\t\t</Show>\n\t\t\t<Show when={!hasFileChanges()}>\n\t\t\t\t<ToolTextSection title=\"Arguments\" body={props.tool.argsText || \"No arguments\"} />\n\t\t\t</Show>\n\t\t\t<Show when={!hasFileChanges() && props.tool.outputText}>\n\t\t\t\t<ToolTextSection title=\"Output\" body={props.tool.outputText} />\n\t\t\t</Show>\n\t\t</box>\n\t);\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["Show","FileChangeCardList","wepscliShellTheme","theme","toolStatusLabel","toolStatusTone","toneColor","tone","accent","success","warning","danger","muted","ToolTextSection","props","_el$","_$createElement","_el$2","_el$3","_el$4","_$insertNode","_$setProp","_$insert","title","body","_$effect","_p$","_v$","_v$2","panelAlt","_v$3","border","_v$4","text","e","t","a","o","undefined","ToolMessageDetail","hasFileChanges","tool","fileChanges","length","_el$5","_el$6","_el$7","_el$8","_el$9","_el$0","_$createTextNode","toolName","status","toolCallId","_$createComponent","when","children","changes","argsText","_$memo","outputText","_v$5","_v$6","_v$7"],"sources":["tool-message-detail.tsx"],"sourcesContent":["import { Show } from \"solid-js\";\r\nimport { FileChangeCardList } from \"./file-change-preview.js\";\r\nimport { wepscliShellTheme as theme } from \"./theme.js\";\r\nimport { toolStatusLabel, toolStatusTone, type ToolMessageState } from \"./tool-messages.js\";\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 ToolTextSection(props: { title: string; body: string }) {\r\n\treturn (\r\n\t\t<box flexDirection=\"column\" gap={1}>\r\n\t\t\t<text fg={theme.accent}>{props.title}</text>\r\n\t\t\t<box backgroundColor={theme.panelAlt} border={[\"left\"]} borderColor={theme.border} paddingLeft={1}>\r\n\t\t\t\t<text fg={theme.text} wrapMode=\"word\">{props.body}</text>\r\n\t\t\t</box>\r\n\t\t</box>\r\n\t);\r\n}\r\n\r\nexport function ToolMessageDetail(props: { tool: ToolMessageState }) {\r\n\tconst hasFileChanges = () => props.tool.fileChanges.length > 0;\r\n\r\n\treturn (\r\n\t\t<box 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}>{props.tool.toolName}</text>\r\n\t\t\t\t<text fg={toneColor(toolStatusTone(props.tool.status))}>{toolStatusLabel(props.tool.status)}</text>\r\n\t\t\t</box>\r\n\t\t\t<text fg={theme.muted}>Call ID: {props.tool.toolCallId}</text>\r\n\t\t\t<Show when={props.tool.fileChanges.length > 0}>\r\n\t\t\t\t<FileChangeCardList changes={props.tool.fileChanges} title=\"File Changes\" />\r\n\t\t\t</Show>\r\n\t\t\t<Show when={!hasFileChanges()}>\r\n\t\t\t\t<ToolTextSection title=\"Arguments\" body={props.tool.argsText || \"No arguments\"} />\r\n\t\t\t</Show>\r\n\t\t\t<Show when={!hasFileChanges() && props.tool.outputText}>\r\n\t\t\t\t<ToolTextSection title=\"Output\" body={props.tool.outputText} />\r\n\t\t\t</Show>\r\n\t\t</box>\r\n\t);\r\n}\r\n"],"mappings":"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","ignoreList":[]}