@openspecui/core 3.10.0 → 3.11.1

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 (76) hide show
  1. package/dist/{document-translation-BZ5QKjN0.d.mts → document-translation-AlZtjOt5.d.mts} +10 -7
  2. package/dist/{document-translation-BrE402YR.mjs → document-translation-Dnl1lz2K.mjs} +1 -1
  3. package/dist/document-translation.d.mts +2 -2
  4. package/dist/document-translation.mjs +2 -2
  5. package/dist/hosted-app.d.mts +1 -1
  6. package/dist/hosted-app.mjs +1 -1
  7. package/dist/index.d.mts +47 -37
  8. package/dist/index.mjs +240 -59
  9. package/dist/{local-download-profiles-BppI_PAq.mjs → local-download-profiles-CNDtMG2s.mjs} +7 -3
  10. package/dist/{local-download-profiles-Qu1932tV.d.mts → local-download-profiles-DISrU0mw.d.mts} +5 -1
  11. package/dist/local-download-profiles.d.mts +2 -2
  12. package/dist/local-download-profiles.mjs +1 -1
  13. package/dist/markdown-facts.d.mts +1 -1
  14. package/dist/markdown-facts.mjs +1 -1
  15. package/dist/{markdown-reading-DvLPaaY1.d.mts → markdown-reading-BaHZTf5f.d.mts} +1 -1
  16. package/dist/{markdown-reading-DYBp7qoI.mjs → markdown-reading-DSlcirYV.mjs} +1 -1
  17. package/dist/markdown-reading.d.mts +2 -2
  18. package/dist/markdown-reading.mjs +2 -2
  19. package/dist/{notifications-9vbSJQ8N.mjs → notifications-Xs9VPFWD.mjs} +2 -2
  20. package/dist/{notifications-D7tcKw71.d.mts → notifications-gGjGaYsF.d.mts} +9 -9
  21. package/dist/notifications.d.mts +2 -2
  22. package/dist/notifications.mjs +3 -3
  23. package/dist/{openspec-annotations-DVbFBz5J.d.mts → openspec-annotations-DYyP_HQh.d.mts} +2 -2
  24. package/dist/{openspec-annotations-BxBoWlyv.mjs → openspec-annotations-dNJentSE.mjs} +2 -2
  25. package/dist/openspec-annotations.d.mts +3 -3
  26. package/dist/openspec-annotations.mjs +3 -3
  27. package/dist/{openspec-projection-Bby9mX80.d.mts → openspec-projection-BojcJ9zl.d.mts} +3 -3
  28. package/dist/{openspec-projection-Cd6oydiK.mjs → openspec-projection-yqwKIKnp.mjs} +2 -2
  29. package/dist/openspec-projection.d.mts +5 -5
  30. package/dist/openspec-projection.mjs +4 -4
  31. package/dist/opsx-display-path.d.mts +1 -1
  32. package/dist/opsx-display-path.mjs +1 -1
  33. package/dist/{opsx-entity-DUJvjvrv.d.mts → opsx-entity-BdyGTVs_.d.mts} +19 -19
  34. package/dist/opsx-entity.d.mts +2 -2
  35. package/dist/opsx-entity.mjs +1 -1
  36. package/dist/{opsx-schema-detail-CUG4dYdw.d.mts → opsx-schema-detail-Cf8YIflR.d.mts} +1 -1
  37. package/dist/opsx-schema-detail.d.mts +3 -3
  38. package/dist/opsx-schema-detail.mjs +1 -1
  39. package/dist/{schemas-CqgvXgGV.d.mts → schemas-DV6yABO9.d.mts} +52 -44
  40. package/dist/{sounds-DABkmyg9.d.mts → sounds-C906qHTJ.d.mts} +5 -5
  41. package/dist/sounds.d.mts +1 -1
  42. package/dist/sounds.mjs +1 -1
  43. package/dist/{terminal-audio-DVz0HA2H.mjs → terminal-audio-CUs0sqEO.mjs} +1 -1
  44. package/dist/{terminal-audio-CDyXOIWx.d.mts → terminal-audio-D6dE8O1_.d.mts} +2 -2
  45. package/dist/terminal-audio.d.mts +2 -2
  46. package/dist/terminal-audio.mjs +2 -2
  47. package/dist/terminal-control.d.mts +2 -2
  48. package/dist/terminal-control.mjs +1 -1
  49. package/dist/{terminal-invocation-BnsT7ae7.d.mts → terminal-invocation-Cz0vfgkw.d.mts} +39 -39
  50. package/dist/terminal-invocation.d.mts +1 -1
  51. package/dist/terminal-invocation.mjs +1 -1
  52. package/dist/terminal-theme.d.mts +1 -1
  53. package/dist/terminal-theme.mjs +1 -1
  54. package/dist/translation-language-pair-D6f5u70K.mjs +51 -0
  55. package/dist/translation-language-pair-DaSvW83F.d.mts +18 -0
  56. package/dist/translation-language-pair.d.mts +2 -0
  57. package/dist/translation-language-pair.mjs +3 -0
  58. package/dist/{translator-C3LT7PqW.mjs → translator-B0T5VL9k.mjs} +94 -2
  59. package/dist/translator-tTXEGRdz.d.mts +1884 -0
  60. package/dist/translator.d.mts +2 -2
  61. package/dist/translator.mjs +2 -2
  62. package/package.json +9 -3
  63. package/dist/translator-C3W7bTIN.d.mts +0 -780
  64. /package/dist/{hosted-app-CxpQvD1s.mjs → hosted-app-CNZhVLM_.mjs} +0 -0
  65. /package/dist/{hosted-app-FuxG4-qA.d.mts → hosted-app-CegGJlNp.d.mts} +0 -0
  66. /package/dist/{markdown-facts-B5RvYPKF.mjs → markdown-facts-DbE1F2LD.mjs} +0 -0
  67. /package/dist/{markdown-facts-DUsbNcjh.d.mts → markdown-facts-DempqdIX.d.mts} +0 -0
  68. /package/dist/{opsx-display-path-Bf89ZyM5.mjs → opsx-display-path-Cw-5MTRg.mjs} +0 -0
  69. /package/dist/{opsx-display-path-CbO6K0Qq.d.mts → opsx-display-path-Ky9qnntM.d.mts} +0 -0
  70. /package/dist/{opsx-entity-BR_6djiM.mjs → opsx-entity-C_51ZEuP.mjs} +0 -0
  71. /package/dist/{opsx-schema-detail-5Wv1oWLT.mjs → opsx-schema-detail-Bu415_NB.mjs} +0 -0
  72. /package/dist/{sounds-CB_gpY-y.mjs → sounds-50cYk5b0.mjs} +0 -0
  73. /package/dist/{terminal-control-CNcEd9Rl.mjs → terminal-control-CYZhk7FM.mjs} +0 -0
  74. /package/dist/{terminal-invocation-wUmtJMPl.mjs → terminal-invocation-IopdwXKL.mjs} +0 -0
  75. /package/dist/{terminal-theme-CHkfTDk4.mjs → terminal-theme-BquTqZIO.mjs} +0 -0
  76. /package/dist/{terminal-theme-x_vAHvok.d.mts → terminal-theme-CH-VSrAq.d.mts} +0 -0
