{"version":3,"file":"pi.cjs","names":["MAJOR_MODE_COMMAND","voiceSwitchToken","errorMessage","readDoomVoiceToolsService","majorModeItems","optionName","majorModeOptionLabel","alreadyComposed","majorModeSummary","requireDoomTransitionCoordinator","requireDoomConfigContext","selectionFromSnapshot","bindPendingSelection","MAJOR_MODE_EVENT","STATUS_KEY","colorStatus","applySummary","loadMajorModesConfig","snapshotHarnessState","prepareMinorModeReloadHandoff","readMinorModeCatalog","DOOM_RELAUNCH_FILE_ENV","serializeRelaunchHandoff","MAJOR_MODE_SOURCE","MAJOR_MODE_VOICE_TOOL_NAME","MAJOR_MODE_VOICE_INPUT_SCHEMA","MAJOR_MODE_VOICE_RESULT_SCHEMA","requireDoomTransitionCoordinator","MAJOR_MODE_SWITCH_HANDOFF_KIND","MAJOR_MODE_COMMAND","VOICE_SWITCH_TOKEN_PREFIX","DOOM_CONFIG_SERVICE","DOOM_TRANSITION_SERVICE","requireDoomConfigContext","requireHarnessRoot","createVoiceReloadHandoffStore","DOOM_VOICE_TOOLS_SERVICE","requireDoomVoiceToolsService","STATUS_KEY","colorStatus","MAJOR_MODE_EVENT","defineRoot","createMajorModeTelemetry","defineCliCommand","defineCliHook","defineResource","MAJOR_MODE_SOURCE","definePiExtension","rootSession","composeRootHooks","commandMajorMode","hookSessionStart","resourceDoompiAuthorMajorMode"],"sources":["../../src/services/majorModeCommand/index.ts","../../src/extensions/workspaces/sessions/(backend)/_lib/relaunchRequest.ts","../../src/extensions/workspaces/sessions/(backend)/_lib/voiceTool.ts","../../src/extensions/workspaces/sessions/(backend)/_lib/majorModeRuntime.ts","../../src/extensions/workspaces/sessions/(backend)/root.cli.ts","../../src/extensions/workspaces/sessions/(backend)/command/majorMode.cli.ts","../../src/extensions/workspaces/sessions/(backend)/hook/sessionStart.cli.ts","../../src/extensions/workspaces/sessions/(backend)/resource/doompiAuthorMajorMode.cli.ts","../../generated/pi.ts"],"sourcesContent":["import { restoreHarnessStateSnapshot, snapshotHarnessState } from '@agimon-ai/doompi-config/harnessStore';\nimport { loadMajorModesConfig } from '@agimon-ai/doompi-config/majorModes';\nimport {\n  appendDoomConfigTransition,\n  replaceDoomConfigContext,\n  requireDoomConfigContext,\n  supersedeDoomConfigTransition,\n} from '@agimon-ai/doompi-config/piContext';\nimport type { DoomConfigPendingSelection } from '@agimon-ai/doompi-config/types';\nimport { alreadyComposed } from '@agimon-ai/doompi-core/childProcess';\nimport { type DoomTransitionResult, requireDoomTransitionCoordinator } from '@agimon-ai/doompi-core/transition';\nimport type { VoiceReloadHandoff, VoiceReloadHandoffIdentity } from '@agimon-ai/doompi-core/voiceReloadHandoff';\nimport { readDoomVoiceToolsService } from '@agimon-ai/doompi-core/voiceTools';\nimport { readMinorModeCatalog } from '@agimon-ai/doompi-minor-mode';\nimport {\n  type MinorModeReloadHandoffHandle,\n  prepareMinorModeReloadHandoff,\n} from '@agimon-ai/doompi-minor-mode/reloadHandoff';\nimport type { ExtensionAPI } from '@earendil-works/pi-coding-agent';\n\nimport { MAJOR_MODE_SWITCH_HANDOFF_KIND } from '../../types/majorMode';\nimport type { MajorModeCommandDependencies } from '../../types/majorModeCommand';\nimport { MAJOR_MODE_EVENT, type MajorModeTelemetry } from '../../types/telemetry';\nimport {\n  applySummary,\n  errorMessage,\n  MAJOR_MODE_COMMAND,\n  majorModeItems,\n  majorModeOptionLabel,\n  majorModeSummary,\n  optionName,\n  voiceSwitchToken,\n} from '../majorModeText';\nimport { bindPendingSelection, clearPendingSelection, selectionFromSnapshot } from '../pendingSelection';\nimport { colorStatus, STATUS_KEY } from '../statusLine';\n\nfunction transitionError(result: DoomTransitionResult): Error {\n  return new Error(`Major-mode transition was ${result.outcome}: ${result.diagnostics.join(', ')}`);\n}\n\nexport function createMajorModeCommand(\n  pi: ExtensionAPI,\n  telemetry: MajorModeTelemetry,\n  dependencies: MajorModeCommandDependencies,\n): Parameters<ExtensionAPI['registerCommand']> {\n  return [\n    MAJOR_MODE_COMMAND,\n    {\n      description: 'Pick a named major mode',\n      handler: async (args, ctx) => {\n        let token: string | undefined;\n        try {\n          token = voiceSwitchToken(args);\n        } catch (error) {\n          ctx.ui.notify(errorMessage(error), 'error');\n          return;\n        }\n        if (args.trim() && !token) {\n          ctx.ui.notify(`Usage: /${MAJOR_MODE_COMMAND}`, 'warning');\n          return;\n        }\n\n        const sessionId = ctx.sessionManager.getSessionId();\n        const cordis = dependencies.cordisContext();\n        let sessionIdentity: VoiceReloadHandoffIdentity | undefined;\n        let handoff: VoiceReloadHandoff | undefined;\n        let minorModeReloadHandoff: MinorModeReloadHandoffHandle | undefined;\n        let reloadRequested = false;\n        let performRelaunch: (() => boolean) | undefined;\n        try {\n          const { config, majorMode, domains, profile } = await dependencies.currentView(ctx);\n          const names = Object.keys(config.majorMode);\n          let picked: string | undefined;\n\n          if (token) {\n            const voiceSession = readDoomVoiceToolsService(cordis)?.readSession(sessionId);\n            if (voiceSession) sessionIdentity = { sessionId, hostGeneration: voiceSession.hostGeneration };\n            handoff = sessionIdentity ? dependencies.reloadHandoffs.accept(token, sessionIdentity) : undefined;\n            if (handoff?.kind !== MAJOR_MODE_SWITCH_HANDOFF_KIND || !handoff.majorMode) {\n              throw new Error('The voice major-mode switch token is stale or belongs to another session.');\n            }\n            picked = handoff.majorMode;\n          } else {\n            const title = `Major mode (current: ${majorMode})`;\n            const chosen =\n              ctx.mode === 'tui'\n                ? await dependencies\n                    .loadPicker()\n                    .then(({ MatrixPickerComponent }) =>\n                      ctx.ui.custom<string[] | undefined>(\n                        (_tui, theme, keybindings, done) =>\n                          new MatrixPickerComponent(\n                            { title, items: majorModeItems(config, names), selected: [majorMode], multi: false },\n                            theme,\n                            keybindings,\n                            done,\n                          ),\n                      ),\n                    )\n                : [\n                    optionName(\n                      (await ctx.ui.select(\n                        title,\n                        names.map((name) =>\n                          majorModeOptionLabel(name, config.majorMode[name]?.layers ?? [], majorMode),\n                        ),\n                      )) ?? '',\n                    ),\n                  ];\n            picked = chosen?.[0];\n          }\n          if (!picked) return;\n\n          const composed = alreadyComposed();\n          if (picked === majorMode) {\n            if (token && sessionIdentity) dependencies.reloadHandoffs.discard(token, sessionIdentity);\n            clearPendingSelection(pi, dependencies.cordisContext());\n            ctx.ui.notify(\n              majorModeSummary(picked, dependencies.resolveLayers(config, picked), majorMode, composed),\n              'info',\n            );\n            return;\n          }\n\n          const coordinator = requireDoomTransitionCoordinator(cordis);\n          const result = await coordinator.execute(\n            {\n              sessionId: ctx.sessionManager.getSessionId(),\n              hostGeneration: coordinator.hostGeneration,\n              operationId: handoff?.operationId ?? crypto.randomUUID(),\n              source: handoff ? 'voice' : 'command',\n              target: { axis: 'major-mode', majorMode: picked },\n            },\n            async (_request, plan) => {\n              const selected = [...plan.candidate.layers];\n              const stale = plan.externalRelaunchRequired;\n              const currentContextAtExecution = requireDoomConfigContext(cordis);\n              const harness = currentContextAtExecution.harness;\n              if (plan.strategy === 'process-relaunch') {\n                const pendingSelection: DoomConfigPendingSelection = {\n                  version: 1,\n                  operationId: plan.operationId,\n                  active: selectionFromSnapshot(plan.previous),\n                  target: selectionFromSnapshot(plan.candidate),\n                  strategy: plan.strategy,\n                  phase: 'pending',\n                };\n                const existingPending = requireDoomConfigContext(cordis).pendingSelection;\n                if (existingPending) supersedeDoomConfigTransition(pi, existingPending);\n                appendDoomConfigTransition(pi, pendingSelection);\n                replaceDoomConfigContext(\n                  cordis,\n                  bindPendingSelection(requireDoomConfigContext(cordis), pendingSelection),\n                );\n                void telemetry.recordEvent(MAJOR_MODE_EVENT.majorModeSwitched, {\n                  'harness.major_mode.previous': harness.majorMode,\n                  'harness.major_mode': picked,\n                  'harness.layers': selected.join(','),\n                  'harness.major_mode.stale': true,\n                  'harness.transition.disposition': plan.disposition,\n                  'harness.transition.operation_id': plan.operationId,\n                });\n                ctx.ui.setStatus(\n                  STATUS_KEY,\n                  colorStatus(ctx.ui.theme, harness.majorMode, harness.domains, harness.profile, true),\n                );\n                if (dependencies.supervisedRelaunchAvailable()) {\n                  const target = picked;\n                  performRelaunch = () => dependencies.requestSupervisedRelaunch(target, plan.operationId);\n                }\n                ctx.ui.notify(\n                  applySummary(picked, selected, true, composed, plan.strategy, performRelaunch !== undefined),\n                  'info',\n                );\n                return 'queued';\n              }\n              const [{ applyMajorMode }, { persistHarnessSelection }] = await Promise.all([\n                dependencies.loadSelectionSwitch(),\n                dependencies.loadConfigJournal(),\n              ]);\n              const transition: DoomConfigPendingSelection = {\n                version: 1,\n                operationId: plan.operationId,\n                active: selectionFromSnapshot(plan.previous),\n                target: selectionFromSnapshot(plan.candidate),\n                strategy: plan.strategy ?? 'pi-reload',\n                phase: 'pending',\n              };\n              const activeConfig = loadMajorModesConfig(harness.root ?? ctx.cwd);\n              const snapshot = snapshotHarnessState();\n              const existingPending = currentContextAtExecution.pendingSelection;\n              minorModeReloadHandoff = prepareMinorModeReloadHandoff(\n                cordis,\n                ctx.sessionManager.getSessionId(),\n                coordinator.hostGeneration,\n                plan.operationId,\n                readMinorModeCatalog(cordis)?.getSnapshot(),\n              );\n              try {\n                if (existingPending) supersedeDoomConfigTransition(pi, existingPending);\n                appendDoomConfigTransition(pi, transition);\n                const updated = applyMajorMode(\n                  activeConfig,\n                  picked,\n                  harness,\n                  plan.candidate.compositionFingerprint,\n                  plan.candidate.childActivation,\n                );\n                persistHarnessSelection(pi, updated);\n              } catch (error) {\n                minorModeReloadHandoff?.discard();\n                minorModeReloadHandoff = undefined;\n                try {\n                  restoreHarnessStateSnapshot(snapshot);\n                } catch (compensationError) {\n                  const detail =\n                    compensationError instanceof Error ? compensationError.message : String(compensationError);\n                  throw new Error(`Transition failed and compensation failed: ${detail}`, { cause: error });\n                }\n                appendDoomConfigTransition(pi, { ...transition, phase: 'aborted' });\n                if (existingPending) appendDoomConfigTransition(pi, existingPending);\n                throw error;\n              }\n\n              void telemetry.recordEvent(MAJOR_MODE_EVENT.majorModeSwitched, {\n                'harness.major_mode.previous': majorMode,\n                'harness.major_mode': picked,\n                'harness.layers': selected.join(','),\n                'harness.major_mode.stale': stale,\n                'harness.transition.disposition': plan.disposition,\n                'harness.transition.operation_id': plan.operationId,\n              });\n              ctx.ui.setStatus(STATUS_KEY, colorStatus(ctx.ui.theme, picked, domains, profile, false));\n              ctx.ui.notify(applySummary(picked, selected, false, composed, plan.strategy), 'info');\n              // Reload must be the command handler's terminal action. Pi invalidates\n              // this command context as soon as the replacement session is active.\n              reloadRequested = true;\n              return 'applied';\n            },\n          );\n          if (result.outcome === 'rejected' || result.outcome === 'stale') throw transitionError(result);\n        } catch (error) {\n          reloadRequested = false;\n          performRelaunch = undefined;\n          minorModeReloadHandoff?.discard();\n          minorModeReloadHandoff = undefined;\n          if (!token) throw error;\n          if (sessionIdentity) dependencies.reloadHandoffs.discard(token, sessionIdentity);\n          ctx.ui.notify(errorMessage(error), 'error');\n        }\n\n        if (reloadRequested) {\n          try {\n            await ctx.waitForIdle();\n            // The replacement session acknowledges the pending journal after its\n            // bootstrap harness is active. Do not touch ctx after this await.\n            await ctx.reload();\n          } catch (error) {\n            minorModeReloadHandoff?.discard();\n            throw error;\n          }\n        }\n        if (performRelaunch) {\n          // Written only at idle: the supervisor ends this agent's input for a\n          // graceful exit the moment the file appears, then respawns it with the\n          // pending major mode; the replacement resumes the session and\n          // acknowledges the journal.\n          await ctx.waitForIdle();\n          if (performRelaunch()) ctx.shutdown();\n        }\n      },\n    },\n  ];\n}\n","import fs from 'node:fs';\n\nimport { DOOM_RELAUNCH_FILE_ENV, serializeRelaunchHandoff } from '@agimon-ai/doompi-core/relaunchHandoff';\n\n/** Whether a process supervisor is listening for relaunch requests. */\nexport function supervisedRelaunchAvailable(env: NodeJS.ProcessEnv = process.env): boolean {\n  return Boolean(env[DOOM_RELAUNCH_FILE_ENV]);\n}\n\n/**\n * Hands a relaunch-class major-mode switch to the process supervisor.\n *\n * A supervisor that owns this agent process (doompi-server) points\n * DOOMPI_RELAUNCH_FILE at a path it watches; writing the target selection\n * there asks it to end this agent's input for a graceful exit and respawn it\n * with the new major mode under the same session id. Write only when the\n * session is idle: the supervisor acts on the file as soon as it appears.\n * Returns false when no supervisor is listening or the write fails, in which\n * case the caller keeps the manual-relaunch message.\n */\nexport function requestSupervisedRelaunch(\n  majorMode: string,\n  operationId: string,\n  env: NodeJS.ProcessEnv = process.env,\n): boolean {\n  const file = env[DOOM_RELAUNCH_FILE_ENV];\n  if (!file) return false;\n  try {\n    fs.writeFileSync(file, serializeRelaunchHandoff({ version: 1, majorMode, operationId }));\n    return true;\n  } catch {\n    return false;\n  }\n}\n","import { requireDoomTransitionCoordinator } from '@agimon-ai/doompi-core/transition';\nimport type { VoiceReloadHandoffStore } from '@agimon-ai/doompi-core/voiceReloadHandoff';\nimport type { DoomVoiceToolsService } from '@agimon-ai/doompi-core/voiceTools';\nimport type { Context } from '@deepseek-ai/cordis';\nimport type { ExtensionAPI, ExtensionContext } from '@earendil-works/pi-coding-agent';\n\nimport {\n  MAJOR_MODE_VOICE_INPUT_SCHEMA,\n  MAJOR_MODE_VOICE_RESULT_SCHEMA,\n  MAJOR_MODE_VOICE_TOOL_NAME,\n  type MajorModeVoiceInput,\n  type MajorModeVoiceResult,\n} from '../../../../../schemas/majorModeVoiceTools';\nimport { MAJOR_MODE_COMMAND, VOICE_SWITCH_TOKEN_PREFIX } from '../../../../../services/majorModeText';\nimport { clearPendingSelection } from '../../../../../services/pendingSelection';\nimport { MAJOR_MODE_SWITCH_HANDOFF_KIND } from '../../../../../types/majorMode';\nimport { MAJOR_MODE_SOURCE, type MajorModeView } from '../../../../../types/majorMode';\n\ntype VoiceMessageSender = (\n  content: string,\n  options: { readonly deliverAs: 'followUp'; readonly expandPromptTemplates: true },\n) => void;\n\nfunction majorModeListing(view: MajorModeView): MajorModeVoiceResult {\n  return {\n    status: 'listed',\n    current: view.majorMode,\n    modes: Object.entries(view.config.majorMode).map(([name, definition]) => ({\n      name,\n      description: definition.description,\n      layers: [...definition.layers],\n    })),\n  };\n}\n\n/**\n * The model-facing half of the axis.\n *\n * A switch is never applied here. It plans the transition, mints an opaque\n * handoff token and sends `/mode --voice-switch-token=…` back as a follow-up, so\n * the reload happens inside a command handler where it can be the terminal\n * action.\n */\nexport function registerMajorModeVoiceCapability(\n  voiceTools: DoomVoiceToolsService<ExtensionContext>,\n  pi: ExtensionAPI,\n  currentView: (ctx: ExtensionContext) => Promise<MajorModeView>,\n  reloadHandoffs: VoiceReloadHandoffStore,\n  cordisContext: () => Context,\n): () => void {\n  const registration = voiceTools.register({\n    descriptor: {\n      source: MAJOR_MODE_SOURCE,\n      id: MAJOR_MODE_VOICE_TOOL_NAME,\n      name: MAJOR_MODE_VOICE_TOOL_NAME,\n      label: 'Major Mode',\n      description: 'List configured Doom major modes with their purpose and layers, or queue a validated mode switch.',\n      order: 10,\n      inputSchema: MAJOR_MODE_VOICE_INPUT_SCHEMA,\n      resultSchema: MAJOR_MODE_VOICE_RESULT_SCHEMA,\n    },\n    async execute(input, execution) {\n      const params = input as MajorModeVoiceInput;\n      const view = await currentView(execution.context);\n      if (params.action === 'list') return majorModeListing(view);\n\n      const majorMode = params.majorMode.trim();\n      if (!Object.hasOwn(view.config.majorMode, majorMode)) {\n        throw new Error(\n          `Unknown major mode: ${majorMode}. Known major modes: ${Object.keys(view.config.majorMode).sort().join(', ')}`,\n        );\n      }\n      if (majorMode === view.majorMode) {\n        clearPendingSelection(pi, cordisContext());\n        return { status: 'unchanged', majorMode };\n      }\n\n      const coordinator = requireDoomTransitionCoordinator(cordisContext());\n      const transitionPlan = coordinator.plan({\n        sessionId: execution.sessionId,\n        hostGeneration: coordinator.hostGeneration,\n        operationId: execution.operationId,\n        source: 'voice',\n        target: { axis: 'major-mode', majorMode },\n        signal: execution.signal,\n      });\n      if (transitionPlan.disposition === 'sync-required') {\n        throw new Error(`Major-mode transition requires doompi sync: ${transitionPlan.diagnostics.join(', ')}`);\n      }\n\n      const reloadHandoff = reloadHandoffs.prepare(\n        {\n          active: !execution.signal.aborted,\n          sessionId: execution.sessionId,\n          hostGeneration: execution.hostGeneration,\n        },\n        {\n          operationId: execution.operationId,\n          kind: MAJOR_MODE_SWITCH_HANDOFF_KIND,\n          majorMode,\n        },\n      );\n      try {\n        const sendUserMessage = pi.sendUserMessage.bind(pi) as unknown as VoiceMessageSender;\n        sendUserMessage(`/${MAJOR_MODE_COMMAND} ${VOICE_SWITCH_TOKEN_PREFIX}${reloadHandoff.token}`, {\n          deliverAs: 'followUp',\n          expandPromptTemplates: true,\n        });\n      } catch (error) {\n        reloadHandoff.discard();\n        throw error;\n      }\n      return { status: 'queued', majorMode, stopBatch: 'session-reload' };\n    },\n  });\n  return () => registration.dispose();\n}\n","import { requireHarnessRoot } from '@agimon-ai/doompi-config/harnessStore';\nimport { requireDoomConfigContext } from '@agimon-ai/doompi-config/piContext';\nimport { DOOM_CONFIG_SERVICE } from '@agimon-ai/doompi-core/config';\nimport { type PiPluginContributions } from '@agimon-ai/doompi-core/piExtension';\nimport { DOOM_TRANSITION_SERVICE } from '@agimon-ai/doompi-core/transition';\nimport { createVoiceReloadHandoffStore } from '@agimon-ai/doompi-core/voiceReloadHandoff';\nimport { DOOM_VOICE_TOOLS_SERVICE, requireDoomVoiceToolsService } from '@agimon-ai/doompi-core/voiceTools';\nimport type { Context } from '@deepseek-ai/cordis';\nimport type { ExtensionAPI, ExtensionContext } from '@earendil-works/pi-coding-agent';\n\nimport { createMajorModeCommand } from '../../../../../services/majorModeCommand';\nimport { colorStatus, STATUS_KEY } from '../../../../../services/statusLine';\nimport { type MajorModeView } from '../../../../../types/majorMode';\nimport { MAJOR_MODE_EVENT, type MajorModeTelemetry } from '../../../../../types/telemetry';\nimport { requestSupervisedRelaunch, supervisedRelaunchAvailable } from './relaunchRequest';\nimport { registerMajorModeVoiceCapability } from './voiceTool';\n\n/**\n * Everything the axis needs beyond the session, loaded on first use.\n *\n * Every session registers /mode, but most never run it, so the picker, the\n * switch and the journal stay off the startup path.\n */\nfunction lazyModules() {\n  let config: Promise<typeof import('@agimon-ai/doompi-config/majorModes')> | undefined;\n  let journal: Promise<typeof import('@agimon-ai/doompi-config/piContext')> | undefined;\n  let picker: Promise<typeof import('@agimon-ai/doompi-ui/matrixPicker')> | undefined;\n  let selection: Promise<typeof import('@agimon-ai/doompi-config/selectionSwitch')> | undefined;\n  return {\n    config: () => (config ??= import('@agimon-ai/doompi-config/majorModes')),\n    journal: () => (journal ??= import('@agimon-ai/doompi-config/piContext')),\n    picker: () => (picker ??= import('@agimon-ai/doompi-ui/matrixPicker')),\n    selection: () => (selection ??= import('@agimon-ai/doompi-config/selectionSwitch')),\n  };\n}\n\ninterface MajorModePluginConfig {\n  readonly pi: ExtensionAPI;\n  readonly telemetry: MajorModeTelemetry;\n}\n\nexport function createMajorModeRuntime({\n  pi,\n  telemetry,\n}: MajorModePluginConfig): PiPluginContributions<MajorModeTelemetry> {\n  const load = lazyModules();\n\n  let activeContext: Context | undefined;\n  let runtimeInjection: ReturnType<Context['inject']> | undefined;\n  const bindRuntime = (cordis: Context) => {\n    runtimeInjection = cordis.inject([DOOM_CONFIG_SERVICE, DOOM_TRANSITION_SERVICE], (context) => {\n      activeContext = context;\n      return () => {\n        if (activeContext === context) activeContext = undefined;\n      };\n    });\n  };\n  const requireRuntimeContext = (): Context => {\n    if (!activeContext) throw new Error('Doom major-mode runtime is waiting for the session config service.');\n    return activeContext;\n  };\n  const currentView = async (_ctx: ExtensionContext): Promise<MajorModeView> => {\n    const state = requireDoomConfigContext(requireRuntimeContext()).harness;\n    const { loadMajorModesConfig } = await load.config();\n    return {\n      config: loadMajorModesConfig(requireHarnessRoot(state)),\n      majorMode: state.majorMode,\n      domains: state.domains,\n      profile: state.profile,\n    };\n  };\n  const reloadHandoffs = createVoiceReloadHandoffStore({\n    now: () => Date.now(),\n    createToken: () => crypto.randomUUID(),\n  });\n  const bindVoice = (cordis: Context) => {\n    cordis.inject([DOOM_CONFIG_SERVICE, DOOM_TRANSITION_SERVICE, DOOM_VOICE_TOOLS_SERVICE], (voiceContext) =>\n      registerMajorModeVoiceCapability(\n        requireDoomVoiceToolsService(voiceContext),\n        pi,\n        currentView,\n        reloadHandoffs,\n        () => voiceContext,\n      ),\n    );\n  };\n  return {\n    services: [bindRuntime, bindVoice],\n    commands: [\n      createMajorModeCommand(pi, telemetry, {\n        cordisContext: requireRuntimeContext,\n        currentView,\n        reloadHandoffs,\n        loadPicker: load.picker,\n        loadSelectionSwitch: load.selection,\n        loadConfigJournal: load.journal,\n        resolveLayers: (config, majorMode) => [...(config.majorMode[majorMode]?.layers ?? [])],\n        supervisedRelaunchAvailable,\n        requestSupervisedRelaunch,\n      }),\n    ],\n    events: {\n      session_start: async (_event, ctx) => {\n        await runtimeInjection?.await();\n        try {\n          const { majorMode, domains, profile } = requireDoomConfigContext(requireRuntimeContext()).harness;\n          ctx.ui.setStatus(STATUS_KEY, colorStatus(ctx.ui.theme, majorMode, domains, profile, false));\n        } catch (error) {\n          void telemetry.recordError(MAJOR_MODE_EVENT.majorModeUnavailable, error);\n          ctx.ui.setStatus(\n            STATUS_KEY,\n            `major mode unavailable (${error instanceof Error ? error.message : String(error)})`,\n          );\n        }\n      },\n    },\n  };\n}\n","import { defineRoot } from '@agimon-ai/doompi-core/extensionFile';\nimport type { PiPluginContext } from '@agimon-ai/doompi-core/piExtension';\n\nimport { createMajorModeTelemetry } from '../../../../services/logSinkTelemetry';\nimport type { MajorModeTelemetry } from '../../../../types/telemetry';\nimport { createMajorModeRuntime } from './_lib/majorModeRuntime';\nexport default defineRoot(({ pi, options }: PiPluginContext<MajorModeTelemetry>) => {\n  const runtime = createMajorModeRuntime({ pi, telemetry: options ?? createMajorModeTelemetry() });\n  return { value: runtime, services: runtime.services, onStop: runtime.onStop, onDispose: runtime.onDispose };\n});\n","import { defineCliCommand } from '@agimon-ai/doompi-core/extensionFile';\nimport type { WithRoot } from '@agimon-ai/doompi-core/extensionFile';\nimport type { PiPluginContext } from '@agimon-ai/doompi-core/piExtension';\n\nimport { createMajorModeRuntime } from '../_lib/majorModeRuntime';\nexport default defineCliCommand(\n  (context: WithRoot<PiPluginContext<unknown>, ReturnType<typeof createMajorModeRuntime>>) =>\n    context.root.commands![0]!,\n);\n","import { defineCliHook } from '@agimon-ai/doompi-core/extensionFile';\nimport type { WithRoot } from '@agimon-ai/doompi-core/extensionFile';\nimport type { PiPluginContext } from '@agimon-ai/doompi-core/piExtension';\n\nimport { createMajorModeRuntime } from '../_lib/majorModeRuntime';\nexport default defineCliHook(\n  (context: WithRoot<PiPluginContext<unknown>, ReturnType<typeof createMajorModeRuntime>>) =>\n    context.root.events!.session_start,\n);\n","import { defineResource } from '@agimon-ai/doompi-core/extensionFile';\n\nimport { MAJOR_MODE_SOURCE } from '../../../../../types/majorMode';\nexport default defineResource({\n  source: MAJOR_MODE_SOURCE,\n  moduleUrl: import.meta.url,\n  skills: [\n    {\n      name: 'doompi-author-major-mode',\n      description:\n        \"Configure DoomPi default packages, layers, extensions, hook groups, and named major modes. Use when creating or editing ~/.pi/.doom/modes.yaml or a repository's .doom/modes.yaml, choosing a default mode, or diagnosing which behavior a mode activates.\",\n    },\n  ],\n});\n","// Generated by @agimon-ai/doompi-build. Do not edit by hand.\nimport { definePiExtension, type PiPluginContext, type PiPluginContributions } from '@agimon-ai/doompi-core/piExtension';\nimport { composeRootHooks } from '@agimon-ai/doompi-core/extensionFile';\n\nimport rootSession from '../src/extensions/workspaces/sessions/(backend)/root.cli';\nimport commandMajorMode from '../src/extensions/workspaces/sessions/(backend)/command/majorMode.cli';\nimport hookSessionStart from '../src/extensions/workspaces/sessions/(backend)/hook/sessionStart.cli';\nimport resourceDoompiAuthorMajorMode from '../src/extensions/workspaces/sessions/(backend)/resource/doompiAuthorMajorMode.cli';\n\ntype OptionsOf<T> = T extends (context: PiPluginContext<infer Options>) => unknown ? Options : never;\ntype InferredOptions = Exclude<OptionsOf<typeof rootSession> | OptionsOf<typeof commandMajorMode> | OptionsOf<typeof hookSessionStart> | OptionsOf<typeof resourceDoompiAuthorMajorMode>, undefined>;\ntype Intersect<Union> =\n  (Union extends unknown ? (value: Union) => void : never) extends (value: infer Value) => void ? Value : never;\ntype ExtensionOptions = [InferredOptions] extends [never] ? undefined : Intersect<InferredOptions>;\n\ntype Factory<T, C> = (context: C) => T;\nconst at = <T, C>(value: T | Factory<T, C>, context: C): T =>\n  typeof value === 'function' ? (value as Factory<T, C>)(context) : value;\n\nexport const extension = definePiExtension<ExtensionOptions>('@agimon-ai/doompi-major-mode', async (context) => {\n  const scopeSession = await rootSession(context);\n  const contextSession = { ...context, root: scopeSession.value };\n  return {\n    ...composeRootHooks(scopeSession),\n    get commands(): PiPluginContributions['commands'] { return [at(commandMajorMode, contextSession)]; },\n    events: {\n      session_start: at(hookSessionStart, contextSession) as NonNullable<PiPluginContributions['events']>['session_start'],\n    },\n    get resources(): PiPluginContributions['resources'] { return [at(resourceDoompiAuthorMajorMode, contextSession)]; },\n    services: [...(scopeSession.services ?? [])],\n  };\n});\n\nexport default extension;\n"],"mappings":"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"}