@zhin.js/agent 1.1.39 → 1.1.41
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/assistant/job-storage.d.ts +238 -0
- package/lib/assistant/job-storage.js +143 -0
- package/lib/assistant/job-storage.js.map +1 -0
- package/lib/assistant/job-store.d.ts +7 -0
- package/lib/assistant/job-store.js +41 -3
- package/lib/assistant/job-store.js.map +1 -1
- package/lib/config/perception-config.d.ts +9 -0
- package/lib/config/perception-config.js +27 -0
- package/lib/config/perception-config.js.map +1 -1
- package/lib/context/context-system.d.ts +1 -0
- package/lib/context/context-system.js +8 -8
- package/lib/context/context-system.js.map +1 -1
- package/lib/context/im-turn-context-adapter.js +2 -0
- package/lib/context/im-turn-context-adapter.js.map +1 -1
- package/lib/context/skill-context.d.ts +3 -0
- package/lib/context/skill-context.js +6 -0
- package/lib/context/skill-context.js.map +1 -0
- package/lib/context/turn-envelope.d.ts +4 -0
- package/lib/context/turn-envelope.js +24 -7
- package/lib/context/turn-envelope.js.map +1 -1
- package/lib/context/turn-user-message.d.ts +3 -1
- package/lib/context/turn-user-message.js +14 -1
- package/lib/context/turn-user-message.js.map +1 -1
- package/lib/core/agent-core-run.d.ts +1 -0
- package/lib/core/agent-core-run.js +47 -20
- package/lib/core/agent-core-run.js.map +1 -1
- package/lib/core/structured-reply-recovery.d.ts +6 -2
- package/lib/core/structured-reply-recovery.js +22 -8
- package/lib/core/structured-reply-recovery.js.map +1 -1
- package/lib/core/turn-completion-usage.d.ts +2 -1
- package/lib/core/turn-completion-usage.js +14 -5
- package/lib/core/turn-completion-usage.js.map +1 -1
- package/lib/core/turn-event-mapper.d.ts +1 -1
- package/lib/core/turn-event-mapper.js +8 -5
- package/lib/core/turn-event-mapper.js.map +1 -1
- package/lib/decision/config.d.ts +1 -1
- package/lib/decision/config.js +1 -1
- package/lib/decision/config.js.map +1 -1
- package/lib/decision/types.d.ts +1 -1
- package/lib/decision/types.js.map +1 -1
- package/lib/event/turn-event.d.ts +7 -1
- package/lib/event/turn-event.js.map +1 -1
- package/lib/index.d.ts +4 -1
- package/lib/index.js +2 -0
- package/lib/index.js.map +1 -1
- package/lib/media/perception.d.ts +3 -4
- package/lib/media/perception.js +59 -37
- package/lib/media/perception.js.map +1 -1
- package/lib/memory/compaction-runtime.d.ts +3 -2
- package/lib/memory/compaction-runtime.js +22 -14
- package/lib/memory/compaction-runtime.js.map +1 -1
- package/lib/outbound/agent-output.js +2 -0
- package/lib/outbound/agent-output.js.map +1 -1
- package/lib/outbound/chat-failure.d.ts +27 -0
- package/lib/outbound/chat-failure.js +53 -0
- package/lib/outbound/chat-failure.js.map +1 -0
- package/lib/outbound/structured-reply.d.ts +7 -0
- package/lib/outbound/structured-reply.js +52 -16
- package/lib/outbound/structured-reply.js.map +1 -1
- package/lib/plugin-runtime/agent-runtime.js +49 -8
- package/lib/plugin-runtime/agent-runtime.js.map +1 -1
- package/lib/plugin-runtime/ai-completion.d.ts +4 -3
- package/lib/plugin-runtime/ai-completion.js +64 -10
- package/lib/plugin-runtime/ai-completion.js.map +1 -1
- package/lib/plugin-runtime/capability-ingress.js +3 -1
- package/lib/plugin-runtime/capability-ingress.js.map +1 -1
- package/lib/plugin-runtime/decision-runtime.d.ts +1 -0
- package/lib/plugin-runtime/deferred-capability-plan.d.ts +4 -1
- package/lib/plugin-runtime/deferred-capability-plan.js +25 -9
- package/lib/plugin-runtime/deferred-capability-plan.js.map +1 -1
- package/lib/plugin-runtime/full-agent-turn-engine.js +1 -0
- package/lib/plugin-runtime/full-agent-turn-engine.js.map +1 -1
- package/lib/plugin-runtime/index.d.ts +2 -0
- package/lib/plugin-runtime/index.js +2 -0
- package/lib/plugin-runtime/index.js.map +1 -1
- package/lib/prompt/assembly.js +0 -9
- package/lib/prompt/assembly.js.map +1 -1
- package/lib/prompt/git-context.js +1 -1
- package/lib/prompt/git-context.js.map +1 -1
- package/lib/prompt/rules/chat-rules.js +8 -9
- package/lib/prompt/rules/chat-rules.js.map +1 -1
- package/lib/prompt/rules/critical-rules.js +10 -10
- package/lib/prompt/rules/critical-rules.js.map +1 -1
- package/lib/prompt/system-prompt.js +4 -5
- package/lib/prompt/system-prompt.js.map +1 -1
- package/lib/security/file-role-policy.js +6 -6
- package/lib/security/file-role-policy.js.map +1 -1
- package/lib/security/policy-facade.js +1 -1
- package/lib/security/policy-facade.js.map +1 -1
- package/lib/security/usage-quota.d.ts +4 -0
- package/lib/security/usage-quota.js +23 -2
- package/lib/security/usage-quota.js.map +1 -1
- package/lib/session/approval-port.d.ts +2 -0
- package/lib/session/approval-port.js.map +1 -1
- package/lib/session/approval-review-agent.d.ts +1 -1
- package/lib/session/approval-review-agent.js +19 -4
- package/lib/session/approval-review-agent.js.map +1 -1
- package/lib/session/turn-ingress-session.js +7 -1
- package/lib/session/turn-ingress-session.js.map +1 -1
- package/lib/tool/tool-approval-gate.js +4 -2
- package/lib/tool/tool-approval-gate.js.map +1 -1
- package/lib/tool/turn-tool-runtime.js +24 -5
- package/lib/tool/turn-tool-runtime.js.map +1 -1
- package/lib/tool-catalog/deferred-turn-controller.js +1 -4
- package/lib/tool-catalog/deferred-turn-controller.js.map +1 -1
- package/lib/trace/context-budget.d.ts +4 -3
- package/lib/trace/context-budget.js +28 -8
- package/lib/trace/context-budget.js.map +1 -1
- package/lib/trace/turn-trace-format.js +4 -1
- package/lib/trace/turn-trace-format.js.map +1 -1
- package/lib/trace/turn-trace.d.ts +6 -0
- package/lib/trace/turn-trace.js +8 -2
- package/lib/trace/turn-trace.js.map +1 -1
- package/lib/trace/turn-usage-log.d.ts +14 -0
- package/lib/trace/turn-usage-log.js +83 -0
- package/lib/trace/turn-usage-log.js.map +1 -0
- package/lib/usage/usage-store.d.ts +199 -0
- package/lib/usage/usage-store.js +121 -0
- package/lib/usage/usage-store.js.map +1 -0
- package/package.json +12 -12
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"capability-ingress.js","sourceRoot":"","sources":["../../src/plugin-runtime/capability-ingress.ts"],"names":[],"mappings":"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","sourcesContent":["import type { FeatureId, PluginId, RuntimeSnapshot } from '@zhin.js/plugin-runtime';\nimport { permissionHostToken, type PermissionHost } from '@zhin.js/permission';\nimport { turnPermissionSubject, type TurnAccessContext } from '../turn/turn-ingress.js';\nimport {\n type AgentIndex,\n isAgentIndex,\n agentFeatureId,\n type AgentDescriptor,\n} from '@zhin.js/agent-feature';\nimport {\n type McpIndex,\n isMcpIndex,\n mcpFeatureId,\n type McpDescriptor,\n type McpToolDescriptor,\n} from '@zhin.js/mcp-feature';\nimport {\n type SkillIndex,\n isSkillIndex,\n skillFeatureId,\n type SkillDescriptor,\n} from '@zhin.js/skill';\nimport {\n type ToolIndex,\n isToolIndex,\n toolFeatureId,\n type ToolDescriptor,\n type ToolInvocationContext,\n} from '@zhin.js/tool';\nimport {\n isPromptSectionIndex,\n promptSectionFeatureId,\n type PromptSectionDescriptor,\n type PromptProfile,\n} from '@zhin.js/prompt-section';\nimport { capabilitySeamToken } from '../seam/tokens.js';\nimport type { SeamIntegration } from '../seam/seam-integration.js';\n\nexport interface ToolCapability extends ToolDescriptor {\n execute<TInput = unknown, TResult = unknown>(\n input: TInput,\n invocation: ToolInvocationContext,\n ): Promise<TResult>;\n}\n\nexport interface McpCapability extends McpDescriptor {\n listTools(): Promise<readonly McpToolDescriptor[]>;\n callTool<TResult = unknown>(tool: string, input: unknown): Promise<TResult>;\n}\n\nexport interface AgentCapabilities {\n readonly generation: number;\n readonly owner: PluginId;\n readonly tools: readonly ToolCapability[];\n readonly skills: readonly SkillDescriptor[];\n readonly agents: readonly AgentDescriptor[];\n readonly mcp: readonly McpCapability[];\n readonly promptSections: readonly PromptSectionDescriptor[];\n}\n\nexport class CapabilityIngress {\n async read(\n snapshot: RuntimeSnapshot,\n owner: PluginId,\n isActive: () => boolean = () => true,\n turn?: TurnAccessContext,\n selectedAgent?: string,\n ): Promise<AgentCapabilities> {\n if (!snapshot.tree.has(owner)) throw new Error(`Unknown Agent capability owner: ${owner}`);\n const tools = projection(snapshot, toolFeatureId, isToolIndex);\n const mcp = projection(snapshot, mcpFeatureId, isMcpIndex);\n const promptProjection = snapshot.projections.get(promptSectionFeatureId);\n const promptSections = isPromptSectionIndex(promptProjection) ? promptProjection : undefined;\n const promptProfile: PromptProfile = turn?.origin.kind === 'schedule' ? 'schedule' : 'interactive';\n const featureTools = await bindTools(\n tools,\n owner,\n isActive,\n turn,\n resolvePermissionHost(snapshot),\n selectedAgent,\n snapshot,\n );\n const featureSkills = await bindSkills(\n projection(snapshot, skillFeatureId, isSkillIndex),\n turn,\n resolvePermissionHost(snapshot),\n selectedAgent,\n );\n const seam = resolveSeamIntegration(snapshot);\n const seamTools = seam\n ? await bindSeamTools(seam, owner, isActive, turn, resolvePermissionHost(snapshot))\n : [];\n const seamSkills = seam\n ? await bindSeamSkills(seam, owner, turn, resolvePermissionHost(snapshot))\n : [];\n assertDistinctCapabilities('Tool', [...featureTools, ...seamTools]);\n assertDistinctCapabilities(\n 'Skill',\n [...featureSkills, ...seamSkills].map((skill) => ({ name: skill.qualifiedName })),\n );\n const featureAgents = await bindAgents(\n projection(snapshot, agentFeatureId, isAgentIndex),\n owner,\n turn,\n resolvePermissionHost(snapshot),\n );\n return Object.freeze({\n generation: snapshot.generation,\n owner,\n tools: Object.freeze([...featureTools, ...seamTools]),\n skills: Object.freeze([...featureSkills, ...seamSkills]),\n agents: featureAgents,\n mcp: bindMcp(mcp, owner, isActive),\n promptSections: Object.freeze([...(promptSections?.visible(owner, promptProfile) ?? [])]\n .filter((section) => !section.platforms\n || (turn?.origin.kind === 'im' && section.platforms.includes(turn.origin.platform)))),\n });\n }\n}\n\nasync function bindAgents(\n index: AgentIndex | undefined,\n owner: PluginId,\n turn?: TurnAccessContext,\n host?: PermissionHost,\n): Promise<readonly AgentDescriptor[]> {\n if (!index) return Object.freeze([]);\n const access = await Promise.all(index.visible(owner).map(async (descriptor) => ({\n descriptor,\n allowed: await canAccessDescriptor(descriptor, turn, host),\n })));\n return Object.freeze(access.filter(({ allowed }) => allowed).map(({ descriptor }) => descriptor));\n}\n\nfunction resolveSeamIntegration(snapshot: RuntimeSnapshot): SeamIntegration | undefined {\n const value = snapshot.resources.get(snapshot.root)?.get(capabilitySeamToken.id);\n return value\n && typeof (value as SeamIntegration).projectTools === 'function'\n && typeof (value as SeamIntegration).projectSkills === 'function'\n ? value as SeamIntegration\n : undefined;\n}\n\nasync function bindSeamTools(\n seam: SeamIntegration,\n owner: PluginId,\n isActive: () => boolean,\n turn?: TurnAccessContext,\n host?: PermissionHost,\n): Promise<readonly ToolCapability[]> {\n const projected = seam.projectTools(String(owner)).map((entry) => Object.freeze({\n owner,\n name: entry.schema.function.name,\n qualifiedName: entry.schema.function.name,\n description: entry.schema.function.description,\n inputSchema: entry.schema.function.parameters,\n requiresApproval: entry.schema.requiresApproval ?? 'on-risk',\n platforms: entry.schema.platforms,\n scopes: entry.schema.scopes,\n permissions: entry.schema.permissions,\n hidden: entry.schema.hidden,\n source: entry.schema.source ?? `seam:${entry.providerId}`,\n execute: async <TInput = unknown, TResult = unknown>(\n input: TInput,\n invocation: ToolInvocationContext,\n ): Promise<TResult> => {\n assertActive(isActive);\n const result = await entry.execute(input, invocation);\n if (!result.success) throw new Error(result.error ?? `Seam Tool failed: ${entry.schema.function.name}`);\n return result.output as TResult;\n },\n } satisfies ToolCapability));\n const access = await Promise.all(projected.map(async (descriptor) => ({\n descriptor,\n allowed: await canAccessDescriptor(descriptor, turn, host),\n })));\n return Object.freeze(access.filter(({ allowed }) => allowed).map(({ descriptor }) => descriptor));\n}\n\nasync function bindSeamSkills(\n seam: SeamIntegration,\n owner: PluginId,\n turn?: TurnAccessContext,\n host?: PermissionHost,\n): Promise<readonly SkillDescriptor[]> {\n const projected = (await seam.projectSkills(String(owner))).map((entry) => Object.freeze({\n $feature: 'zhin.skill/1' as const,\n owner,\n name: entry.metadata.name,\n qualifiedName: entry.metadata.name,\n description: entry.metadata.description,\n instructions: entry.instructions,\n toolNames: entry.metadata.toolNames,\n platforms: entry.metadata.platforms,\n scopes: entry.metadata.scopes,\n permissions: entry.metadata.permissions,\n keywords: entry.metadata.keywords,\n tags: entry.metadata.tags,\n always: entry.metadata.always,\n source: `seam:${entry.providerId}`,\n } satisfies SkillDescriptor));\n const access = await Promise.all(projected.map(async (descriptor) => ({\n descriptor,\n allowed: await canAccessDescriptor(descriptor, turn, host),\n })));\n return Object.freeze(access.filter(({ allowed }) => allowed).map(({ descriptor }) => descriptor));\n}\n\nasync function bindSkills(\n index: SkillIndex | undefined,\n turn?: TurnAccessContext,\n host?: PermissionHost,\n selectedAgent?: string,\n): Promise<readonly SkillDescriptor[]> {\n if (!index) return Object.freeze([]);\n const access = await Promise.all(index.list().map(async (descriptor) => ({\n descriptor,\n allowed: belongsToSelectedAgent(descriptor.agentName, selectedAgent)\n && await canAccessDescriptor(descriptor, turn, host),\n })));\n return Object.freeze(access.filter(({ allowed }) => allowed).map(({ descriptor }) => descriptor));\n}\n\nfunction belongsToSelectedAgent(agentName: string | undefined, selectedAgent: string | undefined): boolean {\n if (!agentName) return true;\n return selectedAgent === agentName || selectedAgent?.endsWith(`__${agentName}`) === true;\n}\n\nfunction assertDistinctCapabilities(\n kind: 'Tool' | 'Skill',\n capabilities: readonly { name: string }[],\n): void {\n const names = new Set<string>();\n for (const capability of capabilities) {\n if (names.has(capability.name)) throw new Error(`Duplicate Agent ${kind} capability: ${capability.name}`);\n names.add(capability.name);\n }\n}\n\nasync function bindTools(\n index: ToolIndex | undefined,\n owner: PluginId,\n isActive: () => boolean,\n turn?: TurnAccessContext,\n host?: PermissionHost,\n selectedAgent?: string,\n operationSnapshot?: RuntimeSnapshot,\n): Promise<readonly ToolCapability[]> {\n if (!index) return Object.freeze([]);\n const descriptors = index.list();\n const accessResults = await Promise.all(\n descriptors.map(async (descriptor) => ({\n descriptor,\n allowed: await canAccessDescriptor(descriptor, turn, host),\n })),\n );\n return Object.freeze(accessResults\n .filter((r) => r.allowed)\n .map((r) => Object.freeze({\n ...r.descriptor,\n hidden: isSelectedAgentTool(r.descriptor.placement, selectedAgent)\n ? false\n : r.descriptor.hidden,\n name: r.descriptor.qualifiedName,\n execute: <TInput, TResult>(input: TInput, invocation: ToolInvocationContext) => {\n assertActive(isActive);\n return index.execute<TInput, TResult>(r.descriptor.owner, r.descriptor.name, input, invocation, operationSnapshot);\n },\n })));\n}\n\nfunction isSelectedAgentTool(\n placement: ToolDescriptor['placement'],\n selectedAgent: string | undefined,\n): boolean {\n return placement?.kind === 'agent'\n && belongsToSelectedAgent(placement.agent, selectedAgent);\n}\n\nasync function canAccessDescriptor(\n descriptor: Pick<ToolDescriptor, 'platforms' | 'scopes' | 'permissions'>,\n turn: TurnAccessContext | undefined,\n host?: PermissionHost,\n): Promise<boolean> {\n if (descriptor.platforms?.length) {\n if (turn?.origin.kind !== 'im' || !descriptor.platforms.includes(turn.origin.platform)) {\n return false;\n }\n }\n if (descriptor.scopes?.length) {\n if (turn?.origin.kind !== 'im' || !descriptor.scopes.includes(turn.origin.scope)) {\n return false;\n }\n }\n if (!descriptor.permissions?.length) return true;\n if (!turn || !host) return false;\n return host.checkAll(descriptor.permissions, turnPermissionSubject(turn));\n}\n\n/** Root resources 上的 PermissionHost(command-index 同款解析;未安装时 fail-closed)。 */\nfunction resolvePermissionHost(snapshot: RuntimeSnapshot): PermissionHost | undefined {\n try {\n const resources = snapshot.resources.get(snapshot.root);\n const host = resources?.get(permissionHostToken.id);\n return host && typeof (host as PermissionHost).check === 'function'\n ? host as PermissionHost\n : undefined;\n } catch {\n return undefined;\n }\n}\n\nfunction bindMcp(\n index: McpIndex | undefined,\n owner: PluginId,\n isActive: () => boolean,\n): readonly McpCapability[] {\n if (!index) return Object.freeze([]);\n return Object.freeze(index.visible(owner).map((descriptor) => Object.freeze({\n ...descriptor,\n listTools: () => {\n assertActive(isActive);\n return index.listTools(owner, descriptor.name);\n },\n callTool: <TResult>(tool: string, input: unknown) => {\n assertActive(isActive);\n return index.callTool<TResult>(owner, descriptor.name, tool, input);\n },\n })));\n}\n\nfunction assertActive(isActive: () => boolean): void {\n if (!isActive()) throw new Error('Agent capability turn scope has ended');\n}\n\nfunction projection<T>(\n snapshot: RuntimeSnapshot,\n id: FeatureId,\n guard: (value: unknown) => value is T,\n): T | undefined {\n const value = snapshot.projections.get(id);\n return guard(value) ? value : undefined;\n}\n"]}
|
|
1
|
+
{"version":3,"file":"capability-ingress.js","sourceRoot":"","sources":["../../src/plugin-runtime/capability-ingress.ts"],"names":[],"mappings":"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","sourcesContent":["import type { FeatureId, PluginId, RuntimeSnapshot } from '@zhin.js/plugin-runtime';\nimport { permissionHostToken, type PermissionHost } from '@zhin.js/permission';\nimport { turnPermissionSubject, type TurnAccessContext } from '../turn/turn-ingress.js';\nimport {\n type AgentIndex,\n isAgentIndex,\n agentFeatureId,\n type AgentDescriptor,\n} from '@zhin.js/agent-feature';\nimport {\n type McpIndex,\n isMcpIndex,\n mcpFeatureId,\n type McpDescriptor,\n type McpToolDescriptor,\n} from '@zhin.js/mcp-feature';\nimport {\n type SkillIndex,\n isSkillIndex,\n skillFeatureId,\n type SkillDescriptor,\n} from '@zhin.js/skill';\nimport {\n type ToolIndex,\n isToolIndex,\n toolFeatureId,\n type ToolDescriptor,\n type ToolInvocationContext,\n} from '@zhin.js/tool';\nimport {\n isPromptSectionIndex,\n promptSectionFeatureId,\n type PromptSectionDescriptor,\n type PromptProfile,\n} from '@zhin.js/prompt-section';\nimport { capabilitySeamToken } from '../seam/tokens.js';\nimport type { SeamIntegration } from '../seam/seam-integration.js';\n\nexport interface ToolCapability extends ToolDescriptor {\n execute<TInput = unknown, TResult = unknown>(\n input: TInput,\n invocation: ToolInvocationContext,\n ): Promise<TResult>;\n}\n\nexport interface McpCapability extends McpDescriptor {\n listTools(): Promise<readonly McpToolDescriptor[]>;\n callTool<TResult = unknown>(tool: string, input: unknown): Promise<TResult>;\n}\n\nexport interface AgentCapabilities {\n readonly generation: number;\n readonly owner: PluginId;\n readonly tools: readonly ToolCapability[];\n readonly skills: readonly SkillDescriptor[];\n readonly agents: readonly AgentDescriptor[];\n readonly mcp: readonly McpCapability[];\n readonly promptSections: readonly PromptSectionDescriptor[];\n}\n\nexport class CapabilityIngress {\n async read(\n snapshot: RuntimeSnapshot,\n owner: PluginId,\n isActive: () => boolean = () => true,\n turn?: TurnAccessContext,\n selectedAgent?: string,\n ): Promise<AgentCapabilities> {\n if (!snapshot.tree.has(owner)) throw new Error(`Unknown Agent capability owner: ${owner}`);\n const tools = projection(snapshot, toolFeatureId, isToolIndex);\n const mcp = projection(snapshot, mcpFeatureId, isMcpIndex);\n const promptProjection = snapshot.projections.get(promptSectionFeatureId);\n const promptSections = isPromptSectionIndex(promptProjection) ? promptProjection : undefined;\n const promptProfile: PromptProfile = turn?.origin.kind === 'schedule' ? 'schedule' : 'interactive';\n const featureTools = await bindTools(\n tools,\n owner,\n isActive,\n turn,\n resolvePermissionHost(snapshot),\n selectedAgent,\n snapshot,\n );\n const featureSkills = await bindSkills(\n projection(snapshot, skillFeatureId, isSkillIndex),\n turn,\n resolvePermissionHost(snapshot),\n selectedAgent,\n );\n const seam = resolveSeamIntegration(snapshot);\n const seamTools = seam\n ? await bindSeamTools(seam, owner, isActive, turn, resolvePermissionHost(snapshot))\n : [];\n const seamSkills = seam\n ? await bindSeamSkills(seam, owner, turn, resolvePermissionHost(snapshot))\n : [];\n assertDistinctCapabilities('Tool', [...featureTools, ...seamTools]);\n assertDistinctCapabilities(\n 'Skill',\n [...featureSkills, ...seamSkills].map((skill) => ({ name: skill.qualifiedName })),\n );\n const featureAgents = await bindAgents(\n projection(snapshot, agentFeatureId, isAgentIndex),\n owner,\n turn,\n resolvePermissionHost(snapshot),\n );\n return Object.freeze({\n generation: snapshot.generation,\n owner,\n tools: Object.freeze([...featureTools, ...seamTools]),\n skills: Object.freeze([...featureSkills, ...seamSkills]),\n agents: featureAgents,\n mcp: bindMcp(mcp, owner, isActive),\n promptSections: Object.freeze([...(promptSections?.visible(owner, promptProfile) ?? [])]\n .filter((section) => !section.platforms\n || (turn?.origin.kind === 'im' && section.platforms.includes(turn.origin.platform)))\n .filter((section) => !section.scopes\n || (turn?.origin.kind === 'im' && section.scopes.includes(turn.origin.scope)))),\n });\n }\n}\n\nasync function bindAgents(\n index: AgentIndex | undefined,\n owner: PluginId,\n turn?: TurnAccessContext,\n host?: PermissionHost,\n): Promise<readonly AgentDescriptor[]> {\n if (!index) return Object.freeze([]);\n const access = await Promise.all(index.visible(owner).map(async (descriptor) => ({\n descriptor,\n allowed: await canAccessDescriptor(descriptor, turn, host),\n })));\n return Object.freeze(access.filter(({ allowed }) => allowed).map(({ descriptor }) => descriptor));\n}\n\nfunction resolveSeamIntegration(snapshot: RuntimeSnapshot): SeamIntegration | undefined {\n const value = snapshot.resources.get(snapshot.root)?.get(capabilitySeamToken.id);\n return value\n && typeof (value as SeamIntegration).projectTools === 'function'\n && typeof (value as SeamIntegration).projectSkills === 'function'\n ? value as SeamIntegration\n : undefined;\n}\n\nasync function bindSeamTools(\n seam: SeamIntegration,\n owner: PluginId,\n isActive: () => boolean,\n turn?: TurnAccessContext,\n host?: PermissionHost,\n): Promise<readonly ToolCapability[]> {\n const projected = seam.projectTools(String(owner)).map((entry) => Object.freeze({\n owner,\n name: entry.schema.function.name,\n qualifiedName: entry.schema.function.name,\n description: entry.schema.function.description,\n inputSchema: entry.schema.function.parameters,\n requiresApproval: entry.schema.requiresApproval ?? 'on-risk',\n platforms: entry.schema.platforms,\n scopes: entry.schema.scopes,\n permissions: entry.schema.permissions,\n hidden: entry.schema.hidden,\n source: entry.schema.source ?? `seam:${entry.providerId}`,\n execute: async <TInput = unknown, TResult = unknown>(\n input: TInput,\n invocation: ToolInvocationContext,\n ): Promise<TResult> => {\n assertActive(isActive);\n const result = await entry.execute(input, invocation);\n if (!result.success) throw new Error(result.error ?? `Seam Tool failed: ${entry.schema.function.name}`);\n return result.output as TResult;\n },\n } satisfies ToolCapability));\n const access = await Promise.all(projected.map(async (descriptor) => ({\n descriptor,\n allowed: await canAccessDescriptor(descriptor, turn, host),\n })));\n return Object.freeze(access.filter(({ allowed }) => allowed).map(({ descriptor }) => descriptor));\n}\n\nasync function bindSeamSkills(\n seam: SeamIntegration,\n owner: PluginId,\n turn?: TurnAccessContext,\n host?: PermissionHost,\n): Promise<readonly SkillDescriptor[]> {\n const projected = (await seam.projectSkills(String(owner))).map((entry) => Object.freeze({\n $feature: 'zhin.skill/1' as const,\n owner,\n name: entry.metadata.name,\n qualifiedName: entry.metadata.name,\n description: entry.metadata.description,\n instructions: entry.instructions,\n toolNames: entry.metadata.toolNames,\n platforms: entry.metadata.platforms,\n scopes: entry.metadata.scopes,\n permissions: entry.metadata.permissions,\n keywords: entry.metadata.keywords,\n tags: entry.metadata.tags,\n always: entry.metadata.always,\n source: `seam:${entry.providerId}`,\n } satisfies SkillDescriptor));\n const access = await Promise.all(projected.map(async (descriptor) => ({\n descriptor,\n allowed: await canAccessDescriptor(descriptor, turn, host),\n })));\n return Object.freeze(access.filter(({ allowed }) => allowed).map(({ descriptor }) => descriptor));\n}\n\nasync function bindSkills(\n index: SkillIndex | undefined,\n turn?: TurnAccessContext,\n host?: PermissionHost,\n selectedAgent?: string,\n): Promise<readonly SkillDescriptor[]> {\n if (!index) return Object.freeze([]);\n const access = await Promise.all(index.list().map(async (descriptor) => ({\n descriptor,\n allowed: belongsToSelectedAgent(descriptor.agentName, selectedAgent)\n && await canAccessDescriptor(descriptor, turn, host),\n })));\n return Object.freeze(access.filter(({ allowed }) => allowed).map(({ descriptor }) => descriptor));\n}\n\nfunction belongsToSelectedAgent(agentName: string | undefined, selectedAgent: string | undefined): boolean {\n if (!agentName) return true;\n return selectedAgent === agentName || selectedAgent?.endsWith(`__${agentName}`) === true;\n}\n\nfunction assertDistinctCapabilities(\n kind: 'Tool' | 'Skill',\n capabilities: readonly { name: string }[],\n): void {\n const names = new Set<string>();\n for (const capability of capabilities) {\n if (names.has(capability.name)) throw new Error(`Duplicate Agent ${kind} capability: ${capability.name}`);\n names.add(capability.name);\n }\n}\n\nasync function bindTools(\n index: ToolIndex | undefined,\n owner: PluginId,\n isActive: () => boolean,\n turn?: TurnAccessContext,\n host?: PermissionHost,\n selectedAgent?: string,\n operationSnapshot?: RuntimeSnapshot,\n): Promise<readonly ToolCapability[]> {\n if (!index) return Object.freeze([]);\n const descriptors = index.list();\n const accessResults = await Promise.all(\n descriptors.map(async (descriptor) => ({\n descriptor,\n allowed: await canAccessDescriptor(descriptor, turn, host),\n })),\n );\n return Object.freeze(accessResults\n .filter((r) => r.allowed)\n .map((r) => Object.freeze({\n ...r.descriptor,\n hidden: isSelectedAgentTool(r.descriptor.placement, selectedAgent)\n ? false\n : r.descriptor.hidden,\n name: r.descriptor.qualifiedName,\n execute: <TInput, TResult>(input: TInput, invocation: ToolInvocationContext) => {\n assertActive(isActive);\n return index.execute<TInput, TResult>(r.descriptor.owner, r.descriptor.name, input, invocation, operationSnapshot);\n },\n })));\n}\n\nfunction isSelectedAgentTool(\n placement: ToolDescriptor['placement'],\n selectedAgent: string | undefined,\n): boolean {\n return placement?.kind === 'agent'\n && belongsToSelectedAgent(placement.agent, selectedAgent);\n}\n\nasync function canAccessDescriptor(\n descriptor: Pick<ToolDescriptor, 'platforms' | 'scopes' | 'permissions'>,\n turn: TurnAccessContext | undefined,\n host?: PermissionHost,\n): Promise<boolean> {\n if (descriptor.platforms?.length) {\n if (turn?.origin.kind !== 'im' || !descriptor.platforms.includes(turn.origin.platform)) {\n return false;\n }\n }\n if (descriptor.scopes?.length) {\n if (turn?.origin.kind !== 'im' || !descriptor.scopes.includes(turn.origin.scope)) {\n return false;\n }\n }\n if (!descriptor.permissions?.length) return true;\n if (!turn || !host) return false;\n return host.checkAll(descriptor.permissions, turnPermissionSubject(turn));\n}\n\n/** Root resources 上的 PermissionHost(command-index 同款解析;未安装时 fail-closed)。 */\nfunction resolvePermissionHost(snapshot: RuntimeSnapshot): PermissionHost | undefined {\n try {\n const resources = snapshot.resources.get(snapshot.root);\n const host = resources?.get(permissionHostToken.id);\n return host && typeof (host as PermissionHost).check === 'function'\n ? host as PermissionHost\n : undefined;\n } catch {\n return undefined;\n }\n}\n\nfunction bindMcp(\n index: McpIndex | undefined,\n owner: PluginId,\n isActive: () => boolean,\n): readonly McpCapability[] {\n if (!index) return Object.freeze([]);\n return Object.freeze(index.visible(owner).map((descriptor) => Object.freeze({\n ...descriptor,\n listTools: () => {\n assertActive(isActive);\n return index.listTools(owner, descriptor.name);\n },\n callTool: <TResult>(tool: string, input: unknown) => {\n assertActive(isActive);\n return index.callTool<TResult>(owner, descriptor.name, tool, input);\n },\n })));\n}\n\nfunction assertActive(isActive: () => boolean): void {\n if (!isActive()) throw new Error('Agent capability turn scope has ended');\n}\n\nfunction projection<T>(\n snapshot: RuntimeSnapshot,\n id: FeatureId,\n guard: (value: unknown) => value is T,\n): T | undefined {\n const value = snapshot.projections.get(id);\n return guard(value) ? value : undefined;\n}\n"]}
|
|
@@ -14,6 +14,7 @@ export declare const agentDecisionConfigToken: import("@zhin.js/plugin-runtime")
|
|
|
14
14
|
memory?: import("@zhin.js/ai").DecisionTaskConfig;
|
|
15
15
|
agents?: import("@zhin.js/ai").DecisionTaskConfig;
|
|
16
16
|
approval?: import("@zhin.js/ai").DecisionTaskConfig;
|
|
17
|
+
ambient?: import("@zhin.js/ai").DecisionTaskConfig;
|
|
17
18
|
}>;
|
|
18
19
|
/** Preserve declaration ownership even when Scope snapshots include inherited resources. */
|
|
19
20
|
export declare function provideAgentDecisionProvider(resources: Scope, provider: DecisionProvider): void;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { type AgentTool, type DeferredToolSessionSnapshot } from '@zhin.js/ai';
|
|
1
|
+
import { type AgentTool, type TextContentBlock, type DeferredToolSessionSnapshot } from '@zhin.js/ai';
|
|
2
2
|
import type { SkillDescriptor } from '@zhin.js/skill';
|
|
3
3
|
import type { AgentDecisionRuntime } from '../decision/types.js';
|
|
4
4
|
import { resolveDeferredToolsConfig } from '../tool-catalog/resolve-config.js';
|
|
@@ -25,6 +25,9 @@ export declare function isReservedControlToolName(name: string): boolean;
|
|
|
25
25
|
export interface DeferredCapabilityController {
|
|
26
26
|
loadedToolNames(): string[];
|
|
27
27
|
loadedSkillInstructions(): string[];
|
|
28
|
+
loadedSkillBlocks(): TextContentBlock[];
|
|
29
|
+
/** Marks only a successful, unmodified runtime load_skill result. */
|
|
30
|
+
modelOutputBlocks(name: string, args: unknown, text: string): TextContentBlock[] | undefined;
|
|
28
31
|
/** Load a public catalog tool into the session. Returns false when it is not in this turn's catalog. */
|
|
29
32
|
load(name: string): Promise<boolean>;
|
|
30
33
|
}
|
|
@@ -5,6 +5,7 @@ import { rankDecisionCandidates } from '../decision/rank.js';
|
|
|
5
5
|
import { buildDeferredStats, buildToolCatalog, discoverInCatalog, resolveDeferredApiTools } from '../tool-catalog/tool-catalog.js';
|
|
6
6
|
import { resolveDeferredToolsConfig } from '../tool-catalog/resolve-config.js';
|
|
7
7
|
import { DEFERRED_META_TOOL_NAMES } from '../tool-catalog/types.js';
|
|
8
|
+
import { skillContextBlock } from '../context/skill-context.js';
|
|
8
9
|
const logger = getLogger('DeferredCapabilityPlan');
|
|
9
10
|
/**
|
|
10
11
|
* Reserved, model-invisible control namespace of the Agent runtime. Control
|
|
@@ -103,6 +104,19 @@ export function createDeferredCapabilityPlan(options) {
|
|
|
103
104
|
const controller = Object.freeze({
|
|
104
105
|
loadedToolNames: () => getLoadedToolNamesFromSnapshot(snapshot),
|
|
105
106
|
loadedSkillInstructions: () => loadedSkillInstructions(projected.skills, snapshot),
|
|
107
|
+
loadedSkillBlocks: () => loadedSkills(projected.skills, snapshot).map(skillContextBlock),
|
|
108
|
+
modelOutputBlocks: (name, args, text) => {
|
|
109
|
+
if (name !== 'load_skill')
|
|
110
|
+
return undefined;
|
|
111
|
+
const skill = resolveSkill(projected.skills, String(recordOf(args).name ?? ''));
|
|
112
|
+
if (!skill)
|
|
113
|
+
return undefined;
|
|
114
|
+
const block = skillContextBlock(skill);
|
|
115
|
+
const expected = skillLoadResult(skill, executableCapabilities);
|
|
116
|
+
if (!text.startsWith(expected))
|
|
117
|
+
return undefined;
|
|
118
|
+
return [block, { type: 'text', text: text.slice(block.text.length) }];
|
|
119
|
+
},
|
|
106
120
|
load: async (name) => {
|
|
107
121
|
if (!publicToolNames.has(name))
|
|
108
122
|
return false;
|
|
@@ -271,7 +285,7 @@ function createMetaCapabilities(options) {
|
|
|
271
285
|
if (!options.pinned.has(name)) {
|
|
272
286
|
await options.persist(touchToolInSnapshot(options.getSnapshot(), name, options.maxLoaded));
|
|
273
287
|
}
|
|
274
|
-
return `Loaded tool "${name}"
|
|
288
|
+
return `Loaded tool "${name}". Use its tool definition for arguments.\n__zhin_tools_mutated__`;
|
|
275
289
|
}),
|
|
276
290
|
metaCapability(options.owner, 'load_skill', 'Load projected skill instructions into this session.', {
|
|
277
291
|
type: 'object',
|
|
@@ -282,10 +296,8 @@ function createMetaCapabilities(options) {
|
|
|
282
296
|
const skill = resolveSkill(options.skills, name);
|
|
283
297
|
if (!skill)
|
|
284
298
|
return `Skill '${name}' not found in the active generation.`;
|
|
285
|
-
const toolNames = resolveSkillTools(skill, options.tools);
|
|
286
299
|
await options.persist(activateSkill(options.getSnapshot(), skill, options.tools, options.maxLoaded, options.pinned));
|
|
287
|
-
|
|
288
|
-
return `${skill.instructions}${unlocked}\n__zhin_tools_mutated__`;
|
|
300
|
+
return skillLoadResult(skill, options.tools);
|
|
289
301
|
}),
|
|
290
302
|
]);
|
|
291
303
|
}
|
|
@@ -318,12 +330,16 @@ function resolveSkill(skills, name) {
|
|
|
318
330
|
return matches.length === 1 ? matches[0] : undefined;
|
|
319
331
|
}
|
|
320
332
|
function loadedSkillInstructions(skills, snapshot) {
|
|
333
|
+
return loadedSkills(skills, snapshot).map(skill => skill.instructions);
|
|
334
|
+
}
|
|
335
|
+
function loadedSkills(skills, snapshot) {
|
|
321
336
|
const loaded = new Set(snapshot.loadedSkills);
|
|
322
|
-
return skills
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
337
|
+
return skills.filter(skill => skill.always === true || loaded.has(skill.qualifiedName) || loaded.has(skill.name));
|
|
338
|
+
}
|
|
339
|
+
function skillLoadResult(skill, tools) {
|
|
340
|
+
const names = resolveSkillTools(skill, tools);
|
|
341
|
+
const unlocked = names.length ? `\nUnlocked tools: ${names.join(', ')}` : '';
|
|
342
|
+
return `${skillContextBlock(skill).text}${unlocked}\n__zhin_tools_mutated__`;
|
|
327
343
|
}
|
|
328
344
|
function activateSkill(snapshot, skill, tools, maxLoaded, pinned) {
|
|
329
345
|
const toolNames = resolveSkillTools(skill, tools).filter(name => !pinned.has(name));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"deferred-capability-plan.js","sourceRoot":"","sources":["../../src/plugin-runtime/deferred-capability-plan.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,kBAAkB,EAClB,8BAA8B,EAC9B,mBAAmB,EACnB,oBAAoB,GAGrB,MAAM,aAAa,CAAC;AACrB,OAAO,EACL,2BAA2B,GAG5B,MAAM,eAAe,CAAC;AAEvB,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAE,sBAAsB,EAAE,MAAM,qBAAqB,CAAC;AAE7D,OAAO,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,uBAAuB,EAAE,MAAM,iCAAiC,CAAC;AACnI,OAAO,EAAE,0BAA0B,EAAE,MAAM,mCAAmC,CAAC;AAC/E,OAAO,EAAE,wBAAwB,EAAwB,MAAM,0BAA0B,CAAC;AAG1F,MAAM,MAAM,GAAG,SAAS,CAAC,wBAAwB,CAAC,CAAC;AAUnD;;;;GAIG;AACH,MAAM,CAAC,MAAM,4BAA4B,GAAG,WAAW,CAAC;AAExD;;;GAGG;AACH,MAAM,UAAU,yBAAyB,CAAC,IAAY;IACpD,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,UAAU,CAAC,4BAA4B,CAAC,CAAC;AACpF,CAAC;AA0CD;;;;GAIG;AACH,MAAM,UAAU,wBAAwB,CAAC,OAKvC;IACA,MAAM,QAAQ,GAAG,sBAAsB,CAAC,OAAO,CAAC,eAAe,EAAE,OAAO,CAAC,YAAY,CAAC,CAAC;IACvF,MAAM,KAAK,GAAG,oBAAoB,CAAC,OAAO,CAAC,YAAY,CAAC,MAAM,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;IAChF,IAAI,CAAC,KAAK;QAAE,OAAO,MAAM,CAAC,MAAM,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC;IAE/C,MAAM,MAAM,GAAG,0BAA0B,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IAC1D,MAAM,SAAS,GAAG,aAAa,CAC7B,QAAQ,EACR,KAAK,EACL,OAAO,CAAC,YAAY,CAAC,KAAK,EAC1B,MAAM,CAAC,mBAAmB,EAC1B,IAAI,GAAG,CAAC,MAAM,CAAC,iBAAiB,CAAC,CAClC,CAAC;IACF,OAAO,MAAM,CAAC,MAAM,CAAC,EAAE,QAAQ,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC,CAAC;AACvD,CAAC;AAED,wFAAwF;AACxF,MAAM,CAAC,KAAK,UAAU,oBAAoB,CAAC,OAOzC;IACA,MAAM,OAAO,GAAG,MAAM,sBAAsB,CAAC,OAAO,CAAC,QAAQ,EAAE,QAAQ,EAAE,OAAO,CAAC,MAAM,EACrF,OAAO,CAAC,YAAY,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,CAAC,aAAa,EAAE,WAAW,EAAE,KAAK,CAAC,WAAW,EAAE,CAAC,CAAC,EACzG,OAAO,CAAC,MAAM,CAAC,CAAC;IAClB,IAAI,CAAC,OAAO,CAAC,OAAO;QAAE,OAAO,wBAAwB,CAAC,OAAO,CAAC,CAAC;IAC/D,MAAM,aAAa,GAAG,OAAO,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,aAAa,IAAI,CAAC,CAAC;IAC1E,MAAM,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,EAAE,aAAa,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE;QAC1E,MAAM,KAAK,GAAG,OAAO,CAAC,YAAY,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,SAAS,CAAC,aAAa,KAAK,IAAI,CAAC,CAAC;QAC9F,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAC9B,CAAC,CAAC,CAAC;IACH,MAAM,MAAM,GAAG,0BAA0B,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IAC1D,IAAI,QAAQ,GAAG,sBAAsB,CAAC,OAAO,CAAC,eAAe,EAAE,OAAO,CAAC,YAAY,CAAC,CAAC;IACrF,KAAK,MAAM,KAAK,IAAI,CAAC,GAAG,MAAM,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC;QAC1C,QAAQ,GAAG,aAAa,CACtB,QAAQ,EACR,KAAK,EACL,OAAO,CAAC,YAAY,CAAC,KAAK,EAC1B,MAAM,CAAC,mBAAmB,EAC1B,IAAI,GAAG,CAAC,MAAM,CAAC,iBAAiB,CAAC,CAClC,CAAC;IACJ,CAAC;IACD,OAAO,MAAM,CAAC,MAAM,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;AACtF,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,4BAA4B,CAC1C,OAAsC;IAEtC,IAAI,OAAO,KAAK,IAAI,IAAI,OAAO,OAAO,KAAK,QAAQ,IAAI,WAAW,IAAI,OAAO,EAAE,CAAC;QAC9E,MAAM,IAAI,KAAK,CAAC,oIAAoI,CAAC,CAAC;IACxJ,CAAC;IACD,MAAM,MAAM,GAAG,0BAA0B,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IAC1D,MAAM,YAAY,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,iBAAiB,CAAC,CAAC;IACvD,MAAM,SAAS,GAAG,mBAAmB,CAAC,OAAO,CAAC,YAAY,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC;IAC7E,MAAM,sBAAsB,GAAG,SAAS,CAAC,KAAK,CAAC,MAAM,CACnD,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,SAAS,KAAK,SAAS,CAAC;WACnD,CAAC,wBAAwB,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC;WACxC,CAAC,yBAAyB,CAAC,IAAI,CAAC,IAAI,CAAC,CAC3C,CAAC;IACF,MAAM,kBAAkB,GAAG,sBAAsB,CAAC,MAAM,CACtD,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,MAAM,CACvB,CAAC;IACF,wEAAwE;IACxE,wFAAwF;IACxF,KAAK,MAAM,IAAI,IAAI,kBAAkB,EAAE,CAAC;QACtC,IAAI,IAAI,CAAC,SAAS,EAAE,MAAM;YAAE,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC1D,CAAC;IACD,oEAAoE;IACpE,KAAK,MAAM,IAAI,IAAI,yBAAyB,CAAC,kBAAkB,EAAE,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;QACjF,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IACzB,CAAC;IACD,MAAM,WAAW,GAAG,kBAAkB,CAAC,GAAG,CAAC,qBAAqB,CAAC,CAAC;IAClE,MAAM,aAAa,GAAG,gBAAgB,CAAC,EAAE,KAAK,EAAE,WAAW,EAAE,YAAY,EAAE,CAAC,CAAC;IAC7E,IAAI,QAAQ,GAAG,sBAAsB,CAAC,OAAO,CAAC,eAAe,EAAE,SAAS,CAAC,CAAC;IAE1E,MAAM,OAAO,GAAG,KAAK,EAAE,IAAiC,EAAiB,EAAE;QACzE,QAAQ,GAAG,IAAI,CAAC;QAChB,MAAM,OAAO,CAAC,eAAe,CAAC,eAAe,CAAC,QAAQ,CAAC,CAAC,CAAC;IAC3D,CAAC,CAAC;IAEF,MAAM,gBAAgB,GAAG,sBAAsB,CAAC;QAC9C,KAAK,EAAE,OAAO,CAAC,YAAY,CAAC,KAAK;QACjC,OAAO,EAAE,aAAa;QACtB,MAAM,EAAE,SAAS,CAAC,MAAM;QACxB,KAAK,EAAE,sBAAsB;QAC7B,QAAQ,EAAE,OAAO,CAAC,QAAQ;QAC1B,IAAI,EAAE,MAAM,CAAC,YAAY;QACzB,SAAS,EAAE,MAAM,CAAC,mBAAmB;QACrC,MAAM,EAAE,YAAY;QACpB,WAAW,EAAE,GAAG,EAAE,CAAC,QAAQ;QAC3B,OAAO;QACP,QAAQ,EAAE,OAAO,CAAC,QAAQ;KAC3B,CAAC,CAAC;IACH,MAAM,YAAY,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,sBAAsB,EAAE,GAAG,gBAAgB,CAAC,CAAC,CAAC;IACrF,MAAM,QAAQ,GAAG,YAAY,CAAC,GAAG,CAAC,qBAAqB,CAAC,CAAC;IACzD,MAAM,OAAO,GAAG,gBAAgB,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,YAAY,EAAE,CAAC,CAAC;IACpE,MAAM,eAAe,GAAG,IAAI,GAAG,CAAC,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;IACtE,MAAM,UAAU,GAAiC,MAAM,CAAC,MAAM,CAAC;QAC7D,eAAe,EAAE,GAAG,EAAE,CAAC,8BAA8B,CAAC,QAAQ,CAAC;QAC/D,uBAAuB,EAAE,GAAG,EAAE,CAAC,uBAAuB,CAAC,SAAS,CAAC,MAAM,EAAE,QAAQ,CAAC;QAClF,IAAI,EAAE,KAAK,EAAE,IAAY,EAAE,EAAE;YAC3B,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,IAAI,CAAC;gBAAE,OAAO,KAAK,CAAC;YAC7C,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;gBAC5B,MAAM,OAAO,CAAC,mBAAmB,CAAC,QAAQ,EAAE,IAAI,EAAE,MAAM,CAAC,mBAAmB,CAAC,CAAC,CAAC;YACjF,CAAC;YACD,OAAO,IAAI,CAAC;QACd,CAAC;KACF,CAAC,CAAC;IACH,MAAM,aAAa,GAAG,uBAAuB,CAC3C,OAAO,EACP,YAAY,EACZ,UAAU,CAAC,eAAe,EAAE,CAC7B,CAAC;IAEF,OAAO,MAAM,CAAC,MAAM,CAAC;QACnB,YAAY;QACZ,QAAQ,EAAE,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC;QACjC,aAAa,EAAE,MAAM,CAAC,MAAM,CAAC,aAAa,CAAC;QAC3C,OAAO,EAAE,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC;QAC/B,aAAa,EAAE,kBAAkB,CAAC,OAAO,EAAE,aAAa,CAAC;QACzD,UAAU;KACX,CAAC,CAAC;AACL,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,2BAA2B,GAAG,CAAC,CAAC;AAE7C,MAAM,oBAAoB,GAAG,IAAI,GAAG,EAAU,CAAC;AAE/C;;;;;;;;;GASG;AACH,MAAM,UAAU,yBAAyB,CACvC,KAA+D,EAC/D,MAA+C;IAE/C,IAAI,MAAM,CAAC,aAAa,EAAE,gBAAgB,KAAK,SAAS;QAAE,OAAO,EAAE,CAAC;IACpE,MAAM,QAAQ,GAAG,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,YAAY,KAAK,IAAI,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACzF,MAAM,SAAS,GAAG,QAAQ,CAAC,KAAK,CAAC,2BAA2B,CAAC;SAC1D,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,oBAAoB,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC;IACnD,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACzB,KAAK,MAAM,IAAI,IAAI,SAAS;YAAE,oBAAoB,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAC7D,MAAM,CAAC,IAAI,CACT,GAAG,QAAQ,CAAC,MAAM,sDAAsD,2BAA2B,iBAAiB;cAClH,mBAAmB,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,8EAA8E,CACxH,CAAC;IACJ,CAAC;IACD,OAAO,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,2BAA2B,CAAC,CAAC;AACxD,CAAC;AAED,SAAS,mBAAmB,CAC1B,YAA+B,EAC/B,OAA8C;IAE9C,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO,MAAM,CAAC,MAAM,CAAC;YACnB,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,yBAAyB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;YAC9F,MAAM,EAAE,YAAY,CAAC,MAAM;SAC5B,CAAC,CAAC;IACL,CAAC;IACD,MAAM,GAAG,GAAG,OAAO,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;IAC1C,IAAI,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC;QACpE,MAAM,IAAI,KAAK,CAAC,4DAA4D,CAAC,CAAC;IAChF,CAAC;IACD,MAAM,YAAY,GAAG,IAAI,GAAG,CAAiB,YAAY,CAAC,KAAK,CAAC,CAAC;IACjE,MAAM,aAAa,GAAG,IAAI,GAAG,CAAkB,YAAY,CAAC,MAAM,CAAC,CAAC;IACpE,KAAK,MAAM,IAAI,IAAI,GAAG,CAAC,KAAK,EAAE,CAAC;QAC7B,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;YAC5B,MAAM,IAAI,KAAK,CAAC,4FAA4F,IAAI,EAAE,IAAI,GAAG,CAAC,CAAC;QAC7H,CAAC;IACH,CAAC;IACD,KAAK,MAAM,KAAK,IAAI,GAAG,CAAC,MAAM,EAAE,CAAC;QAC/B,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;YAC9B,MAAM,IAAI,KAAK,CAAC,6FAA6F,KAAK,EAAE,aAAa,GAAG,CAAC,CAAC;QACxI,CAAC;IACH,CAAC;IACD,OAAO,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;AAC5B,CAAC;AAED,SAAS,sBAAsB,CAC7B,QAAqC,EACrC,YAAmE;IAEnE,MAAM,aAAa,GAAG,IAAI,GAAG,CAAC,YAAY,CAAC,MAAM,CAAC,OAAO,CACvD,KAAK,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,aAAa,EAAE,KAAK,CAAC,IAAI,CAAC,CAC3C,CAAC,CAAC;IACH,MAAM,YAAY,GAAG,QAAQ,CAAC,YAAY,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC;IACnF,MAAM,YAAY,GAAG,IAAI,GAAG,CAAC,YAAY,CAAC,KAAK;SAC5C,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC;SAC9B,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;IAC7B,MAAM,gBAAgB,GAAG,IAAI,GAAG,CAAC,YAAY,CAAC,CAAC;IAC/C,KAAK,MAAM,KAAK,IAAI,YAAY,CAAC,MAAM,EAAE,CAAC;QACxC,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,KAAK,CAAC,aAAa,CAAC,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC;YAAE,SAAS;QAC9F,KAAK,MAAM,IAAI,IAAI,iBAAiB,CAAC,KAAK,EAAE,YAAY,CAAC,KAAK,CAAC;YAAE,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAC1F,CAAC;IACD,OAAO;QACL,WAAW,EAAE,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAC;aACjE,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC;QAC9C,YAAY;KACb,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,IAAoB;IACxD,MAAM,UAAU,GAAG,2BAA2B,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IACjE,MAAM,eAAe,GAAG,eAAe,CAAC,UAAU,CAA4B,CAAC;IAC/E,OAAO,MAAM,CAAC,MAAM,CAAC;QACnB,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,WAAW,EAAE,IAAI,CAAC,WAAW;QAC7B,UAAU,EAAE,eAAe;QAC3B,MAAM,EAAE,IAAI,CAAC,MAAM;QACnB,WAAW,EAAE,IAAI,CAAC,WAAW;QAC7B,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS;QAC5C,QAAQ,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,SAAS;QACxD,gBAAgB,EAAE,IAAI,CAAC,gBAAgB;QACvC,OAAO,EAAE,KAAK,IAAI,EAAE;YAClB,MAAM,IAAI,KAAK,CAAC,qCAAqC,IAAI,CAAC,IAAI,iCAAiC,CAAC,CAAC;QACnG,CAAC;KACF,CAAC,CAAC;AACL,CAAC;AAiBD,SAAS,sBAAsB,CAAC,OAA8B;IAC5D,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC;IACzE,OAAO,MAAM,CAAC,MAAM,CAAC;QACnB,cAAc,CAAC,OAAO,CAAC,KAAK,EAAE,UAAU,EAAE,6CAA6C,EAAE;YACvF,IAAI,EAAE,QAAQ;YACd,UAAU,EAAE;gBACV,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;gBACzB,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,MAAM,EAAE,OAAO,EAAE,KAAK,CAAC,EAAE;aACzD;SACF,EAAE,KAAK,EAAE,GAAG,EAAE,UAAU,EAAE,EAAE;YAC3B,MAAM,KAAK,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC;YAC5B,MAAM,KAAK,GAAG,OAAO,KAAK,CAAC,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACxE,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,KAAK,MAAM,IAAI,KAAK,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC;YAClF,MAAM,OAAO,GAAG,oBAAoB,CAAC,OAAO,CAAC,CAAC;YAC9C,MAAM,aAAa,GAAG,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,iBAAiB,CAAC;gBAC9D,KAAK;gBACL,IAAI,EAAE,MAAM;gBACZ,IAAI,EAAE,OAAO,CAAC,IAAI;gBAClB,QAAQ,EAAE,OAAO,CAAC,QAAQ;gBAC1B,aAAa,EAAE,IAAI;gBACnB,OAAO;aACR,CAAC,CAAC;YACH,MAAM,cAAc,GAAG,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,cAAc,CAAC,OAAO,CAAC,MAAM,EAAE,KAAK,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;YAClG,MAAM,CAAC,WAAW,EAAE,YAAY,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,MAAM,OAAO,CAAC,GAAG,CAAC;gBAC5D,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,sBAAsB,CAAC,OAAO,CAAC,QAAQ,EAAE,OAAO,EAAE,KAAK,EACpF,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,WAAW,EAAE,IAAI,CAAC,QAAQ,CAAC,WAAW,EAAE,CAAC,CAAC,EAAE,UAAU,CAAC,MAAM,CAAC;gBACxG,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,sBAAsB,CAAC,OAAO,CAAC,QAAQ,EAAE,QAAQ,EAAE,KAAK,EACpF,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,CAAC,aAAa,EAAE,WAAW,EAAE,KAAK,CAAC,WAAW,EAAE,CAAC,CAAC,EAAE,UAAU,CAAC,MAAM,CAAC;aACnH,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YACR,MAAM,KAAK,GAAG,WAAW,EAAE,OAAO;gBAChC,CAAC,CAAC,WAAW,CAAC,aAAa,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE;oBACzC,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,SAAS,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC;oBAChE,OAAO,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;gBAC1E,CAAC,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC;YACrB,MAAM,MAAM,GAAG,YAAY,EAAE,OAAO;gBAClC,CAAC,CAAC,YAAY,CAAC,aAAa,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE;oBAC1C,MAAM,KAAK,GAAG,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,SAAS,CAAC,aAAa,KAAK,IAAI,CAAC,CAAC;oBACjF,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,OAAgB,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;gBACnF,CAAC,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC;YACtB,MAAM,IAAI,GAAG,CAAC,GAAG,KAAK,EAAE,GAAG,MAAM,CAAC,CAAC;YACnC,OAAO,IAAI,CAAC,MAAM,GAAG,CAAC;gBACpB,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,MAAM,IAAI,CAAC,IAAI,KAAK,IAAI,CAAC,IAAI,KAAK,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;gBAC/E,CAAC,CAAC,aAAa,CAAC;QACpB,CAAC,CAAC;QACF,cAAc,CAAC,OAAO,CAAC,KAAK,EAAE,WAAW,EAAE,gDAAgD,EAAE;YAC3F,IAAI,EAAE,QAAQ;YACd,UAAU,EAAE,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE;YACxC,QAAQ,EAAE,CAAC,MAAM,CAAC;SACnB,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE;YACf,MAAM,IAAI,GAAG,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC;YAC9C,MAAM,IAAI,GAAG,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YAC9B,IAAI,CAAC,IAAI;gBAAE,OAAO,SAAS,IAAI,yBAAyB,CAAC;YACzD,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;gBAC9B,MAAM,OAAO,CAAC,OAAO,CAAC,mBAAmB,CAAC,OAAO,CAAC,WAAW,EAAE,EAAE,IAAI,EAAE,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC;YAC7F,CAAC;YACD,OAAO,gBAAgB,IAAI,2BAA2B,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,UAAU,EAAE,IAAI,EAAE,CAAC,CAAC,0BAA0B,CAAC;QACpI,CAAC,CAAC;QACF,cAAc,CAAC,OAAO,CAAC,KAAK,EAAE,YAAY,EAAE,sDAAsD,EAAE;YAClG,IAAI,EAAE,QAAQ;YACd,UAAU,EAAE,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE;YACxC,QAAQ,EAAE,CAAC,MAAM,CAAC;SACnB,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE;YACf,MAAM,IAAI,GAAG,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC;YAC9C,MAAM,KAAK,GAAG,YAAY,CAAC,OAAO,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;YACjD,IAAI,CAAC,KAAK;gBAAE,OAAO,UAAU,IAAI,uCAAuC,CAAC;YACzE,MAAM,SAAS,GAAG,iBAAiB,CAAC,KAAK,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC;YAC1D,MAAM,OAAO,CAAC,OAAO,CACnB,aAAa,CAAC,OAAO,CAAC,WAAW,EAAE,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,OAAO,CAAC,SAAS,EAAE,OAAO,CAAC,MAAM,CAAC,CAC9F,CAAC;YACF,MAAM,QAAQ,GAAG,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,qBAAqB,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACzF,OAAO,GAAG,KAAK,CAAC,YAAY,GAAG,QAAQ,0BAA0B,CAAC;QACpE,CAAC,CAAC;KACH,CAAC,CAAC;AACL,CAAC;AAED,SAAS,cAAc,CACrB,KAAiC,EACjC,IAAY,EACZ,WAAmB,EACnB,WAA4B,EAC5B,OAA6E;IAE7E,OAAO,MAAM,CAAC,MAAM,CAAC;QACnB,KAAK;QACL,IAAI;QACJ,aAAa,EAAE,IAAI;QACnB,WAAW;QACX,WAAW;QACX,gBAAgB,EAAE,OAAO;QACzB,MAAM,EAAE,uBAAuB;QAC/B,OAAO,EAAE,CAAsC,KAAa,EAAE,OAA8B,EAAE,EAAE,CAC9F,OAAO,CAAC,KAAK,EAAE,OAAO,CAAqB;KAC9C,CAAC,CAAC;AACL,CAAC;AAED,SAAS,cAAc,CACrB,MAAkC,EAClC,KAAa,EACb,IAAY;IAEZ,MAAM,MAAM,GAAG,KAAK,CAAC,iBAAiB,EAAE,CAAC;IACzC,OAAO,MAAM;SACV,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,MAAM,IAAI;QAC5B,KAAK,CAAC,aAAa;QACnB,KAAK,CAAC,WAAW;QACjB,GAAG,CAAC,KAAK,CAAC,QAAQ,IAAI,EAAE,CAAC;QACzB,GAAG,CAAC,KAAK,CAAC,IAAI,IAAI,EAAE,CAAC;KACtB,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,iBAAiB,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;SAChD,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC;SACd,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,CAAC,aAAa,EAAE,KAAK,EAAE,KAAK,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC;AAC9F,CAAC;AAED,SAAS,YAAY,CAAC,MAAkC,EAAE,IAAY;IACpE,MAAM,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,aAAa,KAAK,IAAI,IAAI,KAAK,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC;IAC9F,OAAO,OAAO,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;AACvD,CAAC;AAED,SAAS,uBAAuB,CAC9B,MAAkC,EAClC,QAAqC;IAErC,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC;IAC9C,OAAO,MAAM;SACV,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,KAAK,IAAI;WACnC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,aAAa,CAAC;WAC/B,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;SAC3B,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;AACxC,CAAC;AAED,SAAS,aAAa,CACpB,QAAqC,EACrC,KAAsB,EACtB,KAAgC,EAChC,SAAiB,EACjB,MAA2B;IAE3B,MAAM,SAAS,GAAG,iBAAiB,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC;IACpF,OAAO,oBAAoB,CAAC,kBAAkB,CAAC,QAAQ,EAAE,KAAK,CAAC,aAAa,CAAC,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC;AACvG,CAAC;AAED,SAAS,oBAAoB,CAAC,OAA8B;IAC1D,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,8BAA8B,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC;IAC9E,MAAM,YAAY,GAAG,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,MAAM,IAAI,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;IACxF,OAAO,CAAC,GAAG,OAAO,CAAC,OAAO;QACxB,GAAG,gBAAgB,CAAC,EAAE,KAAK,EAAE,YAAY,CAAC,GAAG,CAAC,qBAAqB,CAAC,EAAE,YAAY,EAAE,IAAI,GAAG,EAAU,EAAE,CAAC,CAAC,CAAC;AAC9G,CAAC;AAED,SAAS,iBAAiB,CACxB,KAAsB,EACtB,KAAgC;IAEhC,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,SAAS,IAAI,EAAE,CAAC,CAAC;IACjD,IAAI,SAAS,CAAC,IAAI,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IACpC,OAAO,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,KAAK,KAAK,CAAC,KAAK;WACnD,cAAc,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,GAAG,SAAS,CAAC,CAAC,IAAI,CACrD,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,IAAI,IAAI,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,IAAI,EAAE,CAAC,CAC9D,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC9B,CAAC;AAED,SAAS,cAAc,CAAC,IAAoB,EAAE,KAAsB;IAClE,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC;IACjC,IAAI,CAAC,SAAS;QAAE,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC;IACpC,IAAI,SAAS,CAAC,IAAI,KAAK,OAAO;QAAE,OAAO,SAAS,CAAC,KAAK,KAAK,KAAK,CAAC,SAAS,CAAC;IAC3E,IAAI,SAAS,CAAC,IAAI,KAAK,OAAO;QAAE,OAAO,CAAC,KAAK,CAAC,SAAS,IAAI,SAAS,CAAC,KAAK,KAAK,KAAK,CAAC,IAAI,CAAC;IAC1F,OAAO,SAAS,CAAC,KAAK,KAAK,KAAK,CAAC,SAAS,IAAI,SAAS,CAAC,KAAK,KAAK,KAAK,CAAC,IAAI,CAAC;AAC/E,CAAC;AAED,SAAS,oBAAoB,CAC3B,MAAkC,EAClC,MAAc;IAEd,MAAM,QAAQ,GAAG,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,iBAAiB,EAAE,CAAC,IAAI,EAAE,CAAC;IACrE,IAAI,CAAC,QAAQ;QAAE,OAAO,SAAS,CAAC;IAChC,MAAM,MAAM,GAAG,MAAM;SAClB,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,SAAS,IAAI,KAAK,CAAC,QAAQ,EAAE,MAAM,CAAC;SAC5D,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,eAAe,CAAC,KAAK,CAAC,QAAQ,IAAI,EAAE,EAAE,QAAQ,CAAC,EAAE,CAAC,CAAC;SACnF,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC;SAClC,IAAI,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK;WAC1C,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,aAAa,CAAC,KAAK,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,CAAC;IAC1E,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,CAAC,KAAK,KAAK,MAAM,CAAC,CAAC,CAAC,EAAE,KAAK;QAAE,OAAO,SAAS,CAAC;IACzE,OAAO,MAAM,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;AACzB,CAAC;AAED,SAAS,eAAe,CAAC,QAA2B,EAAE,gBAAwB;IAC5E,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,KAAK,MAAM,KAAK,IAAI,IAAI,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;QACtC,MAAM,OAAO,GAAG,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,iBAAiB,EAAE,CAAC,IAAI,EAAE,CAAC;QACnE,IAAI,OAAO,IAAI,gBAAgB,CAAC,QAAQ,CAAC,OAAO,CAAC;YAAE,KAAK,IAAI,CAAC,GAAG,OAAO,CAAC,CAAC,MAAM,CAAC;IAClF,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,QAAQ,CAAC,KAAc;IAC9B,OAAO,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAgC,CAAC,CAAC,CAAC,EAAE,CAAC;AACpF,CAAC","sourcesContent":["import {\n addSkillToSnapshot,\n getLoadedToolNamesFromSnapshot,\n touchToolInSnapshot,\n touchToolsInSnapshot,\n type AgentTool,\n type DeferredToolSessionSnapshot,\n} from '@zhin.js/ai';\nimport {\n toolInputSchemaToParameters,\n type ToolInvocationContext,\n type ToolInputSchema,\n} from '@zhin.js/tool';\nimport type { SkillDescriptor } from '@zhin.js/skill';\nimport { getLogger } from '@zhin.js/logger';\nimport { rankDecisionCandidates } from '../decision/rank.js';\nimport type { AgentDecisionRuntime } from '../decision/types.js';\nimport { buildDeferredStats, buildToolCatalog, discoverInCatalog, resolveDeferredApiTools } from '../tool-catalog/tool-catalog.js';\nimport { resolveDeferredToolsConfig } from '../tool-catalog/resolve-config.js';\nimport { DEFERRED_META_TOOL_NAMES, type ToolCatalogItem } from '../tool-catalog/types.js';\nimport type { AgentCapabilities, ToolCapability } from './capability-ingress.js';\n\nconst logger = getLogger('DeferredCapabilityPlan');\n\n/**\n * Injected capability ceiling. It must return a subset of the given projection\n * and throw when the projection is not trusted by the ceiling's owner.\n */\nexport interface DeferredCapabilityCeiling {\n project(capabilities: AgentCapabilities): Readonly<Pick<AgentCapabilities, 'tools' | 'skills'>>;\n}\n\n/**\n * Reserved, model-invisible control namespace of the Agent runtime. Control\n * tools use this prefix and it is always filtered out of model-visible\n * capabilities. It is a naming convention, not a dependency on Workroom code.\n */\nexport const RESERVED_CONTROL_TOOL_PREFIX = 'workroom_';\n\n/**\n * Reserved model-invisible control namespace; always filtered out of\n * model-visible capabilities.\n */\nexport function isReservedControlToolName(name: string): boolean {\n return (name.split('__').at(-1) ?? name).startsWith(RESERVED_CONTROL_TOOL_PREFIX);\n}\n\nexport interface DeferredCapabilityController {\n loadedToolNames(): string[];\n loadedSkillInstructions(): string[];\n /** Load a public catalog tool into the session. Returns false when it is not in this turn's catalog. */\n load(name: string): Promise<boolean>;\n}\n\nexport interface DeferredCapabilityPlan {\n readonly capabilities: readonly ToolCapability[];\n readonly allTools: readonly AgentTool[];\n readonly resolvedTools: readonly AgentTool[];\n readonly catalog: readonly ToolCatalogItem[];\n readonly deferredStats: string;\n readonly controller: DeferredCapabilityController;\n}\n\n/**\n * The legacy `authority` option no longer exists; passing it at runtime throws\n * (fail-closed) instead of being silently ignored.\n */\nexport interface DeferredCapabilityPlanOptions {\n readonly capabilities: AgentCapabilities;\n /**\n * Optional injected capability ceiling (e.g. a Workroom Assignment).\n * Ordinary chat omits it and retains its own capability projection.\n */\n readonly ceiling?: DeferredCapabilityCeiling;\n readonly sessionSnapshot: DeferredToolSessionSnapshot;\n readonly config: Parameters<typeof resolveDeferredToolsConfig>[0];\n readonly platform?: string;\n readonly persistSnapshot: (snapshot: DeferredToolSessionSnapshot) => Promise<void>;\n readonly decision?: AgentDecisionRuntime;\n}\n\nexport interface AgentSkillIntentPrimeResult {\n readonly snapshot: DeferredToolSessionSnapshot;\n readonly skill?: SkillDescriptor;\n readonly skills?: readonly SkillDescriptor[];\n}\n\n/**\n * Deterministically activates one Agent-private Skill when the current intent\n * has a unique best keyword match. Public Skills and ambiguous matches remain\n * deferred so the runtime keeps its progressive-disclosure boundary.\n */\nexport function primeAgentSkillForIntent(options: Readonly<{\n capabilities: Pick<AgentCapabilities, 'tools' | 'skills'>;\n sessionSnapshot: DeferredToolSessionSnapshot;\n intent: string;\n config: DeferredCapabilityPlanOptions['config'];\n}>): AgentSkillIntentPrimeResult {\n const snapshot = projectSessionSnapshot(options.sessionSnapshot, options.capabilities);\n const skill = uniqueBestAgentSkill(options.capabilities.skills, options.intent);\n if (!skill) return Object.freeze({ snapshot });\n\n const config = resolveDeferredToolsConfig(options.config);\n const withTools = activateSkill(\n snapshot,\n skill,\n options.capabilities.tools,\n config.maxLoadedPerSession,\n new Set(config.alwaysLoadedTools),\n );\n return Object.freeze({ snapshot: withTools, skill });\n}\n\n/** Model recommendation never enlarges the immutable, already-authorized projection. */\nexport async function primeSkillsForIntent(options: Readonly<{\n capabilities: Pick<AgentCapabilities, 'tools' | 'skills'>;\n sessionSnapshot: DeferredToolSessionSnapshot;\n intent: string;\n config: DeferredCapabilityPlanOptions['config'];\n decision?: AgentDecisionRuntime;\n signal: AbortSignal;\n}>): Promise<AgentSkillIntentPrimeResult> {\n const ranking = await rankDecisionCandidates(options.decision, 'skills', options.intent,\n options.capabilities.skills.map(skill => ({ name: skill.qualifiedName, description: skill.description })),\n options.signal);\n if (!ranking.applied) return primeAgentSkillForIntent(options);\n const maxSelections = options.decision?.config.skills?.maxSelections ?? 2;\n const skills = ranking.selectedNames.slice(0, maxSelections).flatMap(name => {\n const skill = options.capabilities.skills.find(candidate => candidate.qualifiedName === name);\n return skill ? [skill] : [];\n });\n const config = resolveDeferredToolsConfig(options.config);\n let snapshot = projectSessionSnapshot(options.sessionSnapshot, options.capabilities);\n for (const skill of [...skills].reverse()) {\n snapshot = activateSkill(\n snapshot,\n skill,\n options.capabilities.tools,\n config.maxLoadedPerSession,\n new Set(config.alwaysLoadedTools),\n );\n }\n return Object.freeze({ snapshot, skill: skills[0], skills: Object.freeze(skills) });\n}\n\n/**\n * Turn-owned deferred capability authority. It has no filesystem, registry,\n * AsyncLocalStorage, or classic Tool dependency: everything comes from the\n * immutable generation projection and the session snapshot.\n */\nexport function createDeferredCapabilityPlan(\n options: DeferredCapabilityPlanOptions,\n): DeferredCapabilityPlan {\n if (options !== null && typeof options === 'object' && 'authority' in options) {\n throw new Error('createDeferredCapabilityPlan no longer accepts \"authority\"; use createWorkroomDeferredCapabilityPlan or pass an injected \"ceiling\"');\n }\n const config = resolveDeferredToolsConfig(options.config);\n const alwaysLoaded = new Set(config.alwaysLoadedTools);\n const projected = projectCapabilities(options.capabilities, options.ceiling);\n const executableCapabilities = projected.tools.filter(\n (tool) => (!tool.hidden || tool.placement !== undefined)\n && !DEFERRED_META_TOOL_NAMES.has(tool.name)\n && !isReservedControlToolName(tool.name),\n );\n const publicCapabilities = executableCapabilities.filter(\n (tool) => !tool.hidden\n );\n // Platform-scoped adapter tools already passed canAccess for this turn.\n // Keep them in the model tool list so QQ/social actions are not hidden behind discover.\n for (const tool of publicCapabilities) {\n if (tool.platforms?.length) alwaysLoaded.add(tool.name);\n }\n // Plugin authors may opt a tool into the resident set (#857 P1-10).\n for (const name of declaredResidentToolNames(publicCapabilities, options.config)) {\n alwaysLoaded.add(name);\n }\n const publicTools = publicCapabilities.map(capabilityAsAgentTool);\n const publicCatalog = buildToolCatalog({ tools: publicTools, alwaysLoaded });\n let snapshot = projectSessionSnapshot(options.sessionSnapshot, projected);\n\n const persist = async (next: DeferredToolSessionSnapshot): Promise<void> => {\n snapshot = next;\n await options.persistSnapshot(structuredClone(snapshot));\n };\n\n const metaCapabilities = createMetaCapabilities({\n owner: options.capabilities.owner,\n catalog: publicCatalog,\n skills: projected.skills,\n tools: executableCapabilities,\n platform: options.platform,\n topK: config.discoverTopK,\n maxLoaded: config.maxLoadedPerSession,\n pinned: alwaysLoaded,\n getSnapshot: () => snapshot,\n persist,\n decision: options.decision,\n });\n const capabilities = Object.freeze([...executableCapabilities, ...metaCapabilities]);\n const allTools = capabilities.map(capabilityAsAgentTool);\n const catalog = buildToolCatalog({ tools: allTools, alwaysLoaded });\n const publicToolNames = new Set(publicCatalog.map(item => item.name));\n const controller: DeferredCapabilityController = Object.freeze({\n loadedToolNames: () => getLoadedToolNamesFromSnapshot(snapshot),\n loadedSkillInstructions: () => loadedSkillInstructions(projected.skills, snapshot),\n load: async (name: string) => {\n if (!publicToolNames.has(name)) return false;\n if (!alwaysLoaded.has(name)) {\n await persist(touchToolInSnapshot(snapshot, name, config.maxLoadedPerSession));\n }\n return true;\n },\n });\n const resolvedTools = resolveDeferredApiTools(\n catalog,\n alwaysLoaded,\n controller.loadedToolNames(),\n );\n\n return Object.freeze({\n capabilities,\n allTools: Object.freeze(allTools),\n resolvedTools: Object.freeze(resolvedTools),\n catalog: Object.freeze(catalog),\n deferredStats: buildDeferredStats(catalog, resolvedTools),\n controller,\n });\n}\n\n/**\n * Upper bound on plugin tools that may become resident through their own\n * `alwaysLoaded: true` flag in one turn. Each resident schema is sent on every\n * model call, so a misbehaving plugin set must not silently flood the context.\n * Tools past the limit stay deferred (still reachable via `discover` /\n * `load_tool`) and a warning names them once. Operators who need more can list\n * tools in `deferredTools.alwaysLoadedTools`, which this limit does not touch.\n */\nexport const MAX_DECLARED_RESIDENT_TOOLS = 8;\n\nconst warnedOverLimitTools = new Set<string>();\n\n/**\n * Names of public tools whose author set `alwaysLoaded: true`, in projection\n * order and capped at {@link MAX_DECLARED_RESIDENT_TOOLS}.\n *\n * - Absent or `false` keeps the tool deferred (the default for every plugin).\n * - `deferredTools.alwaysLoadedMode: replace` means the operator's list is the\n * complete resident set, so author declarations are ignored.\n * - Only public (non-hidden) capabilities that already passed ingress and the\n * capability ceiling are considered; the flag never grants access.\n */\nexport function declaredResidentToolNames(\n tools: readonly Pick<ToolCapability, 'name' | 'alwaysLoaded'>[],\n config: DeferredCapabilityPlanOptions['config'],\n): string[] {\n if (config.deferredTools?.alwaysLoadedMode === 'replace') return [];\n const declared = tools.filter(tool => tool.alwaysLoaded === true).map(tool => tool.name);\n const overLimit = declared.slice(MAX_DECLARED_RESIDENT_TOOLS)\n .filter(name => !warnedOverLimitTools.has(name));\n if (overLimit.length > 0) {\n for (const name of overLimit) warnedOverLimitTools.add(name);\n logger.warn(\n `${declared.length} plugin tools declare alwaysLoaded; only the first ${MAX_DECLARED_RESIDENT_TOOLS} are resident. `\n + `Still deferred: ${overLimit.join(', ')}. List them in ai.agent.deferredTools.alwaysLoadedTools to keep them loaded.`,\n );\n }\n return declared.slice(0, MAX_DECLARED_RESIDENT_TOOLS);\n}\n\nfunction projectCapabilities(\n capabilities: AgentCapabilities,\n ceiling: DeferredCapabilityCeiling | undefined,\n): Readonly<Pick<AgentCapabilities, 'tools' | 'skills'>> {\n if (!ceiling) {\n return Object.freeze({\n tools: Object.freeze(capabilities.tools.filter(tool => !isReservedControlToolName(tool.name))),\n skills: capabilities.skills,\n });\n }\n const out = ceiling.project(capabilities);\n if (!out || !Array.isArray(out.tools) || !Array.isArray(out.skills)) {\n throw new Error('capability ceiling must return arrays for tools and skills');\n }\n const allowedTools = new Set<ToolCapability>(capabilities.tools);\n const allowedSkills = new Set<SkillDescriptor>(capabilities.skills);\n for (const tool of out.tools) {\n if (!allowedTools.has(tool)) {\n throw new Error(`capability ceiling returned a tool/skill that is not part of the input projection: tool \"${tool?.name}\"`);\n }\n }\n for (const skill of out.skills) {\n if (!allowedSkills.has(skill)) {\n throw new Error(`capability ceiling returned a tool/skill that is not part of the input projection: skill \"${skill?.qualifiedName}\"`);\n }\n }\n return Object.freeze(out);\n}\n\nfunction projectSessionSnapshot(\n snapshot: DeferredToolSessionSnapshot,\n capabilities: Readonly<Pick<AgentCapabilities, 'tools' | 'skills'>>,\n): DeferredToolSessionSnapshot {\n const allowedSkills = new Set(capabilities.skills.flatMap(\n skill => [skill.qualifiedName, skill.name],\n ));\n const loadedSkills = snapshot.loadedSkills.filter(name => allowedSkills.has(name));\n const allowedTools = new Set(capabilities.tools\n .filter((tool) => !tool.hidden)\n .map((tool) => tool.name));\n const loadedSkillNames = new Set(loadedSkills);\n for (const skill of capabilities.skills) {\n if (!loadedSkillNames.has(skill.qualifiedName) && !loadedSkillNames.has(skill.name)) continue;\n for (const tool of resolveSkillTools(skill, capabilities.tools)) allowedTools.add(tool);\n }\n return {\n loadedTools: Object.fromEntries(Object.entries(snapshot.loadedTools)\n .filter(([name]) => allowedTools.has(name))),\n loadedSkills,\n };\n}\n\nexport function capabilityAsAgentTool(tool: ToolCapability): AgentTool {\n const parameters = toolInputSchemaToParameters(tool.inputSchema);\n const modelParameters = structuredClone(parameters) as AgentTool['parameters'];\n return Object.freeze({\n name: tool.name,\n description: tool.description,\n parameters: modelParameters,\n source: tool.source,\n permissions: tool.permissions,\n tags: tool.tags ? [...tool.tags] : undefined,\n keywords: tool.keywords ? [...tool.keywords] : undefined,\n requiresApproval: tool.requiresApproval,\n execute: async () => {\n throw new Error(`AgentCore must execute capability ${tool.name} through ToolExecutionAuthority`);\n },\n });\n}\n\ninterface MetaCapabilityOptions {\n readonly owner: AgentCapabilities['owner'];\n readonly catalog: readonly ToolCatalogItem[];\n readonly skills: readonly SkillDescriptor[];\n readonly tools: readonly ToolCapability[];\n readonly platform?: string;\n readonly topK: number;\n readonly maxLoaded: number;\n /** Always-loaded tools: never written to the snapshot, so they never count against `maxLoaded`. */\n readonly pinned: ReadonlySet<string>;\n readonly getSnapshot: () => DeferredToolSessionSnapshot;\n readonly persist: (snapshot: DeferredToolSessionSnapshot) => Promise<void>;\n readonly decision?: AgentDecisionRuntime;\n}\n\nfunction createMetaCapabilities(options: MetaCapabilityOptions): readonly ToolCapability[] {\n const byName = new Map(options.catalog.map((item) => [item.name, item]));\n return Object.freeze([\n metaCapability(options.owner, 'discover', 'Search deferred tools and skills by intent.', {\n type: 'object',\n properties: {\n query: { type: 'string' },\n kind: { type: 'string', enum: ['tool', 'skill', 'all'] },\n },\n }, async (raw, invocation) => {\n const input = recordOf(raw);\n const query = typeof input.query === 'string' ? input.query.trim() : '';\n const kind = input.kind === 'tool' || input.kind === 'skill' ? input.kind : 'all';\n const catalog = disclosedToolCatalog(options);\n const fallbackTools = kind === 'skill' ? [] : discoverInCatalog({\n query,\n kind: 'tool',\n topK: options.topK,\n platform: options.platform,\n skillRegistry: null,\n catalog,\n });\n const fallbackSkills = kind === 'tool' ? [] : discoverSkills(options.skills, query, options.topK);\n const [rankedTools, rankedSkills] = query ? await Promise.all([\n kind === 'skill' ? undefined : rankDecisionCandidates(options.decision, 'tools', query,\n catalog.map(item => ({ name: item.name, description: item.fullTool.description })), invocation.signal),\n kind === 'tool' ? undefined : rankDecisionCandidates(options.decision, 'skills', query,\n options.skills.map(skill => ({ name: skill.qualifiedName, description: skill.description })), invocation.signal),\n ]) : [];\n const tools = rankedTools?.applied\n ? rankedTools.selectedNames.flatMap(name => {\n const item = catalog.find(candidate => candidate.name === name);\n return item ? [{ kind: 'tool' as const, name, brief: item.brief }] : [];\n }) : fallbackTools;\n const skills = rankedSkills?.applied\n ? rankedSkills.selectedNames.flatMap(name => {\n const skill = options.skills.find(candidate => candidate.qualifiedName === name);\n return skill ? [{ kind: 'skill' as const, name, brief: skill.description }] : [];\n }) : fallbackSkills;\n const rows = [...tools, ...skills];\n return rows.length > 0\n ? rows.map((item) => `- [${item.kind}] ${item.name}: ${item.brief}`).join('\\n')\n : 'No matches.';\n }),\n metaCapability(options.owner, 'load_tool', 'Load a deferred tool schema into this session.', {\n type: 'object',\n properties: { name: { type: 'string' } },\n required: ['name'],\n }, async (raw) => {\n const name = String(recordOf(raw).name ?? '');\n const item = byName.get(name);\n if (!item) return `Tool \"${name}\" not found in catalog.`;\n if (!options.pinned.has(name)) {\n await options.persist(touchToolInSnapshot(options.getSnapshot(), name, options.maxLoaded));\n }\n return `Loaded tool \"${name}\".\\nParameters schema:\\n${JSON.stringify(item.fullTool.parameters, null, 2)}\\n__zhin_tools_mutated__`;\n }),\n metaCapability(options.owner, 'load_skill', 'Load projected skill instructions into this session.', {\n type: 'object',\n properties: { name: { type: 'string' } },\n required: ['name'],\n }, async (raw) => {\n const name = String(recordOf(raw).name ?? '');\n const skill = resolveSkill(options.skills, name);\n if (!skill) return `Skill '${name}' not found in the active generation.`;\n const toolNames = resolveSkillTools(skill, options.tools);\n await options.persist(\n activateSkill(options.getSnapshot(), skill, options.tools, options.maxLoaded, options.pinned),\n );\n const unlocked = toolNames.length > 0 ? `\\nUnlocked tools: ${toolNames.join(', ')}` : '';\n return `${skill.instructions}${unlocked}\\n__zhin_tools_mutated__`;\n }),\n ]);\n}\n\nfunction metaCapability(\n owner: AgentCapabilities['owner'],\n name: string,\n description: string,\n inputSchema: ToolInputSchema,\n execute: (input: unknown, context: ToolInvocationContext) => Promise<unknown>,\n): ToolCapability {\n return Object.freeze({\n owner,\n name,\n qualifiedName: name,\n description,\n inputSchema,\n requiresApproval: 'never',\n source: 'builtin:agent-runtime',\n execute: <TInput = unknown, TResult = unknown>(input: TInput, context: ToolInvocationContext) =>\n execute(input, context) as Promise<TResult>,\n });\n}\n\nfunction discoverSkills(\n skills: readonly SkillDescriptor[],\n query: string,\n topK: number,\n): Array<{ kind: 'skill'; name: string; brief: string }> {\n const needle = query.toLocaleLowerCase();\n return skills\n .filter((skill) => !needle || [\n skill.qualifiedName,\n skill.description,\n ...(skill.keywords ?? []),\n ...(skill.tags ?? []),\n ].join(' ').toLocaleLowerCase().includes(needle))\n .slice(0, topK)\n .map((skill) => ({ kind: 'skill', name: skill.qualifiedName, brief: skill.description }));\n}\n\nfunction resolveSkill(skills: readonly SkillDescriptor[], name: string): SkillDescriptor | undefined {\n const matches = skills.filter((skill) => skill.qualifiedName === name || skill.name === name);\n return matches.length === 1 ? matches[0] : undefined;\n}\n\nfunction loadedSkillInstructions(\n skills: readonly SkillDescriptor[],\n snapshot: DeferredToolSessionSnapshot,\n): string[] {\n const loaded = new Set(snapshot.loadedSkills);\n return skills\n .filter((skill) => skill.always === true\n || loaded.has(skill.qualifiedName)\n || loaded.has(skill.name))\n .map((skill) => skill.instructions);\n}\n\nfunction activateSkill(\n snapshot: DeferredToolSessionSnapshot,\n skill: SkillDescriptor,\n tools: readonly ToolCapability[],\n maxLoaded: number,\n pinned: ReadonlySet<string>,\n): DeferredToolSessionSnapshot {\n const toolNames = resolveSkillTools(skill, tools).filter(name => !pinned.has(name));\n return touchToolsInSnapshot(addSkillToSnapshot(snapshot, skill.qualifiedName), toolNames, maxLoaded);\n}\n\nfunction disclosedToolCatalog(options: MetaCapabilityOptions): ToolCatalogItem[] {\n const loaded = new Set(getLoadedToolNamesFromSnapshot(options.getSnapshot()));\n const privateTools = options.tools.filter(tool => tool.hidden && loaded.has(tool.name));\n return [...options.catalog,\n ...buildToolCatalog({ tools: privateTools.map(capabilityAsAgentTool), alwaysLoaded: new Set<string>() })];\n}\n\nfunction resolveSkillTools(\n skill: SkillDescriptor,\n tools: readonly ToolCapability[],\n): string[] {\n const requested = new Set(skill.toolNames ?? []);\n if (requested.size === 0) return [];\n return tools.filter((tool) => tool.owner === skill.owner\n && belongsToSkill(tool, skill) && [...requested].some(\n name => tool.name === name || tool.name.endsWith(`__${name}`),\n )).map((tool) => tool.name);\n}\n\nfunction belongsToSkill(tool: ToolCapability, skill: SkillDescriptor): boolean {\n const placement = tool.placement;\n if (!placement) return !tool.hidden;\n if (placement.kind === 'agent') return placement.agent === skill.agentName;\n if (placement.kind === 'skill') return !skill.agentName && placement.skill === skill.name;\n return placement.agent === skill.agentName && placement.skill === skill.name;\n}\n\nfunction uniqueBestAgentSkill(\n skills: readonly SkillDescriptor[],\n intent: string,\n): SkillDescriptor | undefined {\n const haystack = intent.normalize('NFKC').toLocaleLowerCase().trim();\n if (!haystack) return undefined;\n const scored = skills\n .filter((skill) => skill.agentName && skill.keywords?.length)\n .map((skill) => ({ skill, score: keywordAffinity(skill.keywords ?? [], haystack) }))\n .filter((entry) => entry.score > 0)\n .sort((left, right) => right.score - left.score\n || left.skill.qualifiedName.localeCompare(right.skill.qualifiedName));\n if (!scored[0] || scored[0].score === scored[1]?.score) return undefined;\n return scored[0].skill;\n}\n\nfunction keywordAffinity(keywords: readonly string[], normalizedIntent: string): number {\n let score = 0;\n for (const value of new Set(keywords)) {\n const keyword = value.normalize('NFKC').toLocaleLowerCase().trim();\n if (keyword && normalizedIntent.includes(keyword)) score += [...keyword].length;\n }\n return score;\n}\n\nfunction recordOf(value: unknown): Record<string, unknown> {\n return value && typeof value === 'object' ? value as Record<string, unknown> : {};\n}\n"]}
|
|
1
|
+
{"version":3,"file":"deferred-capability-plan.js","sourceRoot":"","sources":["../../src/plugin-runtime/deferred-capability-plan.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n addSkillToSnapshot,\n getLoadedToolNamesFromSnapshot,\n touchToolInSnapshot,\n touchToolsInSnapshot,\n type AgentTool,\n type TextContentBlock,\n type DeferredToolSessionSnapshot,\n} from '@zhin.js/ai';\nimport {\n toolInputSchemaToParameters,\n type ToolInvocationContext,\n type ToolInputSchema,\n} from '@zhin.js/tool';\nimport type { SkillDescriptor } from '@zhin.js/skill';\nimport { getLogger } from '@zhin.js/logger';\nimport { rankDecisionCandidates } from '../decision/rank.js';\nimport type { AgentDecisionRuntime } from '../decision/types.js';\nimport { buildDeferredStats, buildToolCatalog, discoverInCatalog, resolveDeferredApiTools } from '../tool-catalog/tool-catalog.js';\nimport { resolveDeferredToolsConfig } from '../tool-catalog/resolve-config.js';\nimport { DEFERRED_META_TOOL_NAMES, type ToolCatalogItem } from '../tool-catalog/types.js';\nimport type { AgentCapabilities, ToolCapability } from './capability-ingress.js';\n\nimport { skillContextBlock } from '../context/skill-context.js';\n\nconst logger = getLogger('DeferredCapabilityPlan');\n\n/**\n * Injected capability ceiling. It must return a subset of the given projection\n * and throw when the projection is not trusted by the ceiling's owner.\n */\nexport interface DeferredCapabilityCeiling {\n project(capabilities: AgentCapabilities): Readonly<Pick<AgentCapabilities, 'tools' | 'skills'>>;\n}\n\n/**\n * Reserved, model-invisible control namespace of the Agent runtime. Control\n * tools use this prefix and it is always filtered out of model-visible\n * capabilities. It is a naming convention, not a dependency on Workroom code.\n */\nexport const RESERVED_CONTROL_TOOL_PREFIX = 'workroom_';\n\n/**\n * Reserved model-invisible control namespace; always filtered out of\n * model-visible capabilities.\n */\nexport function isReservedControlToolName(name: string): boolean {\n return (name.split('__').at(-1) ?? name).startsWith(RESERVED_CONTROL_TOOL_PREFIX);\n}\n\nexport interface DeferredCapabilityController {\n loadedToolNames(): string[];\n loadedSkillInstructions(): string[];\n loadedSkillBlocks(): TextContentBlock[];\n /** Marks only a successful, unmodified runtime load_skill result. */\n modelOutputBlocks(name: string, args: unknown, text: string): TextContentBlock[] | undefined;\n /** Load a public catalog tool into the session. Returns false when it is not in this turn's catalog. */\n load(name: string): Promise<boolean>;\n}\n\nexport interface DeferredCapabilityPlan {\n readonly capabilities: readonly ToolCapability[];\n readonly allTools: readonly AgentTool[];\n readonly resolvedTools: readonly AgentTool[];\n readonly catalog: readonly ToolCatalogItem[];\n readonly deferredStats: string;\n readonly controller: DeferredCapabilityController;\n}\n\n/**\n * The legacy `authority` option no longer exists; passing it at runtime throws\n * (fail-closed) instead of being silently ignored.\n */\nexport interface DeferredCapabilityPlanOptions {\n readonly capabilities: AgentCapabilities;\n /**\n * Optional injected capability ceiling (e.g. a Workroom Assignment).\n * Ordinary chat omits it and retains its own capability projection.\n */\n readonly ceiling?: DeferredCapabilityCeiling;\n readonly sessionSnapshot: DeferredToolSessionSnapshot;\n readonly config: Parameters<typeof resolveDeferredToolsConfig>[0];\n readonly platform?: string;\n readonly persistSnapshot: (snapshot: DeferredToolSessionSnapshot) => Promise<void>;\n readonly decision?: AgentDecisionRuntime;\n}\n\nexport interface AgentSkillIntentPrimeResult {\n readonly snapshot: DeferredToolSessionSnapshot;\n readonly skill?: SkillDescriptor;\n readonly skills?: readonly SkillDescriptor[];\n}\n\n/**\n * Deterministically activates one Agent-private Skill when the current intent\n * has a unique best keyword match. Public Skills and ambiguous matches remain\n * deferred so the runtime keeps its progressive-disclosure boundary.\n */\nexport function primeAgentSkillForIntent(options: Readonly<{\n capabilities: Pick<AgentCapabilities, 'tools' | 'skills'>;\n sessionSnapshot: DeferredToolSessionSnapshot;\n intent: string;\n config: DeferredCapabilityPlanOptions['config'];\n}>): AgentSkillIntentPrimeResult {\n const snapshot = projectSessionSnapshot(options.sessionSnapshot, options.capabilities);\n const skill = uniqueBestAgentSkill(options.capabilities.skills, options.intent);\n if (!skill) return Object.freeze({ snapshot });\n\n const config = resolveDeferredToolsConfig(options.config);\n const withTools = activateSkill(\n snapshot,\n skill,\n options.capabilities.tools,\n config.maxLoadedPerSession,\n new Set(config.alwaysLoadedTools),\n );\n return Object.freeze({ snapshot: withTools, skill });\n}\n\n/** Model recommendation never enlarges the immutable, already-authorized projection. */\nexport async function primeSkillsForIntent(options: Readonly<{\n capabilities: Pick<AgentCapabilities, 'tools' | 'skills'>;\n sessionSnapshot: DeferredToolSessionSnapshot;\n intent: string;\n config: DeferredCapabilityPlanOptions['config'];\n decision?: AgentDecisionRuntime;\n signal: AbortSignal;\n}>): Promise<AgentSkillIntentPrimeResult> {\n const ranking = await rankDecisionCandidates(options.decision, 'skills', options.intent,\n options.capabilities.skills.map(skill => ({ name: skill.qualifiedName, description: skill.description })),\n options.signal);\n if (!ranking.applied) return primeAgentSkillForIntent(options);\n const maxSelections = options.decision?.config.skills?.maxSelections ?? 2;\n const skills = ranking.selectedNames.slice(0, maxSelections).flatMap(name => {\n const skill = options.capabilities.skills.find(candidate => candidate.qualifiedName === name);\n return skill ? [skill] : [];\n });\n const config = resolveDeferredToolsConfig(options.config);\n let snapshot = projectSessionSnapshot(options.sessionSnapshot, options.capabilities);\n for (const skill of [...skills].reverse()) {\n snapshot = activateSkill(\n snapshot,\n skill,\n options.capabilities.tools,\n config.maxLoadedPerSession,\n new Set(config.alwaysLoadedTools),\n );\n }\n return Object.freeze({ snapshot, skill: skills[0], skills: Object.freeze(skills) });\n}\n\n/**\n * Turn-owned deferred capability authority. It has no filesystem, registry,\n * AsyncLocalStorage, or classic Tool dependency: everything comes from the\n * immutable generation projection and the session snapshot.\n */\nexport function createDeferredCapabilityPlan(\n options: DeferredCapabilityPlanOptions,\n): DeferredCapabilityPlan {\n if (options !== null && typeof options === 'object' && 'authority' in options) {\n throw new Error('createDeferredCapabilityPlan no longer accepts \"authority\"; use createWorkroomDeferredCapabilityPlan or pass an injected \"ceiling\"');\n }\n const config = resolveDeferredToolsConfig(options.config);\n const alwaysLoaded = new Set(config.alwaysLoadedTools);\n const projected = projectCapabilities(options.capabilities, options.ceiling);\n const executableCapabilities = projected.tools.filter(\n (tool) => (!tool.hidden || tool.placement !== undefined)\n && !DEFERRED_META_TOOL_NAMES.has(tool.name)\n && !isReservedControlToolName(tool.name),\n );\n const publicCapabilities = executableCapabilities.filter(\n (tool) => !tool.hidden\n );\n // Platform-scoped adapter tools already passed canAccess for this turn.\n // Keep them in the model tool list so QQ/social actions are not hidden behind discover.\n for (const tool of publicCapabilities) {\n if (tool.platforms?.length) alwaysLoaded.add(tool.name);\n }\n // Plugin authors may opt a tool into the resident set (#857 P1-10).\n for (const name of declaredResidentToolNames(publicCapabilities, options.config)) {\n alwaysLoaded.add(name);\n }\n const publicTools = publicCapabilities.map(capabilityAsAgentTool);\n const publicCatalog = buildToolCatalog({ tools: publicTools, alwaysLoaded });\n let snapshot = projectSessionSnapshot(options.sessionSnapshot, projected);\n\n const persist = async (next: DeferredToolSessionSnapshot): Promise<void> => {\n snapshot = next;\n await options.persistSnapshot(structuredClone(snapshot));\n };\n\n const metaCapabilities = createMetaCapabilities({\n owner: options.capabilities.owner,\n catalog: publicCatalog,\n skills: projected.skills,\n tools: executableCapabilities,\n platform: options.platform,\n topK: config.discoverTopK,\n maxLoaded: config.maxLoadedPerSession,\n pinned: alwaysLoaded,\n getSnapshot: () => snapshot,\n persist,\n decision: options.decision,\n });\n const capabilities = Object.freeze([...executableCapabilities, ...metaCapabilities]);\n const allTools = capabilities.map(capabilityAsAgentTool);\n const catalog = buildToolCatalog({ tools: allTools, alwaysLoaded });\n const publicToolNames = new Set(publicCatalog.map(item => item.name));\n const controller: DeferredCapabilityController = Object.freeze({\n loadedToolNames: () => getLoadedToolNamesFromSnapshot(snapshot),\n loadedSkillInstructions: () => loadedSkillInstructions(projected.skills, snapshot),\n loadedSkillBlocks: () => loadedSkills(projected.skills, snapshot).map(skillContextBlock),\n modelOutputBlocks: (name: string, args: unknown, text: string): TextContentBlock[] | undefined => {\n if (name !== 'load_skill') return undefined;\n const skill = resolveSkill(projected.skills, String(recordOf(args).name ?? ''));\n if (!skill) return undefined;\n const block = skillContextBlock(skill);\n const expected = skillLoadResult(skill, executableCapabilities);\n if (!text.startsWith(expected)) return undefined;\n return [block, { type: 'text', text: text.slice(block.text.length) }];\n },\n load: async (name: string) => {\n if (!publicToolNames.has(name)) return false;\n if (!alwaysLoaded.has(name)) {\n await persist(touchToolInSnapshot(snapshot, name, config.maxLoadedPerSession));\n }\n return true;\n },\n });\n const resolvedTools = resolveDeferredApiTools(\n catalog,\n alwaysLoaded,\n controller.loadedToolNames(),\n );\n\n return Object.freeze({\n capabilities,\n allTools: Object.freeze(allTools),\n resolvedTools: Object.freeze(resolvedTools),\n catalog: Object.freeze(catalog),\n deferredStats: buildDeferredStats(catalog, resolvedTools),\n controller,\n });\n}\n\n/**\n * Upper bound on plugin tools that may become resident through their own\n * `alwaysLoaded: true` flag in one turn. Each resident schema is sent on every\n * model call, so a misbehaving plugin set must not silently flood the context.\n * Tools past the limit stay deferred (still reachable via `discover` /\n * `load_tool`) and a warning names them once. Operators who need more can list\n * tools in `deferredTools.alwaysLoadedTools`, which this limit does not touch.\n */\nexport const MAX_DECLARED_RESIDENT_TOOLS = 8;\n\nconst warnedOverLimitTools = new Set<string>();\n\n/**\n * Names of public tools whose author set `alwaysLoaded: true`, in projection\n * order and capped at {@link MAX_DECLARED_RESIDENT_TOOLS}.\n *\n * - Absent or `false` keeps the tool deferred (the default for every plugin).\n * - `deferredTools.alwaysLoadedMode: replace` means the operator's list is the\n * complete resident set, so author declarations are ignored.\n * - Only public (non-hidden) capabilities that already passed ingress and the\n * capability ceiling are considered; the flag never grants access.\n */\nexport function declaredResidentToolNames(\n tools: readonly Pick<ToolCapability, 'name' | 'alwaysLoaded'>[],\n config: DeferredCapabilityPlanOptions['config'],\n): string[] {\n if (config.deferredTools?.alwaysLoadedMode === 'replace') return [];\n const declared = tools.filter(tool => tool.alwaysLoaded === true).map(tool => tool.name);\n const overLimit = declared.slice(MAX_DECLARED_RESIDENT_TOOLS)\n .filter(name => !warnedOverLimitTools.has(name));\n if (overLimit.length > 0) {\n for (const name of overLimit) warnedOverLimitTools.add(name);\n logger.warn(\n `${declared.length} plugin tools declare alwaysLoaded; only the first ${MAX_DECLARED_RESIDENT_TOOLS} are resident. `\n + `Still deferred: ${overLimit.join(', ')}. List them in ai.agent.deferredTools.alwaysLoadedTools to keep them loaded.`,\n );\n }\n return declared.slice(0, MAX_DECLARED_RESIDENT_TOOLS);\n}\n\nfunction projectCapabilities(\n capabilities: AgentCapabilities,\n ceiling: DeferredCapabilityCeiling | undefined,\n): Readonly<Pick<AgentCapabilities, 'tools' | 'skills'>> {\n if (!ceiling) {\n return Object.freeze({\n tools: Object.freeze(capabilities.tools.filter(tool => !isReservedControlToolName(tool.name))),\n skills: capabilities.skills,\n });\n }\n const out = ceiling.project(capabilities);\n if (!out || !Array.isArray(out.tools) || !Array.isArray(out.skills)) {\n throw new Error('capability ceiling must return arrays for tools and skills');\n }\n const allowedTools = new Set<ToolCapability>(capabilities.tools);\n const allowedSkills = new Set<SkillDescriptor>(capabilities.skills);\n for (const tool of out.tools) {\n if (!allowedTools.has(tool)) {\n throw new Error(`capability ceiling returned a tool/skill that is not part of the input projection: tool \"${tool?.name}\"`);\n }\n }\n for (const skill of out.skills) {\n if (!allowedSkills.has(skill)) {\n throw new Error(`capability ceiling returned a tool/skill that is not part of the input projection: skill \"${skill?.qualifiedName}\"`);\n }\n }\n return Object.freeze(out);\n}\n\nfunction projectSessionSnapshot(\n snapshot: DeferredToolSessionSnapshot,\n capabilities: Readonly<Pick<AgentCapabilities, 'tools' | 'skills'>>,\n): DeferredToolSessionSnapshot {\n const allowedSkills = new Set(capabilities.skills.flatMap(\n skill => [skill.qualifiedName, skill.name],\n ));\n const loadedSkills = snapshot.loadedSkills.filter(name => allowedSkills.has(name));\n const allowedTools = new Set(capabilities.tools\n .filter((tool) => !tool.hidden)\n .map((tool) => tool.name));\n const loadedSkillNames = new Set(loadedSkills);\n for (const skill of capabilities.skills) {\n if (!loadedSkillNames.has(skill.qualifiedName) && !loadedSkillNames.has(skill.name)) continue;\n for (const tool of resolveSkillTools(skill, capabilities.tools)) allowedTools.add(tool);\n }\n return {\n loadedTools: Object.fromEntries(Object.entries(snapshot.loadedTools)\n .filter(([name]) => allowedTools.has(name))),\n loadedSkills,\n };\n}\n\nexport function capabilityAsAgentTool(tool: ToolCapability): AgentTool {\n const parameters = toolInputSchemaToParameters(tool.inputSchema);\n const modelParameters = structuredClone(parameters) as AgentTool['parameters'];\n return Object.freeze({\n name: tool.name,\n description: tool.description,\n parameters: modelParameters,\n source: tool.source,\n permissions: tool.permissions,\n tags: tool.tags ? [...tool.tags] : undefined,\n keywords: tool.keywords ? [...tool.keywords] : undefined,\n requiresApproval: tool.requiresApproval,\n execute: async () => {\n throw new Error(`AgentCore must execute capability ${tool.name} through ToolExecutionAuthority`);\n },\n });\n}\n\ninterface MetaCapabilityOptions {\n readonly owner: AgentCapabilities['owner'];\n readonly catalog: readonly ToolCatalogItem[];\n readonly skills: readonly SkillDescriptor[];\n readonly tools: readonly ToolCapability[];\n readonly platform?: string;\n readonly topK: number;\n readonly maxLoaded: number;\n /** Always-loaded tools: never written to the snapshot, so they never count against `maxLoaded`. */\n readonly pinned: ReadonlySet<string>;\n readonly getSnapshot: () => DeferredToolSessionSnapshot;\n readonly persist: (snapshot: DeferredToolSessionSnapshot) => Promise<void>;\n readonly decision?: AgentDecisionRuntime;\n}\n\nfunction createMetaCapabilities(options: MetaCapabilityOptions): readonly ToolCapability[] {\n const byName = new Map(options.catalog.map((item) => [item.name, item]));\n return Object.freeze([\n metaCapability(options.owner, 'discover', 'Search deferred tools and skills by intent.', {\n type: 'object',\n properties: {\n query: { type: 'string' },\n kind: { type: 'string', enum: ['tool', 'skill', 'all'] },\n },\n }, async (raw, invocation) => {\n const input = recordOf(raw);\n const query = typeof input.query === 'string' ? input.query.trim() : '';\n const kind = input.kind === 'tool' || input.kind === 'skill' ? input.kind : 'all';\n const catalog = disclosedToolCatalog(options);\n const fallbackTools = kind === 'skill' ? [] : discoverInCatalog({\n query,\n kind: 'tool',\n topK: options.topK,\n platform: options.platform,\n skillRegistry: null,\n catalog,\n });\n const fallbackSkills = kind === 'tool' ? [] : discoverSkills(options.skills, query, options.topK);\n const [rankedTools, rankedSkills] = query ? await Promise.all([\n kind === 'skill' ? undefined : rankDecisionCandidates(options.decision, 'tools', query,\n catalog.map(item => ({ name: item.name, description: item.fullTool.description })), invocation.signal),\n kind === 'tool' ? undefined : rankDecisionCandidates(options.decision, 'skills', query,\n options.skills.map(skill => ({ name: skill.qualifiedName, description: skill.description })), invocation.signal),\n ]) : [];\n const tools = rankedTools?.applied\n ? rankedTools.selectedNames.flatMap(name => {\n const item = catalog.find(candidate => candidate.name === name);\n return item ? [{ kind: 'tool' as const, name, brief: item.brief }] : [];\n }) : fallbackTools;\n const skills = rankedSkills?.applied\n ? rankedSkills.selectedNames.flatMap(name => {\n const skill = options.skills.find(candidate => candidate.qualifiedName === name);\n return skill ? [{ kind: 'skill' as const, name, brief: skill.description }] : [];\n }) : fallbackSkills;\n const rows = [...tools, ...skills];\n return rows.length > 0\n ? rows.map((item) => `- [${item.kind}] ${item.name}: ${item.brief}`).join('\\n')\n : 'No matches.';\n }),\n metaCapability(options.owner, 'load_tool', 'Load a deferred tool schema into this session.', {\n type: 'object',\n properties: { name: { type: 'string' } },\n required: ['name'],\n }, async (raw) => {\n const name = String(recordOf(raw).name ?? '');\n const item = byName.get(name);\n if (!item) return `Tool \"${name}\" not found in catalog.`;\n if (!options.pinned.has(name)) {\n await options.persist(touchToolInSnapshot(options.getSnapshot(), name, options.maxLoaded));\n }\n return `Loaded tool \"${name}\". Use its tool definition for arguments.\\n__zhin_tools_mutated__`;\n }),\n metaCapability(options.owner, 'load_skill', 'Load projected skill instructions into this session.', {\n type: 'object',\n properties: { name: { type: 'string' } },\n required: ['name'],\n }, async (raw) => {\n const name = String(recordOf(raw).name ?? '');\n const skill = resolveSkill(options.skills, name);\n if (!skill) return `Skill '${name}' not found in the active generation.`;\n await options.persist(\n activateSkill(options.getSnapshot(), skill, options.tools, options.maxLoaded, options.pinned),\n );\n return skillLoadResult(skill, options.tools);\n }),\n ]);\n}\n\nfunction metaCapability(\n owner: AgentCapabilities['owner'],\n name: string,\n description: string,\n inputSchema: ToolInputSchema,\n execute: (input: unknown, context: ToolInvocationContext) => Promise<unknown>,\n): ToolCapability {\n return Object.freeze({\n owner,\n name,\n qualifiedName: name,\n description,\n inputSchema,\n requiresApproval: 'never',\n source: 'builtin:agent-runtime',\n execute: <TInput = unknown, TResult = unknown>(input: TInput, context: ToolInvocationContext) =>\n execute(input, context) as Promise<TResult>,\n });\n}\n\nfunction discoverSkills(\n skills: readonly SkillDescriptor[],\n query: string,\n topK: number,\n): Array<{ kind: 'skill'; name: string; brief: string }> {\n const needle = query.toLocaleLowerCase();\n return skills\n .filter((skill) => !needle || [\n skill.qualifiedName,\n skill.description,\n ...(skill.keywords ?? []),\n ...(skill.tags ?? []),\n ].join(' ').toLocaleLowerCase().includes(needle))\n .slice(0, topK)\n .map((skill) => ({ kind: 'skill', name: skill.qualifiedName, brief: skill.description }));\n}\n\nfunction resolveSkill(skills: readonly SkillDescriptor[], name: string): SkillDescriptor | undefined {\n const matches = skills.filter((skill) => skill.qualifiedName === name || skill.name === name);\n return matches.length === 1 ? matches[0] : undefined;\n}\n\nfunction loadedSkillInstructions(\n skills: readonly SkillDescriptor[],\n snapshot: DeferredToolSessionSnapshot,\n): string[] {\n return loadedSkills(skills, snapshot).map(skill => skill.instructions);\n}\n\nfunction loadedSkills(skills: readonly SkillDescriptor[], snapshot: DeferredToolSessionSnapshot): SkillDescriptor[] {\n const loaded = new Set(snapshot.loadedSkills);\n return skills.filter(skill => skill.always === true || loaded.has(skill.qualifiedName) || loaded.has(skill.name));\n}\n\nfunction skillLoadResult(skill: SkillDescriptor, tools: readonly ToolCapability[]): string {\n const names = resolveSkillTools(skill, tools);\n const unlocked = names.length ? `\\nUnlocked tools: ${names.join(', ')}` : '';\n return `${skillContextBlock(skill).text}${unlocked}\\n__zhin_tools_mutated__`;\n}\n\nfunction activateSkill(\n snapshot: DeferredToolSessionSnapshot,\n skill: SkillDescriptor,\n tools: readonly ToolCapability[],\n maxLoaded: number,\n pinned: ReadonlySet<string>,\n): DeferredToolSessionSnapshot {\n const toolNames = resolveSkillTools(skill, tools).filter(name => !pinned.has(name));\n return touchToolsInSnapshot(addSkillToSnapshot(snapshot, skill.qualifiedName), toolNames, maxLoaded);\n}\n\nfunction disclosedToolCatalog(options: MetaCapabilityOptions): ToolCatalogItem[] {\n const loaded = new Set(getLoadedToolNamesFromSnapshot(options.getSnapshot()));\n const privateTools = options.tools.filter(tool => tool.hidden && loaded.has(tool.name));\n return [...options.catalog,\n ...buildToolCatalog({ tools: privateTools.map(capabilityAsAgentTool), alwaysLoaded: new Set<string>() })];\n}\n\nfunction resolveSkillTools(\n skill: SkillDescriptor,\n tools: readonly ToolCapability[],\n): string[] {\n const requested = new Set(skill.toolNames ?? []);\n if (requested.size === 0) return [];\n return tools.filter((tool) => tool.owner === skill.owner\n && belongsToSkill(tool, skill) && [...requested].some(\n name => tool.name === name || tool.name.endsWith(`__${name}`),\n )).map((tool) => tool.name);\n}\n\nfunction belongsToSkill(tool: ToolCapability, skill: SkillDescriptor): boolean {\n const placement = tool.placement;\n if (!placement) return !tool.hidden;\n if (placement.kind === 'agent') return placement.agent === skill.agentName;\n if (placement.kind === 'skill') return !skill.agentName && placement.skill === skill.name;\n return placement.agent === skill.agentName && placement.skill === skill.name;\n}\n\nfunction uniqueBestAgentSkill(\n skills: readonly SkillDescriptor[],\n intent: string,\n): SkillDescriptor | undefined {\n const haystack = intent.normalize('NFKC').toLocaleLowerCase().trim();\n if (!haystack) return undefined;\n const scored = skills\n .filter((skill) => skill.agentName && skill.keywords?.length)\n .map((skill) => ({ skill, score: keywordAffinity(skill.keywords ?? [], haystack) }))\n .filter((entry) => entry.score > 0)\n .sort((left, right) => right.score - left.score\n || left.skill.qualifiedName.localeCompare(right.skill.qualifiedName));\n if (!scored[0] || scored[0].score === scored[1]?.score) return undefined;\n return scored[0].skill;\n}\n\nfunction keywordAffinity(keywords: readonly string[], normalizedIntent: string): number {\n let score = 0;\n for (const value of new Set(keywords)) {\n const keyword = value.normalize('NFKC').toLocaleLowerCase().trim();\n if (keyword && normalizedIntent.includes(keyword)) score += [...keyword].length;\n }\n return score;\n}\n\nfunction recordOf(value: unknown): Record<string, unknown> {\n return value && typeof value === 'object' ? value as Record<string, unknown> : {};\n}\n"]}
|
|
@@ -138,6 +138,7 @@ async function* runInteractiveTurn(options, context, prep, payload) {
|
|
|
138
138
|
deferredStats: plan.deferredStats,
|
|
139
139
|
mode: context.turn.input.media?.some((item) => item.kind === 'image') ? 'vision' : undefined,
|
|
140
140
|
activeSkillsContext,
|
|
141
|
+
activeSkillBlocks: plan.controller.loadedSkillBlocks(),
|
|
141
142
|
toldLedger: host.toldLedger?.render(prep.sessionId),
|
|
142
143
|
relevantMemory,
|
|
143
144
|
});
|