Files
hapi/web/src/lib/query-keys.ts
T
988f8f183f feat: settings toggle for AGENT_NOTIFY_SUMMARY contract injection (#1376)
* feat: settings toggle for AGENT_NOTIFY_SUMMARY contract injection

Add a hub-persisted, default-off Settings control so operators can opt agents into emitting the trailing AGENT_NOTIFY_SUMMARY line. Propagate the resolved flag on CLI session bootstrap and inject at call time for Claude, Codex, OpenCode, and Grok (Cursor still unsupported).

Closes #1375

Co-authored-by: Cursor <cursoragent@cursor.com>

* fix: lock hub settings RMW and restore abort deliveryMode

Serialize settings.json updates with the shared .lock protocol and unique
temp files so the new hub toggle cannot clobber CLI/relay fields under
concurrency. Also supply deliveryMode on abort send-error restore so web
typecheck (and CI) pass.

Co-authored-by: Cursor <cursoragent@cursor.com>

* fix(web): wrap SettingsGeneralPage tests with QueryClientProvider

The hub-settings toggle uses TanStack Query; the settings page suite
was rendering without a QueryClient and blew up CI.

Co-authored-by: Cursor <cursoragent@cursor.com>

* fix(web): defer summary-contract toggle until settings load

Avoid rendering an interactive false switch while the hub GET is still
in flight, which could overwrite an enabled preference on early click.

Co-authored-by: Cursor <cursoragent@cursor.com>

* fix(web): clarify Grok coverage for summary-contract toggle

Local Grok has no instruction inject path; settings copy now matches
remote-only Grok support (and still excludes Cursor).

Co-authored-by: Cursor <cursoragent@cursor.com>

---------

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-08-06 18:51:35 +08:00

37 lines
2.6 KiB
TypeScript

export const queryKeys = {
sessions: ['sessions'] as const,
session: (sessionId: string) => ['session', sessionId] as const,
messages: (sessionId: string) => ['messages', sessionId] as const,
machines: ['machines'] as const,
sqliteStorage: ['sqlite-storage'] as const,
hubSettings: ['hub-settings'] as const,
usageSummary: (range: string, timeZone: string) => ['usage-summary', range, timeZone] as const,
machineCodexModels: (machineId: string) => ['machine-codex-models', machineId] as const,
gitStatus: (sessionId: string) => ['git-status', sessionId] as const,
sessionFiles: (sessionId: string, query: string) => ['session-files', sessionId, query] as const,
sessionDirectory: (sessionId: string, path: string) => ['session-directory', sessionId, path] as const,
sessionFile: (sessionId: string, path: string) => ['session-file', sessionId, path] as const,
gitFileDiff: (sessionId: string, path: string, staged?: boolean) => [
'git-file-diff',
sessionId,
path,
staged ? 'staged' : 'unstaged'
] as const,
slashCommands: (sessionId: string) => ['slash-commands', sessionId] as const,
sessionCursorModels: (sessionId: string) => ['session-cursor-models', sessionId] as const,
sessionCursorChatStore: (sessionId: string) => ['session-cursor-chat-store', sessionId] as const,
sessionPiModels: (sessionId: string) => ['session-pi-models', sessionId] as const,
machineCursorModels: (machineId: string) => ['machine-cursor-models', machineId] as const,
sessionOpencodeModels: (sessionId: string) => ['session-opencode-models', sessionId] as const,
sessionOpencodeReasoningEffortOptions: (sessionId: string) => ['session-opencode-reasoning-effort-options', sessionId] as const,
machineOpencodeModelsForCwd: (machineId: string, cwd: string) => ['machine-opencode-models', machineId, cwd] as const,
machineGrokModelsForCwd: (machineId: string, cwd: string) => ['machine-grok-models', machineId, cwd] as const,
sessionGrokModels: (sessionId: string) => ['session-grok-models', sessionId] as const,
sessionCopilotModels: (sessionId: string) => ['session-copilot-models', sessionId] as const,
machineCopilotModelsForCwd: (machineId: string, cwd: string) => ['machine-copilot-models', machineId, cwd] as const,
sessionGrokReasoningEffortOptions: (sessionId: string) => ['session-grok-reasoning-effort-options', sessionId] as const,
machineAgyModels: (machineId: string) => ['machine-agy-models', machineId] as const,
skills: (sessionId: string) => ['skills', sessionId] as const,
scratchlist: (sessionId: string) => ['scratchlist', sessionId] as const,
}