package/dist/index.mjs CHANGED
@@ -1,25 +1,26 @@
1
- import { a as normalizeOpsxEntityPath, c as parseOpsxEntityMetadata, i as isOpsxGlobPattern, n as getOpsxEntityMetadataPath, o as opsxGlobToRegex, r as getOpsxEntityRootRelativePath, s as opsxPathMatchesPattern, t as buildOpsxEntityDetail } from "./opsx-entity-BR_6djiM.mjs";
2
- import { n as toMarkdownFactKind, t as parseMarkdownFacts } from "./markdown-facts-B5RvYPKF.mjs";
3
- import { a as getMarkdownAnnotation, c as getMarkdownHeadingEnd, d as trimMarkdownSlice, i as createMarkdownReadingDocumentFromFacts, l as getMarkdownHeadingFacts, n as buildMarkdownParentMap, o as getMarkdownAnnotationsForFact, r as createMarkdownReadingDocument, s as getMarkdownFactSpan, t as MarkdownReadingPluginRegistry, u as sortMarkdownReadingPlugins } from "./markdown-reading-DYBp7qoI.mjs";
4
- import { a as getOpenSpecAnnotationsForFact, i as getOpenSpecAnnotation, n as annotateOpenSpecMarkdown, o as openSpecAnnotationRules, r as builtinOpenSpecReadingPlugin, t as annotateOpenSpecFacts } from "./openspec-annotations-BxBoWlyv.mjs";
5
- import { a as getOpenSpecReadingSections, c as projectOpenSpecMarkdown, i as getOpenSpecProjectionAnnotation, n as OPEN_SPEC_SPEC_PROJECTION_ID, o as parseOpenSpecMarkdownToSpec, r as createOpenSpecReadingPlugin, s as projectAnnotatedOpenSpecToSpec, t as OPEN_SPEC_READING_SECTIONS_PROJECTION_ID } from "./openspec-projection-Cd6oydiK.mjs";
6
- import { _ as TranslationLocalSettingsSchema, a as LocalModelAssetPlanSnapshotSchema, c as SERVICE_TRANSLATION_ENGINE_IDS, d as TRANSLATION_ENGINE_MANIFESTS, f as TRANSLATOR_CONTRACT_VERSION, g as TranslationEngineIdSchema, h as TranslationEngineGlobalSettingsSchema, i as LocalModelAssetLogSchema, l as ServiceTranslationEngineIdSchema, m as TranslationDownloadGroupPlanSchema, n as BatchTranslateInputSchema, o as LocalModelAssetStateSchema, p as TranslationDownloadFilePlanSchema, r as DEFAULT_TRANSLATION_ENGINE_ID, s as LocalModelDownloadStatusSchema, t as BatchTranslateEventSchema, u as TRANSLATION_ENGINE_IDS, v as TranslationOpenAISettingsSchema, y as getTranslationEngineManifest } from "./translator-C3LT7PqW.mjs";
7
- import { a as MAX_TRANSLATION_CACHE_ENTRY_LIMIT, c as TranslationCacheEntrySchema, d as TranslationCacheStatsSchema, f as TranslationCacheWriteInputSchema, i as DocumentTranslationDisplayModeSchema, l as TranslationCacheReadInputSchema, n as DOCUMENT_TRANSLATION_DISPLAY_MODES, o as MIN_TRANSLATION_CACHE_ENTRY_LIMIT, p as TranslationEngineProjectSettingsSchema, r as DocumentTranslationConfigSchema, s as TRANSLATION_CACHE_POLICY_VERSION, t as DEFAULT_TRANSLATION_CACHE_ENTRY_LIMIT, u as TranslationCacheSettingsSchema } from "./document-translation-BrE402YR.mjs";
8
- import { _ as customHashFromSoundId, a as CustomSoundHashSchema, b as soundIdFromCustomHash, c as CustomSoundMetadataSchema, f as LEGACY_SOUND_ID_MAP, g as SoundVolumeSchema, h as SoundIdSchema, i as CUSTOM_SOUND_ADD_VALUE, l as DEFAULT_BELL_SOUND_ID, m as SoundConfigIdSchema, n as BUILTIN_SOUND_OPTIONS, o as CustomSoundIdSchema, p as SILENT_SOUND_ID, r as BuiltinSoundIdSchema, s as CustomSoundMetadataFileSchema, t as BUILTIN_SOUND_IDS, u as DEFAULT_NOTIFICATION_SOUND_ID, v as getBuiltinSoundUrl, y as normalizeLegacySoundId } from "./sounds-CB_gpY-y.mjs";
9
- import { n as terminalNotificationEventToPublishInput, t as TerminalControlParser } from "./terminal-control-CNcEd9Rl.mjs";
10
- import { a as NotificationPublishInputSchema, c as NotificationSoundSchema, h as groupNotifications, i as NotificationGroupKeySchema, l as NotificationSourceSchema, m as getNotificationGroupLabel, n as NOTIFICATION_SOUND_VALUES, o as NotificationRecordSchema, p as getNotificationGroupKey, r as NotificationActionSchema, s as NotificationSettingsSchema, t as NOTIFICATION_SOUND_OPTIONS, u as TerminalNotificationParser } from "./notifications-9vbSJQ8N.mjs";
11
- import { n as TERMINAL_BELL_SOUND_VALUES, r as TerminalBellSoundSchema, t as TERMINAL_BELL_SOUND_OPTIONS } from "./terminal-audio-DVz0HA2H.mjs";
12
- import { a as TERMINAL_THEME_VALUES, i as TERMINAL_THEME_MODE_VALUES, n as DEFAULT_TERMINAL_LIGHT_THEME, r as DEFAULT_TERMINAL_THEME_MODE, t as DEFAULT_TERMINAL_DARK_THEME } from "./terminal-theme-CHkfTDk4.mjs";
13
- import { i as selectLocalDownloadGroup, n as buildLocalDownloadPlanFromRepositoryFiles, r as buildLocalDownloadPlanFromRuntimeProfileFiles, t as LOCAL_MODEL_PROFILE_DEFINITIONS } from "./local-download-profiles-BppI_PAq.mjs";
14
- import { a as buildEmbeddedUiLaunchUrl, c as isHostedBackendHealthResponse, d as normalizeHostedAppBaseUrl, f as resolveHostedAppBaseUrl, i as buildBackendHealthPayload, l as isSupportedEmbeddedUiUrl, n as OFFICIAL_APP_BASE_URL, o as buildHostedLaunchUrl, r as OPENSPECUI_RUNTIME_CAPABILITIES, s as isBackendHealthRuntimeMetadata, t as HOSTED_SHELL_PROTOCOL_VERSION, u as normalizeEmbeddedUiUrl } from "./hosted-app-CxpQvD1s.mjs";
15
- import { n as toOpsxDisplayPath, t as VIRTUAL_PROJECT_DIRNAME } from "./opsx-display-path-Bf89ZyM5.mjs";
16
- import { a as TerminalInvocationSettingsSchema, c as TerminalSpawnCommandSchema, f as quoteTerminalShellArg, g as resolveTerminalShellDefaults, h as renderTerminalSpawnCommandLine, i as TerminalCommandFieldSchema, n as TERMINAL_COMMAND_FIELD_TYPE_VALUES, o as TerminalShellProfileSchema, p as renderTerminalCommandArgs, r as TERMINAL_SHELL_QUOTE_STYLE_VALUES, s as TerminalShellQuoteStyleSchema, t as BUILTIN_TERMINAL_SPAWN_COMMANDS, u as getTerminalCommandDefaultValues } from "./terminal-invocation-wUmtJMPl.mjs";
17
- import { t as parseOpsxSchemaDetail } from "./opsx-schema-detail-5Wv1oWLT.mjs";
1
+ import { a as normalizeOpsxEntityPath, c as parseOpsxEntityMetadata, i as isOpsxGlobPattern, n as getOpsxEntityMetadataPath, o as opsxGlobToRegex, r as getOpsxEntityRootRelativePath, s as opsxPathMatchesPattern, t as buildOpsxEntityDetail } from "./opsx-entity-C_51ZEuP.mjs";
2
+ import { n as toMarkdownFactKind, t as parseMarkdownFacts } from "./markdown-facts-DbE1F2LD.mjs";
3
+ import { a as getMarkdownAnnotation, c as getMarkdownHeadingEnd, d as trimMarkdownSlice, i as createMarkdownReadingDocumentFromFacts, l as getMarkdownHeadingFacts, n as buildMarkdownParentMap, o as getMarkdownAnnotationsForFact, r as createMarkdownReadingDocument, s as getMarkdownFactSpan, t as MarkdownReadingPluginRegistry, u as sortMarkdownReadingPlugins } from "./markdown-reading-DSlcirYV.mjs";
4
+ import { a as getOpenSpecAnnotationsForFact, i as getOpenSpecAnnotation, n as annotateOpenSpecMarkdown, o as openSpecAnnotationRules, r as builtinOpenSpecReadingPlugin, t as annotateOpenSpecFacts } from "./openspec-annotations-dNJentSE.mjs";
5
+ import { a as getOpenSpecReadingSections, c as projectOpenSpecMarkdown, i as getOpenSpecProjectionAnnotation, n as OPEN_SPEC_SPEC_PROJECTION_ID, o as parseOpenSpecMarkdownToSpec, r as createOpenSpecReadingPlugin, s as projectAnnotatedOpenSpecToSpec, t as OPEN_SPEC_READING_SECTIONS_PROJECTION_ID } from "./openspec-projection-yqwKIKnp.mjs";
6
+ import { C as TranslationEngineIdSchema, E as getTranslationEngineManifest, S as TranslationEngineGlobalSettingsSchema, T as TranslationOpenAISettingsSchema, _ as TRANSLATION_ENGINE_IDS, a as LocalModelAssetPlanSnapshotSchema, b as TranslationDownloadFilePlanSchema, c as LocalModelLifecycleFileStateSchema, d as LocalModelProfileManifestFileSchema, f as LocalModelProfileManifestGroupSchema, g as ServiceTranslationEngineIdSchema, h as SERVICE_TRANSLATION_ENGINE_IDS, i as LocalModelAssetLogSchema, l as LocalModelLifecycleGroupStateSchema, m as LocalModelProfileStatusSchema, n as BatchTranslateInputSchema, o as LocalModelAssetStateSchema, p as LocalModelProfileManifestSchema, r as DEFAULT_TRANSLATION_ENGINE_ID, s as LocalModelDownloadStatusSchema, t as BatchTranslateEventSchema, u as LocalModelProfileLoadStateSchema, v as TRANSLATION_ENGINE_MANIFESTS, w as TranslationLocalSettingsSchema, x as TranslationDownloadGroupPlanSchema, y as TRANSLATOR_CONTRACT_VERSION } from "./translator-B0T5VL9k.mjs";
7
+ import { a as MAX_TRANSLATION_CACHE_ENTRY_LIMIT, c as TranslationCacheEntrySchema, d as TranslationCacheStatsSchema, f as TranslationCacheWriteInputSchema, i as DocumentTranslationDisplayModeSchema, l as TranslationCacheReadInputSchema, n as DOCUMENT_TRANSLATION_DISPLAY_MODES, o as MIN_TRANSLATION_CACHE_ENTRY_LIMIT, p as TranslationEngineProjectSettingsSchema, r as DocumentTranslationConfigSchema, s as TRANSLATION_CACHE_POLICY_VERSION, t as DEFAULT_TRANSLATION_CACHE_ENTRY_LIMIT, u as TranslationCacheSettingsSchema } from "./document-translation-Dnl1lz2K.mjs";
8
+ import { _ as customHashFromSoundId, a as CustomSoundHashSchema, b as soundIdFromCustomHash, c as CustomSoundMetadataSchema, f as LEGACY_SOUND_ID_MAP, g as SoundVolumeSchema, h as SoundIdSchema, i as CUSTOM_SOUND_ADD_VALUE, l as DEFAULT_BELL_SOUND_ID, m as SoundConfigIdSchema, n as BUILTIN_SOUND_OPTIONS, o as CustomSoundIdSchema, p as SILENT_SOUND_ID, r as BuiltinSoundIdSchema, s as CustomSoundMetadataFileSchema, t as BUILTIN_SOUND_IDS, u as DEFAULT_NOTIFICATION_SOUND_ID, v as getBuiltinSoundUrl, y as normalizeLegacySoundId } from "./sounds-50cYk5b0.mjs";
9
+ import { n as terminalNotificationEventToPublishInput, t as TerminalControlParser } from "./terminal-control-CYZhk7FM.mjs";
10
+ import { a as NotificationPublishInputSchema, c as NotificationSoundSchema, h as groupNotifications, i as NotificationGroupKeySchema, l as NotificationSourceSchema, m as getNotificationGroupLabel, n as NOTIFICATION_SOUND_VALUES, o as NotificationRecordSchema, p as getNotificationGroupKey, r as NotificationActionSchema, s as NotificationSettingsSchema, t as NOTIFICATION_SOUND_OPTIONS, u as TerminalNotificationParser } from "./notifications-Xs9VPFWD.mjs";
11
+ import { n as TERMINAL_BELL_SOUND_VALUES, r as TerminalBellSoundSchema, t as TERMINAL_BELL_SOUND_OPTIONS } from "./terminal-audio-CUs0sqEO.mjs";
12
+ import { a as TERMINAL_THEME_VALUES, i as TERMINAL_THEME_MODE_VALUES, n as DEFAULT_TERMINAL_LIGHT_THEME, r as DEFAULT_TERMINAL_THEME_MODE, t as DEFAULT_TERMINAL_DARK_THEME } from "./terminal-theme-BquTqZIO.mjs";
13
+ import { i as selectLocalDownloadGroup, n as buildLocalDownloadPlanFromRepositoryFiles, r as buildLocalDownloadPlanFromRuntimeProfileFiles, t as LOCAL_MODEL_PROFILE_DEFINITIONS } from "./local-download-profiles-CNDtMG2s.mjs";
14
+ import { n as inferLocalDirectionalModelLanguagePair, t as checkLocalDirectionalModelLanguagePair } from "./translation-language-pair-D6f5u70K.mjs";
15
+ import { a as buildEmbeddedUiLaunchUrl, c as isHostedBackendHealthResponse, d as normalizeHostedAppBaseUrl, f as resolveHostedAppBaseUrl, i as buildBackendHealthPayload, l as isSupportedEmbeddedUiUrl, n as OFFICIAL_APP_BASE_URL, o as buildHostedLaunchUrl, r as OPENSPECUI_RUNTIME_CAPABILITIES, s as isBackendHealthRuntimeMetadata, t as HOSTED_SHELL_PROTOCOL_VERSION, u as normalizeEmbeddedUiUrl } from "./hosted-app-CNZhVLM_.mjs";
16
+ import { n as toOpsxDisplayPath, t as VIRTUAL_PROJECT_DIRNAME } from "./opsx-display-path-Cw-5MTRg.mjs";
17
+ import { a as TerminalInvocationSettingsSchema, c as TerminalSpawnCommandSchema, f as quoteTerminalShellArg, g as resolveTerminalShellDefaults, h as renderTerminalSpawnCommandLine, i as TerminalCommandFieldSchema, n as TERMINAL_COMMAND_FIELD_TYPE_VALUES, o as TerminalShellProfileSchema, p as renderTerminalCommandArgs, r as TERMINAL_SHELL_QUOTE_STYLE_VALUES, s as TerminalShellQuoteStyleSchema, t as BUILTIN_TERMINAL_SPAWN_COMMANDS, u as getTerminalCommandDefaultValues } from "./terminal-invocation-IopdwXKL.mjs";
18
+ import { t as parseOpsxSchemaDetail } from "./opsx-schema-detail-Bu415_NB.mjs";
18
19
  import { mkdir, readFile, rename, writeFile } from "fs/promises";
