@foggy-projects/deepseek-harness-plugin 0.4.0-beta.6 → 0.4.0-beta.8

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 (31) hide show
  1. package/README.md +32 -6
  2. package/THIRD-PARTY-RUNTIME-NOTICES.md +16 -0
  3. package/docs/PUBLIC-BETA-READINESS.md +51 -0
  4. package/docs/WINDOWS-BETA-ACCEPTANCE.md +71 -0
  5. package/experience/linux/README.md +5 -6
  6. package/experience/linux/prepare.sh +7 -9
  7. package/lib/client.js +132 -6
  8. package/lib/index.js +157 -28
  9. package/lib/python-runtime.js +339 -0
  10. package/lib/remote-descriptor.js +1 -0
  11. package/lib/version.js +5 -0
  12. package/package.json +6 -3
  13. package/skills/foggy-deepseek-onboarding/SKILL.md +24 -5
  14. package/skills/foggy-deepseek-onboarding/assets/onboarding-state.schema.json +20 -0
  15. package/skills/foggy-deepseek-onboarding/assets/versions.json +46 -2
  16. package/skills/foggy-deepseek-onboarding/references/onboarding-workflow.md +18 -4
  17. package/skills/foggy-deepseek-onboarding/scripts/doctor.ps1 +2 -2
  18. package/skills/foggy-deepseek-onboarding/scripts/doctor.sh +1 -2
  19. package/skills/foggy-deepseek-onboarding/scripts/install.ps1 +2 -2
  20. package/skills/foggy-deepseek-onboarding/scripts/install.sh +1 -2
  21. package/skills/foggy-deepseek-onboarding/scripts/invoke-onboarding.ps1 +30 -0
  22. package/skills/foggy-deepseek-onboarding/scripts/invoke-onboarding.sh +24 -0
  23. package/skills/foggy-deepseek-onboarding/scripts/onboard.ps1 +2 -2
  24. package/skills/foggy-deepseek-onboarding/scripts/onboard.sh +1 -2
  25. package/skills/foggy-deepseek-onboarding/scripts/onboarding.py +400 -43
  26. package/skills/foggy-deepseek-onboarding/scripts/runtime-start.ps1 +2 -2
  27. package/skills/foggy-deepseek-onboarding/scripts/runtime-start.sh +1 -2
  28. package/skills/foggy-deepseek-onboarding/scripts/runtime-stop.ps1 +2 -2
  29. package/skills/foggy-deepseek-onboarding/scripts/runtime-stop.sh +1 -2
  30. package/skills/foggy-deepseek-onboarding/scripts/uninstall.ps1 +2 -2
  31. package/skills/foggy-deepseek-onboarding/scripts/uninstall.sh +1 -2
package/README.md CHANGED
@@ -2,13 +2,19 @@
2
2
 
3
3
  This package is the lightweight DeepSeek Harness Bundle for Foggy's Java data
4
4
  analysis engine. Installing the Bundle adds a native Foggy tab under **Settings
5
- → Plugins**. The large Launcher and the isolated CLI environment are downloaded
6
- only when the user selects **Initialize Foggy**.
5
+ → Plugins**. The private Python runtime, Launcher, and isolated CLI environment
6
+ are downloaded only when the user selects **Initialize Foggy**.
7
+
8
+ DeepSeek Harness uses a system Node.js (`^22.19.0 || >=24.0.0`) and Foggy's Java
9
+ Launcher uses a system Java 17+. Foggy manages its own pinned Python 3.12 runtime
10
+ inside the per-user component directory; it does not require a system Python,
11
+ modify `PATH`, or register Python globally. Advanced users may explicitly set
12
+ `FOGGY_PYTHON` to a compatible Python 3.11+ executable.
7
13
 
8
14
  ## Local beta installation
9
15
 
10
16
  ```powershell
11
- dsh plugin --profile web add --workspace-root ./foggy-projects-deepseek-harness-plugin-0.4.0-beta.6.tgz
17
+ dsh plugin --profile web add --workspace-root ./foggy-projects-deepseek-harness-plugin-0.4.0-beta.8.tgz
12
18
  ```
13
19
 
14
20
  Restart `dsh web`, open Settings → Plugins → Foggy Data Analysis, and initialize
@@ -38,15 +44,35 @@ evidence.
38
44
  Opaque CLI profiles default to the private persistent
39
45
  `<dataRoot>/cli-profiles` directory. Composite onboarding commands are
40
46
  idempotent: unchanged completed phases are resumed rather than re-adding a
41
- datasource or re-registering a published bundle.
47
+ datasource or re-registering a published bundle. Settings detects legacy
48
+ temporary profiles and offers an explicit, validated migration into the
49
+ persistent store. A completed profile can also be bound non-destructively to an
50
+ additional DSH workspace when its reviewed connection contract and published
51
+ semantic digest are unchanged.
42
52
 
43
- CLI, Launcher, the analysis Skill, install state, and Runtime state live in the
44
- user-level Foggy component directories. The managed CLI is intentionally isolated
53
+ Private Python, CLI, Launcher, the analysis Skill, install state, and Runtime
54
+ state live in the user-level Foggy component directories. The managed CLI is intentionally isolated
45
55
  and does not need to be on `PATH`. **Re-download / Repair** verifies the global
