cc-viewer 1.7.23 → 1.8.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 (262) hide show
  1. package/README.md +20 -0
  2. package/cli.js +92 -11
  3. package/concepts/ar/GlobalSettings.md +2 -2
  4. package/concepts/ar/ToolsFirst.md +1 -1
  5. package/concepts/da/GlobalSettings.md +2 -2
  6. package/concepts/da/ToolsFirst.md +1 -1
  7. package/concepts/de/GlobalSettings.md +2 -2
  8. package/concepts/de/ToolsFirst.md +1 -1
  9. package/concepts/en/GlobalSettings.md +2 -2
  10. package/concepts/en/ToolsFirst.md +1 -1
  11. package/concepts/es/GlobalSettings.md +2 -2
  12. package/concepts/es/ToolsFirst.md +1 -1
  13. package/concepts/fr/GlobalSettings.md +2 -2
  14. package/concepts/fr/ToolsFirst.md +1 -1
  15. package/concepts/it/GlobalSettings.md +2 -2
  16. package/concepts/it/ToolsFirst.md +1 -1
  17. package/concepts/ja/GlobalSettings.md +2 -2
  18. package/concepts/ja/ToolsFirst.md +1 -1
  19. package/concepts/ko/GlobalSettings.md +2 -2
  20. package/concepts/ko/ToolsFirst.md +1 -1
  21. package/concepts/no/GlobalSettings.md +2 -2
  22. package/concepts/no/ToolsFirst.md +1 -1
  23. package/concepts/pl/GlobalSettings.md +2 -2
  24. package/concepts/pl/ToolsFirst.md +1 -1
  25. package/concepts/pt-BR/GlobalSettings.md +2 -2
  26. package/concepts/pt-BR/ToolsFirst.md +1 -1
  27. package/concepts/ru/GlobalSettings.md +2 -2
  28. package/concepts/ru/ToolsFirst.md +1 -1
  29. package/concepts/th/GlobalSettings.md +2 -2
  30. package/concepts/th/ToolsFirst.md +1 -1
  31. package/concepts/tr/GlobalSettings.md +2 -2
  32. package/concepts/tr/ToolsFirst.md +1 -1
  33. package/concepts/uk/GlobalSettings.md +2 -2
  34. package/concepts/uk/ToolsFirst.md +1 -1
  35. package/concepts/zh/GlobalSettings.md +2 -2
  36. package/concepts/zh/ToolsFirst.md +1 -1
  37. package/concepts/zh-TW/GlobalSettings.md +2 -2
  38. package/concepts/zh-TW/ToolsFirst.md +1 -1
  39. package/dist/assets/App-CqQJDjfT.js +2 -0
  40. package/dist/assets/App-ssYfrjwF.css +1 -0
  41. package/dist/assets/{MdxEditorPanel-e5DlfcqJ.js → MdxEditorPanel-DXwb5tSD.js} +1 -1
  42. package/dist/assets/{Mobile-B8xwCLgr.js → Mobile-DOjKURO3.js} +1 -1
  43. package/dist/assets/{ProxyStatsModal-_w677xPM.js → ProxyStatsModal-BEnxiRXF.js} +1 -1
  44. package/dist/assets/index-CH_N7vvX.js +2 -0
  45. package/dist/assets/seqResourceLoaders-BJhO6zhW.js +2 -0
  46. package/dist/assets/seqResourceLoaders-DI0G5nu1.css +41 -0
  47. package/dist/index.html +1 -1
  48. package/findcc.js +17 -8
  49. package/node_modules/@ccv/core/package.json +13 -0
  50. package/{server/lib → node_modules/@ccv/core/src}/approval-modal-prefs.js +1 -1
  51. package/node_modules/@ccv/core/src/clearCheckpoint.js +7 -0
  52. package/{src/utils → node_modules/@ccv/core/src}/contentFilter.js +207 -141
  53. package/{server/lib → node_modules/@ccv/core/src}/context-rules.js +2 -2
  54. package/{server/lib → node_modules/@ccv/core/src}/delta-reconstructor.js +60 -4
  55. package/{server/lib → node_modules/@ccv/core/src}/error-report.js +5 -4
  56. package/{server/lib → node_modules/@ccv/core/src}/session-boundary.js +3 -3
  57. package/{src/utils → node_modules/@ccv/core/src}/teammateDetector.js +9 -0
  58. package/{server/lib → node_modules/@ccv/core/src}/tools-xml-formatter.js +3 -3
  59. package/{server/lib → node_modules/@ccv/core/src}/v2-transcript-normalizer.js +1 -1
  60. package/{server/lib → node_modules/@ccv/core/src}/voice-pack-events.js +2 -2
  61. package/package.json +11 -97
  62. package/server/_paths.js +28 -7
  63. package/server/i18n.js +60 -0
  64. package/server/interceptor.js +36 -11
  65. package/server/lib/adapters/dingtalk-adapter.js +2 -2
  66. package/server/lib/adapters/discord-adapter.js +2 -2
  67. package/server/lib/adapters/feishu-adapter.js +2 -2
  68. package/server/lib/adapters/wecom-adapter.js +2 -2
  69. package/server/lib/approval-policy.js +29 -0
  70. package/server/lib/{ask-store.js → ask/ask-store.js} +3 -3
  71. package/server/lib/{perm-bridge.js → ask/perm-bridge.js} +5 -5
  72. package/server/lib/builtin-model-prompts.js +198 -0
  73. package/server/lib/chat-queue.js +341 -0
  74. package/server/lib/cli-inject.js +1 -1
  75. package/server/lib/context-watcher.js +3 -3
  76. package/server/lib/create_system_prompt.js +0 -9
  77. package/server/lib/enrich-plan-input.js +1 -1
  78. package/server/lib/ensure-hooks.js +2 -2
  79. package/server/lib/file-access-policy.js +6 -1
  80. package/server/lib/file-api.js +17 -1
  81. package/server/lib/{dingtalk-bridge.js → im/dingtalk-bridge.js} +1 -1
  82. package/server/lib/{im-append-system.js → im/im-append-system.js} +5 -13
  83. package/server/lib/{im-bridge-core.js → im/im-bridge-core.js} +12 -6
  84. package/server/lib/{im-config.js → im/im-config.js} +1 -1
  85. package/server/lib/im/im-deny.js +4 -0
  86. package/server/lib/{im-lang.js → im/im-lang.js} +1 -1
  87. package/server/lib/{im-lock.js → im/im-lock.js} +2 -2
  88. package/server/lib/{im-process-manager.js → im/im-process-manager.js} +1 -1
  89. package/server/lib/{im-senders.js → im/im-senders.js} +1 -1
  90. package/server/lib/{im-skills.js → im/im-skills.js} +2 -2
  91. package/server/lib/interceptor-core.js +8 -5
  92. package/server/lib/kv-cache-analyzer.js +6 -5
  93. package/server/lib/launch-config.js +329 -0
  94. package/server/lib/log-file-utils.js +21 -0
  95. package/server/lib/log-management.js +6 -17
  96. package/server/lib/log-stream.js +1 -1
  97. package/server/lib/log-watcher.js +1 -1
  98. package/server/lib/model-system-prompts.js +18 -2
  99. package/server/lib/prefs-store.js +2 -2
  100. package/server/lib/project-prefs.js +6 -6
  101. package/server/lib/project-state.js +15 -0
  102. package/server/lib/{proxy-retry.js → proxy/proxy-retry.js} +2 -2
  103. package/server/lib/{proxy-stats.js → proxy/proxy-stats.js} +3 -3
  104. package/server/lib/sdk-adapter.js +6 -74
  105. package/server/lib/sdk-manager.js +383 -278
  106. package/server/lib/skills-api.js +1 -1
  107. package/server/lib/spawn-model-resolver.js +21 -6
  108. package/server/lib/stats-worker.js +2 -2
  109. package/server/lib/system-prompt-files.js +53 -15
  110. package/server/lib/system-prompt-render.js +23 -7
  111. package/server/lib/system-prompt-snapshots.js +452 -0
  112. package/server/lib/updater.js +63 -3
  113. package/server/lib/user-prompt-extract.js +5 -5
  114. package/server/lib/v2/adapter.js +3 -3
  115. package/server/lib/v2/conversation-store.js +1 -1
  116. package/server/lib/v2/convert.js +3 -3
  117. package/server/lib/v2/jsonl-read.js +1 -1
  118. package/server/lib/v2/live-feed.js +3 -3
  119. package/server/lib/v2/meta-rows.js +3 -3
  120. package/server/lib/v2/replay.js +1 -1
  121. package/server/lib/v2/session-list.js +1 -1
  122. package/server/lib/v2/session-owner.js +1 -1
  123. package/server/lib/v2/v2-writer.js +26 -1
  124. package/server/lib/v2/verify.js +1 -1
  125. package/server/lib/voice-pack-manager.js +4 -5
  126. package/server/lib/wire-compress.js +1 -1
  127. package/server/proxy.js +5 -5
  128. package/server/pty-manager.js +285 -184
  129. package/server/routes/ask-perm.js +1 -1
  130. package/server/routes/dingtalk.js +3 -3
  131. package/server/routes/events.js +2 -2
  132. package/server/routes/expert.js +74 -13
  133. package/server/routes/im.js +5 -5
  134. package/server/routes/preferences.js +3 -3
  135. package/server/routes/workspaces.js +1 -1
  136. package/server/server.js +207 -58
  137. package/server/system-prompt-templates/systemPromptModel.md +0 -8
  138. package/server/system-prompt-templates/systemPromptVariables.ar.md +0 -7
  139. package/server/system-prompt-templates/systemPromptVariables.da.md +0 -7
  140. package/server/system-prompt-templates/systemPromptVariables.de.md +0 -7
  141. package/server/system-prompt-templates/systemPromptVariables.es.md +0 -7
  142. package/server/system-prompt-templates/systemPromptVariables.fr.md +0 -7
  143. package/server/system-prompt-templates/systemPromptVariables.it.md +0 -7
  144. package/server/system-prompt-templates/systemPromptVariables.ja.md +0 -7
  145. package/server/system-prompt-templates/systemPromptVariables.ko.md +0 -7
  146. package/server/system-prompt-templates/systemPromptVariables.md +0 -7
  147. package/server/system-prompt-templates/systemPromptVariables.no.md +0 -7
  148. package/server/system-prompt-templates/systemPromptVariables.pl.md +0 -7
  149. package/server/system-prompt-templates/systemPromptVariables.pt-BR.md +0 -7
  150. package/server/system-prompt-templates/systemPromptVariables.ru.md +0 -7
  151. package/server/system-prompt-templates/systemPromptVariables.th.md +0 -7
  152. package/server/system-prompt-templates/systemPromptVariables.tr.md +0 -7
  153. package/server/system-prompt-templates/systemPromptVariables.uk.md +0 -7
  154. package/server/system-prompt-templates/systemPromptVariables.zh-TW.md +0 -7
  155. package/server/system-prompt-templates/systemPromptVariables.zh.md +0 -7
  156. package/ultraAgents/README.md +3 -0
  157. package/ultraAgents/test-analysis-expert.json +45 -0
  158. package/dist/assets/App-BWajJyJh.css +0 -1
  159. package/dist/assets/App-CusqoEAB.js +0 -2
  160. package/dist/assets/index-D6FmFsIz.js +0 -2
  161. package/dist/assets/seqResourceLoaders-3K77Znll.js +0 -2
  162. package/dist/assets/seqResourceLoaders-BgD_Rwvc.css +0 -41
  163. package/src/utils/apiUrl.js +0 -26
  164. package/src/utils/askFallback.js +0 -21
  165. package/src/utils/askOptionDesc.js +0 -55
  166. package/src/utils/askPortalMatcher.js +0 -54
  167. package/src/utils/autoApproveOptions.js +0 -27
  168. package/src/utils/avatarAnimationPostPass.js +0 -49
  169. package/src/utils/builtinPresets.js +0 -18
  170. package/src/utils/clearCheckpoint.js +0 -7
  171. package/src/utils/commandValidator.js +0 -45
  172. package/src/utils/contextRaw.js +0 -18
  173. package/src/utils/contextSidebarNavigation.js +0 -16
  174. package/src/utils/contextTurns.js +0 -117
  175. package/src/utils/displayScaleHelper.js +0 -47
  176. package/src/utils/effectiveModel.js +0 -17
  177. package/src/utils/entry-slim.js +0 -563
  178. package/src/utils/entryCache.js +0 -144
  179. package/src/utils/errorReport.js +0 -6
  180. package/src/utils/fileExpandedPathsStorage.js +0 -70
  181. package/src/utils/fileIcons.jsx +0 -36
  182. package/src/utils/fileOpen.js +0 -37
  183. package/src/utils/formatters.js +0 -48
  184. package/src/utils/gitApi.js +0 -50
  185. package/src/utils/gitTreeBuilder.js +0 -19
  186. package/src/utils/helpers.js +0 -854
  187. package/src/utils/identityHeal.js +0 -108
  188. package/src/utils/imConnState.js +0 -59
  189. package/src/utils/imOrigin.js +0 -24
  190. package/src/utils/imTr.js +0 -7
  191. package/src/utils/imageCompress.js +0 -83
  192. package/src/utils/imageDownscale.js +0 -28
  193. package/src/utils/imageResize.js +0 -112
  194. package/src/utils/ingestPipeline.js +0 -47
  195. package/src/utils/isProxyMode.js +0 -11
  196. package/src/utils/lazyWithReload.js +0 -53
  197. package/src/utils/markdown.js +0 -30
  198. package/src/utils/markdownIncremental.js +0 -39
  199. package/src/utils/markdownProfiler.js +0 -113
  200. package/src/utils/mdExtensionDetect.js +0 -64
  201. package/src/utils/memoryLinkParser.js +0 -44
  202. package/src/utils/modalMask.js +0 -15
  203. package/src/utils/modelSuggestions.js +0 -48
  204. package/src/utils/monotime.js +0 -6
  205. package/src/utils/pinnedMenu.js +0 -55
  206. package/src/utils/presetShortcuts.js +0 -14
  207. package/src/utils/projectAlias.js +0 -135
  208. package/src/utils/promptClassifier.js +0 -112
  209. package/src/utils/promptDetect.js +0 -196
  210. package/src/utils/promptNav.js +0 -60
  211. package/src/utils/ptyChunkBuilder.js +0 -251
  212. package/src/utils/quickMenuHoverIntent.js +0 -35
  213. package/src/utils/rateLimitParser.js +0 -119
  214. package/src/utils/readResultPool.js +0 -106
  215. package/src/utils/refreshCachedItemProp.js +0 -30
  216. package/src/utils/resizeCalc.js +0 -21
  217. package/src/utils/resolveLocalized.js +0 -17
  218. package/src/utils/searchApi.js +0 -47
  219. package/src/utils/searchReplace.js +0 -51
  220. package/src/utils/seqResourceLoaders.js +0 -79
  221. package/src/utils/sessionManager.js +0 -482
  222. package/src/utils/sessionMerge.js +0 -239
  223. package/src/utils/skillModalController.js +0 -111
  224. package/src/utils/skillsParser.js +0 -116
  225. package/src/utils/slashCommandLabels.js +0 -80
  226. package/src/utils/splitDragCalc.js +0 -73
  227. package/src/utils/stickyBottomController.js +0 -643
  228. package/src/utils/svgSanitize.js +0 -48
  229. package/src/utils/systemTags.js +0 -47
  230. package/src/utils/tClaude.js +0 -20
  231. package/src/utils/teamModalBuilder.js +0 -351
  232. package/src/utils/teamSessionParser.js +0 -190
  233. package/src/utils/teammateAvatars.js +0 -194
  234. package/src/utils/termDiag.js +0 -114
  235. package/src/utils/terminalClipboard.js +0 -117
  236. package/src/utils/terminalWriteQueue.js +0 -398
  237. package/src/utils/thinkingMerge.js +0 -49
  238. package/src/utils/toolCatalog.js +0 -30
  239. package/src/utils/toolResultBuilder.js +0 -411
  240. package/src/utils/toolResultClassifier.js +0 -16
  241. package/src/utils/toolResultCore.js +0 -194
  242. package/src/utils/toolsDiff.js +0 -44
  243. package/src/utils/toolsXmlFormatter.js +0 -3
  244. package/src/utils/ultraplanController.js +0 -109
  245. package/src/utils/ultraplanExperts.js +0 -86
  246. package/src/utils/ultraplanTemplates.js +0 -154
  247. package/src/utils/userImageRefs.js +0 -49
  248. package/src/utils/v3Assembler.js +0 -125
  249. package/src/utils/v3Rows.js +0 -49
  250. package/src/utils/voicePackPlayer.js +0 -233
  251. package/src/utils/webSearchGrouping.js +0 -111
  252. package/src/utils/workflowFormat.js +0 -52
  253. package/src/utils/workflowRuns.js +0 -118
  254. package/src/utils/workflowStore.js +0 -94
  255. /package/{src/utils → node_modules/@ccv/core/src}/requestType.js +0 -0
  256. /package/server/lib/{ask-bridge.js → ask/ask-bridge.js} +0 -0
  257. /package/server/lib/{ask-constants.js → ask/ask-constants.js} +0 -0
  258. /package/server/lib/{ask-reaper.js → ask/ask-reaper.js} +0 -0
  259. /package/server/lib/{dingtalk-config.js → im/dingtalk-config.js} +0 -0
  260. /package/server/lib/{im-log-watcher.js → im/im-log-watcher.js} +0 -0
  261. /package/server/lib/{proxy-env.js → proxy/proxy-env.js} +0 -0
  262. /package/server/lib/{proxy-errors.js → proxy/proxy-errors.js} +0 -0
