Skip to content

Commit 31016c5

Browse files
committed
refactor: derive plugin contracts from manifests
1 parent cac40c0 commit 31016c5

4 files changed

Lines changed: 205 additions & 82 deletions

File tree

src/agents/agent-scope.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import path from "node:path";
33
import type { OpenClawConfig } from "../config/config.js";
44
import { resolveAgentModelFallbackValues } from "../config/model-input.js";
55
import { resolveStateDir } from "../config/paths.js";
6+
import type { AgentDefaultsConfig } from "../config/types.agent-defaults.js";
67
import { createSubsystemLogger } from "../logging/subsystem.js";
78
import {
89
DEFAULT_AGENT_ID,
@@ -37,7 +38,7 @@ type ResolvedAgentConfig = {
3738
agentDir?: string;
3839
model?: AgentEntry["model"];
3940
thinkingDefault?: AgentEntry["thinkingDefault"];
40-
verboseDefault?: AgentEntry["verboseDefault"];
41+
verboseDefault?: AgentDefaultsConfig["verboseDefault"];
4142
reasoningDefault?: AgentEntry["reasoningDefault"];
4243
fastModeDefault?: AgentEntry["fastModeDefault"];
4344
skills?: AgentEntry["skills"];
@@ -143,7 +144,7 @@ export function resolveAgentConfig(
143144
? entry.model
144145
: undefined,
145146
thinkingDefault: entry.thinkingDefault,
146-
verboseDefault: entry.verboseDefault,
147+
verboseDefault: cfg.agents?.defaults?.verboseDefault,
147148
reasoningDefault: entry.reasoningDefault,
148149
fastModeDefault: entry.fastModeDefault,
149150
skills: Array.isArray(entry.skills) ? entry.skills : undefined,
Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
import { readFileSync } from "node:fs";
2+
import { dirname, resolve } from "node:path";
3+
import { fileURLToPath } from "node:url";
4+
import { describe, expect, it } from "vitest";
5+
6+
const SRC_ROOT = resolve(dirname(fileURLToPath(import.meta.url)), "../..");
7+
const REPO_ROOT = resolve(SRC_ROOT, "..");
8+
9+
const ALLOWED_BUNDLED_CAPABILITY_METADATA_CONSUMERS = new Set([
10+
"src/plugins/bundled-capability-metadata.test.ts",
11+
"src/plugins/contracts/boundary-invariants.test.ts",
12+
]);
13+
14+
const ALLOWED_EXTENSION_PATH_STRING_TESTS = new Set([
15+
"src/channels/plugins/bundled.shape-guard.test.ts",
16+
"src/plugins/contracts/bundled-extension-config-api-guardrails.test.ts",
17+
"src/scripts/test-projects.test.ts",
18+
]);
19+
20+
describe("plugin contract boundary invariants", () => {
21+
it("keeps bundled-capability-metadata confined to contract/test inventory", async () => {
22+
const { globSync } = await import("glob");
23+
const files = globSync("src/**/*.ts", {
24+
cwd: REPO_ROOT,
25+
nodir: true,
26+
});
27+
const offenders = files.filter((file) => {
28+
if (ALLOWED_BUNDLED_CAPABILITY_METADATA_CONSUMERS.has(file)) {
29+
return false;
30+
}
31+
const source = readFileSync(resolve(REPO_ROOT, file), "utf8");
32+
return source.includes("bundled-capability-metadata");
33+
});
34+
expect(offenders).toEqual([]);
35+
});
36+
37+
it("keeps core tests off bundled extension deep imports", async () => {
38+
const { globSync } = await import("glob");
39+
const files = globSync("src/**/*.test.ts", {
40+
cwd: REPO_ROOT,
41+
nodir: true,
42+
});
43+
const offenders = files.filter((file) => {
44+
if (ALLOWED_EXTENSION_PATH_STRING_TESTS.has(file)) {
45+
return false;
46+
}
47+
const source = readFileSync(resolve(REPO_ROOT, file), "utf8");
48+
return (
49+
/from\s+["'][^"']*extensions\/.+(?:api|runtime-api|test-api)\.js["']/u.test(source) ||
50+
/vi\.(?:mock|doMock)\(\s*["'][^"']*extensions\/.+["']/u.test(source) ||
51+
/importActual<[^>]*>\(\s*["'][^"']*extensions\/.+["']/u.test(source)
52+
);
53+
});
54+
expect(offenders).toEqual([]);
55+
});
56+
});

0 commit comments

Comments
 (0)