aboutsummaryrefslogtreecommitdiff
path: root/test-suite
diff options
context:
space:
mode:
authorTianren Dong <tianrendong.dtr@gmail.com>2026-09-26 22:20:21 -0400
committerTianren Dong <tianrendong.dtr@gmail.com>2026-09-26 23:28:51 -0400
commitc5c048b3b2b978d99f6b4f941be842429744c946 (patch)
treecedbf5d81e0b62d0e82d3ec3f0166fdc348e3cf8 /test-suite
parent4d93d850d2b1bb0c1967e87e9a09d841f8c5020c (diff)
Make Chrome primer and authorization log prompt-cache friendly
- Contribute the primer as a structured prompt section instead of forcing systemPrompt. - Log pi-chrome-tool-change as a rendered custom entry that is not sent to the model.
Diffstat (limited to 'test-suite')
-rw-r--r--test-suite/unit/prompt-section.test.mjs52
1 files changed, 52 insertions, 0 deletions
diff --git a/test-suite/unit/prompt-section.test.mjs b/test-suite/unit/prompt-section.test.mjs
new file mode 100644
index 0000000..b83f526
--- /dev/null
+++ b/test-suite/unit/prompt-section.test.mjs
@@ -0,0 +1,52 @@
+// The Chrome primer must be a structured prompt section, never a forced `systemPrompt` override.
+// A forced override makes pi collapse all system messages into a new leading prompt every run,
+// which busts the provider prompt cache.
+import assert from "node:assert/strict";
+import fs from "node:fs";
+import vm from "node:vm";
+import { stripTypeScriptTypes } from "node:module";
+import { test } from "node:test";
+
+const source = fs.readFileSync(new URL("../../extensions/chrome-profile-bridge/index.ts", import.meta.url), "utf8");
+const from = source.indexOf('pi.on("before_agent_start",');
+const to = source.indexOf("// Shared handlers,", from);
+assert.ok(from >= 0 && to > from, "Missing before_agent_start section");
+const handlerSource = stripTypeScriptTypes(source.slice(from, to));
+
+function load({ registered = true, authorized = true } = {}) {
+ let handler;
+ const pi = { on: (name, fn) => { if (name === "before_agent_start") handler = fn; } };
+ vm.runInNewContext(`${handlerSource}`, {
+ pi,
+ chromeToolsRegistered: registered,
+ chromeControlAuthorized: () => authorized,
+ });
+ return handler;
+}
+
+test("authorized: adds primer section and does not force systemPrompt", () => {
+ const event = { systemPrompt: "base", systemPromptOptions: { sections: {} } };
+ const result = load()(event);
+ assert.equal(result, undefined);
+ const primer = event.systemPromptOptions.sections["chrome-profile-bridge"];
+ assert.match(primer, /^Chrome control is available/);
+ assert.doesNotMatch(primer, /<\/?chrome-profile-bridge>/, "pi wraps sections in their tag");
+});
+
+test("locked: removes primer section and does not force systemPrompt", () => {
+ const event = { systemPrompt: "base", systemPromptOptions: { sections: { "chrome-profile-bridge": "stale", other: "keep" } } };
+ assert.equal(load({ authorized: false })(event), undefined);
+ assert.deepEqual(event.systemPromptOptions.sections, { other: "keep" });
+});
+
+test("tools not registered: no primer", () => {
+ const event = { systemPrompt: "base", systemPromptOptions: { sections: {} } };
+ assert.equal(load({ registered: false })(event), undefined);
+ assert.deepEqual(event.systemPromptOptions.sections, {});
+});
+
+test("legacy pi without sections: appends only when authorized", () => {
+ assert.equal(load({ authorized: false })({ systemPrompt: "base" }), undefined);
+ const result = load()({ systemPrompt: "base" });
+ assert.match(result.systemPrompt, /^base\n<chrome-profile-bridge>\nChrome control is available[\s\S]*<\/chrome-profile-bridge>$/);
+});