46
56
  analysis Skill, backs up modified or outdated managed content, restores it, and
47
57
  invalidates DSH's Skill catalog. The onboarding Skill is bundled with the plugin
48
58
  and is restored by reinstalling or upgrading the plugin package.
49
59
 
60
+ The Foggy settings tab shows the persisted database/semantic onboarding stages,
61
+ offers pinned checks and repair for CLI, Launcher, and the managed analysis
62
+ Skill, private Python, and exports a private redacted diagnostics report. Runtime start is
63
+ idempotent: an already-recorded process is verified with `wait-ready` and
64
+ `capabilities` instead of being treated as a failed second start.
65
+
66
+ This beta remains a local dev/test integration. The bundled Runtime reports
67
+ `securityMode=none-dev-test-only` and must not be exposed to a network or used as
68
+ a production service.
69
+
70
+ See [`docs/PUBLIC-BETA-READINESS.md`](./docs/PUBLIC-BETA-READINESS.md) for the
71
+ tested public Beta scope, release gates, and stable-release blockers.
72
+ Native Windows acceptance instructions are in
73
+ [`docs/WINDOWS-BETA-ACCEPTANCE.md`](./docs/WINDOWS-BETA-ACCEPTANCE.md); database
74
+ credentials intentionally remain outside the public repository.
75
+
50
76
  ## Linux and WSL2 experience
51
77
 
52
78
  Ubuntu and WSL2 users can use the checked-in preflighted installer under
