@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.
- package/README.md +32 -6
- package/THIRD-PARTY-RUNTIME-NOTICES.md +16 -0
- package/docs/PUBLIC-BETA-READINESS.md +51 -0
- package/docs/WINDOWS-BETA-ACCEPTANCE.md +71 -0
- package/experience/linux/README.md +5 -6
- package/experience/linux/prepare.sh +7 -9
- package/lib/client.js +132 -6
- package/lib/index.js +157 -28
- package/lib/python-runtime.js +339 -0
- package/lib/remote-descriptor.js +1 -0
- package/lib/version.js +5 -0
- package/package.json +6 -3
- package/skills/foggy-deepseek-onboarding/SKILL.md +24 -5
- package/skills/foggy-deepseek-onboarding/assets/onboarding-state.schema.json +20 -0
- package/skills/foggy-deepseek-onboarding/assets/versions.json +46 -2
- package/skills/foggy-deepseek-onboarding/references/onboarding-workflow.md +18 -4
- package/skills/foggy-deepseek-onboarding/scripts/doctor.ps1 +2 -2
- package/skills/foggy-deepseek-onboarding/scripts/doctor.sh +1 -2
- package/skills/foggy-deepseek-onboarding/scripts/install.ps1 +2 -2
- package/skills/foggy-deepseek-onboarding/scripts/install.sh +1 -2
- package/skills/foggy-deepseek-onboarding/scripts/invoke-onboarding.ps1 +30 -0
- package/skills/foggy-deepseek-onboarding/scripts/invoke-onboarding.sh +24 -0
- package/skills/foggy-deepseek-onboarding/scripts/onboard.ps1 +2 -2
- package/skills/foggy-deepseek-onboarding/scripts/onboard.sh +1 -2
- package/skills/foggy-deepseek-onboarding/scripts/onboarding.py +400 -43
- package/skills/foggy-deepseek-onboarding/scripts/runtime-start.ps1 +2 -2
- package/skills/foggy-deepseek-onboarding/scripts/runtime-start.sh +1 -2
- package/skills/foggy-deepseek-onboarding/scripts/runtime-stop.ps1 +2 -2
- package/skills/foggy-deepseek-onboarding/scripts/runtime-stop.sh +1 -2
- package/skills/foggy-deepseek-onboarding/scripts/uninstall.ps1 +2 -2
- 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
|
|
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.
|
|
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
|
|
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
|
|
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
|
|
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`,
|
|
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**.
|
|
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.
|
|
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 "
|
|
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 (
|
|
77
|
-
|| fail "Node 22.19
|
|
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: [
|
|
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
|
|
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:
|
|
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
|
-
|
|
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: [
|