toc-ocra 0.2.12 → 0.2.14

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/README.md CHANGED
@@ -23,7 +23,7 @@ node dist/src/index.js run
23
23
 
24
24
  ## 桌面插件「设备代理」
25
25
 
26
- 同一个 npm 包也是 Echo 桌面插件 `echo.device-agent`(`package.json › tocPlugin`,界面源码在 `plugin/`,构建产物 `dist/plugin/renderer.js`)。页面分两个页签:
26
+ 同一个 npm 包也是 Echo 桌面插件 `echo.device-agent`(`package.json › tocPlugin`,界面源码在 `plugin/`,构建产物 `dist/plugin/renderer.js`)。页面分三个页签:
27
27
 
28
28
  **本机**(一键启用 / 关闭)
29
29
 
@@ -40,11 +40,17 @@ node dist/src/index.js run
40
40
  3. 「接收任务」开关调用 `PUT /api/devices/:id/enabled`:关闭即停用,保留配对、不再派发任务,重新打开立即恢复,不需要操作那台电脑。彻底卸载在那台电脑执行 `toc-ocra service:uninstall`。
41
41
  4. 服务器地址必须能被那台电脑访问,填 `127.0.0.1` / `localhost` 时插件会提示。
42
42
 
43
+ **TB Switch**(跨设备切换已配置项)
44
+
45
+ 1. 在页面上方选择工作空间中的设备;插件会记住每个工作空间上次选择的设备。
46
+ 2. 选择 Codex、Claude Code 或 Gemini CLI,查看并切换该设备上已配置的供应商模式、供应商或默认路由。
47
+ 3. 只允许设备所有者或工作空间管理员修改;离线、未配对或已暂停的设备显示状态并禁用操作。插件不负责安装或编辑供应商与路由。
48
+
43
49
  插件通过 `http://127.0.0.1:17339` 连接本机服务;手动启动的服务仍用 6 位连接码(`toc-ocra code` 查看)换取控制令牌。
44
50
 
45
51
  本机控制接口(`/control/*`)只接受 `127.0.0.1` / `localhost` 的 Host 和来源,除 `info`、`pair` 外都要 `Authorization: Bearer <控制令牌>`。控制令牌保存在数据目录的 `control-token`(0600),连接码在 `connection-code`(0600,使用后或连续输错 5 次后更换)。
46
52
 
47
- 发布:`./publish-latest.sh`(或 `npm run publish:latest`)。脚本会构建、校验插件包,本地版本不高于 npm 上的版本时自动升一个补丁号,再发布到 npm;npm 令牌在终端里输入,或通过环境变量 `NPM_TOKEN` 传入。管理员在「系统管理 › 插件目录」收录包名 `toc-ocra` 并批准版本后,用户即可在插件市场安装。
53
+ 发布:`./publish-latest.sh`(或 `npm run publish:latest`)。脚本会先校验 npm 身份,再构建、校验插件包;本地版本不高于 npm 上的版本时自动升一个补丁号,再发布到 npm 的 `latest`。可复用 `npm login` 的登录状态,也可在终端输入令牌,或通过环境变量 `NPM_TOKEN` 传入;显式传入的令牌仅写入临时认证文件,退出时删除,认证失败时不会继续构建和发布。管理员在「系统管理 › 插件目录」收录包名 `toc-ocra` 并批准版本后,用户即可在插件市场安装。
48
54
 
49
55
  ## 配置
50
56
 
