@tianshu-ai/tianshu 0.43.6 → 0.45.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (88) hide show
  1. package/README.md +16 -1
  2. package/node_modules/@tianshu-ai/plugin-sdk/dist/manifest.d.ts +43 -0
  3. package/node_modules/@tianshu-ai/plugin-sdk/dist/manifest.d.ts.map +1 -1
  4. package/node_modules/@tianshu-ai/plugin-sdk/package.json +1 -1
  5. package/node_modules/@tianshu-ai/plugin-sdk/src/manifest.ts +44 -0
  6. package/package.json +4 -4
  7. package/packages/plugin-sdk/dist/manifest.d.ts +43 -0
  8. package/packages/plugin-sdk/dist/manifest.d.ts.map +1 -1
  9. package/packages/plugin-sdk/package.json +1 -1
  10. package/packages/server/builtinConfig/plugins/custom-ui/dist/client.js +310 -0
  11. package/packages/server/builtinConfig/plugins/custom-ui/dist/index.html +54 -0
  12. package/packages/server/builtinConfig/plugins/custom-ui/dist/server.js +176 -0
  13. package/packages/server/builtinConfig/plugins/custom-ui/locales/en.json +30 -0
  14. package/packages/server/builtinConfig/plugins/custom-ui/locales/zh.json +30 -0
  15. package/packages/server/builtinConfig/plugins/custom-ui/manifest.json +93 -0
  16. package/packages/server/builtinConfig/plugins/custom-ui/skills/api-reference.md +441 -0
  17. package/packages/server/builtinConfig/plugins/custom-ui/skills/shell-dev.md +243 -0
  18. package/packages/server/builtinConfig/plugins/custom-ui/skills/ws-protocol.md +244 -0
  19. package/packages/server/builtinConfig/plugins/datasource/locales/en.json +6 -0
  20. package/packages/server/builtinConfig/plugins/datasource/locales/zh.json +6 -0
  21. package/packages/server/dist/boot/shell-spa.d.ts +12 -0
  22. package/packages/server/dist/boot/shell-spa.d.ts.map +1 -0
  23. package/packages/server/dist/boot/shell-spa.js +164 -0
  24. package/packages/server/dist/boot/shell-spa.js.map +1 -0
  25. package/packages/server/dist/chat/handler.d.ts.map +1 -1
  26. package/packages/server/dist/chat/handler.js +7 -1
  27. package/packages/server/dist/chat/handler.js.map +1 -1
  28. package/packages/server/dist/chat/messages.d.ts +5 -0
  29. package/packages/server/dist/chat/messages.d.ts.map +1 -1
  30. package/packages/server/dist/chat/messages.js +11 -0
  31. package/packages/server/dist/chat/messages.js.map +1 -1
  32. package/packages/server/dist/chat/ws-protocol.d.ts +6 -0
  33. package/packages/server/dist/chat/ws-protocol.d.ts.map +1 -1
  34. package/packages/server/dist/chat/ws-protocol.js.map +1 -1
  35. package/packages/server/dist/core/plugins/manifest.d.ts.map +1 -1
  36. package/packages/server/dist/core/plugins/manifest.js +30 -0
  37. package/packages/server/dist/core/plugins/manifest.js.map +1 -1
  38. package/packages/server/dist/core/plugins/registry.d.ts +6 -0
  39. package/packages/server/dist/core/plugins/registry.d.ts.map +1 -1
  40. package/packages/server/dist/core/plugins/registry.js +13 -0
  41. package/packages/server/dist/core/plugins/registry.js.map +1 -1
  42. package/packages/server/dist/index.js +5 -0
  43. package/packages/server/dist/index.js.map +1 -1
  44. package/packages/server/dist/setup/checks/providers.d.ts.map +1 -1
  45. package/packages/server/dist/setup/checks/providers.js +28 -0
  46. package/packages/server/dist/setup/checks/providers.js.map +1 -1
  47. package/packages/server/dist/setup/checks/runtime.d.ts.map +1 -1
  48. package/packages/server/dist/setup/checks/runtime.js +18 -0
  49. package/packages/server/dist/setup/checks/runtime.js.map +1 -1
  50. package/packages/server/dist/setup/cli-agent.d.ts.map +1 -1
  51. package/packages/server/dist/setup/cli-agent.js +105 -0
  52. package/packages/server/dist/setup/cli-agent.js.map +1 -1
  53. package/packages/server/dist/setup/doctor.d.ts.map +1 -1
  54. package/packages/server/dist/setup/doctor.js +40 -5
  55. package/packages/server/dist/setup/doctor.js.map +1 -1
  56. package/packages/server/package.json +4 -4
  57. package/packages/web/dist/assets/{DataSourceConfigForm-CnZzI0HE.js → DataSourceConfigForm-BAgp6paU.js} +1 -1
  58. package/packages/web/dist/assets/{bundle-web-DJLM-BCY.js → bundle-web-BxbSFlI1.js} +1 -1
  59. package/packages/web/dist/assets/index-C-YokkD5.js +165 -0
  60. package/packages/web/dist/assets/index-FSyxAKaH.css +2 -0
  61. package/packages/web/dist/assets/{react-force-graph-2d-IeiQuRd-.js → react-force-graph-2d-OSkKwJ-2.js} +1 -1
  62. package/packages/web/dist/index.html +2 -2
  63. package/packages/web/package.json +2 -2
  64. package/plugins/board/dist/client.d.ts.map +1 -1
  65. package/plugins/board/dist/client.js +15 -3
  66. package/plugins/board/dist/client.js.map +1 -1
  67. package/plugins/board/package.json +1 -1
  68. package/plugins/cron/package.json +1 -1
  69. package/plugins/custom-ui/dist/client.js +310 -0
  70. package/plugins/custom-ui/dist/index.html +54 -0
  71. package/plugins/custom-ui/dist/server.js +176 -0
  72. package/plugins/custom-ui/manifest.json +93 -0
  73. package/plugins/custom-ui/skills/api-reference.md +441 -0
  74. package/plugins/custom-ui/skills/shell-dev.md +243 -0
  75. package/plugins/custom-ui/skills/ws-protocol.md +244 -0
  76. package/plugins/files/package.json +1 -1
  77. package/plugins/microsandbox/dist/server.js +7 -2
  78. package/plugins/microsandbox/dist/server.js.map +1 -1
  79. package/plugins/microsandbox/package.json +1 -1
  80. package/plugins/openshell/package.json +1 -1
  81. package/plugins/reverse-mcp/package.json +1 -1
  82. package/plugins/web-search/package.json +1 -1
  83. package/plugins/wechat/package.json +1 -1
  84. package/plugins/wiki/package.json +1 -1
  85. package/plugins/workboard/package.json +1 -1
  86. package/plugins/workforce-studio/package.json +1 -1
  87. package/packages/web/dist/assets/index-BLKQnm43.css +0 -2
  88. package/packages/web/dist/assets/index-izYY6ern.js +0 -114
