@agimon-ai/doompi-ui 0.0.1-alpha.26 → 0.0.1-alpha.28

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.
Files changed (33) hide show
  1. package/dist/adapters/telemetry/logSinkTelemetry.d.cts +5 -5
  2. package/dist/adapters/telemetry/logSinkTelemetry.d.cts.map +1 -1
  3. package/dist/adapters/telemetry/logSinkTelemetry.d.mts +5 -5
  4. package/dist/adapters/telemetry/logSinkTelemetry.d.mts.map +1 -1
  5. package/dist/services/leader/leaderRegistry.cjs.map +1 -1
  6. package/dist/services/leader/leaderRegistry.d.cts.map +1 -1
  7. package/dist/services/leader/leaderRegistry.d.mts.map +1 -1
  8. package/dist/services/leader/leaderRegistry.mjs.map +1 -1
  9. package/dist/tui/configOverlay.d.cts.map +1 -1
  10. package/dist/tui/configOverlay.d.mts.map +1 -1
  11. package/dist/tui/doomEditor.d.cts.map +1 -1
  12. package/dist/tui/doomEditor.d.mts.map +1 -1
  13. package/dist/tui/doomFooter.d.cts.map +1 -1
  14. package/dist/tui/doomFooter.d.mts.map +1 -1
  15. package/dist/tui/doomHeader.d.cts.map +1 -1
  16. package/dist/tui/doomHeader.d.mts.map +1 -1
  17. package/dist/tui/doomOverlay.d.cts +5 -5
  18. package/dist/tui/doomOverlay.d.cts.map +1 -1
  19. package/dist/tui/doomOverlay.d.mts +5 -5
  20. package/dist/tui/doomOverlay.d.mts.map +1 -1
  21. package/dist/tui/leaderHints.d.cts.map +1 -1
  22. package/dist/tui/leaderHints.d.mts.map +1 -1
  23. package/dist/tui/matrixPicker.d.cts.map +1 -1
  24. package/dist/tui/matrixPicker.d.mts.map +1 -1
  25. package/dist/tui/theme.d.cts +79 -79
  26. package/dist/tui/theme.d.cts.map +1 -1
  27. package/dist/tui/theme.d.mts +79 -79
  28. package/dist/tui/theme.d.mts.map +1 -1
  29. package/dist/tui/toolChrome.d.cts.map +1 -1
  30. package/dist/tui/toolChrome.d.mts.map +1 -1
  31. package/dist/tui/toolsOverlay.d.cts.map +1 -1
  32. package/dist/tui/toolsOverlay.d.mts.map +1 -1
  33. package/package.json +7 -7
@@ -1,11 +1,11 @@
1
1
  import { DoomTelemetryOptions } from "@agimon-ai/doompi-telemetry";
2
2
  //#region src/adapters/telemetry/logSinkTelemetry.d.ts
3
3
  declare const UI_EVENT: {
4
- readonly leaderContributionRejected: "doom_pi_ui.leader_contribution_rejected";
5
- readonly leaderCommandUnavailable: "doom_pi_ui.leader_command_unavailable";
6
- readonly leaderActionUnavailable: "doom_pi_ui.leader_action_unavailable";
7
- readonly themeApplyFailed: "doom_pi_ui.theme_apply_failed";
8
- readonly shellInstalled: "doom_pi_ui.shell_installed";
4
+ readonly leaderContributionRejected: 'doom_pi_ui.leader_contribution_rejected';
5
+ readonly leaderCommandUnavailable: 'doom_pi_ui.leader_command_unavailable';
6
+ readonly leaderActionUnavailable: 'doom_pi_ui.leader_action_unavailable';
7
+ readonly themeApplyFailed: 'doom_pi_ui.theme_apply_failed';
8
+ readonly shellInstalled: 'doom_pi_ui.shell_installed';
9
9
  };
10
10
  type UiEventName = (typeof UI_EVENT)[keyof typeof UI_EVENT];
11
11
  type UiEventAttributes = Record<string, string | number | boolean>;
@@ -1 +1 @@
1
- {"version":3,"file":"logSinkTelemetry.d.cts","names":[],"sources":["../../../src/adapters/telemetry/logSinkTelemetry.ts"],"mappings":";;cAKa;;;;;;;KAQD,sBAAsB,uBAAuB;KAC7C,oBAAoB;UAEf;EACf;EACA;EACA,MAAM,OAAO;EACb,mBAAmB,YAAY;EAC/B,QAAQ;;UAGO;EACf,YAAY,OAAO,aAAa,gBAAgB,aAAa,oBAAoB;EACjF,cAAc,OAAO,aAAa,gBAAgB,aAAa,oBAAoB;EACnF,YAAY,OAAO,aAAa,aAAa,oBAAoB;EACjE,SAAS;EACT,YAAY;;iBAGE,kBAAkB,UAAS,qBAA0B"}
1
+ {"version":3,"file":"logSinkTelemetry.d.cts","names":[],"sources":["../../../src/adapters/telemetry/logSinkTelemetry.ts"],"mappings":";;cAKa;WACX;WACA;WACA;WACA;WACA;;KAGU,sBAAsB,uBAAuB;KAC7C,oBAAoB;UAEf;EACf;EACA;EACA,MAAM,OAAO;EACb,mBAAmB,YAAY;EAC/B,QAAQ;;UAGO;EACf,YAAY,OAAO,aAAa,gBAAgB,aAAa,oBAAoB;EACjF,cAAc,OAAO,aAAa,gBAAgB,aAAa,oBAAoB;EACnF,YAAY,OAAO,aAAa,aAAa,oBAAoB;EACjE,SAAS;EACT,YAAY;;iBAGE,kBAAkB,UAAS,qBAA0B"}
@@ -1,11 +1,11 @@
1
1
  import { DoomTelemetryOptions } from "@agimon-ai/doompi-telemetry";
2
2
  //#region src/adapters/telemetry/logSinkTelemetry.d.ts
3
3
  declare const UI_EVENT: {
4
- readonly leaderContributionRejected: "doom_pi_ui.leader_contribution_rejected";
5
- readonly leaderCommandUnavailable: "doom_pi_ui.leader_command_unavailable";
6
- readonly leaderActionUnavailable: "doom_pi_ui.leader_action_unavailable";
7
- readonly themeApplyFailed: "doom_pi_ui.theme_apply_failed";
8
- readonly shellInstalled: "doom_pi_ui.shell_installed";
4
+ readonly leaderContributionRejected: 'doom_pi_ui.leader_contribution_rejected';
5
+ readonly leaderCommandUnavailable: 'doom_pi_ui.leader_command_unavailable';
6
+ readonly leaderActionUnavailable: 'doom_pi_ui.leader_action_unavailable';
7
+ readonly themeApplyFailed: 'doom_pi_ui.theme_apply_failed';
8
+ readonly shellInstalled: 'doom_pi_ui.shell_installed';
9
9
  };
10
10
  type UiEventName = (typeof UI_EVENT)[keyof typeof UI_EVENT];
11
11
  type UiEventAttributes = Record<string, string | number | boolean>;
