shortcutxl 0.3.44 → 0.3.45

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 (172) hide show
  1. package/CHANGELOG.md +4 -0
  2. package/dist/app/prompts/com-api-reference.json +95 -26
  3. package/dist/app/prompts/mog-api-reference.json +11454 -11454
  4. package/dist/app/prompts/spreadjs-api-reference.json +552 -552
  5. package/dist/cli.js +1 -1
  6. package/dist/shell/export-html/template.js +1796 -1796
  7. package/dist/shell/export-html/vendor/highlight.min.js +7725 -7725
  8. package/dist/shell/export-html/vendor/marked.min.js +1803 -1803
  9. package/dist/shell/theme/dark.json +88 -88
  10. package/dist/shell/theme/light.json +88 -88
  11. package/dist/shell/theme/theme-schema.json +340 -340
  12. package/dist/tui/autocomplete.d.ts +78 -78
  13. package/dist/tui/autocomplete.js +616 -616
  14. package/dist/tui/components/box.d.ts +22 -22
  15. package/dist/tui/components/box.js +108 -108
  16. package/dist/tui/components/cancellable-loader.d.ts +22 -22
  17. package/dist/tui/components/cancellable-loader.js +35 -35
  18. package/dist/tui/components/editor.d.ts +205 -205
  19. package/dist/tui/components/editor.js +1733 -1733
  20. package/dist/tui/components/image.d.ts +34 -34
  21. package/dist/tui/components/image.js +73 -73
  22. package/dist/tui/components/input.d.ts +37 -37
  23. package/dist/tui/components/input.js +465 -465
  24. package/dist/tui/components/loader.d.ts +26 -26
  25. package/dist/tui/components/loader.js +49 -49
  26. package/dist/tui/components/markdown.d.ts +101 -101
  27. package/dist/tui/components/markdown.js +624 -624
  28. package/dist/tui/components/select-list.d.ts +32 -32
  29. package/dist/tui/components/select-list.js +158 -158
  30. package/dist/tui/components/settings-list.d.ts +57 -57
  31. package/dist/tui/components/settings-list.js +200 -200
  32. package/dist/tui/components/spacer.d.ts +12 -12
  33. package/dist/tui/components/spacer.js +23 -23
  34. package/dist/tui/components/text.d.ts +24 -24
  35. package/dist/tui/components/text.js +92 -92
  36. package/dist/tui/components/truncated-text.d.ts +13 -13
  37. package/dist/tui/components/truncated-text.js +51 -51
  38. package/dist/tui/editor-component.d.ts +39 -39
  39. package/dist/tui/editor-component.js +2 -2
  40. package/dist/tui/fuzzy.d.ts +20 -20
  41. package/dist/tui/fuzzy.js +105 -105
  42. package/dist/tui/get-east-asian-width/index.js +28 -28
  43. package/dist/tui/get-east-asian-width/lookup.js +406 -406
  44. package/dist/tui/index.d.ts +85 -85
  45. package/dist/tui/index.js +64 -64
  46. package/dist/tui/keybindings.d.ts +76 -76
  47. package/dist/tui/keybindings.js +111 -111
  48. package/dist/tui/keys.d.ts +263 -263
  49. package/dist/tui/keys.js +947 -947
  50. package/dist/tui/kill-ring.d.ts +31 -31
  51. package/dist/tui/kill-ring.js +42 -42
  52. package/dist/tui/skill-autocomplete.js +30 -30
  53. package/dist/tui/stdin-buffer.d.ts +48 -48
  54. package/dist/tui/stdin-buffer.js +312 -312
  55. package/dist/tui/terminal-image.d.ts +89 -89
  56. package/dist/tui/terminal-image.js +274 -274
  57. package/dist/tui/terminal.d.ts +78 -78
  58. package/dist/tui/terminal.js +242 -242
  59. package/dist/tui/tui.d.ts +230 -230
  60. package/dist/tui/tui.js +952 -952
  61. package/dist/tui/undo-stack.d.ts +17 -17
  62. package/dist/tui/undo-stack.js +25 -25
  63. package/dist/tui/utils.d.ts +106 -106
  64. package/dist/tui/utils.js +773 -773
  65. package/package.json +1 -1
  66. package/user-docs/dist/shortcutxl-docs.pdf +0 -0
  67. package/xll/modules/shortcut_xl/__init__.py +1 -1
  68. package/xll/modules/shortcut_xl/_diff_highlight.py +0 -12
  69. package/xll/modules/shortcut_xl/_exec_entry.py +0 -1
  70. package/xll/modules/shortcut_xl/_managed.py +4 -18
  71. package/xll/modules/shortcut_xl/api/format.py +9 -4
  72. package/xll/python/Lib/site-packages/httpx-0.28.1.dist-info/RECORD +1 -1
  73. package/xll/python/Lib/site-packages/idna/core.py +24 -21
  74. package/xll/python/Lib/site-packages/idna/idnadata.py +3044 -2985
  75. package/xll/python/Lib/site-packages/idna/package_data.py +1 -1
  76. package/xll/python/Lib/site-packages/idna/uts46data.py +8377 -8834
  77. package/xll/python/Lib/site-packages/{idna-3.11.dist-info → idna-3.12.dist-info}/METADATA +6 -11
  78. package/xll/python/Lib/site-packages/{idna-3.11.dist-info → idna-3.12.dist-info}/RECORD +9 -9
  79. package/xll/python/Lib/site-packages/{idna-3.11.dist-info → idna-3.12.dist-info}/licenses/LICENSE.md +1 -1
  80. package/xll/python/Lib/site-packages/pip-26.0.1.dist-info/RECORD +3 -3
  81. package/xll/python/Scripts/httpx.exe +0 -0
  82. package/xll/python/Scripts/pip.exe +0 -0
  83. package/xll/python/Scripts/pip3.12.exe +0 -0
  84. package/xll/python/Scripts/pip3.exe +0 -0
  85. package/dist/app/credits/resolve-model-override.d.ts +0 -27
  86. package/dist/app/excel-config.d.ts +0 -22
  87. package/dist/app/excel-session.d.ts +0 -27
  88. package/dist/app/extensions/index.impl.d.ts +0 -10
  89. package/dist/app/new-sheet/sheet-exec.d.ts +0 -36
  90. package/dist/app/resources/theme-resource.d.ts +0 -13
  91. package/dist/app/session/run-stats.d.ts +0 -17
  92. package/dist/app/session/session-retry.d.ts +0 -81
  93. package/dist/app/tools/bash-code-analyzer.d.ts +0 -26
  94. package/dist/app/tools/excel-code-analyzer.d.ts +0 -30
  95. package/dist/app/tools/excel-diff.d.ts +0 -21
  96. package/dist/app/tools/excel-exec.d.ts +0 -25
  97. package/dist/app/tools/request-file-access.d.ts +0 -14
  98. package/dist/cloud/auth-validator.d.ts +0 -23
  99. package/dist/cloud/bridge-tool-catalog.d.ts +0 -22
  100. package/dist/cloud/cloud-client-types.d.ts +0 -46
  101. package/dist/cloud/cloud-constants.d.ts +0 -42
  102. package/dist/cloud/cloud-entry.d.ts +0 -30
  103. package/dist/cloud/cloud-mode.d.ts +0 -22
  104. package/dist/cloud/cloud-server.d.ts +0 -51
  105. package/dist/cloud/cloud-session-client.d.ts +0 -85
  106. package/dist/cloud/cloud-shell-adapter.d.ts +0 -119
  107. package/dist/cloud/cloud-tools.d.ts +0 -32
  108. package/dist/cloud/gateway.d.ts +0 -26
  109. package/dist/cloud/gcs-session-backend.d.ts +0 -61
  110. package/dist/cloud/index.d.ts +0 -18
  111. package/dist/cloud/llm/anthropic-provider.d.ts +0 -8
  112. package/dist/cloud/llm/index.d.ts +0 -8
  113. package/dist/cloud/llm/openai-provider.d.ts +0 -8
  114. package/dist/cloud/llm/provider-types.d.ts +0 -43
  115. package/dist/cloud/llm/register-cloud-providers.d.ts +0 -18
  116. package/dist/cloud/local-bridge-tools.d.ts +0 -10
  117. package/dist/cloud/local-screenshot.d.ts +0 -17
  118. package/dist/cloud/observability/client-logging/client-logger.d.ts +0 -57
  119. package/dist/cloud/observability/client-logging/context.d.ts +0 -26
  120. package/dist/cloud/observability/client-logging/index.d.ts +0 -8
  121. package/dist/cloud/observability/client-logging/session-events.d.ts +0 -4
  122. package/dist/cloud/observability/client-logging/settings-events.d.ts +0 -5
  123. package/dist/cloud/observability/client-logging/startup-events.d.ts +0 -7
  124. package/dist/cloud/observability/client-logging/transport.d.ts +0 -15
  125. package/dist/cloud/observability/client-logging/types.d.ts +0 -31
  126. package/dist/cloud/observability/from-env.d.ts +0 -3
  127. package/dist/cloud/observability/index.d.ts +0 -8
  128. package/dist/cloud/observability/langfuse-tracer.d.ts +0 -49
  129. package/dist/cloud/secrets.d.ts +0 -25
  130. package/dist/cloud/subagent-provider-bootstrap.d.ts +0 -11
  131. package/dist/cloud/terminal-approval.d.ts +0 -19
  132. package/dist/cloud/ws-types.d.ts +0 -183
  133. package/dist/core/agent-loop-classification.d.ts +0 -11
  134. package/dist/server/bridge-tool.d.ts +0 -33
  135. package/dist/server/client-bridge.d.ts +0 -102
  136. package/dist/server/code-executor/code-executor.d.ts +0 -62
  137. package/dist/server/code-executor/index.d.ts +0 -7
  138. package/dist/server/code-executor/memory-store.d.ts +0 -12
  139. package/dist/server/code-executor/types.d.ts +0 -37
  140. package/dist/server/http-core.d.ts +0 -19
  141. package/dist/server/http-handlers.d.ts +0 -12
  142. package/dist/server/index.d.ts +0 -20
  143. package/dist/server/screenshot-broker/index.d.ts +0 -3
  144. package/dist/server/screenshot-broker/screenshot-broker.d.ts +0 -36
  145. package/dist/server/screenshot-broker/types.d.ts +0 -39
  146. package/dist/server/server-types.d.ts +0 -159
  147. package/dist/server/server.d.ts +0 -28
  148. package/dist/server/session-snapshot.d.ts +0 -4
  149. package/dist/server-sse-only/code-executor/code-executor.d.ts +0 -2
  150. package/dist/server-sse-only/code-executor/index.d.ts +0 -4
  151. package/dist/server-sse-only/code-executor/memory-store.d.ts +0 -2
  152. package/dist/server-sse-only/code-executor/types.d.ts +0 -2
  153. package/dist/server-sse-only/create-session-handler.d.ts +0 -10
  154. package/dist/server-sse-only/credit-check.d.ts +0 -22
  155. package/dist/server-sse-only/extended-state-store.d.ts +0 -39
  156. package/dist/server-sse-only/extended-state-types.d.ts +0 -102
  157. package/dist/server-sse-only/follow-up-suggestions.d.ts +0 -30
  158. package/dist/server-sse-only/index.d.ts +0 -14
  159. package/dist/server-sse-only/memory/gcs-memory-store.d.ts +0 -82
  160. package/dist/server-sse-only/memory/index.d.ts +0 -8
  161. package/dist/server-sse-only/memory/server-memory-manager.d.ts +0 -48
  162. package/dist/server-sse-only/server-session-manager.d.ts +0 -43
  163. package/dist/server-sse-only/server-types.d.ts +0 -147
  164. package/dist/server-sse-only/server.d.ts +0 -66
  165. package/dist/server-sse-only/session-routes.d.ts +0 -27
  166. package/dist/server-sse-only/session-store.d.ts +0 -26
  167. package/dist/shared/logging/langfuse-trace-context.d.ts +0 -21
  168. package/dist/shell/approvals/tool-approval.d.ts +0 -38
  169. package/dist/shell/export-html/index.impl.d.ts +0 -35
  170. package/dist/startup/auto-update.d.ts +0 -11
  171. /package/xll/python/Lib/site-packages/{idna-3.11.dist-info → idna-3.12.dist-info}/INSTALLER +0 -0
  172. /package/xll/python/Lib/site-packages/{idna-3.11.dist-info → idna-3.12.dist-info}/WHEEL +0 -0