@@ -1,5 +1,5 @@
1
1
  // Ask / permission hook bridge routes (moved verbatim from server.js handleRequest).
2
- import { loadAskStore, consumeIfFinal as askStoreConsumeIfFinal, markCancelled as askStoreMarkCancelled } from '../lib/ask-store.js';
2
+ import { loadAskStore, consumeIfFinal as askStoreConsumeIfFinal, markCancelled as askStoreMarkCancelled } from '../lib/ask/ask-store.js';
3
3
  import { runWaterfallHook, runParallelHook } from '../lib/plugin-loader.js';
4
4
  import { sendEventToClients } from '../lib/log-watcher.js';
5
5
 
@@ -1,11 +1,11 @@
1
- // DingTalk bridge config API. See server/lib/dingtalk-config.js (storage) and
2
- // server/lib/dingtalk-bridge.js (the Stream client) for the underlying logic.
1
+ // DingTalk bridge config API. See server/lib/im/dingtalk-config.js (storage) and
2
+ // server/lib/im/dingtalk-bridge.js (the Stream client) for the underlying logic.
3
3
  //
4
4
  // GET /api/dingtalk/status — public; remote callers get only hasSecret, the local (admin)
5
5
  // caller additionally gets the plaintext appSecret to view/copy.
6
6
  // POST /api/dingtalk/config — loopback-only (!isLocal → 403); save creds, reload bridge.
