@xenosystem/agent-interface-host 0.1.3
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/LICENSE +67 -0
- package/dist/acp/AcpAgentRegistryService.d.ts +77 -0
- package/dist/acp/AcpAgentRegistryService.d.ts.map +1 -0
- package/dist/acp/AcpAgentRegistryService.js +754 -0
- package/dist/acp/AcpAgentRegistryService.js.map +1 -0
- package/dist/acp/AcpAgentTurnExecutionAdapter.d.ts +56 -0
- package/dist/acp/AcpAgentTurnExecutionAdapter.d.ts.map +1 -0
- package/dist/acp/AcpAgentTurnExecutionAdapter.js +323 -0
- package/dist/acp/AcpAgentTurnExecutionAdapter.js.map +1 -0
- package/dist/acp/AcpApprovalPortAdapter.d.ts +41 -0
- package/dist/acp/AcpApprovalPortAdapter.d.ts.map +1 -0
- package/dist/acp/AcpApprovalPortAdapter.js +82 -0
- package/dist/acp/AcpApprovalPortAdapter.js.map +1 -0
- package/dist/acp/AcpCoordinationBridge.d.ts +13 -0
- package/dist/acp/AcpCoordinationBridge.d.ts.map +1 -0
- package/dist/acp/AcpCoordinationBridge.js +13 -0
- package/dist/acp/AcpCoordinationBridge.js.map +1 -0
- package/dist/acp/AcpDiagnosticsService.d.ts +61 -0
- package/dist/acp/AcpDiagnosticsService.d.ts.map +1 -0
- package/dist/acp/AcpDiagnosticsService.js +203 -0
- package/dist/acp/AcpDiagnosticsService.js.map +1 -0
- package/dist/acp/AcpExternalCertificationHarness.d.ts +47 -0
- package/dist/acp/AcpExternalCertificationHarness.d.ts.map +1 -0
- package/dist/acp/AcpExternalCertificationHarness.js +176 -0
- package/dist/acp/AcpExternalCertificationHarness.js.map +1 -0
- package/dist/acp/AcpHostBridge.d.ts +81 -0
- package/dist/acp/AcpHostBridge.d.ts.map +1 -0
- package/dist/acp/AcpHostBridge.js +101 -0
- package/dist/acp/AcpHostBridge.js.map +1 -0
- package/dist/acp/AcpInteractivePermissionBridge.d.ts +77 -0
- package/dist/acp/AcpInteractivePermissionBridge.d.ts.map +1 -0
- package/dist/acp/AcpInteractivePermissionBridge.js +127 -0
- package/dist/acp/AcpInteractivePermissionBridge.js.map +1 -0
- package/dist/acp/AcpPermissionBridge.d.ts +19 -0
- package/dist/acp/AcpPermissionBridge.d.ts.map +1 -0
- package/dist/acp/AcpPermissionBridge.js +110 -0
- package/dist/acp/AcpPermissionBridge.js.map +1 -0
- package/dist/acp/AcpPermissionPolicy.d.ts +111 -0
- package/dist/acp/AcpPermissionPolicy.d.ts.map +1 -0
- package/dist/acp/AcpPermissionPolicy.js +167 -0
- package/dist/acp/AcpPermissionPolicy.js.map +1 -0
- package/dist/acp/AcpProcessSupervisor.d.ts +134 -0
- package/dist/acp/AcpProcessSupervisor.d.ts.map +1 -0
- package/dist/acp/AcpProcessSupervisor.js +674 -0
- package/dist/acp/AcpProcessSupervisor.js.map +1 -0
- package/dist/acp/AcpProviderApprovalService.d.ts +27 -0
- package/dist/acp/AcpProviderApprovalService.d.ts.map +1 -0
- package/dist/acp/AcpProviderApprovalService.js +128 -0
- package/dist/acp/AcpProviderApprovalService.js.map +1 -0
- package/dist/acp/AcpProviderCatalogService.d.ts +69 -0
- package/dist/acp/AcpProviderCatalogService.d.ts.map +1 -0
- package/dist/acp/AcpProviderCatalogService.js +707 -0
- package/dist/acp/AcpProviderCatalogService.js.map +1 -0
- package/dist/acp/AcpProviderModelService.d.ts +6 -0
- package/dist/acp/AcpProviderModelService.d.ts.map +1 -0
- package/dist/acp/AcpProviderModelService.js +274 -0
- package/dist/acp/AcpProviderModelService.js.map +1 -0
- package/dist/acp/AcpProviderVersionReadiness.d.ts +6 -0
- package/dist/acp/AcpProviderVersionReadiness.d.ts.map +1 -0
- package/dist/acp/AcpProviderVersionReadiness.js +100 -0
- package/dist/acp/AcpProviderVersionReadiness.js.map +1 -0
- package/dist/acp/AcpRuntimeEventMapper.d.ts +16 -0
- package/dist/acp/AcpRuntimeEventMapper.d.ts.map +1 -0
- package/dist/acp/AcpRuntimeEventMapper.js +326 -0
- package/dist/acp/AcpRuntimeEventMapper.js.map +1 -0
- package/dist/acp/AcpSessionService.d.ts +65 -0
- package/dist/acp/AcpSessionService.d.ts.map +1 -0
- package/dist/acp/AcpSessionService.js +931 -0
- package/dist/acp/AcpSessionService.js.map +1 -0
- package/dist/acp/DurableAcpPermissionPolicyStore.d.ts +25 -0
- package/dist/acp/DurableAcpPermissionPolicyStore.d.ts.map +1 -0
- package/dist/acp/DurableAcpPermissionPolicyStore.js +100 -0
- package/dist/acp/DurableAcpPermissionPolicyStore.js.map +1 -0
- package/dist/acp/acpCommandSafety.d.ts +63 -0
- package/dist/acp/acpCommandSafety.d.ts.map +1 -0
- package/dist/acp/acpCommandSafety.js +90 -0
- package/dist/acp/acpCommandSafety.js.map +1 -0
- package/dist/acp/acpErrors.d.ts +47 -0
- package/dist/acp/acpErrors.d.ts.map +1 -0
- package/dist/acp/acpErrors.js +93 -0
- package/dist/acp/acpErrors.js.map +1 -0
- package/dist/acp/acpRedaction.d.ts +9 -0
- package/dist/acp/acpRedaction.d.ts.map +1 -0
- package/dist/acp/acpRedaction.js +69 -0
- package/dist/acp/acpRedaction.js.map +1 -0
- package/dist/acp/acpSessionResume.d.ts +8 -0
- package/dist/acp/acpSessionResume.d.ts.map +1 -0
- package/dist/acp/acpSessionResume.js +31 -0
- package/dist/acp/acpSessionResume.js.map +1 -0
- package/dist/acp/acpTypes.d.ts +467 -0
- package/dist/acp/acpTypes.d.ts.map +1 -0
- package/dist/acp/acpTypes.js +2 -0
- package/dist/acp/acpTypes.js.map +1 -0
- package/dist/agent/chooseDirectoryBridge.d.ts +29 -0
- package/dist/agent/chooseDirectoryBridge.d.ts.map +1 -0
- package/dist/agent/chooseDirectoryBridge.js +116 -0
- package/dist/agent/chooseDirectoryBridge.js.map +1 -0
- package/dist/agent/permissionProfiles.d.ts +29 -0
- package/dist/agent/permissionProfiles.d.ts.map +1 -0
- package/dist/agent/permissionProfiles.js +107 -0
- package/dist/agent/permissionProfiles.js.map +1 -0
- package/dist/agent/runtimeAuthorityPrompt.d.ts +13 -0
- package/dist/agent/runtimeAuthorityPrompt.d.ts.map +1 -0
- package/dist/agent/runtimeAuthorityPrompt.js +45 -0
- package/dist/agent/runtimeAuthorityPrompt.js.map +1 -0
- package/dist/agent/runtimeModeOutputGuard.d.ts +6 -0
- package/dist/agent/runtimeModeOutputGuard.d.ts.map +1 -0
- package/dist/agent/runtimeModeOutputGuard.js +40 -0
- package/dist/agent/runtimeModeOutputGuard.js.map +1 -0
- package/dist/agent/workspacePlacementBridge.d.ts +29 -0
- package/dist/agent/workspacePlacementBridge.d.ts.map +1 -0
- package/dist/agent/workspacePlacementBridge.js +143 -0
- package/dist/agent/workspacePlacementBridge.js.map +1 -0
- package/dist/agentSearch/AgentSearchService.d.ts +81 -0
- package/dist/agentSearch/AgentSearchService.d.ts.map +1 -0
- package/dist/agentSearch/AgentSearchService.js +1038 -0
- package/dist/agentSearch/AgentSearchService.js.map +1 -0
- package/dist/agentSearch/JsonInvertedIndexAdapter.d.ts +44 -0
- package/dist/agentSearch/JsonInvertedIndexAdapter.d.ts.map +1 -0
- package/dist/agentSearch/JsonInvertedIndexAdapter.js +307 -0
- package/dist/agentSearch/JsonInvertedIndexAdapter.js.map +1 -0
- package/dist/agentSearch/SearchIndexAdapter.d.ts +33 -0
- package/dist/agentSearch/SearchIndexAdapter.d.ts.map +1 -0
- package/dist/agentSearch/SearchIndexAdapter.js +2 -0
- package/dist/agentSearch/SearchIndexAdapter.js.map +1 -0
- package/dist/agentSearch/SearchSourceWatcher.d.ts +29 -0
- package/dist/agentSearch/SearchSourceWatcher.d.ts.map +1 -0
- package/dist/agentSearch/SearchSourceWatcher.js +150 -0
- package/dist/agentSearch/SearchSourceWatcher.js.map +1 -0
- package/dist/agentSearch/SqliteFtsIndexAdapter.d.ts +58 -0
- package/dist/agentSearch/SqliteFtsIndexAdapter.d.ts.map +1 -0
- package/dist/agentSearch/SqliteFtsIndexAdapter.js +420 -0
- package/dist/agentSearch/SqliteFtsIndexAdapter.js.map +1 -0
- package/dist/agentSearch/conversationIndexer.d.ts +69 -0
- package/dist/agentSearch/conversationIndexer.d.ts.map +1 -0
- package/dist/agentSearch/conversationIndexer.js +313 -0
- package/dist/agentSearch/conversationIndexer.js.map +1 -0
- package/dist/agentSearch/searchTypes.d.ts +264 -0
- package/dist/agentSearch/searchTypes.d.ts.map +1 -0
- package/dist/agentSearch/searchTypes.js +2 -0
- package/dist/agentSearch/searchTypes.js.map +1 -0
- package/dist/agentSearch/searchUtils.d.ts +12 -0
- package/dist/agentSearch/searchUtils.d.ts.map +1 -0
- package/dist/agentSearch/searchUtils.js +125 -0
- package/dist/agentSearch/searchUtils.js.map +1 -0
- package/dist/agentSearch/workspaceMetadataIndexer.d.ts +3 -0
- package/dist/agentSearch/workspaceMetadataIndexer.d.ts.map +1 -0
- package/dist/agentSearch/workspaceMetadataIndexer.js +125 -0
- package/dist/agentSearch/workspaceMetadataIndexer.js.map +1 -0
- package/dist/cli/CliControlPlaneService.d.ts +269 -0
- package/dist/cli/CliControlPlaneService.d.ts.map +1 -0
- package/dist/cli/CliControlPlaneService.js +1874 -0
- package/dist/cli/CliControlPlaneService.js.map +1 -0
- package/dist/cloud/XenoCloudAgentTurnExecutionAdapter.d.ts +91 -0
- package/dist/cloud/XenoCloudAgentTurnExecutionAdapter.d.ts.map +1 -0
- package/dist/cloud/XenoCloudAgentTurnExecutionAdapter.js +379 -0
- package/dist/cloud/XenoCloudAgentTurnExecutionAdapter.js.map +1 -0
- package/dist/codebase/CodebaseIntelligenceService.d.ts +68 -0
- package/dist/codebase/CodebaseIntelligenceService.d.ts.map +1 -0
- package/dist/codebase/CodebaseIntelligenceService.js +1717 -0
- package/dist/codebase/CodebaseIntelligenceService.js.map +1 -0
- package/dist/codebase/LanguageServerProcessManager.d.ts +85 -0
- package/dist/codebase/LanguageServerProcessManager.d.ts.map +1 -0
- package/dist/codebase/LanguageServerProcessManager.js +607 -0
- package/dist/codebase/LanguageServerProcessManager.js.map +1 -0
- package/dist/codebase/codeTypes.d.ts +485 -0
- package/dist/codebase/codeTypes.d.ts.map +1 -0
- package/dist/codebase/codeTypes.js +2 -0
- package/dist/codebase/codeTypes.js.map +1 -0
- package/dist/codebase/codeUtils.d.ts +24 -0
- package/dist/codebase/codeUtils.d.ts.map +1 -0
- package/dist/codebase/codeUtils.js +177 -0
- package/dist/codebase/codeUtils.js.map +1 -0
- package/dist/codebase/contextPacks.d.ts +18 -0
- package/dist/codebase/contextPacks.d.ts.map +1 -0
- package/dist/codebase/contextPacks.js +180 -0
- package/dist/codebase/contextPacks.js.map +1 -0
- package/dist/codebase/dependencyGraph.d.ts +3 -0
- package/dist/codebase/dependencyGraph.d.ts.map +1 -0
- package/dist/codebase/dependencyGraph.js +209 -0
- package/dist/codebase/dependencyGraph.js.map +1 -0
- package/dist/codebase/fileIndexer.d.ts +27 -0
- package/dist/codebase/fileIndexer.d.ts.map +1 -0
- package/dist/codebase/fileIndexer.js +167 -0
- package/dist/codebase/fileIndexer.js.map +1 -0
- package/dist/codebase/symbolIndexer.d.ts +3 -0
- package/dist/codebase/symbolIndexer.d.ts.map +1 -0
- package/dist/codebase/symbolIndexer.js +184 -0
- package/dist/codebase/symbolIndexer.js.map +1 -0
- package/dist/codebase/whatChanged.d.ts +4 -0
- package/dist/codebase/whatChanged.d.ts.map +1 -0
- package/dist/codebase/whatChanged.js +138 -0
- package/dist/codebase/whatChanged.js.map +1 -0
- package/dist/coordination/CoordinationService.d.ts +166 -0
- package/dist/coordination/CoordinationService.d.ts.map +1 -0
- package/dist/coordination/CoordinationService.js +247 -0
- package/dist/coordination/CoordinationService.js.map +1 -0
- package/dist/coordination/claims.d.ts +122 -0
- package/dist/coordination/claims.d.ts.map +1 -0
- package/dist/coordination/claims.js +196 -0
- package/dist/coordination/claims.js.map +1 -0
- package/dist/coordination/coordinationTools.d.ts +40 -0
- package/dist/coordination/coordinationTools.d.ts.map +1 -0
- package/dist/coordination/coordinationTools.js +92 -0
- package/dist/coordination/coordinationTools.js.map +1 -0
- package/dist/coordination/laneBridge.d.ts +84 -0
- package/dist/coordination/laneBridge.d.ts.map +1 -0
- package/dist/coordination/laneBridge.js +86 -0
- package/dist/coordination/laneBridge.js.map +1 -0
- package/dist/coordination/messages.d.ts +225 -0
- package/dist/coordination/messages.d.ts.map +1 -0
- package/dist/coordination/messages.js +335 -0
- package/dist/coordination/messages.js.map +1 -0
- package/dist/coordination/permissionWaitRegistry.d.ts +32 -0
- package/dist/coordination/permissionWaitRegistry.d.ts.map +1 -0
- package/dist/coordination/permissionWaitRegistry.js +59 -0
- package/dist/coordination/permissionWaitRegistry.js.map +1 -0
- package/dist/coordination/query.d.ts +187 -0
- package/dist/coordination/query.d.ts.map +1 -0
- package/dist/coordination/query.js +138 -0
- package/dist/coordination/query.js.map +1 -0
- package/dist/coordination/renderInbox.d.ts +15 -0
- package/dist/coordination/renderInbox.d.ts.map +1 -0
- package/dist/coordination/renderInbox.js +19 -0
- package/dist/coordination/renderInbox.js.map +1 -0
- package/dist/coordination/runtimeEvents.d.ts +53 -0
- package/dist/coordination/runtimeEvents.d.ts.map +1 -0
- package/dist/coordination/runtimeEvents.js +112 -0
- package/dist/coordination/runtimeEvents.js.map +1 -0
- package/dist/detachedHostService.d.ts +77 -0
- package/dist/detachedHostService.d.ts.map +1 -0
- package/dist/detachedHostService.js +66 -0
- package/dist/detachedHostService.js.map +1 -0
- package/dist/detachedHostSupervisor.d.ts +102 -0
- package/dist/detachedHostSupervisor.d.ts.map +1 -0
- package/dist/detachedHostSupervisor.js +168 -0
- package/dist/detachedHostSupervisor.js.map +1 -0
- package/dist/durableRuntimeEventStore.d.ts +49 -0
- package/dist/durableRuntimeEventStore.d.ts.map +1 -0
- package/dist/durableRuntimeEventStore.js +364 -0
- package/dist/durableRuntimeEventStore.js.map +1 -0
- package/dist/engineering/EngineeringWorkbenchService.d.ts +142 -0
- package/dist/engineering/EngineeringWorkbenchService.d.ts.map +1 -0
- package/dist/engineering/EngineeringWorkbenchService.js +2301 -0
- package/dist/engineering/EngineeringWorkbenchService.js.map +1 -0
- package/dist/engineering/LandingService.d.ts +112 -0
- package/dist/engineering/LandingService.d.ts.map +1 -0
- package/dist/engineering/LandingService.js +239 -0
- package/dist/engineering/LandingService.js.map +1 -0
- package/dist/engineering/engineeringTypes.d.ts +2 -0
- package/dist/engineering/engineeringTypes.d.ts.map +1 -0
- package/dist/engineering/engineeringTypes.js +2 -0
- package/dist/engineering/engineeringTypes.js.map +1 -0
- package/dist/engineering/patchReview.d.ts +11 -0
- package/dist/engineering/patchReview.d.ts.map +1 -0
- package/dist/engineering/patchReview.js +174 -0
- package/dist/engineering/patchReview.js.map +1 -0
- package/dist/index.d.ts +834 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +3242 -0
- package/dist/index.js.map +1 -0
- package/dist/intake/IntakeService.d.ts +84 -0
- package/dist/intake/IntakeService.d.ts.map +1 -0
- package/dist/intake/IntakeService.js +117 -0
- package/dist/intake/IntakeService.js.map +1 -0
- package/dist/intake/RepositoryTodoIntakeSource.d.ts +72 -0
- package/dist/intake/RepositoryTodoIntakeSource.d.ts.map +1 -0
- package/dist/intake/RepositoryTodoIntakeSource.js +168 -0
- package/dist/intake/RepositoryTodoIntakeSource.js.map +1 -0
- package/dist/intake/WorkspaceTodoIntakeSource.d.ts +53 -0
- package/dist/intake/WorkspaceTodoIntakeSource.d.ts.map +1 -0
- package/dist/intake/WorkspaceTodoIntakeSource.js +81 -0
- package/dist/intake/WorkspaceTodoIntakeSource.js.map +1 -0
- package/dist/isolation/CommandExecution.d.ts +132 -0
- package/dist/isolation/CommandExecution.d.ts.map +1 -0
- package/dist/isolation/CommandExecution.js +48 -0
- package/dist/isolation/CommandExecution.js.map +1 -0
- package/dist/isolation/LocalCommandExecutor.d.ts +27 -0
- package/dist/isolation/LocalCommandExecutor.d.ts.map +1 -0
- package/dist/isolation/LocalCommandExecutor.js +97 -0
- package/dist/isolation/LocalCommandExecutor.js.map +1 -0
- package/dist/isolation/RunExecutionEnvironment.d.ts +135 -0
- package/dist/isolation/RunExecutionEnvironment.d.ts.map +1 -0
- package/dist/isolation/RunExecutionEnvironment.js +206 -0
- package/dist/isolation/RunExecutionEnvironment.js.map +1 -0
- package/dist/isolation/RunIsolationService.d.ts +90 -0
- package/dist/isolation/RunIsolationService.d.ts.map +1 -0
- package/dist/isolation/RunIsolationService.js +86 -0
- package/dist/isolation/RunIsolationService.js.map +1 -0
- package/dist/isolation/SandboxCommandExecutor.d.ts +93 -0
- package/dist/isolation/SandboxCommandExecutor.d.ts.map +1 -0
- package/dist/isolation/SandboxCommandExecutor.js +189 -0
- package/dist/isolation/SandboxCommandExecutor.js.map +1 -0
- package/dist/knowledge/WorkspaceKnowledgeService.d.ts +71 -0
- package/dist/knowledge/WorkspaceKnowledgeService.d.ts.map +1 -0
- package/dist/knowledge/WorkspaceKnowledgeService.js +103 -0
- package/dist/knowledge/WorkspaceKnowledgeService.js.map +1 -0
- package/dist/localHostAuthority.d.ts +24 -0
- package/dist/localHostAuthority.d.ts.map +1 -0
- package/dist/localHostAuthority.js +87 -0
- package/dist/localHostAuthority.js.map +1 -0
- package/dist/localHostLease.d.ts +51 -0
- package/dist/localHostLease.d.ts.map +1 -0
- package/dist/localHostLease.js +167 -0
- package/dist/localHostLease.js.map +1 -0
- package/dist/localHostPaths.d.ts +30 -0
- package/dist/localHostPaths.d.ts.map +1 -0
- package/dist/localHostPaths.js +60 -0
- package/dist/localHostPaths.js.map +1 -0
- package/dist/localRpcTransport.d.ts +21 -0
- package/dist/localRpcTransport.d.ts.map +1 -0
- package/dist/localRpcTransport.js +423 -0
- package/dist/localRpcTransport.js.map +1 -0
- package/dist/node.d.ts +104 -0
- package/dist/node.d.ts.map +1 -0
- package/dist/node.js +103 -0
- package/dist/node.js.map +1 -0
- package/dist/observation/DirectoryBaselineScanner.d.ts +44 -0
- package/dist/observation/DirectoryBaselineScanner.d.ts.map +1 -0
- package/dist/observation/DirectoryBaselineScanner.js +112 -0
- package/dist/observation/DirectoryBaselineScanner.js.map +1 -0
- package/dist/observation/MountContentReader.d.ts +63 -0
- package/dist/observation/MountContentReader.d.ts.map +1 -0
- package/dist/observation/MountContentReader.js +158 -0
- package/dist/observation/MountContentReader.js.map +1 -0
- package/dist/observation/RunObservationService.d.ts +229 -0
- package/dist/observation/RunObservationService.d.ts.map +1 -0
- package/dist/observation/RunObservationService.js +248 -0
- package/dist/observation/RunObservationService.js.map +1 -0
- package/dist/observation/XenoUseObservationSource.d.ts +42 -0
- package/dist/observation/XenoUseObservationSource.d.ts.map +1 -0
- package/dist/observation/XenoUseObservationSource.js +104 -0
- package/dist/observation/XenoUseObservationSource.js.map +1 -0
- package/dist/observation/XenoUseRunObserver.d.ts +140 -0
- package/dist/observation/XenoUseRunObserver.d.ts.map +1 -0
- package/dist/observation/XenoUseRunObserver.js +256 -0
- package/dist/observation/XenoUseRunObserver.js.map +1 -0
- package/dist/pluginMcp/PluginMcpManagerService.d.ts +141 -0
- package/dist/pluginMcp/PluginMcpManagerService.d.ts.map +1 -0
- package/dist/pluginMcp/PluginMcpManagerService.js +1821 -0
- package/dist/pluginMcp/PluginMcpManagerService.js.map +1 -0
- package/dist/pluginMcp/pluginMcpTypes.d.ts +349 -0
- package/dist/pluginMcp/pluginMcpTypes.d.ts.map +1 -0
- package/dist/pluginMcp/pluginMcpTypes.js +2 -0
- package/dist/pluginMcp/pluginMcpTypes.js.map +1 -0
- package/dist/policy/WorkspacePolicyService.d.ts +83 -0
- package/dist/policy/WorkspacePolicyService.d.ts.map +1 -0
- package/dist/policy/WorkspacePolicyService.js +809 -0
- package/dist/policy/WorkspacePolicyService.js.map +1 -0
- package/dist/policy/policyGuard.d.ts +27 -0
- package/dist/policy/policyGuard.d.ts.map +1 -0
- package/dist/policy/policyGuard.js +143 -0
- package/dist/policy/policyGuard.js.map +1 -0
- package/dist/policy/policyTypes.d.ts +190 -0
- package/dist/policy/policyTypes.d.ts.map +1 -0
- package/dist/policy/policyTypes.js +2 -0
- package/dist/policy/policyTypes.js.map +1 -0
- package/dist/runtime/RuntimeEventStore.d.ts +42 -0
- package/dist/runtime/RuntimeEventStore.d.ts.map +1 -0
- package/dist/runtime/RuntimeEventStore.js +412 -0
- package/dist/runtime/RuntimeEventStore.js.map +1 -0
- package/dist/runtime/RuntimeEventStoreRepositoryAdapter.d.ts +21 -0
- package/dist/runtime/RuntimeEventStoreRepositoryAdapter.d.ts.map +1 -0
- package/dist/runtime/RuntimeEventStoreRepositoryAdapter.js +41 -0
- package/dist/runtime/RuntimeEventStoreRepositoryAdapter.js.map +1 -0
- package/dist/runtime/RuntimeTimelineProjection.d.ts +5 -0
- package/dist/runtime/RuntimeTimelineProjection.d.ts.map +1 -0
- package/dist/runtime/RuntimeTimelineProjection.js +705 -0
- package/dist/runtime/RuntimeTimelineProjection.js.map +1 -0
- package/dist/runtime/runtimeEventTypes.d.ts +73 -0
- package/dist/runtime/runtimeEventTypes.d.ts.map +1 -0
- package/dist/runtime/runtimeEventTypes.js +2 -0
- package/dist/runtime/runtimeEventTypes.js.map +1 -0
- package/dist/sdk/SdkNativeAgentTurnExecutionAdapter.d.ts +117 -0
- package/dist/sdk/SdkNativeAgentTurnExecutionAdapter.d.ts.map +1 -0
- package/dist/sdk/SdkNativeAgentTurnExecutionAdapter.js +214 -0
- package/dist/sdk/SdkNativeAgentTurnExecutionAdapter.js.map +1 -0
- package/dist/session/AgentSessionService.d.ts +285 -0
- package/dist/session/AgentSessionService.d.ts.map +1 -0
- package/dist/session/AgentSessionService.js +444 -0
- package/dist/session/AgentSessionService.js.map +1 -0
- package/dist/session/bufferedSessionPty.d.ts +27 -0
- package/dist/session/bufferedSessionPty.d.ts.map +1 -0
- package/dist/session/bufferedSessionPty.js +49 -0
- package/dist/session/bufferedSessionPty.js.map +1 -0
- package/dist/session/renderSupport.d.ts +53 -0
- package/dist/session/renderSupport.d.ts.map +1 -0
- package/dist/session/renderSupport.js +41 -0
- package/dist/session/renderSupport.js.map +1 -0
- package/dist/session/runtimeEventChannel.d.ts +56 -0
- package/dist/session/runtimeEventChannel.d.ts.map +1 -0
- package/dist/session/runtimeEventChannel.js +53 -0
- package/dist/session/runtimeEventChannel.js.map +1 -0
- package/dist/state/JsonAgentStateRepository.d.ts +29 -0
- package/dist/state/JsonAgentStateRepository.d.ts.map +1 -0
- package/dist/state/JsonAgentStateRepository.js +165 -0
- package/dist/state/JsonAgentStateRepository.js.map +1 -0
- package/dist/state/SqliteAgentStateRepository.d.ts +58 -0
- package/dist/state/SqliteAgentStateRepository.d.ts.map +1 -0
- package/dist/state/SqliteAgentStateRepository.js +777 -0
- package/dist/state/SqliteAgentStateRepository.js.map +1 -0
- package/dist/state/createAgentStateRepository.d.ts +4 -0
- package/dist/state/createAgentStateRepository.d.ts.map +1 -0
- package/dist/state/createAgentStateRepository.js +12 -0
- package/dist/state/createAgentStateRepository.js.map +1 -0
- package/dist/state/stateSanitizers.d.ts +7 -0
- package/dist/state/stateSanitizers.d.ts.map +1 -0
- package/dist/state/stateSanitizers.js +87 -0
- package/dist/state/stateSanitizers.js.map +1 -0
- package/dist/subagents/AcpSubagentExecutionAdapter.d.ts +12 -0
- package/dist/subagents/AcpSubagentExecutionAdapter.d.ts.map +1 -0
- package/dist/subagents/AcpSubagentExecutionAdapter.js +119 -0
- package/dist/subagents/AcpSubagentExecutionAdapter.js.map +1 -0
- package/dist/subagents/CliSubagentExecutionAdapter.d.ts +13 -0
- package/dist/subagents/CliSubagentExecutionAdapter.d.ts.map +1 -0
- package/dist/subagents/CliSubagentExecutionAdapter.js +217 -0
- package/dist/subagents/CliSubagentExecutionAdapter.js.map +1 -0
- package/dist/subagents/HostTurnSubagentExecutionAdapter.d.ts +78 -0
- package/dist/subagents/HostTurnSubagentExecutionAdapter.d.ts.map +1 -0
- package/dist/subagents/HostTurnSubagentExecutionAdapter.js +160 -0
- package/dist/subagents/HostTurnSubagentExecutionAdapter.js.map +1 -0
- package/dist/subagents/SubagentRunService.d.ts +103 -0
- package/dist/subagents/SubagentRunService.d.ts.map +1 -0
- package/dist/subagents/SubagentRunService.js +1183 -0
- package/dist/subagents/SubagentRunService.js.map +1 -0
- package/dist/subagents/SubagentScheduler.d.ts +167 -0
- package/dist/subagents/SubagentScheduler.d.ts.map +1 -0
- package/dist/subagents/SubagentScheduler.js +530 -0
- package/dist/subagents/SubagentScheduler.js.map +1 -0
- package/dist/subagents/TeamAgentRouter.d.ts +104 -0
- package/dist/subagents/TeamAgentRouter.d.ts.map +1 -0
- package/dist/subagents/TeamAgentRouter.js +435 -0
- package/dist/subagents/TeamAgentRouter.js.map +1 -0
- package/dist/subagents/capabilityMatcher.d.ts +3 -0
- package/dist/subagents/capabilityMatcher.d.ts.map +1 -0
- package/dist/subagents/capabilityMatcher.js +127 -0
- package/dist/subagents/capabilityMatcher.js.map +1 -0
- package/dist/subagents/subagentRunPort.d.ts +43 -0
- package/dist/subagents/subagentRunPort.d.ts.map +1 -0
- package/dist/subagents/subagentRunPort.js +24 -0
- package/dist/subagents/subagentRunPort.js.map +1 -0
- package/dist/subagents/subagentTypes.d.ts +330 -0
- package/dist/subagents/subagentTypes.d.ts.map +1 -0
- package/dist/subagents/subagentTypes.js +2 -0
- package/dist/subagents/subagentTypes.js.map +1 -0
- package/dist/subagents/subagentWorkspaceAuthority.d.ts +29 -0
- package/dist/subagents/subagentWorkspaceAuthority.d.ts.map +1 -0
- package/dist/subagents/subagentWorkspaceAuthority.js +173 -0
- package/dist/subagents/subagentWorkspaceAuthority.js.map +1 -0
- package/dist/support/SupportDiagnosticsService.d.ts +87 -0
- package/dist/support/SupportDiagnosticsService.d.ts.map +1 -0
- package/dist/support/SupportDiagnosticsService.js +1199 -0
- package/dist/support/SupportDiagnosticsService.js.map +1 -0
- package/dist/turns/DurableInterruptedTurnStore.d.ts +14 -0
- package/dist/turns/DurableInterruptedTurnStore.d.ts.map +1 -0
- package/dist/turns/DurableInterruptedTurnStore.js +63 -0
- package/dist/turns/DurableInterruptedTurnStore.js.map +1 -0
- package/dist/turns/interruptedTurns.d.ts +50 -0
- package/dist/turns/interruptedTurns.d.ts.map +1 -0
- package/dist/turns/interruptedTurns.js +54 -0
- package/dist/turns/interruptedTurns.js.map +1 -0
- package/dist/turns/turnAdmission.d.ts +113 -0
- package/dist/turns/turnAdmission.d.ts.map +1 -0
- package/dist/turns/turnAdmission.js +136 -0
- package/dist/turns/turnAdmission.js.map +1 -0
- package/dist/workspace/WorkspaceHostService.d.ts +126 -0
- package/dist/workspace/WorkspaceHostService.d.ts.map +1 -0
- package/dist/workspace/WorkspaceHostService.js +841 -0
- package/dist/workspace/WorkspaceHostService.js.map +1 -0
- package/dist/workspace/WorkspaceShellService.d.ts +71 -0
- package/dist/workspace/WorkspaceShellService.d.ts.map +1 -0
- package/dist/workspace/WorkspaceShellService.js +273 -0
- package/dist/workspace/WorkspaceShellService.js.map +1 -0
- package/dist/workspace/fileAssociations.d.ts +12 -0
- package/dist/workspace/fileAssociations.d.ts.map +1 -0
- package/dist/workspace/fileAssociations.js +202 -0
- package/dist/workspace/fileAssociations.js.map +1 -0
- package/dist/workspace/scrollbackBuffer.d.ts +48 -0
- package/dist/workspace/scrollbackBuffer.d.ts.map +1 -0
- package/dist/workspace/scrollbackBuffer.js +94 -0
- package/dist/workspace/scrollbackBuffer.js.map +1 -0
- package/package.json +42 -0
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
import { UnavailableCoordinationLaneBridge, } from '../coordination/laneBridge.js';
|
|
2
|
+
import { XENO_ACP_COORDINATION_CLAIM_METHOD, XENO_ACP_COORDINATION_QUERY_METHOD, XENO_ACP_COORDINATION_SEND_METHOD, } from './AcpCoordinationBridge.js';
|
|
3
|
+
import { AcpUnsupportedMethodError } from './acpErrors.js';
|
|
4
|
+
export const XENO_ACP_META_KEY = 'xeno.dev';
|
|
5
|
+
export const XENO_ACP_CHOOSE_DIRECTORY_METHOD = 'xeno.dev/choose_directory';
|
|
6
|
+
export const XENO_ACP_CHOOSE_WORKSPACE_PLACEMENT_METHOD = 'xeno.dev/choose_workspace_placement';
|
|
7
|
+
/**
|
|
8
|
+
* Every host method an ACP agent may call, by the name it is ADVERTISED under.
|
|
9
|
+
*
|
|
10
|
+
* 🔴 ONE table, because dispatch and advertisement are two halves of the same
|
|
11
|
+
* fact and a method with only one of them is unreachable.
|
|
12
|
+
*
|
|
13
|
+
* Advertisement is not documentation: `initialize` sends this list, and an
|
|
14
|
+
* agent that never receives a method's name never calls it. A dispatcher
|
|
15
|
+
* handling a method nobody was told about is "built, tested, unreachable"
|
|
16
|
+
* wearing a protocol — the shape this repo has now hit five times. Deriving the
|
|
17
|
+
* advertisement from this array makes the mismatch unrepresentable rather than
|
|
18
|
+
* merely tested for; a mutation setting one entry to `false` no longer compiles
|
|
19
|
+
* into anything, because there is nowhere to write it.
|
|
20
|
+
*/
|
|
21
|
+
export const XENO_ACP_HOST_REQUEST_METHODS = {
|
|
22
|
+
chooseDirectory: XENO_ACP_CHOOSE_DIRECTORY_METHOD,
|
|
23
|
+
chooseWorkspacePlacement: XENO_ACP_CHOOSE_WORKSPACE_PLACEMENT_METHOD,
|
|
24
|
+
coordinationSend: XENO_ACP_COORDINATION_SEND_METHOD,
|
|
25
|
+
coordinationQuery: XENO_ACP_COORDINATION_QUERY_METHOD,
|
|
26
|
+
coordinationClaim: XENO_ACP_COORDINATION_CLAIM_METHOD,
|
|
27
|
+
};
|
|
28
|
+
/** The `_meta['xeno.dev'].hostRequests` payload, derived, never hand-listed. */
|
|
29
|
+
export function xenoAcpHostRequestAdvertisement() {
|
|
30
|
+
return Object.fromEntries(Object.keys(XENO_ACP_HOST_REQUEST_METHODS).map((name) => [name, true]));
|
|
31
|
+
}
|
|
32
|
+
export class FailClosedAcpHostBridge {
|
|
33
|
+
async chooseDirectory() {
|
|
34
|
+
return {
|
|
35
|
+
cancelled: true,
|
|
36
|
+
error: 'XENO ACP host choose-directory bridge is not available.',
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
async chooseWorkspacePlacement() {
|
|
40
|
+
return {
|
|
41
|
+
cancelled: true,
|
|
42
|
+
error: 'XENO ACP host workspace-placement bridge is not available.',
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
export function parseChooseDirectoryRequest(value) {
|
|
47
|
+
if (!value || typeof value !== 'object' || Array.isArray(value))
|
|
48
|
+
return {};
|
|
49
|
+
const record = value;
|
|
50
|
+
return {
|
|
51
|
+
sessionId: typeof record.sessionId === 'string' && record.sessionId.trim() ? record.sessionId.trim() : undefined,
|
|
52
|
+
requestId: typeof record.requestId === 'string' && record.requestId.trim() ? record.requestId.trim() : undefined,
|
|
53
|
+
title: typeof record.title === 'string' && record.title.trim() ? record.title.trim().slice(0, 160) : undefined,
|
|
54
|
+
toolCallId: typeof record.toolCallId === 'string' && record.toolCallId.trim()
|
|
55
|
+
? record.toolCallId.trim().slice(0, 256)
|
|
56
|
+
: undefined,
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
export function parseChooseWorkspacePlacementRequest(value) {
|
|
60
|
+
if (!value || typeof value !== 'object' || Array.isArray(value))
|
|
61
|
+
return {};
|
|
62
|
+
const record = value;
|
|
63
|
+
return {
|
|
64
|
+
sessionId: typeof record.sessionId === 'string' && record.sessionId.trim() ? record.sessionId.trim() : undefined,
|
|
65
|
+
requestId: typeof record.requestId === 'string' && record.requestId.trim() ? record.requestId.trim() : undefined,
|
|
66
|
+
directory: typeof record.directory === 'string' && record.directory.trim() ? record.directory.trim().slice(0, 2000) : undefined,
|
|
67
|
+
title: typeof record.title === 'string' && record.title.trim() ? record.title.trim().slice(0, 160) : undefined,
|
|
68
|
+
toolCallId: typeof record.toolCallId === 'string' && record.toolCallId.trim()
|
|
69
|
+
? record.toolCallId.trim().slice(0, 256)
|
|
70
|
+
: undefined,
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
export async function handleAcpHostExtensionRequest(method, params, bridge = new FailClosedAcpHostBridge(),
|
|
74
|
+
/**
|
|
75
|
+
* Coordination — §5.2b's three primitives, on the surface that already exists.
|
|
76
|
+
*
|
|
77
|
+
* 🔴 Defaults to the UNAVAILABLE bridge, not to a working one and not to
|
|
78
|
+
* silence. A host without coordination mounted must say so by name: "no
|
|
79
|
+
* peers" and "this host cannot coordinate" are the same empty list and
|
|
80
|
+
* opposite meanings, and an agent told the first concludes it is working
|
|
81
|
+
* alone — then edits a file another run has claimed.
|
|
82
|
+
*/
|
|
83
|
+
coordination = new UnavailableCoordinationLaneBridge()) {
|
|
84
|
+
if (method === XENO_ACP_CHOOSE_DIRECTORY_METHOD) {
|
|
85
|
+
return bridge.chooseDirectory(parseChooseDirectoryRequest(params));
|
|
86
|
+
}
|
|
87
|
+
if (method === XENO_ACP_CHOOSE_WORKSPACE_PLACEMENT_METHOD) {
|
|
88
|
+
return bridge.chooseWorkspacePlacement(parseChooseWorkspacePlacementRequest(params));
|
|
89
|
+
}
|
|
90
|
+
if (method === XENO_ACP_COORDINATION_SEND_METHOD)
|
|
91
|
+
return coordination.send(params);
|
|
92
|
+
if (method === XENO_ACP_COORDINATION_QUERY_METHOD)
|
|
93
|
+
return coordination.query(params);
|
|
94
|
+
if (method === XENO_ACP_COORDINATION_CLAIM_METHOD)
|
|
95
|
+
return coordination.claim(params);
|
|
96
|
+
throw new AcpUnsupportedMethodError(method);
|
|
97
|
+
}
|
|
98
|
+
export function cancelAcpHostBridge(bridge, reason = 'ACP prompt cancelled.') {
|
|
99
|
+
bridge.cancelOutstanding?.(reason);
|
|
100
|
+
}
|
|
101
|
+
//# sourceMappingURL=AcpHostBridge.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AcpHostBridge.js","sourceRoot":"","sources":["../../src/acp/AcpHostBridge.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
import type { AcpPermissionOutcome, AcpPermissionRequest } from './acpTypes.js';
|
|
2
|
+
import type { AcpPermissionBridge } from './AcpPermissionBridge.js';
|
|
3
|
+
/**
|
|
4
|
+
* THE INTERACTIVE HALF of ACP permissions (ADE spec §10b.0).
|
|
5
|
+
*
|
|
6
|
+
* `PolicyGatedAcpPermissionBridge` decides what stored rules can decide. This is
|
|
7
|
+
* the delegate it falls back to: it asks a human.
|
|
8
|
+
*
|
|
9
|
+
* Until now there was no such delegate, so the composed adapter fell through to
|
|
10
|
+
* `FailClosedAcpPermissionBridge` and every ACP permission request was refused
|
|
11
|
+
* without anyone being asked.
|
|
12
|
+
*
|
|
13
|
+
* ## Why this publishes through the host rather than to a window
|
|
14
|
+
*
|
|
15
|
+
* The SDK-native lane raises its prompts with `mainWindow.webContents.send`,
|
|
16
|
+
* which bypasses the host entirely — which is why the contract advertises
|
|
17
|
+
* `elicitation.permission.requested` and the host has never once published it
|
|
18
|
+
* (`createElicitationSurfaceMessenger()` had no callers).
|
|
19
|
+
*
|
|
20
|
+
* This bridge takes that messenger instead. The host publishes, surfaces
|
|
21
|
+
* subscribe, and the renderer stays a renderer: it is handed a request and
|
|
22
|
+
* returns an answer, and holds no authority over the outcome (§7). It also
|
|
23
|
+
* means the prompt reaches EVERY attached surface rather than one window, which
|
|
24
|
+
* is a prerequisite for the detached host.
|
|
25
|
+
*
|
|
26
|
+
* ## Fail-closed, deliberately and visibly
|
|
27
|
+
*
|
|
28
|
+
* Anything other than an explicit grant — a denial, a cancelled turn, a timeout,
|
|
29
|
+
* a shutdown — resolves to a refusal. The one thing that must never happen is a
|
|
30
|
+
* request answered "allow" because nobody answered it.
|
|
31
|
+
*/
|
|
32
|
+
export interface AcpInteractivePermissionSurfaceMessenger {
|
|
33
|
+
send(channel: string, payload: Record<string, unknown>): void;
|
|
34
|
+
}
|
|
35
|
+
export interface AcpInteractivePermissionBridgeOptions {
|
|
36
|
+
messenger: AcpInteractivePermissionSurfaceMessenger;
|
|
37
|
+
/**
|
|
38
|
+
* How long to wait for a human before refusing. A permission prompt with no
|
|
39
|
+
* answer must not pin an agent turn open forever.
|
|
40
|
+
*/
|
|
41
|
+
timeoutMs?: undefined | number;
|
|
42
|
+
newPermissionId?: undefined | (() => string);
|
|
43
|
+
}
|
|
44
|
+
export interface AcpPermissionAnswer {
|
|
45
|
+
permissionId: string;
|
|
46
|
+
granted: boolean;
|
|
47
|
+
/**
|
|
48
|
+
* An explicit choice among the options the agent offered — how a surface
|
|
49
|
+
* expresses "allow always" rather than "allow once".
|
|
50
|
+
*
|
|
51
|
+
* VALIDATED against the offered set before use. The renderer is untrusted
|
|
52
|
+
* (§7): an id it invents must never be forwarded to an agent, because the
|
|
53
|
+
* agent decides what each id means and an unknown one could map to anything.
|
|
54
|
+
*/
|
|
55
|
+
selectedOptionId?: undefined | string;
|
|
56
|
+
}
|
|
57
|
+
/** Whether this bridge owned the answered permission id. */
|
|
58
|
+
export interface AcpPermissionAnswerResult {
|
|
59
|
+
handled: boolean;
|
|
60
|
+
}
|
|
61
|
+
export declare class AcpInteractivePermissionBridge implements AcpPermissionBridge {
|
|
62
|
+
private readonly messenger;
|
|
63
|
+
private readonly timeoutMs;
|
|
64
|
+
private readonly newPermissionId;
|
|
65
|
+
private readonly pending;
|
|
66
|
+
constructor(options: AcpInteractivePermissionBridgeOptions);
|
|
67
|
+
requestPermission(request: AcpPermissionRequest): Promise<AcpPermissionOutcome>;
|
|
68
|
+
/**
|
|
69
|
+
* Routes a surface answer. Returns `handled: false` when the id belongs to
|
|
70
|
+
* another lane, so a composite interaction service can fall through rather
|
|
71
|
+
* than swallowing an SDK-native answer.
|
|
72
|
+
*/
|
|
73
|
+
answerPermission(answer: AcpPermissionAnswer): AcpPermissionAnswerResult;
|
|
74
|
+
cancelOutstanding(): void;
|
|
75
|
+
get pendingCount(): number;
|
|
76
|
+
}
|
|
77
|
+
//# sourceMappingURL=AcpInteractivePermissionBridge.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AcpInteractivePermissionBridge.d.ts","sourceRoot":"","sources":["../../src/acp/AcpInteractivePermissionBridge.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,oBAAoB,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAA;AAC/E,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAA;AAGnE;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AAEH,MAAM,WAAW,wCAAwC;IACvD,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAA;CAC9D;AAED,MAAM,WAAW,qCAAqC;IACpD,SAAS,EAAE,wCAAwC,CAAA;IACnD;;;OAGG;IACH,SAAS,CAAC,EAAE,SAAS,GAAG,MAAM,CAAA;IAC9B,eAAe,CAAC,EAAE,SAAS,GAAG,CAAC,MAAM,MAAM,CAAC,CAAA;CAC7C;AAED,MAAM,WAAW,mBAAmB;IAClC,YAAY,EAAE,MAAM,CAAA;IACpB,OAAO,EAAE,OAAO,CAAA;IAChB;;;;;;;OAOG;IACH,gBAAgB,CAAC,EAAE,SAAS,GAAG,MAAM,CAAA;CACtC;AAED,4DAA4D;AAC5D,MAAM,WAAW,yBAAyB;IACxC,OAAO,EAAE,OAAO,CAAA;CACjB;AAUD,qBAAa,8BAA+B,YAAW,mBAAmB;IACxE,OAAO,CAAC,QAAQ,CAAC,SAAS,CAA0C;IACpE,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAQ;IAClC,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAc;IAC9C,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA0C;gBAEtD,OAAO,EAAE,qCAAqC;IAMpD,iBAAiB,CAAC,OAAO,EAAE,oBAAoB,GAAG,OAAO,CAAC,oBAAoB,CAAC;IAuDrF;;;;OAIG;IACH,gBAAgB,CAAC,MAAM,EAAE,mBAAmB,GAAG,yBAAyB;IA+CxE,iBAAiB,IAAI,IAAI;IAMzB,IAAI,YAAY,IAAI,MAAM,CAEzB;CACF"}
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
import { randomUUID } from 'node:crypto';
|
|
2
|
+
import { selectOptionForDecision } from './AcpPermissionPolicy.js';
|
|
3
|
+
const DEFAULT_TIMEOUT_MS = 10 * 60_000;
|
|
4
|
+
export class AcpInteractivePermissionBridge {
|
|
5
|
+
messenger;
|
|
6
|
+
timeoutMs;
|
|
7
|
+
newPermissionId;
|
|
8
|
+
pending = new Map();
|
|
9
|
+
constructor(options) {
|
|
10
|
+
this.messenger = options.messenger;
|
|
11
|
+
this.timeoutMs = options.timeoutMs ?? DEFAULT_TIMEOUT_MS;
|
|
12
|
+
this.newPermissionId = options.newPermissionId || (() => `acp-permission-${randomUUID()}`);
|
|
13
|
+
}
|
|
14
|
+
async requestPermission(request) {
|
|
15
|
+
// Prefer the host's journalled id — see AcpPermissionRequest.hostPermissionId.
|
|
16
|
+
// Minting a second id here is how a prompt becomes unanswerable.
|
|
17
|
+
const permissionId = request.hostPermissionId || this.newPermissionId();
|
|
18
|
+
return await new Promise((resolve) => {
|
|
19
|
+
const settle = (outcome) => {
|
|
20
|
+
const entry = this.pending.get(permissionId);
|
|
21
|
+
if (!entry)
|
|
22
|
+
return;
|
|
23
|
+
if (entry.timer)
|
|
24
|
+
clearTimeout(entry.timer);
|
|
25
|
+
this.pending.delete(permissionId);
|
|
26
|
+
resolve(outcome);
|
|
27
|
+
};
|
|
28
|
+
const timer = this.timeoutMs > 0
|
|
29
|
+
? setTimeout(() => { settle({ outcome: 'cancelled' }); }, this.timeoutMs)
|
|
30
|
+
: undefined;
|
|
31
|
+
timer?.unref?.();
|
|
32
|
+
this.pending.set(permissionId, { resolve: settle, request, timer });
|
|
33
|
+
try {
|
|
34
|
+
// Same channel and shape the renderer already renders for the
|
|
35
|
+
// SDK-native lane, so no second prompt UI is needed. `toolName` and
|
|
36
|
+
// `path` come from the ACP toolCall, which is why carrying it through
|
|
37
|
+
// the parse was the prerequisite for this.
|
|
38
|
+
this.messenger.send('agent:permission-request', {
|
|
39
|
+
// REQUIRED by the surface: it routes the prompt onto a conversation
|
|
40
|
+
// by this id and drops any permission event without one.
|
|
41
|
+
requestId: request.hostRequestId,
|
|
42
|
+
permissionId,
|
|
43
|
+
source: 'acp',
|
|
44
|
+
sessionId: request.sessionId,
|
|
45
|
+
toolName: request.toolCall?.title || request.toolCall?.kind || 'ACP tool call',
|
|
46
|
+
toolKind: request.toolCall?.kind,
|
|
47
|
+
// A human-readable action description, matching how the SDK-native
|
|
48
|
+
// lane uses this field (it sends `actionText`, not a filesystem path).
|
|
49
|
+
path: (request.toolCall?.locations || []).map((location) => location.path).join(', ')
|
|
50
|
+
|| request.toolCall?.title
|
|
51
|
+
|| request.toolCall?.kind
|
|
52
|
+
|| 'ACP tool call',
|
|
53
|
+
directory: (request.toolCall?.locations || [])[0]?.path,
|
|
54
|
+
options: (request.options || []).map((option) => ({
|
|
55
|
+
id: option.id,
|
|
56
|
+
label: option.label,
|
|
57
|
+
kind: option.kind,
|
|
58
|
+
})),
|
|
59
|
+
allowAlwaysOptionId: (request.options || []).find((option) => option.kind === 'allow_always')?.id,
|
|
60
|
+
rejectAlwaysOptionId: (request.options || []).find((option) => option.kind === 'reject_always')?.id,
|
|
61
|
+
});
|
|
62
|
+
}
|
|
63
|
+
catch {
|
|
64
|
+
// A surface that cannot be reached is a refusal, not an approval.
|
|
65
|
+
settle({ outcome: 'cancelled' });
|
|
66
|
+
}
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Routes a surface answer. Returns `handled: false` when the id belongs to
|
|
71
|
+
* another lane, so a composite interaction service can fall through rather
|
|
72
|
+
* than swallowing an SDK-native answer.
|
|
73
|
+
*/
|
|
74
|
+
answerPermission(answer) {
|
|
75
|
+
const entry = this.pending.get(answer.permissionId);
|
|
76
|
+
if (!entry)
|
|
77
|
+
return { handled: false };
|
|
78
|
+
/**
|
|
79
|
+
* An explicit choice is honoured for BOTH directions — "always deny" is as
|
|
80
|
+
* real a choice as "always allow" — but only after two checks:
|
|
81
|
+
*
|
|
82
|
+
* 1. the id was actually offered by the agent, and
|
|
83
|
+
* 2. its KIND agrees with `granted`.
|
|
84
|
+
*
|
|
85
|
+
* The second matters more than it looks. Without it, a renderer bug or a
|
|
86
|
+
* hostile one could send `granted: false` alongside an `allow_always` id and
|
|
87
|
+
* the host would grant a permission the user had just refused. A mismatch
|
|
88
|
+
* is therefore ignored in favour of the safe mapping, never trusted.
|
|
89
|
+
*/
|
|
90
|
+
const offered = answer.selectedOptionId
|
|
91
|
+
? (entry.request.options || []).find((option) => option.id === answer.selectedOptionId)
|
|
92
|
+
: undefined;
|
|
93
|
+
const agreesWithAnswer = offered?.kind
|
|
94
|
+
? (answer.granted
|
|
95
|
+
? offered.kind === 'allow_once' || offered.kind === 'allow_always'
|
|
96
|
+
: offered.kind === 'reject_once' || offered.kind === 'reject_always')
|
|
97
|
+
: false;
|
|
98
|
+
if (offered && agreesWithAnswer) {
|
|
99
|
+
entry.resolve({ outcome: 'selected', selectedOptionId: offered.id });
|
|
100
|
+
return { handled: true };
|
|
101
|
+
}
|
|
102
|
+
if (!answer.granted) {
|
|
103
|
+
const rejection = selectOptionForDecision(entry.request.options, 'deny');
|
|
104
|
+
entry.resolve(rejection
|
|
105
|
+
? { outcome: 'selected', selectedOptionId: rejection.id }
|
|
106
|
+
: { outcome: 'cancelled' });
|
|
107
|
+
return { handled: true };
|
|
108
|
+
}
|
|
109
|
+
const approval = selectOptionForDecision(entry.request.options, 'allow');
|
|
110
|
+
// A grant we cannot express is NOT an approval. Selecting an arbitrary
|
|
111
|
+
// option id here would authorise something other than what the user
|
|
112
|
+
// approved, so it degrades to a refusal.
|
|
113
|
+
entry.resolve(approval
|
|
114
|
+
? { outcome: 'selected', selectedOptionId: approval.id }
|
|
115
|
+
: { outcome: 'cancelled' });
|
|
116
|
+
return { handled: true };
|
|
117
|
+
}
|
|
118
|
+
cancelOutstanding() {
|
|
119
|
+
for (const permissionId of [...this.pending.keys()]) {
|
|
120
|
+
this.pending.get(permissionId)?.resolve({ outcome: 'cancelled' });
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
get pendingCount() {
|
|
124
|
+
return this.pending.size;
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
//# sourceMappingURL=AcpInteractivePermissionBridge.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AcpInteractivePermissionBridge.js","sourceRoot":"","sources":["../../src/acp/AcpInteractivePermissionBridge.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { AcpPermissionOutcome, AcpPermissionRequest } from './acpTypes.js';
|
|
2
|
+
export interface AcpPermissionBridge {
|
|
3
|
+
requestPermission(request: AcpPermissionRequest): Promise<AcpPermissionOutcome>;
|
|
4
|
+
cancelOutstanding?(reason?: undefined | string): void;
|
|
5
|
+
}
|
|
6
|
+
export declare class FailClosedAcpPermissionBridge implements AcpPermissionBridge {
|
|
7
|
+
requestPermission(): Promise<AcpPermissionOutcome>;
|
|
8
|
+
}
|
|
9
|
+
export declare class DeterministicAcpPermissionBridge implements AcpPermissionBridge {
|
|
10
|
+
private readonly decision;
|
|
11
|
+
private cancelled;
|
|
12
|
+
constructor(decision?: AcpPermissionOutcome);
|
|
13
|
+
requestPermission(request: AcpPermissionRequest): Promise<AcpPermissionOutcome>;
|
|
14
|
+
cancelOutstanding(): void;
|
|
15
|
+
}
|
|
16
|
+
export declare function parsePermissionRequest(value: unknown): AcpPermissionRequest;
|
|
17
|
+
export declare function handleAcpPermissionRequest(request: unknown, bridge?: AcpPermissionBridge): Promise<Record<string, unknown>>;
|
|
18
|
+
export declare function cancelAcpPermissionBridge(bridge: AcpPermissionBridge, reason?: string): void;
|
|
19
|
+
//# sourceMappingURL=AcpPermissionBridge.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AcpPermissionBridge.d.ts","sourceRoot":"","sources":["../../src/acp/AcpPermissionBridge.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,oBAAoB,EAEpB,oBAAoB,EAGrB,MAAM,eAAe,CAAA;AAEtB,MAAM,WAAW,mBAAmB;IAClC,iBAAiB,CAAC,OAAO,EAAE,oBAAoB,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAAA;IAC/E,iBAAiB,CAAC,CAAC,MAAM,CAAC,EAAE,SAAS,GAAG,MAAM,GAAG,IAAI,CAAA;CACtD;AAED,qBAAa,6BAA8B,YAAW,mBAAmB;IACjE,iBAAiB,IAAI,OAAO,CAAC,oBAAoB,CAAC;CAGzD;AAED,qBAAa,gCAAiC,YAAW,mBAAmB;IAG9D,OAAO,CAAC,QAAQ,CAAC,QAAQ;IAFrC,OAAO,CAAC,SAAS,CAAQ;gBAEI,QAAQ,GAAE,oBAAyE;IAE1G,iBAAiB,CAAC,OAAO,EAAE,oBAAoB,GAAG,OAAO,CAAC,oBAAoB,CAAC;IAWrF,iBAAiB,IAAI,IAAI;CAG1B;AAED,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,OAAO,GAAG,oBAAoB,CA6B3E;AA6CD,wBAAsB,0BAA0B,CAC9C,OAAO,EAAE,OAAO,EAChB,MAAM,GAAE,mBAAyD,GAChE,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAKlC;AAED,wBAAgB,yBAAyB,CAAC,MAAM,EAAE,mBAAmB,EAAE,MAAM,SAA0B,GAAG,IAAI,CAI7G"}
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
export class FailClosedAcpPermissionBridge {
|
|
2
|
+
async requestPermission() {
|
|
3
|
+
return { outcome: 'cancelled' };
|
|
4
|
+
}
|
|
5
|
+
}
|
|
6
|
+
export class DeterministicAcpPermissionBridge {
|
|
7
|
+
decision;
|
|
8
|
+
cancelled = false;
|
|
9
|
+
constructor(decision = { outcome: 'selected', selectedOptionId: 'allow' }) {
|
|
10
|
+
this.decision = decision;
|
|
11
|
+
}
|
|
12
|
+
async requestPermission(request) {
|
|
13
|
+
if (this.cancelled)
|
|
14
|
+
return { outcome: 'cancelled' };
|
|
15
|
+
if (this.decision.outcome === 'selected') {
|
|
16
|
+
const requestedIds = new Set((request.options || []).map((option) => option.id));
|
|
17
|
+
if (requestedIds.size > 0 && !requestedIds.has(this.decision.selectedOptionId)) {
|
|
18
|
+
return { outcome: 'cancelled' };
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
return this.decision;
|
|
22
|
+
}
|
|
23
|
+
cancelOutstanding() {
|
|
24
|
+
this.cancelled = true;
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
export function parsePermissionRequest(value) {
|
|
28
|
+
if (!value || typeof value !== 'object' || Array.isArray(value))
|
|
29
|
+
return {};
|
|
30
|
+
const record = value;
|
|
31
|
+
const options = Array.isArray(record.options)
|
|
32
|
+
? record.options
|
|
33
|
+
.filter((option) => !!option && typeof option === 'object' && !Array.isArray(option))
|
|
34
|
+
.map((option) => ({
|
|
35
|
+
id: typeof option.id === 'string'
|
|
36
|
+
? option.id
|
|
37
|
+
: typeof option.optionId === 'string' ? option.optionId : '',
|
|
38
|
+
label: typeof option.label === 'string'
|
|
39
|
+
? option.label
|
|
40
|
+
: typeof option.name === 'string' ? option.name : undefined,
|
|
41
|
+
description: typeof option.description === 'string' ? option.description : undefined,
|
|
42
|
+
...(typeof option.kind === 'string' && OPTION_KINDS.has(option.kind)
|
|
43
|
+
? { kind: option.kind }
|
|
44
|
+
: {}),
|
|
45
|
+
}))
|
|
46
|
+
.filter((option) => option.id)
|
|
47
|
+
: undefined;
|
|
48
|
+
return {
|
|
49
|
+
sessionId: typeof record.sessionId === 'string' ? record.sessionId : undefined,
|
|
50
|
+
prompt: typeof record.prompt === 'string' ? record.prompt : undefined,
|
|
51
|
+
options,
|
|
52
|
+
toolCall: parsePermissionToolCall(record.toolCall),
|
|
53
|
+
metadata: record.metadata && typeof record.metadata === 'object' && !Array.isArray(record.metadata)
|
|
54
|
+
? record.metadata
|
|
55
|
+
: undefined,
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
const OPTION_KINDS = new Set([
|
|
59
|
+
'allow_once', 'allow_always', 'reject_once', 'reject_always',
|
|
60
|
+
]);
|
|
61
|
+
const TOOL_KINDS = new Set([
|
|
62
|
+
'read', 'edit', 'delete', 'move', 'search', 'execute', 'think', 'fetch', 'switch_mode', 'other',
|
|
63
|
+
]);
|
|
64
|
+
/**
|
|
65
|
+
* ACP requires `toolCall` on every permission request. It is the only thing
|
|
66
|
+
* that says WHAT is being permitted, so it is parsed defensively rather than
|
|
67
|
+
* trusted: an agent is untrusted input, and a malformed field must degrade to
|
|
68
|
+
* "unknown" instead of throwing inside the permission path — a parser that
|
|
69
|
+
* throws here would fail a permission request open or closed by accident
|
|
70
|
+
* rather than by decision.
|
|
71
|
+
*/
|
|
72
|
+
function parsePermissionToolCall(value) {
|
|
73
|
+
if (!value || typeof value !== 'object' || Array.isArray(value))
|
|
74
|
+
return undefined;
|
|
75
|
+
const record = value;
|
|
76
|
+
const kind = typeof record.kind === 'string' && TOOL_KINDS.has(record.kind)
|
|
77
|
+
? record.kind
|
|
78
|
+
: undefined;
|
|
79
|
+
const locations = Array.isArray(record.locations)
|
|
80
|
+
? record.locations
|
|
81
|
+
.filter((entry) => !!entry && typeof entry === 'object' && !Array.isArray(entry))
|
|
82
|
+
.map((entry) => ({
|
|
83
|
+
path: typeof entry.path === 'string' ? entry.path : '',
|
|
84
|
+
...(typeof entry.line === 'number' && Number.isFinite(entry.line) ? { line: entry.line } : {}),
|
|
85
|
+
}))
|
|
86
|
+
.filter((entry) => entry.path)
|
|
87
|
+
: undefined;
|
|
88
|
+
const toolCall = {
|
|
89
|
+
...(typeof record.toolCallId === 'string' ? { toolCallId: record.toolCallId } : {}),
|
|
90
|
+
...(typeof record.title === 'string' ? { title: record.title } : {}),
|
|
91
|
+
...(kind ? { kind } : {}),
|
|
92
|
+
...(locations && locations.length > 0 ? { locations } : {}),
|
|
93
|
+
...(record.rawInput && typeof record.rawInput === 'object' && !Array.isArray(record.rawInput)
|
|
94
|
+
? { rawInput: record.rawInput }
|
|
95
|
+
: {}),
|
|
96
|
+
};
|
|
97
|
+
return Object.keys(toolCall).length > 0 ? toolCall : undefined;
|
|
98
|
+
}
|
|
99
|
+
export async function handleAcpPermissionRequest(request, bridge = new FailClosedAcpPermissionBridge()) {
|
|
100
|
+
const outcome = await bridge.requestPermission(parsePermissionRequest(request));
|
|
101
|
+
return outcome.outcome === 'selected'
|
|
102
|
+
? { outcome: { outcome: 'selected', optionId: outcome.selectedOptionId } }
|
|
103
|
+
: { outcome: { outcome: 'cancelled' } };
|
|
104
|
+
}
|
|
105
|
+
export function cancelAcpPermissionBridge(bridge, reason = 'ACP prompt cancelled.') {
|
|
106
|
+
if (bridge.cancelOutstanding) {
|
|
107
|
+
bridge.cancelOutstanding(reason);
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
//# sourceMappingURL=AcpPermissionBridge.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AcpPermissionBridge.js","sourceRoot":"","sources":["../../src/acp/AcpPermissionBridge.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
import type { AcpPermissionOption, AcpPermissionOutcome, AcpPermissionRequest, AcpToolKind } from './acpTypes.js';
|
|
2
|
+
import type { AcpPermissionBridge } from './AcpPermissionBridge.js';
|
|
3
|
+
/**
|
|
4
|
+
* CLIENT-SIDE PERMISSION POLICY (ADE spec §7 "one authority", §9 step 1).
|
|
5
|
+
*
|
|
6
|
+
* ACP's `allow_always` says "remember the choice" and carries NO scope — a
|
|
7
|
+
* `PermissionOption` has `optionId`, `name`, `kind` and nothing else. The
|
|
8
|
+
* protocol therefore cannot express "allow always for paths under X".
|
|
9
|
+
*
|
|
10
|
+
* That is not a gap, it is a relocation, and this file is where the relocation
|
|
11
|
+
* lands: in ACP the CLIENT answers, so the scope algebra belongs here. The user
|
|
12
|
+
* picks "always", WE record what "always" means, and we answer matching requests
|
|
13
|
+
* without asking again. The agent simply asks every time.
|
|
14
|
+
*
|
|
15
|
+
* Why that is better than the agent remembering (which is what the SDK-native
|
|
16
|
+
* lane does today): one policy engine serves every agent, ours and third-party,
|
|
17
|
+
* and the rules are inspectable and auditable in one place. An agent-held policy
|
|
18
|
+
* is per-agent, invisible to the host, and impossible to review across a fleet.
|
|
19
|
+
*
|
|
20
|
+
* ## Rules this file will not bend
|
|
21
|
+
*
|
|
22
|
+
* - **Deny wins.** A matching deny beats any matching allow, whatever the order.
|
|
23
|
+
* - **Every location must be covered.** A rule scoped to one directory must not
|
|
24
|
+
* authorise a tool call that also touches a second, unrelated one.
|
|
25
|
+
* - **Never guess an option.** A stored `allow` is only actionable if the agent
|
|
26
|
+
* actually offered an allow-kind option. If it did not, the decision degrades
|
|
27
|
+
* to `ask` rather than picking something that looks plausible — selecting the
|
|
28
|
+
* wrong option id here means granting the wrong thing.
|
|
29
|
+
* - **Unknown means ask.** No tool call, no kind, or no locations against a
|
|
30
|
+
* path-scoped rule all resolve to `ask`, never to allow.
|
|
31
|
+
*/
|
|
32
|
+
export type AcpPermissionDecision = 'allow' | 'deny' | 'ask';
|
|
33
|
+
export interface AcpPermissionRule {
|
|
34
|
+
id: string;
|
|
35
|
+
decision: 'allow' | 'deny';
|
|
36
|
+
/** Restrict to one class of operation. Omitted means any kind. */
|
|
37
|
+
kind?: undefined | AcpToolKind;
|
|
38
|
+
/**
|
|
39
|
+
* Restrict to a directory subtree. Omitted means the rule is UNSCOPED and
|
|
40
|
+
* applies regardless of path — deliberately representable, because "allow all
|
|
41
|
+
* `read`" is a legitimate choice, but callers should treat it as such.
|
|
42
|
+
*/
|
|
43
|
+
pathPrefix?: undefined | string;
|
|
44
|
+
createdAt?: undefined | number;
|
|
45
|
+
}
|
|
46
|
+
export interface AcpPermissionPolicyStore {
|
|
47
|
+
list(): AcpPermissionRule[];
|
|
48
|
+
add(rule: AcpPermissionRule): void;
|
|
49
|
+
}
|
|
50
|
+
export declare class InMemoryAcpPermissionPolicyStore implements AcpPermissionPolicyStore {
|
|
51
|
+
private readonly rules;
|
|
52
|
+
constructor(initial?: AcpPermissionRule[]);
|
|
53
|
+
list(): AcpPermissionRule[];
|
|
54
|
+
add(rule: AcpPermissionRule): void;
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Case- and separator-insensitive containment with a BOUNDARY check.
|
|
58
|
+
*
|
|
59
|
+
* `C:/repo` must not match `C:/repo-evil`. A bare `startsWith` says it does,
|
|
60
|
+
* and that is the classic way a scoped grant silently becomes a wider one.
|
|
61
|
+
*/
|
|
62
|
+
export declare function isWithinPathPrefix(path: string, prefix: string): boolean;
|
|
63
|
+
export interface AcpPermissionPolicyEvaluation {
|
|
64
|
+
decision: AcpPermissionDecision;
|
|
65
|
+
ruleId?: undefined | string;
|
|
66
|
+
}
|
|
67
|
+
export declare function evaluateAcpPermissionPolicy(request: AcpPermissionRequest, rules: readonly AcpPermissionRule[]): AcpPermissionPolicyEvaluation;
|
|
68
|
+
/**
|
|
69
|
+
* The option to select for a decision, or undefined when the agent offered
|
|
70
|
+
* nothing that means it. Undefined must escalate to a human — never a guess.
|
|
71
|
+
*/
|
|
72
|
+
export declare function selectOptionForDecision(options: readonly AcpPermissionOption[] | undefined, decision: 'allow' | 'deny'): AcpPermissionOption | undefined;
|
|
73
|
+
/** Derives the rule to store when a user picks an `*_always` option. */
|
|
74
|
+
export declare function ruleFromAlwaysChoice(request: AcpPermissionRequest, optionKind: string, id: string, now: number): AcpPermissionRule | undefined;
|
|
75
|
+
export interface PolicyGatedAcpPermissionBridgeOptions {
|
|
76
|
+
store: AcpPermissionPolicyStore;
|
|
77
|
+
/** Consulted only when policy says `ask`. */
|
|
78
|
+
delegate: AcpPermissionBridge;
|
|
79
|
+
/** Reports every decision, so a silent auto-answer is still observable. */
|
|
80
|
+
onDecision?: undefined | ((event: AcpPermissionPolicyDecisionEvent) => void);
|
|
81
|
+
now?: undefined | (() => number);
|
|
82
|
+
newRuleId?: undefined | (() => string);
|
|
83
|
+
}
|
|
84
|
+
export interface AcpPermissionPolicyDecisionEvent {
|
|
85
|
+
decision: AcpPermissionDecision;
|
|
86
|
+
ruleId?: undefined | string;
|
|
87
|
+
source: 'policy' | 'user';
|
|
88
|
+
outcome: AcpPermissionOutcome;
|
|
89
|
+
/** Set when a decision could not be applied and had to escalate. */
|
|
90
|
+
escalationReason?: undefined | string;
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Answers permission requests from stored policy, delegating anything the
|
|
94
|
+
* policy cannot decide.
|
|
95
|
+
*
|
|
96
|
+
* Note it never *reports* an allow it could not actually express: if the policy
|
|
97
|
+
* says allow and the agent offered no allow-kind option, the request escalates
|
|
98
|
+
* with a named reason rather than being answered.
|
|
99
|
+
*/
|
|
100
|
+
export declare class PolicyGatedAcpPermissionBridge implements AcpPermissionBridge {
|
|
101
|
+
private readonly store;
|
|
102
|
+
private readonly delegate;
|
|
103
|
+
private readonly onDecision;
|
|
104
|
+
private readonly now;
|
|
105
|
+
private readonly newRuleId;
|
|
106
|
+
private ruleCounter;
|
|
107
|
+
constructor(options: PolicyGatedAcpPermissionBridgeOptions);
|
|
108
|
+
requestPermission(request: AcpPermissionRequest): Promise<AcpPermissionOutcome>;
|
|
109
|
+
cancelOutstanding(reason?: undefined | string): void;
|
|
110
|
+
}
|
|
111
|
+
//# sourceMappingURL=AcpPermissionPolicy.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AcpPermissionPolicy.d.ts","sourceRoot":"","sources":["../../src/acp/AcpPermissionPolicy.ts"],"names":[],"mappings":"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"}
|