Skip to content

Chronicle - local and remote#308602

Draft
vijayupadya wants to merge 19 commits intomainfrom
vscode-copilot-chat/migrate-5049
Draft

Chronicle - local and remote#308602
vijayupadya wants to merge 19 commits intomainfrom
vscode-copilot-chat/migrate-5049

Conversation

@vijayupadya
Copy link
Copy Markdown
Contributor

@vijayupadya vijayupadya commented Apr 8, 2026

Chronicle — Session Search (local and cloud)

Overview

Chronicle enables agent to learn from your past coding sessions. It tracks session data locally, optionally syncs to cloud, and provides /chronicle commands for standups, tips, and freeform queries.

Architecture

┌─────────────────────────────────────────────────────────────────────┐
│                        VS Code Extension                            │
│                                                                     │
│                    ┌──────────────┐                                 │
│                    │  OTel Spans   │                                 │
│                    │  (chat turns, │                                 │
│                    │   tool calls) │                                 │
│                    └──────┬───────┘                                 │
│                           │                                         │
│              ┌────────────┴────────────┐                            │
│              │                         │                            │
│              ▼                         ▼                            │
│  ┌──────────────────┐    ┌──────────────────┐                      │
│  │ SessionStore      │    │ RemoteSession     │                      │
│  │ Tracker           │    │ Exporter          │                      │
│  │ (writes batched   │    │ (batched 500ms,   │                      │
│  │  every 3s)        │    │  circuit breaker)  │                      │
│  └────────┬─────────┘    └────────┬─────────┘                      │
│           │                       │                                 │
│           ▼                       ▼                                 │
│  ┌──────────────────┐    ┌──────────────────┐                      │
│  │ Local SQLite DB   │    │ Mission Control   │                      │
│  │ (sessions, turns, │    │ Cloud (DuckDB)    │                      │
│  │  files, refs)     │    │                   │                      │
│  └──────────────────┘    └──────────────────┘                      │
│                                                                     │
│  ┌──────────────────────────────────────────────────────────────┐  │
│  │                    /chronicle Commands                        │  │
│  │                                                               │  │
│  │  ┌─────────┐   ┌─────────┐   ┌───────────┐                  │  │
│  │  │ standup  │   │  tips   │   │ free-form │                  │  │
│  │  │(pre-fetch│   │(tool-   │   │(tool-     │                  │  │
│  │  │ + LLM)  │   │ calling)│   │ calling)  │                  │  │
│  │  └────┬────┘   └────┬────┘   └─────┬─────┘                  │  │
│  │       │              │              │                         │  │
│  │       ▼              ▼              ▼                         │  │
│  │  Local SQLite   session_store_sql tool                       │  │
│  │  + Cloud API    (routes to local or cloud                    │  │
│  │  (merged,        based on consent)                           │  │
│  │   deduped)                                                    │  │
│  └──────────────────────────────────────────────────────────────┘  │
└─────────────────────────────────────────────────────────────────────┘

Settings & Feature Gating

Three settings control the Chronicle feature:

1. localIndex.enabled (internal, ExP-rollable)

  • Registration: defineTeamInternalSetting + ConfigType.ExperimentBased
  • Namespace: TeamInternal (not in package.json)
  • External users: Value ignored; only reachable via ExP flight
  • Effect: Master switch — enables local SQLite tracking, /chronicle commands, and context key

2. cloudSync.enabled (user-facing, experimental)

  • Registration: defineSetting + ConfigType.Simple
  • In package.json: Yes, with when: github.copilot.sessionSearch.enabled
  • Default: false
  • Effect: Enables cloud upload to Mission Control for the user

3. cloudSync.excludeRepositories (user-facing, experimental)

  • Registration: defineSetting + ConfigType.Simple
  • In package.json: Yes, with when: github.copilot.sessionSearch.enabled
  • Default: []
  • Effect: Glob/exact patterns for repos to exclude from cloud sync (uses picomatch)

Context Key

github.copilot.sessionSearch.enabled — set from SessionSearchLocalIndexEnabled via
getExperimentBasedConfigObservable. Controls visibility of:

  • /chronicle, /chronicle:standup, /chronicle:tips commands
  • cloudSync.enabled and cloudSync.excludeRepositories settings

Feature Gating Flow

