pyb-ts
Version:
PYB-CLI - Minimal AI Agent with multi-model support and CLI interface
112 lines (111 loc) • 3.03 kB
JavaScript
import React, {
createContext,
useContext,
useState,
useCallback
} from "react";
import {
getNextPermissionMode,
MODE_CONFIGS
} from "@pyb-types/PermissionMode";
const PermissionContext = createContext(
void 0
);
function PermissionProvider({
children,
isBypassPermissionsModeAvailable = false
}) {
const [permissionContext, setPermissionContext] = useState({
mode: "default",
allowedTools: ["*"],
allowedPaths: [process.cwd()],
restrictions: {
readOnly: false,
requireConfirmation: true,
bypassValidation: false
},
metadata: {
transitionCount: 0
}
});
const cycleMode = useCallback(() => {
setPermissionContext((prev) => {
const nextMode = getNextPermissionMode(
prev.mode,
isBypassPermissionsModeAvailable
);
const modeConfig = MODE_CONFIGS[nextMode];
console.log(`\u{1F504} Mode cycle: ${prev.mode} \uFFFD\uFFFD?${nextMode}`);
return {
...prev,
mode: nextMode,
allowedTools: modeConfig.allowedTools,
restrictions: modeConfig.restrictions,
metadata: {
...prev.metadata,
previousMode: prev.mode,
activatedAt: (/* @__PURE__ */ new Date()).toISOString(),
transitionCount: prev.metadata.transitionCount + 1
}
};
});
}, [isBypassPermissionsModeAvailable]);
const setMode = useCallback((mode) => {
setPermissionContext((prev) => {
const modeConfig = MODE_CONFIGS[mode];
return {
...prev,
mode,
allowedTools: modeConfig.allowedTools,
restrictions: modeConfig.restrictions,
metadata: {
...prev.metadata,
previousMode: prev.mode,
activatedAt: (/* @__PURE__ */ new Date()).toISOString(),
transitionCount: prev.metadata.transitionCount + 1
}
};
});
}, []);
const isToolAllowed = useCallback(
(toolName) => {
const { allowedTools } = permissionContext;
if (allowedTools.includes("*")) {
return true;
}
return allowedTools.includes(toolName);
},
[permissionContext]
);
const getModeConfig = useCallback(() => {
return MODE_CONFIGS[permissionContext.mode];
}, [permissionContext.mode]);
const value = {
permissionContext,
currentMode: permissionContext.mode,
cycleMode,
setMode,
isToolAllowed,
getModeConfig
};
return /* @__PURE__ */ React.createElement(PermissionContext.Provider, { value }, children);
}
function usePermissionContext() {
const context = useContext(PermissionContext);
if (context === void 0) {
throw new Error(
"usePermissionContext must be used within a PermissionProvider"
);
}
return context;
}
function usePermissionMode() {
const { currentMode, setMode, cycleMode } = usePermissionContext();
return [currentMode, setMode, cycleMode];
}
export {
PermissionProvider,
usePermissionContext,
usePermissionMode
};
//# sourceMappingURL=PermissionContext.js.map