package/README.md CHANGED
@@ -271,6 +271,11 @@ channels. Tianshu ships these built-in:
271
271
  | **Workboard** | The Kanban task board + worker pool. The orchestrator drops tasks onto Ready; workers pick them up, run them (with a live transcript), and report back through In-progress → Done. Supports task dependency graphs and per-worker config. |
272
272
  | **Workforce Studio** | Inspect, edit, diff, export/import, and **activate** your whole agent configuration (main agent + every worker + the enabled plugin set + prompt blocks) as a single versionable **Solution**, in a three-pane IDE. |
273
273
  | **Web Search** | Key-free `web_search` (hosted Exa / Parallel endpoint, no API key) plus a `web_fetch` tool that reads any page to markdown. |
274
+ | **Data Sources** | Connect agents to databases — Neo4j graph, MySQL, and more. Agent tools (`ds_query`, `ds_schema`, `ds_panel`) plus a side-panel query explorer with resizable columns, sort, and filter. Board apps get `board.ds()` / `board.dsList()` for live database queries inside dashboards. |
275
+ | **Boards** | Interactive HTML dashboards the agent builds and drops into chat or the side panel. Built-in `board.llm()` for LLM calls and `board.ds()` for database queries — no API keys needed inside board code. Fullscreen mode for data-heavy dashboards. |
276
+ | **Scheduler (Cron)** | Scheduled and recurring jobs with a calendar panel. Fire a message into a session or drop a task on the workboard at a set time or on a cron schedule. Timezone-aware. |
277
+ | **Wiki** | LLM-powered knowledge vault that distils conversations into an Obsidian-style wiki. Auto-files entities, concepts, and topics. Side-panel browse + semantic search. |
278
+ | **Local Bridge** | Connect tools on your own machine (browser, files, shell) into tianshu over WebSocket. No VM needed — runs on your actual machine. Scoped to your sessions. |
274
279
  | **WeChat (微信)** | A chat channel backed by Tencent's iLink bot API — scan a QR code to authorise, then inbound DMs route to the agent through the channel system. |
