@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,72 @@
|
|
|
1
|
+
import type { Frame, ViewNode } from '../types';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Drop nodes that are mounted but nowhere on screen.
|
|
5
|
+
*
|
|
6
|
+
* Both platforms report a node as visible from its own flags alone — Android
|
|
7
|
+
* `VISIBLE && isShown()`, iOS `!hidden && alpha > 0`. Neither asks whether the
|
|
8
|
+
* node is inside the window, so a navigator screen that is still mounted but
|
|
9
|
+
* pushed aside keeps showing up in every dump. The agent then plans against a
|
|
10
|
+
* screen the user cannot see, and the user gate can stall a run on a prompt
|
|
11
|
+
* that is not there.
|
|
12
|
+
*
|
|
13
|
+
* Intersect against the window and every clipping/scroll ancestor. A mounted
|
|
14
|
+
* list row outside its scroll viewport must not become a clickable target.
|
|
15
|
+
*/
|
|
16
|
+
|
|
17
|
+
/** Rounding slack, in points: a node flush with the edge must survive. */
|
|
18
|
+
const EPSILON = 0.5;
|
|
19
|
+
|
|
20
|
+
function intersects(a: Frame, b: Frame): boolean {
|
|
21
|
+
return (
|
|
22
|
+
a.x < b.x + b.width - EPSILON &&
|
|
23
|
+
a.x + a.width > b.x + EPSILON &&
|
|
24
|
+
a.y < b.y + b.height - EPSILON &&
|
|
25
|
+
a.y + a.height > b.y + EPSILON
|
|
26
|
+
);
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
function clippedFrame(a: Frame, b: Frame): Frame | null {
|
|
30
|
+
if (!intersects(a, b)) return null;
|
|
31
|
+
const x = Math.max(a.x, b.x);
|
|
32
|
+
const y = Math.max(a.y, b.y);
|
|
33
|
+
return { x, y, width: Math.min(a.x + a.width, b.x + b.width) - x,
|
|
34
|
+
height: Math.min(a.y + a.height, b.y + b.height) - y };
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
function prune(node: ViewNode, window: Frame): ViewNode | null {
|
|
38
|
+
if (node.visible === false) return null;
|
|
39
|
+
const clip = node.clipsChildren === true || /scrollview|recyclerview|listview/i.test(node.type);
|
|
40
|
+
const childWindow = clip ? clippedFrame(node.frame, window) : window;
|
|
41
|
+
const children: ViewNode[] = [];
|
|
42
|
+
for (const child of childWindow ? node.children : []) {
|
|
43
|
+
const kept = prune(child, childWindow!);
|
|
44
|
+
if (kept) children.push(kept);
|
|
45
|
+
}
|
|
46
|
+
// A container can sit outside the window while laying children back inside
|
|
47
|
+
// it (carousels, drawers), so keep any ancestor that still leads somewhere
|
|
48
|
+
// on screen.
|
|
49
|
+
if (children.length === 0 && !intersects(node.frame, window)) return null;
|
|
50
|
+
const onScreen = intersects(node.frame, window);
|
|
51
|
+
const centerVisible = onScreen && node.frame.x + node.frame.width / 2 >= window.x &&
|
|
52
|
+
node.frame.x + node.frame.width / 2 <= window.x + window.width &&
|
|
53
|
+
node.frame.y + node.frame.height / 2 >= window.y &&
|
|
54
|
+
node.frame.y + node.frame.height / 2 <= window.y + window.height;
|
|
55
|
+
if (!children.length && !centerVisible) return null;
|
|
56
|
+
const changed = children.length !== node.children.length || children.some((c, i) => c !== node.children[i]);
|
|
57
|
+
if (!changed && centerVisible) return node;
|
|
58
|
+
// Native containers aggregate all descendant labels before clipping. Never
|
|
59
|
+
// retain a hidden row's text on an otherwise visible ancestor.
|
|
60
|
+
// A structural ancestor can be larger than the viewport while containing
|
|
61
|
+
// visible children. Keep it traversable but not actionable or labelled.
|
|
62
|
+
return { ...node, children, visible: centerVisible || children.length > 0,
|
|
63
|
+
clickable: node.clickable && centerVisible,
|
|
64
|
+
...((!centerVisible || (changed && node.children.length)) ? {
|
|
65
|
+
text: centerVisible && node.text ? children.map((c) => c.text || c.accessibilityLabel || '').filter(Boolean).join(' ').slice(0, 240) || undefined : undefined,
|
|
66
|
+
accessibilityLabel: undefined,
|
|
67
|
+
} : {}) };
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
export function pruneOffscreen(root: ViewNode): ViewNode {
|
|
71
|
+
return prune(root, root.frame) ?? { ...root, children: [] };
|
|
72
|
+
}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import type { Frame, Point, ViewNode } from '../types';
|
|
2
|
+
|
|
3
|
+
function intersect(a: Frame, b: Frame): Frame | null {
|
|
4
|
+
const x = Math.max(a.x, b.x), y = Math.max(a.y, b.y);
|
|
5
|
+
const width = Math.min(a.x + a.width, b.x + b.width) - x;
|
|
6
|
+
const height = Math.min(a.y + a.height, b.y + b.height) - y;
|
|
7
|
+
return width > 0 && height > 0 ? { x, y, width, height } : null;
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
/** Visible scroll regions, clipped by the window and every clipping ancestor. */
|
|
11
|
+
export function scrollViewports(root: ViewNode): Array<{ node: ViewNode; frame: Frame }> {
|
|
12
|
+
const out: Array<{ node: ViewNode; frame: Frame }> = [];
|
|
13
|
+
const walk = (node: ViewNode, clip: Frame) => {
|
|
14
|
+
const frame = intersect(node.frame, clip);
|
|
15
|
+
if (node.scrollable === true && node.visible !== false && frame) out.push({ node, frame });
|
|
16
|
+
const clips = node.clipsChildren || /scrollview|recyclerview|listview/i.test(node.type);
|
|
17
|
+
const childClip = clips ? frame : clip;
|
|
18
|
+
if (childClip) for (const child of node.children) walk(child, childClip);
|
|
19
|
+
};
|
|
20
|
+
walk(root, root.frame);
|
|
21
|
+
return out;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
export function boundedScrollGesture(frame: Frame, from: Point, to: Point): { from: Point; to: Point } {
|
|
25
|
+
const insetX = Math.min(12, frame.width / 4), insetY = Math.min(12, frame.height / 4);
|
|
26
|
+
const clamp = (p: Point): Point => ({
|
|
27
|
+
x: Math.max(frame.x + insetX, Math.min(frame.x + frame.width - insetX, p.x)),
|
|
28
|
+
y: Math.max(frame.y + insetY, Math.min(frame.y + frame.height - insetY, p.y)),
|
|
29
|
+
});
|
|
30
|
+
return { from: clamp(from), to: clamp(to) };
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
/** Position-only evidence: changing prices must not masquerade as scrolling. */
|
|
34
|
+
export function scrollPosition(root: ViewNode, from: Point): string | null {
|
|
35
|
+
const viewport = scrollViewports(root)
|
|
36
|
+
.filter(({ frame: f }) => from.x >= f.x && from.x <= f.x + f.width &&
|
|
37
|
+
from.y >= f.y && from.y <= f.y + f.height)
|
|
38
|
+
.sort((a, b) => a.frame.width * a.frame.height - b.frame.width * b.frame.height)[0];
|
|
39
|
+
if (!viewport) return null;
|
|
40
|
+
const positions: string[] = [];
|
|
41
|
+
const walk = (n: ViewNode) => {
|
|
42
|
+
if (n.visible === false) return;
|
|
43
|
+
if (!n.children.length || n.clickable) positions.push(`${n.id}:${Math.round(n.frame.x)},${Math.round(n.frame.y)}`);
|
|
44
|
+
for (const child of n.children) walk(child);
|
|
45
|
+
};
|
|
46
|
+
walk(viewport.node);
|
|
47
|
+
// Only the hash leaves this local comparison; labels/values are never used.
|
|
48
|
+
let hash = 2166136261;
|
|
49
|
+
for (const c of positions.join('|')) hash = Math.imul(hash ^ c.charCodeAt(0), 16777619);
|
|
50
|
+
return (hash >>> 0).toString(16);
|
|
51
|
+
}
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
import type { ViewNode } from '../types';
|
|
2
|
+
import { sensitiveScreenKind } from './sensitiveScreen';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Client-side redaction before upload (defense in depth; server also redacts).
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
export function redactViewTreeClient(node: ViewNode, maxDepth = 80): ViewNode {
|
|
9
|
+
if (sensitiveScreenKind(node)) {
|
|
10
|
+
return { ...nodeFields(node), text: '[private screen]', children: [] };
|
|
11
|
+
}
|
|
12
|
+
return walk(node, 0, maxDepth);
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
/** Applies to every outbound field, including OCR/model/history and test IDs. */
|
|
16
|
+
export function redactOutbound<T>(value: T, tree?: ViewNode | null | Array<ViewNode | null | undefined>): T {
|
|
17
|
+
const secrets = new Set<string>();
|
|
18
|
+
const collect = (n: ViewNode) => {
|
|
19
|
+
if (n.secure) {
|
|
20
|
+
for (const v of [n.text, n.accessibilityLabel]) {
|
|
21
|
+
if (v && !/^[•●*\s]+$/.test(v)) secrets.add(v);
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
for (const child of n.children || []) collect(child);
|
|
25
|
+
};
|
|
26
|
+
for (const source of Array.isArray(tree) ? tree : [tree]) {
|
|
27
|
+
if (source) collect(source);
|
|
28
|
+
}
|
|
29
|
+
const visit = (v: unknown): unknown => {
|
|
30
|
+
if (typeof v === 'string') {
|
|
31
|
+
let out = v;
|
|
32
|
+
for (const secret of secrets) out = out.split(secret).join('[redacted]');
|
|
33
|
+
return out
|
|
34
|
+
.replace(/\b(?:0x)?[a-fA-F0-9]{64}\b/g, '[redacted]')
|
|
35
|
+
.replace(/\b[5KL][1-9A-HJ-NP-Za-km-z]{50,51}\b/g, '[redacted]')
|
|
36
|
+
.replace(/((?:password|passcode|密码|私钥|private\s*key)\s*[:=:]\s*)[^\s,;"}]+/gi, '$1[redacted]');
|
|
37
|
+
}
|
|
38
|
+
if (Array.isArray(v)) return v.map(visit);
|
|
39
|
+
if (v && typeof v === 'object') return Object.fromEntries(Object.entries(v).map(([k, x]) => [k, visit(x)]));
|
|
40
|
+
return v;
|
|
41
|
+
};
|
|
42
|
+
return visit(value) as T;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
function scrub(text?: string): string | undefined {
|
|
46
|
+
if (!text) return undefined;
|
|
47
|
+
const t = text.replace(/\s+/g, ' ').trim();
|
|
48
|
+
if (!t) return undefined;
|
|
49
|
+
// A feature label is not its private value. Keep public navigation copy and
|
|
50
|
+
// addresses usable; value formats and assignments are scrubbed separately.
|
|
51
|
+
const safe = redactOutbound(t);
|
|
52
|
+
return safe.length > 80 ? `${safe.slice(0, 80)}…` : safe;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
function walk(node: ViewNode, depth: number, maxDepth: number): ViewNode {
|
|
56
|
+
return {
|
|
57
|
+
...nodeFields(node),
|
|
58
|
+
text: node.secure ? '[redacted]' : scrub(node.text),
|
|
59
|
+
accessibilityLabel: node.secure ? '[redacted]' : scrub(node.accessibilityLabel),
|
|
60
|
+
testID: node.secure ? undefined : scrub(node.testID),
|
|
61
|
+
children:
|
|
62
|
+
depth >= maxDepth
|
|
63
|
+
? []
|
|
64
|
+
: node.children.slice(0, 40).map((c) => walk(c, depth + 1, maxDepth)),
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
/** Runtime trees cross a JS boundary: TypeScript types do not filter fields. */
|
|
69
|
+
function nodeFields(node: ViewNode): Omit<ViewNode, 'children'> {
|
|
70
|
+
const finite = (value: unknown) => typeof value === 'number' && Number.isFinite(value) ? value : undefined;
|
|
71
|
+
const out: Omit<ViewNode, 'children'> = {
|
|
72
|
+
id: typeof node.id === 'string' ? node.id : '',
|
|
73
|
+
type: typeof node.type === 'string' ? node.type : 'View',
|
|
74
|
+
frame: {
|
|
75
|
+
x: finite(node.frame?.x) ?? 0,
|
|
76
|
+
y: finite(node.frame?.y) ?? 0,
|
|
77
|
+
width: finite(node.frame?.width) ?? 0,
|
|
78
|
+
height: finite(node.frame?.height) ?? 0,
|
|
79
|
+
},
|
|
80
|
+
clickable: node.clickable === true,
|
|
81
|
+
enabled: node.enabled !== false,
|
|
82
|
+
visible: node.visible !== false,
|
|
83
|
+
};
|
|
84
|
+
for (const key of ['secure', 'selected', 'sheet', 'toggle', 'on', 'adjustable', 'scrollable', 'clipsChildren'] as const) {
|
|
85
|
+
if (typeof node[key] === 'boolean') out[key] = node[key];
|
|
86
|
+
}
|
|
87
|
+
for (const key of ['value', 'min', 'max'] as const) {
|
|
88
|
+
const value = finite(node[key]);
|
|
89
|
+
if (value !== undefined) out[key] = value;
|
|
90
|
+
}
|
|
91
|
+
return out;
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
export function viewTreeOutline(node: ViewNode, maxLines = 120): string {
|
|
95
|
+
if (sensitiveScreenKind(node)) return '[private screen — user completes locally]';
|
|
96
|
+
const lines: string[] = [];
|
|
97
|
+
const go = (n: ViewNode, indent: number) => {
|
|
98
|
+
if (lines.length >= maxLines) return;
|
|
99
|
+
const bits = [
|
|
100
|
+
n.clickable ? 'tap' : null,
|
|
101
|
+
n.text ? `"${n.text}"` : null,
|
|
102
|
+
n.accessibilityLabel && n.accessibilityLabel !== n.text
|
|
103
|
+
? `a11y="${n.accessibilityLabel}"`
|
|
104
|
+
: null,
|
|
105
|
+
n.testID ? `id=${n.testID}` : null,
|
|
106
|
+
]
|
|
107
|
+
.filter(Boolean)
|
|
108
|
+
.join(' ');
|
|
109
|
+
lines.push(`${' '.repeat(indent)}${n.id} ${n.type} ${bits}`.trimEnd());
|
|
110
|
+
for (const c of n.children) go(c, indent + 1);
|
|
111
|
+
};
|
|
112
|
+
go(node, 0);
|
|
113
|
+
if (lines.length >= maxLines) lines.push('…(truncated)');
|
|
114
|
+
return lines.join('\n');
|
|
115
|
+
}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import type { ViewNode } from '../types';
|
|
2
|
+
|
|
3
|
+
/** Shared by local gates and the final upload boundary; never inspect values. */
|
|
4
|
+
export const PRIVATE_INPUT_PROMPT_RE =
|
|
5
|
+
/^(?:(?:请)?(?:输入|设置|确认|创建|验证|解锁|重置|更改|修改)(?:您?的|新|旧|登录|支付|交易|钱包|安全|数字|\d+位|\s)*(?:密码|安全码|验证码)|(?:登录|支付|交易|钱包)?密码|安全码|验证码|短信验证|(?:please\s+)?(?:enter|set|confirm|create|verify|unlock|reset|change)\s+(?:(?:your|new|old|wallet|payment|login|\d+[- ]digit)\s+)*(?:password|passcode|pin|otp|security\s+code|verification\s+code)|password|passcode|pin|otp|cvv)\s*[::??!!]?$/i;
|
|
6
|
+
|
|
7
|
+
export function isPrivateInput(node: ViewNode): boolean {
|
|
8
|
+
if (node.secure) return true;
|
|
9
|
+
if (!/securetext|password|textfield|textinput|edittext|textview|textarea/i.test(node.type)) return false;
|
|
10
|
+
const metadata = `${node.testID || ''} ${node.accessibilityLabel || ''} ${node.type}`;
|
|
11
|
+
return /password|passwd|pass[-_\s]?code|\bpin\b|\botp\b|\bcvv\b|verification[-_\s]*code|security[-_\s]*code|密码|验证码|安全码/i.test(metadata) ||
|
|
12
|
+
(typeof node.text === 'string' && PRIVATE_INPUT_PROMPT_RE.test(node.text.trim()));
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
/** Text spoken by a node; test IDs are metadata, never user-facing copy. */
|
|
16
|
+
export function nodeLabels(node: ViewNode): string[] {
|
|
17
|
+
return [...new Set([node.text, node.accessibilityLabel]
|
|
18
|
+
.filter((text): text is string => typeof text === 'string' && !!text.trim())
|
|
19
|
+
.map(text => text.replace(/\s+/g, ' ').trim()))];
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
export function isSdkChrome(node: ViewNode): boolean {
|
|
23
|
+
return /^koko-agent-(?:overlay|cursor|entry)(?:$|[/:-])/i.test(node.testID || '');
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
export function isSystemSheet(node: ViewNode): boolean {
|
|
27
|
+
return node.sheet === true || /uialertcontroller|alertdialog|biometricprompt/i.test(node.type);
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
/** A full-screen Pressable used to dismiss the keyboard is not an action row. */
|
|
31
|
+
function isActionRow(node: ViewNode, root: ViewNode): boolean {
|
|
32
|
+
if (!node.clickable && !node.toggle && !node.adjustable) return false;
|
|
33
|
+
if (/button|menuitem|tabbaritem|navigationitem/i.test(node.type)) return true;
|
|
34
|
+
if (node === root || node.frame.height >= root.frame.height / 2) return false;
|
|
35
|
+
const hasIndependentAction = (n: ViewNode): boolean => n.children.some(child =>
|
|
36
|
+
child.clickable || child.toggle || child.adjustable || hasIndependentAction(child));
|
|
37
|
+
return !hasIndependentAction(node);
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
/** Static own copy, excluding aggregated ancestors and offered menu actions. */
|
|
41
|
+
export function staticScreenLabels(root: ViewNode): Array<{ node: ViewNode; label: string }> {
|
|
42
|
+
const out: Array<{ node: ViewNode; label: string }> = [];
|
|
43
|
+
const hasCopy = (n: ViewNode): boolean => n.visible !== false && !isSdkChrome(n) &&
|
|
44
|
+
(!!nodeLabels(n).length || n.children.some(hasCopy));
|
|
45
|
+
const visit = (node: ViewNode, inAction: boolean) => {
|
|
46
|
+
if (isSdkChrome(node)) return;
|
|
47
|
+
const action = inAction || isActionRow(node, root);
|
|
48
|
+
if (node.visible !== false && !action && !node.children.some(hasCopy)) {
|
|
49
|
+
for (const label of nodeLabels(node)) out.push({ node, label });
|
|
50
|
+
}
|
|
51
|
+
for (const child of node.children) visit(child, action);
|
|
52
|
+
};
|
|
53
|
+
visit(root, false);
|
|
54
|
+
return out;
|
|
55
|
+
}
|