@@ -1,2 +1,2 @@
1
- .da-app{--da-border: var(--border, rgba(127, 127, 127, .25));--da-muted: var(--muted, #888);--da-danger: var(--danger, #dc2626);display:grid;gap:12px;padding:20px 24px 40px;max-width:880px;color:var(--text)}.da-app>*{min-width:0}.da-text{margin:6px 0 10px;font-size:13px;line-height:1.6}.da-muted{margin:6px 0 0;font-size:12px;line-height:1.6;color:var(--da-muted)}.da-step{margin:10px 0 6px;font-size:12px;font-weight:600}.da-mono{font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:12px;word-break:break-all}.da-row{display:flex;flex-wrap:wrap;gap:8px;align-items:center;margin-top:10px}.da-command{display:flex;gap:8px;align-items:center}.da-command code{flex:1;min-width:0;overflow-x:auto;white-space:nowrap;padding:7px 10px;border:1px solid var(--da-border);border-radius:var(--radius-md, 8px);font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:12px}.da-code-input{width:160px;letter-spacing:.3em;font-family:ui-monospace,SFMono-Regular,Menlo,monospace}.da-alert{padding:8px 12px;border:1px solid var(--da-danger);border-radius:var(--radius-md, 8px);color:var(--da-danger);font-size:12.5px}.da-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(200px,1fr));gap:10px 16px;margin:8px 0 0}.da-grid dt{font-size:11.5px;color:var(--da-muted)}.da-grid dd{margin:3px 0 0;font-size:13px}.da-list{list-style:none;margin:8px 0 0;padding:0;display:grid;gap:6px}.da-list li{display:flex;gap:10px;align-items:center;font-size:13px}.da-field{display:grid;gap:4px;margin-top:10px;font-size:12px}.da-field>span{color:var(--da-muted)}.da-select{height:32px;padding:0 8px;border:1px solid var(--da-border);border-radius:var(--radius-md, 8px);background:transparent;color:inherit;font:inherit;font-size:13px}.da-tabs{display:flex;gap:4px;border-bottom:1px solid var(--da-border)}.da-tab{padding:7px 14px;border:0;border-bottom:2px solid transparent;background:transparent;color:var(--da-muted);font:inherit;font-size:13px;cursor:pointer}.da-tab:hover{color:var(--text)}.da-tab-active{color:var(--text);border-bottom-color:var(--accent, currentColor);font-weight:600}.da-tab:focus-visible,.da-seg:focus-visible{outline:2px solid var(--accent, currentColor);outline-offset:2px}.da-switch{display:flex;gap:16px;align-items:flex-start;justify-content:space-between}.da-switch>div{min-width:0}.da-warn{color:var(--warn, #b45309)}.da-form{display:grid;gap:2px;margin-top:6px;max-width:420px}.da-devices{list-style:none;margin:8px 0 0;padding:0;display:grid;gap:2px}.da-devices li{display:flex;flex-wrap:wrap;gap:10px;align-items:center;padding:8px 0;border-bottom:1px solid var(--da-border)}.da-devices li:last-child{border-bottom:0}.da-device-main{display:grid;gap:2px;flex:1;min-width:160px}.da-device-main .da-muted{margin:0}.da-device-name{font-size:13px;font-weight:600}.da-device-actions{display:flex;gap:10px;align-items:center}.da-toggle{display:flex;gap:6px;align-items:center;font-size:12px;color:var(--da-muted)}.da-segment{display:inline-flex;margin:4px 0 10px;border:1px solid var(--da-border);border-radius:var(--radius-md, 8px);overflow:hidden}.da-seg{padding:5px 12px;border:0;background:transparent;color:var(--da-muted);font:inherit;font-size:12px;cursor:pointer}.da-seg+.da-seg{border-left:1px solid var(--da-border)}.da-seg-active{background:var(--bg-elevated, rgba(127, 127, 127, .12));color:var(--text);font-weight:600}.da-hints{margin:10px 0 0;padding-left:18px;font-size:12px;line-height:1.7;color:var(--da-muted)}
1
+ .da-app{--da-border: var(--border, rgba(127, 127, 127, .25));--da-muted: var(--muted, #888);--da-danger: var(--danger, #dc2626);display:grid;gap:12px;padding:20px 24px 40px;max-width:880px;color:var(--text)}.da-app>*{min-width:0}.da-text{margin:6px 0 10px;font-size:13px;line-height:1.6}.da-muted{margin:6px 0 0;font-size:12px;line-height:1.6;color:var(--da-muted)}.da-step{margin:10px 0 6px;font-size:12px;font-weight:600}.da-mono{font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:12px;word-break:break-all}.da-row{display:flex;flex-wrap:wrap;gap:8px;align-items:center;margin-top:10px}.da-command{display:flex;gap:8px;align-items:center}.da-command code{flex:1;min-width:0;overflow-x:auto;white-space:nowrap;padding:7px 10px;border:1px solid var(--da-border);border-radius:var(--radius-md, 8px);font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:12px}.da-code-input{width:160px;letter-spacing:.3em;font-family:ui-monospace,SFMono-Regular,Menlo,monospace}.da-alert{padding:8px 12px;border:1px solid var(--da-danger);border-radius:var(--radius-md, 8px);color:var(--da-danger);font-size:12.5px}.da-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(200px,1fr));gap:10px 16px;margin:8px 0 0}.da-grid dt{font-size:11.5px;color:var(--da-muted)}.da-grid dd{margin:3px 0 0;font-size:13px}.da-list{list-style:none;margin:8px 0 0;padding:0;display:grid;gap:6px}.da-list li{display:flex;gap:10px;align-items:center;font-size:13px}.da-field{display:grid;gap:4px;margin-top:10px;font-size:12px}.da-field>span{color:var(--da-muted)}.da-select{height:32px;padding:0 8px;border:1px solid var(--da-border);border-radius:var(--radius-md, 8px);background:transparent;color:inherit;font:inherit;font-size:13px}.da-tabs{display:flex;gap:4px;border-bottom:1px solid var(--da-border)}.da-tab{padding:7px 14px;border:0;border-bottom:2px solid transparent;background:transparent;color:var(--da-muted);font:inherit;font-size:13px;cursor:pointer}.da-tab:hover{color:var(--text)}.da-tab-active{color:var(--text);border-bottom-color:var(--accent, currentColor);font-weight:600}.da-tab:focus-visible,.da-seg:focus-visible{outline:2px solid var(--accent, currentColor);outline-offset:2px}.da-switch{display:flex;gap:16px;align-items:flex-start;justify-content:space-between}.da-switch>div{min-width:0}.da-warn{color:var(--warn, #b45309)}.da-form{display:grid;gap:2px;margin-top:6px;max-width:420px}.da-devices{list-style:none;margin:8px 0 0;padding:0;display:grid;gap:2px}.da-devices li{display:flex;flex-wrap:wrap;gap:10px;align-items:center;padding:8px 0;border-bottom:1px solid var(--da-border)}.da-devices li:last-child{border-bottom:0}.da-device-main{display:grid;gap:2px;flex:1;min-width:160px}.da-device-main .da-muted{margin:0}.da-device-name{font-size:13px;font-weight:600}.da-device-actions{display:flex;gap:10px;align-items:center}.da-toggle{display:flex;gap:6px;align-items:center;font-size:12px;color:var(--da-muted)}.da-segment{display:inline-flex;margin:4px 0 10px;border:1px solid var(--da-border);border-radius:var(--radius-md, 8px);overflow:hidden}.da-seg{padding:5px 12px;border:0;background:transparent;color:var(--da-muted);font:inherit;font-size:12px;cursor:pointer}.da-seg+.da-seg{border-left:1px solid var(--da-border)}.da-seg-active{background:var(--bg-elevated, rgba(127, 127, 127, .12));color:var(--text);font-weight:600}.da-hints{margin:10px 0 0;padding-left:18px;font-size:12px;line-height:1.7;color:var(--da-muted)}.da-provider-page{display:grid;gap:12px}.da-provider-toolbar,.da-provider-device{display:flex;flex-wrap:wrap;justify-content:flex-end;align-items:center;gap:8px}.da-provider-device label,.da-provider-app-select label{font-size:12px;color:var(--da-muted)}.da-provider-device .da-select{width:min(380px,62vw)}.da-provider-heading{display:flex;flex-wrap:wrap;justify-content:space-between;align-items:flex-start;gap:10px}.da-provider-heading>div:first-child{min-width:180px;flex:1}.da-provider-heading .da-text{margin:5px 0 0;color:var(--da-muted)}.da-provider-app-select{display:flex;flex-wrap:wrap;align-items:center;gap:7px}.da-provider-app-select .da-select{min-width:145px}.da-provider-message{display:flex;flex-wrap:wrap;align-items:center;gap:8px;padding:11px 12px;border:1px solid var(--da-border);border-radius:var(--radius-md, 8px);font-size:12.5px;line-height:1.6;color:var(--da-muted)}.da-provider-warn{border-color:color-mix(in srgb,var(--warn, #b45309) 35%,transparent);color:var(--warn, #b45309)}.da-provider-error{border-color:color-mix(in srgb,var(--da-danger) 35%,transparent);color:var(--da-danger)}.da-provider-notice{padding:8px 10px;border:1px solid color-mix(in srgb,var(--ok, #16a34a) 30%,transparent);border-radius:var(--radius-md, 8px);color:var(--ok, #16a34a);font-size:12px}.da-provider-controls{display:grid;gap:16px}.da-provider-section-title{display:flex;justify-content:space-between;align-items:center;gap:8px;margin-bottom:8px;font-size:12px;font-weight:600}.da-provider-mode-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:8px}.da-provider-mode{display:flex;min-height:66px;gap:10px;align-items:flex-start;padding:10px 12px;border:1px solid var(--da-border);border-radius:var(--radius-md, 8px);background:transparent;color:inherit;text-align:left;cursor:pointer}.da-provider-mode:hover:not(:disabled),.da-provider-item:hover:not(:disabled){background:var(--bg-hover, rgba(127, 127, 127, .08))}.da-provider-mode:focus-visible,.da-provider-item:focus-visible{outline:2px solid var(--accent, #6366f1);outline-offset:2px}.da-provider-mode:disabled,.da-provider-item:disabled{opacity:.65;cursor:not-allowed}.da-provider-mode-active{border-color:var(--accent, #6366f1);background:color-mix(in srgb,var(--accent, #6366f1) 8%,transparent)}.da-provider-mode strong,.da-provider-mode small,.da-provider-item-copy strong,.da-provider-item-copy small{display:block}.da-provider-mode strong,.da-provider-item-copy strong{font-size:12.5px;font-weight:600}.da-provider-mode small,.da-provider-item-copy small{margin-top:3px;font-size:11.5px;line-height:1.5;color:var(--da-muted)}.da-provider-radio{display:inline-flex;width:15px;height:15px;flex:0 0 15px;align-items:center;justify-content:center;margin-top:1px;border:1px solid var(--da-border);border-radius:50%;color:#fff;font-size:10px}.da-provider-radio-active{border-color:var(--accent, #6366f1);background:var(--accent, #6366f1)}.da-provider-list{overflow:hidden;border:1px solid var(--da-border);border-radius:var(--radius-md, 8px)}.da-provider-item{display:flex;width:100%;min-height:50px;align-items:center;gap:10px;padding:8px 11px;border:0;background:transparent;color:inherit;text-align:left;cursor:pointer}.da-provider-item+.da-provider-item{border-top:1px solid var(--da-border)}.da-provider-item-copy{min-width:0;flex:1}.da-provider-item-copy strong,.da-provider-item-copy small{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.da-provider-warnings{padding:10px 12px;border:1px solid color-mix(in srgb,var(--warn, #b45309) 30%,transparent);border-radius:var(--radius-md, 8px);font-size:12px}.da-provider-warnings ul{margin:5px 0 0;padding-left:18px;color:var(--da-muted);line-height:1.6}@media(max-width:560px){.da-provider-device{flex:1;justify-content:flex-start}.da-provider-device .da-select{width:min(100%,62vw)}.da-provider-mode-grid{grid-template-columns:1fr}}
2
2
  /*# sourceMappingURL=renderer.css.map */
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../plugin/styles.css"],
4
- "sourcesContent": ["/* Device agent plugin. Every class is prefixed `da-`; colors come from host variables. */\n.da-app {\n --da-border: var(--border, rgba(127, 127, 127, 0.25));\n --da-muted: var(--muted, #888);\n --da-danger: var(--danger, #dc2626);\n display: grid;\n gap: 12px;\n padding: 20px 24px 40px;\n max-width: 880px;\n color: var(--text);\n}\n.da-app > * { min-width: 0; }\n.da-text { margin: 6px 0 10px; font-size: 13px; line-height: 1.6; }\n.da-muted { margin: 6px 0 0; font-size: 12px; line-height: 1.6; color: var(--da-muted); }\n.da-step { margin: 10px 0 6px; font-size: 12px; font-weight: 600; }\n.da-mono { font-family: ui-monospace, SFMono-Regular, Menlo, monospace; font-size: 12px; word-break: break-all; }\n.da-row { display: flex; flex-wrap: wrap; gap: 8px; align-items: center; margin-top: 10px; }\n.da-command { display: flex; gap: 8px; align-items: center; }\n.da-command code {\n flex: 1;\n min-width: 0;\n overflow-x: auto;\n white-space: nowrap;\n padding: 7px 10px;\n border: 1px solid var(--da-border);\n border-radius: var(--radius-md, 8px);\n font-family: ui-monospace, SFMono-Regular, Menlo, monospace;\n font-size: 12px;\n}\n.da-code-input { width: 160px; letter-spacing: 0.3em; font-family: ui-monospace, SFMono-Regular, Menlo, monospace; }\n.da-alert {\n padding: 8px 12px;\n border: 1px solid var(--da-danger);\n border-radius: var(--radius-md, 8px);\n color: var(--da-danger);\n font-size: 12.5px;\n}\n.da-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(200px, 1fr)); gap: 10px 16px; margin: 8px 0 0; }\n.da-grid dt { font-size: 11.5px; color: var(--da-muted); }\n.da-grid dd { margin: 3px 0 0; font-size: 13px; }\n.da-list { list-style: none; margin: 8px 0 0; padding: 0; display: grid; gap: 6px; }\n.da-list li { display: flex; gap: 10px; align-items: center; font-size: 13px; }\n.da-field { display: grid; gap: 4px; margin-top: 10px; font-size: 12px; }\n.da-field > span { color: var(--da-muted); }\n.da-select {\n height: 32px;\n padding: 0 8px;\n border: 1px solid var(--da-border);\n border-radius: var(--radius-md, 8px);\n background: transparent;\n color: inherit;\n font: inherit;\n font-size: 13px;\n}\n.da-tabs { display: flex; gap: 4px; border-bottom: 1px solid var(--da-border); }\n.da-tab {\n padding: 7px 14px;\n border: 0;\n border-bottom: 2px solid transparent;\n background: transparent;\n color: var(--da-muted);\n font: inherit;\n font-size: 13px;\n cursor: pointer;\n}\n.da-tab:hover { color: var(--text); }\n.da-tab-active { color: var(--text); border-bottom-color: var(--accent, currentColor); font-weight: 600; }\n.da-tab:focus-visible, .da-seg:focus-visible { outline: 2px solid var(--accent, currentColor); outline-offset: 2px; }\n.da-switch { display: flex; gap: 16px; align-items: flex-start; justify-content: space-between; }\n.da-switch > div { min-width: 0; }\n.da-warn { color: var(--warn, #b45309); }\n.da-form { display: grid; gap: 2px; margin-top: 6px; max-width: 420px; }\n.da-devices { list-style: none; margin: 8px 0 0; padding: 0; display: grid; gap: 2px; }\n.da-devices li {\n display: flex;\n flex-wrap: wrap;\n gap: 10px;\n align-items: center;\n padding: 8px 0;\n border-bottom: 1px solid var(--da-border);\n}\n.da-devices li:last-child { border-bottom: 0; }\n.da-device-main { display: grid; gap: 2px; flex: 1; min-width: 160px; }\n.da-device-main .da-muted { margin: 0; }\n.da-device-name { font-size: 13px; font-weight: 600; }\n.da-device-actions { display: flex; gap: 10px; align-items: center; }\n.da-toggle { display: flex; gap: 6px; align-items: center; font-size: 12px; color: var(--da-muted); }\n.da-segment { display: inline-flex; margin: 4px 0 10px; border: 1px solid var(--da-border); border-radius: var(--radius-md, 8px); overflow: hidden; }\n.da-seg { padding: 5px 12px; border: 0; background: transparent; color: var(--da-muted); font: inherit; font-size: 12px; cursor: pointer; }\n.da-seg + .da-seg { border-left: 1px solid var(--da-border); }\n.da-seg-active { background: var(--bg-elevated, rgba(127, 127, 127, 0.12)); color: var(--text); font-weight: 600; }\n.da-hints { margin: 10px 0 0; padding-left: 18px; font-size: 12px; line-height: 1.7; color: var(--da-muted); }\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["/* Device agent plugin. Every class is prefixed `da-`; colors come from host variables. */\n.da-app {\n --da-border: var(--border, rgba(127, 127, 127, 0.25));\n --da-muted: var(--muted, #888);\n --da-danger: var(--danger, #dc2626);\n display: grid;\n gap: 12px;\n padding: 20px 24px 40px;\n max-width: 880px;\n color: var(--text);\n}\n.da-app > * { min-width: 0; }\n.da-text { margin: 6px 0 10px; font-size: 13px; line-height: 1.6; }\n.da-muted { margin: 6px 0 0; font-size: 12px; line-height: 1.6; color: var(--da-muted); }\n.da-step { margin: 10px 0 6px; font-size: 12px; font-weight: 600; }\n.da-mono { font-family: ui-monospace, SFMono-Regular, Menlo, monospace; font-size: 12px; word-break: break-all; }\n.da-row { display: flex; flex-wrap: wrap; gap: 8px; align-items: center; margin-top: 10px; }\n.da-command { display: flex; gap: 8px; align-items: center; }\n.da-command code {\n flex: 1;\n min-width: 0;\n overflow-x: auto;\n white-space: nowrap;\n padding: 7px 10px;\n border: 1px solid var(--da-border);\n border-radius: var(--radius-md, 8px);\n font-family: ui-monospace, SFMono-Regular, Menlo, monospace;\n font-size: 12px;\n}\n.da-code-input { width: 160px; letter-spacing: 0.3em; font-family: ui-monospace, SFMono-Regular, Menlo, monospace; }\n.da-alert {\n padding: 8px 12px;\n border: 1px solid var(--da-danger);\n border-radius: var(--radius-md, 8px);\n color: var(--da-danger);\n font-size: 12.5px;\n}\n.da-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(200px, 1fr)); gap: 10px 16px; margin: 8px 0 0; }\n.da-grid dt { font-size: 11.5px; color: var(--da-muted); }\n.da-grid dd { margin: 3px 0 0; font-size: 13px; }\n.da-list { list-style: none; margin: 8px 0 0; padding: 0; display: grid; gap: 6px; }\n.da-list li { display: flex; gap: 10px; align-items: center; font-size: 13px; }\n.da-field { display: grid; gap: 4px; margin-top: 10px; font-size: 12px; }\n.da-field > span { color: var(--da-muted); }\n.da-select {\n height: 32px;\n padding: 0 8px;\n border: 1px solid var(--da-border);\n border-radius: var(--radius-md, 8px);\n background: transparent;\n color: inherit;\n font: inherit;\n font-size: 13px;\n}\n.da-tabs { display: flex; gap: 4px; border-bottom: 1px solid var(--da-border); }\n.da-tab {\n padding: 7px 14px;\n border: 0;\n border-bottom: 2px solid transparent;\n background: transparent;\n color: var(--da-muted);\n font: inherit;\n font-size: 13px;\n cursor: pointer;\n}\n.da-tab:hover { color: var(--text); }\n.da-tab-active { color: var(--text); border-bottom-color: var(--accent, currentColor); font-weight: 600; }\n.da-tab:focus-visible, .da-seg:focus-visible { outline: 2px solid var(--accent, currentColor); outline-offset: 2px; }\n.da-switch { display: flex; gap: 16px; align-items: flex-start; justify-content: space-between; }\n.da-switch > div { min-width: 0; }\n.da-warn { color: var(--warn, #b45309); }\n.da-form { display: grid; gap: 2px; margin-top: 6px; max-width: 420px; }\n.da-devices { list-style: none; margin: 8px 0 0; padding: 0; display: grid; gap: 2px; }\n.da-devices li {\n display: flex;\n flex-wrap: wrap;\n gap: 10px;\n align-items: center;\n padding: 8px 0;\n border-bottom: 1px solid var(--da-border);\n}\n.da-devices li:last-child { border-bottom: 0; }\n.da-device-main { display: grid; gap: 2px; flex: 1; min-width: 160px; }\n.da-device-main .da-muted { margin: 0; }\n.da-device-name { font-size: 13px; font-weight: 600; }\n.da-device-actions { display: flex; gap: 10px; align-items: center; }\n.da-toggle { display: flex; gap: 6px; align-items: center; font-size: 12px; color: var(--da-muted); }\n.da-segment { display: inline-flex; margin: 4px 0 10px; border: 1px solid var(--da-border); border-radius: var(--radius-md, 8px); overflow: hidden; }\n.da-seg { padding: 5px 12px; border: 0; background: transparent; color: var(--da-muted); font: inherit; font-size: 12px; cursor: pointer; }\n.da-seg + .da-seg { border-left: 1px solid var(--da-border); }\n.da-seg-active { background: var(--bg-elevated, rgba(127, 127, 127, 0.12)); color: var(--text); font-weight: 600; }\n.da-hints { margin: 10px 0 0; padding-left: 18px; font-size: 12px; line-height: 1.7; color: var(--da-muted); }\n.da-provider-page { display: grid; gap: 12px; }\n.da-provider-toolbar { display: flex; flex-wrap: wrap; justify-content: flex-end; align-items: center; gap: 8px; }\n.da-provider-device { display: flex; flex-wrap: wrap; justify-content: flex-end; align-items: center; gap: 8px; }\n.da-provider-device label, .da-provider-app-select label { font-size: 12px; color: var(--da-muted); }\n.da-provider-device .da-select { width: min(380px, 62vw); }\n.da-provider-heading { display: flex; flex-wrap: wrap; justify-content: space-between; align-items: flex-start; gap: 10px; }\n.da-provider-heading > div:first-child { min-width: 180px; flex: 1; }\n.da-provider-heading .da-text { margin: 5px 0 0; color: var(--da-muted); }\n.da-provider-app-select { display: flex; flex-wrap: wrap; align-items: center; gap: 7px; }\n.da-provider-app-select .da-select { min-width: 145px; }\n.da-provider-message { display: flex; flex-wrap: wrap; align-items: center; gap: 8px; padding: 11px 12px; border: 1px solid var(--da-border); border-radius: var(--radius-md, 8px); font-size: 12.5px; line-height: 1.6; color: var(--da-muted); }\n.da-provider-warn { border-color: color-mix(in srgb, var(--warn, #b45309) 35%, transparent); color: var(--warn, #b45309); }\n.da-provider-error { border-color: color-mix(in srgb, var(--da-danger) 35%, transparent); color: var(--da-danger); }\n.da-provider-notice { padding: 8px 10px; border: 1px solid color-mix(in srgb, var(--ok, #16a34a) 30%, transparent); border-radius: var(--radius-md, 8px); color: var(--ok, #16a34a); font-size: 12px; }\n.da-provider-controls { display: grid; gap: 16px; }\n.da-provider-section-title { display: flex; justify-content: space-between; align-items: center; gap: 8px; margin-bottom: 8px; font-size: 12px; font-weight: 600; }\n.da-provider-mode-grid { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 8px; }\n.da-provider-mode { display: flex; min-height: 66px; gap: 10px; align-items: flex-start; padding: 10px 12px; border: 1px solid var(--da-border); border-radius: var(--radius-md, 8px); background: transparent; color: inherit; text-align: left; cursor: pointer; }\n.da-provider-mode:hover:not(:disabled), .da-provider-item:hover:not(:disabled) { background: var(--bg-hover, rgba(127, 127, 127, 0.08)); }\n.da-provider-mode:focus-visible, .da-provider-item:focus-visible { outline: 2px solid var(--accent, #6366f1); outline-offset: 2px; }\n.da-provider-mode:disabled, .da-provider-item:disabled { opacity: .65; cursor: not-allowed; }\n.da-provider-mode-active { border-color: var(--accent, #6366f1); background: color-mix(in srgb, var(--accent, #6366f1) 8%, transparent); }\n.da-provider-mode strong, .da-provider-mode small, .da-provider-item-copy strong, .da-provider-item-copy small { display: block; }\n.da-provider-mode strong, .da-provider-item-copy strong { font-size: 12.5px; font-weight: 600; }\n.da-provider-mode small, .da-provider-item-copy small { margin-top: 3px; font-size: 11.5px; line-height: 1.5; color: var(--da-muted); }\n.da-provider-radio { display: inline-flex; width: 15px; height: 15px; flex: 0 0 15px; align-items: center; justify-content: center; margin-top: 1px; border: 1px solid var(--da-border); border-radius: 50%; color: white; font-size: 10px; }\n.da-provider-radio-active { border-color: var(--accent, #6366f1); background: var(--accent, #6366f1); }\n.da-provider-list { overflow: hidden; border: 1px solid var(--da-border); border-radius: var(--radius-md, 8px); }\n.da-provider-item { display: flex; width: 100%; min-height: 50px; align-items: center; gap: 10px; padding: 8px 11px; border: 0; background: transparent; color: inherit; text-align: left; cursor: pointer; }\n.da-provider-item + .da-provider-item { border-top: 1px solid var(--da-border); }\n.da-provider-item-copy { min-width: 0; flex: 1; }\n.da-provider-item-copy strong, .da-provider-item-copy small { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }\n.da-provider-warnings { padding: 10px 12px; border: 1px solid color-mix(in srgb, var(--warn, #b45309) 30%, transparent); border-radius: var(--radius-md, 8px); font-size: 12px; }\n.da-provider-warnings ul { margin: 5px 0 0; padding-left: 18px; color: var(--da-muted); line-height: 1.6; }\n@media (max-width: 560px) {\n .da-provider-device { flex: 1; justify-content: flex-start; }\n .da-provider-device .da-select { width: min(100%, 62vw); }\n .da-provider-mode-grid { grid-template-columns: 1fr; }\n}\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
@@ -1,2 +1,2 @@
1
- var Te=Object.create;var ie=Object.defineProperty;var Le=Object.getOwnPropertyDescriptor;var xe=Object.getOwnPropertyNames;var Ee=Object.getPrototypeOf,Be=Object.prototype.hasOwnProperty;var ne=(e,t)=>()=>{try{return t||e((t={exports:{}}).exports,t),t.exports}catch(r){throw t=0,r}};var Ie=(e,t,r,o)=>{if(t&&typeof t=="object"||typeof t=="function")for(let c of xe(t))!Be.call(e,c)&&c!==r&&ie(e,c,{get:()=>t[c],enumerable:!(o=Le(t,c))||o.enumerable});return e};var P=(e,t,r)=>(r=e!=null?Te(Ee(e)):{},Ie(t||!e||!e.__esModule?ie(r,"default",{value:e,enumerable:!0}):r,e));var W=ne((rt,le)=>{var se=globalThis.__TOC_PLUGIN_SHARED__,de=se&&se.react;if(!de)throw new Error("The host does not provide react; this plugin needs a newer app version.");le.exports=de});var G=ne((it,ge)=>{var pe=globalThis.__TOC_PLUGIN_SHARED__,ue=pe&&pe["@toc-starter/plugin-sdk/ui"];if(!ue)throw new Error("The host does not provide @toc-starter/plugin-sdk/ui; this plugin needs a newer app version.");ge.exports=ue});var M=ne((ct,be)=>{var fe=globalThis.__TOC_PLUGIN_SHARED__,ve=fe&&fe["react/jsx-runtime"];if(!ve)throw new Error("The host does not provide react/jsx-runtime; this plugin needs a newer app version.");be.exports=ve});var y=P(W(),1);var ce=P(W(),1);function me(e){if(!e||typeof e.activate!="function")throw new TypeError("definePlugin() needs an object with an activate(context) function");return e}function re(e,t){return(0,ce.useSyncExternalStore)(r=>e.core.onContextChange(t,r),()=>e.core.context(t))}var m=P(G(),1);var X="http://127.0.0.1:17339",x=class extends Error{constructor(r,o,c=""){super(o);this.kind=r;this.code=c}kind;code};async function q(e,t,r={}){let o=new Headers(r.headers);r.token&&o.set("Authorization",`Bearer ${r.token}`),r.body&&o.set("Content-Type","application/json");let c;try{c=await fetch(`${e.replace(/\/+$/,"")}${t}`,{...r,headers:o,cache:"no-store"})}catch{throw new x("offline","local service unreachable")}let h=await c.json().catch(()=>null);if(c.status===401)throw new x("unauthorized","unauthorized");if(!c.ok){let s=typeof h?.error=="string"?h.error:"",v=typeof h?.message=="string"?h.message:s||`HTTP ${c.status}`;throw new x("rejected",v,s)}return h}var I={info:e=>q(e,"/control/info"),pair:(e,t)=>q(e,"/control/pair",{method:"POST",body:JSON.stringify({code:t})}),status:(e,t)=>q(e,"/control/status",{token:t}),enroll:(e,t,r,o)=>q(e,"/control/enroll",{method:"POST",token:t,body:JSON.stringify({server_url:r,code:o})}),unpair:(e,t)=>q(e,"/control/unpair",{method:"POST",token:t}),detect:(e,t)=>q(e,"/control/detect",{method:"POST",token:t})};function Q(e,t){let r=o=>{try{return new URL(o).origin.toLowerCase()}catch{return o.trim().replace(/\/+$/,"").toLowerCase()}};return!!(e&&t)&&r(e)===r(t)}var C=P(W(),1),b=P(G(),1);var he=P(W(),1),we=P(G(),1);var Y=P(M(),1),A="controlToken",Z="localUrl",F="autoBind",ee="localService";function j(e,t){return t instanceof x&&t.kind==="offline"?e.t("error.offline"):t instanceof Error?t.message:String(t)}function K({ctx:e,value:t}){let[r,o]=(0,he.useState)(!1);return(0,Y.jsxs)("div",{className:"da-command",children:[(0,Y.jsx)("code",{children:t}),(0,Y.jsx)(we.Btn,{onClick:()=>{navigator.clipboard.writeText(t).then(()=>{o(!0),window.setTimeout(()=>o(!1),1500)})},children:r?e.t("common.copied"):e.t("common.copy")})]})}var n=P(M(),1),ae=["linux","mac","win"],Re=1e4,Oe=3e3,te="remoteServerUrl",Ue=new Set(["127.0.0.1","localhost","[::1]","::1","0.0.0.0"]);function De(e){try{let t=new URL(e.trim());return t.protocol==="http:"||t.protocol==="https:"?t.origin:null}catch{return null}}function Ae(e){try{return Ue.has(new URL(e).hostname)}catch{return!1}}function ze(e,t,r){let o=`toc-ocra setup --code ${t} --server ${r}`;return e==="win"?`npm install -g toc-ocra@latest; if ($?) { ${o} }`:`npm install -g toc-ocra@latest && ${o}`}function $e({ctx:e,device:t}){return t.status==="online"?(0,n.jsx)(b.Badge,{variant:"ok",children:e.t("remote.status.online")}):t.status==="disabled"?(0,n.jsx)(b.Badge,{variant:"warn",children:e.t("remote.status.disabled")}):t.status==="offline"?(0,n.jsx)(b.Badge,{variant:"err",children:e.t("remote.status.offline")}):(0,n.jsx)(b.Badge,{variant:"muted",children:e.t("remote.status.notConnected")})}function ye({ctx:e,server:t,workspace:r,localDeviceId:o}){let[c,h]=(0,C.useState)(null),[s,v]=(0,C.useState)(""),[u,d]=(0,C.useState)(!1),[g,p]=(0,C.useState)(null),[E,R]=(0,C.useState)(!1),[O,U]=(0,C.useState)(""),[S,N]=(0,C.useState)("linux"),[_,f]=(0,C.useState)(()=>e.storage.get(te,"")||t?.origin||""),T=(0,C.useRef)(g);T.current=g;let B=(0,C.useRef)(!0);(0,C.useEffect)(()=>{!e.storage.get(te,"")&&t?.origin&&f(t.origin)},[e,t?.origin]);let z=(0,C.useCallback)(async()=>{if(r?.id)try{let i=await e.core.request(`/workspaces/${encodeURIComponent(r.id)}/devices`);if(!B.current)return;let k=(i.items??[]).filter($=>$.is_mine&&$.id!==o);h(k);let D=T.current;if(D&&!D.matched){let $=k.find(Pe=>Pe.id===D.deviceId);$?.agent_id&&$.agent_id!==D.baseline&&$.terminal_online&&(p({...D,matched:!0}),e.notify({title:e.t("page.title"),body:e.t("remote.matchedNotice",{name:$.name})}))}}catch(i){B.current&&v(j(e,i))}},[e,o,r?.id]),V=!!(g&&!g.matched);(0,C.useEffect)(()=>{B.current=!0,z();let i=window.setInterval(()=>{z()},V?Oe:Re);return()=>{B.current=!1,window.clearInterval(i)}},[z,V]);let l=async i=>{d(!0),v("");try{await i()}catch(k){v(j(e,k))}finally{d(!1)}},w=De(_),L=i=>{f(i),i.trim()&&i.trim()!==t?.origin?e.storage.set(te,i.trim()):e.storage.remove(te)},oe=i=>l(async()=>{if(!w)throw new Error(e.t("remote.serverInvalid"));let k=await e.core.request(`/devices/${encodeURIComponent(i.id)}/pairing-code`,{method:"POST"});p({deviceId:i.id,deviceName:i.name,platform:ae.includes(i.platform)?i.platform:"linux",code:k.code,expiresAt:k.expires_at,baseline:i.agent_id??null,matched:!1})}),Se=()=>l(async()=>{if(!r?.id)throw new Error(e.t("bind.noWorkspace"));if(!w)throw new Error(e.t("remote.serverInvalid"));let i=O.trim()||e.t(`remote.platform.${S}`),k=await e.core.request(`/workspaces/${encodeURIComponent(r.id)}/devices`,{method:"POST",body:JSON.stringify({name:i,location:S==="linux"?"cloud":"local",platform:S,note:"",share_to_workspace:!1})}),D=await e.core.request(`/devices/${encodeURIComponent(k.id)}/pairing-code`,{method:"POST"});p({deviceId:k.id,deviceName:k.name||i,platform:S,code:D.code,expiresAt:D.expires_at,baseline:null,matched:!1}),R(!1),U(""),await z()}),Ne=(i,k)=>l(async()=>{await e.core.request(`/devices/${encodeURIComponent(i.id)}/enabled`,{method:"PUT",body:JSON.stringify({enabled:k})}),await z()});return(0,n.jsxs)(n.Fragment,{children:[s&&(0,n.jsx)("div",{role:"alert",className:"da-alert",children:s}),(0,n.jsxs)(b.Card,{children:[(0,n.jsx)(b.CardTitle,{children:e.t("remote.title")}),(0,n.jsx)("p",{className:"da-text",children:e.t("remote.body")}),(0,n.jsxs)("label",{className:"da-field",children:[(0,n.jsx)("span",{children:e.t("remote.server")}),(0,n.jsx)(b.Input,{value:_,onChange:i=>L(i.target.value),spellCheck:!1,className:"da-mono"})]}),!w&&(0,n.jsx)("p",{className:"da-muted da-warn",children:e.t("remote.serverInvalid")}),w&&Ae(w)&&(0,n.jsx)("p",{className:"da-muted da-warn",children:e.t("remote.loopback")}),!E&&(0,n.jsx)("div",{className:"da-row",children:(0,n.jsx)(b.Btn,{primary:!0,disabled:u||!r?.id,onClick:()=>R(!0),children:e.t("remote.add")})}),E&&(0,n.jsxs)("form",{className:"da-form",onSubmit:i=>{i.preventDefault(),Se()},children:[(0,n.jsxs)("label",{className:"da-field",children:[(0,n.jsx)("span",{children:e.t("remote.platformLabel")}),(0,n.jsx)("select",{className:"da-select",value:S,onChange:i=>N(i.target.value),children:ae.map(i=>(0,n.jsx)("option",{value:i,children:e.t(`remote.platform.${i}`)},i))})]}),(0,n.jsxs)("label",{className:"da-field",children:[(0,n.jsx)("span",{children:e.t("remote.name")}),(0,n.jsx)(b.Input,{value:O,onChange:i=>U(i.target.value),maxLength:100,placeholder:e.t("remote.namePlaceholder")})]}),(0,n.jsxs)("div",{className:"da-row",children:[(0,n.jsx)(b.Btn,{primary:!0,type:"submit",disabled:u||!w,children:e.t(u?"remote.working":"remote.generate")}),(0,n.jsx)(b.Btn,{type:"button",disabled:u,onClick:()=>R(!1),children:e.t("remote.cancel")})]})]})]}),g&&w&&(0,n.jsx)(Me,{ctx:e,pending:g,origin:w,busy:u,onPlatform:i=>p({...g,platform:i}),onRegenerate:()=>{oe({id:g.deviceId,name:g.deviceName,platform:g.platform,agent_id:g.baseline})},onClose:()=>p(null)}),(0,n.jsxs)(b.Card,{children:[(0,n.jsx)(b.CardTitle,{children:e.t("remote.listTitle")}),c===null&&(0,n.jsx)("p",{className:"da-muted",children:e.t("common.checking")}),c?.length===0&&(0,n.jsx)("p",{className:"da-muted",children:e.t("remote.empty")}),c&&c.length>0&&(0,n.jsx)("ul",{className:"da-devices",children:c.map(i=>(0,n.jsxs)("li",{children:[(0,n.jsxs)("div",{className:"da-device-main",children:[(0,n.jsx)("span",{className:"da-device-name",children:i.name}),(0,n.jsxs)("span",{className:"da-muted",children:[e.t(`remote.platform.${ae.includes(i.platform)?i.platform:"linux"}`),i.agent_version?` \xB7 toc-ocra ${i.agent_version}`:""]})]}),(0,n.jsx)($e,{ctx:e,device:i}),(0,n.jsxs)("div",{className:"da-device-actions",children:[(!i.paired||i.status==="offline"||i.status==="not_connected")&&(0,n.jsx)(b.Btn,{disabled:u||!w,onClick:()=>{oe(i)},children:e.t(i.paired?"remote.repair":"remote.install")}),i.paired&&(0,n.jsxs)("label",{className:"da-toggle",children:[(0,n.jsx)("span",{children:e.t("remote.enabled")}),(0,n.jsx)(b.Toggle,{checked:!i.disabled,disabled:u,label:e.t("remote.enabled"),onChange:k=>{Ne(i,k)}})]})]})]},i.id))}),(0,n.jsx)("p",{className:"da-muted",children:e.t("remote.disableHint")}),(0,n.jsx)("div",{className:"da-step",children:e.t("remote.uninstall")}),(0,n.jsx)(K,{ctx:e,value:"toc-ocra service:uninstall"})]})]})}function Me({ctx:e,pending:t,origin:r,busy:o,onPlatform:c,onRegenerate:h,onClose:s}){let[v,u]=(0,C.useState)(()=>Math.floor(Date.now()/1e3));(0,C.useEffect)(()=>{if(t.matched)return;let p=window.setInterval(()=>u(Math.floor(Date.now()/1e3)),1e3);return()=>window.clearInterval(p)},[t.matched]);let d=Math.max(0,t.expiresAt-v),g=!t.matched&&d===0;return(0,n.jsxs)(b.Card,{children:[(0,n.jsx)(b.CardTitle,{children:e.t("remote.pendingTitle",{name:t.deviceName})}),t.matched?(0,n.jsxs)(n.Fragment,{children:[(0,n.jsxs)("p",{className:"da-text",children:[(0,n.jsx)(b.Badge,{variant:"ok",children:e.t("remote.matched")})," ",e.t("remote.matchedBody",{name:t.deviceName})]}),(0,n.jsx)("div",{className:"da-row",children:(0,n.jsx)(b.Btn,{primary:!0,onClick:s,children:e.t("remote.done")})})]}):(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)("p",{className:"da-text",children:e.t("remote.pendingBody")}),(0,n.jsx)("div",{className:"da-segment",role:"radiogroup","aria-label":e.t("remote.platformLabel"),children:ae.map(p=>(0,n.jsx)("button",{type:"button",role:"radio","aria-checked":t.platform===p,className:t.platform===p?"da-seg da-seg-active":"da-seg",onClick:()=>c(p),children:e.t(`remote.platform.${p}`)},p))}),(0,n.jsx)(K,{ctx:e,value:ze(t.platform,t.code,r)}),(0,n.jsxs)("ul",{className:"da-hints",children:[(0,n.jsx)("li",{children:e.t("remote.hintNode")}),t.platform==="linux"&&(0,n.jsx)("li",{children:e.t("remote.hintLinux")}),t.platform==="win"&&(0,n.jsx)("li",{children:e.t("remote.hintWindows")}),(0,n.jsx)("li",{children:g?e.t("remote.expired"):e.t("remote.expires",{minutes:Math.floor(d/60),seconds:String(d%60).padStart(2,"0")})})]}),(0,n.jsx)("p",{className:"da-muted",children:g?"":e.t("remote.waiting")}),(0,n.jsxs)("div",{className:"da-row",children:[(0,n.jsx)(b.Btn,{disabled:o,onClick:h,children:e.t("remote.regenerate")}),(0,n.jsx)(b.Btn,{disabled:o,onClick:s,children:e.t("remote.cancel")})]})]})]})}var a=P(M(),1),Ke=3e3,qe=1e4,He=6e4,We=3,Ce="tab",Ye=new URL("../../assets/icon.svg",import.meta.url).href;function Fe(){return(0,a.jsx)("img",{src:Ye,alt:"",width:16,height:16,draggable:!1})}function _e(e){let t=e.core.service;try{return t&&t.available()?t:void 0}catch{return}}var J=e=>e?.state==="running"||e?.state==="starting";async function ke(e){try{return await I.info(e),!0}catch{return!1}}var H;function je({ctx:e}){let t=re(e,"server"),r=re(e,"workspace"),[o,c]=(0,y.useState)(()=>e.storage.get(Ce,"local")==="remote"?"remote":"local"),h=l=>{e.storage.set(Ce,l),c(l)},[s]=(0,y.useState)(()=>e.storage.get(Z,X)),[v,u]=(0,y.useState)(()=>e.secureStorage.get(A,"")),[d,g]=(0,y.useState)({kind:"checking"}),[p,E]=(0,y.useState)(null),[R,O]=(0,y.useState)(""),[U,S]=(0,y.useState)(!1),N=(0,y.useRef)(!0),_=_e(e),f=(0,y.useCallback)(async()=>{let l=null;if(_)try{l=await _.status()}catch{l=null}if(!N.current)return;E(l);let w=v;J(l)&&l?.token&&(w=l.token,l.token!==v&&(e.secureStorage.set(A,l.token),u(l.token)));try{await I.info(s)}catch{N.current&&g({kind:J(l)?"starting":"offline"});return}if(!w){N.current&&g({kind:"needsCode"});return}try{let L=await I.status(s,w);N.current&&g({kind:"ready",status:L})}catch(L){if(!N.current)return;L instanceof x&&L.kind==="unauthorized"?(e.secureStorage.remove(A),u(""),g({kind:"needsCode"})):g({kind:"offline"})}},[e,s,_,v]);(0,y.useEffect)(()=>{N.current=!0,f();let l=window.setInterval(()=>{f()},Ke);return()=>{N.current=!1,window.clearInterval(l)}},[f]),(0,y.useEffect)(()=>{if(d.kind==="ready"){let l=d.status;e.reportHealth(l.paired&&l.connected?{status:"healthy",summary:e.t("health.online",{name:l.device_name})}:{status:"degraded",summary:e.t(l.paired?"health.disconnected":"health.unpaired")})}else d.kind==="offline"&&e.reportHealth({status:"degraded",summary:e.t(_?"health.disabled":"health.offline")})},[e,d,_]);let T=async l=>{S(!0),O("");try{await l()}catch(w){O(j(e,w))}finally{S(!1)}},B=l=>T(async()=>{if(!_)return;if(!l){e.storage.set(ee,"off"),E(await _.stop()),await f();return}if(e.storage.set(ee,"on"),e.storage.remove(F),!J(p)&&await ke(s)){H?.(),await f();return}let w=await _.start();E(w),w.token&&(e.secureStorage.set(A,w.token),u(w.token)),await Je(s,()=>N.current)&&H?.(),await f()}),z=p?.state==="exited"?p:null,V=!!_&&!J(p)&&(d.kind==="ready"||d.kind==="needsCode");return(0,a.jsxs)("div",{className:"da-app",children:[(0,a.jsx)(m.PageHeader,{title:e.t("page.title"),subtitle:e.t("page.subtitle")}),(0,a.jsx)("div",{className:"da-tabs",role:"tablist","aria-label":e.t("page.title"),children:["local","remote"].map(l=>(0,a.jsx)("button",{type:"button",role:"tab","aria-selected":o===l,className:o===l?"da-tab da-tab-active":"da-tab",onClick:()=>h(l),children:e.t(`tabs.${l}`)},l))}),R&&(0,a.jsx)("div",{role:"alert",className:"da-alert",children:R}),o==="remote"&&(0,a.jsx)(ye,{ctx:e,server:t,workspace:r,localDeviceId:d.kind==="ready"&&d.status.paired?d.status.device_id:""}),o==="local"&&(0,a.jsxs)(a.Fragment,{children:[_&&(0,a.jsx)(Ve,{ctx:e,status:p,external:V,exit:z,busy:U,onToggle:l=>{B(l)}}),d.kind==="checking"&&(0,a.jsx)(m.Card,{children:(0,a.jsx)("span",{className:"da-muted",children:e.t("common.checking")})}),d.kind==="starting"&&(0,a.jsx)(m.Card,{children:(0,a.jsx)("span",{className:"da-muted",children:e.t("service.starting")})}),d.kind==="offline"&&!_&&(0,a.jsx)(Ge,{ctx:e,localUrl:s}),d.kind==="needsCode"&&(0,a.jsx)(Xe,{ctx:e,busy:U,onPair:l=>T(async()=>{let w=await I.pair(s,l).catch(L=>{throw L instanceof x&&L.code==="code_wrong"?new Error(e.t("pair.wrong")):L instanceof x&&L.code==="locked"?new Error(e.t("pair.locked")):L});e.secureStorage.set(A,w.token),u(w.token)})}),d.kind==="ready"&&(0,a.jsx)(Qe,{ctx:e,status:d.status,server:t,workspace:r,busy:U,run:T,localUrl:s,token:v,onStatus:l=>g({kind:"ready",status:l})})]})]})}async function Je(e,t){for(let r=0;r<30&&t();r+=1)try{return await I.info(e),!0}catch{await new Promise(o=>window.setTimeout(o,500))}return!1}function Ve({ctx:e,status:t,external:r,exit:o,busy:c,onToggle:h}){let s=J(t),v=!s&&r,u=s||v,d=o?.exitCode===We;return(0,a.jsxs)(m.Card,{children:[(0,a.jsxs)("div",{className:"da-switch",children:[(0,a.jsxs)("div",{children:[(0,a.jsx)(m.CardTitle,{children:e.t("service.title")}),(0,a.jsx)("p",{className:"da-text",children:e.t(v?"service.onExternalBody":u?"service.onBody":"service.offBody")})]}),(0,a.jsx)(m.Toggle,{checked:u,disabled:c||v,label:e.t("service.title"),onChange:h})]}),s&&(0,a.jsx)("p",{className:"da-muted",children:e.t("service.followsApp")}),v&&(0,a.jsx)("p",{className:"da-muted",children:e.t("service.external")}),!u&&d&&(0,a.jsx)("p",{className:"da-muted",children:e.t("service.portTaken")}),o&&!d&&o.exitCode!==0&&(0,a.jsx)("div",{role:"alert",className:"da-alert",children:e.t("service.crashed",{error:o.error||`exit ${o.exitCode??o.signal??"?"}`})})]})}function Ge({ctx:e,localUrl:t}){return(0,a.jsxs)(m.Card,{children:[(0,a.jsx)(m.CardTitle,{children:e.t("offline.title")}),(0,a.jsx)("p",{className:"da-text",children:e.t("offline.body",{url:t})}),(0,a.jsx)("div",{className:"da-step",children:e.t("offline.once")}),(0,a.jsx)(K,{ctx:e,value:"npx toc-ocra@latest run"}),(0,a.jsx)("div",{className:"da-step",children:e.t("offline.service")}),(0,a.jsx)(K,{ctx:e,value:"npm install -g toc-ocra@latest && toc-ocra service:install"}),(0,a.jsx)("p",{className:"da-muted",children:e.t("offline.node")})]})}function Xe({ctx:e,busy:t,onPair:r}){let[o,c]=(0,y.useState)(""),h=/^\d{6}$/.test(o);return(0,a.jsxs)(m.Card,{children:[(0,a.jsx)(m.CardTitle,{children:e.t("pair.title")}),(0,a.jsx)("p",{className:"da-text",children:e.t("pair.body")}),(0,a.jsx)(K,{ctx:e,value:"toc-ocra code"}),(0,a.jsxs)("form",{className:"da-row",onSubmit:s=>{s.preventDefault(),h&&r(o)},children:[(0,a.jsx)(m.Input,{value:o,onChange:s=>c(s.target.value.replace(/\D/g,"").slice(0,6)),placeholder:e.t("pair.placeholder"),inputMode:"numeric",autoComplete:"one-time-code","aria-label":e.t("pair.placeholder"),className:"da-code-input"}),(0,a.jsx)(m.Btn,{primary:!0,type:"submit",disabled:!h||t,children:e.t("pair.submit")})]})]})}function Qe({ctx:e,status:t,server:r,workspace:o,busy:c,run:h,localUrl:s,token:v,onStatus:u}){let d=t.paired&&r&&!Q(t.server_url,r.origin),g=()=>h(async()=>{t.device_id&&r&&Q(t.server_url,r.origin)&&await e.core.request(`/devices/${encodeURIComponent(t.device_id)}/agent`,{method:"DELETE"}).catch(()=>{}),e.storage.set(F,"off"),u(await I.unpair(s,v))});return(0,a.jsxs)(a.Fragment,{children:[(0,a.jsxs)(m.Card,{children:[(0,a.jsx)(m.CardTitle,{children:e.t("status.title")}),(0,a.jsxs)("dl",{className:"da-grid",children:[(0,a.jsxs)("div",{children:[(0,a.jsx)("dt",{children:e.t("status.service")}),(0,a.jsxs)("dd",{children:["toc-ocra ",t.version," \xB7 ",t.hostname]})]}),(0,a.jsxs)("div",{children:[(0,a.jsx)("dt",{children:e.t("status.binding")}),(0,a.jsx)("dd",{children:(0,a.jsx)(Ze,{ctx:e,status:t})})]}),t.paired&&(0,a.jsxs)("div",{children:[(0,a.jsx)("dt",{children:e.t("status.device")}),(0,a.jsx)("dd",{children:t.device_name})]}),t.paired&&(0,a.jsxs)("div",{children:[(0,a.jsx)("dt",{children:e.t("status.server")}),(0,a.jsx)("dd",{className:"da-mono",children:t.server_url})]}),t.paired&&(0,a.jsxs)("div",{children:[(0,a.jsx)("dt",{children:e.t("status.runs")}),(0,a.jsx)("dd",{children:t.active_runs})]})]}),t.paired&&!t.connected&&t.connection_error&&(0,a.jsx)("p",{className:"da-muted",children:e.t("status.lastError",{error:t.connection_error})}),t.token_from_env&&(0,a.jsx)("p",{className:"da-muted",children:e.t("status.tokenFromEnv")}),t.paired&&(0,a.jsx)("div",{className:"da-row",children:(0,a.jsx)(m.Btn,{danger:!0,disabled:c||t.token_from_env,onClick:()=>{g()},children:e.t("status.unpair")})})]}),(!t.paired||t.unauthorized||d)&&(0,a.jsx)(et,{ctx:e,status:t,server:r,workspace:o,busy:c,run:h,localUrl:s,token:v,onStatus:u,rebind:t.paired}),(0,a.jsxs)(m.Card,{children:[(0,a.jsx)(m.CardTitle,{children:e.t("cli.title")}),(0,a.jsxs)("ul",{className:"da-list",children:[t.providers.filter(p=>p.installed).map(p=>(0,a.jsxs)("li",{children:[(0,a.jsx)("span",{className:"da-mono",children:p.id}),(0,a.jsx)("span",{className:"da-muted",children:p.version}),p.runnable?(0,a.jsx)(m.Badge,{variant:"ok",children:e.t("cli.runnable")}):(0,a.jsx)(m.Badge,{variant:"muted",children:e.t("cli.detectOnly")})]},p.id)),!t.providers.some(p=>p.installed)&&(0,a.jsx)("li",{className:"da-muted",children:e.t("cli.none")})]}),(0,a.jsx)("div",{className:"da-row",children:(0,a.jsx)(m.Btn,{disabled:c,onClick:()=>{h(async()=>u(await I.detect(s,v)))},children:e.t("cli.redetect")})})]})]})}function Ze({ctx:e,status:t}){return t.paired?t.unauthorized?(0,a.jsx)(m.Badge,{variant:"err",children:e.t("binding.revoked")}):t.connected?(0,a.jsx)(m.Badge,{variant:"ok",children:e.t("binding.online")}):(0,a.jsx)(m.Badge,{variant:"warn",children:e.t("binding.connecting")}):(0,a.jsx)(m.Badge,{variant:"muted",children:e.t("binding.unpaired")})}function et({ctx:e,status:t,server:r,workspace:o,busy:c,run:h,localUrl:s,token:v,onStatus:u,rebind:d}){let[g,p]=(0,y.useState)([]),[E,R]=(0,y.useState)("new"),[O,U]=(0,y.useState)(t.hostname),[S,N]=(0,y.useState)(r?.origin??"");(0,y.useEffect)(()=>{r?.origin&&N(r.origin)},[r?.origin]),(0,y.useEffect)(()=>{if(!o?.id)return;let f=!1;return e.core.request(`/workspaces/${encodeURIComponent(o.id)}/devices`).then(T=>{f||p((T.items??[]).filter(B=>B.is_mine))}).catch(()=>{f||p([])}),()=>{f=!0}},[e,o?.id]);let _=()=>h(async()=>{if(!o?.id)throw new Error(e.t("bind.noWorkspace"));if(!S.trim())throw new Error(e.t("bind.noServer"));let f=E,T;if(E==="new"){if(!t.machine_id)throw new Error(e.t("bind.identityRequired"));let B=await e.core.request("/devices/machine/pairing-code",{method:"POST",body:JSON.stringify({machine_id:t.machine_id,hostname:O.trim()||t.hostname,platform:t.platform,current_device_id:t.paired?t.device_id:""})});f=B.device_id,R(f),T=B}else T=await e.core.request(`/devices/${encodeURIComponent(f)}/pairing-code`,{method:"POST"});u(await I.enroll(s,v,S.trim(),T.code)),e.storage.remove(F),e.notify({title:e.t("page.title"),body:e.t("bind.done",{server:r?.name??S})})});return(0,a.jsxs)(m.Card,{children:[(0,a.jsx)(m.CardTitle,{children:e.t(d?"bind.rebindTitle":"bind.title")}),d&&t.unauthorized&&(0,a.jsx)("p",{className:"da-text",children:e.t("bind.revoked")}),d&&!t.unauthorized&&(0,a.jsx)("p",{className:"da-text",children:e.t("bind.elsewhere",{bound:t.server_url,current:r?.origin??""})}),(0,a.jsx)("p",{className:"da-text",children:e.t("bind.body",{server:r?.name??"",workspace:o?.name??""})}),(0,a.jsxs)("label",{className:"da-field",children:[(0,a.jsx)("span",{children:e.t("bind.server")}),(0,a.jsx)(m.Input,{value:S,onChange:f=>N(f.target.value),spellCheck:!1,className:"da-mono"})]}),(0,a.jsxs)("label",{className:"da-field",children:[(0,a.jsx)("span",{children:e.t("bind.device")}),(0,a.jsxs)("select",{className:"da-select",value:E,onChange:f=>R(f.target.value),children:[(0,a.jsx)("option",{value:"new",children:e.t("bind.newDevice")}),g.map(f=>(0,a.jsxs)("option",{value:f.id,children:[f.name,f.paired?` \xB7 ${e.t("bind.replaces")}`:""]},f.id))]})]}),E==="new"&&(0,a.jsxs)("label",{className:"da-field",children:[(0,a.jsx)("span",{children:e.t("bind.name")}),(0,a.jsx)(m.Input,{value:O,onChange:f=>U(f.target.value),maxLength:100})]}),(0,a.jsx)("div",{className:"da-row",children:(0,a.jsx)(m.Btn,{primary:!0,disabled:c||!o?.id,onClick:()=>{_()},children:e.t(c?"bind.working":"bind.submit")})})]})}function tt(e){let t=!1,r="",o=new Map,c=async()=>{if(t||e.signal.aborted)return;let s=e.core.context("server"),v=e.secureStorage.get(A,"");if(!(!s?.origin||!v||e.storage.get(F,"on")==="off")&&!(Date.now()-(o.get(s.origin)??0)<He)){t=!0;try{let u=e.storage.get(Z,X),d=await I.status(u,v);if(!d.machine_id||d.token_from_env)return;if(d.paired&&(d.unauthorized||Q(d.server_url,s.origin))){r="";return}if(d.active_runs>0){r!==s.origin&&(r=s.origin,e.notify({title:e.t("page.title"),body:e.t("auto.deferred",{server:s.name||s.origin})}));return}let g=await e.core.request("/devices/machine/pairing-code",{method:"POST",body:JSON.stringify({machine_id:d.machine_id,hostname:d.hostname,platform:d.platform,current_device_id:d.paired?d.device_id:""})});await I.enroll(u,v,s.origin,g.code),r="",o.delete(s.origin),e.notify({title:e.t("page.title"),body:e.t("auto.done",{server:s.name||s.origin,device:g.device_name})})}catch(u){(!(u instanceof x)||u.kind==="rejected")&&o.set(s.origin,Date.now())}finally{t=!1}}},h=window.setInterval(()=>{c()},qe);H=()=>{c()},e.registerDisposer(()=>{window.clearInterval(h),H=void 0}),e.registerDisposer(e.core.onContextChange("server",()=>{c()})),window.setTimeout(()=>{c()},1500)}function at(e){let t=_e(e);if(!t||e.storage.get(ee,"off")!=="on")return;let r=e.storage.get(Z,X);ke(r).then(o=>{if(o){window.setTimeout(()=>H?.(),3e3);return}return t.start()}).then(o=>{o&&(o.token&&e.secureStorage.set(A,o.token),window.setTimeout(()=>H?.(),3e3))}).catch(()=>{})}var yt=me({activate(e){e.registerNavigation("agent.nav",(0,a.jsx)(Fe,{})),e.registerRoute("agent.home",(0,a.jsx)(je,{ctx:e})),at(e),tt(e)}});export{yt as default};
1
+ var Ve=Object.create;var Se=Object.defineProperty;var Ge=Object.getOwnPropertyDescriptor;var Xe=Object.getOwnPropertyNames;var Qe=Object.getPrototypeOf,Ze=Object.prototype.hasOwnProperty;var ye=(e,r)=>()=>{try{return r||e((r={exports:{}}).exports,r),r.exports}catch(i){throw r=0,i}};var er=(e,r,i,n)=>{if(r&&typeof r=="object"||typeof r=="function")for(let u of Xe(r))!Ze.call(e,u)&&u!==i&&Se(e,u,{get:()=>r[u],enumerable:!(n=Ge(r,u))||n.enumerable});return e};var D=(e,r,i)=>(i=e!=null?Ve(Qe(e)):{},er(r||!e||!e.__esModule?Se(i,"default",{value:e,enumerable:!0}):i,e));var X=ye((Tr,Te)=>{var Pe=globalThis.__TOC_PLUGIN_SHARED__,xe=Pe&&Pe.react;if(!xe)throw new Error("The host does not provide react; this plugin needs a newer app version.");Te.exports=xe});var ie=ye((Lr,Re)=>{var Ee=globalThis.__TOC_PLUGIN_SHARED__,Be=Ee&&Ee["@toc-starter/plugin-sdk/ui"];if(!Be)throw new Error("The host does not provide @toc-starter/plugin-sdk/ui; this plugin needs a newer app version.");Re.exports=Be});var H=ye((Dr,Ae)=>{var De=globalThis.__TOC_PLUGIN_SHARED__,Oe=De&&De["react/jsx-runtime"];if(!Oe)throw new Error("The host does not provide react/jsx-runtime; this plugin needs a newer app version.");Ae.exports=Oe});var S=D(X(),1);var Ie=D(X(),1);function Le(e){if(!e||typeof e.activate!="function")throw new TypeError("definePlugin() needs an object with an activate(context) function");return e}function we(e,r){return(0,Ie.useSyncExternalStore)(i=>e.core.onContextChange(r,i),()=>e.core.context(r))}var g=D(ie(),1);var pe="http://127.0.0.1:17339",z=class extends Error{constructor(i,n,u=""){super(n);this.kind=i;this.code=u}kind;code};async function Q(e,r,i={}){let n=new Headers(i.headers);i.token&&n.set("Authorization",`Bearer ${i.token}`),i.body&&n.set("Content-Type","application/json");let u;try{u=await fetch(`${e.replace(/\/+$/,"")}${r}`,{...i,headers:n,cache:"no-store"})}catch{throw new z("offline","local service unreachable")}let h=await u.json().catch(()=>null);if(u.status===401)throw new z("unauthorized","unauthorized");if(!u.ok){let c=typeof h?.error=="string"?h.error:"",f=typeof h?.message=="string"?h.message:c||`HTTP ${u.status}`;throw new z("rejected",f,c)}return h}var q={info:e=>Q(e,"/control/info"),pair:(e,r)=>Q(e,"/control/pair",{method:"POST",body:JSON.stringify({code:r})}),status:(e,r)=>Q(e,"/control/status",{token:r}),enroll:(e,r,i,n)=>Q(e,"/control/enroll",{method:"POST",token:r,body:JSON.stringify({server_url:i,code:n})}),unpair:(e,r)=>Q(e,"/control/unpair",{method:"POST",token:r}),detect:(e,r)=>Q(e,"/control/detect",{method:"POST",token:r})};function me(e,r){let i=n=>{try{return new URL(n).origin.toLowerCase()}catch{return n.trim().replace(/\/+$/,"").toLowerCase()}};return!!(e&&r)&&i(e)===i(r)}var E=D(X(),1),C=D(ie(),1);var Ue=D(X(),1),$e=D(ie(),1);var ae=D(H(),1),F="controlToken",ue="localUrl",oe="autoBind",ve="localService";function ne(e,r){return r instanceof z&&r.kind==="offline"?e.t("error.offline"):r instanceof Error?r.message:String(r)}function V({ctx:e,value:r}){let[i,n]=(0,Ue.useState)(!1);return(0,ae.jsxs)("div",{className:"da-command",children:[(0,ae.jsx)("code",{children:r}),(0,ae.jsx)($e.Btn,{onClick:()=>{navigator.clipboard.writeText(r).then(()=>{n(!0),window.setTimeout(()=>n(!1),1500)})},children:i?e.t("common.copied"):e.t("common.copy")})]})}var o=D(H(),1),fe=["linux","mac","win"],rr=1e4,tr=3e3,ge="remoteServerUrl",ir=new Set(["127.0.0.1","localhost","[::1]","::1","0.0.0.0"]);function ar(e){try{let r=new URL(e.trim());return r.protocol==="http:"||r.protocol==="https:"?r.origin:null}catch{return null}}function or(e){try{return ir.has(new URL(e).hostname)}catch{return!1}}function nr(e,r,i){let n=`toc-ocra setup --code ${r} --server ${i}`;return e==="win"?`npm install -g toc-ocra@latest; if ($?) { ${n} }`:`npm install -g toc-ocra@latest && ${n}`}function dr({ctx:e,device:r}){return r.status==="online"?(0,o.jsx)(C.Badge,{variant:"ok",children:e.t("remote.status.online")}):r.status==="disabled"?(0,o.jsx)(C.Badge,{variant:"warn",children:e.t("remote.status.disabled")}):r.status==="offline"?(0,o.jsx)(C.Badge,{variant:"err",children:e.t("remote.status.offline")}):(0,o.jsx)(C.Badge,{variant:"muted",children:e.t("remote.status.notConnected")})}function ze({ctx:e,server:r,workspace:i,localDeviceId:n}){let[u,h]=(0,E.useState)(null),[c,f]=(0,E.useState)(""),[v,l]=(0,E.useState)(!1),[b,d]=(0,E.useState)(null),[k,y]=(0,E.useState)(!1),[O,K]=(0,E.useState)(""),[L,B]=(0,E.useState)("linux"),[P,w]=(0,E.useState)(()=>e.storage.get(ge,"")||r?.origin||""),U=(0,E.useRef)(b);U.current=b;let R=(0,E.useRef)(!0);(0,E.useEffect)(()=>{!e.storage.get(ge,"")&&r?.origin&&w(r.origin)},[e,r?.origin]);let $=(0,E.useCallback)(async()=>{if(i?.id)try{let s=await e.core.request(`/workspaces/${encodeURIComponent(i.id)}/devices`);if(!R.current)return;let x=(s.items??[]).filter(M=>M.is_mine&&M.id!==n);h(x);let W=U.current;if(W&&!W.matched){let M=x.find(te=>te.id===W.deviceId);M?.agent_id&&M.agent_id!==W.baseline&&M.terminal_online&&(d({...W,matched:!0}),e.notify({title:e.t("page.title"),body:e.t("remote.matchedNotice",{name:M.name})}))}}catch(s){R.current&&f(ne(e,s))}},[e,n,i?.id]),Y=!!(b&&!b.matched);(0,E.useEffect)(()=>{R.current=!0,$();let s=window.setInterval(()=>{$()},Y?tr:rr);return()=>{R.current=!1,window.clearInterval(s)}},[$,Y]);let p=async s=>{l(!0),f("");try{await s()}catch(x){f(ne(e,x))}finally{l(!1)}},_=ar(P),A=s=>{w(s),s.trim()&&s.trim()!==r?.origin?e.storage.set(ge,s.trim()):e.storage.remove(ge)},j=s=>p(async()=>{if(!_)throw new Error(e.t("remote.serverInvalid"));let x=await e.core.request(`/devices/${encodeURIComponent(s.id)}/pairing-code`,{method:"POST"});d({deviceId:s.id,deviceName:s.name,platform:fe.includes(s.platform)?s.platform:"linux",code:x.code,expiresAt:x.expires_at,baseline:s.agent_id??null,matched:!1})}),J=()=>p(async()=>{if(!i?.id)throw new Error(e.t("bind.noWorkspace"));if(!_)throw new Error(e.t("remote.serverInvalid"));let s=O.trim()||e.t(`remote.platform.${L}`),x=await e.core.request(`/workspaces/${encodeURIComponent(i.id)}/devices`,{method:"POST",body:JSON.stringify({name:s,location:L==="linux"?"cloud":"local",platform:L,note:"",share_to_workspace:!1})}),W=await e.core.request(`/devices/${encodeURIComponent(x.id)}/pairing-code`,{method:"POST"});d({deviceId:x.id,deviceName:x.name||s,platform:L,code:W.code,expiresAt:W.expires_at,baseline:null,matched:!1}),y(!1),K(""),await $()}),re=(s,x)=>p(async()=>{await e.core.request(`/devices/${encodeURIComponent(s.id)}/enabled`,{method:"PUT",body:JSON.stringify({enabled:x})}),await $()});return(0,o.jsxs)(o.Fragment,{children:[c&&(0,o.jsx)("div",{role:"alert",className:"da-alert",children:c}),(0,o.jsxs)(C.Card,{children:[(0,o.jsx)(C.CardTitle,{children:e.t("remote.title")}),(0,o.jsx)("p",{className:"da-text",children:e.t("remote.body")}),(0,o.jsxs)("label",{className:"da-field",children:[(0,o.jsx)("span",{children:e.t("remote.server")}),(0,o.jsx)(C.Input,{value:P,onChange:s=>A(s.target.value),spellCheck:!1,className:"da-mono"})]}),!_&&(0,o.jsx)("p",{className:"da-muted da-warn",children:e.t("remote.serverInvalid")}),_&&or(_)&&(0,o.jsx)("p",{className:"da-muted da-warn",children:e.t("remote.loopback")}),!k&&(0,o.jsx)("div",{className:"da-row",children:(0,o.jsx)(C.Btn,{primary:!0,disabled:v||!i?.id,onClick:()=>y(!0),children:e.t("remote.add")})}),k&&(0,o.jsxs)("form",{className:"da-form",onSubmit:s=>{s.preventDefault(),J()},children:[(0,o.jsxs)("label",{className:"da-field",children:[(0,o.jsx)("span",{children:e.t("remote.platformLabel")}),(0,o.jsx)("select",{className:"da-select",value:L,onChange:s=>B(s.target.value),children:fe.map(s=>(0,o.jsx)("option",{value:s,children:e.t(`remote.platform.${s}`)},s))})]}),(0,o.jsxs)("label",{className:"da-field",children:[(0,o.jsx)("span",{children:e.t("remote.name")}),(0,o.jsx)(C.Input,{value:O,onChange:s=>K(s.target.value),maxLength:100,placeholder:e.t("remote.namePlaceholder")})]}),(0,o.jsxs)("div",{className:"da-row",children:[(0,o.jsx)(C.Btn,{primary:!0,type:"submit",disabled:v||!_,children:e.t(v?"remote.working":"remote.generate")}),(0,o.jsx)(C.Btn,{type:"button",disabled:v,onClick:()=>y(!1),children:e.t("remote.cancel")})]})]})]}),b&&_&&(0,o.jsx)(sr,{ctx:e,pending:b,origin:_,busy:v,onPlatform:s=>d({...b,platform:s}),onRegenerate:()=>{j({id:b.deviceId,name:b.deviceName,platform:b.platform,agent_id:b.baseline})},onClose:()=>d(null)}),(0,o.jsxs)(C.Card,{children:[(0,o.jsx)(C.CardTitle,{children:e.t("remote.listTitle")}),u===null&&(0,o.jsx)("p",{className:"da-muted",children:e.t("common.checking")}),u?.length===0&&(0,o.jsx)("p",{className:"da-muted",children:e.t("remote.empty")}),u&&u.length>0&&(0,o.jsx)("ul",{className:"da-devices",children:u.map(s=>(0,o.jsxs)("li",{children:[(0,o.jsxs)("div",{className:"da-device-main",children:[(0,o.jsx)("span",{className:"da-device-name",children:s.name}),(0,o.jsxs)("span",{className:"da-muted",children:[e.t(`remote.platform.${fe.includes(s.platform)?s.platform:"linux"}`),s.agent_version?` \xB7 toc-ocra ${s.agent_version}`:""]})]}),(0,o.jsx)(dr,{ctx:e,device:s}),(0,o.jsxs)("div",{className:"da-device-actions",children:[(!s.paired||s.status==="offline"||s.status==="not_connected")&&(0,o.jsx)(C.Btn,{disabled:v||!_,onClick:()=>{j(s)},children:e.t(s.paired?"remote.repair":"remote.install")}),s.paired&&(0,o.jsxs)("label",{className:"da-toggle",children:[(0,o.jsx)("span",{children:e.t("remote.enabled")}),(0,o.jsx)(C.Toggle,{checked:!s.disabled,disabled:v,label:e.t("remote.enabled"),onChange:x=>{re(s,x)}})]})]})]},s.id))}),(0,o.jsx)("p",{className:"da-muted",children:e.t("remote.disableHint")}),(0,o.jsx)("div",{className:"da-step",children:e.t("remote.uninstall")}),(0,o.jsx)(V,{ctx:e,value:"toc-ocra service:uninstall"})]})]})}function sr({ctx:e,pending:r,origin:i,busy:n,onPlatform:u,onRegenerate:h,onClose:c}){let[f,v]=(0,E.useState)(()=>Math.floor(Date.now()/1e3));(0,E.useEffect)(()=>{if(r.matched)return;let d=window.setInterval(()=>v(Math.floor(Date.now()/1e3)),1e3);return()=>window.clearInterval(d)},[r.matched]);let l=Math.max(0,r.expiresAt-f),b=!r.matched&&l===0;return(0,o.jsxs)(C.Card,{children:[(0,o.jsx)(C.CardTitle,{children:e.t("remote.pendingTitle",{name:r.deviceName})}),r.matched?(0,o.jsxs)(o.Fragment,{children:[(0,o.jsxs)("p",{className:"da-text",children:[(0,o.jsx)(C.Badge,{variant:"ok",children:e.t("remote.matched")})," ",e.t("remote.matchedBody",{name:r.deviceName})]}),(0,o.jsx)("div",{className:"da-row",children:(0,o.jsx)(C.Btn,{primary:!0,onClick:c,children:e.t("remote.done")})})]}):(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)("p",{className:"da-text",children:e.t("remote.pendingBody")}),(0,o.jsx)("div",{className:"da-segment",role:"radiogroup","aria-label":e.t("remote.platformLabel"),children:fe.map(d=>(0,o.jsx)("button",{type:"button",role:"radio","aria-checked":r.platform===d,className:r.platform===d?"da-seg da-seg-active":"da-seg",onClick:()=>u(d),children:e.t(`remote.platform.${d}`)},d))}),(0,o.jsx)(V,{ctx:e,value:nr(r.platform,r.code,i)}),(0,o.jsxs)("ul",{className:"da-hints",children:[(0,o.jsx)("li",{children:e.t("remote.hintNode")}),r.platform==="linux"&&(0,o.jsx)("li",{children:e.t("remote.hintLinux")}),r.platform==="win"&&(0,o.jsx)("li",{children:e.t("remote.hintWindows")}),(0,o.jsx)("li",{children:b?e.t("remote.expired"):e.t("remote.expires",{minutes:Math.floor(l/60),seconds:String(l%60).padStart(2,"0")})})]}),(0,o.jsx)("p",{className:"da-muted",children:b?"":e.t("remote.waiting")}),(0,o.jsxs)("div",{className:"da-row",children:[(0,o.jsx)(C.Btn,{disabled:n,onClick:h,children:e.t("remote.regenerate")}),(0,o.jsx)(C.Btn,{disabled:n,onClick:c,children:e.t("remote.cancel")})]})]})]})}var T=D(X(),1),N=D(ie(),1),a=D(H(),1),Me=[{id:"codex",label:"Codex"},{id:"claude",label:"Claude Code"},{id:"gemini",label:"Gemini CLI"}],_e="tb-switch-device";function Z(e){return e.terminal_online??e.online??e.status==="online"}function qe(e){return!e.paired||e.status==="not_connected"?{key:"provider.status.notPaired",variant:"muted"}:e.disabled||e.status==="disabled"?{key:"provider.status.paused",variant:"warn"}:Z(e)?{key:"provider.status.online",variant:"ok"}:{key:"provider.status.offline",variant:"err"}}function lr(e,r){return e.find(i=>i.id===r&&i.paired&&!i.disabled&&Z(i))??e.find(i=>i.is_mine&&i.paired&&!i.disabled&&Z(i))??e.find(i=>i.paired&&!i.disabled&&Z(i))??e.find(i=>i.id===r)??e.find(i=>i.paired)??e[0]}function Ce(e){return e instanceof Error?e.message:String(e)}function Ke({ctx:e,workspace:r,localDeviceId:i}){let[n,u]=(0,T.useState)(null),[h,c]=(0,T.useState)(!1),[f,v]=(0,T.useState)(""),[l,b]=(0,T.useState)({workspaceId:"",deviceId:""}),d=(0,T.useRef)(l);d.current=l;let k=l.workspaceId===r?.id?l.deviceId:"",y=n?.find(m=>m.id===k)??null,[O,K]=(0,T.useState)("codex"),[L,B]=(0,T.useState)(null),[P,w]=(0,T.useState)(!1),[U,R]=(0,T.useState)(""),[$,Y]=(0,T.useState)(!1),[p,_]=(0,T.useState)(""),[A,j]=(0,T.useState)(null),J=(0,T.useRef)(0),re=!!(y&&(y.is_mine||r?.role==="owner"||r?.role==="admin")),s=!!(y?.paired&&!y.disabled&&y.status!=="disabled"&&Z(y)),x=(0,T.useCallback)(async(m=!1)=>{if(!r?.id){u([]);let I={workspaceId:"",deviceId:""};d.current=I,b(I);return}m||c(!0),v("");try{let G=(await e.core.request(`/workspaces/${encodeURIComponent(r.id)}/devices`)).items??[];u(G);let le=d.current,je=le.workspaceId===r.id?le.deviceId:"";if(G.some(he=>he.id===je))return;let Ne="";try{Ne=e.storage.get(`${_e}:${r.id}`,"")}catch{}let Je=G.find(he=>he.id===Ne)??lr(G,i),ce={workspaceId:r.id,deviceId:Je?.id??""};if(d.current=ce,b(ce),ce.deviceId)try{e.storage.set(`${_e}:${r.id}`,ce.deviceId)}catch{}}catch(I){v(Ce(I))}finally{m||c(!1)}},[e,i,r?.id]);(0,T.useEffect)(()=>{x();let m=window.setInterval(()=>{x(!0)},15e3);return()=>window.clearInterval(m)},[x]);let W=m=>{let I={workspaceId:r?.id??"",deviceId:m};if(d.current=I,b(I),_(""),R(""),r?.id)try{e.storage.set(`${_e}:${r.id}`,m)}catch{}},M=y?.id??"",te=(0,T.useCallback)(async()=>{if(!r?.id||!M||!s)return;let m=++J.current;w(!0),R("");try{let I=await e.core.request(`/workspaces/${encodeURIComponent(r.id)}/devices/${encodeURIComponent(M)}/cli-providers/control`,{method:"POST",body:JSON.stringify({app:O,action:"state"})});m===J.current&&B(I)}catch(I){m===J.current&&(B(null),R(Ce(I)))}finally{m===J.current&&w(!1)}},[O,e,s,M,r?.id]);(0,T.useEffect)(()=>{J.current+=1,w(!1),B(null),_(""),s&&te()},[te,s]);let se=async m=>{if(!(!r?.id||!y||!s||m.action!=="state"&&!re||$)){Y(!0),_(""),R("");try{let I=await e.core.request(`/workspaces/${encodeURIComponent(r.id)}/devices/${encodeURIComponent(y.id)}/cli-providers/control`,{method:"POST",body:JSON.stringify({app:O,...m})});B(I),_(m.action==="state"?e.t("provider.refreshed"):e.t("provider.updated"))}catch(I){R(Ce(I))}finally{Y(!1)}}},be=y?qe(y):null,Ye=r?.role==="owner"||r?.role==="admin",ke=n??[];return(0,a.jsxs)("div",{className:"da-provider-page",children:[(0,a.jsxs)("div",{className:"da-provider-toolbar",children:[(0,a.jsxs)("div",{className:"da-provider-device",children:[(0,a.jsx)("label",{htmlFor:"da-provider-device-select",children:e.t("provider.chooseDevice")}),(0,a.jsxs)("select",{id:"da-provider-device-select",className:"da-select",value:k,onChange:m=>W(m.target.value),disabled:h||ke.length===0||$,children:[(0,a.jsx)("option",{value:"",disabled:!0,children:e.t("provider.selectDevice")}),ke.map(m=>{let I=qe(m),G=m.is_mine?e.t("provider.myDevice"):e.t("provider.owner",{owner:m.owner_name||"\u2014"}),le=m.id===i?` \xB7 ${e.t("provider.thisDevice")}`:"";return(0,a.jsxs)("option",{value:m.id,children:[m.name," \xB7 ",e.t(I.key)," \xB7 ",G,le]},m.id)})]}),y&&be&&(0,a.jsx)(N.Badge,{variant:be.variant,children:e.t(be.key)})]}),(0,a.jsx)(N.Btn,{disabled:h,onClick:()=>{x()},children:h?e.t("provider.loading"):e.t("provider.refreshDevices")})]}),h&&n===null&&(0,a.jsx)(N.Card,{children:(0,a.jsx)("span",{className:"da-muted",children:e.t("provider.loadingDevices")})}),f&&(0,a.jsxs)("div",{role:"alert",className:"da-alert",children:[f,(0,a.jsx)(N.Btn,{disabled:h,onClick:()=>{x()},children:e.t("provider.retry")})]}),!r?.id&&(0,a.jsx)(N.Card,{children:(0,a.jsx)(N.CardTitle,{children:e.t("provider.noWorkspace")})}),r?.id&&n?.length===0&&!h&&(0,a.jsxs)(N.Card,{children:[(0,a.jsx)(N.CardTitle,{children:e.t("provider.noDevices")}),(0,a.jsx)("p",{className:"da-text",children:e.t("provider.noDevicesDescription")})]}),y&&(0,a.jsxs)(N.Card,{children:[(0,a.jsxs)("div",{className:"da-provider-heading",children:[(0,a.jsxs)("div",{children:[(0,a.jsx)(N.CardTitle,{children:e.t("provider.title")}),(0,a.jsx)("p",{className:"da-text",children:e.t("provider.description",{name:y.name})})]}),(0,a.jsxs)("div",{className:"da-provider-app-select",children:[(0,a.jsx)("label",{htmlFor:"da-provider-app-select",children:e.t("provider.cli")}),(0,a.jsx)("select",{id:"da-provider-app-select",className:"da-select",value:O,onChange:m=>{K(m.target.value),_("")},disabled:!s||$,children:Me.map(m=>(0,a.jsx)("option",{value:m.id,children:m.label},m.id))}),(0,a.jsx)(N.Btn,{disabled:!s||P||$,onClick:()=>{se({action:"state"})},children:P||$?e.t("provider.loading"):e.t("provider.refresh")})]})]}),y.paired?y.disabled||y.status==="disabled"?(0,a.jsx)("div",{className:"da-provider-message da-provider-warn",children:e.t("provider.paused")}):Z(y)?P&&!L?(0,a.jsx)("div",{className:"da-provider-message",children:e.t("provider.loadingState",{app:Me.find(m=>m.id===O)?.label})}):U?(0,a.jsxs)("div",{role:"alert",className:"da-provider-message da-provider-error",children:[U,(0,a.jsx)(N.Btn,{disabled:P,onClick:()=>{te()},children:e.t("provider.retry")})]}):L?(0,a.jsx)(cr,{ctx:e,state:L,canEdit:re,busy:$,onProvider:m=>{se({action:"switch_provider",provider_id:m})},onMode:m=>j(m),onRoute:m=>{se({action:"select_route",route_id:m})}}):(0,a.jsx)("div",{className:"da-provider-message",children:e.t("provider.selectHint")}):(0,a.jsx)("div",{className:"da-provider-message",children:e.t("provider.offline")}):(0,a.jsx)("div",{className:"da-provider-message",children:e.t("provider.notPaired")}),y.paired&&!re&&(0,a.jsx)("p",{className:"da-muted",children:Ye?e.t("provider.readOnly"):e.t("provider.ownerOnly")}),p&&(0,a.jsx)("div",{role:"status",className:"da-provider-notice",children:p}),L?.warnings?.length?(0,a.jsxs)("div",{className:"da-provider-warnings",children:[(0,a.jsx)("strong",{children:e.t("provider.warnings")}),(0,a.jsx)("ul",{children:L.warnings.map((m,I)=>(0,a.jsx)("li",{children:m},`${I}:${m}`))})]}):null]}),(0,a.jsx)(N.SystemModal,{open:!!A,title:e.t("provider.confirmModeTitle"),description:A==="multi"?e.t("provider.confirmMulti"):e.t("provider.confirmSingle"),onClose:()=>j(null),footer:(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(N.Btn,{onClick:()=>j(null),children:e.t("provider.cancel")}),(0,a.jsx)(N.Btn,{primary:!0,disabled:$,onClick:()=>{let m=A;j(null),m&&se({action:"set_mode",mode:m})},children:e.t("provider.confirm")})]}),children:(0,a.jsx)("p",{className:"da-text",children:e.t("provider.confirmModeHelp")})})]})}function cr({ctx:e,state:r,canEdit:i,busy:n,onProvider:u,onMode:h,onRoute:c}){let f=r.routes.filter(d=>d.enabled),v=r.providers.find(d=>d.id===r.current_provider_id)?.name,l=d=>e.t(d==="single"?"provider.single":"provider.multi"),b=!r.multi_supported||f.length===0;return(0,a.jsxs)("div",{className:"da-provider-controls",children:[(0,a.jsxs)("section",{children:[(0,a.jsx)("div",{className:"da-provider-section-title",children:e.t("provider.mode")}),(0,a.jsx)("div",{className:"da-provider-mode-grid",children:["single","multi"].map(d=>{let k=r.mode===d;return(0,a.jsxs)("button",{type:"button",className:k?"da-provider-mode da-provider-mode-active":"da-provider-mode",disabled:!i||n||k||d==="multi"&&b,onClick:()=>h(d),children:[(0,a.jsx)("span",{className:k?"da-provider-radio da-provider-radio-active":"da-provider-radio",children:k?"\u2713":""}),(0,a.jsxs)("span",{children:[(0,a.jsx)("strong",{children:l(d)}),(0,a.jsx)("small",{children:e.t(d==="single"?"provider.singleDescription":"provider.multiDescription")})]})]},d)})}),!r.multi_supported&&(0,a.jsx)("p",{className:"da-muted",children:e.t("provider.multiUnsupported")}),r.multi_supported&&f.length===0&&(0,a.jsx)("p",{className:"da-muted",children:e.t("provider.noRoutes")})]}),r.mode==="multi"?(0,a.jsxs)("section",{children:[(0,a.jsxs)("div",{className:"da-provider-section-title",children:[e.t("provider.defaultRoute"),r.proxy_running&&(0,a.jsx)(N.Badge,{variant:"ok",children:e.t("provider.proxyRunning")})]}),f.length===0?(0,a.jsx)("div",{className:"da-provider-message",children:e.t("provider.noRoutes")}):(0,a.jsx)("div",{className:"da-provider-list",children:f.map(d=>{let k=r.current_route_id===d.id,y=r.providers.find(O=>O.id===d.provider_id);return(0,a.jsxs)("button",{type:"button",className:"da-provider-item",disabled:!i||n||k,onClick:()=>c(d.id),children:[(0,a.jsxs)("span",{className:"da-provider-item-copy",children:[(0,a.jsx)("strong",{children:d.display_name||d.route_model}),(0,a.jsxs)("small",{children:[d.route_model," \u2192 ",y?.name??e.t("provider.providerRemoved")," \xB7 ",d.model]})]}),k&&(0,a.jsx)(N.Badge,{variant:"ok",children:e.t("provider.current")})]},d.id)})})]}):(0,a.jsxs)("section",{children:[(0,a.jsx)("div",{className:"da-provider-section-title",children:e.t("provider.configuredProviders")}),r.providers.length===0?(0,a.jsx)("div",{className:"da-provider-message",children:e.t("provider.noProviders")}):(0,a.jsx)("div",{className:"da-provider-list",children:r.providers.map(d=>{let k=r.current_provider_id===d.id;return(0,a.jsxs)("button",{type:"button",className:"da-provider-item",disabled:!i||n||k,onClick:()=>u(d.id),children:[(0,a.jsxs)("span",{className:"da-provider-item-copy",children:[(0,a.jsx)("strong",{children:d.name}),(0,a.jsx)("small",{children:e.t(d.category==="official"?"provider.official":"provider.custom")})]}),k&&(0,a.jsx)(N.Badge,{variant:"ok",children:e.t("provider.current")})]},d.id)})}),v&&(0,a.jsx)("p",{className:"da-muted",children:e.t("provider.currentProvider",{name:v})})]})]})}var t=D(H(),1),pr=3e3,mr=1e4,ur=6e4,vr=3,We="tab",gr=new URL("../../assets/icon.svg",import.meta.url).href;function fr(){return(0,t.jsx)("img",{src:gr,alt:"",width:16,height:16,draggable:!1})}function He(e){let r=e.core.service;try{return r&&r.available()?r:void 0}catch{return}}var de=e=>e?.state==="running"||e?.state==="starting";async function Fe(e){try{return await q.info(e),!0}catch{return!1}}var ee;function br({ctx:e}){let r=we(e,"server"),i=we(e,"workspace"),[n,u]=(0,S.useState)(()=>{let p=e.storage.get(We,"local");return p==="remote"||p==="providers"?p:"local"}),h=p=>{e.storage.set(We,p),u(p)},[c]=(0,S.useState)(()=>e.storage.get(ue,pe)),[f,v]=(0,S.useState)(()=>e.secureStorage.get(F,"")),[l,b]=(0,S.useState)({kind:"checking"}),[d,k]=(0,S.useState)(null),[y,O]=(0,S.useState)(""),[K,L]=(0,S.useState)(!1),B=(0,S.useRef)(!0),P=He(e),w=(0,S.useCallback)(async()=>{let p=null;if(P)try{p=await P.status()}catch{p=null}if(!B.current)return;k(p);let _=f;de(p)&&p?.token&&(_=p.token,p.token!==f&&(e.secureStorage.set(F,p.token),v(p.token)));try{await q.info(c)}catch{B.current&&b({kind:de(p)?"starting":"offline"});return}if(!_){B.current&&b({kind:"needsCode"});return}try{let A=await q.status(c,_);B.current&&b({kind:"ready",status:A})}catch(A){if(!B.current)return;A instanceof z&&A.kind==="unauthorized"?(e.secureStorage.remove(F),v(""),b({kind:"needsCode"})):b({kind:"offline"})}},[e,c,P,f]);(0,S.useEffect)(()=>{B.current=!0,w();let p=window.setInterval(()=>{w()},pr);return()=>{B.current=!1,window.clearInterval(p)}},[w]),(0,S.useEffect)(()=>{if(l.kind==="ready"){let p=l.status;e.reportHealth(p.paired&&p.connected?{status:"healthy",summary:e.t("health.online",{name:p.device_name})}:{status:"degraded",summary:e.t(p.paired?"health.disconnected":"health.unpaired")})}else l.kind==="offline"&&e.reportHealth({status:"degraded",summary:e.t(P?"health.disabled":"health.offline")})},[e,l,P]);let U=async p=>{L(!0),O("");try{await p()}catch(_){O(ne(e,_))}finally{L(!1)}},R=p=>U(async()=>{if(!P)return;if(!p){e.storage.set(ve,"off"),k(await P.stop()),await w();return}if(e.storage.set(ve,"on"),e.storage.remove(oe),!de(d)&&await Fe(c)){ee?.(),await w();return}let _=await P.start();k(_),_.token&&(e.secureStorage.set(F,_.token),v(_.token)),await hr(c,()=>B.current)&&ee?.(),await w()}),$=d?.state==="exited"?d:null,Y=!!P&&!de(d)&&(l.kind==="ready"||l.kind==="needsCode");return(0,t.jsxs)("div",{className:"da-app",children:[(0,t.jsx)(g.PageHeader,{title:e.t("page.title"),subtitle:e.t("page.subtitle")}),(0,t.jsx)("div",{className:"da-tabs",role:"tablist","aria-label":e.t("page.title"),children:["local","remote","providers"].map(p=>(0,t.jsx)("button",{type:"button",role:"tab","aria-selected":n===p,className:n===p?"da-tab da-tab-active":"da-tab",onClick:()=>h(p),children:e.t(`tabs.${p}`)},p))}),y&&(0,t.jsx)("div",{role:"alert",className:"da-alert",children:y}),n==="remote"&&(0,t.jsx)(ze,{ctx:e,server:r,workspace:i,localDeviceId:l.kind==="ready"&&l.status.paired?l.status.device_id:""}),n==="providers"&&(0,t.jsx)(Ke,{ctx:e,workspace:i,localDeviceId:l.kind==="ready"&&l.status.paired?l.status.device_id:""}),n==="local"&&(0,t.jsxs)(t.Fragment,{children:[P&&(0,t.jsx)(yr,{ctx:e,status:d,external:Y,exit:$,busy:K,onToggle:p=>{R(p)}}),l.kind==="checking"&&(0,t.jsx)(g.Card,{children:(0,t.jsx)("span",{className:"da-muted",children:e.t("common.checking")})}),l.kind==="starting"&&(0,t.jsx)(g.Card,{children:(0,t.jsx)("span",{className:"da-muted",children:e.t("service.starting")})}),l.kind==="offline"&&!P&&(0,t.jsx)(wr,{ctx:e,localUrl:c}),l.kind==="needsCode"&&(0,t.jsx)(_r,{ctx:e,busy:K,onPair:p=>U(async()=>{let _=await q.pair(c,p).catch(A=>{throw A instanceof z&&A.code==="code_wrong"?new Error(e.t("pair.wrong")):A instanceof z&&A.code==="locked"?new Error(e.t("pair.locked")):A});e.secureStorage.set(F,_.token),v(_.token)})}),l.kind==="ready"&&(0,t.jsx)(Cr,{ctx:e,status:l.status,server:r,workspace:i,busy:K,run:U,localUrl:c,token:f,onStatus:p=>b({kind:"ready",status:p})})]})]})}async function hr(e,r){for(let i=0;i<30&&r();i+=1)try{return await q.info(e),!0}catch{await new Promise(n=>window.setTimeout(n,500))}return!1}function yr({ctx:e,status:r,external:i,exit:n,busy:u,onToggle:h}){let c=de(r),f=!c&&i,v=c||f,l=n?.exitCode===vr;return(0,t.jsxs)(g.Card,{children:[(0,t.jsxs)("div",{className:"da-switch",children:[(0,t.jsxs)("div",{children:[(0,t.jsx)(g.CardTitle,{children:e.t("service.title")}),(0,t.jsx)("p",{className:"da-text",children:e.t(f?"service.onExternalBody":v?"service.onBody":"service.offBody")})]}),(0,t.jsx)(g.Toggle,{checked:v,disabled:u||f,label:e.t("service.title"),onChange:h})]}),c&&(0,t.jsx)("p",{className:"da-muted",children:e.t("service.followsApp")}),f&&(0,t.jsx)("p",{className:"da-muted",children:e.t("service.external")}),!v&&l&&(0,t.jsx)("p",{className:"da-muted",children:e.t("service.portTaken")}),n&&!l&&n.exitCode!==0&&(0,t.jsx)("div",{role:"alert",className:"da-alert",children:e.t("service.crashed",{error:n.error||`exit ${n.exitCode??n.signal??"?"}`})})]})}function wr({ctx:e,localUrl:r}){return(0,t.jsxs)(g.Card,{children:[(0,t.jsx)(g.CardTitle,{children:e.t("offline.title")}),(0,t.jsx)("p",{className:"da-text",children:e.t("offline.body",{url:r})}),(0,t.jsx)("div",{className:"da-step",children:e.t("offline.once")}),(0,t.jsx)(V,{ctx:e,value:"npx toc-ocra@latest run"}),(0,t.jsx)("div",{className:"da-step",children:e.t("offline.service")}),(0,t.jsx)(V,{ctx:e,value:"npm install -g toc-ocra@latest && toc-ocra service:install"}),(0,t.jsx)("p",{className:"da-muted",children:e.t("offline.node")})]})}function _r({ctx:e,busy:r,onPair:i}){let[n,u]=(0,S.useState)(""),h=/^\d{6}$/.test(n);return(0,t.jsxs)(g.Card,{children:[(0,t.jsx)(g.CardTitle,{children:e.t("pair.title")}),(0,t.jsx)("p",{className:"da-text",children:e.t("pair.body")}),(0,t.jsx)(V,{ctx:e,value:"toc-ocra code"}),(0,t.jsxs)("form",{className:"da-row",onSubmit:c=>{c.preventDefault(),h&&i(n)},children:[(0,t.jsx)(g.Input,{value:n,onChange:c=>u(c.target.value.replace(/\D/g,"").slice(0,6)),placeholder:e.t("pair.placeholder"),inputMode:"numeric",autoComplete:"one-time-code","aria-label":e.t("pair.placeholder"),className:"da-code-input"}),(0,t.jsx)(g.Btn,{primary:!0,type:"submit",disabled:!h||r,children:e.t("pair.submit")})]})]})}function Cr({ctx:e,status:r,server:i,workspace:n,busy:u,run:h,localUrl:c,token:f,onStatus:v}){let l=r.paired&&i&&!me(r.server_url,i.origin),b=()=>h(async()=>{r.device_id&&i&&me(r.server_url,i.origin)&&await e.core.request(`/devices/${encodeURIComponent(r.device_id)}/agent`,{method:"DELETE"}).catch(()=>{}),e.storage.set(oe,"off"),v(await q.unpair(c,f))});return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsxs)(g.Card,{children:[(0,t.jsx)(g.CardTitle,{children:e.t("status.title")}),(0,t.jsxs)("dl",{className:"da-grid",children:[(0,t.jsxs)("div",{children:[(0,t.jsx)("dt",{children:e.t("status.service")}),(0,t.jsxs)("dd",{children:["toc-ocra ",r.version," \xB7 ",r.hostname]})]}),(0,t.jsxs)("div",{children:[(0,t.jsx)("dt",{children:e.t("status.binding")}),(0,t.jsx)("dd",{children:(0,t.jsx)(kr,{ctx:e,status:r})})]}),r.paired&&(0,t.jsxs)("div",{children:[(0,t.jsx)("dt",{children:e.t("status.device")}),(0,t.jsx)("dd",{children:r.device_name})]}),r.paired&&(0,t.jsxs)("div",{children:[(0,t.jsx)("dt",{children:e.t("status.server")}),(0,t.jsx)("dd",{className:"da-mono",children:r.server_url})]}),r.paired&&(0,t.jsxs)("div",{children:[(0,t.jsx)("dt",{children:e.t("status.runs")}),(0,t.jsx)("dd",{children:r.active_runs})]})]}),r.paired&&!r.connected&&r.connection_error&&(0,t.jsx)("p",{className:"da-muted",children:e.t("status.lastError",{error:r.connection_error})}),r.token_from_env&&(0,t.jsx)("p",{className:"da-muted",children:e.t("status.tokenFromEnv")}),r.paired&&(0,t.jsx)("div",{className:"da-row",children:(0,t.jsx)(g.Btn,{danger:!0,disabled:u||r.token_from_env,onClick:()=>{b()},children:e.t("status.unpair")})})]}),(!r.paired||r.unauthorized||l)&&(0,t.jsx)(Nr,{ctx:e,status:r,server:i,workspace:n,busy:u,run:h,localUrl:c,token:f,onStatus:v,rebind:r.paired}),(0,t.jsxs)(g.Card,{children:[(0,t.jsx)(g.CardTitle,{children:e.t("cli.title")}),(0,t.jsxs)("ul",{className:"da-list",children:[r.providers.filter(d=>d.installed).map(d=>(0,t.jsxs)("li",{children:[(0,t.jsx)("span",{className:"da-mono",children:d.id}),(0,t.jsx)("span",{className:"da-muted",children:d.version}),d.runnable?(0,t.jsx)(g.Badge,{variant:"ok",children:e.t("cli.runnable")}):(0,t.jsx)(g.Badge,{variant:"muted",children:e.t("cli.detectOnly")})]},d.id)),!r.providers.some(d=>d.installed)&&(0,t.jsx)("li",{className:"da-muted",children:e.t("cli.none")})]}),(0,t.jsx)("div",{className:"da-row",children:(0,t.jsx)(g.Btn,{disabled:u,onClick:()=>{h(async()=>v(await q.detect(c,f)))},children:e.t("cli.redetect")})})]})]})}function kr({ctx:e,status:r}){return r.paired?r.unauthorized?(0,t.jsx)(g.Badge,{variant:"err",children:e.t("binding.revoked")}):r.connected?(0,t.jsx)(g.Badge,{variant:"ok",children:e.t("binding.online")}):(0,t.jsx)(g.Badge,{variant:"warn",children:e.t("binding.connecting")}):(0,t.jsx)(g.Badge,{variant:"muted",children:e.t("binding.unpaired")})}function Nr({ctx:e,status:r,server:i,workspace:n,busy:u,run:h,localUrl:c,token:f,onStatus:v,rebind:l}){let[b,d]=(0,S.useState)([]),[k,y]=(0,S.useState)("new"),[O,K]=(0,S.useState)(r.hostname),[L,B]=(0,S.useState)(i?.origin??"");(0,S.useEffect)(()=>{i?.origin&&B(i.origin)},[i?.origin]),(0,S.useEffect)(()=>{if(!n?.id)return;let w=!1;return e.core.request(`/workspaces/${encodeURIComponent(n.id)}/devices`).then(U=>{w||d((U.items??[]).filter(R=>R.is_mine))}).catch(()=>{w||d([])}),()=>{w=!0}},[e,n?.id]);let P=()=>h(async()=>{if(!n?.id)throw new Error(e.t("bind.noWorkspace"));if(!L.trim())throw new Error(e.t("bind.noServer"));let w=k,U;if(k==="new"){if(!r.machine_id)throw new Error(e.t("bind.identityRequired"));let R=await e.core.request("/devices/machine/pairing-code",{method:"POST",body:JSON.stringify({machine_id:r.machine_id,hostname:O.trim()||r.hostname,platform:r.platform,current_device_id:r.paired?r.device_id:""})});w=R.device_id,y(w),U=R}else U=await e.core.request(`/devices/${encodeURIComponent(w)}/pairing-code`,{method:"POST"});v(await q.enroll(c,f,L.trim(),U.code)),e.storage.remove(oe),e.notify({title:e.t("page.title"),body:e.t("bind.done",{server:i?.name??L})})});return(0,t.jsxs)(g.Card,{children:[(0,t.jsx)(g.CardTitle,{children:e.t(l?"bind.rebindTitle":"bind.title")}),l&&r.unauthorized&&(0,t.jsx)("p",{className:"da-text",children:e.t("bind.revoked")}),l&&!r.unauthorized&&(0,t.jsx)("p",{className:"da-text",children:e.t("bind.elsewhere",{bound:r.server_url,current:i?.origin??""})}),(0,t.jsx)("p",{className:"da-text",children:e.t("bind.body",{server:i?.name??"",workspace:n?.name??""})}),(0,t.jsxs)("label",{className:"da-field",children:[(0,t.jsx)("span",{children:e.t("bind.server")}),(0,t.jsx)(g.Input,{value:L,onChange:w=>B(w.target.value),spellCheck:!1,className:"da-mono"})]}),(0,t.jsxs)("label",{className:"da-field",children:[(0,t.jsx)("span",{children:e.t("bind.device")}),(0,t.jsxs)("select",{className:"da-select",value:k,onChange:w=>y(w.target.value),children:[(0,t.jsx)("option",{value:"new",children:e.t("bind.newDevice")}),b.map(w=>(0,t.jsxs)("option",{value:w.id,children:[w.name,w.paired?` \xB7 ${e.t("bind.replaces")}`:""]},w.id))]})]}),k==="new"&&(0,t.jsxs)("label",{className:"da-field",children:[(0,t.jsx)("span",{children:e.t("bind.name")}),(0,t.jsx)(g.Input,{value:O,onChange:w=>K(w.target.value),maxLength:100})]}),(0,t.jsx)("div",{className:"da-row",children:(0,t.jsx)(g.Btn,{primary:!0,disabled:u||!n?.id,onClick:()=>{P()},children:e.t(u?"bind.working":"bind.submit")})})]})}function Sr(e){let r=!1,i="",n=new Map,u=async()=>{if(r||e.signal.aborted)return;let c=e.core.context("server"),f=e.secureStorage.get(F,"");if(!(!c?.origin||!f||e.storage.get(oe,"on")==="off")&&!(Date.now()-(n.get(c.origin)??0)<ur)){r=!0;try{let v=e.storage.get(ue,pe),l=await q.status(v,f);if(!l.machine_id||l.token_from_env)return;if(l.paired&&(l.unauthorized||me(l.server_url,c.origin))){i="";return}if(l.active_runs>0){i!==c.origin&&(i=c.origin,e.notify({title:e.t("page.title"),body:e.t("auto.deferred",{server:c.name||c.origin})}));return}let b=await e.core.request("/devices/machine/pairing-code",{method:"POST",body:JSON.stringify({machine_id:l.machine_id,hostname:l.hostname,platform:l.platform,current_device_id:l.paired?l.device_id:""})});await q.enroll(v,f,c.origin,b.code),i="",n.delete(c.origin),e.notify({title:e.t("page.title"),body:e.t("auto.done",{server:c.name||c.origin,device:b.device_name})})}catch(v){(!(v instanceof z)||v.kind==="rejected")&&n.set(c.origin,Date.now())}finally{r=!1}}},h=window.setInterval(()=>{u()},mr);ee=()=>{u()},e.registerDisposer(()=>{window.clearInterval(h),ee=void 0}),e.registerDisposer(e.core.onContextChange("server",()=>{u()})),window.setTimeout(()=>{u()},1500)}function Pr(e){let r=He(e);if(!r||e.storage.get(ve,"off")!=="on")return;let i=e.storage.get(ue,pe);Fe(i).then(n=>{if(n){window.setTimeout(()=>ee?.(),3e3);return}return r.start()}).then(n=>{n&&(n.token&&e.secureStorage.set(F,n.token),window.setTimeout(()=>ee?.(),3e3))}).catch(()=>{})}var Yr=Le({activate(e){e.registerNavigation("agent.nav",(0,t.jsx)(fr,{})),e.registerRoute("agent.home",(0,t.jsx)(br,{ctx:e})),Pr(e),Sr(e)}});export{Yr as default};
2
2
  //# sourceMappingURL=renderer.js.map