19
20
  import { dirname, join } from "path";
20
21
  import { AsyncLocalStorage } from "node:async_hooks";
21
22
  import { mkdir as mkdir$1, readFile as readFile$1, readdir, stat, writeFile as writeFile$1 } from "node:fs/promises";
22
- import { dirname as dirname$1, join as join$1, matchesGlob, relative, resolve, sep } from "node:path";
23
+ import { basename, dirname as dirname$1, join as join$1, matchesGlob, relative, resolve, sep } from "node:path";
23
24
  import { existsSync, lstatSync, realpathSync } from "node:fs";
24
25
  import { z } from "zod";
25
26
  import { EventEmitter } from "events";
@@ -28,6 +29,115 @@ import { exec, execFile, spawn } from "child_process";
28
29
  import { promisify } from "util";
29
30
  import { homedir } from "node:os";
30
31
 
32
+ //#region src/file-preview.ts
33
+ const MIME_BY_EXTENSION = new Map([
34
+ [".md", "text/markdown"],
35
+ [".markdown", "text/markdown"],
36
+ [".mdown", "text/markdown"],
37
+ [".mkd", "text/markdown"],
38
+ [".txt", "text/plain"],
39
+ [".log", "text/plain"],
40
+ [".yaml", "application/yaml"],
41
+ [".yml", "application/yaml"],
42
+ [".json", "application/json"],
43
+ [".jsonc", "application/json"],
44
+ [".toml", "application/toml"],
45
+ [".ini", "text/plain"],
46
+ [".cfg", "text/plain"],
47
+ [".conf", "text/plain"],
48
+ [".html", "text/html"],
49
+ [".htm", "text/html"],
50
+ [".svg", "image/svg+xml"],
51
+ [".png", "image/png"],
52
+ [".jpg", "image/jpeg"],
53
+ [".jpeg", "image/jpeg"],
54
+ [".gif", "image/gif"],
55
+ [".webp", "image/webp"],
56
+ [".avif", "image/avif"],
57
+ [".bmp", "image/bmp"],
58
+ [".mp3", "audio/mpeg"],
59
+ [".wav", "audio/wav"],
60
+ [".ogg", "audio/ogg"],
61
+ [".oga", "audio/ogg"],
62
+ [".m4a", "audio/mp4"],
63
+ [".aac", "audio/aac"],
64
+ [".flac", "audio/flac"],
65
+ [".mp4", "video/mp4"],
66
+ [".m4v", "video/mp4"],
67
+ [".webm", "video/webm"],
68
+ [".mov", "video/quicktime"],
69
+ [".mkv", "video/x-matroska"],
70
+ [".ogv", "video/ogg"],
71
+ [".pdf", "application/pdf"],
72
+ [".js", "text/javascript"],
73
+ [".jsx", "text/javascript"],
74
+ [".ts", "text/typescript"],
75
+ [".tsx", "text/typescript"],
76
+ [".css", "text/css"],
77
+ [".sh", "text/plain"],
78
+ [".py", "text/plain"],
79
+ [".rs", "text/plain"],
80
+ [".go", "text/plain"],
81
+ [".java", "text/plain"],
82
+ [".c", "text/plain"],
83
+ [".cc", "text/plain"],
84
+ [".cpp", "text/plain"],
85
+ [".h", "text/plain"],
86
+ [".hpp", "text/plain"]
87
+ ]);
88
+ const TEXT_MIME_PREFIXES = ["text/"];
89
+ const TEXT_MIME_VALUES = new Set([
90
+ "application/json",
91
+ "application/yaml",
92
+ "application/toml",
93
+ "application/xml",
94
+ "image/svg+xml"
95
+ ]);
96
+ const FILE_PREVIEW_KINDS = [
97
+ "markdown",
98
+ "html",
99
+ "image",
100
+ "audio",
101
+ "video",
102
+ "pdf",
103
+ "text",
104
+ "none"
105
+ ];
106
+ function getExtension(path) {
107
+ const normalized = path.replace(/\\/g, "/");
108
+ const name = normalized.split("/").pop() ?? normalized;
109
+ const dotIndex = name.lastIndexOf(".");
110
+ if (dotIndex < 0) return "";
111
+ return name.slice(dotIndex).toLowerCase();
112
+ }
113
+ function inferFileMime(path) {
114
+ return MIME_BY_EXTENSION.get(getExtension(path)) ?? null;
115
+ }
116
+ function inferFilePreviewKind(path, mime) {
117
+ const resolvedMime = mime ?? inferFileMime(path);
118
+ if (!resolvedMime) return "none";
119
+ if (resolvedMime === "text/markdown") return "markdown";
120
+ if (resolvedMime === "text/html") return "html";
121
+ if (resolvedMime.startsWith("image/")) return resolvedMime === "image/svg+xml" ? "text" : "image";
122
+ if (resolvedMime.startsWith("audio/")) return "audio";
123
+ if (resolvedMime.startsWith("video/")) return "video";
124
+ if (resolvedMime === "application/pdf") return "pdf";
125
+ if (isTextLikeMime(resolvedMime)) return "text";
126
+ return "none";
127
+ }
128
+ function isTextLikeMime(mime) {
129
+ if (!mime) return false;
130
+ if (TEXT_MIME_VALUES.has(mime)) return true;
131
+ return TEXT_MIME_PREFIXES.some((prefix) => mime.startsWith(prefix));
132
+ }
133
+ function isTextLikeFile(path, mime) {
134
+ return isTextLikeMime(mime ?? inferFileMime(path));
135
+ }
136
+ function isPreviewableFile(path, mime) {
137
+ return inferFilePreviewKind(path, mime) !== "none";
138
+ }
139
+
140
+ //#endregion
31
141
  //#region src/parser.ts
