mirror of
https://github.com/openclaw/openclaw.git
synced 2026-08-24 11:25:50 -06:00
feat(onboarding): recommend plugins and skills from installed apps (#109668)
* feat(onboarding): recommend plugins and skills from installed apps Scan installed macOS apps during classic onboarding (TCC-free), gather candidates from official catalogs + ClawHub search, let the configured model pick genuine matches, and offer an opt-in multiselect install step. Adds a device.apps node-host command (default-off sharing, Android-parity envelope) so remote gateways can request a paired Mac's inventory, and a wizard.appRecommendations kill switch. Custom setup-inference completions no longer inherit the 32-token verification-probe output cap. * feat(onboarding): recommend apps in guided flow * fix(onboarding): harden app recommendations against ClawHub self-promotion Third-party ClawHub skills are never pre-selected regardless of model tier (publisher-controlled listing text reaches the matcher prompt and could promote itself); their labels now say they install third-party code. Installed-app scans follow symlinked .app bundles. Matcher output stays bounded by the resolved model's own maxTokens budget (documented invariant). * fix(onboarding): key official catalog candidates by resolved plugin id Real catalog entries are package manifests without a top-level id; keying the candidate map and channel/provider classification by entry.id collapsed the whole official catalog into one undefined-keyed entry, so no official plugin or channel was ever recommended. Regression test runs against the bundled catalogs. * fix(onboarding): satisfy lint, types, deadcode, and migration gates Split the guided-onboarding test into a self-contained custodian suite to stay under max-lines. Narrow app-recommendation exports (drop dead node-payload normalizer, unexport internal types/helpers, route candidate tests through the public API), replace map-spread with a helper, unexport device.apps result types, add installedAppsSharing to node-host migration expectations, cast the wizard multiselect mock, and regenerate the docs map. * test(onboarding): register new live test in the shard classifier
This commit is contained in:
committed by
GitHub
parent
8020dd3e08
commit
da69daeb72
@@ -1,4 +1,5 @@
|
||||
import { beforeEach, describe, expect, it, vi } from "vitest";
|
||||
import { NODE_DEVICE_APPS_COMMAND } from "../infra/node-commands.js";
|
||||
import type { OpenClawPluginNodeHostCommandIo } from "../plugins/types.js";
|
||||
import type { NodeHostClient } from "./client.js";
|
||||
import { listRegisteredNodeHostCapsAndCommands } from "./plugin-node-host.js";
|
||||
@@ -165,3 +166,30 @@ describe("node-host duplex capability selection", () => {
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
describe("installed application command advertisement", () => {
|
||||
it("advertises device.apps only when sharing is enabled on macOS", async () => {
|
||||
const disabled = await prepareNodeHostRuntime({
|
||||
config: { nodeHost: { skills: { enabled: false } } },
|
||||
env: { PATH: "/usr/bin" },
|
||||
platform: "darwin",
|
||||
installedAppsSharingEnabled: false,
|
||||
});
|
||||
const enabled = await prepareNodeHostRuntime({
|
||||
config: { nodeHost: { skills: { enabled: false } } },
|
||||
env: { PATH: "/usr/bin" },
|
||||
platform: "darwin",
|
||||
installedAppsSharingEnabled: true,
|
||||
});
|
||||
const nonDarwin = await prepareNodeHostRuntime({
|
||||
config: { nodeHost: { skills: { enabled: false } } },
|
||||
env: { PATH: "/usr/bin" },
|
||||
platform: "linux",
|
||||
installedAppsSharingEnabled: true,
|
||||
});
|
||||
|
||||
expect(disabled.manifest.commands).not.toContain(NODE_DEVICE_APPS_COMMAND);
|
||||
expect(enabled.manifest.commands).toContain(NODE_DEVICE_APPS_COMMAND);
|
||||
expect(nonDarwin.manifest.commands).not.toContain(NODE_DEVICE_APPS_COMMAND);
|
||||
});
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user