fix(deps): adapt to pi-permission-system 32 session-keyed services

- resolve the permissions service by the live session id in both
  tryRegister paths, so a mid-session republish re-keys via the re-emitted
  permissions:ready channel
- read the session probe instead of the start-time snapshot for inner-cmd
- pass the session key to publish/unpublishPermissionsService in tests and
  drop the removed PromptPermissionDetails.message field
- raise the ai-judge peer floor to @gotgenes/pi-permission-system >=32.0.0
- bump dev deps: pi-coding-agent 0.85.1, vitest 5, typescript 7
This commit is contained in:
2026-09-16 20:57:55 +08:00
parent 063e04503b
commit c0585a1740
11 changed files with 746 additions and 1249 deletions
+9 -9
View File
@@ -14,17 +14,17 @@
"peerDependencies": {
"@earendil-works/pi-ai": "*",
"@earendil-works/pi-coding-agent": "*",
"@gotgenes/pi-permission-system": ">=25.4.0"
"@gotgenes/pi-permission-system": ">=32.0.0"
},
"devDependencies": {
"@earendil-works/pi-ai": "*",
"@earendil-works/pi-coding-agent": "*",
"@gotgenes/pi-permission-system": ">=25.4.0",
"@types/node": "^26.0.0",
"@vitest/coverage-istanbul": "3.2.7",
"@vitest/coverage-v8": "^3.2.7",
"typescript": "^5",
"vitest": "^3"
"@earendil-works/pi-ai": "^0.85.1",
"@earendil-works/pi-coding-agent": "^0.85.1",
"@gotgenes/pi-permission-system": "^32.0.2",
"@types/node": "^26.5.1",
"@vitest/coverage-istanbul": "5.0.1",
"@vitest/coverage-v8": "^5.0.1",
"typescript": "^7.0.2",
"vitest": "^5.0.1"
},
"scripts": {
"check": "tsc --noEmit",
+4 -1
View File
@@ -639,7 +639,10 @@ export default function permissionAiJudge(pi: ExtensionAPI): void {
return;
}
const service = getPermissionsService();
// Resolve the service by the live session id: the ready channel
// re-emits after a mid-session republish (31.1.4), and the dynamic
// read re-keys onto the new slot without extra state.
const service = getPermissionsService(root.getSessionId());
if (service === undefined) {
return;
}
@@ -10,7 +10,6 @@ function details(
requestId: "req-1",
source: "tool_call",
agentName: null,
message: "bash ask",
payload: {
kind: "bash",
request: {
@@ -122,7 +122,6 @@ function ask(): PromptPermissionDetails {
requestId: "req-1",
source: "tool_call",
agentName: null,
message: "bash ask",
payload: {
kind: "bash",
request: {
@@ -204,10 +203,13 @@ function fakeSessionManager(): {
};
}
/** The session id every fake session manager reports — the service key. */
const SESSION_ID = "session-root";
let publishedService: PermissionsService | undefined;
afterEach(() => {
if (publishedService !== undefined) {
unpublishPermissionsService(publishedService);
unpublishPermissionsService(SESSION_ID, publishedService);
publishedService = undefined;
}
cleanupMockAgentDir();
@@ -230,7 +232,7 @@ describe("AI judge lifecycle", () => {
checkPermission: vi.fn(),
getToolPermission: vi.fn(),
} as unknown as PermissionsService;
publishPermissionsService(service);
publishPermissionsService(SESSION_ID, service);
publishedService = service;
// A mutable "current model" the session switches mid-run.
@@ -312,7 +314,7 @@ describe("AI judge lifecycle", () => {
checkPermission: vi.fn(),
getToolPermission: vi.fn(),
} as unknown as PermissionsService;
publishPermissionsService(service);
publishPermissionsService(SESSION_ID, service);
publishedService = service;
const complete = vi.fn(
@@ -383,7 +385,7 @@ describe("AI judge lifecycle", () => {
checkPermission: vi.fn(),
getToolPermission: vi.fn(),
} as unknown as PermissionsService;
publishPermissionsService(service);
publishPermissionsService(SESSION_ID, service);
publishedService = service;
const complete = vi.fn(
@@ -477,7 +479,7 @@ describe("AI judge lifecycle", () => {
checkPermission: vi.fn(),
getToolPermission: vi.fn(),
} as unknown as PermissionsService;
publishPermissionsService(service);
publishPermissionsService(SESSION_ID, service);
publishedService = service;
const complete = vi.fn();
@@ -552,7 +554,7 @@ describe("AI judge lifecycle", () => {
checkPermission: vi.fn(),
getToolPermission: vi.fn(),
} as unknown as PermissionsService;
publishPermissionsService(service);
publishPermissionsService(SESSION_ID, service);
publishedService = service;
const complete = vi.fn(
@@ -622,7 +624,7 @@ describe("AI judge lifecycle", () => {
const service = {
registerAuthorizer: vi.fn(),
} as unknown as PermissionsService;
publishPermissionsService(service);
publishPermissionsService(SESSION_ID, service);
publishedService = service;
const harness = createFakePi();
@@ -682,7 +684,7 @@ describe("AI judge Enforce authority seam (PIEXTENSIO-23, ADR 0008)", () => {
checkPermission: vi.fn(),
getToolPermission: vi.fn(),
} as unknown as PermissionsService;
publishPermissionsService(service);
publishPermissionsService(SESSION_ID, service);
publishedService = service;
const complete = vi.fn(async () => options.response ?? modelResponse());
@@ -920,7 +922,7 @@ describe("AI judge Enforce authority seam (PIEXTENSIO-23, ADR 0008)", () => {
checkPermission: vi.fn(),
getToolPermission: vi.fn(),
} as unknown as PermissionsService;
publishPermissionsService(service);
publishPermissionsService(SESSION_ID, service);
publishedService = service;
const complete = vi.fn(async () => modelResponse());
@@ -12,7 +12,7 @@
]
},
"dependencies": {
"@gotgenes/pi-permission-system": "^25.4.0"
"@gotgenes/pi-permission-system": "^32.0.2"
},
"bundledDependencies": [
"@gotgenes/pi-permission-system"
@@ -21,12 +21,12 @@
"@earendil-works/pi-coding-agent": "*"
},
"devDependencies": {
"@earendil-works/pi-coding-agent": "*",
"@types/node": "^26.0.0",
"@vitest/coverage-istanbul": "3.2.7",
"@vitest/coverage-v8": "^3.2.7",
"typescript": "^5",
"vitest": "^3"
"@earendil-works/pi-coding-agent": "^0.85.1",
"@types/node": "^26.5.1",
"@vitest/coverage-istanbul": "5.0.1",
"@vitest/coverage-v8": "^5.0.1",
"typescript": "^7.0.2",
"vitest": "^5.0.1"
},
"scripts": {
"check": "tsc --noEmit",
@@ -32,7 +32,12 @@ export default function permissionInnerCmd(pi: ExtensionAPI): void {
return;
}
const service = getPermissionsService();
// Resolve by the live session id, not the start-time snapshot: a
// mid-session id change republishes under the new key and re-emits
// the ready channel, so the dynamic read re-keys onto it.
const service = getPermissionsService(
rootSession.session.getSessionId(),
);
if (!service) {
return;
}
@@ -67,7 +67,6 @@ function bashDetails(
requestId: "req-1",
source: "tool_call",
agentName,
message: "May I run bash?",
payload: {
kind: "bash",
request: {
@@ -76,6 +76,9 @@ function createFakeSessionManager(
} as unknown as ExtensionContext["sessionManager"];
}
/** The default fake session id — the key the service publishes under. */
const SESSION_ID = "session-root";
describe("permissions:ready -> registerAuthorizer lifecycle", () => {
let registerAuthorizer: ReturnType<typeof vi.fn>;
let disposer: ReturnType<typeof vi.fn>;
@@ -104,7 +107,7 @@ describe("permissions:ready -> registerAuthorizer lifecycle", () => {
});
afterEach(() => {
if (published) unpublishPermissionsService(service);
if (published) unpublishPermissionsService(SESSION_ID, service);
});
/**
@@ -113,7 +116,7 @@ describe("permissions:ready -> registerAuthorizer lifecycle", () => {
* available, so an early `session_start` cannot register yet.
*/
function becomeReady(): void {
publishPermissionsService(service);
publishPermissionsService(SESSION_ID, service);
published = true;
}
@@ -228,7 +231,6 @@ describe("permissions:ready -> registerAuthorizer lifecycle", () => {
requestId: "req-1",
source: "tool_call",
agentName: "child",
message: "forwarded ask",
payload: {
kind: "forwarded",
request: {