@@ -1 +1 @@
1
- {"version":3,"file":"logSinkTelemetry.d.mts","names":[],"sources":["../../../src/adapters/telemetry/logSinkTelemetry.ts"],"mappings":";;cAKa;;;;;;;KAQD,sBAAsB,uBAAuB;KAC7C,oBAAoB;UAEf;EACf;EACA;EACA,MAAM,OAAO;EACb,mBAAmB,YAAY;EAC/B,QAAQ;;UAGO;EACf,YAAY,OAAO,aAAa,gBAAgB,aAAa,oBAAoB;EACjF,cAAc,OAAO,aAAa,gBAAgB,aAAa,oBAAoB;EACnF,YAAY,OAAO,aAAa,aAAa,oBAAoB;EACjE,SAAS;EACT,YAAY;;iBAGE,kBAAkB,UAAS,qBAA0B"}
1
+ {"version":3,"file":"logSinkTelemetry.d.mts","names":[],"sources":["../../../src/adapters/telemetry/logSinkTelemetry.ts"],"mappings":";;cAKa;WACX;WACA;WACA;WACA;WACA;;KAGU,sBAAsB,uBAAuB;KAC7C,oBAAoB;UAEf;EACf;EACA;EACA,MAAM,OAAO;EACb,mBAAmB,YAAY;EAC/B,QAAQ;;UAGO;EACf,YAAY,OAAO,aAAa,gBAAgB,aAAa,oBAAoB;EACjF,cAAc,OAAO,aAAa,gBAAgB,aAAa,oBAAoB;EACnF,YAAY,OAAO,aAAa,aAAa,oBAAoB;EACjE,SAAS;EACT,YAAY;;iBAGE,kBAAkB,UAAS,qBAA0B"}
@@ -1 +1 @@
1
- {"version":3,"file":"leaderRegistry.cjs","names":[],"sources":["../../../src/services/leader/leaderRegistry.ts"],"sourcesContent":["type AppKeybinding =\n | 'app.model.select'\n | 'app.model.cycleForward'\n | 'app.thinking.cycle'\n | 'app.session.new'\n | 'app.session.resume'\n | 'app.session.tree'\n | 'app.session.fork'\n | 'app.editor.external'\n | 'app.exit';\n\nimport type {\n LeaderBinding as DoomLeaderBinding,\n LeaderCommand as DoomLeaderCommand,\n LeaderContribution as DoomLeaderContribution,\n LeaderAction as DoomLeaderExtensionAction,\n LeaderSegment as DoomLeaderSegment,\n} from '@agimon-ai/doompi-extension-contracts/leader';\n\ninterface AppLeaderAction {\n type: 'app';\n action: AppKeybinding;\n}\n\ninterface CommandLeaderAction {\n type: 'command';\n command: DoomLeaderCommand;\n}\n\ninterface ExtensionLeaderAction {\n type: 'extension';\n source: string;\n action: DoomLeaderExtensionAction;\n}\n\nexport type DoomLeaderAction = AppLeaderAction | CommandLeaderAction | ExtensionLeaderAction;\n\nexport interface DoomLeaderResolvedOption {\n key: string;\n label: string;\n detail?: string;\n hasChildren: boolean;\n action?: DoomLeaderAction;\n}\n\nexport interface DoomLeaderGroup {\n label: string;\n options: readonly DoomLeaderResolvedOption[];\n}\n\nexport interface DoomLeaderDiagnostic {\n source: string;\n bindingId?: string;\n message: string;\n}\n\nexport interface DoomLeaderRegistrationResult {\n accepted: boolean;\n diagnostics: readonly DoomLeaderDiagnostic[];\n}\n\ninterface InternalLeaderBinding {\n id: string;\n source: string;\n path: readonly [DoomLeaderSegment, ...DoomLeaderSegment[]];\n action: DoomLeaderAction;\n}\n\ninterface LeaderNode {\n key: string;\n label: string;\n detail?: string;\n order: number;\n owner: string;\n bindingId?: string;\n children: Map<string, LeaderNode>;\n action?: DoomLeaderAction;\n}\n\ninterface ParsedContribution {\n contribution?: DoomLeaderContribution;\n diagnostics: DoomLeaderDiagnostic[];\n}\n\nconst CORE_SOURCE = '@agimon-ai/doompi-ui';\nconst UNKNOWN_SOURCE = 'unknown';\nconst ROOT_LABEL = 'leader';\nconst DEFAULT_OPTION_ORDER = 500;\nconst MAX_OPTION_ORDER = 1000;\nconst MAX_PATH_LENGTH = 4;\nconst MAX_SOURCE_LENGTH = 128;\nconst MAX_BINDING_ID_LENGTH = 128;\nconst MAX_LABEL_LENGTH = 32;\nconst MAX_DETAIL_LENGTH = 80;\nconst MAX_COMMAND_NAME_LENGTH = 64;\nconst MAX_COMMAND_ARGUMENT_LENGTH = 256;\nconst MAX_ACTION_NAME_LENGTH = 128;\nconst SAFE_KEY = /^[a-z0-9]$/;\nconst SAFE_IDENTIFIER = /^[a-z0-9][a-z0-9._:-]*$/;\nconst SAFE_SOURCE = /^[A-Za-z0-9@][A-Za-z0-9@/._:-]*$/;\nconst SAFE_COMMAND_NAME = /^[a-z0-9][a-z0-9:_-]*$/;\nconst C0_CONTROL_MAX = 31;\nconst DELETE_CHARACTER = 127;\nconst MODEL_GROUP = { key: 'm', label: 'models', order: 10 } as const;\nconst SESSION_GROUP = { key: 's', label: 'sessions', order: 30 } as const;\nconst EXTENSION_GROUP = { key: 'e', label: 'extension', order: 50 } as const;\nconst HELP_GROUP = { key: 'h', label: 'help', order: 70 } as const;\nconst QUIT_GROUP = { key: 'q', label: 'quit', order: 90 } as const;\n\nfunction coreBinding(\n id: string,\n path: readonly [DoomLeaderSegment, ...DoomLeaderSegment[]],\n action: DoomLeaderAction,\n): InternalLeaderBinding {\n return { id, source: CORE_SOURCE, path, action };\n}\n\nconst CORE_BINDINGS: readonly InternalLeaderBinding[] = [\n coreBinding('model.select', [MODEL_GROUP, { key: 'm', label: 'select', detail: 'choose model', order: 10 }], {\n type: 'app',\n action: 'app.model.select',\n }),\n coreBinding('model.next', [MODEL_GROUP, { key: 'n', label: 'next', detail: 'cycle model', order: 20 }], {\n type: 'app',\n action: 'app.model.cycleForward',\n }),\n coreBinding('thinking.cycle', [MODEL_GROUP, { key: 't', label: 'thinking', detail: 'cycle level', order: 30 }], {\n type: 'app',\n action: 'app.thinking.cycle',\n }),\n coreBinding('tools.open', [EXTENSION_GROUP, { key: 't', label: 'tools', detail: 'browse tools', order: 20 }], {\n type: 'command',\n command: { name: 'tools' },\n }),\n // Core rather than contributed, so no extension owns the key and the panel is\n // reachable even when nothing has contributed a section to it yet.\n coreBinding('config.open', [EXTENSION_GROUP, { key: 'c', label: 'config', detail: 'settings', order: 30 }], {\n type: 'command',\n command: { name: 'config' },\n }),\n coreBinding('session.new', [SESSION_GROUP, { key: 'n', label: 'new', detail: 'fresh session', order: 10 }], {\n type: 'app',\n action: 'app.session.new',\n }),\n coreBinding('session.resume', [SESSION_GROUP, { key: 'r', label: 'resume', detail: 'open history', order: 20 }], {\n type: 'app',\n action: 'app.session.resume',\n }),\n coreBinding('session.tree', [SESSION_GROUP, { key: 't', label: 'tree', detail: 'branch view', order: 30 }], {\n type: 'app',\n action: 'app.session.tree',\n }),\n coreBinding('session.fork', [SESSION_GROUP, { key: 'f', label: 'fork', detail: 'from selection', order: 40 }], {\n type: 'app',\n action: 'app.session.fork',\n }),\n coreBinding('editor.external', [EXTENSION_GROUP, { key: 'e', label: 'external', detail: 'open editor', order: 10 }], {\n type: 'app',\n action: 'app.editor.external',\n }),\n coreBinding('help.hotkeys', [HELP_GROUP, { key: 'h', label: 'hotkeys', detail: 'show bindings' }], {\n type: 'command',\n command: { name: 'hotkeys' },\n }),\n coreBinding('app.exit', [QUIT_GROUP, { key: 'q', label: 'quit', detail: 'exit Pi' }], {\n type: 'app',\n action: 'app.exit',\n }),\n];\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nfunction diagnostic(source: string, message: string, bindingId?: string): DoomLeaderDiagnostic {\n return { source, message, ...(bindingId ? { bindingId } : {}) };\n}\n\nfunction containsControlCharacter(value: string): boolean {\n for (let index = 0; index < value.length; index += 1) {\n const codeUnit = value.charCodeAt(index);\n if (codeUnit <= C0_CONTROL_MAX || codeUnit === DELETE_CHARACTER) return true;\n }\n return false;\n}\n\nfunction readRequiredText(\n value: unknown,\n field: string,\n maximumLength: number,\n source: string,\n diagnostics: DoomLeaderDiagnostic[],\n bindingId?: string,\n): string | undefined {\n if (typeof value !== 'string' || !value.trim()) {\n diagnostics.push(diagnostic(source, `${field} must be a non-empty string.`, bindingId));\n return undefined;\n }\n const text = value.trim();\n if (text.length > maximumLength || containsControlCharacter(text)) {\n diagnostics.push(\n diagnostic(\n source,\n `${field} must be at most ${maximumLength} characters and contain no control characters.`,\n bindingId,\n ),\n );\n return undefined;\n }\n return text;\n}\n\nfunction readOptionalText(\n value: unknown,\n field: string,\n maximumLength: number,\n source: string,\n diagnostics: DoomLeaderDiagnostic[],\n bindingId: string,\n): string | undefined {\n if (value === undefined) return undefined;\n return readRequiredText(value, field, maximumLength, source, diagnostics, bindingId);\n}\n\nfunction parseSegment(\n value: unknown,\n source: string,\n bindingId: string,\n index: number,\n diagnostics: DoomLeaderDiagnostic[],\n): DoomLeaderSegment | undefined {\n if (!isRecord(value)) {\n diagnostics.push(diagnostic(source, `bindings[].path[${index}] must be an object.`, bindingId));\n return undefined;\n }\n\n const key = readRequiredText(value.key, `bindings[].path[${index}].key`, 1, source, diagnostics, bindingId);\n const label = readRequiredText(\n value.label,\n `bindings[].path[${index}].label`,\n MAX_LABEL_LENGTH,\n source,\n diagnostics,\n bindingId,\n );\n const detail = readOptionalText(\n value.detail,\n `bindings[].path[${index}].detail`,\n MAX_DETAIL_LENGTH,\n source,\n diagnostics,\n bindingId,\n );\n let order: number | undefined;\n if (value.order !== undefined) {\n if (!Number.isInteger(value.order) || (value.order as number) < 0 || (value.order as number) > MAX_OPTION_ORDER) {\n diagnostics.push(\n diagnostic(\n source,\n `bindings[].path[${index}].order must be an integer from 0 to ${MAX_OPTION_ORDER}.`,\n bindingId,\n ),\n );\n } else {\n order = value.order as number;\n }\n }\n if (!key || !label || !SAFE_KEY.test(key)) {\n if (key && !SAFE_KEY.test(key)) {\n diagnostics.push(diagnostic(source, `bindings[].path[${index}].key must match ${SAFE_KEY}.`, bindingId));\n }\n return undefined;\n }\n return { key, label, ...(detail ? { detail } : {}), ...(order === undefined ? {} : { order }) };\n}\n\nfunction parseCommand(\n value: unknown,\n source: string,\n bindingId: string,\n diagnostics: DoomLeaderDiagnostic[],\n): DoomLeaderCommand | undefined {\n if (!isRecord(value)) {\n diagnostics.push(diagnostic(source, 'bindings[].command must be an object.', bindingId));\n return undefined;\n }\n const name = readRequiredText(\n value.name,\n 'bindings[].command.name',\n MAX_COMMAND_NAME_LENGTH,\n source,\n diagnostics,\n bindingId,\n );\n const args = readOptionalText(\n value.args,\n 'bindings[].command.args',\n MAX_COMMAND_ARGUMENT_LENGTH,\n source,\n diagnostics,\n bindingId,\n );\n if (!name || !SAFE_COMMAND_NAME.test(name)) {\n if (name && !SAFE_COMMAND_NAME.test(name)) {\n diagnostics.push(diagnostic(source, `bindings[].command.name must match ${SAFE_COMMAND_NAME}.`, bindingId));\n }\n return undefined;\n }\n return { name, ...(args ? { args } : {}) };\n}\n\nfunction parseExtensionAction(\n value: unknown,\n source: string,\n bindingId: string,\n diagnostics: DoomLeaderDiagnostic[],\n): DoomLeaderExtensionAction | undefined {\n if (!isRecord(value)) {\n diagnostics.push(diagnostic(source, 'bindings[].action must be an object.', bindingId));\n return undefined;\n }\n const name = readRequiredText(\n value.name,\n 'bindings[].action.name',\n MAX_ACTION_NAME_LENGTH,\n source,\n diagnostics,\n bindingId,\n );\n if (!name || !SAFE_IDENTIFIER.test(name)) {\n if (name && !SAFE_IDENTIFIER.test(name)) {\n diagnostics.push(diagnostic(source, `bindings[].action.name must match ${SAFE_IDENTIFIER}.`, bindingId));\n }\n return undefined;\n }\n return { name };\n}\n\nfunction parseBinding(\n value: unknown,\n source: string,\n diagnostics: DoomLeaderDiagnostic[],\n): DoomLeaderBinding | undefined {\n if (!isRecord(value)) {\n diagnostics.push(diagnostic(source, 'bindings[] must be an object.'));\n return undefined;\n }\n const bindingId = readRequiredText(value.id, 'bindings[].id', MAX_BINDING_ID_LENGTH, source, diagnostics);\n if (!bindingId) return undefined;\n if (!SAFE_IDENTIFIER.test(bindingId)) {\n diagnostics.push(diagnostic(source, `bindings[].id must match ${SAFE_IDENTIFIER}.`, bindingId));\n return undefined;\n }\n if (!Array.isArray(value.path) || value.path.length === 0 || value.path.length > MAX_PATH_LENGTH) {\n diagnostics.push(\n diagnostic(source, `bindings[].path must contain between 1 and ${MAX_PATH_LENGTH} segments.`, bindingId),\n );\n return undefined;\n }\n\n const path = value.path.map((segment, index) => parseSegment(segment, source, bindingId, index, diagnostics));\n const hasCommand = Object.hasOwn(value, 'command');\n const hasAction = Object.hasOwn(value, 'action');\n if (hasCommand === hasAction) {\n diagnostics.push(diagnostic(source, 'bindings[] must contain exactly one of command or action.', bindingId));\n return undefined;\n }\n const target = hasCommand\n ? { command: parseCommand(value.command, source, bindingId, diagnostics) }\n : { action: parseExtensionAction(value.action, source, bindingId, diagnostics) };\n if (path.some((segment) => segment === undefined)) return undefined;\n if ('command' in target) {\n if (!target.command) return undefined;\n return {\n id: bindingId,\n path: path as [DoomLeaderSegment, ...DoomLeaderSegment[]],\n command: target.command,\n };\n }\n if (!target.action) return undefined;\n return {\n id: bindingId,\n path: path as [DoomLeaderSegment, ...DoomLeaderSegment[]],\n action: target.action,\n };\n}\n\nfunction parseContribution(value: unknown): ParsedContribution {\n const diagnostics: DoomLeaderDiagnostic[] = [];\n if (!isRecord(value)) {\n return { diagnostics: [diagnostic(UNKNOWN_SOURCE, 'Leader contribution must be an object.')] };\n }\n const source = readRequiredText(value.source, 'source', MAX_SOURCE_LENGTH, UNKNOWN_SOURCE, diagnostics);\n if (!source) return { diagnostics };\n if (!SAFE_SOURCE.test(source)) {\n diagnostics.push(diagnostic(source, `source must match ${SAFE_SOURCE}.`));\n return { diagnostics };\n }\n if (!Array.isArray(value.bindings)) {\n return { diagnostics: [diagnostic(source, 'bindings must be an array.')] };\n }\n\n const bindings = value.bindings.map((binding) => parseBinding(binding, source, diagnostics));\n const duplicateIds = bindings\n .flatMap((binding) => (binding ? [binding.id] : []))\n .filter((id, index, ids) => ids.indexOf(id) !== index);\n for (const id of new Set(duplicateIds)) {\n diagnostics.push(diagnostic(source, `Binding id '${id}' is duplicated.`, id));\n }\n if (diagnostics.length > 0 || bindings.some((binding) => binding === undefined)) return { diagnostics };\n\n return {\n contribution: {\n source,\n bindings: bindings as DoomLeaderBinding[],\n },\n diagnostics,\n };\n}\n\nfunction optionOrder(segment: DoomLeaderSegment): number {\n return segment.order ?? DEFAULT_OPTION_ORDER;\n}\n\nfunction cloneAction(action: DoomLeaderAction): DoomLeaderAction {\n if (action.type === 'command') return { type: 'command', command: { ...action.command } };\n if (action.type === 'app') return { type: 'app', action: action.action };\n return { type: 'extension', source: action.source, action: { ...action.action } };\n}\n\nfunction createRootNode(): LeaderNode {\n return {\n key: '',\n label: ROOT_LABEL,\n order: 0,\n owner: CORE_SOURCE,\n children: new Map(),\n };\n}\n\nfunction pathLabel(path: readonly DoomLeaderSegment[]): string {\n return `SPC ${path.map((segment) => segment.key).join(' ')}`;\n}\n\nfunction metadataMatches(node: LeaderNode, segment: DoomLeaderSegment): boolean {\n return node.label === segment.label && node.detail === segment.detail && node.order === optionOrder(segment);\n}\n\nfunction insertBinding(root: LeaderNode, binding: InternalLeaderBinding): DoomLeaderDiagnostic | undefined {\n let current = root;\n let firstMissing = -1;\n\n for (const [index, segment] of binding.path.entries()) {\n const existing = current.children.get(segment.key);\n if (!existing) {\n firstMissing = index;\n break;\n }\n if (!metadataMatches(existing, segment)) {\n return diagnostic(\n binding.source,\n `${pathLabel(binding.path.slice(0, index + 1))} conflicts with metadata from ${existing.owner}.`,\n binding.id,\n );\n }\n const isLeaf = index === binding.path.length - 1;\n if ((!isLeaf && existing.action) || (isLeaf && (existing.action || existing.children.size > 0))) {\n return diagnostic(\n binding.source,\n `${pathLabel(binding.path)} conflicts with an existing binding from ${existing.owner}.`,\n binding.id,\n );\n }\n current = existing;\n }\n\n const start = firstMissing === -1 ? binding.path.length : firstMissing;\n for (let index = start; index < binding.path.length; index += 1) {\n const segment = binding.path[index] as DoomLeaderSegment;\n const node: LeaderNode = {\n key: segment.key,\n label: segment.label,\n ...(segment.detail ? { detail: segment.detail } : {}),\n order: optionOrder(segment),\n owner: binding.source,\n children: new Map(),\n };\n current.children.set(segment.key, node);\n current = node;\n }\n\n current.action = cloneAction(binding.action);\n current.bindingId = binding.id;\n return undefined;\n}\n\nexport class DoomLeaderRegistry {\n private root = createRootNode();\n private readonly contributions = new Map<string, readonly DoomLeaderBinding[]>();\n private readonly listeners = new Set<() => void>();\n private diagnostics: DoomLeaderDiagnostic[] = [];\n private dirty = false;\n\n constructor() {\n this.rebuild();\n }\n\n register(value: unknown): DoomLeaderRegistrationResult {\n const result = this.apply(value);\n if (!result.accepted) return result;\n this.rebuild();\n return { accepted: true, diagnostics: this.getDiagnostics() };\n }\n\n /** Records a contribution without rebuilding the whole tree immediately. */\n registerDeferred(value: unknown): DoomLeaderRegistrationResult {\n return this.apply(value);\n }\n\n private apply(value: unknown): DoomLeaderRegistrationResult {\n const parsed = parseContribution(value);\n if (!parsed.contribution) return { accepted: false, diagnostics: parsed.diagnostics };\n\n if (parsed.contribution.bindings.length === 0) this.contributions.delete(parsed.contribution.source);\n else this.contributions.set(parsed.contribution.source, parsed.contribution.bindings);\n this.dirty = true;\n return { accepted: true, diagnostics: parsed.diagnostics };\n }\n\n /** Rebuilds one batch and returns its deterministic conflict diagnostics. */\n flush(): DoomLeaderDiagnostic[] {\n if (this.dirty) this.rebuild();\n return this.diagnostics.map((item) => ({ ...item }));\n }\n\n getGroup(path: readonly string[]): DoomLeaderGroup | undefined {\n this.flush();\n let current = this.root;\n for (const key of path) {\n const next = current.children.get(key);\n if (!next || next.action) return undefined;\n current = next;\n }\n\n // The key is the sort, at every level. A reader looking for a chord knows the\n // key, not the number some contributor picked for it, and those numbers live\n // across nine packages so no one of them can see the sequence they produce.\n // `order` survives only as group identity: co-contributors to a shared prefix\n // must still agree on it, which is what `metadataMatches` checks.\n const options = [...current.children.values()]\n .sort((left, right) => left.key.localeCompare(right.key))\n .map(\n (node): DoomLeaderResolvedOption => ({\n key: node.key,\n label: node.label,\n ...(node.detail ? { detail: node.detail } : {}),\n hasChildren: node.children.size > 0,\n ...(node.action ? { action: cloneAction(node.action) } : {}),\n }),\n );\n return { label: current.label, options };\n }\n\n getDiagnostics(): DoomLeaderDiagnostic[] {\n return this.flush();\n }\n\n subscribe(listener: () => void): () => void {\n this.listeners.add(listener);\n return () => this.listeners.delete(listener);\n }\n\n private rebuild(): void {\n const nextRoot = createRootNode();\n const diagnostics: DoomLeaderDiagnostic[] = [];\n for (const binding of CORE_BINDINGS) {\n const issue = insertBinding(nextRoot, binding);\n if (issue) throw new Error(`Invalid core leader binding: ${issue.message}`);\n }\n\n for (const [source, bindings] of [...this.contributions.entries()].sort(([left], [right]) =>\n left.localeCompare(right),\n )) {\n for (const binding of [...bindings].sort((left, right) => left.id.localeCompare(right.id))) {\n const issue = insertBinding(nextRoot, {\n id: binding.id,\n source,\n path: binding.path,\n action:\n 'command' in binding\n ? { type: 'command', command: binding.command }\n : { type: 'extension', source, action: binding.action },\n });\n if (issue) diagnostics.push(issue);\n }\n }\n\n this.root = nextRoot;\n this.diagnostics = diagnostics;\n this.dirty = false;\n for (const listener of this.listeners) listener();\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"leaderRegistry.cjs","names":[],"sources":["../../../src/services/leader/leaderRegistry.ts"],"sourcesContent":["type AppKeybinding =\n | 'app.model.select'\n | 'app.model.cycleForward'\n | 'app.thinking.cycle'\n | 'app.session.new'\n | 'app.session.resume'\n | 'app.session.tree'\n | 'app.session.fork'\n | 'app.editor.external'\n | 'app.exit';\n\nimport type {\n LeaderBinding as DoomLeaderBinding,\n LeaderCommand as DoomLeaderCommand,\n LeaderContribution as DoomLeaderContribution,\n LeaderAction as DoomLeaderExtensionAction,\n LeaderSegment as DoomLeaderSegment,\n} from '@agimon-ai/doompi-extension-contracts/leader';\n\ninterface AppLeaderAction {\n type: 'app';\n action: AppKeybinding;\n}\n\ninterface CommandLeaderAction {\n type: 'command';\n command: DoomLeaderCommand;\n}\n\ninterface ExtensionLeaderAction {\n type: 'extension';\n source: string;\n action: DoomLeaderExtensionAction;\n}\n\nexport type DoomLeaderAction = AppLeaderAction | CommandLeaderAction | ExtensionLeaderAction;\n\nexport interface DoomLeaderResolvedOption {\n key: string;\n label: string;\n detail?: string;\n hasChildren: boolean;\n action?: DoomLeaderAction;\n}\n\nexport interface DoomLeaderGroup {\n label: string;\n options: readonly DoomLeaderResolvedOption[];\n}\n\nexport interface DoomLeaderDiagnostic {\n source: string;\n bindingId?: string;\n message: string;\n}\n\nexport interface DoomLeaderRegistrationResult {\n accepted: boolean;\n diagnostics: readonly DoomLeaderDiagnostic[];\n}\n\ninterface InternalLeaderBinding {\n id: string;\n source: string;\n path: readonly [DoomLeaderSegment, ...DoomLeaderSegment[]];\n action: DoomLeaderAction;\n}\n\ninterface LeaderNode {\n key: string;\n label: string;\n detail?: string;\n order: number;\n owner: string;\n bindingId?: string;\n children: Map<string, LeaderNode>;\n action?: DoomLeaderAction;\n}\n\ninterface ParsedContribution {\n contribution?: DoomLeaderContribution;\n diagnostics: DoomLeaderDiagnostic[];\n}\n\nconst CORE_SOURCE = '@agimon-ai/doompi-ui';\nconst UNKNOWN_SOURCE = 'unknown';\nconst ROOT_LABEL = 'leader';\nconst DEFAULT_OPTION_ORDER = 500;\nconst MAX_OPTION_ORDER = 1000;\nconst MAX_PATH_LENGTH = 4;\nconst MAX_SOURCE_LENGTH = 128;\nconst MAX_BINDING_ID_LENGTH = 128;\nconst MAX_LABEL_LENGTH = 32;\nconst MAX_DETAIL_LENGTH = 80;\nconst MAX_COMMAND_NAME_LENGTH = 64;\nconst MAX_COMMAND_ARGUMENT_LENGTH = 256;\nconst MAX_ACTION_NAME_LENGTH = 128;\nconst SAFE_KEY = /^[a-z0-9]$/;\nconst SAFE_IDENTIFIER = /^[a-z0-9][a-z0-9._:-]*$/;\nconst SAFE_SOURCE = /^[A-Za-z0-9@][A-Za-z0-9@/._:-]*$/;\nconst SAFE_COMMAND_NAME = /^[a-z0-9][a-z0-9:_-]*$/;\nconst C0_CONTROL_MAX = 31;\nconst DELETE_CHARACTER = 127;\nconst MODEL_GROUP = { key: 'm', label: 'models', order: 10 } as const;\nconst SESSION_GROUP = { key: 's', label: 'sessions', order: 30 } as const;\nconst EXTENSION_GROUP = { key: 'e', label: 'extension', order: 50 } as const;\nconst HELP_GROUP = { key: 'h', label: 'help', order: 70 } as const;\nconst QUIT_GROUP = { key: 'q', label: 'quit', order: 90 } as const;\n\nfunction coreBinding(\n id: string,\n path: readonly [DoomLeaderSegment, ...DoomLeaderSegment[]],\n action: DoomLeaderAction,\n): InternalLeaderBinding {\n return { id, source: CORE_SOURCE, path, action };\n}\n\nconst CORE_BINDINGS: readonly InternalLeaderBinding[] = [\n coreBinding('model.select', [MODEL_GROUP, { key: 'm', label: 'select', detail: 'choose model', order: 10 }], {\n type: 'app',\n action: 'app.model.select',\n }),\n coreBinding('model.next', [MODEL_GROUP, { key: 'n', label: 'next', detail: 'cycle model', order: 20 }], {\n type: 'app',\n action: 'app.model.cycleForward',\n }),\n coreBinding('thinking.cycle', [MODEL_GROUP, { key: 't', label: 'thinking', detail: 'cycle level', order: 30 }], {\n type: 'app',\n action: 'app.thinking.cycle',\n }),\n coreBinding('tools.open', [EXTENSION_GROUP, { key: 't', label: 'tools', detail: 'browse tools', order: 20 }], {\n type: 'command',\n command: { name: 'tools' },\n }),\n // Core rather than contributed, so no extension owns the key and the panel is\n // reachable even when nothing has contributed a section to it yet.\n coreBinding('config.open', [EXTENSION_GROUP, { key: 'c', label: 'config', detail: 'settings', order: 30 }], {\n type: 'command',\n command: { name: 'config' },\n }),\n coreBinding('session.new', [SESSION_GROUP, { key: 'n', label: 'new', detail: 'fresh session', order: 10 }], {\n type: 'app',\n action: 'app.session.new',\n }),\n coreBinding('session.resume', [SESSION_GROUP, { key: 'r', label: 'resume', detail: 'open history', order: 20 }], {\n type: 'app',\n action: 'app.session.resume',\n }),\n coreBinding('session.tree', [SESSION_GROUP, { key: 't', label: 'tree', detail: 'branch view', order: 30 }], {\n type: 'app',\n action: 'app.session.tree',\n }),\n coreBinding('session.fork', [SESSION_GROUP, { key: 'f', label: 'fork', detail: 'from selection', order: 40 }], {\n type: 'app',\n action: 'app.session.fork',\n }),\n coreBinding('editor.external', [EXTENSION_GROUP, { key: 'e', label: 'external', detail: 'open editor', order: 10 }], {\n type: 'app',\n action: 'app.editor.external',\n }),\n coreBinding('help.hotkeys', [HELP_GROUP, { key: 'h', label: 'hotkeys', detail: 'show bindings' }], {\n type: 'command',\n command: { name: 'hotkeys' },\n }),\n coreBinding('app.exit', [QUIT_GROUP, { key: 'q', label: 'quit', detail: 'exit Pi' }], {\n type: 'app',\n action: 'app.exit',\n }),\n];\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nfunction diagnostic(source: string, message: string, bindingId?: string): DoomLeaderDiagnostic {\n return { source, message, ...(bindingId ? { bindingId } : {}) };\n}\n\nfunction containsControlCharacter(value: string): boolean {\n for (let index = 0; index < value.length; index += 1) {\n const codeUnit = value.charCodeAt(index);\n if (codeUnit <= C0_CONTROL_MAX || codeUnit === DELETE_CHARACTER) return true;\n }\n return false;\n}\n\nfunction readRequiredText(\n value: unknown,\n field: string,\n maximumLength: number,\n source: string,\n diagnostics: DoomLeaderDiagnostic[],\n bindingId?: string,\n): string | undefined {\n if (typeof value !== 'string' || !value.trim()) {\n diagnostics.push(diagnostic(source, `${field} must be a non-empty string.`, bindingId));\n return undefined;\n }\n const text = value.trim();\n if (text.length > maximumLength || containsControlCharacter(text)) {\n diagnostics.push(\n diagnostic(\n source,\n `${field} must be at most ${maximumLength} characters and contain no control characters.`,\n bindingId,\n ),\n );\n return undefined;\n }\n return text;\n}\n\nfunction readOptionalText(\n value: unknown,\n field: string,\n maximumLength: number,\n source: string,\n diagnostics: DoomLeaderDiagnostic[],\n bindingId: string,\n): string | undefined {\n if (value === undefined) return undefined;\n return readRequiredText(value, field, maximumLength, source, diagnostics, bindingId);\n}\n\nfunction parseSegment(\n value: unknown,\n source: string,\n bindingId: string,\n index: number,\n diagnostics: DoomLeaderDiagnostic[],\n): DoomLeaderSegment | undefined {\n if (!isRecord(value)) {\n diagnostics.push(diagnostic(source, `bindings[].path[${index}] must be an object.`, bindingId));\n return undefined;\n }\n\n const key = readRequiredText(value.key, `bindings[].path[${index}].key`, 1, source, diagnostics, bindingId);\n const label = readRequiredText(\n value.label,\n `bindings[].path[${index}].label`,\n MAX_LABEL_LENGTH,\n source,\n diagnostics,\n bindingId,\n );\n const detail = readOptionalText(\n value.detail,\n `bindings[].path[${index}].detail`,\n MAX_DETAIL_LENGTH,\n source,\n diagnostics,\n bindingId,\n );\n let order: number | undefined;\n if (value.order !== undefined) {\n if (!Number.isInteger(value.order) || (value.order as number) < 0 || (value.order as number) > MAX_OPTION_ORDER) {\n diagnostics.push(\n diagnostic(\n source,\n `bindings[].path[${index}].order must be an integer from 0 to ${MAX_OPTION_ORDER}.`,\n bindingId,\n ),\n );\n } else {\n order = value.order as number;\n }\n }\n if (!key || !label || !SAFE_KEY.test(key)) {\n if (key && !SAFE_KEY.test(key)) {\n diagnostics.push(diagnostic(source, `bindings[].path[${index}].key must match ${SAFE_KEY}.`, bindingId));\n }\n return undefined;\n }\n return { key, label, ...(detail ? { detail } : {}), ...(order === undefined ? {} : { order }) };\n}\n\nfunction parseCommand(\n value: unknown,\n source: string,\n bindingId: string,\n diagnostics: DoomLeaderDiagnostic[],\n): DoomLeaderCommand | undefined {\n if (!isRecord(value)) {\n diagnostics.push(diagnostic(source, 'bindings[].command must be an object.', bindingId));\n return undefined;\n }\n const name = readRequiredText(\n value.name,\n 'bindings[].command.name',\n MAX_COMMAND_NAME_LENGTH,\n source,\n diagnostics,\n bindingId,\n );\n const args = readOptionalText(\n value.args,\n 'bindings[].command.args',\n MAX_COMMAND_ARGUMENT_LENGTH,\n source,\n diagnostics,\n bindingId,\n );\n if (!name || !SAFE_COMMAND_NAME.test(name)) {\n if (name && !SAFE_COMMAND_NAME.test(name)) {\n diagnostics.push(diagnostic(source, `bindings[].command.name must match ${SAFE_COMMAND_NAME}.`, bindingId));\n }\n return undefined;\n }\n return { name, ...(args ? { args } : {}) };\n}\n\nfunction parseExtensionAction(\n value: unknown,\n source: string,\n bindingId: string,\n diagnostics: DoomLeaderDiagnostic[],\n): DoomLeaderExtensionAction | undefined {\n if (!isRecord(value)) {\n diagnostics.push(diagnostic(source, 'bindings[].action must be an object.', bindingId));\n return undefined;\n }\n const name = readRequiredText(\n value.name,\n 'bindings[].action.name',\n MAX_ACTION_NAME_LENGTH,\n source,\n diagnostics,\n bindingId,\n );\n if (!name || !SAFE_IDENTIFIER.test(name)) {\n if (name && !SAFE_IDENTIFIER.test(name)) {\n diagnostics.push(diagnostic(source, `bindings[].action.name must match ${SAFE_IDENTIFIER}.`, bindingId));\n }\n return undefined;\n }\n return { name };\n}\n\nfunction parseBinding(\n value: unknown,\n source: string,\n diagnostics: DoomLeaderDiagnostic[],\n): DoomLeaderBinding | undefined {\n if (!isRecord(value)) {\n diagnostics.push(diagnostic(source, 'bindings[] must be an object.'));\n return undefined;\n }\n const bindingId = readRequiredText(value.id, 'bindings[].id', MAX_BINDING_ID_LENGTH, source, diagnostics);\n if (!bindingId) return undefined;\n if (!SAFE_IDENTIFIER.test(bindingId)) {\n diagnostics.push(diagnostic(source, `bindings[].id must match ${SAFE_IDENTIFIER}.`, bindingId));\n return undefined;\n }\n if (!Array.isArray(value.path) || value.path.length === 0 || value.path.length > MAX_PATH_LENGTH) {\n diagnostics.push(\n diagnostic(source, `bindings[].path must contain between 1 and ${MAX_PATH_LENGTH} segments.`, bindingId),\n );\n return undefined;\n }\n\n const path = value.path.map((segment, index) => parseSegment(segment, source, bindingId, index, diagnostics));\n const hasCommand = Object.hasOwn(value, 'command');\n const hasAction = Object.hasOwn(value, 'action');\n if (hasCommand === hasAction) {\n diagnostics.push(diagnostic(source, 'bindings[] must contain exactly one of command or action.', bindingId));\n return undefined;\n }\n const target = hasCommand\n ? { command: parseCommand(value.command, source, bindingId, diagnostics) }\n : { action: parseExtensionAction(value.action, source, bindingId, diagnostics) };\n if (path.some((segment) => segment === undefined)) return undefined;\n if ('command' in target) {\n if (!target.command) return undefined;\n return {\n id: bindingId,\n path: path as [DoomLeaderSegment, ...DoomLeaderSegment[]],\n command: target.command,\n };\n }\n if (!target.action) return undefined;\n return {\n id: bindingId,\n path: path as [DoomLeaderSegment, ...DoomLeaderSegment[]],\n action: target.action,\n };\n}\n\nfunction parseContribution(value: unknown): ParsedContribution {\n const diagnostics: DoomLeaderDiagnostic[] = [];\n if (!isRecord(value)) {\n return { diagnostics: [diagnostic(UNKNOWN_SOURCE, 'Leader contribution must be an object.')] };\n }\n const source = readRequiredText(value.source, 'source', MAX_SOURCE_LENGTH, UNKNOWN_SOURCE, diagnostics);\n if (!source) return { diagnostics };\n if (!SAFE_SOURCE.test(source)) {\n diagnostics.push(diagnostic(source, `source must match ${SAFE_SOURCE}.`));\n return { diagnostics };\n }\n if (!Array.isArray(value.bindings)) {\n return { diagnostics: [diagnostic(source, 'bindings must be an array.')] };\n }\n\n const bindings = value.bindings.map((binding) => parseBinding(binding, source, diagnostics));\n const duplicateIds = bindings\n .flatMap((binding) => (binding ? [binding.id] : []))\n .filter((id, index, ids) => ids.indexOf(id) !== index);\n for (const id of new Set(duplicateIds)) {\n diagnostics.push(diagnostic(source, `Binding id '${id}' is duplicated.`, id));\n }\n if (diagnostics.length > 0 || bindings.some((binding) => binding === undefined)) return { diagnostics };\n\n return {\n contribution: {\n source,\n bindings: bindings as DoomLeaderBinding[],\n },\n diagnostics,\n };\n}\n\nfunction optionOrder(segment: DoomLeaderSegment): number {\n return segment.order ?? DEFAULT_OPTION_ORDER;\n}\n\nfunction cloneAction(action: DoomLeaderAction): DoomLeaderAction {\n if (action.type === 'command') return { type: 'command', command: { ...action.command } };\n if (action.type === 'app') return { type: 'app', action: action.action };\n return { type: 'extension', source: action.source, action: { ...action.action } };\n}\n\nfunction createRootNode(): LeaderNode {\n return {\n key: '',\n label: ROOT_LABEL,\n order: 0,\n owner: CORE_SOURCE,\n children: new Map(),\n };\n}\n\nfunction pathLabel(path: readonly DoomLeaderSegment[]): string {\n return `SPC ${path.map((segment) => segment.key).join(' ')}`;\n}\n\nfunction metadataMatches(node: LeaderNode, segment: DoomLeaderSegment): boolean {\n return node.label === segment.label && node.detail === segment.detail && node.order === optionOrder(segment);\n}\n\nfunction insertBinding(root: LeaderNode, binding: InternalLeaderBinding): DoomLeaderDiagnostic | undefined {\n let current = root;\n let firstMissing = -1;\n\n for (const [index, segment] of binding.path.entries()) {\n const existing = current.children.get(segment.key);\n if (!existing) {\n firstMissing = index;\n break;\n }\n if (!metadataMatches(existing, segment)) {\n return diagnostic(\n binding.source,\n `${pathLabel(binding.path.slice(0, index + 1))} conflicts with metadata from ${existing.owner}.`,\n binding.id,\n );\n }\n const isLeaf = index === binding.path.length - 1;\n if ((!isLeaf && existing.action) || (isLeaf && (existing.action || existing.children.size > 0))) {\n return diagnostic(\n binding.source,\n `${pathLabel(binding.path)} conflicts with an existing binding from ${existing.owner}.`,\n binding.id,\n );\n }\n current = existing;\n }\n\n const start = firstMissing === -1 ? binding.path.length : firstMissing;\n for (let index = start; index < binding.path.length; index += 1) {\n const segment = binding.path[index] as DoomLeaderSegment;\n const node: LeaderNode = {\n key: segment.key,\n label: segment.label,\n ...(segment.detail ? { detail: segment.detail } : {}),\n order: optionOrder(segment),\n owner: binding.source,\n children: new Map(),\n };\n current.children.set(segment.key, node);\n current = node;\n }\n\n current.action = cloneAction(binding.action);\n current.bindingId = binding.id;\n return undefined;\n}\n\nexport class DoomLeaderRegistry {\n private root = createRootNode();\n private readonly contributions = new Map<string, readonly DoomLeaderBinding[]>();\n private readonly listeners = new Set<() => void>();\n private diagnostics: DoomLeaderDiagnostic[] = [];\n private dirty = false;\n\n constructor() {\n this.rebuild();\n }\n\n register(value: unknown): DoomLeaderRegistrationResult {\n const result = this.apply(value);\n if (!result.accepted) return result;\n this.rebuild();\n return { accepted: true, diagnostics: this.getDiagnostics() };\n }\n\n /** Records a contribution without rebuilding the whole tree immediately. */\n registerDeferred(value: unknown): DoomLeaderRegistrationResult {\n return this.apply(value);\n }\n\n private apply(value: unknown): DoomLeaderRegistrationResult {\n const parsed = parseContribution(value);\n if (!parsed.contribution) return { accepted: false, diagnostics: parsed.diagnostics };\n\n if (parsed.contribution.bindings.length === 0) this.contributions.delete(parsed.contribution.source);\n else this.contributions.set(parsed.contribution.source, parsed.contribution.bindings);\n this.dirty = true;\n return { accepted: true, diagnostics: parsed.diagnostics };\n }\n\n /** Rebuilds one batch and returns its deterministic conflict diagnostics. */\n flush(): DoomLeaderDiagnostic[] {\n if (this.dirty) this.rebuild();\n return this.diagnostics.map((item) => ({ ...item }));\n }\n\n getGroup(path: readonly string[]): DoomLeaderGroup | undefined {\n this.flush();\n let current = this.root;\n for (const key of path) {\n const next = current.children.get(key);\n if (!next || next.action) return undefined;\n current = next;\n }\n\n // The key is the sort, at every level. A reader looking for a chord knows the\n // key, not the number some contributor picked for it, and those numbers live\n // across nine packages so no one of them can see the sequence they produce.\n // `order` survives only as group identity: co-contributors to a shared prefix\n // must still agree on it, which is what `metadataMatches` checks.\n const options = [...current.children.values()]\n .sort((left, right) => left.key.localeCompare(right.key))\n .map((node): DoomLeaderResolvedOption => ({\n key: node.key,\n label: node.label,\n ...(node.detail ? { detail: node.detail } : {}),\n hasChildren: node.children.size > 0,\n ...(node.action ? { action: cloneAction(node.action) } : {}),\n }));\n return { label: current.label, options };\n }\n\n getDiagnostics(): DoomLeaderDiagnostic[] {\n return this.flush();\n }\n\n subscribe(listener: () => void): () => void {\n this.listeners.add(listener);\n return () => this.listeners.delete(listener);\n }\n\n private rebuild(): void {\n const nextRoot = createRootNode();\n const diagnostics: DoomLeaderDiagnostic[] = [];\n for (const binding of CORE_BINDINGS) {\n const issue = insertBinding(nextRoot, binding);\n if (issue) throw new Error(`Invalid core leader binding: ${issue.message}`);\n }\n\n for (const [source, bindings] of [...this.contributions.entries()].sort(([left], [right]) =>\n left.localeCompare(right),\n )) {\n for (const binding of [...bindings].sort((left, right) => left.id.localeCompare(right.id))) {\n const issue = insertBinding(nextRoot, {\n id: binding.id,\n source,\n path: binding.path,\n action:\n 'command' in binding\n ? { type: 'command', command: binding.command }\n : { type: 'extension', source, action: binding.action },\n });\n if (issue) diagnostics.push(issue);\n }\n }\n\n this.root = nextRoot;\n this.diagnostics = diagnostics;\n this.dirty = false;\n for (const listener of this.listeners) listener();\n }\n}\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"leaderRegistry.d.cts","names":[],"sources":["../../../src/services/leader/leaderRegistry.ts"],"mappings":";;KAAK;UAmBK;EACR;EACA,QAAQ;;UAGA;EACR;EACA,SAAS;;UAGD;EACR;EACA;EACA,QAAQ;;KAGE,mBAAmB,kBAAkB,sBAAsB;UAEtD;EACf;EACA;EACA;EACA;EACA,SAAS;;UAGM;EACf;EACA,kBAAkB;;UAGH;EACf;EACA;EACA;;UAGe;EACf;EACA,sBAAsB;;cAsbX;UACH;mBACS;mBACA;UACT;UACA;;EAMR,SAAS,iBAAiB;;EAQ1B,iBAAiB,iBAAiB;UAI1B;;EAWR,SAAS;EAKT,SAAS,0BAA0B;EA4BnC,kBAAkB;EAIlB,UAAU;UAKF"}
1
+ {"version":3,"file":"leaderRegistry.d.cts","names":[],"sources":["../../../src/services/leader/leaderRegistry.ts"],"mappings":";;KAAK;UAmBK;EACR;EACA,QAAQ;;UAGA;EACR;EACA,SAAS;;UAGD;EACR;EACA;EACA,QAAQ;;KAGE,mBAAmB,kBAAkB,sBAAsB;UAEtD;EACf;EACA;EACA;EACA;EACA,SAAS;;UAGM;EACf;EACA,kBAAkB;;UAGH;EACf;EACA;EACA;;UAGe;EACf;EACA,sBAAsB;;cAsbX;UACH;mBACS;mBACA;UACT;UACA;EAER;EAIA,SAAS,iBAAiB;;EAQ1B,iBAAiB,iBAAiB;UAI1B;;EAWR,SAAS;EAKT,SAAS,0BAA0B;EA0BnC,kBAAkB;EAIlB,UAAU;UAKF"}
@@ -1 +1 @@
1
- {"version":3,"file":"leaderRegistry.d.mts","names":[],"sources":["../../../src/services/leader/leaderRegistry.ts"],"mappings":";;KAAK;UAmBK;EACR;EACA,QAAQ;;UAGA;EACR;EACA,SAAS;;UAGD;EACR;EACA;EACA,QAAQ;;KAGE,mBAAmB,kBAAkB,sBAAsB;UAEtD;EACf;EACA;EACA;EACA;EACA,SAAS;;UAGM;EACf;EACA,kBAAkB;;UAGH;EACf;EACA;EACA;;UAGe;EACf;EACA,sBAAsB;;cAsbX;UACH;mBACS;mBACA;UACT;UACA;;EAMR,SAAS,iBAAiB;;EAQ1B,iBAAiB,iBAAiB;UAI1B;;EAWR,SAAS;EAKT,SAAS,0BAA0B;EA4BnC,kBAAkB;EAIlB,UAAU;UAKF"}
1
+ {"version":3,"file":"leaderRegistry.d.mts","names":[],"sources":["../../../src/services/leader/leaderRegistry.ts"],"mappings":";;KAAK;UAmBK;EACR;EACA,QAAQ;;UAGA;EACR;EACA,SAAS;;UAGD;EACR;EACA;EACA,QAAQ;;KAGE,mBAAmB,kBAAkB,sBAAsB;UAEtD;EACf;EACA;EACA;EACA;EACA,SAAS;;UAGM;EACf;EACA,kBAAkB;;UAGH;EACf;EACA;EACA;;UAGe;EACf;EACA,sBAAsB;;cAsbX;UACH;mBACS;mBACA;UACT;UACA;EAER;EAIA,SAAS,iBAAiB;;EAQ1B,iBAAiB,iBAAiB;UAI1B;;EAWR,SAAS;EAKT,SAAS,0BAA0B;EA0BnC,kBAAkB;EAIlB,UAAU;UAKF"}
@@ -1 +1 @@
1
- {"version":3,"file":"leaderRegistry.mjs","names":[],"sources":["../../../src/services/leader/leaderRegistry.ts"],"sourcesContent":["type AppKeybinding =\n | 'app.model.select'\n | 'app.model.cycleForward'\n | 'app.thinking.cycle'\n | 'app.session.new'\n | 'app.session.resume'\n | 'app.session.tree'\n | 'app.session.fork'\n | 'app.editor.external'\n | 'app.exit';\n\nimport type {\n LeaderBinding as DoomLeaderBinding,\n LeaderCommand as DoomLeaderCommand,\n LeaderContribution as DoomLeaderContribution,\n LeaderAction as DoomLeaderExtensionAction,\n LeaderSegment as DoomLeaderSegment,\n} from '@agimon-ai/doompi-extension-contracts/leader';\n\ninterface AppLeaderAction {\n type: 'app';\n action: AppKeybinding;\n}\n\ninterface CommandLeaderAction {\n type: 'command';\n command: DoomLeaderCommand;\n}\n\ninterface ExtensionLeaderAction {\n type: 'extension';\n source: string;\n action: DoomLeaderExtensionAction;\n}\n\nexport type DoomLeaderAction = AppLeaderAction | CommandLeaderAction | ExtensionLeaderAction;\n\nexport interface DoomLeaderResolvedOption {\n key: string;\n label: string;\n detail?: string;\n hasChildren: boolean;\n action?: DoomLeaderAction;\n}\n\nexport interface DoomLeaderGroup {\n label: string;\n options: readonly DoomLeaderResolvedOption[];\n}\n\nexport interface DoomLeaderDiagnostic {\n source: string;\n bindingId?: string;\n message: string;\n}\n\nexport interface DoomLeaderRegistrationResult {\n accepted: boolean;\n diagnostics: readonly DoomLeaderDiagnostic[];\n}\n\ninterface InternalLeaderBinding {\n id: string;\n source: string;\n path: readonly [DoomLeaderSegment, ...DoomLeaderSegment[]];\n action: DoomLeaderAction;\n}\n\ninterface LeaderNode {\n key: string;\n label: string;\n detail?: string;\n order: number;\n owner: string;\n bindingId?: string;\n children: Map<string, LeaderNode>;\n action?: DoomLeaderAction;\n}\n\ninterface ParsedContribution {\n contribution?: DoomLeaderContribution;\n diagnostics: DoomLeaderDiagnostic[];\n}\n\nconst CORE_SOURCE = '@agimon-ai/doompi-ui';\nconst UNKNOWN_SOURCE = 'unknown';\nconst ROOT_LABEL = 'leader';\nconst DEFAULT_OPTION_ORDER = 500;\nconst MAX_OPTION_ORDER = 1000;\nconst MAX_PATH_LENGTH = 4;\nconst MAX_SOURCE_LENGTH = 128;\nconst MAX_BINDING_ID_LENGTH = 128;\nconst MAX_LABEL_LENGTH = 32;\nconst MAX_DETAIL_LENGTH = 80;\nconst MAX_COMMAND_NAME_LENGTH = 64;\nconst MAX_COMMAND_ARGUMENT_LENGTH = 256;\nconst MAX_ACTION_NAME_LENGTH = 128;\nconst SAFE_KEY = /^[a-z0-9]$/;\nconst SAFE_IDENTIFIER = /^[a-z0-9][a-z0-9._:-]*$/;\nconst SAFE_SOURCE = /^[A-Za-z0-9@][A-Za-z0-9@/._:-]*$/;\nconst SAFE_COMMAND_NAME = /^[a-z0-9][a-z0-9:_-]*$/;\nconst C0_CONTROL_MAX = 31;\nconst DELETE_CHARACTER = 127;\nconst MODEL_GROUP = { key: 'm', label: 'models', order: 10 } as const;\nconst SESSION_GROUP = { key: 's', label: 'sessions', order: 30 } as const;\nconst EXTENSION_GROUP = { key: 'e', label: 'extension', order: 50 } as const;\nconst HELP_GROUP = { key: 'h', label: 'help', order: 70 } as const;\nconst QUIT_GROUP = { key: 'q', label: 'quit', order: 90 } as const;\n\nfunction coreBinding(\n id: string,\n path: readonly [DoomLeaderSegment, ...DoomLeaderSegment[]],\n action: DoomLeaderAction,\n): InternalLeaderBinding {\n return { id, source: CORE_SOURCE, path, action };\n}\n\nconst CORE_BINDINGS: readonly InternalLeaderBinding[] = [\n coreBinding('model.select', [MODEL_GROUP, { key: 'm', label: 'select', detail: 'choose model', order: 10 }], {\n type: 'app',\n action: 'app.model.select',\n }),\n coreBinding('model.next', [MODEL_GROUP, { key: 'n', label: 'next', detail: 'cycle model', order: 20 }], {\n type: 'app',\n action: 'app.model.cycleForward',\n }),\n coreBinding('thinking.cycle', [MODEL_GROUP, { key: 't', label: 'thinking', detail: 'cycle level', order: 30 }], {\n type: 'app',\n action: 'app.thinking.cycle',\n }),\n coreBinding('tools.open', [EXTENSION_GROUP, { key: 't', label: 'tools', detail: 'browse tools', order: 20 }], {\n type: 'command',\n command: { name: 'tools' },\n }),\n // Core rather than contributed, so no extension owns the key and the panel is\n // reachable even when nothing has contributed a section to it yet.\n coreBinding('config.open', [EXTENSION_GROUP, { key: 'c', label: 'config', detail: 'settings', order: 30 }], {\n type: 'command',\n command: { name: 'config' },\n }),\n coreBinding('session.new', [SESSION_GROUP, { key: 'n', label: 'new', detail: 'fresh session', order: 10 }], {\n type: 'app',\n action: 'app.session.new',\n }),\n coreBinding('session.resume', [SESSION_GROUP, { key: 'r', label: 'resume', detail: 'open history', order: 20 }], {\n type: 'app',\n action: 'app.session.resume',\n }),\n coreBinding('session.tree', [SESSION_GROUP, { key: 't', label: 'tree', detail: 'branch view', order: 30 }], {\n type: 'app',\n action: 'app.session.tree',\n }),\n coreBinding('session.fork', [SESSION_GROUP, { key: 'f', label: 'fork', detail: 'from selection', order: 40 }], {\n type: 'app',\n action: 'app.session.fork',\n }),\n coreBinding('editor.external', [EXTENSION_GROUP, { key: 'e', label: 'external', detail: 'open editor', order: 10 }], {\n type: 'app',\n action: 'app.editor.external',\n }),\n coreBinding('help.hotkeys', [HELP_GROUP, { key: 'h', label: 'hotkeys', detail: 'show bindings' }], {\n type: 'command',\n command: { name: 'hotkeys' },\n }),\n coreBinding('app.exit', [QUIT_GROUP, { key: 'q', label: 'quit', detail: 'exit Pi' }], {\n type: 'app',\n action: 'app.exit',\n }),\n];\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nfunction diagnostic(source: string, message: string, bindingId?: string): DoomLeaderDiagnostic {\n return { source, message, ...(bindingId ? { bindingId } : {}) };\n}\n\nfunction containsControlCharacter(value: string): boolean {\n for (let index = 0; index < value.length; index += 1) {\n const codeUnit = value.charCodeAt(index);\n if (codeUnit <= C0_CONTROL_MAX || codeUnit === DELETE_CHARACTER) return true;\n }\n return false;\n}\n\nfunction readRequiredText(\n value: unknown,\n field: string,\n maximumLength: number,\n source: string,\n diagnostics: DoomLeaderDiagnostic[],\n bindingId?: string,\n): string | undefined {\n if (typeof value !== 'string' || !value.trim()) {\n diagnostics.push(diagnostic(source, `${field} must be a non-empty string.`, bindingId));\n return undefined;\n }\n const text = value.trim();\n if (text.length > maximumLength || containsControlCharacter(text)) {\n diagnostics.push(\n diagnostic(\n source,\n `${field} must be at most ${maximumLength} characters and contain no control characters.`,\n bindingId,\n ),\n );\n return undefined;\n }\n return text;\n}\n\nfunction readOptionalText(\n value: unknown,\n field: string,\n maximumLength: number,\n source: string,\n diagnostics: DoomLeaderDiagnostic[],\n bindingId: string,\n): string | undefined {\n if (value === undefined) return undefined;\n return readRequiredText(value, field, maximumLength, source, diagnostics, bindingId);\n}\n\nfunction parseSegment(\n value: unknown,\n source: string,\n bindingId: string,\n index: number,\n diagnostics: DoomLeaderDiagnostic[],\n): DoomLeaderSegment | undefined {\n if (!isRecord(value)) {\n diagnostics.push(diagnostic(source, `bindings[].path[${index}] must be an object.`, bindingId));\n return undefined;\n }\n\n const key = readRequiredText(value.key, `bindings[].path[${index}].key`, 1, source, diagnostics, bindingId);\n const label = readRequiredText(\n value.label,\n `bindings[].path[${index}].label`,\n MAX_LABEL_LENGTH,\n source,\n diagnostics,\n bindingId,\n );\n const detail = readOptionalText(\n value.detail,\n `bindings[].path[${index}].detail`,\n MAX_DETAIL_LENGTH,\n source,\n diagnostics,\n bindingId,\n );\n let order: number | undefined;\n if (value.order !== undefined) {\n if (!Number.isInteger(value.order) || (value.order as number) < 0 || (value.order as number) > MAX_OPTION_ORDER) {\n diagnostics.push(\n diagnostic(\n source,\n `bindings[].path[${index}].order must be an integer from 0 to ${MAX_OPTION_ORDER}.`,\n bindingId,\n ),\n );\n } else {\n order = value.order as number;\n }\n }\n if (!key || !label || !SAFE_KEY.test(key)) {\n if (key && !SAFE_KEY.test(key)) {\n diagnostics.push(diagnostic(source, `bindings[].path[${index}].key must match ${SAFE_KEY}.`, bindingId));\n }\n return undefined;\n }\n return { key, label, ...(detail ? { detail } : {}), ...(order === undefined ? {} : { order }) };\n}\n\nfunction parseCommand(\n value: unknown,\n source: string,\n bindingId: string,\n diagnostics: DoomLeaderDiagnostic[],\n): DoomLeaderCommand | undefined {\n if (!isRecord(value)) {\n diagnostics.push(diagnostic(source, 'bindings[].command must be an object.', bindingId));\n return undefined;\n }\n const name = readRequiredText(\n value.name,\n 'bindings[].command.name',\n MAX_COMMAND_NAME_LENGTH,\n source,\n diagnostics,\n bindingId,\n );\n const args = readOptionalText(\n value.args,\n 'bindings[].command.args',\n MAX_COMMAND_ARGUMENT_LENGTH,\n source,\n diagnostics,\n bindingId,\n );\n if (!name || !SAFE_COMMAND_NAME.test(name)) {\n if (name && !SAFE_COMMAND_NAME.test(name)) {\n diagnostics.push(diagnostic(source, `bindings[].command.name must match ${SAFE_COMMAND_NAME}.`, bindingId));\n }\n return undefined;\n }\n return { name, ...(args ? { args } : {}) };\n}\n\nfunction parseExtensionAction(\n value: unknown,\n source: string,\n bindingId: string,\n diagnostics: DoomLeaderDiagnostic[],\n): DoomLeaderExtensionAction | undefined {\n if (!isRecord(value)) {\n diagnostics.push(diagnostic(source, 'bindings[].action must be an object.', bindingId));\n return undefined;\n }\n const name = readRequiredText(\n value.name,\n 'bindings[].action.name',\n MAX_ACTION_NAME_LENGTH,\n source,\n diagnostics,\n bindingId,\n );\n if (!name || !SAFE_IDENTIFIER.test(name)) {\n if (name && !SAFE_IDENTIFIER.test(name)) {\n diagnostics.push(diagnostic(source, `bindings[].action.name must match ${SAFE_IDENTIFIER}.`, bindingId));\n }\n return undefined;\n }\n return { name };\n}\n\nfunction parseBinding(\n value: unknown,\n source: string,\n diagnostics: DoomLeaderDiagnostic[],\n): DoomLeaderBinding | undefined {\n if (!isRecord(value)) {\n diagnostics.push(diagnostic(source, 'bindings[] must be an object.'));\n return undefined;\n }\n const bindingId = readRequiredText(value.id, 'bindings[].id', MAX_BINDING_ID_LENGTH, source, diagnostics);\n if (!bindingId) return undefined;\n if (!SAFE_IDENTIFIER.test(bindingId)) {\n diagnostics.push(diagnostic(source, `bindings[].id must match ${SAFE_IDENTIFIER}.`, bindingId));\n return undefined;\n }\n if (!Array.isArray(value.path) || value.path.length === 0 || value.path.length > MAX_PATH_LENGTH) {\n diagnostics.push(\n diagnostic(source, `bindings[].path must contain between 1 and ${MAX_PATH_LENGTH} segments.`, bindingId),\n );\n return undefined;\n }\n\n const path = value.path.map((segment, index) => parseSegment(segment, source, bindingId, index, diagnostics));\n const hasCommand = Object.hasOwn(value, 'command');\n const hasAction = Object.hasOwn(value, 'action');\n if (hasCommand === hasAction) {\n diagnostics.push(diagnostic(source, 'bindings[] must contain exactly one of command or action.', bindingId));\n return undefined;\n }\n const target = hasCommand\n ? { command: parseCommand(value.command, source, bindingId, diagnostics) }\n : { action: parseExtensionAction(value.action, source, bindingId, diagnostics) };\n if (path.some((segment) => segment === undefined)) return undefined;\n if ('command' in target) {\n if (!target.command) return undefined;\n return {\n id: bindingId,\n path: path as [DoomLeaderSegment, ...DoomLeaderSegment[]],\n command: target.command,\n };\n }\n if (!target.action) return undefined;\n return {\n id: bindingId,\n path: path as [DoomLeaderSegment, ...DoomLeaderSegment[]],\n action: target.action,\n };\n}\n\nfunction parseContribution(value: unknown): ParsedContribution {\n const diagnostics: DoomLeaderDiagnostic[] = [];\n if (!isRecord(value)) {\n return { diagnostics: [diagnostic(UNKNOWN_SOURCE, 'Leader contribution must be an object.')] };\n }\n const source = readRequiredText(value.source, 'source', MAX_SOURCE_LENGTH, UNKNOWN_SOURCE, diagnostics);\n if (!source) return { diagnostics };\n if (!SAFE_SOURCE.test(source)) {\n diagnostics.push(diagnostic(source, `source must match ${SAFE_SOURCE}.`));\n return { diagnostics };\n }\n if (!Array.isArray(value.bindings)) {\n return { diagnostics: [diagnostic(source, 'bindings must be an array.')] };\n }\n\n const bindings = value.bindings.map((binding) => parseBinding(binding, source, diagnostics));\n const duplicateIds = bindings\n .flatMap((binding) => (binding ? [binding.id] : []))\n .filter((id, index, ids) => ids.indexOf(id) !== index);\n for (const id of new Set(duplicateIds)) {\n diagnostics.push(diagnostic(source, `Binding id '${id}' is duplicated.`, id));\n }\n if (diagnostics.length > 0 || bindings.some((binding) => binding === undefined)) return { diagnostics };\n\n return {\n contribution: {\n source,\n bindings: bindings as DoomLeaderBinding[],\n },\n diagnostics,\n };\n}\n\nfunction optionOrder(segment: DoomLeaderSegment): number {\n return segment.order ?? DEFAULT_OPTION_ORDER;\n}\n\nfunction cloneAction(action: DoomLeaderAction): DoomLeaderAction {\n if (action.type === 'command') return { type: 'command', command: { ...action.command } };\n if (action.type === 'app') return { type: 'app', action: action.action };\n return { type: 'extension', source: action.source, action: { ...action.action } };\n}\n\nfunction createRootNode(): LeaderNode {\n return {\n key: '',\n label: ROOT_LABEL,\n order: 0,\n owner: CORE_SOURCE,\n children: new Map(),\n };\n}\n\nfunction pathLabel(path: readonly DoomLeaderSegment[]): string {\n return `SPC ${path.map((segment) => segment.key).join(' ')}`;\n}\n\nfunction metadataMatches(node: LeaderNode, segment: DoomLeaderSegment): boolean {\n return node.label === segment.label && node.detail === segment.detail && node.order === optionOrder(segment);\n}\n\nfunction insertBinding(root: LeaderNode, binding: InternalLeaderBinding): DoomLeaderDiagnostic | undefined {\n let current = root;\n let firstMissing = -1;\n\n for (const [index, segment] of binding.path.entries()) {\n const existing = current.children.get(segment.key);\n if (!existing) {\n firstMissing = index;\n break;\n }\n if (!metadataMatches(existing, segment)) {\n return diagnostic(\n binding.source,\n `${pathLabel(binding.path.slice(0, index + 1))} conflicts with metadata from ${existing.owner}.`,\n binding.id,\n );\n }\n const isLeaf = index === binding.path.length - 1;\n if ((!isLeaf && existing.action) || (isLeaf && (existing.action || existing.children.size > 0))) {\n return diagnostic(\n binding.source,\n `${pathLabel(binding.path)} conflicts with an existing binding from ${existing.owner}.`,\n binding.id,\n );\n }\n current = existing;\n }\n\n const start = firstMissing === -1 ? binding.path.length : firstMissing;\n for (let index = start; index < binding.path.length; index += 1) {\n const segment = binding.path[index] as DoomLeaderSegment;\n const node: LeaderNode = {\n key: segment.key,\n label: segment.label,\n ...(segment.detail ? { detail: segment.detail } : {}),\n order: optionOrder(segment),\n owner: binding.source,\n children: new Map(),\n };\n current.children.set(segment.key, node);\n current = node;\n }\n\n current.action = cloneAction(binding.action);\n current.bindingId = binding.id;\n return undefined;\n}\n\nexport class DoomLeaderRegistry {\n private root = createRootNode();\n private readonly contributions = new Map<string, readonly DoomLeaderBinding[]>();\n private readonly listeners = new Set<() => void>();\n private diagnostics: DoomLeaderDiagnostic[] = [];\n private dirty = false;\n\n constructor() {\n this.rebuild();\n }\n\n register(value: unknown): DoomLeaderRegistrationResult {\n const result = this.apply(value);\n if (!result.accepted) return result;\n this.rebuild();\n return { accepted: true, diagnostics: this.getDiagnostics() };\n }\n\n /** Records a contribution without rebuilding the whole tree immediately. */\n registerDeferred(value: unknown): DoomLeaderRegistrationResult {\n return this.apply(value);\n }\n\n private apply(value: unknown): DoomLeaderRegistrationResult {\n const parsed = parseContribution(value);\n if (!parsed.contribution) return { accepted: false, diagnostics: parsed.diagnostics };\n\n if (parsed.contribution.bindings.length === 0) this.contributions.delete(parsed.contribution.source);\n else this.contributions.set(parsed.contribution.source, parsed.contribution.bindings);\n this.dirty = true;\n return { accepted: true, diagnostics: parsed.diagnostics };\n }\n\n /** Rebuilds one batch and returns its deterministic conflict diagnostics. */\n flush(): DoomLeaderDiagnostic[] {\n if (this.dirty) this.rebuild();\n return this.diagnostics.map((item) => ({ ...item }));\n }\n\n getGroup(path: readonly string[]): DoomLeaderGroup | undefined {\n this.flush();\n let current = this.root;\n for (const key of path) {\n const next = current.children.get(key);\n if (!next || next.action) return undefined;\n current = next;\n }\n\n // The key is the sort, at every level. A reader looking for a chord knows the\n // key, not the number some contributor picked for it, and those numbers live\n // across nine packages so no one of them can see the sequence they produce.\n // `order` survives only as group identity: co-contributors to a shared prefix\n // must still agree on it, which is what `metadataMatches` checks.\n const options = [...current.children.values()]\n .sort((left, right) => left.key.localeCompare(right.key))\n .map(\n (node): DoomLeaderResolvedOption => ({\n key: node.key,\n label: node.label,\n ...(node.detail ? { detail: node.detail } : {}),\n hasChildren: node.children.size > 0,\n ...(node.action ? { action: cloneAction(node.action) } : {}),\n }),\n );\n return { label: current.label, options };\n }\n\n getDiagnostics(): DoomLeaderDiagnostic[] {\n return this.flush();\n }\n\n subscribe(listener: () => void): () => void {\n this.listeners.add(listener);\n return () => this.listeners.delete(listener);\n }\n\n private rebuild(): void {\n const nextRoot = createRootNode();\n const diagnostics: DoomLeaderDiagnostic[] = [];\n for (const binding of CORE_BINDINGS) {\n const issue = insertBinding(nextRoot, binding);\n if (issue) throw new Error(`Invalid core leader binding: ${issue.message}`);\n }\n\n for (const [source, bindings] of [...this.contributions.entries()].sort(([left], [right]) =>\n left.localeCompare(right),\n )) {\n for (const binding of [...bindings].sort((left, right) => left.id.localeCompare(right.id))) {\n const issue = insertBinding(nextRoot, {\n id: binding.id,\n source,\n path: binding.path,\n action:\n 'command' in binding\n ? { type: 'command', command: binding.command }\n : { type: 'extension', source, action: binding.action },\n });\n if (issue) diagnostics.push(issue);\n }\n }\n\n this.root = nextRoot;\n this.diagnostics = diagnostics;\n this.dirty = false;\n for (const listener of this.listeners) listener();\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"leaderRegistry.mjs","names":[],"sources":["../../../src/services/leader/leaderRegistry.ts"],"sourcesContent":["type AppKeybinding =\n | 'app.model.select'\n | 'app.model.cycleForward'\n | 'app.thinking.cycle'\n | 'app.session.new'\n | 'app.session.resume'\n | 'app.session.tree'\n | 'app.session.fork'\n | 'app.editor.external'\n | 'app.exit';\n\nimport type {\n LeaderBinding as DoomLeaderBinding,\n LeaderCommand as DoomLeaderCommand,\n LeaderContribution as DoomLeaderContribution,\n LeaderAction as DoomLeaderExtensionAction,\n LeaderSegment as DoomLeaderSegment,\n} from '@agimon-ai/doompi-extension-contracts/leader';\n\ninterface AppLeaderAction {\n type: 'app';\n action: AppKeybinding;\n}\n\ninterface CommandLeaderAction {\n type: 'command';\n command: DoomLeaderCommand;\n}\n\ninterface ExtensionLeaderAction {\n type: 'extension';\n source: string;\n action: DoomLeaderExtensionAction;\n}\n\nexport type DoomLeaderAction = AppLeaderAction | CommandLeaderAction | ExtensionLeaderAction;\n\nexport interface DoomLeaderResolvedOption {\n key: string;\n label: string;\n detail?: string;\n hasChildren: boolean;\n action?: DoomLeaderAction;\n}\n\nexport interface DoomLeaderGroup {\n label: string;\n options: readonly DoomLeaderResolvedOption[];\n}\n\nexport interface DoomLeaderDiagnostic {\n source: string;\n bindingId?: string;\n message: string;\n}\n\nexport interface DoomLeaderRegistrationResult {\n accepted: boolean;\n diagnostics: readonly DoomLeaderDiagnostic[];\n}\n\ninterface InternalLeaderBinding {\n id: string;\n source: string;\n path: readonly [DoomLeaderSegment, ...DoomLeaderSegment[]];\n action: DoomLeaderAction;\n}\n\ninterface LeaderNode {\n key: string;\n label: string;\n detail?: string;\n order: number;\n owner: string;\n bindingId?: string;\n children: Map<string, LeaderNode>;\n action?: DoomLeaderAction;\n}\n\ninterface ParsedContribution {\n contribution?: DoomLeaderContribution;\n diagnostics: DoomLeaderDiagnostic[];\n}\n\nconst CORE_SOURCE = '@agimon-ai/doompi-ui';\nconst UNKNOWN_SOURCE = 'unknown';\nconst ROOT_LABEL = 'leader';\nconst DEFAULT_OPTION_ORDER = 500;\nconst MAX_OPTION_ORDER = 1000;\nconst MAX_PATH_LENGTH = 4;\nconst MAX_SOURCE_LENGTH = 128;\nconst MAX_BINDING_ID_LENGTH = 128;\nconst MAX_LABEL_LENGTH = 32;\nconst MAX_DETAIL_LENGTH = 80;\nconst MAX_COMMAND_NAME_LENGTH = 64;\nconst MAX_COMMAND_ARGUMENT_LENGTH = 256;\nconst MAX_ACTION_NAME_LENGTH = 128;\nconst SAFE_KEY = /^[a-z0-9]$/;\nconst SAFE_IDENTIFIER = /^[a-z0-9][a-z0-9._:-]*$/;\nconst SAFE_SOURCE = /^[A-Za-z0-9@][A-Za-z0-9@/._:-]*$/;\nconst SAFE_COMMAND_NAME = /^[a-z0-9][a-z0-9:_-]*$/;\nconst C0_CONTROL_MAX = 31;\nconst DELETE_CHARACTER = 127;\nconst MODEL_GROUP = { key: 'm', label: 'models', order: 10 } as const;\nconst SESSION_GROUP = { key: 's', label: 'sessions', order: 30 } as const;\nconst EXTENSION_GROUP = { key: 'e', label: 'extension', order: 50 } as const;\nconst HELP_GROUP = { key: 'h', label: 'help', order: 70 } as const;\nconst QUIT_GROUP = { key: 'q', label: 'quit', order: 90 } as const;\n\nfunction coreBinding(\n id: string,\n path: readonly [DoomLeaderSegment, ...DoomLeaderSegment[]],\n action: DoomLeaderAction,\n): InternalLeaderBinding {\n return { id, source: CORE_SOURCE, path, action };\n}\n\nconst CORE_BINDINGS: readonly InternalLeaderBinding[] = [\n coreBinding('model.select', [MODEL_GROUP, { key: 'm', label: 'select', detail: 'choose model', order: 10 }], {\n type: 'app',\n action: 'app.model.select',\n }),\n coreBinding('model.next', [MODEL_GROUP, { key: 'n', label: 'next', detail: 'cycle model', order: 20 }], {\n type: 'app',\n action: 'app.model.cycleForward',\n }),\n coreBinding('thinking.cycle', [MODEL_GROUP, { key: 't', label: 'thinking', detail: 'cycle level', order: 30 }], {\n type: 'app',\n action: 'app.thinking.cycle',\n }),\n coreBinding('tools.open', [EXTENSION_GROUP, { key: 't', label: 'tools', detail: 'browse tools', order: 20 }], {\n type: 'command',\n command: { name: 'tools' },\n }),\n // Core rather than contributed, so no extension owns the key and the panel is\n // reachable even when nothing has contributed a section to it yet.\n coreBinding('config.open', [EXTENSION_GROUP, { key: 'c', label: 'config', detail: 'settings', order: 30 }], {\n type: 'command',\n command: { name: 'config' },\n }),\n coreBinding('session.new', [SESSION_GROUP, { key: 'n', label: 'new', detail: 'fresh session', order: 10 }], {\n type: 'app',\n action: 'app.session.new',\n }),\n coreBinding('session.resume', [SESSION_GROUP, { key: 'r', label: 'resume', detail: 'open history', order: 20 }], {\n type: 'app',\n action: 'app.session.resume',\n }),\n coreBinding('session.tree', [SESSION_GROUP, { key: 't', label: 'tree', detail: 'branch view', order: 30 }], {\n type: 'app',\n action: 'app.session.tree',\n }),\n coreBinding('session.fork', [SESSION_GROUP, { key: 'f', label: 'fork', detail: 'from selection', order: 40 }], {\n type: 'app',\n action: 'app.session.fork',\n }),\n coreBinding('editor.external', [EXTENSION_GROUP, { key: 'e', label: 'external', detail: 'open editor', order: 10 }], {\n type: 'app',\n action: 'app.editor.external',\n }),\n coreBinding('help.hotkeys', [HELP_GROUP, { key: 'h', label: 'hotkeys', detail: 'show bindings' }], {\n type: 'command',\n command: { name: 'hotkeys' },\n }),\n coreBinding('app.exit', [QUIT_GROUP, { key: 'q', label: 'quit', detail: 'exit Pi' }], {\n type: 'app',\n action: 'app.exit',\n }),\n];\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nfunction diagnostic(source: string, message: string, bindingId?: string): DoomLeaderDiagnostic {\n return { source, message, ...(bindingId ? { bindingId } : {}) };\n}\n\nfunction containsControlCharacter(value: string): boolean {\n for (let index = 0; index < value.length; index += 1) {\n const codeUnit = value.charCodeAt(index);\n if (codeUnit <= C0_CONTROL_MAX || codeUnit === DELETE_CHARACTER) return true;\n }\n return false;\n}\n\nfunction readRequiredText(\n value: unknown,\n field: string,\n maximumLength: number,\n source: string,\n diagnostics: DoomLeaderDiagnostic[],\n bindingId?: string,\n): string | undefined {\n if (typeof value !== 'string' || !value.trim()) {\n diagnostics.push(diagnostic(source, `${field} must be a non-empty string.`, bindingId));\n return undefined;\n }\n const text = value.trim();\n if (text.length > maximumLength || containsControlCharacter(text)) {\n diagnostics.push(\n diagnostic(\n source,\n `${field} must be at most ${maximumLength} characters and contain no control characters.`,\n bindingId,\n ),\n );\n return undefined;\n }\n return text;\n}\n\nfunction readOptionalText(\n value: unknown,\n field: string,\n maximumLength: number,\n source: string,\n diagnostics: DoomLeaderDiagnostic[],\n bindingId: string,\n): string | undefined {\n if (value === undefined) return undefined;\n return readRequiredText(value, field, maximumLength, source, diagnostics, bindingId);\n}\n\nfunction parseSegment(\n value: unknown,\n source: string,\n bindingId: string,\n index: number,\n diagnostics: DoomLeaderDiagnostic[],\n): DoomLeaderSegment | undefined {\n if (!isRecord(value)) {\n diagnostics.push(diagnostic(source, `bindings[].path[${index}] must be an object.`, bindingId));\n return undefined;\n }\n\n const key = readRequiredText(value.key, `bindings[].path[${index}].key`, 1, source, diagnostics, bindingId);\n const label = readRequiredText(\n value.label,\n `bindings[].path[${index}].label`,\n MAX_LABEL_LENGTH,\n source,\n diagnostics,\n bindingId,\n );\n const detail = readOptionalText(\n value.detail,\n `bindings[].path[${index}].detail`,\n MAX_DETAIL_LENGTH,\n source,\n diagnostics,\n bindingId,\n );\n let order: number | undefined;\n if (value.order !== undefined) {\n if (!Number.isInteger(value.order) || (value.order as number) < 0 || (value.order as number) > MAX_OPTION_ORDER) {\n diagnostics.push(\n diagnostic(\n source,\n `bindings[].path[${index}].order must be an integer from 0 to ${MAX_OPTION_ORDER}.`,\n bindingId,\n ),\n );\n } else {\n order = value.order as number;\n }\n }\n if (!key || !label || !SAFE_KEY.test(key)) {\n if (key && !SAFE_KEY.test(key)) {\n diagnostics.push(diagnostic(source, `bindings[].path[${index}].key must match ${SAFE_KEY}.`, bindingId));\n }\n return undefined;\n }\n return { key, label, ...(detail ? { detail } : {}), ...(order === undefined ? {} : { order }) };\n}\n\nfunction parseCommand(\n value: unknown,\n source: string,\n bindingId: string,\n diagnostics: DoomLeaderDiagnostic[],\n): DoomLeaderCommand | undefined {\n if (!isRecord(value)) {\n diagnostics.push(diagnostic(source, 'bindings[].command must be an object.', bindingId));\n return undefined;\n }\n const name = readRequiredText(\n value.name,\n 'bindings[].command.name',\n MAX_COMMAND_NAME_LENGTH,\n source,\n diagnostics,\n bindingId,\n );\n const args = readOptionalText(\n value.args,\n 'bindings[].command.args',\n MAX_COMMAND_ARGUMENT_LENGTH,\n source,\n diagnostics,\n bindingId,\n );\n if (!name || !SAFE_COMMAND_NAME.test(name)) {\n if (name && !SAFE_COMMAND_NAME.test(name)) {\n diagnostics.push(diagnostic(source, `bindings[].command.name must match ${SAFE_COMMAND_NAME}.`, bindingId));\n }\n return undefined;\n }\n return { name, ...(args ? { args } : {}) };\n}\n\nfunction parseExtensionAction(\n value: unknown,\n source: string,\n bindingId: string,\n diagnostics: DoomLeaderDiagnostic[],\n): DoomLeaderExtensionAction | undefined {\n if (!isRecord(value)) {\n diagnostics.push(diagnostic(source, 'bindings[].action must be an object.', bindingId));\n return undefined;\n }\n const name = readRequiredText(\n value.name,\n 'bindings[].action.name',\n MAX_ACTION_NAME_LENGTH,\n source,\n diagnostics,\n bindingId,\n );\n if (!name || !SAFE_IDENTIFIER.test(name)) {\n if (name && !SAFE_IDENTIFIER.test(name)) {\n diagnostics.push(diagnostic(source, `bindings[].action.name must match ${SAFE_IDENTIFIER}.`, bindingId));\n }\n return undefined;\n }\n return { name };\n}\n\nfunction parseBinding(\n value: unknown,\n source: string,\n diagnostics: DoomLeaderDiagnostic[],\n): DoomLeaderBinding | undefined {\n if (!isRecord(value)) {\n diagnostics.push(diagnostic(source, 'bindings[] must be an object.'));\n return undefined;\n }\n const bindingId = readRequiredText(value.id, 'bindings[].id', MAX_BINDING_ID_LENGTH, source, diagnostics);\n if (!bindingId) return undefined;\n if (!SAFE_IDENTIFIER.test(bindingId)) {\n diagnostics.push(diagnostic(source, `bindings[].id must match ${SAFE_IDENTIFIER}.`, bindingId));\n return undefined;\n }\n if (!Array.isArray(value.path) || value.path.length === 0 || value.path.length > MAX_PATH_LENGTH) {\n diagnostics.push(\n diagnostic(source, `bindings[].path must contain between 1 and ${MAX_PATH_LENGTH} segments.`, bindingId),\n );\n return undefined;\n }\n\n const path = value.path.map((segment, index) => parseSegment(segment, source, bindingId, index, diagnostics));\n const hasCommand = Object.hasOwn(value, 'command');\n const hasAction = Object.hasOwn(value, 'action');\n if (hasCommand === hasAction) {\n diagnostics.push(diagnostic(source, 'bindings[] must contain exactly one of command or action.', bindingId));\n return undefined;\n }\n const target = hasCommand\n ? { command: parseCommand(value.command, source, bindingId, diagnostics) }\n : { action: parseExtensionAction(value.action, source, bindingId, diagnostics) };\n if (path.some((segment) => segment === undefined)) return undefined;\n if ('command' in target) {\n if (!target.command) return undefined;\n return {\n id: bindingId,\n path: path as [DoomLeaderSegment, ...DoomLeaderSegment[]],\n command: target.command,\n };\n }\n if (!target.action) return undefined;\n return {\n id: bindingId,\n path: path as [DoomLeaderSegment, ...DoomLeaderSegment[]],\n action: target.action,\n };\n}\n\nfunction parseContribution(value: unknown): ParsedContribution {\n const diagnostics: DoomLeaderDiagnostic[] = [];\n if (!isRecord(value)) {\n return { diagnostics: [diagnostic(UNKNOWN_SOURCE, 'Leader contribution must be an object.')] };\n }\n const source = readRequiredText(value.source, 'source', MAX_SOURCE_LENGTH, UNKNOWN_SOURCE, diagnostics);\n if (!source) return { diagnostics };\n if (!SAFE_SOURCE.test(source)) {\n diagnostics.push(diagnostic(source, `source must match ${SAFE_SOURCE}.`));\n return { diagnostics };\n }\n if (!Array.isArray(value.bindings)) {\n return { diagnostics: [diagnostic(source, 'bindings must be an array.')] };\n }\n\n const bindings = value.bindings.map((binding) => parseBinding(binding, source, diagnostics));\n const duplicateIds = bindings\n .flatMap((binding) => (binding ? [binding.id] : []))\n .filter((id, index, ids) => ids.indexOf(id) !== index);\n for (const id of new Set(duplicateIds)) {\n diagnostics.push(diagnostic(source, `Binding id '${id}' is duplicated.`, id));\n }\n if (diagnostics.length > 0 || bindings.some((binding) => binding === undefined)) return { diagnostics };\n\n return {\n contribution: {\n source,\n bindings: bindings as DoomLeaderBinding[],\n },\n diagnostics,\n };\n}\n\nfunction optionOrder(segment: DoomLeaderSegment): number {\n return segment.order ?? DEFAULT_OPTION_ORDER;\n}\n\nfunction cloneAction(action: DoomLeaderAction): DoomLeaderAction {\n if (action.type === 'command') return { type: 'command', command: { ...action.command } };\n if (action.type === 'app') return { type: 'app', action: action.action };\n return { type: 'extension', source: action.source, action: { ...action.action } };\n}\n\nfunction createRootNode(): LeaderNode {\n return {\n key: '',\n label: ROOT_LABEL,\n order: 0,\n owner: CORE_SOURCE,\n children: new Map(),\n };\n}\n\nfunction pathLabel(path: readonly DoomLeaderSegment[]): string {\n return `SPC ${path.map((segment) => segment.key).join(' ')}`;\n}\n\nfunction metadataMatches(node: LeaderNode, segment: DoomLeaderSegment): boolean {\n return node.label === segment.label && node.detail === segment.detail && node.order === optionOrder(segment);\n}\n\nfunction insertBinding(root: LeaderNode, binding: InternalLeaderBinding): DoomLeaderDiagnostic | undefined {\n let current = root;\n let firstMissing = -1;\n\n for (const [index, segment] of binding.path.entries()) {\n const existing = current.children.get(segment.key);\n if (!existing) {\n firstMissing = index;\n break;\n }\n if (!metadataMatches(existing, segment)) {\n return diagnostic(\n binding.source,\n `${pathLabel(binding.path.slice(0, index + 1))} conflicts with metadata from ${existing.owner}.`,\n binding.id,\n );\n }\n const isLeaf = index === binding.path.length - 1;\n if ((!isLeaf && existing.action) || (isLeaf && (existing.action || existing.children.size > 0))) {\n return diagnostic(\n binding.source,\n `${pathLabel(binding.path)} conflicts with an existing binding from ${existing.owner}.`,\n binding.id,\n );\n }\n current = existing;\n }\n\n const start = firstMissing === -1 ? binding.path.length : firstMissing;\n for (let index = start; index < binding.path.length; index += 1) {\n const segment = binding.path[index] as DoomLeaderSegment;\n const node: LeaderNode = {\n key: segment.key,\n label: segment.label,\n ...(segment.detail ? { detail: segment.detail } : {}),\n order: optionOrder(segment),\n owner: binding.source,\n children: new Map(),\n };\n current.children.set(segment.key, node);\n current = node;\n }\n\n current.action = cloneAction(binding.action);\n current.bindingId = binding.id;\n return undefined;\n}\n\nexport class DoomLeaderRegistry {\n private root = createRootNode();\n private readonly contributions = new Map<string, readonly DoomLeaderBinding[]>();\n private readonly listeners = new Set<() => void>();\n private diagnostics: DoomLeaderDiagnostic[] = [];\n private dirty = false;\n\n constructor() {\n this.rebuild();\n }\n\n register(value: unknown): DoomLeaderRegistrationResult {\n const result = this.apply(value);\n if (!result.accepted) return result;\n this.rebuild();\n return { accepted: true, diagnostics: this.getDiagnostics() };\n }\n\n /** Records a contribution without rebuilding the whole tree immediately. */\n registerDeferred(value: unknown): DoomLeaderRegistrationResult {\n return this.apply(value);\n }\n\n private apply(value: unknown): DoomLeaderRegistrationResult {\n const parsed = parseContribution(value);\n if (!parsed.contribution) return { accepted: false, diagnostics: parsed.diagnostics };\n\n if (parsed.contribution.bindings.length === 0) this.contributions.delete(parsed.contribution.source);\n else this.contributions.set(parsed.contribution.source, parsed.contribution.bindings);\n this.dirty = true;\n return { accepted: true, diagnostics: parsed.diagnostics };\n }\n\n /** Rebuilds one batch and returns its deterministic conflict diagnostics. */\n flush(): DoomLeaderDiagnostic[] {\n if (this.dirty) this.rebuild();\n return this.diagnostics.map((item) => ({ ...item }));\n }\n\n getGroup(path: readonly string[]): DoomLeaderGroup | undefined {\n this.flush();\n let current = this.root;\n for (const key of path) {\n const next = current.children.get(key);\n if (!next || next.action) return undefined;\n current = next;\n }\n\n // The key is the sort, at every level. A reader looking for a chord knows the\n // key, not the number some contributor picked for it, and those numbers live\n // across nine packages so no one of them can see the sequence they produce.\n // `order` survives only as group identity: co-contributors to a shared prefix\n // must still agree on it, which is what `metadataMatches` checks.\n const options = [...current.children.values()]\n .sort((left, right) => left.key.localeCompare(right.key))\n .map((node): DoomLeaderResolvedOption => ({\n key: node.key,\n label: node.label,\n ...(node.detail ? { detail: node.detail } : {}),\n hasChildren: node.children.size > 0,\n ...(node.action ? { action: cloneAction(node.action) } : {}),\n }));\n return { label: current.label, options };\n }\n\n getDiagnostics(): DoomLeaderDiagnostic[] {\n return this.flush();\n }\n\n subscribe(listener: () => void): () => void {\n this.listeners.add(listener);\n return () => this.listeners.delete(listener);\n }\n\n private rebuild(): void {\n const nextRoot = createRootNode();\n const diagnostics: DoomLeaderDiagnostic[] = [];\n for (const binding of CORE_BINDINGS) {\n const issue = insertBinding(nextRoot, binding);\n if (issue) throw new Error(`Invalid core leader binding: ${issue.message}`);\n }\n\n for (const [source, bindings] of [...this.contributions.entries()].sort(([left], [right]) =>\n left.localeCompare(right),\n )) {\n for (const binding of [...bindings].sort((left, right) => left.id.localeCompare(right.id))) {\n const issue = insertBinding(nextRoot, {\n id: binding.id,\n source,\n path: binding.path,\n action:\n 'command' in binding\n ? { type: 'command', command: binding.command }\n : { type: 'extension', source, action: binding.action },\n });\n if (issue) diagnostics.push(issue);\n }\n }\n\n this.root = nextRoot;\n this.diagnostics = diagnostics;\n this.dirty = false;\n for (const listener of this.listeners) listener();\n }\n}\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"configOverlay.d.cts","names":[],"sources":["../../src/tui/configOverlay.ts"],"mappings":";;;;cAoHa,+BAA+B;mBACzB;mBACA;mBACA;UACT;UACA;UACA;UACA;UACA;UACA;UACA;;mBAES;UACT;EAEI,YAAA,KAAK,gBAAgB,OAAO,OAAO,UAAU,qBAAqB,OAAO;;UAU7E;EAKR;UAIQ;UAeA;UAIA;UAIA;UAIA;UAIA;UAIA;UAeA;;UAUA;UAUA;EASR,YAAY;UAYJ;UAsDA;UAwBA;UA0BA;UAwBA;;;;;;;UAyBA;;UAeA;UAKA;UAOA;UA6DA;UA4BA;UA2CA;YASE,aAAa;YAcb,WAAW,eAAe;UAmB5B;;UAeO;EACf,eAAe;EACf,OAAO;IAAc;IAAgB;IAAmB;IAAiB;IAAgB;;EACzF,UAAU;;iBAGU,kBAAkB,KAAK,kBAAkB,UAAU,sBAAsB"}
1
+ {"version":3,"file":"configOverlay.d.cts","names":[],"sources":["../../src/tui/configOverlay.ts"],"mappings":";;;;cAoHa,+BAA+B;mBACzB;mBACA;mBACA;UACT;UACA;UACA;UACA;UACA;UACA;UACA;;mBAES;UACT;EAER,YAAY,KAAK,gBAAgB,OAAO,OAAO,UAAU,qBAAqB,OAAO;;UAU7E;EAKR;UAIQ;UAeA;UAIA;UAIA;UAIA;UAIA;UAIA;UAeA;;UAUA;UAUA;EASR,YAAY;UAYJ;UAsDA;UAwBA;UA0BA;UAwBA;;;;;;;UAyBA;;UAeA;UAKA;UAOA;UA6DA;UA4BA;UA2CA;YASE,aAAa;YAcb,WAAW,eAAe;UAmB5B;;UAeO;EACf,eAAe;EACf,OAAO;IAAc;IAAgB;IAAmB;IAAiB;IAAgB;;EACzF,UAAU;;iBAGU,kBAAkB,KAAK,kBAAkB,UAAU,sBAAsB"}
@@ -1 +1 @@
1
- {"version":3,"file":"configOverlay.d.mts","names":[],"sources":["../../src/tui/configOverlay.ts"],"mappings":";;;;cAoHa,+BAA+B;mBACzB;mBACA;mBACA;UACT;UACA;UACA;UACA;UACA;UACA;UACA;;mBAES;UACT;EAEI,YAAA,KAAK,gBAAgB,OAAO,OAAO,UAAU,qBAAqB,OAAO;;UAU7E;EAKR;UAIQ;UAeA;UAIA;UAIA;UAIA;UAIA;UAIA;UAeA;;UAUA;UAUA;EASR,YAAY;UAYJ;UAsDA;UAwBA;UA0BA;UAwBA;;;;;;;UAyBA;;UAeA;UAKA;UAOA;UA6DA;UA4BA;UA2CA;YASE,aAAa;YAcb,WAAW,eAAe;UAmB5B;;UAeO;EACf,eAAe;EACf,OAAO;IAAc;IAAgB;IAAmB;IAAiB;IAAgB;;EACzF,UAAU;;iBAGU,kBAAkB,KAAK,kBAAkB,UAAU,sBAAsB"}
1
+ {"version":3,"file":"configOverlay.d.mts","names":[],"sources":["../../src/tui/configOverlay.ts"],"mappings":";;;;cAoHa,+BAA+B;mBACzB;mBACA;mBACA;UACT;UACA;UACA;UACA;UACA;UACA;UACA;;mBAES;UACT;EAER,YAAY,KAAK,gBAAgB,OAAO,OAAO,UAAU,qBAAqB,OAAO;;UAU7E;EAKR;UAIQ;UAeA;UAIA;UAIA;UAIA;UAIA;UAIA;UAeA;;UAUA;UAUA;EASR,YAAY;UAYJ;UAsDA;UAwBA;UA0BA;UAwBA;;;;;;;UAyBA;;UAeA;UAKA;UAOA;UA6DA;UA4BA;UA2CA;YASE,aAAa;YAcb,WAAW,eAAe;UAmB5B;;UAeO;EACf,eAAe;EACf,OAAO;IAAc;IAAgB;IAAmB;IAAiB;IAAgB;;EACzF,UAAU;;iBAGU,kBAAkB,KAAK,kBAAkB,UAAU,sBAAsB"}
@@ -1 +1 @@
1
- {"version":3,"file":"doomEditor.d.cts","names":[],"sources":["../../src/tui/doomEditor.ts"],"mappings":";;;;;UAOiB;;EAEf;EACA,WAAW;EACX,sBAAsB;EACtB,wBAAwB;EACxB,uBAAuB;EACvB,kBAAkB,gBAAgB;;KAG/B,mBAAmB,UAAU;KAC7B,cAAc,KAAK;cAoCX,mBAAmB;mBAiBX;mBACA;mBAjBF;mBACA;mBACA;mBACA;mBACA;mBACA;mBACA;mBACA;mBACA;UACT;UACA;EAGN,YAAA,KAAK,KACL,aAAa,aACb,aAAa,oBACI,SAAS,aACT,YAAY,iBAC7B,UAAU,eACV,cAAa,aACb,gBAAe;EAkBjB,YAAY;EAgBZ,OAAO;EA4CP;UAMQ;UAMA;UAMA;UAsCA;UAIA;UAyBA;UAMA;UAsBA;UAeA;UAKA;;;;;;;;;;;UAgBA;UAQA;UAMA;UAMA;UAMA"}
1
+ {"version":3,"file":"doomEditor.d.cts","names":[],"sources":["../../src/tui/doomEditor.ts"],"mappings":";;;;;UAOiB;;EAEf;EACA,WAAW;EACX,sBAAsB;EACtB,wBAAwB;EACxB,uBAAuB;EACvB,kBAAkB,gBAAgB;;KAG/B,mBAAmB,UAAU;KAC7B,cAAc,KAAK;cAoCX,mBAAmB;mBAiBX;mBACA;mBAjBF;mBACA;mBACA;mBACA;mBACA;mBACA;mBACA;mBACA;mBACA;UACT;UACA;EAER,YACE,KAAK,KACL,aAAa,aACb,aAAa,oBACI,SAAS,aACT,YAAY,iBAC7B,UAAU,eACV,cAAa,aACb,gBAAe;EAkBjB,YAAY;EAgBZ,OAAO;EA4CP;UAMQ;UAMA;UAMA;UAsCA;UAIA;UAyBA;UAMA;UAsBA;UAeA;UAKA;;;;;;;;;;;UAgBA;UAQA;UAMA;UAMA;UAMA"}
@@ -1 +1 @@
1
- {"version":3,"file":"doomEditor.d.mts","names":[],"sources":["../../src/tui/doomEditor.ts"],"mappings":";;;;;UAOiB;;EAEf;EACA,WAAW;EACX,sBAAsB;EACtB,wBAAwB;EACxB,uBAAuB;EACvB,kBAAkB,gBAAgB;;KAG/B,mBAAmB,UAAU;KAC7B,cAAc,KAAK;cAoCX,mBAAmB;mBAiBX;mBACA;mBAjBF;mBACA;mBACA;mBACA;mBACA;mBACA;mBACA;mBACA;mBACA;UACT;UACA;EAGN,YAAA,KAAK,KACL,aAAa,aACb,aAAa,sBACI,SAAS,aACT,YAAY,iBAC7B,UAAU,eACV,cAAa,aACb,gBAAe;EAkBjB,YAAY;EAgBZ,OAAO;EA4CP;UAMQ;UAMA;UAMA;UAsCA;UAIA;UAyBA;UAMA;UAsBA;UAeA;UAKA;;;;;;;;;;;UAgBA;UAQA;UAMA;UAMA;UAMA"}
1
+ {"version":3,"file":"doomEditor.d.mts","names":[],"sources":["../../src/tui/doomEditor.ts"],"mappings":";;;;;UAOiB;;EAEf;EACA,WAAW;EACX,sBAAsB;EACtB,wBAAwB;EACxB,uBAAuB;EACvB,kBAAkB,gBAAgB;;KAG/B,mBAAmB,UAAU;KAC7B,cAAc,KAAK;cAoCX,mBAAmB;mBAiBX;mBACA;mBAjBF;mBACA;mBACA;mBACA;mBACA;mBACA;mBACA;mBACA;mBACA;UACT;UACA;EAER,YACE,KAAK,KACL,aAAa,aACb,aAAa,sBACI,SAAS,aACT,YAAY,iBAC7B,UAAU,eACV,cAAa,aACb,gBAAe;EAkBjB,YAAY;EAgBZ,OAAO;EA4CP;UAMQ;UAMA;UAMA;UAsCA;UAIA;UAyBA;UAMA;UAsBA;UAeA;UAKA;;;;;;;;;;;UAgBA;UAQA;UAMA;UAMA;UAMA"}
@@ -1 +1 @@
1
- {"version":3,"file":"doomFooter.d.cts","names":[],"sources":["../../src/tui/doomFooter.ts"],"mappings":";;;;;cAmCa,sBAAsB;mBAOd;mBACA;mBACA;mBACA;mBACA;mBAVF;mBACA;mBACA;EAGf,YAAA,KAAK,KACY,OAAO,OACP,SAAS,kBACT,YAAY,4BACZ,gBAAgB,sBAChB,SAAS;EAO5B;EAMA;EAEA,OAAO;UA+BC;UAUA;;UAuBA;;UAKA;UAOA;UAKA;UAaA;UASA;;UAMO;EACf;IACE;IACA;IACA;IACA;IACA,eAAe;IACf,kBAAkB;IAClB,YAAY;IACZ;;EAEF,UAAU"}
1
+ {"version":3,"file":"doomFooter.d.cts","names":[],"sources":["../../src/tui/doomFooter.ts"],"mappings":";;;;;cAmCa,sBAAsB;mBAOd;mBACA;mBACA;mBACA;mBACA;mBAVF;mBACA;mBACA;EAEjB,YACE,KAAK,KACY,OAAO,OACP,SAAS,kBACT,YAAY,4BACZ,gBAAgB,sBAChB,SAAS;EAO5B;EAMA;EAEA,OAAO;UA+BC;UAUA;;UAuBA;;UAKA;UAOA;UAKA;UAaA;UASA;;UAMO;EACf;IACE;IACA;IACA;IACA;IACA,eAAe;IACf,kBAAkB;IAClB,YAAY;IACZ;;EAEF,UAAU"}
@@ -1 +1 @@
1
- {"version":3,"file":"doomFooter.d.mts","names":[],"sources":["../../src/tui/doomFooter.ts"],"mappings":";;;;;cAmCa,sBAAsB;mBAOd;mBACA;mBACA;mBACA;mBACA;mBAVF;mBACA;mBACA;EAGf,YAAA,KAAK,KACY,OAAO,OACP,SAAS,kBACT,YAAY,4BACZ,gBAAgB,sBAChB,SAAS;EAO5B;EAMA;EAEA,OAAO;UA+BC;UAUA;;UAuBA;;UAKA;UAOA;UAKA;UAaA;UASA;;UAMO;EACf;IACE;IACA;IACA;IACA;IACA,eAAe;IACf,kBAAkB;IAClB,YAAY;IACZ;;EAEF,UAAU"}
1
+ {"version":3,"file":"doomFooter.d.mts","names":[],"sources":["../../src/tui/doomFooter.ts"],"mappings":";;;;;cAmCa,sBAAsB;mBAOd;mBACA;mBACA;mBACA;mBACA;mBAVF;mBACA;mBACA;EAEjB,YACE,KAAK,KACY,OAAO,OACP,SAAS,kBACT,YAAY,4BACZ,gBAAgB,sBAChB,SAAS;EAO5B;EAMA;EAEA,OAAO;UA+BC;UAUA;;UAuBA;;UAKA;UAOA;UAKA;UAaA;UASA;;UAMO;EACf;IACE;IACA;IACA;IACA;IACA,eAAe;IACf,kBAAkB;IAClB,YAAY;IACZ;;EAEF,UAAU"}
@@ -1 +1 @@
1
- {"version":3,"file":"doomHeader.d.cts","names":[],"sources":["../../src/tui/doomHeader.ts"],"mappings":";;;;KA6DK,uBAAuB;KACvB;KACA,gBAAgB,KAAK;cAEb,sBAAsB;mBAEd;mBACA;mBACA;mBACA;mBACA;EAJA,YAAA,OAAO,OACP,aACA,eAAc,gBACd,UAAU,2BACV,kBAAiB;EAGpC;EAEA,OAAO;UAwBC;UA4CA;UA4BA;UAwBA;UAUA;UAYA;UAIA;UAMA;UAKA;UAQA;UAIA;UAKA;UAMA;UAIA"}
1
+ {"version":3,"file":"doomHeader.d.cts","names":[],"sources":["../../src/tui/doomHeader.ts"],"mappings":";;;;KA6DK,uBAAuB;KACvB;KACA,gBAAgB,KAAK;cAEb,sBAAsB;mBAEd;mBACA;mBACA;mBACA;mBACA;EALnB,YACmB,OAAO,OACP,aACA,eAAc,gBACd,UAAU,2BACV,kBAAiB;EAGpC;EAEA,OAAO;UAwBC;UA4CA;UA4BA;UAwBA;UAUA;UAYA;UAIA;UAMA;UAKA;UAQA;UAIA;UAKA;UAMA;UAIA"}
@@ -1 +1 @@
1
- {"version":3,"file":"doomHeader.d.mts","names":[],"sources":["../../src/tui/doomHeader.ts"],"mappings":";;;;KA6DK,uBAAuB;KACvB;KACA,gBAAgB,KAAK;cAEb,sBAAsB;mBAEd;mBACA;mBACA;mBACA;mBACA;EAJA,YAAA,OAAO,OACP,aACA,eAAc,gBACd,UAAU,2BACV,kBAAiB;EAGpC;EAEA,OAAO;UAwBC;UA4CA;UA4BA;UAwBA;UAUA;UAYA;UAIA;UAMA;UAKA;UAQA;UAIA;UAKA;UAMA;UAIA"}
1
+ {"version":3,"file":"doomHeader.d.mts","names":[],"sources":["../../src/tui/doomHeader.ts"],"mappings":";;;;KA6DK,uBAAuB;KACvB;KACA,gBAAgB,KAAK;cAEb,sBAAsB;mBAEd;mBACA;mBACA;mBACA;mBACA;EALnB,YACmB,OAAO,OACP,aACA,eAAc,gBACd,UAAU,2BACV,kBAAiB;EAGpC;EAEA,OAAO;UAwBC;UA4CA;UA4BA;UAwBA;UAUA;UAYA;UAIA;UAMA;UAKA;UAQA;UAIA;UAKA;UAMA;UAIA"}
@@ -36,15 +36,15 @@ interface DoomOverlayChrome {
36
36
  declare const DOOM_OVERLAY_ACCENT = "mdHeading";
37
37
  /** Canonical legend tokens for list/roster navigation and detail-pane scrolling. */
38
38
  declare const DOOM_NAVIGATION_KEYS: {
39
- readonly list: "↑↓";
40
- readonly detail: "JK";
39
+ readonly list: '↑↓';
40
+ readonly detail: 'JK';
41
41
  };
42
42
  declare const DOOM_FULLSCREEN_UI_OPTIONS: {
43
43
  readonly overlay: true;
44
44
  readonly overlayOptions: {
45
- readonly anchor: "top-left";
46
- readonly width: "100%";
47
- readonly maxHeight: "100%";
45
+ readonly anchor: 'top-left';
46
+ readonly width: '100%';
47
+ readonly maxHeight: '100%';
48
48
  readonly margin: 0;
49
49
  };
50
50
  };
@@ -1 +1 @@
1
- {"version":3,"file":"doomOverlay.d.cts","names":[],"sources":["../../src/tui/doomOverlay.ts"],"mappings":";;;UA8BiB;EACf;IACE;IACA;;EAEF,cAAc;;UAGC;EACf;EACA;EACA;EACA;EACA;;;;;;EAMA;;;;;;EAMA,SAAS,WAAW;;;;;;;;cAST;;cAGA;WAAA;WAAA;;cAKA;;;;;;;;;uBAoBS,uBAAuB;qBAEtB,KAAK;qBACL,OAAO;YAFnB,YACY,KAAK,gBACL,OAAO;EAG5B;EAIA,OAAO;qBA4BY,aAAa;qBAEb,WAAW,eAAe;;;;;;UAOrC;UAcA;UAUA;UAqBA;;;;;;UAYA;;;;;;UAkBA;UAMA"}
1
+ {"version":3,"file":"doomOverlay.d.cts","names":[],"sources":["../../src/tui/doomOverlay.ts"],"mappings":";;;UA8BiB;EACf;IACE;IACA;;EAEF,cAAc;;UAGC;EACf;EACA;EACA;EACA;EACA;;;;;;EAMA;;;;;;EAMA,SAAS,WAAW;;;;;;;;cAST;;cAGA;WACX;WACA;;cAGW;WACX;WACA;aACE;aACA;aACA;aACA;;;uBAckB,uBAAuB;qBAEtB,KAAK;qBACL,OAAO;YAFnB,YACY,KAAK,gBACL,OAAO;EAG5B;EAIA,OAAO;qBA4BY,aAAa;qBAEb,WAAW,eAAe;;;;;;UAOrC;UAcA;UAUA;UAqBA;;;;;;UAYA;;;;;;UAkBA;UAMA"}
@@ -36,15 +36,15 @@ interface DoomOverlayChrome {
36
36
  declare const DOOM_OVERLAY_ACCENT = "mdHeading";
37
37
  /** Canonical legend tokens for list/roster navigation and detail-pane scrolling. */
38
38
  declare const DOOM_NAVIGATION_KEYS: {
39
- readonly list: "↑↓";
40
- readonly detail: "JK";
39
+ readonly list: '↑↓';
40
+ readonly detail: 'JK';
41
41
  };
42
42
  declare const DOOM_FULLSCREEN_UI_OPTIONS: {
43
43
  readonly overlay: true;
44
44
  readonly overlayOptions: {
45
- readonly anchor: "top-left";
46
- readonly width: "100%";
47
- readonly maxHeight: "100%";
45
+ readonly anchor: 'top-left';
46
+ readonly width: '100%';
47
+ readonly maxHeight: '100%';
48
48
  readonly margin: 0;
49
49
  };
50
50
  };
@@ -1 +1 @@
1
- {"version":3,"file":"doomOverlay.d.mts","names":[],"sources":["../../src/tui/doomOverlay.ts"],"mappings":";;;UA8BiB;EACf;IACE;IACA;;EAEF,cAAc;;UAGC;EACf;EACA;EACA;EACA;EACA;;;;;;EAMA;;;;;;EAMA,SAAS,WAAW;;;;;;;;cAST;;cAGA;WAAA;WAAA;;cAKA;;;;;;;;;uBAoBS,uBAAuB;qBAEtB,KAAK;qBACL,OAAO;YAFnB,YACY,KAAK,gBACL,OAAO;EAG5B;EAIA,OAAO;qBA4BY,aAAa;qBAEb,WAAW,eAAe;;;;;;UAOrC;UAcA;UAUA;UAqBA;;;;;;UAYA;;;;;;UAkBA;UAMA"}
1
+ {"version":3,"file":"doomOverlay.d.mts","names":[],"sources":["../../src/tui/doomOverlay.ts"],"mappings":";;;UA8BiB;EACf;IACE;IACA;;EAEF,cAAc;;UAGC;EACf;EACA;EACA;EACA;EACA;;;;;;EAMA;;;;;;EAMA,SAAS,WAAW;;;;;;;;cAST;;cAGA;WACX;WACA;;cAGW;WACX;WACA;aACE;aACA;aACA;aACA;;;uBAckB,uBAAuB;qBAEtB,KAAK;qBACL,OAAO;YAFnB,YACY,KAAK,gBACL,OAAO;EAG5B;EAIA,OAAO;qBA4BY,aAAa;qBAEb,WAAW,eAAe;;;;;;UAOrC;UAcA;UAUA;UAqBA;;;;;;UAYA;;;;;;UAkBA;UAMA"}
@@ -1 +1 @@
1
- {"version":3,"file":"leaderHints.d.cts","names":[],"sources":["../../src/tui/leaderHints.ts"],"mappings":";;;;cA+Ca,uBAAuB;mBAEf;mBACA;mBACA;mBACA;mBACA;EAJA,YAAA,OAAO,OACP,UAAU,gBACV,UAAU,8BACV,aAAa,wCACb,iBAAgB;EAGnC;EAEA,OAAO;;;;;UAkDC;;UA+BA;UA8BA;;;;;;;;;UAYA;UAUA;UAoCA"}
1
+ {"version":3,"file":"leaderHints.d.cts","names":[],"sources":["../../src/tui/leaderHints.ts"],"mappings":";;;;cA+Ca,uBAAuB;mBAEf;mBACA;mBACA;mBACA;mBACA;EALnB,YACmB,OAAO,OACP,UAAU,gBACV,UAAU,8BACV,aAAa,wCACb,iBAAgB;EAGnC;EAEA,OAAO;;;;;UAkDC;;UA+BA;UA8BA;;;;;;;;;UAYA;UAUA;UAoCA"}
@@ -1 +1 @@
1
- {"version":3,"file":"leaderHints.d.mts","names":[],"sources":["../../src/tui/leaderHints.ts"],"mappings":";;;;cA+Ca,uBAAuB;mBAEf;mBACA;mBACA;mBACA;mBACA;EAJA,YAAA,OAAO,OACP,UAAU,gBACV,UAAU,8BACV,aAAa,wCACb,iBAAgB;EAGnC;EAEA,OAAO;;;;;UAkDC;;UA+BA;UA8BA;;;;;;;;;UAYA;UAUA;UAoCA"}
1
+ {"version":3,"file":"leaderHints.d.mts","names":[],"sources":["../../src/tui/leaderHints.ts"],"mappings":";;;;cA+Ca,uBAAuB;mBAEf;mBACA;mBACA;mBACA;mBACA;EALnB,YACmB,OAAO,OACP,UAAU,gBACV,UAAU,8BACV,aAAa,wCACb,iBAAgB;EAGnC;EAEA,OAAO;;;;;UAkDC;;UA+BA;UA8BA;;;;;;;;;UAYA;UAUA;UAoCA"}
@@ -1 +1 @@
1
- {"version":3,"file":"matrixPicker.d.cts","names":[],"sources":["../../src/tui/matrixPicker.ts"],"mappings":";;;UA2CiB;EACf;;EAEA,OAAO;;EAEP;EACA;;;;;;;;iBASc,UAAU,OAAO,cAAc,oBAAoB,iBAAiB;;iBASpE,cAAc,OAAO,cAAc;iBAInC,YAAY,oBAAoB;;;;;;;;cAWnC,8BAA8B;mBACxB;mBACA;mBACA;mBACA;mBACA;mBAGA;mBACA;UACT;UACA;UACA;UACA;EAGN,YAAA,SAAS,qBACT,OAAO,OACP,aAAa,sBACb,OAAO;UAqBD;;;;;UAyBA;UAcA;UAKA;EAQR,YAAY"}
1
+ {"version":3,"file":"matrixPicker.d.cts","names":[],"sources":["../../src/tui/matrixPicker.ts"],"mappings":";;;UA2CiB;EACf;;EAEA,OAAO;;EAEP;EACA;;;;;;;;iBASc,UAAU,OAAO,cAAc,oBAAoB,iBAAiB;;iBASpE,cAAc,OAAO,cAAc;iBAInC,YAAY,oBAAoB;;;;;;;;cAWnC,8BAA8B;mBACxB;mBACA;mBACA;mBACA;mBACA;mBAGA;mBACA;UACT;UACA;UACA;UACA;EAER,YACE,SAAS,qBACT,OAAO,OACP,aAAa,sBACb,OAAO;UAqBD;;;;;UAyBA;UAcA;UAKA;EAQR,YAAY"}
@@ -1 +1 @@
1
- {"version":3,"file":"matrixPicker.d.mts","names":[],"sources":["../../src/tui/matrixPicker.ts"],"mappings":";;;UA2CiB;EACf;;EAEA,OAAO;;EAEP;EACA;;;;;;;;iBASc,UAAU,OAAO,cAAc,oBAAoB,iBAAiB;;iBASpE,cAAc,OAAO,cAAc;iBAInC,YAAY,oBAAoB;;;;;;;;cAWnC,8BAA8B;mBACxB;mBACA;mBACA;mBACA;mBACA;mBAGA;mBACA;UACT;UACA;UACA;UACA;EAGN,YAAA,SAAS,qBACT,OAAO,OACP,aAAa,oBACb,OAAO;UAqBD;;;;;UAyBA;UAcA;UAKA;EAQR,YAAY"}
1
+ {"version":3,"file":"matrixPicker.d.mts","names":[],"sources":["../../src/tui/matrixPicker.ts"],"mappings":";;;UA2CiB;EACf;;EAEA,OAAO;;EAEP;EACA;;;;;;;;iBASc,UAAU,OAAO,cAAc,oBAAoB,iBAAiB;;iBASpE,cAAc,OAAO,cAAc;iBAInC,YAAY,oBAAoB;;;;;;;;cAWnC,8BAA8B;mBACxB;mBACA;mBACA;mBACA;mBACA;mBAGA;mBACA;UACT;UACA;UACA;UACA;EAER,YACE,SAAS,qBACT,OAAO,OACP,aAAa,oBACb,OAAO;UAqBD;;;;;UAyBA;UAcA;UAKA;EAQR,YAAY"}
@@ -10,91 +10,91 @@ declare function agentIdentityColor(identity: string): FooterTextColor;
10
10
  */
11
11
  declare function allocateAgentIdentityColor(identity: string, occupied: ReadonlySet<FooterTextColor>): FooterTextColor;
12
12
  declare const DEFAULT_THEME: {
13
- readonly $schema: "https://raw.githubusercontent.com/earendil-works/pi/main/packages/coding-agent/src/modes/interactive/theme/theme-schema.json";
13
+ readonly $schema: 'https://raw.githubusercontent.com/earendil-works/pi/main/packages/coding-agent/src/modes/interactive/theme/theme-schema.json';
14
14
  readonly name: "doom-pi-dark";
15
15
  readonly vars: {
16
- readonly bg: "#282c34";
17
- readonly bgAlt: "#21242b";
18
- readonly bgActive: "#3e4451";
19
- readonly bgHover: "#3e4451";
20
- readonly fg: "#bbc2cf";
21
- readonly fgAlt: "#9ca0a4";
22
- readonly grey: "#3f444a";
23
- readonly greyAlt: "#5b6268";
24
- readonly blue: "#51afef";
25
- readonly darkBlue: "#2257a0";
26
- readonly cyan: "#46d9ff";
27
- readonly green: "#98be65";
28
- readonly lightGreen: "#a8cc8a";
29
- readonly teal: "#4db5bd";
30
- readonly orange: "#da8548";
31
- readonly red: "#ff6c6b";
32
- readonly violet: "#a9a1e1";
33
- readonly magenta: "#c678dd";
34
- readonly yellow: "#ecbe7b";
35
- readonly lightYellow: "#f0c674";
36
- readonly comment: "#5b6268";
37
- readonly diffAddedBg: "#1b2315";
38
- readonly diffRemovedBg: "#2b1c20";
16
+ readonly bg: '#282c34';
17
+ readonly bgAlt: '#21242b';
18
+ readonly bgActive: '#3e4451';
19
+ readonly bgHover: '#3e4451';
20
+ readonly fg: '#bbc2cf';
21
+ readonly fgAlt: '#9ca0a4';
22
+ readonly grey: '#3f444a';
23
+ readonly greyAlt: '#5b6268';
24
+ readonly blue: '#51afef';
25
+ readonly darkBlue: '#2257a0';
26
+ readonly cyan: '#46d9ff';
27
+ readonly green: '#98be65';
28
+ readonly lightGreen: '#a8cc8a';
29
+ readonly teal: '#4db5bd';
30
+ readonly orange: '#da8548';
31
+ readonly red: '#ff6c6b';
32
+ readonly violet: '#a9a1e1';
33
+ readonly magenta: '#c678dd';
34
+ readonly yellow: '#ecbe7b';
35
+ readonly lightYellow: '#f0c674';
36
+ readonly comment: '#5b6268';
37
+ readonly diffAddedBg: '#1b2315';
38
+ readonly diffRemovedBg: '#2b1c20';
39
39
  };
40
40
  readonly colors: {
41
- readonly accent: "blue";
42
- readonly border: "greyAlt";
43
- readonly borderAccent: "blue";
44
- readonly borderMuted: "grey";
45
- readonly success: "green";
46
- readonly error: "red";
47
- readonly warning: "yellow";
48
- readonly muted: "fgAlt";
49
- readonly dim: "comment";
50
- readonly text: "fg";
51
- readonly thinkingText: "fgAlt";
52
- readonly selectedBg: "bgHover";
53
- readonly userMessageBg: "bgActive";
54
- readonly userMessageText: "fg";
55
- readonly customMessageBg: "#2d253f";
56
- readonly customMessageText: "fg";
57
- readonly customMessageLabel: "violet";
58
- readonly toolPendingBg: "bgAlt";
59
- readonly toolSuccessBg: "diffAddedBg";
60
- readonly toolErrorBg: "diffRemovedBg";
61
- readonly toolTitle: "blue";
62
- readonly toolOutput: "fg";
63
- readonly mdHeading: "magenta";
64
- readonly mdLink: "blue";
65
- readonly mdLinkUrl: "comment";
66
- readonly mdCode: "cyan";
67
- readonly mdCodeBlock: "lightYellow";
68
- readonly mdCodeBlockBorder: "greyAlt";
69
- readonly mdQuote: "fgAlt";
70
- readonly mdQuoteBorder: "greyAlt";
71
- readonly mdHr: "greyAlt";
72
- readonly mdListBullet: "blue";
73
- readonly toolDiffAdded: "lightGreen";
74
- readonly toolDiffRemoved: "red";
75
- readonly toolDiffContext: "fgAlt";
76
- readonly syntaxComment: "comment";
77
- readonly syntaxKeyword: "blue";
78
- readonly syntaxFunction: "magenta";
79
- readonly syntaxVariable: "violet";
80
- readonly syntaxString: "green";
81
- readonly syntaxNumber: "orange";
82
- readonly syntaxType: "yellow";
83
- readonly syntaxOperator: "orange";
84
- readonly syntaxPunctuation: "fgAlt";
85
- readonly thinkingOff: "grey";
86
- readonly thinkingMinimal: "fgAlt";
87
- readonly thinkingLow: "darkBlue";
88
- readonly thinkingMedium: "blue";
89
- readonly thinkingHigh: "teal";
90
- readonly thinkingXhigh: "magenta";
91
- readonly thinkingMax: "red";
92
- readonly bashMode: "lightGreen";
41
+ readonly accent: 'blue';
42
+ readonly border: 'greyAlt';
43
+ readonly borderAccent: 'blue';
44
+ readonly borderMuted: 'grey';
45
+ readonly success: 'green';
46
+ readonly error: 'red';
47
+ readonly warning: 'yellow';
48
+ readonly muted: 'fgAlt';
49
+ readonly dim: 'comment';
50
+ readonly text: 'fg';
51
+ readonly thinkingText: 'fgAlt';
52
+ readonly selectedBg: 'bgHover';
53
+ readonly userMessageBg: 'bgActive';
54
+ readonly userMessageText: 'fg';
55
+ readonly customMessageBg: '#2d253f';
56
+ readonly customMessageText: 'fg';
57
+ readonly customMessageLabel: 'violet';
58
+ readonly toolPendingBg: 'bgAlt';
59
+ readonly toolSuccessBg: 'diffAddedBg';
60
+ readonly toolErrorBg: 'diffRemovedBg';
61
+ readonly toolTitle: 'blue';
62
+ readonly toolOutput: 'fg';
63
+ readonly mdHeading: 'magenta';
64
+ readonly mdLink: 'blue';
65
+ readonly mdLinkUrl: 'comment';
66
+ readonly mdCode: 'cyan';
67
+ readonly mdCodeBlock: 'lightYellow';
68
+ readonly mdCodeBlockBorder: 'greyAlt';
69
+ readonly mdQuote: 'fgAlt';
70
+ readonly mdQuoteBorder: 'greyAlt';
71
+ readonly mdHr: 'greyAlt';
72
+ readonly mdListBullet: 'blue';
73
+ readonly toolDiffAdded: 'lightGreen';
74
+ readonly toolDiffRemoved: 'red';
75
+ readonly toolDiffContext: 'fgAlt';
76
+ readonly syntaxComment: 'comment';
77
+ readonly syntaxKeyword: 'blue';
78
+ readonly syntaxFunction: 'magenta';
79
+ readonly syntaxVariable: 'violet';
80
+ readonly syntaxString: 'green';
81
+ readonly syntaxNumber: 'orange';
82
+ readonly syntaxType: 'yellow';
83
+ readonly syntaxOperator: 'orange';
84
+ readonly syntaxPunctuation: 'fgAlt';
85
+ readonly thinkingOff: 'grey';
86
+ readonly thinkingMinimal: 'fgAlt';
87
+ readonly thinkingLow: 'darkBlue';
88
+ readonly thinkingMedium: 'blue';
89
+ readonly thinkingHigh: 'teal';
90
+ readonly thinkingXhigh: 'magenta';
91
+ readonly thinkingMax: 'red';
92
+ readonly bashMode: 'lightGreen';
93
93
  };
94
94
  readonly export: {
95
- readonly pageBg: "bg";
96
- readonly cardBg: "bgAlt";
97
- readonly infoBg: "#343225";
95
+ readonly pageBg: 'bg';
96
+ readonly cardBg: 'bgAlt';
97
+ readonly infoBg: '#343225';
98
98
  };
99
99
  };
100
100
  declare function writeDefaultTheme(temporaryDirectory: string): Promise<string>;
@@ -1 +1 @@
1
- {"version":3,"file":"theme.d.cts","names":[],"sources":["../../src/tui/theme.ts"],"mappings":";;cAKa;;iBAqBG,mBAAmB,mBAAmB;;;;;;iBAStC,2BAA2B,kBAAkB,UAAU,YAAY,mBAAmB;cASzF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAyGS,kBAAkB,6BAA6B"}
1
+ {"version":3,"file":"theme.d.cts","names":[],"sources":["../../src/tui/theme.ts"],"mappings":";;cAKa;;iBAqBG,mBAAmB,mBAAmB;;;;;;iBAStC,2BAA2B,kBAAkB,UAAU,YAAY,mBAAmB;cASzF;WACX;WAEA;WAGA;aACE;aACA;aACA;aACA;aACA;aACA;aACA;aACA;aACA;aACA;aACA;aACA;aACA;aACA;aACA;aACA;aACA;aACA;aACA;aACA;aACA;aAKA;aACA;;WAEF;aACE;aACA;aACA;aACA;aACA;aACA;aACA;aACA;aACA;aACA;aACA;aAEA;aACA;aACA;aACA;aACA;aACA;aACA;aAGA;aACA;aACA;aACA;aAEA;aACA;aACA;aACA;aACA;aACA;aACA;aACA;aACA;aACA;aAEA;aACA;aACA;aAEA;aACA;aACA;aACA;aACA;aACA;aACA;aACA;aACA;aAGA;aACA;aACA;aACA;aACA;aACA;aACA;aAEA;;WAEF;aACE;aACA;aACA;;;iBAIkB,kBAAkB,6BAA6B"}
@@ -10,91 +10,91 @@ declare function agentIdentityColor(identity: string): FooterTextColor;
10
10
  */
11
11
  declare function allocateAgentIdentityColor(identity: string, occupied: ReadonlySet<FooterTextColor>): FooterTextColor;
12
12
  declare const DEFAULT_THEME: {
13
- readonly $schema: "https://raw.githubusercontent.com/earendil-works/pi/main/packages/coding-agent/src/modes/interactive/theme/theme-schema.json";
13
+ readonly $schema: 'https://raw.githubusercontent.com/earendil-works/pi/main/packages/coding-agent/src/modes/interactive/theme/theme-schema.json';
14
14
  readonly name: "doom-pi-dark";
15
15
  readonly vars: {
16
- readonly bg: "#282c34";
17
- readonly bgAlt: "#21242b";
18
- readonly bgActive: "#3e4451";
19
- readonly bgHover: "#3e4451";
20
- readonly fg: "#bbc2cf";
21
- readonly fgAlt: "#9ca0a4";
22
- readonly grey: "#3f444a";
23
- readonly greyAlt: "#5b6268";
24
- readonly blue: "#51afef";
25
- readonly darkBlue: "#2257a0";
26
- readonly cyan: "#46d9ff";
27
- readonly green: "#98be65";
28
- readonly lightGreen: "#a8cc8a";
29
- readonly teal: "#4db5bd";
30
- readonly orange: "#da8548";
31
- readonly red: "#ff6c6b";
32
- readonly violet: "#a9a1e1";
33
- readonly magenta: "#c678dd";
34
- readonly yellow: "#ecbe7b";
35
- readonly lightYellow: "#f0c674";
36
- readonly comment: "#5b6268";
37
- readonly diffAddedBg: "#1b2315";
38
- readonly diffRemovedBg: "#2b1c20";
16
+ readonly bg: '#282c34';
17
+ readonly bgAlt: '#21242b';
18
+ readonly bgActive: '#3e4451';
19
+ readonly bgHover: '#3e4451';
20
+ readonly fg: '#bbc2cf';
21
+ readonly fgAlt: '#9ca0a4';
22
+ readonly grey: '#3f444a';
23
+ readonly greyAlt: '#5b6268';
24
+ readonly blue: '#51afef';
25
+ readonly darkBlue: '#2257a0';
26
+ readonly cyan: '#46d9ff';
27
+ readonly green: '#98be65';
28
+ readonly lightGreen: '#a8cc8a';
29
+ readonly teal: '#4db5bd';
30
+ readonly orange: '#da8548';
31
+ readonly red: '#ff6c6b';
32
+ readonly violet: '#a9a1e1';
33
+ readonly magenta: '#c678dd';
34
+ readonly yellow: '#ecbe7b';
35
+ readonly lightYellow: '#f0c674';
36
+ readonly comment: '#5b6268';
37
+ readonly diffAddedBg: '#1b2315';
38
+ readonly diffRemovedBg: '#2b1c20';
39
39
  };
40
40
  readonly colors: {
41
- readonly accent: "blue";
42
- readonly border: "greyAlt";
43
- readonly borderAccent: "blue";
44
- readonly borderMuted: "grey";
45
- readonly success: "green";
46
- readonly error: "red";
47
- readonly warning: "yellow";
48
- readonly muted: "fgAlt";
49
- readonly dim: "comment";
50
- readonly text: "fg";
51
- readonly thinkingText: "fgAlt";
52
- readonly selectedBg: "bgHover";
53
- readonly userMessageBg: "bgActive";
54
- readonly userMessageText: "fg";
55
- readonly customMessageBg: "#2d253f";
56
- readonly customMessageText: "fg";
57
- readonly customMessageLabel: "violet";
58
- readonly toolPendingBg: "bgAlt";
59
- readonly toolSuccessBg: "diffAddedBg";
60
- readonly toolErrorBg: "diffRemovedBg";
61
- readonly toolTitle: "blue";
62
- readonly toolOutput: "fg";
63
- readonly mdHeading: "magenta";
64
- readonly mdLink: "blue";
65
- readonly mdLinkUrl: "comment";
66
- readonly mdCode: "cyan";
67
- readonly mdCodeBlock: "lightYellow";
68
- readonly mdCodeBlockBorder: "greyAlt";
69
- readonly mdQuote: "fgAlt";
70
- readonly mdQuoteBorder: "greyAlt";
71
- readonly mdHr: "greyAlt";
72
- readonly mdListBullet: "blue";
73
- readonly toolDiffAdded: "lightGreen";
74
- readonly toolDiffRemoved: "red";
75
- readonly toolDiffContext: "fgAlt";
76
- readonly syntaxComment: "comment";
77
- readonly syntaxKeyword: "blue";
78
- readonly syntaxFunction: "magenta";
79
- readonly syntaxVariable: "violet";
80
- readonly syntaxString: "green";
81
- readonly syntaxNumber: "orange";
82
- readonly syntaxType: "yellow";
83
- readonly syntaxOperator: "orange";
84
- readonly syntaxPunctuation: "fgAlt";
85
- readonly thinkingOff: "grey";
86
- readonly thinkingMinimal: "fgAlt";
87
- readonly thinkingLow: "darkBlue";
88
- readonly thinkingMedium: "blue";
89
- readonly thinkingHigh: "teal";
90
- readonly thinkingXhigh: "magenta";
91
- readonly thinkingMax: "red";
92
- readonly bashMode: "lightGreen";
41
+ readonly accent: 'blue';
42
+ readonly border: 'greyAlt';
43
+ readonly borderAccent: 'blue';
44
+ readonly borderMuted: 'grey';
45
+ readonly success: 'green';
46
+ readonly error: 'red';
47
+ readonly warning: 'yellow';
48
+ readonly muted: 'fgAlt';
49
+ readonly dim: 'comment';
50
+ readonly text: 'fg';
51
+ readonly thinkingText: 'fgAlt';
52
+ readonly selectedBg: 'bgHover';
53
+ readonly userMessageBg: 'bgActive';
54
+ readonly userMessageText: 'fg';
55
+ readonly customMessageBg: '#2d253f';
56
+ readonly customMessageText: 'fg';
57
+ readonly customMessageLabel: 'violet';
58
+ readonly toolPendingBg: 'bgAlt';
59
+ readonly toolSuccessBg: 'diffAddedBg';
60
+ readonly toolErrorBg: 'diffRemovedBg';
61
+ readonly toolTitle: 'blue';
62
+ readonly toolOutput: 'fg';
63
+ readonly mdHeading: 'magenta';
64
+ readonly mdLink: 'blue';
65
+ readonly mdLinkUrl: 'comment';
66
+ readonly mdCode: 'cyan';
67
+ readonly mdCodeBlock: 'lightYellow';
68
+ readonly mdCodeBlockBorder: 'greyAlt';
69
+ readonly mdQuote: 'fgAlt';
70
+ readonly mdQuoteBorder: 'greyAlt';
71
+ readonly mdHr: 'greyAlt';
72
+ readonly mdListBullet: 'blue';
73
+ readonly toolDiffAdded: 'lightGreen';
74
+ readonly toolDiffRemoved: 'red';
75
+ readonly toolDiffContext: 'fgAlt';
76
+ readonly syntaxComment: 'comment';
77
+ readonly syntaxKeyword: 'blue';
78
+ readonly syntaxFunction: 'magenta';
79
+ readonly syntaxVariable: 'violet';
80
+ readonly syntaxString: 'green';
81
+ readonly syntaxNumber: 'orange';
82
+ readonly syntaxType: 'yellow';
83
+ readonly syntaxOperator: 'orange';
84
+ readonly syntaxPunctuation: 'fgAlt';
85
+ readonly thinkingOff: 'grey';
86
+ readonly thinkingMinimal: 'fgAlt';
87
+ readonly thinkingLow: 'darkBlue';
88
+ readonly thinkingMedium: 'blue';
89
+ readonly thinkingHigh: 'teal';
90
+ readonly thinkingXhigh: 'magenta';
91
+ readonly thinkingMax: 'red';
92
+ readonly bashMode: 'lightGreen';
93
93
  };
94
94
  readonly export: {
95
- readonly pageBg: "bg";
96
- readonly cardBg: "bgAlt";
97
- readonly infoBg: "#343225";
95
+ readonly pageBg: 'bg';
96
+ readonly cardBg: 'bgAlt';
97
+ readonly infoBg: '#343225';
98
98
  };
99
99
  };
100
100
  declare function writeDefaultTheme(temporaryDirectory: string): Promise<string>;
@@ -1 +1 @@
1
- {"version":3,"file":"theme.d.mts","names":[],"sources":["../../src/tui/theme.ts"],"mappings":";;cAKa;;iBAqBG,mBAAmB,mBAAmB;;;;;;iBAStC,2BAA2B,kBAAkB,UAAU,YAAY,mBAAmB;cASzF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAyGS,kBAAkB,6BAA6B"}
1
+ {"version":3,"file":"theme.d.mts","names":[],"sources":["../../src/tui/theme.ts"],"mappings":";;cAKa;;iBAqBG,mBAAmB,mBAAmB;;;;;;iBAStC,2BAA2B,kBAAkB,UAAU,YAAY,mBAAmB;cASzF;WACX;WAEA;WAGA;aACE;aACA;aACA;aACA;aACA;aACA;aACA;aACA;aACA;aACA;aACA;aACA;aACA;aACA;aACA;aACA;aACA;aACA;aACA;aACA;aACA;aAKA;aACA;;WAEF;aACE;aACA;aACA;aACA;aACA;aACA;aACA;aACA;aACA;aACA;aACA;aAEA;aACA;aACA;aACA;aACA;aACA;aACA;aAGA;aACA;aACA;aACA;aAEA;aACA;aACA;aACA;aACA;aACA;aACA;aACA;aACA;aACA;aAEA;aACA;aACA;aAEA;aACA;aACA;aACA;aACA;aACA;aACA;aACA;aACA;aAGA;aACA;aACA;aACA;aACA;aACA;aACA;aAEA;;WAEF;aACE;aACA;aACA;;;iBAIkB,kBAAkB,6BAA6B"}
@@ -1 +1 @@
1
- {"version":3,"file":"toolChrome.d.cts","names":[],"sources":["../../src/tui/toolChrome.ts"],"mappings":";;;;cAOa,wBAAwB;mBACN;EAAA,YAAA;EAE7B,OAAO;EAMP;;UAKe;EACf;EACA;;;cAIW,0BAA0B;mBAElB;mBACA;mBACA;EAFA,YAAA,0BACA,OAAO,OACP,UAAS;EAG5B,OAAO;EAcP;;;iBAMc,gBAAgB,eAAe,OAAO;;iBAKtC,kBACd,eACA,iBACA,OAAO,OACP,eAAc"}
1
+ {"version":3,"file":"toolChrome.d.cts","names":[],"sources":["../../src/tui/toolChrome.ts"],"mappings":";;;;cAOa,wBAAwB;mBACN;EAA7B,YAA6B;EAE7B,OAAO;EAMP;;UAKe;EACf;EACA;;;cAIW,0BAA0B;mBAElB;mBACA;mBACA;EAHnB,YACmB,0BACA,OAAO,OACP,UAAS;EAG5B,OAAO;EAcP;;;iBAMc,gBAAgB,eAAe,OAAO;;iBAKtC,kBACd,eACA,iBACA,OAAO,OACP,eAAc"}
@@ -1 +1 @@
1
- {"version":3,"file":"toolChrome.d.mts","names":[],"sources":["../../src/tui/toolChrome.ts"],"mappings":";;;;cAOa,wBAAwB;mBACN;EAAA,YAAA;EAE7B,OAAO;EAMP;;UAKe;EACf;EACA;;;cAIW,0BAA0B;mBAElB;mBACA;mBACA;EAFA,YAAA,0BACA,OAAO,OACP,UAAS;EAG5B,OAAO;EAcP;;;iBAMc,gBAAgB,eAAe,OAAO;;iBAKtC,kBACd,eACA,iBACA,OAAO,OACP,eAAc"}
1
+ {"version":3,"file":"toolChrome.d.mts","names":[],"sources":["../../src/tui/toolChrome.ts"],"mappings":";;;;cAOa,wBAAwB;mBACN;EAA7B,YAA6B;EAE7B,OAAO;EAMP;;UAKe;EACf;EACA;;;cAIW,0BAA0B;mBAElB;mBACA;mBACA;EAHnB,YACmB,0BACA,OAAO,OACP,UAAS;EAG5B,OAAO;EAcP;;;iBAMc,gBAAgB,eAAe,OAAO;;iBAKtC,kBACd,eACA,iBACA,OAAO,OACP,eAAc"}
@@ -1 +1 @@
1
- {"version":3,"file":"toolsOverlay.d.cts","names":[],"sources":["../../src/tui/toolsOverlay.ts"],"mappings":";;;;cAmGa,8BAA8B;mBACxB;mBACA;UACT;UACA;EAEI,YAAA,KAAK,gBAAgB,OAAO,OAAO,kBAAkB,cAAc,OAAO;;UAQ9E;UASA;;UAMA;EAeR,YAAY;UAoBJ;UA2BA;UAQA;UAoCA;YAME,aAAa;UAcf;YAOE,WAAW,eAAe;UAkB5B;;iBAeY,iBAAiB,KAAK,kBAAkB,kBAAkB,eAAe"}
1
+ {"version":3,"file":"toolsOverlay.d.cts","names":[],"sources":["../../src/tui/toolsOverlay.ts"],"mappings":";;;;cAmGa,8BAA8B;mBACxB;mBACA;UACT;UACA;EAER,YAAY,KAAK,gBAAgB,OAAO,OAAO,kBAAkB,cAAc,OAAO;;UAQ9E;UASA;;UAMA;EAeR,YAAY;UAoBJ;UA2BA;UAQA;UAoCA;YAME,aAAa;UAcf;YAOE,WAAW,eAAe;UAkB5B;;iBAeY,iBAAiB,KAAK,kBAAkB,kBAAkB,eAAe"}
@@ -1 +1 @@
1
- {"version":3,"file":"toolsOverlay.d.mts","names":[],"sources":["../../src/tui/toolsOverlay.ts"],"mappings":";;;;cAmGa,8BAA8B;mBACxB;mBACA;UACT;UACA;EAEI,YAAA,KAAK,gBAAgB,OAAO,OAAO,kBAAkB,cAAc,OAAO;;UAQ9E;UASA;;UAMA;EAeR,YAAY;UAoBJ;UA2BA;UAQA;UAoCA;YAME,aAAa;UAcf;YAOE,WAAW,eAAe;UAkB5B;;iBAeY,iBAAiB,KAAK,kBAAkB,kBAAkB,eAAe"}
1
+ {"version":3,"file":"toolsOverlay.d.mts","names":[],"sources":["../../src/tui/toolsOverlay.ts"],"mappings":";;;;cAmGa,8BAA8B;mBACxB;mBACA;UACT;UACA;EAER,YAAY,KAAK,gBAAgB,OAAO,OAAO,kBAAkB,cAAc,OAAO;;UAQ9E;UASA;;UAMA;EAeR,YAAY;UAoBJ;UA2BA;UAQA;UAoCA;YAME,aAAa;UAcf;YAOE,WAAW,eAAe;UAkB5B;;iBAeY,iBAAiB,KAAK,kBAAkB,kBAAkB,eAAe"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@agimon-ai/doompi-ui",
3
- "version": "0.0.1-alpha.26",
3
+ "version": "0.0.1-alpha.28",
4
4
  "description": "Leader-key menus, themes, and TUI components for DoomPi and Pi extensions.",
5
5
  "keywords": [
6
6
  "ai",
@@ -155,17 +155,17 @@
155
155
  "dependencies": {
156
156
  "@deepseek-ai/cordis": "4.0.1",
157
157
  "yaml": "2.9.0",
158
- "@agimon-ai/doompi-extension-contracts": "0.0.1-alpha.26",
159
- "@agimon-ai/doompi-telemetry": "0.0.1-alpha.26"
158
+ "@agimon-ai/doompi-extension-contracts": "0.0.1-alpha.28",
159
+ "@agimon-ai/doompi-telemetry": "0.0.1-alpha.28"
160
160
  },
161
161
  "devDependencies": {
162
162
  "@earendil-works/pi-coding-agent": "0.84.2",
163
163
  "@earendil-works/pi-tui": "0.84.2",
164
- "@types/node": "26.1.1",
165
- "@vitest/coverage-v8": "4.1.10",
164
+ "@types/node": "26.2.0",
165
+ "@vitest/coverage-v8": "4.1.11",
166
166
  "tsdown": "0.22.14",
167
- "typescript": "6.0.3",
168
- "vitest": "4.1.10"
167
+ "typescript": "7.0.2",
168
+ "vitest": "4.1.11"
169
169
  },
170
170
  "peerDependencies": {
171
171
  "@earendil-works/pi-coding-agent": "0.84.2",