Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
23 commits
Select commit Hold shift + click to select a range
5270b84
feat: add MCP redaction filtering for sensitive data
silasjmatson Apr 23, 2026
a47a71f
feat(reactotron-mcp): expand redaction defaults and add form-urlencod…
joshuayoes Apr 24, 2026
606511a
feat(example-app): add RedactionTestScreen manual test harness
joshuayoes Apr 24, 2026
7a7876e
fix(reactotron-mcp): close redaction gaps for JSON bodies, state subt…
silasjmatson Apr 27, 2026
ebacd5d
refactor(reactotron-mcp): extract shared applyRedaction/getClientReda…
silasjmatson Apr 27, 2026
36eec4a
refactor(reactotron-mcp): precompute redaction lookups once via Redac…
silasjmatson Apr 27, 2026
55c4607
fix(reactotron-mcp): add depth/size guards to JSON string redaction a…
silasjmatson Apr 27, 2026
b88247c
fix(reactotron-app): derive redaction defaults from reactotron-mcp si…
silasjmatson Apr 27, 2026
4569a42
feat(reactotron-app): add reset-to-defaults button to MCP redaction s…
silasjmatson Apr 27, 2026
5b65e5c
fix(reactotron-app): fix MCP settings modal UI issues
silasjmatson Apr 27, 2026
3fd6c84
refactor(reactotron-mcp): precompile regexes, reuse context lookups, …
silasjmatson Apr 27, 2026
9f6b981
fix(reactotron-mcp): tighten redaction defaults
silasjmatson Apr 27, 2026
5963ae8
feat(reactotron-mcp): per-client redaction across multi-app reads
silasjmatson Apr 27, 2026
4caec68
fix(reactotron-app): redaction badge reflects actual client opt-outs
silasjmatson Apr 27, 2026
cdfaa93
refactor(reactotron-mcp): split applyRedaction by payload shape
silasjmatson Apr 27, 2026
9baca65
refactor(reactotron-mcp): replace applyX functions with createRedactor
silasjmatson Apr 27, 2026
d8587b6
refactor(reactotron-mcp): collapse headerNames into sensitiveKeys
silasjmatson Apr 27, 2026
f6e6147
chore(reactotron-mcp): trim redundant comments added in this branch
silasjmatson Apr 27, 2026
1385a0e
perf(reactotron-mcp): cache parsed rules, combine value regexes, skip…
silasjmatson Apr 27, 2026
bcfa671
fix(reactotron-mcp): redact multiSet / multiMerge AsyncStorage payloads
silasjmatson Apr 27, 2026
096d06a
chore(reactotron-mcp): trim narrating comments added in recent commits
silasjmatson Apr 27, 2026
2bc639c
docs(mcp): document redaction limitations and audit guidance
silasjmatson Apr 27, 2026
b9ec83b
docs(mcp): correct stale claims in the rest of the doc
silasjmatson Apr 27, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions apps/example-app/app/devtools/ReactotronConfig.ts
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,12 @@ const reactotron = Reactotron.configure({
/** since this file gets hot reloaded, let's clear the past logs every time we connect */
Reactotron.clear()
},
// REDACTION TEST — exercises the two-key permission model.
mcpRedaction: {
disableRedaction: true,
removeRules: { sensitiveKeys: ["authorization"] },
additionalRules: { sensitiveKeys: ["myInternalField"] },
},
})
.use(apisaucePlugin({ ignoreContentTypes: /^(image)\/.*$/i }))
.use(reactotronRedux())
Expand Down
6 changes: 6 additions & 0 deletions apps/example-app/app/navigators/AppNavigator.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,7 @@ export type AppStackParamList = {
MobxStateTree: undefined
AsyncStorage: undefined
Redux: undefined
RedactionTest: undefined
}

/**
Expand Down Expand Up @@ -103,6 +104,11 @@ const AppStack = function AppStack() {
options={{ title: "Async Storage" }}
/>
<Stack.Screen name="Redux" component={Screens.ReduxScreen} />
<Stack.Screen
name="RedactionTest"
component={Screens.RedactionTestScreen}
options={{ title: "Redaction Test" }}
/>
</Stack.Group>
</Stack.Navigator>
)
Expand Down
4 changes: 4 additions & 0 deletions apps/example-app/app/redux/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,8 @@ import type { GetDefaultEnhancers } from "@reduxjs/toolkit/dist/getDefaultEnhanc
import logoReducer from "../redux/logoSlice"
import repoReducer from "../redux/repoSlice"
import errorReducer from "../redux/errorSlice"
// REDACTION TEST
import redactionTestReducer from "../redux/redactionSlice"

const createEnhancers = (getDefaultEnhancers: GetDefaultEnhancers<any>) => {
if (__DEV__) {
Expand All @@ -18,6 +20,8 @@ export const store = configureStore({
logo: logoReducer,
repo: repoReducer,
error: errorReducer,
// REDACTION TEST
redactionTest: redactionTestReducer,
},
enhancers: createEnhancers,
})
Expand Down
29 changes: 29 additions & 0 deletions apps/example-app/app/redux/redactionSlice.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
import { createSlice, PayloadAction } from "@reduxjs/toolkit"

export interface RedactionTestState {
auth: {
username?: string
password?: string
accessToken?: string
api_key?: string
tokens?: { access?: string; refresh?: string }
}
settings: {
theme?: string
note?: string
}
}

const initialState: RedactionTestState = { auth: {}, settings: {} }

const redactionSlice = createSlice({
name: "redactionTest",
initialState,
reducers: {
setSensitive: (_state, action: PayloadAction<RedactionTestState>) => action.payload,
clearSensitive: () => initialState,
},
})

export const { setSensitive, clearSensitive } = redactionSlice.actions
export default redactionSlice.reducer
Loading
Loading