taskchef 8.6.2 → 8.7.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (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 +278 -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 +2 -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
package/src/mcp-app.js CHANGED
@@ -1,156 +1,274 @@
1
- import { readFile } from "node:fs/promises";
1
+ import { mkdir, readFile } from "node:fs/promises";
2
+ import { homedir } from "node:os";
3
+ import { basename, dirname, isAbsolute, join } from "node:path";
4
+ import { acquireWorkspaceLock } from "./workspace.js";
5
+ import { writeDurableAtomic } from "./state-store.js";
2
6
  import { fileURLToPath } from "node:url";
7
+ import { parse as parseToml } from "smol-toml";
3
8
  import { z } from "zod";
4
- import { DashboardMonitor, UsageSummaryMonitor } from "./dashboard.js";
5
- import { taskGitHubProjection } from "./dashboard/github-links.js";
6
- import { createUsageTracker } from "./usage-tracker.js";
7
- import { isCodexThreadDeepLinkId, openThreadInCodex, openWorkspaceInCodex } from "./codex-app.js";
8
- import { canonicalDirectory, canonicalGitRoot, manuallyTransitionTask, readConfig } from "./workspace.js";
9
+ import { NextGitHub } from "./next-github.js";
10
+ import { NextNotifications } from "./next-notifications.js";
11
+ import { CodexSessionScanner } from "./codex-session-scanner.js";
12
+ import { isCodexThreadDeepLinkId, openThreadInCodex, openPluginSettingsInCodex } from "./codex-app.js";
13
+ import { TASKCHEF_APP_NAME, TASKCHEF_VERSION } from "./version.js";
9
14
 
10
- export const TASKCHEF_APP_URI = "ui://taskchef/task-board/v2";
15
+ // Release versions separate host UI cache entries; same-version preview edits
16
+ // intentionally keep their URI and use the sidebar's explicit Refresh action.
17
+ export const TASKCHEF_GITHUB_URI = `ui://taskchef/github-settings/v1/${TASKCHEF_VERSION}`;
18
+ export const TASKCHEF_APP_URI = `ui://taskchef/task-board/v3/${TASKCHEF_VERSION}`;
11
19
  const RESOURCE_MIME_TYPE = "text/html;profile=mcp-app";
12
20
  const htmlPath = fileURLToPath(new URL("./mcp-app/dist/index.html", import.meta.url));
13
- const taskIdSchema = z.string().regex(/^[a-zA-Z0-9._-]+$/).max(512);
14
- const expectedSchema = z.object({
15
- status: z.enum(["working", "needs_input", "completed", "failed"]),
16
- turnRef: z.string().nullable(),
17
- threadId: z.string().nullable(),
18
- updatedAt: z.string().min(1),
19
- }).strict();
21
+ const taskIdSchema = z.string().uuid();
22
+
23
+ const DEFAULT_GITHUB_CLIENT_ID = "Iv23likjK80RCtqZFGg8";
24
+ const visibilityFields = { showExec: z.boolean(), showCli: z.boolean(), showArchived: z.boolean() };
25
+ const settingsSchema = z.strictObject({ ...visibilityFields, showCalendarDates: z.boolean(), showCardUsage: z.boolean() });
26
+ const storedSettingsSchema = settingsSchema.extend({ githubClientId: z.string().trim().max(80).regex(/^(?:Iv(?:1\.[A-Za-z0-9]+|[A-Za-z0-9]{10,}))?$/) });
27
+ const settingsDefaults = { showExec: false, showCli: false, showArchived: false, showCalendarDates: false, showCardUsage: true, githubClientId: DEFAULT_GITHUB_CLIENT_ID };
28
+ const settingsProperties = {
29
+ showCardUsage: { type: "boolean", title: "Show usage on cards", description: "Show token counts and estimated cost on cards and their status popups. Usage remains visible in chat details." },
30
+ showExec: { type: "boolean", title: "Show exec sessions", description: "Include standalone codex exec runs. Subagents stay hidden." },
31
+ showCli: { type: "boolean", title: "Show CLI sessions", description: "Include chats started from the Codex CLI." },
32
+ showCalendarDates: { type: "boolean", title: "Show calendar dates", description: "Show calendar dates and local times instead of relative ages." },
33
+ showArchived: { type: "boolean", title: "Show archived chats", description: "Show archived chats in their own column and list filter." },
34
+ };
35
+ function publicSettings(values) {
36
+ return Object.fromEntries(Object.keys(settingsProperties).map(key => [key, values[key]]));
37
+ }
38
+
39
+ export async function pluginSettingsUrl({ pluginRoot = fileURLToPath(new URL("../", import.meta.url)), codexHome = process.env.CODEX_HOME || join(homedir(), ".codex") } = {}) {
40
+ // Codex plugin detail links take the catalog file, not the marketplace root.
41
+ const plugin = basename(dirname(pluginRoot));
42
+ const marketplace = basename(dirname(dirname(pluginRoot)));
43
+ try {
44
+ const config = parseToml(await readFile(join(codexHome, "config.toml"), "utf8"));
45
+ const source = config.marketplaces?.[marketplace]?.source;
46
+ if (typeof source === "string" && isAbsolute(source)) {
47
+ const marketplacePath = join(source, ".agents", "plugins", "marketplace.json");
48
+ const catalog = JSON.parse(await readFile(marketplacePath, "utf8"));
49
+ if (catalog.name !== marketplace || !catalog.plugins?.some((entry) => entry.name === plugin)) return null;
50
+ return `codex://plugins/${encodeURIComponent(plugin)}?${new URLSearchParams({ marketplacePath })}`;
51
+ }
52
+ } catch { /* Report unresolved settings navigation when the user requests it. */ }
53
+ return null;
54
+ }
20
55
 
21
56
  export function registerTaskChefApp(server, {
22
- workspace,
23
- createMonitor = (root) => new DashboardMonitor(root),
24
- createUsageSummaryMonitor = (root) => new UsageSummaryMonitor(root),
25
- createTaskUsageTracker = (root) => createUsageTracker({ workspace: root }),
26
- transition = manuallyTransitionTask,
57
+ createScanner = () => new CodexSessionScanner(),
27
58
  openThread = openThreadInCodex,
28
- openProject = openWorkspaceInCodex,
29
- readConfiguration = readConfig,
59
+ getSettingsUrl = pluginSettingsUrl,
60
+ openSettings = openPluginSettingsInCodex,
61
+ settingsPath = join(homedir(), ".agents", "taskchef-next", "settings.json"),
62
+ notificationsPath = join(dirname(settingsPath), "notifications.json"),
63
+ createGitHub = (options) => new NextGitHub(options),
30
64
  } = {}) {
31
- let monitor;
32
- let usageSummaryMonitor;
33
- let usageTracker;
34
- let starting;
35
- let appRevision = 0;
36
- async function currentMonitor() {
37
- if (!monitor) {
38
- starting ??= (async () => {
39
- const candidate = createMonitor(workspace);
40
- try {
41
- await candidate.start();
42
- const summary = createUsageSummaryMonitor(candidate.workspace);
43
- try { await summary.start(); }
44
- catch (error) { summary.close(); throw error; }
45
- usageSummaryMonitor = summary;
46
- usageTracker = createTaskUsageTracker(candidate.workspace);
47
- appRevision = 1;
48
- candidate.on?.("snapshot", () => { appRevision += 1; });
49
- summary.on?.("change", () => { appRevision += 1; });
50
- monitor = candidate;
51
- return candidate;
52
- } catch (error) {
53
- candidate.close();
54
- usageSummaryMonitor?.close();
55
- usageTracker?.close?.();
56
- throw error;
57
- }
58
- })().finally(() => { starting = null; });
59
- return starting;
65
+ const scanner = createScanner();
66
+ const notificationStore = new NextNotifications(notificationsPath);
67
+ const github = createGitHub({ stateDir: dirname(settingsPath) });
68
+ let boardRevision = 0;
69
+ let boardSignature;
70
+ let githubAuth;
71
+ const turnUsageCache = new Map();
72
+ const usagePending = new Map();
73
+ async function boardSnapshot(settings, force = false, scope = { date: "all", taskIds: [] }) {
74
+ const snapshot = await scanner.refresh({ force });
75
+ const visibleIds = new Set(scope.taskIds ?? []);
76
+ const displayTasks = snapshot.tasks.map(task => {
77
+ if (!visibleIds.has(task.id) || task.pullRequests?.length || !scanner.earlierPullRequest) return task;
78
+ const earlierPullRequest = scanner.earlierPullRequest(task.id);
79
+ return earlierPullRequest ? { ...task, earlierPullRequest } : task;
80
+ });
81
+ const result = await github.enrich({ ...snapshot, tasks: displayTasks }, settings, { force, scope });
82
+ githubAuth = result.auth;
83
+ const visible = new Set(scope.taskIds ?? []);
84
+ const tasks = [];
85
+ for (const task of result.snapshot.tasks) {
86
+ let cached = turnUsageCache.get(task.id);
87
+ if (cached?.turnId !== task.turnId) { turnUsageCache.delete(task.id); cached = null; }
88
+ if (result.snapshot.healthy !== false && visible.has(task.id) && scanner.taskUsage && !usagePending.has(task.id)) {
89
+ // Cold log parsing must not delay the database-backed board response.
90
+ const turnId = task.turnId;
91
+ const pending = Promise.resolve().then(() => scanner.taskUsage(task.id)).then(usage => {
92
+ if (usage && scanner.task(task.id)?.turnId === turnId) turnUsageCache.set(task.id, { turnId, usage: usage.latest });
93
+ }).catch(() => { /* Optional usage failure never hides a card. */ }).finally(() => usagePending.delete(task.id));
94
+ usagePending.set(task.id, pending);
95
+ }
96
+ tasks.push(cached ? { ...task, turnUsage: cached.usage } : task);
97
+ }
98
+ const present = new Set(tasks.map(task => task.id));
99
+ for (const id of turnUsageCache.keys()) if (!present.has(id)) turnUsageCache.delete(id);
100
+ result.snapshot = { ...result.snapshot, tasks };
101
+ const signature = JSON.stringify([result.snapshot.revision, result.snapshot.tasks.map((task) => [task.id, task.status, task.pullRequests, task.earlierPullRequest, task.turnUsage])]);
102
+ if (signature !== boardSignature) { boardRevision += 1; boardSignature = signature; }
103
+ return { ...result.snapshot, revision: boardRevision };
104
+ }
105
+ async function decoratedTask(task, force = false, includeHistory = false) {
106
+ if (!task) return task;
107
+ const settings = await readSettings();
108
+ if (!includeHistory) {
109
+ const { snapshot } = await github.enrich({ healthy: true, tasks: [task] }, settings, { force });
110
+ return snapshot.tasks[0];
60
111
  }
61
- await monitor.refresh();
62
- return monitor;
112
+ // History is display-only. Opening it fetches missing URLs, not saved statuses.
113
+ const urls = [...new Map([...(task.detailPullRequests ?? []), ...(task.pullRequests ?? [])].map(pr => [pr.url, pr])).values()];
114
+ const history = await github.enrich({ healthy: true, tasks: [{ ...task, pullRequests: urls }] }, settings, { force, detail: true });
115
+ const statuses = new Map(history.snapshot.tasks[0].pullRequests.map(pr => [pr.url, pr]));
116
+ // Classify only the latest turn, using the results already loaded above.
117
+ const { snapshot } = await github.enrich({ healthy: true, tasks: [task] }, settings, { force: false, scope: { taskIds: [] } });
118
+ return { ...snapshot.tasks[0], detailPullRequests: (task.detailPullRequests ?? []).map(pr => statuses.get(pr.url) ?? pr) };
63
119
  }
120
+ async function readSettings() {
121
+ try {
122
+ const values = storedSettingsSchema.parse({ ...settingsDefaults, ...JSON.parse(await readFile(settingsPath, "utf8")) });
123
+ return { ...values, githubClientId: values.githubClientId || DEFAULT_GITHUB_CLIENT_ID };
124
+ }
125
+ catch (error) {
126
+ if (error.code === "ENOENT") return { ...settingsDefaults };
127
+ throw new Error("TaskChef cannot read settings.json. Repair the file and refresh.");
128
+ }
129
+ }
130
+ server.server.registerCapabilities({ experimental: { "openai/settings": {
131
+ readTool: "taskchef_settings_read", updateTool: "taskchef_settings_update",
132
+ } } });
133
+ server.registerTool("taskchef_settings_read", {
134
+ title: "Read TaskChef settings", inputSchema: {},
135
+ outputSchema: { schema: z.record(z.string(), z.unknown()), values: settingsSchema, layout: z.array(z.record(z.string(), z.unknown())) },
136
+ annotations: { readOnlyHint: true, openWorldHint: false },
137
+ }, async () => {
138
+ const values = await readSettings();
139
+ let connected = false;
140
+ try { connected = (await github.auth(values.githubClientId, "status")).connected; } catch { /* Keep connection errors in the GitHub dialog. */ }
141
+ return { content: [], structuredContent: {
142
+ schema: { type: "object", properties: settingsProperties }, values: publicSettings(values),
143
+ layout: [{ kind: "group", title: "Chat visibility", items: Object.keys(visibilityFields).map(property => ({ kind: "property", property })) }, { kind: "group", title: "Card display", items: [{ kind: "property", property: "showCalendarDates" }, { kind: "property", property: "showCardUsage" }] }, { kind: "group", title: "GitHub", items: [{ kind: "tool", tool: "taskchef_github_settings", title: connected ? "Manage GitHub" : "Connect GitHub", description: "Sign in, manage repository access, or disconnect this computer." }] }],
144
+ } };
145
+ });
146
+ server.registerTool("taskchef_settings_update", {
147
+ title: "Update TaskChef settings",
148
+ inputSchema: { set: settingsSchema.partial().refine((values) => Object.keys(values).length > 0, "Set at least one setting.") },
149
+ outputSchema: { values: settingsSchema },
150
+ annotations: { readOnlyHint: false, destructiveHint: false, openWorldHint: false, idempotentHint: true },
151
+ }, async ({ set }) => {
152
+ await mkdir(dirname(settingsPath), { recursive: true, mode: 0o700 });
153
+ const release = await acquireWorkspaceLock(dirname(settingsPath));
154
+ try {
155
+ const values = { ...await readSettings(), ...set };
156
+ await writeDurableAtomic(settingsPath, JSON.stringify(values));
157
+ return { content: [], structuredContent: { values: publicSettings(values) } };
158
+ } finally { await release(); }
159
+ });
64
160
  const originalClose = server.close.bind(server);
65
- server.close = async () => {
66
- monitor?.close();
67
- usageSummaryMonitor?.close();
68
- usageTracker?.close?.();
69
- await originalClose();
70
- };
161
+ server.close = async () => { scanner.close(); await originalClose(); };
71
162
  const appOnly = { ui: { resourceUri: TASKCHEF_APP_URI, visibility: ["app"] } };
72
- function appSnapshot() {
73
- const snapshot = monitor.snapshot();
74
- return { ...snapshot, revision: appRevision, tasks: snapshot.tasks.map((task) => ({
75
- ...task,
76
- usage: usageSummaryMonitor.project(task),
77
- })) };
78
- }
79
163
  server.registerResource("TaskChef task board", TASKCHEF_APP_URI, {
80
- description: "TaskChef sidebar task board",
81
- mimeType: RESOURCE_MIME_TYPE,
82
- }, async () => ({ contents: [{
83
- uri: TASKCHEF_APP_URI,
84
- mimeType: RESOURCE_MIME_TYPE,
85
- text: await readFile(htmlPath, "utf8"),
164
+ description: "TaskChef read-only Codex session board", mimeType: RESOURCE_MIME_TYPE,
165
+ _meta: { ui: { csp: { resourceDomains: ["https:"] } } },
166
+ }, async () => ({ contents: [{ uri: TASKCHEF_APP_URI, mimeType: RESOURCE_MIME_TYPE, text: await readFile(htmlPath, "utf8"), _meta: { ui: { csp: { resourceDomains: ["https:"] } } } }] }));
167
+ server.registerResource("TaskChef GitHub settings", TASKCHEF_GITHUB_URI, { mimeType: RESOURCE_MIME_TYPE }, async () => ({ contents: [{
168
+ uri: TASKCHEF_GITHUB_URI, mimeType: RESOURCE_MIME_TYPE,
169
+ text: (await readFile(htmlPath, "utf8")).replace('<div id="root"', '<div data-taskchef-page="github" id="root"'),
86
170
  }] }));
171
+ server.registerTool("taskchef_github_settings", {
172
+ title: "Connect GitHub", inputSchema: {},
173
+ _meta: { ui: { resourceUri: TASKCHEF_GITHUB_URI } },
174
+ annotations: { readOnlyHint: true, openWorldHint: false },
175
+ }, async () => ({ structuredContent: { github: await github.auth((await readSettings()).githubClientId, "status") }, content: [] }));
87
176
  server.registerTool("open_taskchef_board", {
88
- title: process.env.TASKCHEF_PREVIEW === "1" ? "TaskChef Preview" : "TaskChef",
89
- description: "Show the local TaskChef task board in the Codex sidebar.",
90
- inputSchema: {},
177
+ title: TASKCHEF_APP_NAME, description: "Show read-only local Codex session activity in the sidebar.", inputSchema: {},
91
178
  _meta: { ui: { resourceUri: TASKCHEF_APP_URI }, "openai/ui": { entrypoints: [{ type: "global" }] } },
92
179
  annotations: { readOnlyHint: true, openWorldHint: false },
93
180
  }, async () => {
94
- await currentMonitor();
95
- const snapshot = appSnapshot();
96
- return { structuredContent: { taskCount: snapshot.tasks.length }, content: [{ type: "text", text: `TaskChef board: ${snapshot.tasks.length} tasks.` }] };
181
+ const snapshot = await scanner.refresh();
182
+ if (!snapshot.healthy) return { structuredContent: { taskCount: 0, error: snapshot.scan.error }, content: [{ type: "text", text: `TaskChef: ${snapshot.scan.error}` }] };
183
+ return { structuredContent: { taskCount: snapshot.tasks.length }, content: [{ type: "text", text: `TaskChef: ${snapshot.tasks.length} indexed chats. Visibility settings control which chats appear.` }] };
97
184
  });
98
185
  server.registerTool("taskchef_app_snapshot", {
99
- title: "Refresh TaskChef board", description: "Read the local task board.",
100
- inputSchema: { revision: z.number().int().nonnegative().optional() }, _meta: appOnly,
186
+ title: "Refresh TaskChef", description: "Read local Codex session metadata.",
187
+ inputSchema: { revision: z.number().int().nonnegative().optional(), force: z.boolean().optional(), project: z.string().max(1000).optional(), date: z.enum(["24h", "7d", "all"]).optional(), visibleTaskIds: z.array(taskIdSchema).max(500).optional() }, _meta: appOnly,
101
188
  annotations: { readOnlyHint: true, openWorldHint: false },
102
- }, async ({ revision }) => {
103
- await currentMonitor();
104
- void Promise.resolve(usageTracker.preload?.(monitor.tasks)).catch(() => {});
105
- if (revision !== undefined && revision === appRevision && monitor.unhealthy === false) {
106
- return { structuredContent: { unchanged: true, revision: appRevision }, content: [] };
189
+ }, async ({ revision, force, project, date, visibleTaskIds }) => {
190
+ const settings = await readSettings();
191
+ const settingsUrl = await getSettingsUrl();
192
+ const { snapshot, notifications } = await notificationStore.reconcile(() => boardSnapshot(settings, force, { project, date: date ?? "all", taskIds: visibleTaskIds ?? [] }), settings);
193
+ if (!force && revision !== undefined && revision === snapshot.revision && snapshot.healthy !== false) {
194
+ return { structuredContent: { unchanged: true, revision: snapshot.revision, scan: snapshot.scan, settings: publicSettings(settings), settingsUrl, notifications, github: githubAuth, version: TASKCHEF_VERSION }, content: [] };
107
195
  }
108
- return { structuredContent: { snapshot: appSnapshot() }, content: [] };
196
+ return { structuredContent: { snapshot, settings: publicSettings(settings), settingsUrl, notifications, github: githubAuth, version: TASKCHEF_VERSION }, content: [] };
109
197
  });
110
198
  server.registerTool("taskchef_app_task", {
111
- title: "Read TaskChef task", description: "Read one task's details.",
112
- inputSchema: { taskId: taskIdSchema }, _meta: appOnly,
199
+ title: "Read Codex chat metadata", description: "Read one local chat's metadata and its latest recorded request and response.",
200
+ inputSchema: { taskId: taskIdSchema, refreshGithub: z.boolean().optional() }, _meta: appOnly,
113
201
  annotations: { readOnlyHint: true, openWorldHint: false },
114
- }, async ({ taskId }) => {
115
- const task = (await currentMonitor()).tasks.find((candidate) => candidate.id === taskId);
202
+ }, async ({ taskId, refreshGithub }) => {
203
+ const snapshot = await scanner.refresh();
204
+ if (!snapshot.healthy) throw new Error(snapshot.scan.error);
205
+ const task = await decoratedTask(await scanner.taskDetail(taskId), refreshGithub === true, true);
116
206
  if (!task) throw new Error("Task not found.");
117
- const usage = await usageTracker.get(task).catch(() => ({
118
- status: "unavailable", reason: "Task usage is temporarily unavailable.", task: null, turns: {},
119
- }));
120
- return { structuredContent: { task: { ...task, ...taskGitHubProjection(task), usage } }, content: [] };
207
+ return { structuredContent: { task }, content: [] };
121
208
  });
122
- server.registerTool("taskchef_app_transition", {
123
- title: "Mark TaskChef task", description: "Apply a confirmed manual status transition.",
124
- inputSchema: {
125
- taskId: taskIdSchema,
126
- actionId: z.string().uuid(),
127
- expected: expectedSchema,
128
- targetStatus: z.enum(["completed", "failed"]),
129
- }, _meta: appOnly,
130
- annotations: { readOnlyHint: false, destructiveHint: true, openWorldHint: false },
131
- }, async ({ taskId, actionId, expected, targetStatus }) => {
132
- const result = await transition(workspace, taskId, { actionId, expected, targetStatus });
133
- await (await currentMonitor()).refresh({ force: true });
134
- return { structuredContent: { task: { ...result.task, ...taskGitHubProjection(result.task) }, idempotent: result.idempotent }, content: [] };
209
+ server.registerTool("taskchef_app_image", {
210
+ title: "Read reply image", description: "Read a local raster image referenced by the selected turn prompt or reply, up to 4 MiB.",
211
+ inputSchema: { taskId: taskIdSchema, expectedTurnId: z.string().min(1), expectedUrl: z.string().min(1) }, _meta: appOnly,
212
+ annotations: { readOnlyHint: true, openWorldHint: false },
213
+ }, async ({ taskId, expectedTurnId, expectedUrl }) => ({
214
+ structuredContent: { dataUrl: await scanner.taskImage(taskId, expectedTurnId, expectedUrl) }, content: [],
215
+ }));
216
+ server.registerTool("taskchef_app_set_scheduled", {
217
+ title: "Return chat to Scheduled", description: "Acknowledge the latest human turn and return an active scheduled chat to its queue.",
218
+ inputSchema: { taskId: taskIdSchema, expectedTurnId: z.string().min(1) }, _meta: appOnly,
219
+ annotations: { readOnlyHint: false, openWorldHint: false },
220
+ }, async ({ taskId, expectedTurnId }) => ({ structuredContent: { task: await decoratedTask(await scanner.setScheduled(taskId, expectedTurnId)) }, content: [] }));
221
+ server.registerTool("taskchef_app_set_done", {
222
+ title: "Mark chat Done in TaskChef", description: "Save or remove a local Done mark. Codex databases are never modified.",
223
+ inputSchema: { taskId: taskIdSchema, expectedTurnId: z.string().min(1), done: z.boolean() }, _meta: appOnly,
224
+ annotations: { readOnlyHint: false, openWorldHint: false },
225
+ }, async ({ taskId, expectedTurnId, done }) => {
226
+ let mergedPrUrls = [];
227
+ if (done) {
228
+ const snapshot = await scanner.refresh({ force: true });
229
+ if (!snapshot.healthy) throw new Error(snapshot.scan.error);
230
+ const current = await decoratedTask(scanner.task(taskId));
231
+ if (!current || current.turnId !== expectedTurnId) throw new Error("Chat changed. Refresh and try again.");
232
+ mergedPrUrls = (current.pullRequests ?? []).filter(pr => pr.state === "merged").map(pr => pr.url);
233
+ }
234
+ const task = await decoratedTask(await scanner.setDone(taskId, expectedTurnId, done, mergedPrUrls));
235
+ return { structuredContent: { task, notifications: done ? await notificationStore.confirmation(task) : undefined }, content: [] };
236
+ });
237
+ for (const [name, resourceUri] of [["taskchef_app_github", TASKCHEF_APP_URI], ["taskchef_github_settings_auth", TASKCHEF_GITHUB_URI]]) server.registerTool(name, {
238
+ title: "Connect GitHub for PR status", description: "Start device sign-in, check approval, or remove local credentials. Tokens stay in the system credential store.",
239
+ inputSchema: { action: z.enum(["status", "start", "poll", "disconnect"]) }, _meta: { ui: { resourceUri, visibility: ["app"] } },
240
+ annotations: { readOnlyHint: false, destructiveHint: false, openWorldHint: true },
241
+ }, async ({ action }) => ({ structuredContent: { github: await github.auth((await readSettings()).githubClientId, action) }, content: [] }));
242
+ server.registerTool("taskchef_app_notifications", {
243
+ title: "Update TaskChef notifications",
244
+ inputSchema: { action: z.enum(["read", "read_all", "clear", "error"]), id: z.string().optional(), taskId: taskIdSchema.optional(), operation: z.enum(["open", "done", "move", "copy", "settings"]).optional(), error: z.string().max(1000).optional() },
245
+ _meta: appOnly, annotations: { readOnlyHint: false, openWorldHint: false },
246
+ }, async ({ action, id, taskId, operation, error }) => {
247
+ if (action === "read" && !id) throw new Error("Notification ID required.");
248
+ if (action === "error" && (!operation || !error)) throw new Error("Operation and error required.");
249
+ const task = taskId ? scanner.task(taskId) : null;
250
+ const notifications = await notificationStore.action({ action, id, task, operation, error });
251
+ return { structuredContent: { notifications }, content: [] };
252
+ });
253
+ for (const [name, resourceUri] of [["taskchef_app_open_settings", TASKCHEF_APP_URI], ["taskchef_github_settings_open_plugin", TASKCHEF_GITHUB_URI]]) server.registerTool(name, {
254
+ title: "Open TaskChef settings", description: "Open this installed plugin's native settings page in Codex.",
255
+ inputSchema: {}, _meta: { ui: { resourceUri, visibility: ["app"] } },
256
+ annotations: { readOnlyHint: false, openWorldHint: false },
257
+ }, async () => {
258
+ await openSettings(await getSettingsUrl());
259
+ return { structuredContent: { message: "Requested plugin settings in Codex." }, content: [] };
135
260
  });
136
261
  server.registerTool("taskchef_app_open_chat", {
137
- title: "Open TaskChef chat", description: "Open the task's Codex chat or configured project.",
262
+ title: "Open Codex chat", description: "Open the selected Codex chat.",
138
263
  inputSchema: { taskId: taskIdSchema }, _meta: appOnly,
139
264
  annotations: { readOnlyHint: false, openWorldHint: false },
140
265
  }, async ({ taskId }) => {
141
- const task = (await currentMonitor()).tasks.find((candidate) => candidate.id === taskId);
266
+ const snapshot = await scanner.refresh();
267
+ if (!snapshot.healthy) throw new Error(snapshot.scan.error);
268
+ const task = scanner.task(taskId);
142
269
  if (!task) throw new Error("Task not found.");
143
- if (isCodexThreadDeepLinkId(task.threadId)) {
144
- await openThread(task.threadId);
145
- return { structuredContent: { message: "Opened chat in Codex." }, content: [] };
146
- }
147
- const trusted = (await readConfiguration(workspace, { checkPaths: false })).projects
148
- .find((project) => project.path === task.project.path);
149
- if (!trusted) throw new Error("This historical task no longer matches a configured project.");
150
- const canonicalPath = trusted.isGitRepository
151
- ? await canonicalGitRoot(trusted.path) : await canonicalDirectory(trusted.path);
152
- if (canonicalPath !== trusted.path) throw new Error("This configured project has moved.");
153
- await openProject(canonicalPath);
154
- return { structuredContent: { message: "Opened project in Codex. Select the recorded thread there." }, content: [] };
270
+ if (!isCodexThreadDeepLinkId(task.threadId)) throw new Error("This chat cannot be opened directly.");
271
+ await openThread(task.threadId);
272
+ return { structuredContent: { message: "Opened chat in Codex." }, content: [] };
155
273
  });
156
274
  }
package/src/mcp.js CHANGED
@@ -1,4 +1,5 @@
1
1
  import path from "node:path";
2
+ import { readFileSync } from "node:fs";
2
3
  import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
3
4
  import { z } from "zod";
4
5
  import {
@@ -20,6 +21,12 @@ import { DASHBOARD_SERVER_VERSION, TASKCHEF_VERSION } from "./version.js";
20
21
  import { createUsageTracker } from "./usage-tracker.js";
21
22
  import { registerTaskChefApp } from "./mcp-app.js";
22
23
 
24
+ const sidebarSvg = readFileSync(new URL("../assets/taskchef-sidebar.svg", import.meta.url), "utf8");
25
+ const sidebarIcons = [["light", "#333333"], ["dark", "#dddddd"]].map(([theme, color]) => ({
26
+ src: `data:image/svg+xml;base64,${Buffer.from(sidebarSvg.replace("<svg ", `<svg style="color:${color}" `)).toString("base64")}`,
27
+ mimeType: "image/svg+xml", sizes: ["20x20"], theme,
28
+ }));
29
+
23
30
  const projectSchema = z.object({
24
31
  name: z.string(),
25
32
  path: z.string(),
@@ -234,7 +241,7 @@ export function createTaskChefMcpServer({
234
241
  } = {}) {
235
242
  const reportingDestination = `Store lifecycle state and summaries in the configured local TaskChef dashboard log ${JSON.stringify(path.resolve(workspace, "tasks.jsonl"))}. GitHub URLs are stored as references, not published to GitHub. Also triggers local Codex usage tracking in ${JSON.stringify(path.resolve(workspace, ".taskchef-usage.json"))}. Exclude secrets. `;
236
243
  const server = new McpServer(
237
- { name: "taskchef", version: TASKCHEF_VERSION },
244
+ { name: "taskchef", version: TASKCHEF_VERSION, icons: sidebarIcons },
238
245
  {
239
246
  instructions:
240
247
  "Prepare with prepare_dispatch, call record_task before creating the Codex task, then create it natively and return immediately. Follow the active TaskChef skill for role-specific sequencing of the identity and state tools.",
@@ -0,0 +1,16 @@
1
+ import { mkdir, rename, stat } from "node:fs/promises";
2
+ import { dirname } from "node:path";
3
+ import { acquireWorkspaceLock } from "./workspace.js";
4
+
5
+ // Serialize migrations between plugin processes. Never replace a newer cache.
6
+ export async function migrateCache(previous, current) {
7
+ if (!previous || previous === current) return;
8
+ await mkdir(dirname(current), { recursive: true, mode: 0o700 });
9
+ const release = await acquireWorkspaceLock(dirname(current));
10
+ try {
11
+ try { await stat(current); return; }
12
+ catch (error) { if (error.code !== "ENOENT") throw error; }
13
+ try { await rename(previous, current); }
14
+ catch (error) { if (error.code !== "ENOENT") throw error; }
15
+ } finally { await release(); }
16
+ }