@cjhyy/code-shell-core 0.7.1 → 0.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 (595) hide show
  1. package/README.md +36 -23
  2. package/dist/agent/agent-definition-registry.d.ts +2 -2
  3. package/dist/agent/agent-definition-registry.js +47 -10
  4. package/dist/agent/agent-definition.d.ts +5 -0
  5. package/dist/agent/agent-definition.js +14 -0
  6. package/dist/automation/index.d.ts +7 -4
  7. package/dist/automation/index.js +4 -2
  8. package/dist/automation/runner.js +3 -1
  9. package/dist/automation/scheduler.d.ts +57 -1
  10. package/dist/automation/scheduler.js +123 -23
  11. package/dist/automation/store.d.ts +6 -2
  12. package/dist/automation/store.js +7 -3
  13. package/dist/capabilities/index.d.ts +109 -0
  14. package/dist/capabilities/index.js +80 -0
  15. package/dist/capability-control/disabled-lists.d.ts +2 -1
  16. package/dist/capability-control/disabled-lists.js +3 -5
  17. package/dist/capability-control/overlay.d.ts +14 -1
  18. package/dist/capability-control/overlay.js +40 -0
  19. package/dist/capability-control/service.js +6 -4
  20. package/dist/cli/agent-server-stdio.d.ts +1 -1
  21. package/dist/cli/agent-server-stdio.js +66 -6
  22. package/dist/cli/agent-server-tcp.js +7 -3
  23. package/dist/context/compaction.d.ts +39 -3
  24. package/dist/context/compaction.js +151 -39
  25. package/dist/context/manager.d.ts +17 -1
  26. package/dist/context/manager.js +36 -1
  27. package/dist/credentials/access.d.ts +3 -1
  28. package/dist/credentials/access.js +24 -3
  29. package/dist/credentials/index.d.ts +1 -1
  30. package/dist/credentials/index.js +1 -1
  31. package/dist/credentials/oauth.d.ts +4 -1
  32. package/dist/credentials/oauth.js +14 -0
  33. package/dist/credentials/store.d.ts +15 -1
  34. package/dist/credentials/store.js +17 -4
  35. package/dist/credentials/types.d.ts +24 -0
  36. package/dist/credentials/use-credential-tool.js +15 -1
  37. package/dist/engine/auxiliary-pipeline.d.ts +40 -0
  38. package/dist/engine/auxiliary-pipeline.js +181 -0
  39. package/dist/{settings → engine}/disk-defaults.d.ts +2 -2
  40. package/dist/{settings → engine}/disk-defaults.js +5 -2
  41. package/dist/engine/dynamic-tool-defs.d.ts +4 -0
  42. package/dist/engine/dynamic-tool-defs.js +4 -0
  43. package/dist/engine/engine.d.ts +254 -195
  44. package/dist/engine/engine.js +1812 -2041
  45. package/dist/engine/file-history-hook.d.ts +11 -0
  46. package/dist/engine/file-history-hook.js +31 -0
  47. package/dist/engine/goal-judge-context.d.ts +9 -0
  48. package/dist/engine/goal-judge-context.js +234 -0
  49. package/dist/engine/injected-context-cache.d.ts +6 -0
  50. package/dist/engine/injected-context-cache.js +13 -0
  51. package/dist/engine/input-attachments.d.ts +1 -1
  52. package/dist/engine/model-facade.d.ts +3 -3
  53. package/dist/engine/model-facade.js +15 -14
  54. package/dist/engine/permission-controller.d.ts +55 -0
  55. package/dist/engine/permission-controller.js +148 -0
  56. package/dist/engine/prompt-cache-diagnostics.d.ts +58 -0
  57. package/dist/engine/prompt-cache-diagnostics.js +178 -0
  58. package/dist/engine/run-accounting.d.ts +41 -0
  59. package/dist/engine/run-accounting.js +126 -0
  60. package/dist/engine/run-context.d.ts +44 -0
  61. package/dist/engine/run-context.js +88 -0
  62. package/dist/engine/run-environment.d.ts +30 -0
  63. package/dist/engine/run-environment.js +77 -0
  64. package/dist/engine/run-finalize.d.ts +58 -0
  65. package/dist/engine/run-finalize.js +245 -0
  66. package/dist/engine/run-goal.d.ts +58 -0
  67. package/dist/engine/run-goal.js +188 -0
  68. package/dist/engine/run-image-input.d.ts +1 -1
  69. package/dist/engine/run-image-input.js +5 -3
  70. package/dist/engine/run-session-open.d.ts +41 -0
  71. package/dist/engine/run-session-open.js +186 -0
  72. package/dist/engine/run-setup.d.ts +42 -0
  73. package/dist/engine/run-setup.js +58 -0
  74. package/dist/engine/run-tooling.d.ts +125 -0
  75. package/dist/engine/run-tooling.js +283 -0
  76. package/dist/engine/run-types.d.ts +139 -0
  77. package/dist/engine/run-types.js +12 -0
  78. package/dist/engine/run-workspace.d.ts +50 -0
  79. package/dist/engine/run-workspace.js +114 -0
  80. package/dist/engine/steer-queue.d.ts +1 -1
  81. package/dist/engine/subagent-spawner.d.ts +32 -0
  82. package/dist/engine/subagent-spawner.js +287 -0
  83. package/dist/engine/tool-summary.d.ts +2 -2
  84. package/dist/engine/tool-summary.js +2 -2
  85. package/dist/engine/turn-loop.d.ts +49 -10
  86. package/dist/engine/turn-loop.js +370 -104
  87. package/dist/engine/types.d.ts +30 -3
  88. package/dist/engine/types.js +1 -1
  89. package/dist/{engine/goal.d.ts → goal/lifecycle.d.ts} +76 -4
  90. package/dist/goal/lifecycle.js +482 -0
  91. package/dist/hooks/events.d.ts +24 -10
  92. package/dist/hooks/goal-stop-hook.d.ts +17 -28
  93. package/dist/hooks/goal-stop-hook.js +110 -465
  94. package/dist/hooks/registry.js +1 -1
  95. package/dist/index.d.ts +48 -108
  96. package/dist/index.extension.d.ts +51 -0
  97. package/dist/index.extension.js +39 -0
  98. package/dist/index.internal.d.ts +86 -0
  99. package/dist/index.internal.js +92 -0
  100. package/dist/index.js +34 -123
  101. package/dist/links/cli.d.ts +48 -0
  102. package/dist/links/cli.js +617 -0
  103. package/dist/links/http.d.ts +40 -0
  104. package/dist/links/http.js +166 -0
  105. package/dist/links/index.d.ts +4 -0
  106. package/dist/links/index.js +3 -0
  107. package/dist/links/link-action-tool.d.ts +5 -0
  108. package/dist/links/link-action-tool.js +241 -0
  109. package/dist/links/providers.d.ts +8 -0
  110. package/dist/links/providers.js +665 -0
  111. package/dist/links/types.d.ts +44 -0
  112. package/dist/llm/client-base.d.ts +7 -0
  113. package/dist/llm/client-base.js +60 -0
  114. package/dist/llm/model-pool.d.ts +1 -1
  115. package/dist/llm/model-pool.js +1 -1
  116. package/dist/llm/providers/anthropic.d.ts +1 -0
  117. package/dist/llm/providers/anthropic.js +9 -0
  118. package/dist/llm/providers/openai.d.ts +1 -0
  119. package/dist/llm/providers/openai.js +17 -0
  120. package/dist/model-catalog/index.js +15 -2
  121. package/dist/model-catalog/resolve.d.ts +13 -1
  122. package/dist/model-catalog/resolve.js +37 -2
  123. package/dist/model-catalog/types.d.ts +74 -48
  124. package/dist/model-catalog/types.js +16 -5
  125. package/dist/model-catalog/upsert.d.ts +3 -1
  126. package/dist/model-catalog/upsert.js +9 -0
  127. package/dist/onboarding.d.ts +0 -1
  128. package/dist/onboarding.js +1 -22
  129. package/dist/panel-apps/bindings.d.ts +24 -0
  130. package/dist/panel-apps/bindings.js +69 -0
  131. package/dist/panel-apps/github-archive.d.ts +21 -0
  132. package/dist/panel-apps/github-archive.js +98 -0
  133. package/dist/panel-apps/index.d.ts +4 -0
  134. package/dist/panel-apps/index.js +4 -0
  135. package/dist/panel-apps/installer.d.ts +68 -0
  136. package/dist/panel-apps/installer.js +622 -0
  137. package/dist/panel-apps/manifest.d.ts +364 -0
  138. package/dist/panel-apps/manifest.js +189 -0
  139. package/dist/panel-apps/paths.d.ts +13 -0
  140. package/dist/panel-apps/paths.js +38 -0
  141. package/dist/panel-apps/registry.d.ts +51 -0
  142. package/dist/panel-apps/registry.js +99 -0
  143. package/dist/panel-apps/runtime.d.ts +80 -0
  144. package/dist/panel-apps/runtime.js +154 -0
  145. package/dist/plugins/gitOps.js +8 -1
  146. package/dist/plugins/installedPlugins.d.ts +2 -1
  147. package/dist/plugins/installedPlugins.js +146 -8
  148. package/dist/plugins/installer/codex/convertAgents.d.ts +4 -1
  149. package/dist/plugins/installer/codex/convertAgents.js +62 -8
  150. package/dist/plugins/installer/codex/convertCommands.d.ts +5 -5
  151. package/dist/plugins/installer/codex/convertCommands.js +35 -12
  152. package/dist/plugins/installer/codex/convertHooks.d.ts +10 -0
  153. package/dist/plugins/installer/codex/convertHooks.js +82 -0
  154. package/dist/plugins/installer/codex/convertSkills.js +41 -6
  155. package/dist/plugins/installer/install.d.ts +7 -1
  156. package/dist/plugins/installer/install.js +21 -87
  157. package/dist/plugins/installer/installFromArchive.d.ts +26 -4
  158. package/dist/plugins/installer/installFromArchive.js +44 -27
  159. package/dist/plugins/installer/installFromNpm.d.ts +31 -0
  160. package/dist/plugins/installer/installFromNpm.js +273 -0
  161. package/dist/plugins/installer/loadPluginAgents.js +17 -4
  162. package/dist/plugins/installer/loadPluginMcp.d.ts +14 -0
  163. package/dist/plugins/installer/loadPluginMcp.js +245 -35
  164. package/dist/plugins/installer/normalizeManifest.d.ts +13 -0
  165. package/dist/plugins/installer/normalizeManifest.js +306 -0
  166. package/dist/plugins/installer/npmTar.d.ts +13 -0
  167. package/dist/plugins/installer/npmTar.js +321 -0
  168. package/dist/plugins/installer/parseSource.d.ts +11 -0
  169. package/dist/plugins/installer/parseSource.js +48 -0
  170. package/dist/plugins/installer/preview.d.ts +101 -0
  171. package/dist/plugins/installer/preview.js +336 -0
  172. package/dist/plugins/installer/projectPluginSource.d.ts +14 -0
  173. package/dist/plugins/installer/projectPluginSource.js +140 -0
  174. package/dist/plugins/installer/types.d.ts +775 -0
  175. package/dist/plugins/installer/types.js +100 -0
  176. package/dist/plugins/installer/unzip.d.ts +11 -0
  177. package/dist/plugins/installer/unzip.js +123 -9
  178. package/dist/plugins/installer/update.d.ts +2 -2
  179. package/dist/plugins/installer/update.js +43 -4
  180. package/dist/plugins/loadPluginHooks.d.ts +19 -2
  181. package/dist/plugins/loadPluginHooks.js +97 -86
  182. package/dist/plugins/pluginAutomationTemplates.d.ts +18 -0
  183. package/dist/plugins/pluginAutomationTemplates.js +50 -0
  184. package/dist/plugins/pluginCatalog.d.ts +45 -0
  185. package/dist/plugins/pluginCatalog.js +87 -0
  186. package/dist/plugins/pluginCommandHook.d.ts +6 -0
  187. package/dist/plugins/pluginCommandHook.js +25 -8
  188. package/dist/plugins/pluginCommandsLoader.d.ts +19 -0
  189. package/dist/plugins/pluginCommandsLoader.js +181 -7
  190. package/dist/plugins/pluginContent.d.ts +10 -1
  191. package/dist/plugins/pluginContent.js +87 -30
  192. package/dist/plugins/pluginHookApproval.d.ts +30 -0
  193. package/dist/plugins/pluginHookApproval.js +160 -0
  194. package/dist/plugins/pluginHookIntegrity.d.ts +69 -0
  195. package/dist/plugins/pluginHookIntegrity.js +361 -0
  196. package/dist/plugins/pluginInstaller.js +71 -12
  197. package/dist/plugins/pluginMcpApproval.d.ts +19 -0
  198. package/dist/plugins/pluginMcpApproval.js +110 -0
  199. package/dist/plugins/pluginMcpIntegrity.d.ts +21 -0
  200. package/dist/plugins/pluginMcpIntegrity.js +74 -0
  201. package/dist/plugins/types.d.ts +30 -0
  202. package/dist/plugins/varRewrite.d.ts +9 -5
  203. package/dist/plugins/varRewrite.js +26 -17
  204. package/dist/preset/index.d.ts +11 -8
  205. package/dist/preset/index.js +62 -203
  206. package/dist/product/define.js +9 -3
  207. package/dist/product/types.d.ts +0 -2
  208. package/dist/profile/activation.d.ts +36 -0
  209. package/dist/profile/activation.js +57 -0
  210. package/dist/profile/catalog-store.d.ts +77 -0
  211. package/dist/profile/catalog-store.js +346 -0
  212. package/dist/profile/catalog.d.ts +54 -0
  213. package/dist/profile/catalog.js +152 -0
  214. package/dist/profile/index.d.ts +7 -0
  215. package/dist/profile/index.js +7 -0
  216. package/dist/profile/requirements.d.ts +76 -0
  217. package/dist/profile/requirements.js +117 -0
  218. package/dist/profile/resolve.d.ts +11 -0
  219. package/dist/profile/resolve.js +41 -0
  220. package/dist/profile/store.d.ts +17 -0
  221. package/dist/profile/store.js +167 -0
  222. package/dist/profile/types.d.ts +321 -0
  223. package/dist/profile/types.js +104 -0
  224. package/dist/prompt/composer.d.ts +46 -7
  225. package/dist/prompt/composer.js +78 -48
  226. package/dist/prompt/instruction-scanner.d.ts +6 -5
  227. package/dist/prompt/instruction-scanner.js +8 -23
  228. package/dist/prompt/section-loader.d.ts +2 -2
  229. package/dist/prompt/section-loader.js +7 -4
  230. package/dist/prompt/sections/browser.md +10 -9
  231. package/dist/prompt/sections/harness-base.md +9 -0
  232. package/dist/protocol/chat-session-manager.d.ts +64 -1
  233. package/dist/protocol/chat-session-manager.js +104 -0
  234. package/dist/protocol/chat-session.d.ts +61 -10
  235. package/dist/protocol/chat-session.js +135 -25
  236. package/dist/protocol/client.d.ts +33 -3
  237. package/dist/protocol/client.js +96 -5
  238. package/dist/protocol/index.d.ts +2 -2
  239. package/dist/protocol/index.js +2 -2
  240. package/dist/protocol/mobile-remote-types.d.ts +406 -0
  241. package/dist/protocol/mobile-remote-types.js +1 -0
  242. package/dist/protocol/server.d.ts +127 -3
  243. package/dist/protocol/server.js +1309 -182
  244. package/dist/protocol/types.d.ts +152 -34
  245. package/dist/protocol/types.js +16 -0
  246. package/dist/run/ArtifactTracker.d.ts +6 -1
  247. package/dist/run/ArtifactTracker.js +29 -21
  248. package/dist/run/EngineRunner.d.ts +2 -0
  249. package/dist/run/EngineRunner.js +1 -0
  250. package/dist/run/RunManager.d.ts +26 -0
  251. package/dist/run/RunManager.js +82 -11
  252. package/dist/run/factory.d.ts +3 -0
  253. package/dist/run/factory.js +2 -0
  254. package/dist/runtime/safe-spawn.d.ts +6 -0
  255. package/dist/runtime/safe-spawn.js +8 -13
  256. package/dist/services/auto-dream.d.ts +13 -1
  257. package/dist/services/auto-dream.js +56 -8
  258. package/dist/services/dream-consolidation.js +10 -1
  259. package/dist/services/memory-orchestrator.js +6 -2
  260. package/dist/services/oauth.js +4 -1
  261. package/dist/services/session-memory.d.ts +4 -4
  262. package/dist/services/session-memory.js +13 -10
  263. package/dist/session/memory.d.ts +26 -7
  264. package/dist/session/memory.js +79 -21
  265. package/dist/session/session-manager.d.ts +182 -28
  266. package/dist/session/session-manager.js +910 -130
  267. package/dist/session/session-message.d.ts +22 -0
  268. package/dist/session/session-message.js +1 -0
  269. package/dist/session/transcript.d.ts +46 -5
  270. package/dist/session/transcript.js +159 -3
  271. package/dist/settings/feature-flags.d.ts +40 -0
  272. package/dist/settings/feature-flags.js +40 -0
  273. package/dist/settings/manager.d.ts +39 -1
  274. package/dist/settings/manager.js +102 -41
  275. package/dist/settings/migrate-config.js +4 -2
  276. package/dist/settings/schema.d.ts +511 -177
  277. package/dist/settings/schema.js +98 -25
  278. package/dist/skills/scanner.d.ts +6 -2
  279. package/dist/skills/scanner.js +160 -9
  280. package/dist/sources/adapter.d.ts +14 -0
  281. package/dist/sources/adapter.js +7 -0
  282. package/dist/sources/adapters/local-files.d.ts +10 -0
  283. package/dist/sources/adapters/local-files.js +127 -0
  284. package/dist/sources/adapters/mcp-resource.d.ts +17 -0
  285. package/dist/sources/adapters/mcp-resource.js +41 -0
  286. package/dist/sources/adapters/mock.d.ts +3 -0
  287. package/dist/sources/adapters/mock.js +29 -0
  288. package/dist/sources/binding.d.ts +6 -0
  289. package/dist/sources/binding.js +24 -0
  290. package/dist/sources/catalog.d.ts +6 -0
  291. package/dist/sources/catalog.js +64 -0
  292. package/dist/sources/context-summary.d.ts +8 -0
  293. package/dist/sources/context-summary.js +13 -0
  294. package/dist/sources/credential-status.d.ts +2 -0
  295. package/dist/sources/credential-status.js +13 -0
  296. package/dist/sources/index.d.ts +10 -0
  297. package/dist/sources/index.js +10 -0
  298. package/dist/sources/resolve.d.ts +28 -0
  299. package/dist/sources/resolve.js +47 -0
  300. package/dist/sources/truncate-utf8.d.ts +7 -0
  301. package/dist/sources/truncate-utf8.js +18 -0
  302. package/dist/sources/types.d.ts +71 -0
  303. package/dist/sources/types.js +26 -0
  304. package/dist/testing/fetch-stub.d.ts +32 -0
  305. package/dist/testing/fetch-stub.js +24 -0
  306. package/dist/themes/image.d.ts +18 -0
  307. package/dist/themes/image.js +117 -0
  308. package/dist/themes/index.d.ts +4 -0
  309. package/dist/themes/index.js +4 -0
  310. package/dist/themes/installer.d.ts +50 -0
  311. package/dist/themes/installer.js +290 -0
  312. package/dist/themes/manifest.d.ts +102 -0
  313. package/dist/themes/manifest.js +86 -0
  314. package/dist/themes/paths.d.ts +14 -0
  315. package/dist/themes/paths.js +33 -0
  316. package/dist/tool-system/browser-bridge.d.ts +53 -11
  317. package/dist/tool-system/browser-bridge.js +8 -9
  318. package/dist/tool-system/builtin/agent-heartbeat.d.ts +2 -2
  319. package/dist/tool-system/builtin/agent-heartbeat.js +20 -6
  320. package/dist/tool-system/builtin/agent-notifications.d.ts +127 -72
  321. package/dist/tool-system/builtin/agent-notifications.js +291 -101
  322. package/dist/tool-system/builtin/agent-output-file.js +1 -3
  323. package/dist/tool-system/builtin/agent-progress.d.ts +6 -0
  324. package/dist/tool-system/builtin/agent-progress.js +83 -0
  325. package/dist/tool-system/builtin/agent-registry.d.ts +38 -2
  326. package/dist/tool-system/builtin/agent-registry.js +178 -9
  327. package/dist/tool-system/builtin/agent-transcript-translator.js +1 -1
  328. package/dist/tool-system/builtin/agent.d.ts +2 -0
  329. package/dist/tool-system/builtin/agent.js +274 -33
  330. package/dist/tool-system/builtin/background-jobs.d.ts +55 -2
  331. package/dist/tool-system/builtin/background-jobs.js +96 -4
  332. package/dist/tool-system/builtin/background-work.d.ts +6 -0
  333. package/dist/tool-system/builtin/background-work.js +8 -1
  334. package/dist/tool-system/builtin/bash.js +5 -2
  335. package/dist/tool-system/builtin/browser-tools.d.ts +6 -3
  336. package/dist/tool-system/builtin/browser-tools.js +89 -23
  337. package/dist/tool-system/builtin/edit-model-catalog.d.ts +6 -0
  338. package/dist/tool-system/builtin/edit-model-catalog.js +172 -12
  339. package/dist/tool-system/builtin/edit.js +2 -6
  340. package/dist/tool-system/builtin/file-cache.d.ts +2 -0
  341. package/dist/tool-system/builtin/file-cache.js +4 -0
  342. package/dist/tool-system/builtin/generate-image.js +17 -10
  343. package/dist/tool-system/builtin/generate-video.js +26 -7
  344. package/dist/tool-system/builtin/grep.js +2 -2
  345. package/dist/tool-system/builtin/image-uploader.js +7 -1
  346. package/dist/tool-system/builtin/index.d.ts +32 -7
  347. package/dist/tool-system/builtin/index.js +237 -167
  348. package/dist/tool-system/builtin/memory.d.ts +6 -0
  349. package/dist/tool-system/builtin/memory.js +36 -15
  350. package/dist/tool-system/builtin/panel.d.ts +9 -0
  351. package/dist/tool-system/builtin/panel.js +314 -0
  352. package/dist/tool-system/builtin/read.js +5 -1
  353. package/dist/tool-system/builtin/send-message-to-session.d.ts +6 -0
  354. package/dist/tool-system/builtin/send-message-to-session.js +67 -0
  355. package/dist/tool-system/builtin/sources.d.ts +8 -0
  356. package/dist/tool-system/builtin/sources.js +137 -0
  357. package/dist/tool-system/builtin/tool-search.js +7 -2
  358. package/dist/tool-system/builtin/update-automation-memory.js +2 -0
  359. package/dist/tool-system/builtin/web-fetch.js +17 -13
  360. package/dist/tool-system/builtin/web-search.js +1 -3
  361. package/dist/tool-system/capability-module.d.ts +93 -0
  362. package/dist/tool-system/capability-module.js +53 -0
  363. package/dist/tool-system/context.d.ts +77 -19
  364. package/dist/tool-system/executor.js +75 -50
  365. package/dist/tool-system/external-tool-exposure.d.ts +60 -0
  366. package/dist/tool-system/external-tool-exposure.js +304 -0
  367. package/dist/tool-system/mcp-manager.d.ts +11 -1
  368. package/dist/tool-system/mcp-manager.js +19 -4
  369. package/dist/tool-system/mcp-tool-policy.d.ts +9 -0
  370. package/dist/tool-system/mcp-tool-policy.js +34 -0
  371. package/dist/tool-system/panel-bridge.d.ts +53 -0
  372. package/dist/tool-system/panel-bridge.js +1 -0
  373. package/dist/tool-system/path-policy.js +99 -2
  374. package/dist/tool-system/permission.d.ts +26 -0
  375. package/dist/tool-system/permission.js +46 -0
  376. package/dist/tool-system/registry.d.ts +12 -1
  377. package/dist/tool-system/registry.js +31 -7
  378. package/dist/tool-system/sandbox/index.js +3 -8
  379. package/dist/tool-system/sandbox/seatbelt.js +2 -6
  380. package/dist/tool-system/session-tool-host.d.ts +139 -0
  381. package/dist/tool-system/session-tool-host.js +167 -0
  382. package/dist/tool-system/testing/tool-registry-harness.d.ts +31 -0
  383. package/dist/tool-system/testing/tool-registry-harness.js +51 -0
  384. package/dist/tool-system/validation.d.ts +14 -7
  385. package/dist/tool-system/validation.js +701 -7
  386. package/dist/types.d.ts +186 -20
  387. package/dist/{cc-orchestrator → utils}/cwd-normalize.d.ts +1 -0
  388. package/dist/{cc-orchestrator → utils}/cwd-normalize.js +1 -0
  389. package/dist/utils/file-mutex.d.ts +65 -0
  390. package/dist/utils/file-mutex.js +145 -0
  391. package/dist/utils/json.d.ts +2 -4
  392. package/dist/utils/json.js +2 -4
  393. package/dist/utils/lockfile.d.ts +30 -1
  394. package/dist/utils/lockfile.js +2 -2
  395. package/dist/utils/secret-scrubber.d.ts +8 -0
  396. package/dist/utils/secret-scrubber.js +227 -0
  397. package/dist/utils/toolDisplay.js +1 -1
  398. package/package.json +20 -5
  399. package/THIRD_PARTY_NOTICES.md +0 -206
  400. package/dist/arena/arena.d.ts +0 -45
  401. package/dist/arena/arena.js +0 -362
  402. package/dist/arena/context/context-tools.d.ts +0 -16
  403. package/dist/arena/context/context-tools.js +0 -272
  404. package/dist/arena/context/within-root.d.ts +0 -7
  405. package/dist/arena/context/within-root.js +0 -15
  406. package/dist/arena/detect-mode.d.ts +0 -20
  407. package/dist/arena/detect-mode.js +0 -78
  408. package/dist/arena/digest-builder.d.ts +0 -25
  409. package/dist/arena/digest-builder.js +0 -120
  410. package/dist/arena/index.d.ts +0 -29
  411. package/dist/arena/index.js +0 -29
  412. package/dist/arena/iterate/convergence.d.ts +0 -25
  413. package/dist/arena/iterate/convergence.js +0 -103
  414. package/dist/arena/iterate/formats/index.d.ts +0 -22
  415. package/dist/arena/iterate/formats/index.js +0 -283
  416. package/dist/arena/iterate/index.d.ts +0 -11
  417. package/dist/arena/iterate/index.js +0 -9
  418. package/dist/arena/iterate/iterative-arena.d.ts +0 -23
  419. package/dist/arena/iterate/iterative-arena.js +0 -237
  420. package/dist/arena/iterate/parse.d.ts +0 -42
  421. package/dist/arena/iterate/parse.js +0 -123
  422. package/dist/arena/iterate/phases/argue.d.ts +0 -22
  423. package/dist/arena/iterate/phases/argue.js +0 -165
  424. package/dist/arena/iterate/phases/revise.d.ts +0 -16
  425. package/dist/arena/iterate/phases/revise.js +0 -62
  426. package/dist/arena/iterate/phases/tournament.d.ts +0 -34
  427. package/dist/arena/iterate/phases/tournament.js +0 -113
  428. package/dist/arena/iterate/tools/web-tools.d.ts +0 -13
  429. package/dist/arena/iterate/tools/web-tools.js +0 -54
  430. package/dist/arena/iterate/types.d.ts +0 -152
  431. package/dist/arena/iterate/types.js +0 -8
  432. package/dist/arena/ledger.d.ts +0 -47
  433. package/dist/arena/ledger.js +0 -159
  434. package/dist/arena/lenses/architecture.d.ts +0 -5
  435. package/dist/arena/lenses/architecture.js +0 -22
  436. package/dist/arena/lenses/engineering.d.ts +0 -5
  437. package/dist/arena/lenses/engineering.js +0 -22
  438. package/dist/arena/lenses/general.d.ts +0 -5
  439. package/dist/arena/lenses/general.js +0 -20
  440. package/dist/arena/lenses/index.d.ts +0 -16
  441. package/dist/arena/lenses/index.js +0 -47
  442. package/dist/arena/lenses/product.d.ts +0 -5
  443. package/dist/arena/lenses/product.js +0 -22
  444. package/dist/arena/model-presets.d.ts +0 -23
  445. package/dist/arena/model-presets.js +0 -44
  446. package/dist/arena/phases/adjudication.d.ts +0 -25
  447. package/dist/arena/phases/adjudication.js +0 -142
  448. package/dist/arena/phases/build-consensus.d.ts +0 -30
  449. package/dist/arena/phases/build-consensus.js +0 -85
  450. package/dist/arena/phases/claim-registry.d.ts +0 -26
  451. package/dist/arena/phases/claim-registry.js +0 -60
  452. package/dist/arena/phases/cross-review.d.ts +0 -47
  453. package/dist/arena/phases/cross-review.js +0 -224
  454. package/dist/arena/phases/debate-rounds.d.ts +0 -28
  455. package/dist/arena/phases/debate-rounds.js +0 -161
  456. package/dist/arena/phases/participant-research.d.ts +0 -39
  457. package/dist/arena/phases/participant-research.js +0 -316
  458. package/dist/arena/phases/planning-detail-expansion.d.ts +0 -39
  459. package/dist/arena/phases/planning-detail-expansion.js +0 -120
  460. package/dist/arena/planner.d.ts +0 -28
  461. package/dist/arena/planner.js +0 -312
  462. package/dist/arena/providers/docs.d.ts +0 -7
  463. package/dist/arena/providers/docs.js +0 -111
  464. package/dist/arena/providers/git.d.ts +0 -8
  465. package/dist/arena/providers/git.js +0 -174
  466. package/dist/arena/providers/index.d.ts +0 -32
  467. package/dist/arena/providers/index.js +0 -132
  468. package/dist/arena/providers/none.d.ts +0 -7
  469. package/dist/arena/providers/none.js +0 -11
  470. package/dist/arena/providers/repo.d.ts +0 -7
  471. package/dist/arena/providers/repo.js +0 -258
  472. package/dist/arena/render/session.d.ts +0 -17
  473. package/dist/arena/render/session.js +0 -190
  474. package/dist/arena/render/terminal.d.ts +0 -34
  475. package/dist/arena/render/terminal.js +0 -286
  476. package/dist/arena/strategies/discussion.d.ts +0 -25
  477. package/dist/arena/strategies/discussion.js +0 -143
  478. package/dist/arena/strategies/index.d.ts +0 -15
  479. package/dist/arena/strategies/index.js +0 -28
  480. package/dist/arena/strategies/language-wrapper.d.ts +0 -17
  481. package/dist/arena/strategies/language-wrapper.js +0 -102
  482. package/dist/arena/strategies/lens-wrapper.d.ts +0 -16
  483. package/dist/arena/strategies/lens-wrapper.js +0 -236
  484. package/dist/arena/strategies/planning.d.ts +0 -30
  485. package/dist/arena/strategies/planning.js +0 -225
  486. package/dist/arena/strategies/review.d.ts +0 -26
  487. package/dist/arena/strategies/review.js +0 -168
  488. package/dist/arena/strategies/utils.d.ts +0 -36
  489. package/dist/arena/strategies/utils.js +0 -603
  490. package/dist/arena/tools/selector.d.ts +0 -17
  491. package/dist/arena/tools/selector.js +0 -61
  492. package/dist/arena/transitions.d.ts +0 -53
  493. package/dist/arena/transitions.js +0 -97
  494. package/dist/arena/types.d.ts +0 -518
  495. package/dist/arena/types.js +0 -27
  496. package/dist/cc-orchestrator/agent-adapter.d.ts +0 -54
  497. package/dist/cc-orchestrator/agent-adapter.js +0 -143
  498. package/dist/cc-orchestrator/cc-capability.d.ts +0 -19
  499. package/dist/cc-orchestrator/cc-capability.js +0 -53
  500. package/dist/cc-orchestrator/codex-session-discovery.d.ts +0 -24
  501. package/dist/cc-orchestrator/codex-session-discovery.js +0 -191
  502. package/dist/cc-orchestrator/codex-session-history.d.ts +0 -38
  503. package/dist/cc-orchestrator/codex-session-history.js +0 -247
  504. package/dist/cc-orchestrator/external-agent-bindings.d.ts +0 -27
  505. package/dist/cc-orchestrator/external-agent-bindings.js +0 -150
  506. package/dist/cc-orchestrator/external-agent-changes.d.ts +0 -19
  507. package/dist/cc-orchestrator/external-agent-changes.js +0 -231
  508. package/dist/cc-orchestrator/external-agent-driver.d.ts +0 -19
  509. package/dist/cc-orchestrator/external-agent-driver.js +0 -284
  510. package/dist/cc-orchestrator/external-agent-session-store.d.ts +0 -23
  511. package/dist/cc-orchestrator/external-agent-session-store.js +0 -146
  512. package/dist/cc-orchestrator/index.d.ts +0 -8
  513. package/dist/cc-orchestrator/index.js +0 -8
  514. package/dist/cc-orchestrator/relevance-judge.d.ts +0 -15
  515. package/dist/cc-orchestrator/relevance-judge.js +0 -29
  516. package/dist/cc-orchestrator/session-discovery.d.ts +0 -46
  517. package/dist/cc-orchestrator/session-discovery.js +0 -125
  518. package/dist/cc-orchestrator/session-history.d.ts +0 -54
  519. package/dist/cc-orchestrator/session-history.js +0 -150
  520. package/dist/cron/cron-runtime.d.ts +0 -2
  521. package/dist/cron/cron-runtime.js +0 -2
  522. package/dist/cron/cron-store.d.ts +0 -2
  523. package/dist/cron/cron-store.js +0 -2
  524. package/dist/cron/scheduler.d.ts +0 -7
  525. package/dist/cron/scheduler.js +0 -7
  526. package/dist/engine/goal.js +0 -206
  527. package/dist/external-agents/config.d.ts +0 -2
  528. package/dist/external-agents/config.js +0 -15
  529. package/dist/external-agents/types.d.ts +0 -31
  530. package/dist/git/parse-log.d.ts +0 -13
  531. package/dist/git/parse-log.js +0 -21
  532. package/dist/git/utils.d.ts +0 -49
  533. package/dist/git/utils.js +0 -161
  534. package/dist/git/worktree/crud.d.ts +0 -72
  535. package/dist/git/worktree/crud.js +0 -235
  536. package/dist/git/worktree/diff.d.ts +0 -14
  537. package/dist/git/worktree/diff.js +0 -82
  538. package/dist/git/worktree/git-exec.d.ts +0 -7
  539. package/dist/git/worktree/git-exec.js +0 -87
  540. package/dist/git/worktree/index.d.ts +0 -5
  541. package/dist/git/worktree/index.js +0 -5
  542. package/dist/git/worktree/query.d.ts +0 -43
  543. package/dist/git/worktree/query.js +0 -128
  544. package/dist/git/worktree/slug.d.ts +0 -11
  545. package/dist/git/worktree/slug.js +0 -58
  546. package/dist/git/worktree.d.ts +0 -1
  547. package/dist/git/worktree.js +0 -5
  548. package/dist/lsp/client.d.ts +0 -41
  549. package/dist/lsp/client.js +0 -186
  550. package/dist/lsp/manager.d.ts +0 -40
  551. package/dist/lsp/manager.js +0 -155
  552. package/dist/lsp/root-path.d.ts +0 -9
  553. package/dist/lsp/root-path.js +0 -12
  554. package/dist/lsp/servers.d.ts +0 -16
  555. package/dist/lsp/servers.js +0 -60
  556. package/dist/prompt/sections/coding.md +0 -35
  557. package/dist/quota/credentials.d.ts +0 -3
  558. package/dist/quota/credentials.js +0 -80
  559. package/dist/quota/index.d.ts +0 -36
  560. package/dist/quota/index.js +0 -155
  561. package/dist/quota/types.d.ts +0 -48
  562. package/dist/quota/types.js +0 -13
  563. package/dist/review/review-prompt.d.ts +0 -28
  564. package/dist/review/review-prompt.js +0 -81
  565. package/dist/state.d.ts +0 -160
  566. package/dist/state.js +0 -267
  567. package/dist/tool-system/builtin/apply-patch/applier.d.ts +0 -26
  568. package/dist/tool-system/builtin/apply-patch/applier.js +0 -308
  569. package/dist/tool-system/builtin/apply-patch/backup-targets.d.ts +0 -10
  570. package/dist/tool-system/builtin/apply-patch/backup-targets.js +0 -30
  571. package/dist/tool-system/builtin/apply-patch/index.d.ts +0 -20
  572. package/dist/tool-system/builtin/apply-patch/index.js +0 -105
  573. package/dist/tool-system/builtin/apply-patch/parser.d.ts +0 -17
  574. package/dist/tool-system/builtin/apply-patch/parser.js +0 -212
  575. package/dist/tool-system/builtin/apply-patch/seek-sequence.d.ts +0 -18
  576. package/dist/tool-system/builtin/apply-patch/seek-sequence.js +0 -123
  577. package/dist/tool-system/builtin/apply-patch/types.d.ts +0 -49
  578. package/dist/tool-system/builtin/apply-patch/types.js +0 -13
  579. package/dist/tool-system/builtin/arena.d.ts +0 -31
  580. package/dist/tool-system/builtin/arena.js +0 -416
  581. package/dist/tool-system/builtin/brief.d.ts +0 -6
  582. package/dist/tool-system/builtin/brief.js +0 -41
  583. package/dist/tool-system/builtin/check-quota.d.ts +0 -15
  584. package/dist/tool-system/builtin/check-quota.js +0 -34
  585. package/dist/tool-system/builtin/drive-claude-code.d.ts +0 -51
  586. package/dist/tool-system/builtin/drive-claude-code.js +0 -698
  587. package/dist/tool-system/builtin/lsp.d.ts +0 -7
  588. package/dist/tool-system/builtin/lsp.js +0 -144
  589. package/dist/tool-system/builtin/notebook-edit.d.ts +0 -7
  590. package/dist/tool-system/builtin/notebook-edit.js +0 -127
  591. package/dist/tool-system/builtin/worktree.d.ts +0 -11
  592. package/dist/tool-system/builtin/worktree.js +0 -363
  593. /package/dist/{external-agents → links}/types.js +0 -0
  594. /package/dist/{engine/session-usage.d.ts → session/usage.d.ts} +0 -0
  595. /package/dist/{engine/session-usage.js → session/usage.js} +0 -0
