@jmanuelcorral/openteam 0.20.0 → 0.22.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (74) hide show
  1. package/README.es.md +32 -1
  2. package/README.md +30 -1
  3. package/dist/certificates/graph-release-certificate.json +2 -2
  4. package/dist/certificates/graph-shadow-certificate.json +2 -2
  5. package/dist/cli/consoleServe.d.ts +1 -0
  6. package/dist/cli/consoleServe.d.ts.map +1 -1
  7. package/dist/cli.d.ts.map +1 -1
  8. package/dist/cli.js +5681 -1465
  9. package/dist/commands/dispatch.d.ts +9 -4
  10. package/dist/commands/dispatch.d.ts.map +1 -1
  11. package/dist/commands/doctor.d.ts +2 -0
  12. package/dist/commands/doctor.d.ts.map +1 -1
  13. package/dist/commands/setup.d.ts +137 -4
  14. package/dist/commands/setup.d.ts.map +1 -1
  15. package/dist/commands/types.d.ts +4 -0
  16. package/dist/commands/types.d.ts.map +1 -1
  17. package/dist/commands/upgrade.d.ts +42 -0
  18. package/dist/commands/upgrade.d.ts.map +1 -0
  19. package/dist/config/errors.d.ts.map +1 -1
  20. package/dist/config/historyEndpoint.d.ts +3 -0
  21. package/dist/config/historyEndpoint.d.ts.map +1 -0
  22. package/dist/config/pluginSpec.d.ts +43 -0
  23. package/dist/config/pluginSpec.d.ts.map +1 -0
  24. package/dist/config/schema.d.ts +12 -0
  25. package/dist/config/schema.d.ts.map +1 -1
  26. package/dist/console/assets.d.ts +3 -3
  27. package/dist/console/assets.d.ts.map +1 -1
  28. package/dist/console/conversation.d.ts +75 -0
  29. package/dist/console/conversation.d.ts.map +1 -0
  30. package/dist/console/historyBoundary.d.ts +6 -0
  31. package/dist/console/historyBoundary.d.ts.map +1 -0
  32. package/dist/console/inspector.d.ts +3 -0
  33. package/dist/console/inspector.d.ts.map +1 -0
  34. package/dist/console/labels.d.ts +12 -0
  35. package/dist/console/labels.d.ts.map +1 -0
  36. package/dist/console/opencodeClient.d.ts.map +1 -1
  37. package/dist/console/refresh.d.ts +3 -0
  38. package/dist/console/refresh.d.ts.map +1 -0
  39. package/dist/console/render.d.ts +7 -0
  40. package/dist/console/render.d.ts.map +1 -1
  41. package/dist/console/rootAssociation.d.ts +7 -0
  42. package/dist/console/rootAssociation.d.ts.map +1 -0
  43. package/dist/index.d.ts +1 -1
  44. package/dist/index.d.ts.map +1 -1
  45. package/dist/index.js +2887 -907
  46. package/dist/local/lemonade.d.ts.map +1 -1
  47. package/dist/local/openai-compatible.d.ts.map +1 -1
  48. package/dist/local/types.d.ts +16 -0
  49. package/dist/local/types.d.ts.map +1 -1
  50. package/dist/messages/commands.d.ts +9 -0
  51. package/dist/messages/commands.d.ts.map +1 -1
  52. package/dist/messages/consoleDetail.d.ts +54 -0
  53. package/dist/messages/consoleDetail.d.ts.map +1 -0
  54. package/dist/messages/executionSetup.d.ts +43 -0
  55. package/dist/messages/executionSetup.d.ts.map +1 -1
  56. package/dist/messages/index.d.ts +1 -0
  57. package/dist/messages/index.d.ts.map +1 -1
  58. package/dist/messages/orchestration.d.ts +3 -0
  59. package/dist/messages/orchestration.d.ts.map +1 -1
  60. package/dist/messages/upgrade.d.ts +129 -0
  61. package/dist/messages/upgrade.d.ts.map +1 -0
  62. package/dist/plugin/commandTool.d.ts +4 -4
  63. package/dist/plugin/commandTool.d.ts.map +1 -1
  64. package/dist/plugin/orchestrateTool.d.ts.map +1 -1
  65. package/dist/web/configApi.d.ts +1 -1
  66. package/dist/web/configApi.d.ts.map +1 -1
  67. package/dist/web/console.d.ts.map +1 -1
  68. package/dist/web/conversationRoute.d.ts +16 -0
  69. package/dist/web/conversationRoute.d.ts.map +1 -0
  70. package/dist/web/server.d.ts +5 -0
  71. package/dist/web/server.d.ts.map +1 -1
  72. package/dist/web/start.d.ts +6 -0
  73. package/dist/web/start.d.ts.map +1 -1
  74. package/package.json +1 -1
@@ -4,7 +4,7 @@
4
4
  * composición de paneles. No contienen datos de usuario; el `render.ts` escapa
5
5
  * todo el contenido dinámico antes de insertarlo.
6
6
  */
