shortcutxl 0.3.52 → 0.3.53

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,9 @@
1
1
  # Changelog
2
2
 
3
+ ## [0.3.53]
4
+
5
+ - **Enterprise MCP OAuth fixes** - Hosted enterprise MCP servers now handle OAuth discovery and proxied requests more reliably.
6
+
3
7
  ## [0.3.52]
4
8
 
5
9
  - **Team fast mode policy** - Fast Mode is now automatically disabled for team accounts, with a clear message when your team policy blocks it.
@@ -9,181 +13,181 @@
9
13
  ## [0.3.51]
10
14
 
11
15
  - **TUI rendering and text selection** - Improved TUI rendering, scrolling. Fixed text highlighting and selection for copy pastes.
12
- - **Agentic MCP setup** - Agents can now help set up MCP servers through `shortcut mcp add/list/get/login/logout/remove`, with clearer login, logs, and OAuth settings.
13
- - **User-requested session settings** - When asked, agents can inspect available models and thinking levels or apply your requested session change.
14
- - **Skill sync clarity** - Skill sync now shows startup differences plus per-file upload/download changes, source, and visibility.
15
- - **Fast mode toggle** - Fast Mode now shows in the footer and can be toggled with `alt+f` or `/fast`, with clearer availability warnings.
16
- - **Scrollable approvals** - Large approval and permission dialogs now scroll properly, including spreadsheet change tables in small terminals.
17
-
18
- ## [0.3.50]
19
-
20
- - **MCP-enabled task agents** - General task agents can now use connected MCP servers, giving delegated work access to the same external tools and resources as the main CLI.
21
- - **Safer skill uploads** - Uploading skills no longer treats missing local skills as cloud deletions, so remote-only skills stay untouched unless explicitly replaced.
22
- - **Misc bug fixes** - Shift+A for agent panel, wording, clarity.
23
-
24
- ## [0.3.49]
25
-
26
- - **Transcript scrolling & rendering** - Long conversations now scroll more cleanly with mouse wheel, PageUp/PageDown, and Ctrl+Home/Ctrl+End support while the editor and footer stay pinned.
27
- - **Longer-running task agents** - Background task agents now get a 30-minute default timeout, reducing early timeouts on bigger jobs.
28
- - **Clearer path-based skills** - Skills loaded from custom folders are grouped by their real root paths so the agent can find and use them more reliably.
29
-
30
- ## [0.3.48]
31
-
32
- - **Background subagents** - Subagents can now work in the background, be steered during conversations, be revived for additional tasks once they are done, and have their statuses surfaced in the UI.
33
- - **Skill proposals** - ShortcutXL now automatically browses through past sessions and suggests new skills and skill modifications.
34
-
35
- ## [0.3.47]
36
-
37
- - **GPT-5.5** — Upgraded the OpenAI reasoning model from GPT-5.4 to GPT-5.5 (400K context window, stronger reasoning).
38
- - **Out-of-credits message** — When your credit balance runs out, ShortcutXL now shows a clear message instead of silently failing.
39
-
40
- ## [0.3.46]
41
-
42
- - **`alt+m` to cycle modes** — New keyboard shortcut to cycle between Ask, Plan, and Action modes.
43
- - **Automatic session recovery** — ShortcutXL now silently refreshes your token and retries when the session expires mid-run, instead of surfacing a "Session expired" error.
44
-
45
- ## [0.3.45]
46
-
47
- - **Preserve Excel calculation mode** — ShortcutXL no longer overrides Excel's calculation mode during code execution. If you have manual calculation enabled, it stays manual while Shortcut runs your code.
48
-
49
- ## [0.3.44]
50
-
51
- - **Shorty mascot** — Replaced the braille X logo with a new Shorty block-art mascot.
52
- - **Plan mode bug fix** — Fixed an issue where plan mode was unable to read files.
53
-
54
- ## [0.3.43]
55
-
56
- - **Security & stability** — Internal hardening fixes across the runtime.
57
-
58
- ## [0.3.42]
59
-
60
- - **Hosted MCP OAuth** — ShortcutXL now supports OAuth-authenticated hosted MCP servers. Configure a hosted MCP in `mcp.json`, then log in from `/mcp` or `/login`, see `login required` status when auth is missing, and log out again directly from the MCP menu.
61
- - **AgentController context cleanup** — Simplified agent context and prompt behavior for cleaner single-turn and multi-turn execution.
62
-
63
- ## [0.3.40]
64
-
65
- - **Runtime permissions** — New `/permissions` command to review and change what file and shell tools can do. Approve individual workspaces, grant narrower read or read/write exceptions to files and folders outside them, and toggle spreadsheet auto-approve per settings profile.
66
- - **Skip runtime and spreadsheet permissions** — Explicit `/permissions skip-runtime-permissions` (and matching `--skip-runtime-permissions` / `--skip-spreadsheet-permissions` CLI flags) for when you intentionally want those permission boundaries disabled.
67
-
68
- ## [0.3.39]
69
-
70
- - **Claude Opus 4.7** - Added Claude Opus 4.7 as a selectable Shortcut model with a 1M-token context window.
71
- - **Clearer mode switching** - Action, Plan, and Installation now each expose only the mode switches that are actually valid from that mode.
72
- - **More reliable Excel connection handling** - ShortcutXL now gives clearer guidance and better context for Excel and workbook state.
73
-
74
- ## [0.3.38]
75
-
76
- - **Inline `/skill:name` invocations** — Trigger a skill from anywhere in your message, not just the start.
77
- - **Interactive approval for skill downloads** — `/download-skills` now shows per-skill diffs (modified, local-only, and remote-only files) and asks before replacing a local skill folder with the cloud copy.
78
- - **Larger context windows** — Claude Opus 4.6 bumped to 400K tokens; GPT-5.4 bumped to 272K tokens.
79
-
80
- ## [0.3.37]
81
-
82
- - **Bug fixes** — Improved stability for autonomous workflows and update checks.
83
-
84
- ## [0.3.36]
85
-
86
- - **Enterprise install fix** - ShortcutXL no longer fails installation on locked-down networks just because WhatsApp phone control depends on a GitHub-hosted package. Standard installs now succeed without needing GitHub SSH access.
87
-
88
- ## [0.3.35]
89
-
90
- - **Edit-mode detection** — When you're editing a cell, ShortcutXL now detects it and waits instead of throwing a cryptic COM error. You'll see a prompt asking you to press Enter or Escape, and execution resumes automatically.
91
- - **Bug fixes** — General stability and reliability improvements across credit reporting, Excel operations, session resumption, and concurrency.
92
-
93
- ## [0.3.34]
94
-
95
- - **Revamped update flow** - When an update is available at launch, ShortcutXL now prompts before the shell starts and runs the update in the foreground.
96
- - **Import skills from Claude Code and Codex** - New `/port-skills` lets you register skills from Claude Code, Codex, and `.agents` folders.
97
- - **Better `/autonomous` continuation** - Long-running autonomous tasks now continue more cleanly after a context refresh instead of losing the thread mid-run.
98
-
99
- ## [0.2.32]
100
-
101
- - **Durable memory** - ShortcutXL now remembers useful context across sessions, so you no longer need to repeat the same preferences and project details every time you start a new conversation.
102
- - **Faster and more reliable tool use** - Read-only tools can run while the assistant is still streaming, interrupted turns recover more gracefully, and long responses continue more reliably.
103
- - **`/manage` mode** - New delegation-focused mode for complex work. Use `/manage` when you want the agent to coordinate tasks instead of executing everything directly.
104
- - **Tool summaries** - The interactive UI now shows short human-readable summaries of tool executions so it's easier to follow what the agent is doing.
105
- - **Budgeted runs** - New `/budget <token-budget> <task>` command for long-running work with an explicit cumulative token limit.
106
- - **More reliable MCP connections** - Long-running MCP tools now handle timeouts and progress more gracefully, with clearer errors and better visibility in `/mcp`.
107
- - **Skill visibility controls** - `/skills` now lets you choose which loaded skills are advertised to the agent. Unchecked skills stay available through explicit `/skill:name`.
108
- - **Skill upload** - New `/upload-skills` command to push your local user skills to cloud storage, with approval before overwriting or deleting an existing remote copy.
109
- - **Faster workbook startup context** - ShortcutXL now uses a lighter workbook context during startup, improving responsiveness before deeper workbook inspection is needed.
110
-
111
- ## [0.2.31]
112
-
113
- - **Improved agent behavior quality** — Better exploration, verification, and convention-matching when working with spreadsheets.
114
-
115
- ## [0.2.30]
116
-
117
- - **MCP server support** — Connect external tools via the Model Context Protocol. Ask the agent to set one up and it will walk you through config, credentials via `/connect`, and verification. Use `/mcp` to see connected servers and their tools.
118
- - **Loops** — Set up recurring tasks with `/loop`. The agent executes them in the background and shows a status line in the footer. Example: `/loop 5m pull latest google earnings when it drops`.
119
- - **Autonomous mode** — Run `/autonomous` to let the agent tackle complex tasks end-to-end. It collaborates with you on a phased plan, then executes each phase with built-in implementation, testing, and independent review cycles.
120
-
121
- ## [0.2.28]
122
-
123
- - **Three working modes** — Ask questions about your spreadsheet (Ask), plan complex changes before executing (Plan), or jump straight into edits (Action). Switch anytime with `/ask`, `/plan`, `/action`.
124
- - **Claude Code & Codex plugin integration** — Use ShortcutXL as a skill directly from Claude Code or Codex.
125
- - **Improved installation experience** — Smoother setup with better error handling and guided prompts.
126
- - **Built-in help** — `/docs` opens a guide covering features, workflows, and integrations.
127
- - **Cleaner status bar** — Simplified token usage display in the footer.
128
-
129
- ## [0.2.27]
130
-
131
- - **Friendlier setup experience** — First-time install now shows plain-language step names (e.g. "Calculation Engine" instead of "Python Packages") and a prominent green prompt when Excel needs to be opened.
132
-
133
- ## [0.2.26]
134
-
135
- - **Workbook scope** — When multiple workbooks are open, ShortcutXL now asks which ones to focus on. The agent only sees the workbooks you select, keeping context tight and responses more relevant.
136
- - **Connections** — Connect external data sources via `/connect`. Supports databases (Snowflake, Postgres, Oracle, MySQL), SaaS APIs (Salesforce, Notion, HubSpot, Airtable), and cloud drives. Credentials are stored in the OS keychain.
137
- - **Skill sync** — Download shared skills from the cloud with `/download-skills`.
138
- - **Skill creator** — A built-in eval-driven workflow for authoring, testing, and improving custom skills.
139
- - **Fixed local install issues** — Resolved a shell path bug that could prevent the CLI from launching after a global npm install.
140
-
141
- ## [0.2.22]
142
-
143
- - **Tool extensions** — Build custom tools that the agent can call.
144
- - **Sandbox hardening** — The sandbox now blocks more ways code could escape isolation. When you update ShortcutXL, the sandbox automatically updates itself too.
145
- - **Faster install** — Sandbox is now downloaded on demand instead of bundled.
146
-
147
- ## [0.2.19]
148
-
149
- - **Sandbox & security hardening** — Code execution can now optionally run inside a sandbox (/sandbox) that blocks unauthorized file writes, reads, and in-bound and out-bound network traffic.
150
- - **Clearer privacy controls** - You can opt out of conversation uploads to our servers for complete privacy.
151
-
152
- ## [0.2.18]
153
-
154
- - **Fixed startup crash** — Resolved a circular import in the Python modules that caused "internal error" on every Excel action.
155
-
156
- ## [0.2.17]
157
-
158
- - **Better change review dialog** — Cell diffs now show full addresses (e.g. `Sheet1!A1`), formula details, and keyboard navigation with arrow keys for scrolling through large changesets.
159
- - **Alt+V paste is more reliable** — Fixed cases where Alt+V would fail silently. Now gives clear feedback and handles clipboard errors gracefully.
160
- - **Skill saving bug fixed** — Skills are not saved in the correct directory and survives application updates.
161
- - **Clean terminal on launch** — Starting ShortcutXL now clears prior output so you always begin with a fresh screen.
162
-
163
- ## [0.2.14]
164
-
165
- - **Python linting & type checking** — Added ruff and pyright checks for the Python modules and tests. Import sorting, unused variables, and type errors are now caught before publish.
166
- - **Cleaner dead-code detection** — Removed unused TypeScript exports and tightened knip configuration.
167
-
168
- ## [0.2.13]
169
-
170
- - **Stay logged in across terminals** — Previously, opening a new terminal while others were running could force you to log in again. Now your session persists reliably no matter how many terminals you have open.
171
-
172
- ## [0.2.12]
173
-
174
- - **No more popup windows during updates** — Background updates now run silently instead of flashing a command prompt on your screen.
175
-
176
- ## [0.2.11]
177
-
178
- - **More reliable first-time setup** — ShortcutXL now waits for Excel to be fully ready before running its connection test, so setup succeeds on the first try even on slower machines.
179
- - **Switched to production servers** — All traffic now routes through `shortcut.ai` production endpoints for better performance and reliability.
180
-
181
- ## [0.2.9]
182
-
183
- - **Works without Python on your PATH** — ShortcutXL now finds and loads Python automatically. No more fiddling with environment variables or system settings to get things working.
184
-
185
- ## [0.1.1]
186
-
187
- - **Update notifications** — ShortcutXL tells you when a new version is available and shows you the exact command to upgrade.
188
- - **Survives reinstalls** — Updating or reinstalling the npm package no longer breaks your Excel setup. Everything keeps working without reconfiguration.
189
- - **Handles Excel locks gracefully** — If Excel has ShortcutXL loaded during an update, you get a clear message instead of a crash.
16
+ - **Agentic MCP setup** - Agents can now help set up MCP servers through `shortcut mcp add/list/get/login/logout/remove`, with clearer login, logs, and OAuth settings.
17
+ - **User-requested session settings** - When asked, agents can inspect available models and thinking levels or apply your requested session change.
18
+ - **Skill sync clarity** - Skill sync now shows startup differences plus per-file upload/download changes, source, and visibility.
19
+ - **Fast mode toggle** - Fast Mode now shows in the footer and can be toggled with `alt+f` or `/fast`, with clearer availability warnings.
20
+ - **Scrollable approvals** - Large approval and permission dialogs now scroll properly, including spreadsheet change tables in small terminals.
21
+
22
+ ## [0.3.50]
23
+
24
+ - **MCP-enabled task agents** - General task agents can now use connected MCP servers, giving delegated work access to the same external tools and resources as the main CLI.
25
+ - **Safer skill uploads** - Uploading skills no longer treats missing local skills as cloud deletions, so remote-only skills stay untouched unless explicitly replaced.
26
+ - **Misc bug fixes** - Shift+A for agent panel, wording, clarity.
27
+
28
+ ## [0.3.49]
29
+
30
+ - **Transcript scrolling & rendering** - Long conversations now scroll more cleanly with mouse wheel, PageUp/PageDown, and Ctrl+Home/Ctrl+End support while the editor and footer stay pinned.
31
+ - **Longer-running task agents** - Background task agents now get a 30-minute default timeout, reducing early timeouts on bigger jobs.
32
+ - **Clearer path-based skills** - Skills loaded from custom folders are grouped by their real root paths so the agent can find and use them more reliably.
33
+
34
+ ## [0.3.48]
35
+
36
+ - **Background subagents** - Subagents can now work in the background, be steered during conversations, be revived for additional tasks once they are done, and have their statuses surfaced in the UI.
37
+ - **Skill proposals** - ShortcutXL now automatically browses through past sessions and suggests new skills and skill modifications.
38
+
39
+ ## [0.3.47]
40
+
41
+ - **GPT-5.5** — Upgraded the OpenAI reasoning model from GPT-5.4 to GPT-5.5 (400K context window, stronger reasoning).
42
+ - **Out-of-credits message** — When your credit balance runs out, ShortcutXL now shows a clear message instead of silently failing.
43
+
44
+ ## [0.3.46]
45
+
46
+ - **`alt+m` to cycle modes** — New keyboard shortcut to cycle between Ask, Plan, and Action modes.
47
+ - **Automatic session recovery** — ShortcutXL now silently refreshes your token and retries when the session expires mid-run, instead of surfacing a "Session expired" error.
48
+
49
+ ## [0.3.45]
50
+
51
+ - **Preserve Excel calculation mode** — ShortcutXL no longer overrides Excel's calculation mode during code execution. If you have manual calculation enabled, it stays manual while Shortcut runs your code.
52
+
53
+ ## [0.3.44]
54
+
55
+ - **Shorty mascot** — Replaced the braille X logo with a new Shorty block-art mascot.
56
+ - **Plan mode bug fix** — Fixed an issue where plan mode was unable to read files.
57
+
58
+ ## [0.3.43]
59
+
60
+ - **Security & stability** — Internal hardening fixes across the runtime.
61
+
62
+ ## [0.3.42]
63
+
64
+ - **Hosted MCP OAuth** — ShortcutXL now supports OAuth-authenticated hosted MCP servers. Configure a hosted MCP in `mcp.json`, then log in from `/mcp` or `/login`, see `login required` status when auth is missing, and log out again directly from the MCP menu.
65
+ - **AgentController context cleanup** — Simplified agent context and prompt behavior for cleaner single-turn and multi-turn execution.
66
+
67
+ ## [0.3.40]
68
+
69
+ - **Runtime permissions** — New `/permissions` command to review and change what file and shell tools can do. Approve individual workspaces, grant narrower read or read/write exceptions to files and folders outside them, and toggle spreadsheet auto-approve per settings profile.
70
+ - **Skip runtime and spreadsheet permissions** — Explicit `/permissions skip-runtime-permissions` (and matching `--skip-runtime-permissions` / `--skip-spreadsheet-permissions` CLI flags) for when you intentionally want those permission boundaries disabled.
71
+
72
+ ## [0.3.39]
73
+
74
+ - **Claude Opus 4.7** - Added Claude Opus 4.7 as a selectable Shortcut model with a 1M-token context window.
75
+ - **Clearer mode switching** - Action, Plan, and Installation now each expose only the mode switches that are actually valid from that mode.
76
+ - **More reliable Excel connection handling** - ShortcutXL now gives clearer guidance and better context for Excel and workbook state.
77
+
78
+ ## [0.3.38]
79
+
80
+ - **Inline `/skill:name` invocations** — Trigger a skill from anywhere in your message, not just the start.
81
+ - **Interactive approval for skill downloads** — `/download-skills` now shows per-skill diffs (modified, local-only, and remote-only files) and asks before replacing a local skill folder with the cloud copy.
82
+ - **Larger context windows** — Claude Opus 4.6 bumped to 400K tokens; GPT-5.4 bumped to 272K tokens.
83
+
84
+ ## [0.3.37]
85
+
86
+ - **Bug fixes** — Improved stability for autonomous workflows and update checks.
87
+
88
+ ## [0.3.36]
89
+
90
+ - **Managed-network install fix** - ShortcutXL no longer fails installation on locked-down networks just because WhatsApp phone control depends on a GitHub-hosted package. Standard installs now succeed without needing GitHub SSH access.
91
+
92
+ ## [0.3.35]
93
+
94
+ - **Edit-mode detection** — When you're editing a cell, ShortcutXL now detects it and waits instead of throwing a cryptic COM error. You'll see a prompt asking you to press Enter or Escape, and execution resumes automatically.
95
+ - **Bug fixes** — General stability and reliability improvements across credit reporting, Excel operations, session resumption, and concurrency.
96
+
97
+ ## [0.3.34]
98
+
99
+ - **Revamped update flow** - When an update is available at launch, ShortcutXL now prompts before the shell starts and runs the update in the foreground.
100
+ - **Import skills from Claude Code and Codex** - New `/port-skills` lets you register skills from Claude Code, Codex, and `.agents` folders.
101
+ - **Better `/autonomous` continuation** - Long-running autonomous tasks now continue more cleanly after a context refresh instead of losing the thread mid-run.
102
+
103
+ ## [0.2.32]
104
+
105
+ - **Durable memory** - ShortcutXL now remembers useful context across sessions, so you no longer need to repeat the same preferences and project details every time you start a new conversation.
106
+ - **Faster and more reliable tool use** - Read-only tools can run while the assistant is still streaming, interrupted turns recover more gracefully, and long responses continue more reliably.
107
+ - **`/manage` mode** - New delegation-focused mode for complex work. Use `/manage` when you want the agent to coordinate tasks instead of executing everything directly.
108
+ - **Tool summaries** - The interactive UI now shows short human-readable summaries of tool executions so it's easier to follow what the agent is doing.
109
+ - **Budgeted runs** - New `/budget <token-budget> <task>` command for long-running work with an explicit cumulative token limit.
110
+ - **More reliable MCP connections** - Long-running MCP tools now handle timeouts and progress more gracefully, with clearer errors and better visibility in `/mcp`.
111
+ - **Skill visibility controls** - `/skills` now lets you choose which loaded skills are advertised to the agent. Unchecked skills stay available through explicit `/skill:name`.
112
+ - **Skill upload** - New `/upload-skills` command to push your local user skills to cloud storage, with approval before overwriting or deleting an existing remote copy.
113
+ - **Faster workbook startup context** - ShortcutXL now uses a lighter workbook context during startup, improving responsiveness before deeper workbook inspection is needed.
114
+
115
+ ## [0.2.31]
116
+
117
+ - **Improved agent behavior quality** — Better exploration, verification, and convention-matching when working with spreadsheets.
118
+
119
+ ## [0.2.30]
120
+
121
+ - **MCP server support** — Connect external tools via the Model Context Protocol. Ask the agent to set one up and it will walk you through config, credentials via `/connect`, and verification. Use `/mcp` to see connected servers and their tools.
122
+ - **Loops** — Set up recurring tasks with `/loop`. The agent executes them in the background and shows a status line in the footer. Example: `/loop 5m pull latest google earnings when it drops`.
123
+ - **Autonomous mode** — Run `/autonomous` to let the agent tackle complex tasks end-to-end. It collaborates with you on a phased plan, then executes each phase with built-in implementation, testing, and independent review cycles.
124
+
125
+ ## [0.2.28]
126
+
127
+ - **Three working modes** — Ask questions about your spreadsheet (Ask), plan complex changes before executing (Plan), or jump straight into edits (Action). Switch anytime with `/ask`, `/plan`, `/action`.
128
+ - **Claude Code & Codex plugin integration** — Use ShortcutXL as a skill directly from Claude Code or Codex.
129
+ - **Improved installation experience** — Smoother setup with better error handling and guided prompts.
130
+ - **Built-in help** — `/docs` opens a guide covering features, workflows, and integrations.
131
+ - **Cleaner status bar** — Simplified token usage display in the footer.
132
+
133
+ ## [0.2.27]
134
+
135
+ - **Friendlier setup experience** — First-time install now shows plain-language step names (e.g. "Calculation Engine" instead of "Python Packages") and a prominent green prompt when Excel needs to be opened.
136
+
137
+ ## [0.2.26]
138
+
139
+ - **Workbook scope** — When multiple workbooks are open, ShortcutXL now asks which ones to focus on. The agent only sees the workbooks you select, keeping context tight and responses more relevant.
140
+ - **Connections** — Connect external data sources via `/connect`. Supports databases (Snowflake, Postgres, Oracle, MySQL), SaaS APIs (Salesforce, Notion, HubSpot, Airtable), and cloud drives. Credentials are stored in the OS keychain.
141
+ - **Skill sync** — Download shared skills from the cloud with `/download-skills`.
142
+ - **Skill creator** — A built-in eval-driven workflow for authoring, testing, and improving custom skills.
143
+ - **Fixed local install issues** — Resolved a shell path bug that could prevent the CLI from launching after a global npm install.
144
+
145
+ ## [0.2.22]
146
+
147
+ - **Tool extensions** — Build custom tools that the agent can call.
148
+ - **Sandbox hardening** — The sandbox now blocks more ways code could escape isolation. When you update ShortcutXL, the sandbox automatically updates itself too.
149
+ - **Faster install** — Sandbox is now downloaded on demand instead of bundled.
150
+
151
+ ## [0.2.19]
152
+
153
+ - **Sandbox & security hardening** — Code execution can now optionally run inside a sandbox (/sandbox) that blocks unauthorized file writes, reads, and in-bound and out-bound network traffic.
154
+ - **Clearer privacy controls** - You can opt out of conversation uploads to our servers for complete privacy.
155
+
156
+ ## [0.2.18]
157
+
158
+ - **Fixed startup crash** — Resolved a circular import in the Python modules that caused "internal error" on every Excel action.
159
+
160
+ ## [0.2.17]
161
+
162
+ - **Better change review dialog** — Cell diffs now show full addresses (e.g. `Sheet1!A1`), formula details, and keyboard navigation with arrow keys for scrolling through large changesets.
163
+ - **Alt+V paste is more reliable** — Fixed cases where Alt+V would fail silently. Now gives clear feedback and handles clipboard errors gracefully.
164
+ - **Skill saving bug fixed** — Skills are not saved in the correct directory and survives application updates.
165
+ - **Clean terminal on launch** — Starting ShortcutXL now clears prior output so you always begin with a fresh screen.
166
+
167
+ ## [0.2.14]
168
+
169
+ - **Python linting & type checking** — Added ruff and pyright checks for the Python modules and tests. Import sorting, unused variables, and type errors are now caught before publish.
170
+ - **Cleaner dead-code detection** — Removed unused TypeScript exports and tightened knip configuration.
171
+
172
+ ## [0.2.13]
173
+
174
+ - **Stay logged in across terminals** — Previously, opening a new terminal while others were running could force you to log in again. Now your session persists reliably no matter how many terminals you have open.
175
+
176
+ ## [0.2.12]
177
+
178
+ - **No more popup windows during updates** — Background updates now run silently instead of flashing a command prompt on your screen.
179
+
180
+ ## [0.2.11]
181
+
182
+ - **More reliable first-time setup** — ShortcutXL now waits for Excel to be fully ready before running its connection test, so setup succeeds on the first try even on slower machines.
183
+ - **Switched to production servers** — All traffic now routes through `shortcut.ai` production endpoints for better performance and reliability.
184
+
185
+ ## [0.2.9]
186
+
187
+ - **Works without Python on your PATH** — ShortcutXL now finds and loads Python automatically. No more fiddling with environment variables or system settings to get things working.
188
+
189
+ ## [0.1.1]
190
+
191
+ - **Update notifications** — ShortcutXL tells you when a new version is available and shows you the exact command to upgrade.
192
+ - **Survives reinstalls** — Updating or reinstalling the npm package no longer breaks your Excel setup. Everything keeps working without reconfiguration.
193
+ - **Handles Excel locks gracefully** — If Excel has ShortcutXL loaded during an update, you get a clear message instead of a crash.
@@ -28,9 +28,7 @@ export { resolveCliModel } from './providers/model-resolver.js';
28
28
  export { registerShortcutProvider } from './providers/register-shortcut-provider.js';
