@bastani/atomic 0.9.4-alpha.5 → 0.9.4-alpha.7

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 (202) hide show
  1. package/CHANGELOG.md +55 -0
  2. package/dist/builtin/cursor/CHANGELOG.md +6 -0
  3. package/dist/builtin/cursor/package.json +4 -4
  4. package/dist/builtin/intercom/CHANGELOG.md +6 -0
  5. package/dist/builtin/intercom/package.json +2 -2
  6. package/dist/builtin/mcp/CHANGELOG.md +6 -0
  7. package/dist/builtin/mcp/package.json +4 -4
  8. package/dist/builtin/subagents/CHANGELOG.md +20 -0
  9. package/dist/builtin/subagents/package.json +4 -4
  10. package/dist/builtin/subagents/src/runs/background/async-execution-chain.ts +11 -1
  11. package/dist/builtin/subagents/src/runs/background/async-execution-single.ts +11 -1
  12. package/dist/builtin/subagents/src/runs/background/async-execution-types.ts +2 -0
  13. package/dist/builtin/subagents/src/runs/background/subagent-runner-step.ts +27 -4
  14. package/dist/builtin/subagents/src/runs/background/subagent-runner-streaming.ts +25 -0
  15. package/dist/builtin/subagents/src/runs/foreground/chain-execution-dynamic-step.ts +1 -0
  16. package/dist/builtin/subagents/src/runs/foreground/chain-execution-parallel-runner.ts +1 -0
  17. package/dist/builtin/subagents/src/runs/foreground/chain-execution-parallel-step.ts +1 -0
  18. package/dist/builtin/subagents/src/runs/foreground/chain-execution-sequential-step.ts +1 -0
  19. package/dist/builtin/subagents/src/runs/foreground/chain-execution-types.ts +2 -0
  20. package/dist/builtin/subagents/src/runs/foreground/chain-execution.ts +3 -1
  21. package/dist/builtin/subagents/src/runs/foreground/execution-attempt.ts +22 -0
  22. package/dist/builtin/subagents/src/runs/foreground/execution-run-sync.ts +15 -5
  23. package/dist/builtin/subagents/src/runs/foreground/subagent-executor-async.ts +5 -1
  24. package/dist/builtin/subagents/src/runs/foreground/subagent-executor-parallel-task.ts +2 -0
  25. package/dist/builtin/subagents/src/runs/foreground/subagent-executor-parallel.ts +4 -1
  26. package/dist/builtin/subagents/src/runs/foreground/subagent-executor-single.ts +4 -1
  27. package/dist/builtin/subagents/src/runs/shared/attempt-watchdog.ts +126 -0
  28. package/dist/builtin/subagents/src/runs/shared/model-candidate-filter.ts +53 -0
  29. package/dist/builtin/subagents/src/runs/shared/model-fallback.ts +52 -53
  30. package/dist/builtin/subagents/src/runs/shared/parallel-utils.ts +2 -0
  31. package/dist/builtin/subagents/src/shared/model-info.ts +16 -0
  32. package/dist/builtin/subagents/src/shared/types-config.ts +2 -0
  33. package/dist/builtin/web-access/CHANGELOG.md +6 -0
  34. package/dist/builtin/web-access/package.json +2 -2
  35. package/dist/builtin/workflows/CHANGELOG.md +12 -0
  36. package/dist/builtin/workflows/package.json +2 -2
  37. package/dist/builtin/workflows/src/runs/shared/model-fallback-failures.ts +34 -4
  38. package/dist/cli/file-processor.d.ts.map +1 -1
  39. package/dist/cli/file-processor.js +13 -25
  40. package/dist/cli/file-processor.js.map +1 -1
  41. package/dist/core/agent-session-extension-bindings.d.ts +2 -0
  42. package/dist/core/agent-session-extension-bindings.d.ts.map +1 -1
  43. package/dist/core/agent-session-extension-bindings.js +11 -3
  44. package/dist/core/agent-session-extension-bindings.js.map +1 -1
  45. package/dist/core/agent-session-methods.d.ts +4 -1
  46. package/dist/core/agent-session-methods.d.ts.map +1 -1
  47. package/dist/core/agent-session-methods.js.map +1 -1
  48. package/dist/core/agent-session-prompt.d.ts.map +1 -1
  49. package/dist/core/agent-session-prompt.js +11 -4
  50. package/dist/core/agent-session-prompt.js.map +1 -1
  51. package/dist/core/agent-session-state.d.ts.map +1 -1
  52. package/dist/core/agent-session-state.js +2 -2
  53. package/dist/core/agent-session-state.js.map +1 -1
  54. package/dist/core/agent-session-tool-hooks.d.ts +7 -1
  55. package/dist/core/agent-session-tool-hooks.d.ts.map +1 -1
  56. package/dist/core/agent-session-tool-hooks.js +26 -4
  57. package/dist/core/agent-session-tool-hooks.js.map +1 -1
  58. package/dist/core/agent-session-tree.d.ts.map +1 -1
  59. package/dist/core/agent-session-tree.js +3 -1
  60. package/dist/core/agent-session-tree.js.map +1 -1
  61. package/dist/core/agent-session.d.ts +1 -0
  62. package/dist/core/agent-session.d.ts.map +1 -1
  63. package/dist/core/agent-session.js +1 -0
  64. package/dist/core/agent-session.js.map +1 -1
  65. package/dist/core/copilot-model-catalog.d.ts +25 -74
  66. package/dist/core/copilot-model-catalog.d.ts.map +1 -1
  67. package/dist/core/copilot-model-catalog.js +118 -68
  68. package/dist/core/copilot-model-catalog.js.map +1 -1
  69. package/dist/core/copilot-model-synthesis.d.ts +10 -0
  70. package/dist/core/copilot-model-synthesis.d.ts.map +1 -0
  71. package/dist/core/copilot-model-synthesis.js +89 -0
  72. package/dist/core/copilot-model-synthesis.js.map +1 -0
  73. package/dist/core/extensions/api-types.d.ts +2 -1
  74. package/dist/core/extensions/api-types.d.ts.map +1 -1
  75. package/dist/core/extensions/api-types.js.map +1 -1
  76. package/dist/core/extensions/index.d.ts +1 -1
  77. package/dist/core/extensions/index.d.ts.map +1 -1
  78. package/dist/core/extensions/index.js.map +1 -1
  79. package/dist/core/extensions/loader-core.d.ts.map +1 -1
  80. package/dist/core/extensions/loader-core.js +3 -3
  81. package/dist/core/extensions/loader-core.js.map +1 -1
  82. package/dist/core/extensions/session-events.d.ts +7 -1
  83. package/dist/core/extensions/session-events.d.ts.map +1 -1
  84. package/dist/core/extensions/session-events.js.map +1 -1
  85. package/dist/core/http-dispatcher.d.ts.map +1 -1
  86. package/dist/core/http-dispatcher.js +28 -1
  87. package/dist/core/http-dispatcher.js.map +1 -1
  88. package/dist/core/model-registry-builtins.d.ts.map +1 -1
  89. package/dist/core/model-registry-builtins.js +21 -3
  90. package/dist/core/model-registry-builtins.js.map +1 -1
  91. package/dist/core/model-resolver-defaults.d.ts.map +1 -1
  92. package/dist/core/model-resolver-defaults.js +1 -1
  93. package/dist/core/model-resolver-defaults.js.map +1 -1
  94. package/dist/core/resource-loader-reload.d.ts.map +1 -1
  95. package/dist/core/resource-loader-reload.js +2 -1
  96. package/dist/core/resource-loader-reload.js.map +1 -1
  97. package/dist/core/session-manager-core.d.ts +2 -12
  98. package/dist/core/session-manager-core.d.ts.map +1 -1
  99. package/dist/core/session-manager-core.js +8 -16
  100. package/dist/core/session-manager-core.js.map +1 -1
  101. package/dist/core/settings-manager-resource-accessors.d.ts +1 -0
  102. package/dist/core/settings-manager-resource-accessors.d.ts.map +1 -1
  103. package/dist/core/settings-manager-resource-accessors.js +11 -0
  104. package/dist/core/settings-manager-resource-accessors.js.map +1 -1
  105. package/dist/core/settings-manager-ui-accessors.d.ts +2 -0
  106. package/dist/core/settings-manager-ui-accessors.d.ts.map +1 -1
  107. package/dist/core/settings-manager-ui-accessors.js +9 -0
  108. package/dist/core/settings-manager-ui-accessors.js.map +1 -1
  109. package/dist/core/settings-types.d.ts +2 -0
  110. package/dist/core/settings-types.d.ts.map +1 -1
  111. package/dist/core/settings-types.js.map +1 -1
  112. package/dist/core/timings.d.ts +7 -5
  113. package/dist/core/timings.d.ts.map +1 -1
  114. package/dist/core/timings.js +42 -24
  115. package/dist/core/timings.js.map +1 -1
  116. package/dist/core/tools/read-selectors.d.ts.map +1 -1
  117. package/dist/core/tools/read-selectors.js +19 -1
  118. package/dist/core/tools/read-selectors.js.map +1 -1
  119. package/dist/core/tools/read.d.ts.map +1 -1
  120. package/dist/core/tools/read.js +12 -23
  121. package/dist/core/tools/read.js.map +1 -1
  122. package/dist/index-extensions.d.ts +1 -1
  123. package/dist/index-extensions.d.ts.map +1 -1
  124. package/dist/index-extensions.js.map +1 -1
  125. package/dist/index.d.ts +1 -1
  126. package/dist/index.d.ts.map +1 -1
  127. package/dist/index.js.map +1 -1
  128. package/dist/main-session.d.ts.map +1 -1
  129. package/dist/main-session.js +14 -5
  130. package/dist/main-session.js.map +1 -1
  131. package/dist/modes/interactive/components/assistant-message.d.ts +3 -1
  132. package/dist/modes/interactive/components/assistant-message.d.ts.map +1 -1
  133. package/dist/modes/interactive/components/assistant-message.js +22 -15
  134. package/dist/modes/interactive/components/assistant-message.js.map +1 -1
  135. package/dist/modes/interactive/components/chat-message-renderer.d.ts +1 -0
  136. package/dist/modes/interactive/components/chat-message-renderer.d.ts.map +1 -1
  137. package/dist/modes/interactive/components/chat-message-renderer.js +5 -5
  138. package/dist/modes/interactive/components/chat-message-renderer.js.map +1 -1
  139. package/dist/modes/interactive/components/chat-session-host-rendering.d.ts.map +1 -1
  140. package/dist/modes/interactive/components/chat-session-host-rendering.js +1 -0
  141. package/dist/modes/interactive/components/chat-session-host-rendering.js.map +1 -1
  142. package/dist/modes/interactive/components/user-message.d.ts +6 -2
  143. package/dist/modes/interactive/components/user-message.d.ts.map +1 -1
  144. package/dist/modes/interactive/components/user-message.js +16 -5
  145. package/dist/modes/interactive/components/user-message.js.map +1 -1
  146. package/dist/modes/interactive/interactive-agent-events.d.ts.map +1 -1
  147. package/dist/modes/interactive/interactive-agent-events.js +1 -1
  148. package/dist/modes/interactive/interactive-agent-events.js.map +1 -1
  149. package/dist/modes/interactive/interactive-editor-actions.d.ts.map +1 -1
  150. package/dist/modes/interactive/interactive-editor-actions.js +1 -0
  151. package/dist/modes/interactive/interactive-editor-actions.js.map +1 -1
  152. package/dist/modes/interactive/interactive-extension-context.d.ts.map +1 -1
  153. package/dist/modes/interactive/interactive-extension-context.js +1 -0
  154. package/dist/modes/interactive/interactive-extension-context.js.map +1 -1
  155. package/dist/modes/interactive/interactive-mode-base.d.ts +1 -0
  156. package/dist/modes/interactive/interactive-mode-base.d.ts.map +1 -1
  157. package/dist/modes/interactive/interactive-mode-base.js +2 -0
  158. package/dist/modes/interactive/interactive-mode-base.js.map +1 -1
  159. package/dist/modes/interactive/interactive-model-routing.d.ts.map +1 -1
  160. package/dist/modes/interactive/interactive-model-routing.js +1 -0
  161. package/dist/modes/interactive/interactive-model-routing.js.map +1 -1
  162. package/dist/modes/interactive/interactive-render-chat.d.ts.map +1 -1
  163. package/dist/modes/interactive/interactive-render-chat.js +4 -3
  164. package/dist/modes/interactive/interactive-render-chat.js.map +1 -1
  165. package/dist/modes/interactive/interactive-session-runtime.d.ts.map +1 -1
  166. package/dist/modes/interactive/interactive-session-runtime.js +1 -0
  167. package/dist/modes/interactive/interactive-session-runtime.js.map +1 -1
  168. package/dist/modes/rpc/rpc-client.d.ts +28 -51
  169. package/dist/modes/rpc/rpc-client.d.ts.map +1 -1
  170. package/dist/modes/rpc/rpc-client.js +27 -51
  171. package/dist/modes/rpc/rpc-client.js.map +1 -1
  172. package/dist/modes/rpc/rpc-command-handler.d.ts.map +1 -1
  173. package/dist/modes/rpc/rpc-command-handler.js +19 -0
  174. package/dist/modes/rpc/rpc-command-handler.js.map +1 -1
  175. package/dist/modes/rpc/rpc-types.d.ts +26 -0
  176. package/dist/modes/rpc/rpc-types.d.ts.map +1 -1
  177. package/dist/modes/rpc/rpc-types.js.map +1 -1
  178. package/dist/rpc-entry.d.ts +3 -0
  179. package/dist/rpc-entry.d.ts.map +1 -0
  180. package/dist/rpc-entry.js +12 -0
  181. package/dist/rpc-entry.js.map +1 -0
  182. package/dist/utils/image-convert.d.ts +1 -0
  183. package/dist/utils/image-convert.d.ts.map +1 -1
  184. package/dist/utils/image-convert.js +21 -15
  185. package/dist/utils/image-convert.js.map +1 -1
  186. package/dist/utils/image-process.d.ts +18 -0
  187. package/dist/utils/image-process.d.ts.map +1 -0
  188. package/dist/utils/image-process.js +83 -0
  189. package/dist/utils/image-process.js.map +1 -0
  190. package/dist/utils/mime.d.ts.map +1 -1
  191. package/dist/utils/mime.js +41 -0
  192. package/dist/utils/mime.js.map +1 -1
  193. package/docs/extensions.md +11 -0
  194. package/docs/models.md +3 -3
  195. package/docs/providers.md +1 -1
  196. package/docs/rpc.md +60 -2
  197. package/docs/sdk.md +1 -1
  198. package/docs/settings.md +4 -1
  199. package/docs/subagents.md +6 -0
  200. package/docs/workflows.md +2 -0
  201. package/npm-shrinkwrap.json +138 -140
  202. package/package.json +15 -10