7
- export declare const CONSOLE_STYLE = "\n:root{color-scheme:dark;--bg:#0f0f0f;--surface:#17181b;--surface-2:#1e2024;--panel:var(--surface);--fg:#eceef1;--muted:#a2a8b2;--faint:#6b7079;--border:rgba(255,255,255,.08);--border-strong:rgba(255,255,255,.16);--line:var(--border);--accent:#35c07a;--accent-bg:rgba(53,192,122,.12);--accent-fg:#57d492;--good:var(--accent-fg);--local:#6aa6f5;--frontier:#e0a53a;--warn:#e0a53a;--warn-bg:rgba(224,165,58,.12);--danger:#f0687f;--danger-bg:rgba(240,104,127,.12);--info:#6aa6f5;--info-bg:rgba(106,166,245,.12);--font-sans:-apple-system,BlinkMacSystemFont,\"Segoe UI\",system-ui,sans-serif;--font-mono:\"JetBrains Mono\",\"IBM Plex Mono\",ui-monospace,\"SFMono-Regular\",Consolas,monospace;--shadow-pop:0 8px 28px rgba(0,0,0,.5);--sidebar-w:248px}\n*{box-sizing:border-box;margin:0;padding:0}\nhtml,body{height:100%}\nbody{background:var(--bg);color:var(--fg);font:14px/1.55 var(--font-sans);-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;font-variant-numeric:tabular-nums}\n.mono,code,.hash{font-family:var(--font-mono);font-variant-numeric:tabular-nums}\nbutton{font:inherit;cursor:pointer}\nbutton:focus-visible,input:focus-visible,textarea:focus-visible{outline:2px solid var(--accent);outline-offset:1px}\n::selection{background:var(--accent-bg)}\n.app{display:grid;grid-template-columns:var(--sidebar-w) 1fr;grid-template-rows:100vh;min-height:100vh}\n.sidebar{background:var(--surface);border-right:1px solid var(--border);display:flex;flex-direction:column;min-height:0}\n.brand{display:flex;align-items:center;gap:10px;padding:18px 18px 16px;border-bottom:1px solid var(--border)}\n.logo{width:26px;height:26px;border-radius:6px;background:var(--accent);color:#fff;display:grid;place-items:center;flex:none}\n.logo svg{width:15px;height:15px}.brand .name{font-weight:600;letter-spacing:-.01em}.brand .tag{font:10px/1 var(--font-mono);letter-spacing:.08em;color:var(--accent-fg);background:var(--accent-bg);padding:3px 6px;border-radius:4px;margin-left:auto;text-transform:uppercase}\n.nav{padding:10px;display:flex;flex-direction:column;gap:2px}.nav-label{font:10px/1 var(--font-mono);letter-spacing:.12em;text-transform:uppercase;color:var(--faint);padding:14px 8px 6px}.nav-item{display:flex;align-items:center;gap:10px;padding:9px 10px;border-radius:7px;color:var(--muted);background:transparent;border:0;width:100%;text-align:left;letter-spacing:-.005em;transition:background .12s,color .12s}.nav-item svg{width:17px;height:17px;flex:none}.nav-item .count{margin-left:auto;font:11px/1 var(--font-mono);color:var(--faint)}.nav-item .pill{margin-left:auto}.nav-item:hover{background:var(--surface-2);color:var(--fg)}.nav-item[aria-current=\"page\"]{background:var(--accent-bg);color:var(--accent-fg);font-weight:550}.nav-item[aria-current=\"page\"] .count{color:var(--accent-fg)}\n.sidebar-foot{margin-top:auto;padding:14px 16px;border-top:1px solid var(--border);font-size:12px;color:var(--muted);display:flex;flex-direction:column;gap:8px}.host-row{display:flex;align-items:center;gap:8px}.dot{width:8px;height:8px;border-radius:50%;display:inline-block;flex:none;background:var(--muted)}.dot.live,.dot.status-running{background:var(--accent);box-shadow:0 0 0 3px var(--accent-bg)}.dot.warn,.dot.status-waiting-input{background:var(--warn)}.dot.down{background:var(--danger)}.dot.status-idle{background:var(--muted)}.dot.status-ended{background:#6e7681}\n.main{min-width:0;min-height:0;display:flex;flex-direction:column}.topbar{height:56px;flex:none;border-bottom:1px solid var(--border);background:color-mix(in srgb,var(--surface) 82%,transparent);backdrop-filter:blur(8px);display:flex;align-items:center;gap:14px;padding:0 20px}.topbar h1{font-size:15px;font-weight:600;letter-spacing:-.01em}.refresh,.token-chip{display:inline-flex;align-items:center;gap:7px;font:11px/1 var(--font-mono);color:var(--muted);padding:5px 9px;border:1px solid var(--border);border-radius:6px;background:var(--surface)}.refresh .beat{width:6px;height:6px;border-radius:50%;background:var(--accent);animation:beat 2s ease-in-out infinite}@keyframes beat{0%,100%{opacity:1}50%{opacity:.25}}.spacer{margin-left:auto}.icon-btn{width:34px;height:34px;border-radius:7px;border:1px solid var(--border);background:var(--surface);color:var(--muted);display:grid;place-items:center;transition:background .12s,color .12s,border-color .12s}.icon-btn:hover{background:var(--surface-2);color:var(--fg);border-color:var(--border-strong)}.icon-btn svg{width:17px;height:17px}.token-chip b{color:var(--fg);font-weight:600}\n.scroll{flex:1;overflow-y:auto;min-height:0}.screen{display:none;padding:22px 24px 40px;max-width:1320px}.screen.active{display:block}.screen[hidden]{display:none!important}.screen-head{margin-bottom:18px}.screen-head h2{font-size:19px;font-weight:600;letter-spacing:-.02em;display:flex;align-items:center;gap:8px}.screen-head p{color:var(--muted);font-size:13px;margin-top:3px;max-width:74ch;text-wrap:pretty}.screen-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(320px,1fr));gap:16px}.screen-grid .wide,.panel.wide{grid-column:1/-1}\n.panel,.card{background:var(--surface);border:1px solid var(--border);border-radius:10px;padding:16px}.panel h2,.panel h3,.card-head h3{font-size:13px;margin:0 0 12px;color:var(--muted);text-transform:uppercase;letter-spacing:.04em}.card-head{display:flex;align-items:center;gap:10px;padding:13px 16px;border-bottom:1px solid var(--border);margin:-16px -16px 14px}.card-head .sub{font:11px/1 var(--font-mono);color:var(--faint);margin-left:auto}.grid{display:grid;grid-template-columns:repeat(2,1fr);gap:10px}.stat{background:var(--surface);border:1px solid var(--border);border-radius:10px;padding:15px 16px;display:flex;flex-direction:column;gap:2px}.stat .k{font:11px/1 var(--font-mono);letter-spacing:.06em;text-transform:uppercase;color:var(--faint)}.stat .v{font-size:20px;font-weight:600;letter-spacing:-.02em;margin-top:6px}.stat .d{font-size:12px;color:var(--muted);margin-top:4px;display:flex;align-items:center;gap:6px}.good{color:var(--good)}.local{color:var(--local)}.frontier{color:var(--frontier)}.muted{color:var(--muted)}.faint{color:var(--faint)}\ntable{width:100%;border-collapse:collapse;font-size:13px}th,td{text-align:left;padding:10px 12px;border-bottom:1px solid var(--border)}th{font:11px/1 var(--font-mono);letter-spacing:.05em;text-transform:uppercase;color:var(--faint);font-weight:500}tbody tr:last-child td{border-bottom:0}tbody tr:hover{background:var(--surface-2)}td.num{text-align:right;font-family:var(--font-mono)}.hash{color:var(--faint)}\n.pill,.badge{display:inline-flex;align-items:center;gap:5px;font:11px/1 var(--font-mono);letter-spacing:.02em;padding:3px 8px;border-radius:999px;border:1px solid transparent}.pill.local,.badge.status-running{color:var(--accent-fg);background:var(--accent-bg);border-color:var(--accent-bg)}.pill.frontier{color:var(--info);background:var(--info-bg)}.pill.warn,.badge.status-waiting-input{color:var(--warn);background:var(--warn-bg);border-color:var(--warn-bg)}.pill.danger{color:var(--danger);background:var(--danger-bg)}.pill.idle,.badge.status-idle,.badge.status-ended{color:var(--muted);background:var(--surface-2)}\n.progress{height:10px;background:var(--surface-2);border-radius:6px;overflow:hidden;border:1px solid var(--border)}.progress .bar{height:100%;background:var(--accent)}ul.items,ul.timeline{list-style:none;margin:8px 0 0;padding:0;max-height:320px;overflow:auto}ul.items li,ul.timeline li{padding:6px 0;border-bottom:1px solid var(--border)}ul.items li.done{color:var(--muted)}ul.items .box{font-family:var(--font-mono)}.who{color:var(--local)}.tag{color:var(--frontier);font-size:12px}.kind{display:inline-block;min-width:66px;color:var(--muted);font-size:12px}code{background:var(--bg);padding:1px 5px;border-radius:4px}\n.logs-layout{display:grid;grid-template-columns:220px 1fr;gap:16px;align-items:start;margin-bottom:16px}.session-list{padding:6px;max-height:70vh;overflow-y:auto}.session-btn{display:flex;align-items:center;gap:8px;width:100%;padding:8px 10px;border-radius:7px;border:0;background:transparent;color:var(--muted);text-align:left;font:12px/1.3 var(--font-mono)}.session-btn:hover{background:var(--surface-2);color:var(--fg)}.session-btn.sel,.session-btn[aria-selected=\"true\"]{background:var(--accent-bg);color:var(--accent-fg)}.session-btn .sid{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.session-btn .n{margin-left:auto;color:var(--faint)}.session-detail{display:flex;flex-direction:column;gap:16px}.session-detail[hidden]{display:none}.empty-state{padding:28px;text-align:center;color:var(--muted)}\n.term .termlog,.pty .ptylog{background:var(--bg);border:1px solid var(--border);border-radius:8px;padding:10px;max-height:340px;overflow:auto;font-family:var(--font-mono);font-size:12px;white-space:pre-wrap}.term .tl{padding:1px 0}.term .tl.input{color:var(--local)}.term .tl.tool{color:var(--frontier)}.term .tl.status{color:var(--muted)}.term .tl.error{color:var(--danger)}.term .tl.permission{color:var(--frontier);font-weight:600}.term form.terminput,.pty form.ptyinput{display:flex;gap:8px;margin-top:10px}.term form.terminput input,.pty form.ptyinput input{flex:1;background:var(--bg);color:var(--fg);border:1px solid var(--border);border-radius:8px;padding:8px 10px;font:inherit}.term form.terminput button{background:var(--local);color:#04122b;border:none;border-radius:8px;padding:8px 16px;font:inherit;font-weight:600}.pty .ptylog{background:#05070a;color:#c8d1dc}.pty form.ptyinput button,.pty .pty-start{background:var(--frontier);color:#1a1200;border:none;border-radius:8px;padding:8px 16px;font:inherit;font-weight:600;margin-top:8px}.pty .pty-start:disabled{opacity:.5;cursor:default}\n.config-panel{grid-column:1/-1}.config-form{display:flex;flex-direction:column;gap:12px}.config-note{margin:0;font-size:12px;color:var(--muted)}.config-note.config-overlay{color:var(--frontier)}.reload-legend h3,.config-summary h4{font-size:12px;margin:0 0 6px;color:var(--muted);text-transform:uppercase;letter-spacing:.04em}.reload-table{width:100%}.reload-table th{white-space:nowrap;vertical-align:top;width:1%}.reload-table th.reload-hot{color:var(--good)}.reload-table th.reload-restart{color:var(--frontier)}.config-label{font-size:12px;color:var(--muted)}.config-json{width:100%;min-height:280px;resize:vertical;background:var(--bg);color:var(--fg);border:1px solid var(--border-strong);border-radius:8px;padding:10px;font-family:var(--font-mono);font-size:12px;line-height:1.5}.config-actions{display:flex;gap:8px}.config-save{background:var(--accent);color:#fff;border:0;border-radius:8px;padding:8px 16px;font-weight:600;cursor:pointer}.config-save:disabled{opacity:.5;cursor:default}.config-result:empty{display:none}.config-summary{border:1px solid var(--border);border-radius:8px;padding:12px;margin-top:4px}.config-ok{margin:0 0 8px;color:var(--good);font-weight:600}.config-err{margin:0;color:var(--frontier);font-weight:600}.config-applied h4{color:var(--good)}.config-restart h4{color:var(--frontier)}.config-warn{margin:0 0 6px;color:var(--frontier);font-size:13px}.config-summary ul{margin:0;padding-left:18px}.config-summary li{padding:2px 0;border:0}\n.diag-banner{border-bottom:1px solid color-mix(in srgb,var(--warn) 40%,transparent);background:var(--warn-bg);color:var(--warn);padding:10px 20px;font-size:13px}.graph-panel{min-height:240px}.graph-disabled,.graph-empty{border:1px solid var(--border);border-radius:8px;padding:14px;background:var(--surface-2)}.graph-empty{border-color:color-mix(in srgb,var(--info) 35%,var(--border));background:var(--info-bg)}.graph-disabled .hint{margin-top:6px}.scrim{display:none}.menu-btn{display:none}\n@media (max-width:900px){.app{grid-template-columns:1fr}.sidebar{position:fixed;inset:0 auto 0 0;width:280px;z-index:50;transform:translateX(-100%);transition:transform .22s ease}body.nav-open .sidebar{transform:translateX(0);box-shadow:var(--shadow-pop)}body.nav-open .scrim{display:block;position:fixed;inset:0;background:rgba(0,0,0,.4);z-index:40}.menu-btn{display:grid}.logs-layout{grid-template-columns:1fr}.grid{grid-template-columns:1fr}.token-chip .lbl{display:none}}\n@media (max-width:560px){.screen{padding:16px 14px 32px}.screen-grid{grid-template-columns:1fr}.topbar{padding:0 14px}.refresh{display:none}}\n@media (prefers-reduced-motion:reduce){*,*::before,*::after{animation-duration:.001ms!important;transition-duration:.001ms!important}}\n";
7
+ export declare const CONSOLE_STYLE = "\n:root{color-scheme:dark;--bg:#0f0f0f;--surface:#17181b;--surface-2:#1e2024;--panel:var(--surface);--fg:#eceef1;--muted:#a2a8b2;--faint:#6b7079;--border:rgba(255,255,255,.08);--border-strong:rgba(255,255,255,.16);--line:var(--border);--accent:#35c07a;--accent-bg:rgba(53,192,122,.12);--accent-fg:#57d492;--good:var(--accent-fg);--local:#6aa6f5;--frontier:#e0a53a;--warn:#e0a53a;--warn-bg:rgba(224,165,58,.12);--danger:#f0687f;--danger-bg:rgba(240,104,127,.12);--info:#6aa6f5;--info-bg:rgba(106,166,245,.12);--font-sans:-apple-system,BlinkMacSystemFont,\"Segoe UI\",system-ui,sans-serif;--font-mono:\"JetBrains Mono\",\"IBM Plex Mono\",ui-monospace,\"SFMono-Regular\",Consolas,monospace;--shadow-pop:0 8px 28px rgba(0,0,0,.5);--sidebar-w:248px}\n*{box-sizing:border-box;margin:0;padding:0}\n[data-log-controls]{display:flex;gap:12px;align-items:center;flex-wrap:wrap;margin-bottom:16px}\n[data-log-controls] input,[data-log-controls] button{padding:6px;border:1px solid var(--cp-border);border-radius:.625rem;background:var(--cp-surface);color:var(--cp-text)}\n[data-session-target][hidden]{display:none}\nhtml,body{height:100%}\nbody{background:var(--bg);color:var(--fg);font:14px/1.55 var(--font-sans);-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;font-variant-numeric:tabular-nums}\n.mono,code,.hash{font-family:var(--font-mono);font-variant-numeric:tabular-nums}\nbutton{font:inherit;cursor:pointer}\nbutton:focus-visible,input:focus-visible,textarea:focus-visible{outline:2px solid var(--accent);outline-offset:1px}\n::selection{background:var(--accent-bg)}\n.app{display:grid;grid-template-columns:var(--sidebar-w) 1fr;grid-template-rows:100vh;min-height:100vh}\n.sidebar{background:var(--surface);border-right:1px solid var(--border);display:flex;flex-direction:column;min-height:0}\n.brand{display:flex;align-items:center;gap:10px;padding:18px 18px 16px;border-bottom:1px solid var(--border)}\n.logo{width:26px;height:26px;border-radius:6px;background:var(--accent);color:#fff;display:grid;place-items:center;flex:none}\n.logo svg{width:15px;height:15px}.brand .name{font-weight:600;letter-spacing:-.01em}.brand .tag{font:10px/1 var(--font-mono);letter-spacing:.08em;color:var(--accent-fg);background:var(--accent-bg);padding:3px 6px;border-radius:4px;margin-left:auto;text-transform:uppercase}\n.nav{padding:10px;display:flex;flex-direction:column;gap:2px}.nav-label{font:10px/1 var(--font-mono);letter-spacing:.12em;text-transform:uppercase;color:var(--faint);padding:14px 8px 6px}.nav-item{display:flex;align-items:center;gap:10px;padding:9px 10px;border-radius:7px;color:var(--muted);background:transparent;border:0;width:100%;text-align:left;letter-spacing:-.005em;transition:background .12s,color .12s}.nav-item svg{width:17px;height:17px;flex:none}.nav-item .count{margin-left:auto;font:11px/1 var(--font-mono);color:var(--faint)}.nav-item .pill{margin-left:auto}.nav-item:hover{background:var(--surface-2);color:var(--fg)}.nav-item[aria-current=\"page\"]{background:var(--accent-bg);color:var(--accent-fg);font-weight:550}.nav-item[aria-current=\"page\"] .count{color:var(--accent-fg)}\n.sidebar-foot{margin-top:auto;padding:14px 16px;border-top:1px solid var(--border);font-size:12px;color:var(--muted);display:flex;flex-direction:column;gap:8px}.host-row{display:flex;align-items:center;gap:8px}.dot{width:8px;height:8px;border-radius:50%;display:inline-block;flex:none;background:var(--muted)}.dot.live,.dot.status-running{background:var(--accent);box-shadow:0 0 0 3px var(--accent-bg)}.dot.warn,.dot.status-waiting-input{background:var(--warn)}.dot.down{background:var(--danger)}.dot.status-idle{background:var(--muted)}.dot.status-ended{background:#6e7681}\n.main{min-width:0;min-height:0;display:flex;flex-direction:column}.topbar{height:56px;flex:none;border-bottom:1px solid var(--border);background:color-mix(in srgb,var(--surface) 82%,transparent);backdrop-filter:blur(8px);display:flex;align-items:center;gap:14px;padding:0 20px}.topbar h1{font-size:15px;font-weight:600;letter-spacing:-.01em}.refresh,.token-chip{display:inline-flex;align-items:center;gap:7px;font:11px/1 var(--font-mono);color:var(--muted);padding:5px 9px;border:1px solid var(--border);border-radius:6px;background:var(--surface)}.refresh .beat{width:6px;height:6px;border-radius:50%;background:var(--accent);animation:beat 2s ease-in-out infinite}@keyframes beat{0%,100%{opacity:1}50%{opacity:.25}}.spacer{margin-left:auto}.icon-btn{width:34px;height:34px;border-radius:7px;border:1px solid var(--border);background:var(--surface);color:var(--muted);display:grid;place-items:center;transition:background .12s,color .12s,border-color .12s}.icon-btn:hover{background:var(--surface-2);color:var(--fg);border-color:var(--border-strong)}.icon-btn svg{width:17px;height:17px}.token-chip b{color:var(--fg);font-weight:600}\n.scroll{flex:1;overflow-y:auto;min-height:0}.screen{display:none;padding:22px 24px 40px;max-width:1320px}.screen.active{display:block}.screen[hidden]{display:none!important}.screen-head{margin-bottom:18px}.screen-head h2{font-size:19px;font-weight:600;letter-spacing:-.02em;display:flex;align-items:center;gap:8px}.screen-head p{color:var(--muted);font-size:13px;margin-top:3px;max-width:74ch;text-wrap:pretty}.screen-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(320px,1fr));gap:16px}.screen-grid .wide,.panel.wide{grid-column:1/-1}\n.panel,.card{background:var(--surface);border:1px solid var(--border);border-radius:10px;padding:16px}.panel h2,.panel h3,.card-head h3{font-size:13px;margin:0 0 12px;color:var(--muted);text-transform:uppercase;letter-spacing:.04em}.card-head{display:flex;align-items:center;gap:10px;padding:13px 16px;border-bottom:1px solid var(--border);margin:-16px -16px 14px}.card-head .sub{font:11px/1 var(--font-mono);color:var(--faint);margin-left:auto}.grid{display:grid;grid-template-columns:repeat(2,1fr);gap:10px}.stat{background:var(--surface);border:1px solid var(--border);border-radius:10px;padding:15px 16px;display:flex;flex-direction:column;gap:2px}.stat .k{font:11px/1 var(--font-mono);letter-spacing:.06em;text-transform:uppercase;color:var(--faint)}.stat .v{font-size:20px;font-weight:600;letter-spacing:-.02em;margin-top:6px}.stat .d{font-size:12px;color:var(--muted);margin-top:4px;display:flex;align-items:center;gap:6px}.good{color:var(--good)}.local{color:var(--local)}.frontier{color:var(--frontier)}.muted{color:var(--muted)}.faint{color:var(--faint)}\ntable{width:100%;border-collapse:collapse;font-size:13px}th,td{text-align:left;padding:10px 12px;border-bottom:1px solid var(--border)}th{font:11px/1 var(--font-mono);letter-spacing:.05em;text-transform:uppercase;color:var(--faint);font-weight:500}tbody tr:last-child td{border-bottom:0}tbody tr:hover{background:var(--surface-2)}td.num{text-align:right;font-family:var(--font-mono)}.hash{color:var(--faint)}\n.pill,.badge{display:inline-flex;align-items:center;gap:5px;font:11px/1 var(--font-mono);letter-spacing:.02em;padding:3px 8px;border-radius:999px;border:1px solid transparent}.pill.local,.badge.status-running{color:var(--accent-fg);background:var(--accent-bg);border-color:var(--accent-bg)}.pill.frontier{color:var(--info);background:var(--info-bg)}.pill.warn,.badge.status-waiting-input{color:var(--warn);background:var(--warn-bg);border-color:var(--warn-bg)}.pill.danger{color:var(--danger);background:var(--danger-bg)}.pill.idle,.badge.status-idle,.badge.status-ended{color:var(--muted);background:var(--surface-2)}\n.progress{height:10px;background:var(--surface-2);border-radius:6px;overflow:hidden;border:1px solid var(--border)}.progress .bar{height:100%;background:var(--accent)}ul.items,ul.timeline{list-style:none;margin:8px 0 0;padding:0;max-height:320px;overflow:auto}ul.items li,ul.timeline li{padding:6px 0;border-bottom:1px solid var(--border)}ul.items li.done{color:var(--muted)}ul.items .box{font-family:var(--font-mono)}.who{color:var(--local)}.tag{color:var(--frontier);font-size:12px}.kind{display:inline-block;min-width:66px;color:var(--muted);font-size:12px}code{background:var(--bg);padding:1px 5px;border-radius:4px}\n.logs-layout{display:grid;grid-template-columns:220px 1fr;gap:16px;align-items:start;margin-bottom:16px}.session-list{padding:6px;max-height:70vh;overflow-y:auto}.session-btn{display:flex;align-items:center;gap:8px;width:100%;padding:8px 10px;border-radius:7px;border:0;background:transparent;color:var(--muted);text-align:left;font:12px/1.3 var(--font-mono)}.session-btn:hover{background:var(--surface-2);color:var(--fg)}.session-btn.sel,.session-btn[aria-selected=\"true\"]{background:var(--accent-bg);color:var(--accent-fg)}.session-btn .sid{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.session-btn .n{margin-left:auto;color:var(--faint)}.session-detail{display:flex;flex-direction:column;gap:16px}.session-detail[hidden]{display:none}.empty-state{padding:28px;text-align:center;color:var(--muted)}\n.term .termlog,.pty .ptylog{background:var(--bg);border:1px solid var(--border);border-radius:8px;padding:10px;max-height:340px;overflow:auto;font-family:var(--font-mono);font-size:12px;white-space:pre-wrap}.term .tl{padding:1px 0}.term .tl.input{color:var(--local)}.term .tl.tool{color:var(--frontier)}.term .tl.status{color:var(--muted)}.term .tl.error{color:var(--danger)}.term .tl.permission{color:var(--frontier);font-weight:600}.term form.terminput,.pty form.ptyinput{display:flex;gap:8px;margin-top:10px}.term form.terminput input,.pty form.ptyinput input{flex:1;background:var(--bg);color:var(--fg);border:1px solid var(--border);border-radius:8px;padding:8px 10px;font:inherit}.term form.terminput button{background:var(--local);color:#04122b;border:none;border-radius:8px;padding:8px 16px;font:inherit;font-weight:600}.pty .ptylog{background:#05070a;color:#c8d1dc}.pty form.ptyinput button,.pty .pty-start{background:var(--frontier);color:#1a1200;border:none;border-radius:8px;padding:8px 16px;font:inherit;font-weight:600;margin-top:8px}.pty .pty-start:disabled{opacity:.5;cursor:default}\n.config-panel{grid-column:1/-1}.config-form{display:flex;flex-direction:column;gap:12px}.config-note{margin:0;font-size:12px;color:var(--muted)}.config-note.config-overlay{color:var(--frontier)}.reload-legend h3,.config-summary h4{font-size:12px;margin:0 0 6px;color:var(--muted);text-transform:uppercase;letter-spacing:.04em}.reload-table{width:100%}.reload-table th{white-space:nowrap;vertical-align:top;width:1%}.reload-table th.reload-hot{color:var(--good)}.reload-table th.reload-restart{color:var(--frontier)}.config-label{font-size:12px;color:var(--muted)}.config-json{width:100%;min-height:280px;resize:vertical;background:var(--bg);color:var(--fg);border:1px solid var(--border-strong);border-radius:8px;padding:10px;font-family:var(--font-mono);font-size:12px;line-height:1.5}.config-actions{display:flex;gap:8px}.config-save{background:var(--accent);color:#fff;border:0;border-radius:8px;padding:8px 16px;font-weight:600;cursor:pointer}.config-save:disabled{opacity:.5;cursor:default}.config-result:empty{display:none}.config-summary{border:1px solid var(--border);border-radius:8px;padding:12px;margin-top:4px}.config-ok{margin:0 0 8px;color:var(--good);font-weight:600}.config-err{margin:0;color:var(--frontier);font-weight:600}.config-applied h4{color:var(--good)}.config-restart h4{color:var(--frontier)}.config-warn{margin:0 0 6px;color:var(--frontier);font-size:13px}.config-summary ul{margin:0;padding-left:18px}.config-summary li{padding:2px 0;border:0}\n.diag-banner{border-bottom:1px solid color-mix(in srgb,var(--warn) 40%,transparent);background:var(--warn-bg);color:var(--warn);padding:10px 20px;font-size:13px}.graph-panel{min-height:240px}.graph-disabled,.graph-empty{border:1px solid var(--border);border-radius:8px;padding:14px;background:var(--surface-2)}.graph-empty{border-color:color-mix(in srgb,var(--info) 35%,var(--border));background:var(--info-bg)}.graph-disabled .hint{margin-top:6px}.scrim{display:none}.menu-btn{display:none}\n@media (max-width:900px){.app{grid-template-columns:1fr}.sidebar{position:fixed;inset:0 auto 0 0;width:280px;z-index:50;transform:translateX(-100%);transition:transform .22s ease}body.nav-open .sidebar{transform:translateX(0);box-shadow:var(--shadow-pop)}body.nav-open .scrim{display:block;position:fixed;inset:0;background:rgba(0,0,0,.4);z-index:40}.menu-btn{display:grid}.logs-layout{grid-template-columns:1fr}.grid{grid-template-columns:1fr}.token-chip .lbl{display:none}}\n@media (max-width:560px){.screen{padding:16px 14px 32px}.screen-grid{grid-template-columns:1fr}.topbar{padding:0 14px}.refresh{display:none}}\n@media (prefers-reduced-motion:reduce){*,*::before,*::after{animation-duration:.001ms!important;transition-duration:.001ms!important}}\n";
8
8
  /**
9
9
  * Estilos del render del grafo de agentes (GE-083). Se inyectan en el `<style>`
10
10
  * **solo** cuando la vista del grafo está habilitada, de modo que con la vista
@@ -13,7 +13,7 @@ export declare const CONSOLE_STYLE = "\n:root{color-scheme:dark;--bg:#0f0f0f;--s
13
13
  * cancelación/veredicto/linaje/artefacto).
14
14
  */
