test: close the per-file coverage gaps for the scoping surface

Every subject-extractor row of the invariants carrier table is exercised
with a matching and a foreign-keyed carrier; the HMR re-apply seed path
(sessions of agents that predate the plugin are marked started) is pinned;
the scoped tool-provider disposal, plural restrict() validation, singular
scopeHost absentee, tool-subagent passthrough, stale-stage drop, and
disposing-parent spawn (INACTIVE_EFFECT, no orphan) each gain their test.
Two genuinely defensive branches carry justified v8-ignore markers.
This commit is contained in:
Tianyi Cui
2026-07-09 03:41:37 +08:00
parent cc24e79cd2
commit e7b712453a
10 changed files with 169 additions and 3 deletions

View File

@@ -100,6 +100,19 @@ describe('scoped tool providers and toolOrder × restriction', () => {
expect(global.tools.map(t => t.name)).toEqual(['global_tool'])
})
it('disposing a scoped tool provider empties its layer without residue', async () => {
const ctx = await mount()
const scope = await mintScope(ctx, 'child')
const dispose = scope.ctx.systemPrompt.tools(() => ({ schemas: [schema('scoped_tool')] }))
dispose()
const after = await ctx.systemPrompt.assemble({ scope: scopeKeyOf(scope) })
expect(after.tools.map(t => t.name)).toEqual([])
// Re-registering through the same scope starts a fresh layer.
scope.ctx.systemPrompt.tools(() => ({ schemas: [schema('again')] }))
const again = await ctx.systemPrompt.assemble({ scope: scopeKeyOf(scope) })
expect(again.tools.map(t => t.name)).toEqual(['again'])
})
it('a toolOrder entry restricted away for a scope is a normal absence, while a typo still throws', async () => {
const ctx = await mount({ toolOrder: ['bash', TOOL_ORDER_REST] })
// A provider mimicking the registry's restriction split: bash exists