@surething/cockpit 1.0.260 → 1.0.261

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 (185) hide show
  1. package/.next-prod/BUILD_ID +1 -1
  2. package/.next-prod/app-path-routes-manifest.json +4 -4
  3. package/.next-prod/build-manifest.json +2 -2
  4. package/.next-prod/cockpit-build.json +1 -1
  5. package/.next-prod/prerender-manifest.json +3 -3
  6. package/.next-prod/server/app/_global-error/page.js.nft.json +1 -1
  7. package/.next-prod/server/app/_global-error.html +1 -1
  8. package/.next-prod/server/app/_global-error.rsc +1 -1
  9. package/.next-prod/server/app/_global-error.segments/_full.segment.rsc +1 -1
  10. package/.next-prod/server/app/_global-error.segments/_global-error/__PAGE__.segment.rsc +1 -1
  11. package/.next-prod/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  12. package/.next-prod/server/app/_not-found/page.js.nft.json +1 -1
  13. package/.next-prod/server/app/_not-found.html +1 -1
  14. package/.next-prod/server/app/_not-found.rsc +1 -1
  15. package/.next-prod/server/app/_not-found.segments/_full.segment.rsc +1 -1
  16. package/.next-prod/server/app/_not-found.segments/_index.segment.rsc +1 -1
  17. package/.next-prod/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  18. package/.next-prod/server/app/_not-found.segments/_tree.segment.rsc +1 -1
  19. package/.next-prod/server/app/api/agent/test/route.js.nft.json +1 -1
  20. package/.next-prod/server/app/api/bash/route.js.nft.json +1 -1
  21. package/.next-prod/server/app/api/chat/codex/route.js +1 -1
  22. package/.next-prod/server/app/api/chat/codex/route.js.nft.json +1 -1
  23. package/.next-prod/server/app/api/chat/deepseek/route.js.nft.json +1 -1
  24. package/.next-prod/server/app/api/chat/glm/route.js.nft.json +1 -1
  25. package/.next-prod/server/app/api/chat/kimi/route.js.nft.json +1 -1
  26. package/.next-prod/server/app/api/chat/ollama/route.js.nft.json +1 -1
  27. package/.next-prod/server/app/api/chat/route.js.nft.json +1 -1
  28. package/.next-prod/server/app/api/chat/stop/route.js.nft.json +1 -1
  29. package/.next-prod/server/app/api/claude-stats/route.js.nft.json +1 -1
  30. package/.next-prod/server/app/api/commands/route.js.nft.json +1 -1
  31. package/.next-prod/server/app/api/comments/route.js.nft.json +1 -1
  32. package/.next-prod/server/app/api/db/columns/route.js.nft.json +1 -1
  33. package/.next-prod/server/app/api/db/connect/route.js.nft.json +1 -1
  34. package/.next-prod/server/app/api/db/disconnect/route.js.nft.json +1 -1
  35. package/.next-prod/server/app/api/db/export/route.js.nft.json +1 -1
  36. package/.next-prod/server/app/api/db/query/route.js.nft.json +1 -1
  37. package/.next-prod/server/app/api/db/schemas/route.js.nft.json +1 -1
  38. package/.next-prod/server/app/api/deepseek/balance/route.js.nft.json +1 -1
  39. package/.next-prod/server/app/api/deepseek/credentials/route.js.nft.json +1 -1
  40. package/.next-prod/server/app/api/deepseek/models/route.js.nft.json +1 -1
  41. package/.next-prod/server/app/api/dev/spans/route.js.nft.json +1 -1
  42. package/.next-prod/server/app/api/extension/version/route.js.nft.json +1 -1
  43. package/.next-prod/server/app/api/file/route.js.nft.json +1 -1
  44. package/.next-prod/server/app/api/files/blame/route.js.nft.json +1 -1
  45. package/.next-prod/server/app/api/files/clipboard/route.js.nft.json +1 -1
  46. package/.next-prod/server/app/api/files/copy/route.js.nft.json +1 -1
  47. package/.next-prod/server/app/api/files/delete/route.js.nft.json +1 -1
  48. package/.next-prod/server/app/api/files/expanded/route.js.nft.json +1 -1
  49. package/.next-prod/server/app/api/files/index/route.js.nft.json +1 -1
  50. package/.next-prod/server/app/api/files/init/route.js.nft.json +1 -1
  51. package/.next-prod/server/app/api/files/paste/route.js.nft.json +1 -1
  52. package/.next-prod/server/app/api/files/read/route.js.nft.json +1 -1
  53. package/.next-prod/server/app/api/files/readdir/route.js.nft.json +1 -1
  54. package/.next-prod/server/app/api/files/recent/route.js.nft.json +1 -1
  55. package/.next-prod/server/app/api/files/save/route.js.nft.json +1 -1
  56. package/.next-prod/server/app/api/files/search/route.js.nft.json +1 -1
  57. package/.next-prod/server/app/api/files/stat/route.js.nft.json +1 -1
  58. package/.next-prod/server/app/api/files/text/route.js.nft.json +1 -1
  59. package/.next-prod/server/app/api/git/branch-diff/route.js.nft.json +1 -1
  60. package/.next-prod/server/app/api/git/branches/route.js.nft.json +1 -1
  61. package/.next-prod/server/app/api/git/commit-diff/route.js.nft.json +1 -1
  62. package/.next-prod/server/app/api/git/commits/route.js.nft.json +1 -1
  63. package/.next-prod/server/app/api/git/current-branch/route.js.nft.json +1 -1
  64. package/.next-prod/server/app/api/git/diff/route.js.nft.json +1 -1
  65. package/.next-prod/server/app/api/git/discard/route.js.nft.json +1 -1
  66. package/.next-prod/server/app/api/git/stage/route.js.nft.json +1 -1
  67. package/.next-prod/server/app/api/git/status/route.js.nft.json +1 -1
  68. package/.next-prod/server/app/api/git/unstage/route.js.nft.json +1 -1
  69. package/.next-prod/server/app/api/git/worktree/route.js.nft.json +1 -1
  70. package/.next-prod/server/app/api/glm/credentials/route.js.nft.json +1 -1
  71. package/.next-prod/server/app/api/glm/models/route.js.nft.json +1 -1
  72. package/.next-prod/server/app/api/glm/usage/route.js.nft.json +1 -1
  73. package/.next-prod/server/app/api/global-state/route.js.nft.json +1 -1
  74. package/.next-prod/server/app/api/health/route.js.nft.json +1 -1
  75. package/.next-prod/server/app/api/html-apps/[id]/route.js.nft.json +1 -1
  76. package/.next-prod/server/app/api/html-apps/route.js.nft.json +1 -1
  77. package/.next-prod/server/app/api/jupyter/load/route.js.nft.json +1 -1
  78. package/.next-prod/server/app/api/jupyter/save/route.js.nft.json +1 -1
  79. package/.next-prod/server/app/api/jupyter/shutdown/route.js.nft.json +1 -1
  80. package/.next-prod/server/app/api/kimi/credentials/route.js.nft.json +1 -1
  81. package/.next-prod/server/app/api/kimi/models/route.js.nft.json +1 -1
  82. package/.next-prod/server/app/api/kimi/usage/route.js.nft.json +1 -1
  83. package/.next-prod/server/app/api/lsp/definition/route.js.nft.json +1 -1
  84. package/.next-prod/server/app/api/lsp/hover/route.js.nft.json +1 -1
  85. package/.next-prod/server/app/api/lsp/references/route.js.nft.json +1 -1
  86. package/.next-prod/server/app/api/lsp/status/route.js.nft.json +1 -1
  87. package/.next-prod/server/app/api/lsp/warmup/route.js.nft.json +1 -1
  88. package/.next-prod/server/app/api/mysql/columns/route.js.nft.json +1 -1
  89. package/.next-prod/server/app/api/mysql/connect/route.js.nft.json +1 -1
  90. package/.next-prod/server/app/api/mysql/disconnect/route.js.nft.json +1 -1
  91. package/.next-prod/server/app/api/mysql/export/route.js.nft.json +1 -1
  92. package/.next-prod/server/app/api/mysql/query/route.js.nft.json +1 -1
  93. package/.next-prod/server/app/api/mysql/schemas/route.js.nft.json +1 -1
  94. package/.next-prod/server/app/api/neo4j/connect/route.js.nft.json +1 -1
  95. package/.next-prod/server/app/api/neo4j/disconnect/route.js.nft.json +1 -1
  96. package/.next-prod/server/app/api/neo4j/query/route.js.nft.json +1 -1
  97. package/.next-prod/server/app/api/neo4j/schema/route.js.nft.json +1 -1
  98. package/.next-prod/server/app/api/note/route.js.nft.json +1 -1
  99. package/.next-prod/server/app/api/ollama/config/route.js.nft.json +1 -1
  100. package/.next-prod/server/app/api/ollama/models/route.js.nft.json +1 -1
  101. package/.next-prod/server/app/api/ollama/start/route.js.nft.json +1 -1
  102. package/.next-prod/server/app/api/open-cursor/route.js.nft.json +1 -1
  103. package/.next-prod/server/app/api/open-vscode/route.js.nft.json +1 -1
  104. package/.next-prod/server/app/api/pick-folder/route.js.nft.json +1 -1
  105. package/.next-prod/server/app/api/pinned-sessions/route.js.nft.json +1 -1
  106. package/.next-prod/server/app/api/project-settings/route.js.nft.json +1 -1
  107. package/.next-prod/server/app/api/project-state/route.js.nft.json +1 -1
  108. package/.next-prod/server/app/api/projectGraph/affected/route.js.nft.json +1 -1
  109. package/.next-prod/server/app/api/projectGraph/callees/route.js.nft.json +1 -1
  110. package/.next-prod/server/app/api/projectGraph/callers/route.js.nft.json +1 -1
  111. package/.next-prod/server/app/api/projectGraph/coedit/route.js.nft.json +1 -1
  112. package/.next-prod/server/app/api/projectGraph/context/route.js.nft.json +1 -1
  113. package/.next-prod/server/app/api/projectGraph/file/route.js.nft.json +1 -1
  114. package/.next-prod/server/app/api/projectGraph/file-functions/route.js.nft.json +1 -1
  115. package/.next-prod/server/app/api/projectGraph/impact/route.js.nft.json +1 -1
  116. package/.next-prod/server/app/api/projectGraph/related/route.js.nft.json +1 -1
  117. package/.next-prod/server/app/api/projectGraph/risk/route.js.nft.json +1 -1
  118. package/.next-prod/server/app/api/projectGraph/search/route.js.nft.json +1 -1
  119. package/.next-prod/server/app/api/projects/route.js.nft.json +1 -1
  120. package/.next-prod/server/app/api/prompts/config/route.js.nft.json +1 -1
  121. package/.next-prod/server/app/api/push/public-key/route.js.nft.json +1 -1
  122. package/.next-prod/server/app/api/push/subscribe/route.js.nft.json +1 -1
  123. package/.next-prod/server/app/api/push/unsubscribe/route.js.nft.json +1 -1
  124. package/.next-prod/server/app/api/redis/command/route.js.nft.json +1 -1
  125. package/.next-prod/server/app/api/redis/connect/route.js.nft.json +1 -1
  126. package/.next-prod/server/app/api/redis/delete/route.js.nft.json +1 -1
  127. package/.next-prod/server/app/api/redis/disconnect/route.js.nft.json +1 -1
  128. package/.next-prod/server/app/api/redis/get/route.js.nft.json +1 -1
  129. package/.next-prod/server/app/api/redis/keys/route.js.nft.json +1 -1
  130. package/.next-prod/server/app/api/redis/set/route.js.nft.json +1 -1
  131. package/.next-prod/server/app/api/review/[id]/comments/route.js.nft.json +1 -1
  132. package/.next-prod/server/app/api/review/[id]/replies/route.js.nft.json +1 -1
  133. package/.next-prod/server/app/api/review/[id]/route.js.nft.json +1 -1
  134. package/.next-prod/server/app/api/review/identify/route.js.nft.json +1 -1
  135. package/.next-prod/server/app/api/review/order/route.js.nft.json +1 -1
  136. package/.next-prod/server/app/api/review/route.js.nft.json +1 -1
  137. package/.next-prod/server/app/api/review/share-info/route.js.nft.json +1 -1
  138. package/.next-prod/server/app/api/review/users/route.js.nft.json +1 -1
  139. package/.next-prod/server/app/api/scheduled-tasks/route.js +1 -1
  140. package/.next-prod/server/app/api/scheduled-tasks/route.js.nft.json +1 -1
  141. package/.next-prod/server/app/api/services/config/route.js.nft.json +1 -1
  142. package/.next-prod/server/app/api/services/scripts/route.js.nft.json +1 -1
  143. package/.next-prod/server/app/api/session/[sessionId]/fork/route.js +1 -1
  144. package/.next-prod/server/app/api/session/[sessionId]/fork/route.js.nft.json +1 -1
  145. package/.next-prod/server/app/api/session/[sessionId]/history/route.js.nft.json +1 -1
  146. package/.next-prod/server/app/api/session-by-path/route.js +1 -1
  147. package/.next-prod/server/app/api/session-by-path/route.js.nft.json +1 -1
  148. package/.next-prod/server/app/api/sessions/projects/[encodedPath]/route.js +1 -1
  149. package/.next-prod/server/app/api/sessions/projects/[encodedPath]/route.js.nft.json +1 -1
  150. package/.next-prod/server/app/api/sessions/projects/route.js.nft.json +1 -1
  151. package/.next-prod/server/app/api/sessions/route.js.nft.json +1 -1
  152. package/.next-prod/server/app/api/settings/route.js.nft.json +1 -1
  153. package/.next-prod/server/app/api/skills/[id]/route.js.nft.json +1 -1
  154. package/.next-prod/server/app/api/skills/content/route.js.nft.json +1 -1
  155. package/.next-prod/server/app/api/skills/route.js.nft.json +1 -1
  156. package/.next-prod/server/app/api/snapshots/diff/route.js.nft.json +1 -1
  157. package/.next-prod/server/app/api/snapshots/route.js.nft.json +1 -1
  158. package/.next-prod/server/app/api/terminal/aliases/route.js.nft.json +1 -1
  159. package/.next-prod/server/app/api/terminal/autocomplete/route.js.nft.json +1 -1
  160. package/.next-prod/server/app/api/terminal/bubble-order/route.js.nft.json +1 -1
  161. package/.next-prod/server/app/api/terminal/env/route.js.nft.json +1 -1
  162. package/.next-prod/server/app/api/terminal/history/route.js.nft.json +1 -1
  163. package/.next-prod/server/app/api/version/route.js.nft.json +1 -1
  164. package/.next-prod/server/app/apps/[...path]/route.js.nft.json +1 -1
  165. package/.next-prod/server/app/favicon.ico/route.js.nft.json +1 -1
  166. package/.next-prod/server/app/m/page.js.nft.json +1 -1
  167. package/.next-prod/server/app/manifest.webmanifest/route.js.nft.json +1 -1
  168. package/.next-prod/server/app/page.js.nft.json +1 -1
  169. package/.next-prod/server/app/project/page.js.nft.json +1 -1
  170. package/.next-prod/server/app/review/[id]/page.js.nft.json +1 -1
  171. package/.next-prod/server/app-paths-manifest.json +4 -4
  172. package/.next-prod/server/chunks/516.js +1 -0
  173. package/.next-prod/server/chunks/9352.js +2 -2
  174. package/.next-prod/server/middleware-build-manifest.js +1 -1
  175. package/.next-prod/server/pages/404.html +1 -1
  176. package/.next-prod/server/pages/500.html +1 -1
  177. package/.next-prod/server/server-reference-manifest.json +1 -1
  178. package/.next-prod/trace +14 -14
  179. package/.next-prod/trace-build +1 -1
  180. package/apps/devkit/app.jsx +20 -18
  181. package/dist/scheduledTasks.mjs +37 -3
  182. package/package.json +1 -1
  183. package/.next-prod/server/chunks/151.js +0 -1
  184. /package/.next-prod/static/{4Jgc-wu2w_CC8iS5G1QZf → pgteRwI6FQcp683smeSNO}/_buildManifest.js +0 -0
  185. /package/.next-prod/static/{4Jgc-wu2w_CC8iS5G1QZf → pgteRwI6FQcp683smeSNO}/_ssgManifest.js +0 -0