15
15
  export declare const GRAPH_STYLE = "\n.graph-wrap{overflow:auto;background:#0b0d11;border:1px solid var(--line);border-radius:8px;padding:8px}\nsvg.graph{display:block}\n.gedge{stroke:#3a4250;stroke-width:1.5;marker-end:url(#garrow)}\n.gnode rect{fill:var(--panel);stroke:var(--line);stroke-width:1.5;rx:8}\n.gnode .gname{fill:var(--fg);font:600 12px ui-monospace,Consolas,monospace}\n.gnode .grole{fill:var(--muted);font-size:11px}\n.gnode .gstate{font-size:10px;text-transform:uppercase;letter-spacing:.05em}\n.gnode.state-pending rect{stroke:#6e7681}\n.gnode.state-pending .gstate{fill:#6e7681}\n.gnode.state-ready rect{stroke:var(--local)}\n.gnode.state-ready .gstate{fill:var(--local)}\n.gnode.state-active rect{stroke:var(--frontier)}\n.gnode.state-active .gstate{fill:var(--frontier)}\n.gnode.state-succeeded rect{stroke:var(--good)}\n.gnode.state-succeeded .gstate{fill:var(--good)}\n.gnode.state-failed rect{stroke:#f85149}\n.gnode.state-failed .gstate{fill:#f85149}\n.gnode.state-cancelled rect{stroke:#484f58}\n.gnode.state-cancelled .gstate{fill:#484f58}\n.gbadge{font-size:10px;font-family:ui-monospace,Consolas,monospace}\n.gbadge.badge-retry{fill:var(--frontier)}\n.gbadge.badge-error{fill:#f85149}\n.gbadge.badge-cancelled{fill:#484f58}\n.gbadge.badge-verdict.verdict-approved{fill:var(--good)}\n.gbadge.badge-verdict.verdict-rejected{fill:#f85149}\n.gbadge.badge-verdict.verdict-inconclusive{fill:var(--frontier)}\n.gbadge.badge-lineage{fill:var(--local)}\n.gbadge.badge-artifact{fill:var(--muted)}\n.gnode[data-session]{cursor:pointer}\n.gnode[data-session]:hover rect{stroke-width:2.5}\n.graph-health{display:flex;flex-wrap:wrap;gap:8px;margin:0 0 12px}\n.gchip{font-size:11px;padding:2px 10px;border-radius:10px;border:1px solid var(--line);color:var(--muted)}\n.gchip.on{font-weight:600}\n.gchip.gh-recovery.on,.gchip.gh-unknown.on{color:var(--frontier);border-color:var(--frontier)}\n.gchip.gh-conflict.on,.gchip.gh-kill.on{color:#f85149;border-color:#f85149}\n.graph-drill{margin-top:14px;border-top:1px solid var(--line);padding-top:12px}\n.graph-drill h3{font-size:13px;margin:0 0 8px;color:var(--muted);text-transform:uppercase;letter-spacing:.04em}\n.graph-drill .drilllog{background:#0b0d11;border:1px solid var(--line);border-radius:8px;padding:10px;max-height:280px;overflow:auto;font-family:ui-monospace,Consolas,monospace;font-size:12px;white-space:pre-wrap}\n.graph-drill .drilllog .tl{padding:1px 0}\n.graph-drill .drilllog .tl.tool{color:var(--frontier)}\n.graph-drill .drilllog .tl.status{color:var(--muted)}\n.graph-drill .drilllog .tl.permission{color:var(--frontier);font-weight:600}\n.graph-drill .drilllog .tl.error{color:#f85149}\n";
