@intentcomputing/koko-agent-sdk 1.0.1
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/CHANGELOG.md +10 -0
- package/CODE_OF_CONDUCT.md +3 -0
- package/CONTRIBUTING.md +9 -0
- package/LICENSE +21 -0
- package/README.md +65 -0
- package/README.zh-CN.md +50 -0
- package/SECURITY.md +5 -0
- package/android/build.gradle +40 -0
- package/android/src/main/AndroidManifest.xml +2 -0
- package/android/src/main/java/cn/intentcomputing/kokoagentsdk/KokoAgentSdkModule.java +1356 -0
- package/android/src/main/java/cn/intentcomputing/kokoagentsdk/KokoAgentSdkPackage.java +23 -0
- package/docs/INTEGRATION.md +168 -0
- package/docs/INTEGRATION.zh-CN.md +140 -0
- package/docs/PRIVACY.md +11 -0
- package/docs/PRIVACY.zh-CN.md +11 -0
- package/docs/PUBLISH.md +11 -0
- package/docs/PUBLISH.zh-CN.md +11 -0
- package/ios/KokoAgentSdk/KokoAgentSdk.h +5 -0
- package/ios/KokoAgentSdk/KokoAgentSdk.m +2464 -0
- package/ios/KokoAgentSdk/KokoOcrBounds.h +20 -0
- package/ios/KokoAgentSdk/KokoScrollBounds.h +21 -0
- package/koko-agent-sdk.podspec +23 -0
- package/lib/commonjs/KokoAgent.js +1427 -0
- package/lib/commonjs/KokoAgent.js.map +1 -0
- package/lib/commonjs/assist/OnDeviceAssist.js +94 -0
- package/lib/commonjs/assist/OnDeviceAssist.js.map +1 -0
- package/lib/commonjs/assist/intentClassify.js +100 -0
- package/lib/commonjs/assist/intentClassify.js.map +1 -0
- package/lib/commonjs/assist/nodeRank.js +120 -0
- package/lib/commonjs/assist/nodeRank.js.map +1 -0
- package/lib/commonjs/assist/ocrTarget.js +135 -0
- package/lib/commonjs/assist/ocrTarget.js.map +1 -0
- package/lib/commonjs/assist/webVisualChange.js +29 -0
- package/lib/commonjs/assist/webVisualChange.js.map +1 -0
- package/lib/commonjs/client/ActionOutcomeUnknownError.js +28 -0
- package/lib/commonjs/client/ActionOutcomeUnknownError.js.map +1 -0
- package/lib/commonjs/client/AgentSession.js +858 -0
- package/lib/commonjs/client/AgentSession.js.map +1 -0
- package/lib/commonjs/client/GatewayClient.js +302 -0
- package/lib/commonjs/client/GatewayClient.js.map +1 -0
- package/lib/commonjs/client/OperationReplayGuard.js +62 -0
- package/lib/commonjs/client/OperationReplayGuard.js.map +1 -0
- package/lib/commonjs/client/RunCheckpoint.js +139 -0
- package/lib/commonjs/client/RunCheckpoint.js.map +1 -0
- package/lib/commonjs/client/loopDetect.js +184 -0
- package/lib/commonjs/client/loopDetect.js.map +1 -0
- package/lib/commonjs/client/recentSearch.js +50 -0
- package/lib/commonjs/client/recentSearch.js.map +1 -0
- package/lib/commonjs/client/walletChoiceGuard.js +18 -0
- package/lib/commonjs/client/walletChoiceGuard.js.map +1 -0
- package/lib/commonjs/client/webResultCategory.js +38 -0
- package/lib/commonjs/client/webResultCategory.js.map +1 -0
- package/lib/commonjs/commercial/AccountStore.js +78 -0
- package/lib/commonjs/commercial/AccountStore.js.map +1 -0
- package/lib/commonjs/commercial/AgentDebug.js +104 -0
- package/lib/commonjs/commercial/AgentDebug.js.map +1 -0
- package/lib/commonjs/commercial/ExecutionGuard.js +53 -0
- package/lib/commonjs/commercial/ExecutionGuard.js.map +1 -0
- package/lib/commonjs/commercial/UsageBus.js +42 -0
- package/lib/commonjs/commercial/UsageBus.js.map +1 -0
- package/lib/commonjs/commercial/branding.js +69 -0
- package/lib/commonjs/commercial/branding.js.map +1 -0
- package/lib/commonjs/commercial/devMode.js +52 -0
- package/lib/commonjs/commercial/devMode.js.map +1 -0
- package/lib/commonjs/commercial/trust.js +69 -0
- package/lib/commonjs/commercial/trust.js.map +1 -0
- package/lib/commonjs/confirmation/gate.js +62 -0
- package/lib/commonjs/confirmation/gate.js.map +1 -0
- package/lib/commonjs/cursor/CursorOverlay.js +141 -0
- package/lib/commonjs/cursor/CursorOverlay.js.map +1 -0
- package/lib/commonjs/cursor/PointerHand.js +51 -0
- package/lib/commonjs/cursor/PointerHand.js.map +1 -0
- package/lib/commonjs/cursor/controller.js +91 -0
- package/lib/commonjs/cursor/controller.js.map +1 -0
- package/lib/commonjs/cursor/pointer.js +49 -0
- package/lib/commonjs/cursor/pointer.js.map +1 -0
- package/lib/commonjs/debug/KokoRemoteSmoke.js +611 -0
- package/lib/commonjs/debug/KokoRemoteSmoke.js.map +1 -0
- package/lib/commonjs/explore/ExplorationGraph.js +418 -0
- package/lib/commonjs/explore/ExplorationGraph.js.map +1 -0
- package/lib/commonjs/explore/bootstrapExplore.js +59 -0
- package/lib/commonjs/explore/bootstrapExplore.js.map +1 -0
- package/lib/commonjs/host/HostActions.js +266 -0
- package/lib/commonjs/host/HostActions.js.map +1 -0
- package/lib/commonjs/i18n/index.js +169 -0
- package/lib/commonjs/i18n/index.js.map +1 -0
- package/lib/commonjs/i18n/runtimeMessages.js +184 -0
- package/lib/commonjs/i18n/runtimeMessages.js.map +1 -0
- package/lib/commonjs/index.js +640 -0
- package/lib/commonjs/index.js.map +1 -0
- package/lib/commonjs/native/NativeBridge.js +132 -0
- package/lib/commonjs/native/NativeBridge.js.map +1 -0
- package/lib/commonjs/native/navigationLabel.js +16 -0
- package/lib/commonjs/native/navigationLabel.js.map +1 -0
- package/lib/commonjs/native/normalizeViewTree.js +28 -0
- package/lib/commonjs/native/normalizeViewTree.js.map +1 -0
- package/lib/commonjs/native/pruneOffscreen.js +76 -0
- package/lib/commonjs/native/pruneOffscreen.js.map +1 -0
- package/lib/commonjs/native/scrollViewport.js +69 -0
- package/lib/commonjs/native/scrollViewport.js.map +1 -0
- package/lib/commonjs/package.json +1 -0
- package/lib/commonjs/privacy/redact.js +108 -0
- package/lib/commonjs/privacy/redact.js.map +1 -0
- package/lib/commonjs/privacy/screenEvidence.js +59 -0
- package/lib/commonjs/privacy/screenEvidence.js.map +1 -0
- package/lib/commonjs/privacy/screenModel.js +404 -0
- package/lib/commonjs/privacy/screenModel.js.map +1 -0
- package/lib/commonjs/privacy/sensitiveScreen.js +58 -0
- package/lib/commonjs/privacy/sensitiveScreen.js.map +1 -0
- package/lib/commonjs/privacy/userGate.js +213 -0
- package/lib/commonjs/privacy/userGate.js.map +1 -0
- package/lib/commonjs/protocol/actions.js +112 -0
- package/lib/commonjs/protocol/actions.js.map +1 -0
- package/lib/commonjs/provider/HostAppearanceStore.js +111 -0
- package/lib/commonjs/provider/HostAppearanceStore.js.map +1 -0
- package/lib/commonjs/provider/KokoProvider.js +81 -0
- package/lib/commonjs/provider/KokoProvider.js.map +1 -0
- package/lib/commonjs/provider/KokoUiContext.js +102 -0
- package/lib/commonjs/provider/KokoUiContext.js.map +1 -0
- package/lib/commonjs/selector/match.js +378 -0
- package/lib/commonjs/selector/match.js.map +1 -0
- package/lib/commonjs/task/TaskStore.js +361 -0
- package/lib/commonjs/task/TaskStore.js.map +1 -0
- package/lib/commonjs/task/types.js +2 -0
- package/lib/commonjs/task/types.js.map +1 -0
- package/lib/commonjs/task/useTaskStore.js +14 -0
- package/lib/commonjs/task/useTaskStore.js.map +1 -0
- package/lib/commonjs/types.js +2 -0
- package/lib/commonjs/types.js.map +1 -0
- package/lib/commonjs/ui/KokoChatSheet.js +885 -0
- package/lib/commonjs/ui/KokoChatSheet.js.map +1 -0
- package/lib/commonjs/ui/KokoComposer.js +161 -0
- package/lib/commonjs/ui/KokoComposer.js.map +1 -0
- package/lib/commonjs/ui/KokoDialogHost.js +254 -0
- package/lib/commonjs/ui/KokoDialogHost.js.map +1 -0
- package/lib/commonjs/ui/KokoEntryButton.js +81 -0
- package/lib/commonjs/ui/KokoEntryButton.js.map +1 -0
- package/lib/commonjs/ui/KokoObserver.js +522 -0
- package/lib/commonjs/ui/KokoObserver.js.map +1 -0
- package/lib/commonjs/ui/KokoOverlayLayer.js +45 -0
- package/lib/commonjs/ui/KokoOverlayLayer.js.map +1 -0
- package/lib/commonjs/ui/KokoSubtitle.js +95 -0
- package/lib/commonjs/ui/KokoSubtitle.js.map +1 -0
- package/lib/commonjs/ui/KokoTaskPanel.js +322 -0
- package/lib/commonjs/ui/KokoTaskPanel.js.map +1 -0
- package/lib/commonjs/ui/hostOverlay.js +126 -0
- package/lib/commonjs/ui/hostOverlay.js.map +1 -0
- package/lib/commonjs/ui/icons.js +132 -0
- package/lib/commonjs/ui/icons.js.map +1 -0
- package/lib/commonjs/ui/progressChrome.js +66 -0
- package/lib/commonjs/ui/progressChrome.js.map +1 -0
- package/lib/commonjs/ui/safeArea.js +96 -0
- package/lib/commonjs/ui/safeArea.js.map +1 -0
- package/lib/commonjs/ui/useOverlayOrigin.js +40 -0
- package/lib/commonjs/ui/useOverlayOrigin.js.map +1 -0
- package/lib/module/KokoAgent.js +1418 -0
- package/lib/module/KokoAgent.js.map +1 -0
- package/lib/module/assist/OnDeviceAssist.js +89 -0
- package/lib/module/assist/OnDeviceAssist.js.map +1 -0
- package/lib/module/assist/intentClassify.js +95 -0
- package/lib/module/assist/intentClassify.js.map +1 -0
- package/lib/module/assist/nodeRank.js +115 -0
- package/lib/module/assist/nodeRank.js.map +1 -0
- package/lib/module/assist/ocrTarget.js +123 -0
- package/lib/module/assist/ocrTarget.js.map +1 -0
- package/lib/module/assist/webVisualChange.js +24 -0
- package/lib/module/assist/webVisualChange.js.map +1 -0
- package/lib/module/client/ActionOutcomeUnknownError.js +23 -0
- package/lib/module/client/ActionOutcomeUnknownError.js.map +1 -0
- package/lib/module/client/AgentSession.js +854 -0
- package/lib/module/client/AgentSession.js.map +1 -0
- package/lib/module/client/GatewayClient.js +293 -0
- package/lib/module/client/GatewayClient.js.map +1 -0
- package/lib/module/client/OperationReplayGuard.js +58 -0
- package/lib/module/client/OperationReplayGuard.js.map +1 -0
- package/lib/module/client/RunCheckpoint.js +135 -0
- package/lib/module/client/RunCheckpoint.js.map +1 -0
- package/lib/module/client/loopDetect.js +177 -0
- package/lib/module/client/loopDetect.js.map +1 -0
- package/lib/module/client/recentSearch.js +46 -0
- package/lib/module/client/recentSearch.js.map +1 -0
- package/lib/module/client/walletChoiceGuard.js +14 -0
- package/lib/module/client/walletChoiceGuard.js.map +1 -0
- package/lib/module/client/webResultCategory.js +34 -0
- package/lib/module/client/webResultCategory.js.map +1 -0
- package/lib/module/commercial/AccountStore.js +75 -0
- package/lib/module/commercial/AccountStore.js.map +1 -0
- package/lib/module/commercial/AgentDebug.js +99 -0
- package/lib/module/commercial/AgentDebug.js.map +1 -0
- package/lib/module/commercial/ExecutionGuard.js +49 -0
- package/lib/module/commercial/ExecutionGuard.js.map +1 -0
- package/lib/module/commercial/UsageBus.js +38 -0
- package/lib/module/commercial/UsageBus.js.map +1 -0
- package/lib/module/commercial/branding.js +63 -0
- package/lib/module/commercial/branding.js.map +1 -0
- package/lib/module/commercial/devMode.js +45 -0
- package/lib/module/commercial/devMode.js.map +1 -0
- package/lib/module/commercial/trust.js +62 -0
- package/lib/module/commercial/trust.js.map +1 -0
- package/lib/module/confirmation/gate.js +54 -0
- package/lib/module/confirmation/gate.js.map +1 -0
- package/lib/module/cursor/CursorOverlay.js +136 -0
- package/lib/module/cursor/CursorOverlay.js.map +1 -0
- package/lib/module/cursor/PointerHand.js +47 -0
- package/lib/module/cursor/PointerHand.js.map +1 -0
- package/lib/module/cursor/controller.js +87 -0
- package/lib/module/cursor/controller.js.map +1 -0
- package/lib/module/cursor/pointer.js +45 -0
- package/lib/module/cursor/pointer.js.map +1 -0
- package/lib/module/debug/KokoRemoteSmoke.js +608 -0
- package/lib/module/debug/KokoRemoteSmoke.js.map +1 -0
- package/lib/module/explore/ExplorationGraph.js +406 -0
- package/lib/module/explore/ExplorationGraph.js.map +1 -0
- package/lib/module/explore/bootstrapExplore.js +55 -0
- package/lib/module/explore/bootstrapExplore.js.map +1 -0
- package/lib/module/host/HostActions.js +255 -0
- package/lib/module/host/HostActions.js.map +1 -0
- package/lib/module/i18n/index.js +159 -0
- package/lib/module/i18n/index.js.map +1 -0
- package/lib/module/i18n/runtimeMessages.js +180 -0
- package/lib/module/i18n/runtimeMessages.js.map +1 -0
- package/lib/module/index.js +44 -0
- package/lib/module/index.js.map +1 -0
- package/lib/module/native/NativeBridge.js +128 -0
- package/lib/module/native/NativeBridge.js.map +1 -0
- package/lib/module/native/navigationLabel.js +12 -0
- package/lib/module/native/navigationLabel.js.map +1 -0
- package/lib/module/native/normalizeViewTree.js +25 -0
- package/lib/module/native/normalizeViewTree.js.map +1 -0
- package/lib/module/native/pruneOffscreen.js +72 -0
- package/lib/module/native/pruneOffscreen.js.map +1 -0
- package/lib/module/native/scrollViewport.js +63 -0
- package/lib/module/native/scrollViewport.js.map +1 -0
- package/lib/module/package.json +1 -0
- package/lib/module/privacy/redact.js +103 -0
- package/lib/module/privacy/redact.js.map +1 -0
- package/lib/module/privacy/screenEvidence.js +50 -0
- package/lib/module/privacy/screenEvidence.js.map +1 -0
- package/lib/module/privacy/screenModel.js +397 -0
- package/lib/module/privacy/screenModel.js.map +1 -0
- package/lib/module/privacy/sensitiveScreen.js +52 -0
- package/lib/module/privacy/sensitiveScreen.js.map +1 -0
- package/lib/module/privacy/userGate.js +202 -0
- package/lib/module/privacy/userGate.js.map +1 -0
- package/lib/module/protocol/actions.js +108 -0
- package/lib/module/protocol/actions.js.map +1 -0
- package/lib/module/provider/HostAppearanceStore.js +101 -0
- package/lib/module/provider/HostAppearanceStore.js.map +1 -0
- package/lib/module/provider/KokoProvider.js +74 -0
- package/lib/module/provider/KokoProvider.js.map +1 -0
- package/lib/module/provider/KokoUiContext.js +96 -0
- package/lib/module/provider/KokoUiContext.js.map +1 -0
- package/lib/module/selector/match.js +366 -0
- package/lib/module/selector/match.js.map +1 -0
- package/lib/module/task/TaskStore.js +356 -0
- package/lib/module/task/TaskStore.js.map +1 -0
- package/lib/module/task/types.js +2 -0
- package/lib/module/task/types.js.map +1 -0
- package/lib/module/task/useTaskStore.js +10 -0
- package/lib/module/task/useTaskStore.js.map +1 -0
- package/lib/module/types.js +2 -0
- package/lib/module/types.js.map +1 -0
- package/lib/module/ui/KokoChatSheet.js +879 -0
- package/lib/module/ui/KokoChatSheet.js.map +1 -0
- package/lib/module/ui/KokoComposer.js +155 -0
- package/lib/module/ui/KokoComposer.js.map +1 -0
- package/lib/module/ui/KokoDialogHost.js +247 -0
- package/lib/module/ui/KokoDialogHost.js.map +1 -0
- package/lib/module/ui/KokoEntryButton.js +74 -0
- package/lib/module/ui/KokoEntryButton.js.map +1 -0
- package/lib/module/ui/KokoObserver.js +516 -0
- package/lib/module/ui/KokoObserver.js.map +1 -0
- package/lib/module/ui/KokoOverlayLayer.js +39 -0
- package/lib/module/ui/KokoOverlayLayer.js.map +1 -0
- package/lib/module/ui/KokoSubtitle.js +90 -0
- package/lib/module/ui/KokoSubtitle.js.map +1 -0
- package/lib/module/ui/KokoTaskPanel.js +316 -0
- package/lib/module/ui/KokoTaskPanel.js.map +1 -0
- package/lib/module/ui/hostOverlay.js +120 -0
- package/lib/module/ui/hostOverlay.js.map +1 -0
- package/lib/module/ui/icons.js +124 -0
- package/lib/module/ui/icons.js.map +1 -0
- package/lib/module/ui/progressChrome.js +58 -0
- package/lib/module/ui/progressChrome.js.map +1 -0
- package/lib/module/ui/safeArea.js +92 -0
- package/lib/module/ui/safeArea.js.map +1 -0
- package/lib/module/ui/useOverlayOrigin.js +36 -0
- package/lib/module/ui/useOverlayOrigin.js.map +1 -0
- package/lib/typescript/commonjs/KokoAgent.d.ts +167 -0
- package/lib/typescript/commonjs/KokoAgent.d.ts.map +1 -0
- package/lib/typescript/commonjs/assist/OnDeviceAssist.d.ts +31 -0
- package/lib/typescript/commonjs/assist/OnDeviceAssist.d.ts.map +1 -0
- package/lib/typescript/commonjs/assist/intentClassify.d.ts +18 -0
- package/lib/typescript/commonjs/assist/intentClassify.d.ts.map +1 -0
- package/lib/typescript/commonjs/assist/nodeRank.d.ts +32 -0
- package/lib/typescript/commonjs/assist/nodeRank.d.ts.map +1 -0
- package/lib/typescript/commonjs/assist/ocrTarget.d.ts +25 -0
- package/lib/typescript/commonjs/assist/ocrTarget.d.ts.map +1 -0
- package/lib/typescript/commonjs/assist/webVisualChange.d.ts +6 -0
- package/lib/typescript/commonjs/assist/webVisualChange.d.ts.map +1 -0
- package/lib/typescript/commonjs/client/ActionOutcomeUnknownError.d.ts +13 -0
- package/lib/typescript/commonjs/client/ActionOutcomeUnknownError.d.ts.map +1 -0
- package/lib/typescript/commonjs/client/AgentSession.d.ts +56 -0
- package/lib/typescript/commonjs/client/AgentSession.d.ts.map +1 -0
- package/lib/typescript/commonjs/client/GatewayClient.d.ts +149 -0
- package/lib/typescript/commonjs/client/GatewayClient.d.ts.map +1 -0
- package/lib/typescript/commonjs/client/OperationReplayGuard.d.ts +13 -0
- package/lib/typescript/commonjs/client/OperationReplayGuard.d.ts.map +1 -0
- package/lib/typescript/commonjs/client/RunCheckpoint.d.ts +57 -0
- package/lib/typescript/commonjs/client/RunCheckpoint.d.ts.map +1 -0
- package/lib/typescript/commonjs/client/loopDetect.d.ts +15 -0
- package/lib/typescript/commonjs/client/loopDetect.d.ts.map +1 -0
- package/lib/typescript/commonjs/client/recentSearch.d.ts +5 -0
- package/lib/typescript/commonjs/client/recentSearch.d.ts.map +1 -0
- package/lib/typescript/commonjs/client/walletChoiceGuard.d.ts +4 -0
- package/lib/typescript/commonjs/client/walletChoiceGuard.d.ts.map +1 -0
- package/lib/typescript/commonjs/client/webResultCategory.d.ts +5 -0
- package/lib/typescript/commonjs/client/webResultCategory.d.ts.map +1 -0
- package/lib/typescript/commonjs/commercial/AccountStore.d.ts +17 -0
- package/lib/typescript/commonjs/commercial/AccountStore.d.ts.map +1 -0
- package/lib/typescript/commonjs/commercial/AgentDebug.d.ts +25 -0
- package/lib/typescript/commonjs/commercial/AgentDebug.d.ts.map +1 -0
- package/lib/typescript/commonjs/commercial/ExecutionGuard.d.ts +18 -0
- package/lib/typescript/commonjs/commercial/ExecutionGuard.d.ts.map +1 -0
- package/lib/typescript/commonjs/commercial/UsageBus.d.ts +18 -0
- package/lib/typescript/commonjs/commercial/UsageBus.d.ts.map +1 -0
- package/lib/typescript/commonjs/commercial/branding.d.ts +25 -0
- package/lib/typescript/commonjs/commercial/branding.d.ts.map +1 -0
- package/lib/typescript/commonjs/commercial/devMode.d.ts +26 -0
- package/lib/typescript/commonjs/commercial/devMode.d.ts.map +1 -0
- package/lib/typescript/commonjs/commercial/trust.d.ts +21 -0
- package/lib/typescript/commonjs/commercial/trust.d.ts.map +1 -0
- package/lib/typescript/commonjs/confirmation/gate.d.ts +18 -0
- package/lib/typescript/commonjs/confirmation/gate.d.ts.map +1 -0
- package/lib/typescript/commonjs/cursor/CursorOverlay.d.ts +13 -0
- package/lib/typescript/commonjs/cursor/CursorOverlay.d.ts.map +1 -0
- package/lib/typescript/commonjs/cursor/PointerHand.d.ts +16 -0
- package/lib/typescript/commonjs/cursor/PointerHand.d.ts.map +1 -0
- package/lib/typescript/commonjs/cursor/controller.d.ts +30 -0
- package/lib/typescript/commonjs/cursor/controller.d.ts.map +1 -0
- package/lib/typescript/commonjs/cursor/pointer.d.ts +23 -0
- package/lib/typescript/commonjs/cursor/pointer.d.ts.map +1 -0
- package/lib/typescript/commonjs/debug/KokoRemoteSmoke.d.ts +96 -0
- package/lib/typescript/commonjs/debug/KokoRemoteSmoke.d.ts.map +1 -0
- package/lib/typescript/commonjs/explore/ExplorationGraph.d.ts +96 -0
- package/lib/typescript/commonjs/explore/ExplorationGraph.d.ts.map +1 -0
- package/lib/typescript/commonjs/explore/bootstrapExplore.d.ts +40 -0
- package/lib/typescript/commonjs/explore/bootstrapExplore.d.ts.map +1 -0
- package/lib/typescript/commonjs/host/HostActions.d.ts +101 -0
- package/lib/typescript/commonjs/host/HostActions.d.ts.map +1 -0
- package/lib/typescript/commonjs/i18n/index.d.ts +20 -0
- package/lib/typescript/commonjs/i18n/index.d.ts.map +1 -0
- package/lib/typescript/commonjs/i18n/runtimeMessages.d.ts +178 -0
- package/lib/typescript/commonjs/i18n/runtimeMessages.d.ts.map +1 -0
- package/lib/typescript/commonjs/index.d.ts +66 -0
- package/lib/typescript/commonjs/index.d.ts.map +1 -0
- package/lib/typescript/commonjs/native/NativeBridge.d.ts +70 -0
- package/lib/typescript/commonjs/native/NativeBridge.d.ts.map +1 -0
- package/lib/typescript/commonjs/native/navigationLabel.d.ts +4 -0
- package/lib/typescript/commonjs/native/navigationLabel.d.ts.map +1 -0
- package/lib/typescript/commonjs/native/normalizeViewTree.d.ts +4 -0
- package/lib/typescript/commonjs/native/normalizeViewTree.d.ts.map +1 -0
- package/lib/typescript/commonjs/native/pruneOffscreen.d.ts +3 -0
- package/lib/typescript/commonjs/native/pruneOffscreen.d.ts.map +1 -0
- package/lib/typescript/commonjs/native/scrollViewport.d.ts +13 -0
- package/lib/typescript/commonjs/native/scrollViewport.d.ts.map +1 -0
- package/lib/typescript/commonjs/package.json +1 -0
- package/lib/typescript/commonjs/privacy/redact.d.ts +9 -0
- package/lib/typescript/commonjs/privacy/redact.d.ts.map +1 -0
- package/lib/typescript/commonjs/privacy/screenEvidence.d.ts +14 -0
- package/lib/typescript/commonjs/privacy/screenEvidence.d.ts.map +1 -0
- package/lib/typescript/commonjs/privacy/screenModel.d.ts +26 -0
- package/lib/typescript/commonjs/privacy/screenModel.d.ts.map +1 -0
- package/lib/typescript/commonjs/privacy/sensitiveScreen.d.ts +8 -0
- package/lib/typescript/commonjs/privacy/sensitiveScreen.d.ts.map +1 -0
- package/lib/typescript/commonjs/privacy/userGate.d.ts +58 -0
- package/lib/typescript/commonjs/privacy/userGate.d.ts.map +1 -0
- package/lib/typescript/commonjs/protocol/actions.d.ts +7 -0
- package/lib/typescript/commonjs/protocol/actions.d.ts.map +1 -0
- package/lib/typescript/commonjs/provider/HostAppearanceStore.d.ts +64 -0
- package/lib/typescript/commonjs/provider/HostAppearanceStore.d.ts.map +1 -0
- package/lib/typescript/commonjs/provider/KokoProvider.d.ts +39 -0
- package/lib/typescript/commonjs/provider/KokoProvider.d.ts.map +1 -0
- package/lib/typescript/commonjs/provider/KokoUiContext.d.ts +22 -0
- package/lib/typescript/commonjs/provider/KokoUiContext.d.ts.map +1 -0
- package/lib/typescript/commonjs/selector/match.d.ts +27 -0
- package/lib/typescript/commonjs/selector/match.d.ts.map +1 -0
- package/lib/typescript/commonjs/task/TaskStore.d.ts +65 -0
- package/lib/typescript/commonjs/task/TaskStore.d.ts.map +1 -0
- package/lib/typescript/commonjs/task/types.d.ts +66 -0
- package/lib/typescript/commonjs/task/types.d.ts.map +1 -0
- package/lib/typescript/commonjs/task/useTaskStore.d.ts +3 -0
- package/lib/typescript/commonjs/task/useTaskStore.d.ts.map +1 -0
- package/lib/typescript/commonjs/types.d.ts +372 -0
- package/lib/typescript/commonjs/types.d.ts.map +1 -0
- package/lib/typescript/commonjs/ui/KokoChatSheet.d.ts +8 -0
- package/lib/typescript/commonjs/ui/KokoChatSheet.d.ts.map +1 -0
- package/lib/typescript/commonjs/ui/KokoComposer.d.ts +13 -0
- package/lib/typescript/commonjs/ui/KokoComposer.d.ts.map +1 -0
- package/lib/typescript/commonjs/ui/KokoDialogHost.d.ts +32 -0
- package/lib/typescript/commonjs/ui/KokoDialogHost.d.ts.map +1 -0
- package/lib/typescript/commonjs/ui/KokoEntryButton.d.ts +18 -0
- package/lib/typescript/commonjs/ui/KokoEntryButton.d.ts.map +1 -0
- package/lib/typescript/commonjs/ui/KokoObserver.d.ts +13 -0
- package/lib/typescript/commonjs/ui/KokoObserver.d.ts.map +1 -0
- package/lib/typescript/commonjs/ui/KokoOverlayLayer.d.ts +35 -0
- package/lib/typescript/commonjs/ui/KokoOverlayLayer.d.ts.map +1 -0
- package/lib/typescript/commonjs/ui/KokoSubtitle.d.ts +7 -0
- package/lib/typescript/commonjs/ui/KokoSubtitle.d.ts.map +1 -0
- package/lib/typescript/commonjs/ui/KokoTaskPanel.d.ts +7 -0
- package/lib/typescript/commonjs/ui/KokoTaskPanel.d.ts.map +1 -0
- package/lib/typescript/commonjs/ui/hostOverlay.d.ts +28 -0
- package/lib/typescript/commonjs/ui/hostOverlay.d.ts.map +1 -0
- package/lib/typescript/commonjs/ui/icons.d.ts +26 -0
- package/lib/typescript/commonjs/ui/icons.d.ts.map +1 -0
- package/lib/typescript/commonjs/ui/progressChrome.d.ts +21 -0
- package/lib/typescript/commonjs/ui/progressChrome.d.ts.map +1 -0
- package/lib/typescript/commonjs/ui/safeArea.d.ts +12 -0
- package/lib/typescript/commonjs/ui/safeArea.d.ts.map +1 -0
- package/lib/typescript/commonjs/ui/useOverlayOrigin.d.ts +22 -0
- package/lib/typescript/commonjs/ui/useOverlayOrigin.d.ts.map +1 -0
- package/lib/typescript/module/KokoAgent.d.ts +167 -0
- package/lib/typescript/module/KokoAgent.d.ts.map +1 -0
- package/lib/typescript/module/assist/OnDeviceAssist.d.ts +31 -0
- package/lib/typescript/module/assist/OnDeviceAssist.d.ts.map +1 -0
- package/lib/typescript/module/assist/intentClassify.d.ts +18 -0
- package/lib/typescript/module/assist/intentClassify.d.ts.map +1 -0
- package/lib/typescript/module/assist/nodeRank.d.ts +32 -0
- package/lib/typescript/module/assist/nodeRank.d.ts.map +1 -0
- package/lib/typescript/module/assist/ocrTarget.d.ts +25 -0
- package/lib/typescript/module/assist/ocrTarget.d.ts.map +1 -0
- package/lib/typescript/module/assist/webVisualChange.d.ts +6 -0
- package/lib/typescript/module/assist/webVisualChange.d.ts.map +1 -0
- package/lib/typescript/module/client/ActionOutcomeUnknownError.d.ts +13 -0
- package/lib/typescript/module/client/ActionOutcomeUnknownError.d.ts.map +1 -0
- package/lib/typescript/module/client/AgentSession.d.ts +56 -0
- package/lib/typescript/module/client/AgentSession.d.ts.map +1 -0
- package/lib/typescript/module/client/GatewayClient.d.ts +149 -0
- package/lib/typescript/module/client/GatewayClient.d.ts.map +1 -0
- package/lib/typescript/module/client/OperationReplayGuard.d.ts +13 -0
- package/lib/typescript/module/client/OperationReplayGuard.d.ts.map +1 -0
- package/lib/typescript/module/client/RunCheckpoint.d.ts +57 -0
- package/lib/typescript/module/client/RunCheckpoint.d.ts.map +1 -0
- package/lib/typescript/module/client/loopDetect.d.ts +15 -0
- package/lib/typescript/module/client/loopDetect.d.ts.map +1 -0
- package/lib/typescript/module/client/recentSearch.d.ts +5 -0
- package/lib/typescript/module/client/recentSearch.d.ts.map +1 -0
- package/lib/typescript/module/client/walletChoiceGuard.d.ts +4 -0
- package/lib/typescript/module/client/walletChoiceGuard.d.ts.map +1 -0
- package/lib/typescript/module/client/webResultCategory.d.ts +5 -0
- package/lib/typescript/module/client/webResultCategory.d.ts.map +1 -0
- package/lib/typescript/module/commercial/AccountStore.d.ts +17 -0
- package/lib/typescript/module/commercial/AccountStore.d.ts.map +1 -0
- package/lib/typescript/module/commercial/AgentDebug.d.ts +25 -0
- package/lib/typescript/module/commercial/AgentDebug.d.ts.map +1 -0
- package/lib/typescript/module/commercial/ExecutionGuard.d.ts +18 -0
- package/lib/typescript/module/commercial/ExecutionGuard.d.ts.map +1 -0
- package/lib/typescript/module/commercial/UsageBus.d.ts +18 -0
- package/lib/typescript/module/commercial/UsageBus.d.ts.map +1 -0
- package/lib/typescript/module/commercial/branding.d.ts +25 -0
- package/lib/typescript/module/commercial/branding.d.ts.map +1 -0
- package/lib/typescript/module/commercial/devMode.d.ts +26 -0
- package/lib/typescript/module/commercial/devMode.d.ts.map +1 -0
- package/lib/typescript/module/commercial/trust.d.ts +21 -0
- package/lib/typescript/module/commercial/trust.d.ts.map +1 -0
- package/lib/typescript/module/confirmation/gate.d.ts +18 -0
- package/lib/typescript/module/confirmation/gate.d.ts.map +1 -0
- package/lib/typescript/module/cursor/CursorOverlay.d.ts +13 -0
- package/lib/typescript/module/cursor/CursorOverlay.d.ts.map +1 -0
- package/lib/typescript/module/cursor/PointerHand.d.ts +16 -0
- package/lib/typescript/module/cursor/PointerHand.d.ts.map +1 -0
- package/lib/typescript/module/cursor/controller.d.ts +30 -0
- package/lib/typescript/module/cursor/controller.d.ts.map +1 -0
- package/lib/typescript/module/cursor/pointer.d.ts +23 -0
- package/lib/typescript/module/cursor/pointer.d.ts.map +1 -0
- package/lib/typescript/module/debug/KokoRemoteSmoke.d.ts +96 -0
- package/lib/typescript/module/debug/KokoRemoteSmoke.d.ts.map +1 -0
- package/lib/typescript/module/explore/ExplorationGraph.d.ts +96 -0
- package/lib/typescript/module/explore/ExplorationGraph.d.ts.map +1 -0
- package/lib/typescript/module/explore/bootstrapExplore.d.ts +40 -0
- package/lib/typescript/module/explore/bootstrapExplore.d.ts.map +1 -0
- package/lib/typescript/module/host/HostActions.d.ts +101 -0
- package/lib/typescript/module/host/HostActions.d.ts.map +1 -0
- package/lib/typescript/module/i18n/index.d.ts +20 -0
- package/lib/typescript/module/i18n/index.d.ts.map +1 -0
- package/lib/typescript/module/i18n/runtimeMessages.d.ts +178 -0
- package/lib/typescript/module/i18n/runtimeMessages.d.ts.map +1 -0
- package/lib/typescript/module/index.d.ts +66 -0
- package/lib/typescript/module/index.d.ts.map +1 -0
- package/lib/typescript/module/native/NativeBridge.d.ts +70 -0
- package/lib/typescript/module/native/NativeBridge.d.ts.map +1 -0
- package/lib/typescript/module/native/navigationLabel.d.ts +4 -0
- package/lib/typescript/module/native/navigationLabel.d.ts.map +1 -0
- package/lib/typescript/module/native/normalizeViewTree.d.ts +4 -0
- package/lib/typescript/module/native/normalizeViewTree.d.ts.map +1 -0
- package/lib/typescript/module/native/pruneOffscreen.d.ts +3 -0
- package/lib/typescript/module/native/pruneOffscreen.d.ts.map +1 -0
- package/lib/typescript/module/native/scrollViewport.d.ts +13 -0
- package/lib/typescript/module/native/scrollViewport.d.ts.map +1 -0
- package/lib/typescript/module/package.json +1 -0
- package/lib/typescript/module/privacy/redact.d.ts +9 -0
- package/lib/typescript/module/privacy/redact.d.ts.map +1 -0
- package/lib/typescript/module/privacy/screenEvidence.d.ts +14 -0
- package/lib/typescript/module/privacy/screenEvidence.d.ts.map +1 -0
- package/lib/typescript/module/privacy/screenModel.d.ts +26 -0
- package/lib/typescript/module/privacy/screenModel.d.ts.map +1 -0
- package/lib/typescript/module/privacy/sensitiveScreen.d.ts +8 -0
- package/lib/typescript/module/privacy/sensitiveScreen.d.ts.map +1 -0
- package/lib/typescript/module/privacy/userGate.d.ts +58 -0
- package/lib/typescript/module/privacy/userGate.d.ts.map +1 -0
- package/lib/typescript/module/protocol/actions.d.ts +7 -0
- package/lib/typescript/module/protocol/actions.d.ts.map +1 -0
- package/lib/typescript/module/provider/HostAppearanceStore.d.ts +64 -0
- package/lib/typescript/module/provider/HostAppearanceStore.d.ts.map +1 -0
- package/lib/typescript/module/provider/KokoProvider.d.ts +39 -0
- package/lib/typescript/module/provider/KokoProvider.d.ts.map +1 -0
- package/lib/typescript/module/provider/KokoUiContext.d.ts +22 -0
- package/lib/typescript/module/provider/KokoUiContext.d.ts.map +1 -0
- package/lib/typescript/module/selector/match.d.ts +27 -0
- package/lib/typescript/module/selector/match.d.ts.map +1 -0
- package/lib/typescript/module/task/TaskStore.d.ts +65 -0
- package/lib/typescript/module/task/TaskStore.d.ts.map +1 -0
- package/lib/typescript/module/task/types.d.ts +66 -0
- package/lib/typescript/module/task/types.d.ts.map +1 -0
- package/lib/typescript/module/task/useTaskStore.d.ts +3 -0
- package/lib/typescript/module/task/useTaskStore.d.ts.map +1 -0
- package/lib/typescript/module/types.d.ts +372 -0
- package/lib/typescript/module/types.d.ts.map +1 -0
- package/lib/typescript/module/ui/KokoChatSheet.d.ts +8 -0
- package/lib/typescript/module/ui/KokoChatSheet.d.ts.map +1 -0
- package/lib/typescript/module/ui/KokoComposer.d.ts +13 -0
- package/lib/typescript/module/ui/KokoComposer.d.ts.map +1 -0
- package/lib/typescript/module/ui/KokoDialogHost.d.ts +32 -0
- package/lib/typescript/module/ui/KokoDialogHost.d.ts.map +1 -0
- package/lib/typescript/module/ui/KokoEntryButton.d.ts +18 -0
- package/lib/typescript/module/ui/KokoEntryButton.d.ts.map +1 -0
- package/lib/typescript/module/ui/KokoObserver.d.ts +13 -0
- package/lib/typescript/module/ui/KokoObserver.d.ts.map +1 -0
- package/lib/typescript/module/ui/KokoOverlayLayer.d.ts +35 -0
- package/lib/typescript/module/ui/KokoOverlayLayer.d.ts.map +1 -0
- package/lib/typescript/module/ui/KokoSubtitle.d.ts +7 -0
- package/lib/typescript/module/ui/KokoSubtitle.d.ts.map +1 -0
- package/lib/typescript/module/ui/KokoTaskPanel.d.ts +7 -0
- package/lib/typescript/module/ui/KokoTaskPanel.d.ts.map +1 -0
- package/lib/typescript/module/ui/hostOverlay.d.ts +28 -0
- package/lib/typescript/module/ui/hostOverlay.d.ts.map +1 -0
- package/lib/typescript/module/ui/icons.d.ts +26 -0
- package/lib/typescript/module/ui/icons.d.ts.map +1 -0
- package/lib/typescript/module/ui/progressChrome.d.ts +21 -0
- package/lib/typescript/module/ui/progressChrome.d.ts.map +1 -0
- package/lib/typescript/module/ui/safeArea.d.ts +12 -0
- package/lib/typescript/module/ui/safeArea.d.ts.map +1 -0
- package/lib/typescript/module/ui/useOverlayOrigin.d.ts +22 -0
- package/lib/typescript/module/ui/useOverlayOrigin.d.ts.map +1 -0
- package/package.json +153 -0
- package/react-native.config.js +12 -0
- package/src/KokoAgent.ts +1415 -0
- package/src/assist/OnDeviceAssist.ts +133 -0
- package/src/assist/intentClassify.ts +122 -0
- package/src/assist/nodeRank.ts +167 -0
- package/src/assist/ocrTarget.ts +146 -0
- package/src/assist/webVisualChange.ts +24 -0
- package/src/client/ActionOutcomeUnknownError.ts +18 -0
- package/src/client/AgentSession.ts +952 -0
- package/src/client/GatewayClient.ts +439 -0
- package/src/client/OperationReplayGuard.ts +61 -0
- package/src/client/RunCheckpoint.ts +154 -0
- package/src/client/loopDetect.ts +213 -0
- package/src/client/recentSearch.ts +47 -0
- package/src/client/walletChoiceGuard.ts +15 -0
- package/src/client/webResultCategory.ts +28 -0
- package/src/commercial/AccountStore.ts +85 -0
- package/src/commercial/AgentDebug.ts +142 -0
- package/src/commercial/ExecutionGuard.ts +67 -0
- package/src/commercial/UsageBus.ts +44 -0
- package/src/commercial/branding.ts +97 -0
- package/src/commercial/devMode.ts +48 -0
- package/src/commercial/trust.ts +67 -0
- package/src/confirmation/gate.ts +82 -0
- package/src/cursor/CursorOverlay.tsx +138 -0
- package/src/cursor/PointerHand.tsx +49 -0
- package/src/cursor/controller.ts +98 -0
- package/src/cursor/pointer.ts +40 -0
- package/src/debug/KokoRemoteSmoke.tsx +561 -0
- package/src/explore/ExplorationGraph.ts +518 -0
- package/src/explore/bootstrapExplore.ts +89 -0
- package/src/host/HostActions.ts +349 -0
- package/src/i18n/index.ts +229 -0
- package/src/i18n/runtimeMessages.ts +180 -0
- package/src/index.ts +203 -0
- package/src/native/NativeBridge.ts +207 -0
- package/src/native/navigationLabel.ts +11 -0
- package/src/native/normalizeViewTree.ts +16 -0
- package/src/native/pruneOffscreen.ts +72 -0
- package/src/native/scrollViewport.ts +51 -0
- package/src/privacy/redact.ts +115 -0
- package/src/privacy/screenEvidence.ts +55 -0
- package/src/privacy/screenModel.ts +504 -0
- package/src/privacy/sensitiveScreen.ts +55 -0
- package/src/privacy/userGate.ts +233 -0
- package/src/protocol/actions.ts +66 -0
- package/src/provider/HostAppearanceStore.ts +148 -0
- package/src/provider/KokoProvider.tsx +118 -0
- package/src/provider/KokoUiContext.tsx +162 -0
- package/src/selector/match.ts +417 -0
- package/src/task/TaskStore.ts +387 -0
- package/src/task/types.ts +82 -0
- package/src/task/useTaskStore.ts +9 -0
- package/src/types.ts +318 -0
- package/src/ui/KokoChatSheet.tsx +930 -0
- package/src/ui/KokoComposer.tsx +174 -0
- package/src/ui/KokoDialogHost.tsx +249 -0
- package/src/ui/KokoEntryButton.tsx +74 -0
- package/src/ui/KokoObserver.tsx +587 -0
- package/src/ui/KokoOverlayLayer.tsx +53 -0
- package/src/ui/KokoSubtitle.tsx +80 -0
- package/src/ui/KokoTaskPanel.tsx +299 -0
- package/src/ui/hostOverlay.tsx +148 -0
- package/src/ui/icons.tsx +145 -0
- package/src/ui/progressChrome.ts +73 -0
- package/src/ui/safeArea.ts +95 -0
- package/src/ui/useOverlayOrigin.ts +29 -0
|
@@ -0,0 +1,177 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Idle / dead-loop detection (mirrors SDK client + KokoAgent explore/escape).
|
|
5
|
+
* Stop on no-progress loops only — not because a goal needs many steps.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
export function actionFingerprint(item) {
|
|
9
|
+
const tool = item.tool;
|
|
10
|
+
const args = item.args ?? {};
|
|
11
|
+
if (tool === "tap") {
|
|
12
|
+
const sel = args.selector;
|
|
13
|
+
const matchKey = sel?.match != null ? JSON.stringify(sel.match).slice(0, 100) : "";
|
|
14
|
+
const nodeId = String(args.nodeId || "").trim();
|
|
15
|
+
const label = String(args.label || "").trim();
|
|
16
|
+
return `tap:${(matchKey || nodeId || label || "target").slice(0, 100)}`;
|
|
17
|
+
}
|
|
18
|
+
if (tool === "type") {
|
|
19
|
+
return `type:${String(args.text ?? "").slice(0, 40)}`;
|
|
20
|
+
}
|
|
21
|
+
if (tool === "find") {
|
|
22
|
+
return `find:${JSON.stringify(args.match ?? {}).slice(0, 100)}`;
|
|
23
|
+
}
|
|
24
|
+
if (tool === "swipe") {
|
|
25
|
+
const from = args.from;
|
|
26
|
+
const to = args.to;
|
|
27
|
+
return `swipe:${Math.round((from?.x ?? 0) / 40)},${Math.round((from?.y ?? 0) / 40)}→${Math.round((to?.x ?? 0) / 40)},${Math.round((to?.y ?? 0) / 40)}`;
|
|
28
|
+
}
|
|
29
|
+
if (tool === "pinch") {
|
|
30
|
+
const c = args.center;
|
|
31
|
+
const scale = Number(args.scale ?? 1);
|
|
32
|
+
return `pinch:${Math.round((c?.x ?? 0) / 40)},${Math.round((c?.y ?? 0) / 40)}×${scale.toFixed(2)}`;
|
|
33
|
+
}
|
|
34
|
+
if (tool === "dump") {
|
|
35
|
+
if (/empty|未识别|screen:\s*\(empty\)/i.test(item.result)) return "dump:empty";
|
|
36
|
+
return `dump:${item.result.replace(/\s+/g, " ").slice(0, 48)}`;
|
|
37
|
+
}
|
|
38
|
+
if (tool === "ask_user") return `ask:${String(args.question ?? "").slice(0, 40)}`;
|
|
39
|
+
return `${tool}:${JSON.stringify(args).slice(0, 60)}`;
|
|
40
|
+
}
|
|
41
|
+
function screenOf(item) {
|
|
42
|
+
const m = item.result.match(/(?:^|\|\|\s*)screen:\s*([^\r\n]*)/i);
|
|
43
|
+
return m?.[1]?.trim() ?? "";
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
/** Older hosts may return body text without a screen marker; retain all of it. */
|
|
47
|
+
function observationOf(item) {
|
|
48
|
+
return (screenOf(item) || item.result).replace(/\s+/g, " ").trim();
|
|
49
|
+
}
|
|
50
|
+
function sameObservation(items) {
|
|
51
|
+
return items.length >= 2 && items.every(h => observationOf(h) === observationOf(items[0]));
|
|
52
|
+
}
|
|
53
|
+
function isFail(item) {
|
|
54
|
+
if (typeof item.ok === "boolean") return !item.ok;
|
|
55
|
+
return /^(?:fail(?:ed)?|error|null|tap_failed|tap_noop|scroll_noop|no_focus|empty|未识别)(?:\b|[::\s(]|$)/i.test(item.result.trim());
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
/** Actions whose whole point is to change something on screen. */
|
|
59
|
+
const MUTATING = new Set(["tap", "swipe", "pinch", "type"]);
|
|
60
|
+
|
|
61
|
+
/** The client ran it and the screen did not react. */
|
|
62
|
+
function hadNoEffect(item) {
|
|
63
|
+
return item.ok === false || /^(?:tap_noop|tap_failed|scroll_noop|no_focus)\b/i.test(item.result.trim());
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
/**
|
|
67
|
+
* Selector wording drifts between retries — grounded text, then the a11y
|
|
68
|
+
* label, then a nodeId, then a coordinate fallback — so fingerprint equality
|
|
69
|
+
* misses the most common stall: aiming at the same place through a different
|
|
70
|
+
* description each time.
|
|
71
|
+
*
|
|
72
|
+
* Comparing whole screens across steps does not catch it either, because a
|
|
73
|
+
* rotating ad or carousel changes the fingerprint while the page stays put.
|
|
74
|
+
* Trust the per-step verdict instead: the client captures before and after
|
|
75
|
+
* around each action, moments apart, and marks it `tap_noop` when nothing
|
|
76
|
+
* moved. A window whose only attempts to change something all reported no
|
|
77
|
+
* effect is stuck, however the calls were phrased and whatever else animates.
|
|
78
|
+
*/
|
|
79
|
+
function madeNoProgress(history) {
|
|
80
|
+
const mutating = history.slice(-4).filter(h => MUTATING.has(h.tool));
|
|
81
|
+
const preDispatch = mutating.filter(h => /^pre_dispatch:/i.test(h.result));
|
|
82
|
+
const dispatched = mutating.filter(h => !/^pre_dispatch:/i.test(h.result));
|
|
83
|
+
if (preDispatch.length >= 3 && preDispatch.length === mutating.length) return true;
|
|
84
|
+
const dead = dispatched.filter(hadNoEffect);
|
|
85
|
+
return dead.length >= 2 && dead.length === dispatched.length;
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
/** Bound interleaved find/dump loops on one unchanged observed screen. */
|
|
89
|
+
function repeatedReadOnly(history) {
|
|
90
|
+
const tail = history.slice(-8);
|
|
91
|
+
if (tail.length < 8 || !tail.every(h => h.tool === 'find' || h.tool === 'dump')) return false;
|
|
92
|
+
const finds = tail.filter(h => h.tool === 'find');
|
|
93
|
+
const screens = tail.map(screenOf).filter(Boolean);
|
|
94
|
+
if (finds.length < 3 || screens.length < 3 || !screens.every(s => s === screens[0])) return false;
|
|
95
|
+
const fps = finds.map(actionFingerprint);
|
|
96
|
+
return fps.some(fp => fps.filter(value => value === fp).length >= 3) || finds.every(isFail);
|
|
97
|
+
}
|
|
98
|
+
export function isLooping(history) {
|
|
99
|
+
const recent = history.slice(-5);
|
|
100
|
+
if (recent.length < 3) return false;
|
|
101
|
+
if (madeNoProgress(history)) return true;
|
|
102
|
+
if (repeatedReadOnly(history)) return true;
|
|
103
|
+
const fps = recent.map(actionFingerprint);
|
|
104
|
+
const last = fps[fps.length - 1];
|
|
105
|
+
const sameFpCount = fps.filter(f => f === last).length;
|
|
106
|
+
const screenStagnant = recent.length >= 3 && sameObservation(recent);
|
|
107
|
+
const lastThree = recent.slice(-3);
|
|
108
|
+
const allFail = lastThree.every(isFail);
|
|
109
|
+
const identicalResults = lastThree.length === 3 && lastThree.every(h => h.result === lastThree[0].result);
|
|
110
|
+
|
|
111
|
+
// dump/find are observe — identical verify dumps must not abort mid-goal.
|
|
112
|
+
if (sameFpCount >= 3) {
|
|
113
|
+
const lastTool = recent[recent.length - 1]?.tool;
|
|
114
|
+
if (lastTool !== "dump" && lastTool !== "find") {
|
|
115
|
+
if (allFail || identicalResults || screenStagnant) return true;
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
if (recent.length >= 4) {
|
|
119
|
+
const a = fps[fps.length - 1];
|
|
120
|
+
const b = fps[fps.length - 2];
|
|
121
|
+
if (a && b && a !== b && fps[fps.length - 3] === a && fps[fps.length - 4] === b) {
|
|
122
|
+
// Alternating actions are common in valid workflows (select/continue,
|
|
123
|
+
// increment/confirm, tap/verify). Only stop when each phase also returns
|
|
124
|
+
// to the same observation, rather than when actions alone form A-B-A-B.
|
|
125
|
+
const cycle = recent.slice(-4);
|
|
126
|
+
if (observationOf(cycle[0]) === observationOf(cycle[2]) && observationOf(cycle[1]) === observationOf(cycle[3])) return true;
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
// Observe-only thrash: a couple dumps for verify is ok; 3+ identical scans = stuck.
|
|
131
|
+
const trailing = recent.slice(-3);
|
|
132
|
+
if (trailing.length >= 3 && trailing.every(h => h.tool === "dump") && sameObservation(trailing)) {
|
|
133
|
+
return true;
|
|
134
|
+
}
|
|
135
|
+
const fails = recent.filter(isFail);
|
|
136
|
+
if (fails.length >= 3) {
|
|
137
|
+
const failFps = fails.map(actionFingerprint);
|
|
138
|
+
const failScreens = fails.map(screenOf).filter(Boolean);
|
|
139
|
+
const sameScreen = failScreens.length !== fails.length || failScreens.every(s => s === failScreens[0]);
|
|
140
|
+
if (failFps.length >= 3 && sameScreen && failFps.every(f => f === failFps[0])) return true;
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
// Same screen + same *mutating* tool = stuck. Pure dump/find is verification.
|
|
144
|
+
if (screenStagnant) {
|
|
145
|
+
const tools = recent.slice(-3).map(h => h.tool);
|
|
146
|
+
const t0 = tools[0];
|
|
147
|
+
if (tools.every(t => t === t0) && t0 !== "type" && t0 !== "dump" && t0 !== "find") {
|
|
148
|
+
return true;
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
return false;
|
|
152
|
+
}
|
|
153
|
+
export function isNearLoop(history) {
|
|
154
|
+
const recent = history.slice(-3);
|
|
155
|
+
if (recent.length < 2) return false;
|
|
156
|
+
|
|
157
|
+
// A bounded loading/verification wait can repeat; warn only if unchanged.
|
|
158
|
+
const trailingDumps = recent.slice(-2);
|
|
159
|
+
if (trailingDumps.length >= 2 && trailingDumps.every(h => h.tool === "dump") && sameObservation(trailingDumps)) {
|
|
160
|
+
return true;
|
|
161
|
+
}
|
|
162
|
+
const fps = recent.map(actionFingerprint);
|
|
163
|
+
const last = fps[fps.length - 1];
|
|
164
|
+
if (fps.filter(f => f === last).length < 2) return false;
|
|
165
|
+
if (sameObservation(recent)) return true;
|
|
166
|
+
return recent.slice(-2).every(isFail) || recent.slice(-2).every(h => h.result === recent[recent.length - 1].result);
|
|
167
|
+
}
|
|
168
|
+
export const LOOP_ESCAPE_HINT = `【恢复评估 — 近期观察或动作重复,先核验当前状态】
|
|
169
|
+
- 对照用户目标和最新证据:已验证全部结果才 done(true);重复或空转本身不代表成功
|
|
170
|
+
- 加载、转场或已提交操作仍待结果时,可以在客户端预算内用 dump 只读核验;持续不变则如实 done(false)说明未确认,不重提请求或重走已完成流程
|
|
171
|
+
- tap_noop / tap_failed 后先核对当前控件与状态;只有存在有证据且安全的替代动作才调整 selector、目标或路径,不能为了逃逸而猜点
|
|
172
|
+
- 与当前子目标相关的标题、正文、页码或状态持续变化时,同名或交替按钮仍可能是正常进展;不要按固定点击次数或动作序列认定循环
|
|
173
|
+
- 下一步控件确实可见、可操作且属于当前目标时再 tap/type;已满足的选中状态不重复切换
|
|
174
|
+
- 仅目标属于当前列表且有滚动区域边界时才 swipe 查找;手势起终点在区域内,不能用滑动猜测导航
|
|
175
|
+
- 数值控件按实际类型、当前值、范围和用户精度要求调整,不预设手势方向;无效果、到边界或缺少证据时说明受阻
|
|
176
|
+
- find/tap 使用最新能力里的文案或 id;缺少安全下一步时允许只读观察或如实结束,不强制切换路径`;
|
|
177
|
+
//# sourceMappingURL=loopDetect.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["actionFingerprint","item","tool","args","sel","selector","matchKey","match","JSON","stringify","slice","nodeId","String","trim","label","text","from","to","Math","round","x","y","c","center","scale","Number","toFixed","test","result","replace","question","screenOf","m","observationOf","sameObservation","items","length","every","h","isFail","ok","MUTATING","Set","hadNoEffect","madeNoProgress","history","mutating","filter","has","preDispatch","dispatched","dead","repeatedReadOnly","tail","finds","screens","map","Boolean","s","fps","some","fp","value","isLooping","recent","last","sameFpCount","f","screenStagnant","lastThree","allFail","identicalResults","lastTool","a","b","cycle","trailing","fails","failFps","failScreens","sameScreen","tools","t0","t","isNearLoop","trailingDumps","LOOP_ESCAPE_HINT"],"sourceRoot":"../../../src","sources":["client/loopDetect.ts"],"mappings":"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","ignoreList":[]}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
import { find } from "../selector/match.js";
|
|
4
|
+
const norm = s => s.trim().toLocaleLowerCase();
|
|
5
|
+
const isInput = n => /textfield|textinput|edittext|uitextview|textarea/i.test(n.type) && !/label$/i.test(n.type);
|
|
6
|
+
const label = n => n.text || n.accessibilityLabel || '';
|
|
7
|
+
const recent = /^(recent(?: searches| search| history)?|search history|最近(?:搜索|记录)?|搜索历史|历史搜索|历史记录)$/i;
|
|
8
|
+
|
|
9
|
+
/** Only replace a search query with a uniquely identified visible recent item. */
|
|
10
|
+
export function recentSearchAction(action, root, goal) {
|
|
11
|
+
if (action.tool !== 'type' || !root || !action.args.text.trim()) return null;
|
|
12
|
+
const query = norm(action.args.text);
|
|
13
|
+
if (!norm(goal).includes(query) || !/\b(open|find|search|look up)\b|打开|搜索|查找/i.test(goal) || /\b(type|enter|input|write|paste)\b|输入|键入|填写|粘贴/i.test(goal)) return null;
|
|
14
|
+
const nodes = [];
|
|
15
|
+
const walk = n => {
|
|
16
|
+
if (n.visible === false || n.enabled === false) return;
|
|
17
|
+
nodes.push(n);
|
|
18
|
+
n.children.forEach(walk);
|
|
19
|
+
};
|
|
20
|
+
walk(root);
|
|
21
|
+
const inputNodes = nodes.filter(isInput);
|
|
22
|
+
const fields = inputNodes.filter(n => !inputNodes.some(other => other.id.startsWith(n.id + '/')));
|
|
23
|
+
if (fields.length !== 1 || fields[0]?.secure || !/search|搜索|查找/i.test(label(fields[0]))) return null;
|
|
24
|
+
if (action.args.nodeId && action.args.nodeId !== fields[0].id && !fields[0].id.startsWith(action.args.nodeId + '/')) return null;
|
|
25
|
+
if (action.args.selector) {
|
|
26
|
+
const selected = find(root, action.args.selector);
|
|
27
|
+
if (!selected || selected.id !== fields[0].id && !fields[0].id.startsWith(selected.id + '/') && !selected.id.startsWith(fields[0].id + '/')) return null;
|
|
28
|
+
}
|
|
29
|
+
const headings = nodes.filter(n => recent.test(label(n).trim()));
|
|
30
|
+
const candidates = nodes.filter(n => n.clickable && norm(label(n)) === query && !isInput(n));
|
|
31
|
+
if (!headings.length || !candidates.length) return null;
|
|
32
|
+
// Require a local section containing a recent heading and the candidate, not
|
|
33
|
+
// just two unrelated nodes somewhere on the page. Ancestors that include the
|
|
34
|
+
// search input or cover most of the screen cannot establish that relation.
|
|
35
|
+
const related = candidates.filter(candidate => headings.some(heading => nodes.some(section => section.id !== root.id && section.id !== fields[0].id && heading.id.startsWith(section.id + '/') && candidate.id.startsWith(section.id + '/') && !fields[0].id.startsWith(section.id + '/') && section.frame.height < root.frame.height * 0.7)));
|
|
36
|
+
const leaves = related.filter(n => !related.some(other => other.id.startsWith(n.id + '/')));
|
|
37
|
+
if (leaves.length !== 1) return null;
|
|
38
|
+
return {
|
|
39
|
+
tool: 'tap',
|
|
40
|
+
args: {
|
|
41
|
+
nodeId: leaves[0].id,
|
|
42
|
+
label: label(leaves[0])
|
|
43
|
+
}
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
//# sourceMappingURL=recentSearch.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["find","norm","s","trim","toLocaleLowerCase","isInput","n","test","type","label","text","accessibilityLabel","recent","recentSearchAction","action","root","goal","tool","args","query","includes","nodes","walk","visible","enabled","push","children","forEach","inputNodes","filter","fields","some","other","id","startsWith","length","secure","nodeId","selector","selected","headings","candidates","clickable","related","candidate","heading","section","frame","height","leaves"],"sourceRoot":"../../../src","sources":["client/recentSearch.ts"],"mappings":"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","ignoreList":[]}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
/** Protect a host-wallet request from accidentally selecting an unrelated provider. */
|
|
4
|
+
export function wrongHostWalletChoice(goal, action, choices, aliases, observedLabel) {
|
|
5
|
+
if (action.tool !== 'tap' || !choices.length || !aliases.length) return false;
|
|
6
|
+
const normalize = s => s.toLocaleLowerCase().replace(/[^\p{L}\p{N}]/gu, '');
|
|
7
|
+
const g = normalize(goal);
|
|
8
|
+
// An explicitly named provider is a different user request, not a host-wallet default.
|
|
9
|
+
if (choices.some(choice => g.includes(normalize(choice)))) return false;
|
|
10
|
+
const matches = action.args.selector?.match || [];
|
|
11
|
+
const labels = [observedLabel, action.args.label, ...matches.flatMap(rule => ['text', 'accessibilityLabel'].map(key => rule[key]).filter(x => typeof x === 'string'))].filter(s => typeof s === 'string').map(normalize);
|
|
12
|
+
return choices.some(choice => labels.includes(normalize(choice)) && !aliases.some(alias => normalize(alias) === normalize(choice)));
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=walletChoiceGuard.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["wrongHostWalletChoice","goal","action","choices","aliases","observedLabel","tool","length","normalize","s","toLocaleLowerCase","replace","g","some","choice","includes","matches","args","selector","match","labels","label","flatMap","rule","map","key","filter","x","alias"],"sourceRoot":"../../../src","sources":["client/walletChoiceGuard.ts"],"mappings":";;AAEA;AACA,OAAO,SAASA,qBAAqBA,CAACC,IAAY,EAAEC,MAAqB,EAAEC,OAAiB,EAAEC,OAAiB,EAAEC,aAAsB,EAAW;EAChJ,IAAIH,MAAM,CAACI,IAAI,KAAK,KAAK,IAAI,CAACH,OAAO,CAACI,MAAM,IAAI,CAACH,OAAO,CAACG,MAAM,EAAE,OAAO,KAAK;EAC7E,MAAMC,SAAS,GAAIC,CAAS,IAAKA,CAAC,CAACC,iBAAiB,CAAC,CAAC,CAACC,OAAO,CAAC,iBAAiB,EAAE,EAAE,CAAC;EACrF,MAAMC,CAAC,GAAGJ,SAAS,CAACP,IAAI,CAAC;EACzB;EACA,IAAIE,OAAO,CAACU,IAAI,CAACC,MAAM,IAAIF,CAAC,CAACG,QAAQ,CAACP,SAAS,CAACM,MAAM,CAAC,CAAC,CAAC,EAAE,OAAO,KAAK;EACvE,MAAME,OAAO,GAAGd,MAAM,CAACe,IAAI,CAACC,QAAQ,EAAEC,KAAK,IAAI,EAAE;EACjD,MAAMC,MAAM,GAAG,CAACf,aAAa,EAAEH,MAAM,CAACe,IAAI,CAACI,KAAK,EAAE,GAAGL,OAAO,CAACM,OAAO,CAACC,IAAI,IACvE,CAAC,MAAM,EAAE,oBAAoB,CAAC,CAACC,GAAG,CAACC,GAAG,IAAKF,IAAI,CAA6BE,GAAG,CAAC,CAAC,CAACC,MAAM,CAAEC,CAAC,IAAkB,OAAOA,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,CACpID,MAAM,CAAEjB,CAAC,IAAkB,OAAOA,CAAC,KAAK,QAAQ,CAAC,CAACe,GAAG,CAAChB,SAAS,CAAC;EACnE,OAAOL,OAAO,CAACU,IAAI,CAACC,MAAM,IAAIM,MAAM,CAACL,QAAQ,CAACP,SAAS,CAACM,MAAM,CAAC,CAAC,IAAI,CAACV,OAAO,CAACS,IAAI,CAACe,KAAK,IAAIpB,SAAS,CAACoB,KAAK,CAAC,KAAKpB,SAAS,CAACM,MAAM,CAAC,CAAC,CAAC;AACrI","ignoreList":[]}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
/** Select a visible app-results category only when the user's query is on this page. */
|
|
4
|
+
export function webResultCategory(action, root, goal, history) {
|
|
5
|
+
if (action.tool !== 'dump' || !root || !/(connect|连接|連接)/i.test(goal) || !/(wallet|钱包|錢包)/i.test(goal)) return null;
|
|
6
|
+
const nodes = [];
|
|
7
|
+
const visit = node => {
|
|
8
|
+
if (node.visible === false || node.enabled === false) return;
|
|
9
|
+
nodes.push(node);
|
|
10
|
+
node.children.forEach(visit);
|
|
11
|
+
};
|
|
12
|
+
visit(root);
|
|
13
|
+
const norm = s => s.trim().toLocaleLowerCase();
|
|
14
|
+
const fields = nodes.filter(n => /textfield|textinput|edittext/i.test(n.type) && !/label$/i.test(n.type));
|
|
15
|
+
if (!fields.some(n => {
|
|
16
|
+
const value = norm(n.text || n.accessibilityLabel || '');
|
|
17
|
+
return value.length >= 3 && norm(goal).includes(value);
|
|
18
|
+
})) return null;
|
|
19
|
+
const names = new Set(nodes.map(n => norm(n.text || n.accessibilityLabel || '')));
|
|
20
|
+
if (![...names].some(name => /^(tokens|代币|代幣)$/.test(name))) return null;
|
|
21
|
+
const candidates = nodes.filter(n => n.clickable && /^(dapps|dapp|应用|應用)$/.test(norm(n.text || n.accessibilityLabel || '')) && !n.selected);
|
|
22
|
+
const leaves = candidates.filter(n => !candidates.some(other => other.id.startsWith(n.id + '/')));
|
|
23
|
+
if (leaves.length !== 1) return null;
|
|
24
|
+
const node = leaves[0];
|
|
25
|
+
if (history.some(h => h.tool === 'tap' && h.args?.nodeId === node.id)) return null;
|
|
26
|
+
return {
|
|
27
|
+
tool: 'tap',
|
|
28
|
+
args: {
|
|
29
|
+
nodeId: node.id,
|
|
30
|
+
label: node.text || node.accessibilityLabel
|
|
31
|
+
}
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=webResultCategory.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["webResultCategory","action","root","goal","history","tool","test","nodes","visit","node","visible","enabled","push","children","forEach","norm","s","trim","toLocaleLowerCase","fields","filter","n","type","some","value","text","accessibilityLabel","length","includes","names","Set","map","name","candidates","clickable","selected","leaves","other","id","startsWith","h","args","nodeId","label"],"sourceRoot":"../../../src","sources":["client/webResultCategory.ts"],"mappings":"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","ignoreList":[]}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
import { GatewayClient } from "../client/GatewayClient.js";
|
|
4
|
+
import { DEFAULT_ENTITLEMENTS, emptyAccount } from "./branding.js";
|
|
5
|
+
import { isTrustedEntitlementHost } from "./trust.js";
|
|
6
|
+
import { resolveGatewayBaseUrl } from "../client/GatewayClient.js";
|
|
7
|
+
function stripUntrustedBranding(account, baseUrl) {
|
|
8
|
+
if (isTrustedEntitlementHost(baseUrl)) return account;
|
|
9
|
+
return {
|
|
10
|
+
...account,
|
|
11
|
+
entitlements: {
|
|
12
|
+
...account.entitlements,
|
|
13
|
+
custom_branding: false
|
|
14
|
+
}
|
|
15
|
+
};
|
|
16
|
+
}
|
|
17
|
+
class AccountStoreImpl {
|
|
18
|
+
account = null;
|
|
19
|
+
listeners = new Set();
|
|
20
|
+
inflight = null;
|
|
21
|
+
get() {
|
|
22
|
+
return this.account;
|
|
23
|
+
}
|
|
24
|
+
subscribe(listener) {
|
|
25
|
+
this.listeners.add(listener);
|
|
26
|
+
listener(this.account);
|
|
27
|
+
return () => {
|
|
28
|
+
this.listeners.delete(listener);
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
emit() {
|
|
32
|
+
for (const l of this.listeners) l(this.account);
|
|
33
|
+
}
|
|
34
|
+
async refresh(gateway) {
|
|
35
|
+
if (this.inflight) return this.inflight;
|
|
36
|
+
let baseUrl;
|
|
37
|
+
try {
|
|
38
|
+
baseUrl = resolveGatewayBaseUrl(gateway);
|
|
39
|
+
} catch {
|
|
40
|
+
if (!this.account) {
|
|
41
|
+
this.account = emptyAccount();
|
|
42
|
+
this.emit();
|
|
43
|
+
}
|
|
44
|
+
return this.account;
|
|
45
|
+
}
|
|
46
|
+
this.inflight = (async () => {
|
|
47
|
+
try {
|
|
48
|
+
const client = new GatewayClient(gateway);
|
|
49
|
+
const me = await client.me();
|
|
50
|
+
this.account = stripUntrustedBranding(me, baseUrl);
|
|
51
|
+
this.emit();
|
|
52
|
+
return this.account;
|
|
53
|
+
} catch {
|
|
54
|
+
if (!this.account) {
|
|
55
|
+
this.account = emptyAccount();
|
|
56
|
+
this.emit();
|
|
57
|
+
}
|
|
58
|
+
return this.account;
|
|
59
|
+
} finally {
|
|
60
|
+
this.inflight = null;
|
|
61
|
+
}
|
|
62
|
+
})();
|
|
63
|
+
return this.inflight;
|
|
64
|
+
}
|
|
65
|
+
entitlements() {
|
|
66
|
+
return this.account?.entitlements ?? {
|
|
67
|
+
...DEFAULT_ENTITLEMENTS
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
plan() {
|
|
71
|
+
return this.account?.plan ?? 'free';
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
export const AccountStore = new AccountStoreImpl();
|
|
75
|
+
//# sourceMappingURL=AccountStore.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["GatewayClient","DEFAULT_ENTITLEMENTS","emptyAccount","isTrustedEntitlementHost","resolveGatewayBaseUrl","stripUntrustedBranding","account","baseUrl","entitlements","custom_branding","AccountStoreImpl","listeners","Set","inflight","get","subscribe","listener","add","delete","emit","l","refresh","gateway","client","me","plan","AccountStore"],"sourceRoot":"../../../src","sources":["commercial/AccountStore.ts"],"mappings":";;AAAA,SAASA,aAAa,QAA4B,4BAAyB;AAE3E,SAASC,oBAAoB,EAAEC,YAAY,QAAQ,eAAY;AAC/D,SAASC,wBAAwB,QAAQ,YAAS;AAClD,SAASC,qBAAqB,QAAQ,4BAAyB;AAI/D,SAASC,sBAAsBA,CAC7BC,OAA4B,EAC5BC,OAAe,EACM;EACrB,IAAIJ,wBAAwB,CAACI,OAAO,CAAC,EAAE,OAAOD,OAAO;EACrD,OAAO;IACL,GAAGA,OAAO;IACVE,YAAY,EAAE;MACZ,GAAGF,OAAO,CAACE,YAAY;MACvBC,eAAe,EAAE;IACnB;EACF,CAAC;AACH;AAEA,MAAMC,gBAAgB,CAAC;EACbJ,OAAO,GAA+B,IAAI;EAC1CK,SAAS,GAAG,IAAIC,GAAG,CAAW,CAAC;EAC/BC,QAAQ,GAA+C,IAAI;EAEnEC,GAAGA,CAAA,EAA+B;IAChC,OAAO,IAAI,CAACR,OAAO;EACrB;EAEAS,SAASA,CAACC,QAAkB,EAAc;IACxC,IAAI,CAACL,SAAS,CAACM,GAAG,CAACD,QAAQ,CAAC;IAC5BA,QAAQ,CAAC,IAAI,CAACV,OAAO,CAAC;IACtB,OAAO,MAAM;MACX,IAAI,CAACK,SAAS,CAACO,MAAM,CAACF,QAAQ,CAAC;IACjC,CAAC;EACH;EAEQG,IAAIA,CAAA,EAAG;IACb,KAAK,MAAMC,CAAC,IAAI,IAAI,CAACT,SAAS,EAAES,CAAC,CAAC,IAAI,CAACd,OAAO,CAAC;EACjD;EAEA,MAAMe,OAAOA,CAACC,OAAsB,EAAuC;IACzE,IAAI,IAAI,CAACT,QAAQ,EAAE,OAAO,IAAI,CAACA,QAAQ;IACvC,IAAIN,OAAe;IACnB,IAAI;MACFA,OAAO,GAAGH,qBAAqB,CAACkB,OAAO,CAAC;IAC1C,CAAC,CAAC,MAAM;MACN,IAAI,CAAC,IAAI,CAAChB,OAAO,EAAE;QACjB,IAAI,CAACA,OAAO,GAAGJ,YAAY,CAAC,CAAC;QAC7B,IAAI,CAACiB,IAAI,CAAC,CAAC;MACb;MACA,OAAO,IAAI,CAACb,OAAO;IACrB;IACA,IAAI,CAACO,QAAQ,GAAG,CAAC,YAAY;MAC3B,IAAI;QACF,MAAMU,MAAM,GAAG,IAAIvB,aAAa,CAACsB,OAAO,CAAC;QACzC,MAAME,EAAE,GAAG,MAAMD,MAAM,CAACC,EAAE,CAAC,CAAC;QAC5B,IAAI,CAAClB,OAAO,GAAGD,sBAAsB,CAACmB,EAAE,EAAEjB,OAAO,CAAC;QAClD,IAAI,CAACY,IAAI,CAAC,CAAC;QACX,OAAO,IAAI,CAACb,OAAO;MACrB,CAAC,CAAC,MAAM;QACN,IAAI,CAAC,IAAI,CAACA,OAAO,EAAE;UACjB,IAAI,CAACA,OAAO,GAAGJ,YAAY,CAAC,CAAC;UAC7B,IAAI,CAACiB,IAAI,CAAC,CAAC;QACb;QACA,OAAO,IAAI,CAACb,OAAO;MACrB,CAAC,SAAS;QACR,IAAI,CAACO,QAAQ,GAAG,IAAI;MACtB;IACF,CAAC,EAAE,CAAC;IACJ,OAAO,IAAI,CAACA,QAAQ;EACtB;EAEAL,YAAYA,CAAA,EAAqB;IAC/B,OAAO,IAAI,CAACF,OAAO,EAAEE,YAAY,IAAI;MAAE,GAAGP;IAAqB,CAAC;EAClE;EAEAwB,IAAIA,CAAA,EAAe;IACjB,OAAO,IAAI,CAACnB,OAAO,EAAEmB,IAAI,IAAI,MAAM;EACrC;AACF;AAEA,OAAO,MAAMC,YAAY,GAAG,IAAIhB,gBAAgB,CAAC,CAAC","ignoreList":[]}
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
import { resolveDebugLogging } from "./devMode.js";
|
|
4
|
+
import { extractAffordances } from "../privacy/screenModel.js";
|
|
5
|
+
import { HostActionsStore } from "../host/HostActions.js";
|
|
6
|
+
/**
|
|
7
|
+
* Developer-facing logs: what the SDK observed in the host App
|
|
8
|
+
* (controls / fields / actions). Never logs security policy internals.
|
|
9
|
+
*/
|
|
10
|
+
export const AgentDebug = {
|
|
11
|
+
enabled(config) {
|
|
12
|
+
return resolveDebugLogging(config);
|
|
13
|
+
},
|
|
14
|
+
/** High-level run lifecycle (goal only, no policy). */
|
|
15
|
+
runStart(config, goal) {
|
|
16
|
+
if (!resolveDebugLogging(config)) return;
|
|
17
|
+
// eslint-disable-next-line no-console
|
|
18
|
+
console.log('[koko] 开始任务:', goal.slice(0, 120));
|
|
19
|
+
},
|
|
20
|
+
runEnd(config, summary, ok) {
|
|
21
|
+
if (!resolveDebugLogging(config)) return;
|
|
22
|
+
// eslint-disable-next-line no-console
|
|
23
|
+
console.log(ok ? '[koko] 任务完成:' : '[koko] 任务结束:', summary.slice(0, 160));
|
|
24
|
+
},
|
|
25
|
+
/** The dump stopped at its depth cap, so the page body never reached us. */
|
|
26
|
+
dumpTruncated(config, cap) {
|
|
27
|
+
if (!resolveDebugLogging(config)) return;
|
|
28
|
+
// eslint-disable-next-line no-console
|
|
29
|
+
console.warn(`[koko] 视图树在 maxDepth=${cap} 处被截断,页面正文可能完全缺失(只剩外层导航)。` + '请调大 dumpMaxDepth。');
|
|
30
|
+
},
|
|
31
|
+
/** Capabilities discovered on the current screen. */
|
|
32
|
+
screenCapabilities(config, tree) {
|
|
33
|
+
if (!resolveDebugLogging(config)) return;
|
|
34
|
+
const items = tree ? extractAffordances(tree, 24) : [];
|
|
35
|
+
const host = HostActionsStore.getActions();
|
|
36
|
+
if (!items.length && !host.length) {
|
|
37
|
+
// eslint-disable-next-line no-console
|
|
38
|
+
console.log('[koko] 当前界面: 未识别到可操作控件');
|
|
39
|
+
return;
|
|
40
|
+
}
|
|
41
|
+
const lines = [...items.map(formatAffordance), ...host.map(a => `宿主声明「${a.label}」${a.testID ? `(testID=${a.testID})` : ''}`)];
|
|
42
|
+
// eslint-disable-next-line no-console
|
|
43
|
+
console.log(`[koko] 当前界面可用能力 (${lines.length}):\n - ${lines.join('\n - ')}`);
|
|
44
|
+
},
|
|
45
|
+
/** What the agent is about to do in the App (user-visible action). */
|
|
46
|
+
appAction(config, step, tool, detail) {
|
|
47
|
+
if (!resolveDebugLogging(config)) return;
|
|
48
|
+
const label = actionLabel(tool, detail);
|
|
49
|
+
// eslint-disable-next-line no-console
|
|
50
|
+
console.log(`[koko] 步骤 ${step}: ${label}`);
|
|
51
|
+
},
|
|
52
|
+
/** Soft failure for developers — generic, no rule leakage. */
|
|
53
|
+
runIssue(config, message) {
|
|
54
|
+
if (!resolveDebugLogging(config)) return;
|
|
55
|
+
const safe = sanitizeDevMessage(message);
|
|
56
|
+
// eslint-disable-next-line no-console
|
|
57
|
+
console.warn('[koko] 任务遇到问题:', safe);
|
|
58
|
+
}
|
|
59
|
+
};
|
|
60
|
+
function formatAffordance(a) {
|
|
61
|
+
const kind = a.kind === 'button' ? '按钮' : a.kind === 'field' ? '输入框' : a.kind === 'row' ? '列表项' : a.kind === 'link' ? '链接' : a.kind === 'sheet' ? '弹层按钮' : a.kind === 'toggle' ? '开关' : a.kind === 'adjustable' ? '调节控件' : '控件';
|
|
62
|
+
const near = a.near ? `(附近: ${a.near.slice(0, 40)})` : '';
|
|
63
|
+
return `${kind}「${a.label || '(无文案)'}」${near}`;
|
|
64
|
+
}
|
|
65
|
+
function actionLabel(tool, detail) {
|
|
66
|
+
const d = detail?.trim();
|
|
67
|
+
switch (tool) {
|
|
68
|
+
case 'dump':
|
|
69
|
+
return '扫描当前界面';
|
|
70
|
+
case 'find':
|
|
71
|
+
return d ? `定位「${d}」` : '定位控件';
|
|
72
|
+
case 'tap':
|
|
73
|
+
return d ? `点击「${d}」` : '点击';
|
|
74
|
+
case 'swipe':
|
|
75
|
+
return d ? `滑动(${d})` : '滑动';
|
|
76
|
+
case 'pinch':
|
|
77
|
+
return d ? `双指缩放(${d})` : '双指缩放';
|
|
78
|
+
case 'type':
|
|
79
|
+
return d ? `输入「${d}」` : '输入文字';
|
|
80
|
+
case 'ask_user':
|
|
81
|
+
return '等待你在 App 内操作';
|
|
82
|
+
case 'done':
|
|
83
|
+
return d ? `结束:${d}` : '结束';
|
|
84
|
+
default:
|
|
85
|
+
return d ? `${tool}: ${d}` : tool;
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
/** Strip security/policy jargon from messages shown in debug console. */
|
|
90
|
+
export function sanitizeDevMessage(message) {
|
|
91
|
+
const lower = message.toLowerCase();
|
|
92
|
+
if (/execution_permit|execution permit|permit expired|gateway host|allowlist|devmode|custom_branding|entitlement/i.test(message)) {
|
|
93
|
+
if (/quota|429/.test(lower)) return '今日用量已用尽,请稍后再试或联系服务商扩容';
|
|
94
|
+
if (/unauthorized|401/.test(lower)) return '鉴权失败,请检查 gateway.token';
|
|
95
|
+
return '暂时无法继续操作,请稍后重试或检查网络与账号配置';
|
|
96
|
+
}
|
|
97
|
+
return message.slice(0, 200);
|
|
98
|
+
}
|
|
99
|
+
//# sourceMappingURL=AgentDebug.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["resolveDebugLogging","extractAffordances","HostActionsStore","AgentDebug","enabled","config","runStart","goal","console","log","slice","runEnd","summary","ok","dumpTruncated","cap","warn","screenCapabilities","tree","items","host","getActions","length","lines","map","formatAffordance","a","label","testID","join","appAction","step","tool","detail","actionLabel","runIssue","message","safe","sanitizeDevMessage","kind","near","d","trim","lower","toLowerCase","test"],"sourceRoot":"../../../src","sources":["commercial/AgentDebug.ts"],"mappings":";;AAAA,SAASA,mBAAmB,QAAQ,cAAW;AAG/C,SAASC,kBAAkB,QAAQ,2BAAwB;AAC3D,SAASC,gBAAgB,QAAQ,wBAAqB;AAKtD;AACA;AACA;AACA;AACA,OAAO,MAAMC,UAAU,GAAG;EACxBC,OAAOA,CAACC,MAAY,EAAW;IAC7B,OAAOL,mBAAmB,CAACK,MAAM,CAAC;EACpC,CAAC;EAED;EACAC,QAAQA,CAACD,MAAW,EAAEE,IAAY,EAAE;IAClC,IAAI,CAACP,mBAAmB,CAACK,MAAM,CAAC,EAAE;IAClC;IACAG,OAAO,CAACC,GAAG,CAAC,cAAc,EAAEF,IAAI,CAACG,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;EACjD,CAAC;EAEDC,MAAMA,CAACN,MAAW,EAAEO,OAAe,EAAEC,EAAW,EAAE;IAChD,IAAI,CAACb,mBAAmB,CAACK,MAAM,CAAC,EAAE;IAClC;IACAG,OAAO,CAACC,GAAG,CAACI,EAAE,GAAG,cAAc,GAAG,cAAc,EAAED,OAAO,CAACF,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;EAC1E,CAAC;EAED;EACAI,aAAaA,CAACT,MAAW,EAAEU,GAAW,EAAE;IACtC,IAAI,CAACf,mBAAmB,CAACK,MAAM,CAAC,EAAE;IAClC;IACAG,OAAO,CAACQ,IAAI,CACV,wBAAwBD,GAAG,2BAA2B,GACpD,mBACJ,CAAC;EACH,CAAC;EAED;EACAE,kBAAkBA,CAACZ,MAAW,EAAEa,IAAiC,EAAE;IACjE,IAAI,CAAClB,mBAAmB,CAACK,MAAM,CAAC,EAAE;IAClC,MAAMc,KAAK,GAAGD,IAAI,GAAGjB,kBAAkB,CAACiB,IAAI,EAAE,EAAE,CAAC,GAAG,EAAE;IACtD,MAAME,IAAI,GAAGlB,gBAAgB,CAACmB,UAAU,CAAC,CAAC;IAC1C,IAAI,CAACF,KAAK,CAACG,MAAM,IAAI,CAACF,IAAI,CAACE,MAAM,EAAE;MACjC;MACAd,OAAO,CAACC,GAAG,CAAC,wBAAwB,CAAC;MACrC;IACF;IACA,MAAMc,KAAK,GAAG,CACZ,GAAGJ,KAAK,CAACK,GAAG,CAACC,gBAAgB,CAAC,EAC9B,GAAGL,IAAI,CAACI,GAAG,CACRE,CAAC,IAAK,QAAQA,CAAC,CAACC,KAAK,IAAID,CAAC,CAACE,MAAM,GAAG,WAAWF,CAAC,CAACE,MAAM,GAAG,GAAG,EAAE,EAClE,CAAC,CACF;IACD;IACApB,OAAO,CAACC,GAAG,CAAC,oBAAoBc,KAAK,CAACD,MAAM,WAAWC,KAAK,CAACM,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;EAChF,CAAC;EAED;EACAC,SAASA,CACPzB,MAAW,EACX0B,IAAY,EACZC,IAAY,EACZC,MAAe,EACf;IACA,IAAI,CAACjC,mBAAmB,CAACK,MAAM,CAAC,EAAE;IAClC,MAAMsB,KAAK,GAAGO,WAAW,CAACF,IAAI,EAAEC,MAAM,CAAC;IACvC;IACAzB,OAAO,CAACC,GAAG,CAAC,aAAasB,IAAI,KAAKJ,KAAK,EAAE,CAAC;EAC5C,CAAC;EAED;EACAQ,QAAQA,CAAC9B,MAAW,EAAE+B,OAAe,EAAE;IACrC,IAAI,CAACpC,mBAAmB,CAACK,MAAM,CAAC,EAAE;IAClC,MAAMgC,IAAI,GAAGC,kBAAkB,CAACF,OAAO,CAAC;IACxC;IACA5B,OAAO,CAACQ,IAAI,CAAC,gBAAgB,EAAEqB,IAAI,CAAC;EACtC;AACF,CAAC;AAED,SAASZ,gBAAgBA,CAACC,CAAa,EAAU;EAC/C,MAAMa,IAAI,GACRb,CAAC,CAACa,IAAI,KAAK,QAAQ,GACf,IAAI,GACJb,CAAC,CAACa,IAAI,KAAK,OAAO,GAChB,KAAK,GACLb,CAAC,CAACa,IAAI,KAAK,KAAK,GACd,KAAK,GACLb,CAAC,CAACa,IAAI,KAAK,MAAM,GACf,IAAI,GACJb,CAAC,CAACa,IAAI,KAAK,OAAO,GAChB,MAAM,GACNb,CAAC,CAACa,IAAI,KAAK,QAAQ,GACjB,IAAI,GACJb,CAAC,CAACa,IAAI,KAAK,YAAY,GACrB,MAAM,GACN,IAAI;EACtB,MAAMC,IAAI,GAAGd,CAAC,CAACc,IAAI,GAAG,QAAQd,CAAC,CAACc,IAAI,CAAC9B,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,EAAE;EACzD,OAAO,GAAG6B,IAAI,IAAIb,CAAC,CAACC,KAAK,IAAI,OAAO,IAAIa,IAAI,EAAE;AAChD;AAEA,SAASN,WAAWA,CAACF,IAAY,EAAEC,MAAe,EAAU;EAC1D,MAAMQ,CAAC,GAAGR,MAAM,EAAES,IAAI,CAAC,CAAC;EACxB,QAAQV,IAAI;IACV,KAAK,MAAM;MACT,OAAO,QAAQ;IACjB,KAAK,MAAM;MACT,OAAOS,CAAC,GAAG,MAAMA,CAAC,GAAG,GAAG,MAAM;IAChC,KAAK,KAAK;MACR,OAAOA,CAAC,GAAG,MAAMA,CAAC,GAAG,GAAG,IAAI;IAC9B,KAAK,OAAO;MACV,OAAOA,CAAC,GAAG,MAAMA,CAAC,GAAG,GAAG,IAAI;IAC9B,KAAK,OAAO;MACV,OAAOA,CAAC,GAAG,QAAQA,CAAC,GAAG,GAAG,MAAM;IAClC,KAAK,MAAM;MACT,OAAOA,CAAC,GAAG,MAAMA,CAAC,GAAG,GAAG,MAAM;IAChC,KAAK,UAAU;MACb,OAAO,cAAc;IACvB,KAAK,MAAM;MACT,OAAOA,CAAC,GAAG,MAAMA,CAAC,EAAE,GAAG,IAAI;IAC7B;MACE,OAAOA,CAAC,GAAG,GAAGT,IAAI,KAAKS,CAAC,EAAE,GAAGT,IAAI;EACrC;AACF;;AAEA;AACA,OAAO,SAASM,kBAAkBA,CAACF,OAAe,EAAU;EAC1D,MAAMO,KAAK,GAAGP,OAAO,CAACQ,WAAW,CAAC,CAAC;EACnC,IACE,8GAA8G,CAACC,IAAI,CACjHT,OACF,CAAC,EACD;IACA,IAAI,WAAW,CAACS,IAAI,CAACF,KAAK,CAAC,EAAE,OAAO,uBAAuB;IAC3D,IAAI,kBAAkB,CAACE,IAAI,CAACF,KAAK,CAAC,EAAE,OAAO,wBAAwB;IACnE,OAAO,0BAA0B;EACnC;EACA,OAAOP,OAAO,CAAC1B,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC;AAC9B","ignoreList":[]}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Soft client gate: local dump/tap/swipe/type require a short-lived
|
|
5
|
+
* execution_permit from the official (or local-lab) gateway session.
|
|
6
|
+
* Always enforced — debug logging does not bypass this.
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
function peekExp(permit) {
|
|
10
|
+
try {
|
|
11
|
+
const [payloadB64] = permit.split('.');
|
|
12
|
+
if (!payloadB64) return null;
|
|
13
|
+
const pad = payloadB64.length % 4 === 0 ? '' : '='.repeat(4 - payloadB64.length % 4);
|
|
14
|
+
const json = globalThis.atob ? globalThis.atob(payloadB64.replace(/-/g, '+').replace(/_/g, '/') + pad) : Buffer.from(payloadB64.replace(/-/g, '+').replace(/_/g, '/') + pad, 'base64').toString('utf8');
|
|
15
|
+
const payload = JSON.parse(json);
|
|
16
|
+
return typeof payload.exp === 'number' ? payload.exp : null;
|
|
17
|
+
} catch {
|
|
18
|
+
return null;
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
class ExecutionGuardImpl {
|
|
22
|
+
permit = null;
|
|
23
|
+
sessionId = null;
|
|
24
|
+
setPermit(permit, sessionId) {
|
|
25
|
+
this.permit = permit;
|
|
26
|
+
if (sessionId !== undefined) this.sessionId = sessionId;
|
|
27
|
+
}
|
|
28
|
+
getPermit() {
|
|
29
|
+
return this.permit;
|
|
30
|
+
}
|
|
31
|
+
getSessionId() {
|
|
32
|
+
return this.sessionId;
|
|
33
|
+
}
|
|
34
|
+
clear() {
|
|
35
|
+
this.permit = null;
|
|
36
|
+
this.sessionId = null;
|
|
37
|
+
}
|
|
38
|
+
assert(action) {
|
|
39
|
+
if (!this.permit) {
|
|
40
|
+
throw new Error(`KokoAgent: ${action} is only available while a goal is running. Use runGoal().`);
|
|
41
|
+
}
|
|
42
|
+
const exp = peekExp(this.permit);
|
|
43
|
+
if (exp != null && exp < Math.floor(Date.now() / 1000)) {
|
|
44
|
+
throw new Error(`KokoAgent: session timed out during ${action}. Please run the goal again.`);
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
export const ExecutionGuard = new ExecutionGuardImpl();
|
|
49
|
+
//# sourceMappingURL=ExecutionGuard.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["peekExp","permit","payloadB64","split","pad","length","repeat","json","globalThis","atob","replace","Buffer","from","toString","payload","JSON","parse","exp","ExecutionGuardImpl","sessionId","setPermit","undefined","getPermit","getSessionId","clear","assert","action","Error","Math","floor","Date","now","ExecutionGuard"],"sourceRoot":"../../../src","sources":["commercial/ExecutionGuard.ts"],"mappings":";;AAAA;AACA;AACA;AACA;AACA;;AAIA,SAASA,OAAOA,CAACC,MAAc,EAAiB;EAC9C,IAAI;IACF,MAAM,CAACC,UAAU,CAAC,GAAGD,MAAM,CAACE,KAAK,CAAC,GAAG,CAAC;IACtC,IAAI,CAACD,UAAU,EAAE,OAAO,IAAI;IAC5B,MAAME,GAAG,GACPF,UAAU,CAACG,MAAM,GAAG,CAAC,KAAK,CAAC,GACvB,EAAE,GACF,GAAG,CAACC,MAAM,CAAC,CAAC,GAAIJ,UAAU,CAACG,MAAM,GAAG,CAAE,CAAC;IAC7C,MAAME,IAAI,GAAGC,UAAU,CAACC,IAAI,GACxBD,UAAU,CAACC,IAAI,CAACP,UAAU,CAACQ,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,CAACA,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,GAAGN,GAAG,CAAC,GACvEO,MAAM,CAACC,IAAI,CACTV,UAAU,CAACQ,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,CAACA,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,GAAGN,GAAG,EACtD,QACF,CAAC,CAACS,QAAQ,CAAC,MAAM,CAAC;IACtB,MAAMC,OAAO,GAAGC,IAAI,CAACC,KAAK,CAACT,IAAI,CAAqB;IACpD,OAAO,OAAOO,OAAO,CAACG,GAAG,KAAK,QAAQ,GAAGH,OAAO,CAACG,GAAG,GAAG,IAAI;EAC7D,CAAC,CAAC,MAAM;IACN,OAAO,IAAI;EACb;AACF;AAEA,MAAMC,kBAAkB,CAAC;EACfjB,MAAM,GAAkB,IAAI;EAC5BkB,SAAS,GAAkB,IAAI;EAEvCC,SAASA,CAACnB,MAAqB,EAAEkB,SAAyB,EAAE;IAC1D,IAAI,CAAClB,MAAM,GAAGA,MAAM;IACpB,IAAIkB,SAAS,KAAKE,SAAS,EAAE,IAAI,CAACF,SAAS,GAAGA,SAAS;EACzD;EAEAG,SAASA,CAAA,EAAG;IACV,OAAO,IAAI,CAACrB,MAAM;EACpB;EAEAsB,YAAYA,CAAA,EAAG;IACb,OAAO,IAAI,CAACJ,SAAS;EACvB;EAEAK,KAAKA,CAAA,EAAG;IACN,IAAI,CAACvB,MAAM,GAAG,IAAI;IAClB,IAAI,CAACkB,SAAS,GAAG,IAAI;EACvB;EAEAM,MAAMA,CAACC,MAAqB,EAAE;IAC5B,IAAI,CAAC,IAAI,CAACzB,MAAM,EAAE;MAChB,MAAM,IAAI0B,KAAK,CACb,cAAcD,MAAM,4DACtB,CAAC;IACH;IACA,MAAMT,GAAG,GAAGjB,OAAO,CAAC,IAAI,CAACC,MAAM,CAAC;IAChC,IAAIgB,GAAG,IAAI,IAAI,IAAIA,GAAG,GAAGW,IAAI,CAACC,KAAK,CAACC,IAAI,CAACC,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,EAAE;MACtD,MAAM,IAAIJ,KAAK,CACb,uCAAuCD,MAAM,8BAC/C,CAAC;IACH;EACF;AACF;AAEA,OAAO,MAAMM,cAAc,GAAG,IAAId,kBAAkB,CAAC,CAAC","ignoreList":[]}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Fan-out for usage / lifecycle events. Host `onUsageEvent` is wired here.
|
|
5
|
+
* Never used to gate execution.
|
|
6
|
+
*/
|
|
7
|
+
class UsageBusImpl {
|
|
8
|
+
listeners = new Set();
|
|
9
|
+
recent = [];
|
|
10
|
+
maxRecent = 100;
|
|
11
|
+
subscribe(listener) {
|
|
12
|
+
this.listeners.add(listener);
|
|
13
|
+
return () => {
|
|
14
|
+
this.listeners.delete(listener);
|
|
15
|
+
};
|
|
16
|
+
}
|
|
17
|
+
emit(event) {
|
|
18
|
+
this.recent.push(event);
|
|
19
|
+
if (this.recent.length > this.maxRecent) {
|
|
20
|
+
this.recent.splice(0, this.recent.length - this.maxRecent);
|
|
21
|
+
}
|
|
22
|
+
for (const l of this.listeners) {
|
|
23
|
+
try {
|
|
24
|
+
l(event);
|
|
25
|
+
} catch {
|
|
26
|
+
// host callbacks must not break the agent
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
getRecent() {
|
|
31
|
+
return [...this.recent];
|
|
32
|
+
}
|
|
33
|
+
clear() {
|
|
34
|
+
this.recent = [];
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
export const UsageBus = new UsageBusImpl();
|
|
38
|
+
//# sourceMappingURL=UsageBus.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["UsageBusImpl","listeners","Set","recent","maxRecent","subscribe","listener","add","delete","emit","event","push","length","splice","l","getRecent","clear","UsageBus"],"sourceRoot":"../../../src","sources":["commercial/UsageBus.ts"],"mappings":";;AAIA;AACA;AACA;AACA;AACA,MAAMA,YAAY,CAAC;EACTC,SAAS,GAAG,IAAIC,GAAG,CAAW,CAAC;EAC/BC,MAAM,GAAqB,EAAE;EACpBC,SAAS,GAAG,GAAG;EAEhCC,SAASA,CAACC,QAAkB,EAAc;IACxC,IAAI,CAACL,SAAS,CAACM,GAAG,CAACD,QAAQ,CAAC;IAC5B,OAAO,MAAM;MACX,IAAI,CAACL,SAAS,CAACO,MAAM,CAACF,QAAQ,CAAC;IACjC,CAAC;EACH;EAEAG,IAAIA,CAACC,KAAqB,EAAE;IAC1B,IAAI,CAACP,MAAM,CAACQ,IAAI,CAACD,KAAK,CAAC;IACvB,IAAI,IAAI,CAACP,MAAM,CAACS,MAAM,GAAG,IAAI,CAACR,SAAS,EAAE;MACvC,IAAI,CAACD,MAAM,CAACU,MAAM,CAAC,CAAC,EAAE,IAAI,CAACV,MAAM,CAACS,MAAM,GAAG,IAAI,CAACR,SAAS,CAAC;IAC5D;IACA,KAAK,MAAMU,CAAC,IAAI,IAAI,CAACb,SAAS,EAAE;MAC9B,IAAI;QACFa,CAAC,CAACJ,KAAK,CAAC;MACV,CAAC,CAAC,MAAM;QACN;MAAA;IAEJ;EACF;EAEAK,SAASA,CAAA,EAAqB;IAC5B,OAAO,CAAC,GAAG,IAAI,CAACZ,MAAM,CAAC;EACzB;EAEAa,KAAKA,CAAA,EAAG;IACN,IAAI,CAACb,MAAM,GAAG,EAAE;EAClB;AACF;AAEA,OAAO,MAAMc,QAAQ,GAAG,IAAIjB,YAAY,CAAC,CAAC","ignoreList":[]}
|