29
29
  export * from './resources/index.js';
30
30
  export type { PromptTemplate, Skill } from './resources/index.js';
31
- export { detectProjectWorkspace, type ProjectWorkspace } from './services/project-workspace.js';
32
- export { UserContextProvider, fetchUserInfo, type WorkspaceContextValue } from './services/user-context.js';
33
- export { createWebsiteStorageOperations, type WebsiteStorageOptions } from './services/website-storage.js';
31
+ export { fetchUserInfo, type UserInfo } from './services/user-context.js';
34
32
  export { getLastAssistantText } from './session/assistant-text.js';
35
33
  export { listAllSessions, listSessions } from './session/session-catalog.js';
36
34
  export type { SessionInfo, SessionListProgress } from './session/session-catalog.js';
package/dist/app/index.js CHANGED
@@ -23,9 +23,7 @@ export { ModelRegistry } from './providers/model-registry.js';
23
23
  export { resolveCliModel } from './providers/model-resolver.js';
24
24
  export { registerShortcutProvider } from './providers/register-shortcut-provider.js';
25
25
  export * from './resources/index.js';
26
- export { detectProjectWorkspace } from './services/project-workspace.js';
27
- export { UserContextProvider, fetchUserInfo } from './services/user-context.js';
28
- export { createWebsiteStorageOperations } from './services/website-storage.js';
26
+ export { fetchUserInfo } from './services/user-context.js';
29
27
  export { getLastAssistantText } from './session/assistant-text.js';
30
28
  export { listAllSessions, listSessions } from './session/session-catalog.js';
31
29
  export { continueRecentSessionManager, createInMemorySessionManager, createSessionManager, forkSessionManager, openSessionManager } from './session/session-factory.js';
@@ -1,7 +1,7 @@
1
1
  /**
2
2
  * MCP server connection — connect, listTools, callTool, close.
3
3
  */
4
- import { UnauthorizedError } from '@modelcontextprotocol/sdk/client/auth.js';
4
+ import { extractWWWAuthenticateParams, UnauthorizedError } from '@modelcontextprotocol/sdk/client/auth.js';
5
5
  import { Client } from '@modelcontextprotocol/sdk/client/index.js';
6
6
  import { StdioClientTransport } from '@modelcontextprotocol/sdk/client/stdio.js';
7
7
  import { StreamableHTTPClientTransport, StreamableHTTPError } from '@modelcontextprotocol/sdk/client/streamableHttp.js';
@@ -14,6 +14,7 @@ import { getSecret } from '../connectors/secret-store.js';
14
14
  import { getHostedMcpOAuthProviderId } from './hosted-oauth-id.js';
15
15
  import { createHostedMcpRuntimeAuthProvider } from './hosted-oauth-provider.js';
16
16
  import { resolveHostedMcpOAuthTimeoutMs, supportsHostedMcpOAuth } from './oauth-discovery.js';
17
+ import { withHostedMcpProxyFetchOptions } from './proxy-fetch.js';
17
18
  import { isHostedServerConfig } from './types.js';
18
19
  const DEFAULT_STARTUP_TIMEOUT_MS = 30_000;
19
20
  const DEFAULT_TOOL_CALL_TIMEOUT_MS = 600_000;
@@ -301,6 +302,58 @@ function summarizeRequestHeaders(headers) {
301
302
  ...(protocolVersion ? { mcpProtocolVersion: protocolVersion } : {})
302
303
  });
303
304
  }
305
+ function summarizeResponseHeaders(response) {
306
+ const headerNames = [...response.headers.keys()].sort();
307
+ const contentType = response.headers.get('content-type');
308
+ const location = response.headers.get('location');
309
+ const mcpSessionId = response.headers.get('mcp-session-id');
310
+ const wwwAuthenticate = response.headers.get('www-authenticate');
311
+ const authParams = extractWWWAuthenticateParams(response);
312
+ return JSON.stringify({
313
+ headerNames,
314
+ contentType,
315
+ hasMcpSessionId: !!mcpSessionId,
316
+ ...(location ? { location: redactUrlForLog(location) } : {}),
317
+ ...(wwwAuthenticate
318
+ ? {
319
+ wwwAuthenticate: {
320
+ hasHeader: true,
321
+ ...(authParams.error ? { error: authParams.error } : {}),
322
+ ...(authParams.scope ? { scope: authParams.scope } : {}),
323
+ ...(authParams.resourceMetadataUrl
324
+ ? { resourceMetadataUrl: redactUrlForLog(authParams.resourceMetadataUrl.toString()) }
325
+ : {})
326
+ }
327
+ }
328
+ : {})
329
+ });
330
+ }
331
+ function buildMcpHttpRequestLogContext(input, init) {
332
+ const method = readRequestMethod(input, init);
333
+ const headers = readRequestHeaders(input, init);
334
+ const phase = inferMcpHttpPhase(method, init);
335
+ return `phase='${phase}' method='${method}' url='${redactUrlForLog(input)}' requestHeaders=${summarizeRequestHeaders(headers)}`;
336
+ }
337
+ function summarizeErrorForLog(error, depth = 0) {
338
+ if (!(error instanceof Error)) {
339
+ return String(error);
340
+ }
341
+ const details = {
342
+ name: error.name,
343
+ message: error.message
344
+ };
345
+ const record = error;
346
+ for (const key of ['code', 'errno', 'syscall', 'hostname', 'host', 'port', 'address']) {
347
+ const value = record[key];
348
+ if (value !== undefined) {
349
+ details[key] = value;
350
+ }
351
+ }
352
+ if (record.cause !== undefined && depth < 3) {
353
+ details.cause = summarizeErrorForLog(record.cause, depth + 1);
354
+ }
355
+ return details;
356
+ }
304
357
  async function readResponseSnippet(response) {
305
358
  try {
306
359
  const text = await response.clone().text();
@@ -312,15 +365,21 @@ async function readResponseSnippet(response) {
312
365
  }
313
366
  export function createHostedMcpLoggingFetch(serverName, fetchImpl = fetch) {
314
367
  return async (input, init) => {
315
- const response = await fetchImpl(input, init);
368
+ const startedAt = Date.now();
369
+ const requestContext = buildMcpHttpRequestLogContext(input, init);
370
+ let response;
371
+ try {
372
+ response = await fetchImpl(input, withHostedMcpProxyFetchOptions(input, init));
373
+ }
374
+ catch (err) {
375
+ log.warn('mcp', `Hosted MCP fetch failed: server='${serverName}' ${requestContext} durationMs=${Date.now() - startedAt} error=${JSON.stringify(summarizeErrorForLog(err))}`);
376
+ throw err;
377
+ }
316
378
  if (response.ok) {
317
379
  return response;
318
380
  }
319
- const method = readRequestMethod(input, init);
320
- const headers = readRequestHeaders(input, init);
321
- const phase = inferMcpHttpPhase(method, init);
322
381
  const bodySnippet = await readResponseSnippet(response);
323
- log.warn('mcp', `Hosted MCP HTTP failure: server='${serverName}' phase='${phase}' method='${method}' url='${redactUrlForLog(input)}' status=${response.status} statusText='${response.statusText}' requestHeaders=${summarizeRequestHeaders(headers)} responseBody='${bodySnippet}'`);
382
+ log.warn('mcp', `Hosted MCP HTTP failure: server='${serverName}' ${requestContext} durationMs=${Date.now() - startedAt} status=${response.status} statusText='${response.statusText}' responseHeaders=${summarizeResponseHeaders(response)} responseBody='${bodySnippet}'`);
324
383
  return response;
325
384
  };
326
385
  }
@@ -5,6 +5,7 @@ import { startOAuthCallbackServer } from '../auth/oauth-callback-server.js';
5
5
  import { getHostedMcpOAuthConfig, getHostedMcpOAuthProviderId } from './hosted-oauth-id.js';
6
6
  import { registerManagedMcpOAuthProvider, unregisterManagedMcpOAuthProvider } from './managed-oauth-providers.js';
7
7
  import { resolveHostedMcpOAuth, resolveHostedMcpOAuthTimeoutMs } from './oauth-discovery.js';
8
+ import { hostedMcpFetch } from './proxy-fetch.js';
8
9
  const DEFAULT_REDIRECT_URL = 'http://127.0.0.1:0/auth/callback';
9
10
  const EXPIRY_BUFFER_MS = 30_000;
10
11
  // The underlying OAuth provider registry is process-global, so hosted MCP
@@ -250,7 +251,8 @@ export function createHostedMcpOAuthProvider(serverName, config, authStorage, mc
250
251
  const result = await auth(provider, {
251
252
  serverUrl: config.url,
252
253
  scope: resolvedAuth.scope,
253
- resourceMetadataUrl: resolvedAuth.resourceMetadataUrl
254
+ resourceMetadataUrl: resolvedAuth.resourceMetadataUrl,
255
+ fetchFn: hostedMcpFetch
254
256
  });
255
257
  if (result === 'REDIRECT') {
256
258
  const authorizationCode = parseAuthorizationCode(await callbackServer.waitForCallback(), await provider.state?.());
@@ -258,7 +260,8 @@ export function createHostedMcpOAuthProvider(serverName, config, authStorage, mc
258
260
  serverUrl: config.url,
259
261
  authorizationCode,
260
262
  scope: resolvedAuth.scope,
261
- resourceMetadataUrl: resolvedAuth.resourceMetadataUrl
263
+ resourceMetadataUrl: resolvedAuth.resourceMetadataUrl,
264
+ fetchFn: hostedMcpFetch
262
265
  });
263
266
  }
264
267
  return toOAuthCredentials(await provider.tokens());
@@ -287,7 +290,8 @@ export function createHostedMcpOAuthProvider(serverName, config, authStorage, mc
287
290
  await auth(provider, {
288
291
  serverUrl: config.url,
289
292
  scope: resolvedAuth.scope,
290
- resourceMetadataUrl: resolvedAuth.resourceMetadataUrl
293
+ resourceMetadataUrl: resolvedAuth.resourceMetadataUrl,
294
+ fetchFn: hostedMcpFetch
291
295
  });
292
296
  return toOAuthCredentials(await provider.tokens());
293
297
  },
@@ -1,5 +1,6 @@
1
1
  import { discoverOAuthServerInfo, extractWWWAuthenticateParams } from '@modelcontextprotocol/sdk/client/auth.js';
2
2
  import { getHostedMcpOAuthProviderId } from './hosted-oauth-id.js';
3
+ import { withHostedMcpProxyFetchOptions } from './proxy-fetch.js';
3
4
  const DEFAULT_DISCOVERY_TIMEOUT_MS = 30_000;
4
5
  function normalizeScope(scope) {
5
6
  if (!scope) {
@@ -26,7 +27,7 @@ async function probeUnauthorizedChallenge(serverUrl, timeoutMs) {
26
27
  const timeout = setTimeout(() => controller.abort(), timeoutMs);
27
28
  if (typeof timeout === 'object' && 'unref' in timeout)
28
29
  timeout.unref();
29
- const response = await fetch(serverUrl, {
30
+ const init = withHostedMcpProxyFetchOptions(serverUrl, {
30
31
  method: 'GET',
31
32
  redirect: 'manual',
32
33
  signal: controller.signal,
@@ -35,6 +36,7 @@ async function probeUnauthorizedChallenge(serverUrl, timeoutMs) {
35
36
  'mcp-protocol-version': '2024-11-05'
36
37
  }
37
38
  });
39
+ const response = await fetch(serverUrl, init);
38
40
  clearTimeout(timeout);
39
41
  return extractWWWAuthenticateParams(response);
40
42
  }
@@ -55,10 +57,7 @@ function createTimedFetch(timeoutMs) {
55
57
  ? AbortSignal.any([init.signal, controller.signal])
56
58
  : controller.signal;
57
59
  try {
58
- return await fetch(input, {
59
- ...init,
60
- signal
61
- });
60
+ return await fetch(input, withHostedMcpProxyFetchOptions(input, { ...init, signal }));
62
61
  }
63
62
  finally {
64
63
  clearTimeout(timeout);
@@ -0,0 +1,3 @@
1
+ export declare function withHostedMcpProxyFetchOptions(input: Parameters<typeof fetch>[0], init?: Parameters<typeof fetch>[1]): Parameters<typeof fetch>[1];
2
+ export declare const hostedMcpFetch: typeof fetch;
3
+ //# sourceMappingURL=proxy-fetch.d.ts.map