Skip to content

Commit 320fc59

Browse files
authored
Merge branch 'main' into fix/modelrun-empty-allowlist-guard
2 parents 2d0793b + a39e548 commit 320fc59

213 files changed

Lines changed: 1882 additions & 3097 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.
Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,2 @@
1-
e9a9b4ae37ded1a4b7057ee846c6c272ce447513185369730ef060dddd9392d0 plugin-sdk-api-baseline.json
2-
21ba8828ff755f132acc58955846a49a03c65ae6f5af351ff04ec5643095ac00 plugin-sdk-api-baseline.jsonl
1+
172fe4e143964c0a20525428ff3e6c7631856a7d51c6ad48959a35c72363a410 plugin-sdk-api-baseline.json
2+
a4c18ea9f0b0d2c22183bf8c082e757b7f9852b4c518c8b8cb62a21a9dd766e9 plugin-sdk-api-baseline.jsonl

extensions/browser/src/browser/runtime-lifecycle.ts

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,11 @@
11
/**
2-
* Browser plugin runtime lifecycle helpers for startup relay setup and shutdown
3-
* cleanup.
2+
* Browser plugin runtime lifecycle helpers for startup and shutdown cleanup.
43
*/
54
import type { Server } from "node:http";
65
import { getPwAiModule } from "./pw-ai-module.js";
76
import { isPwAiLoaded } from "./pw-ai-state.js";
87
import type { BrowserServerState } from "./server-context.js";
9-
import { ensureExtensionRelayForProfiles, stopKnownBrowserProfiles } from "./server-lifecycle.js";
8+
import { stopKnownBrowserProfiles } from "./server-lifecycle.js";
109
import { startTrackedBrowserTabCleanupTimer } from "./session-tab-cleanup.js";
1110
import { registerBrowserUnhandledRejectionHandler } from "./unhandled-rejections.js";
1211

@@ -27,10 +26,6 @@ export async function createBrowserRuntimeState(params: {
2726
onWarn: params.onWarn,
2827
});
2928

30-
await ensureExtensionRelayForProfiles({
31-
resolved: params.resolved,
32-
onWarn: params.onWarn,
33-
});
3429
state.stopUnhandledRejectionHandler = registerBrowserUnhandledRejectionHandler();
3530

3631
return state;

extensions/browser/src/browser/runtime-lifecycle.unhandled-rejections.test.ts

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,6 @@ const { getUnhandledRejectionHandlers, registerUnhandledRejectionHandlerMock, re
1919
});
2020

