@jmanuelcorral/openteam 0.10.0 → 0.12.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.
- package/AGENTS.md +1 -1
- package/README.es.md +8 -5
- package/README.md +16 -5
- package/dist/cli.js +539 -361
- package/dist/commands/dispatch.d.ts.map +1 -1
- package/dist/commands/local.d.ts +13 -0
- package/dist/commands/local.d.ts.map +1 -1
- package/dist/console/assets.d.ts +2 -2
- package/dist/console/assets.d.ts.map +1 -1
- package/dist/console/configView.d.ts +9 -2
- package/dist/console/configView.d.ts.map +1 -1
- package/dist/console/render.d.ts +16 -20
- package/dist/console/render.d.ts.map +1 -1
- package/dist/index.js +139 -80
- package/dist/messages/commands.d.ts +14 -2
- package/dist/messages/commands.d.ts.map +1 -1
- package/dist/orchestrator/coordinator.d.ts +0 -15
- package/dist/orchestrator/coordinator.d.ts.map +1 -1
- package/dist/web/graphRoute.d.ts +18 -0
- package/dist/web/graphRoute.d.ts.map +1 -1
- package/dist/web/server.d.ts.map +1 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dispatch.d.ts","sourceRoot":"","sources":["../../src/commands/dispatch.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,eAAe,EAErB,MAAM,4BAA4B,CAAC;AACpC,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;AACvE,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAOjE,OAAO,KAAK,EAAY,cAAc,EAAE,MAAM,kBAAkB,CAAC;AACjE,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"dispatch.d.ts","sourceRoot":"","sources":["../../src/commands/dispatch.ts"],"names":[],"mappings":"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"}
|
package/dist/commands/local.d.ts
CHANGED
|
@@ -1,6 +1,19 @@
|
|
|
1
1
|
import type { OpenTeamConfig } from "../config/schema";
|
|
2
2
|
import type { CommandOutcome } from "./types";
|
|
3
|
+
/**
|
|
4
|
+
* `openteam local <status|off|only|on>` commands: toggle global routing modes.
|
|
5
|
+
*
|
|
6
|
+
* - `off` enables `router.frontierOnly`: the team routes only to frontier models
|
|
7
|
+
* (useful when no local runtime is installed or reachable).
|
|
8
|
+
* - `only` enables `router.localOnly`: the team never escalates to frontier.
|
|
9
|
+
* - `on` disables both flags: normal local-first routing.
|
|
10
|
+
*
|
|
11
|
+
* Pure and deterministic: they take the config and return a new config (when it
|
|
12
|
+
* changes) plus a message. Persistence is the caller's responsibility.
|
|
13
|
+
*/
|
|
14
|
+
export declare function hasEnabledLocalRuntime(config: OpenTeamConfig): boolean;
|
|
3
15
|
export declare function showLocal(config: OpenTeamConfig): CommandOutcome;
|
|
4
16
|
export declare function setFrontierOnly(config: OpenTeamConfig): CommandOutcome;
|
|
17
|
+
export declare function setLocalOnly(config: OpenTeamConfig): CommandOutcome;
|
|
5
18
|
export declare function setLocalFirst(config: OpenTeamConfig): CommandOutcome;
|
|
6
19
|
//# sourceMappingURL=local.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"local.d.ts","sourceRoot":"","sources":["../../src/commands/local.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAEvD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"local.d.ts","sourceRoot":"","sources":["../../src/commands/local.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAEvD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAE9C;;;;;;;;;;GAUG;AAEH,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,cAAc,GAAG,OAAO,CAEtE;AAuBD,wBAAgB,SAAS,CAAC,MAAM,EAAE,cAAc,GAAG,cAAc,CAehE;AAED,wBAAgB,eAAe,CAAC,MAAM,EAAE,cAAc,GAAG,cAAc,CAoBtE;AAED,wBAAgB,YAAY,CAAC,MAAM,EAAE,cAAc,GAAG,cAAc,CAkBnE;AAED,wBAAgB,aAAa,CAAC,MAAM,EAAE,cAAc,GAAG,cAAc,CAcpE"}
|
package/dist/console/assets.d.ts
CHANGED
|
@@ -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:#0f1115;--panel:#171a21;--fg:#e6e8eb;--muted:#8b929c;--good:#3fb950;--local:#58a6ff;--frontier:#d29922;--line:#262b34}\n*{box-sizing:border-box}\nbody{margin:0;background:var(--bg);color:var(--fg);font:14px/1.5 ui-sans-serif,system-ui,Segoe UI,Roboto,sans-serif}\nheader{padding:16px 24px;border-bottom:1px solid var(--line);display:flex;justify-content:space-between;align-items:baseline;gap:12px;flex-wrap:wrap}\nheader h1{font-size:18px;margin:0}\nheader .meta{color:var(--muted);font-size:12px}\nmain{display:grid;grid-template-columns:repeat(auto-fit,minmax(320px,1fr));gap:16px;padding:24px}\n.panel{background:var(--panel);border:1px solid var(--line);border-radius:10px;padding:16px}\n.panel h2{font-size:14px;margin:0 0 12px;color:var(--muted);text-transform:uppercase;letter-spacing:.04em}\n.grid{display:grid;grid-template-columns:repeat(2,1fr);gap:10px}\n.stat{display:flex;flex-direction:column;gap:2px}\n.stat .k{color:var(--muted);font-size:12px}\n.stat .v{font-size:18px;font-weight:600}\n.good{color:var(--good)}\n.local{color:var(--local)}\n.frontier{color:var(--frontier)}\n.muted{color:var(--muted)}\ntable{width:100%;border-collapse:collapse;font-size:13px}\nth,td{text-align:left;padding:6px 8px;border-bottom:1px solid var(--line)}\nth{color:var(--muted);font-weight:600}\n.hash{font-family:ui-monospace,Consolas,monospace;color:var(--muted)}\n.progress{height:10px;background:#0b0d11;border-radius:6px;overflow:hidden;border:1px solid var(--line)}\n.progress .bar{height:100%;background:var(--good)}\nul.items,ul.timeline{list-style:none;margin:8px 0 0;padding:0;max-height:320px;overflow:auto}\nul.items li,ul.timeline li{padding:4px 0;border-bottom:1px solid var(--line)}\nul.items li.done{color:var(--muted)}\nul.items .box{font-family:monospace}\n.who{color:var(--local)}\n.tag{color:var(--frontier);font-size:12px}\n.kind{display:inline-block;min-width:66px;color:var(--muted);font-size:12px}\ncode{font-family:ui-monospace,Consolas,monospace;background:#0b0d11;padding:1px 5px;border-radius:4px}\n.mono{font-family:ui-monospace,Consolas,monospace;font-size:12px}\n.tabs{display:flex;gap:6px;padding:12px 24px 0;flex-wrap:wrap;border-bottom:1px solid var(--line)}\n.tabs .tab{background:var(--panel);color:var(--fg);border:1px solid var(--line);border-bottom:none;border-radius:8px 8px 0 0;padding:8px 14px;cursor:pointer;font:inherit;display:flex;align-items:center;gap:6px}\n.tabs .tab.active{background:var(--bg);border-color:var(--local);color:var(--fg)}\n.dot{width:8px;height:8px;border-radius:50%;display:inline-block;background:var(--muted)}\n.badge{font-size:11px;padding:1px 8px;border-radius:10px;border:1px solid var(--line);color:var(--muted);vertical-align:middle}\n.status-running{background:var(--good)}\n.badge.status-running{color:var(--good);border-color:var(--good)}\n.status-idle{background:var(--muted)}\n.badge.status-idle{color:var(--muted)}\n.status-waiting-input{background:var(--frontier)}\n.badge.status-waiting-input{color:var(--frontier);border-color:var(--frontier)}\n.status-ended{background:#6e7681}\n.badge.status-ended{color:#6e7681}\n.term .termlog{background:#0b0d11;border:1px solid var(--line);border-radius:8px;padding:10px;max-height:340px;overflow:auto;font-family:ui-monospace,Consolas,monospace;font-size:12px;white-space:pre-wrap}\n.term .tl{padding:1px 0}\n.term .tl.input{color:var(--local)}\n.term .tl.tool{color:var(--frontier)}\n.term .tl.status{color:var(--muted)}\n.term .tl.error{color:#f85149}\n.term .tl.permission{color:var(--frontier);font-weight:600}\n.term form.terminput{display:flex;gap:8px;margin-top:10px}\n.term form.terminput input{flex:1;background:#0b0d11;color:var(--fg);border:1px solid var(--line);border-radius:8px;padding:8px 10px;font:inherit}\n.term form.terminput button{background:var(--local);color:#04122b;border:none;border-radius:8px;padding:8px 16px;cursor:pointer;font:inherit;font-weight:600}\n.pty .ptylog{background:#05070a;border:1px solid var(--line);border-radius:8px;padding:10px;max-height:340px;overflow:auto;font-family:ui-monospace,Consolas,monospace;font-size:12px;white-space:pre-wrap;color:#c8d1dc}\n.pty form.ptyinput{display:flex;gap:8px;margin-top:10px}\n.pty form.ptyinput input{flex:1;background:#05070a;color:var(--fg);border:1px solid var(--line);border-radius:8px;padding:8px 10px;font:inherit}\n.pty form.ptyinput button,.pty .pty-start{background:var(--frontier);color:#1a1200;border:none;border-radius:8px;padding:8px 16px;cursor:pointer;font:inherit;font-weight:600;margin-top:8px}\n.pty .pty-start:disabled{opacity:.5;cursor:default}\n.config-panel{grid-column:1/-1}\n.config-form{display:flex;flex-direction:column;gap:12px}\n.config-note{margin:0;font-size:12px;color:var(--muted)}\n.config-note.config-overlay{color:var(--frontier)}\n.reload-legend h3,.config-summary h4{font-size:12px;margin:0 0 6px;color:var(--muted);text-transform:uppercase;letter-spacing:.04em}\n.reload-table{width:100%}\n.reload-table th{white-space:nowrap;vertical-align:top;width:1%}\n.reload-table th.reload-hot{color:var(--good)}\n.reload-table th.reload-restart{color:var(--frontier)}\n.config-label{font-size:12px;color:var(--muted)}\n.config-json{width:100%;min-height:280px;resize:vertical;background:#0b0d11;color:var(--fg);border:1px solid var(--line);border-radius:8px;padding:10px;font-family:ui-monospace,Consolas,monospace;font-size:12px;line-height:1.5}\n.config-actions{display:flex;gap:8px}\n.config-save{background:var(--good);color:#08110a;border:0;border-radius:8px;padding:8px 16px;font-weight:600;cursor:pointer}\n.config-save:disabled{opacity:.5;cursor:default}\n.config-result:empty{display:none}\n.config-summary{border:1px solid var(--line);border-radius:8px;padding:12px;margin-top:4px}\n.config-ok{margin:0 0 8px;color:var(--good);font-weight:600}\n.config-err{margin:0;color:var(--frontier);font-weight:600}\n.config-applied h4{color:var(--good)}\n.config-restart h4{color:var(--frontier)}\n.config-warn{margin:0 0 6px;color:var(--frontier);font-size:13px}\n.config-summary ul{margin:0;padding-left:18px}\n.config-summary li{padding:2px 0;border:0}\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}\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 .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,5 +13,5 @@ export declare const CONSOLE_STYLE = "\n:root{color-scheme:dark;--bg:#0f1115;--p
|
|
|
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()){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(){if(!configActive()){location.reload()}});\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 selectTab(name){\n var tabs=document.querySelectorAll('#tabbar .tab');\n for(var i=0;i<tabs.length;i++){tabs[i].classList.toggle('active',tabs[i].getAttribute('data-tab')===name)}\n var views=document.querySelectorAll('main .view');\n var matched=false;\n for(var j=0;j<views.length;j++){\n var show=views[j].getAttribute('data-view')===name;\n views[j].hidden=!show;\n if(show){matched=true;if(name==='config'){loadConfig(views[j])}else if(name!=='all'){connectTerminal(views[j],name)}}\n }\n if(!matched){return false}\n try{sessionStorage.setItem('openteam.tab',name)}catch(e){}\n return true;\n }\n function configActive(){\n var v=document.querySelector('main .view[data-view=\"config\"]');\n return !!(v&&!v.hidden);\n }\n function esc(s){return String(s).replace(/&/g,'&').replace(/</g,'<').replace(/>/g,'>')}\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('.view');\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 bar=document.getElementById('tabbar');\n if(bar){\n bar.addEventListener('click',function(e){\n var t=e.target;\n while(t&&t!==bar&&!t.getAttribute('data-tab')){t=t.parentNode}\n if(t&&t.getAttribute('data-tab')){selectTab(t.getAttribute('data-tab'))}\n });\n }\n var saved='all';\n try{saved=sessionStorage.getItem('openteam.tab')||'all'}catch(e){}\n if(!selectTab(saved)){selectTab('all')}\n wireGraphDrill();\n})();\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()){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(){if(!configActive()){location.reload()}});\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 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,'&').replace(/</g,'<').replace(/>/g,'>')}\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})();\n";
|
|
17
17
|
//# 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,
|
|
1
|
+
{"version":3,"file":"assets.d.ts","sourceRoot":"","sources":["../../src/console/assets.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,eAAO,MAAM,aAAa,27XA6BzB,CAAC;AAEF;;;;;;GAMG;AACH,eAAO,MAAM,WAAW,klFA4CvB,CAAC;AAEF,eAAO,MAAM,iBAAiB,4vXA2Q7B,CAAC"}
|
|
@@ -62,12 +62,19 @@ export declare function renderConfigEditorForm(read: ConfigReadView): string;
|
|
|
62
62
|
*/
|
|
63
63
|
export declare function renderConfigSaveSummary(write: ConfigWriteView): string;
|
|
64
64
|
/**
|
|
65
|
-
* The config
|
|
65
|
+
* The config editor panel embedded in the open `/` page. It carries NO config
|
|
66
66
|
* values (those travel only over the token-gated `/api/config`, preserving the
|
|
67
67
|
* auth posture): when a token is present the client fetches and mounts the form
|
|
68
|
-
* here; without a token the
|
|
68
|
+
* here; without a token the panel is honestly read-only rather than a form that
|
|
69
69
|
* would 401.
|
|
70
70
|
*/
|
|
71
|
+
export declare function renderConfigEditorPanel(opts: {
|
|
72
|
+
hasToken: boolean;
|
|
73
|
+
}): string;
|
|
74
|
+
/**
|
|
75
|
+
* Legacy wrapper retained for callers/tests that exercise the standalone config
|
|
76
|
+
* view shell. The main console now mounts the panel inside `#screen-config`.
|
|
77
|
+
*/
|
|
71
78
|
export declare function renderConfigView(opts: {
|
|
72
79
|
hasToken: boolean;
|
|
73
80
|
}): string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"configView.d.ts","sourceRoot":"","sources":["../../src/console/configView.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;GAgBG;AAEH,MAAM,MAAM,cAAc,GAAG;IAC3B,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;IACzB,QAAQ,CAAC,MAAM,EAAE;QACf,QAAQ,CAAC,aAAa,EAAE,SAAS,MAAM,EAAE,CAAC;QAC1C,QAAQ,CAAC,eAAe,EAAE,SAAS,MAAM,EAAE,CAAC;KAC7C,CAAC;IACF,QAAQ,CAAC,OAAO,EAAE;QAChB,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;QACzB,QAAQ,CAAC,mBAAmB,EAAE,SAAS,MAAM,EAAE,CAAC;KACjD,CAAC;IACF,QAAQ,CAAC,OAAO,EAAE,SAAS;QACzB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;QACrB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;QACxB,QAAQ,CAAC,GAAG,EAAE,OAAO,CAAC;KACvB,EAAE,CAAC;CACL,CAAC;AAEF,MAAM,MAAM,eAAe,GAAG;IAC5B,QAAQ,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,CAAC;IACpC,QAAQ,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,CAAC;IACpC,QAAQ,CAAC,cAAc,EAAE,SAAS,MAAM,EAAE,CAAC;IAC3C,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;IAC5B,QAAQ,CAAC,YAAY,EAAE,OAAO,CAAC;CAChC,CAAC;AAQF;;;;GAIG;AACH,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,cAAc,GAAG,MAAM,CAkBpE;AAED;;;;;;GAMG;AACH,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,cAAc,GAAG,MAAM,CA0BnE;AAED;;;;;;;GAOG;AACH,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,eAAe,GAAG,MAAM,CAkCtE;AAED;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE;IAAE,QAAQ,EAAE,OAAO,CAAA;CAAE,GAAG,MAAM,
|
|
1
|
+
{"version":3,"file":"configView.d.ts","sourceRoot":"","sources":["../../src/console/configView.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;GAgBG;AAEH,MAAM,MAAM,cAAc,GAAG;IAC3B,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;IACzB,QAAQ,CAAC,MAAM,EAAE;QACf,QAAQ,CAAC,aAAa,EAAE,SAAS,MAAM,EAAE,CAAC;QAC1C,QAAQ,CAAC,eAAe,EAAE,SAAS,MAAM,EAAE,CAAC;KAC7C,CAAC;IACF,QAAQ,CAAC,OAAO,EAAE;QAChB,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;QACzB,QAAQ,CAAC,mBAAmB,EAAE,SAAS,MAAM,EAAE,CAAC;KACjD,CAAC;IACF,QAAQ,CAAC,OAAO,EAAE,SAAS;QACzB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;QACrB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;QACxB,QAAQ,CAAC,GAAG,EAAE,OAAO,CAAC;KACvB,EAAE,CAAC;CACL,CAAC;AAEF,MAAM,MAAM,eAAe,GAAG;IAC5B,QAAQ,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,CAAC;IACpC,QAAQ,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,CAAC;IACpC,QAAQ,CAAC,cAAc,EAAE,SAAS,MAAM,EAAE,CAAC;IAC3C,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;IAC5B,QAAQ,CAAC,YAAY,EAAE,OAAO,CAAC;CAChC,CAAC;AAQF;;;;GAIG;AACH,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,cAAc,GAAG,MAAM,CAkBpE;AAED;;;;;;GAMG;AACH,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,cAAc,GAAG,MAAM,CA0BnE;AAED;;;;;;;GAOG;AACH,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,eAAe,GAAG,MAAM,CAkCtE;AAED;;;;;;GAMG;AACH,wBAAgB,uBAAuB,CAAC,IAAI,EAAE;IAAE,QAAQ,EAAE,OAAO,CAAA;CAAE,GAAG,MAAM,CAa3E;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE;IAAE,QAAQ,EAAE,OAAO,CAAA;CAAE,GAAG,MAAM,CAMpE"}
|
package/dist/console/render.d.ts
CHANGED
|
@@ -17,46 +17,42 @@ export declare function renderGraphView(projection: GraphViewProjectionV1 | null
|
|
|
17
17
|
disabled?: boolean;
|
|
18
18
|
}): string;
|
|
19
19
|
export type RenderOptions = {
|
|
20
|
-
/**
|
|
20
|
+
/** Polling fallback in milliseconds (default 2000). */
|
|
21
21
|
refreshMs?: number;
|
|
22
|
-
/**
|
|
22
|
+
/** Ephemeral console token for terminal, drill-down, and config actions. */
|
|
23
23
|
consoleToken?: string;
|
|
24
|
-
/**
|
|
24
|
+
/** Enables the per-session terminal widget in the logs screen. */
|
|
25
25
|
terminalEnabled?: boolean;
|
|
26
|
-
/**
|
|
26
|
+
/** Enables the real PTY terminal widget. Opt-in. */
|
|
27
27
|
ptyEnabled?: boolean;
|
|
28
28
|
/**
|
|
29
|
-
*
|
|
30
|
-
*
|
|
31
|
-
*
|
|
32
|
-
* run activo).
|
|
29
|
+
* Enables the rendered graph inside the agent-tree screen (GE-083).
|
|
30
|
+
* `projection` is the reference-only graph view, or `null` when no run is
|
|
31
|
+
* active.
|
|
33
32
|
*/
|
|
34
33
|
graphView?: {
|
|
35
34
|
readonly projection: GraphViewProjectionV1 | null;
|
|
36
35
|
/**
|
|
37
|
-
* `true`
|
|
38
|
-
*
|
|
39
|
-
* vista se comporta como GE-083.
|
|
36
|
+
* `true` when the graph is disabled by config (`graph.mode` == `off`): the
|
|
37
|
+
* tree screen renders remediation guidance instead of the DAG.
|
|
40
38
|
*/
|
|
41
39
|
readonly disabled?: boolean;
|
|
42
40
|
};
|
|
43
41
|
/**
|
|
44
|
-
*
|
|
45
|
-
*
|
|
46
|
-
*
|
|
47
|
-
* es idéntica a GE-083.
|
|
42
|
+
* Enables read-only node-to-conversation drill-down (GE-084). Only has an
|
|
43
|
+
* effect with `graphView`: adds the conversation panel and the `data-drilldown`
|
|
44
|
+
* marker used by the client.
|
|
48
45
|
*/
|
|
49
46
|
drilldownEnabled?: boolean;
|
|
50
47
|
/**
|
|
51
|
-
* `true`
|
|
52
|
-
*
|
|
53
|
-
* aviso visible. Off por defecto: sin él la salida es byte-idéntica a hoy.
|
|
48
|
+
* `true` when the operator enabled local diagnostic mode (P11b): drill-down
|
|
49
|
+
* read routes may serve verbatim text. Renders a visible warning banner.
|
|
54
50
|
*/
|
|
55
51
|
diagnosticActive?: boolean;
|
|
56
52
|
/**
|
|
57
53
|
* Config editor surface (W7-S09 / #193, Gap 2). Opt-in: when present, the
|
|
58
|
-
*
|
|
59
|
-
* console token via `data-config`/`data-token` so it can fetch and save
|
|
54
|
+
* Configuration screen mounts an editor placeholder and the client is handed
|
|
55
|
+
* the console token via `data-config`/`data-token` so it can fetch and save
|
|
60
56
|
* against the token-gated `/api/config`. `hasToken` is `false` only in the
|
|
61
57
|
* degenerate case where the editor is mounted without a token, which renders
|
|
62
58
|
* an honest read-only view instead of a form that would 401.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"render.d.ts","sourceRoot":"","sources":["../../src/console/render.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAGV,qBAAqB,EACtB,MAAM,wBAAwB,CAAC;
|
|
1
|
+
{"version":3,"file":"render.d.ts","sourceRoot":"","sources":["../../src/console/render.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAGV,qBAAqB,EACtB,MAAM,wBAAwB,CAAC;AAKhC,OAAO,KAAK,EAGV,YAAY,EAIb,MAAM,SAAS,CAAC;AASjB,mFAAmF;AACnF,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAOhD;AAwmBD;;;;;;;;;;GAUG;AACH,wBAAgB,eAAe,CAC7B,UAAU,EAAE,qBAAqB,GAAG,IAAI,EACxC,OAAO,GAAE;IAAE,QAAQ,CAAC,EAAE,OAAO,CAAA;CAAO,GACnC,MAAM,CA2BR;AA+KD,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;;;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;CAC/C,CAAC;AAEF;;;;GAIG;AACH,wBAAgB,iBAAiB,CAC/B,KAAK,EAAE,YAAY,EACnB,OAAO,GAAE,aAAkB,GAC1B,MAAM,CA8FR"}
|
package/dist/index.js
CHANGED
|
@@ -6455,6 +6455,13 @@ var FAILURE_CAUSE_RULES = [
|
|
|
6455
6455
|
"prompt-server"
|
|
6456
6456
|
]
|
|
6457
6457
|
];
|
|
6458
|
+
var TIMEOUT_NEEDLES = [
|
|
6459
|
+
"timed out",
|
|
6460
|
+
"timeout",
|
|
6461
|
+
"timedout",
|
|
6462
|
+
"etimedout",
|
|
6463
|
+
"deadline exceeded"
|
|
6464
|
+
];
|
|
6458
6465
|
function matchFailureCause(lowerReason) {
|
|
6459
6466
|
for (const [needles, cls] of FAILURE_CAUSE_RULES) {
|
|
6460
6467
|
if (needles.some((needle) => lowerReason.includes(needle))) {
|
|
@@ -6465,7 +6472,7 @@ function matchFailureCause(lowerReason) {
|
|
|
6465
6472
|
}
|
|
6466
6473
|
function classifyFailureForTelemetry(failureReason, failureStage) {
|
|
6467
6474
|
const lower = failureReason.toLowerCase();
|
|
6468
|
-
if (
|
|
6475
|
+
if (TIMEOUT_NEEDLES.some((needle) => lower.includes(needle))) {
|
|
6469
6476
|
return "prompt-timeout";
|
|
6470
6477
|
}
|
|
6471
6478
|
if (lower.includes("did not include a session id") || lower.includes("missing session")) {
|
|
@@ -7177,6 +7184,84 @@ function activityEventFrom(event, now) {
|
|
|
7177
7184
|
// src/plugin/commandTool.ts
|
|
7178
7185
|
import { tool } from "@opencode-ai/plugin";
|
|
7179
7186
|
|
|
7187
|
+
// src/messages/commands.ts
|
|
7188
|
+
var clearCacheMessages = {
|
|
7189
|
+
header: "openteam clear-cache — frozen plugin cache entries:",
|
|
7190
|
+
columns: {
|
|
7191
|
+
specDir: "spec dir",
|
|
7192
|
+
pinned: "spec-pinned",
|
|
7193
|
+
installed: "installed",
|
|
7194
|
+
mtime: "mtime"
|
|
7195
|
+
},
|
|
7196
|
+
reparseSkipSuffix: " [SKIP — reparse point]",
|
|
7197
|
+
deletedLabel: "deleted.",
|
|
7198
|
+
lockedLabel: (message) => `[LOCKED] ${message}`,
|
|
7199
|
+
pathOutsideWarning: (specDir, absolutePath) => ` ⚠ ${specDir}: path outside cacheRoot (${absolutePath}), skipped.`,
|
|
7200
|
+
processed: (count) => `${count} entry(ies) processed.`,
|
|
7201
|
+
found: (count) => `${count} entry(ies) found. Use --delete to remove them.`
|
|
7202
|
+
};
|
|
7203
|
+
var baselineMessages = {
|
|
7204
|
+
effectiveAuto: "cheapest-capable (auto)",
|
|
7205
|
+
pinnedSuffix: (ref) => `${ref} (pinned)`,
|
|
7206
|
+
summary: (params) => [
|
|
7207
|
+
"openteam baseline:",
|
|
7208
|
+
` mode: ${params.mode}`,
|
|
7209
|
+
` pinned: ${params.pinned}`,
|
|
7210
|
+
` hardDefault: ${params.hardDefault}`,
|
|
7211
|
+
` effective: ${params.effective}`
|
|
7212
|
+
],
|
|
7213
|
+
invalidModel: (input) => `Invalid model "${input}". Use the provider/model format, e.g. anthropic/claude-sonnet-4-5.`,
|
|
7214
|
+
pinnedTo: (ref) => `Baseline pinned to ${ref} (pinned mode).`,
|
|
7215
|
+
autoMode: "Baseline set to auto mode (cheapest-capable)."
|
|
7216
|
+
};
|
|
7217
|
+
var localMessages = {
|
|
7218
|
+
help: {
|
|
7219
|
+
status: " openteam local status Show the routing mode (local-first / local-only / frontier-only)",
|
|
7220
|
+
off: " openteam local off Use frontier models only (no local runtime)",
|
|
7221
|
+
only: " openteam local only Use local models only (never frontier)",
|
|
7222
|
+
on: " openteam local on Re-enable local-first routing"
|
|
7223
|
+
},
|
|
7224
|
+
noRuntimes: "none",
|
|
7225
|
+
modeFrontierOnly: "frontier-only (frontierOnly)",
|
|
7226
|
+
modeLocalOnly: "local-only (localOnly)",
|
|
7227
|
+
modeLocalFirst: "local-first",
|
|
7228
|
+
summary: (params) => [
|
|
7229
|
+
"openteam local:",
|
|
7230
|
+
` mode: ${params.mode}`,
|
|
7231
|
+
` frontierOnly: ${params.frontierOnly}`,
|
|
7232
|
+
` localOnly: ${params.localOnly}`,
|
|
7233
|
+
` privacy: ${params.privacy}`,
|
|
7234
|
+
` runtimes: ${params.runtimes}`
|
|
7235
|
+
],
|
|
7236
|
+
frontierOnlyNoChange: "No change: already in frontier-only mode.",
|
|
7237
|
+
privacyAdjustedNote: " Privacy adjusted to 'consentBeforeFrontier' (forceLocalOnSensitive requires a local runtime).",
|
|
7238
|
+
frontierOnlyEnabled: "Frontier-only mode enabled (frontierOnly=true, localOnly=false).",
|
|
7239
|
+
localOnlyNoRuntimes: "Cannot enable local-only mode: no enabled local runtime is configured. Run 'openteam setup' or enable a local runtime in .opencode/openteam.json first.",
|
|
7240
|
+
localOnlyNoChange: "No change: already in local-only mode.",
|
|
7241
|
+
localOnlyEnabled: "Local-only mode enabled (localOnly=true, frontierOnly=false).",
|
|
7242
|
+
localFirstNoChange: "No change: local-first routing is already active.",
|
|
7243
|
+
localFirstReEnabled: "Local-first routing re-enabled (frontierOnly=false, localOnly=false). Make sure a local runtime is reachable.",
|
|
7244
|
+
unknownSubcommand: (subcommand, help) => `Unknown local subcommand: ${subcommand}
|
|
7245
|
+
|
|
7246
|
+
${help}`
|
|
7247
|
+
};
|
|
7248
|
+
var migrateMessages = {
|
|
7249
|
+
header: "openteam migrate:",
|
|
7250
|
+
nothingToMigrate: " nothing to migrate — the P15b layout is already in place.",
|
|
7251
|
+
counts: (params) => [
|
|
7252
|
+
` moved: ${params.moved} file(s)`,
|
|
7253
|
+
` deduped: ${params.deduped} file(s) (destination already identical)`,
|
|
7254
|
+
` conflicts: ${params.conflicts} file(s)`
|
|
7255
|
+
],
|
|
7256
|
+
relocatedHeader: " relocated:",
|
|
7257
|
+
relocatedEntry: (from, to, deduped) => ` · ${from} → ${to}${deduped ? " (deduped)" : ""}`,
|
|
7258
|
+
conflictsHeader: " ⚠ left in place (destination exists with different content — no data lost):",
|
|
7259
|
+
conflictEntry: (from, to) => ` · ${from} → ${to}`,
|
|
7260
|
+
manualWorktreesHeader: " ⚠ legacy git worktree(s) need a manual move (run `git worktree move`):",
|
|
7261
|
+
manualWorktreeEntry: (label, from, to) => ` · ${label}: ${from} → ${to}`,
|
|
7262
|
+
success: " ✓ machine-local runtime output relocated under .opencode/openteam-local/."
|
|
7263
|
+
};
|
|
7264
|
+
|
|
7180
7265
|
// src/orchestrator/worktreeReconciler.ts
|
|
7181
7266
|
function planOne(wt) {
|
|
7182
7267
|
const base = { runID: wt.runID, path: wt.path };
|
|
@@ -7730,70 +7815,6 @@ function diagnoseAgentModels(files, context) {
|
|
|
7730
7815
|
});
|
|
7731
7816
|
}
|
|
7732
7817
|
|
|
7733
|
-
// src/messages/commands.ts
|
|
7734
|
-
var clearCacheMessages = {
|
|
7735
|
-
header: "openteam clear-cache — frozen plugin cache entries:",
|
|
7736
|
-
columns: {
|
|
7737
|
-
specDir: "spec dir",
|
|
7738
|
-
pinned: "spec-pinned",
|
|
7739
|
-
installed: "installed",
|
|
7740
|
-
mtime: "mtime"
|
|
7741
|
-
},
|
|
7742
|
-
reparseSkipSuffix: " [SKIP — reparse point]",
|
|
7743
|
-
deletedLabel: "deleted.",
|
|
7744
|
-
lockedLabel: (message) => `[LOCKED] ${message}`,
|
|
7745
|
-
pathOutsideWarning: (specDir, absolutePath) => ` ⚠ ${specDir}: path outside cacheRoot (${absolutePath}), skipped.`,
|
|
7746
|
-
processed: (count) => `${count} entry(ies) processed.`,
|
|
7747
|
-
found: (count) => `${count} entry(ies) found. Use --delete to remove them.`
|
|
7748
|
-
};
|
|
7749
|
-
var baselineMessages = {
|
|
7750
|
-
effectiveAuto: "cheapest-capable (auto)",
|
|
7751
|
-
pinnedSuffix: (ref) => `${ref} (pinned)`,
|
|
7752
|
-
summary: (params) => [
|
|
7753
|
-
"openteam baseline:",
|
|
7754
|
-
` mode: ${params.mode}`,
|
|
7755
|
-
` pinned: ${params.pinned}`,
|
|
7756
|
-
` hardDefault: ${params.hardDefault}`,
|
|
7757
|
-
` effective: ${params.effective}`
|
|
7758
|
-
],
|
|
7759
|
-
invalidModel: (input) => `Invalid model "${input}". Use the provider/model format, e.g. anthropic/claude-sonnet-4-5.`,
|
|
7760
|
-
pinnedTo: (ref) => `Baseline pinned to ${ref} (pinned mode).`,
|
|
7761
|
-
autoMode: "Baseline set to auto mode (cheapest-capable)."
|
|
7762
|
-
};
|
|
7763
|
-
var localMessages = {
|
|
7764
|
-
noRuntimes: "none",
|
|
7765
|
-
modeFrontierOnly: "frontier-only (frontierOnly)",
|
|
7766
|
-
modeLocalFirst: "local-first",
|
|
7767
|
-
summary: (params) => [
|
|
7768
|
-
"openteam local:",
|
|
7769
|
-
` mode: ${params.mode}`,
|
|
7770
|
-
` frontierOnly: ${params.frontierOnly}`,
|
|
7771
|
-
` privacy: ${params.privacy}`,
|
|
7772
|
-
` runtimes: ${params.runtimes}`
|
|
7773
|
-
],
|
|
7774
|
-
frontierOnlyNoChange: "No change: already in frontier-only mode.",
|
|
7775
|
-
privacyAdjustedNote: " Privacy adjusted to 'consentBeforeFrontier' (forceLocalOnSensitive requires a local runtime).",
|
|
7776
|
-
frontierOnlyEnabled: "Frontier-only mode enabled (frontierOnly=true).",
|
|
7777
|
-
localFirstNoChange: "No change: local-first routing is already active.",
|
|
7778
|
-
localFirstReEnabled: "Local-first routing re-enabled (frontierOnly=false). Make sure a local runtime is reachable."
|
|
7779
|
-
};
|
|
7780
|
-
var migrateMessages = {
|
|
7781
|
-
header: "openteam migrate:",
|
|
7782
|
-
nothingToMigrate: " nothing to migrate — the P15b layout is already in place.",
|
|
7783
|
-
counts: (params) => [
|
|
7784
|
-
` moved: ${params.moved} file(s)`,
|
|
7785
|
-
` deduped: ${params.deduped} file(s) (destination already identical)`,
|
|
7786
|
-
` conflicts: ${params.conflicts} file(s)`
|
|
7787
|
-
],
|
|
7788
|
-
relocatedHeader: " relocated:",
|
|
7789
|
-
relocatedEntry: (from, to, deduped) => ` · ${from} → ${to}${deduped ? " (deduped)" : ""}`,
|
|
7790
|
-
conflictsHeader: " ⚠ left in place (destination exists with different content — no data lost):",
|
|
7791
|
-
conflictEntry: (from, to) => ` · ${from} → ${to}`,
|
|
7792
|
-
manualWorktreesHeader: " ⚠ legacy git worktree(s) need a manual move (run `git worktree move`):",
|
|
7793
|
-
manualWorktreeEntry: (label, from, to) => ` · ${label}: ${from} → ${to}`,
|
|
7794
|
-
success: " ✓ machine-local runtime output relocated under .opencode/openteam-local/."
|
|
7795
|
-
};
|
|
7796
|
-
|
|
7797
7818
|
// src/commands/baseline.ts
|
|
7798
7819
|
function formatRef(ref) {
|
|
7799
7820
|
return ref === null ? "—" : `${ref.providerID}/${ref.modelID}`;
|
|
@@ -8310,6 +8331,9 @@ function renderWorktreeReconciliation(report) {
|
|
|
8310
8331
|
}
|
|
8311
8332
|
|
|
8312
8333
|
// src/commands/local.ts
|
|
8334
|
+
function hasEnabledLocalRuntime(config) {
|
|
8335
|
+
return config.local.runtimes.some((runtime) => runtime.enabled);
|
|
8336
|
+
}
|
|
8313
8337
|
function enabledRuntimesSummary(config) {
|
|
8314
8338
|
const enabled = config.local.runtimes.filter((runtime) => runtime.enabled);
|
|
8315
8339
|
if (enabled.length === 0) {
|
|
@@ -8322,10 +8346,11 @@ function enabledRuntimesSummary(config) {
|
|
|
8322
8346
|
}).join(", ");
|
|
8323
8347
|
}
|
|
8324
8348
|
function showLocal(config) {
|
|
8325
|
-
const mode = config.router.frontierOnly ? localMessages.modeFrontierOnly : localMessages.modeLocalFirst;
|
|
8349
|
+
const mode = config.router.localOnly ? localMessages.modeLocalOnly : config.router.frontierOnly ? localMessages.modeFrontierOnly : localMessages.modeLocalFirst;
|
|
8326
8350
|
const lines = localMessages.summary({
|
|
8327
8351
|
mode,
|
|
8328
8352
|
frontierOnly: config.router.frontierOnly,
|
|
8353
|
+
localOnly: config.router.localOnly,
|
|
8329
8354
|
privacy: config.privacyMode,
|
|
8330
8355
|
runtimes: enabledRuntimesSummary(config)
|
|
8331
8356
|
});
|
|
@@ -8333,13 +8358,13 @@ function showLocal(config) {
|
|
|
8333
8358
|
`) };
|
|
8334
8359
|
}
|
|
8335
8360
|
function setFrontierOnly(config) {
|
|
8336
|
-
if (config.router.frontierOnly) {
|
|
8361
|
+
if (config.router.frontierOnly && !config.router.localOnly) {
|
|
8337
8362
|
return { message: localMessages.frontierOnlyNoChange };
|
|
8338
8363
|
}
|
|
8339
8364
|
const flipsPrivacy = config.privacyMode === "forceLocalOnSensitive";
|
|
8340
8365
|
const next = {
|
|
8341
8366
|
...config,
|
|
8342
|
-
router: { ...config.router, frontierOnly: true },
|
|
8367
|
+
router: { ...config.router, frontierOnly: true, localOnly: false },
|
|
8343
8368
|
privacyMode: flipsPrivacy ? "consentBeforeFrontier" : config.privacyMode
|
|
8344
8369
|
};
|
|
8345
8370
|
const privacyNote = flipsPrivacy ? localMessages.privacyAdjustedNote : "";
|
|
@@ -8348,13 +8373,29 @@ function setFrontierOnly(config) {
|
|
|
8348
8373
|
message: `${localMessages.frontierOnlyEnabled}${privacyNote}`
|
|
8349
8374
|
};
|
|
8350
8375
|
}
|
|
8376
|
+
function setLocalOnly(config) {
|
|
8377
|
+
if (!hasEnabledLocalRuntime(config)) {
|
|
8378
|
+
return { message: localMessages.localOnlyNoRuntimes };
|
|
8379
|
+
}
|
|
8380
|
+
if (config.router.localOnly && !config.router.frontierOnly) {
|
|
8381
|
+
return { message: localMessages.localOnlyNoChange };
|
|
8382
|
+
}
|
|
8383
|
+
const next = {
|
|
8384
|
+
...config,
|
|
8385
|
+
router: { ...config.router, frontierOnly: false, localOnly: true }
|
|
8386
|
+
};
|
|
8387
|
+
return {
|
|
8388
|
+
config: next,
|
|
8389
|
+
message: localMessages.localOnlyEnabled
|
|
8390
|
+
};
|
|
8391
|
+
}
|
|
8351
8392
|
function setLocalFirst(config) {
|
|
8352
|
-
if (!config.router.frontierOnly) {
|
|
8393
|
+
if (!config.router.frontierOnly && !config.router.localOnly) {
|
|
8353
8394
|
return { message: localMessages.localFirstNoChange };
|
|
8354
8395
|
}
|
|
8355
8396
|
const next = {
|
|
8356
8397
|
...config,
|
|
8357
|
-
router: { ...config.router, frontierOnly: false }
|
|
8398
|
+
router: { ...config.router, frontierOnly: false, localOnly: false }
|
|
8358
8399
|
};
|
|
8359
8400
|
return {
|
|
8360
8401
|
config: next,
|
|
@@ -9195,9 +9236,10 @@ var HELP = [
|
|
|
9195
9236
|
" openteam baseline show Show the effective baseline",
|
|
9196
9237
|
" openteam baseline set <p/model> Pin the baseline (pinned mode)",
|
|
9197
9238
|
" openteam baseline auto Cheapest-capable baseline (auto mode)",
|
|
9198
|
-
|
|
9199
|
-
|
|
9200
|
-
|
|
9239
|
+
localMessages.help.status,
|
|
9240
|
+
localMessages.help.off,
|
|
9241
|
+
localMessages.help.only,
|
|
9242
|
+
localMessages.help.on,
|
|
9201
9243
|
" openteam doctor Diagnose runtimes and config",
|
|
9202
9244
|
" openteam roles init Compose per-role routing policy for unprofiled roster roles",
|
|
9203
9245
|
" openteam migrate Relocate pre-P15b artifacts to their split homes (idempotent)",
|
|
@@ -9368,23 +9410,40 @@ ${HELP}`
|
|
|
9368
9410
|
}
|
|
9369
9411
|
async function runLocal(positionals, deps, configPath, configResolution) {
|
|
9370
9412
|
const sub = positionals[1] ?? "status";
|
|
9371
|
-
if (sub !== "status" && sub !== "off" && sub !== "on") {
|
|
9413
|
+
if (sub !== "status" && sub !== "off" && sub !== "only" && sub !== "on") {
|
|
9372
9414
|
return {
|
|
9373
9415
|
exitCode: 1,
|
|
9374
|
-
stdout:
|
|
9375
|
-
|
|
9376
|
-
${HELP}`
|
|
9416
|
+
stdout: localMessages.unknownSubcommand(sub, HELP)
|
|
9377
9417
|
};
|
|
9378
9418
|
}
|
|
9379
9419
|
const config = await deps.loadConfig(configPath, configResolution);
|
|
9380
9420
|
if (sub === "status") {
|
|
9381
9421
|
return { exitCode: 0, stdout: showLocal(config).message };
|
|
9382
9422
|
}
|
|
9383
|
-
|
|
9423
|
+
let outcome;
|
|
9424
|
+
switch (sub) {
|
|
9425
|
+
case "off":
|
|
9426
|
+
outcome = setFrontierOnly(config);
|
|
9427
|
+
break;
|
|
9428
|
+
case "only":
|
|
9429
|
+
outcome = setLocalOnly(config);
|
|
9430
|
+
break;
|
|
9431
|
+
case "on":
|
|
9432
|
+
outcome = setLocalFirst(config);
|
|
9433
|
+
break;
|
|
9434
|
+
default:
|
|
9435
|
+
return {
|
|
9436
|
+
exitCode: 1,
|
|
9437
|
+
stdout: localMessages.unknownSubcommand(sub, HELP)
|
|
9438
|
+
};
|
|
9439
|
+
}
|
|
9384
9440
|
if (outcome.config !== undefined) {
|
|
9385
9441
|
await deps.saveConfig(outcome.config, configPath, configResolution);
|
|
9386
9442
|
}
|
|
9387
|
-
return {
|
|
9443
|
+
return {
|
|
9444
|
+
exitCode: sub === "only" && !hasEnabledLocalRuntime(config) ? 1 : 0,
|
|
9445
|
+
stdout: outcome.message
|
|
9446
|
+
};
|
|
9388
9447
|
}
|
|
9389
9448
|
async function runYolo(positionals, deps, opencodeConfigPaths) {
|
|
9390
9449
|
const sub = positionals[1] ?? "status";
|
|
@@ -12970,7 +13029,7 @@ var createOtlpSpanExporter = (connection, config) => {
|
|
|
12970
13029
|
// package.json
|
|
12971
13030
|
var package_default = {
|
|
12972
13031
|
name: "@jmanuelcorral/openteam",
|
|
12973
|
-
version: "0.
|
|
13032
|
+
version: "0.12.0",
|
|
12974
13033
|
packageManager: "bun@1.3.14",
|
|
12975
13034
|
description: "Cost-aware, local-first routing plugin for opencode with cheapest-capable frontier fallback and multi-agent orchestration.",
|
|
12976
13035
|
license: "MIT",
|