@@ -0,0 +1,16 @@
1
+ # Third-party runtime notices
2
+
3
+ Foggy for DeepSeek Harness downloads a pinned CPython runtime on first
4
+ initialization. The runtime is not included in the npm package and is installed
5
+ only inside Foggy's per-user component directory.
6
+
7
+ - CPython is provided under the Python Software Foundation License Version 2.
8
+ - Portable distributions are produced by
9
+ [astral-sh/python-build-standalone](https://github.com/astral-sh/python-build-standalone),
10
+ whose build tooling is provided under MPL-2.0.
11
+ - The downloaded distribution contains its own license and attribution files.
12
+
13
+ The exact build release, platform assets, sizes, URLs, and SHA256 digests are
14
+ recorded in `skills/foggy-deepseek-onboarding/assets/versions.json`. Foggy
15
+ verifies the selected digest before extraction and does not add the interpreter
16
+ to `PATH` or register it as a system Python installation.
@@ -0,0 +1,51 @@
1
+ # Public beta readiness: 0.4.0-beta.8
2
+
3
+ Assessment date: 2026-09-03
4
+
5
+ ## Verdict
6
+
7
+ `0.4.0-beta.8` is suitable for a scoped public beta on Windows 10/11 x64 and
8
+ Linux/WSL2 x64. It is not a general-availability release.
9
+
10
+ The plugin package stays small and downloads large components only during
11
+ initialization. Node.js and Java remain system prerequisites. Python 3.12.13 is
12
+ installed privately below Foggy's component directory and does not change the
13
+ system PATH, registry, or a user's existing Python installation.
14
+
15
+ ## Verified behavior
16
+
17
+ - The npm tarball is about 67 KB compressed and contains no Python or Java
18
+ runtime binary.
19
+ - Managed CPython assets are pinned by URL, byte size, and SHA256 for Windows,
20
+ Linux, and macOS on x64 and arm64.
21
+ - Windows x64 completed a cold Python download, checksum verification,
22
+ extraction, initialization, forced Python repair, and doctor run.
23
+ - Linux/WSL2 x64 completed managed Python extraction, initialization, and a live
24
+ DeepSeek Harness `0.1.1-rc.2` UI status check.
25
+ - The UI reported Python 3.12.13 as `Foggy private`, and CLI 0.1.23, Launcher
26
+ 0.1.18, analysis Skill 0.1.17, and onboarding Skill 0.4.0-beta.8 as installed.
27
+ - Interrupted downloads resume with HTTP Range when the server supports it;
28
+ downloaded artifacts are not trusted until the complete SHA256 matches.
29
+ - Automated regression passed under Node 22.23.2: 15 Node tests and 8 Python
30
+ tests, plus shell and PowerShell syntax checks.
31
+
32
+ ## Beta boundaries
33
+
34
+ - Supported public-beta targets: Windows 10/11 x64 and Linux/WSL2 x64.
35
+ - Windows users must install a supported system Node.js line (`^22.19.0` or
36
+ `>=24.0.0`) and Java 17 or later. They do not need to install Python.
37
+ - macOS and arm64 assets are pinned and integrity-checked but have not received
38
+ the same end-to-end host validation; treat those targets as experimental.
39
+ - DeepSeek Harness itself is still consumed at `0.1.1-rc.2`, so its plugin
40
+ installation and supply-chain policy behavior may change before a stable
41
+ Harness release.
42
+ - Runtime production authentication is outside this beta's default local
43
+ onboarding mode. The UI and doctor continue to report `productionReady=false`
44
+ for the development-only no-auth mode.
45
+
46
+ ## Release gate after publication
47
+
48
+ Before broad announcement, complete the native Windows fresh-machine checklist
49
+ in [WINDOWS-BETA-ACCEPTANCE.md](./WINDOWS-BETA-ACCEPTANCE.md). Record the exact
50
+ Node, Java, DeepSeek Harness, and plugin versions and confirm that initialization
51
+ works without a system Python executable.
@@ -0,0 +1,71 @@
1
+ # Native Windows Beta acceptance
2
+
3
+ This runbook validates DeepSeek Harness `0.1.1-rc.2` with Foggy plugin
4
+ `0.4.0-beta.8` on a clean 64-bit Windows 10 or Windows 11 machine. Use a local
5
+ directory that is not synchronized by OneDrive.
6
+
7
+ ## Prerequisites
8
+
9
+ Install a system Node.js matching `^22.19.0 || >=24.0.0` and a system Java 17+
10
+ JRE/JDK. Windows must also provide `tar` (included in supported Windows 10/11
11
+ versions). A system Python is neither required nor used by default.
12
+
13
+ ```powershell
14
+ node --version
15
+ npm --version
16
+ java -version
17
+ tar --version
18
+ ```
19
+
20
+ Foggy downloads a pinned private CPython 3.12.13 runtime during initialization.
21
+ It remains below `%LOCALAPPDATA%\Foggy\DeepSeekHarness`, is not added to `PATH`,
22
+ and is not registered as a system Python.
23
+
24
+ ## Install and start
25
+
26
+ ```powershell
27
+ New-Item -ItemType Directory -Force C:\FoggyAcceptance | Out-Null
28
+ Set-Location C:\FoggyAcceptance
29
+
30
+ npx --yes --package=@deepseek-ai/dsh@0.1.1-rc.2 --package=pnpm@11.7.0 `
31
+ dsh plugin --profile web add --workspace-root `
32
+ "@foggy-projects/deepseek-harness-plugin@beta"
33
+
34
+ npx --yes --package=@deepseek-ai/dsh@0.1.1-rc.2 --package=pnpm@11.7.0 dsh web
35
+ ```
36
+
37
+ Open `http://127.0.0.1:3080/`, configure an LLM provider, select the
38
+ `C:\FoggyAcceptance` workspace, then open **Settings → Plugins → Foggy Data
39
+ Analysis** and choose **Initialize Foggy**.
40
+
41
+ Expected component state:
42
+
43
+ - Python 3.12.13, source `Foggy private`;
44
+ - CLI 0.1.23;
45
+ - Launcher 0.1.18;
46
+ - analysis Skill 0.1.17;
47
+ - onboarding Skill 0.4.0-beta.8;
48
+ - Java 17+ available;
49
+ - native DSH Skill registration available.
50
+
51
+ ## Database and semantic-layer acceptance
52
+
53
+ Keep database credentials out of this public repository. Create a private CLI
54
+ profile outside the DSH conversation, pass only its opaque profile ID and
55
+ revision to the onboarding workflow, and use a test-only database account with
56
+ read-only permissions.
57
+
58
+ Use a natural prompt such as:
59
+
60
+ ```text
61
+ 请帮我用 Foggy 分析这个测试数据库。我已经按验收手册创建了私有连接
62
+ profile。请先确认连接和表结构,再围绕订单数据创建一个简单的语义层,
63
+ 包含订单数量、状态和开单时间,最后执行一个不超过 20 行的只读查询。
64
+ 不要修改数据库,也不要在对话或验收文件中输出密码。
65
+ ```
66
+
67
+ Pass only when Runtime readiness and capabilities succeed, datasource metadata
68
+ can be discovered, TM/QM models validate and publish, the bounded read-only
69
+ query succeeds, diagnostics contain no credentials, and stopping Runtime frees
70
+ port 18066.
71
+
@@ -5,14 +5,13 @@ It has been designed for Ubuntu 22.04/24.04 x86_64 and WSL2.
5
5
 
6
6
  ## Prerequisites
7
7
 
8
- - Node.js 22.19 or newer
9
- - Python 3.11 or newer with `venv`
8
+ - Node.js `^22.19.0` or `>=24.0.0`
10
9
  - Java 17 or newer
11
- - Git and npm
10
+ - Git, npm, and `tar`
12
11
  - At least 4 GiB free disk space and 2 GiB available memory; 4 GiB memory is recommended
13
12
 
14
13
  Keep the experience root on the Linux-native filesystem, such as under `$HOME`. In WSL2, do not
15
- put DSH, `node_modules`, the Python virtual environment, or Foggy data under `/mnt/c` or `/mnt/d`.
14
+ put DSH, `node_modules`, Foggy's private Python environment, or Foggy data under `/mnt/c` or `/mnt/d`.
16
15
 
17
16
  ## Prepare
18
17
 
@@ -35,8 +34,8 @@ Start the prepared profile with:
35
34
  ```
36
35
 
37
36
  Open the URL printed by DSH, then choose **Settings → Plugins → Foggy Data Analysis** and select
38
- **Initialize Foggy**. The CLI, Launcher, and analysis Skill are downloaded from their pinned public
39
- Releases and verified before installation.
37
+ **Initialize Foggy**. Private Python, the CLI, Launcher, and analysis Skill are downloaded from their
38
+ pinned public Releases and verified before installation. A system Python is not required.
40
39
 
41
40
  Provider configuration remains a separate DSH setup step. Store API keys in a private environment
42
41
  file or secret manager; do not add them to the DSH settings document or the project repository.
@@ -3,7 +3,7 @@ set -euo pipefail
3
3
 
4
4
  DSH_VERSION="0.1.1-rc.2"
5
5
  PNPM_VERSION="11.7.0"
6
- PLUGIN_VERSION="0.4.0-beta.4"
6
+ PLUGIN_VERSION="0.4.0-beta.8"
7
7
  PLUGIN_REF="v${PLUGIN_VERSION}"
8
8
  PLUGIN_REPOSITORY="https://github.com/foggy-projects/foggy-deepseek-harness-plugin.git"
9
9
 
@@ -62,22 +62,19 @@ require_command() {
62
62
 
63
63
  [[ "$(uname -s)" == "Linux" ]] || fail "this entry supports Linux and WSL2 only"
64
64
  case "$(uname -m)" in
65
- x86_64|amd64) ;;
66
- *) fail "validated architecture is x86_64; detected $(uname -m)" ;;
65
+ x86_64|amd64|aarch64|arm64) ;;
66
+ *) fail "supported architectures are x86_64 and arm64; detected $(uname -m)" ;;
67
67
  esac
68
68
 
69
69
  require_command node
70
70
  require_command npm
71
- require_command python3
72
71
  require_command java
73
72
  require_command git
74
73
  require_command df
74
+ require_command tar
75
75
 
76
- node -e 'const [major, minor] = process.versions.node.split(".").map(Number); if (major < 22 || (major === 22 && minor < 19)) process.exit(1)' \
77
- || fail "Node 22.19+ required; detected $(node --version 2>/dev/null || echo unknown)"
78
- python3 -c 'import sys; raise SystemExit(0 if sys.version_info >= (3, 11) else 1)' \
79
- || fail "Python 3.11+ required; detected $(python3 --version 2>/dev/null || echo unknown)"
80
- python3 -m venv --help >/dev/null 2>&1 || fail "Python venv support is required"
76
+ node -e 'const [major, minor] = process.versions.node.split(".").map(Number); if (!((major === 22 && minor >= 19) || major >= 24)) process.exit(1)' \
77
+ || fail "Node ^22.19.0 or >=24 required; detected $(node --version 2>/dev/null || echo unknown)"
81
78
 
82
79
  java_major="$(java -version 2>&1 | awk -F'[\".]' '/version/ { print $2; exit }')"
83
80
  [[ "$java_major" =~ ^[0-9]+$ ]] || fail "could not detect Java version"
@@ -121,6 +118,7 @@ Foggy Linux experience plan
121
118
  DSH: $DSH_VERSION
122
119
  pnpm: $PNPM_VERSION
123
120
  Foggy Bundle: $PLUGIN_VERSION
121
+ Python: private managed 3.12.13 (downloaded during Foggy initialization)
124
122
  Experience root: $experience_root
125
123
  Project root: $project_root
126
124
  Filesystem: Linux-native
package/lib/client.js CHANGED
@@ -10,7 +10,10 @@ window.__ModuleLoader__.load({
10
10
  const passthroughSchema = { parse: (value) => value }
11
11
  const TYPERT_REMOTE = {
12
12
  package: '@foggy-projects/deepseek-harness-plugin',
13
- descriptors: ['status', 'plan', 'initialize', 'repair', 'runtimeStart', 'runtimeStop'].map((method) => ({
13
+ descriptors: [
14
+ 'status', 'plan', 'initialize', 'repair', 'repairPython', 'repairCli', 'repairLauncher', 'repairAnalysisSkill',
15
+ 'migrateProfiles', 'diagnostics', 'runtimeStart', 'runtimeStop',
16
+ ].map((method) => ({
14
17
  id: `@foggy-projects/deepseek-harness-plugin#foggyIntegration/${method}`,
15
18
  service: 'foggyIntegration',
16
19
  namespace: 'foggyIntegration',
@@ -29,7 +32,7 @@ window.__ModuleLoader__.load({
29
32
  const zh = {
30
33
  tab: 'Foggy 数据分析',
31
34
  title: 'Foggy Java 数据分析引擎',
32
- intro: '在 DeepSeek Harness 内管理 Foggy CLI、Launcher、Skills 和本地 Runtime。大型组件在首次初始化时按需下载。',
35
+ intro: '在 DeepSeek Harness 内管理 Foggy 私有 Python、CLI、Launcher、Skills 和本地 Runtime。大型组件在首次初始化时按需下载。',
33
36
  refresh: '刷新状态',
34
37
  loading: '正在读取 Foggy 状态…',
35
38
  failed: '暂时无法读取 Foggy 状态。',
@@ -51,11 +54,19 @@ window.__ModuleLoader__.load({
51
54
  unavailable: '不可用',
52
55
  initialize: '初始化 Foggy',
53
56
  repair: '重新下载 / 修复',
57
+ repairTitle: '分组件检查与修复',
58
+ repairPython: '检查 / 修复私有 Python',
59
+ repairCli: '检查 / 修复 CLI',
60
+ repairLauncher: '检查 / 修复 Launcher',
61
+ repairAnalysisSkill: '检查 / 修复分析 Skill',
62
+ diagnostics: '导出诊断报告',
63
+ diagnosticsSaved: '诊断报告已保存',
54
64
  start: '启动 Runtime',
55
65
  stop: '停止 Runtime',
56
66
  working: '操作进行中…',
57
67
  progressWorking: '正在初始化 Foggy…',
58
68
  progressPreflight: '检查运行环境',
69
+ progressPython: '准备私有 Python',
59
70
  progressCli: '准备 CLI',
60
71
  progressLauncher: '准备 Launcher',
61
72
  progressAnalysis: '准备分析 Skill',
@@ -63,12 +74,30 @@ window.__ModuleLoader__.load({
63
74
  progressState: '写入安装状态',
64
75
  progressComplete: '初始化完成',
65
76
  progressFiles: '文件',
77
+ managedPrivate: 'Foggy 私有',
78
+ configuredOverride: '外部指定',
66
79
  accepted: '操作已开始;页面会自动刷新状态。',
67
80
  actionFailed: '操作失败',
68
81
  roots: '本地目录',
69
82
  installRoot: '组件目录',
70
83
  dataRoot: '数据目录',
71
84
  profileStore: 'CLI Profile',
85
+ profileMigrationTitle: '旧 Profile 迁移',
86
+ profileMigrationPending: '检测到旧版临时 Profile。迁移只转移连接元数据和密码环境变量引用,不复制密码值。',
87
+ profileMigrationConflict: '旧 Profile 存在冲突或格式问题,请先导出诊断报告。',
88
+ migrateProfiles: '迁移到持久目录',
89
+ onboardingProgress: '数据库与语义层进度',
90
+ noOnboarding: '尚无数据库引导记录;请在对话中调用 Foggy onboarding Skill。',
91
+ projectRoot: '工作区',
92
+ resumeInChat: '未完成步骤应回到对应工作区,在对话中继续。',
93
+ stepPlanned: '规划',
94
+ stepDatasourceConfigured: '数据库连接',
95
+ stepDatasourceVerified: '连接验证',
96
+ stepSchemaDiscovered: 'Schema 发现',
97
+ stepSemanticDrafted: '语义层草拟',
98
+ stepSemanticValidated: '模型校验',
99
+ stepSemanticPublished: '发布',
100
+ stepSemanticVerified: '首次查询',
72
101
  runtimeUrl: 'Runtime 地址',
73
102
  nextTitle: '后续配置',
74
103
  nextCopy: 'Skills 已通过 DeepSeek Harness 原生注册表提供给所有工作区;每个会话直接使用自己的工作目录。Runtime 启动成功后,将继续进入数据库连接与语义层向导。',
@@ -78,7 +107,7 @@ window.__ModuleLoader__.load({
78
107
  const en = {
79
108
  tab: 'Foggy Data Analysis',
80
109
  title: 'Foggy Java Data Analysis Engine',
81
- intro: 'Manage the Foggy CLI, Launcher, Skills, and local Runtime inside DeepSeek Harness. Large components are downloaded on first initialization.',
110
+ intro: 'Manage Foggy private Python, CLI, Launcher, Skills, and the local Runtime inside DeepSeek Harness. Large components are downloaded on first initialization.',
82
111
  refresh: 'Refresh status',
83
112
  loading: 'Reading Foggy status…',
84
113
  failed: 'Foggy status is temporarily unavailable.',
@@ -100,11 +129,19 @@ window.__ModuleLoader__.load({
100
129
  unavailable: 'Unavailable',
101
130
  initialize: 'Initialize Foggy',
102
131
  repair: 'Re-download / Repair',
132
+ repairTitle: 'Component checks and repair',
133
+ repairPython: 'Check / repair private Python',
134
+ repairCli: 'Check / repair CLI',
135
+ repairLauncher: 'Check / repair Launcher',
136
+ repairAnalysisSkill: 'Check / repair analysis Skill',
137
+ diagnostics: 'Export diagnostics',
138
+ diagnosticsSaved: 'Diagnostics saved',
103
139
  start: 'Start Runtime',
104
140
  stop: 'Stop Runtime',
105
141
  working: 'Operation in progress…',
106
142
  progressWorking: 'Initializing Foggy…',
107
143
  progressPreflight: 'Checking prerequisites',
144
+ progressPython: 'Preparing private Python',
108
145
  progressCli: 'Preparing CLI',
109
146
  progressLauncher: 'Preparing Launcher',
110
147
  progressAnalysis: 'Preparing analysis Skill',
@@ -112,12 +149,30 @@ window.__ModuleLoader__.load({
112
149
  progressState: 'Writing install state',
113
150
  progressComplete: 'Initialization complete',
114
151
  progressFiles: 'files',
152
+ managedPrivate: 'Foggy private',
153
+ configuredOverride: 'Configured override',
115
154
  accepted: 'The operation started; this page will refresh automatically.',
116
155
  actionFailed: 'Operation failed',
117
156
  roots: 'Local directories',
118
157
  installRoot: 'Components',
119
158
  dataRoot: 'Data',
120
159
  profileStore: 'CLI profiles',
160
+ profileMigrationTitle: 'Legacy profile migration',
161
+ profileMigrationPending: 'Legacy temporary profiles were found. Migration transfers connection metadata and password environment-variable references, never password values.',
162
+ profileMigrationConflict: 'A legacy profile has a conflict or invalid format. Export diagnostics before continuing.',
163
+ migrateProfiles: 'Move to persistent store',
164
+ onboardingProgress: 'Database and semantic-layer progress',
165
+ noOnboarding: 'No database onboarding record yet. Invoke the Foggy onboarding Skill in a conversation.',
166
+ projectRoot: 'Workspace',
167
+ resumeInChat: 'Resume incomplete steps from a conversation in the matching workspace.',
168
+ stepPlanned: 'Plan',
169
+ stepDatasourceConfigured: 'Database connection',
170
+ stepDatasourceVerified: 'Connection test',
171
+ stepSchemaDiscovered: 'Schema discovery',
172
+ stepSemanticDrafted: 'Semantic draft',
173
+ stepSemanticValidated: 'Model validation',
174
+ stepSemanticPublished: 'Publish',
175
+ stepSemanticVerified: 'First query',
121
176
  runtimeUrl: 'Runtime URL',
122
177
  nextTitle: 'Next configuration',
123
178
  nextCopy: 'Skills are provided to every workspace through the native DeepSeek Harness registry, and each session uses its own working directory. After Runtime starts, the database connection and semantic-layer wizard comes next.',
@@ -133,7 +188,7 @@ window.__ModuleLoader__.load({
133
188
  .foggy-actions{display:flex;gap:8px;flex-wrap:wrap}.foggy-button{border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-bg-layer-1);color:var(--dsw-alias-label-primary);font:inherit;border-radius:8px;padding:7px 12px;cursor:pointer}.foggy-button:hover{background:var(--dsw-alias-interactive-bg-hover)}.foggy-button:disabled{opacity:.55;cursor:not-allowed}.foggy-button-primary{border-color:var(--dsw-alias-state-business-primary);background:var(--dsw-alias-state-business-primary);color:white}
134
189
  .foggy-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:10px}.foggy-card{border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-bg-layer-3);border-radius:10px;padding:13px 14px}.foggy-card-head{display:flex;justify-content:space-between;gap:8px}.foggy-card strong{font-size:13px}.foggy-badge{font-size:11px;color:var(--dsw-alias-label-secondary)}.foggy-card code{display:block;margin-top:8px;color:var(--dsw-alias-label-tertiary);font-size:11px;overflow-wrap:anywhere}
135
190
  .foggy-progress{border:1px solid var(--dsw-alias-border-l2);background:var(--dsw-alias-bg-layer-3);border-radius:10px;padding:13px 14px}.foggy-progress-head{display:flex;align-items:center;justify-content:space-between;gap:12px;font-size:13px}.foggy-progress-head strong{font-weight:600}.foggy-progress-percent{color:var(--dsw-alias-label-secondary);font-variant-numeric:tabular-nums}.foggy-progress-track{height:8px;margin-top:10px;border-radius:999px;background:var(--dsw-alias-bg-layer-1);overflow:hidden}.foggy-progress-fill{height:100%;border-radius:inherit;background:var(--dsw-alias-state-business-primary);transition:width .25s ease}.foggy-progress-meta{display:flex;justify-content:space-between;gap:12px;margin-top:8px;color:var(--dsw-alias-label-tertiary);font-size:11px;line-height:16px}.foggy-progress-file{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
136
- .foggy-message{margin:0;font-size:13px;line-height:20px;color:var(--dsw-alias-label-secondary)}.foggy-message[data-error=true]{color:var(--dsw-alias-state-error-primary)}.foggy-paths,.foggy-next{border-top:1px solid var(--dsw-alias-border-l2);padding-top:14px}.foggy-paths h4,.foggy-next h4{margin:0 0 8px;font-size:13px}.foggy-paths dl{display:grid;grid-template-columns:100px minmax(0,1fr);gap:6px 10px;margin:0}.foggy-paths dt{color:var(--dsw-alias-label-tertiary);font-size:12px}.foggy-paths dd{margin:0;min-width:0;overflow-wrap:anywhere;font-family:var(--ds-font-family-code);font-size:11px}.foggy-next p{margin:0;color:var(--dsw-alias-label-secondary);font-size:13px;line-height:20px}
191
+ .foggy-message{margin:0;font-size:13px;line-height:20px;color:var(--dsw-alias-label-secondary)}.foggy-message[data-error=true]{color:var(--dsw-alias-state-error-primary)}.foggy-paths,.foggy-next,.foggy-section{border-top:1px solid var(--dsw-alias-border-l2);padding-top:14px}.foggy-paths h4,.foggy-next h4,.foggy-section h4{margin:0 0 8px;font-size:13px}.foggy-paths dl{display:grid;grid-template-columns:100px minmax(0,1fr);gap:6px 10px;margin:0}.foggy-paths dt{color:var(--dsw-alias-label-tertiary);font-size:12px}.foggy-paths dd{margin:0;min-width:0;overflow-wrap:anywhere;font-family:var(--ds-font-family-code);font-size:11px}.foggy-next p,.foggy-section p{margin:0;color:var(--dsw-alias-label-secondary);font-size:13px;line-height:20px}.foggy-section-actions{display:flex;gap:8px;flex-wrap:wrap;margin-top:10px}.foggy-onboarding-head{display:flex;justify-content:space-between;gap:12px;align-items:start}.foggy-onboarding-head code{font-size:11px;color:var(--dsw-alias-label-tertiary);overflow-wrap:anywhere}.foggy-step-list{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:7px;margin-top:10px}.foggy-step{border:1px solid var(--dsw-alias-border-l2);border-radius:8px;padding:8px;font-size:11px;color:var(--dsw-alias-label-tertiary)}.foggy-step[data-state=completed]{border-color:color-mix(in srgb,var(--dsw-alias-state-success-primary) 45%,var(--dsw-alias-border-l2));color:var(--dsw-alias-state-success-primary)}.foggy-step[data-state=failed],.foggy-step[data-state=invalid]{border-color:var(--dsw-alias-state-error-primary);color:var(--dsw-alias-state-error-primary)}.foggy-warning{border:1px solid color-mix(in srgb,var(--dsw-alias-state-warning-primary) 55%,var(--dsw-alias-border-l2));background:color-mix(in srgb,var(--dsw-alias-state-warning-primary) 8%,transparent);border-radius:10px;padding:12px}
137
192
  @media (width<=680px){.foggy-grid{grid-template-columns:minmax(0,1fr)}}
138
193
  `
139
194
 
@@ -157,6 +212,16 @@ window.__ModuleLoader__.load({
157
212
  const stateText = kind === 'runtime'
158
213
  ? t(available ? 'installed' : 'missing')
159
214
  : t(available ? 'available' : 'unavailable')
215
+ const source = component?.source === 'managed'
216
+ ? t('managedPrivate')
217
+ : component?.source === 'override'
218
+ ? t('configuredOverride')
219
+ : null
220
+ const detail = [
221
+ component?.version || component?.output || '—',
222
+ component?.minimum ? `≥${component.minimum}` : null,
223
+ source,
224
+ ].filter(Boolean).join(' · ')
160
225
  return jsxs('div', {
161
226
  className: 'foggy-card',
162
227
  children: [
@@ -164,7 +229,8 @@ window.__ModuleLoader__.load({
164
229
  jsx('strong', { children: label }),
165
230
  jsx('span', { className: 'foggy-badge', children: stateText }),
166
231
  ] }),
167
- jsx('code', { children: `${component?.version || component?.output || '—'}${component?.minimum ? ` · ≥${component.minimum}` : ''}` }),
232
+ jsx('code', { children: detail }),
233
+ component?.path ? jsx('code', { title: component.path, children: component.path }) : null,
168
234
  ],
169
235
  })
170
236
  }
@@ -174,6 +240,7 @@ window.__ModuleLoader__.load({
174
240
  const percent = Math.max(0, Math.min(100, Number(progress.percent) || 0))
175
241
  const phaseKeys = {
176
242
  preflight: 'progressPreflight',
243
+ python: 'progressPython',
177
244
  cli: 'progressCli',
178
245
  launcher: 'progressLauncher',
179
246
  'analysis-skill': 'progressAnalysis',
@@ -215,6 +282,41 @@ window.__ModuleLoader__.load({
215
282
  })
216
283
  }
217
284
 
285
+ function onboardingPanel(onboarding, t) {
286
+ const profile = onboarding?.profiles?.[0]
287
+ if (!profile) return jsxs('div', { className: 'foggy-section', children: [
288
+ jsx('h4', { children: t('onboardingProgress') }),
289
+ jsx('p', { children: t('noOnboarding') }),
290
+ ] })
291
+ const steps = [
292
+ ['planned', 'stepPlanned'],
293
+ ['datasourceConfigured', 'stepDatasourceConfigured'],
294
+ ['datasourceVerified', 'stepDatasourceVerified'],
295
+ ['schemaDiscovered', 'stepSchemaDiscovered'],
296
+ ['semanticDrafted', 'stepSemanticDrafted'],
297
+ ['semanticValidated', 'stepSemanticValidated'],
298
+ ['semanticPublished', 'stepSemanticPublished'],
299
+ ['semanticVerified', 'stepSemanticVerified'],
300
+ ]
301
+ const percent = Math.round(((profile.completedSteps || 0) / Math.max(profile.totalSteps || 8, 1)) * 100)
302
+ return jsxs('div', { className: 'foggy-section', children: [
303
+ jsxs('div', { className: 'foggy-onboarding-head', children: [
304
+ jsxs('div', { children: [
305
+ jsx('h4', { children: `${t('onboardingProgress')} · ${profile.profile}` }),
306
+ jsx('code', { children: `${t('projectRoot')}: ${profile.projectRoot || '—'}` }),
307
+ ] }),
308
+ jsx('span', { className: 'foggy-progress-percent', children: `${percent}%` }),
309
+ ] }),
310
+ jsx('div', { className: 'foggy-step-list', children: steps.map(([name, label]) => jsx('div', {
311
+ className: 'foggy-step',
312
+ 'data-state': profile.steps?.[name]?.status || 'pending',
313
+ title: profile.steps?.[name]?.status || 'pending',
314
+ children: t(label),
315
+ }, name)) }),
316
+ profile.next?.status !== 'completed' ? jsx('p', { style: { marginTop: '9px' }, children: t('resumeInChat') }) : null,
317
+ ] })
318
+ }
319
+
218
320
  function FoggySettingsTab({ api, t }) {
219
321
  const [view, setView] = useState({ phase: 'loading', status: null, message: '', error: false })
220
322
 
@@ -239,7 +341,12 @@ window.__ModuleLoader__.load({
239
341
  setView((current) => ({ ...current, message: t('working'), error: false }))
240
342
  try {
241
343
  const result = unwrap(await api[method](), method)
242
- setView((current) => ({ ...current, message: result.accepted ? t('accepted') : '', error: result.success === false }))
344
+ const message = result.accepted
345
+ ? t('accepted')
346
+ : result.path
347
+ ? `${t('diagnosticsSaved')}: ${result.path}`
348
+ : ''
349
+ setView((current) => ({ ...current, message, error: result.success === false }))
243
350
  await refresh()
244
351
  } catch (error) {
245
352
  setView((current) => ({ ...current, message: `${t('actionFailed')}: ${String(error.message || error)}`, error: true }))
@@ -268,6 +375,7 @@ window.__ModuleLoader__.load({
268
375
  jsxs('div', { className: 'foggy-state', children: [jsx('span', { className: 'foggy-dot', 'data-state': status.state }), jsx('span', { children: t(stateLabels[status.state] || 'notInstalled') })] }),
269
376
  jsxs('div', { className: 'foggy-actions', children: [
270
377
  jsx('button', { className: 'foggy-button', type: 'button', disabled: busy, onClick: refresh, children: t('refresh') }),
378
+ jsx('button', { className: 'foggy-button', type: 'button', disabled: busy, onClick: () => run('diagnostics'), children: t('diagnostics') }),
271
379
  status.state === 'not-installed' ? jsx('button', { className: 'foggy-button foggy-button-primary', type: 'button', disabled: busy, onClick: () => run('initialize'), children: t('initialize') }) : null,
272
380
  status.state !== 'not-installed' ? jsx('button', { className: 'foggy-button', type: 'button', disabled: busy, onClick: () => run('repair'), children: t('repair') }) : null,
273
381
  status.installed && !status.running && status.components.java.available ? jsx('button', { className: 'foggy-button foggy-button-primary', type: 'button', disabled: busy, onClick: () => run('runtimeStart'), children: t('start') }) : null,
@@ -285,6 +393,24 @@ window.__ModuleLoader__.load({
285
393
  componentCard(t('onboardingSkill'), status.components.onboardingSkill, 'runtime', t),
286
394
  componentCard(t('skillRegistry'), { installed: status.components.onboardingSkill?.provider === 'foggy-managed-skills', version: 'native' }, 'runtime', t),
287
395
  ] }),
396
+ jsxs('div', { className: 'foggy-section', children: [
397
+ jsx('h4', { children: t('repairTitle') }),
398
+ jsx('div', { className: 'foggy-section-actions', children: [
399
+ jsx('button', { className: 'foggy-button', type: 'button', disabled: busy, onClick: () => run('repairPython'), children: t('repairPython') }),
400
+ jsx('button', { className: 'foggy-button', type: 'button', disabled: busy, onClick: () => run('repairCli'), children: t('repairCli') }),
401
+ jsx('button', { className: 'foggy-button', type: 'button', disabled: busy, onClick: () => run('repairLauncher'), children: t('repairLauncher') }),
402
+ jsx('button', { className: 'foggy-button', type: 'button', disabled: busy, onClick: () => run('repairAnalysisSkill'), children: t('repairAnalysisSkill') }),
403
+ ] }),
404
+ ] }),
405
+ status.profileMigration?.pendingCount || status.profileMigration?.conflictCount ? jsxs('div', { className: 'foggy-warning', children: [
406
+ jsx('h4', { children: t('profileMigrationTitle') }),
407
+ jsx('p', { children: status.profileMigration.conflictCount ? t('profileMigrationConflict') : t('profileMigrationPending') }),
408
+ !status.profileMigration.conflictCount ? jsx('div', { className: 'foggy-section-actions', children: jsx('button', {
409
+ className: 'foggy-button foggy-button-primary', type: 'button', disabled: busy,
410
+ onClick: () => run('migrateProfiles'), children: t('migrateProfiles'),
411
+ }) }) : null,
412
+ ] }) : null,
413
+ onboardingPanel(status.onboarding, t),
288
414
  jsxs('div', { className: 'foggy-paths', children: [
289
415
  jsx('h4', { children: t('roots') }),
290
416
  jsxs('dl', { children: [