32
142
  const SCENARIO_STEP_PATTERN = new RegExp(`^\\s*[-*+]\\s+(?:\\*\\*)?(${[
33
143
  "GIVEN",
@@ -455,6 +565,30 @@ var ReactiveContext = class {
455
565
  }
456
566
  };
457
567
 
568
+ //#endregion
569
+ //#region src/reactive-fs/path-realpath.ts
570
+ /**
571
+ * Resolve a filesystem path through the closest existing ancestor.
572
+ *
573
+ * Missing descendants still need the same realpath prefix as watcher events,
574
+ * otherwise symlinked roots such as `/var` -> `/private/var` stop matching
575
+ * once the path is created later.
576
+ */
577
+ function resolveRealPathThroughExistingAncestor(path) {
578
+ const absolutePath = resolve(path);
579
+ const missingSegments = [];
580
+ let currentPath = absolutePath;
581
+ while (true) try {
582
+ const realPath = realpathSync(currentPath);
583
+ return missingSegments.length === 0 ? realPath : join$1(realPath, ...missingSegments.reverse());
584
+ } catch {
585
+ const parentPath = dirname$1(currentPath);
586
+ if (parentPath === currentPath) return absolutePath;
587
+ missingSegments.push(basename(currentPath));
588
+ currentPath = parentPath;
589
+ }
590
+ }
591
+
458
592
  //#endregion
459
593
  //#region src/reactive-fs/project-watcher.ts
460
594
  /**
@@ -462,11 +596,7 @@ var ReactiveContext = class {
462
596
  * 在 macOS 上,/var 是 /private/var 的符号链接
463
597
  */
464
598
  function getRealPath$1(path) {
465
- try {
466
- return realpathSync(resolve(path));
467
- } catch {
468
- return resolve(path);
469
- }
599
+ return resolveRealPathThroughExistingAncestor(path);
470
600
  }
471
601
  /** 默认防抖时间 (ms) */
472
602
  const DEBOUNCE_MS$1 = 50;
@@ -894,11 +1024,7 @@ async function closeAllProjectWatchers() {
894
1024
  * 获取路径的真实路径(解析符号链接)
895
1025
  */
896
1026
  function getRealPath(path) {
897
- try {
898
- return realpathSync(resolve(path));
899
- } catch {
900
- return resolve(path);
901
- }
1027
+ return resolveRealPathThroughExistingAncestor(path);
902
1028
  }
903
1029
  /**
904
1030
  * 全局 ProjectWatcher 实例
@@ -1082,6 +1208,24 @@ function subscribeWatcherRuntimeStatus(listener, options = {}) {
1082
1208
  const stateCache$1 = /* @__PURE__ */ new Map();
1083
1209
  /** 监听器释放函数缓存 */
1084
1210
  const releaseCache$1 = /* @__PURE__ */ new Map();
1211
+ /** 缺失路径重校验定时器缓存 */
1212
+ const missingPathPollCache = /* @__PURE__ */ new Map();
1213
+ /** Native watcher can miss a create event on some CI filesystems; missing paths get a low-frequency fallback. */
1214
+ const MISSING_PATH_POLL_MS = 1e3;
1215
+ function stopMissingPathPoll(key) {
1216
+ const timer = missingPathPollCache.get(key);
1217
+ if (!timer) return;
1218
+ clearInterval(timer);
1219
+ missingPathPollCache.delete(key);
1220
+ }
1221
+ function ensureMissingPathPoll(key, poll) {
1222
+ if (!isWatcherPoolInitialized() || missingPathPollCache.has(key)) return;
1223
+ const timer = setInterval(() => {
1224
+ poll();
1225
+ }, MISSING_PATH_POLL_MS);
1226
+ timer.unref?.();
1227
+ missingPathPollCache.set(key, timer);
1228
+ }
1085
1229
  /**
1086
1230
  * 响应式读取文件内容
1087
1231
  *
@@ -1106,12 +1250,18 @@ async function reactiveReadFile(filepath) {
1106
1250
  };
1107
1251
  let state = stateCache$1.get(key);
1108
1252
  if (!state) {
1109
- state = new ReactiveState(await getValue());
1253
+ const initialValue = await getValue();
1254
+ state = new ReactiveState(initialValue);
1110
1255
  stateCache$1.set(key, state);
1111
- const release = acquireWatcher(dirname$1(normalizedPath), async () => {
1256
+ const refresh = async () => {
1112
1257
  const newValue = await getValue();
1113
1258
  state.set(newValue);
1114
- }, { onError: () => {
1259
+ if (newValue === null) ensureMissingPathPoll(key, refresh);
1260
+ else stopMissingPathPoll(key);
1261
+ };
1262
+ if (initialValue === null) ensureMissingPathPoll(key, refresh);
1263
+ const release = acquireWatcher(dirname$1(normalizedPath), refresh, { onError: () => {
1264
+ stopMissingPathPoll(key);
1115
1265
  stateCache$1.delete(key);
1116
1266
  releaseCache$1.delete(key);
1117
1267
  } });
@@ -1194,12 +1344,18 @@ async function reactiveExists(path) {
1194
1344
  };
1195
1345
  let state = stateCache$1.get(key);
1196
1346
  if (!state) {
1197
- state = new ReactiveState(await getValue());
1347
+ const initialValue = await getValue();
1348
+ state = new ReactiveState(initialValue);
1198
1349
  stateCache$1.set(key, state);
1199
- const release = acquireWatcher(dirname$1(normalizedPath), async () => {
1350
+ const refresh = async () => {
1200
1351
  const newValue = await getValue();
1201
1352
  state.set(newValue);
1202
- }, { onError: () => {
1353
+ if (newValue) stopMissingPathPoll(key);
1354
+ else ensureMissingPathPoll(key, refresh);
1355
+ };
1356
+ if (!initialValue) ensureMissingPathPoll(key, refresh);
1357
+ const release = acquireWatcher(dirname$1(normalizedPath), refresh, { onError: () => {
1358
+ stopMissingPathPoll(key);
1203
1359
  stateCache$1.delete(key);
1204
1360
  releaseCache$1.delete(key);
1205
1361
  } });
@@ -1231,16 +1387,22 @@ async function reactiveStat(path) {
1231
1387
  };
1232
1388
  let state = stateCache$1.get(key);
1233
1389
  if (!state) {
1234
- state = new ReactiveState(await getValue(), { equals: (a, b) => {
1390
+ const initialValue = await getValue();
1391
+ state = new ReactiveState(initialValue, { equals: (a, b) => {
1235
1392
  if (a === null && b === null) return true;
1236
1393
  if (a === null || b === null) return false;
1237
1394
  return a.isDirectory === b.isDirectory && a.isFile === b.isFile && a.mtime === b.mtime && a.birthtime === b.birthtime;
1238
1395
  } });
1239
1396
  stateCache$1.set(key, state);
1240
- const release = acquireWatcher(dirname$1(normalizedPath), async () => {
1397
+ const refresh = async () => {
1241
1398
  const newValue = await getValue();
1242
1399
  state.set(newValue);
1243
- }, { onError: () => {
1400
+ if (newValue === null) ensureMissingPathPoll(key, refresh);
1401
+ else stopMissingPathPoll(key);
1402
+ };
1403
+ if (initialValue === null) ensureMissingPathPoll(key, refresh);
1404
+ const release = acquireWatcher(dirname$1(normalizedPath), refresh, { onError: () => {
1405
+ stopMissingPathPoll(key);
1244
1406
  stateCache$1.delete(key);
1245
1407
  releaseCache$1.delete(key);
1246
1408
  } });
@@ -1256,12 +1418,15 @@ function clearCache(path) {
1256
1418
  const normalizedPath = resolve(path);
1257
1419
  for (const [key, release] of releaseCache$1) if (key.includes(normalizedPath)) {
1258
1420
  release();
1421
+ stopMissingPathPoll(key);
1259
1422
  releaseCache$1.delete(key);
1260
1423
  stateCache$1.delete(key);
1261
1424
  }
1262
1425
  } else {
1263
1426
  for (const release of releaseCache$1.values()) release();
1264
1427
  releaseCache$1.clear();
1428
+ for (const timer of missingPathPollCache.values()) clearInterval(timer);
1429
+ missingPathPollCache.clear();
1265
1430
  stateCache$1.clear();
1266
1431
  }
1267
1432
  }
@@ -1543,12 +1708,20 @@ var OpenSpecAdapter = class {
1543
1708
  });
1544
1709
  files.push(...await this.collectChangeFiles(root, fullPath));
1545
1710
  } else {
1546
- const content = await reactiveReadFile(fullPath);
1711
+ const mime = inferFileMime(relativePath) ?? void 0;
1712
+ const previewKind = inferFilePreviewKind(relativePath, mime);
1713
+ const content = isTextLikeFile(relativePath, mime) ? await reactiveReadFile(fullPath) : null;
1547
1714
  files.push({
1548
1715
  path: relativePath,
1549
1716
  type: "file",
1550
1717
  content: content ?? void 0
1551
1718
  });
1719
+ files[files.length - 1] = {
1720
+ ...files[files.length - 1],
1721
+ mime,
1722
+ previewKind,
1723
+ size: void 0
1724
+ };
1552
1725
  }
1553
1726
  }
1554
1727
  return files;
@@ -1762,7 +1935,9 @@ const ChangeFileSchema = z.object({
1762
1935
  path: z.string(),
1763
1936
  type: z.enum(["file", "directory"]),
1764
1937
  content: z.string().optional(),
1765
- size: z.number().optional()
1938
+ size: z.number().optional(),
1939
+ mime: z.string().optional(),
1940
+ previewKind: z.enum(FILE_PREVIEW_KINDS).optional()
1766
1941
  });
1767
1942
  const ScenarioStepKeywordSchema = z.enum([
1768
1943
  "GIVEN",
@@ -2743,6 +2918,13 @@ function pruneNullish$1(value) {
2743
2918
  function hasOwnEntries$1(value) {
2744
2919
  return Object.keys(value).length > 0;
2745
2920
  }
2921
+ function mergeNullablePatch$1(current, patch) {
2922
+ const next = { ...current };
2923
+ if (!patch) return next;
2924
+ for (const [key, value] of Object.entries(patch)) if (value === null) delete next[key];
2925
+ else if (value !== void 0) next[key] = value;
2926
+ return next;
2927
+ }
2746
2928
  function toPersistedConfig(config, options = {}) {
2747
2929
  const persisted = {};
2748
2930
  const command = config.cli.command?.trim();
@@ -2904,14 +3086,8 @@ var ConfigManager = class {
2904
3086
  ...current.translation,
2905
3087
  ...config.translation,
2906
3088
  engines: {
2907
- local: {
2908
- ...current.translation.engines.local,
2909
- ...config.translation?.engines?.local
2910
- },
2911
- openai: {
2912
- ...current.translation.engines.openai,
2913
- ...config.translation?.engines?.openai
2914
- }
3089
+ local: mergeNullablePatch$1(current.translation.engines.local, config.translation?.engines?.local),
3090
+ openai: mergeNullablePatch$1(current.translation.engines.openai, config.translation?.engines?.openai)
2915
3091
  }
2916
3092
  }
2917
3093
  });
@@ -3081,6 +3257,13 @@ function pruneNullish(value) {
3081
3257
  function hasOwnEntries(value) {
3082
3258
  return Object.keys(value).length > 0;
3083
3259
  }
3260
+ function mergeNullablePatch(current, patch) {
3261
+ const next = { ...current };
3262
+ if (!patch) return next;
3263
+ for (const [key, value] of Object.entries(patch)) if (value === null) delete next[key];
3264
+ else if (value !== void 0) next[key] = value;
3265
+ return next;
3266
+ }
3084
3267
  function toPersistedGlobalSettings(settings) {
3085
3268
  const persisted = {};
3086
3269
  const translationCache = {};
@@ -3147,14 +3330,8 @@ var GlobalSettingsManager = class {
3147
3330
  },
3148
3331
  translationEngines: {
3149
3332
  ...current.translationEngines,
3150
- openai: {
3151
- ...current.translationEngines.openai,
3152
- ...update.translationEngines?.openai
3153
- },
3154
- local: {
3155
- ...current.translationEngines.local,
3156
- ...update.translationEngines?.local
3157
- }
3333
+ openai: mergeNullablePatch(current.translationEngines.openai, update.translationEngines?.openai),
3334
+ local: mergeNullablePatch(current.translationEngines.local, update.translationEngines?.local)
3158
3335
  }
3159
3336
  }));
3160
3337
  if (isPersistedGlobalSettingsEmpty(persisted) && !fileExists) return;
@@ -4229,13 +4406,17 @@ async function readEntriesUnderRoot(root) {
4229
4406
  });
4230
4407
  entries.push(...await collectEntries(fullPath));
4231
4408
  } else {
4232
- const content = await reactiveReadFile(fullPath);
4409
+ const mime = inferFileMime(relativePath) ?? void 0;
4410
+ const previewKind = inferFilePreviewKind(relativePath, mime);
4411
+ const content = isTextLikeFile(relativePath, mime) ? await reactiveReadFile(fullPath) : null;
4233
4412
  const size = content ? Buffer.byteLength(content, "utf-8") : void 0;
4234
4413
  entries.push({
4235
4414
  path: relativePath,
4236
4415
  type: "file",
4237
4416
  content: content ?? void 0,
4238
- size
4417
+ size,
4418
+ mime,
4419
+ previewKind
4239
4420
  });
4240
4421
  }
4241
4422
  }
@@ -4286,7 +4467,7 @@ async function touchDirectoryPathDeps(rootDir, relativePath) {
4286
4467
  let currentPath = rootDir;
4287
4468
  for (const segment of splitRelativePathSegments(relativePath)) {
4288
4469
  currentPath = join$1(currentPath, segment);
4289
- await reactiveExists(currentPath);
4470
+ await reactiveStat(currentPath);
4290
4471
  }
4291
4472
  }
4292
4473
  async function touchDirectoryTree(rootDir) {
@@ -5003,4 +5184,4 @@ const PtyServerMessageSchema = z.discriminatedUnion("type", [
5003
5184
  ]);
5004
5185
 
5005
5186
  //#endregion
5006
- export { AI_TOOLS, ApplyInstructionsContextFilesSchema, ApplyInstructionsSchema, ApplyTaskSchema, ArtifactInstructionsSchema, ArtifactStatusSchema, BUILTIN_SOUND_IDS, BUILTIN_SOUND_OPTIONS, BUILTIN_TERMINAL_SPAWN_COMMANDS, BatchTranslateEventSchema, BatchTranslateInputSchema, BuiltinSoundIdSchema, CODE_EDITOR_THEME_VALUES, CUSTOM_SOUND_ADD_VALUE, ChangeFileSchema, ChangeSchema, ChangeStatusSchema, CliExecutor, CodeEditorThemeSchema, ConfigManager, CustomSoundHashSchema, CustomSoundIdSchema, CustomSoundMetadataFileSchema, CustomSoundMetadataSchema, DASHBOARD_METRIC_KEYS, DEFAULT_BELL_SOUND_ID, DEFAULT_CONFIG, DEFAULT_GIT_DIFF_EAGER_LINE_BUDGET, DEFAULT_GLOBAL_SETTINGS, DEFAULT_NOTIFICATION_SOUND_ID, DEFAULT_TERMINAL_DARK_THEME, DEFAULT_TERMINAL_LIGHT_THEME, DEFAULT_TERMINAL_THEME_MODE, DEFAULT_TRANSLATION_CACHE_ENTRY_LIMIT, DEFAULT_TRANSLATION_ENGINE_ID, DOCUMENT_TRANSLATION_DISPLAY_MODES, DashboardConfigSchema, DeltaOperationType, DeltaSchema, DeltaSpecSchema, DependencyInfoSchema, DocumentTranslationConfigSchema, DocumentTranslationDisplayModeSchema, GitConfigSchema, GlobalSettingsManager, HOSTED_SHELL_PROTOCOL_VERSION, LEGACY_SOUND_ID_MAP, LOCAL_MODEL_PROFILE_DEFINITIONS, LocalModelAssetLogSchema, LocalModelAssetPlanSnapshotSchema, LocalModelAssetStateSchema, LocalModelDownloadStatusSchema, MAX_TRANSLATION_CACHE_ENTRY_LIMIT, MIN_TRANSLATION_CACHE_ENTRY_LIMIT, MarkdownParser, MarkdownReadingPluginRegistry, NOTIFICATION_SOUND_OPTIONS, NOTIFICATION_SOUND_VALUES, NotificationActionSchema, NotificationGroupKeySchema, NotificationPublishInputSchema, NotificationRecordSchema, NotificationSettingsSchema, NotificationSoundSchema, NotificationSourceSchema, OFFICIAL_APP_BASE_URL, OPENSPECUI_HOOKS_VERSION, OPENSPECUI_RUNTIME_CAPABILITIES, OPEN_SPEC_READING_SECTIONS_PROJECTION_ID, OPEN_SPEC_SPEC_PROJECTION_ID, OPSX_AGENT_INVOCATION_MODE_VALUES, OpenSpecAdapter, OpenSpecUIConfigSchema, OpenSpecUIGlobalSettingsSchema, OpenSpecWatcher, OpsxAgentInvocationModeSchema, OpsxConfigSchema, OpsxKernel, ProjectWatcher, PtyAttachMessageSchema, PtyBellResponseSchema, PtyBufferResponseSchema, PtyClientMessageSchema, PtyCloseMessageSchema, PtyCreateMessageSchema, PtyCreatedResponseSchema, PtyErrorCodeSchema, PtyErrorResponseSchema, PtyExitResponseSchema, PtyInputMessageSchema, PtyListMessageSchema, PtyListResponseSchema, PtyOutputResponseSchema, PtyPlatformSchema, PtyProcessTitleResponseSchema, PtyResizeMessageSchema, PtyServerMessageSchema, PtyTitleResponseSchema, ReactiveContext, ReactiveState, RequirementSchema, SERVICE_TRANSLATION_ENGINE_IDS, SILENT_SOUND_ID, ScenarioStepKeywordSchema, ScenarioStepSchema, SchemaArtifactSchema, SchemaDetailSchema, SchemaInfoSchema, SchemaResolutionSchema, ServiceTranslationEngineIdSchema, SoundConfigIdSchema, SoundIdSchema, SpecSchema, TERMINAL_BELL_SOUND_OPTIONS, TERMINAL_BELL_SOUND_VALUES, TERMINAL_COMMAND_FIELD_TYPE_VALUES, TERMINAL_SHELL_QUOTE_STYLE_VALUES, TERMINAL_THEME_MODE_VALUES, TERMINAL_THEME_VALUES, TOOL_WORKFLOW_TO_SKILL_DIR, TRANSLATION_CACHE_POLICY_VERSION, TRANSLATION_ENGINE_IDS, TRANSLATION_ENGINE_MANIFESTS, TRANSLATOR_CONTRACT_VERSION, TaskSchema, TemplatesSchema, TerminalBellSoundSchema, TerminalCommandFieldSchema, TerminalConfigSchema, TerminalControlParser, TerminalInvocationSettingsSchema, TerminalNotificationParser, TerminalRendererEngineSchema, TerminalShellProfileSchema, TerminalShellQuoteStyleSchema, TerminalSpawnCommandSchema, TerminalThemeModeSchema, TerminalThemeSchema, TranslationCacheEntrySchema, TranslationCacheReadInputSchema, TranslationCacheSettingsSchema, TranslationCacheStatsSchema, TranslationCacheWriteInputSchema, TranslationDownloadFilePlanSchema, TranslationDownloadGroupPlanSchema, TranslationEngineGlobalSettingsSchema, TranslationEngineIdSchema, TranslationEngineProjectSettingsSchema, TranslationLocalSettingsSchema, TranslationOpenAISettingsSchema, VIRTUAL_PROJECT_DIRNAME, Validator, acquireWatcher, annotateOpenSpecFacts, annotateOpenSpecMarkdown, buildBackendHealthPayload, buildCliRunnerCandidates, buildEmbeddedUiLaunchUrl, buildHostedLaunchUrl, buildLocalDownloadPlanFromRepositoryFiles, buildLocalDownloadPlanFromRuntimeProfileFiles, buildMarkdownParentMap, buildOpsxEntityDetail, builtinOpenSpecReadingPlugin, clearCache, closeAllProjectWatchers, closeAllWatchers, contextStorage, createCleanCliEnv, createFileChangeObservable, createMarkdownReadingDocument, createMarkdownReadingDocumentFromFacts, createOpenSpecReadingPlugin, customHashFromSoundId, getActiveWatcherCount, getAllToolIds, getAllTools, getAvailableToolIds, getAvailableTools, getBuiltinSoundUrl, getCacheSize, getConfiguredTools, getDefaultCliCommand, getDefaultCliCommandString, getDefaultGlobalSettingsPath, getDetectedProjectTools, getMarkdownAnnotation, getMarkdownAnnotationsForFact, getMarkdownFactSpan, getMarkdownHeadingEnd, getMarkdownHeadingFacts, getNotificationGroupKey, getNotificationGroupLabel, getOpenSpecAnnotation, getOpenSpecAnnotationsForFact, getOpenSpecProjectionAnnotation, getOpenSpecReadingSections, getOpsxEntityMetadataPath, getOpsxEntityRootRelativePath, getProjectWatcher, getTerminalCommandDefaultValues, getToolById, getToolInitStates, getTranslationEngineManifest, getWatchedProjectDir, getWatcherRuntimeStatus, groupNotifications, initWatcherPool, isBackendHealthRuntimeMetadata, isGlobPattern, isHostedBackendHealthResponse, isOpsxGlobPattern, isSupportedEmbeddedUiUrl, isTerminalRendererEngine, isToolConfigured, isWatcherPoolInitialized, normalizeEmbeddedUiUrl, normalizeHostedAppBaseUrl, normalizeLegacySoundId, normalizeOpsxEntityPath, openSpecAnnotationRules, opsxGlobToRegex, opsxPathMatchesPattern, parseCliCommand, parseMarkdownFacts, parseOpenSpecMarkdownToSpec, parseOpsxEntityMetadata, parseOpsxSchemaDetail, projectAnnotatedOpenSpecToSpec, projectOpenSpecMarkdown, quoteTerminalShellArg, reactiveExists, reactiveReadDir, reactiveReadFile, reactiveStat, renderTerminalCommandArgs, renderTerminalSpawnCommandLine, resolveHostedAppBaseUrl, resolveTerminalShellDefaults, selectLocalDownloadGroup, sniffGlobalCli, sortMarkdownReadingPlugins, soundIdFromCustomHash, subscribeWatcherRuntimeStatus, terminalNotificationEventToPublishInput, toMarkdownFactKind, toOpsxDisplayPath, toPersistedGlobalSettings, trimMarkdownSlice };
5187
+ export { AI_TOOLS, ApplyInstructionsContextFilesSchema, ApplyInstructionsSchema, ApplyTaskSchema, ArtifactInstructionsSchema, ArtifactStatusSchema, BUILTIN_SOUND_IDS, BUILTIN_SOUND_OPTIONS, BUILTIN_TERMINAL_SPAWN_COMMANDS, BatchTranslateEventSchema, BatchTranslateInputSchema, BuiltinSoundIdSchema, CODE_EDITOR_THEME_VALUES, CUSTOM_SOUND_ADD_VALUE, ChangeFileSchema, ChangeSchema, ChangeStatusSchema, CliExecutor, CodeEditorThemeSchema, ConfigManager, CustomSoundHashSchema, CustomSoundIdSchema, CustomSoundMetadataFileSchema, CustomSoundMetadataSchema, DASHBOARD_METRIC_KEYS, DEFAULT_BELL_SOUND_ID, DEFAULT_CONFIG, DEFAULT_GIT_DIFF_EAGER_LINE_BUDGET, DEFAULT_GLOBAL_SETTINGS, DEFAULT_NOTIFICATION_SOUND_ID, DEFAULT_TERMINAL_DARK_THEME, DEFAULT_TERMINAL_LIGHT_THEME, DEFAULT_TERMINAL_THEME_MODE, DEFAULT_TRANSLATION_CACHE_ENTRY_LIMIT, DEFAULT_TRANSLATION_ENGINE_ID, DOCUMENT_TRANSLATION_DISPLAY_MODES, DashboardConfigSchema, DeltaOperationType, DeltaSchema, DeltaSpecSchema, DependencyInfoSchema, DocumentTranslationConfigSchema, DocumentTranslationDisplayModeSchema, FILE_PREVIEW_KINDS, GitConfigSchema, GlobalSettingsManager, HOSTED_SHELL_PROTOCOL_VERSION, LEGACY_SOUND_ID_MAP, LOCAL_MODEL_PROFILE_DEFINITIONS, LocalModelAssetLogSchema, LocalModelAssetPlanSnapshotSchema, LocalModelAssetStateSchema, LocalModelDownloadStatusSchema, LocalModelLifecycleFileStateSchema, LocalModelLifecycleGroupStateSchema, LocalModelProfileLoadStateSchema, LocalModelProfileManifestFileSchema, LocalModelProfileManifestGroupSchema, LocalModelProfileManifestSchema, LocalModelProfileStatusSchema, MAX_TRANSLATION_CACHE_ENTRY_LIMIT, MIN_TRANSLATION_CACHE_ENTRY_LIMIT, MarkdownParser, MarkdownReadingPluginRegistry, NOTIFICATION_SOUND_OPTIONS, NOTIFICATION_SOUND_VALUES, NotificationActionSchema, NotificationGroupKeySchema, NotificationPublishInputSchema, NotificationRecordSchema, NotificationSettingsSchema, NotificationSoundSchema, NotificationSourceSchema, OFFICIAL_APP_BASE_URL, OPENSPECUI_HOOKS_VERSION, OPENSPECUI_RUNTIME_CAPABILITIES, OPEN_SPEC_READING_SECTIONS_PROJECTION_ID, OPEN_SPEC_SPEC_PROJECTION_ID, OPSX_AGENT_INVOCATION_MODE_VALUES, OpenSpecAdapter, OpenSpecUIConfigSchema, OpenSpecUIGlobalSettingsSchema, OpenSpecWatcher, OpsxAgentInvocationModeSchema, OpsxConfigSchema, OpsxKernel, ProjectWatcher, PtyAttachMessageSchema, PtyBellResponseSchema, PtyBufferResponseSchema, PtyClientMessageSchema, PtyCloseMessageSchema, PtyCreateMessageSchema, PtyCreatedResponseSchema, PtyErrorCodeSchema, PtyErrorResponseSchema, PtyExitResponseSchema, PtyInputMessageSchema, PtyListMessageSchema, PtyListResponseSchema, PtyOutputResponseSchema, PtyPlatformSchema, PtyProcessTitleResponseSchema, PtyResizeMessageSchema, PtyServerMessageSchema, PtyTitleResponseSchema, ReactiveContext, ReactiveState, RequirementSchema, SERVICE_TRANSLATION_ENGINE_IDS, SILENT_SOUND_ID, ScenarioStepKeywordSchema, ScenarioStepSchema, SchemaArtifactSchema, SchemaDetailSchema, SchemaInfoSchema, SchemaResolutionSchema, ServiceTranslationEngineIdSchema, SoundConfigIdSchema, SoundIdSchema, SpecSchema, TERMINAL_BELL_SOUND_OPTIONS, TERMINAL_BELL_SOUND_VALUES, TERMINAL_COMMAND_FIELD_TYPE_VALUES, TERMINAL_SHELL_QUOTE_STYLE_VALUES, TERMINAL_THEME_MODE_VALUES, TERMINAL_THEME_VALUES, TOOL_WORKFLOW_TO_SKILL_DIR, TRANSLATION_CACHE_POLICY_VERSION, TRANSLATION_ENGINE_IDS, TRANSLATION_ENGINE_MANIFESTS, TRANSLATOR_CONTRACT_VERSION, TaskSchema, TemplatesSchema, TerminalBellSoundSchema, TerminalCommandFieldSchema, TerminalConfigSchema, TerminalControlParser, TerminalInvocationSettingsSchema, TerminalNotificationParser, TerminalRendererEngineSchema, TerminalShellProfileSchema, TerminalShellQuoteStyleSchema, TerminalSpawnCommandSchema, TerminalThemeModeSchema, TerminalThemeSchema, TranslationCacheEntrySchema, TranslationCacheReadInputSchema, TranslationCacheSettingsSchema, TranslationCacheStatsSchema, TranslationCacheWriteInputSchema, TranslationDownloadFilePlanSchema, TranslationDownloadGroupPlanSchema, TranslationEngineGlobalSettingsSchema, TranslationEngineIdSchema, TranslationEngineProjectSettingsSchema, TranslationLocalSettingsSchema, TranslationOpenAISettingsSchema, VIRTUAL_PROJECT_DIRNAME, Validator, acquireWatcher, annotateOpenSpecFacts, annotateOpenSpecMarkdown, buildBackendHealthPayload, buildCliRunnerCandidates, buildEmbeddedUiLaunchUrl, buildHostedLaunchUrl, buildLocalDownloadPlanFromRepositoryFiles, buildLocalDownloadPlanFromRuntimeProfileFiles, buildMarkdownParentMap, buildOpsxEntityDetail, builtinOpenSpecReadingPlugin, checkLocalDirectionalModelLanguagePair, clearCache, closeAllProjectWatchers, closeAllWatchers, contextStorage, createCleanCliEnv, createFileChangeObservable, createMarkdownReadingDocument, createMarkdownReadingDocumentFromFacts, createOpenSpecReadingPlugin, customHashFromSoundId, getActiveWatcherCount, getAllToolIds, getAllTools, getAvailableToolIds, getAvailableTools, getBuiltinSoundUrl, getCacheSize, getConfiguredTools, getDefaultCliCommand, getDefaultCliCommandString, getDefaultGlobalSettingsPath, getDetectedProjectTools, getMarkdownAnnotation, getMarkdownAnnotationsForFact, getMarkdownFactSpan, getMarkdownHeadingEnd, getMarkdownHeadingFacts, getNotificationGroupKey, getNotificationGroupLabel, getOpenSpecAnnotation, getOpenSpecAnnotationsForFact, getOpenSpecProjectionAnnotation, getOpenSpecReadingSections, getOpsxEntityMetadataPath, getOpsxEntityRootRelativePath, getProjectWatcher, getTerminalCommandDefaultValues, getToolById, getToolInitStates, getTranslationEngineManifest, getWatchedProjectDir, getWatcherRuntimeStatus, groupNotifications, inferFileMime, inferFilePreviewKind, inferLocalDirectionalModelLanguagePair, initWatcherPool, isBackendHealthRuntimeMetadata, isGlobPattern, isHostedBackendHealthResponse, isOpsxGlobPattern, isPreviewableFile, isSupportedEmbeddedUiUrl, isTerminalRendererEngine, isTextLikeFile, isTextLikeMime, isToolConfigured, isWatcherPoolInitialized, normalizeEmbeddedUiUrl, normalizeHostedAppBaseUrl, normalizeLegacySoundId, normalizeOpsxEntityPath, openSpecAnnotationRules, opsxGlobToRegex, opsxPathMatchesPattern, parseCliCommand, parseMarkdownFacts, parseOpenSpecMarkdownToSpec, parseOpsxEntityMetadata, parseOpsxSchemaDetail, projectAnnotatedOpenSpecToSpec, projectOpenSpecMarkdown, quoteTerminalShellArg, reactiveExists, reactiveReadDir, reactiveReadFile, reactiveStat, renderTerminalCommandArgs, renderTerminalSpawnCommandLine, resolveHostedAppBaseUrl, resolveTerminalShellDefaults, selectLocalDownloadGroup, sniffGlobalCli, sortMarkdownReadingPlugins, soundIdFromCustomHash, subscribeWatcherRuntimeStatus, terminalNotificationEventToPublishInput, toMarkdownFactKind, toOpsxDisplayPath, toPersistedGlobalSettings, trimMarkdownSlice };
@@ -149,7 +149,7 @@ function buildLocalDownloadPlanFromRuntimeProfileFiles(input) {
149
149
  }
150
150
  function selectLocalDownloadGroup(plan, selectedGroupId) {
151
151
  if (!plan?.groups?.length) return null;
152
- return (selectedGroupId ? plan.groups.find((group) => group.id === selectedGroupId && group.selectable) : void 0) ?? plan.groups.find((group) => group.selected) ?? selectSmallestSelectableGroup(plan.groups);
152
+ return (selectedGroupId ? plan.groups.find((group) => group.selectable && (group.id === selectedGroupId || group.baseGroupId === selectedGroupId)) : void 0) ?? plan.groups.find((group) => group.selected) ?? selectSmallestSelectableGroup(plan.groups);
153
153
  }
154
154
  function buildPlanFromGroups(input) {
155
155
  if (input.groups.length === 0) return null;
@@ -170,7 +170,7 @@ function buildPlanFromGroups(input) {
170
170
  }
171
171
  function selectRequestedGroup(groups, selectedGroupId) {
172
172
  if (!selectedGroupId) return null;
173
- return groups.find((group) => group.id === selectedGroupId && group.selectable) ?? null;
173
+ return groups.find((group) => group.selectable && (group.id === selectedGroupId || group.baseGroupId === selectedGroupId)) ?? null;
174
174
  }
175
175
  function selectSmallestSelectableGroup(groups) {
176
176
  return groups.filter((group) => group.selectable && group.estimatedTotalBytes !== void 0).sort((left, right) => (left.estimatedTotalBytes ?? 0) - (right.estimatedTotalBytes ?? 0))[0] ?? null;
@@ -179,7 +179,11 @@ function createDownloadGroup(input) {
179
179
  const files = dedupeFiles(input.files).map((file) => ({
180
180
  path: file.path,
181
181
  sizeBytes: file.sizeBytes,
182
- required: true
182
+ required: true,
183
+ etag: file.etag,
184
+ revision: file.revision,
185
+ sourceUrl: file.sourceUrl,
186
+ raw: file.raw
183
187
  }));
184
188
  const estimatedTotalBytes = files.reduce((total, file) => total + (file.sizeBytes ?? 0), 0);
185
189
  const hasConcreteSizes = files.length > 0 && files.every((file) => file.sizeBytes !== void 0);
@@ -1,4 +1,4 @@
1
- import { D as TranslationDownloadGroupPlan, z as TranslationModelDownloadPlan } from "./translator-C3W7bTIN.mjs";
1
+ import { $ as TranslationModelDownloadPlan, V as TranslationDownloadGroupPlan } from "./translator-tTXEGRdz.mjs";
2
2
 
3
3
  //#region src/local-download-profiles.d.ts
4
4
  declare const LOCAL_MODEL_PROFILE_DEFINITIONS: readonly [{
@@ -78,6 +78,10 @@ type LocalModelProfileId = (typeof LOCAL_MODEL_PROFILE_DEFINITIONS)[number]['id'
78
78
  interface LocalRepositoryFile {
79
79
  path: string;
80
80
  sizeBytes?: number;
81
+ etag?: string;
82
+ revision?: string;
83
+ sourceUrl?: string;
84
+ raw?: unknown;
81
85
  }
82
86
  interface LocalRuntimeProfileFiles {
83
87
  profile: LocalModelProfileId;
@@ -1,3 +1,3 @@
1
- import "./translator-C3W7bTIN.mjs";
2
- import { a as buildLocalDownloadPlanFromRepositoryFiles, i as LocalRuntimeProfileFiles, n as LocalModelProfileId, o as buildLocalDownloadPlanFromRuntimeProfileFiles, r as LocalRepositoryFile, s as selectLocalDownloadGroup, t as LOCAL_MODEL_PROFILE_DEFINITIONS } from "./local-download-profiles-Qu1932tV.mjs";
1
+ import "./translator-tTXEGRdz.mjs";
2
+ import { a as buildLocalDownloadPlanFromRepositoryFiles, i as LocalRuntimeProfileFiles, n as LocalModelProfileId, o as buildLocalDownloadPlanFromRuntimeProfileFiles, r as LocalRepositoryFile, s as selectLocalDownloadGroup, t as LOCAL_MODEL_PROFILE_DEFINITIONS } from "./local-download-profiles-DISrU0mw.mjs";
3
3
  export { LOCAL_MODEL_PROFILE_DEFINITIONS, LocalModelProfileId, LocalRepositoryFile, LocalRuntimeProfileFiles, buildLocalDownloadPlanFromRepositoryFiles, buildLocalDownloadPlanFromRuntimeProfileFiles, selectLocalDownloadGroup };
@@ -1,3 +1,3 @@
1
- import { i as selectLocalDownloadGroup, n as buildLocalDownloadPlanFromRepositoryFiles, r as buildLocalDownloadPlanFromRuntimeProfileFiles, t as LOCAL_MODEL_PROFILE_DEFINITIONS } from "./local-download-profiles-BppI_PAq.mjs";
1
+ import { i as selectLocalDownloadGroup, n as buildLocalDownloadPlanFromRepositoryFiles, r as buildLocalDownloadPlanFromRuntimeProfileFiles, t as LOCAL_MODEL_PROFILE_DEFINITIONS } from "./local-download-profiles-CNDtMG2s.mjs";
2
2
 
3
3
  export { LOCAL_MODEL_PROFILE_DEFINITIONS, buildLocalDownloadPlanFromRepositoryFiles, buildLocalDownloadPlanFromRuntimeProfileFiles, selectLocalDownloadGroup };
@@ -1,2 +1,2 @@
1
- import { a as MarkdownSourceRange, i as MarkdownSourcePoint, n as MarkdownFactKind, o as parseMarkdownFacts, r as MarkdownFactsDocument, s as toMarkdownFactKind, t as MarkdownFact } from "./markdown-facts-DUsbNcjh.mjs";
1
+ import { a as MarkdownSourceRange, i as MarkdownSourcePoint, n as MarkdownFactKind, o as parseMarkdownFacts, r as MarkdownFactsDocument, s as toMarkdownFactKind, t as MarkdownFact } from "./markdown-facts-DempqdIX.mjs";
2
2
  export { MarkdownFact, MarkdownFactKind, MarkdownFactsDocument, MarkdownSourcePoint, MarkdownSourceRange, parseMarkdownFacts, toMarkdownFactKind };
@@ -1,3 +1,3 @@
1
- import { n as toMarkdownFactKind, t as parseMarkdownFacts } from "./markdown-facts-B5RvYPKF.mjs";
1
+ import { n as toMarkdownFactKind, t as parseMarkdownFacts } from "./markdown-facts-DbE1F2LD.mjs";
2
2
 
3
3
  export { parseMarkdownFacts, toMarkdownFactKind };
@@ -1,4 +1,4 @@
1
- import { r as MarkdownFactsDocument, t as MarkdownFact } from "./markdown-facts-DUsbNcjh.mjs";
1
+ import { r as MarkdownFactsDocument, t as MarkdownFact } from "./markdown-facts-DempqdIX.mjs";
2
2
 
3
3
  //#region src/markdown-reading.d.ts
4
4
  type MarkdownAnnotationConfidence = 'strong' | 'weak';
@@ -1,4 +1,4 @@
1
- import { t as parseMarkdownFacts } from "./markdown-facts-B5RvYPKF.mjs";
1
+ import { t as parseMarkdownFacts } from "./markdown-facts-DbE1F2LD.mjs";
2
2
 
3
3
  //#region src/markdown-reading.ts
4
4
  var MarkdownReadingPluginRegistry = class {
@@ -1,3 +1,3 @@
1
- import "./markdown-facts-DUsbNcjh.mjs";
2
- import { S as trimMarkdownSlice, _ as getMarkdownAnnotationsForFact, a as MarkdownAnnotationRule, b as getMarkdownHeadingFacts, c as MarkdownProjectionRule, d as MarkdownReadingPlugin, f as MarkdownReadingPluginRegistry, g as getMarkdownAnnotation, h as createMarkdownReadingDocumentFromFacts, i as MarkdownAnnotationInput, l as MarkdownReadingDocument, m as createMarkdownReadingDocument, n as MarkdownAnnotationConfidence, o as MarkdownFactSpan, p as buildMarkdownParentMap, r as MarkdownAnnotationContext, s as MarkdownProjectionContext, t as MarkdownAnnotation, u as MarkdownReadingLookup, v as getMarkdownFactSpan, x as sortMarkdownReadingPlugins, y as getMarkdownHeadingEnd } from "./markdown-reading-DvLPaaY1.mjs";
1
+ import "./markdown-facts-DempqdIX.mjs";
2
+ import { S as trimMarkdownSlice, _ as getMarkdownAnnotationsForFact, a as MarkdownAnnotationRule, b as getMarkdownHeadingFacts, c as MarkdownProjectionRule, d as MarkdownReadingPlugin, f as MarkdownReadingPluginRegistry, g as getMarkdownAnnotation, h as createMarkdownReadingDocumentFromFacts, i as MarkdownAnnotationInput, l as MarkdownReadingDocument, m as createMarkdownReadingDocument, n as MarkdownAnnotationConfidence, o as MarkdownFactSpan, p as buildMarkdownParentMap, r as MarkdownAnnotationContext, s as MarkdownProjectionContext, t as MarkdownAnnotation, u as MarkdownReadingLookup, v as getMarkdownFactSpan, x as sortMarkdownReadingPlugins, y as getMarkdownHeadingEnd } from "./markdown-reading-BaHZTf5f.mjs";
3
3
  export { MarkdownAnnotation, MarkdownAnnotationConfidence, MarkdownAnnotationContext, MarkdownAnnotationInput, MarkdownAnnotationRule, MarkdownFactSpan, MarkdownProjectionContext, MarkdownProjectionRule, MarkdownReadingDocument, MarkdownReadingLookup, MarkdownReadingPlugin, MarkdownReadingPluginRegistry, buildMarkdownParentMap, createMarkdownReadingDocument, createMarkdownReadingDocumentFromFacts, getMarkdownAnnotation, getMarkdownAnnotationsForFact, getMarkdownFactSpan, getMarkdownHeadingEnd, getMarkdownHeadingFacts, sortMarkdownReadingPlugins, trimMarkdownSlice };
@@ -1,4 +1,4 @@
1
- import "./markdown-facts-B5RvYPKF.mjs";
2
- import { a as getMarkdownAnnotation, c as getMarkdownHeadingEnd, d as trimMarkdownSlice, i as createMarkdownReadingDocumentFromFacts, l as getMarkdownHeadingFacts, n as buildMarkdownParentMap, o as getMarkdownAnnotationsForFact, r as createMarkdownReadingDocument, s as getMarkdownFactSpan, t as MarkdownReadingPluginRegistry, u as sortMarkdownReadingPlugins } from "./markdown-reading-DYBp7qoI.mjs";
1
+ import "./markdown-facts-DbE1F2LD.mjs";
2
+ import { a as getMarkdownAnnotation, c as getMarkdownHeadingEnd, d as trimMarkdownSlice, i as createMarkdownReadingDocumentFromFacts, l as getMarkdownHeadingFacts, n as buildMarkdownParentMap, o as getMarkdownAnnotationsForFact, r as createMarkdownReadingDocument, s as getMarkdownFactSpan, t as MarkdownReadingPluginRegistry, u as sortMarkdownReadingPlugins } from "./markdown-reading-DSlcirYV.mjs";
3
3
 
4
4
  export { MarkdownReadingPluginRegistry, buildMarkdownParentMap, createMarkdownReadingDocument, createMarkdownReadingDocumentFromFacts, getMarkdownAnnotation, getMarkdownAnnotationsForFact, getMarkdownFactSpan, getMarkdownHeadingEnd, getMarkdownHeadingFacts, sortMarkdownReadingPlugins, trimMarkdownSlice };
@@ -1,5 +1,5 @@
1
- import { g as SoundVolumeSchema, m as SoundConfigIdSchema, u as DEFAULT_NOTIFICATION_SOUND_ID } from "./sounds-CB_gpY-y.mjs";
2
- import { t as TerminalControlParser } from "./terminal-control-CNcEd9Rl.mjs";
1
+ import { g as SoundVolumeSchema, m as SoundConfigIdSchema, u as DEFAULT_NOTIFICATION_SOUND_ID } from "./sounds-50cYk5b0.mjs";
2
+ import { t as TerminalControlParser } from "./terminal-control-CYZhk7FM.mjs";
3
3
  import { z } from "zod";
4
4
 
5
5
  //#region src/notifications.ts