275
280
 
276
281
  Manage them under **Settings → Plugins** (enable/disable + per-plugin
@@ -473,13 +478,23 @@ the full picture.
473
478
  - [x] Rate-limit-aware model retries + client auto-reconnect / resume
474
479
  - [x] Key-free `web_search` + `web_fetch`
475
480
  - [x] Worker task dependency graphs in one batch
481
+ - [x] **Data Sources plugin** — unified multi-database connector
482
+ (Neo4j + MySQL), query panel with sort/filter/resize,
483
+ `board.ds()` API for dashboard apps
484
+ - [x] **Board enhancements** — `board.llm()` + `board.ds()` APIs,
485
+ fullscreen mode, chat-embedded boards with API access
486
+ - [x] **Setup agent improvements** — full plugin catalog knowledge,
487
+ runtime mutual-exclusivity enforcement, `compat` field
488
+ guidance, cross-arch deployment flow, China network hints
489
+ - [x] **Doctor improvements** — `supportsDeveloperRole` compat check,
490
+ HOME env check, only checks enabled plugins' prerequisites
476
491
 
477
492
  **Next (0.5.x → 0.6)**
478
493
 
479
494
  - [ ] **Auth + roles** — login, and an authorization gate on the
480
495
  admin/Settings surface (see the security note above)
481
496
  - [ ] Docker image with sandbox layer baked in
482
- - [ ] Linux systemd user service (matches macOS launchd UX)
497
+ - [x] Linux systemd service (`tianshu-prod.service` for npm global installs)
483
498
  - [ ] Skills marketplace (registry + install command)
484
499
  - [ ] **Orchestrator analytics**: `worker_analytics` /
485
500
  `worker_task_timeline` /
@@ -60,6 +60,23 @@ export interface PluginManifest {
60
60
  client?: PluginEntryRef;
61
61
  server?: PluginEntryRef;
62
62
  contributes?: ContributesV1;
63
+ /**
64
+ * UI Shell override (ADR-0005). When present, this plugin replaces
65
+ * the **entire frontend** for any tenant that enables it. The
66
+ * server serves the plugin's built SPA instead of the default
67
+ * `@tianshu/web` bundle.
68
+ *
69
+ * Constraints:
70
+ * - At most ONE uiShell plugin may be active per tenant. Enabling
71
+ * a second one fails activation with a conflict error.
72
+ * - The shell SPA talks to the same `/api/*` and `/ws` endpoints;
73
+ * backend behaviour is unchanged.
74
+ * - `contributes` (API routes, tools, etc.) still works — a shell
75
+ * plugin can contribute server-side logic alongside its UI.
76
+ * - In dev mode, set `devServer.target` to proxy to an external
77
+ * vite/webpack dev server for HMR.
78
+ */
79
+ uiShell?: PluginUiShell;
63
80
  /**
64
81
  * Optional declarative schema for the plugin's own config
65
82
  * (`tenant config.plugins.<id>.config`). When present the host
@@ -110,6 +127,32 @@ export interface PluginManifest {
110
127
  * it shows them to the user and waits for confirmation. The
111
128
  * read-only `verify` commands can run silently.
112
129
  */
130
+ export interface PluginUiShell {
131
+ /**
132
+ * Directory containing the built SPA (index.html + assets),
133
+ * relative to the plugin directory. The server serves these
134
+ * files for the tenant instead of the default web dist.
135
+ */
136
+ dist: string;
137
+ /**
138
+ * When true (default), any non-API GET request that doesn't
139
+ * match a static file returns index.html (standard SPA
140
+ * fallback). Set to false for multi-page or SSR setups where
141
+ * only exact file matches should be served.
142
+ */
143
+ fallbackSpa?: boolean;
144
+ /**
145
+ * Dev-mode proxy target. When set AND the plugin directory
146
+ * does not contain a built `dist/index.html`, the server
147
+ * proxies non-API requests to this URL instead of serving
148
+ * static files. Enables HMR with an external dev server.
149
+ *
150
+ * Only used when `process.env.NODE_ENV !== "production"`.
151
+ */
152
+ devServer?: {
153
+ target: string;
154
+ };
155
+ }
113
156
  export interface PluginSetupSpec {
114
157
  /**
115
158
  * One-paragraph summary the setup agent shows before listing
@@ -1 +1 @@
1
- {"version":3,"file":"manifest.d.ts","sourceRoot":"","sources":["../src/manifest.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"manifest.d.ts","sourceRoot":"","sources":["../src/manifest.ts"],"names":[],"mappings":"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"}
@@ -28,7 +28,7 @@
28
28
  "@types/node": "^26.1.1",
29
29
  "@types/react": "^19.2.18",
30
30
  "typescript": "^7.0.2",
31
- "vitest": "^4.1.11"
31
+ "vitest": "^5.0.0"
32
32
  },
33
33
  "dependencies": {
34
34
  "@modelcontextprotocol/sdk": "^1.29.0"
@@ -66,6 +66,23 @@ export interface PluginManifest {
66
66
  client?: PluginEntryRef;
67
67
  server?: PluginEntryRef;
68
68
  contributes?: ContributesV1;
69
+ /**
70
+ * UI Shell override (ADR-0005). When present, this plugin replaces
71
+ * the **entire frontend** for any tenant that enables it. The
72
+ * server serves the plugin's built SPA instead of the default
73
+ * `@tianshu/web` bundle.
74
+ *
75
+ * Constraints:
76
+ * - At most ONE uiShell plugin may be active per tenant. Enabling
77
+ * a second one fails activation with a conflict error.
78
+ * - The shell SPA talks to the same `/api/*` and `/ws` endpoints;
79
+ * backend behaviour is unchanged.
80
+ * - `contributes` (API routes, tools, etc.) still works — a shell
81
+ * plugin can contribute server-side logic alongside its UI.
82
+ * - In dev mode, set `devServer.target` to proxy to an external
83
+ * vite/webpack dev server for HMR.
84
+ */
85
+ uiShell?: PluginUiShell;
69
86
  /**
70
87
  * Optional declarative schema for the plugin's own config
71
88
  * (`tenant config.plugins.<id>.config`). When present the host
@@ -117,6 +134,33 @@ export interface PluginManifest {
117
134
  * it shows them to the user and waits for confirmation. The
118
135
  * read-only `verify` commands can run silently.
119
136
  */
137
+ export interface PluginUiShell {
138
+ /**
139
+ * Directory containing the built SPA (index.html + assets),
140
+ * relative to the plugin directory. The server serves these
141
+ * files for the tenant instead of the default web dist.
142
+ */
143
+ dist: string;
144
+ /**
145
+ * When true (default), any non-API GET request that doesn't
146
+ * match a static file returns index.html (standard SPA
147
+ * fallback). Set to false for multi-page or SSR setups where
148
+ * only exact file matches should be served.
149
+ */
150
+ fallbackSpa?: boolean;
151
+ /**
152
+ * Dev-mode proxy target. When set AND the plugin directory
153
+ * does not contain a built `dist/index.html`, the server
154
+ * proxies non-API requests to this URL instead of serving
155
+ * static files. Enables HMR with an external dev server.
156
+ *
157
+ * Only used when `process.env.NODE_ENV !== "production"`.
158
+ */
159
+ devServer?: {
160
+ target: string;
161
+ };
162
+ }
163
+
120
164
  export interface PluginSetupSpec {
121
165
  /**
122
166
  * One-paragraph summary the setup agent shows before listing
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tianshu-ai/tianshu",
3
- "version": "0.43.6",
3
+ "version": "0.45.0",
4
4
  "description": "An open AI agent platform with a sidecar browser. Built in public.",
5
5
  "license": "Apache-2.0",
6
6
  "homepage": "https://github.com/tianshu-ai/tianshu",
@@ -66,11 +66,11 @@
66
66
  },
67
67
  "dependencies": {
68
68
  "@clack/prompts": "^1.5.1",
69
- "@earendil-works/pi-agent-core": "^0.82.1",
70
- "@earendil-works/pi-ai": "^0.82.1",
69
+ "@earendil-works/pi-agent-core": "0.82.1",
70
+ "@earendil-works/pi-ai": "0.82.1",
71
71
  "@modelcontextprotocol/sdk": "^1.29.0",
72
72
  "@tianshu-ai/plugin-sdk": "*",
73
- "better-sqlite3": "^12.10.0",
73
+ "better-sqlite3": "^13.0.3",
74
74
  "cors": "^2.8.5",
75
75
  "dotenv": "^17.4.2",
76
76
  "express": "^5.1.0",
@@ -60,6 +60,23 @@ export interface PluginManifest {
60
60
  client?: PluginEntryRef;
61
61
  server?: PluginEntryRef;
62
62
  contributes?: ContributesV1;
63
+ /**
64
+ * UI Shell override (ADR-0005). When present, this plugin replaces
65
+ * the **entire frontend** for any tenant that enables it. The
66
+ * server serves the plugin's built SPA instead of the default
67
+ * `@tianshu/web` bundle.
68
+ *
69
+ * Constraints:
70
+ * - At most ONE uiShell plugin may be active per tenant. Enabling
71
+ * a second one fails activation with a conflict error.
72
+ * - The shell SPA talks to the same `/api/*` and `/ws` endpoints;
73
+ * backend behaviour is unchanged.
74
+ * - `contributes` (API routes, tools, etc.) still works — a shell
75
+ * plugin can contribute server-side logic alongside its UI.
76
+ * - In dev mode, set `devServer.target` to proxy to an external
77
+ * vite/webpack dev server for HMR.
78
+ */
79
+ uiShell?: PluginUiShell;
63
80
  /**
64
81
  * Optional declarative schema for the plugin's own config
65
82
  * (`tenant config.plugins.<id>.config`). When present the host
@@ -110,6 +127,32 @@ export interface PluginManifest {
110
127
  * it shows them to the user and waits for confirmation. The
111
128
  * read-only `verify` commands can run silently.
112
129
  */
130
+ export interface PluginUiShell {
131
+ /**
132
+ * Directory containing the built SPA (index.html + assets),
133
+ * relative to the plugin directory. The server serves these
134
+ * files for the tenant instead of the default web dist.
135
+ */
136
+ dist: string;
137
+ /**
138
+ * When true (default), any non-API GET request that doesn't
139
+ * match a static file returns index.html (standard SPA
140
+ * fallback). Set to false for multi-page or SSR setups where
141
+ * only exact file matches should be served.
142
+ */
143
+ fallbackSpa?: boolean;
144
+ /**
145
+ * Dev-mode proxy target. When set AND the plugin directory
146
+ * does not contain a built `dist/index.html`, the server
147
+ * proxies non-API requests to this URL instead of serving
148
+ * static files. Enables HMR with an external dev server.
149
+ *
150
+ * Only used when `process.env.NODE_ENV !== "production"`.
151
+ */
152
+ devServer?: {
153
+ target: string;
154
+ };
155
+ }
113
156
  export interface PluginSetupSpec {
114
157
  /**
115
158
  * One-paragraph summary the setup agent shows before listing
@@ -1 +1 @@
1
- {"version":3,"file":"manifest.d.ts","sourceRoot":"","sources":["../src/manifest.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"manifest.d.ts","sourceRoot":"","sources":["../src/manifest.ts"],"names":[],"mappings":"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"}
@@ -28,7 +28,7 @@
28
28
  "@types/node": "^26.1.1",
29
29
  "@types/react": "^19.2.18",
30
30
  "typescript": "^7.0.2",
31
- "vitest": "^4.1.11"
31
+ "vitest": "^5.0.0"
32
32
  },
33
33
  "dependencies": {
34
34
  "@modelcontextprotocol/sdk": "^1.29.0"
@@ -0,0 +1,310 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useState, useEffect, useCallback } from "react";
3
+ import { Eye, EyeOff, ExternalLink, Paintbrush, Upload, RefreshCw, FileCode, CheckCircle } from "lucide-react";
4
+
5
+ import { useChatNav, subscribeToWsEvent } from "@tianshu-ai/plugin-sdk/client";
6
+
7
+ const PLUGIN_ID = "custom-ui";
8
+ const API = "/api";
9
+ const SHELL_API = `${API}/p/${PLUGIN_ID}`;
10
+
11
+ function ShellPreviewPanel(_props) {
12
+ const [plugins, setPlugins] = useState(null);
13
+ const [shellActive, setShellActive] = useState(false);
14
+ const [status, setStatus] = useState(null);
15
+ const [loading, setLoading] = useState(true);
16
+ const [toggling, setToggling] = useState(false);
17
+ const [publishing, setPublishing] = useState(false);
18
+ const [publishResult, setPublishResult] = useState(null);
19
+ const [previewKey, setPreviewKey] = useState(0);
20
+
21
+ const loadStatus = useCallback(async () => {
22
+ try {
23
+ const [pluginsRes, statusRes] = await Promise.all([
24
+ fetch(`${API}/plugins`, { credentials: "include" }).then(r => r.json()),
25
+ fetch(`${SHELL_API}/status`, { credentials: "include" }).then(r => r.ok ? r.json() : null),
26
+ ]);
27
+ const list = pluginsRes.plugins || pluginsRes;
28
+ setPlugins(list);
29
+ const shell = list.find((p) => p.id === PLUGIN_ID);
30
+ setShellActive(shell?.state === "active");
31
+ setStatus(statusRes);
32
+ } catch (e) {
33
+ console.error("ShellPreviewPanel:", e);
34
+ } finally {
35
+ setLoading(false);
36
+ }
37
+ }, []);
38
+
39
+ useEffect(() => { loadStatus(); }, [loadStatus]);
40
+
41
+ async function toggleShell() {
42
+ setToggling(true);
43
+ try {
44
+ await fetch(`${API}/plugins/${PLUGIN_ID}`, {
45
+ method: "PATCH", credentials: "include",
46
+ headers: { "Content-Type": "application/json" },
47
+ body: JSON.stringify({ enabled: !shellActive }),
48
+ });
49
+ await loadStatus();
50
+ } finally { setToggling(false); }
51
+ }
52
+
53
+ async function publishShell() {
54
+ setPublishing(true);
55
+ setPublishResult(null);
56
+ try {
57
+ const res = await fetch(`${SHELL_API}/publish`, {
58
+ method: "POST", credentials: "include",
59
+ });
60
+ const data = await res.json();
61
+ if (data.ok) {
62
+ setPublishResult({ ok: true, files: data.files });
63
+ await loadStatus();
64
+ } else {
65
+ setPublishResult({ ok: false, error: data.message || data.error });
66
+ }
67
+ } catch (e) {
68
+ setPublishResult({ ok: false, error: String(e) });
69
+ } finally { setPublishing(false); }
70
+ }
71
+
72
+ if (loading) {
73
+ return _jsx("div", {
74
+ className: "flex h-full items-center justify-center text-fg-fainter text-xs",
75
+ children: "Loading...",
76
+ });
77
+ }
78
+
79
+ const activePlugins = (plugins || []).filter((p) => p.state === "active");
80
+ const hasDraft = status?.draft?.exists;
81
+ const hasPublished = status?.published?.exists;
82
+
83
+ return _jsxs("div", {
84
+ className: "flex flex-col h-full overflow-y-auto text-sm",
85
+ children: [
86
+ // Header
87
+ _jsxs("div", {
88
+ className: "border-b border-border-subtle px-3 py-2 flex items-center gap-2",
89
+ children: [
90
+ _jsx(Paintbrush, { size: 14, className: "text-fg-muted" }),
91
+ _jsx("span", { className: "text-xs font-medium text-fg-default", children: "Custom UI Shell" }),
92
+ _jsx("div", { className: "ml-auto" }),
93
+ _jsx("button", {
94
+ onClick: () => { loadStatus(); setPreviewKey(k => k + 1); },
95
+ className: "rounded p-1 text-fg-faint hover:text-fg-default hover:bg-bg-hover transition-colors",
96
+ title: "Refresh",
97
+ children: _jsx(RefreshCw, { size: 12 }),
98
+ }),
99
+ ],
100
+ }),
101
+
102
+ // Status cards
103
+ _jsxs("div", {
104
+ className: "mx-3 mt-3 space-y-2",
105
+ children: [
106
+ // Draft status
107
+ _jsxs("div", {
108
+ className: `rounded-lg border p-3 ${hasDraft ? "border-blue-500/30 bg-blue-500/5" : "border-border-subtle bg-bg-surface"}`,
109
+ children: [
110
+ _jsxs("div", {
111
+ className: "flex items-center gap-2 mb-1",
112
+ children: [
113
+ _jsx(FileCode, { size: 13, className: hasDraft ? "text-blue-400" : "text-fg-faint" }),
114
+ _jsx("span", { className: "text-xs font-medium", children: "Draft" }),
115
+ hasDraft && _jsx("span", {
116
+ className: "ml-auto text-[10px] text-blue-400",
117
+ children: `${status.draft.files.length} file${status.draft.files.length > 1 ? "s" : ""}`,
118
+ }),
119
+ ],
120
+ }),
121
+ _jsx("p", {
122
+ className: "text-[11px] text-fg-muted leading-relaxed",
123
+ children: hasDraft
124
+ ? "Agent has written a shell draft. Preview it below, then publish to go live."
125
+ : "No draft yet. Ask the agent to build a custom UI — it will write to _tenant/shell/.",
126
+ }),
127
+ hasDraft && _jsx("div", {
128
+ className: "mt-2 space-y-0.5",
129
+ children: status.draft.files.map(f =>
130
+ _jsxs("div", {
131
+ className: "flex items-center text-[10px] text-fg-faint font-mono",
132
+ children: [
133
+ _jsx("span", { children: f.path }),
134
+ _jsx("span", { className: "ml-auto", children: formatSize(f.size) }),
135
+ ],
136
+ }, f.path)
137
+ ),
138
+ }),
139
+ ],
140
+ }),
141
+
142
+ // Published status
143
+ _jsxs("div", {
144
+ className: `rounded-lg border p-3 ${hasPublished ? "border-green-500/30 bg-green-500/5" : "border-border-subtle bg-bg-surface"}`,
145
+ children: [
146
+ _jsxs("div", {
147
+ className: "flex items-center gap-2 mb-1",
148
+ children: [
149
+ _jsx(CheckCircle, { size: 13, className: hasPublished ? "text-green-400" : "text-fg-faint" }),
150
+ _jsx("span", { className: "text-xs font-medium", children: "Published" }),
151
+ hasPublished && _jsx("span", {
152
+ className: "ml-auto text-[10px] text-green-400",
153
+ children: `${status.published.files.length} file${status.published.files.length > 1 ? "s" : ""}`,
154
+ }),
155
+ ],
156
+ }),
157
+ _jsx("p", {
158
+ className: "text-[11px] text-fg-muted leading-relaxed",
159
+ children: hasPublished
160
+ ? "Custom shell is live for all users of this tenant."
161
+ : "No published shell yet. Publish a draft to replace the default UI.",
162
+ }),
163
+ ],
164
+ }),
165
+ ],
166
+ }),
167
+
168
+ // Preview iframe (draft)
169
+ hasDraft && _jsxs("div", {
170
+ className: "mx-3 mt-3",
171
+ children: [
172
+ _jsx("div", {
173
+ className: "text-[11px] font-medium text-fg-muted mb-1.5",
174
+ children: "Draft Preview",
175
+ }),
176
+ _jsx("div", {
177
+ className: "rounded-lg border border-border-subtle overflow-hidden bg-white",
178
+ style: { height: "240px" },
179
+ children: _jsx("iframe", {
180
+ src: `${SHELL_API}/preview`,
181
+ title: "Shell Preview",
182
+ sandbox: "allow-scripts allow-forms allow-same-origin",
183
+ className: "w-full h-full border-0",
184
+ style: { transform: "scale(0.5)", transformOrigin: "top left", width: "200%", height: "200%" },
185
+ }, previewKey),
186
+ }),
187
+ ],
188
+ }),
189
+
190
+ // Actions
191
+ _jsxs("div", {
192
+ className: "mx-3 mt-3 space-y-2",
193
+ children: [
194
+ // Publish button
195
+ hasDraft && _jsxs("button", {
196
+ onClick: publishShell,
197
+ disabled: publishing,
198
+ className: "w-full flex items-center justify-center gap-2 rounded-lg px-3 py-2 text-xs font-medium bg-blue-500/10 text-blue-400 hover:bg-blue-500/20 border border-blue-500/20 transition-colors disabled:opacity-50",
199
+ children: [
200
+ _jsx(Upload, { size: 13 }),
201
+ publishing ? "Publishing..." : "Publish Draft → Go Live",
202
+ ],
203
+ }),
204
+
205
+ // Publish result
206
+ publishResult && _jsx("div", {
207
+ className: `rounded-lg px-3 py-2 text-[11px] ${publishResult.ok ? "bg-green-500/10 text-green-400" : "bg-red-500/10 text-red-400"}`,
208
+ children: publishResult.ok
209
+ ? `✓ Published ${publishResult.files.length} files. Refresh the shell URL to see changes.`
210
+ : `✗ ${publishResult.error}`,
211
+ }),
212
+
213
+ // Toggle button
214
+ _jsxs("button", {
215
+ onClick: toggleShell,
216
+ disabled: toggling,
217
+ className: `w-full flex items-center justify-center gap-2 rounded-lg px-3 py-2 text-xs font-medium transition-colors ${
218
+ shellActive
219
+ ? "bg-red-500/10 text-red-400 hover:bg-red-500/20 border border-red-500/20"
220
+ : "bg-green-500/10 text-green-400 hover:bg-green-500/20 border border-green-500/20"
221
+ } disabled:opacity-50`,
222
+ children: [
223
+ shellActive ? _jsx(EyeOff, { size: 13 }) : _jsx(Eye, { size: 13 }),
224
+ toggling ? "Updating..." : shellActive ? "Disable Shell" : "Enable Shell",
225
+ ],
226
+ }),
227
+ ],
228
+ }),
229
+
230
+ // Available APIs
231
+ _jsxs("div", {
232
+ className: "mx-3 mt-3 rounded-lg border border-border-subtle bg-bg-surface p-3",
233
+ children: [
234
+ _jsx("div", {
235
+ className: "text-[11px] font-medium text-fg-muted mb-2",
236
+ children: "Available APIs for custom UI",
237
+ }),
238
+ _jsx("div", { className: "flex flex-wrap gap-1", children:
239
+ ["chat/ws", "auth", ...activePlugins.map(p => p.id).filter(id => id !== PLUGIN_ID)].map((id) =>
240
+ _jsx("span", {
241
+ className: "inline-block rounded-md bg-bg-raised px-1.5 py-0.5 text-[10px] text-fg-muted",
242
+ children: id,
243
+ }, id)
244
+ ),
245
+ }),
246
+ ],
247
+ }),
248
+
249
+ // Help text
250
+ _jsx("div", {
251
+ className: "mx-3 mt-3 mb-3 text-[10px] text-fg-fainter leading-relaxed",
252
+ children: "Workflow: Agent writes draft → preview here → publish to go live. Each tenant has its own shell.",
253
+ }),
254
+ ],
255
+ });
256
+ }
257
+
258
+ function formatSize(bytes) {
259
+ if (bytes < 1024) return bytes + " B";
260
+ if (bytes < 1024 * 1024) return (bytes / 1024).toFixed(1) + " KB";
261
+ return (bytes / (1024 * 1024)).toFixed(1) + " MB";
262
+ }
263
+
264
+ /**
265
+ * Sidebar section: shows the shell session when it has messages.
266
+ * Clicking it switches the chat view to the shell session transcript.
267
+ */
268
+ function ShellSidebarSection() {
269
+ const [session, setSession] = useState(null);
270
+ const { viewingSessionId, setViewingSession } = useChatNav();
271
+
272
+ const refresh = useCallback(async () => {
273
+ try {
274
+ const res = await fetch(`/api/channel-sessions`, { credentials: "include" });
275
+ const data = await res.json();
276
+ const shell = (data.sessions || []).find(s => s.channelId === "custom-ui");
277
+ setSession(shell || null);
278
+ } catch { /* best-effort */ }
279
+ }, []);
280
+
281
+ useEffect(() => {
282
+ refresh();
283
+ const off = subscribeToWsEvent("channel_session_changed", (ev) => {
284
+ if (ev.channelId === "custom-ui") refresh();
285
+ });
286
+ return off;
287
+ }, [refresh]);
288
+
289
+ if (!session) return null;
290
+
291
+ const active = viewingSessionId === session.id;
292
+
293
+ return _jsx("button", {
294
+ onClick: () => setViewingSession(active ? null : session.id),
295
+ className: `w-full flex items-center gap-2 rounded-md px-2 py-1.5 text-xs transition-colors ${
296
+ active
297
+ ? "bg-bg-selected text-fg-default border-l-2 border-accent"
298
+ : "text-fg-muted hover:bg-bg-hover hover:text-fg-default"
299
+ }`,
300
+ children: [
301
+ _jsx(Paintbrush, { size: 13, className: active ? "text-accent" : "text-fg-faint" }),
302
+ _jsx("span", { className: "truncate", children: session.title || "Custom Shell" }),
303
+ ],
304
+ });
305
+ }
306
+
307
+ const exports = {
308
+ components: { ShellPreviewPanel, ShellSidebarSection },
309
+ };
310
+ export default exports;