rea-agents 6.1.0 → 6.3.0
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/README.md +24 -24
- package/bridge/ghidra/ReaGhidraBridge.java +32 -4
- package/bridge/hopper_bridge.py +8 -1
- package/dist/android/JadxConfiguration.js +87 -7
- package/dist/android/JadxMcpTransport.js +14 -2
- package/dist/android/JadxProvider.js +64 -36
- package/dist/android/JadxSession.js +51 -9
- package/dist/application/BinaryTargetResolver.js +68 -20
- package/dist/application/BrowserEvidence.js +3 -8
- package/dist/application/BrowserScenarioEvidence.js +4 -20
- package/dist/application/CapabilityInventory.js +43 -9
- package/dist/application/ClientConfigurationDocument.js +97 -25
- package/dist/application/ClientRegistrationStatus.js +19 -6
- package/dist/application/DirectAnalysis.js +41 -20
- package/dist/application/DirectAnalysisCleanup.js +71 -0
- package/dist/application/DirectAnalysisStatus.js +3 -7
- package/dist/application/Doctor.js +40 -53
- package/dist/application/DoctorDiagnostics.js +2 -3
- package/dist/application/EnhancedTools.js +51 -6
- package/dist/application/EvidenceBundleFiles.js +8 -3
- package/dist/application/InvestigationProviders.js +13 -5
- package/dist/application/JsonFiles.js +56 -23
- package/dist/application/LinuxHopper.js +11 -7
- package/dist/application/MacHopper.js +15 -18
- package/dist/application/RealHopperAssertions.js +0 -11
- package/dist/application/ReconstructionObligationCandidates.js +10 -3
- package/dist/application/ReconstructionObligationLedgerProjection.js +3 -1
- package/dist/application/ReferenceSourceImportEntries.js +1 -1
- package/dist/application/RegularFileRead.js +17 -0
- package/dist/application/Setup.js +26 -23
- package/dist/application/SetupClientConfiguration.js +18 -7
- package/dist/application/SetupHost.js +20 -29
- package/dist/application/SetupPlan.js +24 -20
- package/dist/application/SetupSkill.js +57 -8
- package/dist/application/SupportedClients.js +43 -0
- package/dist/application/Uninstall.js +98 -30
- package/dist/application/UpdateMaintenance.js +13 -7
- package/dist/application/UpdateRuntime.js +12 -12
- package/dist/application/Utf8JsonInput.js +64 -0
- package/dist/application/WebScriptExportService.js +38 -5
- package/dist/application/WorkflowEvidence.js +25 -2
- package/dist/application/XrefsAddressResolution.js +45 -0
- package/dist/application/analysisView/AnalysisViewService.js +76 -0
- package/dist/application/android/AndroidAnalysisService.js +1 -1
- package/dist/application/binary/AnalysisClientCleanup.js +30 -5
- package/dist/application/binary/AnalysisProviderEvaluation.js +1 -2
- package/dist/application/binary/AnalysisProviderRegistry.js +2 -6
- package/dist/application/binary/AnalysisSnapshotCache.js +13 -10
- package/dist/application/binary/BinarySession.js +86 -29
- package/dist/application/binary/BinarySessionComposition.js +1 -3
- package/dist/application/binary/BinarySessionExecution.js +3 -5
- package/dist/application/binary/BinarySessionOpen.js +10 -2
- package/dist/application/binary/BinarySessionRecords.js +1 -1
- package/dist/application/binary/BinarySessionStatus.js +1 -6
- package/dist/application/binary/CompositeProvider.js +4 -18
- package/dist/application/binary/LazyAnalysisProvider.js +5 -5
- package/dist/application/binary/SessionProviderRouter.js +27 -135
- package/dist/application/homebrew.js +48 -0
- package/dist/application/javascript/ElectronActiveEvidence.js +10 -14
- package/dist/application/javascript/ElectronBoundaryAnalysis.js +2 -2
- package/dist/application/javascript/ElectronBoundaryGraphNative.js +5 -1
- package/dist/application/javascript/JavaScriptApplicationEvidence.js +3 -6
- package/dist/application/javascript/JavaScriptApplicationEvidenceGraph.js +107 -46
- package/dist/application/javascript/JavaScriptApplicationService.js +7 -1
- package/dist/application/javascript/JavaScriptApplicationWorkflowService.js +59 -45
- package/dist/application/javascript/JavaScriptArtifactAnalysis.js +5 -9
- package/dist/application/javascript/JavaScriptArtifactGraphBuilder.js +19 -27
- package/dist/application/javascript/JavaScriptArtifactGraphBundlers.js +11 -3
- package/dist/application/javascript/JavaScriptArtifactGraphContext.js +9 -0
- package/dist/application/javascript/JavaScriptArtifactGraphDocuments.js +8 -5
- package/dist/application/javascript/JavaScriptArtifactGraphFindings.js +46 -29
- package/dist/application/javascript/JavaScriptArtifactGraphStructure.js +0 -1
- package/dist/application/javascript/JavaScriptArtifactPathResolution.js +86 -27
- package/dist/application/javascript/JavaScriptArtifactReconstruction.js +52 -9
- package/dist/application/javascript/JavaScriptArtifactReconstructionInput.js +1 -0
- package/dist/application/javascript/JavaScriptJsonModules.js +2 -2
- package/dist/application/javascript/JavaScriptModuleRelationships.js +6 -18
- package/dist/application/javascript/JavaScriptRuntimeObservationService.js +3 -3
- package/dist/application/javascript/JavaScriptRuntimeReconciliationService.js +11 -27
- package/dist/application/javascript/JavaScriptSemanticGraphAsyncProjection.js +4 -5
- package/dist/application/javascript/JavaScriptSemanticGraphBuilder.js +8 -6
- package/dist/application/javascript/JavaScriptSemanticGraphChildProcessProjection.js +2 -3
- package/dist/application/javascript/JavaScriptSemanticGraphConstruction.js +7 -5
- package/dist/application/javascript/JavaScriptSemanticGraphDataProjection.js +3 -4
- package/dist/application/javascript/JavaScriptSemanticGraphEvidence.js +1 -1
- package/dist/application/javascript/JavaScriptSemanticGraphFingerprintProjection.js +2 -2
- package/dist/application/javascript/JavaScriptSemanticGraphFlowProjection.js +3 -7
- package/dist/application/javascript/JavaScriptSemanticGraphObjectProjection.js +76 -47
- package/dist/application/javascript/JavaScriptSemanticGraphProjection.js +4 -4
- package/dist/application/javascript/JavaScriptSemanticGraphResourceProjection.js +3 -4
- package/dist/application/javascript/JavaScriptSemanticGraphValueProjection.js +51 -25
- package/dist/application/javascript/JavaScriptSemanticTraceService.js +15 -10
- package/dist/application/managed/ManagedMemberComparisonService.js +2 -1
- package/dist/application/managed/ManagedNativeVerificationService.js +2 -1
- package/dist/application/native/NativeCallRoutes.js +2 -4
- package/dist/application/process/ProcessCli.js +11 -11
- package/dist/application/process/ProcessEvidence.js +0 -1
- package/dist/artifacts/ArtifactProvider.js +53 -30
- package/dist/artifacts/ArtifactProviderMetadata.js +1 -4
- package/dist/artifacts/ArtifactReader.js +31 -0
- package/dist/artifacts/AsarArtifactReader.js +81 -17
- package/dist/artifacts/DirectoryArtifactReader.js +2 -1
- package/dist/artifacts/MachOSliceArtifactReader.js +9 -2
- package/dist/artifacts/NativeDmgArtifactReader.js +207 -77
- package/dist/artifacts/NativeDmgOwnership.js +109 -0
- package/dist/artifacts/SafeOutputTree.js +16 -2
- package/dist/artifacts/ZipArtifactReader.js +11 -4
- package/dist/artifacts/apple/AppleAssetCatalogAnalysis.js +4 -2
- package/dist/artifacts/apple/DylibResolutionReader.js +17 -7
- package/dist/artifacts/apple/KeyedArchiveReader.js +68 -42
- package/dist/artifacts/apple/MachoLoadCommandReader.js +36 -6
- package/dist/artifacts/extraction/ArtifactExtraction.js +104 -29
- package/dist/artifacts/inventory/ArtifactGraphConstruction.js +71 -66
- package/dist/artifacts/inventory/ArtifactInventory.js +0 -1
- package/dist/artifacts/inventory/classify.js +33 -14
- package/dist/artifacts/inventory/hashStableRootArtifact.js +37 -0
- package/dist/artifacts/inventory/reader.js +3 -3
- package/dist/artifacts/inventory/scanCanonical.js +64 -34
- package/dist/artifacts/inventory/scanReader.js +12 -20
- package/dist/artifacts/javascript/JavaScriptArtifactFiles.js +65 -27
- package/dist/browser/BrowserScenarioPartialObservation.js +106 -0
- package/dist/browser/CdpBrowserProvider.js +6 -6
- package/dist/browser/CdpCaptureEventHandlers.js +2 -4
- package/dist/browser/CdpCaptureEvents.js +0 -1
- package/dist/browser/CdpCaptureStorageFingerprints.js +3 -3
- package/dist/browser/CdpCaptureValues.js +20 -0
- package/dist/browser/CdpElectronInspection.js +2 -2
- package/dist/browser/CdpElectronProvider.js +4 -5
- package/dist/browser/CdpElectronScriptEvents.js +2 -8
- package/dist/browser/CdpElectronScripts.js +4 -5
- package/dist/browser/CdpPageCaptureScripts.js +2 -3
- package/dist/browser/CdpSafeMetadata.js +10 -10
- package/dist/browser/CdpWebMcpDiscovery.js +16 -13
- package/dist/browser/PlaywrightBrowserScenarioProvider.js +64 -49
- package/dist/browser/PlaywrightElectronActiveActions.js +2 -56
- package/dist/browser/PlaywrightElectronActiveProvider.js +10 -6
- package/dist/browser/PlaywrightScenarioArtifacts.js +1 -1
- package/dist/browser/PlaywrightScenarioBrowser.js +269 -66
- package/dist/browser/PlaywrightScenarioEvents.js +1 -1
- package/dist/browser/PlaywrightScenarioSession.js +41 -32
- package/dist/browser/WebSourceMapFetcher.js +32 -6
- package/dist/browser/assets/ScenarioScriptCapture.js +8 -12
- package/dist/browser/assets/ScriptCaptureAdapters.js +1 -1
- package/dist/browser/history/CaptureFailures.js +6 -2
- package/dist/browser/history/MitmproxyCaptureAdapter.js +4 -2
- package/dist/catalogIdentity.js +0 -1
- package/dist/cli/analysisViewCommands.js +36 -0
- package/dist/cli/artifactCommands.js +11 -12
- package/dist/cli/coreAnalysisCommands.js +3 -3
- package/dist/cli/coreBinaryCommands.js +37 -28
- package/dist/cli/coreNativeCommands.js +9 -10
- package/dist/cli/electronCommands.js +12 -13
- package/dist/cli/interactiveSetup.js +6 -6
- package/dist/cli/javascriptApplicationAnalysis.js +2 -12
- package/dist/cli/jsonOutput.js +3 -2
- package/dist/cli/managedCommands.js +7 -8
- package/dist/cli/nativeCallCommands.js +1 -2
- package/dist/cli/omittableDefaults.js +50 -0
- package/dist/cli/processCommands.js +3 -2
- package/dist/cli/setupCommands.js +16 -15
- package/dist/cli/streamedJsonOutput.js +83 -4
- package/dist/cli/utilityCommands.js +10 -12
- package/dist/cli.js +19 -8
- package/dist/cliBrowserScenarioCommands.js +2 -2
- package/dist/cliCommandNames.js +1 -0
- package/dist/cliJsonFile.js +179 -0
- package/dist/cliJsonInput.js +60 -33
- package/dist/cliObservationOptions.js +4 -0
- package/dist/cliOutput.js +0 -38
- package/dist/composition/auxiliaryAnalysisProviders.js +30 -25
- package/dist/composition/binary.js +9 -9
- package/dist/composition/browserScenario.js +2 -1
- package/dist/composition/directAnalysis.js +20 -14
- package/dist/composition/electronScenario.js +1 -1
- package/dist/composition/optionalObservationProviders.js +12 -7
- package/dist/config/environment.js +6 -0
- package/dist/config/ghidraStartupTimeout.js +4 -9
- package/dist/config/homeDirectory.js +12 -0
- package/dist/config/mcpResponseBudget.js +9 -1
- package/dist/config/parseConfig.js +7 -3
- package/dist/config/parsers.js +19 -22
- package/dist/contracts/analysisViewToolContracts.js +56 -0
- package/dist/contracts/applicationToolContracts.js +5 -4
- package/dist/contracts/artifactComparisonExample.js +7 -7
- package/dist/contracts/artifactToolContracts.js +1 -1
- package/dist/contracts/browserScenarioToolContracts.js +1 -1
- package/dist/contracts/browserToolContracts.js +19 -15
- package/dist/contracts/enhancedInputs.js +2 -2
- package/dist/contracts/enhancedToolContracts.js +4 -3
- package/dist/contracts/errorSchemas.js +3 -1
- package/dist/contracts/evm/evmToolContracts.js +1 -1
- package/dist/contracts/functionComparisonExample.js +8 -0
- package/dist/contracts/functionWorkflowToolContracts.js +1 -1
- package/dist/contracts/inputSchemaPresentation.js +181 -0
- package/dist/contracts/investigationExamples.js +4 -3
- package/dist/contracts/javascript/electronToolContracts.js +3 -2
- package/dist/contracts/javascript/javascriptApplicationWorkflowExamples.js +3 -22
- package/dist/contracts/javascript/javascriptExportShapeComparisonExample.js +248 -0
- package/dist/contracts/javascript/javascriptRuntimeObservationToolContracts.js +1 -1
- package/dist/contracts/javascript/javascriptRuntimeReconciliationExample.js +8 -7
- package/dist/contracts/managed/managedToolContracts.js +8 -12
- package/dist/contracts/managed/managedWorkflowToolContracts.js +1 -1
- package/dist/contracts/mobileApplicationGraphExamples.js +8 -8
- package/dist/contracts/native/binaryDiagnosticsToolContracts.js +1 -1
- package/dist/contracts/native/nativeToolContracts.js +2 -2
- package/dist/contracts/officialToolContracts.js +2 -1
- package/dist/contracts/promptContracts.js +2 -2
- package/dist/contracts/providerSelection.js +1 -1
- package/dist/contracts/sessionLifecycleInputs.js +4 -3
- package/dist/contracts/sessionStatusContract.js +3 -2
- package/dist/contracts/sessionToolContracts.js +17 -4
- package/dist/contracts/sessionToolSchemas.js +4 -16
- package/dist/contracts/toolContracts.js +2 -0
- package/dist/contracts/toolEffects.js +1 -0
- package/dist/contracts/toolOutputSchemaGroups.js +138 -94
- package/dist/contracts/toolOutputSchemaPrimitives.js +13 -26
- package/dist/contracts/toolSchemaMetadata.js +18 -69
- package/dist/contracts/webNetworkCaptureToolContracts.js +1 -1
- package/dist/contracts/webRuntimeToolContracts.js +1 -1
- package/dist/contracts/webScriptToolContracts.js +1 -1
- package/dist/doctorRuntime.js +7 -5
- package/dist/domain/analysisErrorBase.js +5 -0
- package/dist/domain/analysisErrorCore.js +3 -0
- package/dist/domain/analysisErrorPresentation.js +22 -5
- package/dist/domain/analysisErrorProjection.js +24 -5
- package/dist/domain/analysisSnapshot.js +31 -31
- package/dist/domain/analysisView/analysisView.js +241 -0
- package/dist/domain/analysisView/analysisViewCoverage.js +19 -0
- package/dist/domain/analysisView/binaryLayoutView.js +159 -0
- package/dist/domain/analysisView/javascriptApplicationView.js +238 -0
- package/dist/domain/android/androidApplication.js +1 -1
- package/dist/domain/android/androidPartialObservation.js +36 -0
- package/dist/domain/apple/appleApplication.js +1 -1
- package/dist/domain/apple/dylibResolution.js +10 -3
- package/dist/domain/apple/interfaceBuilderGraph.js +0 -1
- package/dist/domain/apple/keyedArchive.js +26 -2
- package/dist/domain/artifactComparison.js +15 -6
- package/dist/domain/artifactGraph.js +17 -4
- package/dist/domain/artifactIdentity.js +8 -8
- package/dist/domain/artifactInspection.js +8 -8
- package/dist/domain/artifactInventoryEvidence.js +9 -16
- package/dist/domain/artifactOperationError.js +3 -3
- package/dist/domain/artifactPartialObservation.js +1 -0
- package/dist/domain/artifactPathSyntax.js +49 -0
- package/dist/domain/binaryTarget.js +39 -13
- package/dist/domain/browserCaptureComparison.js +13 -49
- package/dist/domain/browserCompleteness.js +3 -2
- package/dist/domain/browserNetworkEvidence.js +10 -4
- package/dist/domain/browserObservation.js +0 -1
- package/dist/domain/browserObservationSchemas.js +14 -3
- package/dist/domain/browserScenario.js +0 -1
- package/dist/domain/browserScenarioCapture.js +1 -2
- package/dist/domain/browserScenarioCaptureValues.js +2 -2
- package/dist/domain/browserScenarioDiff.js +0 -2
- package/dist/domain/browserScenarioDiffEvidence.js +0 -12
- package/dist/domain/browserScenarioDiffValues.js +2 -2
- package/dist/domain/browserScenarioNormalization.js +3 -3
- package/dist/domain/browserScenarioValues.js +6 -6
- package/dist/domain/callPath.js +15 -18
- package/dist/domain/callPathSchemas.js +2 -2
- package/dist/domain/canonicalDigest.js +7 -1
- package/dist/domain/canonicalOrdering.js +1 -13
- package/dist/domain/changedBehavior.js +5 -6
- package/dist/domain/comparisonSemantics.js +0 -5
- package/dist/domain/completionLedgerGeneration.js +2 -1
- package/dist/domain/configurationErrors.js +12 -0
- package/dist/domain/conformancePackage.js +4 -3
- package/dist/domain/digests.js +0 -3
- package/dist/domain/evidence.js +19 -40
- package/dist/domain/evidenceBundle.js +58 -42
- package/dist/domain/evidenceCompletionLedger.js +2 -1
- package/dist/domain/firmware/firmwareAnalysis.js +4 -3
- package/dist/domain/functionComparison.js +6 -6
- package/dist/domain/functionComparisonDimensions.js +120 -87
- package/dist/domain/functionComparisonNormalization.js +26 -36
- package/dist/domain/functionComparisonResults.js +3 -6
- package/dist/domain/functionComparisonSchemas.js +2 -8
- package/dist/domain/functionDossierEvidence.js +4 -38
- package/dist/domain/hopperValues.js +11 -15
- package/dist/domain/javascript/electronActiveObservation.js +29 -71
- package/dist/domain/javascript/electronObservation.js +14 -3
- package/dist/domain/javascript/electronStaticAnalysisBrowser.js +12 -11
- package/dist/domain/javascript/electronStaticAnalysisIpc.js +11 -2
- package/dist/domain/javascript/electronStaticAnalysisNative.js +7 -4
- package/dist/domain/javascript/electronStaticAnalysisValues.js +8 -4
- package/dist/domain/javascript/javascriptApplicationAnalysis.js +3 -1
- package/dist/domain/javascript/javascriptApplicationChangeGraph.js +12 -8
- package/dist/domain/javascript/javascriptApplicationEvidenceSchemas.js +6 -0
- package/dist/domain/javascript/javascriptApplicationGraph.js +41 -16
- package/dist/domain/javascript/javascriptApplicationGraphSchemas.js +9 -2
- package/dist/domain/javascript/javascriptApplicationVersionComparison.js +4 -4
- package/dist/domain/javascript/javascriptApplicationVersionComparisonSchemas.js +37 -22
- package/dist/domain/javascript/javascriptApplicationVersionItems.js +50 -36
- package/dist/domain/javascript/javascriptApplicationVersionKeys.js +9 -8
- package/dist/domain/javascript/javascriptAstFingerprint.js +2 -2
- package/dist/domain/javascript/javascriptAstValues.js +22 -0
- package/dist/{application/javascript/JavaScriptReturnShapeProjection.js → domain/javascript/javascriptExportReturnShapeProjection.js} +4 -4
- package/dist/domain/javascript/javascriptExportShapeComparison.js +10 -3
- package/dist/domain/javascript/javascriptExportShapeComparisonIdentity.js +6 -1
- package/dist/domain/javascript/javascriptExportShapeComparisonSchemas.js +58 -22
- package/dist/domain/javascript/javascriptExportShapeSelection.js +7 -7
- package/dist/domain/javascript/javascriptExportShapeVariants.js +70 -16
- package/dist/domain/javascript/javascriptFeatureSeed.js +25 -3
- package/dist/domain/javascript/javascriptFeatureTrace.js +7 -6
- package/dist/domain/javascript/javascriptFeatureTraceSchemas.js +17 -9
- package/dist/domain/javascript/javascriptFeatureTraversal.js +4 -5
- package/dist/domain/javascript/javascriptNativeHandoff.js +7 -7
- package/dist/domain/javascript/javascriptRuntimeLoadState.js +0 -1
- package/dist/domain/javascript/javascriptRuntimeObservation.js +18 -7
- package/dist/domain/javascript/javascriptRuntimeReconciliation.js +12 -6
- package/dist/domain/javascript/javascriptRuntimeReconciliationActive.js +9 -8
- package/dist/domain/javascript/javascriptRuntimeReconciliationCaptureParsing.js +212 -0
- package/dist/domain/javascript/javascriptRuntimeReconciliationGraph.js +5 -4
- package/dist/domain/javascript/javascriptRuntimeReconciliationInputValidation.js +28 -0
- package/dist/domain/javascript/javascriptRuntimeReconciliationMatching.js +6 -6
- package/dist/domain/javascript/javascriptRuntimeReconciliationParsing.js +12 -222
- package/dist/domain/javascript/javascriptRuntimeReconciliationResult.js +2 -2
- package/dist/domain/javascript/javascriptRuntimeReconciliationRuntime.js +15 -4
- package/dist/domain/javascript/javascriptRuntimeReconciliationSchemas.js +2 -2
- package/dist/domain/javascript/javascriptRuntimeStaticCandidates.js +7 -7
- package/dist/domain/javascript/javascriptSemanticAnalysis.js +209 -11
- package/dist/domain/javascript/javascriptSemanticAsyncEffects.js +2 -1
- package/dist/domain/javascript/javascriptSemanticCallResolution.js +9 -7
- package/dist/domain/javascript/javascriptSemanticCalls.js +2 -1
- package/dist/domain/javascript/javascriptSemanticChildProcesses.js +4 -3
- package/dist/domain/javascript/javascriptSemanticCoverage.js +20 -0
- package/dist/domain/javascript/javascriptSemanticDataEffectHelpers.js +7 -9
- package/dist/domain/javascript/javascriptSemanticDataEffects.js +4 -11
- package/dist/domain/javascript/javascriptSemanticFingerprints.js +2 -2
- package/dist/domain/javascript/javascriptSemanticGraph.js +220 -71
- package/dist/domain/javascript/javascriptSemanticGraphSchemas.js +19 -1
- package/dist/domain/javascript/javascriptSemanticIr.js +0 -4
- package/dist/domain/javascript/javascriptSemanticIterationSources.js +106 -0
- package/dist/domain/javascript/javascriptSemanticMemberMutations.js +515 -74
- package/dist/domain/javascript/javascriptSemanticMutationInitializers.js +190 -0
- package/dist/domain/javascript/javascriptSemanticMutationValues.js +44 -36
- package/dist/domain/javascript/javascriptSemanticObjects.js +79 -42
- package/dist/domain/javascript/javascriptSemanticPrimitives.js +8 -14
- package/dist/domain/javascript/javascriptSemanticProjection.js +21 -16
- package/dist/domain/javascript/javascriptSemanticPromises.js +16 -21
- package/dist/domain/javascript/javascriptSemanticPropertyPaths.js +23 -0
- package/dist/domain/javascript/javascriptSemanticProvenance.js +3 -3
- package/dist/domain/javascript/javascriptSemanticQuery.js +8 -2
- package/dist/domain/javascript/javascriptSemanticQueryIdentity.js +3 -2
- package/dist/domain/javascript/javascriptSemanticQuerySchemas.js +8 -9
- package/dist/domain/javascript/javascriptSemanticRequireOrigin.js +16 -10
- package/dist/domain/javascript/javascriptSemanticResourceLimits.js +1 -1
- package/dist/domain/javascript/javascriptSemanticResources.js +1 -1
- package/dist/domain/javascript/javascriptSemanticReturns.js +55 -44
- package/dist/domain/javascript/javascriptSemanticSlots.js +72 -0
- package/dist/domain/javascript/javascriptSemanticTraversal.js +6 -1
- package/dist/domain/javascript/javascriptSemanticValues.js +180 -76
- package/dist/domain/javascript/javascriptSourceMapPaths.js +114 -0
- package/dist/domain/javascript/javascriptSourceParser.js +34 -9
- package/dist/domain/javascript/javascriptStaticAnalysisBundler.js +5 -6
- package/dist/domain/javascript/javascriptStaticAnalysisCalls.js +2 -1
- package/dist/domain/javascript/javascriptStaticAnalysisHelpers.js +26 -16
- package/dist/domain/javascript/sourceToBundleComparison.js +19 -8
- package/dist/domain/javascript/sourceToBundleSignals.js +53 -25
- package/dist/domain/jsonSerialization.js +109 -55
- package/dist/domain/jsonShape.js +46 -19
- package/dist/domain/localPath.js +10 -4
- package/dist/domain/managed/managedApplicationGraph.js +10 -6
- package/dist/domain/managed/managedApplicationGraphNodes.js +82 -57
- package/dist/domain/managed/managedArtifact.js +6 -4
- package/dist/domain/managed/managedMemberComparison.js +2 -9
- package/dist/domain/managed/managedMemberComparisonMatch.js +6 -7
- package/dist/domain/managed/managedNativeVerification.js +0 -2
- package/dist/domain/managed/managedNativeVerificationMatch.js +9 -3
- package/dist/domain/native/binaryLayout.js +2 -3
- package/dist/domain/native/nativeApiBoundary.js +1 -1
- package/dist/domain/native/nativeCallObservation.js +3 -3
- package/dist/domain/native/nativeInstruction.js +7 -0
- package/dist/domain/native/nativeValueFlow.js +5 -11
- package/dist/domain/native/objcSwiftMetadata.js +15 -17
- package/dist/domain/native/recordedCrash.js +2 -3
- package/dist/domain/offsetDateTime.js +17 -0
- package/dist/domain/process/processCapture.js +22 -20
- package/dist/domain/process/processCaptureCoverage.js +70 -0
- package/dist/domain/process/processCaptureExample.js +45 -1
- package/dist/domain/process/processCaptureParsing.js +1 -34
- package/dist/domain/process/processCaptureValidation.js +82 -13
- package/dist/domain/process/processComparison.js +39 -43
- package/dist/domain/process/processObservation.js +10 -2
- package/dist/domain/process/processScenario.js +24 -2
- package/dist/domain/process/processTraceComparison.js +0 -2
- package/dist/domain/process/processTraceDimensionProjection.js +1 -1
- package/dist/domain/process/processTraceEvaluation.js +19 -15
- package/dist/domain/process/processTraceSpecification.js +4 -7
- package/dist/domain/providerAdapterError.js +2 -0
- package/dist/domain/providerCleanupError.js +6 -2
- package/dist/domain/reconstructionCoverage.js +7 -3
- package/dist/domain/reconstructionObligationLedgerSchemas.js +2 -1
- package/dist/domain/reconstructionReadinessSchemas.js +2 -1
- package/dist/domain/reconstructionUnknowns.js +4 -3
- package/dist/domain/reconstructionVerification.js +6 -5
- package/dist/domain/reconstructionVerificationSchemas.js +2 -1
- package/dist/domain/referenceSourceGraph.js +27 -28
- package/dist/domain/referenceSourceImportParsing.js +34 -45
- package/dist/domain/residualUnknown.js +3 -2
- package/dist/domain/staticRuntimeCorrelation.js +4 -3
- package/dist/domain/stringPatterns.js +6 -0
- package/dist/domain/swiftSymbolClassification.js +66 -0
- package/dist/domain/symbolAnalysis.js +83 -20
- package/dist/domain/unicodeCodePointOrder.js +6 -0
- package/dist/domain/webBundleAnalyzerInspection.js +9 -1
- package/dist/domain/webCaptureDiff.js +71 -30
- package/dist/domain/webCaptureDiffSchemas.js +8 -11
- package/dist/domain/webEventListeners.js +3 -2
- package/dist/domain/webExecution.js +3 -2
- package/dist/domain/webInventory.js +3 -2
- package/dist/domain/webMcpDiscovery.js +4 -3
- package/dist/domain/webRuntime.js +0 -2
- package/dist/domain/webScriptExport.js +2 -2
- package/dist/dotnet/ManagedArtifactInspector.js +2 -19
- package/dist/dotnet/ManagedMemberInspector.js +12 -18
- package/dist/dotnet/ManagedMemberInspectorCore.js +47 -44
- package/dist/dotnet/ManagedMemberInstructionDecoder.js +1 -2
- package/dist/dotnet/ManagedMemberRows.js +75 -62
- package/dist/dotnet/ManagedMetadataInventory.js +16 -22
- package/dist/dotnet/ManagedMethodBodyReader.js +4 -0
- package/dist/dotnet/ManagedNativeBoundaryHelpers.js +109 -94
- package/dist/dotnet/ManagedNativeBoundaryInspector.js +12 -21
- package/dist/dotnet/ManagedReaderFailure.js +16 -0
- package/dist/dotnet/ManagedStaticProvider.js +13 -12
- package/dist/dotnet/ManagedStaticProviderMetadata.js +1 -4
- package/dist/evaluation/AgentEvaluationFixtures.js +250 -0
- package/dist/evaluation/AgentEvaluationReport.js +28 -0
- package/dist/evaluation/CodexAgentEval.js +12 -8
- package/dist/evaluation/KnownAnswerEvaluation.js +281 -0
- package/dist/evm/EvmoleInterfaceProvider.js +2 -1
- package/dist/filesystem/RegularFile.js +41 -0
- package/dist/firmware/FirmwareCommand.js +9 -5
- package/dist/firmware/FirmwareProvider.js +4 -4
- package/dist/generatedPackageMetadata.js +2 -2
- package/dist/ghidra/GhidraAnalysisProfile.js +3 -6
- package/dist/ghidra/GhidraClient.js +105 -36
- package/dist/ghidra/GhidraClientStartup.js +0 -2
- package/dist/ghidra/GhidraDoctor.js +6 -5
- package/dist/ghidra/GhidraFunctionValues.js +3 -5
- package/dist/ghidra/GhidraInstallation.js +151 -22
- package/dist/ghidra/GhidraJavaLaunch.js +6 -2
- package/dist/ghidra/GhidraLauncher.js +58 -26
- package/dist/ghidra/GhidraProvider.js +6 -2
- package/dist/ghidra/GhidraProviderCapabilities.js +6 -0
- package/dist/ghidra/GhidraProviderClient.js +13 -3
- package/dist/ghidra/GhidraSessionError.js +2 -0
- package/dist/ghidra/GhidraSessionRoot.js +39 -0
- package/dist/ghidra/extensions/GhidraExtensions.js +17 -10
- package/dist/ghidra/extensions/nativeaot/NativeAotAdapter.js +8 -2
- package/dist/hopper/BridgeLauncher.js +34 -45
- package/dist/hopper/HopperAnalysisProfile.js +3 -8
- package/dist/hopper/HopperCleanup.js +56 -27
- package/dist/hopper/HopperClient.js +86 -65
- package/dist/hopper/HopperMachOImage.js +3 -2
- package/dist/hopper/HopperProvider.js +16 -18
- package/dist/hopper/HopperRegexSearch.js +3 -6
- package/dist/hopper/HopperTargetLease.js +132 -49
- package/dist/hopper/LinuxPrivateDisplayProbe.js +6 -0
- package/dist/ida/IdaConfiguration.js +8 -3
- package/dist/ida/IdaInput.js +1 -7
- package/dist/ida/IdaMcpConnection.js +8 -4
- package/dist/ida/IdaOperationRunner.js +5 -3
- package/dist/ida/IdaProvider.js +8 -12
- package/dist/ida/IdaSessionClient.js +24 -20
- package/dist/ida/IdaWorkspace.js +12 -13
- package/dist/inspector/JavaScriptRuntimeScope.js +9 -5
- package/dist/inspector/V8InspectorCaptureProjection.js +47 -14
- package/dist/inspector/V8InspectorProvider.js +97 -35
- package/dist/javascript/recovery/WakaruCommand.js +7 -2
- package/dist/javascript/recovery/WakaruExecution.js +5 -2
- package/dist/main/shutdown.js +81 -29
- package/dist/main/startup.js +9 -2
- package/dist/main/transport.js +23 -3
- package/dist/main.js +11 -18
- package/dist/native/AppleMachoSelection.js +16 -6
- package/dist/native/AppleObjcDispatchFacets.js +3 -3
- package/dist/native/AppleObjcProperties.js +17 -7
- package/dist/native/CommandRunner.js +9 -7
- package/dist/native/LldbCallTracer.js +249 -77
- package/dist/native/NativeMacOSProvider.js +32 -17
- package/dist/native/NativeMacOSProviderMetadata.js +1 -2
- package/dist/native/NativeUiHelperRuntime.js +11 -2
- package/dist/native/NativeUiObservation.js +2 -2
- package/dist/native/pwntools/PwntoolsDecoder.js +2 -1
- package/dist/process/DarwinProcessRunTokenReader.js +16 -2
- package/dist/process/ExecFileOutput.js +88 -6
- package/dist/process/PrivateRuntimeRoot.js +10 -5
- package/dist/process/ProcessOwnership.js +1 -4
- package/dist/process/ProcessOwnershipObservation.js +18 -16
- package/dist/process/ProviderProcess.js +1 -3
- package/dist/process/capture/FilesystemSnapshot.js +131 -24
- package/dist/process/capture/ProcessCaptureError.js +13 -0
- package/dist/process/capture/ProcessCaptureLifecycle.js +148 -74
- package/dist/process/capture/ProcessFilesystemEffects.js +51 -6
- package/dist/process/capture/ProcessHarness.js +16 -33
- package/dist/process/capture/ProcessNormalization.js +20 -2
- package/dist/process/capture/ProcessSampling.js +25 -2
- package/dist/process/capture/TerminalRenderer.js +14 -0
- package/dist/process/snapshotEnvironment.js +14 -0
- package/dist/server/EvidenceMcpServer.js +25 -14
- package/dist/server/analysisAdmission.js +8 -0
- package/dist/server/createServer.js +71 -59
- package/dist/server/mcpClientMetadata.js +12 -5
- package/dist/server/promptCompletion.js +3 -8
- package/dist/server/registerAnalysisViewTool.js +15 -0
- package/dist/server/registerAndroidTools.js +2 -3
- package/dist/server/registerApplicationTools/compareExportShapes.js +6 -6
- package/dist/server/registerApplicationTools/compareSourceToBundle.js +4 -5
- package/dist/server/registerApplicationTools/compareVersions.js +4 -5
- package/dist/server/registerApplicationTools/coverage.js +1 -2
- package/dist/server/registerApplicationTools/helpers.js +4 -4
- package/dist/server/registerApplicationTools/obligationLedger.js +4 -5
- package/dist/server/registerApplicationTools/projectMobileApplicationGraph.js +3 -4
- package/dist/server/registerApplicationTools/traceFeature.js +4 -5
- package/dist/server/registerApplicationTools/traceSemantics.js +4 -5
- package/dist/server/registerArtifactComparisonTool.js +4 -5
- package/dist/server/registerArtifactTools.js +2 -2
- package/dist/server/registerBinaryDiagnosticsTools.js +2 -3
- package/dist/server/registerBrowserScenarioTool.js +3 -4
- package/dist/server/registerBrowserTools.js +13 -16
- package/dist/server/registerBundleComparisonTool.js +5 -6
- package/dist/server/registerCloseLifecycleTool.js +8 -7
- package/dist/server/registerElectronTools.js +10 -13
- package/dist/server/registerEnhancedTools.js +82 -77
- package/dist/server/registerEvidenceTools.js +54 -47
- package/dist/server/registerEvmTools.js +2 -3
- package/dist/server/registerFirmwareTools.js +2 -3
- package/dist/server/registerFunctionComparisonTool.js +7 -8
- package/dist/server/registerInvestigationTools.js +14 -15
- package/dist/server/registerJavaScriptRecoveryTool.js +2 -3
- package/dist/server/registerJavaScriptRuntimeObservationTools.js +6 -6
- package/dist/server/registerManagedTools.js +7 -4
- package/dist/server/registerManagedWorkflowTools/compareManagedMembers.js +5 -6
- package/dist/server/registerManagedWorkflowTools/importManagedReconstruction.js +4 -5
- package/dist/server/registerManagedWorkflowTools/projectManagedApplicationGraph.js +6 -7
- package/dist/server/registerManagedWorkflowTools/verifyManagedNativeBoundaries.js +6 -7
- package/dist/server/registerOfficialTools.js +32 -41
- package/dist/server/registerProcessComparisonTool.js +8 -8
- package/dist/server/registerRecordedCrashTools.js +2 -3
- package/dist/server/registerSessionRecordTools.js +15 -19
- package/dist/server/registerSessionStatusTool.js +3 -4
- package/dist/server/registerSessionTools.js +19 -19
- package/dist/server/registerWebModuleTool.js +2 -3
- package/dist/server/registerWebNetworkCaptureTool.js +2 -3
- package/dist/server/registerWebRuntimeTools.js +4 -5
- package/dist/server/registerWebScriptTool.js +2 -3
- package/dist/server/registerWebSourceLocationTool.js +2 -3
- package/dist/server/toolResult.js +66 -94
- package/dist/server/toolResultEncoding.js +11 -10
- package/dist/windows/WindowsNativeLoader.js +1 -0
- package/dist/windows/WindowsOwnedProcess.js +60 -15
- package/dist/windows/WindowsPrivateRuntime.js +7 -8
- package/native/windows/README.md +3 -1
- package/native/windows/build/manifest.json +2 -2
- package/native/windows/build/rea-windows-x64.node +0 -0
- package/package.json +42 -30
- package/scripts/rea.mjs +3 -6
- package/skills/reverse-engineer-anything/SKILL.md +14 -13
- package/skills/reverse-engineer-anything/references/android-applications.md +6 -3
- package/skills/reverse-engineer-anything/references/evidence-workflows.md +8 -4
- package/skills/reverse-engineer-anything/references/javascript-applications.md +16 -6
- package/skills/reverse-engineer-anything/references/native-and-artifacts.md +18 -0
- package/dist/artifacts/inventory/policy.js +0 -2
- package/dist/config.js +0 -1
- package/dist/contracts/browserCaptureToolInputSchema.js +0 -43
- package/dist/contracts/process/processCaptureExample.js +0 -2
- package/dist/contracts/toolOutputSchemas.js +0 -2
- package/dist/domain/managed/managedApplicationGraphNodeCoverage.js +0 -6
- package/dist/main/reload.js +0 -12
- package/dist/main/state.js +0 -3
- package/dist/server/registerNativeTools.js +0 -6
- package/dist/server/sessionToolPolicies.js +0 -2
|
@@ -10,7 +10,33 @@ const SKILL_FILES = [
|
|
|
10
10
|
"references/runtime-observation.md",
|
|
11
11
|
"references/evidence-workflows.md",
|
|
12
12
|
];
|
|
13
|
-
|
|
13
|
+
/** Resolve Claude Code personal skills from the selected environment. */
|
|
14
|
+
export const claudeCodeSkillsDirectory = (home, environment = {}) => join(environment.CLAUDE_CONFIG_DIR ?? join(home, ".claude"), "skills");
|
|
15
|
+
/** Resolve the skill roots required by a client selection, or all owned roots. */
|
|
16
|
+
export const skillDestinations = (home, clientIds, claudeSkillsDirectory = claudeCodeSkillsDirectory(home)) => {
|
|
17
|
+
const includeClaude = clientIds === undefined || clientIds.includes("claude_code");
|
|
18
|
+
const includeShared = clientIds === undefined ||
|
|
19
|
+
clientIds.length === 0 ||
|
|
20
|
+
clientIds.some((clientId) => clientId !== "claude_code");
|
|
21
|
+
return [
|
|
22
|
+
...(includeShared
|
|
23
|
+
? [
|
|
24
|
+
{
|
|
25
|
+
client: "shared",
|
|
26
|
+
path: join(home, ".agents/skills", PRODUCT_IDENTITY.skillName),
|
|
27
|
+
},
|
|
28
|
+
]
|
|
29
|
+
: []),
|
|
30
|
+
...(includeClaude
|
|
31
|
+
? [
|
|
32
|
+
{
|
|
33
|
+
client: "claude_code",
|
|
34
|
+
path: join(claudeSkillsDirectory, PRODUCT_IDENTITY.skillName),
|
|
35
|
+
},
|
|
36
|
+
]
|
|
37
|
+
: []),
|
|
38
|
+
];
|
|
39
|
+
};
|
|
14
40
|
const readOptionalText = async (path) => {
|
|
15
41
|
try {
|
|
16
42
|
return await readFile(path, "utf8");
|
|
@@ -21,18 +47,18 @@ const readOptionalText = async (path) => {
|
|
|
21
47
|
throw cause;
|
|
22
48
|
}
|
|
23
49
|
};
|
|
24
|
-
const canonicalSkillFiles = async (home) => Promise.all(SKILL_FILES.map(async (relativePath) => {
|
|
25
|
-
const destination = join(
|
|
50
|
+
const canonicalSkillFiles = async (home, clientIds, claudeSkillsDirectory) => Promise.all(skillDestinations(home, clientIds, claudeSkillsDirectory).flatMap(({ path: root }) => SKILL_FILES.map(async (relativePath) => {
|
|
51
|
+
const destination = join(root, relativePath);
|
|
26
52
|
return {
|
|
27
53
|
destination,
|
|
28
54
|
content: await readFile(new URL(`../../skills/${PRODUCT_IDENTITY.skillName}/${relativePath}`, import.meta.url), "utf8"),
|
|
29
55
|
original: await readOptionalText(destination),
|
|
30
56
|
};
|
|
31
|
-
}));
|
|
57
|
+
})));
|
|
32
58
|
/** Report whether setup would change any file in the managed REA skill bundle. */
|
|
33
|
-
export const canonicalSkillNeedsInstall = async (home) => {
|
|
59
|
+
export const canonicalSkillNeedsInstall = async (home, clientIds = [], claudeSkillsDirectory) => {
|
|
34
60
|
try {
|
|
35
|
-
return (await canonicalSkillFiles(home)).some(({ content, original }) => original !== content);
|
|
61
|
+
return (await canonicalSkillFiles(home, clientIds, claudeSkillsDirectory)).some(({ content, original }) => original !== content);
|
|
36
62
|
}
|
|
37
63
|
catch (cause) {
|
|
38
64
|
// Unreadable skill state fails open to install so setup can repair it.
|
|
@@ -50,10 +76,10 @@ const restoreSkillFiles = async (changed) => {
|
|
|
50
76
|
}
|
|
51
77
|
};
|
|
52
78
|
/** Transactionally install or upgrade the canonical REA skill and references. */
|
|
53
|
-
export const installCanonicalSkill = async (home) => {
|
|
79
|
+
export const installCanonicalSkill = async (home, clientIds = [], claudeSkillsDirectory) => {
|
|
54
80
|
let changed = [];
|
|
55
81
|
try {
|
|
56
|
-
const canonical = await canonicalSkillFiles(home);
|
|
82
|
+
const canonical = await canonicalSkillFiles(home, clientIds, claudeSkillsDirectory);
|
|
57
83
|
changed = canonical.filter(({ content, original }) => original !== content);
|
|
58
84
|
if (changed.length === 0)
|
|
59
85
|
return "unchanged";
|
|
@@ -82,3 +108,26 @@ export const installCanonicalSkill = async (home) => {
|
|
|
82
108
|
return "failed";
|
|
83
109
|
}
|
|
84
110
|
};
|
|
111
|
+
/** Read installed skill metadata and compare every managed location. */
|
|
112
|
+
export const readInstalledSkillIdentity = async (home, clientIds, claudeSkillsDirectory) => {
|
|
113
|
+
const destinations = skillDestinations(home, clientIds, claudeSkillsDirectory);
|
|
114
|
+
let content;
|
|
115
|
+
for (const destination of destinations) {
|
|
116
|
+
try {
|
|
117
|
+
content = await readFile(join(destination.path, "SKILL.md"), "utf8");
|
|
118
|
+
break;
|
|
119
|
+
}
|
|
120
|
+
catch {
|
|
121
|
+
// Another selected copy may provide metadata; canonical validation below
|
|
122
|
+
// still marks missing or unreadable copies as stale.
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
if (content === undefined)
|
|
126
|
+
return undefined;
|
|
127
|
+
const toolCount = /^\s{2}tool_count:\s*(\d+)\s*$/mu.exec(content)?.[1];
|
|
128
|
+
return {
|
|
129
|
+
canonical: !(await canonicalSkillNeedsInstall(home, clientIds, claudeSkillsDirectory)),
|
|
130
|
+
version: /^\s{2}version:\s*"([^"]+)"\s*$/mu.exec(content)?.[1] ?? null,
|
|
131
|
+
toolCount: toolCount === undefined ? null : Number.parseInt(toolCount, 10),
|
|
132
|
+
};
|
|
133
|
+
};
|
|
@@ -34,6 +34,38 @@ export const GROK_BOT_MANUAL_REGISTRATION_REMEDIATION = "Grok Bot keeps connecto
|
|
|
34
34
|
export const manualRegistrationRemediation = (clientName) => clientName === "grok_bot"
|
|
35
35
|
? GROK_BOT_MANUAL_REGISTRATION_REMEDIATION
|
|
36
36
|
: undefined;
|
|
37
|
+
const OMP_PROFILE_NAME = /^[a-z0-9][a-z0-9._-]{0,63}$/u;
|
|
38
|
+
/**
|
|
39
|
+
* OMP's active named profile. OMP_PROFILE wins over the legacy PI_PROFILE even
|
|
40
|
+
* when empty; empty and "default" select the default profile. OMP refuses to
|
|
41
|
+
* start with an invalid name, so one leaves the default location in place.
|
|
42
|
+
*/
|
|
43
|
+
const ompProfile = ({ env }) => {
|
|
44
|
+
const name = (env.OMP_PROFILE ?? env.PI_PROFILE)?.trim();
|
|
45
|
+
return name === undefined ||
|
|
46
|
+
name === "" ||
|
|
47
|
+
name === "default" ||
|
|
48
|
+
name.endsWith(".") ||
|
|
49
|
+
!OMP_PROFILE_NAME.test(name)
|
|
50
|
+
? undefined
|
|
51
|
+
: name;
|
|
52
|
+
};
|
|
53
|
+
/**
|
|
54
|
+
* The OMP agent directory whose `mcp.json` holds user-scope MCP servers. OMP
|
|
55
|
+
* joins PI_CONFIG_DIR to the home directory, and a named profile ignores
|
|
56
|
+
* PI_CODING_AGENT_DIR. OMP resolves a relative agent directory against each
|
|
57
|
+
* process's working directory, so only an absolute override names one file.
|
|
58
|
+
*/
|
|
59
|
+
const ompAgentDirectory = (context) => {
|
|
60
|
+
const root = join(context.home, context.env.PI_CONFIG_DIR || ".omp");
|
|
61
|
+
const profile = ompProfile(context);
|
|
62
|
+
if (profile !== undefined)
|
|
63
|
+
return join(root, "profiles", profile, "agent");
|
|
64
|
+
const override = context.env.PI_CODING_AGENT_DIR;
|
|
65
|
+
return override !== undefined && override !== "" && isAbsolute(override)
|
|
66
|
+
? override
|
|
67
|
+
: join(root, "agent");
|
|
68
|
+
};
|
|
37
69
|
const copilotDirectory = ({ home, env }) => env.COPILOT_HOME ?? join(home, ".copilot");
|
|
38
70
|
const commandCodeDirectory = ({ home }) => join(home, ".commandcode");
|
|
39
71
|
const opencodeDirectory = ({ home, env }) => join(env.XDG_CONFIG_HOME ?? join(home, ".config"), "opencode");
|
|
@@ -157,6 +189,13 @@ export const SUPPORTED_CLIENT_DEFINITIONS = [
|
|
|
157
189
|
markerPath: grokDirectory,
|
|
158
190
|
format: "grok",
|
|
159
191
|
},
|
|
192
|
+
{
|
|
193
|
+
name: "omp",
|
|
194
|
+
displayName: "OMP",
|
|
195
|
+
configPath: (context) => join(ompAgentDirectory(context), "mcp.json"),
|
|
196
|
+
markerPath: ompAgentDirectory,
|
|
197
|
+
format: "omp",
|
|
198
|
+
},
|
|
160
199
|
{
|
|
161
200
|
name: "grok_bot",
|
|
162
201
|
displayName: "Grok Bot",
|
|
@@ -173,7 +212,11 @@ export const supportedClients = (home, platform = process.platform, env = {
|
|
|
173
212
|
CODEX_HOME: process.env.CODEX_HOME,
|
|
174
213
|
COPILOT_HOME: process.env.COPILOT_HOME,
|
|
175
214
|
GROK_HOME: process.env.GROK_HOME,
|
|
215
|
+
OMP_PROFILE: process.env.OMP_PROFILE,
|
|
176
216
|
OPENCODE_CONFIG: process.env.OPENCODE_CONFIG,
|
|
217
|
+
PI_CODING_AGENT_DIR: process.env.PI_CODING_AGENT_DIR,
|
|
218
|
+
PI_CONFIG_DIR: process.env.PI_CONFIG_DIR,
|
|
219
|
+
PI_PROFILE: process.env.PI_PROFILE,
|
|
177
220
|
SAND_DATA_ROOT: process.env.SAND_DATA_ROOT,
|
|
178
221
|
XDG_CONFIG_HOME: process.env.XDG_CONFIG_HOME,
|
|
179
222
|
}) => {
|
|
@@ -1,16 +1,18 @@
|
|
|
1
1
|
import { parseClientConfiguration, serializeClientConfiguration, clientServerPath, legacyClientServerPath, withClientServers, } from "./ClientConfigurationDocument.js";
|
|
2
2
|
import { copyFile, lstat, readFile, realpath, rm } from "node:fs/promises";
|
|
3
|
-
import {
|
|
3
|
+
import { constants as fsConstants } from "node:fs";
|
|
4
|
+
import { homeDirectoryFromEnvironment } from "../config/homeDirectory.js";
|
|
4
5
|
import { join } from "node:path";
|
|
5
6
|
import writeFileAtomic from "write-file-atomic";
|
|
6
7
|
import { z } from "zod";
|
|
7
8
|
import { PRODUCT_IDENTITY } from "../identity.js";
|
|
9
|
+
import { claudeCodeSkillsDirectory, skillDestinations } from "./SetupSkill.js";
|
|
8
10
|
import { isOwnedClientRegistrationCommand } from "./ClientRegistrationIdentity.js";
|
|
9
11
|
import { resolveClientConfigTransactionPath } from "./ClientConfigPath.js";
|
|
10
12
|
import { manualRegistrationRemediation, supportedClients, } from "./SupportedClients.js";
|
|
11
13
|
const systemFileSystem = {
|
|
12
14
|
readText: (path) => readFile(path, "utf8"),
|
|
13
|
-
copy: (source, destination) => copyFile(source, destination),
|
|
15
|
+
copy: (source, destination) => copyFile(source, destination, fsConstants.COPYFILE_EXCL),
|
|
14
16
|
writeText: (path, contents) => writeFileAtomic(path, contents, { encoding: "utf8" }),
|
|
15
17
|
stat: (path) => lstat(path),
|
|
16
18
|
realpath: (path) => realpath(path),
|
|
@@ -30,14 +32,26 @@ export const isUninstallFailure = (result) => {
|
|
|
30
32
|
}
|
|
31
33
|
}
|
|
32
34
|
};
|
|
33
|
-
/**
|
|
35
|
+
/**
|
|
36
|
+
* Remove only REA-owned registrations and managed files, optionally including
|
|
37
|
+
* local state. A client configuration that cannot be read safely stops the
|
|
38
|
+
* operation before anything is removed; one that fails during removal stops
|
|
39
|
+
* the remaining removals.
|
|
40
|
+
*/
|
|
34
41
|
export const runUninstall = async (purgeData, host = systemUninstallHost()) => {
|
|
35
|
-
const
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
42
|
+
const clients = await host.clients();
|
|
43
|
+
const blocked = [];
|
|
44
|
+
for (const client of clients) {
|
|
45
|
+
const blocking = await host.inspectClient(client);
|
|
46
|
+
if (blocking !== undefined)
|
|
47
|
+
blocked.push(blocking);
|
|
48
|
+
}
|
|
49
|
+
const items = blocked.length > 0
|
|
50
|
+
? [
|
|
51
|
+
...blocked,
|
|
52
|
+
item("uninstall", "skipped", "No REA registration, skill, or data was removed. Repair each failed configuration, then rerun uninstall."),
|
|
53
|
+
]
|
|
54
|
+
: await removeAll(clients, purgeData, host);
|
|
41
55
|
items.push({
|
|
42
56
|
name: "analysis_engine",
|
|
43
57
|
status: "retained",
|
|
@@ -50,41 +64,80 @@ export const runUninstall = async (purgeData, host = systemUninstallHost()) => {
|
|
|
50
64
|
items,
|
|
51
65
|
};
|
|
52
66
|
};
|
|
67
|
+
/**
|
|
68
|
+
* Each client is reread when it is edited, so a concurrent change is never
|
|
69
|
+
* overwritten. A client that fails then still stops the remaining removals.
|
|
70
|
+
*/
|
|
71
|
+
const removeAll = async (clients, purgeData, host) => {
|
|
72
|
+
const items = [];
|
|
73
|
+
for (const client of clients) {
|
|
74
|
+
const removed = await host.removeClient(client);
|
|
75
|
+
items.push(removed);
|
|
76
|
+
if (removed.status === "failed")
|
|
77
|
+
return [
|
|
78
|
+
...items,
|
|
79
|
+
item("uninstall", "skipped", "Uninstall stopped at this failure; the items above report what changed. Repair the failed configuration, then rerun uninstall."),
|
|
80
|
+
];
|
|
81
|
+
}
|
|
82
|
+
items.push(await host.removeSkill());
|
|
83
|
+
if (purgeData)
|
|
84
|
+
items.push(...(await host.purgeData()));
|
|
85
|
+
return items;
|
|
86
|
+
};
|
|
53
87
|
/** Create uninstall effects contained to detected client configs and REA-owned paths. */
|
|
54
|
-
export const systemUninstallHost = (
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
88
|
+
export const systemUninstallHost = (selectedHome = undefined, fileSystem = systemFileSystem, environment = process.env, platform = process.platform) => {
|
|
89
|
+
const home = selectedHome ?? homeDirectoryFromEnvironment(environment, platform);
|
|
90
|
+
return {
|
|
91
|
+
clients: () => Promise.resolve(supportedClients(home, platform, environment)),
|
|
92
|
+
inspectClient: async (client) => {
|
|
93
|
+
const read = await readClientConfiguration(client, fileSystem);
|
|
94
|
+
return read.kind === "item" && read.item.status === "failed"
|
|
95
|
+
? read.item
|
|
96
|
+
: undefined;
|
|
97
|
+
},
|
|
98
|
+
removeClient: (client) => removeClient(client, fileSystem),
|
|
99
|
+
removeSkill: () => removeManagedSkills(home, fileSystem, environment),
|
|
100
|
+
purgeData: async () => [
|
|
101
|
+
await removeManagedPath(join(home, ".rea/cache"), "cache", fileSystem),
|
|
102
|
+
await removeManagedPath(join(home, ".rea/state"), "state", fileSystem),
|
|
103
|
+
],
|
|
104
|
+
};
|
|
105
|
+
};
|
|
106
|
+
const readClientConfiguration = async (client, fileSystem) => {
|
|
64
107
|
if (client.format === "unsupported")
|
|
65
|
-
return item(client.name, "skipped", manualRegistrationRemediation(client.name) ??
|
|
66
|
-
"This client has no documented local MCP configuration boundary.");
|
|
108
|
+
return itemRead(item(client.name, "skipped", manualRegistrationRemediation(client.name) ??
|
|
109
|
+
"This client has no documented local MCP configuration boundary."));
|
|
67
110
|
const resolved = await resolveUninstallConfigPath(client, fileSystem);
|
|
68
111
|
if (typeof resolved !== "string")
|
|
69
|
-
return resolved;
|
|
112
|
+
return itemRead(resolved);
|
|
70
113
|
const transactionPath = resolved;
|
|
71
114
|
let original;
|
|
72
115
|
try {
|
|
73
116
|
original = await fileSystem.readText(transactionPath);
|
|
74
117
|
}
|
|
75
118
|
catch (cause) {
|
|
76
|
-
return isMissing(cause)
|
|
119
|
+
return itemRead(isMissing(cause)
|
|
77
120
|
? item(client.name, "skipped", "Configuration does not exist.")
|
|
78
|
-
: item(client.name, "failed", "Configuration could not be read. Check file permissions, then rerun uninstall.");
|
|
121
|
+
: item(client.name, "failed", "Configuration could not be read. Check file permissions, then rerun uninstall."));
|
|
79
122
|
}
|
|
80
|
-
let parsed;
|
|
81
123
|
try {
|
|
82
|
-
parsed = parseClientConfiguration(original, client.format);
|
|
124
|
+
const parsed = parseClientConfiguration(original, client.format);
|
|
125
|
+
return { kind: "configuration", transactionPath, original, parsed };
|
|
83
126
|
}
|
|
84
127
|
catch (cause) {
|
|
85
128
|
void cause;
|
|
86
|
-
return item(client.name, "failed", `Configuration is not valid ${client.format === "toml" || client.format === "grok" ? "TOML" : client.format === "opencode" ? "JSONC" : "JSON"} and was not changed. Repair it, then rerun uninstall.`);
|
|
129
|
+
return itemRead(item(client.name, "failed", `Configuration is not valid ${client.format === "toml" || client.format === "grok" ? "TOML" : client.format === "opencode" ? "JSONC" : "JSON"} and was not changed. Repair it, then rerun uninstall.`));
|
|
87
130
|
}
|
|
131
|
+
};
|
|
132
|
+
const itemRead = (result) => ({
|
|
133
|
+
kind: "item",
|
|
134
|
+
item: result,
|
|
135
|
+
});
|
|
136
|
+
const removeClient = async (client, fileSystem) => {
|
|
137
|
+
const read = await readClientConfiguration(client, fileSystem);
|
|
138
|
+
if (read.kind === "item")
|
|
139
|
+
return read.item;
|
|
140
|
+
const { transactionPath, original, parsed } = read;
|
|
88
141
|
const name = PRODUCT_IDENTITY.mcpServerKey;
|
|
89
142
|
// Beside a native OpenCode V2 table, OpenCode also loads a V1 `mcp.rea`.
|
|
90
143
|
const legacyPath = legacyClientServerPath(parsed, name);
|
|
@@ -109,8 +162,8 @@ const removeClient = async (client, fileSystem) => {
|
|
|
109
162
|
await fileSystem.copy(transactionPath, backupPath);
|
|
110
163
|
}
|
|
111
164
|
catch (cause) {
|
|
112
|
-
|
|
113
|
-
|
|
165
|
+
if (!(cause instanceof Error && "code" in cause && cause.code === "EEXIST"))
|
|
166
|
+
return item(client.name, "failed", "Configuration could not be backed up, so no change was made. Check file permissions, then rerun uninstall.");
|
|
114
167
|
}
|
|
115
168
|
try {
|
|
116
169
|
await fileSystem.writeText(transactionPath, serializeClientConfiguration(document, client.format, original, editedPaths));
|
|
@@ -172,7 +225,22 @@ const removeManagedPath = async (path, name, fileSystem) => {
|
|
|
172
225
|
: item(name, "failed", "This item could not be removed. Check file permissions, then rerun uninstall.");
|
|
173
226
|
}
|
|
174
227
|
};
|
|
175
|
-
const removeManagedSkills = async (home, fileSystem
|
|
228
|
+
const removeManagedSkills = async (home, fileSystem, environment) => {
|
|
229
|
+
const results = await Promise.all(skillDestinations(home, undefined, claudeCodeSkillsDirectory(home, environment)).map(({ client, path }) => removeManagedPath(path, client === "claude_code" ? "Claude Code skill" : "skill", fileSystem)));
|
|
230
|
+
const failed = results.find(({ status }) => status === "failed");
|
|
231
|
+
if (failed !== undefined)
|
|
232
|
+
return item("skill", "failed", results
|
|
233
|
+
.map(({ name, status, detail }) => `${name}: ${status} (${detail})`)
|
|
234
|
+
.join(" "));
|
|
235
|
+
const status = results.some(({ status: resultStatus }) => resultStatus === "removed")
|
|
236
|
+
? "removed"
|
|
237
|
+
: results.some(({ status: resultStatus }) => resultStatus === "retained")
|
|
238
|
+
? "retained"
|
|
239
|
+
: "skipped";
|
|
240
|
+
return item("skill", status, results
|
|
241
|
+
.map(({ name, status: resultStatus, detail }) => `${name}: ${resultStatus} (${detail})`)
|
|
242
|
+
.join(" "));
|
|
243
|
+
};
|
|
176
244
|
const item = (name, status, detail) => ({ name, status, detail });
|
|
177
245
|
const registrationSchema = z
|
|
178
246
|
.object({ command: z.string(), args: z.array(z.string()) })
|
|
@@ -4,7 +4,7 @@ import { z } from "zod";
|
|
|
4
4
|
import { PRODUCT_IDENTITY } from "../identity.js";
|
|
5
5
|
import { isOwnedClientRegistrationCommand } from "./ClientRegistrationIdentity.js";
|
|
6
6
|
import { readClientRegistrationStatuses } from "./ClientRegistrationStatus.js";
|
|
7
|
-
import { effectiveClientServer, parseClientConfiguration, } from "./ClientConfigurationDocument.js";
|
|
7
|
+
import { clientServerForcedEnabled, clientServerListedDisabled, effectiveClientServer, parseClientConfiguration, } from "./ClientConfigurationDocument.js";
|
|
8
8
|
import { supportedClients } from "./SupportedClients.js";
|
|
9
9
|
const setupPlanSchema = z.object({
|
|
10
10
|
status: z.literal("planned"),
|
|
@@ -21,9 +21,11 @@ const setupPlanSchema = z.object({
|
|
|
21
21
|
})),
|
|
22
22
|
});
|
|
23
23
|
/** Discover owned registrations and an existing REA skill without writes. */
|
|
24
|
-
export const existingMaintenanceScope = async (home, entryPoint) => {
|
|
25
|
-
const registrations = await readClientRegistrationStatuses(home, entryPoint
|
|
26
|
-
|
|
24
|
+
export const existingMaintenanceScope = async (home, entryPoint, environment) => {
|
|
25
|
+
const registrations = await readClientRegistrationStatuses(home, entryPoint, {
|
|
26
|
+
environment,
|
|
27
|
+
});
|
|
28
|
+
const supported = supportedClients(home, process.platform, environment);
|
|
27
29
|
const clients = [];
|
|
28
30
|
for (const registration of registrations) {
|
|
29
31
|
if ((registration.state !== "aligned" && registration.state !== "stale") ||
|
|
@@ -39,7 +41,11 @@ export const existingMaintenanceScope = async (home, entryPoint) => {
|
|
|
39
41
|
disabled: z.boolean().optional(),
|
|
40
42
|
})
|
|
41
43
|
.parse(effectiveClientServer(parsed, PRODUCT_IDENTITY.mcpServerKey));
|
|
42
|
-
|
|
44
|
+
// Root disable lists override enabled entries and OMP's force-on allowlist.
|
|
45
|
+
if ((enabled.enabled !== false ||
|
|
46
|
+
clientServerForcedEnabled(parsed, PRODUCT_IDENTITY.mcpServerKey)) &&
|
|
47
|
+
enabled.disabled !== true &&
|
|
48
|
+
!clientServerListedDisabled(parsed, PRODUCT_IDENTITY.mcpServerKey))
|
|
43
49
|
clients.push(client.name);
|
|
44
50
|
}
|
|
45
51
|
let skill = false;
|
|
@@ -56,9 +62,9 @@ export const existingMaintenanceScope = async (home, entryPoint) => {
|
|
|
56
62
|
return { clients, skill };
|
|
57
63
|
};
|
|
58
64
|
/** Ask the verified new executable to plan only existing REA integrations. */
|
|
59
|
-
export const planIntegrationMaintenance = async (home, entryPoint, execute) => {
|
|
65
|
+
export const planIntegrationMaintenance = async (home, entryPoint, environment, execute) => {
|
|
60
66
|
try {
|
|
61
|
-
const scope = await existingMaintenanceScope(home, entryPoint);
|
|
67
|
+
const scope = await existingMaintenanceScope(home, entryPoint, environment);
|
|
62
68
|
if (scope.clients.length === 0 && !scope.skill)
|
|
63
69
|
return { status: "current", plannedActions: [] };
|
|
64
70
|
const command = [
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { realpath } from "node:fs/promises";
|
|
2
|
-
import {
|
|
2
|
+
import { homeDirectoryFromEnvironment } from "../config/homeDirectory.js";
|
|
3
3
|
import { basename, dirname, join, resolve } from "node:path";
|
|
4
4
|
import { fileURLToPath } from "node:url";
|
|
5
5
|
import spawn from "cross-spawn";
|
|
@@ -9,13 +9,13 @@ import { safeParseJson } from "../domain/safeJson.js";
|
|
|
9
9
|
import { updateInstallCommand, } from "./Update.js";
|
|
10
10
|
import { planIntegrationMaintenance } from "./UpdateMaintenance.js";
|
|
11
11
|
/** Run an updater subprocess with complete diagnostics and isolated machine output. */
|
|
12
|
-
export const runUpdateCommand = (command, output = "structured") => new Promise((resolveResult) => {
|
|
12
|
+
export const runUpdateCommand = (command, selectedEnvironment, output = "structured") => new Promise((resolveResult) => {
|
|
13
13
|
const [executable, ...args] = command;
|
|
14
14
|
if (executable === undefined) {
|
|
15
15
|
resolveResult(err("No executable supplied."));
|
|
16
16
|
return;
|
|
17
17
|
}
|
|
18
|
-
const environment = { ...
|
|
18
|
+
const environment = { ...selectedEnvironment };
|
|
19
19
|
// A fresh installed entry point must not inherit npx's invocation identity.
|
|
20
20
|
delete environment.npm_command;
|
|
21
21
|
const child = spawn(executable, args, {
|
|
@@ -46,8 +46,8 @@ export const runUpdateCommand = (command, output = "structured") => new Promise(
|
|
|
46
46
|
? `Process exited with code ${String(code)}.`
|
|
47
47
|
: `Process terminated by ${signal}.`))));
|
|
48
48
|
});
|
|
49
|
-
const requireCommandOutput = async (command) => {
|
|
50
|
-
const result = await runUpdateCommand(command);
|
|
49
|
+
const requireCommandOutput = async (command, environment) => {
|
|
50
|
+
const result = await runUpdateCommand(command, environment);
|
|
51
51
|
if (!result.ok)
|
|
52
52
|
throw new Error(result.error);
|
|
53
53
|
return result.value;
|
|
@@ -130,21 +130,21 @@ export const npmReleaseLookup = (response) => {
|
|
|
130
130
|
: err({ kind: "invalid-metadata", detail: parsed.error });
|
|
131
131
|
};
|
|
132
132
|
/** Create npm, registry, verification, and read-only maintenance effects. */
|
|
133
|
-
export const systemUpdateHost = (packageRoot = fileURLToPath(new URL("../..", import.meta.url)), home =
|
|
133
|
+
export const systemUpdateHost = (packageRoot = fileURLToPath(new URL("../..", import.meta.url)), home = undefined, environment = process.env) => ({
|
|
134
134
|
installation: () => detectNpmInstallation(packageRoot, {
|
|
135
135
|
canonicalPath: realpath,
|
|
136
|
-
globalRoot: () => requireCommandOutput(["npm", "root", "--global"]),
|
|
137
|
-
globalPrefix: () => requireCommandOutput(["npm", "prefix", "--global"]),
|
|
136
|
+
globalRoot: () => requireCommandOutput(["npm", "root", "--global"], environment),
|
|
137
|
+
globalPrefix: () => requireCommandOutput(["npm", "prefix", "--global"], environment),
|
|
138
138
|
}),
|
|
139
|
-
latestVersion: async (installation) => npmReleaseLookup(await runUpdateCommand(npmLatestVersionCommand(installation))),
|
|
139
|
+
latestVersion: async (installation) => npmReleaseLookup(await runUpdateCommand(npmLatestVersionCommand(installation), environment)),
|
|
140
140
|
installVersion: async (installation, version, output) => {
|
|
141
|
-
const result = await runUpdateCommand(updateInstallCommand(installation, version), output);
|
|
141
|
+
const result = await runUpdateCommand(updateInstallCommand(installation, version), environment, output);
|
|
142
142
|
return result.ok ? ok(undefined) : result;
|
|
143
143
|
},
|
|
144
144
|
installedVersion: (installation) => runUpdateCommand([
|
|
145
145
|
process.execPath,
|
|
146
146
|
join(installation.packageRoot, "scripts", "rea.mjs"),
|
|
147
147
|
"--version",
|
|
148
|
-
]),
|
|
149
|
-
planMaintenance: (installation) => planIntegrationMaintenance(home, join(installation.packageRoot, "scripts", "rea.mjs"), runUpdateCommand),
|
|
148
|
+
], environment),
|
|
149
|
+
planMaintenance: (installation) => planIntegrationMaintenance(home ?? homeDirectoryFromEnvironment(environment, process.platform), join(installation.packageRoot, "scripts", "rea.mjs"), environment, (command) => runUpdateCommand(command, environment)),
|
|
150
150
|
});
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import { constants } from "node:buffer";
|
|
2
|
+
import { AnalysisResourceConstraintError } from "../domain/analysisErrorCore.js";
|
|
3
|
+
import { safeParseJson } from "../domain/safeJson.js";
|
|
4
|
+
/** Recovery that preserves complete, authenticated Evidence workflow inputs. */
|
|
5
|
+
export const JSON_INPUT_RESOURCE_REMEDIATION = "Provide a smaller valid JSON value. For Evidence workflows, re-analyze a smaller selection of the original target and use its complete Evidence; splitting JSON text or trimming Evidence fields does not produce valid workflow input.";
|
|
6
|
+
/** Decode JSON bytes without confusing a runtime string limit with malformed input. */
|
|
7
|
+
export const parseUtf8Json = (bytes, operation, path, boundary = "json-input") => {
|
|
8
|
+
const stringLimitFailure = (cause, decodedUnits) => new AnalysisResourceConstraintError(operation, "memory", "JSON input exceeds the runtime's maximum decoded string length", {
|
|
9
|
+
boundary,
|
|
10
|
+
input_path: path,
|
|
11
|
+
input_bytes: bytes.byteLength,
|
|
12
|
+
max_string_code_units: constants.MAX_STRING_LENGTH,
|
|
13
|
+
...(decodedUnits === undefined
|
|
14
|
+
? {}
|
|
15
|
+
: { decoded_string_code_units_at_least: decodedUnits }),
|
|
16
|
+
}, {
|
|
17
|
+
...(cause === undefined ? {} : { cause }),
|
|
18
|
+
remediationAction: JSON_INPUT_RESOURCE_REMEDIATION,
|
|
19
|
+
});
|
|
20
|
+
let text;
|
|
21
|
+
try {
|
|
22
|
+
const decoder = new TextDecoder("utf-8", { fatal: true, ignoreBOM: true });
|
|
23
|
+
if (bytes.byteLength <= constants.MAX_STRING_LENGTH) {
|
|
24
|
+
text = decoder.decode(bytes);
|
|
25
|
+
}
|
|
26
|
+
else {
|
|
27
|
+
// Node 22's UTF-8 fast path bounds encoded bytes before decoding. Decode
|
|
28
|
+
// large inputs in chunks so valid multibyte text is bounded by its actual
|
|
29
|
+
// UTF-16 length. Streaming also preserves characters spanning chunks.
|
|
30
|
+
const parts = [];
|
|
31
|
+
let decodedUnits = 0;
|
|
32
|
+
const append = (part) => {
|
|
33
|
+
decodedUnits += part.length;
|
|
34
|
+
if (decodedUnits > constants.MAX_STRING_LENGTH)
|
|
35
|
+
throw stringLimitFailure(undefined, decodedUnits);
|
|
36
|
+
parts.push(part);
|
|
37
|
+
};
|
|
38
|
+
const chunkBytes = 1024 * 1024;
|
|
39
|
+
for (let offset = 0; offset < bytes.byteLength; offset += chunkBytes)
|
|
40
|
+
append(decoder.decode(bytes.subarray(offset, offset + chunkBytes), {
|
|
41
|
+
stream: true,
|
|
42
|
+
}));
|
|
43
|
+
append(decoder.decode());
|
|
44
|
+
text = parts.join("");
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
catch (cause) {
|
|
48
|
+
if (cause instanceof AnalysisResourceConstraintError)
|
|
49
|
+
throw cause;
|
|
50
|
+
const code = typeof cause === "object" && cause !== null && "code" in cause
|
|
51
|
+
? cause.code
|
|
52
|
+
: undefined;
|
|
53
|
+
if (code === "ERR_STRING_TOO_LONG")
|
|
54
|
+
throw stringLimitFailure(cause);
|
|
55
|
+
if (code !== "ERR_ENCODING_INVALID_ENCODED_DATA")
|
|
56
|
+
throw cause;
|
|
57
|
+
return {
|
|
58
|
+
ok: false,
|
|
59
|
+
error: "JSON input is not valid UTF-8",
|
|
60
|
+
cause,
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
return safeParseJson(text);
|
|
64
|
+
};
|
|
@@ -1,11 +1,10 @@
|
|
|
1
1
|
import { createHash } from "node:crypto";
|
|
2
|
-
import { readFile } from "node:fs/promises";
|
|
3
2
|
import { isAbsolute } from "node:path";
|
|
4
3
|
import { z } from "zod";
|
|
5
4
|
import { ArtifactReaderFailure } from "../artifacts/ArtifactReader.js";
|
|
6
5
|
import { publishWebScripts } from "../browser/assets/PublishWebScripts.js";
|
|
7
6
|
import { selectScriptCapture } from "../browser/assets/ScriptCaptureAdapters.js";
|
|
8
|
-
import { AnalysisCancelledError, AnalysisInputError, AnalysisOutputError, } from "../domain/analysisErrorCore.js";
|
|
7
|
+
import { AnalysisAccessDeniedError, AnalysisCancelledError, AnalysisInputError, AnalysisOutputError, } from "../domain/analysisErrorCore.js";
|
|
9
8
|
import { createEvidence } from "../domain/evidence.js";
|
|
10
9
|
import { analysisInputErrorFromIssues } from "../domain/inputIssueProjection.js";
|
|
11
10
|
import { jsonValueSchema } from "../domain/jsonValue.js";
|
|
@@ -15,6 +14,8 @@ import { safeParseJson } from "../domain/safeJson.js";
|
|
|
15
14
|
import { exportWebScriptsInputSchema, } from "../domain/webScriptExport.js";
|
|
16
15
|
import { WebScriptExportError } from "../domain/webScriptExportError.js";
|
|
17
16
|
import { WEB_SCRIPT_EXPORT_PROVIDER as PROVIDER } from "./InvestigationProviders.js";
|
|
17
|
+
import { readRegularFile } from "./RegularFileRead.js";
|
|
18
|
+
import { NonRegularFileReadError } from "../filesystem/RegularFile.js";
|
|
18
19
|
const OPERATION = "export_web_scripts";
|
|
19
20
|
/** Export one local capture through the shared CLI/MCP application workflow. */
|
|
20
21
|
export const exportWebScripts = async (rawInput, options = {}) => {
|
|
@@ -35,9 +36,10 @@ export const exportWebScriptsValidated = async (input, options = {}) => {
|
|
|
35
36
|
]));
|
|
36
37
|
try {
|
|
37
38
|
options.signal?.throwIfAborted();
|
|
38
|
-
const
|
|
39
|
-
|
|
40
|
-
|
|
39
|
+
const read = await readCapture(input.capture_path, options.signal);
|
|
40
|
+
if (!read.ok)
|
|
41
|
+
return read;
|
|
42
|
+
const bytes = read.value;
|
|
41
43
|
const loaded = parseCapture(bytes);
|
|
42
44
|
if (!loaded.ok)
|
|
43
45
|
return loaded;
|
|
@@ -90,6 +92,37 @@ export const exportWebScriptsValidated = async (input, options = {}) => {
|
|
|
90
92
|
}));
|
|
91
93
|
}
|
|
92
94
|
};
|
|
95
|
+
/**
|
|
96
|
+
* Read the caller-selected capture. A missing, non-file or unreadable
|
|
97
|
+
* selection is a caller or host-permission failure, not an export failure.
|
|
98
|
+
*/
|
|
99
|
+
const readCapture = async (path, signal) => {
|
|
100
|
+
try {
|
|
101
|
+
return ok(await readRegularFile(path, signal));
|
|
102
|
+
}
|
|
103
|
+
catch (cause) {
|
|
104
|
+
const code = cause instanceof Error && "code" in cause ? String(cause.code) : "";
|
|
105
|
+
if (code === "EACCES" || code === "EPERM")
|
|
106
|
+
return err(new AnalysisAccessDeniedError(OPERATION, path, code, { cause }));
|
|
107
|
+
if (cause instanceof NonRegularFileReadError ||
|
|
108
|
+
code === "ENOENT" ||
|
|
109
|
+
code === "ENOTDIR" ||
|
|
110
|
+
code === "EISDIR" ||
|
|
111
|
+
code === "ENXIO")
|
|
112
|
+
return err(new AnalysisInputError(OPERATION, { cause }, [
|
|
113
|
+
{
|
|
114
|
+
path: ["capture_path"],
|
|
115
|
+
reason: "invalid_value",
|
|
116
|
+
message: cause instanceof NonRegularFileReadError && code !== "EISDIR"
|
|
117
|
+
? cause.message
|
|
118
|
+
: code === "EISDIR"
|
|
119
|
+
? `Selected capture is a directory, not a file: ${path}`
|
|
120
|
+
: `Selected capture could not be read (${code}): ${path}`,
|
|
121
|
+
},
|
|
122
|
+
]));
|
|
123
|
+
throw cause;
|
|
124
|
+
}
|
|
125
|
+
};
|
|
93
126
|
const parseCapture = (bytes) => {
|
|
94
127
|
try {
|
|
95
128
|
const text = new TextDecoder("utf-8", {
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { REA_WORKFLOW_PROVIDER, workflowAnalysisProfile, } from "./InvestigationProviders.js";
|
|
2
2
|
import { analysisProfileSchema, committedProviderSchema, } from "../domain/analysisProfile.js";
|
|
3
|
-
import { createEvidence } from "../domain/evidence.js";
|
|
3
|
+
import { createEvidence, } from "../domain/evidence.js";
|
|
4
4
|
import { UnknownRegistryError } from "../domain/unknownRegistryError.js";
|
|
5
5
|
/** Build the shared Evidence record for a successful composed binary workflow. */
|
|
6
6
|
export const createWorkflowEvidence = (input) => createEvidence(input.target, REA_WORKFLOW_PROVIDER, {
|
|
@@ -14,10 +14,33 @@ export const createWorkflowEvidence = (input) => createEvidence(input.target, RE
|
|
|
14
14
|
}),
|
|
15
15
|
confidence: "derived",
|
|
16
16
|
limitations: ["Derived by an REA composed workflow."],
|
|
17
|
+
...(input.operation === "batch_decompile"
|
|
18
|
+
? { locations: batchProcedureLocations(input.result) }
|
|
19
|
+
: {}),
|
|
17
20
|
});
|
|
21
|
+
const batchProcedureLocations = (result) => {
|
|
22
|
+
if (result === null ||
|
|
23
|
+
typeof result !== "object" ||
|
|
24
|
+
Array.isArray(result) ||
|
|
25
|
+
!Array.isArray(result.items))
|
|
26
|
+
return [];
|
|
27
|
+
const addresses = new Set();
|
|
28
|
+
for (const item of result.items) {
|
|
29
|
+
if (item === null || typeof item !== "object" || Array.isArray(item))
|
|
30
|
+
continue;
|
|
31
|
+
const procedure = item.procedure;
|
|
32
|
+
if (procedure !== null &&
|
|
33
|
+
typeof procedure === "object" &&
|
|
34
|
+
!Array.isArray(procedure) &&
|
|
35
|
+
procedure.status === "resolved" &&
|
|
36
|
+
typeof procedure.address === "string")
|
|
37
|
+
addresses.add(procedure.address);
|
|
38
|
+
}
|
|
39
|
+
return [...addresses].map((address) => ({ kind: "address", address }));
|
|
40
|
+
};
|
|
18
41
|
/** Convert workflow Evidence into its exact replay binding, when it has a profile. */
|
|
19
42
|
export const workflowSnapshotRecord = (evidence, operation) => {
|
|
20
|
-
if (
|
|
43
|
+
if (evidence.analysis_profile === null)
|
|
21
44
|
return undefined;
|
|
22
45
|
return {
|
|
23
46
|
operation,
|