SessionSearchLocalIndexEnabled (ExP)
 │
 │  FALSE ──▶ Everything dormant. No UI, no writes, no commands.
 │
 TRUE
 │
 ├──▶ Local SQLite tracking active (SessionStoreTracker)
 ├──▶ /chronicle commands visible in chat
 ├──▶ session_store_sql tool available (hidden from agent mode)
 ├──▶ cloudSync.* settings visible in Settings UI
 │
 └──▶ cloudSync.enabled checked per-repo:
      │
      ├── false ──▶ Local only. No cloud upload, no cloud queries.
      │
      └── true ──▶ Check excludeRepositories patterns:
           │
           ├── Repo excluded ──▶ Local only for this repo.
           │
           └── Repo not excluded ──▶ Local + cloud upload + cloud queries.

Behavior Matrix

┌─────────────────────────────────┬──────────┬───────────┬──────────┐
│ Scenario                        │ Local    │ Cloud     │ /standup │
│                                 │ Writes   │ Upload    │ Works    │
├─────────────────────────────────┼──────────┼───────────┼──────────┤
│ localIndex.enabled = false      │ ❌       │ ❌        │ ❌       │
│ (external users / no ExP)       │          │           │          │
├─────────────────────────────────┼──────────┼───────────┼──────────┤
│ localIndex on, cloudSync off    │ ✅       │ ❌        │ ✅ local │
├─────────────────────────────────┼──────────┼───────────┼──────────┤
│ localIndex on, cloudSync on     │ ✅       │ ✅        │ ✅ both  │
├─────────────────────────────────┼──────────┼───────────┼──────────┤
│ cloudSync on, repo excluded     │ ✅       │ ❌ repo   │ ✅ local │
│                                 │          │           │          │
├─────────────────────────────────┼──────────┼───────────┼──────────┤
│ No git remote (local folder)    │ ✅       │ ❌ always │ ✅ local │
└─────────────────────────────────┴──────────┴───────────┴──────────┘

ChronicleIntent — /chronicle Commands

/chronicle standup
    │
    ├── Check SessionSearchLocalIndexEnabled (ExP) ──▶ No ──▶ return
    │
    ├── Query local SQLite (last 24h)
    │
    ├── Query cloud DuckDB (last 24h, if hasCloudConsent)
    │
    ├── Merge + dedupe sessions by ID
    │
    └── Send to LLM with standup prompt template

**Telemetry**: `chronicle` event with subcommand, querySource, session counts.

/chronicle tips
    │
    ├── Check SessionSearchLocalIndexEnabled (ExP) ──▶ No ──▶ return
    │
    ├── Set system prompt with schema description
    │
    └── Delegate to DefaultIntentRequestHandler
         │
         ├── disableToolSearch = true (bypass server-side tool search)
         │
         └── getAvailableTools() → [session_store_sql] only
              │
              └── Model writes SQL ──▶ session_store_sql tool executes
                   │
                   ├── hasCloudConsent? ──▶ Yes ──▶ Query cloud DuckDB
                   │
                   └── No ──▶ Query local SQLite

Data Flow — Session Lifecycle

User sends chat message
         │
         ▼
   VS Code creates OTel span (invoke_agent)
         │
         ├───────────────────────────────────────────┐
         │                                           │
         ▼                                           ▼
   SessionStoreTracker                    RemoteSessionExporter
         │                                           │
         ▼                                           ▼
   Buffer session row                     Translate to MC events
   Buffer turn rows                       Buffer events
   Buffer file/ref rows                           │
         │                                           ▼
         ▼                                  Flush to Mission Control
   Flush to SQLite (3s)                   POST /agents/sessions/{id}/events
         │                                  (500ms batches, circuit breaker)
         ▼                                           │
   Local session store                               ▼
   (workspaceStorage/                        Cloud session store
    GitHub.copilot-chat/                     (DuckDB on MC backend)
    session-store.db)
         │                                           │
         └──────────────┬────────────────────────────┘
                        │
                        ▼
              /chronicle standup
              (queries both, merges, dedupes)

Security

┌─────────────────────────────────────────────────┐
│ Secret Filtering                                 │
│                                                  │
│  Before any data leaves the extension:           │
│  - GitHub OAuth tokens → redacted                │
│  - Copilot proxy tokens → redacted               │
│  - filterSecretsFromObj() applied to all events  │
│  - addSecretValues() registers tokens at startup │
└─────────────────────────────────────────────────┘