package/CHANGELOG.md CHANGED
@@ -1,5 +1,9 @@
1
1
  # Changelog
2
2
 
3
+ ## [0.3.45]
4
+
5
+ - **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.
6
+
3
7
  ## [0.3.44]
4
8
 
5
9
  - **Shorty mascot** — Replaced the braille X logo with a new Shorty block-art mascot.
@@ -6,47 +6,70 @@
6
6
  "getSheetNames": {
7
7
  "signature": "def getSheetNames() -> list[str]",
8
8
  "docstring": "Get the names of all sheets in the workbook.",
9
- "tags": ["action", "ask"]
9
+ "tags": [
10
+ "action",
11
+ "ask"
12
+ ]
10
13
  },
11
14
  "getWorkbookSummary": {
12
15
  "signature": "def getWorkbookSummary() -> str",
13
16
  "docstring": "Get sheet names and used ranges for this workbook.\nReturns lines like:\n Sheets and their used ranges:\n Sheet1: A1:D10 (active)\n Inputs: (empty)",
14
- "tags": ["action", "ask"]
17
+ "tags": [
18
+ "action",
19
+ "ask"
20
+ ]
15
21
  },
16
22
  "getSheet": {
17
23
  "signature": "def getSheet(name: str) -> 'Worksheet'",
18
24
  "docstring": "Get a sheet by name, returned as a wrapped Worksheet.",
19
- "tags": ["action", "ask"]
25
+ "tags": [
26
+ "action",
27
+ "ask"
28
+ ]
20
29
  },
21
30
  "addSheet": {
22
31
  "signature": "def addSheet(name: str, index: int | None = None) -> 'Worksheet'",
23
32
  "docstring": "Add a new sheet at 0-based index. index=0 inserts before the first sheet.\nOmit index for Excel's default position.\nExample: wb.addSheet(\"NewSheet\", 0) # insert as first sheet",
24
- "tags": ["action"]
33
+ "tags": [
34
+ "action"
35
+ ]
25
36
  },
26
37
  "moveSheet": {
27
38
  "signature": "def moveSheet(name: str, index: int) -> None",
28
39
  "docstring": "Move a sheet to 0-based index. index=0 moves to first, index=Count-1 moves to last.\nExample: wb.moveSheet(\"Data\", 0) # move to first position",
29
- "tags": ["action"]
40
+ "tags": [
41
+ "action"
42
+ ]
30
43
  },
31
44
  "calculate": {
32
45
  "signature": "def calculate() -> None",
33
46
  "docstring": "Recalculate the entire workbook.\nDependent formulas don't update until after code block completes \u2014 read in a follow-up block.",
34
- "tags": ["action"]
47
+ "tags": [
48
+ "action"
49
+ ]
35
50
  },
36
51
  "errorCheck": {
37
52
  "signature": "def errorCheck(ranges: list[str] | None = None) -> str",
38
53
  "docstring": "Scan for errors (#REF!, #DIV/0!, #NAME?, #VALUE!, #N/A, #NULL!, #NUM!). Ranges MUST include a sheet name (\"Sheet1\" or \"Sheet1!A1:D50\") \u2014 bare ranges like \"A1:D50\" will fail.\n Args:\n ranges: Optional sheet names (\"Sheet1\") or ranges (\"Sheet1!A1:D50\"). Omit to check all.\n Returns:\n \"No issues found.\" or \"Errors (N):\nSheet1!A1: #REF!\n...\"",
39
- "tags": ["action", "ask"]
54
+ "tags": [
55
+ "action",
56
+ "ask"
57
+ ]
40
58
  },
41
59
  "copyPasteRange": {
42
60
  "signature": "def copyPasteRange(from_range: str, to_address: str, paste_type: str = 'all', ) -> None",
43
61
  "docstring": "Copy range within same workbook via range.Copy + PasteSpecial.\nAddresses must include sheet name. Do NOT use Sheet.Copy (broken via pywin32).\nExample: wb.copyPasteRange(\"Sheet1!A1:D10\", \"Sheet2!A1\", paste_type=\"values\")",
44
- "tags": ["action"]
62
+ "tags": [
63
+ "action"
64
+ ]
45
65
  },
46
66
  "getNamedRangeInfo": {
47
67
  "signature": "def getNamedRangeInfo(max_count: int = 50) -> str",
48
68
  "docstring": "Get named ranges. Returns formatted string with name, reference, scope, and comment.\nExample output: \"Named Ranges (2):\\n Name: TaxRate | Ref: =Settings!$B$2 | Scope: workbook | Comment: ...\"\nReturns \"No named ranges found.\" if none exist.",
49
- "tags": ["action", "ask"]
69
+ "tags": [
70
+ "action",
71
+ "ask"
72
+ ]
50
73
  }
51
74
  }
52
75
  },
@@ -56,62 +79,93 @@
56
79
  "getSheetSummary": {
57
80
  "signature": "def getSheetSummary() -> str",
58
81
  "docstring": "Overview: name, used range, tables (with style/banded/header/total props),\npivots (with range), conditional formats (type/range/priority/stopIfTrue),\nautofilter (with filtering status), charts (with type).",
59
- "tags": ["action", "ask"]
82
+ "tags": [
83
+ "action",
84
+ "ask"
85
+ ]
60
86
  },
61
87
  "getUsedRange": {
62
88
  "signature": "def getUsedRange() -> str",
63
89
  "docstring": "Get the used range address like \"A1:F20\", or \"\" if empty.",
64
- "tags": ["action", "ask"]
90
+ "tags": [
91
+ "action",
92
+ "ask"
93
+ ]
65
94
  },
66
95
  "getCell": {
67
96
  "signature": "def getCell(address: str, include_style: bool = True) -> str",
68
97
  "docstring": "Formatted cell string: \"value(=FORMULA) (style_json)\". Formula always included.\nZero with custom format appends [0]: \"$ - [0]\".\nExample:\n print(sheet.getCell(\"A1\"))\n print(sheet.getCell(\"A1\", include_style=False))",
69
- "tags": ["action", "ask"]
98
+ "tags": [
99
+ "action",
100
+ "ask"
101
+ ]
70
102
  },
71
103
  "getCellRange": {
72
104
  "signature": "def getCellRange(range_addr: str, include_style: bool = True) -> str",
73
105
  "docstring": "Markdown-like range: \"A1:Name | B1:Value\\nA2:Alice | B2:100\". Uses display text. Max 3000 cells; read larger areas in smaller chunks.\nAppends \"--- Style patterns ---\" section when include_style=True.",
74
- "tags": ["action", "ask"]
106
+ "tags": [
107
+ "action",
108
+ "ask"
109
+ ]
75
110
  },
76
111
  "getRawCellData": {
77
112
  "signature": "def getRawCellData(address: str, formula: bool = False) -> Any",
78
113
  "docstring": "Get raw data value from a cell, preserving data type. Set formula=True to get the formula string.",
79
- "tags": ["action", "ask"]
114
+ "tags": [
115
+ "action",
116
+ "ask"
117
+ ]
80
118
  },
81
119
  "getRawRangeData": {
82
120
  "signature": "def getRawRangeData(range_addr: str, formula: bool = False) -> list[list[Any]]",
83
121
  "docstring": "Get raw data for a range as 2D list. Always returns 2D list even for single row/column.",
84
- "tags": ["action", "ask"]
122
+ "tags": [
123
+ "action",
124
+ "ask"
125
+ ]
85
126
  },
86
127
  "regexSearch": {
87
128
  "signature": "def regexSearch(patterns: list[str], match_case: bool = False) -> list[dict]",
88
129
  "docstring": "Regex search across used range using display text. Returns [{\"address\": \"A1\", \"value\": \"display text\"}, ...].\nExample: sheet.regexSearch([\"revenue\", \"cost\"])",
89
- "tags": ["action", "ask"]
130
+ "tags": [
131
+ "action",
132
+ "ask"
133
+ ]
90
134
  },
91
135
  "setCell": {
92
136
  "signature": "def setCell(address: str, value: Any, number_format: str | None = None, note: str | None = None, ) -> None",
93
137
  "docstring": "Write value or formula. \"=\" prefix = formula. None or \"\" clears the cell.\nExamples:\n sheet.setCell(\"A1\", 8000)\n sheet.setCell(\"C1\", 0.15, number_format=\"0%\", note=\"Tax rate\")\n sheet.setCell(\"B1\", \"=SUM(A1:A10)\")",
94
- "tags": ["action"]
138
+ "tags": [
139
+ "action"
140
+ ]
95
141
  },