16
- export declare const CONSOLE_CLIENT_JS = "\n(function(){\n var authTok='';\n try{\n var qp=new URLSearchParams(window.location.search).get('token');\n if(qp){authTok='?token='+encodeURIComponent(qp)}\n }catch(e){/* ignore */}\n function reloadIfChanged(prev){\n fetch('/api/state'+authTok).then(function(r){return r.json()}).then(function(s){\n if(s.generatedAt!==prev&&!configActive()&&!lifecycleActive()){location.reload()}\n }).catch(function(){});\n }\n var current=document.documentElement.getAttribute('data-generated')||'';\n if('EventSource' in window){\n try{\n var es=new EventSource('/events'+authTok);\n es.addEventListener('state',function(ev){\n try{\n var d=JSON.parse(ev.data||'{}');\n if(d.generatedAt&&d.generatedAt!==current&&!configActive()&&!lifecycleActive()){location.reload()}\n }catch(e){}\n });\n es.addEventListener('graph-append',function(ev){\n try{\n var d=JSON.parse(ev.data||'{}');\n document.dispatchEvent(new CustomEvent('lifecycle-append',{detail:{runID:d.runID,head:d.head}}));\n }catch(e){}\n });\n es.onerror=function(){/* fallback below */};\n }catch(e){/* ignore */}\n }\n var ms=parseInt(document.documentElement.getAttribute('data-refresh')||'2000',10);\n setInterval(function(){reloadIfChanged(current)},isNaN(ms)?2000:Math.max(250,ms));\n\n function configActive(){\n var s=document.getElementById('screen-config');\n return !!(s&&!s.hidden);\n }\n // Only the visible timeline owns incremental refresh. Other screens still\n // need state reloads; their navigation preserves the timeline URL selection.\n function lifecycleActive(){\n var mount=document.getElementById('lifecycle-timeline-mount');\n var screen=mount&&mount.closest('.screen');\n return !!(screen&&!screen.hidden);\n }\n function wireLogsScreen(screen){\n if(screen.__logsWired){return}\n screen.__logsWired=true;\n var buttons=screen.querySelectorAll('[data-session-target]');\n var cards=screen.querySelectorAll('[data-session-view]');\n function showSession(id){\n var matched=false;\n for(var i=0;i<buttons.length;i++){\n var on=buttons[i].getAttribute('data-session-target')===id;\n buttons[i].classList.toggle('sel',on);\n buttons[i].setAttribute('aria-selected',on?'true':'false');\n }\n for(var j=0;j<cards.length;j++){\n var show=cards[j].getAttribute('data-session-view')===id;\n cards[j].hidden=!show;\n if(show){matched=true;connectTerminal(cards[j],id)}\n }\n return matched;\n }\n for(var k=0;k<buttons.length;k++){\n buttons[k].addEventListener('click',function(e){\n var id=e.currentTarget.getAttribute('data-session-target');\n if(id){showSession(id)}\n });\n }\n if(buttons.length>0){\n showSession(buttons[0].getAttribute('data-session-target'));\n }\n }\n function selectScreen(name){\n var screens=document.querySelectorAll('.screen');\n var items=document.querySelectorAll('[data-screen]');\n var matched=false;\n var titleText='';\n var activeScreen=null;\n for(var i=0;i<screens.length;i++){\n var show=screens[i].id==='screen-'+name;\n screens[i].classList.toggle('active',show);\n screens[i].hidden=!show;\n if(show){matched=true;activeScreen=screens[i]}\n }\n if(!matched){return false}\n for(var j=0;j<items.length;j++){\n var on=items[j].getAttribute('data-screen')===name;\n if(on){\n items[j].setAttribute('aria-current','page');\n titleText=items[j].getAttribute('data-title')||'';\n }else{\n items[j].removeAttribute('aria-current');\n }\n }\n var title=document.getElementById('screen-title');\n if(title){title.textContent=titleText}\n if(name==='config'&&activeScreen){loadConfig(activeScreen)}\n if(name==='logs'&&activeScreen){wireLogsScreen(activeScreen)}\n try{localStorage.setItem('openteam.screen',name)}catch(e){}\n document.body.classList.remove('nav-open');\n return true;\n }\n function esc(s){return String(s).replace(/&/g,'&amp;').replace(/</g,'&lt;').replace(/>/g,'&gt;')}\n // Config editor (W7-S09 / #193). The config values travel only over the\n // token-gated /api/config, never in this open page, so the browser fetches\n // the server-rendered form with the bearer token and injects it. The\n // applied/pending-restart summary is likewise server-rendered and injected\n // verbatim, so the P14 honesty is enforced server-side, not here.\n function loadConfig(view){\n var root=document.documentElement;\n if(root.getAttribute('data-config')!=='1'||view.__configWired){return}\n var mount=view.querySelector('[data-config-mount]');\n if(!mount){return}\n var token=root.getAttribute('data-token');\n if(!token){mount.innerHTML='<p class=\"muted\">Read-only: no console token present.</p>';return}\n view.__configWired=true;\n fetch('/api/config',{headers:{Authorization:'Bearer '+token}})\n .then(function(r){return r.json()})\n .then(function(d){\n mount.innerHTML=d.render||'<p class=\"config-err\">Could not load configuration.</p>';\n wireConfigForm(mount,token);\n })\n .catch(function(){view.__configWired=false;mount.innerHTML='<p class=\"config-err\">Could not load configuration.</p>'});\n }\n function wireConfigForm(mount,token){\n var form=mount.querySelector('[data-config-form]');\n if(!form){return}\n var out=form.querySelector('[data-config-result]');\n form.addEventListener('submit',function(e){\n e.preventDefault();\n var ta=form.querySelector('textarea[name=\"config\"]');\n var parsed;\n try{parsed=JSON.parse(ta.value)}catch(err){out.innerHTML='<div class=\"config-summary\"><p class=\"config-err\">Invalid JSON: '+esc(err.message||err)+'</p></div>';return}\n var btn=form.querySelector('.config-save');\n if(btn){btn.disabled=true}\n fetch('/api/config',{method:'POST',headers:{Authorization:'Bearer '+token,'content-type':'application/json'},body:JSON.stringify(parsed)})\n .then(function(r){return r.json().then(function(b){return{status:r.status,body:b}})})\n .then(function(res){\n if(btn){btn.disabled=false}\n if(res.status===200){out.innerHTML=res.body.render||''}\n else{out.innerHTML='<div class=\"config-summary\"><p class=\"config-err\">'+esc(res.body&&res.body.error?res.body.error:'Save failed.')+'</p></div>'}\n })\n .catch(function(){if(btn){btn.disabled=false}out.innerHTML='<div class=\"config-summary\"><p class=\"config-err\">Save failed.</p></div>'});\n });\n }\n function connectTerminal(view,id){\n if(view.__wired){return}\n var root=document.documentElement;\n var token=root.getAttribute('data-token');\n if(root.getAttribute('data-terminal')!=='1'||!token){return}\n var log=view.querySelector('.termlog');\n if(!log){return}\n view.__wired=true;\n function append(cls,text){\n var line=document.createElement('div');\n line.className='tl '+cls;line.textContent=text;\n log.appendChild(line);log.scrollTop=log.scrollHeight;\n }\n var q='/console/session/'+encodeURIComponent(id);\n var tk='token='+encodeURIComponent(token);\n if('EventSource' in window){\n try{\n var es=new EventSource(q+'/stream?'+tk);\n es.addEventListener('frame',function(e){try{var f=JSON.parse(e.data);append(f.kind,f.text)}catch(_){}}); \n es.onerror=function(){/* reconnects on its own */};\n }catch(_){/* ignore */}\n }\n var form=view.querySelector('form.terminput');\n if(form){\n form.addEventListener('submit',function(e){\n e.preventDefault();\n var inp=form.querySelector('input[name=text]');\n var text=inp.value;\n if(!text){return}\n inp.value='';append('input','\u203A '+text);\n fetch(q+'/input?'+tk,{method:'POST',headers:{'content-type':'application/json'},body:JSON.stringify({text:text})})\n .then(function(r){if(!r.ok){append('error','\u2716 send rejected ('+r.status+')')}})\n .catch(function(){append('error','\u2716 could not send')});\n });\n }\n connectPty(view,id,q,tk);\n }\n function connectPty(view,id,q,tk){\n var root=document.documentElement;\n if(root.getAttribute('data-pty')!=='1'){return}\n var pane=view.querySelector('.pty');\n if(!pane){return}\n var log=pane.querySelector('.ptylog');\n var startBtn=pane.querySelector('.pty-start');\n var input=pane.querySelector('form.ptyinput');\n function plog(text){\n var d=document.createElement('span');d.textContent=text;\n log.appendChild(d);log.scrollTop=log.scrollHeight;\n }\n if(!startBtn){return}\n startBtn.addEventListener('click',function(){\n startBtn.disabled=true;plog('Opening shell\u2026\\n');\n fetch(q+'/pty?'+tk,{method:'POST',headers:{'content-type':'application/json'},body:'{}'})\n .then(function(r){return r.ok?r.json():Promise.reject(r.status)})\n .then(function(info){openPtyWs(info.wsUrl)})\n .catch(function(s){plog('\u2716 could not open PTY ('+s+')\\n');startBtn.disabled=false});\n });\n function openPtyWs(url){\n try{\n var ws=new WebSocket(url);\n ws.binaryType='arraybuffer';\n ws.onmessage=function(e){\n var data=e.data;\n if(data instanceof ArrayBuffer){data=new TextDecoder().decode(new Uint8Array(data))}\n plog(data);\n };\n ws.onclose=function(){plog('\\n[shell closed]\\n');startBtn.disabled=false};\n ws.onerror=function(){plog('\\n\u2716 WebSocket error\\n')};\n if(input){\n input.hidden=false;\n input.addEventListener('submit',function(e){\n e.preventDefault();\n var c=input.querySelector('input[name=cmd]');\n if(!c.value){return}\n ws.send(c.value+'\\r');c.value='';\n });\n }\n }catch(_){plog('\\n\u2716 WebSocket unavailable\\n');startBtn.disabled=false}\n }\n }\n function wireGraphDrill(){\n var root=document.documentElement;\n if(root.getAttribute('data-drilldown')!=='1'){return}\n var token=root.getAttribute('data-token');\n if(!token){return}\n var drill=document.querySelector('.graph-drill');\n if(!drill){return}\n var gview=drill.closest('.screen');\n if(!gview){return}\n var log=drill.querySelector('.drilllog');\n var title=drill.querySelector('.drill-title');\n if(!log){return}\n var es=null;\n function append(cls,text){\n var line=document.createElement('div');\n line.className='tl '+cls;line.textContent=text;\n log.appendChild(line);log.scrollTop=log.scrollHeight;\n }\n function open(id){\n if(es){try{es.close()}catch(_){}}\n log.textContent='';drill.hidden=false;\n if(title){title.textContent='Conversation \u00B7 '+id}\n var tk='token='+encodeURIComponent(token);\n var base='/console/session/'+encodeURIComponent(id);\n fetch(base+'/messages?'+tk).then(function(r){return r.ok?r.json():Promise.reject(r.status)})\n .then(function(d){(d&&d.frames||[]).forEach(function(f){append(f.kind,f.text)})})\n .catch(function(s){append('error','\u2716 could not load conversation ('+s+')')});\n if('EventSource' in window){\n try{\n es=new EventSource(base+'/stream?'+tk);\n es.addEventListener('frame',function(e){try{var f=JSON.parse(e.data);append(f.kind,f.text)}catch(_){}}); \n es.onerror=function(){/* reconnects on its own */};\n }catch(_){/* ignore */}\n }\n }\n gview.addEventListener('click',function(e){\n var t=e.target;\n while(t&&t!==gview&&!(t.getAttribute&&t.getAttribute('data-session'))){t=t.parentNode}\n if(t&&t.getAttribute&&t.getAttribute('data-session')){open(t.getAttribute('data-session'))}\n });\n }\n var nav=document.querySelector('.nav');\n if(nav){\n nav.addEventListener('click',function(e){\n var t=e.target;\n while(t&&t!==nav&&!(t.getAttribute&&t.getAttribute('data-screen'))){t=t.parentNode}\n if(t&&t.getAttribute&&t.getAttribute('data-screen')){selectScreen(t.getAttribute('data-screen'))}\n });\n }\n var toggle=document.querySelector('[data-toggle-nav]');\n if(toggle){toggle.addEventListener('click',function(){document.body.classList.toggle('nav-open')})}\n var close=document.querySelector('[data-close-nav]');\n if(close){close.addEventListener('click',function(){document.body.classList.remove('nav-open')})}\n var saved='tree';\n try{saved=localStorage.getItem('openteam.screen')||'tree'}catch(e){}\n if(!selectScreen(saved)){selectScreen('tree')}\n wireGraphDrill();\n wireLifecycleTimeline();\n})();\n";
16
+ export declare const CONSOLE_CLIENT_JS: string;
17
17
  /**
18
18
  * Styles for the lifecycle history timeline surface. Uses `var(--cp-*)` from
19
19
  * the Clawpilot theme — injected only when lifecycle history is enabled.
@@ -34,5 +34,5 @@ export declare const LIFECYCLE_THEME_BOOT = "\n(() => {\n const param = new URL
34
34
  * server-side. No dynamic `innerHTML` from user data; escaping is done on
35
35
  * the server side.
36
36
  */