@@ -1 +1 @@
1
- [{"name":"run-webpack","duration":14223069,"timestamp":217108197,"id":14,"parentId":1,"tags":{},"startTime":1786551383366,"traceId":"d39e05c5d2115c60"},{"name":"run-typescript","duration":4776585,"timestamp":231335098,"id":1453,"parentId":1,"tags":{},"startTime":1786551397593,"traceId":"d39e05c5d2115c60"},{"name":"static-check","duration":1302019,"timestamp":236151746,"id":1456,"parentId":1,"tags":{},"startTime":1786551402409,"traceId":"d39e05c5d2115c60"},{"name":"static-generation","duration":5661658,"timestamp":237604580,"id":1760,"parentId":1,"tags":{},"startTime":1786551403862,"traceId":"d39e05c5d2115c60"},{"name":"collect-build-traces","duration":22685300,"timestamp":237454362,"id":1757,"parentId":1,"tags":{},"startTime":1786551403712,"traceId":"d39e05c5d2115c60"},{"name":"telemetry-flush","duration":51,"timestamp":260143536,"id":1769,"parentId":1,"tags":{},"startTime":1786551426401,"traceId":"d39e05c5d2115c60"},{"name":"next-build","duration":43211744,"timestamp":216931856,"id":1,"tags":{"buildMode":"default","version":"16.3.0","bundler":"webpack","has-custom-webpack-config":"true","use-build-worker":"false"},"startTime":1786551383189,"traceId":"d39e05c5d2115c60"}]
1
+ [{"name":"run-webpack","duration":12890187,"timestamp":319517246,"id":14,"parentId":1,"tags":{},"startTime":1786594549919,"traceId":"e9d5d13331642872"},{"name":"run-typescript","duration":3785267,"timestamp":332410595,"id":1453,"parentId":1,"tags":{},"startTime":1786594562812,"traceId":"e9d5d13331642872"},{"name":"static-check","duration":988895,"timestamp":336224662,"id":1456,"parentId":1,"tags":{},"startTime":1786594566626,"traceId":"e9d5d13331642872"},{"name":"static-generation","duration":4584220,"timestamp":337298104,"id":1760,"parentId":1,"tags":{},"startTime":1786594567700,"traceId":"e9d5d13331642872"},{"name":"collect-build-traces","duration":17178619,"timestamp":337214048,"id":1757,"parentId":1,"tags":{},"startTime":1786594567615,"traceId":"e9d5d13331642872"},{"name":"telemetry-flush","duration":36,"timestamp":354395590,"id":1769,"parentId":1,"tags":{},"startTime":1786594584797,"traceId":"e9d5d13331642872"},{"name":"next-build","duration":35010061,"timestamp":319385573,"id":1,"tags":{"buildMode":"default","version":"16.3.0","bundler":"webpack","has-custom-webpack-config":"true","use-build-worker":"false"},"startTime":1786594549787,"traceId":"e9d5d13331642872"}]
@@ -6,6 +6,9 @@
6
6
  * buy a ~50ms process spawn per keystroke and a "is that binary installed?"
