Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
45 commits
Select commit Hold shift + click to select a range
27b49bc
Pick up latest md language server
mjbvz May 1, 2026
72c6a7f
Bump service version too
mjbvz May 1, 2026
5e51757
chore(deps): bump @xterm/* to beta.213 to pick up overview ruler disp…
bryanchen-d May 1, 2026
4341e36
Update remote dependencies (#313923)
rebornix May 4, 2026
5c4d9a2
Add experimental alt prompt for Claude Opus 4.7 (#313916)
bhavyaus May 4, 2026
487b69f
cli: move back to microsoft/dev-tunnels
connor4312 May 4, 2026
218ed35
fix: use onUnexpectedExternalError for delegate errors in RemoteAutho…
vs-code-engineering[bot] May 4, 2026
75e5ace
Merge branch 'main' into bryanchen-d/bump-xterm-overview-ruler-fix
bryanchen-d May 4, 2026
a2d447b
Merge pull request #313817 from microsoft/bryanchen-d/bump-xterm-over…
bryanchen-d May 4, 2026
c30ed7c
feat(agent-host): gate inbound filesystem RPCs with a permission serv…
connor4312 May 4, 2026
f078601
Merge pull request #314206 from microsoft/connor4312/devtunnels-back
connor4312 May 4, 2026
c365c05
Agents - add worktree icon to session list (#314213)
lszomoru May 4, 2026
e4e0fa6
Merge pull request #313807 from microsoft/dev/mjbvz/md-ls-bump
mjbvz May 4, 2026
83b3a75
Fixes component fixture errors (#314164)
hediet May 4, 2026
2358983
add ChatSkill.disableModelInvocation (#314174)
aeschli May 4, 2026
cc8cfa8
make sure to clear plan mode widget if canceled (#314221)
justschen May 4, 2026
932dd11
Fix tool_search bookkeeping when resuming from stateful marker (#314217)
bhavyaus May 4, 2026
913d6f7
diagnostic logs around enablement (#314138)
amunger May 4, 2026
e0b5fc2
Reduce token usage of "add element to chat" (#314201)
kycutler May 4, 2026
a2ef0ad
Make Chronicle a Skill (#313929)
vijayupadya May 4, 2026
66ba739
Add static commands for opening Agent Host chat sessions (#314187)
meganrogge May 4, 2026
c75e862
Put ambiguous options into interface (#313953)
Tyriar May 4, 2026
2d9497a
Merge pull request #314214 from microsoft/fix/remote-authority-delega…
bryanchen-d May 4, 2026
acc18a0
Special profile for Agents Window (#314240)
sandy081 May 4, 2026
5bbf01b
Additional styling fixes for UBB (#314237)
pwang347 May 4, 2026
ed7819e
Changes to remove '.' from allowRead and allowWrite (#314230)
dileepyavan May 4, 2026
42d5085
Suppress redundant input-needed steering after foreground inputNeeded…
Copilot May 4, 2026
566f6bb
Handle inputNeeded in execution subagent to prevent looping (#314141)
meganrogge May 4, 2026
24b0b0d
Add container name to New/Browse button aria-labels on AI customizati…
Copilot May 4, 2026
d35b23a
Don't route terminal secret prompts through vscode_askQuestions (#314…
Copilot May 4, 2026
5a6c5bb
Announce section counts in AI Customization sidebar for screen reader…
Copilot May 4, 2026
b54e0db
Fix /compact omitting assistant messages (#314260)
bhavyaus May 4, 2026
1ffb41c
Detect xterm-trimmed `Password:` prompt so agent doesn't hang on `sud…
Copilot May 4, 2026
8ba97c0
Announce "Bridged" badge in MCP Servers list (#314255)
Copilot May 4, 2026
e1a8956
agent host: negotiate protocol version + surface incompatibility in U…
connor4312 May 4, 2026
f3dfc73
plugins: support installing single-plugin source repos (#314263)
connor4312 May 4, 2026
2fc10e3
Mobile agents: home screen improvements (#314226)
osortega May 4, 2026
e073647
support for agent instructions in extensions IPromptsService (#314227)
aeschli May 4, 2026
238014b
Throw when Anthropic web search allowed and blocked domains are both …
bhavyaus May 4, 2026
fa3e3b0
Changes to include workspaceStorage directory for allowRead (#313820)
dileepyavan May 4, 2026
495587c
sessions: use agent-specific codicons for session type icons (#314283)
TylerLeonhardt May 4, 2026
8f4ed8d
Do no fail component explorer check if fixture had errors
hediet May 4, 2026
573219b
sessions: show Rename action for local agent host sessions (#314279)
roblourens May 4, 2026
d3fd800
Announce AI customization list result count to screen readers (#314254)
Copilot May 4, 2026
65ce1b9
Merge pull request #314292 from microsoft/hediet/b/ytterbic-leopon
hediet May 5, 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
34 changes: 25 additions & 9 deletions .github/workflows/screenshot-test.yml
Original file line number Diff line number Diff line change
Expand Up @@ -26,10 +26,10 @@ jobs:
- name: Checkout
uses: actions/checkout@v6
with:
# Depth 2 gives us the test-merge commit plus its parents, which is
# enough for the merge-base lookup below (the target-branch tip is a
# direct parent). Full clone would be wasteful for this large repo.
fetch-depth: 2
# Need enough history for the merge-base lookup below to succeed even
# when the target branch has advanced since the PR was opened. Full
# clone would be wasteful for this large repo, so cap at 50.
fetch-depth: 50

- name: Setup Node.js
uses: actions/setup-node@v6
Expand Down Expand Up @@ -63,15 +63,20 @@ jobs:
- name: Capture screenshots
run: ./node_modules/.bin/component-explorer render --project ./test/componentFixtures/component-explorer.json

- name: Log fixture errors
- name: Check fixture errors
id: fixture_errors
if: always()
run: |
MANIFEST="test/componentFixtures/.screenshots/current/manifest.json"
if [ ! -f "$MANIFEST" ]; then
echo "::warning::No manifest found — render may have failed entirely"
exit 0
fi
ERRORS=$(node -e "
# Log per-fixture errors but do not fail here — let later steps run
# (artifact upload, diff, PR comment) so failures are debuggable.
# The final "Fail if fixtures had errors" step turns this into a
# job failure.
if node -e "
const m = require('./$MANIFEST');
const errs = m.fixtures.filter(f => f.hasError);
if (!errs.length) { console.log('No fixture errors.'); process.exit(0); }
Expand All @@ -84,8 +89,12 @@ jobs:
for (const e of f.events) { console.log(' event: ' + JSON.stringify(e)); }
}
}
")
echo "$ERRORS"
process.exit(1);
"; then
echo "has_errors=false" >> "$GITHUB_OUTPUT"
else
echo "has_errors=true" >> "$GITHUB_OUTPUT"
fi

- name: Check blocks-ci screenshots
id: blocks-ci
Expand Down Expand Up @@ -127,7 +136,7 @@ jobs:
# the target-branch tip at PR creation time and can be stale,
# causing unrelated target-branch commits to show up as diffs.
TARGET_REF="origin/${{ github.event.pull_request.base.ref }}"
git fetch --no-tags --depth=1 origin "${{ github.event.pull_request.base.ref }}"
git fetch --no-tags --depth=50 origin "${{ github.event.pull_request.base.ref }}"
BASE_SHA=$(git merge-base "${{ github.sha }}" "$TARGET_REF")
else
# For push events, diff against the parent commit.
Expand Down Expand Up @@ -319,6 +328,13 @@ jobs:
diff -u test/componentFixtures/blocks-ci-screenshots.md /tmp/blocks-ci-updated.md || true
exit 1

# - name: Fail if fixtures had errors
# if: always() && steps.fixture_errors.outputs.has_errors == 'true'
# run: |
# echo "::error::One or more component fixtures failed to render. See the 'Check fixture errors' step for details."
# exit 1


# - name: Prepare explorer artifact
# run: |
# mkdir -p /tmp/explorer-artifact/screenshot-report
Expand Down
2 changes: 1 addition & 1 deletion cli/Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

3 changes: 1 addition & 2 deletions cli/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -33,8 +33,7 @@ jiff = { version = "0.2", default-features = false, features = ["std", "serde"]
http = "1"
gethostname = "0.4.3"
libc = "0.2.144"
# temporary fork pending https://github.com/microsoft/dev-tunnels/pull/626
tunnels = { git = "https://github.com/connor4312/dev-tunnels", rev = "4be50b3cc5ade8cb6beec4038c53ea4f2cdac5a2", default-features = false, features = ["connections"] }
tunnels = { git = "https://github.com/microsoft/dev-tunnels", rev = "64048c1409ff56cb958b879de7ea069ec71edc8b", default-features = false, features = ["connections"] }
keyring = { version = "2.0.3", default-features = false, features = ["linux-secret-service-rt-tokio-crypto-openssl", "platform-windows", "platform-macos", "linux-keyutils"] }
dialoguer = "0.10.4"
hyper = { version = "1", features = ["server", "http1", "client"] }
Expand Down
5 changes: 5 additions & 0 deletions extensions/copilot/assets/prompts/chronicle-reindex.prompt.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
name: chronicle:reindex
description: Rebuild the local session index and sync to cloud
---
Reindex my session store to pick up any missing sessions. Add 'force' to re-process already indexed sessions.
5 changes: 5 additions & 0 deletions extensions/copilot/assets/prompts/chronicle-standup.prompt.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
name: chronicle:standup
description: Generate a standup report from recent chat sessions
---
Generate a standup report from my recent coding sessions.
5 changes: 5 additions & 0 deletions extensions/copilot/assets/prompts/chronicle-tips.prompt.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
name: chronicle:tips
description: Get personalized tips based on your chat session usage patterns
---
Analyze my recent chat session history and give me personalized tips to improve my workflow.
153 changes: 153 additions & 0 deletions extensions/copilot/assets/prompts/skills/chronicle/SKILL.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,153 @@
---
name: chronicle
description: Analyze Copilot session history for standup reports, usage tips, and session reindexing. Use when the user asks for a standup, daily summary, usage tips, workflow recommendations, wants to reindex their session store, or asks about deleting session data.
---

# Chronicle

Analyze the user's Copilot session history using the `copilot_sessionStoreSql` tool. This skill handles standup reports, usage analysis, and session store maintenance.

Sessions may be stored locally (SQLite) and optionally synced to the cloud for cross-device access. Cloud sync is controlled by the `chat.sessionSync.enabled` setting.

**Prerequisite:** Chronicle requires the `github.copilot.chat.localIndex.enabled` setting to be `true`. If the `copilot_sessionStoreSql` tool is not available, tell the user to enable this setting in VS Code Settings.

## Available Tool Actions

The `copilot_sessionStoreSql` tool supports three actions:

| Action | Purpose | `query` param |
|--------|---------|---------------|
| `standup` | Pre-fetch last 24h sessions, turns, files, refs | Not needed |
| `query` | Execute a read-only SQL query | Required |
| `reindex` | Rebuild local session index + cloud sync | Not needed |

## Workflows

### Standup

When the user asks for a standup, daily summary, or "what did I do":

1. Call `copilot_sessionStoreSql` with `action: "standup"` and `description: "Generate standup"`.
2. The tool returns pre-fetched session data (sessions, turns, files, refs from the last 24 hours).
3. For any PR references in the data, check their current status (open, merged, draft) if possible.
4. Format the returned data as a standup report grouped by work stream (branch/feature):

```
Standup for <date>:

**✅ Done**

**Feature name** (`branch-name` branch, `repo-name`)
- 3-7 words describing the status
- Key files: 2-3 most important files changed
- Merged: [#123](link)
- Session: `session-id`

**🚧 In Progress**

**Feature name** (`branch-name` branch, `repo-name`)
- 3-7 words describing the current state of work
- Key files: 2-3 most important files being worked on
- Draft: [#789](link)
- Session: `session-id`
```

Rules:
- Keep it concise and succinct — the user can always ask follow-up questions
- Use turn data (user messages AND assistant responses) to understand WHAT was done
- Use file paths to identify which components/areas were affected
- Group related sessions on the same branch into one entry
- For sessions, only show the most recent session per feature/branch
- Link PRs and issues using markdown link syntax
- Classify as Done if work appears complete, In Progress otherwise

### Tips

When the user asks for tips, workflow recommendations, or how to improve:

**Step 1: Investigate how the user works**

Use `copilot_sessionStoreSql` with `action: "query"` to explore their recent sessions. The goal is to understand their patterns — how they prompt, what tools they use, and where they spend time.

Queries to run (do not explain what you will do first — start querying immediately):
- Sessions from the last 7 days: counts, durations, repositories
- Turn data: read actual user messages to understand prompting patterns
- session_files: which files and tools are used most frequently
- session_refs: PR/issue/commit activity patterns

**Step 2: Consider available features**

If the current workspace has a `.github/` folder, check for `.github/copilot-instructions.md`, `.github/skills/`, and `.github/agents/` to see what custom configuration exists. Do NOT look outside the workspace. Look for gaps between what's available and what the user actually uses.

**Step 3: Provide tips**

Based on what you learned, provide 3-5 specific, actionable tips. Each tip should:
- Be grounded in actual usage data — reference specific patterns you observed
- Be non-obvious — skip basic features that any regular user would already know
- Focus on gaps where a feature, workflow change, or different approach would meaningfully improve their experience

Analysis dimensions to explore:
- **Prompting patterns**: Are user messages vague or specific? Do they provide context? Do they correct or redirect the agent frequently?
- **Tool usage**: Which tools are used most? Are there underutilized tools that could help?
- **Session patterns**: How long are sessions? Are there many short abandoned sessions?
- **File patterns**: Which areas of the codebase get the most attention? Any repeated edits to the same files?
- **Workflow**: Is the user leveraging agent mode, custom instructions, prompt files, skills?

If the session store has little data, acknowledge that and suggest features to try based on what configuration you found in the workspace.

### Reindex

When the user asks to reindex, rebuild, or refresh their session store:

1. Call `copilot_sessionStoreSql` with `action: "reindex"` and `description: "Reindex sessions"`.
2. The tool rebuilds the local session store from debug logs and, if cloud sync is enabled, uploads new sessions to the cloud.
3. Present the before/after stats and cloud sync results to the user.

If the user says "force reindex" or wants to re-process already-indexed sessions, add `force: true` to the call. By default, already-indexed sessions are skipped for speed.

### Delete Sessions

When the user asks to delete session data or clear their history:

- Guide them to run the **Delete Session Sync Data** command from the Command Palette (`github.copilot.sessionSync.deleteSessions`).
- This command lets them choose which sessions to delete from both local storage and the cloud.
- The tool itself does NOT support deletion — this is intentional to prevent accidental data loss.

## Query Guidelines

When using `action: "query"`:
- Only one query per call — do not combine multiple statements with semicolons
- Always use LIMIT (max 100) and prefer aggregations (COUNT, GROUP BY) over raw row dumps
- Query the **turns** table for conversation content — it gives the richest insight into what happened
- Query **session_files** for file paths and tool usage patterns
- Query **session_refs** for PR/issue/commit links
- Join tables using session_id for complete analysis
- Always filter on **updated_at** (not created_at) for time ranges
- Always JOIN sessions with turns to get session content — do not rely on sessions.summary alone

### Query routing

The tool automatically routes queries based on the user's cloud sync settings:
- **Cloud enabled**: Queries go to the cloud DuckDB backend which contains ALL sessions across devices and agents (VS Code, CLI, Copilot Coding Agent, PR reviews). The tool description will show DuckDB SQL syntax — follow it.
- **Cloud disabled**: Queries go to local SQLite which only contains sessions from this device. The tool description will show SQLite syntax.

The tool's description dynamically changes based on the active backend. **Always follow the SQL syntax shown in the tool description** — it matches the active backend.

## Database Schema

### Tables (both local and cloud unless noted)

- **sessions**: id, cwd (workspace folder path — always NULL in cloud), repository, branch, host_type, summary, agent_name, agent_description, created_at, updated_at
- **turns**: session_id, turn_index, user_message, assistant_response (first ~1000 chars, may be truncated), timestamp
- **checkpoints**: session_id, checkpoint_number, title, overview, history, work_done, technical_details, important_files, next_steps, created_at — compaction checkpoints storing summarized state. Note: cloud has fewer columns (no history/work_done/technical_details).
- **session_files**: session_id, file_path, tool_name, turn_index, first_seen_at
- **session_refs**: session_id, ref_type (commit/pr/issue), ref_value, turn_index, created_at
- **search_index**: FTS5 table (local only). Use `WHERE search_index MATCH 'query'` for full-text search

### Cloud-only tables

- **events**: Raw event table (~90 columns). Key columns: session_id, timestamp, type, user_content, assistant_content, tool_start_name, tool_complete_success, tool_complete_result_content, usage_model, usage_input_tokens, usage_output_tokens
- **tool_requests**: session_id, tool_call_id, name, arguments_json

Date math (SQLite): `datetime('now', '-1 day')`, `datetime('now', '-7 days')`
Date math (Cloud/DuckDB): `now() - INTERVAL '1 day'`, `now() - INTERVAL '7 days'`. Use `ILIKE` for text search (no FTS5/MATCH), `date_diff('minute', start, end)` for durations.
74 changes: 50 additions & 24 deletions extensions/copilot/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -1268,24 +1268,33 @@
"name": "copilot_sessionStoreSql",
"displayName": "Session Store SQL",
"toolReferenceName": "sessionStoreSql",
"when": "github.copilot.sessionSearch.enabled",
"userDescription": "Query your Copilot session history using SQL",
"modelDescription": "Execute read-only SQL queries against the global session store containing history from ALL past coding sessions. Use this proactively when the user asks about:\n- What they've worked on recently or in the past\n- Prior approaches to similar problems\n- Project history and file changes\n- Sessions linked to PRs, issues, or commits\n- Temporal queries ('what was I doing yesterday?')\n\nSupports SQLite SQL including JOINs, FTS5 MATCH queries, aggregations, and subqueries.\n\n**Only one query per call — do not combine multiple statements with semicolons.**\n\nSchema:\n- sessions — id, cwd, repository, branch, summary, created_at, updated_at\n- turns — session_id, turn_index, user_message, assistant_response, timestamp\n- session_files — session_id, file_path, tool_name (edit/create), turn_index\n- session_refs — session_id, ref_type (commit/pr/issue), ref_value, turn_index\n- search_index — FTS5 virtual table (content, session_id, source_type). Use WHERE search_index MATCH 'query' for full-text search.",
"modelDescription": "Query the local session store containing history from past coding sessions. Uses SQLite SQL syntax.\n\nActions: 'query' (execute SQL — supports JOINs, FTS5 MATCH, aggregations), 'standup' (pre-fetch last 24h data), 'reindex' (rebuild index from debug logs).",
"tags": [],
"canBeReferencedInPrompt": false,
"inputSchema": {
"type": "object",
"properties": {
"action": {
"type": "string",
"enum": ["query", "standup", "reindex"],
"description": "The action to perform. 'query' (default) executes a SQL query. 'standup' pre-fetches last 24h session data for standup reports. 'reindex' rebuilds the local session index and syncs to cloud if enabled."
},
"query": {
"type": "string",
"description": "A single read-only SQL query to execute. Supports SELECT, WITH, JOINs, aggregations, and FTS5 MATCH. Only one statement per call — do not combine multiple queries with semicolons."
"description": "A single read-only SQL query to execute. Required when action is 'query'. Supports SELECT, WITH, JOINs, aggregations, and FTS5 MATCH. Only one statement per call — do not combine multiple queries with semicolons."
},
"force": {
"type": "boolean",
"description": "When true with action 'reindex', re-processes all sessions including already-indexed ones. Default false (skips already-indexed sessions)."
},
"description": {
"type": "string",
"description": "A 2-5 word summary of what this query does (e.g. 'Recent sessions overview', 'Find PR sessions')."
"description": "A 2-5 word summary of what this call does (e.g. 'Recent sessions overview', 'Generate standup', 'Reindex sessions')."
}
},
"required": [
"query",
"description"
]
}
Expand Down Expand Up @@ -1534,26 +1543,6 @@
"name": "compact",
"description": "%copilot.agent.compact.description%"
},
{
"name": "chronicle",
"description": "%copilot.chronicle.description%",
"when": "github.copilot.sessionSearch.enabled"
},
{
"name": "chronicle:standup",
"description": "%copilot.chronicle.standup.description%",
"when": "github.copilot.sessionSearch.enabled"
},
{
"name": "chronicle:tips",
"description": "%copilot.chronicle.tips.description%",
"when": "github.copilot.sessionSearch.enabled"
},
{
"name": "chronicle:reindex",
"description": "%copilot.chronicle.reindex.description%",
"when": "github.copilot.sessionSearch.enabled"
},
{
"name": "explain",
"description": "%copilot.workspace.explain.description%"
Expand Down Expand Up @@ -3862,6 +3851,15 @@
"onExp"
]
},
"github.copilot.chat.claude47OpusPrompt.enabled": {
"type": "boolean",
"default": false,
"markdownDescription": "%github.copilot.config.claude47OpusPrompt.enabled%",
"tags": [
"experimental",
"onExp"
]
},
"github.copilot.chat.gpt54ConcisePrompt.enabled": {
"type": "boolean",
"default": false,
Expand Down Expand Up @@ -6389,6 +6387,27 @@
"sessionTypes": [
"local"
]
},
{
"path": "./assets/prompts/chronicle-standup.prompt.md",
"when": "github.copilot.sessionSearch.enabled",
"sessionTypes": [
"local"
]
},
{
"path": "./assets/prompts/chronicle-tips.prompt.md",
"when": "github.copilot.sessionSearch.enabled",
"sessionTypes": [
"local"
]
},
{
"path": "./assets/prompts/chronicle-reindex.prompt.md",
"when": "github.copilot.sessionSearch.enabled",
"sessionTypes": [
"local"
]
}
],
"chatSkills": [
Expand Down Expand Up @@ -6469,6 +6488,13 @@
"sessionTypes": [
"local"
]
},
{
"path": "./assets/prompts/skills/chronicle/SKILL.md",
"when": "github.copilot.sessionSearch.enabled",
"sessionTypes": [
"local"
]
}
],
"terminal": {
Expand Down
Loading
Loading