@cjhyy/code-shell-core 0.7.1 → 0.8.0

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 (594) 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/permission.d.ts +26 -0
  374. package/dist/tool-system/permission.js +46 -0
  375. package/dist/tool-system/registry.d.ts +12 -1
  376. package/dist/tool-system/registry.js +31 -7
  377. package/dist/tool-system/sandbox/index.js +3 -8
  378. package/dist/tool-system/sandbox/seatbelt.js +2 -6
  379. package/dist/tool-system/session-tool-host.d.ts +139 -0
  380. package/dist/tool-system/session-tool-host.js +167 -0
  381. package/dist/tool-system/testing/tool-registry-harness.d.ts +31 -0
  382. package/dist/tool-system/testing/tool-registry-harness.js +51 -0
  383. package/dist/tool-system/validation.d.ts +14 -7
  384. package/dist/tool-system/validation.js +701 -7
  385. package/dist/types.d.ts +186 -20
  386. package/dist/{cc-orchestrator → utils}/cwd-normalize.d.ts +1 -0
  387. package/dist/{cc-orchestrator → utils}/cwd-normalize.js +1 -0
  388. package/dist/utils/file-mutex.d.ts +65 -0
  389. package/dist/utils/file-mutex.js +145 -0
  390. package/dist/utils/json.d.ts +2 -4
  391. package/dist/utils/json.js +2 -4
  392. package/dist/utils/lockfile.d.ts +30 -1
  393. package/dist/utils/lockfile.js +2 -2
  394. package/dist/utils/secret-scrubber.d.ts +8 -0
  395. package/dist/utils/secret-scrubber.js +227 -0
  396. package/dist/utils/toolDisplay.js +1 -1
  397. package/package.json +20 -5
  398. package/THIRD_PARTY_NOTICES.md +0 -206
  399. package/dist/arena/arena.d.ts +0 -45
  400. package/dist/arena/arena.js +0 -362
  401. package/dist/arena/context/context-tools.d.ts +0 -16
  402. package/dist/arena/context/context-tools.js +0 -272
  403. package/dist/arena/context/within-root.d.ts +0 -7
  404. package/dist/arena/context/within-root.js +0 -15
  405. package/dist/arena/detect-mode.d.ts +0 -20
  406. package/dist/arena/detect-mode.js +0 -78
  407. package/dist/arena/digest-builder.d.ts +0 -25
  408. package/dist/arena/digest-builder.js +0 -120
  409. package/dist/arena/index.d.ts +0 -29
  410. package/dist/arena/index.js +0 -29
  411. package/dist/arena/iterate/convergence.d.ts +0 -25
  412. package/dist/arena/iterate/convergence.js +0 -103
  413. package/dist/arena/iterate/formats/index.d.ts +0 -22
  414. package/dist/arena/iterate/formats/index.js +0 -283
  415. package/dist/arena/iterate/index.d.ts +0 -11
  416. package/dist/arena/iterate/index.js +0 -9
  417. package/dist/arena/iterate/iterative-arena.d.ts +0 -23
  418. package/dist/arena/iterate/iterative-arena.js +0 -237
  419. package/dist/arena/iterate/parse.d.ts +0 -42
  420. package/dist/arena/iterate/parse.js +0 -123
  421. package/dist/arena/iterate/phases/argue.d.ts +0 -22
  422. package/dist/arena/iterate/phases/argue.js +0 -165
  423. package/dist/arena/iterate/phases/revise.d.ts +0 -16
  424. package/dist/arena/iterate/phases/revise.js +0 -62
  425. package/dist/arena/iterate/phases/tournament.d.ts +0 -34
  426. package/dist/arena/iterate/phases/tournament.js +0 -113
  427. package/dist/arena/iterate/tools/web-tools.d.ts +0 -13
  428. package/dist/arena/iterate/tools/web-tools.js +0 -54
  429. package/dist/arena/iterate/types.d.ts +0 -152
  430. package/dist/arena/iterate/types.js +0 -8
  431. package/dist/arena/ledger.d.ts +0 -47
  432. package/dist/arena/ledger.js +0 -159
  433. package/dist/arena/lenses/architecture.d.ts +0 -5
  434. package/dist/arena/lenses/architecture.js +0 -22
  435. package/dist/arena/lenses/engineering.d.ts +0 -5
  436. package/dist/arena/lenses/engineering.js +0 -22
  437. package/dist/arena/lenses/general.d.ts +0 -5
  438. package/dist/arena/lenses/general.js +0 -20
  439. package/dist/arena/lenses/index.d.ts +0 -16
  440. package/dist/arena/lenses/index.js +0 -47
  441. package/dist/arena/lenses/product.d.ts +0 -5
  442. package/dist/arena/lenses/product.js +0 -22
  443. package/dist/arena/model-presets.d.ts +0 -23
  444. package/dist/arena/model-presets.js +0 -44
  445. package/dist/arena/phases/adjudication.d.ts +0 -25
  446. package/dist/arena/phases/adjudication.js +0 -142
  447. package/dist/arena/phases/build-consensus.d.ts +0 -30
  448. package/dist/arena/phases/build-consensus.js +0 -85
  449. package/dist/arena/phases/claim-registry.d.ts +0 -26
  450. package/dist/arena/phases/claim-registry.js +0 -60
  451. package/dist/arena/phases/cross-review.d.ts +0 -47
  452. package/dist/arena/phases/cross-review.js +0 -224
  453. package/dist/arena/phases/debate-rounds.d.ts +0 -28
  454. package/dist/arena/phases/debate-rounds.js +0 -161
  455. package/dist/arena/phases/participant-research.d.ts +0 -39
  456. package/dist/arena/phases/participant-research.js +0 -316
  457. package/dist/arena/phases/planning-detail-expansion.d.ts +0 -39
  458. package/dist/arena/phases/planning-detail-expansion.js +0 -120
  459. package/dist/arena/planner.d.ts +0 -28
  460. package/dist/arena/planner.js +0 -312
  461. package/dist/arena/providers/docs.d.ts +0 -7
  462. package/dist/arena/providers/docs.js +0 -111
  463. package/dist/arena/providers/git.d.ts +0 -8
  464. package/dist/arena/providers/git.js +0 -174
  465. package/dist/arena/providers/index.d.ts +0 -32
  466. package/dist/arena/providers/index.js +0 -132
  467. package/dist/arena/providers/none.d.ts +0 -7
  468. package/dist/arena/providers/none.js +0 -11
  469. package/dist/arena/providers/repo.d.ts +0 -7
  470. package/dist/arena/providers/repo.js +0 -258
  471. package/dist/arena/render/session.d.ts +0 -17
  472. package/dist/arena/render/session.js +0 -190
  473. package/dist/arena/render/terminal.d.ts +0 -34
  474. package/dist/arena/render/terminal.js +0 -286
  475. package/dist/arena/strategies/discussion.d.ts +0 -25
  476. package/dist/arena/strategies/discussion.js +0 -143
  477. package/dist/arena/strategies/index.d.ts +0 -15
  478. package/dist/arena/strategies/index.js +0 -28
  479. package/dist/arena/strategies/language-wrapper.d.ts +0 -17
  480. package/dist/arena/strategies/language-wrapper.js +0 -102
  481. package/dist/arena/strategies/lens-wrapper.d.ts +0 -16
  482. package/dist/arena/strategies/lens-wrapper.js +0 -236
  483. package/dist/arena/strategies/planning.d.ts +0 -30
  484. package/dist/arena/strategies/planning.js +0 -225
  485. package/dist/arena/strategies/review.d.ts +0 -26
  486. package/dist/arena/strategies/review.js +0 -168
  487. package/dist/arena/strategies/utils.d.ts +0 -36
  488. package/dist/arena/strategies/utils.js +0 -603
  489. package/dist/arena/tools/selector.d.ts +0 -17
  490. package/dist/arena/tools/selector.js +0 -61
  491. package/dist/arena/transitions.d.ts +0 -53
  492. package/dist/arena/transitions.js +0 -97
  493. package/dist/arena/types.d.ts +0 -518
  494. package/dist/arena/types.js +0 -27
  495. package/dist/cc-orchestrator/agent-adapter.d.ts +0 -54
  496. package/dist/cc-orchestrator/agent-adapter.js +0 -143
  497. package/dist/cc-orchestrator/cc-capability.d.ts +0 -19
  498. package/dist/cc-orchestrator/cc-capability.js +0 -53
  499. package/dist/cc-orchestrator/codex-session-discovery.d.ts +0 -24
  500. package/dist/cc-orchestrator/codex-session-discovery.js +0 -191
  501. package/dist/cc-orchestrator/codex-session-history.d.ts +0 -38
  502. package/dist/cc-orchestrator/codex-session-history.js +0 -247
  503. package/dist/cc-orchestrator/external-agent-bindings.d.ts +0 -27
  504. package/dist/cc-orchestrator/external-agent-bindings.js +0 -150
  505. package/dist/cc-orchestrator/external-agent-changes.d.ts +0 -19
  506. package/dist/cc-orchestrator/external-agent-changes.js +0 -231
  507. package/dist/cc-orchestrator/external-agent-driver.d.ts +0 -19
  508. package/dist/cc-orchestrator/external-agent-driver.js +0 -284
  509. package/dist/cc-orchestrator/external-agent-session-store.d.ts +0 -23
  510. package/dist/cc-orchestrator/external-agent-session-store.js +0 -146
  511. package/dist/cc-orchestrator/index.d.ts +0 -8
  512. package/dist/cc-orchestrator/index.js +0 -8
  513. package/dist/cc-orchestrator/relevance-judge.d.ts +0 -15
  514. package/dist/cc-orchestrator/relevance-judge.js +0 -29
  515. package/dist/cc-orchestrator/session-discovery.d.ts +0 -46
  516. package/dist/cc-orchestrator/session-discovery.js +0 -125
  517. package/dist/cc-orchestrator/session-history.d.ts +0 -54
  518. package/dist/cc-orchestrator/session-history.js +0 -150
  519. package/dist/cron/cron-runtime.d.ts +0 -2
  520. package/dist/cron/cron-runtime.js +0 -2
  521. package/dist/cron/cron-store.d.ts +0 -2
  522. package/dist/cron/cron-store.js +0 -2
  523. package/dist/cron/scheduler.d.ts +0 -7
  524. package/dist/cron/scheduler.js +0 -7
  525. package/dist/engine/goal.js +0 -206
  526. package/dist/external-agents/config.d.ts +0 -2
  527. package/dist/external-agents/config.js +0 -15
  528. package/dist/external-agents/types.d.ts +0 -31
  529. package/dist/git/parse-log.d.ts +0 -13
  530. package/dist/git/parse-log.js +0 -21
  531. package/dist/git/utils.d.ts +0 -49
  532. package/dist/git/utils.js +0 -161
  533. package/dist/git/worktree/crud.d.ts +0 -72
  534. package/dist/git/worktree/crud.js +0 -235
  535. package/dist/git/worktree/diff.d.ts +0 -14
  536. package/dist/git/worktree/diff.js +0 -82
  537. package/dist/git/worktree/git-exec.d.ts +0 -7
  538. package/dist/git/worktree/git-exec.js +0 -87
  539. package/dist/git/worktree/index.d.ts +0 -5
  540. package/dist/git/worktree/index.js +0 -5
  541. package/dist/git/worktree/query.d.ts +0 -43
  542. package/dist/git/worktree/query.js +0 -128
  543. package/dist/git/worktree/slug.d.ts +0 -11
  544. package/dist/git/worktree/slug.js +0 -58
  545. package/dist/git/worktree.d.ts +0 -1
  546. package/dist/git/worktree.js +0 -5
  547. package/dist/lsp/client.d.ts +0 -41
  548. package/dist/lsp/client.js +0 -186
  549. package/dist/lsp/manager.d.ts +0 -40
  550. package/dist/lsp/manager.js +0 -155
  551. package/dist/lsp/root-path.d.ts +0 -9
  552. package/dist/lsp/root-path.js +0 -12
  553. package/dist/lsp/servers.d.ts +0 -16
  554. package/dist/lsp/servers.js +0 -60
  555. package/dist/prompt/sections/coding.md +0 -35
  556. package/dist/quota/credentials.d.ts +0 -3
  557. package/dist/quota/credentials.js +0 -80
  558. package/dist/quota/index.d.ts +0 -36
  559. package/dist/quota/index.js +0 -155
  560. package/dist/quota/types.d.ts +0 -48
  561. package/dist/quota/types.js +0 -13
  562. package/dist/review/review-prompt.d.ts +0 -28
  563. package/dist/review/review-prompt.js +0 -81
  564. package/dist/state.d.ts +0 -160
  565. package/dist/state.js +0 -267
  566. package/dist/tool-system/builtin/apply-patch/applier.d.ts +0 -26
  567. package/dist/tool-system/builtin/apply-patch/applier.js +0 -308
  568. package/dist/tool-system/builtin/apply-patch/backup-targets.d.ts +0 -10
  569. package/dist/tool-system/builtin/apply-patch/backup-targets.js +0 -30
  570. package/dist/tool-system/builtin/apply-patch/index.d.ts +0 -20
  571. package/dist/tool-system/builtin/apply-patch/index.js +0 -105
  572. package/dist/tool-system/builtin/apply-patch/parser.d.ts +0 -17
  573. package/dist/tool-system/builtin/apply-patch/parser.js +0 -212
  574. package/dist/tool-system/builtin/apply-patch/seek-sequence.d.ts +0 -18
  575. package/dist/tool-system/builtin/apply-patch/seek-sequence.js +0 -123
  576. package/dist/tool-system/builtin/apply-patch/types.d.ts +0 -49
  577. package/dist/tool-system/builtin/apply-patch/types.js +0 -13
  578. package/dist/tool-system/builtin/arena.d.ts +0 -31
  579. package/dist/tool-system/builtin/arena.js +0 -416
  580. package/dist/tool-system/builtin/brief.d.ts +0 -6
  581. package/dist/tool-system/builtin/brief.js +0 -41
  582. package/dist/tool-system/builtin/check-quota.d.ts +0 -15
  583. package/dist/tool-system/builtin/check-quota.js +0 -34
  584. package/dist/tool-system/builtin/drive-claude-code.d.ts +0 -51
  585. package/dist/tool-system/builtin/drive-claude-code.js +0 -698
  586. package/dist/tool-system/builtin/lsp.d.ts +0 -7
  587. package/dist/tool-system/builtin/lsp.js +0 -144
  588. package/dist/tool-system/builtin/notebook-edit.d.ts +0 -7
  589. package/dist/tool-system/builtin/notebook-edit.js +0 -127
  590. package/dist/tool-system/builtin/worktree.d.ts +0 -11
  591. package/dist/tool-system/builtin/worktree.js +0 -363
  592. /package/dist/{external-agents → links}/types.js +0 -0
  593. /package/dist/{engine/session-usage.d.ts → session/usage.d.ts} +0 -0
  594. /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
+ }