37
- export declare const LIFECYCLE_CLIENT_JS = "\nfunction wireLifecycleTimeline(){\n var mount=document.getElementById('lifecycle-timeline-mount');\n if(!mount){return}\n var authTok='';\n try{var qp=new URLSearchParams(window.location.search).get('token');if(qp){authTok='?token='+encodeURIComponent(qp)}}catch(e){}\n\n var runSelect=mount.querySelector('[data-lifecycle-run-select]');\n var liveBtn=mount.querySelector('[data-lifecycle-live-btn]');\n var slider=mount.querySelector('[data-lifecycle-slider]');\n var treeMountEl=mount.querySelector('[data-lifecycle-tree-mount]');\n var countsEl=mount.querySelector('[data-lifecycle-counts]');\n var activityEl=mount.querySelector('[data-lifecycle-activity]');\n var incomingEl=mount.querySelector('[data-lifecycle-incoming]');\n var cursorCountEl=mount.querySelector('[data-lifecycle-cursor-count]');\n var cursorTimeEl=mount.querySelector('[data-lifecycle-cursor-time]');\n var screenEl=mount.closest('.screen');\n var screenHeadingEl=screenEl&&screenEl.querySelector('.screen-head h2');\n var screenDescriptionEl=screenEl&&screenEl.querySelector('.screen-head p');\n\n // scrubInProgress / sliderWired: gesture and wiring state shared by\n // wireSlider() \u2014 declared here so ensureViewControls() can call wireSlider()\n // after dynamically creating slider during an empty\u2192view promotion.\n var scrubInProgress=false;\n var sliderWired=false;\n\n var state={\n explicitRun:urlRun(),\n runID:mount.getAttribute('data-lifecycle-run')||null,\n cursor:urlCursor(),\n head:Number(mount.getAttribute('data-lifecycle-head'))||0,\n followLive:urlCursor()===null,\n generation:0,\n request:null,\n pending:false,\n stopped:false,\n lastSseHead:new Map()\n };\n var projectionKey='';\n\n function urlCursor(){\n try{\n var values=new URLSearchParams(window.location.search).getAll('cursor');\n if(values.length>1){return 'invalid'}\n return values.length?values[0]:null;\n }catch(e){return null}\n }\n function urlRun(){\n try{return new URLSearchParams(window.location.search).get('run')}catch(e){return null}\n }\n\n // buildUrl: compute the target URL string without touching history.\n function buildUrl(runID,cursor){\n try{\n var sp=new URLSearchParams(window.location.search);\n if(runID){sp.set('run',runID)}else{sp.delete('run')}\n if(cursor!==null&&cursor!==undefined){sp.set('cursor',String(cursor))}else{sp.delete('cursor')}\n var qs=sp.toString();\n return qs?('?'+qs):window.location.pathname;\n }catch(e){return window.location.href}\n }\n // replaceUrl: mid-drag / intermediate updates \u2014 no history entry.\n function replaceUrl(runID,cursor){\n try{history.replaceState(null,'',buildUrl(runID,cursor));}catch(e){}\n }\n // pushUrl: committed navigation \u2014 creates a traversable history entry.\n function pushUrl(runID,cursor){\n try{history.pushState(null,'',buildUrl(runID,cursor));}catch(e){}\n }\n\n function buildApiUrl(runID,cursor){\n var u='/api/graph'+authTok;\n var sep=authTok?'&':'?';\n if(runID!==null&&runID!==undefined){u+=sep+'run='+encodeURIComponent(runID);sep='&'}\n if(cursor!==null&&cursor!==undefined){u+=sep+'cursor='+encodeURIComponent(String(cursor))}\n return u;\n }\n\n function cancelRequest(){\n var request=state.request;\n state.request=null;\n if(request){clearTimeout(request.timeout);request.controller.abort()}\n }\n\n // Background invalidations share one flight and one pending bit. Only user\n // navigation advances the epoch; a busy stream cannot starve valid replies.\n function fetchHistory(){\n if(state.stopped){return}\n if(state.request){state.pending=true;return}\n state.pending=false;\n var cursor=state.followLive?null:state.cursor;\n var runID=state.explicitRun;\n if(runID===null&&!state.followLive){runID=state.runID}\n var request={generation:state.generation,controller:new AbortController(),timeout:null};\n state.request=request;\n function current(){return !state.stopped&&state.request===request&&request.generation===state.generation}\n function finish(){\n if(!current()){return}\n clearTimeout(request.timeout);\n state.request=null;\n if(state.pending){fetchHistory()}\n }\n request.timeout=setTimeout(function(){\n if(!current()){return}\n request.controller.abort();\n showError();\n finish();\n },15000);\n fetch(buildApiUrl(runID,cursor),{signal:request.controller.signal}).then(function(r){return r.json()}).then(function(d){\n if(!current()){return}\n handleResponse(d,cursor);\n finish();\n }).catch(function(){\n if(!current()){return}\n showError();\n finish();\n });\n }\n\n function navigateFromUrl(initial){\n state.generation++;\n cancelRequest();\n state.pending=false;\n scrubInProgress=false;\n state.explicitRun=urlRun();\n state.cursor=urlCursor();\n state.followLive=state.cursor===null;\n state.runID=state.explicitRun!==null?state.explicitRun:initial&&!state.followLive?mount.getAttribute('data-lifecycle-run'):null;\n state.head=0;\n fetchHistory();\n }\n\n function handleResponse(d,requestedCursor){\n if(!d||d.version!==1){showError();return}\n if(d.kind==='error'){showApiError(d.error);return}\n if(d.kind==='disabled'){showDisabled(d);return}\n if(d.kind==='empty'){showEmpty();return}\n if(d.kind==='legacy'){renderLegacy(d);return}\n if(d.kind==='view'){renderView(d,requestedCursor);return}\n showError();\n }\n\n // wireSlider: attach input/change listeners once (guarded by sliderWired).\n function wireSlider(){\n if(sliderWired||!slider){return}\n sliderWired=true;\n slider.addEventListener('input',function(){\n var c=parseInt(slider.value,10);\n if(!scrubInProgress){\n history.pushState(null,'',window.location.href);\n scrubInProgress=true;\n }\n replaceUrl(state.runID,c);\n navigateFromUrl(false);\n scrubInProgress=true;\n });\n slider.addEventListener('change',function(){\n var c=parseInt(slider.value,10);\n replaceUrl(state.runID,c);\n scrubInProgress=false;\n });\n }\n\n // ensureViewControls: promote the empty SSR shell to a full view shell when\n // the first run data arrives. SSR empty only renders runSelect+liveBtn; all\n // other controls (activity, incoming, slider, treeMount) are missing. Build\n // and append them so renderView/renderLegacy can update them normally.\n function ensureViewControls(){\n if(slider!==null){return} // already promoted or SSR was full view/legacy\n // Remove placeholder status element (lc-empty or lc-legacy-note).\n var placeholder=mount.querySelector('.lc-empty,.lc-legacy-note');\n if(placeholder){mount.removeChild(placeholder)}\n // Append activity badge + incoming badge to the controls div.\n var controlsDiv=mount.querySelector('.lc-controls');\n if(controlsDiv){\n var actSpan=document.createElement('span');\n actSpan.className='lc-activity unknown';\n actSpan.setAttribute('data-lifecycle-activity','writer-unknown');\n actSpan.setAttribute('aria-live','polite');\n var actDot=document.createElement('span');actDot.className='lc-activity-dot';actDot.setAttribute('aria-hidden','true');\n var actLbl=document.createElement('span');actLbl.setAttribute('data-lc-activity-label','');\n actSpan.appendChild(actDot);actSpan.appendChild(actLbl);\n controlsDiv.appendChild(actSpan);\n activityEl=actSpan;\n var incSpan=document.createElement('span');\n incSpan.className='lc-incoming-badge';\n incSpan.setAttribute('data-lifecycle-incoming','');\n incSpan.hidden=true;\n controlsDiv.appendChild(incSpan);\n incomingEl=incSpan;\n }\n // Build slider row: <div class=\"lc-slider-row\"><input ...><span data-lifecycle-counts>\n var sliderRow=document.createElement('div');sliderRow.className='lc-slider-row';\n var inp=document.createElement('input');\n inp.type='range';inp.className='lc-slider';\n inp.setAttribute('data-lifecycle-slider','');\n inp.min='0';inp.max='0';inp.value='0';\n inp.setAttribute('aria-label',mount.getAttribute('data-msg-slider-aria')||'Timeline cursor');\n inp.setAttribute('aria-valuenow','0');inp.setAttribute('aria-valuemax','0');\n inp.disabled=true;\n var cntSpan=document.createElement('span');\n cntSpan.className='lc-counts';\n cntSpan.setAttribute('data-lifecycle-counts','');\n var evtLabel=mount.getAttribute('data-msg-events')||'{n} events';\n cntSpan.textContent=evtLabel.replace('{n}','0');\n sliderRow.appendChild(inp);sliderRow.appendChild(cntSpan);\n mount.appendChild(sliderRow);\n slider=inp;countsEl=cntSpan;\n // Build tree mount.\n var tm=document.createElement('div');tm.className='lc-tree-mount';\n tm.setAttribute('data-lifecycle-tree-mount','');\n mount.appendChild(tm);\n treeMountEl=tm;\n // Wire slider now that the element exists.\n wireSlider();\n }\n\n function message(name){\n return mount.getAttribute('data-msg-'+name)||'';\n }\n\n function fillTemplate(template,values){\n var result=template;\n Object.keys(values).forEach(function(key){\n result=result.split('{'+key+'}').join(String(values[key]));\n });\n return result;\n }\n\n function updateCursorFeedback(proj){\n if(cursorCountEl){\n if(!proj){\n cursorCountEl.textContent='';\n }else{\n var countTemplate=message(proj.head===1?'cursor-count-one':'cursor-count');\n cursorCountEl.textContent=fillTemplate(countTemplate,{cursor:proj.cursor,head:proj.head});\n }\n }\n if(cursorTimeEl){\n if(!proj||proj.lastEventAt===null||proj.lastEventAt===undefined){\n cursorTimeEl.removeAttribute('datetime');\n cursorTimeEl.textContent=message('no-event-time');\n }else{\n var iso=new Date(proj.lastEventAt).toISOString();\n cursorTimeEl.setAttribute('datetime',iso);\n cursorTimeEl.textContent=message('latest-event')+': '+iso;\n }\n }\n }\n\n function updateScreenCopy(kind,followLive,activity){\n var headingKey='screen-heading';\n var descriptionKey='screen-description';\n if(kind==='legacy'){\n headingKey='activity-legacy';\n descriptionKey='legacy-note';\n }else if(kind==='unavailable'){\n descriptionKey='screen-description-unavailable';\n }else if(kind==='view'&&!followLive){\n headingKey='screen-heading-historical';\n descriptionKey='screen-description-historical';\n }else if(kind==='view'&&activity&&activity.kind==='terminal'){\n headingKey='screen-heading-completed';\n descriptionKey='screen-description-completed';\n }else if(kind==='view'&&activity&&activity.kind==='writer-active'){\n headingKey='screen-heading-live';\n descriptionKey='screen-description-live';\n }\n if(screenHeadingEl){screenHeadingEl.textContent=message(headingKey)}\n if(screenDescriptionEl){screenDescriptionEl.textContent=message(descriptionKey)}\n }\n\n function updateFollowControl(followLive,activity){\n if(!liveBtn){return}\n var writerActive=followLive&&activity&&activity.kind==='writer-active';\n var labelKey=!followLive?'return-live':activity&&activity.kind==='terminal'?'latest':writerActive?'live':'following-head';\n var label=message(labelKey);\n liveBtn.classList.toggle('paused',!followLive);\n liveBtn.classList.toggle('active',writerActive);\n liveBtn.setAttribute('aria-pressed',followLive?'true':'false');\n liveBtn.setAttribute('aria-label',!followLive?message('return-live-aria'):writerActive?message('live-aria'):label);\n var labelEl=liveBtn.querySelector('[data-lc-live-label]');\n if(labelEl){labelEl.textContent=label}\n liveBtn.disabled=false;\n }\n\n function renderView(d,requestedCursor){\n ensureViewControls();\n state.runID=d.selection.runID;\n state.head=d.selection.head;\n state.cursor=d.selection.cursor;\n state.followLive=requestedCursor===null;\n if(!state.followLive&&state.explicitRun===null){\n state.explicitRun=state.runID;\n replaceUrl(state.runID,state.cursor);\n }\n\n // Update run selector.\n if(runSelect&&d.runs){\n syncRunOptions(d.runs,d.selection.runID);\n }\n\n // Update slider.\n if(slider){\n slider.max=String(state.head);\n slider.value=String(state.cursor);\n slider.disabled=(state.head===0);\n slider.setAttribute('aria-valuenow',String(state.cursor));\n slider.setAttribute('aria-valuemax',String(state.head));\n }\n\n // Update counts.\n if(countsEl){\n var countLabel=mount.getAttribute('data-msg-events')||'{n} events';\n countsEl.textContent=countLabel.replace('{n}',String(state.head));\n countsEl.hidden=false;\n }\n if(incomingEl){\n var inc=d.selection.incomingEvents||0;\n var incomingLabel=mount.getAttribute('data-msg-incoming')||'';\n incomingEl.textContent=inc>0?incomingLabel.replace('{n}',String(inc)):'';\n incomingEl.hidden=(inc===0);\n }\n\n updateFollowControl(state.followLive,d.activity);\n updateActivity(d.activity);\n updateScreenCopy('view',state.followLive,d.activity);\n updateCursorFeedback(d.projection);\n\n // Render tree projection.\n renderProjection(d.projection,d.recording);\n\n // Sync mount data attributes so QA selectors and popstate reads reflect\n // current state. These were set by SSR but never updated by client JS.\n mount.setAttribute('data-lifecycle-state', state.followLive?'live':'paused');\n mount.setAttribute('data-lifecycle-run', d.selection.runID||'');\n mount.setAttribute('data-lifecycle-head', String(state.head));\n }\n\n function syncRunOptions(runs,selectedID){\n if(!runSelect){return}\n var current=runSelect.value;\n // Rebuild options only if the set changed.\n var existingIds=Array.prototype.map.call(runSelect.options,function(o){return o.value});\n var newIds=runs.map(function(r){return r.runID});\n var changed=JSON.stringify(existingIds)!==JSON.stringify(newIds);\n if(changed){\n runSelect.innerHTML='';\n for(var i=0;i<runs.length;i++){\n var opt=document.createElement('option');\n opt.value=runs[i].runID;\n var label=runs[i].runID.slice(0,16)+(runs[i].source==='legacy-graph'?' (legacy)':'');\n opt.textContent=label;\n runSelect.appendChild(opt);\n }\n }\n runSelect.value=selectedID;\n }\n\n function renderLegacy(d){\n ensureViewControls();\n state.runID=d.selection.runID;\n state.head=0;\n if(runSelect&&d.runs){syncRunOptions(d.runs,d.selection.runID)}\n if(slider){\n slider.disabled=true;slider.value='0';slider.max='0';\n slider.setAttribute('aria-valuenow','0');slider.setAttribute('aria-valuemax','0');\n }\n if(incomingEl){incomingEl.textContent='';incomingEl.hidden=true}\n if(countsEl){countsEl.textContent='';countsEl.hidden=true}\n updateFollowControl(false,{kind:'legacy'});\n if(liveBtn){liveBtn.disabled=true}\n updateActivity({kind:'legacy'});\n updateScreenCopy('legacy',false,{kind:'legacy'});\n updateCursorFeedback(null);\n // Show legacy graph using existing graph render (the projection is GraphViewProjectionV1).\n if(treeMountEl){\n projectionKey='';\n var legacyNote=document.createElement('div');\n legacyNote.className='lc-legacy-note';\n legacyNote.setAttribute('role','status');\n var noteMsg=mount.getAttribute('data-msg-legacy-note')||'';\n legacyNote.textContent=noteMsg;\n treeMountEl.innerHTML='';\n treeMountEl.appendChild(legacyNote);\n // Render the legacy graph SVG if the projection has nodes.\n if(d.projection&&d.projection.nodes){\n renderGraphViewInline(d.projection,treeMountEl);\n }\n }\n mount.setAttribute('data-lifecycle-state','legacy');\n mount.setAttribute('data-lifecycle-run',d.selection.runID||'');\n mount.setAttribute('data-lifecycle-head','0');\n }\n\n function renderProjection(proj,recording){\n if(!proj||!treeMountEl){return}\n var degraded=recording&&recording.state==='degraded';\n var key=JSON.stringify([proj.runID,proj.cursor,proj.rootOperationID,proj.operations,degraded]);\n if(key===projectionKey){return}\n projectionKey=key;\n treeMountEl.textContent='';\n if(degraded){\n var note=makeElement('div','lc-partial-note',message('partial-tail'));\n note.setAttribute('role','status');\n treeMountEl.appendChild(note);\n }\n treeMountEl.appendChild(buildOperationTree(proj));\n }\n\n function makeElement(tag,className,text){\n var element=document.createElement(tag);\n if(className){element.className=className}\n if(text!==undefined&&text!==null){element.textContent=String(text)}\n return element;\n }\n\n function appendMeta(parent,label,value,className){\n var item=makeElement('div','lct-meta-item');\n item.appendChild(makeElement('dt','',label));\n var detail=makeElement('dd',className||'',value);\n item.appendChild(detail);\n parent.appendChild(item);\n }\n\n function stateBadge(stateValue){\n var badge=makeElement('span','lct-state',stateValue);\n badge.setAttribute('data-state',stateValue);\n badge.setAttribute('aria-label',message('state')+': '+stateValue);\n return badge;\n }\n\n function appendTime(parent,label,value){\n if(value===undefined||value===null){return}\n var iso=new Date(value).toISOString();\n var item=makeElement('div','lct-time-item');\n item.appendChild(makeElement('span','',label));\n var time=makeElement('time','',iso);\n time.setAttribute('datetime',iso);\n item.appendChild(time);\n parent.appendChild(item);\n }\n\n function appendFailure(parent,failure){\n if(!failure){return}\n var box=makeElement('div','lct-failure');\n box.appendChild(makeElement('span','lct-failure-label',message('failure')));\n box.appendChild(makeElement('code','',failure.class));\n if(failure.statusCode!==undefined){\n var status=makeElement('span','',message('status-code')+' ');\n status.appendChild(makeElement('code','',failure.statusCode));\n box.appendChild(status);\n }\n if(failure.retryable!==undefined){\n box.appendChild(makeElement('span','',message('retryable')+' '+message(failure.retryable?'yes':'no')));\n }\n parent.appendChild(box);\n }\n\n function appendSession(parent,attempt){\n if(!attempt.sessionID){\n parent.appendChild(makeElement('div','lct-session-empty',message('no-session')));\n return;\n }\n var session=makeElement('div','lct-session');\n session.setAttribute('data-lifecycle-session-id',attempt.sessionID);\n session.appendChild(makeElement('span','',message('session')));\n session.appendChild(makeElement('code','',attempt.sessionID));\n if(attempt.parentSessionID){\n var parentSession=makeElement('span','lct-parent-session',message('parent-session')+' ');\n parentSession.appendChild(makeElement('code','',attempt.parentSessionID));\n session.appendChild(parentSession);\n }\n parent.appendChild(session);\n }\n\n function buildAttempt(attempt){\n var article=makeElement('article','lct-attempt');\n article.setAttribute('data-lifecycle-attempt-id',attempt.attemptID);\n article.setAttribute('data-lifecycle-attempt-state',attempt.state);\n article.setAttribute('data-lifecycle-retry-index',String(attempt.retryIndex));\n var header=makeElement('header','lct-attempt-head');\n header.appendChild(makeElement('strong','',fillTemplate(message('attempt'),{n:Number(attempt.attempt)+1})));\n header.appendChild(stateBadge(attempt.state));\n article.appendChild(header);\n\n var metadata=makeElement('dl','lct-attempt-meta');\n if(!attempt.model){appendMeta(metadata,message('model'),message('no-model'),'muted')}\n appendMeta(metadata,message('route'),attempt.routeKind||message('no-route'),attempt.routeKind?'lct-route-'+attempt.routeKind:'muted');\n appendMeta(metadata,message('retry-label'),attempt.retryIndex,'mono');\n if(attempt.selectionCause){appendMeta(metadata,message('selection'),attempt.selectionCause,'mono')}\n if(attempt.runtimeID){appendMeta(metadata,message('runtime'),attempt.runtimeID,'mono')}\n article.appendChild(metadata);\n\n var times=makeElement('div','lct-times');\n appendTime(times,message('selected-at'),attempt.selectedAt);\n appendTime(times,message('queued-at'),attempt.queuedAt);\n appendTime(times,message('started-at'),attempt.startedAt);\n appendTime(times,message('terminal-at'),attempt.terminalAt);\n article.appendChild(times);\n appendFailure(article,attempt.failure);\n if(attempt.model){\n var identity=attempt.model.providerID+'/'+attempt.model.modelID;\n var model=makeElement('div','lct-model');\n model.setAttribute('data-lifecycle-model-id',identity);\n model.appendChild(makeElement('span','',message('model')));\n model.appendChild(makeElement('code','',identity));\n article.appendChild(model);\n }\n appendSession(article,attempt);\n return article;\n }\n\n function appendParentReference(card,op,known){\n if(!op.parentOperationID||known.has(op.parentOperationID)){return}\n var reference=makeElement('div','lct-parent-reference');\n reference.appendChild(makeElement('span','',message('parent-reference')));\n reference.appendChild(makeElement('code','',op.parentOperationID));\n reference.appendChild(makeElement('span','lct-missing-reference',message('missing-operation')));\n card.appendChild(reference);\n }\n\n function appendDependencies(card,op,known){\n var dependencyIDs=op.dependsOnOperationIDs||[];\n if(dependencyIDs.length===0){return}\n var box=makeElement('div','lct-dependencies');\n box.appendChild(makeElement('span','lct-relation-label',message('depends-on')));\n var list=makeElement('ul','');\n dependencyIDs.forEach(function(dependencyID){\n var item=makeElement('li','');\n item.setAttribute('data-lifecycle-dependency-from',dependencyID);\n item.appendChild(makeElement('code','',dependencyID));\n if(!known.has(dependencyID)){\n item.appendChild(document.createTextNode(' '));\n item.appendChild(makeElement('span','lct-missing-reference',message('missing-operation')));\n }\n list.appendChild(item);\n });\n box.appendChild(list);\n card.appendChild(box);\n }\n\n function buildOperation(op,known,depth){\n var article=makeElement('article','lct-operation');\n article.setAttribute('role','treeitem');\n article.setAttribute('aria-level',String(depth));\n article.setAttribute('data-lifecycle-operation-id',op.operationID);\n if(op.parentOperationID){article.setAttribute('data-lifecycle-parent-operation-id',op.parentOperationID)}\n article.setAttribute('data-lifecycle-operation-state',op.state);\n article.setAttribute('data-op-id',op.operationID);\n article.setAttribute('data-op-state',op.state);\n\n var card=makeElement('div','lct-operation-card');\n var header=makeElement('header','lct-operation-head');\n var identity=makeElement('div','');\n identity.appendChild(makeElement('span','lct-operation-label',message('operation')));\n identity.appendChild(makeElement('code','lct-operation-id',op.operationID));\n header.appendChild(identity);\n header.appendChild(stateBadge(op.state));\n card.appendChild(header);\n\n var metadata=makeElement('dl','lct-operation-meta');\n appendMeta(metadata,message('role'),op.roleID,'mono');\n appendMeta(metadata,message('kind'),op.kind,'mono');\n appendMeta(metadata,message('task'),op.taskID,'mono');\n if(op.agentID){appendMeta(metadata,message('agent'),op.agentID,'mono')}\n card.appendChild(metadata);\n appendParentReference(card,op,known);\n appendDependencies(card,op,known);\n\n var attempts=makeElement('section','lct-attempts');\n attempts.setAttribute('aria-label',message('attempts'));\n var attemptList=op.attempts||[];\n if(attemptList.length===0){\n attempts.appendChild(makeElement('div','lct-no-attempts',message('no-attempts')));\n }else{\n attemptList.forEach(function(attempt){attempts.appendChild(buildAttempt(attempt))});\n }\n card.appendChild(attempts);\n article.appendChild(card);\n return article;\n }\n\n function buildOperationTree(proj){\n var operations=Array.isArray(proj.operations)?proj.operations:[];\n if(operations.length===0){\n return makeElement('div','lc-empty',message('no-operations'));\n }\n var byID=new Map();\n operations.forEach(function(op){if(!byID.has(op.operationID)){byID.set(op.operationID,op)}});\n var uniqueOperations=Array.from(byID.values());\n var known=new Set(byID.keys());\n var childrenByParent=new Map();\n uniqueOperations.forEach(function(op){\n if(!op.parentOperationID||!known.has(op.parentOperationID)){return}\n var children=childrenByParent.get(op.parentOperationID)||[];\n children.push(op);\n childrenByParent.set(op.parentOperationID,children);\n });\n var visited=new Set();\n function buildBranch(op,depth){\n if(visited.has(op.operationID)){return null}\n visited.add(op.operationID);\n var article=buildOperation(op,known,depth);\n var children=childrenByParent.get(op.operationID)||[];\n var childNodes=[];\n children.forEach(function(child){\n var node=buildBranch(child,depth+1);\n if(node){childNodes.push(node)}\n });\n if(childNodes.length>0){\n var group=makeElement('div','lct-operation-children');\n group.setAttribute('role','group');\n childNodes.forEach(function(node){group.appendChild(node)});\n article.appendChild(group);\n }\n return article;\n }\n\n var tree=makeElement('div','lct-tree');\n tree.setAttribute('role','tree');\n tree.setAttribute('aria-label',message('tree-aria'));\n var root=byID.get(proj.rootOperationID);\n if(root){\n var rootNode=buildBranch(root,1);\n if(rootNode){tree.appendChild(rootNode)}\n }else{\n tree.appendChild(makeElement('div','lct-root-missing',message('root-missing')));\n }\n\n var unlinked=null;\n var unlinkedGroup=null;\n while(visited.size<uniqueOperations.length){\n var next=uniqueOperations.find(function(op){\n return !visited.has(op.operationID)&&(!op.parentOperationID||!known.has(op.parentOperationID)||visited.has(op.parentOperationID));\n })||uniqueOperations.find(function(op){return !visited.has(op.operationID)});\n if(!next){break}\n if(!unlinked){\n unlinked=makeElement('section','lct-unlinked');\n unlinked.appendChild(makeElement('h4','',message('unlinked')));\n unlinked.appendChild(makeElement('p','',message('unlinked-note')));\n unlinkedGroup=makeElement('div','');\n unlinkedGroup.setAttribute('role','group');\n unlinked.appendChild(unlinkedGroup);\n tree.appendChild(unlinked);\n }\n var unlinkedNode=buildBranch(next,1);\n if(unlinkedNode){unlinkedGroup.appendChild(unlinkedNode)}\n }\n return tree;\n }\n\n function renderGraphViewInline(proj,container){\n // Minimal DAG SVG for legacy projections (GraphViewProjectionV1).\n // Uses existing .graph-wrap / .gnode styles from GRAPH_STYLE.\n if(!proj.nodes||proj.nodes.length===0){return}\n var COL_W=220,ROW_H=96,NODE_W=180,NODE_H=64,PAD=20;\n var layer={};\n proj.nodes.forEach(function(n){layer[n.nodeID]=0});\n for(var pass=0;pass<proj.nodes.length;pass++){\n var changed=false;\n for(var e=0;e<(proj.edges||[]).length;e++){\n var edge=proj.edges[e];\n var from=(layer[edge.from]||0),to=(layer[edge.to]||0);\n if(from+1>to){layer[edge.to]=from+1;changed=true}\n }\n if(!changed){break}\n }\n var byLayer=[];\n proj.nodes.forEach(function(n){\n var l=layer[n.nodeID]||0;\n if(!byLayer[l]){byLayer[l]=[]}\n byLayer[l].push(n.nodeID);\n });\n var pos={};var maxL=0,maxR=0;\n byLayer.forEach(function(ids,l){\n if(l>maxL){maxL=l}if(ids.length>maxR){maxR=ids.length}\n ids.forEach(function(id,r){pos[id]={x:PAD+l*COL_W,y:PAD+r*ROW_H}});\n });\n var W=PAD*2+maxL*COL_W+NODE_W,H=PAD*2+Math.max(0,maxR-1)*ROW_H+NODE_H;\n var svgParts=['<svg class=\"graph\" viewBox=\"0 0 '+W+' '+H+'\" width=\"'+W+'\" height=\"'+H+'\" role=\"img\"><defs><marker id=\"ga2\" viewBox=\"0 0 8 8\" refX=\"7\" refY=\"4\" markerWidth=\"7\" markerHeight=\"7\" orient=\"auto-start-reverse\"><path d=\"M0 0 L8 4 L0 8 z\" fill=\"var(--cp-border-strong)\"></path></marker></defs>'];\n (proj.edges||[]).forEach(function(e){\n var a=pos[e.from],b=pos[e.to];\n if(!a||!b){return}\n svgParts.push('<line class=\"gedge\" x1=\"'+(a.x+NODE_W)+'\" y1=\"'+(a.y+NODE_H/2)+'\" x2=\"'+b.x+'\" y2=\"'+(b.y+NODE_H/2)+'\" marker-end=\"url(#ga2)\"></line>');\n });\n proj.nodes.forEach(function(n){\n var p=pos[n.nodeID];if(!p){return}\n function escape(value){return String(value).replace(/[&<>\"']/g,function(c){return{'&':'&amp;','<':'&lt;','>':'&gt;','\"':'&quot;',\"'\":'&#39;'}[c]||c})}\n var safe=escape(n.nodeID);\n var session=typeof n.sessionRef==='string'&&n.sessionRef?' data-session=\"'+escape(n.sessionRef)+'\"':'';\n svgParts.push('<g class=\"gnode state-'+escape(n.state)+'\" data-node=\"'+safe+'\"'+session+' transform=\"translate('+p.x+','+p.y+')\"><rect width=\"'+NODE_W+'\" height=\"'+NODE_H+'\"></rect><text class=\"gname\" x=\"10\" y=\"20\">'+safe+'</text><text class=\"gstate\" x=\"10\" y=\"40\">'+escape(n.state)+'</text></g>');\n });\n svgParts.push('</svg>');\n var wrap=document.createElement('div');wrap.className='graph-wrap';\n wrap.innerHTML=svgParts.join('');\n container.appendChild(wrap);\n }\n\n function updateActivity(activity){\n if(!activityEl){return}\n var kind=activity&&activity.kind?activity.kind:'writer-unknown';\n var cssKind=kind==='writer-active'?'active':kind==='writer-unknown'?'unknown':kind;\n var dot=activityEl.querySelector('.lc-activity-dot');\n activityEl.className='lc-activity '+cssKind;\n activityEl.setAttribute('data-lifecycle-activity',kind);\n var label=mount.getAttribute('data-msg-activity-'+kind)||kind;\n var textNode=activityEl.querySelector('[data-lc-activity-label]');\n if(textNode){textNode.textContent=label}\n if(dot){dot.setAttribute('aria-hidden','true')}\n }\n\n function showError(){\n projectionKey='';\n mount.setAttribute('data-lifecycle-state','error');\n updateScreenCopy('unavailable',false,null);\n updateCursorFeedback(null);\n if(liveBtn){liveBtn.disabled=true}\n if(slider){slider.disabled=true}\n if(treeMountEl){\n treeMountEl.innerHTML='';\n var div=document.createElement('div');div.className='lc-error';div.setAttribute('role','alert');\n div.textContent=mount.getAttribute('data-msg-error-loading')||'';\n treeMountEl.appendChild(div);\n }\n }\n\n function showApiError(err){\n projectionKey='';\n mount.setAttribute('data-lifecycle-state','error');\n updateScreenCopy('unavailable',false,null);\n updateCursorFeedback(null);\n if(liveBtn){liveBtn.disabled=true}\n if(slider){slider.disabled=true}\n if(!treeMountEl||!err){showError();return}\n var code=err.code||'';\n var msg=mount.getAttribute('data-msg-error-'+code)||mount.getAttribute('data-msg-error-loading')||'';\n treeMountEl.innerHTML='';\n var div=document.createElement('div');div.className='lc-error';div.setAttribute('role','alert');\n div.textContent=msg;\n treeMountEl.appendChild(div);\n }\n\n function showDisabled(d){\n projectionKey='';\n mount.setAttribute('data-lifecycle-state','disabled');\n updateScreenCopy('unavailable',false,null);\n updateCursorFeedback(null);\n if(liveBtn){liveBtn.disabled=true}\n if(slider){slider.disabled=true}\n var reason=d&&d.reason?d.reason:'history-disabled';\n var msg=mount.getAttribute('data-msg-disabled-'+reason)||'';\n if(treeMountEl){\n treeMountEl.innerHTML='';\n var div=document.createElement('div');div.className='lc-empty';div.setAttribute('role','status');\n div.textContent=msg;\n treeMountEl.appendChild(div);\n }\n }\n\n function showEmpty(){\n projectionKey='';\n mount.setAttribute('data-lifecycle-state','empty');\n updateScreenCopy('empty',false,null);\n updateCursorFeedback(null);\n if(liveBtn){liveBtn.disabled=true}\n if(slider){slider.disabled=true}\n var msg=mount.getAttribute('data-msg-no-runs')||'';\n if(treeMountEl){\n treeMountEl.innerHTML='';\n var div=document.createElement('div');div.className='lc-empty';div.setAttribute('role','status');\n div.textContent=msg;\n treeMountEl.appendChild(div);\n }\n }\n\n // --- Run selector change ---\n if(runSelect){\n runSelect.addEventListener('change',function(){\n var newRun=runSelect.value;\n pushUrl(newRun,null); // committed selection \u2192 traversable entry\n navigateFromUrl(false);\n });\n }\n\n // --- Slider scrub ---\n // Wire slider event listeners if slider was present in SSR (view/legacy state).\n // When SSR is empty, wireSlider() is deferred to ensureViewControls().\n wireSlider();\n\n // --- Live / Return to live ---\n if(liveBtn){\n liveBtn.addEventListener('click',function(){\n pushUrl(state.explicitRun,null); // return-to-live preserves automatic run selection\n navigateFromUrl(false);\n });\n }\n\n // --- SSE graph-append handler ---\n function onAppend(e){\n if(state.stopped){return}\n var detail=e.detail||{};\n var runID=detail.runID;var head=detail.head;\n if(typeof runID!=='string'||!runID||!Number.isSafeInteger(head)||head<0){return}\n if((state.explicitRun!==null||!state.followLive)&&runID!==state.runID){return}\n var known=Math.max(state.lastSseHead.get(runID)||0,runID===state.runID?state.head:0);\n if(head<=known){return}\n state.lastSseHead.set(runID,head);\n if(state.lastSseHead.size>64){state.lastSseHead.delete(state.lastSseHead.keys().next().value)}\n // Hints never change displayed head/incoming; the confirmed API selection\n // is authoritative, including while paused at zero or exactly at head.\n fetchHistory();\n }\n document.addEventListener('lifecycle-append',onAppend);\n\n // --- Browser back/forward ---\n window.addEventListener('popstate',function(){\n navigateFromUrl(false);\n });\n\n // --- Catch-up polling (SSE-absent / coalesced-event recovery) ---\n // Paused requests retain their exact prefix while refreshing head metadata.\n var lcRefreshMs=parseInt(document.documentElement.getAttribute('data-refresh')||'2000',10);\n if(isNaN(lcRefreshMs)||lcRefreshMs<500){lcRefreshMs=2000;}\n var pollTimer=setInterval(fetchHistory,lcRefreshMs);\n window.addEventListener('pagehide',function(){\n state.stopped=true;\n state.generation++;\n state.pending=false;\n cancelRequest();\n clearInterval(pollTimer);\n document.removeEventListener('lifecycle-append',onAppend);\n });\n window.addEventListener('pageshow',function(e){\n if(!e.persisted||!state.stopped){return}\n state.stopped=false;\n document.addEventListener('lifecycle-append',onAppend);\n pollTimer=setInterval(fetchHistory,lcRefreshMs);\n navigateFromUrl(false);\n });\n\n navigateFromUrl(true);\n}\n";
37
+ export declare const LIFECYCLE_CLIENT_JS: string;
38
38
  //# sourceMappingURL=assets.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"assets.d.ts","sourceRoot":"","sources":["../../src/console/assets.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,eAAO,MAAM,aAAa,upYA6BzB,CAAC;AAEF;;;;;;GAMG;AACH,eAAO,MAAM,WAAW,klFA4CvB,CAAC;AAEF,eAAO,MAAM,iBAAiB,qjZA8R7B,CAAC;AAMF;;;;;GAKG;AACH,eAAO,MAAM,eAAe,w/UAiJ3B,CAAC;AAMF;;;;GAIG;AACH,eAAO,MAAM,oBAAoB,gSAOhC,CAAC;AAEF;;;;;;GAMG;AACH,eAAO,MAAM,mBAAmB,u6lCA20B/B,CAAC"}
