46 lines
2.1 KiB
TypeScript
46 lines
2.1 KiB
TypeScript
// SPDX-License-Identifier: LicenseRef-ConusAI-Template-1.0
|
|
import { buildRegistry, Container, createCaller } from "@conusai-kit/core"
|
|
import { DATA_SOURCE, type DataSource, SYSTEM_DATA, type SystemDataSource } from "@conusai-kit/data"
|
|
import { createTenancyHooks, TENANCY, tenancyModule, users } from "@conusai-kit/tenancy"
|
|
import type { AgentScope } from "../core/ports.js"
|
|
import { AGENT_MODULE_BASE } from "../module.shared.js"
|
|
|
|
export const workerRegistry = buildRegistry([tenancyModule, AGENT_MODULE_BASE])
|
|
|
|
/** Real app membership/permission resolution, including a retained memo to expose stale use. */
|
|
export async function workerFixture(data: DataSource & SystemDataSource) {
|
|
const container = new Container()
|
|
container.value(DATA_SOURCE, data)
|
|
container.value(SYSTEM_DATA, data)
|
|
const tenancy = createTenancyHooks({ data, registry: workerRegistry })
|
|
container.value(TENANCY, tenancy)
|
|
const user = await data.global(users).insert({
|
|
issuer: "https://id.example.test",
|
|
subject: crypto.randomUUID(),
|
|
email: "worker@example.test",
|
|
displayName: "Worker fixture",
|
|
locale: "en",
|
|
})
|
|
const actor = { userId: user.id }
|
|
const caller = createCaller({ registry: workerRegistry, container, tenancy }, { actor })
|
|
const org = `worker-${crypto.randomUUID()}`
|
|
const { orgId } = (await caller.callByName("tenancy.org.create", { slug: org, name: "Worker" })) as { orgId: string }
|
|
const { workspaceId } = (await caller.callByName("tenancy.workspace.create", {
|
|
org,
|
|
slug: "work",
|
|
name: "Work",
|
|
visibility: "org",
|
|
})) as { workspaceId: string }
|
|
const { projectId } = (await caller.callByName("tenancy.project.create", {
|
|
org,
|
|
workspace: "work",
|
|
slug: "project",
|
|
name: "Project",
|
|
moduleKey: "agent",
|
|
})) as { projectId: string }
|
|
const scope: AgentScope = { level: "project", actor, orgId, workspaceId, projectId }
|
|
// Warm the request memo: worker admission must read past this after a revocation.
|
|
await tenancy.authorize(scope, "agent.run.start", { name: "agent.run.start", kind: "effect" })
|
|
return { container, scope, tenancy }
|
|
}
|