@code-yeongyu/senpi 2026.8.19 → 2026.8.20
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +117 -0
- package/dist/cli-main.js +4 -0
- package/dist/cli-main.js.map +1 -1
- package/dist/cli.js +31 -3
- package/dist/cli.js.map +1 -1
- package/dist/compile-cache.d.ts +2 -0
- package/dist/compile-cache.d.ts.map +1 -0
- package/dist/compile-cache.js +33 -0
- package/dist/compile-cache.js.map +1 -0
- package/dist/core/agent-session.d.ts +5 -0
- package/dist/core/agent-session.d.ts.map +1 -1
- package/dist/core/agent-session.js +94 -12
- package/dist/core/agent-session.js.map +1 -1
- package/dist/core/compaction/compaction.d.ts +6 -0
- package/dist/core/compaction/compaction.d.ts.map +1 -1
- package/dist/core/compaction/compaction.js +13 -0
- package/dist/core/compaction/compaction.js.map +1 -1
- package/dist/core/cursor-exec-bridge-session.d.ts +2 -1
- package/dist/core/cursor-exec-bridge-session.d.ts.map +1 -1
- package/dist/core/cursor-exec-bridge-session.js +5 -2
- package/dist/core/cursor-exec-bridge-session.js.map +1 -1
- package/dist/core/cursor-exec-bridge.d.ts +9 -1
- package/dist/core/cursor-exec-bridge.d.ts.map +1 -1
- package/dist/core/cursor-exec-bridge.js +26 -2
- package/dist/core/cursor-exec-bridge.js.map +1 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/custom-tools.d.ts +1 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/custom-tools.d.ts.map +1 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/custom-tools.js +5 -2
- package/dist/core/extensions/builtin/claude-sdk-oauth/custom-tools.js.map +1 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/sdk-boundary.d.ts +6 -4
- package/dist/core/extensions/builtin/claude-sdk-oauth/sdk-boundary.d.ts.map +1 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/sdk-boundary.js +24 -2
- package/dist/core/extensions/builtin/claude-sdk-oauth/sdk-boundary.js.map +1 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/sdk-boundary.lazy.d.ts +39 -0
- package/dist/core/extensions/builtin/claude-sdk-oauth/sdk-boundary.lazy.d.ts.map +1 -0
- package/dist/core/extensions/builtin/claude-sdk-oauth/sdk-boundary.lazy.js +31 -0
- package/dist/core/extensions/builtin/claude-sdk-oauth/sdk-boundary.lazy.js.map +1 -0
- package/dist/core/extensions/builtin/claude-sdk-oauth/session-continuity.d.ts +2 -0
- package/dist/core/extensions/builtin/claude-sdk-oauth/session-continuity.d.ts.map +1 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/session-continuity.js +35 -0
- package/dist/core/extensions/builtin/claude-sdk-oauth/session-continuity.js.map +1 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/session-observability.d.ts +1 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/session-observability.d.ts.map +1 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/session-observability.js +1 -0
- package/dist/core/extensions/builtin/claude-sdk-oauth/session-observability.js.map +1 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/session-reattach.d.ts +8 -0
- package/dist/core/extensions/builtin/claude-sdk-oauth/session-reattach.d.ts.map +1 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/session-reattach.js +4 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/session-reattach.js.map +1 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/session-turn-attempt.d.ts.map +1 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/session-turn-attempt.js +28 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/session-turn-attempt.js.map +1 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/stream.d.ts.map +1 -1
- package/dist/core/extensions/builtin/claude-sdk-oauth/stream.js +5 -2
- package/dist/core/extensions/builtin/claude-sdk-oauth/stream.js.map +1 -1
- package/dist/core/extensions/builtin/compaction/index.d.ts.map +1 -1
- package/dist/core/extensions/builtin/compaction/index.js +5 -0
- package/dist/core/extensions/builtin/compaction/index.js.map +1 -1
- package/dist/core/extensions/builtin/compaction/log.d.ts +1 -1
- package/dist/core/extensions/builtin/compaction/log.d.ts.map +1 -1
- package/dist/core/extensions/builtin/compaction/log.js +1 -0
- package/dist/core/extensions/builtin/compaction/log.js.map +1 -1
- package/dist/core/extensions/builtin/compaction/speculative.d.ts +1 -0
- package/dist/core/extensions/builtin/compaction/speculative.d.ts.map +1 -1
- package/dist/core/extensions/builtin/compaction/speculative.js +4 -0
- package/dist/core/extensions/builtin/compaction/speculative.js.map +1 -1
- package/dist/core/extensions/builtin/config-reload/index.d.ts.map +1 -1
- package/dist/core/extensions/builtin/config-reload/index.js +13 -10
- package/dist/core/extensions/builtin/config-reload/index.js.map +1 -1
- package/dist/core/extensions/builtin/config-reload/watch-engine.d.ts +8 -1
- package/dist/core/extensions/builtin/config-reload/watch-engine.d.ts.map +1 -1
- package/dist/core/extensions/builtin/config-reload/watch-engine.js +98 -18
- package/dist/core/extensions/builtin/config-reload/watch-engine.js.map +1 -1
- package/dist/core/extensions/builtin/config-reload/watch-event-source.d.ts +1 -1
- package/dist/core/extensions/builtin/config-reload/watch-event-source.d.ts.map +1 -1
- package/dist/core/extensions/builtin/config-reload/watch-event-source.js +7 -2
- package/dist/core/extensions/builtin/config-reload/watch-event-source.js.map +1 -1
- package/dist/core/extensions/builtin/goal/elapsed-ticker.d.ts.map +1 -1
- package/dist/core/extensions/builtin/goal/elapsed-ticker.js +15 -1
- package/dist/core/extensions/builtin/goal/elapsed-ticker.js.map +1 -1
- package/dist/core/extensions/builtin/goal/index.d.ts.map +1 -1
- package/dist/core/extensions/builtin/goal/index.js +7 -22
- package/dist/core/extensions/builtin/goal/index.js.map +1 -1
- package/dist/core/extensions/builtin/goal/stale-context.d.ts +9 -0
- package/dist/core/extensions/builtin/goal/stale-context.d.ts.map +1 -0
- package/dist/core/extensions/builtin/goal/stale-context.js +11 -0
- package/dist/core/extensions/builtin/goal/stale-context.js.map +1 -0
- package/dist/core/extensions/builtin/goal/wait-ticker.d.ts +8 -0
- package/dist/core/extensions/builtin/goal/wait-ticker.d.ts.map +1 -1
- package/dist/core/extensions/builtin/goal/wait-ticker.js +37 -3
- package/dist/core/extensions/builtin/goal/wait-ticker.js.map +1 -1
- package/dist/core/extensions/builtin/mcp/index.d.ts.map +1 -1
- package/dist/core/extensions/builtin/mcp/index.js +12 -1
- package/dist/core/extensions/builtin/mcp/index.js.map +1 -1
- package/dist/core/extensions/builtin/prompt-url-widget.d.ts.map +1 -1
- package/dist/core/extensions/builtin/prompt-url-widget.js +7 -15
- package/dist/core/extensions/builtin/prompt-url-widget.js.map +1 -1
- package/dist/core/extensions/builtin/rules/ui/rules-banner.d.ts.map +1 -1
- package/dist/core/extensions/builtin/rules/ui/rules-banner.js +21 -25
- package/dist/core/extensions/builtin/rules/ui/rules-banner.js.map +1 -1
- package/dist/core/extensions/builtin/todotools/index.d.ts.map +1 -1
- package/dist/core/extensions/builtin/todotools/index.js +20 -0
- package/dist/core/extensions/builtin/todotools/index.js.map +1 -1
- package/dist/core/extensions/builtin/todotools/native-todo-mirror.d.ts +3 -0
- package/dist/core/extensions/builtin/todotools/native-todo-mirror.d.ts.map +1 -0
- package/dist/core/extensions/builtin/todotools/native-todo-mirror.js +22 -0
- package/dist/core/extensions/builtin/todotools/native-todo-mirror.js.map +1 -0
- package/dist/core/extensions/builtin/webfetch/webfetch/content.lazy.d.ts +17 -0
- package/dist/core/extensions/builtin/webfetch/webfetch/content.lazy.d.ts.map +1 -0
- package/dist/core/extensions/builtin/webfetch/webfetch/content.lazy.js +22 -0
- package/dist/core/extensions/builtin/webfetch/webfetch/content.lazy.js.map +1 -0
- package/dist/core/extensions/builtin/webfetch/webfetch/tool.js +3 -3
- package/dist/core/extensions/builtin/webfetch/webfetch/tool.js.map +1 -1
- package/dist/core/messages.d.ts +9 -2
- package/dist/core/messages.d.ts.map +1 -1
- package/dist/core/messages.js +13 -18
- package/dist/core/messages.js.map +1 -1
- package/dist/core/retry-fallback/hint-policy.d.ts +3 -2
- package/dist/core/retry-fallback/hint-policy.d.ts.map +1 -1
- package/dist/core/retry-fallback/hint-policy.js +19 -8
- package/dist/core/retry-fallback/hint-policy.js.map +1 -1
- package/dist/core/retry-fallback/settings.js.map +1 -1
- package/dist/core/session-discovery.d.ts +16 -0
- package/dist/core/session-discovery.d.ts.map +1 -0
- package/dist/core/session-discovery.js +101 -0
- package/dist/core/session-discovery.js.map +1 -0
- package/dist/core/session-manager.d.ts +2 -1
- package/dist/core/session-manager.d.ts.map +1 -1
- package/dist/core/session-manager.js +4 -170
- package/dist/core/session-manager.js.map +1 -1
- package/dist/core/session-record.d.ts +14 -0
- package/dist/core/session-record.d.ts.map +1 -0
- package/dist/core/session-record.js +47 -0
- package/dist/core/session-record.js.map +1 -0
- package/dist/core/session-summary-cache.d.ts +40 -0
- package/dist/core/session-summary-cache.d.ts.map +1 -0
- package/dist/core/session-summary-cache.js +79 -0
- package/dist/core/session-summary-cache.js.map +1 -0
- package/dist/core/session-summary-lru.d.ts +54 -0
- package/dist/core/session-summary-lru.d.ts.map +1 -0
- package/dist/core/session-summary-lru.js +72 -0
- package/dist/core/session-summary-lru.js.map +1 -0
- package/dist/core/session-summary.d.ts +29 -0
- package/dist/core/session-summary.d.ts.map +1 -0
- package/dist/core/session-summary.js +90 -0
- package/dist/core/session-summary.js.map +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/inspector-policy.d.ts +6 -0
- package/dist/inspector-policy.d.ts.map +1 -1
- package/dist/inspector-policy.js +6 -1
- package/dist/inspector-policy.js.map +1 -1
- package/dist/modes/interactive/components/earendil-announcement.d.ts.map +1 -1
- package/dist/modes/interactive/components/earendil-announcement.js +8 -8
- package/dist/modes/interactive/components/earendil-announcement.js.map +1 -1
- package/dist/modes/interactive/components/progressive-transcript-container.d.ts +72 -0
- package/dist/modes/interactive/components/progressive-transcript-container.d.ts.map +1 -0
- package/dist/modes/interactive/components/progressive-transcript-container.js +150 -0
- package/dist/modes/interactive/components/progressive-transcript-container.js.map +1 -0
- package/dist/modes/interactive/components/status-indicator.d.ts +1 -1
- package/dist/modes/interactive/components/status-indicator.d.ts.map +1 -1
- package/dist/modes/interactive/components/status-indicator.js +8 -2
- package/dist/modes/interactive/components/status-indicator.js.map +1 -1
- package/dist/modes/interactive/interactive-mode.d.ts +4 -0
- package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-mode.js +127 -65
- package/dist/modes/interactive/interactive-mode.js.map +1 -1
- package/dist/modes/interactive/split-trailing-assistant-text.d.ts +7 -0
- package/dist/modes/interactive/split-trailing-assistant-text.d.ts.map +1 -0
- package/dist/modes/interactive/split-trailing-assistant-text.js +19 -0
- package/dist/modes/interactive/split-trailing-assistant-text.js.map +1 -0
- package/dist/senpi +31 -3
- package/node_modules/@code-yeongyu/senpi-codemode/CHANGELOG.md +12 -0
- package/node_modules/@code-yeongyu/senpi-codemode/package.json +4 -4
- package/node_modules/@earendil-works/pi-agent-core/dist/agent-loop.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/agent-loop.js +38 -3
- package/node_modules/@earendil-works/pi-agent-core/dist/agent-loop.js.map +1 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/assistant-terminal-state.d.ts +8 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/assistant-terminal-state.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/assistant-terminal-state.js +25 -1
- package/node_modules/@earendil-works/pi-agent-core/dist/assistant-terminal-state.js.map +1 -1
- package/node_modules/@earendil-works/pi-agent-core/package.json +3 -3
- package/node_modules/@earendil-works/pi-ai/dist/api/cursor-agent.d.ts +2 -0
- package/node_modules/@earendil-works/pi-ai/dist/api/cursor-agent.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/api/cursor-agent.js +284 -209
- package/node_modules/@earendil-works/pi-ai/dist/api/cursor-agent.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/api/cursor-conversation-rotation.d.ts +37 -0
- package/node_modules/@earendil-works/pi-ai/dist/api/cursor-conversation-rotation.d.ts.map +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/api/cursor-conversation-rotation.js +110 -0
- package/node_modules/@earendil-works/pi-ai/dist/api/cursor-conversation-rotation.js.map +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/api/cursor-task-args.d.ts +3 -0
- package/node_modules/@earendil-works/pi-ai/dist/api/cursor-task-args.d.ts.map +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/api/cursor-task-args.js +17 -0
- package/node_modules/@earendil-works/pi-ai/dist/api/cursor-task-args.js.map +1 -0
- package/node_modules/@earendil-works/pi-ai/dist/cursor/selection-descriptor.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/cursor/selection-descriptor.js +27 -11
- package/node_modules/@earendil-works/pi-ai/dist/cursor/selection-descriptor.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/data/.manifest.json +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/data/amazon-bedrock.json +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/data/baseten.json +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/data/huggingface.json +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/data/opencode-go.json +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/data/opencode.json +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/data/openrouter.json +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/providers/data/vercel-ai-gateway.json +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/index.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/index.js +2 -0
- package/node_modules/@earendil-works/pi-ai/dist/tool-call-middleware/index.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/utils/overflow.d.ts +30 -0
- package/node_modules/@earendil-works/pi-ai/dist/utils/overflow.d.ts.map +1 -1
- package/node_modules/@earendil-works/pi-ai/dist/utils/overflow.js +33 -0
- package/node_modules/@earendil-works/pi-ai/dist/utils/overflow.js.map +1 -1
- package/node_modules/@earendil-works/pi-ai/package.json +2 -2
- package/node_modules/@earendil-works/pi-pty/package.json +1 -1
- package/node_modules/@earendil-works/pi-telemetry/package.json +1 -1
- package/node_modules/@earendil-works/pi-tui/package.json +1 -1
- package/package.json +7 -7
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/config-reload/index.ts"],"names":[],"mappings":"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","sourcesContent":["import { existsSync, lstatSync, readFileSync } from \"node:fs\";\nimport { basename, dirname, relative, resolve, sep } from \"node:path\";\nimport { bindToProviderScope } from \"@earendil-works/pi-ai/node/provider-scope\";\nimport { CONFIG_DIR_NAME, getAgentDir } from \"../../../../config.ts\";\nimport { resolvePath } from \"../../../../utils/paths.ts\";\nimport { ModelConfig } from \"../../../model-config.ts\";\nimport { parseSettingsJson, type Settings, SettingsManager, wasSelfWrite } from \"../../../settings-manager.ts\";\nimport type { ExtensionAPI, ExtensionContext, SessionStartEvent } from \"../../types.ts\";\nimport { isLoadableExtensionEntry, isScannableExtensionDirectory } from \"./extension-watch-scope.ts\";\nimport { excludeGeneratedExtensionShims } from \"./generated-shim-filter.ts\";\nimport { type ConfigReloadLogger, createConfigReloadLogger } from \"./log.ts\";\nimport {\n\tCONFIG_WATCH_CHANGED,\n\tCONFIG_WATCH_READY,\n\tCONFIG_WATCH_REGISTER,\n\tCONFIG_WATCH_REJECTED,\n\tCONFIG_WATCH_RELOADED,\n\tCONFIG_WATCH_UNREGISTER,\n\ttype ConfigWatchRegistration,\n\ttype ConfigWatchTarget,\n\tisConfigWatchRegistration,\n\tisConfigWatchUnregistration,\n\tisConfigWatchValidation,\n\tmatchesConfigWatchFilter,\n} from \"./protocol.ts\";\nimport { ReloadVetoDeferral } from \"./reload-deferral.ts\";\nimport {\n\texcludeRoutineOnlySettingsChanges,\n\tisSettingsPath,\n\tjoinConfigDir,\n\trefreshSettingsContentSnapshots,\n\tupdateSettingsContentSnapshot,\n} from \"./routine-settings.ts\";\nimport {\n\tConfigReloadWatchEngine,\n\tcreateFsWatchEventSource,\n\ttype RealChange,\n\ttype WatchClock,\n\ttype WatchEventSource,\n\ttype WatchTarget,\n} from \"./watch-engine.ts\";\n\nconst BUILTIN_REGISTRATION_ID = \"builtin\";\nconst DEFAULT_DEBOUNCE_MS = 200;\nconst COMPACTION_RECHECK_MS = 250;\nconst VETO_RECHECK_MS = 1000;\nconst CONFIG_FILE_NAMES = [\"settings.jsonc\", \"settings.json\", \"models.json\", \"keybindings.json\"] as const;\n\n/**\n * The engine applies one predicate to both file gating and directory descent, so\n * this must admit scannable directories in order to reach their entry files.\n */\nconst extensionWatchFilter =\n\t(extensionsDir: string) =>\n\t(relPath: string): boolean =>\n\t\tisLoadableExtensionEntry(extensionsDir, relPath) || isScannableExtensionDirectory(extensionsDir, relPath);\n\ntype ConfigReloadWatchSettings = {\n\treadonly settings?: boolean;\n\treadonly models?: boolean;\n\treadonly keybindings?: boolean;\n\treadonly prompts?: boolean;\n\treadonly skills?: boolean;\n\treadonly extensions?: boolean;\n};\n\ntype ConfigReloadSettingsPatch = {\n\treadonly enabled?: boolean;\n\treadonly debounceMs?: number;\n\treadonly watch?: ConfigReloadWatchSettings;\n};\n\n/** Keep config-reload's settings schema owned by the builtin while exposing it on Settings. */\ndeclare module \"../../../settings-manager.ts\" {\n\tinterface Settings {\n\t\tconfigReload?: ConfigReloadSettingsPatch;\n\t}\n}\n\ntype ResolvedConfigReloadSettings = {\n\treadonly enabled: boolean;\n\treadonly debounceMs: number;\n\treadonly watch: Required<ConfigReloadWatchSettings>;\n};\n\ntype WatchTargetInput = Omit<WatchTarget, \"id\">;\n\ntype ActiveTarget = {\n\treadonly registrationId: string;\n\treadonly target: WatchTarget;\n\t/** Presence targets rebuild the watcher set once this missing path appears. */\n\treadonly rearmOnCreation?: string;\n};\n\ntype PendingChange = {\n\treadonly registrationId: string;\n\treadonly paths: Set<string>;\n};\n\ntype ReloadHandoff = {\n\treadonly hashesAtRequest: ReadonlyMap<string, string>;\n\treadonly requestedAt: number;\n\treadonly changes: readonly { readonly registrationId: string; readonly paths: readonly string[] }[];\n};\n\n/** Session-keyed handoffs survive replacement extension factories during reload. */\nexport class ConfigReloadHandoffRegistry<T> {\n\treadonly #handoffs = new Map<string, T>();\n\n\tset(sessionHandle: string, handoff: T): void {\n\t\tthis.#handoffs.set(sessionHandle, handoff);\n\t}\n\n\ttake(sessionHandle: string): T | undefined {\n\t\tconst handoff = this.#handoffs.get(sessionHandle);\n\t\tthis.#handoffs.delete(sessionHandle);\n\t\treturn handoff;\n\t}\n\n\tdelete(sessionHandle: string): void {\n\t\tthis.#handoffs.delete(sessionHandle);\n\t}\n}\n\nconst reloadHandoffs = new ConfigReloadHandoffRegistry<ReloadHandoff>();\n\nfunction bindExternalCallback<TArgs extends unknown[], TResult>(\n\tcallback: (...args: TArgs) => TResult,\n): (...args: TArgs) => TResult {\n\ttry {\n\t\treturn bindToProviderScope(callback);\n\t} catch {\n\t\treturn callback;\n\t}\n}\n\nexport interface ConfigReloadExtensionOptions {\n\treadonly agentDir?: string;\n\treadonly subscribe?: WatchEventSource;\n\treadonly clock?: WatchClock;\n\treadonly logger?: ConfigReloadLogger;\n\t/** Test seam. Production uses the watch engine's SHA-256 implementation. */\n\treadonly hashFile?: (path: string) => string;\n}\n\n/**\n * Watch config resources and request the host's existing full reload flow.\n *\n * The optional options are test seams. Production registration uses the default\n * filesystem event source and agent directory.\n */\nexport function configReloadExtension(pi: ExtensionAPI, options: ConfigReloadExtensionOptions = {}): void {\n\tconst sessionOwned = (() => {\n\t\ttry {\n\t\t\tbindToProviderScope(() => undefined);\n\t\t\treturn true;\n\t\t} catch {\n\t\t\treturn false;\n\t\t}\n\t})();\n\tconst handoffKey = (ctx: ExtensionContext): string => (sessionOwned ? ctx.sessionManager.getSessionId() : \"classic\");\n\tconst agentDir = resolve(options.agentDir ?? getAgentDir());\n\tconst subscribe = options.subscribe ?? createFsWatchEventSource();\n\tconst logger = options.logger ?? createConfigReloadLogger(agentDir);\n\tconst registrations = new Map<string, ConfigWatchRegistration>();\n\tconst rejectedRegistrations = new Map<string, string>();\n\t/** Last-seen settings.json contents per path; the diff base for routine-key classification. */\n\tconst settingsContents = new Map<string, string>();\n\tconst eventUnsubscribes: Array<() => void> = [];\n\tconst pending = new Map<string, PendingChange>();\n\tlet engine: ConfigReloadWatchEngine | undefined;\n\tlet activeTargets: ActiveTarget[] = [];\n\tlet currentContext: ExtensionContext | undefined;\n\tlet started = false;\n\tlet tornDown = false;\n\tlet reloadInFlight = false;\n\tlet deferredNoticeShown = false;\n\tlet unavailableReloadLogged = false;\n\tlet compactionRecheck: ReturnType<typeof setTimeout> | undefined;\n\tlet vetoRecheck: ReturnType<typeof setTimeout> | undefined;\n\tconst vetoDeferral = new ReloadVetoDeferral();\n\tlet changeChain: Promise<void> = Promise.resolve();\n\n\tconst closeWatchers = (): void => {\n\t\tengine?.close();\n\t\tengine = undefined;\n\t\tactiveTargets = [];\n\t};\n\n\tconst clearCompactionRecheck = (): void => {\n\t\tif (compactionRecheck === undefined) return;\n\t\t(options.clock ?? defaultClock).clearTimeout(compactionRecheck);\n\t\tcompactionRecheck = undefined;\n\t};\n\n\tconst clearVetoRecheck = (): void => {\n\t\tif (vetoRecheck === undefined) return;\n\t\t(options.clock ?? defaultClock).clearTimeout(vetoRecheck);\n\t\tvetoRecheck = undefined;\n\t};\n\n\tconst cleanupEventListeners = (): void => {\n\t\tfor (const unsubscribe of eventUnsubscribes.splice(0)) {\n\t\t\tunsubscribe();\n\t\t}\n\t};\n\n\tconst rejectRegistration = (registrationId: string, errors: readonly string[]): void => {\n\t\tpi.events.emit(CONFIG_WATCH_REJECTED, {\n\t\t\tregistrationId,\n\t\t\tpaths: [],\n\t\t\terrors: [...errors],\n\t\t});\n\t\tlogger.warn(\"registration_rejected\", { registrationId, errorCount: errors.length });\n\t};\n\n\tconst handleRegistration = (payload: unknown): void => {\n\t\tif (!isConfigWatchRegistration(payload)) return;\n\t\tconst fingerprint = registrationFingerprint(payload);\n\t\t// A component may synchronously re-register from a CONFIG_WATCH_REJECTED\n\t\t// listener (e.g. sticky-rejection recovery). Rejected registrations are\n\t\t// never stored, so the identity guard below cannot break that recursion;\n\t\t// ignoring an identical payload after one rejection does.\n\t\tif (rejectedRegistrations.get(payload.id) === fingerprint) {\n\t\t\tlogger.debug(\"registration_rejection_suppressed\", { registrationId: payload.id });\n\t\t\treturn;\n\t\t}\n\t\tconst cwd = currentContext?.cwd ?? process.cwd();\n\t\tif (registrationHasRestrictedTarget(payload, cwd, agentDir)) {\n\t\t\trejectedRegistrations.set(payload.id, fingerprint);\n\t\t\trejectRegistration(payload.id, [\"Configuration watch target is restricted\"]);\n\t\t\treturn;\n\t\t}\n\t\trejectedRegistrations.delete(payload.id);\n\n\t\t// A component may re-emit its unchanged registration when it receives the\n\t\t// ready event from rebuildWatchers. Rebuilding for that same payload emits\n\t\t// ready again and creates an unbounded synchronous rebuild loop.\n\t\tif (registrations.get(payload.id) === payload) return;\n\t\tregistrations.set(payload.id, payload);\n\t\tpending.delete(payload.id);\n\t\tlogger.info(\"registration_added\", { id: payload.id });\n\t\tif (started && currentContext) {\n\t\t\trebuildWatchers(currentContext);\n\t\t}\n\t};\n\n\tconst handleUnregistration = (payload: unknown): void => {\n\t\tif (!isConfigWatchUnregistration(payload)) return;\n\t\trejectedRegistrations.delete(payload.id);\n\t\tif (!registrations.delete(payload.id)) return;\n\t\tpending.delete(payload.id);\n\t\tlogger.info(\"registration_removed\", { id: payload.id });\n\t\tif (started && currentContext) {\n\t\t\trebuildWatchers(currentContext);\n\t\t}\n\t};\n\n\tconst processChange = async (change: RealChange): Promise<void> => {\n\t\tif (reloadInFlight || !currentContext) return;\n\t\t// Suppression state (self-write consumption, routine-diff base) is per path,\n\t\t// so it must be resolved before grouping: a path watched by several\n\t\t// registrations would otherwise be classified once per group and reach the\n\t\t// reload flow through the later group.\n\t\tconst watchedPaths = excludeSelfWrites(\n\t\t\tchange.changedPaths,\n\t\t\tengine,\n\t\t\tagentDir,\n\t\t\tcurrentContext.cwd,\n\t\t\tlogger,\n\t\t\tsettingsContents,\n\t\t);\n\t\tconst significantPaths = excludeRoutineOnlySettingsChanges(\n\t\t\twatchedPaths,\n\t\t\tsettingsContents,\n\t\t\tagentDir,\n\t\t\tcurrentContext.cwd,\n\t\t\tlogger,\n\t\t);\n\t\tconst configPaths = excludeGeneratedExtensionShims(significantPaths, agentDir);\n\t\tfor (const path of significantPaths) {\n\t\t\tif (!configPaths.includes(path)) logger.debug(\"generated_shim_change_suppressed\", { path });\n\t\t}\n\t\tconst groups = groupChangedPaths(configPaths, activeTargets);\n\t\tconst rearmDirectoryWatch = change.created.some((path) =>\n\t\t\tactiveTargets.some((target) => target.rearmOnCreation === resolve(path)),\n\t\t);\n\t\tfor (const [registrationId, paths] of groups) {\n\t\t\tconst errors = await validateChangedPaths(registrationId, paths, registrations, agentDir, currentContext.cwd);\n\t\t\tif (errors.length > 0) {\n\t\t\t\trejectChange(currentContext, registrationId, paths, errors, logger, pi);\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\taddPending(pending, registrationId, paths);\n\t\t\tconst deferred = !canRequestReload(currentContext);\n\t\t\tpi.events.emit(CONFIG_WATCH_CHANGED, {\n\t\t\t\tregistrationId,\n\t\t\t\tpaths: [...paths],\n\t\t\t\tdeferred,\n\t\t\t});\n\t\t\tlogger.info(\"change_detected\", { registrationId, paths, deferred });\n\t\t}\n\t\tif (rearmDirectoryWatch) rebuildWatchers(currentContext);\n\t\tawait flushPending();\n\t};\n\n\tconst enqueueChange = (change: RealChange): void => {\n\t\tif (reloadInFlight) return;\n\t\tchangeChain = changeChain\n\t\t\t.then(() => processChange(change))\n\t\t\t.catch((error: unknown) => {\n\t\t\t\tlogger.error(\"watcher_error\", { path: \"config reload\", message: errorMessage(error) });\n\t\t\t});\n\t};\n\n\tconst rebuildWatchers = (ctx: ExtensionContext): void => {\n\t\tcloseWatchers();\n\t\tclearCompactionRecheck();\n\t\tconst settingsManager = SettingsManager.create(ctx.cwd, agentDir, { projectTrusted: ctx.isProjectTrusted() });\n\t\tconst settings = resolveConfigReloadSettings(settingsManager);\n\t\tif (!settings.enabled || ctx.mode === \"print\" || ctx.mode === \"json\") {\n\t\t\tpi.events.emit(CONFIG_WATCH_READY, { enabled: false });\n\t\t\treturn;\n\t\t}\n\n\t\tactiveTargets = buildWatchTargets({\n\t\t\tcwd: ctx.cwd,\n\t\t\tagentDir,\n\t\t\tprojectTrusted: ctx.isProjectTrusted(),\n\t\t\tsettings,\n\t\t\tskillPaths: settings.watch.skills ? settingsManager.getSkillPaths() : [],\n\t\t\tregistrations,\n\t\t});\n\t\tengine = new ConfigReloadWatchEngine({\n\t\t\ttargets: activeTargets.map((entry) => entry.target),\n\t\t\tsubscribe,\n\t\t\tdebounceMs: settings.debounceMs,\n\t\t\tclock: options.clock,\n\t\t\thashFile: options.hashFile,\n\t\t\tonRealChange: bindExternalCallback(enqueueChange),\n\t\t\tonError: bindExternalCallback((error, path) => {\n\t\t\t\tlogger.error(\"watcher_error\", { path, message: errorMessage(error) });\n\t\t\t}),\n\t\t});\n\t\trefreshSettingsContentSnapshots(settingsContents, agentDir, ctx.cwd);\n\t\tlogger.info(\"watcher_started\", { targetCount: activeTargets.length });\n\t\tpi.events.emit(CONFIG_WATCH_READY, { enabled: true });\n\t};\n\n\tconst flushPending = async (): Promise<void> => {\n\t\tconst ctx = currentContext;\n\t\tif (!ctx || pending.size === 0 || reloadInFlight) return;\n\t\tif (!ctx.isIdle() || ctx.hasPendingMessages()) return;\n\t\tif (ctx.isCompacting?.() ?? false) {\n\t\t\tarmCompactionRecheck();\n\t\t\treturn;\n\t\t}\n\t\tclearCompactionRecheck();\n\t\tif (!ctx.requestReload) {\n\t\t\tif (!unavailableReloadLogged) {\n\t\t\t\tunavailableReloadLogged = true;\n\t\t\t\tlogger.info(\"reload_requested\", { reason: \"requestReload unavailable\", paths: [] });\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\n\t\t// Probe the extension veto (session_before_reload) BEFORE announcing the\n\t\t// reload: a vetoed hot-reload defers quietly (one notice per distinct\n\t\t// reason) and retries on later idle edges or the veto recheck clock,\n\t\t// instead of re-notifying \"Hot-reloading:\" plus the veto warning forever.\n\t\tif (ctx.checkReloadVeto) {\n\t\t\tconst veto = await ctx.checkReloadVeto();\n\t\t\tif (currentContext !== ctx || reloadInFlight || pending.size === 0) return;\n\t\t\tif (veto.cancelled) {\n\t\t\t\tconst notice = vetoDeferral.defer(veto.reason);\n\t\t\t\tif (notice) ctx.ui.notify(notice, \"info\");\n\t\t\t\tlogger.info(\"reload_deferred\", { reason: veto.reason ?? \"extension veto\" });\n\t\t\t\tarmVetoRecheck();\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t\tclearVetoRecheck();\n\t\tvetoDeferral.reset();\n\n\t\tconst changes = pendingChanges(pending);\n\t\tconst paths = uniquePaths(changes.flatMap((change) => change.paths));\n\t\treloadInFlight = true;\n\t\ttornDown = false;\n\t\treloadHandoffs.set(handoffKey(ctx), {\n\t\t\thashesAtRequest: engine?.getBaselineSnapshot() ?? new Map<string, string>(),\n\t\t\trequestedAt: Date.now(),\n\t\t\tchanges,\n\t\t});\n\t\tctx.ui.notify(`Hot-reloading: ${formatPaths(paths)}`, \"info\");\n\t\tlogger.info(\"reload_requested\", { reason: \"config changed\", paths });\n\n\t\ttry {\n\t\t\tawait ctx.requestReload();\n\t\t\tif (!tornDown) {\n\t\t\t\treloadInFlight = false;\n\t\t\t\treloadHandoffs.delete(handoffKey(ctx));\n\t\t\t}\n\t\t} catch (error) {\n\t\t\treloadInFlight = false;\n\t\t\treloadHandoffs.delete(handoffKey(ctx));\n\t\t\tlogger.error(\"watcher_error\", { path: \"reload\", message: errorMessage(error) });\n\t\t}\n\t};\n\n\tconst armCompactionRecheck = (): void => {\n\t\tif (compactionRecheck !== undefined) return;\n\t\tconst clock = options.clock ?? defaultClock;\n\t\tcompactionRecheck = clock.setTimeout(() => {\n\t\t\tcompactionRecheck = undefined;\n\t\t\tvoid flushPending();\n\t\t}, COMPACTION_RECHECK_MS);\n\t};\n\n\tconst armVetoRecheck = (): void => {\n\t\tif (vetoRecheck !== undefined) return;\n\t\tconst clock = options.clock ?? defaultClock;\n\t\tvetoRecheck = clock.setTimeout(() => {\n\t\t\tvetoRecheck = undefined;\n\t\t\tvoid flushPending();\n\t\t}, VETO_RECHECK_MS);\n\t};\n\n\tconst processReloadHandoff = async (event: SessionStartEvent, ctx: ExtensionContext): Promise<void> => {\n\t\tif (event.reason !== \"reload\") return;\n\t\tconst handoff = reloadHandoffs.take(handoffKey(ctx));\n\t\tif (!handoff) return;\n\t\tconst paths = uniquePaths(handoff.changes.flatMap((change) => change.paths));\n\t\tfor (const change of handoff.changes) {\n\t\t\tpi.events.emit(CONFIG_WATCH_RELOADED, {\n\t\t\t\tregistrationId: change.registrationId,\n\t\t\t\tpaths: [...change.paths],\n\t\t\t});\n\t\t}\n\t\tctx.ui.notify(`Hot-reloaded: ${formatPaths(paths)}`, \"info\");\n\t\tlogger.info(\"reload_completed\", { durationMs: Math.max(0, Date.now() - handoff.requestedAt) });\n\n\t\tconst changedPaths = compareSnapshots(handoff.hashesAtRequest, engine?.getBaselineSnapshot() ?? new Map());\n\t\tif (changedPaths.length > 0) {\n\t\t\tenqueueChange({ changedPaths, created: [], deleted: [] });\n\t\t\tawait changeChain;\n\t\t}\n\t};\n\n\teventUnsubscribes.push(pi.events.on(CONFIG_WATCH_REGISTER, handleRegistration));\n\teventUnsubscribes.push(pi.events.on(CONFIG_WATCH_UNREGISTER, handleUnregistration));\n\n\tpi.on(\"session_start\", async (event, ctx) => {\n\t\ttornDown = false;\n\t\tstarted = true;\n\t\tcurrentContext = ctx;\n\t\trebuildWatchers(ctx);\n\t\tawait processReloadHandoff(event, ctx);\n\t});\n\n\tpi.on(\"agent_end\", async (_event, ctx) => {\n\t\tcurrentContext = ctx;\n\t\tawait flushPending();\n\t});\n\tpi.on(\"agent_settled\", async (_event, ctx) => {\n\t\tcurrentContext = ctx;\n\t\tawait flushPending();\n\t});\n\tpi.on(\"project_trust\", () => {\n\t\tif (currentContext) rebuildWatchers(currentContext);\n\t\treturn { trusted: \"undecided\" };\n\t});\n\tpi.on(\"session_shutdown\", (event) => {\n\t\tconst closingContext = currentContext;\n\t\ttornDown = true;\n\t\tstarted = false;\n\t\tcurrentContext = undefined;\n\t\tcloseWatchers();\n\t\tclearCompactionRecheck();\n\t\tclearVetoRecheck();\n\t\tvetoDeferral.reset();\n\t\tcleanupEventListeners();\n\t\tpending.clear();\n\t\tif (event.reason !== \"reload\" && closingContext) reloadHandoffs.delete(handoffKey(closingContext));\n\t});\n\n\tfunction canRequestReload(ctx: ExtensionContext): boolean {\n\t\treturn (\n\t\t\tctx.isIdle() &&\n\t\t\t!ctx.hasPendingMessages() &&\n\t\t\t!(ctx.isCompacting?.() ?? false) &&\n\t\t\tctx.requestReload !== undefined\n\t\t);\n\t}\n\n\tfunction armDeferredNotice(ctx: ExtensionContext): void {\n\t\tif (deferredNoticeShown || pending.size === 0 || !ctx.requestReload) return;\n\t\tdeferredNoticeShown = true;\n\t\tctx.ui.notify(\"Config changed; reloading when idle\", \"info\");\n\t}\n\n\tfunction rejectChange(\n\t\tctx: ExtensionContext,\n\t\tregistrationId: string,\n\t\tpaths: readonly string[],\n\t\terrors: readonly string[],\n\t\tactiveLogger: ConfigReloadLogger,\n\t\tapi: ExtensionAPI,\n\t): void {\n\t\tctx.ui.notify(`Config change rejected: ${errors.join(\"; \")}`, \"error\");\n\t\tapi.events.emit(CONFIG_WATCH_REJECTED, { registrationId, paths: [...paths], errors: [...errors] });\n\t\tactiveLogger.warn(\"validation_rejected\", { registrationId, errorCount: errors.length });\n\t}\n\n\tfunction addPending(changes: Map<string, PendingChange>, registrationId: string, paths: readonly string[]): void {\n\t\tconst pendingChange = changes.get(registrationId) ?? { registrationId, paths: new Set<string>() };\n\t\tfor (const path of paths) pendingChange.paths.add(path);\n\t\tchanges.set(registrationId, pendingChange);\n\t\tif (!canRequestReload(currentContext!)) armDeferredNotice(currentContext!);\n\t}\n}\n\nexport default configReloadExtension;\n\nconst defaultClock: WatchClock = {\n\tsetTimeout: (callback, delayMs) => setTimeout(callback, delayMs),\n\tclearTimeout: (timer) => clearTimeout(timer),\n};\n\nfunction resolveConfigReloadSettings(settingsManager: SettingsManager): ResolvedConfigReloadSettings {\n\tconst global = readConfigReloadPatch(settingsManager.getGlobalSettings());\n\tconst project = readConfigReloadPatch(settingsManager.getProjectSettings());\n\treturn {\n\t\tenabled: project.enabled ?? global.enabled ?? true,\n\t\tdebounceMs: project.debounceMs ?? global.debounceMs ?? DEFAULT_DEBOUNCE_MS,\n\t\twatch: {\n\t\t\tsettings: project.watch?.settings ?? global.watch?.settings ?? true,\n\t\t\tmodels: project.watch?.models ?? global.watch?.models ?? true,\n\t\t\tkeybindings: project.watch?.keybindings ?? global.watch?.keybindings ?? true,\n\t\t\tprompts: project.watch?.prompts ?? global.watch?.prompts ?? true,\n\t\t\tskills: project.watch?.skills ?? global.watch?.skills ?? true,\n\t\t\textensions: project.watch?.extensions ?? global.watch?.extensions ?? true,\n\t\t},\n\t};\n}\n\nfunction readConfigReloadPatch(settings: Settings): ConfigReloadSettingsPatch {\n\tconst candidate: unknown = settings.configReload;\n\tif (!isPlainObject(candidate)) return {};\n\tconst watch = isPlainObject(candidate.watch) ? candidate.watch : undefined;\n\treturn {\n\t\tenabled: typeof candidate.enabled === \"boolean\" ? candidate.enabled : undefined,\n\t\tdebounceMs: validDebounce(candidate.debounceMs),\n\t\twatch: watch\n\t\t\t? {\n\t\t\t\t\tsettings: booleanOrUndefined(watch.settings),\n\t\t\t\t\tmodels: booleanOrUndefined(watch.models),\n\t\t\t\t\tkeybindings: booleanOrUndefined(watch.keybindings),\n\t\t\t\t\tprompts: booleanOrUndefined(watch.prompts),\n\t\t\t\t\tskills: booleanOrUndefined(watch.skills),\n\t\t\t\t\textensions: booleanOrUndefined(watch.extensions),\n\t\t\t\t}\n\t\t\t: undefined,\n\t};\n}\n\nfunction validDebounce(value: unknown): number | undefined {\n\tif (typeof value !== \"number\" || !Number.isFinite(value) || value < 0) return undefined;\n\treturn Math.floor(value);\n}\n\nfunction booleanOrUndefined(value: unknown): boolean | undefined {\n\treturn typeof value === \"boolean\" ? value : undefined;\n}\n\nfunction buildWatchTargets(options: {\n\treadonly cwd: string;\n\treadonly agentDir: string;\n\treadonly projectTrusted: boolean;\n\treadonly settings: ResolvedConfigReloadSettings;\n\treadonly skillPaths: readonly string[];\n\treadonly registrations: ReadonlyMap<string, ConfigWatchRegistration>;\n}): ActiveTarget[] {\n\tconst targets: ActiveTarget[] = [];\n\tconst addBuiltin = (id: string, target: WatchTargetInput, rearmOnCreation?: string): void => {\n\t\ttargets.push({ registrationId: BUILTIN_REGISTRATION_ID, target: { ...target, id }, rearmOnCreation });\n\t};\n\tconst addBuiltinDirectory = (id: string, path: string, filter?: (relPath: string) => boolean): void => {\n\t\tconst resourcePath = resolve(path);\n\t\tif (isExistingDirectory(resourcePath)) {\n\t\t\taddBuiltin(\n\t\t\t\tid,\n\t\t\t\tfilter\n\t\t\t\t\t? { kind: \"dir-recursive\", path: resourcePath, filter }\n\t\t\t\t\t: { kind: \"dir-recursive\", path: resourcePath },\n\t\t\t);\n\t\t\treturn;\n\t\t}\n\t\tconst watchPath = nearestExistingDirectory(dirname(resourcePath));\n\t\tconst firstMissingSegment = relative(watchPath, resourcePath).split(sep)[0] || basename(resourcePath);\n\t\tconst createdPath = resolve(watchPath, firstMissingSegment);\n\t\taddBuiltin(\n\t\t\t`${id}-presence`,\n\t\t\t{\n\t\t\t\tkind: \"dir\",\n\t\t\t\tpath: watchPath,\n\t\t\t\tallowList: [firstMissingSegment],\n\t\t\t},\n\t\t\tcreatedPath,\n\t\t);\n\t};\n\tconst { cwd, agentDir, projectTrusted, settings } = options;\n\tconst projectDir = joinConfigDir(cwd);\n\n\tconst jsonAllowList = CONFIG_FILE_NAMES.filter((name) => {\n\t\tif (name === \"settings.json\" || name === \"settings.jsonc\") return settings.watch.settings;\n\t\tif (name === \"models.json\") return settings.watch.models;\n\t\treturn settings.watch.keybindings;\n\t});\n\tif (jsonAllowList.length > 0) {\n\t\taddBuiltin(\"builtin-global-json\", { kind: \"dir\", path: agentDir, allowList: jsonAllowList });\n\t}\n\tif (settings.watch.prompts) {\n\t\taddBuiltinDirectory(\"builtin-global-prompts\", resolve(agentDir, \"prompts\"));\n\t}\n\tif (settings.watch.extensions) {\n\t\tconst globalExtensionsDir = resolve(agentDir, \"extensions\");\n\t\taddBuiltinDirectory(\"builtin-global-extensions\", globalExtensionsDir, extensionWatchFilter(globalExtensionsDir));\n\t}\n\tif (settings.watch.skills) {\n\t\tfor (const [index, skillPath] of options.skillPaths.entries()) {\n\t\t\tconst target = targetForSkillPath(resolvePath(skillPath, cwd, { trim: true }));\n\t\t\tif (target.kind === \"dir-recursive\") {\n\t\t\t\taddBuiltinDirectory(`builtin-skill-${index}`, target.path);\n\t\t\t} else {\n\t\t\t\taddBuiltin(`builtin-skill-${index}`, target);\n\t\t\t}\n\t\t}\n\t}\n\n\tif (projectTrusted) {\n\t\tconst projectDirExists = isExistingDirectory(projectDir);\n\t\tconst projectWatchEnabled = Object.values(settings.watch).some(Boolean);\n\t\tif (projectWatchEnabled) {\n\t\t\taddBuiltin(\n\t\t\t\t\"builtin-project-presence\",\n\t\t\t\t{ kind: \"dir\", path: cwd, allowList: [CONFIG_DIR_NAME] },\n\t\t\t\tprojectDirExists ? undefined : projectDir,\n\t\t\t);\n\t\t}\n\t\tif (projectDirExists) {\n\t\t\tif (settings.watch.settings) {\n\t\t\t\taddBuiltin(\"builtin-project-settings\", {\n\t\t\t\t\tkind: \"dir\",\n\t\t\t\t\tpath: projectDir,\n\t\t\t\t\tallowList: [\"settings.jsonc\", \"settings.json\"],\n\t\t\t\t});\n\t\t\t}\n\t\t\tif (settings.watch.prompts) {\n\t\t\t\taddBuiltinDirectory(\"builtin-project-prompts\", resolve(projectDir, \"prompts\"));\n\t\t\t}\n\t\t\tif (settings.watch.skills) {\n\t\t\t\taddBuiltinDirectory(\"builtin-project-skills\", resolve(projectDir, \"skills\"));\n\t\t\t}\n\t\t\tif (settings.watch.extensions) {\n\t\t\t\tconst projectExtensionsDir = resolve(projectDir, \"extensions\");\n\t\t\t\taddBuiltinDirectory(\n\t\t\t\t\t\"builtin-project-extensions\",\n\t\t\t\t\tprojectExtensionsDir,\n\t\t\t\t\textensionWatchFilter(projectExtensionsDir),\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t}\n\n\tfor (const registration of options.registrations.values()) {\n\t\tfor (const [index, target] of registration.targets.entries()) {\n\t\t\tconst path = resolvePath(target.path, cwd, { trim: true });\n\t\t\tconst watchTarget = externalTargetToWatchTarget(path, target.kind, target.filterGlobs);\n\t\t\ttargets.push({\n\t\t\t\tregistrationId: registration.id,\n\t\t\t\ttarget: { ...watchTarget, id: `external-${registration.id}-${index}` },\n\t\t\t});\n\t\t}\n\t}\n\treturn targets;\n}\n\nfunction isExistingDirectory(path: string): boolean {\n\ttry {\n\t\treturn lstatSync(path).isDirectory();\n\t} catch {\n\t\treturn false;\n\t}\n}\n\nfunction nearestExistingDirectory(path: string): string {\n\tlet candidate = resolve(path);\n\twhile (!isExistingDirectory(candidate)) {\n\t\tconst parent = dirname(candidate);\n\t\tif (parent === candidate) return candidate;\n\t\tcandidate = parent;\n\t}\n\treturn candidate;\n}\n\nfunction targetForSkillPath(path: string): WatchTargetInput {\n\ttry {\n\t\tif (lstatSync(path).isFile()) {\n\t\t\treturn { kind: \"dir\", path: dirname(path), allowList: [basename(path)] };\n\t\t}\n\t} catch {\n\t\t// A missing configured skill path is treated as a directory so it becomes watchable when present.\n\t}\n\treturn { kind: \"dir-recursive\", path };\n}\n\nfunction externalTargetToWatchTarget(\n\tpath: string,\n\tkind: \"file\" | \"dir\",\n\tfilterGlobs: readonly string[] | undefined,\n): WatchTargetInput {\n\tif (kind === \"file\") {\n\t\tconst name = basename(path);\n\t\treturn {\n\t\t\tkind: \"dir\",\n\t\t\tpath: dirname(path),\n\t\t\tallowList: [name],\n\t\t\tfilter: (relativePath) => relativePath === name && matchesConfigWatchFilter(relativePath, filterGlobs),\n\t\t};\n\t}\n\treturn {\n\t\tkind: \"dir-recursive\",\n\t\tpath,\n\t\t// Literal filters also declare explicitly watched dot-directories. Without\n\t\t// this, an external ancestor target filtered to \".omo\" drops its creation\n\t\t// event before the validator can inspect the new config beneath it.\n\t\tallowList: literalFilterNames(filterGlobs),\n\t\tfilter: (relativePath) => matchesConfigWatchFilter(relativePath, filterGlobs),\n\t};\n}\n\nfunction literalFilterNames(filterGlobs: readonly string[] | undefined): string[] | undefined {\n\tif (!filterGlobs) return undefined;\n\t// A root-anchored glob names a literal path relative to the watch root, so\n\t// strip the anchor before the separator check rejects it.\n\tconst literalNames = filterGlobs\n\t\t.map((filterGlob) => (filterGlob.startsWith(\"/\") ? filterGlob.slice(1) : filterGlob))\n\t\t.filter((filterGlob) => !filterGlob.includes(\"*\") && !filterGlob.includes(\"/\") && !filterGlob.includes(\"\\\\\\\\\"));\n\treturn literalNames.length > 0 ? literalNames : undefined;\n}\n\nfunction groupChangedPaths(paths: readonly string[], targets: readonly ActiveTarget[]): Map<string, string[]> {\n\tconst groups = new Map<string, string[]>();\n\tfor (const path of paths) {\n\t\tlet matched = false;\n\t\tfor (const activeTarget of targets) {\n\t\t\tif (!targetMatchesPath(activeTarget.target, path)) continue;\n\t\t\tconst group = groups.get(activeTarget.registrationId) ?? [];\n\t\t\tif (!group.includes(path)) group.push(path);\n\t\t\tgroups.set(activeTarget.registrationId, group);\n\t\t\tmatched = true;\n\t\t}\n\t\tif (!matched) {\n\t\t\tconst group = groups.get(BUILTIN_REGISTRATION_ID) ?? [];\n\t\t\tgroup.push(path);\n\t\t\tgroups.set(BUILTIN_REGISTRATION_ID, group);\n\t\t}\n\t}\n\treturn groups;\n}\n\nfunction targetMatchesPath(target: WatchTarget, path: string): boolean {\n\tconst relativePath = relative(resolve(target.path), resolve(path));\n\tif (relativePath === \"..\" || relativePath.startsWith(`..${sep}`)) return false;\n\tif (target.kind === \"dir\" && relativePath.includes(sep)) return false;\n\tif (\n\t\ttarget.allowList &&\n\t\t!target.allowList.some((allowed) => relativePath === allowed || relativePath.startsWith(`${allowed}${sep}`))\n\t) {\n\t\treturn false;\n\t}\n\treturn target.filter?.(relativePath) ?? true;\n}\n\nfunction excludeSelfWrites(\n\tpaths: readonly string[],\n\tengine: ConfigReloadWatchEngine | undefined,\n\tagentDir: string,\n\tcwd: string,\n\tlogger: ConfigReloadLogger,\n\tsettingsContents: Map<string, string>,\n): string[] {\n\tconst snapshot = engine?.getBaselineSnapshot();\n\treturn paths.filter((path) => {\n\t\tif (!isSettingsPath(path, agentDir, cwd)) return true;\n\t\tconst hash = snapshot?.get(path);\n\t\tif (hash === undefined || !wasSelfWrite(path, hash)) return true;\n\t\tlogger.debug(\"self_write_suppressed\", { path });\n\t\t// Advance the routine-diff base so a later external change is not\n\t\t// polluted by this session's own just-applied write.\n\t\tupdateSettingsContentSnapshot(settingsContents, path);\n\t\treturn false;\n\t});\n}\n\nasync function validateChangedPaths(\n\tregistrationId: string,\n\tpaths: readonly string[],\n\tregistrations: ReadonlyMap<string, ConfigWatchRegistration>,\n\tagentDir: string,\n\tcwd: string,\n): Promise<string[]> {\n\tif (registrationId === BUILTIN_REGISTRATION_ID) {\n\t\treturn validateBuiltinPaths(paths, agentDir, cwd);\n\t}\n\tconst registration = registrations.get(registrationId);\n\tif (!registration?.validate) return [];\n\ttry {\n\t\tconst result = await registration.validate(paths);\n\t\tif (!isConfigWatchValidation(result)) return [\"Configuration validator returned an invalid result\"];\n\t\treturn result.ok ? [] : result.errors;\n\t} catch (error) {\n\t\treturn [errorMessage(error)];\n\t}\n}\n\nfunction validateBuiltinPaths(paths: readonly string[], agentDir: string, cwd: string): string[] {\n\tconst errors: string[] = [];\n\tfor (const path of paths) {\n\t\tif (isSettingsPath(path, agentDir, cwd)) {\n\t\t\tconst error = validateSettingsFile(path);\n\t\t\tif (error) errors.push(error);\n\t\t\tcontinue;\n\t\t}\n\t\tif (resolve(path) === resolve(agentDir, \"models.json\")) {\n\t\t\tconst error = ModelConfig.loadSync(path).getError();\n\t\t\tif (error) errors.push(error);\n\t\t\tcontinue;\n\t\t}\n\t\tif (resolve(path) === resolve(agentDir, \"keybindings.json\")) {\n\t\t\tconst error = validateKeybindingsFile(path);\n\t\t\tif (error) errors.push(error);\n\t\t}\n\t}\n\treturn errors;\n}\n\nfunction validateSettingsFile(path: string): string | undefined {\n\tif (!existsSync(path)) return undefined;\n\ttry {\n\t\tconst parsed = parseSettingsJson(readFileSync(path, \"utf-8\"));\n\t\t// Keep validation aligned with SettingsManager's loader and migrations without duplicating migration rules.\n\t\tSettingsManager.inMemory(parsed as Partial<Settings>);\n\t\treturn undefined;\n\t} catch (error) {\n\t\treturn `Invalid ${basename(path)}: ${errorMessage(error)}`;\n\t}\n}\n\nfunction validateKeybindingsFile(path: string): string | undefined {\n\tif (!existsSync(path)) return undefined;\n\ttry {\n\t\tconst parsed: unknown = JSON.parse(readFileSync(path, \"utf-8\"));\n\t\tif (!isPlainObject(parsed)) return \"keybindings.json must contain an object\";\n\t\tfor (const value of Object.values(parsed)) {\n\t\t\tif (typeof value === \"string\") continue;\n\t\t\tif (Array.isArray(value) && value.every((entry) => typeof entry === \"string\")) continue;\n\t\t\treturn \"keybindings.json bindings must be strings or string arrays\";\n\t\t}\n\t\treturn undefined;\n\t} catch (error) {\n\t\treturn `Invalid keybindings.json: ${errorMessage(error)}`;\n\t}\n}\n\nfunction registrationFingerprint(registration: ConfigWatchRegistration): string {\n\treturn JSON.stringify({\n\t\tid: registration.id,\n\t\tdisplayName: registration.displayName,\n\t\ttargets: registration.targets.map((target) => ({\n\t\t\tpath: target.path,\n\t\t\tkind: target.kind,\n\t\t\tfilterGlobs: target.filterGlobs ?? null,\n\t\t})),\n\t\thasValidate: registration.validate !== undefined,\n\t});\n}\n\nfunction isProtectedAgentPath(candidate: string, agentDir: string): boolean {\n\tconst authPath = resolve(agentDir, \"auth.json\");\n\tconst sessionsPath = resolve(agentDir, \"sessions\");\n\tconst logsPath = resolve(agentDir, \"logs\");\n\treturn isWithin(candidate, authPath) || isWithin(candidate, sessionsPath) || isWithin(candidate, logsPath);\n}\n\n// A watch rooted exactly at the agent directory is safe when every filter is\n// root-anchored (a leading `/` matches only an immediate child of the watch root,\n// never a nested path) and none of those anchored names resolves into a protected\n// path. Unfiltered targets, unanchored filters, and any protected filter stay\n// fail-closed.\nfunction isSafeFilteredAgentDirTarget(target: ConfigWatchTarget, resolvedPath: string, agentDir: string): boolean {\n\tif (target.kind !== \"dir\" || resolvedPath !== resolve(agentDir)) return false;\n\tconst filterGlobs = target.filterGlobs;\n\tif (!filterGlobs || filterGlobs.length === 0) return false;\n\treturn filterGlobs.every((glob) => {\n\t\tif (!glob.startsWith(\"/\")) return false;\n\t\treturn !isProtectedAgentPath(resolve(resolvedPath, glob.slice(1)), agentDir);\n\t});\n}\n\nfunction registrationHasRestrictedTarget(\n\tregistration: ConfigWatchRegistration,\n\tcwd: string,\n\tagentDir: string,\n): boolean {\n\tconst authPath = resolve(agentDir, \"auth.json\");\n\tconst sessionsPath = resolve(agentDir, \"sessions\");\n\tconst logsPath = resolve(agentDir, \"logs\");\n\treturn registration.targets.some((target) => {\n\t\tconst path = resolvePath(target.path, cwd, { trim: true });\n\t\tif (isSafeFilteredAgentDirTarget(target, path, agentDir)) return false;\n\t\treturn (\n\t\t\tisWithin(path, authPath) ||\n\t\t\tisWithin(authPath, path) ||\n\t\t\tisWithin(path, sessionsPath) ||\n\t\t\tisWithin(path, logsPath)\n\t\t);\n\t});\n}\n\nfunction pendingChanges(pending: ReadonlyMap<string, PendingChange>): Array<{\n\treadonly registrationId: string;\n\treadonly paths: readonly string[];\n}> {\n\treturn [...pending.values()].map((change) => ({\n\t\tregistrationId: change.registrationId,\n\t\tpaths: [...change.paths].sort(),\n\t}));\n}\n\nfunction compareSnapshots(previous: ReadonlyMap<string, string>, next: ReadonlyMap<string, string>): string[] {\n\tconst changed = new Set<string>();\n\tfor (const [path, hash] of next) {\n\t\tif (previous.get(path) !== hash) changed.add(path);\n\t}\n\tfor (const path of previous.keys()) {\n\t\tif (!next.has(path)) changed.add(path);\n\t}\n\treturn [...changed].sort();\n}\n\nfunction uniquePaths(paths: readonly string[]): string[] {\n\treturn [...new Set(paths)].sort();\n}\n\nfunction isWithin(path: string, root: string): boolean {\n\treturn path === root || path.startsWith(`${root}${sep}`);\n}\n\nfunction isPlainObject(value: unknown): value is Record<string, unknown> {\n\tif (typeof value !== \"object\" || value === null || Array.isArray(value)) return false;\n\tconst prototype = Object.getPrototypeOf(value);\n\treturn prototype === Object.prototype || prototype === null;\n}\n\nfunction errorMessage(error: unknown): string {\n\treturn error instanceof Error ? error.message : String(error);\n}\n\nfunction formatPaths(paths: readonly string[]): string {\n\treturn paths.length === 0 ? \"configuration\" : paths.join(\", \");\n}\n"]}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/config-reload/index.ts"],"names":[],"mappings":"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","sourcesContent":["import { existsSync, lstatSync, readFileSync } from \"node:fs\";\nimport { basename, dirname, relative, resolve, sep } from \"node:path\";\nimport { bindToProviderScope } from \"@earendil-works/pi-ai/node/provider-scope\";\nimport { CONFIG_DIR_NAME, getAgentDir } from \"../../../../config.ts\";\nimport { resolvePath } from \"../../../../utils/paths.ts\";\nimport { ModelConfig } from \"../../../model-config.ts\";\nimport { parseSettingsJson, type Settings, SettingsManager, wasSelfWrite } from \"../../../settings-manager.ts\";\nimport type { ExtensionAPI, ExtensionContext, SessionStartEvent } from \"../../types.ts\";\nimport { isLoadableExtensionEntry, isScannableExtensionDirectory } from \"./extension-watch-scope.ts\";\nimport { excludeGeneratedExtensionShims } from \"./generated-shim-filter.ts\";\nimport { type ConfigReloadLogger, createConfigReloadLogger } from \"./log.ts\";\nimport {\n\tCONFIG_WATCH_CHANGED,\n\tCONFIG_WATCH_READY,\n\tCONFIG_WATCH_REGISTER,\n\tCONFIG_WATCH_REJECTED,\n\tCONFIG_WATCH_RELOADED,\n\tCONFIG_WATCH_UNREGISTER,\n\ttype ConfigWatchRegistration,\n\ttype ConfigWatchTarget,\n\tisConfigWatchRegistration,\n\tisConfigWatchUnregistration,\n\tisConfigWatchValidation,\n\tmatchesConfigWatchFilter,\n} from \"./protocol.ts\";\nimport { ReloadVetoDeferral } from \"./reload-deferral.ts\";\nimport {\n\texcludeRoutineOnlySettingsChanges,\n\tisSettingsPath,\n\tjoinConfigDir,\n\trefreshSettingsContentSnapshots,\n\tupdateSettingsContentSnapshot,\n} from \"./routine-settings.ts\";\nimport {\n\tConfigReloadWatchEngine,\n\tcreateFsWatchEventSource,\n\ttype RealChange,\n\ttype WatchClock,\n\ttype WatchEventSource,\n\ttype WatchTarget,\n} from \"./watch-engine.ts\";\n\nconst BUILTIN_REGISTRATION_ID = \"builtin\";\nconst DEFAULT_DEBOUNCE_MS = 200;\nconst COMPACTION_RECHECK_MS = 250;\nconst VETO_RECHECK_MS = 1000;\nconst CONFIG_FILE_NAMES = [\"settings.jsonc\", \"settings.json\", \"models.json\", \"keybindings.json\"] as const;\n\n/**\n * The engine applies one predicate to both file gating and directory descent, so\n * this must admit scannable directories in order to reach their entry files.\n */\nconst extensionWatchFilter =\n\t(extensionsDir: string) =>\n\t(relPath: string): boolean =>\n\t\tisLoadableExtensionEntry(extensionsDir, relPath) || isScannableExtensionDirectory(extensionsDir, relPath);\n\ntype ConfigReloadWatchSettings = {\n\treadonly settings?: boolean;\n\treadonly models?: boolean;\n\treadonly keybindings?: boolean;\n\treadonly prompts?: boolean;\n\treadonly skills?: boolean;\n\treadonly extensions?: boolean;\n};\n\ntype ConfigReloadSettingsPatch = {\n\treadonly enabled?: boolean;\n\treadonly debounceMs?: number;\n\treadonly watch?: ConfigReloadWatchSettings;\n};\n\n/** Keep config-reload's settings schema owned by the builtin while exposing it on Settings. */\ndeclare module \"../../../settings-manager.ts\" {\n\tinterface Settings {\n\t\tconfigReload?: ConfigReloadSettingsPatch;\n\t}\n}\n\ntype ResolvedConfigReloadSettings = {\n\treadonly enabled: boolean;\n\treadonly debounceMs: number;\n\treadonly watch: Required<ConfigReloadWatchSettings>;\n};\n\ntype WatchTargetInput = Omit<WatchTarget, \"id\">;\n\ntype ActiveTarget = {\n\treadonly registrationId: string;\n\treadonly target: WatchTarget;\n\t/** Presence targets rebuild the watcher set once this missing path appears. */\n\treadonly rearmOnCreation?: string;\n};\n\ntype PendingChange = {\n\treadonly registrationId: string;\n\treadonly paths: Set<string>;\n};\n\ntype ReloadHandoff = {\n\treadonly hashesAtRequest: ReadonlyMap<string, string>;\n\treadonly settingsContentsAtRequest: ReadonlyMap<string, string>;\n\treadonly requestedAt: number;\n\treadonly changes: readonly { readonly registrationId: string; readonly paths: readonly string[] }[];\n};\n\n/** Session-keyed handoffs survive replacement extension factories during reload. */\nexport class ConfigReloadHandoffRegistry<T> {\n\treadonly #handoffs = new Map<string, T>();\n\n\tset(sessionHandle: string, handoff: T): void {\n\t\tthis.#handoffs.set(sessionHandle, handoff);\n\t}\n\n\ttake(sessionHandle: string): T | undefined {\n\t\tconst handoff = this.#handoffs.get(sessionHandle);\n\t\tthis.#handoffs.delete(sessionHandle);\n\t\treturn handoff;\n\t}\n\n\tdelete(sessionHandle: string): void {\n\t\tthis.#handoffs.delete(sessionHandle);\n\t}\n}\n\nconst reloadHandoffs = new ConfigReloadHandoffRegistry<ReloadHandoff>();\n\nfunction bindExternalCallback<TArgs extends unknown[], TResult>(\n\tcallback: (...args: TArgs) => TResult,\n): (...args: TArgs) => TResult {\n\ttry {\n\t\treturn bindToProviderScope(callback);\n\t} catch {\n\t\treturn callback;\n\t}\n}\n\nexport interface ConfigReloadExtensionOptions {\n\treadonly agentDir?: string;\n\treadonly subscribe?: WatchEventSource;\n\treadonly clock?: WatchClock;\n\treadonly logger?: ConfigReloadLogger;\n\t/** Test seam. Production uses the watch engine's SHA-256 implementation. */\n\treadonly hashFile?: (path: string) => string;\n}\n\n/**\n * Watch config resources and request the host's existing full reload flow.\n *\n * The optional options are test seams. Production registration uses the default\n * filesystem event source and agent directory.\n */\nexport function configReloadExtension(pi: ExtensionAPI, options: ConfigReloadExtensionOptions = {}): void {\n\tconst sessionOwned = (() => {\n\t\ttry {\n\t\t\tbindToProviderScope(() => undefined);\n\t\t\treturn true;\n\t\t} catch {\n\t\t\treturn false;\n\t\t}\n\t})();\n\tconst handoffKey = (ctx: ExtensionContext): string => (sessionOwned ? ctx.sessionManager.getSessionId() : \"classic\");\n\tconst agentDir = resolve(options.agentDir ?? getAgentDir());\n\tconst subscribe = options.subscribe ?? createFsWatchEventSource();\n\tconst logger = options.logger ?? createConfigReloadLogger(agentDir);\n\tconst registrations = new Map<string, ConfigWatchRegistration>();\n\tconst rejectedRegistrations = new Map<string, string>();\n\t/** Last-seen settings.json contents per path; the diff base for routine-key classification. */\n\tconst settingsContents = new Map<string, string>();\n\tconst eventUnsubscribes: Array<() => void> = [];\n\tconst pending = new Map<string, PendingChange>();\n\tlet engine: ConfigReloadWatchEngine | undefined;\n\tlet activeTargets: ActiveTarget[] = [];\n\tlet currentContext: ExtensionContext | undefined;\n\tlet started = false;\n\tlet reloadInFlight = false;\n\tlet deferredNoticeShown = false;\n\tlet unavailableReloadLogged = false;\n\tlet compactionRecheck: ReturnType<typeof setTimeout> | undefined;\n\tlet vetoRecheck: ReturnType<typeof setTimeout> | undefined;\n\tconst vetoDeferral = new ReloadVetoDeferral();\n\tlet changeChain: Promise<void> = Promise.resolve();\n\n\t// The engine goes inert the moment close() is called; its unsubscribe loop can\n\t// take seconds per watcher, and session_shutdown is awaited by the reload flow.\n\tconst closeWatchers = (): void => {\n\t\tengine?.close().catch((error: unknown) => {\n\t\t\tlogger.error(\"watcher_error\", { path: \"watcher teardown\", message: errorMessage(error) });\n\t\t});\n\t\tengine = undefined;\n\t\tactiveTargets = [];\n\t};\n\n\tconst clearCompactionRecheck = (): void => {\n\t\tif (compactionRecheck === undefined) return;\n\t\t(options.clock ?? defaultClock).clearTimeout(compactionRecheck);\n\t\tcompactionRecheck = undefined;\n\t};\n\n\tconst clearVetoRecheck = (): void => {\n\t\tif (vetoRecheck === undefined) return;\n\t\t(options.clock ?? defaultClock).clearTimeout(vetoRecheck);\n\t\tvetoRecheck = undefined;\n\t};\n\n\tconst cleanupEventListeners = (): void => {\n\t\tfor (const unsubscribe of eventUnsubscribes.splice(0)) {\n\t\t\tunsubscribe();\n\t\t}\n\t};\n\n\tconst rejectRegistration = (registrationId: string, errors: readonly string[]): void => {\n\t\tpi.events.emit(CONFIG_WATCH_REJECTED, {\n\t\t\tregistrationId,\n\t\t\tpaths: [],\n\t\t\terrors: [...errors],\n\t\t});\n\t\tlogger.warn(\"registration_rejected\", { registrationId, errorCount: errors.length });\n\t};\n\n\tconst handleRegistration = (payload: unknown): void => {\n\t\tif (!isConfigWatchRegistration(payload)) return;\n\t\tconst fingerprint = registrationFingerprint(payload);\n\t\t// A component may synchronously re-register from a CONFIG_WATCH_REJECTED\n\t\t// listener (e.g. sticky-rejection recovery). Rejected registrations are\n\t\t// never stored, so the identity guard below cannot break that recursion;\n\t\t// ignoring an identical payload after one rejection does.\n\t\tif (rejectedRegistrations.get(payload.id) === fingerprint) {\n\t\t\tlogger.debug(\"registration_rejection_suppressed\", { registrationId: payload.id });\n\t\t\treturn;\n\t\t}\n\t\tconst cwd = currentContext?.cwd ?? process.cwd();\n\t\tif (registrationHasRestrictedTarget(payload, cwd, agentDir)) {\n\t\t\trejectedRegistrations.set(payload.id, fingerprint);\n\t\t\trejectRegistration(payload.id, [\"Configuration watch target is restricted\"]);\n\t\t\treturn;\n\t\t}\n\t\trejectedRegistrations.delete(payload.id);\n\n\t\t// A component may re-emit its unchanged registration when it receives the\n\t\t// ready event from rebuildWatchers. Rebuilding for that same payload emits\n\t\t// ready again and creates an unbounded synchronous rebuild loop.\n\t\tif (registrations.get(payload.id) === payload) return;\n\t\tregistrations.set(payload.id, payload);\n\t\tpending.delete(payload.id);\n\t\tlogger.info(\"registration_added\", { id: payload.id });\n\t\tif (started && currentContext) {\n\t\t\trebuildWatchers(currentContext);\n\t\t}\n\t};\n\n\tconst handleUnregistration = (payload: unknown): void => {\n\t\tif (!isConfigWatchUnregistration(payload)) return;\n\t\trejectedRegistrations.delete(payload.id);\n\t\tif (!registrations.delete(payload.id)) return;\n\t\tpending.delete(payload.id);\n\t\tlogger.info(\"registration_removed\", { id: payload.id });\n\t\tif (started && currentContext) {\n\t\t\trebuildWatchers(currentContext);\n\t\t}\n\t};\n\n\tconst processChange = async (change: RealChange): Promise<void> => {\n\t\tif (reloadInFlight || !currentContext) return;\n\t\t// Suppression state (self-write consumption, routine-diff base) is per path,\n\t\t// so it must be resolved before grouping: a path watched by several\n\t\t// registrations would otherwise be classified once per group and reach the\n\t\t// reload flow through the later group.\n\t\tconst watchedPaths = excludeSelfWrites(\n\t\t\tchange.changedPaths,\n\t\t\tengine,\n\t\t\tagentDir,\n\t\t\tcurrentContext.cwd,\n\t\t\tlogger,\n\t\t\tsettingsContents,\n\t\t);\n\t\tconst significantPaths = excludeRoutineOnlySettingsChanges(\n\t\t\twatchedPaths,\n\t\t\tsettingsContents,\n\t\t\tagentDir,\n\t\t\tcurrentContext.cwd,\n\t\t\tlogger,\n\t\t);\n\t\tconst configPaths = excludeGeneratedExtensionShims(significantPaths, agentDir);\n\t\tfor (const path of significantPaths) {\n\t\t\tif (!configPaths.includes(path)) logger.debug(\"generated_shim_change_suppressed\", { path });\n\t\t}\n\t\tconst groups = groupChangedPaths(configPaths, activeTargets);\n\t\tconst rearmDirectoryWatch = change.created.some((path) =>\n\t\t\tactiveTargets.some((target) => target.rearmOnCreation === resolve(path)),\n\t\t);\n\t\tfor (const [registrationId, paths] of groups) {\n\t\t\tconst errors = await validateChangedPaths(registrationId, paths, registrations, agentDir, currentContext.cwd);\n\t\t\tif (errors.length > 0) {\n\t\t\t\trejectChange(currentContext, registrationId, paths, errors, logger, pi);\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\taddPending(pending, registrationId, paths);\n\t\t\tconst deferred = !canRequestReload(currentContext);\n\t\t\tpi.events.emit(CONFIG_WATCH_CHANGED, {\n\t\t\t\tregistrationId,\n\t\t\t\tpaths: [...paths],\n\t\t\t\tdeferred,\n\t\t\t});\n\t\t\tlogger.info(\"change_detected\", { registrationId, paths, deferred });\n\t\t}\n\t\tif (rearmDirectoryWatch) rebuildWatchers(currentContext);\n\t\tawait flushPending();\n\t};\n\n\tconst enqueueChange = (change: RealChange): void => {\n\t\tif (reloadInFlight) return;\n\t\tchangeChain = changeChain\n\t\t\t.then(() => processChange(change))\n\t\t\t.catch((error: unknown) => {\n\t\t\t\tlogger.error(\"watcher_error\", { path: \"config reload\", message: errorMessage(error) });\n\t\t\t});\n\t};\n\n\tconst rebuildWatchers = (ctx: ExtensionContext): void => {\n\t\tcloseWatchers();\n\t\tclearCompactionRecheck();\n\t\tconst settingsManager = SettingsManager.create(ctx.cwd, agentDir, { projectTrusted: ctx.isProjectTrusted() });\n\t\tconst settings = resolveConfigReloadSettings(settingsManager);\n\t\tif (!settings.enabled || ctx.mode === \"print\" || ctx.mode === \"json\") {\n\t\t\tpi.events.emit(CONFIG_WATCH_READY, { enabled: false });\n\t\t\treturn;\n\t\t}\n\n\t\tactiveTargets = buildWatchTargets({\n\t\t\tcwd: ctx.cwd,\n\t\t\tagentDir,\n\t\t\tprojectTrusted: ctx.isProjectTrusted(),\n\t\t\tsettings,\n\t\t\tskillPaths: settings.watch.skills ? settingsManager.getSkillPaths() : [],\n\t\t\tregistrations,\n\t\t});\n\t\tengine = new ConfigReloadWatchEngine({\n\t\t\ttargets: activeTargets.map((entry) => entry.target),\n\t\t\tsubscribe,\n\t\t\tdebounceMs: settings.debounceMs,\n\t\t\tclock: options.clock,\n\t\t\thashFile: options.hashFile,\n\t\t\tonRealChange: bindExternalCallback(enqueueChange),\n\t\t\tonError: bindExternalCallback((error, path) => {\n\t\t\t\tlogger.error(\"watcher_error\", { path, message: errorMessage(error) });\n\t\t\t}),\n\t\t});\n\t\trefreshSettingsContentSnapshots(settingsContents, agentDir, ctx.cwd);\n\t\tlogger.info(\"watcher_started\", { targetCount: activeTargets.length });\n\t\tpi.events.emit(CONFIG_WATCH_READY, { enabled: true });\n\t};\n\n\tconst flushPending = async (): Promise<void> => {\n\t\tconst ctx = currentContext;\n\t\tif (!ctx || pending.size === 0 || reloadInFlight) return;\n\t\tif (!ctx.isIdle() || ctx.hasPendingMessages()) return;\n\t\tif (ctx.isCompacting?.() ?? false) {\n\t\t\tarmCompactionRecheck();\n\t\t\treturn;\n\t\t}\n\t\tclearCompactionRecheck();\n\t\tif (!ctx.requestReload) {\n\t\t\tif (!unavailableReloadLogged) {\n\t\t\t\tunavailableReloadLogged = true;\n\t\t\t\tlogger.info(\"reload_requested\", { reason: \"requestReload unavailable\", paths: [] });\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\n\t\t// Probe the extension veto (session_before_reload) BEFORE announcing the\n\t\t// reload: a vetoed hot-reload defers quietly (one notice per distinct\n\t\t// reason) and retries on later idle edges or the veto recheck clock,\n\t\t// instead of re-notifying \"Hot-reloading:\" plus the veto warning forever.\n\t\tif (ctx.checkReloadVeto) {\n\t\t\tconst veto = await ctx.checkReloadVeto();\n\t\t\tif (currentContext !== ctx || reloadInFlight || pending.size === 0) return;\n\t\t\tif (veto.cancelled) {\n\t\t\t\tconst notice = vetoDeferral.defer(veto.reason);\n\t\t\t\tif (notice) ctx.ui.notify(notice, \"info\");\n\t\t\t\tlogger.info(\"reload_deferred\", { reason: veto.reason ?? \"extension veto\" });\n\t\t\t\tarmVetoRecheck();\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t\tclearVetoRecheck();\n\t\tvetoDeferral.reset();\n\n\t\tconst changes = pendingChanges(pending);\n\t\tconst paths = uniquePaths(changes.flatMap((change) => change.paths));\n\t\treloadInFlight = true;\n\t\treloadHandoffs.set(handoffKey(ctx), {\n\t\t\thashesAtRequest: engine?.getBaselineSnapshot() ?? new Map<string, string>(),\n\t\t\tsettingsContentsAtRequest: new Map(settingsContents),\n\t\t\trequestedAt: Date.now(),\n\t\t\tchanges,\n\t\t});\n\t\tctx.ui.notify(`Hot-reloading: ${formatPaths(paths)}`, \"info\");\n\t\tlogger.info(\"reload_requested\", { reason: \"config changed\", paths });\n\n\t\tconst handoffKeyForReload = handoffKey(ctx);\n\t\ttry {\n\t\t\tawait ctx.requestReload();\n\t\t\treloadInFlight = false;\n\t\t\treloadHandoffs.delete(handoffKeyForReload);\n\t\t} catch (error) {\n\t\t\treloadInFlight = false;\n\t\t\treloadHandoffs.delete(handoffKeyForReload);\n\t\t\tlogger.error(\"watcher_error\", { path: \"reload\", message: errorMessage(error) });\n\t\t}\n\t};\n\n\tconst armCompactionRecheck = (): void => {\n\t\tif (compactionRecheck !== undefined) return;\n\t\tconst clock = options.clock ?? defaultClock;\n\t\tcompactionRecheck = clock.setTimeout(() => {\n\t\t\tcompactionRecheck = undefined;\n\t\t\tvoid flushPending();\n\t\t}, COMPACTION_RECHECK_MS);\n\t};\n\n\tconst armVetoRecheck = (): void => {\n\t\tif (vetoRecheck !== undefined) return;\n\t\tconst clock = options.clock ?? defaultClock;\n\t\tvetoRecheck = clock.setTimeout(() => {\n\t\t\tvetoRecheck = undefined;\n\t\t\tvoid flushPending();\n\t\t}, VETO_RECHECK_MS);\n\t};\n\n\tconst processReloadHandoff = async (event: SessionStartEvent, ctx: ExtensionContext): Promise<void> => {\n\t\tif (event.reason !== \"reload\") return;\n\t\tconst handoff = reloadHandoffs.take(handoffKey(ctx));\n\t\tif (!handoff) return;\n\t\tconst paths = uniquePaths(handoff.changes.flatMap((change) => change.paths));\n\t\tfor (const change of handoff.changes) {\n\t\t\tpi.events.emit(CONFIG_WATCH_RELOADED, {\n\t\t\t\tregistrationId: change.registrationId,\n\t\t\t\tpaths: [...change.paths],\n\t\t\t});\n\t\t}\n\t\tctx.ui.notify(`Hot-reloaded: ${formatPaths(paths)}`, \"info\");\n\t\tlogger.info(\"reload_completed\", { durationMs: Math.max(0, Date.now() - handoff.requestedAt) });\n\n\t\tconst changedPaths = compareSnapshots(handoff.hashesAtRequest, engine?.getBaselineSnapshot() ?? new Map());\n\t\tif (changedPaths.length > 0) {\n\t\t\tsettingsContents.clear();\n\t\t\tfor (const [path, content] of handoff.settingsContentsAtRequest) settingsContents.set(path, content);\n\t\t\tenqueueChange({ changedPaths, created: [], deleted: [] });\n\t\t\tawait changeChain;\n\t\t}\n\t};\n\n\teventUnsubscribes.push(pi.events.on(CONFIG_WATCH_REGISTER, handleRegistration));\n\teventUnsubscribes.push(pi.events.on(CONFIG_WATCH_UNREGISTER, handleUnregistration));\n\n\tpi.on(\"session_start\", async (event, ctx) => {\n\t\tstarted = true;\n\t\tcurrentContext = ctx;\n\t\trebuildWatchers(ctx);\n\t\tawait processReloadHandoff(event, ctx);\n\t});\n\n\tpi.on(\"agent_end\", async (_event, ctx) => {\n\t\tcurrentContext = ctx;\n\t\tawait flushPending();\n\t});\n\tpi.on(\"agent_settled\", async (_event, ctx) => {\n\t\tcurrentContext = ctx;\n\t\tawait flushPending();\n\t});\n\tpi.on(\"project_trust\", () => {\n\t\tif (currentContext) rebuildWatchers(currentContext);\n\t\treturn { trusted: \"undecided\" };\n\t});\n\tpi.on(\"session_shutdown\", (event) => {\n\t\tconst closingContext = currentContext;\n\t\tstarted = false;\n\t\tcurrentContext = undefined;\n\t\tcloseWatchers();\n\t\tclearCompactionRecheck();\n\t\tclearVetoRecheck();\n\t\tvetoDeferral.reset();\n\t\tcleanupEventListeners();\n\t\tpending.clear();\n\t\tif (event.reason !== \"reload\" && closingContext) reloadHandoffs.delete(handoffKey(closingContext));\n\t});\n\n\tfunction canRequestReload(ctx: ExtensionContext): boolean {\n\t\treturn (\n\t\t\tctx.isIdle() &&\n\t\t\t!ctx.hasPendingMessages() &&\n\t\t\t!(ctx.isCompacting?.() ?? false) &&\n\t\t\tctx.requestReload !== undefined\n\t\t);\n\t}\n\n\tfunction armDeferredNotice(ctx: ExtensionContext): void {\n\t\tif (deferredNoticeShown || pending.size === 0 || !ctx.requestReload) return;\n\t\tdeferredNoticeShown = true;\n\t\tctx.ui.notify(\"Config changed; reloading when idle\", \"info\");\n\t}\n\n\tfunction rejectChange(\n\t\tctx: ExtensionContext,\n\t\tregistrationId: string,\n\t\tpaths: readonly string[],\n\t\terrors: readonly string[],\n\t\tactiveLogger: ConfigReloadLogger,\n\t\tapi: ExtensionAPI,\n\t): void {\n\t\tctx.ui.notify(`Config change rejected: ${errors.join(\"; \")}`, \"error\");\n\t\tapi.events.emit(CONFIG_WATCH_REJECTED, { registrationId, paths: [...paths], errors: [...errors] });\n\t\tactiveLogger.warn(\"validation_rejected\", { registrationId, errorCount: errors.length });\n\t}\n\n\tfunction addPending(changes: Map<string, PendingChange>, registrationId: string, paths: readonly string[]): void {\n\t\tconst pendingChange = changes.get(registrationId) ?? { registrationId, paths: new Set<string>() };\n\t\tfor (const path of paths) pendingChange.paths.add(path);\n\t\tchanges.set(registrationId, pendingChange);\n\t\tif (!canRequestReload(currentContext!)) armDeferredNotice(currentContext!);\n\t}\n}\n\nexport default configReloadExtension;\n\nconst defaultClock: WatchClock = {\n\tsetTimeout: (callback, delayMs) => setTimeout(callback, delayMs),\n\tclearTimeout: (timer) => clearTimeout(timer),\n};\n\nfunction resolveConfigReloadSettings(settingsManager: SettingsManager): ResolvedConfigReloadSettings {\n\tconst global = readConfigReloadPatch(settingsManager.getGlobalSettings());\n\tconst project = readConfigReloadPatch(settingsManager.getProjectSettings());\n\treturn {\n\t\tenabled: project.enabled ?? global.enabled ?? true,\n\t\tdebounceMs: project.debounceMs ?? global.debounceMs ?? DEFAULT_DEBOUNCE_MS,\n\t\twatch: {\n\t\t\tsettings: project.watch?.settings ?? global.watch?.settings ?? true,\n\t\t\tmodels: project.watch?.models ?? global.watch?.models ?? true,\n\t\t\tkeybindings: project.watch?.keybindings ?? global.watch?.keybindings ?? true,\n\t\t\tprompts: project.watch?.prompts ?? global.watch?.prompts ?? true,\n\t\t\tskills: project.watch?.skills ?? global.watch?.skills ?? true,\n\t\t\textensions: project.watch?.extensions ?? global.watch?.extensions ?? true,\n\t\t},\n\t};\n}\n\nfunction readConfigReloadPatch(settings: Settings): ConfigReloadSettingsPatch {\n\tconst candidate: unknown = settings.configReload;\n\tif (!isPlainObject(candidate)) return {};\n\tconst watch = isPlainObject(candidate.watch) ? candidate.watch : undefined;\n\treturn {\n\t\tenabled: typeof candidate.enabled === \"boolean\" ? candidate.enabled : undefined,\n\t\tdebounceMs: validDebounce(candidate.debounceMs),\n\t\twatch: watch\n\t\t\t? {\n\t\t\t\t\tsettings: booleanOrUndefined(watch.settings),\n\t\t\t\t\tmodels: booleanOrUndefined(watch.models),\n\t\t\t\t\tkeybindings: booleanOrUndefined(watch.keybindings),\n\t\t\t\t\tprompts: booleanOrUndefined(watch.prompts),\n\t\t\t\t\tskills: booleanOrUndefined(watch.skills),\n\t\t\t\t\textensions: booleanOrUndefined(watch.extensions),\n\t\t\t\t}\n\t\t\t: undefined,\n\t};\n}\n\nfunction validDebounce(value: unknown): number | undefined {\n\tif (typeof value !== \"number\" || !Number.isFinite(value) || value < 0) return undefined;\n\treturn Math.floor(value);\n}\n\nfunction booleanOrUndefined(value: unknown): boolean | undefined {\n\treturn typeof value === \"boolean\" ? value : undefined;\n}\n\nfunction buildWatchTargets(options: {\n\treadonly cwd: string;\n\treadonly agentDir: string;\n\treadonly projectTrusted: boolean;\n\treadonly settings: ResolvedConfigReloadSettings;\n\treadonly skillPaths: readonly string[];\n\treadonly registrations: ReadonlyMap<string, ConfigWatchRegistration>;\n}): ActiveTarget[] {\n\tconst targets: ActiveTarget[] = [];\n\tconst addBuiltin = (id: string, target: WatchTargetInput, rearmOnCreation?: string): void => {\n\t\ttargets.push({ registrationId: BUILTIN_REGISTRATION_ID, target: { ...target, id }, rearmOnCreation });\n\t};\n\tconst addBuiltinDirectory = (id: string, path: string, filter?: (relPath: string) => boolean): void => {\n\t\tconst resourcePath = resolve(path);\n\t\tif (isExistingDirectory(resourcePath)) {\n\t\t\taddBuiltin(\n\t\t\t\tid,\n\t\t\t\tfilter\n\t\t\t\t\t? { kind: \"dir-recursive\", path: resourcePath, filter }\n\t\t\t\t\t: { kind: \"dir-recursive\", path: resourcePath },\n\t\t\t);\n\t\t\treturn;\n\t\t}\n\t\tconst watchPath = nearestExistingDirectory(dirname(resourcePath));\n\t\tconst firstMissingSegment = relative(watchPath, resourcePath).split(sep)[0] || basename(resourcePath);\n\t\tconst createdPath = resolve(watchPath, firstMissingSegment);\n\t\taddBuiltin(\n\t\t\t`${id}-presence`,\n\t\t\t{\n\t\t\t\tkind: \"dir\",\n\t\t\t\tpath: watchPath,\n\t\t\t\tallowList: [firstMissingSegment],\n\t\t\t},\n\t\t\tcreatedPath,\n\t\t);\n\t};\n\tconst { cwd, agentDir, projectTrusted, settings } = options;\n\tconst projectDir = joinConfigDir(cwd);\n\n\tconst jsonAllowList = CONFIG_FILE_NAMES.filter((name) => {\n\t\tif (name === \"settings.json\" || name === \"settings.jsonc\") return settings.watch.settings;\n\t\tif (name === \"models.json\") return settings.watch.models;\n\t\treturn settings.watch.keybindings;\n\t});\n\tif (jsonAllowList.length > 0) {\n\t\taddBuiltin(\"builtin-global-json\", { kind: \"dir\", path: agentDir, allowList: jsonAllowList });\n\t}\n\tif (settings.watch.prompts) {\n\t\taddBuiltinDirectory(\"builtin-global-prompts\", resolve(agentDir, \"prompts\"));\n\t}\n\tif (settings.watch.extensions) {\n\t\tconst globalExtensionsDir = resolve(agentDir, \"extensions\");\n\t\taddBuiltinDirectory(\"builtin-global-extensions\", globalExtensionsDir, extensionWatchFilter(globalExtensionsDir));\n\t}\n\tif (settings.watch.skills) {\n\t\tfor (const [index, skillPath] of options.skillPaths.entries()) {\n\t\t\tconst target = targetForSkillPath(resolvePath(skillPath, cwd, { trim: true }));\n\t\t\tif (target.kind === \"dir-recursive\") {\n\t\t\t\taddBuiltinDirectory(`builtin-skill-${index}`, target.path);\n\t\t\t} else {\n\t\t\t\taddBuiltin(`builtin-skill-${index}`, target);\n\t\t\t}\n\t\t}\n\t}\n\n\tif (projectTrusted) {\n\t\tconst projectDirExists = isExistingDirectory(projectDir);\n\t\tconst projectWatchEnabled = Object.values(settings.watch).some(Boolean);\n\t\tif (projectWatchEnabled) {\n\t\t\taddBuiltin(\n\t\t\t\t\"builtin-project-presence\",\n\t\t\t\t{ kind: \"dir\", path: cwd, allowList: [CONFIG_DIR_NAME] },\n\t\t\t\tprojectDirExists ? undefined : projectDir,\n\t\t\t);\n\t\t}\n\t\tif (projectDirExists) {\n\t\t\tif (settings.watch.settings) {\n\t\t\t\taddBuiltin(\"builtin-project-settings\", {\n\t\t\t\t\tkind: \"dir\",\n\t\t\t\t\tpath: projectDir,\n\t\t\t\t\tallowList: [\"settings.jsonc\", \"settings.json\"],\n\t\t\t\t});\n\t\t\t}\n\t\t\tif (settings.watch.prompts) {\n\t\t\t\taddBuiltinDirectory(\"builtin-project-prompts\", resolve(projectDir, \"prompts\"));\n\t\t\t}\n\t\t\tif (settings.watch.skills) {\n\t\t\t\taddBuiltinDirectory(\"builtin-project-skills\", resolve(projectDir, \"skills\"));\n\t\t\t}\n\t\t\tif (settings.watch.extensions) {\n\t\t\t\tconst projectExtensionsDir = resolve(projectDir, \"extensions\");\n\t\t\t\taddBuiltinDirectory(\n\t\t\t\t\t\"builtin-project-extensions\",\n\t\t\t\t\tprojectExtensionsDir,\n\t\t\t\t\textensionWatchFilter(projectExtensionsDir),\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t}\n\n\tfor (const registration of options.registrations.values()) {\n\t\tfor (const [index, target] of registration.targets.entries()) {\n\t\t\tconst path = resolvePath(target.path, cwd, { trim: true });\n\t\t\tconst watchTarget = externalTargetToWatchTarget(path, target.kind, target.filterGlobs);\n\t\t\ttargets.push({\n\t\t\t\tregistrationId: registration.id,\n\t\t\t\ttarget: { ...watchTarget, id: `external-${registration.id}-${index}` },\n\t\t\t});\n\t\t}\n\t}\n\treturn targets;\n}\n\nfunction isExistingDirectory(path: string): boolean {\n\ttry {\n\t\treturn lstatSync(path).isDirectory();\n\t} catch {\n\t\treturn false;\n\t}\n}\n\nfunction nearestExistingDirectory(path: string): string {\n\tlet candidate = resolve(path);\n\twhile (!isExistingDirectory(candidate)) {\n\t\tconst parent = dirname(candidate);\n\t\tif (parent === candidate) return candidate;\n\t\tcandidate = parent;\n\t}\n\treturn candidate;\n}\n\nfunction targetForSkillPath(path: string): WatchTargetInput {\n\ttry {\n\t\tif (lstatSync(path).isFile()) {\n\t\t\treturn { kind: \"dir\", path: dirname(path), allowList: [basename(path)] };\n\t\t}\n\t} catch {\n\t\t// A missing configured skill path is treated as a directory so it becomes watchable when present.\n\t}\n\treturn { kind: \"dir-recursive\", path };\n}\n\nfunction externalTargetToWatchTarget(\n\tpath: string,\n\tkind: \"file\" | \"dir\",\n\tfilterGlobs: readonly string[] | undefined,\n): WatchTargetInput {\n\tif (kind === \"file\") {\n\t\tconst name = basename(path);\n\t\treturn {\n\t\t\tkind: \"dir\",\n\t\t\tpath: dirname(path),\n\t\t\tallowList: [name],\n\t\t\tfilter: (relativePath) => relativePath === name && matchesConfigWatchFilter(relativePath, filterGlobs),\n\t\t};\n\t}\n\treturn {\n\t\tkind: \"dir-recursive\",\n\t\tpath,\n\t\t// Literal filters also declare explicitly watched dot-directories. Without\n\t\t// this, an external ancestor target filtered to \".omo\" drops its creation\n\t\t// event before the validator can inspect the new config beneath it.\n\t\tallowList: literalFilterNames(filterGlobs),\n\t\tfilter: (relativePath) => matchesConfigWatchFilter(relativePath, filterGlobs),\n\t};\n}\n\nfunction literalFilterNames(filterGlobs: readonly string[] | undefined): string[] | undefined {\n\tif (!filterGlobs) return undefined;\n\t// A root-anchored glob names a literal path relative to the watch root, so\n\t// strip the anchor before the separator check rejects it.\n\tconst literalNames = filterGlobs\n\t\t.map((filterGlob) => (filterGlob.startsWith(\"/\") ? filterGlob.slice(1) : filterGlob))\n\t\t.filter((filterGlob) => !filterGlob.includes(\"*\") && !filterGlob.includes(\"/\") && !filterGlob.includes(\"\\\\\\\\\"));\n\treturn literalNames.length > 0 ? literalNames : undefined;\n}\n\nfunction groupChangedPaths(paths: readonly string[], targets: readonly ActiveTarget[]): Map<string, string[]> {\n\tconst groups = new Map<string, string[]>();\n\tfor (const path of paths) {\n\t\tlet matched = false;\n\t\tfor (const activeTarget of targets) {\n\t\t\tif (!targetMatchesPath(activeTarget.target, path)) continue;\n\t\t\tconst group = groups.get(activeTarget.registrationId) ?? [];\n\t\t\tif (!group.includes(path)) group.push(path);\n\t\t\tgroups.set(activeTarget.registrationId, group);\n\t\t\tmatched = true;\n\t\t}\n\t\tif (!matched) {\n\t\t\tconst group = groups.get(BUILTIN_REGISTRATION_ID) ?? [];\n\t\t\tgroup.push(path);\n\t\t\tgroups.set(BUILTIN_REGISTRATION_ID, group);\n\t\t}\n\t}\n\treturn groups;\n}\n\nfunction targetMatchesPath(target: WatchTarget, path: string): boolean {\n\tconst relativePath = relative(resolve(target.path), resolve(path));\n\tif (relativePath === \"..\" || relativePath.startsWith(`..${sep}`)) return false;\n\tif (target.kind === \"dir\" && relativePath.includes(sep)) return false;\n\tif (\n\t\ttarget.allowList &&\n\t\t!target.allowList.some((allowed) => relativePath === allowed || relativePath.startsWith(`${allowed}${sep}`))\n\t) {\n\t\treturn false;\n\t}\n\treturn target.filter?.(relativePath) ?? true;\n}\n\nfunction excludeSelfWrites(\n\tpaths: readonly string[],\n\tengine: ConfigReloadWatchEngine | undefined,\n\tagentDir: string,\n\tcwd: string,\n\tlogger: ConfigReloadLogger,\n\tsettingsContents: Map<string, string>,\n): string[] {\n\tconst snapshot = engine?.getBaselineSnapshot();\n\treturn paths.filter((path) => {\n\t\tif (!isSettingsPath(path, agentDir, cwd)) return true;\n\t\tconst hash = snapshot?.get(path);\n\t\tif (hash === undefined || !wasSelfWrite(path, hash)) return true;\n\t\tlogger.debug(\"self_write_suppressed\", { path });\n\t\t// Advance the routine-diff base so a later external change is not\n\t\t// polluted by this session's own just-applied write.\n\t\tupdateSettingsContentSnapshot(settingsContents, path);\n\t\treturn false;\n\t});\n}\n\nasync function validateChangedPaths(\n\tregistrationId: string,\n\tpaths: readonly string[],\n\tregistrations: ReadonlyMap<string, ConfigWatchRegistration>,\n\tagentDir: string,\n\tcwd: string,\n): Promise<string[]> {\n\tif (registrationId === BUILTIN_REGISTRATION_ID) {\n\t\treturn validateBuiltinPaths(paths, agentDir, cwd);\n\t}\n\tconst registration = registrations.get(registrationId);\n\tif (!registration?.validate) return [];\n\ttry {\n\t\tconst result = await registration.validate(paths);\n\t\tif (!isConfigWatchValidation(result)) return [\"Configuration validator returned an invalid result\"];\n\t\treturn result.ok ? [] : result.errors;\n\t} catch (error) {\n\t\treturn [errorMessage(error)];\n\t}\n}\n\nfunction validateBuiltinPaths(paths: readonly string[], agentDir: string, cwd: string): string[] {\n\tconst errors: string[] = [];\n\tfor (const path of paths) {\n\t\tif (isSettingsPath(path, agentDir, cwd)) {\n\t\t\tconst error = validateSettingsFile(path);\n\t\t\tif (error) errors.push(error);\n\t\t\tcontinue;\n\t\t}\n\t\tif (resolve(path) === resolve(agentDir, \"models.json\")) {\n\t\t\tconst error = ModelConfig.loadSync(path).getError();\n\t\t\tif (error) errors.push(error);\n\t\t\tcontinue;\n\t\t}\n\t\tif (resolve(path) === resolve(agentDir, \"keybindings.json\")) {\n\t\t\tconst error = validateKeybindingsFile(path);\n\t\t\tif (error) errors.push(error);\n\t\t}\n\t}\n\treturn errors;\n}\n\nfunction validateSettingsFile(path: string): string | undefined {\n\tif (!existsSync(path)) return undefined;\n\ttry {\n\t\tconst parsed = parseSettingsJson(readFileSync(path, \"utf-8\"));\n\t\t// Keep validation aligned with SettingsManager's loader and migrations without duplicating migration rules.\n\t\tSettingsManager.inMemory(parsed as Partial<Settings>);\n\t\treturn undefined;\n\t} catch (error) {\n\t\treturn `Invalid ${basename(path)}: ${errorMessage(error)}`;\n\t}\n}\n\nfunction validateKeybindingsFile(path: string): string | undefined {\n\tif (!existsSync(path)) return undefined;\n\ttry {\n\t\tconst parsed: unknown = JSON.parse(readFileSync(path, \"utf-8\"));\n\t\tif (!isPlainObject(parsed)) return \"keybindings.json must contain an object\";\n\t\tfor (const value of Object.values(parsed)) {\n\t\t\tif (typeof value === \"string\") continue;\n\t\t\tif (Array.isArray(value) && value.every((entry) => typeof entry === \"string\")) continue;\n\t\t\treturn \"keybindings.json bindings must be strings or string arrays\";\n\t\t}\n\t\treturn undefined;\n\t} catch (error) {\n\t\treturn `Invalid keybindings.json: ${errorMessage(error)}`;\n\t}\n}\n\nfunction registrationFingerprint(registration: ConfigWatchRegistration): string {\n\treturn JSON.stringify({\n\t\tid: registration.id,\n\t\tdisplayName: registration.displayName,\n\t\ttargets: registration.targets.map((target) => ({\n\t\t\tpath: target.path,\n\t\t\tkind: target.kind,\n\t\t\tfilterGlobs: target.filterGlobs ?? null,\n\t\t})),\n\t\thasValidate: registration.validate !== undefined,\n\t});\n}\n\nfunction isProtectedAgentPath(candidate: string, agentDir: string): boolean {\n\tconst authPath = resolve(agentDir, \"auth.json\");\n\tconst sessionsPath = resolve(agentDir, \"sessions\");\n\tconst logsPath = resolve(agentDir, \"logs\");\n\treturn isWithin(candidate, authPath) || isWithin(candidate, sessionsPath) || isWithin(candidate, logsPath);\n}\n\n// A watch rooted exactly at the agent directory is safe when every filter is\n// root-anchored (a leading `/` matches only an immediate child of the watch root,\n// never a nested path) and none of those anchored names resolves into a protected\n// path. Unfiltered targets, unanchored filters, and any protected filter stay\n// fail-closed.\nfunction isSafeFilteredAgentDirTarget(target: ConfigWatchTarget, resolvedPath: string, agentDir: string): boolean {\n\tif (target.kind !== \"dir\" || resolvedPath !== resolve(agentDir)) return false;\n\tconst filterGlobs = target.filterGlobs;\n\tif (!filterGlobs || filterGlobs.length === 0) return false;\n\treturn filterGlobs.every((glob) => {\n\t\tif (!glob.startsWith(\"/\")) return false;\n\t\treturn !isProtectedAgentPath(resolve(resolvedPath, glob.slice(1)), agentDir);\n\t});\n}\n\nfunction registrationHasRestrictedTarget(\n\tregistration: ConfigWatchRegistration,\n\tcwd: string,\n\tagentDir: string,\n): boolean {\n\tconst authPath = resolve(agentDir, \"auth.json\");\n\tconst sessionsPath = resolve(agentDir, \"sessions\");\n\tconst logsPath = resolve(agentDir, \"logs\");\n\treturn registration.targets.some((target) => {\n\t\tconst path = resolvePath(target.path, cwd, { trim: true });\n\t\tif (isSafeFilteredAgentDirTarget(target, path, agentDir)) return false;\n\t\treturn (\n\t\t\tisWithin(path, authPath) ||\n\t\t\tisWithin(authPath, path) ||\n\t\t\tisWithin(path, sessionsPath) ||\n\t\t\tisWithin(path, logsPath)\n\t\t);\n\t});\n}\n\nfunction pendingChanges(pending: ReadonlyMap<string, PendingChange>): Array<{\n\treadonly registrationId: string;\n\treadonly paths: readonly string[];\n}> {\n\treturn [...pending.values()].map((change) => ({\n\t\tregistrationId: change.registrationId,\n\t\tpaths: [...change.paths].sort(),\n\t}));\n}\n\nfunction compareSnapshots(previous: ReadonlyMap<string, string>, next: ReadonlyMap<string, string>): string[] {\n\tconst changed = new Set<string>();\n\tfor (const [path, hash] of next) {\n\t\tif (previous.get(path) !== hash) changed.add(path);\n\t}\n\tfor (const path of previous.keys()) {\n\t\tif (!next.has(path)) changed.add(path);\n\t}\n\treturn [...changed].sort();\n}\n\nfunction uniquePaths(paths: readonly string[]): string[] {\n\treturn [...new Set(paths)].sort();\n}\n\nfunction isWithin(path: string, root: string): boolean {\n\treturn path === root || path.startsWith(`${root}${sep}`);\n}\n\nfunction isPlainObject(value: unknown): value is Record<string, unknown> {\n\tif (typeof value !== \"object\" || value === null || Array.isArray(value)) return false;\n\tconst prototype = Object.getPrototypeOf(value);\n\treturn prototype === Object.prototype || prototype === null;\n}\n\nfunction errorMessage(error: unknown): string {\n\treturn error instanceof Error ? error.message : String(error);\n}\n\nfunction formatPaths(paths: readonly string[]): string {\n\treturn paths.length === 0 ? \"configuration\" : paths.join(\", \");\n}\n"]}
|
|
@@ -36,7 +36,14 @@ export type ConfigReloadWatchEngineOptions = {
|
|
|
36
36
|
export declare class ConfigReloadWatchEngine {
|
|
37
37
|
#private;
|
|
38
38
|
constructor(options: ConfigReloadWatchEngineOptions);
|
|
39
|
-
|
|
39
|
+
/**
|
|
40
|
+
* Marks the engine inert synchronously, then drains the unsubscribe loop off
|
|
41
|
+
* the caller's stack. A single `fs.watch` unsubscribe can block for seconds on
|
|
42
|
+
* a loaded machine, and a reload awaits this call; every dispatch path already
|
|
43
|
+
* checks `#closed`, so the still-attached subscriptions are silent while the
|
|
44
|
+
* returned promise settles. Await it only to observe teardown completion.
|
|
45
|
+
*/
|
|
46
|
+
close(): Promise<void>;
|
|
40
47
|
getBaselineSnapshot(): ReadonlyMap<string, string>;
|
|
41
48
|
}
|
|
42
49
|
//# sourceMappingURL=watch-engine.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"watch-engine.d.ts","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/config-reload/watch-engine.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,wBAAwB,EAAE,MAAM,yBAAyB,CAAC;AAEnE,MAAM,MAAM,WAAW,GAAG;IACzB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,IAAI,EAAE,KAAK,GAAG,eAAe,CAAC;IACvC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,SAAS,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACvC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC;CAC/C,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAAG,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI,KAAK,IAAI,CAAC;AAEtF,MAAM,MAAM,gBAAgB,GAAG,CAC9B,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,kBAAkB,EAC5B,OAAO,CAAC,EAAE;IAAE,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAA;CAAE,KACrC,MAAM,IAAI,CAAC;AAEhB,MAAM,MAAM,UAAU,GAAG;IACxB,UAAU,CAAC,QAAQ,EAAE,MAAM,IAAI,EAAE,OAAO,EAAE,MAAM,GAAG,UAAU,CAAC,OAAO,UAAU,CAAC,CAAC;IACjF,YAAY,CAAC,KAAK,EAAE,UAAU,CAAC,OAAO,UAAU,CAAC,GAAG,IAAI,CAAC;CACzD,CAAC;AAEF,MAAM,MAAM,UAAU,GAAG;IACxB,QAAQ,CAAC,YAAY,EAAE,SAAS,MAAM,EAAE,CAAC;IACzC,QAAQ,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,CAAC;IACpC,QAAQ,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,CAAC;CACpC,CAAC;AAEF,MAAM,MAAM,8BAA8B,GAAG;IAC5C,QAAQ,CAAC,OAAO,EAAE,SAAS,WAAW,EAAE,CAAC;IACzC,QAAQ,CAAC,SAAS,EAAE,gBAAgB,CAAC;IACrC,QAAQ,CAAC,YAAY,EAAE,CAAC,MAAM,EAAE,UAAU,KAAK,IAAI,CAAC;IACpD,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAC1D,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,KAAK,CAAC,EAAE,UAAU,CAAC;IAC5B,+DAA+D;IAC/D,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,CAAC;CAC7C,CAAC;
|
|
1
|
+
{"version":3,"file":"watch-engine.d.ts","sourceRoot":"","sources":["../../../../../src/core/extensions/builtin/config-reload/watch-engine.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,wBAAwB,EAAE,MAAM,yBAAyB,CAAC;AAEnE,MAAM,MAAM,WAAW,GAAG;IACzB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,IAAI,EAAE,KAAK,GAAG,eAAe,CAAC;IACvC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,SAAS,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACvC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC;CAC/C,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAAG,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI,KAAK,IAAI,CAAC;AAEtF,MAAM,MAAM,gBAAgB,GAAG,CAC9B,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,kBAAkB,EAC5B,OAAO,CAAC,EAAE;IAAE,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAA;CAAE,KACrC,MAAM,IAAI,CAAC;AAEhB,MAAM,MAAM,UAAU,GAAG;IACxB,UAAU,CAAC,QAAQ,EAAE,MAAM,IAAI,EAAE,OAAO,EAAE,MAAM,GAAG,UAAU,CAAC,OAAO,UAAU,CAAC,CAAC;IACjF,YAAY,CAAC,KAAK,EAAE,UAAU,CAAC,OAAO,UAAU,CAAC,GAAG,IAAI,CAAC;CACzD,CAAC;AAEF,MAAM,MAAM,UAAU,GAAG;IACxB,QAAQ,CAAC,YAAY,EAAE,SAAS,MAAM,EAAE,CAAC;IACzC,QAAQ,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,CAAC;IACpC,QAAQ,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,CAAC;CACpC,CAAC;AAEF,MAAM,MAAM,8BAA8B,GAAG;IAC5C,QAAQ,CAAC,OAAO,EAAE,SAAS,WAAW,EAAE,CAAC;IACzC,QAAQ,CAAC,SAAS,EAAE,gBAAgB,CAAC;IACrC,QAAQ,CAAC,YAAY,EAAE,CAAC,MAAM,EAAE,UAAU,KAAK,IAAI,CAAC;IACpD,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAC1D,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,KAAK,CAAC,EAAE,UAAU,CAAC;IAC5B,+DAA+D;IAC/D,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,CAAC;CAC7C,CAAC;AA+BF;;;GAGG;AACH,qBAAa,uBAAuB;;gBAavB,OAAO,EAAE,8BAA8B;IA+EnD;;;;;;OAMG;IACH,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAwBtB,mBAAmB,IAAI,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC;CAiQlD"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { createHash } from "node:crypto";
|
|
2
2
|
import { lstatSync, readdirSync, readFileSync } from "node:fs";
|
|
3
|
-
import { basename, isAbsolute, join, normalize, resolve, sep } from "node:path";
|
|
3
|
+
import { basename, isAbsolute, join, normalize, relative, resolve, sep } from "node:path";
|
|
4
4
|
export { createFsWatchEventSource } from "./watch-event-source.js";
|
|
5
5
|
const DEFAULT_DEBOUNCE_MS = 200;
|
|
6
6
|
const DEFAULT_CLOCK = {
|
|
@@ -37,36 +37,95 @@ export class ConfigReloadWatchEngine {
|
|
|
37
37
|
target: resolvedTarget,
|
|
38
38
|
hashes: scan.hashes,
|
|
39
39
|
allowedDirectories: scan.allowedDirectories,
|
|
40
|
+
watchedDirectories: new Map(),
|
|
41
|
+
scannedDirectories: scan.scannedDirectories,
|
|
40
42
|
};
|
|
41
43
|
});
|
|
42
44
|
for (const state of this.#states) {
|
|
45
|
+
this.#attach(state, state.scannedDirectories);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Subscribes to exactly the in-scope directories.
|
|
50
|
+
*
|
|
51
|
+
* A `dir-recursive` target used to hand its root to `fs.watch({recursive:true})`,
|
|
52
|
+
* which registers the entire subtree with the OS watcher (FSEvents on macOS).
|
|
53
|
+
* The target `filter` only discards events after delivery, so an extensions or
|
|
54
|
+
* skills directory containing `node_modules` still cost a full-subtree
|
|
55
|
+
* registration per session. The scan already knows which directories are in
|
|
56
|
+
* scope — it skips `node_modules`, `.git`, symlinks, and filtered paths — so
|
|
57
|
+
* watching that set directly gives identical coverage at a fraction of the
|
|
58
|
+
* OS-level cost.
|
|
59
|
+
*/
|
|
60
|
+
#attach(state, directories) {
|
|
61
|
+
const recursive = state.target.kind === "dir-recursive";
|
|
62
|
+
// The root is always watched so that creations directly beneath it are seen.
|
|
63
|
+
const wanted = recursive ? new Set([state.target.path, ...directories]) : new Set([state.target.path]);
|
|
64
|
+
for (const directory of wanted) {
|
|
65
|
+
if (state.watchedDirectories.has(directory)) {
|
|
66
|
+
continue;
|
|
67
|
+
}
|
|
43
68
|
try {
|
|
44
|
-
this.#
|
|
45
|
-
this.#onEvent(state, eventType, filename);
|
|
46
|
-
}, { recursive:
|
|
69
|
+
const unsubscribe = this.#subscribe(directory, (eventType, filename) => {
|
|
70
|
+
this.#onEvent(state, eventType, filename, directory);
|
|
71
|
+
}, { recursive: false });
|
|
72
|
+
state.watchedDirectories.set(directory, unsubscribe);
|
|
73
|
+
this.#unsubscribes.push(unsubscribe);
|
|
47
74
|
}
|
|
48
75
|
catch (error) {
|
|
49
|
-
this.#reportError(error,
|
|
76
|
+
this.#reportError(error, directory);
|
|
50
77
|
}
|
|
51
78
|
}
|
|
52
79
|
}
|
|
80
|
+
/** Drops subscriptions for directories that left scope (deleted or filtered out). */
|
|
81
|
+
#detachMissing(state, live) {
|
|
82
|
+
for (const [directory, unsubscribe] of [...state.watchedDirectories]) {
|
|
83
|
+
if (directory === state.target.path || live.has(directory)) {
|
|
84
|
+
continue;
|
|
85
|
+
}
|
|
86
|
+
state.watchedDirectories.delete(directory);
|
|
87
|
+
const index = this.#unsubscribes.indexOf(unsubscribe);
|
|
88
|
+
if (index >= 0) {
|
|
89
|
+
this.#unsubscribes.splice(index, 1);
|
|
90
|
+
}
|
|
91
|
+
try {
|
|
92
|
+
unsubscribe();
|
|
93
|
+
}
|
|
94
|
+
catch (error) {
|
|
95
|
+
this.#reportError(error, directory);
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* Marks the engine inert synchronously, then drains the unsubscribe loop off
|
|
101
|
+
* the caller's stack. A single `fs.watch` unsubscribe can block for seconds on
|
|
102
|
+
* a loaded machine, and a reload awaits this call; every dispatch path already
|
|
103
|
+
* checks `#closed`, so the still-attached subscriptions are silent while the
|
|
104
|
+
* returned promise settles. Await it only to observe teardown completion.
|
|
105
|
+
*/
|
|
53
106
|
close() {
|
|
54
107
|
if (this.#closed) {
|
|
55
|
-
return;
|
|
108
|
+
return Promise.resolve();
|
|
56
109
|
}
|
|
57
110
|
this.#closed = true;
|
|
58
111
|
if (this.#timer) {
|
|
59
112
|
this.#clock.clearTimeout(this.#timer);
|
|
60
113
|
this.#timer = undefined;
|
|
61
114
|
}
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
115
|
+
const unsubscribes = this.#unsubscribes.splice(0);
|
|
116
|
+
return new Promise((settle) => {
|
|
117
|
+
this.#clock.setTimeout(() => {
|
|
118
|
+
for (const unsubscribe of unsubscribes) {
|
|
119
|
+
try {
|
|
120
|
+
unsubscribe();
|
|
121
|
+
}
|
|
122
|
+
catch (error) {
|
|
123
|
+
this.#reportError(error, "watch subscription");
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
settle();
|
|
127
|
+
}, 0);
|
|
128
|
+
});
|
|
70
129
|
}
|
|
71
130
|
getBaselineSnapshot() {
|
|
72
131
|
const snapshot = new Map();
|
|
@@ -77,7 +136,7 @@ export class ConfigReloadWatchEngine {
|
|
|
77
136
|
}
|
|
78
137
|
return snapshot;
|
|
79
138
|
}
|
|
80
|
-
#onEvent(state, _eventType, filename) {
|
|
139
|
+
#onEvent(state, _eventType, filename, watchedDirectory) {
|
|
81
140
|
if (this.#closed) {
|
|
82
141
|
return;
|
|
83
142
|
}
|
|
@@ -86,7 +145,11 @@ export class ConfigReloadWatchEngine {
|
|
|
86
145
|
}
|
|
87
146
|
else if (this.#pending.get(state) !== null) {
|
|
88
147
|
const affected = this.#pending.get(state) ?? new Set();
|
|
89
|
-
|
|
148
|
+
// Per-directory subscriptions report names relative to their own directory,
|
|
149
|
+
// so re-anchor them to the target root before matching.
|
|
150
|
+
const relPath = normalizeRelativePath(watchedDirectory && watchedDirectory !== state.target.path
|
|
151
|
+
? join(relative(state.target.path, watchedDirectory), filename)
|
|
152
|
+
: filename);
|
|
90
153
|
if (relPath && this.#matches(state.target, relPath)) {
|
|
91
154
|
affected.add(relPath);
|
|
92
155
|
this.#pending.set(state, affected);
|
|
@@ -134,6 +197,9 @@ export class ConfigReloadWatchEngine {
|
|
|
134
197
|
for (const path of next.allowedDirectories) {
|
|
135
198
|
state.allowedDirectories.add(path);
|
|
136
199
|
}
|
|
200
|
+
state.scannedDirectories = next.scannedDirectories;
|
|
201
|
+
this.#detachMissing(state, state.scannedDirectories);
|
|
202
|
+
this.#attach(state, state.scannedDirectories);
|
|
137
203
|
this.#compare(previousHashes, previousDirectories, state.hashes, state.allowedDirectories, changes);
|
|
138
204
|
return;
|
|
139
205
|
}
|
|
@@ -148,16 +214,28 @@ export class ConfigReloadWatchEngine {
|
|
|
148
214
|
state.allowedDirectories.delete(path);
|
|
149
215
|
}
|
|
150
216
|
}
|
|
217
|
+
for (const path of [...state.scannedDirectories]) {
|
|
218
|
+
if (prefixes.some((prefix) => isWithin(path, prefix))) {
|
|
219
|
+
state.scannedDirectories.delete(path);
|
|
220
|
+
}
|
|
221
|
+
}
|
|
151
222
|
for (const [path, hash] of next.hashes) {
|
|
152
223
|
state.hashes.set(path, hash);
|
|
153
224
|
}
|
|
154
225
|
for (const path of next.allowedDirectories) {
|
|
155
226
|
state.allowedDirectories.add(path);
|
|
156
227
|
}
|
|
228
|
+
for (const path of next.scannedDirectories) {
|
|
229
|
+
state.scannedDirectories.add(path);
|
|
230
|
+
}
|
|
231
|
+
// A partial rescan can both create and remove directories in scope, so the
|
|
232
|
+
// subscription set is reconciled in both directions here too.
|
|
233
|
+
this.#detachMissing(state, state.scannedDirectories);
|
|
234
|
+
this.#attach(state, state.scannedDirectories);
|
|
157
235
|
this.#compare(previousHashes, previousDirectories, state.hashes, state.allowedDirectories, changes);
|
|
158
236
|
}
|
|
159
237
|
#scanAffected(target, affected, state) {
|
|
160
|
-
const result = { hashes: new Map(), allowedDirectories: new Set() };
|
|
238
|
+
const result = { hashes: new Map(), allowedDirectories: new Set(), scannedDirectories: new Set() };
|
|
161
239
|
for (const relPath of affected) {
|
|
162
240
|
const absolutePath = join(target.path, relPath);
|
|
163
241
|
this.#scanPath(target, absolutePath, relPath, result, state);
|
|
@@ -165,7 +243,7 @@ export class ConfigReloadWatchEngine {
|
|
|
165
243
|
return result;
|
|
166
244
|
}
|
|
167
245
|
#scan(target) {
|
|
168
|
-
const result = { hashes: new Map(), allowedDirectories: new Set() };
|
|
246
|
+
const result = { hashes: new Map(), allowedDirectories: new Set(), scannedDirectories: new Set() };
|
|
169
247
|
this.#scanPath(target, target.path, "", result);
|
|
170
248
|
return result;
|
|
171
249
|
}
|
|
@@ -209,6 +287,8 @@ export class ConfigReloadWatchEngine {
|
|
|
209
287
|
if (dotDirectory && !explicitlyAllowedDirectory) {
|
|
210
288
|
return;
|
|
211
289
|
}
|
|
290
|
+
// Recorded before descending: this is the set the OS watcher subscribes to.
|
|
291
|
+
result.scannedDirectories.add(absolutePath);
|
|
212
292
|
try {
|
|
213
293
|
for (const child of readdirSync(absolutePath, { withFileTypes: true })) {
|
|
214
294
|
if (child.isSymbolicLink() || child.name === "node_modules" || child.name === ".git") {
|