7
7
  // POST /api/dingtalk/test — loopback-only; validate creds (fetch an access token).
8
- import { loadDingTalkState, saveDingTalkConfig, loadDingTalkConfig } from '../lib/dingtalk-config.js';
8
+ import { loadDingTalkState, saveDingTalkConfig, loadDingTalkConfig } from '../lib/im/dingtalk-config.js';
9
9
 
10
10
  const JSON_HEADERS = { 'Content-Type': 'application/json' };
11
11
 
@@ -5,7 +5,7 @@ import { _projectName, getLiveLogSource, isContinuedLaunch } from '../intercepto
5
5
  import { LOG_DIR } from '../../findcc.js';
6
6
  import { streamRawEntriesAsync } from '../lib/log-stream.js';
7
7
  import { migrationStatus } from '../lib/v2/migrate-prompt.js';
8
- import { reportSwallowed } from '../lib/error-report.js';
8
+ import { reportSwallowed } from '@ccv/core/error-report';
9
9
  import { sseHead, sseWrite, needsDrain, wireEnd, awaitWireDrain } from '../lib/wire-compress.js';
10
10
  import { readV2ColdBundle } from '../lib/v2/meta-rows.js';
11
11
  import { readV2SingleEntry } from '../lib/v2/adapter.js';
@@ -13,7 +13,7 @@ import { enrichRawIfNeeded } from '../lib/enrich-plan-input.js';
13
13
  import { validateLogPath } from '../lib/log-management.js';
14
14
  import { isMainAgentEntry, extractCachedContent } from '../lib/kv-cache-analyzer.js';
15
15
  import { CONTEXT_WINDOW_FILE, readModelContextSize, buildContextWindowEvent, getContextSizeForModel } from '../lib/context-watcher.js';
16
- import { adaptContextWindow } from '../lib/context-rules.js';
16
+ import { adaptContextWindow } from '@ccv/core/context-rules';
17
17
 
18
18
  function turnEndNotify(req, res, parsedUrl, isLocal, deps) {
19
19
  if (!isLocal) {
@@ -15,6 +15,11 @@ import {
15
15
  MODEL_PROMPT_DIR, normalizeModelName, listModelPrompts,
16
16
  writeModelPrompt, deleteModelPrompt, matchModelPrompt,
17
17
  } from '../lib/model-system-prompts.js';
18
+ import {
19
+ matchBuiltinModelPrompt, isBuiltinDisabled,
20
+ readBuiltinDisabled, setBuiltinDisabled, listBuiltinModelPrompts,
21
+ } from '../lib/builtin-model-prompts.js';
22
+ import { reportSwallowed } from '@ccv/core/error-report';
18
23
  import { resolveSpawnModel } from '../lib/spawn-model-resolver.js';
19
24
  import { listSystemPromptPresets, groupPresetsByCategory, getSystemPromptVariablesDoc } from '../lib/system-prompt-presets.js';
20
25
  import { LOG_DIR } from '../../findcc.js';
@@ -41,12 +46,24 @@ function sendJson(res, code, obj) {
41
46
  } catch { /* socket 已关闭:忽略 */ }
42
47
  }
43
48
 
49
+ // scope → 目标 modelPromptDir 的统一解析(postModelPrompts 普通分支与墓碑分支共用):
50
+ // global 直取 LOG_DIR;workspace 需活动工作区(缺失返回 {error} 由调用方回 400)。
51
+ async function resolveScopeModelDir(deps, scope) {
52
+ if (scope === 'global') return { dir: join(LOG_DIR, MODEL_PROMPT_DIR) };
53
+ const dir = await resolveDir(deps);
54
+ if (!dir) return { error: 'no_active_workspace' };
55
+ return { dir: join(dir, MODEL_PROMPT_DIR) };
56
+ }
57
+
44
58
  // Single source for "is a custom system prompt configured to inject" — mirrors the
45
59
  // spawn-time injection semantics of buildSystemPromptFileArgs: the env kill switch wins;
46
60
  // a matched model entry supersedes the Default sentinels for activation purposes.
47
61
  // Fidelity note: spawn-only gates this helper cannot see (insideLogDir skip, manual
48
62
  // --system-prompt-file flags, one-shot skip tokens) may rarely make "active" a false
49
- // positive — acceptable for a UI hint.
63
+ // positive — acceptable for a UI hint. The built-in layer shares the same gates, and
64
+ // can also false-NEGATIVE the other way: when the spawn-time model signal comes from
65
+ // launchSettings (launcher-delivered ANTHROPIC_MODEL), this resolver may see no model
66
+ // while spawn still injects a built-in preset (entry stays hidden). Same acceptance.
50
67
  function computeSystemPromptStatus(dir) {
51
68
  if (process.env[DISABLE_AUTO_SYSTEM_PROMPT_ENV] === '1') {
52
69
  return { active: false, modelId: null, matched: null, defaultActive: false };
@@ -61,8 +78,28 @@ function computeSystemPromptStatus(dir) {
61
78
  { dir: join(LOG_DIR, MODEL_PROMPT_DIR), scope: 'global' },
62
79
  ])
63
80
  : null;
64
- const matched = match ? { scope: match.scope, name: match.name, mode: match.mode } : null;
65
- return { active: !!matched || defaultActive, modelId, matched, defaultActive };
81
+ let matched = match ? { scope: match.scope, name: match.name, mode: match.mode } : null;
82
+ // 内置层镜像 spawn 语义:用户文件未命中时,内置 preset 命中(未禁用)同样构成注入;
83
+ // 命中被墓碑禁用则报 builtinDisabled(条件字段,仅此时出现,命名与 spawn 返回字段
84
+ // 对齐)——UI 据此让入口以「已禁用」态保活,点入可重启用,否则 chip 消失后无法找回禁用开关。
85
+ let builtinDisabledEntry;
86
+ if (!matched && modelId) {
87
+ try {
88
+ const builtin = matchBuiltinModelPrompt(modelId);
89
+ if (builtin) {
90
+ if (isBuiltinDisabled(builtin.name, dir ? join(dir, MODEL_PROMPT_DIR) : null, join(LOG_DIR, MODEL_PROMPT_DIR))) {
91
+ builtinDisabledEntry = { name: builtin.name };
92
+ } else {
93
+ matched = { scope: 'builtin', name: builtin.name, mode: builtin.mode };
94
+ }
95
+ }
96
+ } catch (err) {
97
+ reportSwallowed('expert.systemPromptStatus.builtin', err);
98
+ }
99
+ }
100
+ const out = { active: !!matched || defaultActive, modelId, matched, defaultActive };
101
+ if (builtinDisabledEntry) out.builtinDisabled = builtinDisabledEntry;
102
+ return out;
66
103
  }
67
104
 
68
105
  async function getSystemText(req, res, parsedUrl, isLocal, deps) {
@@ -124,12 +161,26 @@ async function getModelPrompts(req, res, parsedUrl, isLocal, deps) {
124
161
  const dir = await resolveDir(deps);
125
162
  const globalDir = join(LOG_DIR, MODEL_PROMPT_DIR);
126
163
  const status = computeSystemPromptStatus(dir);
164
+ // 内置 preset 条目(默认生效层):text 为 renderPresetTemplate 输出(边界已剥离),
165
+ // disabled 双 scope 墓碑标志供弹窗渲染禁用态/重启用。
166
+ const workspaceModelDir = dir ? join(dir, MODEL_PROMPT_DIR) : null;
167
+ const disabledWs = readBuiltinDisabled(workspaceModelDir);
168
+ const disabledG = readBuiltinDisabled(globalDir);
169
+ const builtin = listBuiltinModelPrompts().map((e) => ({
170
+ id: e.id,
171
+ title: e.title,
172
+ name: e.name,
173
+ mode: e.mode,
174
+ text: e.text,
175
+ disabled: { workspace: disabledWs.includes(e.name), global: disabledG.includes(e.name) },
176
+ }));
127
177
  sendJson(res, 200, {
128
178
  workspaceDir: dir || null,
129
179
  workspaceActive: !!dir,
130
180
  globalDir,
131
181
  workspace: dir ? collectModelEntries(join(dir, MODEL_PROMPT_DIR)) : [],
132
182
  global: collectModelEntries(globalDir),
183
+ builtin,
133
184
  // 当前生效配置解析出的模型 id 及其命中的条目(未命中为 null)——弹窗据此把默认页签
134
185
  // 指向命中条目;matched.name 为规范化大写名,与页签 key 的构成一致。
135
186
  modelId: status.modelId,
@@ -162,29 +213,39 @@ function postModelPrompts(req, res, parsedUrl, isLocal, deps) {
162
213
  req.on('end', async () => {
163
214
  if (truncated) return; // 超限已 destroy,socket 关闭,勿再解析/回包(对齐 postSystemText)
164
215
  try {
165
- const { scope, name, mode, text } = JSON.parse(body || '{}');
216
+ const { scope, name, mode, text, action } = JSON.parse(body || '{}');
166
217
  if (scope !== 'workspace' && scope !== 'global') {
167
218
  sendJson(res, 400, { error: 'bad_scope' });
168
219
  return;
169
220
  }
170
221
  const canonical = normalizeModelName(name);
171
222
  if (!canonical) { sendJson(res, 400, { error: 'bad_model_name' }); return; }
172
- let targetDir;
173
- if (scope === 'global') {
174
- targetDir = join(LOG_DIR, MODEL_PROMPT_DIR);
175
- } else {
176
- const dir = await resolveDir(deps);
177
- if (!dir) { sendJson(res, 400, { error: 'no_active_workspace' }); return; }
178
- targetDir = join(dir, MODEL_PROMPT_DIR);
223
+ const target = await resolveScopeModelDir(deps, scope);
224
+ if (target.error) { sendJson(res, 400, { error: target.error }); return; }
225
+ // 墓碑操作(禁用/启用内置 preset 条目)。action 存在但非法 → 400 兜底:
226
+ // 拼错的 action 绝不可 fall-through 到下面的「空 text = 删除用户条目」分支。
227
+ if (action !== undefined) {
228
+ if (action !== 'disable-builtin' && action !== 'enable-builtin') {
229
+ sendJson(res, 400, { error: 'bad_action' });
230
+ return;
231
+ }
232
+ if (!listBuiltinModelPrompts().some((e) => e.name === canonical)) {
233
+ sendJson(res, 400, { error: 'unknown_builtin' });
234
+ return;
235
+ }
236
+ const disabled = action === 'disable-builtin';
237
+ setBuiltinDisabled(target.dir, canonical, disabled);
238
+ sendJson(res, 200, { ok: true, scope, name: canonical, disabled });
239
+ return;
179
240
  }
180
241
  const raw = typeof text === 'string' ? text : '';
181
242
  if (raw.trim().length === 0) {
182
243
  // 空文本 = 删除条目(对齐 system-text 的「存空即禁用」约定;此时 mode 可缺省)。
183
- deleteModelPrompt(targetDir, canonical);
244
+ deleteModelPrompt(target.dir, canonical);
184
245
  sendJson(res, 200, { ok: true, name: canonical, scope, cleared: true });
185
246
  return;
186
247
  }
187
- const result = writeModelPrompt(targetDir, canonical, mode === 'override' ? 'override' : 'append', raw);
248
+ const result = writeModelPrompt(target.dir, canonical, mode === 'override' ? 'override' : 'append', raw);
188
249
  sendJson(res, 200, { ok: true, scope, ...result });
189
250
  } catch (e) {
190
251
  console.error('[CC Viewer] expert model-prompts POST failed:', e.message);
@@ -19,13 +19,13 @@
19
19
  // detached ccv worker (im-process-manager). In the MAIN process, status/process routes go through the
20
20
  // manager (lock + loopback probe of the worker). In a WORKER process (CCV_IM_PLATFORM set), status
21
21
  // reports its own in-process adapter (deps.im.getBridgeStatus) — that's what the manager probes.
22
- import { getDescriptor, loadConfig, loadState, saveConfig } from '../lib/im-config.js';
22
+ import { getDescriptor, loadConfig, loadState, saveConfig } from '../lib/im/im-config.js';
23
23
  import { findRecentLog } from '../lib/interceptor-core.js';
24
24
  import { listV2Sessions } from '../lib/v2/adapter.js';
25
- import { readSenders } from '../lib/im-senders.js';
26
- import { readImAppendSystem, writeImAppendSystem, buildImAppendSystemPreset, MAX_IM_APPEND_SYSTEM_CHARS } from '../lib/im-append-system.js';
27
- import { imDir } from '../lib/im-lock.js';
28
- import { resolvePrefLang } from '../lib/im-lang.js';
25
+ import { readSenders } from '../lib/im/im-senders.js';
26
+ import { readImAppendSystem, writeImAppendSystem, buildImAppendSystemPreset, MAX_IM_APPEND_SYSTEM_CHARS } from '../lib/im/im-append-system.js';
27
+ import { imDir } from '../lib/im/im-lock.js';
28
+ import { resolvePrefLang } from '../lib/im/im-lang.js';
29
29
  import { listSkills, moveSkill, deleteSkill } from '../lib/skills-api.js';
30
30
  import { importSkillTo } from './skills.js';
31
31
  import { LOG_DIR } from '../../findcc.js';
@@ -5,14 +5,14 @@ import { homedir } from 'node:os';
5
5
  import { LOG_DIR, setLogDir, getClaudeConfigDir, discoverClaudeExecutables, resolveExplicitClaudePath, CLAUDE_EXECUTABLE_PREF_KEY } from '../../findcc.js';
6
6
  import { PROFILE_PATH, _defaultConfig, getActiveProfileId, getStoredRoles, isOfficialDefaultEndpoint, setActiveProfileForWorkspace, _loadProxyProfile, RETRY_CONFIG_PATH, _retryConfigState, _loadRetryConfigState } from '../interceptor.js';
7
7
  import { migrateProxyProfileList, isValidRoleValue, PROXY_ROLE_KEYS } from '../lib/interceptor-core.js';
8
- import { DEFAULT_RETRY_CONFIG, validateRetryConfig, resolveRetryConfig } from '../lib/proxy-retry.js';
8
+ import { DEFAULT_RETRY_CONFIG, validateRetryConfig, resolveRetryConfig } from '../lib/proxy/proxy-retry.js';
9
9
  import { discoverCcSwitchProviders, mergeImportedProfiles } from '../lib/ccswitch-import.js';
10
- import { reportSwallowed } from '../lib/error-report.js';
10
+ import { reportSwallowed } from '@ccv/core/error-report';
11
11
  import { setLang } from '../i18n.js';
12
12
  import { reconcileVoicePackPrefs as vpReconcile } from '../lib/voice-pack-manager.js';
13
13
  import { readClaudeProjectModel } from '../lib/context-watcher.js';
14
14
  import { sendEventToClients } from '../lib/log-watcher.js';
15
- import { listPlatforms } from '../lib/im-config.js';
15
+ import { listPlatforms } from '../lib/im/im-config.js';
16
16
  import { mutatePrefs, applyPrefsPatch, readPrefsRaw } from '../lib/prefs-store.js';
17
17
  import {
18
18
  getCurrentProjectKey, getCurrentProjectName, hasFork, listForks, resolveScoped,
@@ -4,7 +4,7 @@ import { basename } from 'node:path';
4
4
  import { initForWorkspace, resetWorkspace, getLiveLogSource, markContinuedLaunch, markForkSession, markResumeSession, isContinuedLaunch } from '../interceptor.js';
5
5
  import { LOG_DIR } from '../../findcc.js';
6
6
  import { migrationStatus } from '../lib/v2/migrate-prompt.js';
7
- import { reportSwallowed } from '../lib/error-report.js';
7
+ import { reportSwallowed } from '@ccv/core/error-report';
8
8
 
9
9
  // P2: claude continuation flags — the workspace launcher injects `-c` itself
10
10
  // (WorkspaceList's logCount heuristic), so argv scanning in cli.js never sees