@@ -0,0 +1,50 @@
1
+ type PetState = "idle" | "running" | "alert";
2
+ type WallpaperMode = "light" | "dark";
3
+ export interface ThemePreview {
4
+ id: string;
5
+ name: string;
6
+ version: string;
7
+ hasColors: boolean;
8
+ petStates: PetState[];
9
+ wallpaperModes: WallpaperMode[];
10
+ /** The pack's primary color (for the picker swatch), if it overrides one. */
11
+ swatch?: string;
12
+ /** Content digest bound to a subsequent install to detect mid-review changes. */
13
+ reviewToken: string;
14
+ warnings: string[];
15
+ }
16
+ /** An installed theme as the host exposes it to the renderer. */
17
+ export interface InstalledTheme {
18
+ id: string;
19
+ name: string;
20
+ version: string;
21
+ colors: {
22
+ light: Record<string, string>;
23
+ dark: Record<string, string>;
24
+ };
25
+ pet: Partial<Record<PetState, string>> & {
26
+ walk?: string[];
27
+ };
28
+ wallpaper?: {
29
+ light?: string;
30
+ dark?: string;
31
+ opacity?: number;
32
+ };
33
+ }
34
+ /**
35
+ * Validate a theme pack directory and return a preview + review-token. Does not
36
+ * write anything. `sourceDir` is a directory (a zip is extracted to a temp dir
37
+ * by the caller before calling this).
38
+ */
39
+ export declare function previewLocalTheme(sourceDir: string): Promise<ThemePreview>;
40
+ /**
41
+ * Install a previously previewed theme. Re-validates and re-checks the token
42
+ * (rejecting mid-review changes), then atomically writes the theme to
43
+ * ~/.code-shell/themes/<id>/ and records it in the registry.
44
+ */
45
+ export declare function installReviewedLocalTheme(sourceDir: string, reviewToken: string): Promise<InstalledTheme>;
46
+ /** Read all installed themes (manifest re-read from disk), skipping broken ones. */
47
+ export declare function listInstalledThemes(): Promise<InstalledTheme[]>;
48
+ /** Remove an installed theme and its registry entry. */
49
+ export declare function uninstallTheme(id: string): Promise<void>;
50
+ export {};
@@ -0,0 +1,290 @@
1
+ /**
2
+ * Theme-pack installer: validate → normalize → atomically install a local theme
3
+ * pack into ~/.code-shell/themes/<id>/, and read/uninstall installed packs.
4
+ *
5
+ * Mirrors the plugin installer's discipline (safe names, canonical asset paths,
6
+ * review-token double-check, temp-dir + rename atomicity) but is deliberately
7
+ * self-contained and static-only: a theme pack is a manifest + images, never
8
+ * executable content, so there are no hooks/mcp/skills to approve.
9
+ */
10
+ import { createHash, randomUUID } from "node:crypto";
11
+ import { mkdir, mkdtemp, readFile, readdir, realpath, rename, rm, stat, writeFile, } from "node:fs/promises";
12
+ import { dirname, join, resolve } from "node:path";
13
+ import { detectThemeImage } from "./image.js";
14
+ import { parseThemeManifest } from "./manifest.js";
15
+ import { THEME_ASSET_DIR, ThemeInstallError, ThemeReviewChangedError, assertSafeThemeName, themeInstallDir, themesRegistryPath, themesRoot, } from "./paths.js";
16
+ const MANIFEST_FILE = ".cs-theme.json";
17
+ const MAX_ASSET_BYTES = 8 * 1024 * 1024;
18
+ async function readImageAsset(sourceDir, rel) {
19
+ const abs = resolve(sourceDir, rel);
20
+ if (!abs.startsWith(resolve(sourceDir) + "/") && abs !== resolve(sourceDir)) {
21
+ throw new ThemeInstallError(`asset escapes theme root: ${rel}`);
22
+ }
23
+ // The string check above stops literal traversal, but not a symlink INSIDE
24
+ // the pack pointing at an arbitrary file outside it. Resolve real paths and
25
+ // require the asset to physically live under the pack root, or a malicious
26
+ // pack could exfiltrate any readable file that happens to be a valid image.
27
+ let realRoot;
28
+ let realAbs;
29
+ try {
30
+ realRoot = await realpath(sourceDir);
31
+ realAbs = await realpath(abs);
32
+ }
33
+ catch {
34
+ throw new ThemeInstallError(`asset not found: ${rel}`);
35
+ }
36
+ if (realAbs !== realRoot && !realAbs.startsWith(realRoot + "/")) {
37
+ throw new ThemeInstallError(`asset escapes theme root via symlink: ${rel}`);
38
+ }
39
+ let info;
40
+ try {
41
+ info = await stat(realAbs);
42
+ }
43
+ catch {
44
+ throw new ThemeInstallError(`asset not found: ${rel}`);
45
+ }
46
+ if (!info.isFile())
47
+ throw new ThemeInstallError(`asset is not a file: ${rel}`);
48
+ if (info.size > MAX_ASSET_BYTES)
49
+ throw new ThemeInstallError(`asset too large: ${rel}`);
50
+ const bytes = await readFile(realAbs);
51
+ const detected = detectThemeImage(bytes);
52
+ if (!detected)
53
+ throw new ThemeInstallError(`asset is not a supported image: ${rel}`);
54
+ return { bytes, ext: detected.ext };
55
+ }
56
+ /** Collect the declared assets, validating each, into canonical-name mappings. */
57
+ async function resolveAssets(sourceDir, manifest) {
58
+ const assets = [];
59
+ const bytesByName = new Map();
60
+ const add = async (rel, base) => {
61
+ if (!rel)
62
+ return;
63
+ const { bytes, ext } = await readImageAsset(sourceDir, rel);
64
+ const canonicalName = `${base}.${ext}`;
65
+ assets.push({ sourceRel: rel, canonicalName });
66
+ bytesByName.set(canonicalName, bytes);
67
+ };
68
+ await add(manifest.pet?.idle, "pet-idle");
69
+ await add(manifest.pet?.running, "pet-running");
70
+ await add(manifest.pet?.alert, "pet-alert");
71
+ for (let i = 0; i < (manifest.pet?.walk?.length ?? 0); i += 1) {
72
+ await add(manifest.pet.walk[i], `pet-walk-${i + 1}`);
73
+ }
74
+ await add(manifest.wallpaper?.light, "wallpaper-light");
75
+ await add(manifest.wallpaper?.dark, "wallpaper-dark");
76
+ return { assets, bytesByName };
77
+ }
78
+ /** Deterministic digest over manifest + every canonical asset's bytes. */
79
+ function digestProjection(manifest, bytesByName) {
80
+ const hash = createHash("sha256");
81
+ hash.update(JSON.stringify(manifest));
82
+ for (const name of [...bytesByName.keys()].sort()) {
83
+ hash.update(name);
84
+ hash.update(bytesByName.get(name));
85
+ }
86
+ return hash.digest("hex");
87
+ }
88
+ async function loadManifest(sourceDir) {
89
+ let raw;
90
+ try {
91
+ raw = await readFile(join(sourceDir, MANIFEST_FILE), "utf-8");
92
+ }
93
+ catch {
94
+ throw new ThemeInstallError(`missing ${MANIFEST_FILE}`);
95
+ }
96
+ let json;
97
+ try {
98
+ json = JSON.parse(raw);
99
+ }
100
+ catch {
101
+ throw new ThemeInstallError(`${MANIFEST_FILE} is not valid JSON`);
102
+ }
103
+ return parseThemeManifest(json);
104
+ }
105
+ function previewOf(manifest, bytesByName, warnings) {
106
+ const petStates = ["idle", "running", "alert"].filter((s) => manifest.pet?.[s]);
107
+ const wallpaperModes = ["light", "dark"].filter((m) => manifest.wallpaper?.[m]);
108
+ return {
109
+ id: manifest.id,
110
+ name: manifest.name,
111
+ version: manifest.version,
112
+ hasColors: Boolean((manifest.colors?.light && Object.keys(manifest.colors.light).length) ||
113
+ (manifest.colors?.dark && Object.keys(manifest.colors.dark).length)),
114
+ petStates: [...petStates],
115
+ wallpaperModes: [...wallpaperModes],
116
+ ...((manifest.colors?.light?.["--cs-primary"] ?? manifest.colors?.dark?.["--cs-primary"])
117
+ ? {
118
+ swatch: (manifest.colors?.light?.["--cs-primary"] ??
119
+ manifest.colors?.dark?.["--cs-primary"]),
120
+ }
121
+ : {}),
122
+ reviewToken: digestProjection(manifest, bytesByName),
123
+ warnings,
124
+ };
125
+ }
126
+ /**
127
+ * Validate a theme pack directory and return a preview + review-token. Does not
128
+ * write anything. `sourceDir` is a directory (a zip is extracted to a temp dir
129
+ * by the caller before calling this).
130
+ */
131
+ export async function previewLocalTheme(sourceDir) {
132
+ const manifest = await loadManifest(sourceDir);
133
+ assertSafeThemeName(manifest.id);
134
+ const warnings = [];
135
+ if (!manifest.colors && !manifest.pet && !manifest.wallpaper) {
136
+ warnings.push("theme declares no colors, pet sprites, or wallpaper");
137
+ }
138
+ const { bytesByName } = await resolveAssets(sourceDir, manifest);
139
+ return previewOf(manifest, bytesByName, warnings);
140
+ }
141
+ /**
142
+ * Install a previously previewed theme. Re-validates and re-checks the token
143
+ * (rejecting mid-review changes), then atomically writes the theme to
144
+ * ~/.code-shell/themes/<id>/ and records it in the registry.
145
+ */
146
+ export async function installReviewedLocalTheme(sourceDir, reviewToken) {
147
+ const manifest = await loadManifest(sourceDir);
148
+ assertSafeThemeName(manifest.id);
149
+ const { assets, bytesByName } = await resolveAssets(sourceDir, manifest);
150
+ if (digestProjection(manifest, bytesByName) !== reviewToken)
151
+ throw new ThemeReviewChangedError();
152
+ const finalDir = themeInstallDir(manifest.id);
153
+ await mkdir(themesRoot(), { recursive: true, mode: 0o700 });
154
+ const staging = await mkdtemp(join(themesRoot(), `.tmp-${manifest.id}-`));
155
+ try {
156
+ // Rewrite the manifest to canonical asset paths, then stage assets.
157
+ const canonical = canonicalManifestFor(manifest, assets);
158
+ await writeFile(join(staging, MANIFEST_FILE), `${JSON.stringify(canonical, null, 2)}\n`, {
159
+ mode: 0o600,
160
+ });
161
+ await mkdir(join(staging, THEME_ASSET_DIR), { recursive: true, mode: 0o700 });
162
+ for (const asset of assets) {
163
+ await writeFile(join(staging, THEME_ASSET_DIR, asset.canonicalName), bytesByName.get(asset.canonicalName), {
164
+ mode: 0o600,
165
+ });
166
+ }
167
+ await rm(finalDir, { recursive: true, force: true });
168
+ await rename(staging, finalDir);
169
+ }
170
+ catch (error) {
171
+ await rm(staging, { recursive: true, force: true }).catch(() => undefined);
172
+ throw error;
173
+ }
174
+ await appendRegistryEntry({
175
+ id: manifest.id,
176
+ name: manifest.name,
177
+ version: manifest.version,
178
+ installedAt: Date.now(),
179
+ });
180
+ return toInstalledTheme(canonicalManifestFor(manifest, assets));
181
+ }
182
+ /** Canonical manifest stored on disk: asset fields point at THEME_ASSET_DIR/*. */
183
+ function canonicalManifestFor(manifest, assets) {
184
+ const nameFor = (base) => assets.find((a) => a.canonicalName.startsWith(`${base}.`))?.canonicalName;
185
+ const rel = (base) => {
186
+ const n = nameFor(base);
187
+ return n ? `${THEME_ASSET_DIR}/${n}` : undefined;
188
+ };
189
+ const walk = (manifest.pet?.walk ?? [])
190
+ .map((_, i) => rel(`pet-walk-${i + 1}`))
191
+ .filter((p) => Boolean(p));
192
+ const pet = manifest.pet
193
+ ? {
194
+ ...(rel("pet-idle") ? { idle: rel("pet-idle") } : {}),
195
+ ...(rel("pet-running") ? { running: rel("pet-running") } : {}),
196
+ ...(rel("pet-alert") ? { alert: rel("pet-alert") } : {}),
197
+ ...(walk.length ? { walk } : {}),
198
+ }
199
+ : undefined;
200
+ const wallpaper = manifest.wallpaper
201
+ ? {
202
+ ...(rel("wallpaper-light") ? { light: rel("wallpaper-light") } : {}),
203
+ ...(rel("wallpaper-dark") ? { dark: rel("wallpaper-dark") } : {}),
204
+ ...(manifest.wallpaper.opacity !== undefined
205
+ ? { opacity: manifest.wallpaper.opacity }
206
+ : {}),
207
+ }
208
+ : undefined;
209
+ return {
210
+ schemaVersion: 1,
211
+ id: manifest.id,
212
+ name: manifest.name,
213
+ version: manifest.version,
214
+ ...(manifest.colors ? { colors: manifest.colors } : {}),
215
+ ...(pet && Object.keys(pet).length ? { pet } : {}),
216
+ ...(wallpaper && Object.keys(wallpaper).length ? { wallpaper } : {}),
217
+ };
218
+ }
219
+ function toInstalledTheme(manifest) {
220
+ return {
221
+ id: manifest.id,
222
+ name: manifest.name,
223
+ version: manifest.version,
224
+ colors: { light: manifest.colors?.light ?? {}, dark: manifest.colors?.dark ?? {} },
225
+ pet: {
226
+ ...(manifest.pet?.idle ? { idle: manifest.pet.idle } : {}),
227
+ ...(manifest.pet?.running ? { running: manifest.pet.running } : {}),
228
+ ...(manifest.pet?.alert ? { alert: manifest.pet.alert } : {}),
229
+ ...(manifest.pet?.walk?.length ? { walk: manifest.pet.walk } : {}),
230
+ },
231
+ ...(manifest.wallpaper ? { wallpaper: manifest.wallpaper } : {}),
232
+ };
233
+ }
234
+ async function readRegistry() {
235
+ try {
236
+ const raw = await readFile(themesRegistryPath(), "utf-8");
237
+ const parsed = JSON.parse(raw);
238
+ if (parsed?.version === 1 && Array.isArray(parsed.themes))
239
+ return parsed;
240
+ }
241
+ catch {
242
+ /* missing/corrupt → empty */
243
+ }
244
+ return { version: 1, themes: [] };
245
+ }
246
+ async function writeRegistry(registry) {
247
+ await mkdir(dirname(themesRegistryPath()), { recursive: true, mode: 0o700 });
248
+ const tmp = `${themesRegistryPath()}.${process.pid}.${randomUUID()}.tmp`;
249
+ await writeFile(tmp, `${JSON.stringify(registry, null, 2)}\n`, { mode: 0o600 });
250
+ await rename(tmp, themesRegistryPath());
251
+ }
252
+ async function appendRegistryEntry(entry) {
253
+ const registry = await readRegistry();
254
+ registry.themes = registry.themes.filter((t) => t.id !== entry.id);
255
+ registry.themes.push(entry);
256
+ await writeRegistry(registry);
257
+ }
258
+ /** Read all installed themes (manifest re-read from disk), skipping broken ones. */
259
+ export async function listInstalledThemes() {
260
+ let ids;
261
+ try {
262
+ const entries = await readdir(themesRoot(), { withFileTypes: true });
263
+ ids = entries.filter((e) => e.isDirectory() && !e.name.startsWith(".")).map((e) => e.name);
264
+ }
265
+ catch {
266
+ return [];
267
+ }
268
+ const themes = [];
269
+ for (const id of ids) {
270
+ try {
271
+ assertSafeThemeName(id);
272
+ const manifest = await loadManifest(themeInstallDir(id));
273
+ if (manifest.id !== id)
274
+ continue; // dir name must match manifest id
275
+ themes.push(toInstalledTheme(manifest));
276
+ }
277
+ catch {
278
+ /* skip a corrupt/foreign directory */
279
+ }
280
+ }
281
+ return themes;
282
+ }
283
+ /** Remove an installed theme and its registry entry. */
284
+ export async function uninstallTheme(id) {
285
+ assertSafeThemeName(id);
286
+ await rm(themeInstallDir(id), { recursive: true, force: true });
287
+ const registry = await readRegistry();
288
+ registry.themes = registry.themes.filter((t) => t.id !== id);
289
+ await writeRegistry(registry);
290
+ }
@@ -0,0 +1,102 @@
1
+ import { z } from "zod";
2
+ /**
3
+ * Theme-pack manifest (`.cs-theme.json`) schema and validation.
4
+ *
5
+ * A pack may override app colors (a whitelisted subset of `--cs-*`, unitless
6
+ * HSL), supply per-state pet sprites, and a light/dark wallpaper. All three are
7
+ * optional — a pack can recolor only, reskin the pet only, etc. Image fields
8
+ * declare author-relative paths that the installer validates and renames to a
9
+ * canonical layout; the manifest here only checks shape, not the image bytes.
10
+ */
11
+ /** Overridable CSS variables — must stay in sync with the renderer whitelist. */
12
+ export declare const THEME_VAR_NAMES: readonly ["--cs-background", "--cs-foreground", "--cs-card", "--cs-card-foreground", "--cs-popover", "--cs-popover-foreground", "--cs-primary", "--cs-primary-foreground", "--cs-secondary", "--cs-secondary-foreground", "--cs-muted", "--cs-muted-foreground", "--cs-accent", "--cs-accent-foreground", "--cs-destructive", "--cs-destructive-foreground", "--cs-border", "--cs-input", "--cs-ring", "--cs-status-running", "--cs-status-ok", "--cs-status-warn", "--cs-status-err", "--cs-status-idle"];
13
+ export declare const THEME_ID: RegExp;
14
+ export declare const ThemeManifestSchema: z.ZodObject<{
15
+ schemaVersion: z.ZodLiteral<1>;
16
+ id: z.ZodString;
17
+ name: z.ZodString;
18
+ version: z.ZodString;
19
+ colors: z.ZodOptional<z.ZodObject<{
20
+ light: z.ZodOptional<z.ZodEffects<z.ZodEffects<z.ZodRecord<z.ZodString, z.ZodString>, Record<string, string>, Record<string, string>>, Record<string, string>, Record<string, string>>>;
21
+ dark: z.ZodOptional<z.ZodEffects<z.ZodEffects<z.ZodRecord<z.ZodString, z.ZodString>, Record<string, string>, Record<string, string>>, Record<string, string>, Record<string, string>>>;
22
+ }, "strip", z.ZodTypeAny, {
23
+ light?: Record<string, string> | undefined;
24
+ dark?: Record<string, string> | undefined;
25
+ }, {
26
+ light?: Record<string, string> | undefined;
27
+ dark?: Record<string, string> | undefined;
28
+ }>>;
29
+ pet: z.ZodOptional<z.ZodObject<{
30
+ idle: z.ZodOptional<z.ZodEffects<z.ZodString, string, string>>;
31
+ running: z.ZodOptional<z.ZodEffects<z.ZodString, string, string>>;
32
+ alert: z.ZodOptional<z.ZodEffects<z.ZodString, string, string>>;
33
+ /** Ordered frames cycled while the widget is dragged (a "run" loop). */
34
+ walk: z.ZodOptional<z.ZodArray<z.ZodEffects<z.ZodString, string, string>, "many">>;
35
+ }, "strip", z.ZodTypeAny, {
36
+ running?: string | undefined;
37
+ idle?: string | undefined;
38
+ alert?: string | undefined;
39
+ walk?: string[] | undefined;
40
+ }, {
41
+ running?: string | undefined;
42
+ idle?: string | undefined;
43
+ alert?: string | undefined;
44
+ walk?: string[] | undefined;
45
+ }>>;
46
+ wallpaper: z.ZodOptional<z.ZodObject<{
47
+ light: z.ZodOptional<z.ZodEffects<z.ZodString, string, string>>;
48
+ dark: z.ZodOptional<z.ZodEffects<z.ZodString, string, string>>;
49
+ opacity: z.ZodOptional<z.ZodNumber>;
50
+ }, "strip", z.ZodTypeAny, {
51
+ light?: string | undefined;
52
+ dark?: string | undefined;
53
+ opacity?: number | undefined;
54
+ }, {
55
+ light?: string | undefined;
56
+ dark?: string | undefined;
57
+ opacity?: number | undefined;
58
+ }>>;
59
+ }, "strip", z.ZodTypeAny, {
60
+ id: string;
61
+ version: string;
62
+ name: string;
63
+ schemaVersion: 1;
64
+ pet?: {
65
+ running?: string | undefined;
66
+ idle?: string | undefined;
67
+ alert?: string | undefined;
68
+ walk?: string[] | undefined;
69
+ } | undefined;
70
+ colors?: {
71
+ light?: Record<string, string> | undefined;
72
+ dark?: Record<string, string> | undefined;
73
+ } | undefined;
74
+ wallpaper?: {
75
+ light?: string | undefined;
76
+ dark?: string | undefined;
77
+ opacity?: number | undefined;
78
+ } | undefined;
79
+ }, {
80
+ id: string;
81
+ version: string;
82
+ name: string;
83
+ schemaVersion: 1;
84
+ pet?: {
85
+ running?: string | undefined;
86
+ idle?: string | undefined;
87
+ alert?: string | undefined;
88
+ walk?: string[] | undefined;
89
+ } | undefined;
90
+ colors?: {
91
+ light?: Record<string, string> | undefined;
92
+ dark?: Record<string, string> | undefined;
93
+ } | undefined;
94
+ wallpaper?: {
95
+ light?: string | undefined;
96
+ dark?: string | undefined;
97
+ opacity?: number | undefined;
98
+ } | undefined;
99
+ }>;
100
+ export type ThemeManifest = z.infer<typeof ThemeManifestSchema>;
101
+ /** Parse + validate a raw `.cs-theme.json` object. Throws ZodError on invalid input. */
102
+ export declare function parseThemeManifest(raw: unknown): ThemeManifest;
@@ -0,0 +1,86 @@
1
+ import { z } from "zod";
2
+ /**
3
+ * Theme-pack manifest (`.cs-theme.json`) schema and validation.
4
+ *
5
+ * A pack may override app colors (a whitelisted subset of `--cs-*`, unitless
6
+ * HSL), supply per-state pet sprites, and a light/dark wallpaper. All three are
7
+ * optional — a pack can recolor only, reskin the pet only, etc. Image fields
8
+ * declare author-relative paths that the installer validates and renames to a
9
+ * canonical layout; the manifest here only checks shape, not the image bytes.
10
+ */
11
+ /** Overridable CSS variables — must stay in sync with the renderer whitelist. */
12
+ export const THEME_VAR_NAMES = [
13
+ "--cs-background",
14
+ "--cs-foreground",
15
+ "--cs-card",
16
+ "--cs-card-foreground",
17
+ "--cs-popover",
18
+ "--cs-popover-foreground",
19
+ "--cs-primary",
20
+ "--cs-primary-foreground",
21
+ "--cs-secondary",
22
+ "--cs-secondary-foreground",
23
+ "--cs-muted",
24
+ "--cs-muted-foreground",
25
+ "--cs-accent",
26
+ "--cs-accent-foreground",
27
+ "--cs-destructive",
28
+ "--cs-destructive-foreground",
29
+ "--cs-border",
30
+ "--cs-input",
31
+ "--cs-ring",
32
+ "--cs-status-running",
33
+ "--cs-status-ok",
34
+ "--cs-status-warn",
35
+ "--cs-status-err",
36
+ "--cs-status-idle",
37
+ ];
38
+ const VAR_SET = new Set(THEME_VAR_NAMES);
39
+ /** Unitless HSL triple, e.g. "19 63% 45%". */
40
+ const HSL = /^\d+(?:\.\d+)?\s+\d+(?:\.\d+)?%\s+\d+(?:\.\d+)?%$/;
41
+ const ThemeVarsSchema = z
42
+ .record(z.string())
43
+ .refine((vars) => Object.keys(vars).every((name) => VAR_SET.has(name)), {
44
+ message: "unknown --cs-* variable (not in the theme whitelist)",
45
+ })
46
+ .refine((vars) => Object.values(vars).every((value) => HSL.test(value)), {
47
+ message: "color values must be unitless HSL triples like '19 63% 45%'",
48
+ });
49
+ /** A single safe path segment — no traversal, separators, or NUL. */
50
+ const RELATIVE_ASSET = z
51
+ .string()
52
+ .min(1)
53
+ .refine((p) => !p.includes("\0") &&
54
+ !p.includes("\\") &&
55
+ !p.startsWith("/") &&
56
+ !p.split("/").some((seg) => seg === "" || seg === "." || seg === ".."), { message: "asset path must be a relative path with no traversal" });
57
+ export const THEME_ID = /^[a-z0-9][a-z0-9-]{1,63}$/;
58
+ export const ThemeManifestSchema = z.object({
59
+ schemaVersion: z.literal(1),
60
+ id: z.string().regex(THEME_ID, "id must match ^[a-z0-9][a-z0-9-]{1,63}$"),
61
+ name: z.string().min(1).max(80),
62
+ version: z.string().min(1).max(32),
63
+ colors: z
64
+ .object({ light: ThemeVarsSchema.optional(), dark: ThemeVarsSchema.optional() })
65
+ .optional(),
66
+ pet: z
67
+ .object({
68
+ idle: RELATIVE_ASSET.optional(),
69
+ running: RELATIVE_ASSET.optional(),
70
+ alert: RELATIVE_ASSET.optional(),
71
+ /** Ordered frames cycled while the widget is dragged (a "run" loop). */
72
+ walk: z.array(RELATIVE_ASSET).max(16).optional(),
73
+ })
74
+ .optional(),
75
+ wallpaper: z
76
+ .object({
77
+ light: RELATIVE_ASSET.optional(),
78
+ dark: RELATIVE_ASSET.optional(),
79
+ opacity: z.number().min(0).max(1).optional(),
80
+ })
81
+ .optional(),
82
+ });
83
+ /** Parse + validate a raw `.cs-theme.json` object. Throws ZodError on invalid input. */
84
+ export function parseThemeManifest(raw) {
85
+ return ThemeManifestSchema.parse(raw);
86
+ }
@@ -0,0 +1,14 @@
1
+ export declare class ThemeInstallError extends Error {
2
+ }
3
+ /** A review token changed between preview and install (content was modified). */
4
+ export declare class ThemeReviewChangedError extends ThemeInstallError {
5
+ constructor();
6
+ }
7
+ /** A theme id must be a single safe path segment matching the manifest pattern. */
8
+ export declare function assertSafeThemeName(id: string): void;
9
+ export declare function themesRoot(): string;
10
+ export declare function themeInstallDir(id: string): string;
11
+ /** Canonical asset subdirectory inside an installed theme. */
12
+ export declare const THEME_ASSET_DIR = ".cs-theme-assets";
13
+ /** Registry of installed themes. */
14
+ export declare function themesRegistryPath(): string;
@@ -0,0 +1,33 @@
1
+ import { homedir } from "node:os";
2
+ import { join } from "node:path";
3
+ import { THEME_ID } from "./manifest.js";
4
+ export class ThemeInstallError extends Error {
5
+ }
6
+ /** A review token changed between preview and install (content was modified). */
7
+ export class ThemeReviewChangedError extends ThemeInstallError {
8
+ constructor() {
9
+ super("theme content changed since preview");
10
+ }
11
+ }
12
+ function userHome() {
13
+ return process.env.CODE_SHELL_HOME ?? process.env.HOME ?? homedir();
14
+ }
15
+ /** A theme id must be a single safe path segment matching the manifest pattern. */
16
+ export function assertSafeThemeName(id) {
17
+ if (!THEME_ID.test(id) || id === "." || id === "..") {
18
+ throw new ThemeInstallError(`invalid theme id: ${JSON.stringify(id)}`);
19
+ }
20
+ }
21
+ export function themesRoot() {
22
+ return join(userHome(), ".code-shell", "themes");
23
+ }
24
+ export function themeInstallDir(id) {
25
+ assertSafeThemeName(id);
26
+ return join(themesRoot(), id);
27
+ }
28
+ /** Canonical asset subdirectory inside an installed theme. */
29
+ export const THEME_ASSET_DIR = ".cs-theme-assets";
30
+ /** Registry of installed themes. */
31
+ export function themesRegistryPath() {
32
+ return join(themesRoot(), "installed.json");
33
+ }