7
7
  * failure mode. MD5 comes from ./md5.js, SHA from the browser's crypto.subtle.
8
8
  */
9
+ // React/ReactDOM come from the /html-lib script tags in index.html; `md5` is
10
+ // the global exported by the sibling ./md5.js script tag.
11
+ /* global React, ReactDOM, md5 */
9
12
  const { useState, useEffect, useMemo, useCallback, useRef, useContext, createContext } = React;
10
13
 
11
14
  /* ------------------------------------------------------------------ utils */
@@ -243,14 +246,14 @@ function TextCodecPanel({ state, patch, kind }) {
243
246
  }, [debounced, state.mode, kind]);
244
247
 
245
248
  const controls = (
246
- <React.Fragment>
249
+ <>
247
250
  <Segmented value={state.mode} onChange={(mode) => patch({ mode })}
248
251
  options={[{ value: 'encode', label: 'Encode' }, { value: 'decode', label: 'Decode' }]} />
249
252
  <button className="btn" onClick={() => patch({ text: '' })}>Clear</button>
250
253
  <span className="bar-note">
251
254
  {kind === 'base64' ? 'UTF-8 safe — handles non-ASCII text.' : 'encodeURIComponent / decodeURIComponent.'}
252
255
  </span>
253
- </React.Fragment>
256
+ </>
254
257
  );
255
258
 
256
259
  return (
@@ -281,12 +284,12 @@ function JsonPanel({ state, patch }) {
281
284
  }, [debounced, state.mode]);
282
285
 
283
286
  const controls = (
284
- <React.Fragment>
287
+ <>
285
288
  <Segmented value={state.mode} onChange={(mode) => patch({ mode })}
286
289
  options={[{ value: 'pretty', label: 'Pretty' }, { value: 'minify', label: 'Minify' }]} />
287
290
  <button className="btn" onClick={() => patch({ text: '' })}>Clear</button>
288
291
  <span className="bar-note">Parses as you type — the error message doubles as validation.</span>
289
- </React.Fragment>
292
+ </>
290
293
  );
291
294
 
292
295
  return (
@@ -339,14 +342,14 @@ function HashPanel({ state, patch }) {
339
342
  }, [debounced]);
340
343
 
341
344
  const controls = (
342
- <React.Fragment>
345
+ <>
343
346
  <button className="btn" onClick={() => patch({ text: '' })}>Clear</button>
344
347
  <span className="bar-note">
345
348
  {SUBTLE
346
349
  ? 'MD5 computed locally; SHA via the browser\'s WebCrypto.'
347
350
  : 'SHA needs a secure context — open DevKit over localhost to enable it.'}
348
351
  </span>
349
- </React.Fragment>
352
+ </>
350
353
  );
351
354
 
352
355
  return (
@@ -450,7 +453,7 @@ function JwtPanel({ state, patch }) {
450
453
  )}
451
454
 
452
455
  {decoded && decoded.header && (
453
- <React.Fragment>
456
+ <>
454
457
  <div className="section">
455
458
  <div className="section-hd">
456
459
  <span className="section-title">Header</span>
@@ -458,7 +461,7 @@ function JwtPanel({ state, patch }) {
458
461
  </div>
459
462
  <pre className="mono-block">{headerJson}</pre>
460
463
  {algNone && (
461
- <span className="kv-v error">alg is "none" — this token is unsigned.</span>
464
+ <span className="kv-v error">alg is &quot;none&quot; — this token is unsigned.</span>
462
465
  )}
463
466
  </div>
464
467
 
@@ -488,7 +491,7 @@ function JwtPanel({ state, patch }) {
488
491
  <span className="section-title">Signature</span>
489
492
  <pre className="mono-block muted">{decoded.signature || '(empty)'}</pre>
490
493
  </div>
491
- </React.Fragment>
494
+ </>
492
495
  )}
493
496
  </div>
494
497
  </div>
@@ -546,12 +549,12 @@ function TimestampPanel({ state, patch }) {
546
549
  <div className="kv"><span className="kv-v error">{fromEpoch.error}</span></div>
547
550
  )}
548
551
  {fromEpoch && fromEpoch.date && (
549
- <React.Fragment>
552
+ <>
550
553
  <div className="kv"><span className="kv-k">Detected</span><span className="kv-v muted">{fromEpoch.unit}</span></div>
551
554
  <div className="kv"><span className="kv-k">Local</span><span className="kv-v">{formatLocal(fromEpoch.date)}</span></div>
552
555
  <div className="kv"><span className="kv-k">UTC</span><span className="kv-v">{formatUTC(fromEpoch.date)}</span></div>
553
556
  <div className="kv"><span className="kv-k">ISO</span><span className="kv-v">{fromEpoch.date.toISOString()}</span></div>
554
- </React.Fragment>
557
+ </>
555
558
  )}
556
559
  </div>
557
560
  </div>
@@ -570,7 +573,7 @@ function TimestampPanel({ state, patch }) {
570
573
  <div className="kv"><span className="kv-v error">{fromDate.error}</span></div>
571
574
  )}
572
575
  {fromDate && fromDate.date && (
573
- <React.Fragment>
576
+ <>
574
577
  <div className="kv">
575
578
  <span className="kv-k">Seconds</span>
576
579
  <span className="kv-v">{Math.floor(fromDate.date.getTime() / 1000)}</span>
@@ -582,7 +585,7 @@ function TimestampPanel({ state, patch }) {
582
585
  <CopyButton text={String(fromDate.date.getTime())} label="Milliseconds" />
583
586
  </div>
584
587
  <div className="kv"><span className="kv-k">ISO</span><span className="kv-v">{fromDate.date.toISOString()}</span></div>
585
- </React.Fragment>
588
+ </>
586
589
  )}
587
590
  </div>
588
591
  </div>
@@ -603,7 +606,6 @@ function UuidPanel({ state, patch }) {
603
606
  listRef.current = state.list;
604
607
  useEffect(() => {
605
608
  if (listRef.current.length === 0) generate(state.count);
606
- // eslint-disable-next-line react-hooks/exhaustive-deps
607
609
  }, []);
608
610
 
609
611
  const shown = useMemo(() => state.list.map((u) => {
@@ -680,13 +682,13 @@ function App() {
680
682
  const [state, setState] = useState(INITIAL);
681
683
  const [toastMsg, setToastMsg] = useState(null);
682
684
 
683
- const toastTimer = useRef(null);
685
+ const toastTimerRef = useRef(null);
684
686
  const toast = useCallback((message) => {
685
687
  setToastMsg(message);
686
- clearTimeout(toastTimer.current);
687
- toastTimer.current = setTimeout(() => setToastMsg(null), 1600);
688
+ clearTimeout(toastTimerRef.current);
689
+ toastTimerRef.current = setTimeout(() => setToastMsg(null), 1600);
688
690
  }, []);
689
- useEffect(() => () => clearTimeout(toastTimer.current), []);
691
+ useEffect(() => () => clearTimeout(toastTimerRef.current), []);
690
692
 
691
693
  const patchers = useMemo(() => {
692
694
  const out = {};
@@ -17478,6 +17478,8 @@ var CODEX_IMAGE_ONLY_TEXT = "[Image]";
17478
17478
  var CODEX_TOOL_NAMES = {
17479
17479
  bash: "Bash",
17480
17480
  applyPatch: "ApplyPatch",
17481
+ /** `view_image` → claude's Read: it opens a file, and Read is in READ_ONLY_TOOLS. */
17482
+ read: "Read",
17481
17483
  /** `spawn_agent` → claude's Task, so one bubble == one sub-agent. */
17482
17484
  task: "Task",
17483
17485
  /** `update_plan` / live `todo_list` → the checklist MessageBubble already renders. */
@@ -17488,6 +17490,7 @@ var CODEX_TOOL_NAMES = {
17488
17490
  var CODEX_MCP_NAMESPACE_PREFIX = "mcp__";
17489
17491
  var codexMcpToolName = (server, tool2) => `${CODEX_MCP_NAMESPACE_PREFIX}${server}__${tool2}`;
17490
17492
  var CODEX_SPAWN_FN_NAME = "spawn_agent";
17493
+ var CODEX_SUB_AGENT_ACTIVITY_TYPE = "sub_agent_activity";
17491
17494
  var CODEX_PATCH_FN_NAME = "apply_patch";
17492
17495
  var CODEX_EXEC_SCRIPT_FN_NAME = "exec";
17493
17496
  function codexTodoInput(items) {
@@ -17596,15 +17599,37 @@ function parseCodexExecScript(script) {
17596
17599
  }
17597
17600
  var CODEX_AGENT_DONE = /* @__PURE__ */ new Set(["completed", "errored", "interrupted", "not_found", "failed"]);
17598
17601
  function parseCodexSpawnInput(args, extra) {
17599
- const prompt = typeof args.message === "string" ? args.message : "";
17600
- const agentType = typeof args.agent_type === "string" ? args.agent_type : void 0;
17602
+ const message = typeof args.message === "string" ? args.message : "";
17603
+ const encrypted = isCodexEncryptedPayload(message);
17604
+ const prompt = encrypted ? "" : message;
17605
+ const agentType = typeof args.agent_type === "string" ? args.agent_type : typeof args.task_name === "string" ? codexAgentPathName(args.task_name) : void 0;
17601
17606
  return {
17602
17607
  ...agentType ? { subagent_type: agentType } : {},
17603
17608
  description: codexSpawnDescription(extra?.nickname, agentType, prompt),
17604
- prompt,
17609
+ ...encrypted ? { message_encrypted: true } : { prompt },
17605
17610
  ...extra?.agentId ? { agent_id: extra.agentId } : {}
17606
17611
  };
17607
17612
  }
17613
+ var CODEX_FERNET_TOKEN_RE = /^gAAAAA[A-Za-z0-9_-]{32,}={0,2}$/;
17614
+ function isCodexEncryptedPayload(text) {
17615
+ return CODEX_FERNET_TOKEN_RE.test(text.trim());
17616
+ }
17617
+ function codexAgentPathName(agentPath) {
17618
+ const segments = agentPath.split("/").filter(Boolean);
17619
+ return segments[segments.length - 1] || agentPath;
17620
+ }
17621
+ function parseCodexSubAgentActivity(payload) {
17622
+ if (!payload || payload.type !== CODEX_SUB_AGENT_ACTIVITY_TYPE) return null;
17623
+ const { event_id: callId, agent_thread_id: agentThreadId } = payload;
17624
+ if (typeof callId !== "string" || !callId) return null;
17625
+ if (typeof agentThreadId !== "string" || !agentThreadId) return null;
17626
+ return {
17627
+ callId,
17628
+ agentThreadId,
17629
+ ...typeof payload.agent_path === "string" ? { agentPath: payload.agent_path } : {},
17630
+ ...typeof payload.kind === "string" ? { kind: payload.kind } : {}
17631
+ };
17632
+ }
17608
17633
  function codexSpawnDescription(nickname, agentType, prompt) {
17609
17634
  if (nickname) return agentType ? `${nickname} (${agentType})` : nickname;
17610
17635
  const firstLine = prompt.split("\n", 1)[0]?.trim() || "";
@@ -17714,6 +17739,15 @@ function parseCallLines(text, exec2, patch, spawns, mcps) {
17714
17739
  target.nickname = parsed.nickname;
17715
17740
  }
17716
17741
  }
17742
+ } else {
17743
+ const activity = parseCodexSubAgentActivity(p);
17744
+ if (activity) {
17745
+ const target = spawns.find((s) => s.callId === activity.callId && !s.agentId);
17746
+ if (target) {
17747
+ target.agentId = activity.agentThreadId;
17748
+ if (activity.agentPath) target.agentPath = activity.agentPath;
17749
+ }
17750
+ }
17717
17751
  }
17718
17752
  }
17719
17753
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@surething/cockpit",
3
- "version": "1.0.260",
3
+ "version": "1.0.261",
4
4
  "description": "The open-source Claude Code GUI — an IDE-like workbench for parallel AI coding. Drive Claude (default), Codex, DeepSeek, Kimi, or local Ollama in tabs. Terminal, browser & DB bubbles, code review. Self-host on a shared dev box — a seat for every teammate. Local-first, MIT.",
5
5
  "author": "Robert",
6
6
  "license": "MIT",
@@ -1 +0,0 @@
1
- "use strict";exports.id=151,exports.ids=[151],exports.modules={26479:(a,b,c)=>{c.d(b,{CR:()=>h,my:()=>i,os:()=>g});var d=c(29021),e=c(33873),f=c(7939);function g(a,b){let c=(0,f.Kk)(a,b);if(d.existsSync(c))return{sessionPath:c,engine:"claude"};let e=(0,f.Xi)(a,b);if(d.existsSync(e))return{sessionPath:e,engine:"deepseek"};let g=(0,f.n2)(a,b);if(d.existsSync(g))return{sessionPath:g,engine:"kimi"};let h=(0,f.Rk)(a,b);if(d.existsSync(h))return{sessionPath:h,engine:"glm"};let i=(0,f.eg)(b);if(i)return{sessionPath:i,engine:"codex"};let j=(0,f.yw)(a,b);return d.existsSync(j)?{sessionPath:j,engine:"ollama"}:null}function h(a){return!!a.engine}function i(a,b,c){switch(a.engine){case"claude":return(0,f.Kk)(b,c);case"deepseek":return(0,f.Xi)(b,c);case"kimi":return(0,f.n2)(b,c);case"glm":return(0,f.Rk)(b,c);case"ollama":return(0,f.yw)(b,c);case"codex":{let a=new Date,b=a=>String(a).padStart(2,"0"),d=String(a.getFullYear()),g=b(a.getMonth()+1),h=b(a.getDate()),i=`${d}-${g}-${h}T${b(a.getHours())}-${b(a.getMinutes())}-${b(a.getSeconds())}`;return(0,e.join)(f.yk,d,g,h,`rollout-${i}-${c}.jsonl`)}default:return null}}},40516:(a,b,c)=>{c.d(b,{$H:()=>h,BZ:()=>B,Bn:()=>m,C4:()=>e,Dn:()=>g,Hq:()=>E,L8:()=>K,RA:()=>d,TB:()=>t,U6:()=>r,Uk:()=>n,VW:()=>w,Y8:()=>o,YU:()=>s,dr:()=>G,g$:()=>j,iN:()=>x,jB:()=>i,nE:()=>F,nq:()=>C,o4:()=>A,p7:()=>D,q4:()=>y,qW:()=>p,uz:()=>q,wL:()=>f,yM:()=>l});let d="[Image]",e={bash:"Bash",applyPatch:"ApplyPatch",task:"Task",todo:"TodoWrite",webSearch:"WebSearch",webFetch:"WebFetch"},f="mcp__",g=(a,b)=>`${f}${a}__${b}`,h="spawn_agent",i="wait_agent",j=new Set([h,i,"close_agent","send_input","resume_agent"]),k="update_plan",l="apply_patch",m="exec",n=new Set([l,m]);function o(a,b){return b?.startsWith(f)?`${b}__${a}`:"shell_command"===a||"exec_command"===a?e.bash:"apply_patch"===a?e.applyPatch:a===h?e.task:a===k?e.todo:a}function p(a){return{todos:(a??[]).flatMap(a=>"string"==typeof a?.text?[{content:a.text,status:a.completed?"completed":"pending"}]:[])}}function q(a){let b=a.filter(a=>"completed"===a.status).length;return`${b}/${a.length} completed`}function r(a,b){if(b?.type==="open_page"&&b.url)return{name:e.webFetch,input:{url:b.url},result:b.url};let c=b?.query||a||"",d=b?.queries?.length?b.queries:c?[c]:[];return{name:e.webSearch,input:{query:c},result:d.join("\n")}}function s(a){return a.error?.message?a.error.message:null===a.result||void 0===a.result?"":"string"==typeof a.result?a.result:JSON.stringify(a.result,null,2)}function t(a){let b,c=[],d=/^\*\*\* (Add|Update|Delete) File: (.+)$/gm;for(;b=d.exec(a);)c.push({path:b[2].trim(),kind:b[1].toLowerCase()});return{changes:c}}let u=/"(?:\\.|[^"\\])*"|'(?:\\.|[^'\\])*'|`(?:\\.|[^`\\])*`/g,v={n:"\n",r:"\r",t:" ",b:"\b",f:"\f",v:"\v",0:"\0"};function w(a){let b=function(a){let b;for(u.lastIndex=0;b=u.exec(a);){let a=function(a){if(a.startsWith('"'))try{return JSON.parse(a)}catch{}return a.slice(1,-1).replace(/\\(u\{[0-9a-fA-F]+\}|u[0-9a-fA-F]{4}|x[0-9a-fA-F]{2}|[\s\S])/g,(a,b)=>b.startsWith("u{")?String.fromCodePoint(parseInt(b.slice(2,-1),16)):b.startsWith("u")||b.startsWith("x")?String.fromCharCode(parseInt(b.slice(1),16)):v[b]??b)}(b[0]);if(a.includes("*** Begin Patch"))return a}return null}(a);if(b)return{kind:"patch",patch:b};let c=function(a){let b=a.indexOf("tools.exec_command(");if(-1===b)return null;let c=a.indexOf("{",b);if(-1===c)return null;let d=0,e="";for(let b=c;b<a.length;b++){let f=a[b];if(e){"\\"===f?b++:f===e&&(e="");continue}if('"'===f||"'"===f||"`"===f){e=f;continue}if("{"===f)d++;else if("}"===f&&0==--d)try{let d=JSON.parse(a.slice(c,b+1));return d&&"object"==typeof d?d:null}catch{break}}return null}(a);return c?{kind:"exec",command:"string"==typeof c.cmd?c.cmd:"",args:c}:{kind:"unknown"}}function x(a){let b=w(a);return"patch"===b.kind?{name:e.applyPatch,input:t(b.patch)}:"exec"===b.kind?{name:e.bash,input:G("exec_command",b.args)}:{name:e.bash,input:{command:a}}}function y(a){if(null==a)return"";if("string"==typeof a)return a;if(Array.isArray(a))return a.map(y).join("");if("object"==typeof a){let b=a.text;return"string"==typeof b?b:JSON.stringify(a)}return String(a)}let z=new Set(["completed","errored","interrupted","not_found","failed"]);function A(a,b){let c="string"==typeof a.message?a.message:"",d="string"==typeof a.agent_type?a.agent_type:void 0;return{...d?{subagent_type:d}:{},description:B(b?.nickname,d,c),prompt:c,...b?.agentId?{agent_id:b.agentId}:{}}}function B(a,b,c){if(a)return b?`${a} (${b})`:a;let d=c.split("\n",1)[0]?.trim()||"";return d?d.slice(0,80):b||"subagent"}function C(a){try{let b=JSON.parse(a);if("string"!=typeof b?.agent_id||!b.agent_id)return null;return{agentId:b.agent_id,..."string"==typeof b.nickname?{nickname:b.nickname}:{}}}catch{return null}}function D(a){let b;try{b=JSON.parse(a)}catch{return[]}let c=b?.status;if(!c||"object"!=typeof c)return[];let d=[];for(let[a,b]of Object.entries(c)){if(!b||"object"!=typeof b)continue;let[c,e]=Object.entries(b)[0]??[];c&&d.push({agentId:a,status:c,message:"string"==typeof e?e:"",done:z.has(c)})}return d}function E(a){return a&&"object"==typeof a?Object.entries(a).flatMap(([a,b])=>{let c="string"==typeof b?.status?b.status:"";return c?[{agentId:a,status:c,message:"string"==typeof b?.message?b.message:"",done:z.has(c)}]:[]}):[]}function F(a){return a.message||`(agent ${a.status})`}function G(a,b){if(a===h)return A(b);if(a===k)return{todos:(Array.isArray(b.plan)?b.plan:[]).flatMap(a=>"string"!=typeof a?.step?[]:[{content:a.step,status:"string"==typeof a.status?a.status:"pending"}])};if(o(a)!==e.bash||"string"==typeof b.command||"string"!=typeof b.cmd)return b;let{cmd:c,...d}=b;return{...d,command:b.cmd}}let H=/^<image\b[^>]*>$/i,I=/<\/?image\b[^>]*>/gi,J=/^data:(image\/(?:png|jpeg|webp|gif));base64,([\s\S]*)$/;function K(a){return{text:(a?.filter(a=>"input_text"===a.type&&a.text&&!H.test(a.text.trim())).map(a=>a.text).join("")||"").replace(I,""),images:a?.filter(a=>"input_image"===a.type&&a.image_url).map(a=>{let b;return(b=a.image_url.match(J))?{type:"base64",media_type:b[1],data:b[2]}:null}).filter(a=>null!==a)||[]}}},72891:(a,b,c)=>{c.a(a,async(a,d)=>{try{c.d(b,{OZ:()=>o,RL:()=>n,k9:()=>p,ok:()=>l});var e=c(37625),f=c(52693),g=c(18412),h=c(89705),i=c(94506),j=c(770),k=a([i]);i=(k.then?(await k)():k)[0];let l=(a,b=200)=>new Response(JSON.stringify(a),{status:b,headers:{"content-type":"application/json"}}),m=a=>{let b=e.od(a);if(f.Ru(b)){let a=b.value,c=(0,j.Sh)(a);return new Response(JSON.stringify({error:(a=>{let b=a.message;if("string"==typeof b&&b.length>0)return b;let c=a.cause;if(c instanceof Error&&c.message.length>0)return c.message;switch(a._tag){case"ValidationError":return`Invalid ${a.field}: ${a.reason}`;case"NotFoundError":return`${a.resource} not found: ${a.id}`;case"PermissionError":return`Permission denied: ${a.action} on ${a.resource}`;case"DBError":return`${a.db} ${a.op} failed`;case"FSError":return`${a.op} ${a.path} failed`;case"WSError":return`${a.proto} ${a.kind} failed`;case"AgentError":return`${a.provider} ${a.kind} failed`;default:return a._tag}})(a),tag:a._tag}),{status:c,headers:{"content-type":"application/json"}})}return console.error("[handler] uncaught defect:\n"+e.j9(a)),new Response(JSON.stringify({error:"Internal Server Error",tag:"InternalError"}),{status:500,headers:{"content-type":"application/json"}})},n=a=>async b=>{let c=await i.s9.runPromiseExit(a(b));return g.YW(c,{onFailure:a=>m(a),onSuccess:a=>a})},o=a=>async(b,c)=>{let d=await c.params,e=await i.s9.runPromiseExit(a(b,d));return g.YW(e,{onFailure:a=>m(a),onSuccess:a=>a})},p=a=>h.$mh({try:()=>a.json(),catch:()=>new j.yI({field:"body",reason:"invalid JSON"})});d()}catch(a){d(a)}})},98084:(a,b,c)=>{function d(a){return a.isMeta&&a.sourceToolUseID?"skill":a.origin?.kind==="task-notification"?"task-notification":a.origin?.kind&&"human"!==a.origin.kind||a.isMeta||a.isCompactSummary?"meta":null}function e(a){if("user"!==a.type||null!==d(a))return!1;let b=a.message?.content;return"string"==typeof b?b.length>0:!!Array.isArray(b)&&b.some(a=>a?.type==="text")}c.d(b,{k:()=>d,l:()=>e})}};