@cjhyy/code-shell-core 0.7.0 → 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 (621) 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 +20 -5
  23. package/dist/context/compaction.d.ts +39 -3
  24. package/dist/context/compaction.js +151 -39
  25. package/dist/context/manager.d.ts +20 -4
  26. package/dist/context/manager.js +42 -7
  27. package/dist/context/token-counter.js +5 -3
  28. package/dist/context/tool-result-storage.d.ts +6 -0
  29. package/dist/context/tool-result-storage.js +25 -4
  30. package/dist/credentials/access.d.ts +13 -2
  31. package/dist/credentials/access.js +99 -4
  32. package/dist/credentials/index.d.ts +3 -2
  33. package/dist/credentials/index.js +2 -1
  34. package/dist/credentials/oauth.d.ts +9 -1
  35. package/dist/credentials/oauth.js +80 -1
  36. package/dist/credentials/store.d.ts +16 -2
  37. package/dist/credentials/store.js +33 -11
  38. package/dist/credentials/types.d.ts +62 -1
  39. package/dist/credentials/types.js +16 -1
  40. package/dist/credentials/use-credential-tool.js +15 -1
  41. package/dist/engine/auxiliary-pipeline.d.ts +40 -0
  42. package/dist/engine/auxiliary-pipeline.js +181 -0
  43. package/dist/{settings → engine}/disk-defaults.d.ts +2 -2
  44. package/dist/{settings → engine}/disk-defaults.js +5 -2
  45. package/dist/engine/dynamic-tool-defs.d.ts +4 -0
  46. package/dist/engine/dynamic-tool-defs.js +4 -0
  47. package/dist/engine/engine.d.ts +272 -184
  48. package/dist/engine/engine.js +1869 -1864
  49. package/dist/engine/file-history-hook.d.ts +11 -0
  50. package/dist/engine/file-history-hook.js +31 -0
  51. package/dist/engine/goal-judge-context.d.ts +9 -0
  52. package/dist/engine/goal-judge-context.js +234 -0
  53. package/dist/engine/injected-context-cache.d.ts +6 -0
  54. package/dist/engine/injected-context-cache.js +13 -0
  55. package/dist/engine/input-attachments.d.ts +1 -1
  56. package/dist/engine/model-facade.d.ts +3 -3
  57. package/dist/engine/model-facade.js +15 -14
  58. package/dist/engine/permission-controller.d.ts +55 -0
  59. package/dist/engine/permission-controller.js +148 -0
  60. package/dist/engine/prompt-cache-diagnostics.d.ts +58 -0
  61. package/dist/engine/prompt-cache-diagnostics.js +178 -0
  62. package/dist/engine/run-accounting.d.ts +41 -0
  63. package/dist/engine/run-accounting.js +126 -0
  64. package/dist/engine/run-context.d.ts +44 -0
  65. package/dist/engine/run-context.js +88 -0
  66. package/dist/engine/run-environment.d.ts +30 -0
  67. package/dist/engine/run-environment.js +77 -0
  68. package/dist/engine/run-finalize.d.ts +58 -0
  69. package/dist/engine/run-finalize.js +245 -0
  70. package/dist/engine/run-goal.d.ts +58 -0
  71. package/dist/engine/run-goal.js +188 -0
  72. package/dist/engine/run-image-input.d.ts +1 -1
  73. package/dist/engine/run-image-input.js +5 -3
  74. package/dist/engine/run-session-open.d.ts +41 -0
  75. package/dist/engine/run-session-open.js +186 -0
  76. package/dist/engine/run-setup.d.ts +42 -0
  77. package/dist/engine/run-setup.js +58 -0
  78. package/dist/engine/run-tooling.d.ts +125 -0
  79. package/dist/engine/run-tooling.js +283 -0
  80. package/dist/engine/run-types.d.ts +139 -0
  81. package/dist/engine/run-types.js +12 -0
  82. package/dist/engine/run-workspace.d.ts +50 -0
  83. package/dist/engine/run-workspace.js +114 -0
  84. package/dist/engine/session-title.d.ts +2 -1
  85. package/dist/engine/session-title.js +4 -1
  86. package/dist/engine/steer-queue.d.ts +1 -1
  87. package/dist/engine/subagent-spawner.d.ts +32 -0
  88. package/dist/engine/subagent-spawner.js +287 -0
  89. package/dist/engine/tool-summary.d.ts +2 -2
  90. package/dist/engine/tool-summary.js +2 -2
  91. package/dist/engine/turn-loop.d.ts +67 -10
  92. package/dist/engine/turn-loop.js +538 -97
  93. package/dist/engine/types.d.ts +35 -4
  94. package/dist/engine/types.js +1 -1
  95. package/dist/{engine/goal.d.ts → goal/lifecycle.d.ts} +80 -6
  96. package/dist/goal/lifecycle.js +482 -0
  97. package/dist/hooks/events.d.ts +26 -9
  98. package/dist/hooks/events.js +0 -3
  99. package/dist/hooks/goal-stop-hook.d.ts +28 -29
  100. package/dist/hooks/goal-stop-hook.js +344 -144
  101. package/dist/hooks/registry.js +4 -1
  102. package/dist/hooks/shell-runner.d.ts +12 -1
  103. package/dist/hooks/shell-runner.js +160 -9
  104. package/dist/index.d.ts +51 -110
  105. package/dist/index.extension.d.ts +51 -0
  106. package/dist/index.extension.js +39 -0
  107. package/dist/index.internal.d.ts +86 -0
  108. package/dist/index.internal.js +92 -0
  109. package/dist/index.js +37 -125
  110. package/dist/links/cli.d.ts +48 -0
  111. package/dist/links/cli.js +617 -0
  112. package/dist/links/http.d.ts +40 -0
  113. package/dist/links/http.js +166 -0
  114. package/dist/links/index.d.ts +4 -0
  115. package/dist/links/index.js +3 -0
  116. package/dist/links/link-action-tool.d.ts +5 -0
  117. package/dist/links/link-action-tool.js +241 -0
  118. package/dist/links/providers.d.ts +8 -0
  119. package/dist/links/providers.js +665 -0
  120. package/dist/links/types.d.ts +44 -0
  121. package/dist/llm/client-base.d.ts +7 -0
  122. package/dist/llm/client-base.js +72 -10
  123. package/dist/llm/model-pool.d.ts +1 -1
  124. package/dist/llm/model-pool.js +1 -1
  125. package/dist/llm/providers/anthropic.d.ts +1 -0
  126. package/dist/llm/providers/anthropic.js +9 -0
  127. package/dist/llm/providers/openai.d.ts +1 -0
  128. package/dist/llm/providers/openai.js +17 -0
  129. package/dist/llm/types.d.ts +12 -5
  130. package/dist/model-catalog/index.js +15 -2
  131. package/dist/model-catalog/resolve.d.ts +13 -1
  132. package/dist/model-catalog/resolve.js +37 -2
  133. package/dist/model-catalog/types.d.ts +74 -48
  134. package/dist/model-catalog/types.js +16 -5
  135. package/dist/model-catalog/upsert.d.ts +3 -1
  136. package/dist/model-catalog/upsert.js +9 -0
  137. package/dist/onboarding.d.ts +0 -1
  138. package/dist/onboarding.js +1 -22
  139. package/dist/panel-apps/bindings.d.ts +24 -0
  140. package/dist/panel-apps/bindings.js +69 -0
  141. package/dist/panel-apps/github-archive.d.ts +21 -0
  142. package/dist/panel-apps/github-archive.js +98 -0
  143. package/dist/panel-apps/index.d.ts +4 -0
  144. package/dist/panel-apps/index.js +4 -0
  145. package/dist/panel-apps/installer.d.ts +68 -0
  146. package/dist/panel-apps/installer.js +622 -0
  147. package/dist/panel-apps/manifest.d.ts +364 -0
  148. package/dist/panel-apps/manifest.js +189 -0
  149. package/dist/panel-apps/paths.d.ts +13 -0
  150. package/dist/panel-apps/paths.js +38 -0
  151. package/dist/panel-apps/registry.d.ts +51 -0
  152. package/dist/panel-apps/registry.js +99 -0
  153. package/dist/panel-apps/runtime.d.ts +80 -0
  154. package/dist/panel-apps/runtime.js +154 -0
  155. package/dist/plugins/gitOps.js +8 -1
  156. package/dist/plugins/installedPlugins.d.ts +2 -1
  157. package/dist/plugins/installedPlugins.js +146 -8
  158. package/dist/plugins/installer/codex/convertAgents.d.ts +4 -1
  159. package/dist/plugins/installer/codex/convertAgents.js +62 -8
  160. package/dist/plugins/installer/codex/convertCommands.d.ts +5 -5
  161. package/dist/plugins/installer/codex/convertCommands.js +35 -12
  162. package/dist/plugins/installer/codex/convertHooks.d.ts +10 -0
  163. package/dist/plugins/installer/codex/convertHooks.js +82 -0
  164. package/dist/plugins/installer/codex/convertSkills.js +41 -6
  165. package/dist/plugins/installer/install.d.ts +7 -1
  166. package/dist/plugins/installer/install.js +21 -87
  167. package/dist/plugins/installer/installFromArchive.d.ts +26 -4
  168. package/dist/plugins/installer/installFromArchive.js +44 -27
  169. package/dist/plugins/installer/installFromNpm.d.ts +31 -0
  170. package/dist/plugins/installer/installFromNpm.js +273 -0
  171. package/dist/plugins/installer/loadPluginAgents.js +17 -4
  172. package/dist/plugins/installer/loadPluginMcp.d.ts +14 -0
  173. package/dist/plugins/installer/loadPluginMcp.js +245 -35
  174. package/dist/plugins/installer/normalizeManifest.d.ts +13 -0
  175. package/dist/plugins/installer/normalizeManifest.js +306 -0
  176. package/dist/plugins/installer/npmTar.d.ts +13 -0
  177. package/dist/plugins/installer/npmTar.js +321 -0
  178. package/dist/plugins/installer/parseSource.d.ts +11 -0
  179. package/dist/plugins/installer/parseSource.js +48 -0
  180. package/dist/plugins/installer/preview.d.ts +101 -0
  181. package/dist/plugins/installer/preview.js +336 -0
  182. package/dist/plugins/installer/projectPluginSource.d.ts +14 -0
  183. package/dist/plugins/installer/projectPluginSource.js +140 -0
  184. package/dist/plugins/installer/types.d.ts +775 -0
  185. package/dist/plugins/installer/types.js +100 -0
  186. package/dist/plugins/installer/unzip.d.ts +11 -0
  187. package/dist/plugins/installer/unzip.js +123 -9
  188. package/dist/plugins/installer/update.d.ts +2 -2
  189. package/dist/plugins/installer/update.js +43 -4
  190. package/dist/plugins/loadPluginHooks.d.ts +19 -2
  191. package/dist/plugins/loadPluginHooks.js +97 -86
  192. package/dist/plugins/pluginAutomationTemplates.d.ts +18 -0
  193. package/dist/plugins/pluginAutomationTemplates.js +50 -0
  194. package/dist/plugins/pluginCatalog.d.ts +45 -0
  195. package/dist/plugins/pluginCatalog.js +87 -0
  196. package/dist/plugins/pluginCommandHook.d.ts +10 -4
  197. package/dist/plugins/pluginCommandHook.js +133 -18
  198. package/dist/plugins/pluginCommandsLoader.d.ts +19 -0
  199. package/dist/plugins/pluginCommandsLoader.js +181 -7
  200. package/dist/plugins/pluginContent.d.ts +10 -1
  201. package/dist/plugins/pluginContent.js +87 -30
  202. package/dist/plugins/pluginHookApproval.d.ts +30 -0
  203. package/dist/plugins/pluginHookApproval.js +160 -0
  204. package/dist/plugins/pluginHookIntegrity.d.ts +69 -0
  205. package/dist/plugins/pluginHookIntegrity.js +361 -0
  206. package/dist/plugins/pluginInstaller.js +71 -12
  207. package/dist/plugins/pluginMcpApproval.d.ts +19 -0
  208. package/dist/plugins/pluginMcpApproval.js +110 -0
  209. package/dist/plugins/pluginMcpIntegrity.d.ts +21 -0
  210. package/dist/plugins/pluginMcpIntegrity.js +74 -0
  211. package/dist/plugins/types.d.ts +30 -0
  212. package/dist/plugins/varRewrite.d.ts +9 -5
  213. package/dist/plugins/varRewrite.js +26 -17
  214. package/dist/preset/index.d.ts +11 -8
  215. package/dist/preset/index.js +62 -203
  216. package/dist/product/define.js +9 -3
  217. package/dist/product/types.d.ts +0 -2
  218. package/dist/profile/activation.d.ts +36 -0
  219. package/dist/profile/activation.js +57 -0
  220. package/dist/profile/catalog-store.d.ts +77 -0
  221. package/dist/profile/catalog-store.js +346 -0
  222. package/dist/profile/catalog.d.ts +54 -0
  223. package/dist/profile/catalog.js +152 -0
  224. package/dist/profile/index.d.ts +7 -0
  225. package/dist/profile/index.js +7 -0
  226. package/dist/profile/requirements.d.ts +76 -0
  227. package/dist/profile/requirements.js +117 -0
  228. package/dist/profile/resolve.d.ts +11 -0
  229. package/dist/profile/resolve.js +41 -0
  230. package/dist/profile/store.d.ts +17 -0
  231. package/dist/profile/store.js +167 -0
  232. package/dist/profile/types.d.ts +321 -0
  233. package/dist/profile/types.js +104 -0
  234. package/dist/prompt/composer.d.ts +46 -7
  235. package/dist/prompt/composer.js +78 -48
  236. package/dist/prompt/instruction-scanner.d.ts +6 -5
  237. package/dist/prompt/instruction-scanner.js +8 -23
  238. package/dist/prompt/section-loader.d.ts +2 -2
  239. package/dist/prompt/section-loader.js +7 -4
  240. package/dist/prompt/sections/browser.md +10 -9
  241. package/dist/prompt/sections/harness-base.md +9 -0
  242. package/dist/protocol/chat-session-manager.d.ts +77 -3
  243. package/dist/protocol/chat-session-manager.js +194 -18
  244. package/dist/protocol/chat-session.d.ts +72 -9
  245. package/dist/protocol/chat-session.js +151 -16
  246. package/dist/protocol/client.d.ts +37 -4
  247. package/dist/protocol/client.js +118 -6
  248. package/dist/protocol/index.d.ts +2 -2
  249. package/dist/protocol/index.js +2 -2
  250. package/dist/protocol/mobile-remote-types.d.ts +406 -0
  251. package/dist/protocol/mobile-remote-types.js +1 -0
  252. package/dist/protocol/server.d.ts +152 -14
  253. package/dist/protocol/server.js +1574 -229
  254. package/dist/protocol/types.d.ts +182 -32
  255. package/dist/protocol/types.js +18 -0
  256. package/dist/run/ArtifactTracker.d.ts +6 -1
  257. package/dist/run/ArtifactTracker.js +29 -21
  258. package/dist/run/EngineRunner.d.ts +2 -0
  259. package/dist/run/EngineRunner.js +1 -0
  260. package/dist/run/RunManager.d.ts +26 -0
  261. package/dist/run/RunManager.js +82 -11
  262. package/dist/run/factory.d.ts +3 -0
  263. package/dist/run/factory.js +2 -0
  264. package/dist/runtime/safe-spawn.d.ts +6 -0
  265. package/dist/runtime/safe-spawn.js +8 -13
  266. package/dist/services/auto-dream.d.ts +13 -1
  267. package/dist/services/auto-dream.js +56 -8
  268. package/dist/services/dream-consolidation.d.ts +3 -0
  269. package/dist/services/dream-consolidation.js +14 -2
  270. package/dist/services/index.d.ts +1 -1
  271. package/dist/services/index.js +1 -1
  272. package/dist/services/memory-orchestrator.js +6 -2
  273. package/dist/services/oauth.d.ts +34 -10
  274. package/dist/services/oauth.js +236 -98
  275. package/dist/services/session-memory.d.ts +4 -4
  276. package/dist/services/session-memory.js +13 -10
  277. package/dist/session/memory.d.ts +26 -7
  278. package/dist/session/memory.js +79 -21
  279. package/dist/session/session-manager.d.ts +208 -25
  280. package/dist/session/session-manager.js +1232 -116
  281. package/dist/session/session-message.d.ts +22 -0
  282. package/dist/session/session-message.js +1 -0
  283. package/dist/session/transcript.d.ts +76 -6
  284. package/dist/session/transcript.js +278 -7
  285. package/dist/settings/feature-flags.d.ts +40 -0
  286. package/dist/settings/feature-flags.js +40 -0
  287. package/dist/settings/manager.d.ts +39 -1
  288. package/dist/settings/manager.js +102 -41
  289. package/dist/settings/migrate-config.js +4 -2
  290. package/dist/settings/schema.d.ts +511 -177
  291. package/dist/settings/schema.js +98 -25
  292. package/dist/skills/scanner.d.ts +6 -2
  293. package/dist/skills/scanner.js +160 -9
  294. package/dist/sources/adapter.d.ts +14 -0
  295. package/dist/sources/adapter.js +7 -0
  296. package/dist/sources/adapters/local-files.d.ts +10 -0
  297. package/dist/sources/adapters/local-files.js +127 -0
  298. package/dist/sources/adapters/mcp-resource.d.ts +17 -0
  299. package/dist/sources/adapters/mcp-resource.js +41 -0
  300. package/dist/sources/adapters/mock.d.ts +3 -0
  301. package/dist/sources/adapters/mock.js +29 -0
  302. package/dist/sources/binding.d.ts +6 -0
  303. package/dist/sources/binding.js +24 -0
  304. package/dist/sources/catalog.d.ts +6 -0
  305. package/dist/sources/catalog.js +64 -0
  306. package/dist/sources/context-summary.d.ts +8 -0
  307. package/dist/sources/context-summary.js +13 -0
  308. package/dist/sources/credential-status.d.ts +2 -0
  309. package/dist/sources/credential-status.js +13 -0
  310. package/dist/sources/index.d.ts +10 -0
  311. package/dist/sources/index.js +10 -0
  312. package/dist/sources/resolve.d.ts +28 -0
  313. package/dist/sources/resolve.js +47 -0
  314. package/dist/sources/truncate-utf8.d.ts +7 -0
  315. package/dist/sources/truncate-utf8.js +18 -0
  316. package/dist/sources/types.d.ts +71 -0
  317. package/dist/sources/types.js +26 -0
  318. package/dist/testing/fetch-stub.d.ts +32 -0
  319. package/dist/testing/fetch-stub.js +24 -0
  320. package/dist/themes/image.d.ts +18 -0
  321. package/dist/themes/image.js +117 -0
  322. package/dist/themes/index.d.ts +4 -0
  323. package/dist/themes/index.js +4 -0
  324. package/dist/themes/installer.d.ts +50 -0
  325. package/dist/themes/installer.js +290 -0
  326. package/dist/themes/manifest.d.ts +102 -0
  327. package/dist/themes/manifest.js +86 -0
  328. package/dist/themes/paths.d.ts +14 -0
  329. package/dist/themes/paths.js +33 -0
  330. package/dist/tool-system/browser-bridge.d.ts +53 -11
  331. package/dist/tool-system/browser-bridge.js +8 -9
  332. package/dist/tool-system/builtin/agent-heartbeat.d.ts +2 -2
  333. package/dist/tool-system/builtin/agent-heartbeat.js +20 -6
  334. package/dist/tool-system/builtin/agent-notifications.d.ts +127 -72
  335. package/dist/tool-system/builtin/agent-notifications.js +291 -101
  336. package/dist/tool-system/builtin/agent-output-file.js +1 -3
  337. package/dist/tool-system/builtin/agent-progress.d.ts +6 -0
  338. package/dist/tool-system/builtin/agent-progress.js +83 -0
  339. package/dist/tool-system/builtin/agent-registry.d.ts +38 -2
  340. package/dist/tool-system/builtin/agent-registry.js +178 -9
  341. package/dist/tool-system/builtin/agent-transcript-translator.js +1 -1
  342. package/dist/tool-system/builtin/agent.d.ts +2 -0
  343. package/dist/tool-system/builtin/agent.js +279 -34
  344. package/dist/tool-system/builtin/background-jobs.d.ts +63 -7
  345. package/dist/tool-system/builtin/background-jobs.js +111 -15
  346. package/dist/tool-system/builtin/background-work.d.ts +12 -1
  347. package/dist/tool-system/builtin/background-work.js +12 -1
  348. package/dist/tool-system/builtin/bash.d.ts +3 -5
  349. package/dist/tool-system/builtin/bash.js +14 -6
  350. package/dist/tool-system/builtin/browser-tools.d.ts +8 -5
  351. package/dist/tool-system/builtin/browser-tools.js +89 -23
  352. package/dist/tool-system/builtin/edit-model-catalog.d.ts +6 -0
  353. package/dist/tool-system/builtin/edit-model-catalog.js +172 -12
  354. package/dist/tool-system/builtin/edit.d.ts +2 -1
  355. package/dist/tool-system/builtin/edit.js +14 -10
  356. package/dist/tool-system/builtin/file-cache.d.ts +2 -0
  357. package/dist/tool-system/builtin/file-cache.js +4 -0
  358. package/dist/tool-system/builtin/generate-image.js +17 -10
  359. package/dist/tool-system/builtin/generate-video.d.ts +4 -0
  360. package/dist/tool-system/builtin/generate-video.js +164 -28
  361. package/dist/tool-system/builtin/glob.d.ts +2 -1
  362. package/dist/tool-system/builtin/glob.js +28 -3
  363. package/dist/tool-system/builtin/grep.d.ts +1 -0
  364. package/dist/tool-system/builtin/grep.js +82 -17
  365. package/dist/tool-system/builtin/image-uploader.js +7 -1
  366. package/dist/tool-system/builtin/index.d.ts +57 -18
  367. package/dist/tool-system/builtin/index.js +280 -167
  368. package/dist/tool-system/builtin/memory.d.ts +6 -0
  369. package/dist/tool-system/builtin/memory.js +36 -15
  370. package/dist/tool-system/builtin/panel.d.ts +9 -0
  371. package/dist/tool-system/builtin/panel.js +314 -0
  372. package/dist/tool-system/builtin/read.js +5 -1
  373. package/dist/tool-system/builtin/send-message-to-session.d.ts +6 -0
  374. package/dist/tool-system/builtin/send-message-to-session.js +67 -0
  375. package/dist/tool-system/builtin/sources.d.ts +8 -0
  376. package/dist/tool-system/builtin/sources.js +137 -0
  377. package/dist/tool-system/builtin/tool-search.js +7 -2
  378. package/dist/tool-system/builtin/update-automation-memory.js +2 -0
  379. package/dist/tool-system/builtin/video-providers.d.ts +12 -15
  380. package/dist/tool-system/builtin/video-providers.js +1 -0
  381. package/dist/tool-system/builtin/view-image.d.ts +2 -2
  382. package/dist/tool-system/builtin/web-fetch.js +60 -15
  383. package/dist/tool-system/builtin/web-search.js +1 -3
  384. package/dist/tool-system/builtin/write.d.ts +2 -1
  385. package/dist/tool-system/builtin/write.js +14 -4
  386. package/dist/tool-system/capability-module.d.ts +93 -0
  387. package/dist/tool-system/capability-module.js +53 -0
  388. package/dist/tool-system/context.d.ts +94 -24
  389. package/dist/tool-system/executor.js +99 -58
  390. package/dist/tool-system/external-tool-exposure.d.ts +60 -0
  391. package/dist/tool-system/external-tool-exposure.js +304 -0
  392. package/dist/tool-system/mcp-manager.d.ts +17 -1
  393. package/dist/tool-system/mcp-manager.js +72 -7
  394. package/dist/tool-system/mcp-tool-policy.d.ts +9 -0
  395. package/dist/tool-system/mcp-tool-policy.js +34 -0
  396. package/dist/tool-system/panel-bridge.d.ts +53 -0
  397. package/dist/tool-system/panel-bridge.js +1 -0
  398. package/dist/tool-system/path-policy.d.ts +19 -0
  399. package/dist/tool-system/path-policy.js +62 -1
  400. package/dist/tool-system/permission.d.ts +69 -3
  401. package/dist/tool-system/permission.js +429 -30
  402. package/dist/tool-system/registry.d.ts +15 -3
  403. package/dist/tool-system/registry.js +82 -40
  404. package/dist/tool-system/sandbox/index.js +3 -8
  405. package/dist/tool-system/sandbox/seatbelt.js +2 -6
  406. package/dist/tool-system/session-tool-host.d.ts +139 -0
  407. package/dist/tool-system/session-tool-host.js +167 -0
  408. package/dist/tool-system/testing/tool-registry-harness.d.ts +31 -0
  409. package/dist/tool-system/testing/tool-registry-harness.js +51 -0
  410. package/dist/tool-system/validation.d.ts +14 -7
  411. package/dist/tool-system/validation.js +701 -7
  412. package/dist/types.d.ts +201 -20
  413. package/dist/{cc-orchestrator → utils}/cwd-normalize.d.ts +1 -0
  414. package/dist/{cc-orchestrator → utils}/cwd-normalize.js +1 -0
  415. package/dist/utils/file-mutex.d.ts +65 -0
  416. package/dist/utils/file-mutex.js +145 -0
  417. package/dist/utils/json.d.ts +2 -4
  418. package/dist/utils/json.js +2 -4
  419. package/dist/utils/lockfile.d.ts +30 -1
  420. package/dist/utils/lockfile.js +2 -2
  421. package/dist/utils/secret-scrubber.d.ts +8 -0
  422. package/dist/utils/secret-scrubber.js +227 -0
  423. package/dist/utils/toolDisplay.js +1 -1
  424. package/package.json +20 -5
  425. package/THIRD_PARTY_NOTICES.md +0 -206
  426. package/dist/arena/arena.d.ts +0 -43
  427. package/dist/arena/arena.js +0 -333
  428. package/dist/arena/context/context-tools.d.ts +0 -16
  429. package/dist/arena/context/context-tools.js +0 -272
  430. package/dist/arena/context/within-root.d.ts +0 -7
  431. package/dist/arena/context/within-root.js +0 -15
  432. package/dist/arena/detect-mode.d.ts +0 -20
  433. package/dist/arena/detect-mode.js +0 -78
  434. package/dist/arena/digest-builder.d.ts +0 -25
  435. package/dist/arena/digest-builder.js +0 -120
  436. package/dist/arena/index.d.ts +0 -29
  437. package/dist/arena/index.js +0 -29
  438. package/dist/arena/iterate/convergence.d.ts +0 -25
  439. package/dist/arena/iterate/convergence.js +0 -103
  440. package/dist/arena/iterate/formats/index.d.ts +0 -22
  441. package/dist/arena/iterate/formats/index.js +0 -283
  442. package/dist/arena/iterate/index.d.ts +0 -11
  443. package/dist/arena/iterate/index.js +0 -9
  444. package/dist/arena/iterate/iterative-arena.d.ts +0 -23
  445. package/dist/arena/iterate/iterative-arena.js +0 -237
  446. package/dist/arena/iterate/parse.d.ts +0 -42
  447. package/dist/arena/iterate/parse.js +0 -123
  448. package/dist/arena/iterate/phases/argue.d.ts +0 -22
  449. package/dist/arena/iterate/phases/argue.js +0 -165
  450. package/dist/arena/iterate/phases/revise.d.ts +0 -16
  451. package/dist/arena/iterate/phases/revise.js +0 -62
  452. package/dist/arena/iterate/phases/tournament.d.ts +0 -34
  453. package/dist/arena/iterate/phases/tournament.js +0 -113
  454. package/dist/arena/iterate/tools/web-tools.d.ts +0 -13
  455. package/dist/arena/iterate/tools/web-tools.js +0 -54
  456. package/dist/arena/iterate/types.d.ts +0 -152
  457. package/dist/arena/iterate/types.js +0 -8
  458. package/dist/arena/ledger.d.ts +0 -47
  459. package/dist/arena/ledger.js +0 -159
  460. package/dist/arena/lenses/architecture.d.ts +0 -5
  461. package/dist/arena/lenses/architecture.js +0 -22
  462. package/dist/arena/lenses/engineering.d.ts +0 -5
  463. package/dist/arena/lenses/engineering.js +0 -22
  464. package/dist/arena/lenses/general.d.ts +0 -5
  465. package/dist/arena/lenses/general.js +0 -20
  466. package/dist/arena/lenses/index.d.ts +0 -16
  467. package/dist/arena/lenses/index.js +0 -47
  468. package/dist/arena/lenses/product.d.ts +0 -5
  469. package/dist/arena/lenses/product.js +0 -22
  470. package/dist/arena/model-presets.d.ts +0 -23
  471. package/dist/arena/model-presets.js +0 -44
  472. package/dist/arena/phases/adjudication.d.ts +0 -24
  473. package/dist/arena/phases/adjudication.js +0 -141
  474. package/dist/arena/phases/build-consensus.d.ts +0 -29
  475. package/dist/arena/phases/build-consensus.js +0 -83
  476. package/dist/arena/phases/claim-registry.d.ts +0 -26
  477. package/dist/arena/phases/claim-registry.js +0 -60
  478. package/dist/arena/phases/cross-review.d.ts +0 -45
  479. package/dist/arena/phases/cross-review.js +0 -218
  480. package/dist/arena/phases/debate-rounds.d.ts +0 -27
  481. package/dist/arena/phases/debate-rounds.js +0 -159
  482. package/dist/arena/phases/participant-research.d.ts +0 -38
  483. package/dist/arena/phases/participant-research.js +0 -314
  484. package/dist/arena/phases/planning-detail-expansion.d.ts +0 -38
  485. package/dist/arena/phases/planning-detail-expansion.js +0 -119
  486. package/dist/arena/planner.d.ts +0 -27
  487. package/dist/arena/planner.js +0 -311
  488. package/dist/arena/providers/docs.d.ts +0 -7
  489. package/dist/arena/providers/docs.js +0 -111
  490. package/dist/arena/providers/git.d.ts +0 -8
  491. package/dist/arena/providers/git.js +0 -174
  492. package/dist/arena/providers/index.d.ts +0 -32
  493. package/dist/arena/providers/index.js +0 -132
  494. package/dist/arena/providers/none.d.ts +0 -7
  495. package/dist/arena/providers/none.js +0 -11
  496. package/dist/arena/providers/repo.d.ts +0 -7
  497. package/dist/arena/providers/repo.js +0 -258
  498. package/dist/arena/render/session.d.ts +0 -17
  499. package/dist/arena/render/session.js +0 -190
  500. package/dist/arena/render/terminal.d.ts +0 -34
  501. package/dist/arena/render/terminal.js +0 -286
  502. package/dist/arena/strategies/discussion.d.ts +0 -25
  503. package/dist/arena/strategies/discussion.js +0 -143
  504. package/dist/arena/strategies/index.d.ts +0 -15
  505. package/dist/arena/strategies/index.js +0 -28
  506. package/dist/arena/strategies/language-wrapper.d.ts +0 -17
  507. package/dist/arena/strategies/language-wrapper.js +0 -102
  508. package/dist/arena/strategies/lens-wrapper.d.ts +0 -16
  509. package/dist/arena/strategies/lens-wrapper.js +0 -236
  510. package/dist/arena/strategies/planning.d.ts +0 -30
  511. package/dist/arena/strategies/planning.js +0 -225
  512. package/dist/arena/strategies/review.d.ts +0 -26
  513. package/dist/arena/strategies/review.js +0 -168
  514. package/dist/arena/strategies/utils.d.ts +0 -36
  515. package/dist/arena/strategies/utils.js +0 -603
  516. package/dist/arena/tools/selector.d.ts +0 -17
  517. package/dist/arena/tools/selector.js +0 -61
  518. package/dist/arena/transitions.d.ts +0 -53
  519. package/dist/arena/transitions.js +0 -97
  520. package/dist/arena/types.d.ts +0 -514
  521. package/dist/arena/types.js +0 -27
  522. package/dist/cc-orchestrator/agent-adapter.d.ts +0 -54
  523. package/dist/cc-orchestrator/agent-adapter.js +0 -143
  524. package/dist/cc-orchestrator/cc-capability.d.ts +0 -19
  525. package/dist/cc-orchestrator/cc-capability.js +0 -53
  526. package/dist/cc-orchestrator/codex-session-discovery.d.ts +0 -24
  527. package/dist/cc-orchestrator/codex-session-discovery.js +0 -191
  528. package/dist/cc-orchestrator/codex-session-history.d.ts +0 -38
  529. package/dist/cc-orchestrator/codex-session-history.js +0 -247
  530. package/dist/cc-orchestrator/external-agent-bindings.d.ts +0 -27
  531. package/dist/cc-orchestrator/external-agent-bindings.js +0 -150
  532. package/dist/cc-orchestrator/external-agent-changes.d.ts +0 -19
  533. package/dist/cc-orchestrator/external-agent-changes.js +0 -231
  534. package/dist/cc-orchestrator/external-agent-driver.d.ts +0 -19
  535. package/dist/cc-orchestrator/external-agent-driver.js +0 -284
  536. package/dist/cc-orchestrator/external-agent-session-store.d.ts +0 -23
  537. package/dist/cc-orchestrator/external-agent-session-store.js +0 -146
  538. package/dist/cc-orchestrator/index.d.ts +0 -8
  539. package/dist/cc-orchestrator/index.js +0 -8
  540. package/dist/cc-orchestrator/relevance-judge.d.ts +0 -15
  541. package/dist/cc-orchestrator/relevance-judge.js +0 -29
  542. package/dist/cc-orchestrator/session-discovery.d.ts +0 -46
  543. package/dist/cc-orchestrator/session-discovery.js +0 -125
  544. package/dist/cc-orchestrator/session-history.d.ts +0 -54
  545. package/dist/cc-orchestrator/session-history.js +0 -150
  546. package/dist/cron/cron-runtime.d.ts +0 -2
  547. package/dist/cron/cron-runtime.js +0 -2
  548. package/dist/cron/cron-store.d.ts +0 -2
  549. package/dist/cron/cron-store.js +0 -2
  550. package/dist/cron/scheduler.d.ts +0 -7
  551. package/dist/cron/scheduler.js +0 -7
  552. package/dist/engine/goal.js +0 -206
  553. package/dist/external-agents/config.d.ts +0 -2
  554. package/dist/external-agents/config.js +0 -15
  555. package/dist/external-agents/types.d.ts +0 -31
  556. package/dist/git/parse-log.d.ts +0 -13
  557. package/dist/git/parse-log.js +0 -21
  558. package/dist/git/utils.d.ts +0 -49
  559. package/dist/git/utils.js +0 -161
  560. package/dist/git/worktree/crud.d.ts +0 -69
  561. package/dist/git/worktree/crud.js +0 -206
  562. package/dist/git/worktree/diff.d.ts +0 -14
  563. package/dist/git/worktree/diff.js +0 -82
  564. package/dist/git/worktree/git-exec.d.ts +0 -7
  565. package/dist/git/worktree/git-exec.js +0 -51
  566. package/dist/git/worktree/index.d.ts +0 -5
  567. package/dist/git/worktree/index.js +0 -5
  568. package/dist/git/worktree/query.d.ts +0 -42
  569. package/dist/git/worktree/query.js +0 -121
  570. package/dist/git/worktree/slug.d.ts +0 -11
  571. package/dist/git/worktree/slug.js +0 -58
  572. package/dist/git/worktree.d.ts +0 -1
  573. package/dist/git/worktree.js +0 -5
  574. package/dist/lsp/client.d.ts +0 -41
  575. package/dist/lsp/client.js +0 -186
  576. package/dist/lsp/manager.d.ts +0 -40
  577. package/dist/lsp/manager.js +0 -155
  578. package/dist/lsp/root-path.d.ts +0 -9
  579. package/dist/lsp/root-path.js +0 -12
  580. package/dist/lsp/servers.d.ts +0 -16
  581. package/dist/lsp/servers.js +0 -60
  582. package/dist/prompt/sections/coding.md +0 -35
  583. package/dist/quota/credentials.d.ts +0 -3
  584. package/dist/quota/credentials.js +0 -80
  585. package/dist/quota/index.d.ts +0 -36
  586. package/dist/quota/index.js +0 -155
  587. package/dist/quota/types.d.ts +0 -48
  588. package/dist/quota/types.js +0 -13
  589. package/dist/review/review-prompt.d.ts +0 -28
  590. package/dist/review/review-prompt.js +0 -81
  591. package/dist/state.d.ts +0 -160
  592. package/dist/state.js +0 -267
  593. package/dist/tool-system/builtin/apply-patch/applier.d.ts +0 -26
  594. package/dist/tool-system/builtin/apply-patch/applier.js +0 -308
  595. package/dist/tool-system/builtin/apply-patch/backup-targets.d.ts +0 -10
  596. package/dist/tool-system/builtin/apply-patch/backup-targets.js +0 -30
  597. package/dist/tool-system/builtin/apply-patch/index.d.ts +0 -20
  598. package/dist/tool-system/builtin/apply-patch/index.js +0 -105
  599. package/dist/tool-system/builtin/apply-patch/parser.d.ts +0 -17
  600. package/dist/tool-system/builtin/apply-patch/parser.js +0 -212
  601. package/dist/tool-system/builtin/apply-patch/seek-sequence.d.ts +0 -18
  602. package/dist/tool-system/builtin/apply-patch/seek-sequence.js +0 -123
  603. package/dist/tool-system/builtin/apply-patch/types.d.ts +0 -49
  604. package/dist/tool-system/builtin/apply-patch/types.js +0 -13
  605. package/dist/tool-system/builtin/arena.d.ts +0 -31
  606. package/dist/tool-system/builtin/arena.js +0 -415
  607. package/dist/tool-system/builtin/brief.d.ts +0 -6
  608. package/dist/tool-system/builtin/brief.js +0 -41
  609. package/dist/tool-system/builtin/check-quota.d.ts +0 -15
  610. package/dist/tool-system/builtin/check-quota.js +0 -34
  611. package/dist/tool-system/builtin/drive-claude-code.d.ts +0 -51
  612. package/dist/tool-system/builtin/drive-claude-code.js +0 -698
  613. package/dist/tool-system/builtin/lsp.d.ts +0 -7
  614. package/dist/tool-system/builtin/lsp.js +0 -144
  615. package/dist/tool-system/builtin/notebook-edit.d.ts +0 -7
  616. package/dist/tool-system/builtin/notebook-edit.js +0 -127
  617. package/dist/tool-system/builtin/worktree.d.ts +0 -11
  618. package/dist/tool-system/builtin/worktree.js +0 -345
  619. /package/dist/{external-agents → links}/types.js +0 -0
  620. /package/dist/{engine/session-usage.d.ts → session/usage.d.ts} +0 -0
  621. /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
+ }