┌─────────────────────────────────────────────────┐
│ SQL Injection Prevention (session_store_sql)     │
│                                                  │
│  - BLOCKED_PATTERNS regex: INSERT, UPDATE,       │
│    DELETE, DROP, CREATE, ALTER, TRUNCATE,         │
│    REPLACE, ATTACH, DETACH, PRAGMA               │
│  - Node ≥ 24.2: SQLite authorizer (engine-level) │
│  - Node < 24.2: regex fallback validation        │
│  - Cloud: DuckDB read-only analytics endpoint    │
└─────────────────────────────────────────────────┘

┌─────────────────────────────────────────────────┐
│ Tool Access Control                              │
│                                                  │
│  - session_store_sql not exposed in agent mode   │
│  - Only exposed via /chronicle tips + free-form  │
│  - canBeReferencedInPrompt: false                │
│    (users can't #sessionStoreSql in chat)         │
│  - disableToolSearch = true on ChronicleIntent   │
│    (bypass server-side tool search)              │
└─────────────────────────────────────────────────┘

Copilot AI review requested due to automatic review settings April 8, 2026 20:21
Copy link
Copy Markdown
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Introduces a new “Chronicle” session history subsystem in the Copilot extension, backed by a local SQLite store and populated from chat/OTel session activity, and wires it into a new /chronicle intent plus a chronicle_standup tool for generating standup summaries.

Changes:

  • Adds a SQLite-backed SessionStore (+ schema, FTS index, and tests) for sessions/turns/files/refs/checkpoints.
  • Adds tracking (SessionStoreTracker) to populate the store from completed OTel spans and chat session lifecycle.
  • Adds new user entry points: /chronicle standup intent and a chronicle_standup tool, plus prompt/query helpers and tests.
Show a summary per file
File Description
extensions/copilot/src/platform/chronicle/node/test/sessionStore.spec.ts Adds unit tests covering schema creation, CRUD, transactions, and FTS search behavior.
extensions/copilot/src/platform/chronicle/node/sessionStore.ts Implements the SQLite SessionStore with schema management, CRUD/query methods, FTS indexing, and read-only query execution.
extensions/copilot/src/platform/chronicle/common/sessionStore.ts Defines the ISessionStore service id, row types, and store interface contract.
extensions/copilot/src/extension/tools/node/standupTool.tsx Adds a chronicle_standup tool that queries local/CLI stores and returns a standup prompt.
extensions/copilot/src/extension/tools/node/allTools.ts Registers the new standup tool module.
extensions/copilot/src/extension/tools/common/toolNames.ts Adds ToolName.ChronicleStandup and categorizes it.
extensions/copilot/src/extension/intents/node/chronicleIntent.ts Adds /chronicle intent with standup subcommand and optional cloud querying.
extensions/copilot/src/extension/intents/node/allIntents.ts Registers the new ChronicleIntent in the intent registry.
extensions/copilot/src/extension/extension/vscode-node/services.ts Wires up ISessionStore as a service backed by a persisted SQLite DB path.
extensions/copilot/src/extension/extension/vscode-node/contributions.ts Registers SessionStoreTracker contribution to populate the store.
extensions/copilot/src/extension/common/constants.ts Adds Intent.Chronicle and maps the chronicle command name.
extensions/copilot/src/extension/chronicle/vscode-node/sessionStoreTracker.ts Implements buffered span-based tracking and batched flushing into ISessionStore.
extensions/copilot/src/extension/chronicle/node/cloudSessionStoreClient.ts Adds a client for querying a cloud analytics endpoint (DuckDB SQL) for cross-machine sessions.
extensions/copilot/src/extension/chronicle/common/test/standupPrompt.spec.ts Adds tests for standup prompt formatting and tracking helpers.
extensions/copilot/src/extension/chronicle/common/standupPrompt.ts Provides SQLite query builders and constructs the standup prompt from fetched data.
extensions/copilot/src/extension/chronicle/common/sessionStoreTracking.ts Adds helper functions to extract file paths and refs from tool calls.
extensions/copilot/package.nls.json Adds localized description string for the new chronicle participant.
extensions/copilot/package.json Contributes the new chronicle chat participant entry.

Copilot's findings

  • Files reviewed: 18/18 changed files
  • Comments generated: 8

@github-actions
Copy link
Copy Markdown
Contributor

github-actions bot commented Apr 9, 2026

Screenshot Changes

Base: 4e7d4167 Current: 0809cdbd

Changed (31)

sessions/aiCustomizationShortcutsWidget/Expanded/Dark
Before After
before after
sessions/aiCustomizationShortcutsWidget/Expanded/Light
Before After
before after
sessions/aiCustomizationShortcutsWidget/WithMcpServers/Dark
Before After
before after
sessions/aiCustomizationShortcutsWidget/WithMcpServers/Light
Before After
before after
sessions/aiCustomizationShortcutsWidget/WithCounts/Dark
Before After
before after
sessions/aiCustomizationShortcutsWidget/WithCounts/Light
Before After
before after
chat/aiStats/AiStatsHover/Dark
Before After
before after
chat/aiStats/AiStatsHover/Light
Before After
before after
chat/aiCustomizations/aiCustomizationManagementEditor/McpBrowseMode/Light
Before After
before after
agentSessionsViewer/CompletedRead/Dark
Before After
before after
agentSessionsViewer/CompletedRead/Light
Before After
before after
agentSessionsViewer/CompletedUnread/Dark
Before After
before after
agentSessionsViewer/CompletedUnread/Light
Before After
before after
agentSessionsViewer/FailedWithDuration/Dark
Before After
before after
agentSessionsViewer/FailedWithDuration/Light
Before After
before after
agentSessionsViewer/FailedWithoutDuration/Dark
Before After
before after
agentSessionsViewer/FailedWithoutDuration/Light
Before After
before after
agentSessionsViewer/WithDiffChanges/Dark
Before After
before after
agentSessionsViewer/WithDiffChanges/Light
Before After
before after
agentSessionsViewer/WithFileChangesList/Dark
Before After
before after
agentSessionsViewer/WithFileChangesList/Light
Before After
before after
agentSessionsViewer/WithBadge/Dark
Before After
before after
agentSessionsViewer/WithBadge/Light
Before After
before after
agentSessionsViewer/WithBadgeAndDiff/Dark
Before After
before after
agentSessionsViewer/WithBadgeAndDiff/Light
Before After
before after
agentSessionsViewer/CloudProvider/Dark
Before After
before after
agentSessionsViewer/CloudProvider/Light
Before After
before after
agentSessionsViewer/BackgroundProvider/Dark
Before After
before after
agentSessionsViewer/BackgroundProvider/Light
Before After
before after
agentSessionsViewer/ClaudeProvider/Dark
Before After
before after
agentSessionsViewer/ClaudeProvider/Light
Before After
before after

@vijayupadya vijayupadya changed the title chronicle Chronicle - local and remote Apr 9, 2026
Copy link
Copy Markdown
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Adds a new “Chronicle” capability to Copilot Chat to persist session activity locally (SQLite/FTS) and optionally export session events to a remote “Mission Control” backend, enabling a standup-style summary experience gated behind a team-internal setting.

Changes:

  • Introduces a SQLite-backed session store (schema, FTS indexing, read-only querying) plus unit tests.
  • Adds tracking/export plumbing: OTel span translation, local store population, remote event batching with circuit breaker + secret filtering, and consent flow scaffolding.
  • Registers a new /chronicle intent and a chronicle_standup tool, plus related context keys and contributions.
Show a summary per file
File Description
extensions/copilot/src/platform/configuration/common/configurationService.ts Adds team-internal session search setting
extensions/copilot/src/platform/chronicle/node/test/sessionStore.spec.ts Unit tests for SQLite session store
extensions/copilot/src/platform/chronicle/node/sessionStore.ts SQLite/FTS5-backed session store implementation
extensions/copilot/src/platform/chronicle/common/sessionStore.ts Shared store types + service interface
extensions/copilot/src/extension/tools/node/standupTool.tsx Tool to build standup prompt from stores
extensions/copilot/src/extension/tools/node/allTools.ts Registers new standup tool module
extensions/copilot/src/extension/tools/common/toolNames.ts Adds tool name + category mapping
extensions/copilot/src/extension/intents/node/chronicleIntent.ts New /chronicle slash-command intent
extensions/copilot/src/extension/intents/node/allIntents.ts Registers Chronicle intent
extensions/copilot/src/extension/extension/vscode-node/services.ts Wires SessionStore into DI container
extensions/copilot/src/extension/extension/vscode-node/contributions.ts Registers Chronicle contributions
extensions/copilot/src/extension/conversation/vscode-node/chatParticipants.ts Adds consent check + reset command
extensions/copilot/src/extension/contextKeys/vscode-node/contextKeys.contribution.ts Adds context key for feature gating
extensions/copilot/src/extension/common/constants.ts Adds Chronicle intent constant + mapping
extensions/copilot/src/extension/chronicle/vscode-node/sessionStoreTracker.ts Tracks spans → local session store
extensions/copilot/src/extension/chronicle/vscode-node/remoteSessionExporter.ts Exports spans → Mission Control events
extensions/copilot/src/extension/chronicle/node/missionControlClient.ts MC session/events HTTP client
extensions/copilot/src/extension/chronicle/node/cloudSessionStoreClient.ts Cloud analytics query client (DuckDB SQL)
extensions/copilot/src/extension/chronicle/common/test/standupPrompt.spec.ts Tests for standup prompt + extraction
extensions/copilot/src/extension/chronicle/common/test/sessionIndexingPreference.spec.ts Tests for consent preference storage
extensions/copilot/src/extension/chronicle/common/test/secretFilter.spec.ts Tests for secret redaction
extensions/copilot/src/extension/chronicle/common/test/eventTranslator.spec.ts Tests for span→event translation
extensions/copilot/src/extension/chronicle/common/test/circuitBreaker.spec.ts Tests for circuit breaker behavior
extensions/copilot/src/extension/chronicle/common/standupPrompt.ts Builds standup prompt + SQL query builders
extensions/copilot/src/extension/chronicle/common/sessionStoreTracking.ts Extracts files/refs from tool activity
extensions/copilot/src/extension/chronicle/common/sessionIndexingPreference.ts Consent prompt + preference persistence
extensions/copilot/src/extension/chronicle/common/secretFilter.ts Secret filtering utilities
extensions/copilot/src/extension/chronicle/common/missionControlTypes.ts MC API/event type definitions
extensions/copilot/src/extension/chronicle/common/eventTranslator.ts Translates spans into MC event format
extensions/copilot/src/extension/chronicle/common/circuitBreaker.ts Circuit breaker implementation
extensions/copilot/package.nls.json Adds Chronicle command description string
extensions/copilot/package.json Adds slash command + reset-consent command

Copilot's findings

  • Files reviewed: 32/32 changed files
  • Comments generated: 8

Copy link
Copy Markdown
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Note

Copilot was unable to run its full agentic suite in this review.

Adds “Chronicle” session-history support with local SQLite indexing plus optional cloud sync/export, enabling /chronicle:* commands and a read-only SQL tool over recorded sessions.

Changes:

  • Introduces a local SQLite-backed SessionStore with FTS indexing and a VS Code tracker that records sessions/turns/files/refs from OTel spans.
  • Adds cloud querying/export plumbing (Mission Control client + remote exporter) gated by user consent and repo exclusions.
  • Registers the /chronicle intent and a session_store_sql tool, plus settings/context keys and package contributions.
Show a summary per file
File Description
extensions/copilot/src/platform/configuration/common/configurationService.ts Adds Chronicle-related config keys (local index + cloud sync + repo exclusions).
extensions/copilot/src/platform/chronicle/node/test/sessionStore.spec.ts Adds unit tests for SQLite session store behavior and FTS search.
extensions/copilot/src/platform/chronicle/node/sessionStore.ts Implements SQLite SessionStore with schema/migrations, CRUD, FTS search, and read-only query execution.
extensions/copilot/src/platform/chronicle/common/sessionStore.ts Defines ISessionStore service contract and row types shared across environments.
extensions/copilot/src/extension/tools/node/sessionStoreSqlTool.ts Adds a tool to run read-only SQL against local or cloud session store with telemetry + formatting.
extensions/copilot/src/extension/tools/node/allTools.ts Registers the new sessionStoreSqlTool.
extensions/copilot/src/extension/tools/common/toolNames.ts Adds SessionStoreSql tool name and related tool/category entries.
extensions/copilot/src/extension/test/vscode-node/services.ts Wires ISessionStore into VS Code-node test DI container.
extensions/copilot/src/extension/test/node/services.ts Wires ISessionStore into node unit test DI container.
extensions/copilot/src/extension/prompts/node/panel/chroniclePrompt.tsx Adds a prompt wrapper for Chronicle tool-calling flows.
extensions/copilot/src/extension/intents/node/chronicleIntent.ts Implements /chronicle intent (standup/tips/freeform) using local+cloud session queries.
extensions/copilot/src/extension/intents/node/allIntents.ts Registers ChronicleIntent.
extensions/copilot/src/extension/intents/node/agentIntent.ts Explicitly disables the SQL tool outside /chronicle.
extensions/copilot/src/extension/extension/vscode-node/services.ts Creates and registers the persisted SQLite session-store instance.
extensions/copilot/src/extension/extension/vscode-node/contributions.ts Registers Chronicle contributions (local tracker + remote exporter).
extensions/copilot/src/extension/conversation/vscode-node/chatParticipants.ts Minor formatting-only changes.
extensions/copilot/src/extension/contextKeys/vscode-node/contextKeys.contribution.ts Adds a context key to gate Chronicle UI/commands via experiment-based config.
extensions/copilot/src/extension/common/constants.ts Maps chronicle commands to the new intent.
extensions/copilot/src/extension/chronicle/vscode-node/sessionStoreTracker.ts Adds buffered local session indexing powered by OTel span completion.
extensions/copilot/src/extension/chronicle/vscode-node/remoteSessionExporter.ts Adds buffered Mission Control export with circuit breaking and secret filtering.
extensions/copilot/src/extension/chronicle/node/missionControlClient.ts Implements MC HTTP client (create session + submit events).
extensions/copilot/src/extension/chronicle/node/cloudSessionStoreClient.ts Implements cloud analytics query client and columnar→row conversion.
extensions/copilot/src/extension/chronicle/common/test/standupPrompt.spec.ts Adds tests for standup prompt creation and tracking extractors.
extensions/copilot/src/extension/chronicle/common/test/sessionIndexingPreference.spec.ts Adds tests for cloud consent and repo exclusion behavior.
extensions/copilot/src/extension/chronicle/common/test/secretFilter.spec.ts Adds tests for secret redaction and dynamic secret registration.
extensions/copilot/src/extension/chronicle/common/test/eventTranslator.spec.ts Adds tests for translating OTel spans to Mission Control event format.
extensions/copilot/src/extension/chronicle/common/test/circuitBreaker.spec.ts Adds tests for circuit breaker behavior/backoff and probe timeout.
extensions/copilot/src/extension/chronicle/common/standupPrompt.ts Adds SQL query helpers + standup prompt builder.
extensions/copilot/src/extension/chronicle/common/sessionStoreTracking.ts Adds extractors for file paths, refs, and repo info from tool calls.
extensions/copilot/src/extension/chronicle/common/sessionIndexingPreference.ts Adds preference logic for local vs cloud sync + repo exclusion patterns.
extensions/copilot/src/extension/chronicle/common/secretFilter.ts Adds secret filtering utilities and runtime secret registration.
extensions/copilot/src/extension/chronicle/common/missionControlTypes.ts Defines Mission Control API/request types for session events.
extensions/copilot/src/extension/chronicle/common/eventTranslator.ts Adds OTel span → Mission Control event translation with truncation and size gating.
extensions/copilot/src/extension/chronicle/common/circuitBreaker.ts Adds a circuit breaker used by remote exporter to avoid cascading failures.
extensions/copilot/package.nls.json Adds localized strings for /chronicle descriptions and cloud-sync settings.
extensions/copilot/package.json Contributes /chronicle commands, settings, and the SQL tool manifest.

Copilot's findings

Comments suppressed due to low confidence (3)

extensions/copilot/src/platform/configuration/common/configurationService.ts:1

  • This string-array setting is missing a validator (unlike the adjacent boolean setting). Without validation, malformed config values can reach SessionIndexingPreference and break matching logic at runtime. Add an appropriate array-of-strings validator (consistent with this file’s other settings) so invalid values are rejected/coerced early.
    extensions/copilot/src/extension/tools/node/sessionStoreSqlTool.ts:1
  • The tool claims “Only SELECT queries are allowed”, but enforcement is currently a blocklist of a few keywords. This is especially risky on the local path when executeReadOnlyFallback() is used (Node without authorizer), since non-SELECT statements like VACUUM, ANALYZE, REINDEX, transaction control (BEGIN/COMMIT), or other dialect-specific write/export commands are not blocked. Prefer enforcing an allowlist (e.g., query must be a single statement starting with SELECT or WITH and contain no semicolons), and expand blocking to cover known mutators if an allowlist isn’t feasible.
    extensions/copilot/src/extension/tools/node/sessionStoreSqlTool.ts:1
  • Table formatting doesn’t escape cell values. If a value contains | or newlines, the markdown table will break and can produce confusing output. Escape/replace | and line breaks in s before joining (and consider backtick-wrapping values) to keep rendering stable.
  • Files reviewed: 36/36 changed files
  • Comments generated: 8

…igrate-5049

# Conflicts:
#	extensions/copilot/src/extension/tools/common/toolNames.ts
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants