taskchef 8.6.2 → 8.7.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 (630) hide show
  1. package/.codex-plugin/plugin.json +1 -1
  2. package/README.md +8 -4
  3. package/assets/README.md +19 -0
  4. package/assets/taskchef-app-rounded.png +0 -0
  5. package/assets/taskchef-avatar-square.png +0 -0
  6. package/assets/taskchef-avatar-square.svg +8 -0
  7. package/assets/taskchef-sidebar-dark.svg +6 -0
  8. package/assets/taskchef-sidebar-light.svg +6 -0
  9. package/assets/taskchef-sidebar.svg +6 -0
  10. package/docs/advanced-guide.md +20 -29
  11. package/docs/dashboard-ui.md +15 -0
  12. package/docs/diagrams/taskchef-next-reply-lookup.drawio +38 -0
  13. package/docs/diagrams/taskchef-next-reply-lookup.drawio.png +0 -0
  14. package/docs/diagrams/taskchef-next-storage.drawio +41 -0
  15. package/docs/diagrams/taskchef-next-storage.drawio.png +0 -0
  16. package/docs/images/taskchef-pr-icon-comparison.jpg +0 -0
  17. package/docs/images/taskchef-unified-status-popup.jpg +0 -0
  18. package/docs/mcp-app.md +261 -6
  19. package/docs/spec.md +24 -69
  20. package/docs/taskchef-next-github.md +206 -0
  21. package/docs/taskchef-next-status-research.md +102 -0
  22. package/docs/taskchef-next-storage.md +167 -0
  23. package/docs/workflows.md +4 -2
  24. package/node_modules/@napi-rs/keyring/LICENSE +21 -0
  25. package/node_modules/@napi-rs/keyring/README.md +45 -0
  26. package/node_modules/@napi-rs/keyring/index.d.ts +232 -0
  27. package/node_modules/@napi-rs/keyring/index.js +706 -0
  28. package/node_modules/@napi-rs/keyring/keytar.d.ts +53 -0
  29. package/node_modules/@napi-rs/keyring/keytar.js +26 -0
  30. package/node_modules/@napi-rs/keyring/package.json +126 -0
  31. package/node_modules/@napi-rs/keyring-darwin-arm64/README.md +3 -0
  32. package/node_modules/@napi-rs/keyring-darwin-arm64/keyring.darwin-arm64.node +0 -0
  33. package/node_modules/@napi-rs/keyring-darwin-arm64/package.json +32 -0
  34. package/node_modules/@napi-rs/keyring-darwin-x64/README.md +3 -0
  35. package/node_modules/@napi-rs/keyring-darwin-x64/keyring.darwin-x64.node +0 -0
  36. package/node_modules/@napi-rs/keyring-darwin-x64/package.json +32 -0
  37. package/node_modules/@napi-rs/keyring-linux-arm64-gnu/README.md +3 -0
  38. package/node_modules/@napi-rs/keyring-linux-arm64-gnu/keyring.linux-arm64-gnu.node +0 -0
  39. package/node_modules/@napi-rs/keyring-linux-arm64-gnu/package.json +35 -0
  40. package/node_modules/@napi-rs/keyring-linux-arm64-musl/README.md +3 -0
  41. package/node_modules/@napi-rs/keyring-linux-arm64-musl/keyring.linux-arm64-musl.node +0 -0
  42. package/node_modules/@napi-rs/keyring-linux-arm64-musl/package.json +35 -0
  43. package/node_modules/@napi-rs/keyring-linux-x64-gnu/README.md +3 -0
  44. package/node_modules/@napi-rs/keyring-linux-x64-gnu/keyring.linux-x64-gnu.node +0 -0
  45. package/node_modules/@napi-rs/keyring-linux-x64-gnu/package.json +35 -0
  46. package/node_modules/@napi-rs/keyring-linux-x64-musl/README.md +3 -0
  47. package/node_modules/@napi-rs/keyring-linux-x64-musl/keyring.linux-x64-musl.node +0 -0
  48. package/node_modules/@napi-rs/keyring-linux-x64-musl/package.json +35 -0
  49. package/node_modules/@napi-rs/keyring-win32-arm64-msvc/README.md +3 -0
  50. package/node_modules/@napi-rs/keyring-win32-arm64-msvc/keyring.win32-arm64-msvc.node +0 -0
  51. package/node_modules/@napi-rs/keyring-win32-arm64-msvc/package.json +32 -0
  52. package/node_modules/@napi-rs/keyring-win32-x64-msvc/README.md +3 -0
  53. package/node_modules/@napi-rs/keyring-win32-x64-msvc/keyring.win32-x64-msvc.node +0 -0
  54. package/node_modules/@napi-rs/keyring-win32-x64-msvc/package.json +32 -0
  55. package/node_modules/@types/debug/LICENSE +21 -0
  56. package/node_modules/@types/debug/README.md +69 -0
  57. package/node_modules/@types/debug/index.d.ts +50 -0
  58. package/node_modules/@types/debug/package.json +58 -0
  59. package/node_modules/@types/mdast/LICENSE +21 -0
  60. package/node_modules/@types/mdast/README.md +15 -0
  61. package/node_modules/@types/mdast/index.d.ts +1123 -0
  62. package/node_modules/@types/mdast/package.json +47 -0
  63. package/node_modules/@types/ms/LICENSE +21 -0
  64. package/node_modules/@types/ms/README.md +82 -0
  65. package/node_modules/@types/ms/index.d.ts +63 -0
  66. package/node_modules/@types/ms/package.json +26 -0
  67. package/node_modules/@types/unist/LICENSE +21 -0
  68. package/node_modules/@types/unist/README.md +15 -0
  69. package/node_modules/@types/unist/index.d.ts +119 -0
  70. package/node_modules/@types/unist/package.json +60 -0
  71. package/node_modules/character-entities/index.d.ts +6 -0
  72. package/node_modules/character-entities/index.js +2132 -0
  73. package/node_modules/character-entities/license +22 -0
  74. package/node_modules/character-entities/package.json +78 -0
  75. package/node_modules/character-entities/readme.md +152 -0
  76. package/node_modules/decode-named-character-reference/index.d.ts +13 -0
  77. package/node_modules/decode-named-character-reference/index.d.ts.map +1 -0
  78. package/node_modules/decode-named-character-reference/index.dom.d.ts +6 -0
  79. package/node_modules/decode-named-character-reference/index.dom.d.ts.map +1 -0
  80. package/node_modules/decode-named-character-reference/index.dom.js +32 -0
  81. package/node_modules/decode-named-character-reference/index.js +19 -0
  82. package/node_modules/decode-named-character-reference/license +22 -0
  83. package/node_modules/decode-named-character-reference/package.json +90 -0
  84. package/node_modules/decode-named-character-reference/readme.md +136 -0
  85. package/node_modules/dequal/dist/index.js +86 -0
  86. package/node_modules/dequal/dist/index.min.js +1 -0
  87. package/node_modules/dequal/dist/index.mjs +84 -0
  88. package/node_modules/dequal/index.d.ts +1 -0
  89. package/node_modules/dequal/license +21 -0
  90. package/node_modules/dequal/lite/index.d.ts +1 -0
  91. package/node_modules/dequal/lite/index.js +31 -0
  92. package/node_modules/dequal/lite/index.min.js +1 -0
  93. package/node_modules/dequal/lite/index.mjs +29 -0
  94. package/node_modules/dequal/package.json +57 -0
  95. package/node_modules/dequal/readme.md +112 -0
  96. package/node_modules/devlop/lib/default.js +9 -0
  97. package/node_modules/devlop/lib/development.d.ts +84 -0
  98. package/node_modules/devlop/lib/development.js +238 -0
  99. package/node_modules/devlop/license +22 -0
  100. package/node_modules/devlop/package.json +80 -0
  101. package/node_modules/devlop/readme.md +360 -0
  102. package/node_modules/mdast-util-from-markdown/dev/index.d.ts +23 -0
  103. package/node_modules/mdast-util-from-markdown/dev/index.js +2 -0
  104. package/node_modules/mdast-util-from-markdown/dev/lib/index.d.ts +53 -0
  105. package/node_modules/mdast-util-from-markdown/dev/lib/index.d.ts.map +1 -0
  106. package/node_modules/mdast-util-from-markdown/dev/lib/index.js +1348 -0
  107. package/node_modules/mdast-util-from-markdown/dev/lib/types.d.ts +295 -0
  108. package/node_modules/mdast-util-from-markdown/dev/lib/types.js +2 -0
  109. package/node_modules/mdast-util-from-markdown/index.d.ts +23 -0
  110. package/node_modules/mdast-util-from-markdown/index.js +2 -0
  111. package/node_modules/mdast-util-from-markdown/lib/index.d.ts +53 -0
  112. package/node_modules/mdast-util-from-markdown/lib/index.js +1177 -0
  113. package/node_modules/mdast-util-from-markdown/lib/types.d.ts +295 -0
  114. package/node_modules/mdast-util-from-markdown/lib/types.js +2 -0
  115. package/node_modules/mdast-util-from-markdown/license +22 -0
  116. package/node_modules/mdast-util-from-markdown/package.json +139 -0
  117. package/node_modules/mdast-util-from-markdown/readme.md +537 -0
  118. package/node_modules/mdast-util-to-string/index.d.ts +2 -0
  119. package/node_modules/mdast-util-to-string/index.js +5 -0
  120. package/node_modules/mdast-util-to-string/lib/index.d.ts +31 -0
  121. package/node_modules/mdast-util-to-string/lib/index.js +108 -0
  122. package/node_modules/mdast-util-to-string/license +22 -0
  123. package/node_modules/mdast-util-to-string/package.json +78 -0
  124. package/node_modules/mdast-util-to-string/readme.md +218 -0
  125. package/node_modules/micromark/dev/index.d.ts +82 -0
  126. package/node_modules/micromark/dev/index.d.ts.map +1 -0
  127. package/node_modules/micromark/dev/index.js +68 -0
  128. package/node_modules/micromark/dev/lib/compile.d.ts +16 -0
  129. package/node_modules/micromark/dev/lib/compile.d.ts.map +1 -0
  130. package/node_modules/micromark/dev/lib/compile.js +1162 -0
  131. package/node_modules/micromark/dev/lib/constructs.d.ts +73 -0
  132. package/node_modules/micromark/dev/lib/constructs.d.ts.map +1 -0
  133. package/node_modules/micromark/dev/lib/constructs.js +101 -0
  134. package/node_modules/micromark/dev/lib/create-tokenizer.d.ts +46 -0
  135. package/node_modules/micromark/dev/lib/create-tokenizer.d.ts.map +1 -0
  136. package/node_modules/micromark/dev/lib/create-tokenizer.js +718 -0
  137. package/node_modules/micromark/dev/lib/initialize/content.d.ts +4 -0
  138. package/node_modules/micromark/dev/lib/initialize/content.d.ts.map +1 -0
  139. package/node_modules/micromark/dev/lib/initialize/content.js +99 -0
  140. package/node_modules/micromark/dev/lib/initialize/document.d.ts +10 -0
  141. package/node_modules/micromark/dev/lib/initialize/document.d.ts.map +1 -0
  142. package/node_modules/micromark/dev/lib/initialize/document.js +449 -0
  143. package/node_modules/micromark/dev/lib/initialize/flow.d.ts +4 -0
  144. package/node_modules/micromark/dev/lib/initialize/flow.d.ts.map +1 -0
  145. package/node_modules/micromark/dev/lib/initialize/flow.js +86 -0
  146. package/node_modules/micromark/dev/lib/initialize/text.d.ts +8 -0
  147. package/node_modules/micromark/dev/lib/initialize/text.d.ts.map +1 -0
  148. package/node_modules/micromark/dev/lib/initialize/text.js +248 -0
  149. package/node_modules/micromark/dev/lib/parse.d.ts +10 -0
  150. package/node_modules/micromark/dev/lib/parse.d.ts.map +1 -0
  151. package/node_modules/micromark/dev/lib/parse.js +58 -0
  152. package/node_modules/micromark/dev/lib/postprocess.d.ts +9 -0
  153. package/node_modules/micromark/dev/lib/postprocess.d.ts.map +1 -0
  154. package/node_modules/micromark/dev/lib/postprocess.js +19 -0
  155. package/node_modules/micromark/dev/lib/preprocess.d.ts +13 -0
  156. package/node_modules/micromark/dev/lib/preprocess.d.ts.map +1 -0
  157. package/node_modules/micromark/dev/lib/preprocess.js +139 -0
  158. package/node_modules/micromark/dev/stream.d.ts +35 -0
  159. package/node_modules/micromark/dev/stream.d.ts.map +1 -0
  160. package/node_modules/micromark/dev/stream.js +270 -0
  161. package/node_modules/micromark/index.d.ts +82 -0
  162. package/node_modules/micromark/index.d.ts.map +1 -0
  163. package/node_modules/micromark/index.js +60 -0
  164. package/node_modules/micromark/lib/compile.d.ts +16 -0
  165. package/node_modules/micromark/lib/compile.d.ts.map +1 -0
  166. package/node_modules/micromark/lib/compile.js +1068 -0
  167. package/node_modules/micromark/lib/constructs.d.ts +73 -0
  168. package/node_modules/micromark/lib/constructs.d.ts.map +1 -0
  169. package/node_modules/micromark/lib/constructs.js +85 -0
  170. package/node_modules/micromark/lib/create-tokenizer.d.ts +46 -0
  171. package/node_modules/micromark/lib/create-tokenizer.d.ts.map +1 -0
  172. package/node_modules/micromark/lib/create-tokenizer.js +613 -0
  173. package/node_modules/micromark/lib/initialize/content.d.ts +4 -0
  174. package/node_modules/micromark/lib/initialize/content.d.ts.map +1 -0
  175. package/node_modules/micromark/lib/initialize/content.js +79 -0
  176. package/node_modules/micromark/lib/initialize/document.d.ts +10 -0
  177. package/node_modules/micromark/lib/initialize/document.d.ts.map +1 -0
  178. package/node_modules/micromark/lib/initialize/document.js +370 -0
  179. package/node_modules/micromark/lib/initialize/flow.d.ts +4 -0
  180. package/node_modules/micromark/lib/initialize/flow.d.ts.map +1 -0
  181. package/node_modules/micromark/lib/initialize/flow.js +58 -0
  182. package/node_modules/micromark/lib/initialize/text.d.ts +8 -0
  183. package/node_modules/micromark/lib/initialize/text.d.ts.map +1 -0
  184. package/node_modules/micromark/lib/initialize/text.js +216 -0
  185. package/node_modules/micromark/lib/parse.d.ts +10 -0
  186. package/node_modules/micromark/lib/parse.d.ts.map +1 -0
  187. package/node_modules/micromark/lib/parse.js +56 -0
  188. package/node_modules/micromark/lib/postprocess.d.ts +9 -0
  189. package/node_modules/micromark/lib/postprocess.d.ts.map +1 -0
  190. package/node_modules/micromark/lib/postprocess.js +18 -0
  191. package/node_modules/micromark/lib/preprocess.d.ts +13 -0
  192. package/node_modules/micromark/lib/preprocess.d.ts.map +1 -0
  193. package/node_modules/micromark/lib/preprocess.js +112 -0
  194. package/node_modules/micromark/license +22 -0
  195. package/node_modules/micromark/package.json +87 -0
  196. package/node_modules/micromark/readme.md +488 -0
  197. package/node_modules/micromark/stream.d.ts +35 -0
  198. package/node_modules/micromark/stream.d.ts.map +1 -0
  199. package/node_modules/micromark/stream.js +256 -0
  200. package/node_modules/micromark-core-commonmark/dev/index.d.ts +23 -0
  201. package/node_modules/micromark-core-commonmark/dev/index.d.ts.map +1 -0
  202. package/node_modules/micromark-core-commonmark/dev/index.js +22 -0
  203. package/node_modules/micromark-core-commonmark/dev/lib/attention.d.ts +4 -0
  204. package/node_modules/micromark-core-commonmark/dev/lib/attention.d.ts.map +1 -0
  205. package/node_modules/micromark-core-commonmark/dev/lib/attention.js +294 -0
  206. package/node_modules/micromark-core-commonmark/dev/lib/autolink.d.ts +4 -0
  207. package/node_modules/micromark-core-commonmark/dev/lib/autolink.d.ts.map +1 -0
  208. package/node_modules/micromark-core-commonmark/dev/lib/autolink.js +269 -0
  209. package/node_modules/micromark-core-commonmark/dev/lib/blank-line.d.ts +4 -0
  210. package/node_modules/micromark-core-commonmark/dev/lib/blank-line.d.ts.map +1 -0
  211. package/node_modules/micromark-core-commonmark/dev/lib/blank-line.js +62 -0
  212. package/node_modules/micromark-core-commonmark/dev/lib/block-quote.d.ts +4 -0
  213. package/node_modules/micromark-core-commonmark/dev/lib/block-quote.d.ts.map +1 -0
  214. package/node_modules/micromark-core-commonmark/dev/lib/block-quote.js +162 -0
  215. package/node_modules/micromark-core-commonmark/dev/lib/character-escape.d.ts +4 -0
  216. package/node_modules/micromark-core-commonmark/dev/lib/character-escape.d.ts.map +1 -0
  217. package/node_modules/micromark-core-commonmark/dev/lib/character-escape.js +69 -0
  218. package/node_modules/micromark-core-commonmark/dev/lib/character-reference.d.ts +4 -0
  219. package/node_modules/micromark-core-commonmark/dev/lib/character-reference.d.ts.map +1 -0
  220. package/node_modules/micromark-core-commonmark/dev/lib/character-reference.js +166 -0
  221. package/node_modules/micromark-core-commonmark/dev/lib/code-fenced.d.ts +4 -0
  222. package/node_modules/micromark-core-commonmark/dev/lib/code-fenced.d.ts.map +1 -0
  223. package/node_modules/micromark-core-commonmark/dev/lib/code-fenced.js +472 -0
  224. package/node_modules/micromark-core-commonmark/dev/lib/code-indented.d.ts +4 -0
  225. package/node_modules/micromark-core-commonmark/dev/lib/code-indented.d.ts.map +1 -0
  226. package/node_modules/micromark-core-commonmark/dev/lib/code-indented.js +178 -0
  227. package/node_modules/micromark-core-commonmark/dev/lib/code-text.d.ts +4 -0
  228. package/node_modules/micromark-core-commonmark/dev/lib/code-text.d.ts.map +1 -0
  229. package/node_modules/micromark-core-commonmark/dev/lib/code-text.js +257 -0
  230. package/node_modules/micromark-core-commonmark/dev/lib/content.d.ts +7 -0
  231. package/node_modules/micromark-core-commonmark/dev/lib/content.d.ts.map +1 -0
  232. package/node_modules/micromark-core-commonmark/dev/lib/content.js +185 -0
  233. package/node_modules/micromark-core-commonmark/dev/lib/definition.d.ts +4 -0
  234. package/node_modules/micromark-core-commonmark/dev/lib/definition.d.ts.map +1 -0
  235. package/node_modules/micromark-core-commonmark/dev/lib/definition.js +295 -0
  236. package/node_modules/micromark-core-commonmark/dev/lib/hard-break-escape.d.ts +4 -0
  237. package/node_modules/micromark-core-commonmark/dev/lib/hard-break-escape.d.ts.map +1 -0
  238. package/node_modules/micromark-core-commonmark/dev/lib/hard-break-escape.js +65 -0
  239. package/node_modules/micromark-core-commonmark/dev/lib/heading-atx.d.ts +4 -0
  240. package/node_modules/micromark-core-commonmark/dev/lib/heading-atx.d.ts.map +1 -0
  241. package/node_modules/micromark-core-commonmark/dev/lib/heading-atx.js +229 -0
  242. package/node_modules/micromark-core-commonmark/dev/lib/html-flow.d.ts +4 -0
  243. package/node_modules/micromark-core-commonmark/dev/lib/html-flow.d.ts.map +1 -0
  244. package/node_modules/micromark-core-commonmark/dev/lib/html-flow.js +938 -0
  245. package/node_modules/micromark-core-commonmark/dev/lib/html-text.d.ts +4 -0
  246. package/node_modules/micromark-core-commonmark/dev/lib/html-text.d.ts.map +1 -0
  247. package/node_modules/micromark-core-commonmark/dev/lib/html-text.js +783 -0
  248. package/node_modules/micromark-core-commonmark/dev/lib/label-end.d.ts +4 -0
  249. package/node_modules/micromark-core-commonmark/dev/lib/label-end.d.ts.map +1 -0
  250. package/node_modules/micromark-core-commonmark/dev/lib/label-end.js +658 -0
  251. package/node_modules/micromark-core-commonmark/dev/lib/label-start-image.d.ts +4 -0
  252. package/node_modules/micromark-core-commonmark/dev/lib/label-start-image.d.ts.map +1 -0
  253. package/node_modules/micromark-core-commonmark/dev/lib/label-start-image.js +119 -0
  254. package/node_modules/micromark-core-commonmark/dev/lib/label-start-link.d.ts +4 -0
  255. package/node_modules/micromark-core-commonmark/dev/lib/label-start-link.d.ts.map +1 -0
  256. package/node_modules/micromark-core-commonmark/dev/lib/label-start-link.js +71 -0
  257. package/node_modules/micromark-core-commonmark/dev/lib/line-ending.d.ts +4 -0
  258. package/node_modules/micromark-core-commonmark/dev/lib/line-ending.d.ts.map +1 -0
  259. package/node_modules/micromark-core-commonmark/dev/lib/line-ending.js +34 -0
  260. package/node_modules/micromark-core-commonmark/dev/lib/list.d.ts +4 -0
  261. package/node_modules/micromark-core-commonmark/dev/lib/list.d.ts.map +1 -0
  262. package/node_modules/micromark-core-commonmark/dev/lib/list.js +306 -0
  263. package/node_modules/micromark-core-commonmark/dev/lib/partial-non-lazy-continuation.d.ts +4 -0
  264. package/node_modules/micromark-core-commonmark/dev/lib/partial-non-lazy-continuation.d.ts.map +1 -0
  265. package/node_modules/micromark-core-commonmark/dev/lib/partial-non-lazy-continuation.js +67 -0
  266. package/node_modules/micromark-core-commonmark/dev/lib/setext-underline.d.ts +4 -0
  267. package/node_modules/micromark-core-commonmark/dev/lib/setext-underline.d.ts.map +1 -0
  268. package/node_modules/micromark-core-commonmark/dev/lib/setext-underline.js +213 -0
  269. package/node_modules/micromark-core-commonmark/dev/lib/thematic-break.d.ts +4 -0
  270. package/node_modules/micromark-core-commonmark/dev/lib/thematic-break.d.ts.map +1 -0
  271. package/node_modules/micromark-core-commonmark/dev/lib/thematic-break.js +120 -0
  272. package/node_modules/micromark-core-commonmark/index.d.ts +23 -0
  273. package/node_modules/micromark-core-commonmark/index.d.ts.map +1 -0
  274. package/node_modules/micromark-core-commonmark/index.js +22 -0
  275. package/node_modules/micromark-core-commonmark/lib/attention.d.ts +4 -0
  276. package/node_modules/micromark-core-commonmark/lib/attention.d.ts.map +1 -0
  277. package/node_modules/micromark-core-commonmark/lib/attention.js +231 -0
  278. package/node_modules/micromark-core-commonmark/lib/autolink.d.ts +4 -0
  279. package/node_modules/micromark-core-commonmark/lib/autolink.d.ts.map +1 -0
  280. package/node_modules/micromark-core-commonmark/lib/autolink.js +233 -0
  281. package/node_modules/micromark-core-commonmark/lib/blank-line.d.ts +4 -0
  282. package/node_modules/micromark-core-commonmark/lib/blank-line.d.ts.map +1 -0
  283. package/node_modules/micromark-core-commonmark/lib/blank-line.js +61 -0
  284. package/node_modules/micromark-core-commonmark/lib/block-quote.d.ts +4 -0
  285. package/node_modules/micromark-core-commonmark/lib/block-quote.d.ts.map +1 -0
  286. package/node_modules/micromark-core-commonmark/lib/block-quote.js +143 -0
  287. package/node_modules/micromark-core-commonmark/lib/character-escape.d.ts +4 -0
  288. package/node_modules/micromark-core-commonmark/lib/character-escape.d.ts.map +1 -0
  289. package/node_modules/micromark-core-commonmark/lib/character-escape.js +64 -0
  290. package/node_modules/micromark-core-commonmark/lib/character-reference.d.ts +4 -0
  291. package/node_modules/micromark-core-commonmark/lib/character-reference.d.ts.map +1 -0
  292. package/node_modules/micromark-core-commonmark/lib/character-reference.js +149 -0
  293. package/node_modules/micromark-core-commonmark/lib/code-fenced.d.ts +4 -0
  294. package/node_modules/micromark-core-commonmark/lib/code-fenced.d.ts.map +1 -0
  295. package/node_modules/micromark-core-commonmark/lib/code-fenced.js +422 -0
  296. package/node_modules/micromark-core-commonmark/lib/code-indented.d.ts +4 -0
  297. package/node_modules/micromark-core-commonmark/lib/code-indented.d.ts.map +1 -0
  298. package/node_modules/micromark-core-commonmark/lib/code-indented.js +159 -0
  299. package/node_modules/micromark-core-commonmark/lib/code-text.d.ts +4 -0
  300. package/node_modules/micromark-core-commonmark/lib/code-text.d.ts.map +1 -0
  301. package/node_modules/micromark-core-commonmark/lib/code-text.js +225 -0
  302. package/node_modules/micromark-core-commonmark/lib/content.d.ts +7 -0
  303. package/node_modules/micromark-core-commonmark/lib/content.d.ts.map +1 -0
  304. package/node_modules/micromark-core-commonmark/lib/content.js +163 -0
  305. package/node_modules/micromark-core-commonmark/lib/definition.d.ts +4 -0
  306. package/node_modules/micromark-core-commonmark/lib/definition.d.ts.map +1 -0
  307. package/node_modules/micromark-core-commonmark/lib/definition.js +254 -0
  308. package/node_modules/micromark-core-commonmark/lib/hard-break-escape.d.ts +4 -0
  309. package/node_modules/micromark-core-commonmark/lib/hard-break-escape.d.ts.map +1 -0
  310. package/node_modules/micromark-core-commonmark/lib/hard-break-escape.js +60 -0
  311. package/node_modules/micromark-core-commonmark/lib/heading-atx.d.ts +4 -0
  312. package/node_modules/micromark-core-commonmark/lib/heading-atx.d.ts.map +1 -0
  313. package/node_modules/micromark-core-commonmark/lib/heading-atx.js +191 -0
  314. package/node_modules/micromark-core-commonmark/lib/html-flow.d.ts +4 -0
  315. package/node_modules/micromark-core-commonmark/lib/html-flow.d.ts.map +1 -0
  316. package/node_modules/micromark-core-commonmark/lib/html-flow.js +827 -0
  317. package/node_modules/micromark-core-commonmark/lib/html-text.d.ts +4 -0
  318. package/node_modules/micromark-core-commonmark/lib/html-text.d.ts.map +1 -0
  319. package/node_modules/micromark-core-commonmark/lib/html-text.js +678 -0
  320. package/node_modules/micromark-core-commonmark/lib/label-end.d.ts +4 -0
  321. package/node_modules/micromark-core-commonmark/lib/label-end.d.ts.map +1 -0
  322. package/node_modules/micromark-core-commonmark/lib/label-end.js +561 -0
  323. package/node_modules/micromark-core-commonmark/lib/label-start-image.d.ts +4 -0
  324. package/node_modules/micromark-core-commonmark/lib/label-start-image.d.ts.map +1 -0
  325. package/node_modules/micromark-core-commonmark/lib/label-start-image.js +110 -0
  326. package/node_modules/micromark-core-commonmark/lib/label-start-link.d.ts +4 -0
  327. package/node_modules/micromark-core-commonmark/lib/label-start-link.d.ts.map +1 -0
  328. package/node_modules/micromark-core-commonmark/lib/label-start-link.js +63 -0
  329. package/node_modules/micromark-core-commonmark/lib/line-ending.d.ts +4 -0
  330. package/node_modules/micromark-core-commonmark/lib/line-ending.d.ts.map +1 -0
  331. package/node_modules/micromark-core-commonmark/lib/line-ending.js +33 -0
  332. package/node_modules/micromark-core-commonmark/lib/list.d.ts +4 -0
  333. package/node_modules/micromark-core-commonmark/lib/list.d.ts.map +1 -0
  334. package/node_modules/micromark-core-commonmark/lib/list.js +213 -0
  335. package/node_modules/micromark-core-commonmark/lib/partial-non-lazy-continuation.d.ts +4 -0
  336. package/node_modules/micromark-core-commonmark/lib/partial-non-lazy-continuation.d.ts.map +1 -0
  337. package/node_modules/micromark-core-commonmark/lib/partial-non-lazy-continuation.js +61 -0
  338. package/node_modules/micromark-core-commonmark/lib/setext-underline.d.ts +4 -0
  339. package/node_modules/micromark-core-commonmark/lib/setext-underline.d.ts.map +1 -0
  340. package/node_modules/micromark-core-commonmark/lib/setext-underline.js +187 -0
  341. package/node_modules/micromark-core-commonmark/lib/thematic-break.d.ts +4 -0
  342. package/node_modules/micromark-core-commonmark/lib/thematic-break.d.ts.map +1 -0
  343. package/node_modules/micromark-core-commonmark/lib/thematic-break.js +102 -0
  344. package/node_modules/micromark-core-commonmark/license +22 -0
  345. package/node_modules/micromark-core-commonmark/package.json +62 -0
  346. package/node_modules/micromark-core-commonmark/readme.md +171 -0
  347. package/node_modules/micromark-factory-destination/dev/index.d.ts +42 -0
  348. package/node_modules/micromark-factory-destination/dev/index.d.ts.map +1 -0
  349. package/node_modules/micromark-factory-destination/dev/index.js +255 -0
  350. package/node_modules/micromark-factory-destination/index.d.ts +42 -0
  351. package/node_modules/micromark-factory-destination/index.d.ts.map +1 -0
  352. package/node_modules/micromark-factory-destination/index.js +206 -0
  353. package/node_modules/micromark-factory-destination/license +22 -0
  354. package/node_modules/micromark-factory-destination/package.json +57 -0
  355. package/node_modules/micromark-factory-destination/readme.md +234 -0
  356. package/node_modules/micromark-factory-label/dev/index.d.ts +37 -0
  357. package/node_modules/micromark-factory-label/dev/index.d.ts.map +1 -0
  358. package/node_modules/micromark-factory-label/dev/index.js +172 -0
  359. package/node_modules/micromark-factory-label/index.d.ts +37 -0
  360. package/node_modules/micromark-factory-label/index.d.ts.map +1 -0
  361. package/node_modules/micromark-factory-label/index.js +148 -0
  362. package/node_modules/micromark-factory-label/license +22 -0
  363. package/node_modules/micromark-factory-label/package.json +60 -0
  364. package/node_modules/micromark-factory-label/readme.md +224 -0
  365. package/node_modules/micromark-factory-space/dev/index.d.ts +60 -0
  366. package/node_modules/micromark-factory-space/dev/index.d.ts.map +1 -0
  367. package/node_modules/micromark-factory-space/dev/index.js +122 -0
  368. package/node_modules/micromark-factory-space/index.d.ts +60 -0
  369. package/node_modules/micromark-factory-space/index.d.ts.map +1 -0
  370. package/node_modules/micromark-factory-space/index.js +116 -0
  371. package/node_modules/micromark-factory-space/license +22 -0
  372. package/node_modules/micromark-factory-space/package.json +46 -0
  373. package/node_modules/micromark-factory-space/readme.md +225 -0
  374. package/node_modules/micromark-factory-title/dev/index.d.ts +36 -0
  375. package/node_modules/micromark-factory-title/dev/index.d.ts.map +1 -0
  376. package/node_modules/micromark-factory-title/dev/index.js +169 -0
  377. package/node_modules/micromark-factory-title/index.d.ts +36 -0
  378. package/node_modules/micromark-factory-title/index.d.ts.map +1 -0
  379. package/node_modules/micromark-factory-title/index.js +158 -0
  380. package/node_modules/micromark-factory-title/license +22 -0
  381. package/node_modules/micromark-factory-title/package.json +58 -0
  382. package/node_modules/micromark-factory-title/readme.md +229 -0
  383. package/node_modules/micromark-factory-whitespace/dev/index.d.ts +22 -0
  384. package/node_modules/micromark-factory-whitespace/dev/index.d.ts.map +1 -0
  385. package/node_modules/micromark-factory-whitespace/dev/index.js +53 -0
  386. package/node_modules/micromark-factory-whitespace/index.d.ts +22 -0
  387. package/node_modules/micromark-factory-whitespace/index.d.ts.map +1 -0
  388. package/node_modules/micromark-factory-whitespace/index.js +44 -0
  389. package/node_modules/micromark-factory-whitespace/license +22 -0
  390. package/node_modules/micromark-factory-whitespace/package.json +57 -0
  391. package/node_modules/micromark-factory-whitespace/readme.md +205 -0
  392. package/node_modules/micromark-util-character/dev/index.d.ts +195 -0
  393. package/node_modules/micromark-util-character/dev/index.d.ts.map +1 -0
  394. package/node_modules/micromark-util-character/dev/index.js +252 -0
  395. package/node_modules/micromark-util-character/index.d.ts +195 -0
  396. package/node_modules/micromark-util-character/index.d.ts.map +1 -0
  397. package/node_modules/micromark-util-character/index.js +246 -0
  398. package/node_modules/micromark-util-character/license +22 -0
  399. package/node_modules/micromark-util-character/package.json +57 -0
  400. package/node_modules/micromark-util-character/readme.md +446 -0
  401. package/node_modules/micromark-util-chunked/dev/index.d.ts +41 -0
  402. package/node_modules/micromark-util-chunked/dev/index.d.ts.map +1 -0
  403. package/node_modules/micromark-util-chunked/dev/index.js +89 -0
  404. package/node_modules/micromark-util-chunked/index.d.ts +41 -0
  405. package/node_modules/micromark-util-chunked/index.d.ts.map +1 -0
  406. package/node_modules/micromark-util-chunked/index.js +81 -0
  407. package/node_modules/micromark-util-chunked/license +22 -0
  408. package/node_modules/micromark-util-chunked/package.json +57 -0
  409. package/node_modules/micromark-util-chunked/readme.md +219 -0
  410. package/node_modules/micromark-util-classify-character/dev/index.d.ts +18 -0
  411. package/node_modules/micromark-util-classify-character/dev/index.d.ts.map +1 -0
  412. package/node_modules/micromark-util-classify-character/dev/index.js +38 -0
  413. package/node_modules/micromark-util-classify-character/index.d.ts +18 -0
  414. package/node_modules/micromark-util-classify-character/index.d.ts.map +1 -0
  415. package/node_modules/micromark-util-classify-character/index.js +27 -0
  416. package/node_modules/micromark-util-classify-character/license +22 -0
  417. package/node_modules/micromark-util-classify-character/package.json +59 -0
  418. package/node_modules/micromark-util-classify-character/readme.md +205 -0
  419. package/node_modules/micromark-util-combine-extensions/index.d.ts +22 -0
  420. package/node_modules/micromark-util-combine-extensions/index.d.ts.map +1 -0
  421. package/node_modules/micromark-util-combine-extensions/index.js +143 -0
  422. package/node_modules/micromark-util-combine-extensions/license +22 -0
  423. package/node_modules/micromark-util-combine-extensions/package.json +52 -0
  424. package/node_modules/micromark-util-combine-extensions/readme.md +201 -0
  425. package/node_modules/micromark-util-decode-numeric-character-reference/dev/index.d.ts +16 -0
  426. package/node_modules/micromark-util-decode-numeric-character-reference/dev/index.d.ts.map +1 -0
  427. package/node_modules/micromark-util-decode-numeric-character-reference/dev/index.js +42 -0
  428. package/node_modules/micromark-util-decode-numeric-character-reference/index.d.ts +16 -0
  429. package/node_modules/micromark-util-decode-numeric-character-reference/index.d.ts.map +1 -0
  430. package/node_modules/micromark-util-decode-numeric-character-reference/index.js +32 -0
  431. package/node_modules/micromark-util-decode-numeric-character-reference/license +22 -0
  432. package/node_modules/micromark-util-decode-numeric-character-reference/package.json +59 -0
  433. package/node_modules/micromark-util-decode-numeric-character-reference/readme.md +184 -0
  434. package/node_modules/micromark-util-decode-string/dev/index.d.ts +14 -0
  435. package/node_modules/micromark-util-decode-string/dev/index.d.ts.map +1 -0
  436. package/node_modules/micromark-util-decode-string/dev/index.js +53 -0
  437. package/node_modules/micromark-util-decode-string/index.d.ts +14 -0
  438. package/node_modules/micromark-util-decode-string/index.d.ts.map +1 -0
  439. package/node_modules/micromark-util-decode-string/index.js +45 -0
  440. package/node_modules/micromark-util-decode-string/license +22 -0
  441. package/node_modules/micromark-util-decode-string/package.json +63 -0
  442. package/node_modules/micromark-util-decode-string/readme.md +179 -0
  443. package/node_modules/micromark-util-edit-map/dev/index.d.ts +78 -0
  444. package/node_modules/micromark-util-edit-map/dev/index.d.ts.map +1 -0
  445. package/node_modules/micromark-util-edit-map/dev/index.js +237 -0
  446. package/node_modules/micromark-util-edit-map/index.d.ts +78 -0
  447. package/node_modules/micromark-util-edit-map/index.d.ts.map +1 -0
  448. package/node_modules/micromark-util-edit-map/index.js +225 -0
  449. package/node_modules/micromark-util-edit-map/license +22 -0
  450. package/node_modules/micromark-util-edit-map/package.json +48 -0
  451. package/node_modules/micromark-util-edit-map/readme.md +234 -0
  452. package/node_modules/micromark-util-encode/index.d.ts +14 -0
  453. package/node_modules/micromark-util-encode/index.d.ts.map +1 -0
  454. package/node_modules/micromark-util-encode/index.js +33 -0
  455. package/node_modules/micromark-util-encode/license +22 -0
  456. package/node_modules/micromark-util-encode/package.json +47 -0
  457. package/node_modules/micromark-util-encode/readme.md +176 -0
  458. package/node_modules/micromark-util-html-tag-name/index.d.ts +30 -0
  459. package/node_modules/micromark-util-html-tag-name/index.d.ts.map +1 -0
  460. package/node_modules/micromark-util-html-tag-name/index.js +93 -0
  461. package/node_modules/micromark-util-html-tag-name/license +22 -0
  462. package/node_modules/micromark-util-html-tag-name/package.json +47 -0
  463. package/node_modules/micromark-util-html-tag-name/readme.md +193 -0
  464. package/node_modules/micromark-util-normalize-identifier/dev/index.d.ts +21 -0
  465. package/node_modules/micromark-util-normalize-identifier/dev/index.d.ts.map +1 -0
  466. package/node_modules/micromark-util-normalize-identifier/dev/index.js +38 -0
  467. package/node_modules/micromark-util-normalize-identifier/index.d.ts +21 -0
  468. package/node_modules/micromark-util-normalize-identifier/index.d.ts.map +1 -0
  469. package/node_modules/micromark-util-normalize-identifier/index.js +33 -0
  470. package/node_modules/micromark-util-normalize-identifier/license +22 -0
  471. package/node_modules/micromark-util-normalize-identifier/package.json +58 -0
  472. package/node_modules/micromark-util-normalize-identifier/readme.md +187 -0
  473. package/node_modules/micromark-util-resolve-all/index.d.ts +22 -0
  474. package/node_modules/micromark-util-resolve-all/index.d.ts.map +1 -0
  475. package/node_modules/micromark-util-resolve-all/index.js +32 -0
  476. package/node_modules/micromark-util-resolve-all/license +22 -0
  477. package/node_modules/micromark-util-resolve-all/package.json +48 -0
  478. package/node_modules/micromark-util-resolve-all/readme.md +238 -0
  479. package/node_modules/micromark-util-sanitize-uri/dev/index.d.ts +36 -0
  480. package/node_modules/micromark-util-sanitize-uri/dev/index.d.ts.map +1 -0
  481. package/node_modules/micromark-util-sanitize-uri/dev/index.js +124 -0
  482. package/node_modules/micromark-util-sanitize-uri/index.d.ts +36 -0
  483. package/node_modules/micromark-util-sanitize-uri/index.d.ts.map +1 -0
  484. package/node_modules/micromark-util-sanitize-uri/index.js +107 -0
  485. package/node_modules/micromark-util-sanitize-uri/license +22 -0
  486. package/node_modules/micromark-util-sanitize-uri/package.json +59 -0
  487. package/node_modules/micromark-util-sanitize-uri/readme.md +214 -0
  488. package/node_modules/micromark-util-subtokenize/dev/index.d.ts +12 -0
  489. package/node_modules/micromark-util-subtokenize/dev/index.d.ts.map +1 -0
  490. package/node_modules/micromark-util-subtokenize/dev/index.js +284 -0
  491. package/node_modules/micromark-util-subtokenize/dev/lib/splice-buffer.d.ts +161 -0
  492. package/node_modules/micromark-util-subtokenize/dev/lib/splice-buffer.d.ts.map +1 -0
  493. package/node_modules/micromark-util-subtokenize/dev/lib/splice-buffer.js +288 -0
  494. package/node_modules/micromark-util-subtokenize/index.d.ts +12 -0
  495. package/node_modules/micromark-util-subtokenize/index.d.ts.map +1 -0
  496. package/node_modules/micromark-util-subtokenize/index.js +228 -0
  497. package/node_modules/micromark-util-subtokenize/lib/splice-buffer.d.ts +161 -0
  498. package/node_modules/micromark-util-subtokenize/lib/splice-buffer.d.ts.map +1 -0
  499. package/node_modules/micromark-util-subtokenize/lib/splice-buffer.js +251 -0
  500. package/node_modules/micromark-util-subtokenize/license +22 -0
  501. package/node_modules/micromark-util-subtokenize/package.json +60 -0
  502. package/node_modules/micromark-util-subtokenize/readme.md +181 -0
  503. package/node_modules/micromark-util-symbol/lib/codes.d.ts +139 -0
  504. package/node_modules/micromark-util-symbol/lib/codes.d.ts.map +1 -0
  505. package/node_modules/micromark-util-symbol/lib/codes.js +158 -0
  506. package/node_modules/micromark-util-symbol/lib/constants.d.ts +37 -0
  507. package/node_modules/micromark-util-symbol/lib/constants.d.ts.map +1 -0
  508. package/node_modules/micromark-util-symbol/lib/constants.js +44 -0
  509. package/node_modules/micromark-util-symbol/lib/default.d.ts +5 -0
  510. package/node_modules/micromark-util-symbol/lib/default.d.ts.map +1 -0
  511. package/node_modules/micromark-util-symbol/lib/default.js +4 -0
  512. package/node_modules/micromark-util-symbol/lib/types.d.ts +106 -0
  513. package/node_modules/micromark-util-symbol/lib/types.d.ts.map +1 -0
  514. package/node_modules/micromark-util-symbol/lib/types.js +453 -0
  515. package/node_modules/micromark-util-symbol/lib/values.d.ts +102 -0
  516. package/node_modules/micromark-util-symbol/lib/values.d.ts.map +1 -0
  517. package/node_modules/micromark-util-symbol/lib/values.js +109 -0
  518. package/node_modules/micromark-util-symbol/license +22 -0
  519. package/node_modules/micromark-util-symbol/package.json +43 -0
  520. package/node_modules/micromark-util-symbol/readme.md +168 -0
  521. package/node_modules/micromark-util-types/index.d.ts +1315 -0
  522. package/node_modules/micromark-util-types/index.js +2 -0
  523. package/node_modules/micromark-util-types/license +22 -0
  524. package/node_modules/micromark-util-types/package.json +37 -0
  525. package/node_modules/micromark-util-types/readme.md +151 -0
  526. package/node_modules/smol-toml/LICENSE +24 -0
  527. package/node_modules/smol-toml/README.md +605 -0
  528. package/node_modules/smol-toml/dist/date.d.ts +41 -0
  529. package/node_modules/smol-toml/dist/date.js +156 -0
  530. package/node_modules/smol-toml/dist/error.d.ts +37 -0
  531. package/node_modules/smol-toml/dist/error.js +67 -0
  532. package/node_modules/smol-toml/dist/extract.js +289 -0
  533. package/node_modules/smol-toml/dist/index.cjs +770 -0
  534. package/node_modules/smol-toml/dist/index.d.ts +44 -0
  535. package/node_modules/smol-toml/dist/index.js +34 -0
  536. package/node_modules/smol-toml/dist/parse.d.ts +73 -0
  537. package/node_modules/smol-toml/dist/parse.js +164 -0
  538. package/node_modules/smol-toml/dist/primitive.js +151 -0
  539. package/node_modules/smol-toml/dist/stringify.d.ts +32 -0
  540. package/node_modules/smol-toml/dist/stringify.js +219 -0
  541. package/node_modules/smol-toml/dist/struct.js +156 -0
  542. package/node_modules/smol-toml/dist/util.d.ts +43 -0
  543. package/node_modules/smol-toml/dist/util.js +57 -0
  544. package/node_modules/smol-toml/package.json +68 -0
  545. package/node_modules/unist-util-stringify-position/index.d.ts +1 -0
  546. package/node_modules/unist-util-stringify-position/index.js +1 -0
  547. package/node_modules/unist-util-stringify-position/lib/index.d.ts +61 -0
  548. package/node_modules/unist-util-stringify-position/lib/index.js +84 -0
  549. package/node_modules/unist-util-stringify-position/license +22 -0
  550. package/node_modules/unist-util-stringify-position/package.json +80 -0
  551. package/node_modules/unist-util-stringify-position/readme.md +206 -0
  552. package/package.json +27 -8
  553. package/scripts/prepare-github-keyring.js +29 -0
  554. package/src/codex-app.js +20 -2
  555. package/src/codex-pricing.js +79 -0
  556. package/src/codex-projects.js +90 -0
  557. package/src/codex-session-scanner.js +748 -0
  558. package/src/codex-session-usage.js +332 -0
  559. package/src/dashboard/app.js +2 -2
  560. package/src/dashboard/dist/app.js +135 -60
  561. package/src/dashboard/dist/app.js.map +1 -1
  562. package/src/dashboard/dist/styles.css +1 -1
  563. package/src/dashboard/react/components/AnimatedUsage.test.tsx +78 -0
  564. package/src/dashboard/react/components/CardStatusIcons.test.tsx +146 -0
  565. package/src/dashboard/react/components/CardStatusIcons.tsx +138 -0
  566. package/src/dashboard/react/components/ImageGallery.tsx +22 -0
  567. package/src/dashboard/react/components/ModelSettings.test.tsx +4 -4
  568. package/src/dashboard/react/components/ModelSettings.tsx +1 -1
  569. package/src/dashboard/react/components/OpenChatButton.test.tsx +19 -0
  570. package/src/dashboard/react/components/OpenChatButton.tsx +2 -1
  571. package/src/dashboard/react/components/PrGlyph.tsx +35 -0
  572. package/src/dashboard/react/components/PullRequestBadges.tsx +18 -0
  573. package/src/dashboard/react/components/QueuedPrompts.test.tsx +42 -0
  574. package/src/dashboard/react/components/QueuedPrompts.tsx +34 -0
  575. package/src/dashboard/react/components/RelativeTime.test.tsx +100 -0
  576. package/src/dashboard/react/components/RelativeTime.tsx +46 -11
  577. package/src/dashboard/react/components/ReplyCover.test.tsx +30 -0
  578. package/src/dashboard/react/components/ReplyCover.tsx +33 -0
  579. package/src/dashboard/react/components/ReplyImagePreview.test.tsx +90 -0
  580. package/src/dashboard/react/components/ReplyImagePreview.tsx +34 -0
  581. package/src/dashboard/react/components/ReplyMarkdown.test.tsx +108 -0
  582. package/src/dashboard/react/components/ReplyMarkdown.tsx +112 -0
  583. package/src/dashboard/react/components/SavedUsageFormat.test.tsx +11 -0
  584. package/src/dashboard/react/components/SavedUsageFormat.tsx +68 -0
  585. package/src/dashboard/react/components/StatusBadge.tsx +2 -2
  586. package/src/dashboard/react/components/TaskBoard.test.tsx +256 -1
  587. package/src/dashboard/react/components/TaskBoard.tsx +136 -28
  588. package/src/dashboard/react/components/TaskCard.tsx +7 -4
  589. package/src/dashboard/react/components/TaskDetail.test.tsx +92 -1
  590. package/src/dashboard/react/components/TaskDetail.tsx +37 -10
  591. package/src/dashboard/react/components/TurnContent.test.tsx +44 -0
  592. package/src/dashboard/react/components/TurnContent.tsx +53 -0
  593. package/src/dashboard/react/components/UsagePanel.tsx +2 -2
  594. package/src/dashboard/react/image-cache.test.ts +23 -0
  595. package/src/dashboard/react/image-cache.ts +33 -0
  596. package/src/dashboard/react/presentation.test.tsx +31 -0
  597. package/src/dashboard/react/styles.css +126 -2
  598. package/src/dashboard/react/types.ts +55 -1
  599. package/src/dashboard/time.js +39 -0
  600. package/src/dashboard.js +4 -3
  601. package/src/data/codex-pricing.json +537 -0
  602. package/src/mcp-app/dist/index.html +216 -112
  603. package/src/mcp-app/react/AppearancePicker.test.tsx +50 -0
  604. package/src/mcp-app/react/AppearancePicker.tsx +56 -0
  605. package/src/mcp-app/react/GitHubConnection.test.tsx +78 -0
  606. package/src/mcp-app/react/GitHubConnection.tsx +78 -0
  607. package/src/mcp-app/react/NextNotificationCenter.test.tsx +121 -0
  608. package/src/mcp-app/react/NextNotificationCenter.tsx +94 -0
  609. package/src/mcp-app/react/NextTaskDetail.test.tsx +124 -0
  610. package/src/mcp-app/react/NextTaskDetail.tsx +147 -0
  611. package/src/mcp-app/react/ProjectPicker.tsx +49 -0
  612. package/src/mcp-app/react/main.test.tsx +499 -49
  613. package/src/mcp-app/react/main.tsx +359 -86
  614. package/src/mcp-app/react/styles.css +186 -9
  615. package/src/mcp-app/react/themes.test.ts +34 -0
  616. package/src/mcp-app/react/themes.ts +112 -0
  617. package/src/mcp-app.js +238 -120
  618. package/src/mcp.js +8 -1
  619. package/src/next-cache.js +16 -0
  620. package/src/next-github.js +273 -0
  621. package/src/next-notifications.js +90 -0
  622. package/src/recorded-usage-tracker.js +92 -0
  623. package/src/reply-image.js +65 -0
  624. package/src/usage-tracker.js +7 -6
  625. package/src/usage.js +7 -355
  626. package/src/user-prompt.js +55 -0
  627. package/src/version.js +0 -1
  628. package/node_modules/proper-lockfile/CHANGELOG.md +0 -108
  629. package/node_modules/which/CHANGELOG.md +0 -166
  630. package/src/resolve-ccusage.js +0 -17
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "taskchef",
3
- "version": "8.6.2",
3
+ "version": "8.7.0",
4
4
  "description": "Dispatch work from a data-only workspace to visible Codex project tasks.",