@@ -1 +1 @@
1
- {"version":3,"file":"settings-manager-ui-accessors.js","sourceRoot":"","sources":["../../src/core/settings-manager-ui-accessors.ts"],"names":[],"mappings":"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","sourcesContent":["import { ENV_CLEAR_ON_SHRINK, ENV_HARDWARE_CURSOR, getEnvValue } from \"../config.ts\";\nimport { SettingsManager } from \"./settings-manager-core.ts\";\nimport { settingsInternals } from \"./settings-manager-internals.ts\";\nimport type { WarningSettings } from \"./settings-types.ts\";\n\ninterface SettingsManagerUiAccessors {\n\tgetShowImages(): boolean;\n\tsetShowImages(show: boolean): void;\n\tgetImageWidthCells(): number;\n\tsetImageWidthCells(width: number): void;\n\tgetClearOnShrink(): boolean;\n\tsetClearOnShrink(enabled: boolean): void;\n\tgetShowTerminalProgress(): boolean;\n\tsetShowTerminalProgress(enabled: boolean): void;\n\tgetImageAutoResize(): boolean;\n\tsetImageAutoResize(enabled: boolean): void;\n\tgetBlockImages(): boolean;\n\tsetBlockImages(blocked: boolean): void;\n\tgetEnabledModels(): string[] | undefined;\n\tsetEnabledModels(patterns: string[] | undefined): void;\n\tgetDoubleEscapeAction(): \"fork\" | \"tree\" | \"none\";\n\tsetDoubleEscapeAction(action: \"fork\" | \"tree\" | \"none\"): void;\n\tgetTreeFilterMode(): \"default\" | \"no-tools\" | \"user-only\" | \"labeled-only\" | \"all\";\n\tsetTreeFilterMode(mode: \"default\" | \"no-tools\" | \"user-only\" | \"labeled-only\" | \"all\"): void;\n\tgetShowHardwareCursor(): boolean;\n\tsetShowHardwareCursor(enabled: boolean): void;\n\tgetEditorPaddingX(): number;\n\tsetEditorPaddingX(padding: number): void;\n\tgetAutocompleteMaxVisible(): number;\n\tsetAutocompleteMaxVisible(maxVisible: number): void;\n\tgetCodeBlockIndent(): string;\n\tgetWarnings(): WarningSettings;\n\tsetWarnings(warnings: WarningSettings): void;\n\tgetCodexFastModeSettings(): { chat: boolean; workflow: boolean };\n\tsetCodexFastModeSettings(settings: Partial<{ chat: boolean; workflow: boolean }>): void;\n}\n\ndeclare module \"./settings-manager-core.ts\" {\n\tinterface SettingsManager extends SettingsManagerUiAccessors {}\n}\n\nconst uiAccessors: SettingsManagerUiAccessors = {\n\tgetShowImages() {\n\t\treturn settingsInternals(this).settings.terminal?.showImages ?? true;\n\t},\n\n\tsetShowImages(show) {\n\t\tconst state = settingsInternals(this);\n\t\tif (!state.globalSettings.terminal) {\n\t\t\tstate.globalSettings.terminal = {};\n\t\t}\n\t\tstate.globalSettings.terminal.showImages = show;\n\t\tstate.markModified(\"terminal\", \"showImages\");\n\t\tstate.save();\n\t},\n\n\tgetImageWidthCells() {\n\t\tconst width = settingsInternals(this).settings.terminal?.imageWidthCells;\n\t\tif (typeof width !== \"number\" || !Number.isFinite(width)) {\n\t\t\treturn 60;\n\t\t}\n\t\treturn Math.max(1, Math.floor(width));\n\t},\n\n\tsetImageWidthCells(width) {\n\t\tconst state = settingsInternals(this);\n\t\tif (!state.globalSettings.terminal) {\n\t\t\tstate.globalSettings.terminal = {};\n\t\t}\n\t\tstate.globalSettings.terminal.imageWidthCells = Math.max(1, Math.floor(width));\n\t\tstate.markModified(\"terminal\", \"imageWidthCells\");\n\t\tstate.save();\n\t},\n\n\tgetClearOnShrink() {\n\t\t// Settings takes precedence, then env var, then default false\n\t\tconst terminal = settingsInternals(this).settings.terminal;\n\t\tif (terminal?.clearOnShrink !== undefined) {\n\t\t\treturn terminal.clearOnShrink;\n\t\t}\n\t\treturn getEnvValue(ENV_CLEAR_ON_SHRINK) === \"1\";\n\t},\n\n\tsetClearOnShrink(enabled) {\n\t\tconst state = settingsInternals(this);\n\t\tif (!state.globalSettings.terminal) {\n\t\t\tstate.globalSettings.terminal = {};\n\t\t}\n\t\tstate.globalSettings.terminal.clearOnShrink = enabled;\n\t\tstate.markModified(\"terminal\", \"clearOnShrink\");\n\t\tstate.save();\n\t},\n\n\tgetShowTerminalProgress() {\n\t\treturn settingsInternals(this).settings.terminal?.showTerminalProgress ?? false;\n\t},\n\n\tsetShowTerminalProgress(enabled) {\n\t\tconst state = settingsInternals(this);\n\t\tif (!state.globalSettings.terminal) {\n\t\t\tstate.globalSettings.terminal = {};\n\t\t}\n\t\tstate.globalSettings.terminal.showTerminalProgress = enabled;\n\t\tstate.markModified(\"terminal\", \"showTerminalProgress\");\n\t\tstate.save();\n\t},\n\n\tgetImageAutoResize() {\n\t\treturn settingsInternals(this).settings.images?.autoResize ?? true;\n\t},\n\n\tsetImageAutoResize(enabled) {\n\t\tconst state = settingsInternals(this);\n\t\tif (!state.globalSettings.images) {\n\t\t\tstate.globalSettings.images = {};\n\t\t}\n\t\tstate.globalSettings.images.autoResize = enabled;\n\t\tstate.markModified(\"images\", \"autoResize\");\n\t\tstate.save();\n\t},\n\n\tgetBlockImages() {\n\t\treturn settingsInternals(this).settings.images?.blockImages ?? false;\n\t},\n\n\tsetBlockImages(blocked) {\n\t\tconst state = settingsInternals(this);\n\t\tif (!state.globalSettings.images) {\n\t\t\tstate.globalSettings.images = {};\n\t\t}\n\t\tstate.globalSettings.images.blockImages = blocked;\n\t\tstate.markModified(\"images\", \"blockImages\");\n\t\tstate.save();\n\t},\n\n\tgetEnabledModels() {\n\t\treturn settingsInternals(this).settings.enabledModels;\n\t},\n\n\tsetEnabledModels(patterns) {\n\t\tconst state = settingsInternals(this);\n\t\tstate.globalSettings.enabledModels = patterns;\n\t\tstate.markModified(\"enabledModels\");\n\t\tstate.save();\n\t},\n\n\tgetDoubleEscapeAction() {\n\t\treturn settingsInternals(this).settings.doubleEscapeAction ?? \"tree\";\n\t},\n\n\tsetDoubleEscapeAction(action) {\n\t\tconst state = settingsInternals(this);\n\t\tstate.globalSettings.doubleEscapeAction = action;\n\t\tstate.markModified(\"doubleEscapeAction\");\n\t\tstate.save();\n\t},\n\n\tgetTreeFilterMode() {\n\t\tconst mode = settingsInternals(this).settings.treeFilterMode;\n\t\tconst valid = [\"default\", \"no-tools\", \"user-only\", \"labeled-only\", \"all\"];\n\t\treturn mode && valid.includes(mode) ? mode : \"default\";\n\t},\n\n\tsetTreeFilterMode(mode) {\n\t\tconst state = settingsInternals(this);\n\t\tstate.globalSettings.treeFilterMode = mode;\n\t\tstate.markModified(\"treeFilterMode\");\n\t\tstate.save();\n\t},\n\n\tgetShowHardwareCursor() {\n\t\treturn settingsInternals(this).settings.showHardwareCursor ?? getEnvValue(ENV_HARDWARE_CURSOR) === \"1\";\n\t},\n\n\tsetShowHardwareCursor(enabled) {\n\t\tconst state = settingsInternals(this);\n\t\tstate.globalSettings.showHardwareCursor = enabled;\n\t\tstate.markModified(\"showHardwareCursor\");\n\t\tstate.save();\n\t},\n\n\tgetEditorPaddingX() {\n\t\treturn settingsInternals(this).settings.editorPaddingX ?? 0;\n\t},\n\n\tsetEditorPaddingX(padding) {\n\t\tconst state = settingsInternals(this);\n\t\tstate.globalSettings.editorPaddingX = Math.max(0, Math.min(3, Math.floor(padding)));\n\t\tstate.markModified(\"editorPaddingX\");\n\t\tstate.save();\n\t},\n\n\tgetAutocompleteMaxVisible() {\n\t\treturn settingsInternals(this).settings.autocompleteMaxVisible ?? 5;\n\t},\n\n\tsetAutocompleteMaxVisible(maxVisible) {\n\t\tconst state = settingsInternals(this);\n\t\tstate.globalSettings.autocompleteMaxVisible = Math.max(3, Math.min(20, Math.floor(maxVisible)));\n\t\tstate.markModified(\"autocompleteMaxVisible\");\n\t\tstate.save();\n\t},\n\n\tgetCodeBlockIndent() {\n\t\treturn settingsInternals(this).settings.markdown?.codeBlockIndent ?? \" \";\n\t},\n\n\tgetWarnings() {\n\t\treturn { ...(settingsInternals(this).settings.warnings ?? {}) };\n\t},\n\n\tsetWarnings(warnings) {\n\t\tconst state = settingsInternals(this);\n\t\tstate.globalSettings.warnings = { ...warnings };\n\t\tstate.markModified(\"warnings\");\n\t\tstate.save();\n\t},\n\n\tgetCodexFastModeSettings() {\n\t\tconst codexFastMode = settingsInternals(this).settings.codexFastMode;\n\t\treturn {\n\t\t\tchat: codexFastMode?.chat ?? false,\n\t\t\tworkflow: codexFastMode?.workflow ?? false,\n\t\t};\n\t},\n\n\tsetCodexFastModeSettings(settings) {\n\t\tif (settings.chat === undefined && settings.workflow === undefined) {\n\t\t\treturn;\n\t\t}\n\t\tconst state = settingsInternals(this);\n\t\tif (!state.globalSettings.codexFastMode) {\n\t\t\tstate.globalSettings.codexFastMode = {};\n\t\t}\n\t\tif (settings.chat !== undefined) {\n\t\t\tstate.globalSettings.codexFastMode.chat = settings.chat;\n\t\t\tstate.markModified(\"codexFastMode\", \"chat\");\n\t\t}\n\t\tif (settings.workflow !== undefined) {\n\t\t\tstate.globalSettings.codexFastMode.workflow = settings.workflow;\n\t\t\tstate.markModified(\"codexFastMode\", \"workflow\");\n\t\t}\n\n\t\tconst projectCodexFastMode = state.projectSettings.codexFastMode;\n\t\tconst projectOverridesChat = projectCodexFastMode?.chat !== undefined;\n\t\tconst projectOverridesWorkflow = projectCodexFastMode?.workflow !== undefined;\n\t\tlet projectModified = false;\n\t\tif ((settings.chat !== undefined && projectOverridesChat) || (settings.workflow !== undefined && projectOverridesWorkflow)) {\n\t\t\tstate.projectSettings.codexFastMode = { ...(projectCodexFastMode ?? {}) };\n\t\t\tif (settings.chat !== undefined && projectOverridesChat) {\n\t\t\t\tstate.projectSettings.codexFastMode.chat = settings.chat;\n\t\t\t\tstate.markProjectModified(\"codexFastMode\", \"chat\");\n\t\t\t\tprojectModified = true;\n\t\t\t}\n\t\t\tif (settings.workflow !== undefined && projectOverridesWorkflow) {\n\t\t\t\tstate.projectSettings.codexFastMode.workflow = settings.workflow;\n\t\t\t\tstate.markProjectModified(\"codexFastMode\", \"workflow\");\n\t\t\t\tprojectModified = true;\n\t\t\t}\n\t\t\tif (projectModified) {\n\t\t\t\tstate.saveProjectSettings(state.projectSettings);\n\t\t\t}\n\t\t}\n\n\t\tif (state.runtimeSettingsOverrides.codexFastMode) {\n\t\t\tstate.runtimeSettingsOverrides.codexFastMode = {\n\t\t\t\t...state.runtimeSettingsOverrides.codexFastMode,\n\t\t\t\t...(settings.chat !== undefined ? { chat: settings.chat } : {}),\n\t\t\t\t...(settings.workflow !== undefined ? { workflow: settings.workflow } : {}),\n\t\t\t};\n\t\t}\n\n\t\tstate.save();\n\t},\n};\n\nObject.assign(SettingsManager.prototype, uiAccessors);\n"]}
1
+ {"version":3,"file":"settings-manager-ui-accessors.js","sourceRoot":"","sources":["../../src/core/settings-manager-ui-accessors.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AACrF,OAAO,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAC7D,OAAO,EAAE,iBAAiB,EAAE,MAAM,iCAAiC,CAAC;AAyCpE,MAAM,WAAW,GAA+B;IAC/C,aAAa;QACZ,OAAO,iBAAiB,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,QAAQ,EAAE,UAAU,IAAI,IAAI,CAAC;IACtE,CAAC;IAED,aAAa,CAAC,IAAI;QACjB,MAAM,KAAK,GAAG,iBAAiB,CAAC,IAAI,CAAC,CAAC;QACtC,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,QAAQ,EAAE,CAAC;YACpC,KAAK,CAAC,cAAc,CAAC,QAAQ,GAAG,EAAE,CAAC;QACpC,CAAC;QACD,KAAK,CAAC,cAAc,CAAC,QAAQ,CAAC,UAAU,GAAG,IAAI,CAAC;QAChD,KAAK,CAAC,YAAY,CAAC,UAAU,EAAE,YAAY,CAAC,CAAC;QAC7C,KAAK,CAAC,IAAI,EAAE,CAAC;IACd,CAAC;IAED,kBAAkB;QACjB,MAAM,KAAK,GAAG,iBAAiB,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,QAAQ,EAAE,eAAe,CAAC;QACzE,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;YAC1D,OAAO,EAAE,CAAC;QACX,CAAC;QACD,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC;IACvC,CAAC;IAED,kBAAkB,CAAC,KAAK;QACvB,MAAM,KAAK,GAAG,iBAAiB,CAAC,IAAI,CAAC,CAAC;QACtC,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,QAAQ,EAAE,CAAC;YACpC,KAAK,CAAC,cAAc,CAAC,QAAQ,GAAG,EAAE,CAAC;QACpC,CAAC;QACD,KAAK,CAAC,cAAc,CAAC,QAAQ,CAAC,eAAe,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC;QAC/E,KAAK,CAAC,YAAY,CAAC,UAAU,EAAE,iBAAiB,CAAC,CAAC;QAClD,KAAK,CAAC,IAAI,EAAE,CAAC;IACd,CAAC;IAED,gBAAgB;QACf,8DAA8D;QAC9D,MAAM,QAAQ,GAAG,iBAAiB,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC;QAC3D,IAAI,QAAQ,EAAE,aAAa,KAAK,SAAS,EAAE,CAAC;YAC3C,OAAO,QAAQ,CAAC,aAAa,CAAC;QAC/B,CAAC;QACD,OAAO,WAAW,CAAC,mBAAmB,CAAC,KAAK,GAAG,CAAC;IACjD,CAAC;IAED,gBAAgB,CAAC,OAAO;QACvB,MAAM,KAAK,GAAG,iBAAiB,CAAC,IAAI,CAAC,CAAC;QACtC,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,QAAQ,EAAE,CAAC;YACpC,KAAK,CAAC,cAAc,CAAC,QAAQ,GAAG,EAAE,CAAC;QACpC,CAAC;QACD,KAAK,CAAC,cAAc,CAAC,QAAQ,CAAC,aAAa,GAAG,OAAO,CAAC;QACtD,KAAK,CAAC,YAAY,CAAC,UAAU,EAAE,eAAe,CAAC,CAAC;QAChD,KAAK,CAAC,IAAI,EAAE,CAAC;IACd,CAAC;IAED,uBAAuB;QACtB,OAAO,iBAAiB,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,QAAQ,EAAE,oBAAoB,IAAI,KAAK,CAAC;IACjF,CAAC;IAED,uBAAuB,CAAC,OAAO;QAC9B,MAAM,KAAK,GAAG,iBAAiB,CAAC,IAAI,CAAC,CAAC;QACtC,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,QAAQ,EAAE,CAAC;YACpC,KAAK,CAAC,cAAc,CAAC,QAAQ,GAAG,EAAE,CAAC;QACpC,CAAC;QACD,KAAK,CAAC,cAAc,CAAC,QAAQ,CAAC,oBAAoB,GAAG,OAAO,CAAC;QAC7D,KAAK,CAAC,YAAY,CAAC,UAAU,EAAE,sBAAsB,CAAC,CAAC;QACvD,KAAK,CAAC,IAAI,EAAE,CAAC;IACd,CAAC;IAED,kBAAkB;QACjB,OAAO,iBAAiB,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,MAAM,EAAE,UAAU,IAAI,IAAI,CAAC;IACpE,CAAC;IAED,kBAAkB,CAAC,OAAO;QACzB,MAAM,KAAK,GAAG,iBAAiB,CAAC,IAAI,CAAC,CAAC;QACtC,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,MAAM,EAAE,CAAC;YAClC,KAAK,CAAC,cAAc,CAAC,MAAM,GAAG,EAAE,CAAC;QAClC,CAAC;QACD,KAAK,CAAC,cAAc,CAAC,MAAM,CAAC,UAAU,GAAG,OAAO,CAAC;QACjD,KAAK,CAAC,YAAY,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC;QAC3C,KAAK,CAAC,IAAI,EAAE,CAAC;IACd,CAAC;IAED,cAAc;QACb,OAAO,iBAAiB,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,MAAM,EAAE,WAAW,IAAI,KAAK,CAAC;IACtE,CAAC;IAED,cAAc,CAAC,OAAO;QACrB,MAAM,KAAK,GAAG,iBAAiB,CAAC,IAAI,CAAC,CAAC;QACtC,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,MAAM,EAAE,CAAC;YAClC,KAAK,CAAC,cAAc,CAAC,MAAM,GAAG,EAAE,CAAC;QAClC,CAAC;QACD,KAAK,CAAC,cAAc,CAAC,MAAM,CAAC,WAAW,GAAG,OAAO,CAAC;QAClD,KAAK,CAAC,YAAY,CAAC,QAAQ,EAAE,aAAa,CAAC,CAAC;QAC5C,KAAK,CAAC,IAAI,EAAE,CAAC;IACd,CAAC;IAED,gBAAgB;QACf,OAAO,iBAAiB,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,aAAa,CAAC;IACvD,CAAC;IAED,gBAAgB,CAAC,QAAQ;QACxB,MAAM,KAAK,GAAG,iBAAiB,CAAC,IAAI,CAAC,CAAC;QACtC,KAAK,CAAC,cAAc,CAAC,aAAa,GAAG,QAAQ,CAAC;QAC9C,KAAK,CAAC,YAAY,CAAC,eAAe,CAAC,CAAC;QACpC,KAAK,CAAC,IAAI,EAAE,CAAC;IACd,CAAC;IAED,qBAAqB;QACpB,OAAO,iBAAiB,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,kBAAkB,IAAI,MAAM,CAAC;IACtE,CAAC;IAED,qBAAqB,CAAC,MAAM;QAC3B,MAAM,KAAK,GAAG,iBAAiB,CAAC,IAAI,CAAC,CAAC;QACtC,KAAK,CAAC,cAAc,CAAC,kBAAkB,GAAG,MAAM,CAAC;QACjD,KAAK,CAAC,YAAY,CAAC,oBAAoB,CAAC,CAAC;QACzC,KAAK,CAAC,IAAI,EAAE,CAAC;IACd,CAAC;IAED,iBAAiB;QAChB,MAAM,IAAI,GAAG,iBAAiB,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,cAAc,CAAC;QAC7D,MAAM,KAAK,GAAG,CAAC,SAAS,EAAE,UAAU,EAAE,WAAW,EAAE,cAAc,EAAE,KAAK,CAAC,CAAC;QAC1E,OAAO,IAAI,IAAI,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC;IACxD,CAAC;IAED,iBAAiB,CAAC,IAAI;QACrB,MAAM,KAAK,GAAG,iBAAiB,CAAC,IAAI,CAAC,CAAC;QACtC,KAAK,CAAC,cAAc,CAAC,cAAc,GAAG,IAAI,CAAC;QAC3C,KAAK,CAAC,YAAY,CAAC,gBAAgB,CAAC,CAAC;QACrC,KAAK,CAAC,IAAI,EAAE,CAAC;IACd,CAAC;IAED,qBAAqB;QACpB,OAAO,iBAAiB,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,kBAAkB,IAAI,WAAW,CAAC,mBAAmB,CAAC,KAAK,GAAG,CAAC;IACxG,CAAC;IAED,qBAAqB,CAAC,OAAO;QAC5B,MAAM,KAAK,GAAG,iBAAiB,CAAC,IAAI,CAAC,CAAC;QACtC,KAAK,CAAC,cAAc,CAAC,kBAAkB,GAAG,OAAO,CAAC;QAClD,KAAK,CAAC,YAAY,CAAC,oBAAoB,CAAC,CAAC;QACzC,KAAK,CAAC,IAAI,EAAE,CAAC;IACd,CAAC;IAED,iBAAiB;QAChB,OAAO,iBAAiB,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,cAAc,IAAI,CAAC,CAAC;IAC7D,CAAC;IAED,iBAAiB,CAAC,OAAO;QACxB,MAAM,KAAK,GAAG,iBAAiB,CAAC,IAAI,CAAC,CAAC;QACtC,KAAK,CAAC,cAAc,CAAC,cAAc,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QACpF,KAAK,CAAC,YAAY,CAAC,gBAAgB,CAAC,CAAC;QACrC,KAAK,CAAC,IAAI,EAAE,CAAC;IACd,CAAC;IAED,YAAY;QACX,OAAO,iBAAiB,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,SAAS,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACjE,CAAC;IAED,YAAY,CAAC,OAAO;QACnB,MAAM,KAAK,GAAG,iBAAiB,CAAC,IAAI,CAAC,CAAC;QACtC,KAAK,CAAC,cAAc,CAAC,SAAS,GAAG,OAAO,CAAC;QACzC,KAAK,CAAC,YAAY,CAAC,WAAW,CAAC,CAAC;QAChC,KAAK,CAAC,IAAI,EAAE,CAAC;IACd,CAAC;IAED,yBAAyB;QACxB,OAAO,iBAAiB,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,sBAAsB,IAAI,CAAC,CAAC;IACrE,CAAC;IAED,yBAAyB,CAAC,UAAU;QACnC,MAAM,KAAK,GAAG,iBAAiB,CAAC,IAAI,CAAC,CAAC;QACtC,KAAK,CAAC,cAAc,CAAC,sBAAsB,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;QAChG,KAAK,CAAC,YAAY,CAAC,wBAAwB,CAAC,CAAC;QAC7C,KAAK,CAAC,IAAI,EAAE,CAAC;IACd,CAAC;IAED,kBAAkB;QACjB,OAAO,iBAAiB,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,QAAQ,EAAE,eAAe,IAAI,IAAI,CAAC;IAC3E,CAAC;IAED,WAAW;QACV,OAAO,EAAE,GAAG,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,QAAQ,IAAI,EAAE,CAAC,EAAE,CAAC;IACjE,CAAC;IAED,WAAW,CAAC,QAAQ;QACnB,MAAM,KAAK,GAAG,iBAAiB,CAAC,IAAI,CAAC,CAAC;QACtC,KAAK,CAAC,cAAc,CAAC,QAAQ,GAAG,EAAE,GAAG,QAAQ,EAAE,CAAC;QAChD,KAAK,CAAC,YAAY,CAAC,UAAU,CAAC,CAAC;QAC/B,KAAK,CAAC,IAAI,EAAE,CAAC;IACd,CAAC;IAED,wBAAwB;QACvB,MAAM,aAAa,GAAG,iBAAiB,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,aAAa,CAAC;QACrE,OAAO;YACN,IAAI,EAAE,aAAa,EAAE,IAAI,IAAI,KAAK;YAClC,QAAQ,EAAE,aAAa,EAAE,QAAQ,IAAI,KAAK;SAC1C,CAAC;IACH,CAAC;IAED,wBAAwB,CAAC,QAAQ;QAChC,IAAI,QAAQ,CAAC,IAAI,KAAK,SAAS,IAAI,QAAQ,CAAC,QAAQ,KAAK,SAAS,EAAE,CAAC;YACpE,OAAO;QACR,CAAC;QACD,MAAM,KAAK,GAAG,iBAAiB,CAAC,IAAI,CAAC,CAAC;QACtC,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,aAAa,EAAE,CAAC;YACzC,KAAK,CAAC,cAAc,CAAC,aAAa,GAAG,EAAE,CAAC;QACzC,CAAC;QACD,IAAI,QAAQ,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;YACjC,KAAK,CAAC,cAAc,CAAC,aAAa,CAAC,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAC;YACxD,KAAK,CAAC,YAAY,CAAC,eAAe,EAAE,MAAM,CAAC,CAAC;QAC7C,CAAC;QACD,IAAI,QAAQ,CAAC,QAAQ,KAAK,SAAS,EAAE,CAAC;YACrC,KAAK,CAAC,cAAc,CAAC,aAAa,CAAC,QAAQ,GAAG,QAAQ,CAAC,QAAQ,CAAC;YAChE,KAAK,CAAC,YAAY,CAAC,eAAe,EAAE,UAAU,CAAC,CAAC;QACjD,CAAC;QAED,MAAM,oBAAoB,GAAG,KAAK,CAAC,eAAe,CAAC,aAAa,CAAC;QACjE,MAAM,oBAAoB,GAAG,oBAAoB,EAAE,IAAI,KAAK,SAAS,CAAC;QACtE,MAAM,wBAAwB,GAAG,oBAAoB,EAAE,QAAQ,KAAK,SAAS,CAAC;QAC9E,IAAI,eAAe,GAAG,KAAK,CAAC;QAC5B,IAAI,CAAC,QAAQ,CAAC,IAAI,KAAK,SAAS,IAAI,oBAAoB,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,KAAK,SAAS,IAAI,wBAAwB,CAAC,EAAE,CAAC;YAC5H,KAAK,CAAC,eAAe,CAAC,aAAa,GAAG,EAAE,GAAG,CAAC,oBAAoB,IAAI,EAAE,CAAC,EAAE,CAAC;YAC1E,IAAI,QAAQ,CAAC,IAAI,KAAK,SAAS,IAAI,oBAAoB,EAAE,CAAC;gBACzD,KAAK,CAAC,eAAe,CAAC,aAAa,CAAC,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAC;gBACzD,KAAK,CAAC,mBAAmB,CAAC,eAAe,EAAE,MAAM,CAAC,CAAC;gBACnD,eAAe,GAAG,IAAI,CAAC;YACxB,CAAC;YACD,IAAI,QAAQ,CAAC,QAAQ,KAAK,SAAS,IAAI,wBAAwB,EAAE,CAAC;gBACjE,KAAK,CAAC,eAAe,CAAC,aAAa,CAAC,QAAQ,GAAG,QAAQ,CAAC,QAAQ,CAAC;gBACjE,KAAK,CAAC,mBAAmB,CAAC,eAAe,EAAE,UAAU,CAAC,CAAC;gBACvD,eAAe,GAAG,IAAI,CAAC;YACxB,CAAC;YACD,IAAI,eAAe,EAAE,CAAC;gBACrB,KAAK,CAAC,mBAAmB,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC;YAClD,CAAC;QACF,CAAC;QAED,IAAI,KAAK,CAAC,wBAAwB,CAAC,aAAa,EAAE,CAAC;YAClD,KAAK,CAAC,wBAAwB,CAAC,aAAa,GAAG;gBAC9C,GAAG,KAAK,CAAC,wBAAwB,CAAC,aAAa;gBAC/C,GAAG,CAAC,QAAQ,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBAC/D,GAAG,CAAC,QAAQ,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,QAAQ,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;aAC3E,CAAC;QACH,CAAC;QAED,KAAK,CAAC,IAAI,EAAE,CAAC;IACd,CAAC;CACD,CAAC;AAEF,MAAM,CAAC,MAAM,CAAC,eAAe,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC","sourcesContent":["import { ENV_CLEAR_ON_SHRINK, ENV_HARDWARE_CURSOR, getEnvValue } from \"../config.ts\";\nimport { SettingsManager } from \"./settings-manager-core.ts\";\nimport { settingsInternals } from \"./settings-manager-internals.ts\";\nimport type { WarningSettings } from \"./settings-types.ts\";\n\ninterface SettingsManagerUiAccessors {\n\tgetShowImages(): boolean;\n\tsetShowImages(show: boolean): void;\n\tgetImageWidthCells(): number;\n\tsetImageWidthCells(width: number): void;\n\tgetClearOnShrink(): boolean;\n\tsetClearOnShrink(enabled: boolean): void;\n\tgetShowTerminalProgress(): boolean;\n\tsetShowTerminalProgress(enabled: boolean): void;\n\tgetImageAutoResize(): boolean;\n\tsetImageAutoResize(enabled: boolean): void;\n\tgetBlockImages(): boolean;\n\tsetBlockImages(blocked: boolean): void;\n\tgetEnabledModels(): string[] | undefined;\n\tsetEnabledModels(patterns: string[] | undefined): void;\n\tgetDoubleEscapeAction(): \"fork\" | \"tree\" | \"none\";\n\tsetDoubleEscapeAction(action: \"fork\" | \"tree\" | \"none\"): void;\n\tgetTreeFilterMode(): \"default\" | \"no-tools\" | \"user-only\" | \"labeled-only\" | \"all\";\n\tsetTreeFilterMode(mode: \"default\" | \"no-tools\" | \"user-only\" | \"labeled-only\" | \"all\"): void;\n\tgetShowHardwareCursor(): boolean;\n\tsetShowHardwareCursor(enabled: boolean): void;\n\tgetEditorPaddingX(): number;\n\tsetEditorPaddingX(padding: number): void;\n\tgetOutputPad(): 0 | 1;\n\tsetOutputPad(padding: 0 | 1): void;\n\tgetAutocompleteMaxVisible(): number;\n\tsetAutocompleteMaxVisible(maxVisible: number): void;\n\tgetCodeBlockIndent(): string;\n\tgetWarnings(): WarningSettings;\n\tsetWarnings(warnings: WarningSettings): void;\n\tgetCodexFastModeSettings(): { chat: boolean; workflow: boolean };\n\tsetCodexFastModeSettings(settings: Partial<{ chat: boolean; workflow: boolean }>): void;\n}\n\ndeclare module \"./settings-manager-core.ts\" {\n\tinterface SettingsManager extends SettingsManagerUiAccessors {}\n}\n\nconst uiAccessors: SettingsManagerUiAccessors = {\n\tgetShowImages() {\n\t\treturn settingsInternals(this).settings.terminal?.showImages ?? true;\n\t},\n\n\tsetShowImages(show) {\n\t\tconst state = settingsInternals(this);\n\t\tif (!state.globalSettings.terminal) {\n\t\t\tstate.globalSettings.terminal = {};\n\t\t}\n\t\tstate.globalSettings.terminal.showImages = show;\n\t\tstate.markModified(\"terminal\", \"showImages\");\n\t\tstate.save();\n\t},\n\n\tgetImageWidthCells() {\n\t\tconst width = settingsInternals(this).settings.terminal?.imageWidthCells;\n\t\tif (typeof width !== \"number\" || !Number.isFinite(width)) {\n\t\t\treturn 60;\n\t\t}\n\t\treturn Math.max(1, Math.floor(width));\n\t},\n\n\tsetImageWidthCells(width) {\n\t\tconst state = settingsInternals(this);\n\t\tif (!state.globalSettings.terminal) {\n\t\t\tstate.globalSettings.terminal = {};\n\t\t}\n\t\tstate.globalSettings.terminal.imageWidthCells = Math.max(1, Math.floor(width));\n\t\tstate.markModified(\"terminal\", \"imageWidthCells\");\n\t\tstate.save();\n\t},\n\n\tgetClearOnShrink() {\n\t\t// Settings takes precedence, then env var, then default false\n\t\tconst terminal = settingsInternals(this).settings.terminal;\n\t\tif (terminal?.clearOnShrink !== undefined) {\n\t\t\treturn terminal.clearOnShrink;\n\t\t}\n\t\treturn getEnvValue(ENV_CLEAR_ON_SHRINK) === \"1\";\n\t},\n\n\tsetClearOnShrink(enabled) {\n\t\tconst state = settingsInternals(this);\n\t\tif (!state.globalSettings.terminal) {\n\t\t\tstate.globalSettings.terminal = {};\n\t\t}\n\t\tstate.globalSettings.terminal.clearOnShrink = enabled;\n\t\tstate.markModified(\"terminal\", \"clearOnShrink\");\n\t\tstate.save();\n\t},\n\n\tgetShowTerminalProgress() {\n\t\treturn settingsInternals(this).settings.terminal?.showTerminalProgress ?? false;\n\t},\n\n\tsetShowTerminalProgress(enabled) {\n\t\tconst state = settingsInternals(this);\n\t\tif (!state.globalSettings.terminal) {\n\t\t\tstate.globalSettings.terminal = {};\n\t\t}\n\t\tstate.globalSettings.terminal.showTerminalProgress = enabled;\n\t\tstate.markModified(\"terminal\", \"showTerminalProgress\");\n\t\tstate.save();\n\t},\n\n\tgetImageAutoResize() {\n\t\treturn settingsInternals(this).settings.images?.autoResize ?? true;\n\t},\n\n\tsetImageAutoResize(enabled) {\n\t\tconst state = settingsInternals(this);\n\t\tif (!state.globalSettings.images) {\n\t\t\tstate.globalSettings.images = {};\n\t\t}\n\t\tstate.globalSettings.images.autoResize = enabled;\n\t\tstate.markModified(\"images\", \"autoResize\");\n\t\tstate.save();\n\t},\n\n\tgetBlockImages() {\n\t\treturn settingsInternals(this).settings.images?.blockImages ?? false;\n\t},\n\n\tsetBlockImages(blocked) {\n\t\tconst state = settingsInternals(this);\n\t\tif (!state.globalSettings.images) {\n\t\t\tstate.globalSettings.images = {};\n\t\t}\n\t\tstate.globalSettings.images.blockImages = blocked;\n\t\tstate.markModified(\"images\", \"blockImages\");\n\t\tstate.save();\n\t},\n\n\tgetEnabledModels() {\n\t\treturn settingsInternals(this).settings.enabledModels;\n\t},\n\n\tsetEnabledModels(patterns) {\n\t\tconst state = settingsInternals(this);\n\t\tstate.globalSettings.enabledModels = patterns;\n\t\tstate.markModified(\"enabledModels\");\n\t\tstate.save();\n\t},\n\n\tgetDoubleEscapeAction() {\n\t\treturn settingsInternals(this).settings.doubleEscapeAction ?? \"tree\";\n\t},\n\n\tsetDoubleEscapeAction(action) {\n\t\tconst state = settingsInternals(this);\n\t\tstate.globalSettings.doubleEscapeAction = action;\n\t\tstate.markModified(\"doubleEscapeAction\");\n\t\tstate.save();\n\t},\n\n\tgetTreeFilterMode() {\n\t\tconst mode = settingsInternals(this).settings.treeFilterMode;\n\t\tconst valid = [\"default\", \"no-tools\", \"user-only\", \"labeled-only\", \"all\"];\n\t\treturn mode && valid.includes(mode) ? mode : \"default\";\n\t},\n\n\tsetTreeFilterMode(mode) {\n\t\tconst state = settingsInternals(this);\n\t\tstate.globalSettings.treeFilterMode = mode;\n\t\tstate.markModified(\"treeFilterMode\");\n\t\tstate.save();\n\t},\n\n\tgetShowHardwareCursor() {\n\t\treturn settingsInternals(this).settings.showHardwareCursor ?? getEnvValue(ENV_HARDWARE_CURSOR) === \"1\";\n\t},\n\n\tsetShowHardwareCursor(enabled) {\n\t\tconst state = settingsInternals(this);\n\t\tstate.globalSettings.showHardwareCursor = enabled;\n\t\tstate.markModified(\"showHardwareCursor\");\n\t\tstate.save();\n\t},\n\n\tgetEditorPaddingX() {\n\t\treturn settingsInternals(this).settings.editorPaddingX ?? 0;\n\t},\n\n\tsetEditorPaddingX(padding) {\n\t\tconst state = settingsInternals(this);\n\t\tstate.globalSettings.editorPaddingX = Math.max(0, Math.min(3, Math.floor(padding)));\n\t\tstate.markModified(\"editorPaddingX\");\n\t\tstate.save();\n\t},\n\n\tgetOutputPad() {\n\t\treturn settingsInternals(this).settings.outputPad === 0 ? 0 : 1;\n\t},\n\n\tsetOutputPad(padding) {\n\t\tconst state = settingsInternals(this);\n\t\tstate.globalSettings.outputPad = padding;\n\t\tstate.markModified(\"outputPad\");\n\t\tstate.save();\n\t},\n\n\tgetAutocompleteMaxVisible() {\n\t\treturn settingsInternals(this).settings.autocompleteMaxVisible ?? 5;\n\t},\n\n\tsetAutocompleteMaxVisible(maxVisible) {\n\t\tconst state = settingsInternals(this);\n\t\tstate.globalSettings.autocompleteMaxVisible = Math.max(3, Math.min(20, Math.floor(maxVisible)));\n\t\tstate.markModified(\"autocompleteMaxVisible\");\n\t\tstate.save();\n\t},\n\n\tgetCodeBlockIndent() {\n\t\treturn settingsInternals(this).settings.markdown?.codeBlockIndent ?? \" \";\n\t},\n\n\tgetWarnings() {\n\t\treturn { ...(settingsInternals(this).settings.warnings ?? {}) };\n\t},\n\n\tsetWarnings(warnings) {\n\t\tconst state = settingsInternals(this);\n\t\tstate.globalSettings.warnings = { ...warnings };\n\t\tstate.markModified(\"warnings\");\n\t\tstate.save();\n\t},\n\n\tgetCodexFastModeSettings() {\n\t\tconst codexFastMode = settingsInternals(this).settings.codexFastMode;\n\t\treturn {\n\t\t\tchat: codexFastMode?.chat ?? false,\n\t\t\tworkflow: codexFastMode?.workflow ?? false,\n\t\t};\n\t},\n\n\tsetCodexFastModeSettings(settings) {\n\t\tif (settings.chat === undefined && settings.workflow === undefined) {\n\t\t\treturn;\n\t\t}\n\t\tconst state = settingsInternals(this);\n\t\tif (!state.globalSettings.codexFastMode) {\n\t\t\tstate.globalSettings.codexFastMode = {};\n\t\t}\n\t\tif (settings.chat !== undefined) {\n\t\t\tstate.globalSettings.codexFastMode.chat = settings.chat;\n\t\t\tstate.markModified(\"codexFastMode\", \"chat\");\n\t\t}\n\t\tif (settings.workflow !== undefined) {\n\t\t\tstate.globalSettings.codexFastMode.workflow = settings.workflow;\n\t\t\tstate.markModified(\"codexFastMode\", \"workflow\");\n\t\t}\n\n\t\tconst projectCodexFastMode = state.projectSettings.codexFastMode;\n\t\tconst projectOverridesChat = projectCodexFastMode?.chat !== undefined;\n\t\tconst projectOverridesWorkflow = projectCodexFastMode?.workflow !== undefined;\n\t\tlet projectModified = false;\n\t\tif ((settings.chat !== undefined && projectOverridesChat) || (settings.workflow !== undefined && projectOverridesWorkflow)) {\n\t\t\tstate.projectSettings.codexFastMode = { ...(projectCodexFastMode ?? {}) };\n\t\t\tif (settings.chat !== undefined && projectOverridesChat) {\n\t\t\t\tstate.projectSettings.codexFastMode.chat = settings.chat;\n\t\t\t\tstate.markProjectModified(\"codexFastMode\", \"chat\");\n\t\t\t\tprojectModified = true;\n\t\t\t}\n\t\t\tif (settings.workflow !== undefined && projectOverridesWorkflow) {\n\t\t\t\tstate.projectSettings.codexFastMode.workflow = settings.workflow;\n\t\t\t\tstate.markProjectModified(\"codexFastMode\", \"workflow\");\n\t\t\t\tprojectModified = true;\n\t\t\t}\n\t\t\tif (projectModified) {\n\t\t\t\tstate.saveProjectSettings(state.projectSettings);\n\t\t\t}\n\t\t}\n\n\t\tif (state.runtimeSettingsOverrides.codexFastMode) {\n\t\t\tstate.runtimeSettingsOverrides.codexFastMode = {\n\t\t\t\t...state.runtimeSettingsOverrides.codexFastMode,\n\t\t\t\t...(settings.chat !== undefined ? { chat: settings.chat } : {}),\n\t\t\t\t...(settings.workflow !== undefined ? { workflow: settings.workflow } : {}),\n\t\t\t};\n\t\t}\n\n\t\tstate.save();\n\t},\n};\n\nObject.assign(SettingsManager.prototype, uiAccessors);\n"]}
@@ -88,6 +88,7 @@ export interface Settings {
88
88
  branchSummary?: BranchSummarySettings;
89
89
  retry?: RetrySettings;
90
90
  hideThinkingBlock?: boolean;
91
+ externalEditor?: string;
91
92
  shellPath?: string;
92
93
  quietStartup?: boolean;
93
94
  defaultProjectTrust?: DefaultProjectTrust;
@@ -111,6 +112,7 @@ export interface Settings {
111
112
  treeFilterMode?: "default" | "no-tools" | "user-only" | "labeled-only" | "all";
112
113
  thinkingBudgets?: ThinkingBudgetsSettings;
113
114
  editorPaddingX?: number;
115
+ outputPad?: 0 | 1;
114
116
  autocompleteMaxVisible?: number;
115
117
  showHardwareCursor?: boolean;
116
118
  markdown?: MarkdownSettings;
@@ -1 +1 @@
1
- {"version":3,"file":"settings-types.d.ts","sourceRoot":"","sources":["../../src/core/settings-types.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Transport } from \"@earendil-works/pi-ai/compat\";\n\nexport interface CompactionSettings {\n\tenabled?: boolean; // default: true\n\treserveTokens?: number; // default: 16384\n\tcompression_ratio?: number; // default: 0.5 (fraction of compactable context to keep)\n\tpreserve_recent?: number; // default: 2 (recent context-eligible messages to keep)\n\tquery?: string; // default: auto-detected from session context\n}\n\nexport interface BranchSummarySettings {\n\treserveTokens?: number; // default: 16384 (tokens reserved for prompt + LLM response)\n\tskipPrompt?: boolean; // default: false - when true, skips \"Summarize branch?\" prompt and defaults to no summary\n}\n\nexport interface ProviderRetrySettings {\n\ttimeoutMs?: number; // SDK/provider request timeout in milliseconds\n\tmaxRetries?: number; // SDK/provider retry attempts\n\tmaxRetryDelayMs?: number; // default: 60000 (max server-requested delay before failing)\n}\n\nexport interface RetrySettings {\n\tenabled?: boolean; // default: true\n\tmaxRetries?: number; // default: 3\n\tbaseDelayMs?: number; // default: 2000 (exponential backoff: 2s, 4s, 8s)\n\tprovider?: ProviderRetrySettings;\n}\n\nexport interface TerminalSettings {\n\tshowImages?: boolean; // default: true (only relevant if terminal supports images)\n\timageWidthCells?: number; // default: 60 (preferred inline image width in terminal cells)\n\tclearOnShrink?: boolean; // default: false (clear empty rows when content shrinks)\n\tshowTerminalProgress?: boolean; // default: false (OSC 9;4 terminal progress indicators)\n}\n\nexport interface ImageSettings {\n\tautoResize?: boolean; // default: true (resize images to 2000x2000 max for better model compatibility)\n\tblockImages?: boolean; // default: false - when true, prevents all images from being sent to LLM providers\n}\n\nexport interface SearchSettings { contextBefore?: number; contextAfter?: number }\nexport interface ThinkingBudgetsSettings {\n\tminimal?: number;\n\tlow?: number;\n\tmedium?: number;\n\thigh?: number;\n}\n\nexport interface MarkdownSettings {\n\tcodeBlockIndent?: string; // default: \" \"\n}\n\nexport interface WarningSettings {\n\tanthropicExtraUsage?: boolean; // default: true\n}\n\nexport interface CodexFastModeSettings {\n\tchat?: boolean; // default: false\n\tworkflow?: boolean; // default: false\n}\n\nexport type DefaultProjectTrust = \"ask\" | \"always\" | \"never\";\n\nexport type TransportSetting = Transport;\n\nexport type ContextWindowSetting = number | string;\nexport type ModelContextWindowSettings = Record<string, ContextWindowSetting>;\n\n/**\n * Package source for npm/git packages.\n * - String form: load all resources from the package\n * - Object form: filter which resources to load\n */\nexport type PackageSource =\n\t| string\n\t| {\n\t\t\tsource: string;\n\t\t\textensions?: string[];\n\t\t\tskills?: string[];\n\t\t\tprompts?: string[];\n\t\t\tthemes?: string[];\n\t\t\tworkflows?: string[];\n\t };\n\nexport interface BashInterceptorSettings {\n\tenabled?: boolean; // default: false\n}\n\nexport interface Settings {\n\tlastChangelogVersion?: string;\n\tfirstRunOnboardingStartedVersion?: string;\n\tonboardedVersion?: string;\n\tdefaultProvider?: string;\n\tdefaultModel?: string;\n\tdefaultThinkingLevel?: \"off\" | \"minimal\" | \"low\" | \"medium\" | \"high\" | \"xhigh\";\n\tdefaultContextWindow?: ContextWindowSetting; // Optional global fallback; model picker writes defaultContextWindows instead.\n\tdefaultContextWindows?: ModelContextWindowSettings; // Per-model defaults keyed as \"provider/modelId\".\n\ttransport?: TransportSetting; // default: \"auto\"\n\tsteeringMode?: \"all\" | \"one-at-a-time\";\n\tfollowUpMode?: \"all\" | \"one-at-a-time\";\n\ttheme?: string;\n\tcompaction?: CompactionSettings;\n\tbranchSummary?: BranchSummarySettings;\n\tretry?: RetrySettings;\n\thideThinkingBlock?: boolean;\n\tshellPath?: string; // Custom shell path (e.g., for Cygwin users on Windows)\n\tquietStartup?: boolean;\n\tdefaultProjectTrust?: DefaultProjectTrust; // default: \"ask\"; global setting only\n\tshellCommandPrefix?: string; // Prefix prepended to every bash command (e.g., \"shopt -s expand_aliases\" for alias support)\n\tbashInterceptor?: BashInterceptorSettings; // default: disabled; when enabled, user_bash handlers can intercept bash tool execution\n\tsearch?: SearchSettings; // Context lines for search results; defaults: before=1, after=3\n\tnpmCommand?: string[]; // Command used for npm package lookup/install operations, argv-style (e.g., [\"mise\", \"exec\", \"node@20\", \"--\", \"npm\"])\n\tcollapseChangelog?: boolean; // Show condensed changelog after update (use /changelog for full)\n\tenableInstallTelemetry?: boolean; // default: true - anonymous version/update ping after changelog-detected updates\n\tpackages?: PackageSource[]; // Array of npm/git package sources (string or object with filtering)\n\textensions?: string[]; // Array of local extension file paths or directories\n\tskills?: string[]; // Array of local skill file paths or directories\n\tprompts?: string[]; // Array of local prompt template paths or directories\n\tthemes?: string[]; // Array of local theme file paths or directories\n\tworkflows?: string[]; // Array of local workflow file paths or directories\n\tenableSkillCommands?: boolean; // default: true - register skills as /skill:name commands\n\tterminal?: TerminalSettings;\n\timages?: ImageSettings;\n\tenabledModels?: string[]; // Model patterns for cycling (same format as --models CLI flag)\n\tdoubleEscapeAction?: \"fork\" | \"tree\" | \"none\"; // Action for double-escape with empty editor (default: \"tree\")\n\ttreeFilterMode?: \"default\" | \"no-tools\" | \"user-only\" | \"labeled-only\" | \"all\"; // Default filter when opening /tree\n\tthinkingBudgets?: ThinkingBudgetsSettings; // Custom token budgets for thinking levels\n\teditorPaddingX?: number; // Horizontal padding for input editor (default: 0)\n\tautocompleteMaxVisible?: number; // Max visible items in autocomplete dropdown (default: 5)\n\tshowHardwareCursor?: boolean; // Show terminal cursor while still positioning it for IME\n\tmarkdown?: MarkdownSettings;\n\twarnings?: WarningSettings;\n\tcodexFastMode?: CodexFastModeSettings; // OpenAI priority service tier toggles for chat/workflow\n\tsessionDir?: string; // Custom session storage directory (same format as --session-dir CLI flag)\n\thttpIdleTimeoutMs?: number; // HTTP header/body idle timeout in milliseconds; 0 disables it\n\twebsocketConnectTimeoutMs?: number; // WebSocket connect/open handshake timeout in milliseconds; 0 disables it\n}\n\nexport type SettingsScope = \"global\" | \"project\";\n\nexport interface SettingsManagerCreateOptions {\n\tprojectTrusted?: boolean;\n}\n\nexport interface SettingsStorage {\n\twithLock(scope: SettingsScope, fn: (current: string | undefined) => string | undefined): void;\n}\n\nexport interface SettingsError {\n\tscope: SettingsScope;\n\terror: Error;\n}\n"]}
1
+ {"version":3,"file":"settings-types.d.ts","sourceRoot":"","sources":["../../src/core/settings-types.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Transport } from \"@earendil-works/pi-ai/compat\";\n\nexport interface CompactionSettings {\n\tenabled?: boolean; // default: true\n\treserveTokens?: number; // default: 16384\n\tcompression_ratio?: number; // default: 0.5 (fraction of compactable context to keep)\n\tpreserve_recent?: number; // default: 2 (recent context-eligible messages to keep)\n\tquery?: string; // default: auto-detected from session context\n}\n\nexport interface BranchSummarySettings {\n\treserveTokens?: number; // default: 16384 (tokens reserved for prompt + LLM response)\n\tskipPrompt?: boolean; // default: false - when true, skips \"Summarize branch?\" prompt and defaults to no summary\n}\n\nexport interface ProviderRetrySettings {\n\ttimeoutMs?: number; // SDK/provider request timeout in milliseconds\n\tmaxRetries?: number; // SDK/provider retry attempts\n\tmaxRetryDelayMs?: number; // default: 60000 (max server-requested delay before failing)\n}\n\nexport interface RetrySettings {\n\tenabled?: boolean; // default: true\n\tmaxRetries?: number; // default: 3\n\tbaseDelayMs?: number; // default: 2000 (exponential backoff: 2s, 4s, 8s)\n\tprovider?: ProviderRetrySettings;\n}\n\nexport interface TerminalSettings {\n\tshowImages?: boolean; // default: true (only relevant if terminal supports images)\n\timageWidthCells?: number; // default: 60 (preferred inline image width in terminal cells)\n\tclearOnShrink?: boolean; // default: false (clear empty rows when content shrinks)\n\tshowTerminalProgress?: boolean; // default: false (OSC 9;4 terminal progress indicators)\n}\n\nexport interface ImageSettings {\n\tautoResize?: boolean; // default: true (resize images to 2000x2000 max for better model compatibility)\n\tblockImages?: boolean; // default: false - when true, prevents all images from being sent to LLM providers\n}\n\nexport interface SearchSettings { contextBefore?: number; contextAfter?: number }\nexport interface ThinkingBudgetsSettings {\n\tminimal?: number;\n\tlow?: number;\n\tmedium?: number;\n\thigh?: number;\n}\n\nexport interface MarkdownSettings {\n\tcodeBlockIndent?: string; // default: \" \"\n}\n\nexport interface WarningSettings {\n\tanthropicExtraUsage?: boolean; // default: true\n}\n\nexport interface CodexFastModeSettings {\n\tchat?: boolean; // default: false\n\tworkflow?: boolean; // default: false\n}\n\nexport type DefaultProjectTrust = \"ask\" | \"always\" | \"never\";\n\nexport type TransportSetting = Transport;\n\nexport type ContextWindowSetting = number | string;\nexport type ModelContextWindowSettings = Record<string, ContextWindowSetting>;\n\n/**\n * Package source for npm/git packages.\n * - String form: load all resources from the package\n * - Object form: filter which resources to load\n */\nexport type PackageSource =\n\t| string\n\t| {\n\t\t\tsource: string;\n\t\t\textensions?: string[];\n\t\t\tskills?: string[];\n\t\t\tprompts?: string[];\n\t\t\tthemes?: string[];\n\t\t\tworkflows?: string[];\n\t };\n\nexport interface BashInterceptorSettings {\n\tenabled?: boolean; // default: false\n}\n\nexport interface Settings {\n\tlastChangelogVersion?: string;\n\tfirstRunOnboardingStartedVersion?: string;\n\tonboardedVersion?: string;\n\tdefaultProvider?: string;\n\tdefaultModel?: string;\n\tdefaultThinkingLevel?: \"off\" | \"minimal\" | \"low\" | \"medium\" | \"high\" | \"xhigh\";\n\tdefaultContextWindow?: ContextWindowSetting; // Optional global fallback; model picker writes defaultContextWindows instead.\n\tdefaultContextWindows?: ModelContextWindowSettings; // Per-model defaults keyed as \"provider/modelId\".\n\ttransport?: TransportSetting; // default: \"auto\"\n\tsteeringMode?: \"all\" | \"one-at-a-time\";\n\tfollowUpMode?: \"all\" | \"one-at-a-time\";\n\ttheme?: string;\n\tcompaction?: CompactionSettings;\n\tbranchSummary?: BranchSummarySettings;\n\tretry?: RetrySettings;\n\thideThinkingBlock?: boolean;\n\texternalEditor?: string; // Command for Ctrl+G external editor; takes precedence over VISUAL/EDITOR\n\tshellPath?: string; // Custom shell path (e.g., for Cygwin users on Windows)\n\tquietStartup?: boolean;\n\tdefaultProjectTrust?: DefaultProjectTrust; // default: \"ask\"; global setting only\n\tshellCommandPrefix?: string; // Prefix prepended to every bash command (e.g., \"shopt -s expand_aliases\" for alias support)\n\tbashInterceptor?: BashInterceptorSettings; // default: disabled; when enabled, user_bash handlers can intercept bash tool execution\n\tsearch?: SearchSettings; // Context lines for search results; defaults: before=1, after=3\n\tnpmCommand?: string[]; // Command used for npm package lookup/install operations, argv-style (e.g., [\"mise\", \"exec\", \"node@20\", \"--\", \"npm\"])\n\tcollapseChangelog?: boolean; // Show condensed changelog after update (use /changelog for full)\n\tenableInstallTelemetry?: boolean; // default: true - anonymous version/update ping after changelog-detected updates\n\tpackages?: PackageSource[]; // Array of npm/git package sources (string or object with filtering)\n\textensions?: string[]; // Array of local extension file paths or directories\n\tskills?: string[]; // Array of local skill file paths or directories\n\tprompts?: string[]; // Array of local prompt template paths or directories\n\tthemes?: string[]; // Array of local theme file paths or directories\n\tworkflows?: string[]; // Array of local workflow file paths or directories\n\tenableSkillCommands?: boolean; // default: true - register skills as /skill:name commands\n\tterminal?: TerminalSettings;\n\timages?: ImageSettings;\n\tenabledModels?: string[]; // Model patterns for cycling (same format as --models CLI flag)\n\tdoubleEscapeAction?: \"fork\" | \"tree\" | \"none\"; // Action for double-escape with empty editor (default: \"tree\")\n\ttreeFilterMode?: \"default\" | \"no-tools\" | \"user-only\" | \"labeled-only\" | \"all\"; // Default filter when opening /tree\n\tthinkingBudgets?: ThinkingBudgetsSettings; // Custom token budgets for thinking levels\n\teditorPaddingX?: number; // Horizontal padding for input editor (default: 0)\n\toutputPad?: 0 | 1; // Horizontal padding for chat message output (default: 1)\n\tautocompleteMaxVisible?: number; // Max visible items in autocomplete dropdown (default: 5)\n\tshowHardwareCursor?: boolean; // Show terminal cursor while still positioning it for IME\n\tmarkdown?: MarkdownSettings;\n\twarnings?: WarningSettings;\n\tcodexFastMode?: CodexFastModeSettings; // OpenAI priority service tier toggles for chat/workflow\n\tsessionDir?: string; // Custom session storage directory (same format as --session-dir CLI flag)\n\thttpIdleTimeoutMs?: number; // HTTP header/body idle timeout in milliseconds; 0 disables it\n\twebsocketConnectTimeoutMs?: number; // WebSocket connect/open handshake timeout in milliseconds; 0 disables it\n}\n\nexport type SettingsScope = \"global\" | \"project\";\n\nexport interface SettingsManagerCreateOptions {\n\tprojectTrusted?: boolean;\n}\n\nexport interface SettingsStorage {\n\twithLock(scope: SettingsScope, fn: (current: string | undefined) => string | undefined): void;\n}\n\nexport interface SettingsError {\n\tscope: SettingsScope;\n\terror: Error;\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"settings-types.js","sourceRoot":"","sources":["../../src/core/settings-types.ts"],"names":[],"mappings":"","sourcesContent":["import type { Transport } from \"@earendil-works/pi-ai/compat\";\n\nexport interface CompactionSettings {\n\tenabled?: boolean; // default: true\n\treserveTokens?: number; // default: 16384\n\tcompression_ratio?: number; // default: 0.5 (fraction of compactable context to keep)\n\tpreserve_recent?: number; // default: 2 (recent context-eligible messages to keep)\n\tquery?: string; // default: auto-detected from session context\n}\n\nexport interface BranchSummarySettings {\n\treserveTokens?: number; // default: 16384 (tokens reserved for prompt + LLM response)\n\tskipPrompt?: boolean; // default: false - when true, skips \"Summarize branch?\" prompt and defaults to no summary\n}\n\nexport interface ProviderRetrySettings {\n\ttimeoutMs?: number; // SDK/provider request timeout in milliseconds\n\tmaxRetries?: number; // SDK/provider retry attempts\n\tmaxRetryDelayMs?: number; // default: 60000 (max server-requested delay before failing)\n}\n\nexport interface RetrySettings {\n\tenabled?: boolean; // default: true\n\tmaxRetries?: number; // default: 3\n\tbaseDelayMs?: number; // default: 2000 (exponential backoff: 2s, 4s, 8s)\n\tprovider?: ProviderRetrySettings;\n}\n\nexport interface TerminalSettings {\n\tshowImages?: boolean; // default: true (only relevant if terminal supports images)\n\timageWidthCells?: number; // default: 60 (preferred inline image width in terminal cells)\n\tclearOnShrink?: boolean; // default: false (clear empty rows when content shrinks)\n\tshowTerminalProgress?: boolean; // default: false (OSC 9;4 terminal progress indicators)\n}\n\nexport interface ImageSettings {\n\tautoResize?: boolean; // default: true (resize images to 2000x2000 max for better model compatibility)\n\tblockImages?: boolean; // default: false - when true, prevents all images from being sent to LLM providers\n}\n\nexport interface SearchSettings { contextBefore?: number; contextAfter?: number }\nexport interface ThinkingBudgetsSettings {\n\tminimal?: number;\n\tlow?: number;\n\tmedium?: number;\n\thigh?: number;\n}\n\nexport interface MarkdownSettings {\n\tcodeBlockIndent?: string; // default: \" \"\n}\n\nexport interface WarningSettings {\n\tanthropicExtraUsage?: boolean; // default: true\n}\n\nexport interface CodexFastModeSettings {\n\tchat?: boolean; // default: false\n\tworkflow?: boolean; // default: false\n}\n\nexport type DefaultProjectTrust = \"ask\" | \"always\" | \"never\";\n\nexport type TransportSetting = Transport;\n\nexport type ContextWindowSetting = number | string;\nexport type ModelContextWindowSettings = Record<string, ContextWindowSetting>;\n\n/**\n * Package source for npm/git packages.\n * - String form: load all resources from the package\n * - Object form: filter which resources to load\n */\nexport type PackageSource =\n\t| string\n\t| {\n\t\t\tsource: string;\n\t\t\textensions?: string[];\n\t\t\tskills?: string[];\n\t\t\tprompts?: string[];\n\t\t\tthemes?: string[];\n\t\t\tworkflows?: string[];\n\t };\n\nexport interface BashInterceptorSettings {\n\tenabled?: boolean; // default: false\n}\n\nexport interface Settings {\n\tlastChangelogVersion?: string;\n\tfirstRunOnboardingStartedVersion?: string;\n\tonboardedVersion?: string;\n\tdefaultProvider?: string;\n\tdefaultModel?: string;\n\tdefaultThinkingLevel?: \"off\" | \"minimal\" | \"low\" | \"medium\" | \"high\" | \"xhigh\";\n\tdefaultContextWindow?: ContextWindowSetting; // Optional global fallback; model picker writes defaultContextWindows instead.\n\tdefaultContextWindows?: ModelContextWindowSettings; // Per-model defaults keyed as \"provider/modelId\".\n\ttransport?: TransportSetting; // default: \"auto\"\n\tsteeringMode?: \"all\" | \"one-at-a-time\";\n\tfollowUpMode?: \"all\" | \"one-at-a-time\";\n\ttheme?: string;\n\tcompaction?: CompactionSettings;\n\tbranchSummary?: BranchSummarySettings;\n\tretry?: RetrySettings;\n\thideThinkingBlock?: boolean;\n\tshellPath?: string; // Custom shell path (e.g., for Cygwin users on Windows)\n\tquietStartup?: boolean;\n\tdefaultProjectTrust?: DefaultProjectTrust; // default: \"ask\"; global setting only\n\tshellCommandPrefix?: string; // Prefix prepended to every bash command (e.g., \"shopt -s expand_aliases\" for alias support)\n\tbashInterceptor?: BashInterceptorSettings; // default: disabled; when enabled, user_bash handlers can intercept bash tool execution\n\tsearch?: SearchSettings; // Context lines for search results; defaults: before=1, after=3\n\tnpmCommand?: string[]; // Command used for npm package lookup/install operations, argv-style (e.g., [\"mise\", \"exec\", \"node@20\", \"--\", \"npm\"])\n\tcollapseChangelog?: boolean; // Show condensed changelog after update (use /changelog for full)\n\tenableInstallTelemetry?: boolean; // default: true - anonymous version/update ping after changelog-detected updates\n\tpackages?: PackageSource[]; // Array of npm/git package sources (string or object with filtering)\n\textensions?: string[]; // Array of local extension file paths or directories\n\tskills?: string[]; // Array of local skill file paths or directories\n\tprompts?: string[]; // Array of local prompt template paths or directories\n\tthemes?: string[]; // Array of local theme file paths or directories\n\tworkflows?: string[]; // Array of local workflow file paths or directories\n\tenableSkillCommands?: boolean; // default: true - register skills as /skill:name commands\n\tterminal?: TerminalSettings;\n\timages?: ImageSettings;\n\tenabledModels?: string[]; // Model patterns for cycling (same format as --models CLI flag)\n\tdoubleEscapeAction?: \"fork\" | \"tree\" | \"none\"; // Action for double-escape with empty editor (default: \"tree\")\n\ttreeFilterMode?: \"default\" | \"no-tools\" | \"user-only\" | \"labeled-only\" | \"all\"; // Default filter when opening /tree\n\tthinkingBudgets?: ThinkingBudgetsSettings; // Custom token budgets for thinking levels\n\teditorPaddingX?: number; // Horizontal padding for input editor (default: 0)\n\tautocompleteMaxVisible?: number; // Max visible items in autocomplete dropdown (default: 5)\n\tshowHardwareCursor?: boolean; // Show terminal cursor while still positioning it for IME\n\tmarkdown?: MarkdownSettings;\n\twarnings?: WarningSettings;\n\tcodexFastMode?: CodexFastModeSettings; // OpenAI priority service tier toggles for chat/workflow\n\tsessionDir?: string; // Custom session storage directory (same format as --session-dir CLI flag)\n\thttpIdleTimeoutMs?: number; // HTTP header/body idle timeout in milliseconds; 0 disables it\n\twebsocketConnectTimeoutMs?: number; // WebSocket connect/open handshake timeout in milliseconds; 0 disables it\n}\n\nexport type SettingsScope = \"global\" | \"project\";\n\nexport interface SettingsManagerCreateOptions {\n\tprojectTrusted?: boolean;\n}\n\nexport interface SettingsStorage {\n\twithLock(scope: SettingsScope, fn: (current: string | undefined) => string | undefined): void;\n}\n\nexport interface SettingsError {\n\tscope: SettingsScope;\n\terror: Error;\n}\n"]}
1
+ {"version":3,"file":"settings-types.js","sourceRoot":"","sources":["../../src/core/settings-types.ts"],"names":[],"mappings":"","sourcesContent":["import type { Transport } from \"@earendil-works/pi-ai/compat\";\n\nexport interface CompactionSettings {\n\tenabled?: boolean; // default: true\n\treserveTokens?: number; // default: 16384\n\tcompression_ratio?: number; // default: 0.5 (fraction of compactable context to keep)\n\tpreserve_recent?: number; // default: 2 (recent context-eligible messages to keep)\n\tquery?: string; // default: auto-detected from session context\n}\n\nexport interface BranchSummarySettings {\n\treserveTokens?: number; // default: 16384 (tokens reserved for prompt + LLM response)\n\tskipPrompt?: boolean; // default: false - when true, skips \"Summarize branch?\" prompt and defaults to no summary\n}\n\nexport interface ProviderRetrySettings {\n\ttimeoutMs?: number; // SDK/provider request timeout in milliseconds\n\tmaxRetries?: number; // SDK/provider retry attempts\n\tmaxRetryDelayMs?: number; // default: 60000 (max server-requested delay before failing)\n}\n\nexport interface RetrySettings {\n\tenabled?: boolean; // default: true\n\tmaxRetries?: number; // default: 3\n\tbaseDelayMs?: number; // default: 2000 (exponential backoff: 2s, 4s, 8s)\n\tprovider?: ProviderRetrySettings;\n}\n\nexport interface TerminalSettings {\n\tshowImages?: boolean; // default: true (only relevant if terminal supports images)\n\timageWidthCells?: number; // default: 60 (preferred inline image width in terminal cells)\n\tclearOnShrink?: boolean; // default: false (clear empty rows when content shrinks)\n\tshowTerminalProgress?: boolean; // default: false (OSC 9;4 terminal progress indicators)\n}\n\nexport interface ImageSettings {\n\tautoResize?: boolean; // default: true (resize images to 2000x2000 max for better model compatibility)\n\tblockImages?: boolean; // default: false - when true, prevents all images from being sent to LLM providers\n}\n\nexport interface SearchSettings { contextBefore?: number; contextAfter?: number }\nexport interface ThinkingBudgetsSettings {\n\tminimal?: number;\n\tlow?: number;\n\tmedium?: number;\n\thigh?: number;\n}\n\nexport interface MarkdownSettings {\n\tcodeBlockIndent?: string; // default: \" \"\n}\n\nexport interface WarningSettings {\n\tanthropicExtraUsage?: boolean; // default: true\n}\n\nexport interface CodexFastModeSettings {\n\tchat?: boolean; // default: false\n\tworkflow?: boolean; // default: false\n}\n\nexport type DefaultProjectTrust = \"ask\" | \"always\" | \"never\";\n\nexport type TransportSetting = Transport;\n\nexport type ContextWindowSetting = number | string;\nexport type ModelContextWindowSettings = Record<string, ContextWindowSetting>;\n\n/**\n * Package source for npm/git packages.\n * - String form: load all resources from the package\n * - Object form: filter which resources to load\n */\nexport type PackageSource =\n\t| string\n\t| {\n\t\t\tsource: string;\n\t\t\textensions?: string[];\n\t\t\tskills?: string[];\n\t\t\tprompts?: string[];\n\t\t\tthemes?: string[];\n\t\t\tworkflows?: string[];\n\t };\n\nexport interface BashInterceptorSettings {\n\tenabled?: boolean; // default: false\n}\n\nexport interface Settings {\n\tlastChangelogVersion?: string;\n\tfirstRunOnboardingStartedVersion?: string;\n\tonboardedVersion?: string;\n\tdefaultProvider?: string;\n\tdefaultModel?: string;\n\tdefaultThinkingLevel?: \"off\" | \"minimal\" | \"low\" | \"medium\" | \"high\" | \"xhigh\";\n\tdefaultContextWindow?: ContextWindowSetting; // Optional global fallback; model picker writes defaultContextWindows instead.\n\tdefaultContextWindows?: ModelContextWindowSettings; // Per-model defaults keyed as \"provider/modelId\".\n\ttransport?: TransportSetting; // default: \"auto\"\n\tsteeringMode?: \"all\" | \"one-at-a-time\";\n\tfollowUpMode?: \"all\" | \"one-at-a-time\";\n\ttheme?: string;\n\tcompaction?: CompactionSettings;\n\tbranchSummary?: BranchSummarySettings;\n\tretry?: RetrySettings;\n\thideThinkingBlock?: boolean;\n\texternalEditor?: string; // Command for Ctrl+G external editor; takes precedence over VISUAL/EDITOR\n\tshellPath?: string; // Custom shell path (e.g., for Cygwin users on Windows)\n\tquietStartup?: boolean;\n\tdefaultProjectTrust?: DefaultProjectTrust; // default: \"ask\"; global setting only\n\tshellCommandPrefix?: string; // Prefix prepended to every bash command (e.g., \"shopt -s expand_aliases\" for alias support)\n\tbashInterceptor?: BashInterceptorSettings; // default: disabled; when enabled, user_bash handlers can intercept bash tool execution\n\tsearch?: SearchSettings; // Context lines for search results; defaults: before=1, after=3\n\tnpmCommand?: string[]; // Command used for npm package lookup/install operations, argv-style (e.g., [\"mise\", \"exec\", \"node@20\", \"--\", \"npm\"])\n\tcollapseChangelog?: boolean; // Show condensed changelog after update (use /changelog for full)\n\tenableInstallTelemetry?: boolean; // default: true - anonymous version/update ping after changelog-detected updates\n\tpackages?: PackageSource[]; // Array of npm/git package sources (string or object with filtering)\n\textensions?: string[]; // Array of local extension file paths or directories\n\tskills?: string[]; // Array of local skill file paths or directories\n\tprompts?: string[]; // Array of local prompt template paths or directories\n\tthemes?: string[]; // Array of local theme file paths or directories\n\tworkflows?: string[]; // Array of local workflow file paths or directories\n\tenableSkillCommands?: boolean; // default: true - register skills as /skill:name commands\n\tterminal?: TerminalSettings;\n\timages?: ImageSettings;\n\tenabledModels?: string[]; // Model patterns for cycling (same format as --models CLI flag)\n\tdoubleEscapeAction?: \"fork\" | \"tree\" | \"none\"; // Action for double-escape with empty editor (default: \"tree\")\n\ttreeFilterMode?: \"default\" | \"no-tools\" | \"user-only\" | \"labeled-only\" | \"all\"; // Default filter when opening /tree\n\tthinkingBudgets?: ThinkingBudgetsSettings; // Custom token budgets for thinking levels\n\teditorPaddingX?: number; // Horizontal padding for input editor (default: 0)\n\toutputPad?: 0 | 1; // Horizontal padding for chat message output (default: 1)\n\tautocompleteMaxVisible?: number; // Max visible items in autocomplete dropdown (default: 5)\n\tshowHardwareCursor?: boolean; // Show terminal cursor while still positioning it for IME\n\tmarkdown?: MarkdownSettings;\n\twarnings?: WarningSettings;\n\tcodexFastMode?: CodexFastModeSettings; // OpenAI priority service tier toggles for chat/workflow\n\tsessionDir?: string; // Custom session storage directory (same format as --session-dir CLI flag)\n\thttpIdleTimeoutMs?: number; // HTTP header/body idle timeout in milliseconds; 0 disables it\n\twebsocketConnectTimeoutMs?: number; // WebSocket connect/open handshake timeout in milliseconds; 0 disables it\n}\n\nexport type SettingsScope = \"global\" | \"project\";\n\nexport interface SettingsManagerCreateOptions {\n\tprojectTrusted?: boolean;\n}\n\nexport interface SettingsStorage {\n\twithLock(scope: SettingsScope, fn: (current: string | undefined) => string | undefined): void;\n}\n\nexport interface SettingsError {\n\tscope: SettingsScope;\n\terror: Error;\n}\n"]}
@@ -2,16 +2,18 @@
2
2
  * Central timing instrumentation for startup profiling.
3
3
  * Enable with the app-specific timing environment variable (for Atomic, ATOMIC_TIMING=1).
4
4
  */
5
+ export type TimingLabel = "main" | "extensions";
5
6
  export interface TimingSpan {
6
7
  label: string;
7
8
  start: number;
9
+ namespace: TimingLabel;
8
10
  }
9
11
  export declare function isTimingEnabled(): boolean;
10
- export declare function resetTimings(): void;
11
- export declare function time(label: string): void;
12
- export declare function startTimingSpan(label: string): TimingSpan | null;
12
+ export declare function resetTimings(namespace?: TimingLabel): void;
13
+ export declare function time(label: string, namespace?: TimingLabel): void;
14
+ export declare function startTimingSpan(label: string, namespace?: TimingLabel): TimingSpan | null;
13
15
  export declare function endTimingSpan(span: TimingSpan | null): void;
14
- export declare function recordTiming(label: string, ms: number): void;
15
- export declare function recordTimeSinceReset(label: string): void;
16
+ export declare function recordTiming(label: string, ms: number, namespace?: TimingLabel): void;
17
+ export declare function recordTimeSinceReset(label: string, namespace?: TimingLabel): void;
16
18
  export declare function printTimings(): void;
17
19
  //# sourceMappingURL=timings.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"timings.d.ts","sourceRoot":"","sources":["../../src/core/timings.ts"],"names":[],"mappings":"AAAA;;;GAGG;AASH,MAAM,WAAW,UAAU;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;CACd;AAED,wBAAgB,eAAe,IAAI,OAAO,CAEzC;AAED,wBAAgB,YAAY,IAAI,IAAI,CAKnC;AAED,wBAAgB,IAAI,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAKxC;AAED,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,UAAU,GAAG,IAAI,CAGhE;AAED,wBAAgB,aAAa,CAAC,IAAI,EAAE,UAAU,GAAG,IAAI,GAAG,IAAI,CAK3D;AAED,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,IAAI,CAG5D;AAED,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAGxD;AAED,wBAAgB,YAAY,IAAI,IAAI,CAQnC","sourcesContent":["/**\n * Central timing instrumentation for startup profiling.\n * Enable with the app-specific timing environment variable (for Atomic, ATOMIC_TIMING=1).\n */\n\nimport { ENV_TIMING, getEnvValue } from \"../config.ts\";\n\nconst ENABLED = getEnvValue(ENV_TIMING) === \"1\";\nconst timings: Array<{ label: string; ms: number }> = [];\nlet lastTime = Date.now();\nlet resetTime = lastTime;\n\nexport interface TimingSpan {\n\tlabel: string;\n\tstart: number;\n}\n\nexport function isTimingEnabled(): boolean {\n\treturn ENABLED;\n}\n\nexport function resetTimings(): void {\n\tif (!ENABLED) return;\n\ttimings.length = 0;\n\tlastTime = Date.now();\n\tresetTime = lastTime;\n}\n\nexport function time(label: string): void {\n\tif (!ENABLED) return;\n\tconst now = Date.now();\n\ttimings.push({ label, ms: now - lastTime });\n\tlastTime = now;\n}\n\nexport function startTimingSpan(label: string): TimingSpan | null {\n\tif (!ENABLED) return null;\n\treturn { label, start: Date.now() };\n}\n\nexport function endTimingSpan(span: TimingSpan | null): void {\n\tif (!ENABLED || !span) return;\n\tconst now = Date.now();\n\ttimings.push({ label: span.label, ms: now - span.start });\n\tlastTime = now;\n}\n\nexport function recordTiming(label: string, ms: number): void {\n\tif (!ENABLED) return;\n\ttimings.push({ label, ms });\n}\n\nexport function recordTimeSinceReset(label: string): void {\n\tif (!ENABLED) return;\n\ttimings.push({ label, ms: Date.now() - resetTime });\n}\n\nexport function printTimings(): void {\n\tif (!ENABLED || timings.length === 0) return;\n\tconsole.error(\"\\n--- Startup Timings ---\");\n\tfor (const t of timings) {\n\t\tconsole.error(` ${t.label}: ${t.ms}ms`);\n\t}\n\tconsole.error(` TOTAL initialization time: ${Date.now() - resetTime}ms`);\n\tconsole.error(\"------------------------\\n\");\n}\n"]}
1
+ {"version":3,"file":"timings.d.ts","sourceRoot":"","sources":["../../src/core/timings.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAYH,MAAM,MAAM,WAAW,GAAG,MAAM,GAAG,YAAY,CAAC;AAIhD,MAAM,WAAW,UAAU;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,WAAW,CAAC;CACvB;AAED,wBAAgB,eAAe,IAAI,OAAO,CAEzC;AAYD,wBAAgB,YAAY,CAAC,SAAS,GAAE,WAAoB,GAAG,IAAI,CAIlE;AAED,wBAAgB,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,GAAE,WAAoB,GAAG,IAAI,CAMzE;AAED,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,GAAE,WAAoB,GAAG,UAAU,GAAG,IAAI,CAGjG;AAED,wBAAgB,aAAa,CAAC,IAAI,EAAE,UAAU,GAAG,IAAI,GAAG,IAAI,CAM3D;AAED,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,SAAS,GAAE,WAAoB,GAAG,IAAI,CAI7F;AAED,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,GAAE,WAAoB,GAAG,IAAI,CAIzF;AAaD,wBAAgB,YAAY,IAAI,IAAI,CAKnC","sourcesContent":["/**\n * Central timing instrumentation for startup profiling.\n * Enable with the app-specific timing environment variable (for Atomic, ATOMIC_TIMING=1).\n */\n\nimport { ENV_TIMING, getEnvValue } from \"../config.ts\";\n\nconst ENABLED = getEnvValue(ENV_TIMING) === \"1\";\n\ninterface TimingNamespace {\n\ttimings: Array<{ label: string; ms: number }>;\n\tlastTime: number;\n\tresetTime: number;\n}\n\nexport type TimingLabel = \"main\" | \"extensions\";\n\nconst timingNamespaces = new Map<TimingLabel, TimingNamespace>();\n\nexport interface TimingSpan {\n\tlabel: string;\n\tstart: number;\n\tnamespace: TimingLabel;\n}\n\nexport function isTimingEnabled(): boolean {\n\treturn ENABLED;\n}\n\nfunction ensureNamespace(namespace: TimingLabel): TimingNamespace {\n\tlet entry = timingNamespaces.get(namespace);\n\tif (!entry) {\n\t\tconst now = Date.now();\n\t\tentry = { timings: [], lastTime: now, resetTime: now };\n\t\ttimingNamespaces.set(namespace, entry);\n\t}\n\treturn entry;\n}\n\nexport function resetTimings(namespace: TimingLabel = \"main\"): void {\n\tif (!ENABLED) return;\n\tconst now = Date.now();\n\ttimingNamespaces.set(namespace, { timings: [], lastTime: now, resetTime: now });\n}\n\nexport function time(label: string, namespace: TimingLabel = \"main\"): void {\n\tif (!ENABLED) return;\n\tconst now = Date.now();\n\tconst timingNamespace = ensureNamespace(namespace);\n\ttimingNamespace.timings.push({ label, ms: now - timingNamespace.lastTime });\n\ttimingNamespace.lastTime = now;\n}\n\nexport function startTimingSpan(label: string, namespace: TimingLabel = \"main\"): TimingSpan | null {\n\tif (!ENABLED) return null;\n\treturn { label, start: Date.now(), namespace };\n}\n\nexport function endTimingSpan(span: TimingSpan | null): void {\n\tif (!ENABLED || !span) return;\n\tconst now = Date.now();\n\tconst timingNamespace = ensureNamespace(span.namespace);\n\ttimingNamespace.timings.push({ label: span.label, ms: now - span.start });\n\ttimingNamespace.lastTime = now;\n}\n\nexport function recordTiming(label: string, ms: number, namespace: TimingLabel = \"main\"): void {\n\tif (!ENABLED) return;\n\tconst timingNamespace = ensureNamespace(namespace);\n\ttimingNamespace.timings.push({ label, ms });\n}\n\nexport function recordTimeSinceReset(label: string, namespace: TimingLabel = \"main\"): void {\n\tif (!ENABLED) return;\n\tconst timingNamespace = ensureNamespace(namespace);\n\ttimingNamespace.timings.push({ label, ms: Date.now() - timingNamespace.resetTime });\n}\n\nfunction printTimingGroup(title: string, namespace: TimingNamespace): void {\n\tconst printableTimings = namespace.timings.filter((timing) => timing.ms >= 0);\n\tif (printableTimings.length === 0) return;\n\tconsole.error(`\\n--- ${title} ---`);\n\tfor (const t of printableTimings) {\n\t\tconsole.error(` ${t.label}: ${t.ms}ms`);\n\t}\n\tconsole.error(` TOTAL initialization time: ${Date.now() - namespace.resetTime}ms`);\n\tconsole.error(`${\"-\".repeat(title.length + 8)}\\n`);\n}\n\nexport function printTimings(): void {\n\tif (!ENABLED) return;\n\tfor (const [namespace, timingNamespace] of timingNamespaces) {\n\t\tprintTimingGroup(`Startup Timings: ${namespace}`, timingNamespace);\n\t}\n}\n"]}
@@ -4,56 +4,74 @@
4
4
  */
5
5
  import { ENV_TIMING, getEnvValue } from "../config.js";
6
6
  const ENABLED = getEnvValue(ENV_TIMING) === "1";
7
- const timings = [];
8
- let lastTime = Date.now();
9
- let resetTime = lastTime;
7
+ const timingNamespaces = new Map();
10
8
  export function isTimingEnabled() {
11
9
  return ENABLED;
12
10
  }
13
- export function resetTimings() {
11
+ function ensureNamespace(namespace) {
12
+ let entry = timingNamespaces.get(namespace);
13
+ if (!entry) {
14
+ const now = Date.now();
15
+ entry = { timings: [], lastTime: now, resetTime: now };
16
+ timingNamespaces.set(namespace, entry);
17
+ }
18
+ return entry;
19
+ }
20
+ export function resetTimings(namespace = "main") {
14
21
  if (!ENABLED)
15
22
  return;
16
- timings.length = 0;
17
- lastTime = Date.now();
18
- resetTime = lastTime;
23
+ const now = Date.now();
24
+ timingNamespaces.set(namespace, { timings: [], lastTime: now, resetTime: now });
19
25
  }
20
- export function time(label) {
26
+ export function time(label, namespace = "main") {
21
27
  if (!ENABLED)
22
28
  return;
23
29
  const now = Date.now();
24
- timings.push({ label, ms: now - lastTime });
25
- lastTime = now;
30
+ const timingNamespace = ensureNamespace(namespace);
31
+ timingNamespace.timings.push({ label, ms: now - timingNamespace.lastTime });
32
+ timingNamespace.lastTime = now;
26
33
  }
27
- export function startTimingSpan(label) {
34
+ export function startTimingSpan(label, namespace = "main") {
28
35
  if (!ENABLED)
29
36
  return null;
30
- return { label, start: Date.now() };
37
+ return { label, start: Date.now(), namespace };
31
38
  }
32
39
  export function endTimingSpan(span) {
33
40
  if (!ENABLED || !span)
34
41
  return;
35
42
  const now = Date.now();
36
- timings.push({ label: span.label, ms: now - span.start });
37
- lastTime = now;
43
+ const timingNamespace = ensureNamespace(span.namespace);
44
+ timingNamespace.timings.push({ label: span.label, ms: now - span.start });
45
+ timingNamespace.lastTime = now;
38
46
  }
39
- export function recordTiming(label, ms) {
47
+ export function recordTiming(label, ms, namespace = "main") {
40
48
  if (!ENABLED)
41
49
  return;
42
- timings.push({ label, ms });
50
+ const timingNamespace = ensureNamespace(namespace);
51
+ timingNamespace.timings.push({ label, ms });
43
52
  }
44
- export function recordTimeSinceReset(label) {
53
+ export function recordTimeSinceReset(label, namespace = "main") {
45
54
  if (!ENABLED)
46
55
  return;
47
- timings.push({ label, ms: Date.now() - resetTime });
56
+ const timingNamespace = ensureNamespace(namespace);
57
+ timingNamespace.timings.push({ label, ms: Date.now() - timingNamespace.resetTime });
48
58
  }
49
- export function printTimings() {
50
- if (!ENABLED || timings.length === 0)
59
+ function printTimingGroup(title, namespace) {
60
+ const printableTimings = namespace.timings.filter((timing) => timing.ms >= 0);
61
+ if (printableTimings.length === 0)
51
62
  return;
52
- console.error("\n--- Startup Timings ---");
53
- for (const t of timings) {
63
+ console.error(`\n--- ${title} ---`);
64
+ for (const t of printableTimings) {
54
65
  console.error(` ${t.label}: ${t.ms}ms`);
55
66
  }
56
- console.error(` TOTAL initialization time: ${Date.now() - resetTime}ms`);
57
- console.error("------------------------\n");
67
+ console.error(` TOTAL initialization time: ${Date.now() - namespace.resetTime}ms`);
68
+ console.error(`${"-".repeat(title.length + 8)}\n`);
69
+ }
70
+ export function printTimings() {
71
+ if (!ENABLED)
72
+ return;
73
+ for (const [namespace, timingNamespace] of timingNamespaces) {
74
+ printTimingGroup(`Startup Timings: ${namespace}`, timingNamespace);
75
+ }
58
76
  }
59
77
  //# sourceMappingURL=timings.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"timings.js","sourceRoot":"","sources":["../../src/core/timings.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAEvD,MAAM,OAAO,GAAG,WAAW,CAAC,UAAU,CAAC,KAAK,GAAG,CAAC;AAChD,MAAM,OAAO,GAAyC,EAAE,CAAC;AACzD,IAAI,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;AAC1B,IAAI,SAAS,GAAG,QAAQ,CAAC;AAOzB,MAAM,UAAU,eAAe;IAC9B,OAAO,OAAO,CAAC;AAChB,CAAC;AAED,MAAM,UAAU,YAAY;IAC3B,IAAI,CAAC,OAAO;QAAE,OAAO;IACrB,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC;IACnB,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IACtB,SAAS,GAAG,QAAQ,CAAC;AACtB,CAAC;AAED,MAAM,UAAU,IAAI,CAAC,KAAa;IACjC,IAAI,CAAC,OAAO;QAAE,OAAO;IACrB,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IACvB,OAAO,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,GAAG,GAAG,QAAQ,EAAE,CAAC,CAAC;IAC5C,QAAQ,GAAG,GAAG,CAAC;AAChB,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,KAAa;IAC5C,IAAI,CAAC,OAAO;QAAE,OAAO,IAAI,CAAC;IAC1B,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC;AACrC,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,IAAuB;IACpD,IAAI,CAAC,OAAO,IAAI,CAAC,IAAI;QAAE,OAAO;IAC9B,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IACvB,OAAO,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,EAAE,EAAE,GAAG,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC;IAC1D,QAAQ,GAAG,GAAG,CAAC;AAChB,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,KAAa,EAAE,EAAU;IACrD,IAAI,CAAC,OAAO;QAAE,OAAO;IACrB,OAAO,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,CAAC;AAC7B,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,KAAa;IACjD,IAAI,CAAC,OAAO;QAAE,OAAO;IACrB,OAAO,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,EAAE,CAAC,CAAC;AACrD,CAAC;AAED,MAAM,UAAU,YAAY;IAC3B,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO;IAC7C,OAAO,CAAC,KAAK,CAAC,2BAA2B,CAAC,CAAC;IAC3C,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;QACzB,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,KAAK,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;IAC1C,CAAC;IACD,OAAO,CAAC,KAAK,CAAC,gCAAgC,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,IAAI,CAAC,CAAC;IAC1E,OAAO,CAAC,KAAK,CAAC,4BAA4B,CAAC,CAAC;AAC7C,CAAC","sourcesContent":["/**\n * Central timing instrumentation for startup profiling.\n * Enable with the app-specific timing environment variable (for Atomic, ATOMIC_TIMING=1).\n */\n\nimport { ENV_TIMING, getEnvValue } from \"../config.ts\";\n\nconst ENABLED = getEnvValue(ENV_TIMING) === \"1\";\nconst timings: Array<{ label: string; ms: number }> = [];\nlet lastTime = Date.now();\nlet resetTime = lastTime;\n\nexport interface TimingSpan {\n\tlabel: string;\n\tstart: number;\n}\n\nexport function isTimingEnabled(): boolean {\n\treturn ENABLED;\n}\n\nexport function resetTimings(): void {\n\tif (!ENABLED) return;\n\ttimings.length = 0;\n\tlastTime = Date.now();\n\tresetTime = lastTime;\n}\n\nexport function time(label: string): void {\n\tif (!ENABLED) return;\n\tconst now = Date.now();\n\ttimings.push({ label, ms: now - lastTime });\n\tlastTime = now;\n}\n\nexport function startTimingSpan(label: string): TimingSpan | null {\n\tif (!ENABLED) return null;\n\treturn { label, start: Date.now() };\n}\n\nexport function endTimingSpan(span: TimingSpan | null): void {\n\tif (!ENABLED || !span) return;\n\tconst now = Date.now();\n\ttimings.push({ label: span.label, ms: now - span.start });\n\tlastTime = now;\n}\n\nexport function recordTiming(label: string, ms: number): void {\n\tif (!ENABLED) return;\n\ttimings.push({ label, ms });\n}\n\nexport function recordTimeSinceReset(label: string): void {\n\tif (!ENABLED) return;\n\ttimings.push({ label, ms: Date.now() - resetTime });\n}\n\nexport function printTimings(): void {\n\tif (!ENABLED || timings.length === 0) return;\n\tconsole.error(\"\\n--- Startup Timings ---\");\n\tfor (const t of timings) {\n\t\tconsole.error(` ${t.label}: ${t.ms}ms`);\n\t}\n\tconsole.error(` TOTAL initialization time: ${Date.now() - resetTime}ms`);\n\tconsole.error(\"------------------------\\n\");\n}\n"]}
1
+ {"version":3,"file":"timings.js","sourceRoot":"","sources":["../../src/core/timings.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Central timing instrumentation for startup profiling.\n * Enable with the app-specific timing environment variable (for Atomic, ATOMIC_TIMING=1).\n */\n\nimport { ENV_TIMING, getEnvValue } from \"../config.ts\";\n\nconst ENABLED = getEnvValue(ENV_TIMING) === \"1\";\n\ninterface TimingNamespace {\n\ttimings: Array<{ label: string; ms: number }>;\n\tlastTime: number;\n\tresetTime: number;\n}\n\nexport type TimingLabel = \"main\" | \"extensions\";\n\nconst timingNamespaces = new Map<TimingLabel, TimingNamespace>();\n\nexport interface TimingSpan {\n\tlabel: string;\n\tstart: number;\n\tnamespace: TimingLabel;\n}\n\nexport function isTimingEnabled(): boolean {\n\treturn ENABLED;\n}\n\nfunction ensureNamespace(namespace: TimingLabel): TimingNamespace {\n\tlet entry = timingNamespaces.get(namespace);\n\tif (!entry) {\n\t\tconst now = Date.now();\n\t\tentry = { timings: [], lastTime: now, resetTime: now };\n\t\ttimingNamespaces.set(namespace, entry);\n\t}\n\treturn entry;\n}\n\nexport function resetTimings(namespace: TimingLabel = \"main\"): void {\n\tif (!ENABLED) return;\n\tconst now = Date.now();\n\ttimingNamespaces.set(namespace, { timings: [], lastTime: now, resetTime: now });\n}\n\nexport function time(label: string, namespace: TimingLabel = \"main\"): void {\n\tif (!ENABLED) return;\n\tconst now = Date.now();\n\tconst timingNamespace = ensureNamespace(namespace);\n\ttimingNamespace.timings.push({ label, ms: now - timingNamespace.lastTime });\n\ttimingNamespace.lastTime = now;\n}\n\nexport function startTimingSpan(label: string, namespace: TimingLabel = \"main\"): TimingSpan | null {\n\tif (!ENABLED) return null;\n\treturn { label, start: Date.now(), namespace };\n}\n\nexport function endTimingSpan(span: TimingSpan | null): void {\n\tif (!ENABLED || !span) return;\n\tconst now = Date.now();\n\tconst timingNamespace = ensureNamespace(span.namespace);\n\ttimingNamespace.timings.push({ label: span.label, ms: now - span.start });\n\ttimingNamespace.lastTime = now;\n}\n\nexport function recordTiming(label: string, ms: number, namespace: TimingLabel = \"main\"): void {\n\tif (!ENABLED) return;\n\tconst timingNamespace = ensureNamespace(namespace);\n\ttimingNamespace.timings.push({ label, ms });\n}\n\nexport function recordTimeSinceReset(label: string, namespace: TimingLabel = \"main\"): void {\n\tif (!ENABLED) return;\n\tconst timingNamespace = ensureNamespace(namespace);\n\ttimingNamespace.timings.push({ label, ms: Date.now() - timingNamespace.resetTime });\n}\n\nfunction printTimingGroup(title: string, namespace: TimingNamespace): void {\n\tconst printableTimings = namespace.timings.filter((timing) => timing.ms >= 0);\n\tif (printableTimings.length === 0) return;\n\tconsole.error(`\\n--- ${title} ---`);\n\tfor (const t of printableTimings) {\n\t\tconsole.error(` ${t.label}: ${t.ms}ms`);\n\t}\n\tconsole.error(` TOTAL initialization time: ${Date.now() - namespace.resetTime}ms`);\n\tconsole.error(`${\"-\".repeat(title.length + 8)}\\n`);\n}\n\nexport function printTimings(): void {\n\tif (!ENABLED) return;\n\tfor (const [namespace, timingNamespace] of timingNamespaces) {\n\t\tprintTimingGroup(`Startup Timings: ${namespace}`, timingNamespace);\n\t}\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"read-selectors.d.ts","sourceRoot":"","sources":["../../../src/core/tools/read-selectors.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,aAAa;IAAG,KAAK,EAAE,MAAM,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,CAAA;CAAE;AAE9D,MAAM,WAAW,gBAAgB;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,aAAa,EAAE,CAAC;IACzB,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,SAAS,CAAC,EAAE,OAAO,CAAC;CACpB;AA8BD,wBAAgB,sBAAsB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAEjE;AAuHD,wBAAgB,qBAAqB,CAAC,SAAS,EAAE,MAAM,GAAG,gBAAgB,CAUzE;AAED,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,aAAa,EAAE,GAAG,SAAS,GAAG,UAAU,CAAC,OAAO,gBAAgB,CAAC,CAYlI;AAED,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,aAAa,EAAE,GAAG,SAAS,GAAG;IAAE,aAAa,EAAE,MAAM,EAAE,CAAC;IAAC,eAAe,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IAAC,gBAAgB,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,SAAS,CAwBhO;AAED,wBAAgB,2BAA2B,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,WAAW,CAAC,EAAE,MAAM,EAAE,EAAE,SAAS,SAAI,GAAG,MAAM,CAE1H","sourcesContent":["export interface ReadLineRange { start: number; end?: number }\n\nexport interface ReadLineSelector {\n\tpath: string;\n\toffset?: number;\n\tlimit?: number;\n\tranges?: ReadLineRange[];\n\traw?: boolean;\n\tconflicts?: boolean;\n}\n\nconst ARCHIVE_SELECTOR_EXTENSIONS = [\".tar.gz\", \".zip\", \".jar\", \".tar\", \".tgz\", \".gz\"];\nconst RESOURCE_SELECTOR_EXTENSIONS = [\".tar.gz\", \".sqlite\", \".zip\", \".jar\", \".tar\", \".tgz\", \".gz\", \".db\"];\n\nfunction isAsciiDigit(char: string | undefined): boolean { return char !== undefined && char >= \"0\" && char <= \"9\"; }\nfunction hasUrlScheme(value: string): boolean {\n\tconst schemeEnd = value.indexOf(\"://\");\n\tif (schemeEnd <= 0) return false;\n\tfor (let index = 0; index < schemeEnd; index++) {\n\t\tconst char = value[index]!;\n\t\tif (!((char >= \"a\" && char <= \"z\") || (char >= \"A\" && char <= \"Z\"))) return false;\n\t}\n\treturn true;\n}\nfunction selectorExtensionColonIndex(value: string, extensions: readonly string[]): number {\n\tconst lower = value.toLowerCase();\n\tlet best = Number.POSITIVE_INFINITY;\n\tfor (const extension of extensions) {\n\t\tlet from = 0;\n\t\tfor (;;) {\n\t\t\tconst extensionIndex = lower.indexOf(`${extension}:`, from);\n\t\t\tif (extensionIndex < 0) break;\n\t\t\tif (extensionIndex > 0) best = Math.min(best, extensionIndex + extension.length);\n\t\t\tfrom = extensionIndex + 1;\n\t\t}\n\t}\n\treturn Number.isFinite(best) ? best : -1;\n}\n\nexport function isReadResourceSelector(pathValue: string): boolean {\n\treturn selectorExtensionColonIndex(pathValue, RESOURCE_SELECTOR_EXTENSIONS) >= 0 || hasUrlScheme(pathValue) || pathValue.startsWith(\"skill://\");\n}\nfunction archiveSelectorColonIndex(value: string): number { return selectorExtensionColonIndex(value, ARCHIVE_SELECTOR_EXTENSIONS); }\nfunction isArchiveSelectorPath(value: string): boolean { return archiveSelectorColonIndex(value) >= 0; }\nfunction hasArchiveMember(value: string): boolean { const colonIndex = archiveSelectorColonIndex(value); return colonIndex >= 0 && colonIndex < value.length - 1; }\nfunction peelArchiveReadSuffixes(value: string, state: { raw: boolean; conflicts: boolean }): string {\n\tlet working = value;\n\tfor (;;) {\n\t\tconst lower = working.toLowerCase();\n\t\tif (lower.endsWith(\":raw\")) { state.raw = true; working = working.slice(0, -4); continue; }\n\t\tif (lower.endsWith(\":conflicts\")) { state.conflicts = true; working = working.slice(0, -10); continue; }\n\t\treturn working;\n\t}\n}\nfunction findInlineSelector(value: string, selector: \"raw\" | \"conflicts\"): number {\n\tconst needle = `:${selector}`;\n\tlet index = 0;\n\tfor (;;) {\n\t\tconst found = value.toLowerCase().indexOf(needle, index);\n\t\tif (found < 0) return -1;\n\t\tconst next = value[found + needle.length];\n\t\tif (next === undefined || next === \":\") return found;\n\t\tindex = found + needle.length;\n\t}\n}\nfunction peelInlineReadSuffixes(value: string, state: { raw: boolean; conflicts: boolean }): string {\n\tlet working = value;\n\tfor (;;) {\n\t\tconst rawIndex = findInlineSelector(working, \"raw\");\n\t\tif (rawIndex >= 0) { state.raw = true; working = `${working.slice(0, rawIndex)}${working.slice(rawIndex + 4)}`; continue; }\n\t\tconst conflictIndex = findInlineSelector(working, \"conflicts\");\n\t\tif (conflictIndex >= 0) { state.conflicts = true; working = `${working.slice(0, conflictIndex)}${working.slice(conflictIndex + 10)}`; continue; }\n\t\treturn working;\n\t}\n}\nfunction startsLikeLineRange(value: string): boolean {\n\tlet index = value[0]?.toLowerCase() === \"l\" ? 1 : 0;\n\treturn isAsciiDigit(value[index]);\n}\nfunction readNumber(value: string, start: number): { value: number; end: number } | undefined {\n\tlet index = start;\n\twhile (isAsciiDigit(value[index])) index++;\n\tif (index === start) return undefined;\n\treturn { value: Number.parseInt(value.slice(start, index), 10), end: index };\n}\nfunction parseLineRangeToken(token: string, invalid: (message: string) => void): ReadLineRange | undefined {\n\tlet index = token[0]?.toLowerCase() === \"l\" ? 1 : 0;\n\tconst startNumber = readNumber(token, index);\n\tif (!startNumber) return undefined;\n\tconst start = startNumber.value;\n\tif (start < 1) { invalid(\"Line selector 0 is invalid; lines are 1-indexed. Use :1.\"); return undefined; }\n\tindex = startNumber.end;\n\tif (index === token.length) return { start };\n\tlet separator: \"-\" | \"..\" | \"+\" | undefined;\n\tif (token.startsWith(\"..\", index)) { separator = \"..\"; index += 2; }\n\telse if (token[index] === \"-\" || token[index] === \"+\") { separator = token[index] as \"-\" | \"+\"; index++; }\n\tif (!separator) { invalid(`Invalid line selector: ${token}`); return undefined; }\n\tif (token[index]?.toLowerCase() === \"l\") index++;\n\tconst endNumber = readNumber(token, index);\n\tif (!endNumber) {\n\t\tif (separator === \"+\") invalid(`Invalid line selector :${token}; + requires a line count >= 1.`);\n\t\treturn separator === \"+\" ? undefined : { start };\n\t}\n\tif (endNumber.end !== token.length) { invalid(`Invalid line selector: ${token}`); return undefined; }\n\tconst parsed = endNumber.value;\n\tif (separator === \"+\") {\n\t\tif (parsed < 1) { invalid(`Invalid line selector :${token}; + count must be >= 1.`); return undefined; }\n\t\treturn { start, end: start + parsed - 1 };\n\t}\n\tif (parsed < start) { invalid(`Invalid line selector :${token}; end must be >= start.`); return undefined; }\n\treturn { start, end: parsed };\n}\nfunction isLineRangeListCandidate(value: string): boolean {\n\tif (!startsLikeLineRange(value)) return false;\n\tfor (const char of value) {\n\t\tif (!isAsciiDigit(char) && char !== \"L\" && char !== \"l\" && char !== \"+\" && char !== \"-\" && char !== \".\" && char !== \",\") return false;\n\t}\n\treturn true;\n}\n\nfunction parseLineRangeList(value: string, invalid: (message: string) => void): ReadLineRange[] | undefined {\n\tif (!isLineRangeListCandidate(value)) return undefined;\n\tconst ranges: ReadLineRange[] = [];\n\tfor (const token of value.split(\",\")) {\n\t\tif (!token) { invalid(`Invalid line selector: ${value}`); return undefined; }\n\t\tconst range = parseLineRangeToken(token, invalid);\n\t\tif (!range) return undefined;\n\t\tranges.push(range);\n\t}\n\treturn ranges;\n}\nfunction extractTrailingLineRange(value: string, invalid: (message: string) => void): { path: string; ranges: ReadLineRange[] } | undefined {\n\tconst colonIndex = value.lastIndexOf(\":\");\n\tif (colonIndex < 0) return undefined;\n\tconst rangeText = value.slice(colonIndex + 1);\n\tconst ranges = parseLineRangeList(rangeText, invalid);\n\treturn ranges ? { path: value.slice(0, colonIndex), ranges } : undefined;\n}\nfunction selectorFromRanges(path: string, ranges: ReadLineRange[], raw: boolean, conflicts: boolean): ReadLineSelector {\n\tif (ranges.length === 1 && ranges[0]!.end === undefined) return { path, offset: ranges[0]!.start, raw, conflicts };\n\treturn { path, ranges, raw, conflicts };\n}\nfunction parseArchiveReadSelector(value: string): ReadLineSelector {\n\tconst state = { raw: false, conflicts: false };\n\tlet working = peelArchiveReadSuffixes(value, state);\n\tconst extracted = extractTrailingLineRange(working, () => undefined);\n\tif (!extracted) return { path: working, raw: state.raw, conflicts: state.conflicts };\n\tconst suffixState = { ...state };\n\tconst peeledPath = peelArchiveReadSuffixes(extracted.path, suffixState);\n\tconst selectorPath = hasArchiveMember(peeledPath) ? (state.raw = suffixState.raw, state.conflicts = suffixState.conflicts, peeledPath) : extracted.path;\n\tif (!hasArchiveMember(selectorPath)) return { path: working, raw: state.raw, conflicts: state.conflicts };\n\treturn selectorFromRanges(selectorPath, extracted.ranges, state.raw, state.conflicts);\n}\nfunction isHttpUrlWithPortOnly(value: string): boolean {\n\ttry {\n\t\tconst url = new URL(value);\n\t\treturn (url.protocol === \"http:\" || url.protocol === \"https:\") && url.port !== \"\" && url.pathname === \"/\" && url.search === \"\" && url.hash === \"\";\n\t} catch { return false; }\n}\n\nexport function splitReadLineSelector(pathValue: string): ReadLineSelector {\n\tconst state = { raw: false, conflicts: false };\n\tlet value = pathValue;\n\tif (isArchiveSelectorPath(value)) return parseArchiveReadSelector(value);\n\tvalue = peelInlineReadSuffixes(value, state);\n\tif (isHttpUrlWithPortOnly(value)) return { path: value, raw: state.raw, conflicts: state.conflicts };\n\tlet parseError: string | undefined;\n\tconst extracted = extractTrailingLineRange(value, (message) => { parseError = message; });\n\tif (parseError) throw new Error(parseError);\n\treturn extracted ? selectorFromRanges(extracted.path, extracted.ranges, state.raw, state.conflicts) : { path: value, raw: state.raw, conflicts: state.conflicts };\n}\n\nexport function selectExactReadRanges(allLines: string[], ranges: ReadLineRange[] | undefined): ReturnType<typeof selectReadRanges> {\n\tif (!ranges || ranges.length === 0) return undefined;\n\tconst selectedLines: string[] = [], lineNumbers: number[] = [], merged: ReadLineRange[] = [];\n\tfor (const range of [...ranges].sort((a, b) => a.start - b.start)) {\n\t\tif (range.start > allLines.length) continue;\n\t\tconst end = Math.min(range.end ?? allLines.length, allLines.length);\n\t\tconst previous = merged.at(-1);\n\t\tif (previous && range.start <= (previous.end ?? 0) + 1) previous.end = Math.max(previous.end ?? 0, end);\n\t\telse merged.push({ start: range.start, end });\n\t}\n\tfor (const range of merged) for (let line = range.start; line <= (range.end ?? allLines.length); line++) { selectedLines.push(allLines[line - 1] ?? \"\"); lineNumbers.push(line); }\n\treturn { selectedLines, selectedContent: selectedLines.join(\"\\n\"), firstLine: lineNumbers[0] ?? 1, lineNumbers, userLimitedLines: selectedLines.length };\n}\n\nexport function selectReadRanges(allLines: string[], ranges: ReadLineRange[] | undefined): { selectedLines: string[]; selectedContent: string; firstLine: number; lineNumbers?: number[]; userLimitedLines?: number } | undefined {\n\tif (!ranges || ranges.length === 0) return undefined;\n\tconst selectedLines: string[] = [];\n\tconst lineNumbers: number[] = [];\n\tconst merged: ReadLineRange[] = [];\n\tfor (const range of [...ranges].sort((a, b) => a.start - b.start)) {\n\t\tconst bounded = range.end !== undefined;\n\t\tif (range.start > allLines.length) continue;\n\t\tconst requestedEnd = Math.min(range.end ?? allLines.length, allLines.length);\n\t\tif (requestedEnd < range.start) continue;\n\t\tconst start = Math.max(1, range.start - (bounded ? 1 : 0));\n\t\tconst end = Math.min(allLines.length, requestedEnd + (bounded ? 3 : 0));\n\t\tconst previous = merged.at(-1);\n\t\tif (previous && start <= (previous.end ?? 0) + 1) previous.end = Math.max(previous.end ?? 0, end);\n\t\telse merged.push({ start, end });\n\t}\n\tfor (const range of merged) {\n\t\tconst end = Math.min(range.end ?? allLines.length, allLines.length);\n\t\tfor (let line = range.start; line <= end; line++) {\n\t\t\tselectedLines.push(allLines[line - 1] ?? \"\");\n\t\t\tlineNumbers.push(line);\n\t\t}\n\t}\n\treturn { selectedLines, selectedContent: selectedLines.join(\"\\n\"), firstLine: lineNumbers[0] ?? 1, lineNumbers, userLimitedLines: selectedLines.length };\n}\n\nexport function formatHashlineSelectedLines(header: string, lines: string[], lineNumbers?: number[], startLine = 1): string {\n\treturn [header, ...lines.map((line, index) => `${lineNumbers?.[index] ?? startLine + index}:${line}`)].join(\"\\n\");\n}\n"]}
1
+ {"version":3,"file":"read-selectors.d.ts","sourceRoot":"","sources":["../../../src/core/tools/read-selectors.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,aAAa;IAAG,KAAK,EAAE,MAAM,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,CAAA;CAAE;AAE9D,MAAM,WAAW,gBAAgB;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,aAAa,EAAE,CAAC;IACzB,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,SAAS,CAAC,EAAE,OAAO,CAAC;CACpB;AA8BD,wBAAgB,sBAAsB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAEjE;AAuID,wBAAgB,qBAAqB,CAAC,SAAS,EAAE,MAAM,GAAG,gBAAgB,CAUzE;AAED,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,aAAa,EAAE,GAAG,SAAS,GAAG,UAAU,CAAC,OAAO,gBAAgB,CAAC,CAYlI;AAED,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,aAAa,EAAE,GAAG,SAAS,GAAG;IAAE,aAAa,EAAE,MAAM,EAAE,CAAC;IAAC,eAAe,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IAAC,gBAAgB,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,SAAS,CAwBhO;AAED,wBAAgB,2BAA2B,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,WAAW,CAAC,EAAE,MAAM,EAAE,EAAE,SAAS,SAAI,GAAG,MAAM,CAE1H","sourcesContent":["export interface ReadLineRange { start: number; end?: number }\n\nexport interface ReadLineSelector {\n\tpath: string;\n\toffset?: number;\n\tlimit?: number;\n\tranges?: ReadLineRange[];\n\traw?: boolean;\n\tconflicts?: boolean;\n}\n\nconst ARCHIVE_SELECTOR_EXTENSIONS = [\".tar.gz\", \".zip\", \".jar\", \".tar\", \".tgz\", \".gz\"];\nconst RESOURCE_SELECTOR_EXTENSIONS = [\".tar.gz\", \".sqlite\", \".zip\", \".jar\", \".tar\", \".tgz\", \".gz\", \".db\"];\n\nfunction isAsciiDigit(char: string | undefined): boolean { return char !== undefined && char >= \"0\" && char <= \"9\"; }\nfunction hasUrlScheme(value: string): boolean {\n\tconst schemeEnd = value.indexOf(\"://\");\n\tif (schemeEnd <= 0) return false;\n\tfor (let index = 0; index < schemeEnd; index++) {\n\t\tconst char = value[index]!;\n\t\tif (!((char >= \"a\" && char <= \"z\") || (char >= \"A\" && char <= \"Z\"))) return false;\n\t}\n\treturn true;\n}\nfunction selectorExtensionColonIndex(value: string, extensions: readonly string[]): number {\n\tconst lower = value.toLowerCase();\n\tlet best = Number.POSITIVE_INFINITY;\n\tfor (const extension of extensions) {\n\t\tlet from = 0;\n\t\tfor (;;) {\n\t\t\tconst extensionIndex = lower.indexOf(`${extension}:`, from);\n\t\t\tif (extensionIndex < 0) break;\n\t\t\tif (extensionIndex > 0) best = Math.min(best, extensionIndex + extension.length);\n\t\t\tfrom = extensionIndex + 1;\n\t\t}\n\t}\n\treturn Number.isFinite(best) ? best : -1;\n}\n\nexport function isReadResourceSelector(pathValue: string): boolean {\n\treturn selectorExtensionColonIndex(pathValue, RESOURCE_SELECTOR_EXTENSIONS) >= 0 || hasUrlScheme(pathValue) || pathValue.startsWith(\"skill://\");\n}\nfunction archiveSelectorColonIndex(value: string): number { return selectorExtensionColonIndex(value, ARCHIVE_SELECTOR_EXTENSIONS); }\nfunction isArchiveSelectorPath(value: string): boolean { return archiveSelectorColonIndex(value) >= 0; }\nfunction hasArchiveMember(value: string): boolean { const colonIndex = archiveSelectorColonIndex(value); return colonIndex >= 0 && colonIndex < value.length - 1; }\nfunction peelArchiveReadSuffixes(value: string, state: { raw: boolean; conflicts: boolean }): string {\n\tlet working = value;\n\tfor (;;) {\n\t\tconst lower = working.toLowerCase();\n\t\tif (lower.endsWith(\":raw\")) { state.raw = true; working = working.slice(0, -4); continue; }\n\t\tif (lower.endsWith(\":conflicts\")) { state.conflicts = true; working = working.slice(0, -10); continue; }\n\t\treturn working;\n\t}\n}\nfunction findInlineSelector(value: string, selector: \"raw\" | \"conflicts\"): number {\n\tconst needle = `:${selector}`;\n\tlet index = 0;\n\tfor (;;) {\n\t\tconst found = value.toLowerCase().indexOf(needle, index);\n\t\tif (found < 0) return -1;\n\t\tconst next = value[found + needle.length];\n\t\tif (next === undefined || next === \":\") return found;\n\t\tindex = found + needle.length;\n\t}\n}\nfunction peelInlineReadSuffixes(value: string, state: { raw: boolean; conflicts: boolean }): string {\n\tlet working = value;\n\tfor (;;) {\n\t\tconst rawIndex = findInlineSelector(working, \"raw\");\n\t\tif (rawIndex >= 0) { state.raw = true; working = `${working.slice(0, rawIndex)}${working.slice(rawIndex + 4)}`; continue; }\n\t\tconst conflictIndex = findInlineSelector(working, \"conflicts\");\n\t\tif (conflictIndex >= 0) { state.conflicts = true; working = `${working.slice(0, conflictIndex)}${working.slice(conflictIndex + 10)}`; continue; }\n\t\treturn working;\n\t}\n}\nfunction startsLikeLineRange(value: string): boolean {\n\tlet index = value[0]?.toLowerCase() === \"l\" ? 1 : 0;\n\treturn isAsciiDigit(value[index]);\n}\nfunction readNumber(value: string, start: number): { value: number; end: number } | undefined {\n\tlet index = start;\n\twhile (isAsciiDigit(value[index])) index++;\n\tif (index === start) return undefined;\n\treturn { value: Number.parseInt(value.slice(start, index), 10), end: index };\n}\nfunction parseLineRangeToken(token: string, invalid: (message: string) => void): ReadLineRange | undefined {\n\tlet index = token[0]?.toLowerCase() === \"l\" ? 1 : 0;\n\tconst startNumber = readNumber(token, index);\n\tif (!startNumber) return undefined;\n\tconst start = startNumber.value;\n\tif (start < 1) { invalid(\"Line selector 0 is invalid; lines are 1-indexed. Use :1.\"); return undefined; }\n\tindex = startNumber.end;\n\tif (index === token.length) return { start };\n\tlet separator: \"-\" | \"..\" | \"+\" | undefined;\n\tif (token.startsWith(\"..\", index)) { separator = \"..\"; index += 2; }\n\telse if (token[index] === \"-\" || token[index] === \"+\") { separator = token[index] as \"-\" | \"+\"; index++; }\n\tif (!separator) { invalid(`Invalid line selector: ${token}`); return undefined; }\n\tif (token[index]?.toLowerCase() === \"l\") index++;\n\tconst endNumber = readNumber(token, index);\n\tif (!endNumber) {\n\t\tif (separator === \"+\") invalid(`Invalid line selector :${token}; + requires a line count >= 1.`);\n\t\treturn separator === \"+\" ? undefined : { start };\n\t}\n\tif (endNumber.end !== token.length) { invalid(`Invalid line selector: ${token}`); return undefined; }\n\tconst parsed = endNumber.value;\n\tif (separator === \"+\") {\n\t\tif (parsed < 1) { invalid(`Invalid line selector :${token}; + count must be >= 1.`); return undefined; }\n\t\treturn { start, end: start + parsed - 1 };\n\t}\n\tif (parsed < start) { invalid(`Invalid line selector :${token}; end must be >= start.`); return undefined; }\n\treturn { start, end: parsed };\n}\nfunction isLineRangeListCandidate(value: string): boolean {\n\tif (!startsLikeLineRange(value)) return false;\n\tfor (const char of value) {\n\t\tif (!isAsciiDigit(char) && char !== \"L\" && char !== \"l\" && char !== \"+\" && char !== \"-\" && char !== \".\" && char !== \",\") return false;\n\t}\n\treturn true;\n}\n\nfunction parseLineRangeList(value: string, invalid: (message: string) => void): ReadLineRange[] | undefined {\n\tif (!isLineRangeListCandidate(value)) return undefined;\n\tconst ranges: ReadLineRange[] = [];\n\tfor (const token of value.split(\",\")) {\n\t\tif (!token) { invalid(`Invalid line selector: ${value}`); return undefined; }\n\t\tconst range = parseLineRangeToken(token, invalid);\n\t\tif (!range) return undefined;\n\t\tranges.push(range);\n\t}\n\treturn ranges;\n}\nfunction isBareLineNumber(value: string): boolean { return value.length > 0 && [...value].every(isAsciiDigit); }\nfunction extractTrailingLineRange(value: string, invalid: (message: string) => void): { path: string; ranges: ReadLineRange[] } | undefined {\n\tconst colonIndex = value.lastIndexOf(\":\");\n\tif (colonIndex < 0) return undefined;\n\tconst rangeText = value.slice(colonIndex + 1);\n\tconst ranges = parseLineRangeList(rangeText, invalid);\n\tif (!ranges) return undefined;\n\tconst path = value.slice(0, colonIndex);\n\t// Support the `file:START:END` (and grep-style `file:LINE:COL`) colon\n\t// convention: a trailing bare-number segment preceded by another bare-number\n\t// segment reads as START..END. Without this the leading number stays glued to\n\t// the path (`file:395`) and produces a broken filename.\n\tconst prevColon = path.lastIndexOf(\":\");\n\tif (prevColon >= 0 && ranges.length === 1 && ranges[0]!.end === undefined && isBareLineNumber(rangeText)) {\n\t\tconst prevSegment = path.slice(prevColon + 1);\n\t\tif (isBareLineNumber(prevSegment)) {\n\t\t\tconst start = Number.parseInt(prevSegment, 10);\n\t\t\tconst end = ranges[0]!.start;\n\t\t\tif (start >= 1) return { path: path.slice(0, prevColon), ranges: [end >= start ? { start, end } : { start }] };\n\t\t}\n\t}\n\treturn { path, ranges };\n}\nfunction selectorFromRanges(path: string, ranges: ReadLineRange[], raw: boolean, conflicts: boolean): ReadLineSelector {\n\tif (ranges.length === 1 && ranges[0]!.end === undefined) return { path, offset: ranges[0]!.start, raw, conflicts };\n\treturn { path, ranges, raw, conflicts };\n}\nfunction parseArchiveReadSelector(value: string): ReadLineSelector {\n\tconst state = { raw: false, conflicts: false };\n\tlet working = peelArchiveReadSuffixes(value, state);\n\tconst extracted = extractTrailingLineRange(working, () => undefined);\n\tif (!extracted) return { path: working, raw: state.raw, conflicts: state.conflicts };\n\tconst suffixState = { ...state };\n\tconst peeledPath = peelArchiveReadSuffixes(extracted.path, suffixState);\n\tconst selectorPath = hasArchiveMember(peeledPath) ? (state.raw = suffixState.raw, state.conflicts = suffixState.conflicts, peeledPath) : extracted.path;\n\tif (!hasArchiveMember(selectorPath)) return { path: working, raw: state.raw, conflicts: state.conflicts };\n\treturn selectorFromRanges(selectorPath, extracted.ranges, state.raw, state.conflicts);\n}\nfunction isHttpUrlWithPortOnly(value: string): boolean {\n\ttry {\n\t\tconst url = new URL(value);\n\t\treturn (url.protocol === \"http:\" || url.protocol === \"https:\") && url.port !== \"\" && url.pathname === \"/\" && url.search === \"\" && url.hash === \"\";\n\t} catch { return false; }\n}\n\nexport function splitReadLineSelector(pathValue: string): ReadLineSelector {\n\tconst state = { raw: false, conflicts: false };\n\tlet value = pathValue;\n\tif (isArchiveSelectorPath(value)) return parseArchiveReadSelector(value);\n\tvalue = peelInlineReadSuffixes(value, state);\n\tif (isHttpUrlWithPortOnly(value)) return { path: value, raw: state.raw, conflicts: state.conflicts };\n\tlet parseError: string | undefined;\n\tconst extracted = extractTrailingLineRange(value, (message) => { parseError = message; });\n\tif (parseError) throw new Error(parseError);\n\treturn extracted ? selectorFromRanges(extracted.path, extracted.ranges, state.raw, state.conflicts) : { path: value, raw: state.raw, conflicts: state.conflicts };\n}\n\nexport function selectExactReadRanges(allLines: string[], ranges: ReadLineRange[] | undefined): ReturnType<typeof selectReadRanges> {\n\tif (!ranges || ranges.length === 0) return undefined;\n\tconst selectedLines: string[] = [], lineNumbers: number[] = [], merged: ReadLineRange[] = [];\n\tfor (const range of [...ranges].sort((a, b) => a.start - b.start)) {\n\t\tif (range.start > allLines.length) continue;\n\t\tconst end = Math.min(range.end ?? allLines.length, allLines.length);\n\t\tconst previous = merged.at(-1);\n\t\tif (previous && range.start <= (previous.end ?? 0) + 1) previous.end = Math.max(previous.end ?? 0, end);\n\t\telse merged.push({ start: range.start, end });\n\t}\n\tfor (const range of merged) for (let line = range.start; line <= (range.end ?? allLines.length); line++) { selectedLines.push(allLines[line - 1] ?? \"\"); lineNumbers.push(line); }\n\treturn { selectedLines, selectedContent: selectedLines.join(\"\\n\"), firstLine: lineNumbers[0] ?? 1, lineNumbers, userLimitedLines: selectedLines.length };\n}\n\nexport function selectReadRanges(allLines: string[], ranges: ReadLineRange[] | undefined): { selectedLines: string[]; selectedContent: string; firstLine: number; lineNumbers?: number[]; userLimitedLines?: number } | undefined {\n\tif (!ranges || ranges.length === 0) return undefined;\n\tconst selectedLines: string[] = [];\n\tconst lineNumbers: number[] = [];\n\tconst merged: ReadLineRange[] = [];\n\tfor (const range of [...ranges].sort((a, b) => a.start - b.start)) {\n\t\tconst bounded = range.end !== undefined;\n\t\tif (range.start > allLines.length) continue;\n\t\tconst requestedEnd = Math.min(range.end ?? allLines.length, allLines.length);\n\t\tif (requestedEnd < range.start) continue;\n\t\tconst start = Math.max(1, range.start - (bounded ? 1 : 0));\n\t\tconst end = Math.min(allLines.length, requestedEnd + (bounded ? 3 : 0));\n\t\tconst previous = merged.at(-1);\n\t\tif (previous && start <= (previous.end ?? 0) + 1) previous.end = Math.max(previous.end ?? 0, end);\n\t\telse merged.push({ start, end });\n\t}\n\tfor (const range of merged) {\n\t\tconst end = Math.min(range.end ?? allLines.length, allLines.length);\n\t\tfor (let line = range.start; line <= end; line++) {\n\t\t\tselectedLines.push(allLines[line - 1] ?? \"\");\n\t\t\tlineNumbers.push(line);\n\t\t}\n\t}\n\treturn { selectedLines, selectedContent: selectedLines.join(\"\\n\"), firstLine: lineNumbers[0] ?? 1, lineNumbers, userLimitedLines: selectedLines.length };\n}\n\nexport function formatHashlineSelectedLines(header: string, lines: string[], lineNumbers?: number[], startLine = 1): string {\n\treturn [header, ...lines.map((line, index) => `${lineNumbers?.[index] ?? startLine + index}:${line}`)].join(\"\\n\");\n}\n"]}
@@ -171,13 +171,31 @@ function parseLineRangeList(value, invalid) {
171
171
  }
172
172
  return ranges;
173
173
  }
174
+ function isBareLineNumber(value) { return value.length > 0 && [...value].every(isAsciiDigit); }
174
175
  function extractTrailingLineRange(value, invalid) {
175
176
  const colonIndex = value.lastIndexOf(":");
176
177
  if (colonIndex < 0)
177
178
  return undefined;
178
179
  const rangeText = value.slice(colonIndex + 1);
179
180
  const ranges = parseLineRangeList(rangeText, invalid);
180
- return ranges ? { path: value.slice(0, colonIndex), ranges } : undefined;
181
+ if (!ranges)
182
+ return undefined;
183
+ const path = value.slice(0, colonIndex);
184
+ // Support the `file:START:END` (and grep-style `file:LINE:COL`) colon
185
+ // convention: a trailing bare-number segment preceded by another bare-number
186
+ // segment reads as START..END. Without this the leading number stays glued to
187
+ // the path (`file:395`) and produces a broken filename.
188
+ const prevColon = path.lastIndexOf(":");
189
+ if (prevColon >= 0 && ranges.length === 1 && ranges[0].end === undefined && isBareLineNumber(rangeText)) {
190
+ const prevSegment = path.slice(prevColon + 1);
191
+ if (isBareLineNumber(prevSegment)) {
192
+ const start = Number.parseInt(prevSegment, 10);
193
+ const end = ranges[0].start;
194
+ if (start >= 1)
195
+ return { path: path.slice(0, prevColon), ranges: [end >= start ? { start, end } : { start }] };
196
+ }
197
+ }
198
+ return { path, ranges };
181
199
  }
182
200
  function selectorFromRanges(path, ranges, raw, conflicts) {
183
201
  if (ranges.length === 1 && ranges[0].end === undefined)