2121
const {
22-
ensureExtensionRelayForProfilesMock,
2322
getPwAiModuleMock,
2423
isPwAiLoadedMock,
2524
startTrackedBrowserTabCleanupTimerMock,
@@ -28,7 +27,6 @@ const {
2827
} = vi.hoisted(() => {
2928
const trackedTabCleanupMockLocal = vi.fn();
3029
return {
31-
ensureExtensionRelayForProfilesMock: vi.fn(async () => {}),
3230
getPwAiModuleMock: vi.fn(),
3331
isPwAiLoadedMock: vi.fn(() => false),
3432
startTrackedBrowserTabCleanupTimerMock: vi.fn(() => trackedTabCleanupMockLocal),
@@ -42,7 +40,6 @@ vi.mock("openclaw/plugin-sdk/runtime-env", () => ({
4240
}));
4341

4442
vi.mock("./server-lifecycle.js", () => ({
45-
ensureExtensionRelayForProfiles: ensureExtensionRelayForProfilesMock,
4643
stopKnownBrowserProfiles: stopKnownBrowserProfilesMock,
4744
}));
4845

@@ -64,7 +61,6 @@ const { isPlaywrightDialogRaceUnhandledRejection } = await import("./unhandled-r
6461
beforeEach(() => {
6562
resetHandlers();
6663
registerUnhandledRejectionHandlerMock.mockClear();
67-
ensureExtensionRelayForProfilesMock.mockClear();
6864
getPwAiModuleMock.mockClear();
6965
isPwAiLoadedMock.mockReset().mockReturnValue(false);
7066
startTrackedBrowserTabCleanupTimerMock.mockClear();

extensions/browser/src/browser/server-lifecycle.test.ts

Lines changed: 1 addition & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -19,26 +19,14 @@ vi.mock("./server-context.js", () => ({
1919
listKnownProfileNames: listKnownProfileNamesMock,
2020
}));
2121

22-
const { ensureExtensionRelayForProfiles, stopKnownBrowserProfiles } =
23-
await import("./server-lifecycle.js");
22+
const { stopKnownBrowserProfiles } = await import("./server-lifecycle.js");
2423

2524
beforeEach(() => {
2625
createBrowserRouteContextMock.mockClear();
2726
listKnownProfileNamesMock.mockClear();
2827
stopOpenClawChromeMock.mockClear();
2928
});
3029

31-
describe("ensureExtensionRelayForProfiles", () => {
32-
it("is a no-op after removing the Chrome extension relay path", async () => {
33-
await expect(
34-
ensureExtensionRelayForProfiles({
35-
resolved: { profiles: {} } as never,
36-
onWarn: vi.fn(),
37-
}),
38-
).resolves.toBeUndefined();
39-
});
40-
});
41-
4230
describe("stopKnownBrowserProfiles", () => {
4331
it("stops all known profiles and ignores per-profile failures", async () => {
4432
listKnownProfileNamesMock.mockReturnValue(["openclaw", "user"]);

extensions/browser/src/browser/server-lifecycle.ts

Lines changed: 1 addition & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,13 @@
11
/**
2-
* Browser server lifecycle helpers for relay setup and profile shutdown.
2+
* Browser server lifecycle helpers for profile shutdown.
33
*/
44
import { stopOpenClawChrome } from "./chrome.js";
5-
import type { ResolvedBrowserConfig } from "./config.js";
65
import {
76
type BrowserServerState,
87
createBrowserRouteContext,
98
listKnownProfileNames,
109
} from "./server-context.js";
1110

12-
/** Ensures extension relay compatibility hooks for configured profiles. */
13-
export async function ensureExtensionRelayForProfiles(_params: {
14-
resolved: ResolvedBrowserConfig;
15-
onWarn: (message: string) => void;
16-
}) {
17-
// Intentional no-op: the Chrome extension relay path has been removed.
18-
// runtime-lifecycle still calls this helper, so keep the stub until the next
19-
// breaking cleanup rather than changing the call graph in a patch release.
20-
}
21-
2211
/** Stops every known Browser profile during runtime shutdown. */
2312
export async function stopKnownBrowserProfiles(params: {
2413
getState: () => BrowserServerState | null;

extensions/browser/src/browser/server.auth-fail-closed.test.ts

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,6 @@ const mocks = vi.hoisted(() => ({
2020
}),
2121
resolveBrowserControlAuth: vi.fn(() => ({})),
2222
shouldAutoGenerateBrowserAuth: vi.fn(() => true),
23-
ensureExtensionRelayForProfiles: vi.fn(async () => {}),
2423
}));
2524

2625
vi.mock("../config/config.js", async () => {
@@ -69,7 +68,6 @@ vi.mock("./server-context.js", () => ({
6968
}));
7069

7170
vi.mock("./server-lifecycle.js", () => ({
72-
ensureExtensionRelayForProfiles: mocks.ensureExtensionRelayForProfiles,
7371
stopKnownBrowserProfiles: vi.fn(async () => {}),
7472
}));
7573

@@ -85,7 +83,6 @@ describe("browser control auth bootstrap failures", () => {
8583
mocks.ensureBrowserControlAuth.mockClear();
8684
mocks.resolveBrowserControlAuth.mockClear();
8785
mocks.shouldAutoGenerateBrowserAuth.mockClear();
88-
mocks.ensureExtensionRelayForProfiles.mockClear();
8986
});
9087

9188
afterEach(async () => {
@@ -98,7 +95,6 @@ describe("browser control auth bootstrap failures", () => {
9895
expect(started).toBeNull();
9996
expect(mocks.ensureBrowserControlAuth).toHaveBeenCalledTimes(1);
10097
expect(mocks.resolveBrowserControlAuth).toHaveBeenCalledTimes(1);
101-
expect(mocks.ensureExtensionRelayForProfiles).not.toHaveBeenCalled();
10298
});
10399

104100
it("fails closed when auth bootstrap resolves empty auth in production-like mode", async () => {
@@ -111,7 +107,6 @@ describe("browser control auth bootstrap failures", () => {
111107
expect(started).toBeNull();
112108
expect(mocks.ensureBrowserControlAuth).toHaveBeenCalledTimes(1);
113109
expect(mocks.resolveBrowserControlAuth).toHaveBeenCalledTimes(1);
114-
expect(mocks.ensureExtensionRelayForProfiles).not.toHaveBeenCalled();
115110
});
116111

117112
it("fails closed when password mode has no resolved password", async () => {
@@ -123,7 +118,6 @@ describe("browser control auth bootstrap failures", () => {
123118
const started = await startBrowserControlServerFromConfig();
124119

125120
expect(started).toBeNull();
126-
expect(mocks.ensureExtensionRelayForProfiles).not.toHaveBeenCalled();
127121
});
128122

129123
it("fails closed when password mode drops an inactive token but has no password", async () => {
@@ -136,6 +130,5 @@ describe("browser control auth bootstrap failures", () => {
136130
const started = await startBrowserControlServerFromConfig();
137131

138132
expect(started).toBeNull();
139-
expect(mocks.ensureExtensionRelayForProfiles).not.toHaveBeenCalled();
140133
});
141134
});

extensions/browser/src/gateway/browser-request.shared-control-state.test.ts

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@ const mocks = vi.hoisted(() => ({
99
ensureBrowserControlAuth: vi.fn(async () => ({ auth: {} })),
1010
resolveBrowserControlAuth: vi.fn(() => ({})),
1111
shouldAutoGenerateBrowserAuth: vi.fn(() => false),
12-
ensureExtensionRelayForProfiles: vi.fn(async () => {}),
1312
stopKnownBrowserProfiles: vi.fn(async () => {}),
1413
isChromeReachable: vi.fn(async () => false),
1514
isChromeCdpReady: vi.fn(async () => false),
@@ -32,7 +31,6 @@ vi.mock("../browser/control-auth.js", () => ({
3231
}));
3332

3433
vi.mock("../browser/server-lifecycle.js", () => ({
35-
ensureExtensionRelayForProfiles: mocks.ensureExtensionRelayForProfiles,
3634
stopKnownBrowserProfiles: mocks.stopKnownBrowserProfiles,
3735
}));
3836

extensions/matrix/src/matrix/client/file-sync-store.ts

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -171,7 +171,7 @@ export class SqliteBackedMatrixSyncStore extends MemoryStore {
171171

172172
constructor(private readonly storageRootDir: string) {
173173
super();
174-
this.stateKey = resolveSyncCacheStateKey(storageRootDir);
174+
this.stateKey = SYNC_CACHE_STATE_KEY;
175175

176176
let restoredSavedSync: ISyncData | null = null;
177177
let restoredClientOptions: IStoredClientOpts | undefined;
@@ -426,10 +426,6 @@ function openMatrixSyncCacheStore(
426426
);
427427
}
428428

429-
function resolveSyncCacheStateKey(_storageRootDir: string): string {
430-
return SYNC_CACHE_STATE_KEY;
431-
}
432-
433429
function metaKey(stateKey: string): string {
434430
return `${stateKey}:meta`;
435431
}
@@ -557,7 +553,7 @@ export async function hasMatrixSyncCacheStateInStore(params: {
557553
storageRootDir: string;
558554
store: Pick<PluginStateKeyedStore<MatrixSyncCacheRecord>, "lookup">;
559555
}): Promise<boolean> {
560-
const stateKey = resolveSyncCacheStateKey(params.storageRootDir);
556+
const stateKey = SYNC_CACHE_STATE_KEY;
561557
const meta = await params.store.lookup(metaKey(stateKey));
562558
if (!isSyncCacheMeta(meta) || meta.chunkCount <= 0) {
563559
return false;
@@ -586,7 +582,7 @@ export async function writeMatrixSyncCacheStateToStore(params: {
586582
payload: PersistedMatrixSyncStore;
587583
store: MatrixSyncCacheAsyncStore;
588584
}): Promise<void> {
589-
const stateKey = resolveSyncCacheStateKey(params.storageRootDir);
585+
const stateKey = SYNC_CACHE_STATE_KEY;
590586
const rows = buildSyncCacheRows(stateKey, params.payload);
591587
for (const row of rows.chunks) {
592588
await params.store.register(row.key, row.value);

extensions/mattermost/src/mattermost/accounts.test.ts

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,32 @@ describe("resolveDefaultMattermostAccountId", () => {
7676
expect(listMattermostAccountIds(cfg)).toEqual(["default", "work"]);
7777
expect(resolveDefaultMattermostAccountId(cfg)).toBe("default");
7878
});
79+
80+
it("inherits top-level access policy for named accounts before doctor migration", () => {
81+
const cfg: OpenClawConfig = {
82+
channels: {
83+
mattermost: {
84+
dmPolicy: "open",
85+
groupPolicy: "open",
86+
allowFrom: ["*"],
87+
groupAllowFrom: ["*"],
88+
accounts: {
89+
tony: {
90+
botToken: "tok-tony",
91+
baseUrl: "https://chat.example.com",
92+
},
93+
},
94+
},
95+
},
96+
};
97+
98+
const account = resolveMattermostAccount({ cfg, accountId: "tony" });
99+
100+
expect(account.config.dmPolicy).toBe("open");
101+
expect(account.config.groupPolicy).toBe("open");
102+
expect(account.config.allowFrom).toEqual(["*"]);
103+
expect(account.config.groupAllowFrom).toEqual(["*"]);
104+
});
79105
});
80106

81107
describe("resolveMattermostReplyToMode", () => {

extensions/memory-core/src/concept-vocabulary.ts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -209,7 +209,6 @@ const LANGUAGE_STOP_WORDS = {
209209
"할",
210210
"해",
211211
"했다",
212-
"했다",
213212
],
214213
pathNoise: [
215214
"cjs",

0 commit comments

Comments
 (0)