5
5
  "author": {
6
6
  "name": "Favo Yang",
package/README.md CHANGED
@@ -47,10 +47,14 @@ every task.
47
47
 
48
48
  The screenshots in this walkthrough use illustrative demo data. Open the
49
49
  dashboard beside TaskChef master to see both tasks across your projects.
50
- In Codex, you can also call `open_taskchef_board` for a compact [sidebar app](docs/mcp-app.md)
51
- with a task board, task details, chat links, and confirmed manual status changes.
52
- **Board** groups tasks by **Working**, **Needs input**, **Completed**, and
53
- **Failed** so you can see their status at a glance.
50
+ In Codex, call `open_taskchef_board` for the [TaskChef sidebar](docs/mcp-app.md).
51
+ It reads local Codex data and groups chats as **Scheduled**, **Running**,
52
+ **Waiting for input/review**, and **Done**. Interrupted chats stay in Waiting with an **Interrupted** tag. Empty board columns remain visible with a short message. Ambiguous records stay
53
+ **Unverified**. Running follows the latest selected turn
54
+ state; these labels do not prove task outcomes. Mark Done writes only TaskChef's separate local state. A new Codex turn
55
+ resets that mark.
56
+ The main dashboard's **Board** groups reported tasks by **Working**,
57
+ **Needs input**, **Completed**, and **Failed** so you can see their status at a glance.
54
58
 
55
59
  ![TaskChef master beside the dashboard board with recipe-book working and payments needing input](docs/images/readme-board.png)
56
60
 
@@ -0,0 +1,19 @@
1
+ # TaskChef icons
2
+
3
+ All icons use the same chef hat and T artwork. The SVG files are the editable sources.
4
+
5
+ | Use | File | Background |
6
+ | --- | --- | --- |
7
+ | App and navbar, light theme | `taskchef.svg` | Rounded orange square; transparent outside |
8
+ | App and navbar, dark theme | `taskchef-dark.svg` | Rounded orange square; transparent outside |
9
+ | App icon PNG export, dark theme | `taskchef-app-rounded.png` | Rounded orange square; transparent outside |
10
+ | Sidebar preview, light theme | `taskchef-sidebar-light.svg` | Dark strokes; transparent |
11
+ | Sidebar preview, dark theme | `taskchef-sidebar-dark.svg` | Light strokes; transparent |
12
+ | Codex sidebar | `taskchef-sidebar.svg` | Monochrome `currentColor`; transparent |
13
+ | GitHub and other services that apply a circle crop | `taskchef-avatar-square.svg`, `taskchef-avatar-square.png` | Solid orange to all four edges |
14
+
15
+ The app and sidebar SVGs are unchanged. The square avatar uses the current dark-theme navbar artwork and colors. Its hat is enlarged by 30% and centered for circle crops. The two sidebar preview files show the same light/dark colors that the MCP server already provides; the runtime continues to use the theme-neutral template. Both PNG exports are 512 × 512 pixels.
16
+
17
+ For GitHub, upload `taskchef-avatar-square.png` and set the badge background color to `#F59E0B`. Keep the full image when GitHub asks for a crop.
18
+
19
+ Export PNGs directly from the SVG sources. Do not use an image generator: these are flat vector icons, with no gradients, shadows, or texture.
Binary file
@@ -0,0 +1,8 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" width="512" height="512" viewBox="0 0 48 48" fill="none">
2
+ <rect width="48" height="48" fill="#F59E0B"/>
3
+ <g transform="translate(24 24) scale(1.3) translate(-24 -23.5)">
4
+ <path d="M15 37V27.5C11.9 26.3 10 23.6 10 20.5C10 16.4 13.4 13 17.5 13C19 10 21.2 8.5 24 8.5C26.8 8.5 29 10 30.5 13C34.6 13 38 16.4 38 20.5C38 23.6 36.1 26.3 33 27.5V37H15Z" fill="#FFFBEB"/>
5
+ <path d="M18.5 20H29.5M24 20V31" stroke="#78350F" stroke-width="3.5" stroke-linecap="round"/>
6
+ <path d="M15 37H33" stroke="#78350F" stroke-width="3" stroke-linecap="round"/>
7
+ </g>
8
+ </svg>
@@ -0,0 +1,6 @@
1
+ <svg style="color:#dddddd" xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 20 20" fill="none">
2
+ <g transform="scale(.625) translate(-8 -7)" stroke="currentColor" stroke-width="2.128" stroke-linecap="round" stroke-linejoin="round">
3
+ <path d="M15 37V27.5C11.9 26.3 10 23.6 10 20.5C10 16.4 13.4 13 17.5 13C19 10 21.2 8.5 24 8.5C26.8 8.5 29 10 30.5 13C34.6 13 38 16.4 38 20.5C38 23.6 36.1 26.3 33 27.5V37H15Z"/>
4
+ <path d="M18.5 20H29.5M24 20V31M15 33H33"/>
5
+ </g>
6
+ </svg>
@@ -0,0 +1,6 @@
1
+ <svg style="color:#333333" xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 20 20" fill="none">
2
+ <g transform="scale(.625) translate(-8 -7)" stroke="currentColor" stroke-width="2.128" stroke-linecap="round" stroke-linejoin="round">
3
+ <path d="M15 37V27.5C11.9 26.3 10 23.6 10 20.5C10 16.4 13.4 13 17.5 13C19 10 21.2 8.5 24 8.5C26.8 8.5 29 10 30.5 13C34.6 13 38 16.4 38 20.5C38 23.6 36.1 26.3 33 27.5V37H15Z"/>
4
+ <path d="M18.5 20H29.5M24 20V31M15 33H33"/>
5
+ </g>
6
+ </svg>
@@ -0,0 +1,6 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 20 20" fill="none">
2
+ <g transform="scale(.625) translate(-8 -7)" stroke="currentColor" stroke-width="2.128" stroke-linecap="round" stroke-linejoin="round">
3
+ <path d="M15 37V27.5C11.9 26.3 10 23.6 10 20.5C10 16.4 13.4 13 17.5 13C19 10 21.2 8.5 24 8.5C26.8 8.5 29 10 30.5 13C34.6 13 38 16.4 38 20.5C38 23.6 36.1 26.3 33 27.5V37H15Z"/>
4
+ <path d="M18.5 20H29.5M24 20V31M15 33H33"/>
5
+ </g>
6
+ </svg>
@@ -7,15 +7,10 @@ Detailed setup, operation, recovery, and development reference for TaskChef.
7
7
  TaskChef requires Node.js 18 or newer, Git, Codex desktop, and local access to
8
8
  the projects that will receive work.
9
9
 
10
- TaskChef pins [`ccusage`](https://github.com/ccusage/ccusage) as an optional
11
- dependency for dashboard token and API-equivalent cost estimates. A normal npm
12
- installation uses that package-local executable; plugin-only installations use
13
- an npm-cache-friendly `npx` fallback to resolve the same exact version's native
14
- executable. `npx` never launches the analyzer against Codex data. TaskChef then
15
- requests ccusage's live-capable online pricing and falls back to its bundled
16
- offline snapshot, while never parsing Codex rollout files itself. Lifecycle
17
- reporting and the dashboard continue to work when ccusage, npm, or pricing is
18
- unavailable.
10
+ TaskChef uses its own accounting engine for token usage and API-equivalent cost
11
+ estimates. Usage requires Node.js 22.18+ and readable local Codex records.
12
+ It includes linked subagents and uses the same pricing data as the board.
13
+ Lifecycle reporting and the dashboard continue to work when usage is unavailable.
19
14
 
20
15
  ```sh
21
16
  codex plugin marketplace add favoyang/codex-plugins
@@ -49,7 +44,7 @@ The canonical workspace is `~/.agents/taskchef`. TaskChef owns only:
49
44
  AGENTS.md managed dispatcher instructions plus user additions
50
45
  taskchef.json schema-2 Codex project index, dashboard preference, and delegation metadata
51
46
  tasks.jsonl one task snapshot per line (schema 10; schema 4-9 migration supported)
52
- .taskchef-usage.json optional mode-0600 ccusage snapshot and turn-boundary cache
47
+ .taskchef-usage.json optional mode-0600 normalized usage cache
53
48
  ```
54
49
 
55
50
  To inspect or manually adjust the project index later, use the bootstrap skill:
@@ -356,24 +351,21 @@ will keep the feature disabled until Codex exposes a reliable supported
356
351
  app-callable archive interface or guarantees CLI compatibility. The dormant
357
352
  server path also rejects requests before discovering or invoking the CLI.
358
353
 
359
- Task details also show whole-task and per-turn token usage when `ccusage` can
360
- map the linked Codex thread. A completed turn briefly shows “Calculating token
361
- usage…” while TaskChef performs bounded deferred reconciliation, because
362
- the terminal lifecycle callback precedes Codex's final output write. The
363
- dashboard also preloads missing, interrupted, and retry-eligible usage in a
364
- bounded background queue at startup, after task changes, and on a periodic
365
- recovery pass; opening task details is not required to start collection. Historical
366
- tasks may show a trustworthy task total while older turns remain “Token usage
367
- unavailable” when no cumulative turn boundaries were recorded. Input, cached
368
- input, output, reasoning, and total counts retain ccusage's categories. Dollar
369
- figures are labeled API-equivalent estimates; provenance identifies the online
370
- pricing request or offline fallback mode, and zero-priced unknown models show
371
- cost unavailable rather than a misleading `$0.00`. Per-turn cost is also
372
- unavailable when its cumulative boundaries used different ccusage versions or
373
- pricing modes. TaskChef displays the cumulative estimate supplied by ccusage
374
- without applying a separate model-family or cache-write coverage policy.
354
+ Task details show chat totals and native per-turn usage from saved Codex records.
355
+ Historical tasks are read when needed, rather than scanned at startup. A turn
356
+ without a matching native Codex turn ID shows usage unavailable; its chat total
357
+ can still be shown. Missing logs and parent links make the known subtotal
358
+ incomplete. Input, cached input, output, reasoning, and total counts use Codex's
359
+ categories. Cached input and reasoning are subsets, not additional tokens.
360
+ Dollar figures are API-equivalent estimates, using the board's pricing table.
361
+ Unknown prices show cost unavailable or a known priced subtotal. Existing saved
362
+ usage projections remain readable. A partial scan cannot replace a larger known
363
+ historical subtotal; missing model prices cannot erase a saved priced subtotal.
364
+ `.taskchef-usage.json` holds the web view's
365
+ normalized projections; the underlying engine reuses the board disk caches.
366
+
375
367
  The same detail view reports lifecycle wall-clock elapsed time independently of
376
- ccusage. Each terminal turn shows **Elapsed** from `startedAt` to
368
+ token accounting. Each terminal turn shows **Elapsed** from `startedAt` to
377
369
  `result.updatedAt`; **Total reported work** sums only valid terminal-turn
378
370
  durations, excluding idle gaps and unfinished work. A working turn shows live
379
371
  **Elapsed so far** without contributing to the total. This is reported
@@ -381,8 +373,7 @@ wall-clock elapsed time, not model compute time, and malformed or reversed
381
373
  timestamp ranges are shown as unavailable.
382
374
  The header shows the running TaskChef package version reported by the same
383
375
  bounded health identity used for compatible-listener checks.
384
- The Settings page shows the ccusage version reported by the executable that
385
- TaskChef resolves at runtime.
376
+ The Settings page identifies TaskChef as the usage provider.
386
377
  The canonical port is normally owned by a dashboard session process initialized
387
378
  by the TaskChef MCP before its tool transport connects. MCP recovery reuses an
388
379
  exact-compatible same-workspace dashboard and reports its actual launcher;
@@ -23,3 +23,18 @@ rules.
23
23
 
24
24
  Check a dashboard page at desktop and narrow widths. Confirm keyboard focus,
25
25
  control operation, reachable overflow, and a clean browser console.
26
+
27
+ ### Latest-turn request and response
28
+
29
+ Running local Codex cards show the current request. Other cards show the latest
30
+ turn's response. Cards use a plain two-line preview without request bubbles.
31
+ Details pairs the same turn's request and response, each initially capped at
32
+ three lines with a Show more control. The request uses a right-aligned bubble.
33
+ Actual scheduled requests show their recorded instructions with a clock;
34
+ human follow-ups in scheduled chats use the normal request bubble.
35
+ Quoted selections render as Markdown quotes. File and image references show
36
+ attachment names, while generated request headings and context metadata are
37
+ removed from the display. Recorded input remains unchanged.
38
+
39
+ Earlier-turn PR fallbacks remain separate from this content: the status popup
40
+ shows `(Earlier turn PR)` below the PR link, aligned with the other row text.
@@ -0,0 +1,38 @@
1
+ <?xml version='1.0' encoding='utf-8'?>
2
+ <mxfile host="Electron">
3
+ <diagram id="main" name="Current reply lookup">
4
+ <mxGraphModel page="0" background="#ffffff">
5
+ <root>
6
+ <mxCell id="0" />
7
+ <mxCell id="1" parent="0" />
8
+ <mxCell id="title" value="&lt;b&gt;Example: find the current reply after reverting a chat&lt;/b&gt;" vertex="1" parent="1" style="whiteSpace=wrap;html=1;fontSize=16;fontColor=#172b4d;align=left;verticalAlign=top;spacing=14;fillColor=#ffffff;strokeColor=#9caec2;fillColor=none;strokeColor=none;fontSize=23;spacing=0;">
9
+ <mxGeometry as="geometry" x="40" y="20" width="1100" height="50" />
10
+ </mxCell>
11
+ <mxCell id="chat" value="&lt;b&gt;1. Chat C&lt;/b&gt;&lt;hr&gt;state_5.sqlite&lt;br&gt;threads.id = C&lt;br&gt;&lt;br&gt;rollout_path names&lt;br&gt;…-C_R.jsonl" vertex="1" parent="1" style="whiteSpace=wrap;html=1;fontSize=16;fontColor=#172b4d;align=left;verticalAlign=top;spacing=14;fillColor=#ffffff;strokeColor=#9caec2;fillColor=#edf4ff;">
12
+ <mxGeometry as="geometry" x="40" y="110" width="235" height="205" />
13
+ </mxCell>
14
+ <mxCell id="rollout" value="&lt;b&gt;2. Rollout R&lt;/b&gt;&lt;hr&gt;Take R from the&lt;br&gt;selected filename.&lt;br&gt;&lt;br&gt;This is a lookup step,&lt;br&gt;not a database table." vertex="1" parent="1" style="whiteSpace=wrap;html=1;fontSize=16;fontColor=#172b4d;align=left;verticalAlign=top;spacing=14;fillColor=#ffffff;strokeColor=#9caec2;fillColor=#fff8df;">
15
+ <mxGeometry as="geometry" x="340" y="110" width="235" height="205" />
16
+ </mxCell>
17
+ <mxCell id="turn" value="&lt;b&gt;3. Latest turn T&lt;/b&gt;&lt;hr&gt;thread_turns&lt;br&gt;thread_id = R&lt;br&gt;&lt;br&gt;Latest rollout_ordinal&lt;br&gt;gives turn_id = T." vertex="1" parent="1" style="whiteSpace=wrap;html=1;fontSize=16;fontColor=#172b4d;align=left;verticalAlign=top;spacing=14;fillColor=#ffffff;strokeColor=#9caec2;fillColor=#edf9f4;">
18
+ <mxGeometry as="geometry" x="640" y="110" width="235" height="205" />
19
+ </mxCell>
20
+ <mxCell id="reply" value="&lt;b&gt;4. Saved reply I&lt;/b&gt;&lt;hr&gt;thread_items&lt;br&gt;thread_id = R&lt;br&gt;turn_id = T&lt;br&gt;item_id = final_agent_item_id&lt;br&gt;&lt;br&gt;Read item_json.text." vertex="1" parent="1" style="whiteSpace=wrap;html=1;fontSize=16;fontColor=#172b4d;align=left;verticalAlign=top;spacing=14;fillColor=#ffffff;strokeColor=#9caec2;fillColor=#edf9f4;">
21
+ <mxGeometry as="geometry" x="940" y="110" width="255" height="205" />
22
+ </mxCell>
23
+ <mxCell id="edge0" parent="1" source="chat" target="rollout" edge="1" style="edgeStyle=orthogonalEdgeStyle;endArrow=classic;strokeWidth=2;">
24
+ <mxGeometry as="geometry" relative="1" />
25
+ </mxCell>
26
+ <mxCell id="edge1" parent="1" source="rollout" target="turn" edge="1" style="edgeStyle=orthogonalEdgeStyle;endArrow=classic;strokeWidth=2;">
27
+ <mxGeometry as="geometry" relative="1" />
28
+ </mxCell>
29
+ <mxCell id="edge2" parent="1" source="turn" target="reply" edge="1" style="edgeStyle=orthogonalEdgeStyle;endArrow=classic;strokeWidth=2;">
30
+ <mxGeometry as="geometry" relative="1" />
31
+ </mxCell>
32
+ <mxCell id="note" value="&lt;b&gt;The chat ID stays C. The selected history may change to R.&lt;/b&gt;&lt;br&gt;&lt;br&gt;Ordinary filename: …-C.jsonl → history lookup uses C.&lt;br&gt;After revert: …-C_R.jsonl → history lookup uses R. Old rows under C may remain.&lt;br&gt;Real IDs are UUIDs; compressed .jsonl.zst files use the same rule.&lt;br&gt;If no final reply is linked yet, TaskChef reads the latest saved agent message in turn T.&lt;br&gt;These arrows show lookup steps, not SQL foreign-key constraints." vertex="1" parent="1" style="whiteSpace=wrap;html=1;fontSize=16;fontColor=#172b4d;align=left;verticalAlign=top;spacing=14;fillColor=#ffffff;strokeColor=#9caec2;fillColor=#f7f9fc;">
33
+ <mxGeometry as="geometry" x="40" y="365" width="1155" height="205" />
34
+ </mxCell>
35
+ </root>
36
+ </mxGraphModel>
37
+ </diagram>
38
+ </mxfile>
@@ -0,0 +1,41 @@
1
+ <?xml version='1.0' encoding='utf-8'?>
2
+ <mxfile host="Electron">
3
+ <diagram id="main" name="Files and tables">
4
+ <mxGraphModel page="0" background="#ffffff">
5
+ <root>
6
+ <mxCell id="0" />
7
+ <mxCell id="1" parent="0" />
8
+ <mxCell id="title" value="&lt;b&gt;Codex storage: which table belongs where&lt;/b&gt;" vertex="1" parent="1" style="whiteSpace=wrap;html=1;fontSize=16;fontColor=#172b4d;align=left;verticalAlign=top;spacing=14;fillColor=#ffffff;strokeColor=#9caec2;fillColor=none;strokeColor=none;fontSize=24;spacing=0;">
9
+ <mxGeometry as="geometry" x="40" y="20" width="1030" height="45" />
10
+ </mxCell>
11
+ <mxCell id="state" value="&lt;b&gt;state_5.sqlite — chat inventory&lt;/b&gt;" vertex="1" parent="1" style="whiteSpace=wrap;html=1;fontSize=16;fontColor=#172b4d;align=left;verticalAlign=top;spacing=14;fillColor=#ffffff;strokeColor=#9caec2;swimlane;container=1;startSize=48;fillColor=#edf4ff;swimlaneFillColor=#edf4ff;">
12
+ <mxGeometry as="geometry" x="40" y="90" width="470" height="500" />
13
+ </mxCell>
14
+ <mxCell id="threads" value="&lt;b&gt;threads&lt;/b&gt;&lt;hr&gt;id: stable chat ID&lt;br&gt;name / title, project folder, archived&lt;br&gt;rollout_path: selected history file&lt;br&gt;model, tokens, timestamps" vertex="1" parent="state" style="whiteSpace=wrap;html=1;fontSize=16;fontColor=#172b4d;align=left;verticalAlign=top;spacing=14;fillColor=#ffffff;strokeColor=#9caec2;">
15
+ <mxGeometry as="geometry" x="20" y="65" width="430" height="170" />
16
+ </mxCell>
17
+ <mxCell id="children" value="&lt;b&gt;thread_spawn_edges&lt;/b&gt;&lt;hr&gt;parent_thread_id → child_thread_id&lt;br&gt;Chat IDs; used to hide subagents&lt;br&gt;and count direct children" vertex="1" parent="state" style="whiteSpace=wrap;html=1;fontSize=16;fontColor=#172b4d;align=left;verticalAlign=top;spacing=14;fillColor=#ffffff;strokeColor=#9caec2;">
18
+ <mxGeometry as="geometry" x="20" y="265" width="430" height="140" />
19
+ </mxCell>
20
+ <mxCell id="history" value="&lt;b&gt;thread_history_1.sqlite — turns and messages&lt;/b&gt;" vertex="1" parent="1" style="whiteSpace=wrap;html=1;fontSize=16;fontColor=#172b4d;align=left;verticalAlign=top;spacing=14;fillColor=#ffffff;strokeColor=#9caec2;swimlane;container=1;startSize=48;fillColor=#edf9f4;swimlaneFillColor=#edf9f4;">
21
+ <mxGeometry as="geometry" x="550" y="90" width="520" height="500" />
22
+ </mxCell>
23
+ <mxCell id="turns" value="&lt;b&gt;thread_turns&lt;/b&gt;&lt;hr&gt;thread_id: selected rollout ID&lt;br&gt;turn_id, status, start / end time&lt;br&gt;first_user_item_id, final_agent_item_id" vertex="1" parent="history" style="whiteSpace=wrap;html=1;fontSize=16;fontColor=#172b4d;align=left;verticalAlign=top;spacing=14;fillColor=#ffffff;strokeColor=#9caec2;">
24
+ <mxGeometry as="geometry" x="20" y="60" width="480" height="140" />
25
+ </mxCell>
26
+ <mxCell id="items" value="&lt;b&gt;thread_items&lt;/b&gt;&lt;hr&gt;thread_id + turn_id + item_id&lt;br&gt;item_type, item_json: saved message or tool data" vertex="1" parent="history" style="whiteSpace=wrap;html=1;fontSize=16;fontColor=#172b4d;align=left;verticalAlign=top;spacing=14;fillColor=#ffffff;strokeColor=#9caec2;">
27
+ <mxGeometry as="geometry" x="20" y="225" width="480" height="120" />
28
+ </mxCell>
29
+ <mxCell id="projection" value="&lt;b&gt;thread_history_projection_state&lt;/b&gt;&lt;hr&gt;Rollout ID, next byte offset and ordinal&lt;br&gt;Tracks history import; not queried by the board" vertex="1" parent="history" style="whiteSpace=wrap;html=1;fontSize=16;fontColor=#172b4d;align=left;verticalAlign=top;spacing=14;fillColor=#ffffff;strokeColor=#9caec2;">
30
+ <mxGeometry as="geometry" x="20" y="365" width="480" height="110" />
31
+ </mxCell>
32
+ <mxCell id="jsonl" value="&lt;b&gt;Selected rollout .jsonl / .jsonl.zst file&lt;/b&gt;&lt;hr&gt;Ordered records: type, timestamp, payload&lt;br&gt;Examples: session_meta, event_msg, response_item&lt;br&gt;Saved history used to build the history database.&lt;br&gt;TaskChef reads logs only for optional selected-chat details." vertex="1" parent="1" style="whiteSpace=wrap;html=1;fontSize=16;fontColor=#172b4d;align=left;verticalAlign=top;spacing=14;fillColor=#ffffff;strokeColor=#9caec2;fillColor=#f4effa;">
33
+ <mxGeometry as="geometry" x="40" y="620" width="680" height="155" />
34
+ </mxCell>
35
+ <mxCell id="scope" value="&lt;b&gt;Reading this diagram&lt;/b&gt;&lt;br&gt;&lt;br&gt;Boxes inside a database are tables.&lt;br&gt;The log is a separate file.&lt;br&gt;Selected fields only; full notes are in the storage guide." vertex="1" parent="1" style="whiteSpace=wrap;html=1;fontSize=16;fontColor=#172b4d;align=left;verticalAlign=top;spacing=14;fillColor=#ffffff;strokeColor=#9caec2;fillColor=none;strokeColor=none;">
36
+ <mxGeometry as="geometry" x="750" y="620" width="320" height="155" />
37
+ </mxCell>
38
+ </root>
39
+ </mxGraphModel>
40
+ </diagram>
41
+ </mxfile>
package/docs/mcp-app.md CHANGED
@@ -1,11 +1,266 @@
1
- # TaskChef sidebar app
1
+ # TaskChef sidebar
2
2
 
3
- Call `open_taskchef_board` in Codex to open the TaskChef MCP App in the sidebar. The app reads the same local workspace and task log as the web dashboard. It needs the TaskChef MCP server to be connected and an MCP Apps-capable Codex host.
3
+ The public app name is **TaskChef**. “TaskChef Next” remains the internal project name.
4
4
 
5
- The sidebar uses the dashboard's task cards, horizontal board lanes, and detail view. Switch between **List** and **Board**. In List, filter by project, update window, and status; status counts reflect the selected project and window, and the summary reports visible tasks. Board shows all status lanes for the selected project and window. Task cards include request and result summaries, relative update times, reported work and usage summaries, and related GitHub links. Select a task for its usage, activity timeline, instruction, and metadata.
5
+ TaskChef requires Node.js 22.18+, 23.2+, or 24+ for read-only SQLite connections. The rest of TaskChef continues to support the package's Node.js 18 minimum. An unsupported Node runtime produces a fatal version error before TaskChef opens a database.
6
6
 
7
- **Open chat** opens a linked Codex thread, or the configured project when the task has no usable direct chat link. **Mark completed** and **Mark failed** require confirmation and use the same audited, conflict-checked manual transition as the web dashboard. The app refreshes every five seconds and offers manual refresh. A refresh does not replace a newer selection or a changed task with an older response.
7
+ Call `open_taskchef_board` in Codex to open **TaskChef**. In a sidebar or fullscreen host view, it shows the read-only board, filters, and chat details. In an inline chat view, it shows a short recent-chat list with direct **Open chat** actions. The app uses local Codex metadata and does not modify the TaskChef dispatcher workspace.
8
8
 
9
- The UI is a bundled `ui://taskchef/task-board/v2` MCP resource. Its read, open, and transition calls are app-only tools on the existing stdio MCP server. The iframe does not read files or contact the local HTTP dashboard. The web dashboard remains available separately.
9
+ The server reads all eligible top-level chats from `~/.codex/state_5.sqlite` and their latest turn from `~/.codex/thread_history_1.sqlite`. Both SQLite connections are read-only. It excludes typed subagents and Guardian reviews, JSON subagent sources, known `thread_spawn_edges` children, chats with no turn record. Standalone `source=exec` and regular `source=cli` chats remain eligible in the collector, but the view hides them by default. The plugin details page has native switches for Show exec sessions, Show CLI sessions, and Show archived chats. The MCP server stores these choices in `~/.agents/taskchef-next/settings.json`, shared by all TaskChef views. Each visible poll reads the current settings, even when the database snapshot is unchanged. These choices apply to the board, counts, project choices, Details eligibility, and the compact inline view. Archived chats are hidden by default and use their own Archived column when shown. Details shows the recorded lifetime direct child count. Names and titles can contain user text; the app prefers name, then title, then a chat ID fallback.
10
10
 
11
- For development, run `npm run build:mcp-app` after editing `src/mcp-app/react/`. The generated single-file resource is `src/mcp-app/dist/index.html`. Run `npm run check:mcp-app` and `npm test` before release. Reopen the sidebar after rebuilding to load the new resource.
11
+ The board uses these queue labels:
12
+
13
+ | Column | Rule |
14
+ | --- | --- |
15
+ | Scheduled | Active schedule with a normally completed scheduled prompt, a completed human turn whose PRs are all merged, or a human turn acknowledged by a drop into Scheduled. |
16
+ | Running | Latest selected turn is `inProgress`. There is no age cutoff. |
17
+ | Waiting for input/review | Latest turn completed, interrupted, or failed and the chat remains open. Interrupted or failed turns have an Interrupted tag. This does not prove Codex asked a question. |
18
+ | Done | A chat is marked Done in TaskChef, or its latest turn completed and all attached PRs are confirmed merged. Manual marks require any attached PRs to be confirmed merged. Both require no active schedule. This does not prove the larger task succeeded. |
19
+ | Archived | Chat is archived in Codex. Hidden by default; separate from Done. |
20
+ | Unverified | An unrecognized turn state. |
21
+
22
+ Archived takes precedence. Manual Done marks apply only without active schedules; every attached PR must be confirmed merged. A normally completed scheduled prompt returns to Scheduled regardless of PR status. After a completed human turn, attached PRs determine Done or Waiting for ordinary chats, and Scheduled or Waiting for actively scheduled chats. A manual acknowledgement returns an idle scheduled human turn to Scheduled. Active schedules remain visible as a badge even when the chat is Running or Waiting. After ordinary input, a completed scheduled chat goes to Waiting. The app reads active heartbeat links from `automations/*/automation.toml` and the latest first input from `thread_items`. It checks the observed `<heartbeat><automation_id>` wrapper; this internal format can change. Missing or unrecognized input markers use Waiting rather than guessing Scheduled. Schedule read errors appear as a warning. Paused schedules do not give an active schedule badge. Cron run history is not treated as an active heartbeat chat.
23
+
24
+ **Mark Done** changes only `~/.agents/taskchef-next/done.json`, using a lock and atomic write. The mark is bound to the current turn ID, so a new turn resets it. There is no Reopen button; send a new prompt in Codex to start another turn. Archived, in-progress, and actively scheduled chats cannot be marked Done from this app. PR-linked chats require confirmed merge status before a Done drop is allowed. Codex databases, rollout files, and dispatcher task reports are never modified. An unreadable or invalid Done state file produces a separate local-state error and blocks Done changes; the app preserves the file and does not call it a Codex database failure. The inferred input source and display-formatted request are returned to the app; original recorded input is not modified. See [the research note](taskchef-next-status-research.md) for the optional Luna judgment route.
25
+
26
+ Both databases and the expected tables must be available. Missing or incompatible databases, or failed queries, produce a fatal app error and clear the visible inventory. Rollout files never replace database inventory or status. The selected-chat detail may optionally read a bounded head and tail of the JSONL file at its database `rollout_path` for message counts and byte coverage. The path stays server-side. This detail never changes the database-derived status. If the path or file is absent or cannot be parsed, database metadata remains available. The board returns bounded latest-turn request and response excerpts for cards. Details returns the full recorded request and response for that turn, not the whole conversation. All reads are local and read-only.
27
+
28
+ In sidebar or fullscreen mode, the mounted app requests a fresh snapshot every five seconds while `document.visibilityState` is `visible`. It pauses polling when the document becomes hidden and refreshes immediately when visible again. If Codex only hides a mounted iframe with CSS, the document may remain visible and polling may continue. Inline mode loads once and does not poll; manual **Refresh** remains available. Switching from inline to a full view starts polling and requests a fresh snapshot. Whether the host hides or unmounts the app is host-dependent. Mount, React unmount, document `visibilitychange`, window `pagehide`, display-mode, and host-teardown events are logged as single-string browser console warnings with the `[TaskChef] TaskChef lifecycle:` prefix, followed by JSON with only `visibility` and `displayMode`. For browser debugging, right-click the sidebar app and select **Dev Tools** in Codex. The console shows these lifecycle events. Repeated events are logged individually. `pagehide` can indicate iframe navigation or disposal even when React cleanup does not run. It does not prove that a sidebar switch disposed the iframe: the host may keep the iframe mounted, and a destroyed iframe may not deliver a final event.
29
+
30
+ The UI is bundled as the `ui://taskchef/task-board/v3/<package-version>` MCP resource. The GitHub settings resource also includes the package version. Resource registration and tool metadata share these release-specific URIs, so a new release advertises a different host UI cache key. This does not live-reload an already-open sidebar. Same-version preview edits keep their URI and use explicit sidebar Refresh. Build the UI with `npm run build:mcp-app`; run `npm run check:mcp-app` and the relevant tests before release. Use Codex’s sidebar context-menu **Refresh** to reload its HTML and restart the widget. The app’s own Refresh button updates board data only.
31
+
32
+ The selected rollout filename determines the history lookup ID. Ordinary chats use the chat ID. After a revert, Codex keeps the chat ID but selects a filename ending in `<chat-id>_<rollout-id>.jsonl`. `thread_history_1.sqlite.thread_turns.thread_id` and `thread_items.thread_id` then use the rollout ID. The scanner follows `state_5.sqlite.threads.rollout_path` to select that ID; it does not open logs to get board status. For paginated history, a missing or unrecognized selected filename or invalid timestamp produces an explicit metadata error; old chat-ID rows are never substituted. A canonical filename must also identify the same stable chat. Legacy histories may use noncanonical filenames and retain Codex's stable-ID lookup rule.
33
+
34
+ Old history rows can remain under the original chat ID. Reading those rows instead of the selected rollout can show an old interrupted turn. This was a TaskChef lookup bug, not evidence that Codex's database was stale.
35
+
36
+ ## Query and refresh rules
37
+
38
+ Every visible-document poll checks for database changes, at five-second intervals. Unchanged database records are cached; there is no timestamp cursor or changed-row query. Concurrent requests share an in-flight refresh. Showing the document again or clicking Refresh requests an immediate refresh.
39
+
40
+ Each database reload reads the eligible chat metadata, then runs `WHERE thread_id = ? ORDER BY rollout_ordinal DESC LIMIT 1` for each selected rollout ID. Codex's existing `idx_thread_turns_page` index supports this lookup. It no longer ranks every turn in the history table. The latest first input and linked final reply are read by their full primary keys: rollout ID, turn ID, and item ID; it never scans all message bodies. This server creates no indexes and writes nothing to Codex.
41
+
42
+ There is no 300-chat cap. All eligible chats with a current-rollout turn are included. Done cards still expand in small groups in Board view. This reduces the initial rendered board while keeping complete counts. List view includes all matching chats. If larger installations become slow, measure database time and rendering separately before adding pagination.
43
+
44
+ See the [storage schema](taskchef-next-storage.md), including the editable diagram and PNG.
45
+
46
+ ### TaskChef card content
47
+
48
+ Cards show the chat title, project, a plain two-line preview, activity time, and Open chat. Running cards show the current request; other cards show the latest response. Excerpts are capped at 2,000 characters. Actual scheduled inputs display the recorded heartbeat instructions, even after the schedule is removed. No model summarizes or judges the text.
49
+
50
+ Details pairs the full recorded latest-turn request and response, each initially capped at three lines with independent Show more/Show less controls. Selected quotes render as Markdown quotes and file/image references as named attachments. Generated request headings and context metadata are hidden in the display. Recorded input remains unchanged. Raw HTML is ignored and relative file links appear as text.
51
+
52
+ Time labels use compact relative dates by default, with calendar dates available in settings. Schedule and PR icons appear in the status line. Queue reasons and lifetime subagent counts remain in Details. See [dashboard UI](dashboard-ui.md) for the presentation contract.
53
+
54
+
55
+
56
+
57
+ ### Database change checks
58
+
59
+ Every visible five-second poll reads `PRAGMA data_version` on the same two read-only connections. The first poll, manual Refresh, or a changed counter runs the indexed database queries and replaces the cached records. An unchanged poll reuses those records; it does not query chat, turn, or item tables. Counters are captured before queries so commits during a read cause another read on the next poll. Neither connection holds a transaction between polls.
60
+
61
+ Every poll separately reads and parses `automations/*/automation.toml`. For the Done file, each poll checks file identity, modification/change timestamps, and size; it reads and parses contents only when those metadata change. Manual Refresh also rereads the contents. A missing file means no manual marks. Added, removed, paused, or changed schedules and Done marks therefore apply on the next poll, including when the databases are unchanged. Queue labels are rebuilt from cached records and current schedules/Done marks. An open chat whose latest selected turn is `inProgress` remains Running regardless of timestamp age. Time passing alone never changes its queue label.
62
+
63
+ Each poll checks both database file identities. Replacement reconnects and reloads; missing files or database/query errors discard the cache and clear the board with a fatal error. A later poll retries. Server shutdown closes the connections. The scan readout reports whether database records were queried or reused. This skips unchanged snapshots; it does not fetch only changed rows.
64
+
65
+ PR-based Done labels use saved Codex attachments and authenticated GitHub status. After a completed turn, all attached PRs confirmed merged means Scheduled while a schedule is active, otherwise Done. An unmerged or unavailable PR means Waiting for review. See [GitHub setup](taskchef-next-github.md); registration and real sign-in remain required.
66
+
67
+ ### Native plugin settings
68
+
69
+ TaskChef advertises `openai/settings` with `taskchef_settings_read` and
70
+ `taskchef_settings_update`. The read tool returns the schema, current values,
71
+ and Chat visibility, Card display, and GitHub groups. The update tool accepts
72
+ changed Boolean preferences and preserves other values. **Show usage on cards** defaults to on; the other switches default
73
+ to off. Disable it to hide token counts and estimated cost from cards and their
74
+ status popups. Chat details always keeps its Usage section. Card timestamps default to compact ages: `<1m`, `1m`, `2h`, `5d`,
75
+ and `1mo` (30-day months). Enable **Show calendar dates** to use the previous
76
+ local format: `2:30PM` today, `Yesterday`, or `Oct 3rd`. Running cards keep
77
+ their hourglass and elapsed work duration in either mode.
78
+ Updates use the existing local workspace lock and atomic file writer. Codex
79
+ SQLite files remain read-only. Invalid settings fail visibly rather than
80
+ silently resetting preferences.
81
+
82
+ Open the installed TaskChef plugin details page to edit its native
83
+ settings. The sidebar receives them at its next visible refresh, or immediately
84
+ when Refresh is clicked. Settings persist across sidebar and embedded views.
85
+ The old browser-local visibility keys are no longer used; configure the native
86
+ switches once after upgrading. The Board/List choice stays browser-local.
87
+ See the [OpenAI structured settings specification](https://github.com/openai/mcp-extensions/blob/main/docs/spec.md#structured-settings).
88
+
89
+ ### Board presentation
90
+
91
+ TaskChef exposes only Board. The List implementation remains in the
92
+ source, but the Board/List selector is hidden and saved List choices are
93
+ ignored. Interrupted chats appear in Waiting for input/review with an
94
+ Interrupted tag; their recorded status remains available in Details.
95
+ Scheduled, Running, Waiting, and Done remain visible when empty, with a short
96
+ message specific to each column. This keeps their positions steady when chats
97
+ change state or filters change. Archived remains an optional column.
98
+
99
+ The header Settings icon calls the app-only `taskchef_app_open_settings` tool.
100
+ The server resolves this installed plugin's marketplace catalog file and requests its
101
+ native details page through the operating system's Codex URL handler, using the
102
+ same method as Open chat. It does not depend on the MCP view's link handler.
103
+ An unresolved plugin location or failed desktop opener produces a notification.
104
+ The deep link is based on the installed desktop parser, not the published MCP
105
+ settings specification. A successful opener only confirms that navigation was
106
+ requested; the native page still needs a manual check where host automation is
107
+ unavailable.
108
+
109
+ ### Project picker
110
+
111
+ The searchable picker uses `projects` and `project_roots` from `state_5.sqlite`,
112
+ including saved projects that have no visible chats. Project names and order
113
+ come from the saved registry. Chats use `threads.project_id` first. Older
114
+ assignments use the desktop's project ID migration map and project root hints
115
+ from `.codex-global-state.json`. Git's `.git` pointer and `commondir` identify a
116
+ worktree's original checkout when no assignment is saved. Nested folders match
117
+ the most specific saved project root. Working folders remain in chat details.
118
+
119
+ Projectless chat IDs, folders under `~/Documents/Codex`, and folders that do not
120
+ match a saved project share the **No project** entry. **All projects** clears the
121
+ filter. The dropdown has folder icons, a check for the selection, search by name
122
+ or path, and keyboard navigation. It does not create projects.
123
+
124
+ Project settings changes are checked on the next visible poll. The desktop
125
+ settings file is parsed only when its file stamp changes. Its unrelated fields
126
+ are never returned to the view. Invalid project metadata produces a visible
127
+ error; it does not silently replace the saved inventory.
128
+
129
+ ### Reply image covers
130
+
131
+ TaskChef board cards feature the first supported Markdown image in the latest
132
+ selected assistant reply, above the title. The full saved reply is inspected,
133
+ even when the image occurs after the 2,000-character text excerpt. Code examples
134
+ and raw HTML do not count as images. No image is borrowed from an older turn.
135
+
136
+ Local covers load when near the visible area. Remote images remain caption
137
+ links in the reply; the sidebar does not load them automatically. Local absolute
138
+ paths load through an app-only MCP
139
+ tool tied to the chat, turn and saved image URL. Local PNG, JPEG, GIF and WebP
140
+ files up to 4 MiB are supported; no remote URL is fetched by the MCP server.
141
+ Missing, oversized, unsupported or failed image covers are hidden.
142
+ Click a cover to open chat Details. Text and navigation remain available.
143
+ The Markdown text renderer still shows image captions rather than inline images.
144
+
145
+ This follows Trello’s image-above-title cover option:
146
+ [Add a card cover](https://support.atlassian.com/trello/docs/what-is-a-card-cover).
147
+
148
+
149
+ ### TaskChef notifications
150
+
151
+ The bell beside Settings opens the notification center. It has All and Unread
152
+ filters, Mark all read, and Clear all. Click a chat message to open Details and
153
+ mark it read. New messages appear in a five-second overlay toast; the board does
154
+ not move. At most three toasts are shown at once. Saved messages do not replay
155
+ as toasts when a view opens.
156
+
157
+ - A new completed turn with a verified ordinary input creates an unread “ready for input or review” message.
158
+ - An interrupted or failed turn creates an unread interruption message, including scheduled failures.
159
+ - Routine scheduled completions stay quiet.
160
+ - Mark Done creates a confirmation that is already read. It does not increase the unread badge.
161
+ - Opening a chat, copying an ID, and refreshing have no success message. Action failures use the same center.
162
+ - Database read errors remain visible on the board until recovery.
163
+
164
+ The MCP process stores the newest 100 messages, read status, and per-chat turn
165
+ watermarks in `notifications.json` beside its settings file. Views share this
166
+ file through the existing lock and atomic writer; no daemon is added. Clear all
167
+ removes messages but keeps watermarks, so polling cannot replay cleared events.
168
+ The first successful scan establishes a quiet baseline. Subsequent visible
169
+ five-second refreshes reconcile changes, including cached database snapshots.
170
+ Exec and CLI visibility settings also suppress notifications from hidden sources;
171
+ project and date filters only change the board. Archived chats stay quiet. Saved notifications can still open Details for a chat
172
+ that is now hidden by Settings.
173
+
174
+ When views are closed or hidden, no background scan runs. A later refresh can
175
+ notice the latest saved turn change. It cannot reconstruct intermediate turns
176
+ that finished while no view was checking. Notifications are local app messages;
177
+ this feature does not send OS notifications. A damaged notification file fails
178
+ visibly and is preserved for repair.
179
+
180
+
181
+ ## Local UI review without restarting Codex
182
+
183
+ For UI-only changes, update the HTML in the installation that the running MCP
184
+ server uses. Do not install a new preview version for each style change. Codex
185
+ can keep the old MCP process running while a plugin update removes its old
186
+ folder. Its next resource read then fails with `ENOENT`, and the sidebar shows
187
+ “Couldn't refresh app”.
188
+
189
+ From the source checkout, run:
190
+
191
+ ```sh
192
+ npm run update:mcp-app-preview -- /path/to/the/running/taskchef-next/version
193
+ ```
194
+
195
+ The helper builds the UI, checks the target is TaskChef, and replaces only
196
+ `src/mcp-app/dist/index.html` atomically. It preserves the plugin version, server
197
+ code, dependencies, and local data. It refuses missing or redirected HTML paths.
198
+ Then right-click **TaskChef** in the Codex sidebar and choose **Refresh**.
199
+ Switching sidebar apps only hides the loaded view; it does not reload its HTML.
200
+
201
+ Use the current installation’s version folder. If Refresh reports a missing
202
+ older version in the desktop logs, the MCP process still uses that old folder;
203
+ updating a different folder will not repair it. A full plugin/runtime update is
204
+ still needed for server code or dependency changes. This helper is for local
205
+ preview review, not production plugin distribution.
206
+
207
+ ## GitHub PR status
208
+
209
+ TaskChef reads saved PR attachments and can connect to GitHub with device
210
+ sign-in. See [GitHub setup and board rules](taskchef-next-github.md).
211
+
212
+
213
+ ### Chat search
214
+
215
+ **Search chats** matches chat titles, saved reply excerpts, project names,
216
+ known project repositories, and latest-turn PR titles and repository names.
217
+ Matching ignores letter case; every word must match somewhere in those fields.
218
+ Project and time filters still apply.
219
+
220
+ Search uses the current snapshot. PR titles become searchable after GitHub
221
+ loads them; repository names from saved PR URLs are searchable before status
222
+ loads. Search does not add a separate GitHub lookup or scan local Git remotes.
223
+ The existing visible-card refresh still runs when the displayed cards change.
224
+
225
+
226
+ ## Dragging chats between queues
227
+
228
+ Every card can drag. Valid destination columns are highlighted during dragging, with padding between
229
+ the rounded column border and its cards.
230
+ Done and Scheduled moves require a Waiting card (including Interrupted cards).
231
+ Cards from any column can drop into Archived to show the archive instructions. Dropping a chat
232
+ without an active schedule into Done uses the existing local Done mark.
233
+ Attached PRs must all be confirmed merged by the server. The mark also records
234
+ the confirmed URLs; a newly attached PR invalidates that acknowledgement.
235
+ Blocked drops leave the card in place and explain the rule through TaskChef
236
+ notifications. An active scheduled chat with a human turn can return to
237
+ Scheduled. This acknowledgement is stored under `scheduled:<chat-id>` in the
238
+ local mark file and is bound to the selected turn ID. It expires when a new
239
+ turn starts and does not change or pause the automation.
240
+
241
+ Dropping into the visible Archived column opens instructions and an Open chat
242
+ button. The user archives the chat through Codex's top-right **… → Archive**
243
+ menu. This sidebar does not invoke CLI archiving, and it does not show an
244
+ Archive drop target when the Archived column is hidden.
245
+
246
+
247
+ The first board fetch shows Loading… in empty columns. Later empty columns use
248
+ their normal queue messages. Cards slide between positions when the board updates;
249
+ reduced-motion preferences disable the slide. Opening the notification center
250
+ marks notifications read as they become visible in its scrollable panel.
251
+
252
+ The Waiting column is titled Waiting for review. Hovering the notification bell
253
+ opens the center; moving into its panel keeps it open, and leaving closes it after
254
+ a short delay. The button remains usable with a keyboard or touch.
255
+
256
+ The palette icon after Refresh opens Appearance settings on hover, keyboard activation, or tap. DAY, NIGHT (default), and SYSTEM control light/dark appearance; the separate Theme list offers ChatGPT and 29 Codex presets. Only presets with a native variant for the current appearance are listed. Theme selections are remembered separately for Light and Dark in `taskchef.app.visualTheme.light` and `taskchef.app.visualTheme.dark`; appearance uses `taskchef.app.theme`. The previous Default selection maps to ChatGPT. Existing light/dark/system choices are preserved. System follows operating-system appearance.
257
+
258
+ TaskChef's selected appearance takes priority over a host-applied inline `color-scheme`. Verify Light inside a dark host as well as in a standalone browser: the page, cards, and controls must change together.
259
+
260
+
261
+ The palette seeds live in `src/mcp-app/react/themes.ts`. They mirror the desktop
262
+ registry's surface, ink, accent, contrast, semantic colors, and font families. TaskChef derives
263
+ its cards, controls, borders, and elevated surfaces from those seeds. Links and
264
+ small muted text are adjusted when needed to meet a 4.5:1 contrast ratio on the
265
+ UI surfaces. Native font families use locally available fonts with system fallbacks. Font assets are not copied from the desktop application. Palette definitions ship with TaskChef; opening the board does not
266
+ read the installed desktop application or fetch theme files from the network.