96
142
  "setCellRange": {
97
143
  "signature": "def setCellRange(range_addr: str, values: list[list[Any]], number_format: str | None = None, ) -> None",
98
144
  "docstring": "Bulk write \u2014 ALWAYS use for >100 cells. \"=\" prefix = formula.\nExamples:\n sheet.setCellRange(\"A1:B2\", [[1, 2], [3, 4]])\n sheet.setCellRange(\"A1:B2\", [[\"=SUM(C1)\", \"=SUM(D1)\"], [5, 6]], number_format=\"$#,##0\")",
99
- "tags": ["action"]
145
+ "tags": [
146
+ "action"
147
+ ]
100
148
  },
101
149
  "autoFill": {
102
150
  "signature": "def autoFill(source_range: str, target_range: str, fill_mode: str = 'auto', ) -> None",
103
151
  "docstring": "Drag-fill. Source must be contained within target. Default \"auto\" increments hardcoded numeric literals; use fill_mode=\"constant\" to copy literal values, then read back destination cells and check for empty/NaN values.\nUse fill_mode=\"constant\" when copying a single value without incrementing.\nWARNING: Single numeric value with \"auto\" creates incrementing sequence (0,1,2,3...).\nExample: sheet.autoFill(\"A1:A2\", \"A1:A10\")",
104
- "tags": ["action"]
152
+ "tags": [
153
+ "action"
154
+ ]
105
155
  },
106
156
  "addPicture": {
107
157
  "signature": "def addPicture(name: str, base64_data: str, anchor_cell: str) -> None",
108
158
  "docstring": "Add a picture from base64-encoded PNG or JPEG data. No data URI prefix.\nExample: sheet.addPicture(\"chart1\", base64_string, \"F2\")",
109
- "tags": ["action"]
159
+ "tags": [
160
+ "action"
161
+ ]
110
162
  },
111
163
  "setIBTextColors": {
112
164
  "signature": "def setIBTextColors(range_addr: str, ignored_constants: list[int] | None = None, colors: dict | None = None, ) -> None",
113
165
  "docstring": "IB text colors for numeric inputs only. Text strings and booleans are left untouched.\n- Blue/16711680: hard-coded numeric constants (int/float)\n- Black/0: formulas (same-sheet references)\n- Green/32768: formulas with cross-sheet references (contains '!')\nColors are BGR integers (native COM format).\nExample: sheet.setIBTextColors(\"A1:D10\", ignored_constants=[0])",
114
- "tags": ["action"]
166
+ "tags": [
167
+ "action"
168
+ ]
115
169
  }
116
170
  }
117
171
  }
@@ -120,27 +174,42 @@
120
174
  "hex_to_bgr": {
121
175
  "signature": "def hex_to_bgr(hex_str: str) -> int",
122
176
  "docstring": "Convert \"#RRGGBB\" hex string to BGR integer for Excel COM.\nExample: ws.Range(\"A1\").Font.Color = hex_to_bgr(\"#FF0000\") # red",
123
- "tags": ["action", "ask"]
177
+ "tags": [
178
+ "action",
179
+ "ask"
180
+ ]
124
181
  },
125
182
  "index_to_address": {
126
183
  "signature": "def index_to_address(row: int, col: int) -> str",
127
184
  "docstring": "Convert 0-based (row, col) to Excel address: index_to_address(0, 0) \u2192 \"A1\".",
128
- "tags": ["action", "ask"]
185
+ "tags": [
186
+ "action",
187
+ "ask"
188
+ ]
129
189
  },
130
190
  "address_to_index": {
131
191
  "signature": "def address_to_index(address: str) -> tuple[int, int]",
132
192
  "docstring": "Parse \"A1\" into (row, col) 0-based tuple: address_to_index(\"B3\") \u2192 (2, 1).",
133
- "tags": ["action", "ask"]
193
+ "tags": [
194
+ "action",
195
+ "ask"
196
+ ]
134
197
  },
135
198
  "col_letter": {
136
199
  "signature": "def col_letter(index: int) -> str",
137
200
  "docstring": "Convert 0-based column index to letter: col_letter(26) \u2192 \"AA\".",
138
- "tags": ["action", "ask"]
201
+ "tags": [
202
+ "action",
203
+ "ask"
204
+ ]
139
205
  },
140
206
  "col_index": {
141
207
  "signature": "def col_index(letter: str) -> int",
142
208
  "docstring": "Convert column letter to 0-based index: col_index(\"AA\") \u2192 26.",
143
- "tags": ["action", "ask"]
209
+ "tags": [
210
+ "action",
211
+ "ask"
212
+ ]
144
213
  }
145
214
  }
146
215
  }