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
49f3cd6
feat: add MCP redaction filtering for sensitive data
silasjmatson Apr 23, 2026
ea03289
feat(reactotron-mcp): expand redaction defaults and add form-urlencod…
joshuayoes Apr 24, 2026
b27e61c
feat(example-app): add RedactionTestScreen manual test harness
joshuayoes Apr 24, 2026
81267ca
fix(reactotron-mcp): close redaction gaps for JSON bodies, state subt…
silasjmatson Apr 27, 2026
59c53e8
refactor(reactotron-mcp): extract shared applyRedaction/getClientReda…
silasjmatson Apr 27, 2026
0f2bc2d
refactor(reactotron-mcp): precompute redaction lookups once via Redac…
silasjmatson Apr 27, 2026
048bb46
fix(reactotron-mcp): add depth/size guards to JSON string redaction a…
silasjmatson Apr 27, 2026
b457a29
fix(reactotron-app): derive redaction defaults from reactotron-mcp si…
silasjmatson Apr 27, 2026
056b191
feat(reactotron-app): add reset-to-defaults button to MCP redaction s…
silasjmatson Apr 27, 2026
ccbd52b
fix(reactotron-app): fix MCP settings modal UI issues
silasjmatson Apr 27, 2026
4b28a1c
refactor(reactotron-mcp): precompile regexes, reuse context lookups, …
silasjmatson Apr 27, 2026
1ad540f
fix(reactotron-mcp): tighten redaction defaults
silasjmatson Apr 27, 2026
bcc3ce0
feat(reactotron-mcp): per-client redaction across multi-app reads
silasjmatson Apr 27, 2026
5e9d29e
fix(reactotron-app): redaction badge reflects actual client opt-outs
silasjmatson Apr 27, 2026
503d65d
refactor(reactotron-mcp): split applyRedaction by payload shape
silasjmatson Apr 27, 2026
d7430f6
refactor(reactotron-mcp): replace applyX functions with createRedactor
silasjmatson Apr 27, 2026
58fe4fb
refactor(reactotron-mcp): collapse headerNames into sensitiveKeys
silasjmatson Apr 27, 2026
59034b4
chore(reactotron-mcp): trim redundant comments added in this branch
silasjmatson Apr 27, 2026
20a454b
perf(reactotron-mcp): cache parsed rules, combine value regexes, skip…
silasjmatson Apr 27, 2026
2ab3c97
fix(reactotron-mcp): redact multiSet / multiMerge AsyncStorage payloads
silasjmatson Apr 27, 2026
7e49ef6
chore(reactotron-mcp): trim narrating comments added in recent commits
silasjmatson Apr 27, 2026
e62db88
docs(mcp): document redaction limitations and audit guidance
silasjmatson Apr 27, 2026
051fae2
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