Files
vscode/build/lib/i18n.resources.json
Ben Villalobos 041ae8b0c9 feat(automations): add foundation — types, storage, scheduler, leader election (#323745)
* feat(automations): add foundation — types, storage service, scheduler, leader election

Introduces the Automations subsystem core:
- IAutomation types and IAutomationSchedule (interval-based: manual/hourly/daily/weekly)
- DST-safe computeNextRunAt scheduling logic
- IAutomationService with persistent JSON ledger (StorageScope.APPLICATION)
- Optimistic concurrency via revision counter for cross-window safety
- Leader election to ensure single scheduler instance across windows
- AutomationScheduler: periodic tick loop checking due automations
- Feature gate: chat.automations.enabled setting mirrored to context key
- Unit tests for scheduling logic

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>

* fix: address Copilot Code Review feedback on PR 1

- Add _unsupportedSchema guard to recordRunStart and updateRun
- Localize CRASH_RECOVERY_REASON string via nls.localize()
- Move imports above registerSingleton call in contribution file
- Fix test comment referencing wrong helper name (buildLocalDate -> localDate)

* fix: address CCR round 2 — schema guards, telemetry cleanup, scope fix

- Add _unsupportedSchema guard to markStaleRunsFailed and advanceNextRunAt
- Replace boolean telemetry flags with actual enum values (permissionLevel, isolationMode)
- Remove hasProviderId, hasSessionTypeId, hasModelId, hasMode, hasPermissionLevel flags
- Add scope: ConfigurationScope.MACHINE to runTimeoutMinutes setting

* fix: gate scheduler construction on chat.automations.enabled

AutomationSchedulerCore (and its leader election heartbeat/storage
writes) are now only constructed when the feature setting is enabled.
Uses MutableDisposable for clean teardown on runtime toggle.

Addresses CCR feedback: avoid 30s heartbeat timer + storage writes
when the feature is disabled.

* fix: isolate per-automation errors in dispatch loop

Wrap advanceNextRunAt + runOneWithTimeout in try/catch so a failure
in one automation does not abort dispatch of remaining due automations.

* fix: register automations path in i18n resources

Adds vs/sessions/contrib/automations to the translation resources
so nls.localize calls pass the eslint translation-remind rule.

* fix: validate enum fields at write boundary and harden persist()

- Normalize permissionLevel/isolationMode in createAutomation and
  mergeAutomation: reject unknown values to keep persisted data and
  GDPR-classified telemetry low-cardinality.
- Wrap persist() storage read and write in try/catch so storage
  failures degrade gracefully instead of breaking the scheduler.

* fix: scheduler to Eventually phase, simplify persist(), document serial dispatch

- Move scheduler registration from AfterRestored to Eventually —
  background concern that doesn't need to block workbench restore.
- Remove re-read-before-write in persist() — refreshFromStorage via
  onDidChangeValue already handles cross-window sync. Eliminates
  redundant JSON.parse on every mutation and the misleading optimistic
  concurrency check that overwrote anyway.
- Document that _pendingRuns serializes dispatch intentionally.

* style: remove em dashes and obscure acronyms from comments

Replace all em dashes with periods or semicolons. Remove TOCTOU
acronym. Replace multiplication sign with plain x.

* Signing commit

---------

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
2026-06-30 16:38:35 -07:00

769 lines
16 KiB
JSON

{
"editor": [
{
"name": "vs/platform",
"project": "vscode-editor"
},
{
"name": "vs/editor/contrib",
"project": "vscode-editor"
},
{
"name": "vs/editor",
"project": "vscode-editor"
},
{
"name": "vs/base",
"project": "vscode-editor"
}
],
"workbench": [
{
"name": "vs/code",
"project": "vscode-workbench"
},
{
"name": "vs/workbench",
"project": "vscode-workbench"
},
{
"name": "vs/workbench/api/common",
"project": "vscode-workbench"
},
{
"name": "vs/workbench/contrib/bulkEdit",
"project": "vscode-workbench"
},
{
"name": "vs/workbench/contrib/cli",
"project": "vscode-workbench"
},
{
"name": "vs/workbench/contrib/codeEditor",
"project": "vscode-workbench"
},
{
"name": "vs/workbench/contrib/callHierarchy",
"project": "vscode-workbench"
},
{
"name": "vs/workbench/contrib/typeHierarchy",
"project": "vscode-workbench"
},
{
"name": "vs/workbench/contrib/codeActions",
"project": "vscode-workbench"
},
{
"name": "vs/workbench/contrib/commands",
"project": "vscode-workbench"
},
{
"name": "vs/workbench/contrib/markdown",
"project": "vscode-workbench"
},
{
"name": "vs/workbench/contrib/comments",
"project": "vscode-workbench"
},
{
"name": "vs/workbench/contrib/debug",
"project": "vscode-workbench"
},
{
"name": "vs/workbench/contrib/dialogs",
"project": "vscode-workbench"
},
{
"name": "vs/workbench/contrib/multiDiffEditor",
"project": "vscode-workbench"
},
{
"name": "vs/workbench/contrib/emmet",
"project": "vscode-workbench"
},
{
"name": "vs/workbench/services/assignment",
"project": "vscode-workbench"
},
{
"name": "vs/workbench/services/auxiliaryWindow",
"project": "vscode-workbench"
},
{
"name": "vs/workbench/contrib/extensions",
"project": "vscode-workbench"
},
{
"name": "vs/workbench/contrib/externalTerminal",
"project": "vscode-workbench"
},
{
"name": "vs/workbench/contrib/files",
"project": "vscode-workbench"
},
{
"name": "vs/workbench/contrib/folding",
"project": "vscode-workbench"
},
{
"name": "vs/workbench/contrib/html",
"project": "vscode-workbench"
},
{
"name": "vs/workbench/contrib/issue",
"project": "vscode-workbench"
},
{
"name": "vs/workbench/contrib/inlayHints",
"project": "vscode-workbench"
},
{
"name": "vs/workbench/contrib/interactive",
"project": "vscode-workbench"
},
{
"name": "vs/workbench/contrib/languageStatus",
"project": "vscode-workbench"
},
{
"name": "vs/workbench/contrib/limitIndicator",
"project": "vscode-workbench"
},
{
"name": "vs/workbench/contrib/keybindings",
"project": "vscode-workbench"
},
{
"name": "vs/workbench/contrib/markers",
"project": "vscode-workbench"
},
{
"name": "vs/workbench/contrib/mergeEditor",
"project": "vscode-workbench"
},
{
"name": "vs/workbench/contrib/localization",
"project": "vscode-workbench"
},
{
"name": "vs/workbench/contrib/logs",
"project": "vscode-workbench"
},
{
"name": "vs/workbench/contrib/output",
"project": "vscode-workbench"
},
{
"name": "vs/workbench/contrib/performance",
"project": "vscode-workbench"
},
{
"name": "vs/workbench/contrib/preferences",
"project": "vscode-workbench"
},
{
"name": "vs/workbench/contrib/notebook",
"project": "vscode-workbench"
},
{
"name": "vs/workbench/contrib/inlineChat",
"project": "vscode-workbench"
},
{
"name": "vs/workbench/contrib/imageCarousel",
"project": "vscode-workbench"
},
{
"name": "vs/workbench/contrib/agentsVoice",
"project": "vscode-workbench"
},
{
"name": "vs/workbench/contrib/chat",
"project": "vscode-workbench"
},
{
"name": "vs/workbench/contrib/quickaccess",
"project": "vscode-workbench"
},
{
"name": "vs/workbench/contrib/userData",
"project": "vscode-workbench"
},
{
"name": "vs/workbench/contrib/remote",
"project": "vscode-workbench"
},
{
"name": "vs/workbench/contrib/relauncher",
"project": "vscode-workbench"
},
{
"name": "vs/workbench/contrib/sash",
"project": "vscode-workbench"
},
{
"name": "vs/workbench/contrib/scm",
"project": "vscode-workbench"
},
{
"name": "vs/workbench/contrib/search",
"project": "vscode-workbench"
},
{
"name": "vs/workbench/contrib/searchEditor",
"project": "vscode-workbench"
},
{
"name": "vs/workbench/contrib/snippets",
"project": "vscode-workbench"
},
{
"name": "vs/workbench/contrib/format",
"project": "vscode-workbench"
},
{
"name": "vs/workbench/contrib/tags",
"project": "vscode-workbench"
},
{
"name": "vs/workbench/contrib/speech",
"project": "vscode-workbench"
},
{
"name": "vs/workbench/contrib/styleOverrides",
"project": "vscode-workbench"
},
{
"name": "vs/workbench/contrib/surveys",
"project": "vscode-workbench"
},
{
"name": "vs/workbench/contrib/tasks",
"project": "vscode-workbench"
},
{
"name": "vs/workbench/contrib/testing",
"project": "vscode-workbench"
},
{
"name": "vs/workbench/contrib/terminal",
"project": "vscode-workbench"
},
{
"name": "vs/workbench/contrib/terminalContrib",
"project": "vscode-workbench"
},
{
"name": "vs/workbench/contrib/themes",
"project": "vscode-workbench"
},
{
"name": "vs/workbench/contrib/trust",
"project": "vscode-workbench"
},
{
"name": "vs/workbench/contrib/update",
"project": "vscode-workbench"
},
{
"name": "vs/workbench/contrib/url",
"project": "vscode-workbench"
},
{
"name": "vs/workbench/contrib/watermark",
"project": "vscode-workbench"
},
{
"name": "vs/workbench/contrib/webview",
"project": "vscode-workbench"
},
{
"name": "vs/workbench/contrib/webviewPanel",
"project": "vscode-workbench"
},
{
"name": "vs/workbench/contrib/workspace",
"project": "vscode-workbench"
},
{
"name": "vs/workbench/contrib/workspaces",
"project": "vscode-workbench"
},
{
"name": "vs/workbench/contrib/customEditor",
"project": "vscode-workbench"
},
{
"name": "vs/workbench/contrib/externalUriOpener",
"project": "vscode-workbench"
},
{
"name": "vs/workbench/contrib/welcomeGettingStarted",
"project": "vscode-workbench"
},
{
"name": "vs/workbench/contrib/welcomeOnboarding",
"project": "vscode-workbench"
},
{
"name": "vs/workbench/contrib/onboarding",
"project": "vscode-workbench"
},
{
"name": "vs/workbench/contrib/welcomePage",
"project": "vscode-workbench"
},
{
"name": "vs/workbench/contrib/welcomeViews",
"project": "vscode-workbench"
},
{
"name": "vs/workbench/contrib/welcomeWalkthrough",
"project": "vscode-workbench"
},
{
"name": "vs/workbench/contrib/welcomeDialog",
"project": "vscode-workbench"
},
{
"name": "vs/workbench/contrib/outline",
"project": "vscode-workbench"
},
{
"name": "vs/workbench/contrib/userDataSync",
"project": "vscode-workbench"
},
{
"name": "vs/workbench/contrib/editSessions",
"project": "vscode-workbench"
},
{
"name": "vs/workbench/contrib/views",
"project": "vscode-workbench"
},
{
"name": "vs/workbench/contrib/languageDetection",
"project": "vscode-workbench"
},
{
"name": "vs/workbench/contrib/accessibilitySignals",
"project": "vscode-workbench"
},
{
"name": "vs/workbench/contrib/bracketPairColorizer2Telemetry",
"project": "vscode-workbench"
},
{
"name": "vs/workbench/contrib/scrollLocking",
"project": "vscode-workbench"
},
{
"name": "vs/workbench/contrib/remoteTunnel",
"project": "vscode-workbench"
},
{
"name": "vs/workbench/services/actions",
"project": "vscode-workbench"
},
{
"name": "vs/workbench/services/authToken",
"project": "vscode-workbench"
},
{
"name": "vs/workbench/services/backup",
"project": "vscode-workbench"
},
{
"name": "vs/workbench/services/bulkEdit",
"project": "vscode-workbench"
},
{
"name": "vs/workbench/services/clipboard",
"project": "vscode-workbench"
},
{
"name": "vs/workbench/services/commands",
"project": "vscode-workbench"
},
{
"name": "vs/workbench/services/configuration",
"project": "vscode-workbench"
},
{
"name": "vs/workbench/services/configurationResolver",
"project": "vscode-workbench"
},
{
"name": "vs/workbench/services/dialogs",
"project": "vscode-workbench"
},
{
"name": "vs/workbench/services/editor",
"project": "vscode-workbench"
},
{
"name": "vs/workbench/services/extensions",
"project": "vscode-workbench"
},
{
"name": "vs/workbench/services/extensionManagement",
"project": "vscode-workbench"
},
{
"name": "vs/workbench/services/files",
"project": "vscode-workbench"
},
{
"name": "vs/workbench/services/filesConfiguration",
"project": "vscode-workbench"
},
{
"name": "vs/workbench/services/history",
"project": "vscode-workbench"
},
{
"name": "vs/workbench/services/hover",
"project": "vscode-workbench"
},
{
"name": "vs/workbench/services/log",
"project": "vscode-workbench"
},
{
"name": "vs/workbench/services/integrity",
"project": "vscode-workbench"
},
{
"name": "vs/workbench/services/keybinding",
"project": "vscode-workbench"
},
{
"name": "vs/workbench/services/lifecycle",
"project": "vscode-workbench"
},
{
"name": "vs/workbench/services/language",
"project": "vscode-workbench"
},
{
"name": "vs/workbench/services/policies",
"project": "vscode-workbench"
},
{
"name": "vs/workbench/services/progress",
"project": "vscode-workbench"
},
{
"name": "vs/workbench/services/remote",
"project": "vscode-workbench"
},
{
"name": "vs/workbench/services/search",
"project": "vscode-workbench"
},
{
"name": "vs/workbench/services/suggest",
"project": "vscode-workbench"
},
{
"name": "vs/workbench/services/textfile",
"project": "vscode-workbench"
},
{
"name": "vs/workbench/services/themes",
"project": "vscode-workbench"
},
{
"name": "vs/workbench/services/textMate",
"project": "vscode-workbench"
},
{
"name": "vs/workbench/services/workingCopy",
"project": "vscode-workbench"
},
{
"name": "vs/workbench/services/workspaces",
"project": "vscode-workbench"
},
{
"name": "vs/workbench/services/decorations",
"project": "vscode-workbench"
},
{
"name": "vs/workbench/services/label",
"project": "vscode-workbench"
},
{
"name": "vs/workbench/services/preferences",
"project": "vscode-preferences"
},
{
"name": "vs/workbench/services/notification",
"project": "vscode-workbench"
},
{
"name": "vs/workbench/services/userData",
"project": "vscode-workbench"
},
{
"name": "vs/workbench/services/userDataSync",
"project": "vscode-workbench"
},
{
"name": "vs/workbench/services/editSessions",
"project": "vscode-workbench"
},
{
"name": "vs/workbench/services/views",
"project": "vscode-workbench"
},
{
"name": "vs/workbench/contrib/timeline",
"project": "vscode-workbench"
},
{
"name": "vs/workbench/contrib/localHistory",
"project": "vscode-workbench"
},
{
"name": "vs/workbench/services/authentication",
"project": "vscode-workbench"
},
{
"name": "vs/workbench/services/extensionRecommendations",
"project": "vscode-workbench"
},
{
"name": "vs/workbench/services/gettingStarted",
"project": "vscode-workbench"
},
{
"name": "vs/workbench/services/host",
"project": "vscode-workbench"
},
{
"name": "vs/workbench/contrib/userDataProfile",
"project": "vscode-profiles"
},
{
"name": "vs/workbench/services/userDataProfile",
"project": "vscode-profiles"
},
{
"name": "vs/workbench/services/localization",
"project": "vscode-workbench"
},
{
"name": "vs/workbench/contrib/share",
"project": "vscode-workbench"
},
{
"name": "vs/workbench/contrib/accessibility",
"project": "vscode-workbench"
},
{
"name": "vs/workbench/services/issue",
"project": "vscode-workbench"
},
{
"name": "vs/workbench/services/secrets",
"project": "vscode-workbench"
},
{
"name": "vs/workbench/contrib/accountEntitlements",
"project": "vscode-workbench"
},
{
"name": "vs/workbench/contrib/authentication",
"project": "vscode-workbench"
},
{
"name": "vs/workbench/contrib/replNotebook",
"project": "vscode-workbench"
},
{
"name": "vs/workbench/contrib/list",
"project": "vscode-workbench"
},
{
"name": "vs/workbench/contrib/browserView",
"project": "vscode-workbench"
},
{
"name": "vs/workbench/contrib/dropOrPasteInto",
"project": "vscode-workbench"
},
{
"name": "vs/workbench/contrib/editTelemetry",
"project": "vscode-workbench"
},
{
"name": "vs/workbench/contrib/inlineCompletions",
"project": "vscode-workbench"
},
{
"name": "vs/workbench/contrib/mcp",
"project": "vscode-workbench"
},
{
"name": "vs/workbench/contrib/meteredConnection",
"project": "vscode-workbench"
},
{
"name": "vs/workbench/contrib/processExplorer",
"project": "vscode-workbench"
},
{
"name": "vs/workbench/contrib/remoteCodingAgents",
"project": "vscode-workbench"
},
{
"name": "vs/workbench/contrib/telemetry",
"project": "vscode-workbench"
},
{
"name": "vs/workbench/contrib/welcomeAgentSessions",
"project": "vscode-workbench"
},
{
"name": "vs/workbench/services/accounts",
"project": "vscode-workbench"
},
{
"name": "vs/workbench/services/chat",
"project": "vscode-workbench"
},
{
"name": "vs/workbench/services/request",
"project": "vscode-workbench"
}
],
"sessions": [
{
"name": "vs/sessions",
"project": "vscode-sessions"
},
{
"name": "vs/sessions/contrib/automations",
"project": "vscode-sessions"
},
{
"name": "vs/sessions/contrib/accountMenu",
"project": "vscode-sessions"
},
{
"name": "vs/sessions/contrib/agentFeedback",
"project": "vscode-sessions"
},
{
"name": "vs/sessions/contrib/providers",
"project": "vscode-sessions"
},
{
"name": "vs/sessions/contrib/providers/agentHost",
"project": "vscode-sessions"
},
{
"name": "vs/sessions/contrib/aiCustomizationTreeView",
"project": "vscode-sessions"
},
{
"name": "vs/sessions/contrib/applyCommitsToParentRepo",
"project": "vscode-sessions"
},
{
"name": "vs/sessions/contrib/changes",
"project": "vscode-sessions"
},
{
"name": "vs/sessions/contrib/chat",
"project": "vscode-sessions"
},
{
"name": "vs/sessions/contrib/providers/copilotChatSessions",
"project": "vscode-sessions"
},
{
"name": "vs/sessions/contrib/configuration",
"project": "vscode-sessions"
},
{
"name": "vs/sessions/contrib/codeReview",
"project": "vscode-sessions"
},
{
"name": "vs/sessions/contrib/fileTreeView",
"project": "vscode-sessions"
},
{
"name": "vs/sessions/contrib/files",
"project": "vscode-sessions"
},
{
"name": "vs/sessions/contrib/search",
"project": "vscode-sessions"
},
{
"name": "vs/sessions/contrib/policyBlocked",
"project": "vscode-sessions"
},
{
"name": "vs/sessions/contrib/git",
"project": "vscode-sessions"
},
{
"name": "vs/sessions/contrib/github",
"project": "vscode-sessions"
},
{
"name": "vs/sessions/contrib/layout",
"project": "vscode-sessions"
},
{
"name": "vs/sessions/contrib/logs",
"project": "vscode-sessions"
},
{
"name": "vs/sessions/contrib/providers/remoteAgentHost",
"project": "vscode-sessions"
},
{
"name": "vs/sessions/contrib/sessions",
"project": "vscode-sessions"
},
{
"name": "vs/sessions/contrib/sessionInputBanners",
"project": "vscode-sessions"
},
{
"name": "vs/sessions/contrib/terminal",
"project": "vscode-sessions"
},
{
"name": "vs/sessions/contrib/welcome",
"project": "vscode-sessions"
},
{
"name": "vs/sessions/contrib/aquarium",
"project": "vscode-sessions"
},
{
"name": "vs/sessions/contrib/chatDebug",
"project": "vscode-sessions"
},
{
"name": "vs/sessions/contrib/tunnelHost",
"project": "vscode-sessions"
},
{
"name": "vs/sessions/contrib/editor",
"project": "vscode-sessions"
},
{
"name": "vs/sessions/contrib/onboardingTours",
"project": "vscode-sessions"
}
]
}