1
+ {"version":3,"file":"assets.d.ts","sourceRoot":"","sources":["../../src/console/assets.ts"],"names":[],"mappings":"AAKA;;;;;GAKG;AAEH,eAAO,MAAM,aAAa,k9YAgCzB,CAAC;AAEF;;;;;;GAMG;AACH,eAAO,MAAM,WAAW,klFA4CvB,CAAC;AAEF,eAAO,MAAM,iBAAiB,QAwW7B,CAAC;AAMF;;;;;GAKG;AACH,eAAO,MAAM,eAAe,w/UAiJ3B,CAAC;AAMF;;;;GAIG;AACH,eAAO,MAAM,oBAAoB,gSAOhC,CAAC;AAEF;;;;;;GAMG;AACH,eAAO,MAAM,mBAAmB,QA+4B/B,CAAC"}
@@ -0,0 +1,75 @@
1
+ import type { LifecycleProjectionV1 } from "../lifecycle/contracts";
2
+ import { type SessionLabel } from "./labels";
3
+ export { AssociationError } from "./historyBoundary";
4
+ export declare const CONVERSATION_LIMITS: {
5
+ readonly bytes: number;
6
+ readonly messages: 200;
7
+ readonly parts: 100;
8
+ readonly tools: 200;
9
+ readonly fieldChars: 16384;
10
+ readonly totalChars: 262144;
11
+ readonly argumentDepth: 8;
12
+ readonly argumentEntries: 512;
13
+ };
14
+ export declare const SESSION_HISTORY_LIMITS: {
15
+ readonly bytes: number;
16
+ readonly timeoutMs: 10000;
17
+ readonly labels: 64;
18
+ };
19
+ export type SessionLabelReadOptions = {
20
+ budget: {
21
+ remaining: number;
22
+ };
23
+ timeoutMs?: number;
24
+ };
25
+ export declare class ConversationTooLargeError extends Error {
26
+ constructor();
27
+ }
28
+ export type Conversation = {
29
+ session?: SessionLabel;
30
+ truncated?: boolean;
31
+ messages: Array<{
32
+ id: string;
33
+ role: "user" | "assistant";
34
+ createdAt: number;
35
+ completedAt?: number;
36
+ text: string[];
37
+ tools: Array<{
38
+ id: string;
39
+ name: string;
40
+ status: "pending" | "running" | "completed" | "error";
41
+ arguments: string;
42
+ result?: string;
43
+ startedAt?: number;
44
+ endedAt?: number;
45
+ }>;
46
+ }>;
47
+ };
48
+ /** Allowlist projection of the public SDK response; never serializes provider metadata. */
49
+ export declare function projectConversation(raw: unknown, sessionID: string): Conversation;
50
+ export type ConversationReader = ((endpoint: string, sessionID: string, signal?: AbortSignal) => Promise<Conversation>) & {
51
+ root?: (endpoint: string, projection: LifecycleProjectionV1, signal?: AbortSignal) => Promise<Conversation & {
52
+ session: SessionLabel;
53
+ association: "sdk-parent" | "tool-result";
54
+ }>;
55
+ labels?: (endpoint: string, ids: readonly string[], signal?: AbortSignal, options?: SessionLabelReadOptions) => Promise<SessionLabel[]>;
56
+ };
57
+ /** Public SDK GET only. No process spawning, SQLite access, inference, or transcript persistence. */
58
+ export type ScopedSession = {
59
+ id: string;
60
+ directory: string;
61
+ projectID: string;
62
+ parentID?: string;
63
+ label: SessionLabel;
64
+ };
65
+ export type SessionHistoryPort = {
66
+ get(id: string): Promise<ScopedSession>;
67
+ messages(id: string): Promise<unknown>;
68
+ primaries(projectID: string): Promise<ScopedSession[]>;
69
+ };
70
+ export declare function createConversationReader(deps: {
71
+ directory: string;
72
+ password?: string;
73
+ fetch?: typeof fetch;
74
+ }): ConversationReader;
75
+ //# sourceMappingURL=conversation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"conversation.d.ts","sourceRoot":"","sources":["../../src/console/conversation.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ export declare function only(keys: readonly string[]): (value: unknown) => unknown;
2
+ export declare class AssociationError extends Error {
3
+ readonly reason: "unavailable" | "ambiguous" | "incomplete";
4
+ constructor(reason: "unavailable" | "ambiguous" | "incomplete");
5
+ }
6
+ //# sourceMappingURL=historyBoundary.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"historyBoundary.d.ts","sourceRoot":"","sources":["../../src/console/historyBoundary.ts"],"names":[],"mappings":"AAIA,wBAAgB,IAAI,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,WAC3B,OAAO,KAAG,OAAO,CAUjC;AAED,qBAAa,gBAAiB,SAAQ,KAAK;IAC7B,QAAQ,CAAC,MAAM,EAAE,aAAa,GAAG,WAAW,GAAG,YAAY;IAAvE,YAAqB,MAAM,EAAE,aAAa,GAAG,WAAW,GAAG,YAAY,EAQtE;CACF"}
@@ -0,0 +1,3 @@
1
+ export declare const CONVERSATION_CLIENT_JS: string;
2
+ export declare const CONVERSATION_STYLE = "\n.lc-conversation{margin-top:12px;padding:12px;min-width:0;border:1px solid var(--cp-border);border-radius:16px;background:var(--cp-surface);color:var(--cp-text);overflow-anchor:none}\n.lc-conversation[hidden]{display:none}\n.lc-conversation-head{display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between;gap:8px}\n.lc-conversation h3,.lc-conversation h4,.lc-conversation p{margin:8px 0}\n.lc-conversation h3{scroll-margin-top:12px}\n.lc-conversation pre{white-space:pre-wrap;overflow-wrap:anywhere;max-height:400px;overflow:auto;background:var(--cp-surface-soft);padding:12px;font-family:Consolas,\"Courier New\",Courier,monospace}\n.lc-conversation [data-conversation-role=\"user\"] pre{max-height:180px}\n.lc-conversation [data-conversation-tool-list]{max-height:160px;overflow:auto}\n.lc-conversation details{margin-top:12px;padding:8px;border:1px solid var(--cp-border);border-radius:.625rem}\n.lc-conversation summary{cursor:pointer;color:var(--cp-accent)}\n.lc-conversation time{font-size:11px;color:var(--cp-text-muted)}\n.lc-conversation button,[data-inspect-attempt],[data-inspect-root]{padding:6px 10px;margin:6px;border:1px solid var(--cp-border);border-radius:.625rem;background:var(--cp-surface);color:var(--cp-accent)}\n.lct-operation-name{display:block;font-size:16px}\n.lct-operation-head details,.lct-session details{font-size:11px;color:var(--cp-text-muted)}\n.lct-session small,.session-btn small{display:block;color:var(--cp-text-muted)}\n.lc-run-select{max-width:650px}\n";
3
+ //# sourceMappingURL=inspector.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"inspector.d.ts","sourceRoot":"","sources":["../../src/console/inspector.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,sBAAsB,QAwNlC,CAAC;AAEF,eAAO,MAAM,kBAAkB,8+CAiB9B,CAAC"}
@@ -0,0 +1,12 @@
1
+ export type SessionLabel = {
2
+ id: string;
3
+ title?: string;
4
+ createdAt?: number;
5
+ };
6
+ export declare const boundedTitle: (value: unknown) => string | undefined, utcTime: (value: unknown) => string, runLabel: (run: {
7
+ runID: string;
8
+ startedAt: number | null;
9
+ executionAuthority: string;
10
+ }, title?: string) => string;
11
+ export declare const LABELS_CLIENT_JS: string;
12
+ //# sourceMappingURL=labels.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"labels.d.ts","sourceRoot":"","sources":["../../src/console/labels.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,YAAY,GAAG;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC;AAqC9E,eAAO,MAAQ,YAAY,UAhCI,OAAO,KAAG,MAAM,GAAG,SAAS,EAgC9B,OAAO,UAtBV,OAAO,KAAG,MAAM,EAsBJ,QAAQ,QAZrC;IACH,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,kBAAkB,EAAE,MAAM,CAAC;CAC5B,UACO,MAAM,KACb,MAMkE,CAAC;AAExE,eAAO,MAAM,gBAAgB,QA0D5B,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"opencodeClient.d.ts","sourceRoot":"","sources":["../../src/console/opencodeClient.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,kBAAkB,EAGvB,KAAK,YAAY,EAClB,MAAM,YAAY,CAAC;AACpB,OAAO,EAA2B,KAAK,UAAU,EAAE,MAAM,OAAO,CAAC;AAEjE;;;;GAIG;AAEH,MAAM,MAAM,SAAS,GAAG,OAAO,KAAK,CAAC;AAErC,MAAM,MAAM,iBAAiB,GAAG;IAC9B,oEAAoE;IACpE,QAAQ,EAAE,MAAM,CAAC;IACjB,6EAA6E;IAC7E,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,SAAS,CAAC;CACnB,CAAC;AAEF,MAAM,MAAM,aAAa,GAAG;IAC1B,iFAAiF;IACjF,UAAU,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC/D,2CAA2C;IAC3C,iBAAiB,EAAE,CACjB,SAAS,EAAE,MAAM,EACjB,YAAY,EAAE,MAAM,EACpB,QAAQ,EAAE,MAAM,GAAG,QAAQ,GAAG,QAAQ,KACnC,OAAO,CAAC,IAAI,CAAC,CAAC;IACnB;;;;;OAKG;IACH,YAAY,EAAE,CACZ,SAAS,EAAE,MAAM,EACjB,OAAO,CAAC,EAAE,kBAAkB,KACzB,OAAO,CAAC,YAAY,EAAE,CAAC,CAAC;IAC7B;;;;OAIG;IACH,YAAY,EAAE,CACZ,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,CAAC,KAAK,EAAE,YAAY,KAAK,IAAI,EACtC,MAAM,EAAE,WAAW,EACnB,OAAO,CAAC,EAAE,kBAAkB,KACzB,OAAO,CAAC,IAAI,CAAC,CAAC;CACpB,CAAC;AAgBF,oFAAoF;AACpF,wBAAgB,cAAc,CAC5B,OAAO,EAAE,UAAU,EACnB,SAAS,EAAE,MAAM,EACjB,OAAO,GAAE,kBAAuB,GAC/B,YAAY,GAAG,SAAS,CAK1B;AAED,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,iBAAiB,GAAG,aAAa,CA+E1E"}
1
+ {"version":3,"file":"opencodeClient.d.ts","sourceRoot":"","sources":["../../src/console/opencodeClient.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,kBAAkB,EAGvB,KAAK,YAAY,EAClB,MAAM,YAAY,CAAC;AACpB,OAAO,EAA2B,KAAK,UAAU,EAAE,MAAM,OAAO,CAAC;AAEjE;;;;GAIG;AAEH,MAAM,MAAM,SAAS,GAAG,OAAO,KAAK,CAAC;AAErC,MAAM,MAAM,iBAAiB,GAAG;IAC9B,oEAAoE;IACpE,QAAQ,EAAE,MAAM,CAAC;IACjB,6EAA6E;IAC7E,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,SAAS,CAAC;CACnB,CAAC;AAEF,MAAM,MAAM,aAAa,GAAG;IAC1B,iFAAiF;IACjF,UAAU,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC/D,2CAA2C;IAC3C,iBAAiB,EAAE,CACjB,SAAS,EAAE,MAAM,EACjB,YAAY,EAAE,MAAM,EACpB,QAAQ,EAAE,MAAM,GAAG,QAAQ,GAAG,QAAQ,KACnC,OAAO,CAAC,IAAI,CAAC,CAAC;IACnB;;;;;OAKG;IACH,YAAY,EAAE,CACZ,SAAS,EAAE,MAAM,EACjB,OAAO,CAAC,EAAE,kBAAkB,KACzB,OAAO,CAAC,YAAY,EAAE,CAAC,CAAC;IAC7B;;;;OAIG;IACH,YAAY,EAAE,CACZ,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,CAAC,KAAK,EAAE,YAAY,KAAK,IAAI,EACtC,MAAM,EAAE,WAAW,EACnB,OAAO,CAAC,EAAE,kBAAkB,KACzB,OAAO,CAAC,IAAI,CAAC,CAAC;CACpB,CAAC;AAgBF,oFAAoF;AACpF,wBAAgB,cAAc,CAC5B,OAAO,EAAE,UAAU,EACnB,SAAS,EAAE,MAAM,EACjB,OAAO,GAAE,kBAAuB,GAC/B,YAAY,GAAG,SAAS,CAK1B;AAED,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,iBAAiB,GAAG,aAAa,CAqF1E"}
@@ -0,0 +1,3 @@
1
+ /** Incremental metadata refresh. The editor, transcript and transport DOM are owned separately. */
2
+ export declare const CONSOLE_REFRESH_JS = "\n var viewRevision='',viewRequest=null,viewPending=false,viewStopped=false,latestView=null;\n var appliedRouting='',appliedLogs='',appliedTree='';\n function protectedContent(element){\n var active=document.activeElement;\n if(active&&element.contains(active)&&/^(INPUT|TEXTAREA|SELECT)$/.test(active.tagName)){return true}\n var selection=window.getSelection&&window.getSelection();\n return !!(selection&&!selection.isCollapsed&&element.contains(selection.anchorNode));\n }\n function nodeKey(node){\n if(node.nodeType!==1){return ''}\n return (node.hasAttribute('data-session-target')?'session-target:'+node.getAttribute('data-session-target'):\n node.hasAttribute('data-session-view')?'session-view:'+node.getAttribute('data-session-view'):node.id)||\n ((node.tagName==='LI'||node.tagName==='TR')?node.outerHTML:'');\n }\n function patchNode(old,next){\n if(old.isEqualNode(next)){return}\n if(old.nodeType!==next.nodeType||old.nodeName!==next.nodeName){\n old.replaceWith(next.cloneNode(true));return;\n }\n if(old.nodeType===3){old.nodeValue=next.nodeValue;return}\n if(old.nodeType!==1){return}\n if(old.matches('[data-session-name],[data-session-time]')){\n if(old.getAttribute('data-label-fallback')!==next.textContent){old.setAttribute('data-label-fallback',next.textContent)}\n return;\n }\n if(old.matches('input,textarea,select,.term,.pty,.graph-drill,[data-config-mount]')){return}\n Array.from(old.attributes).forEach(function(a){\n if(a.name!=='open'&&a.name!=='hidden'&&a.name!=='aria-selected'&&!next.hasAttribute(a.name)){old.removeAttribute(a.name)}\n });\n Array.from(next.attributes).forEach(function(a){\n if(a.name!=='open'&&a.name!=='hidden'&&a.name!=='aria-selected'&&old.getAttribute(a.name)!==a.value){old.setAttribute(a.name,a.value)}\n });\n var originals=Array.from(old.childNodes),used=new Set();\n Array.from(next.childNodes).forEach(function(child,index){\n var key=nodeKey(child),match;\n if(key){match=originals.find(function(n){return !used.has(n)&&nodeKey(n)===key})}\n else{match=originals.find(function(n){return !used.has(n)&&!nodeKey(n)&&n.nodeName===child.nodeName})}\n if(match){used.add(match);patchNode(match,child)}\n else{match=child.cloneNode(true)}\n if(old.childNodes[index]!==match){\n var scrolls=match.nodeType===1?[match].concat(Array.from(match.querySelectorAll('*'))).map(function(n){return [n,n.scrollTop,n.scrollLeft]}):[];\n old.insertBefore(match,old.childNodes[index]||null);\n scrolls.forEach(function(s){s[0].scrollTop=s[1];s[0].scrollLeft=s[2]});\n }\n });\n originals.forEach(function(n){\n if(!used.has(n)&&n.parentNode===old){\n if(n.nodeType===1){\n disconnectTerminal(n);\n n.querySelectorAll('[data-session-view]').forEach(disconnectTerminal);\n }\n old.removeChild(n);\n }\n });\n }\n function patchHtml(element,html){\n var next=document.createElement('div');\n next.innerHTML=html;\n var shell=element.cloneNode(false);\n while(next.firstChild){shell.appendChild(next.firstChild)}\n patchNode(element,shell);\n }\n function applyView(forceLogs){\n if(!latestView){return}\n var tree=document.querySelector('#screen-tree > .graph-panel');\n if(tree&&latestView.tree&&latestView.tree!==appliedTree&&!protectedContent(tree)){\n var graph=document.createElement('div');graph.innerHTML=latestView.tree;\n if(graph.firstElementChild){patchNode(tree,graph.firstElementChild)}\n appliedTree=latestView.tree;\n }\n var routing=document.querySelector('#screen-routing > .screen-grid');\n if(routing&&latestView.routing!==appliedRouting&&!protectedContent(routing)){\n var next=document.createElement('div');next.innerHTML=latestView.routing;\n if(next.firstElementChild){patchNode(routing,next.firstElementChild)}\n appliedRouting=latestView.routing;\n }\n var logs=document.getElementById('screen-logs');\n var content=logs&&logs.querySelector('[data-log-content]');\n var follow=logs&&logs.querySelector('[data-log-follow]');\n var incoming=logs&&logs.querySelector('[data-log-incoming]');\n var scroll=document.querySelector('.scroll');\n if(content&&latestView.logs!==appliedLogs){\n if(appliedLogs===''&&content.innerHTML===latestView.logs){appliedLogs=latestView.logs}\n else{\n var atBottom=!scroll||scroll.scrollHeight-scroll.scrollTop-scroll.clientHeight<40;\n var safe=logs.hidden||(follow&&follow.checked&&atBottom);\n if((forceLogs||safe)&&!protectedContent(content)){\n var top=scroll&&scroll.scrollTop;\n patchHtml(content,latestView.logs);\n appliedLogs=latestView.logs;\n wireLogsScreen(logs);\n if(scroll&&!logs.hidden){scroll.scrollTop=follow&&follow.checked?scroll.scrollHeight:top}\n }\n }\n if(incoming){incoming.hidden=latestView.logs===appliedLogs&&!Array.from(content.querySelectorAll('.termlog')).some(function(log){return log.__incoming})}\n }\n var count=document.querySelector('[data-screen=\"logs\"] .count');\n if(count&&count.textContent!==String(latestView.sessionCount)){count.textContent=String(latestView.sessionCount)}\n if(typeof consoleLabels!=='undefined'){consoleLabels.refresh()}\n }\n function refreshView(){\n if(viewStopped){return}\n applyView(false);\n if(viewRequest){viewPending=true;return}\n viewPending=false;\n var controller=new AbortController();\n viewRequest=controller;\n var timeout=setTimeout(function(){controller.abort()},15000);\n fetch('/api/view'+authTok,{headers:viewRevision?{'If-None-Match':viewRevision}:{},signal:controller.signal})\n .then(function(r){\n var error=document.querySelector('[data-refresh-error]');\n if(error){error.hidden=r.ok||r.status===304}\n if(r.status===304){return null}\n if(!r.ok){throw new Error()}\n var revision=r.headers.get('etag')||'';\n return r.json().then(function(d){return {data:d,revision:revision}});\n }).then(function(result){\n if(viewStopped||viewRequest!==controller||!result){return}\n if(typeof result.data.routing!=='string'||typeof result.data.logs!=='string'){return}\n latestView=result.data;viewRevision=result.revision;\n var updated=document.querySelector('.token-chip b');\n if(updated&&typeof latestView.updatedAt==='string'){updated.textContent=latestView.updatedAt}\n if(Number.isInteger(latestView.refreshMs)&&latestView.refreshMs>=250&&latestView.refreshMs!==ms){\n ms=latestView.refreshMs;document.documentElement.setAttribute('data-refresh',String(ms));\n clearInterval(refreshTimer);refreshTimer=null;startRefresh();\n document.dispatchEvent(new CustomEvent('console-refresh-changed',{detail:ms}));\n }\n applyView(false);\n }).catch(function(){\n var error=document.querySelector('[data-refresh-error]');\n if(error&&!viewStopped){error.hidden=false}\n }).finally(function(){\n clearTimeout(timeout);\n if(viewRequest!==controller){return}\n viewRequest=null;\n if(viewPending&&!viewStopped){refreshView()}\n });\n }\n var refreshTimer=null;\n function startRefresh(){\n if(refreshTimer!==null){return}\n viewStopped=false;\n refreshTimer=setInterval(refreshView,isNaN(ms)?2000:Math.max(250,ms));\n }\n window.addEventListener('pagehide',function(){\n viewStopped=true;clearInterval(refreshTimer);refreshTimer=null;\n if(viewRequest){viewRequest.abort();viewRequest=null}\n if(es){es.close();es=null}\n document.querySelectorAll('[data-session-view]').forEach(disconnectTerminal);\n });\n window.addEventListener('pageshow',function(e){\n if(e.persisted){\n startRefresh();openStateStream();refreshView();\n var logs=document.getElementById('screen-logs');\n if(logs&&!logs.hidden){wireLogsScreen(logs)}\n }\n });\n";
3
+ //# sourceMappingURL=refresh.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"refresh.d.ts","sourceRoot":"","sources":["../../src/console/refresh.ts"],"names":[],"mappings":"AAAA,mGAAmG;AACnG,eAAO,MAAM,kBAAkB,85PA8J9B,CAAC"}
@@ -77,4 +77,11 @@ export type RenderOptions = {
77
77
  * Determinista. Pure.
78
78
  */
79
79
  export declare function renderConsoleHtml(state: ConsoleState, options?: RenderOptions): string;
80
+ /** Incremental metadata only; no config editor, scripts or conversation content. */
81
+ export declare function renderConsoleUpdate(state: ConsoleState, options?: Pick<RenderOptions, "terminalEnabled" | "ptyEnabled" | "graphView" | "drilldownEnabled">): {
82
+ routing: string;
83
+ logs: string;
84
+ sessionCount: number;
85
+ tree?: string;
86
+ };
80
87
  //# sourceMappingURL=render.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"render.d.ts","sourceRoot":"","sources":["../../src/console/render.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,KAAK,EAEV,0BAA0B,EAK3B,MAAM,wBAAwB,CAAC;AAUhC,OAAO,KAAK,EAGV,qBAAqB,EACtB,MAAM,wBAAwB,CAAC;AAYhC,OAAO,KAAK,EAGV,YAAY,EAIb,MAAM,SAAS,CAAC;AAEjB,eAAO,MAAM,uBAAuB,EAClC,yHAAkI,CAAC;AASrI,mFAAmF;AACnF,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAOhD;AA4mBD;;;;GAIG;AACH,wBAAgB,eAAe,CAC7B,UAAU,EAAE,qBAAqB,GAAG,IAAI,EACxC,OAAO,GAAE;IAAE,QAAQ,CAAC,EAAE,OAAO,CAAA;CAAO,GACnC,MAAM,CA2BR;AA67BD,MAAM,MAAM,aAAa,GAAG;IAC1B,uDAAuD;IACvD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,4EAA4E;IAC5E,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,kEAAkE;IAClE,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,oDAAoD;IACpD,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB;;;;OAIG;IACH,SAAS,CAAC,EAAE;QACV,QAAQ,CAAC,UAAU,EAAE,qBAAqB,GAAG,IAAI,CAAC;QAClD,sEAAsE;QACtE,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC;QACzB;;;WAGG;QACH,QAAQ,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAC;KAC7B,CAAC;IACF;;;;OAIG;IACH,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B;;;OAGG;IACH,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B;;;;;;;OAOG;IACH,YAAY,CAAC,EAAE;QAAE,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAA;KAAE,CAAC;IAC9C;;;;;OAKG;IACH,aAAa,CAAC,EAAE;QACd,QAAQ,CAAC,QAAQ,EAAE,0BAA0B,GAAG,IAAI,CAAC;QACrD,qDAAqD;QACrD,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;KAChC,CAAC;CACH,CAAC;AAEF;;;;GAIG;AACH,wBAAgB,iBAAiB,CAC/B,KAAK,EAAE,YAAY,EACnB,OAAO,GAAE,aAAkB,GAC1B,MAAM,CA2GR"}
1
+ {"version":3,"file":"render.d.ts","sourceRoot":"","sources":["../../src/console/render.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,KAAK,EAEV,0BAA0B,EAK3B,MAAM,wBAAwB,CAAC;AAWhC,OAAO,KAAK,EAGV,qBAAqB,EACtB,MAAM,wBAAwB,CAAC;AAchC,OAAO,KAAK,EAGV,YAAY,EAIb,MAAM,SAAS,CAAC;AAEjB,eAAO,MAAM,uBAAuB,EAClC,yHAAkI,CAAC;AASrI,mFAAmF;AACnF,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAOhD;AA6nBD;;;;GAIG;AACH,wBAAgB,eAAe,CAC7B,UAAU,EAAE,qBAAqB,GAAG,IAAI,EACxC,OAAO,GAAE;IAAE,QAAQ,CAAC,EAAE,OAAO,CAAA;CAAO,GACnC,MAAM,CA2BR;AA89BD,MAAM,MAAM,aAAa,GAAG;IAC1B,uDAAuD;IACvD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,4EAA4E;IAC5E,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,kEAAkE;IAClE,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,oDAAoD;IACpD,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB;;;;OAIG;IACH,SAAS,CAAC,EAAE;QACV,QAAQ,CAAC,UAAU,EAAE,qBAAqB,GAAG,IAAI,CAAC;QAClD,sEAAsE;QACtE,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC;QACzB;;;WAGG;QACH,QAAQ,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAC;KAC7B,CAAC;IACF;;;;OAIG;IACH,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B;;;OAGG;IACH,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B;;;;;;;OAOG;IACH,YAAY,CAAC,EAAE;QAAE,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAA;KAAE,CAAC;IAC9C;;;;;OAKG;IACH,aAAa,CAAC,EAAE;QACd,QAAQ,CAAC,QAAQ,EAAE,0BAA0B,GAAG,IAAI,CAAC;QACrD,qDAAqD;QACrD,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;KAChC,CAAC;CACH,CAAC;AAEF;;;;GAIG;AACH,wBAAgB,iBAAiB,CAC/B,KAAK,EAAE,YAAY,EACnB,OAAO,GAAE,aAAkB,GAC1B,MAAM,CA4GR;AAED,oFAAoF;AACpF,wBAAgB,mBAAmB,CACjC,KAAK,EAAE,YAAY,EACnB,OAAO,GAAE,IAAI,CACX,aAAa,EACb,iBAAiB,GAAG,YAAY,GAAG,WAAW,GAAG,kBAAkB,CAC/D,GACL;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,CAoBxE"}
@@ -0,0 +1,7 @@
1
+ import type { LifecycleProjectionV1 } from "../lifecycle/contracts";
2
+ import type { ScopedSession, SessionHistoryPort } from "./conversation";
3
+ export declare function recoverRootSession(port: SessionHistoryPort, projection: LifecycleProjectionV1): Promise<{
4
+ session: ScopedSession;
5
+ association: "sdk-parent" | "tool-result";
6
+ }>;
7
+ //# sourceMappingURL=rootAssociation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rootAssociation.d.ts","sourceRoot":"","sources":["../../src/console/rootAssociation.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,wBAAwB,CAAC;AACpE,OAAO,KAAK,EAAE,aAAa,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AA2IxE,wBAAsB,kBAAkB,CACtC,IAAI,EAAE,kBAAkB,EACxB,UAAU,EAAE,qBAAqB,GAChC,OAAO,CAAC;IACT,OAAO,EAAE,aAAa,CAAC;IACvB,WAAW,EAAE,YAAY,GAAG,aAAa,CAAC;CAC3C,CAAC,CAgED"}
package/dist/index.d.ts CHANGED
@@ -128,7 +128,7 @@ export declare function createEventSink(rawOptions: unknown, storage?: StoragePr
128
128
  readonly onWarn?: (message: string) => void;
129
129
  }): EventSink;
130
130
  export declare function isMissingFile(error: unknown): boolean;
131
- export declare function createCliDeps(config: OpenTeamConfig, registry: RuntimeRegistry, telemetryPath: string, sessionsDir?: string, storage?: StorageProvider, fallbackSource?: ConfigSource, rawOptions?: unknown, resolveOpencodeVersion?: () => Promise<string | undefined>): CliDeps;
131
+ export declare function createCliDeps(config: OpenTeamConfig, registry: RuntimeRegistry, telemetryPath: string, sessionsDir?: string, storage?: StorageProvider, fallbackSource?: ConfigSource, rawOptions?: unknown, resolveOpencodeVersion?: () => Promise<string | undefined>, workspaceRoot?: string): CliDeps;
132
132
  export declare const server: Plugin;
133
133
  declare const plugin: PluginModule;
134
134
  export { PACKAGE_VERSION } from "./version";
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}