@agimon-ai/doompi-config 0.0.1-alpha.2 → 0.0.1-alpha.21

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 (309) hide show
  1. package/README.md +139 -14
  2. package/dist/adapters/atomicJson.cjs +2 -0
  3. package/dist/adapters/atomicJson.cjs.map +1 -0
  4. package/dist/adapters/atomicJson.d.cts +6 -0
  5. package/dist/adapters/atomicJson.d.cts.map +1 -0
  6. package/dist/adapters/atomicJson.d.mts +6 -0
  7. package/dist/adapters/atomicJson.d.mts.map +1 -0
  8. package/dist/adapters/atomicJson.mjs +2 -0
  9. package/dist/adapters/atomicJson.mjs.map +1 -0
  10. package/dist/adapters/config.cjs +2 -0
  11. package/dist/adapters/config.cjs.map +1 -0
  12. package/dist/adapters/config.d.cts +11 -0
  13. package/dist/adapters/config.d.cts.map +1 -0
  14. package/dist/adapters/config.d.mts +11 -0
  15. package/dist/adapters/config.d.mts.map +1 -0
  16. package/dist/adapters/config.mjs +2 -0
  17. package/dist/adapters/config.mjs.map +1 -0
  18. package/dist/adapters/configWriter.cjs +2 -0
  19. package/dist/adapters/configWriter.cjs.map +1 -0
  20. package/dist/adapters/configWriter.d.cts +52 -0
  21. package/dist/adapters/configWriter.d.cts.map +1 -0
  22. package/dist/adapters/configWriter.d.mts +52 -0
  23. package/dist/adapters/configWriter.d.mts.map +1 -0
  24. package/dist/adapters/configWriter.mjs +2 -0
  25. package/dist/adapters/configWriter.mjs.map +1 -0
  26. package/dist/adapters/domains.cjs +2 -0
  27. package/dist/adapters/domains.cjs.map +1 -0
  28. package/dist/adapters/domains.d.cts +25 -0
  29. package/dist/adapters/domains.d.cts.map +1 -0
  30. package/dist/adapters/domains.d.mts +25 -0
  31. package/dist/adapters/domains.d.mts.map +1 -0
  32. package/dist/adapters/domains.mjs +2 -0
  33. package/dist/adapters/domains.mjs.map +1 -0
  34. package/dist/adapters/harnessState.cjs +2 -0
  35. package/dist/adapters/harnessState.cjs.map +1 -0
  36. package/dist/adapters/harnessState.d.cts +50 -0
  37. package/dist/adapters/harnessState.d.cts.map +1 -0
  38. package/dist/adapters/harnessState.d.mts +50 -0
  39. package/dist/adapters/harnessState.d.mts.map +1 -0
  40. package/dist/adapters/harnessState.mjs +2 -0
  41. package/dist/adapters/harnessState.mjs.map +1 -0
  42. package/dist/adapters/harnessStore.cjs +2 -0
  43. package/dist/adapters/harnessStore.cjs.map +1 -0
  44. package/dist/adapters/harnessStore.d.cts +102 -0
  45. package/dist/adapters/harnessStore.d.cts.map +1 -0
  46. package/dist/adapters/harnessStore.d.mts +102 -0
  47. package/dist/adapters/harnessStore.d.mts.map +1 -0
  48. package/dist/adapters/harnessStore.mjs +2 -0
  49. package/dist/adapters/harnessStore.mjs.map +1 -0
  50. package/dist/adapters/init.cjs +178 -0
  51. package/dist/adapters/init.cjs.map +1 -0
  52. package/dist/adapters/init.d.cts +39 -0
  53. package/dist/adapters/init.d.cts.map +1 -0
  54. package/dist/adapters/init.d.mts +39 -0
  55. package/dist/adapters/init.d.mts.map +1 -0
  56. package/dist/adapters/init.mjs +178 -0
  57. package/dist/adapters/init.mjs.map +1 -0
  58. package/dist/adapters/layeredConfig.cjs +2 -0
  59. package/dist/adapters/layeredConfig.cjs.map +1 -0
  60. package/dist/adapters/layeredConfig.d.cts +49 -0
  61. package/dist/adapters/layeredConfig.d.cts.map +1 -0
  62. package/dist/adapters/layeredConfig.d.mts +49 -0
  63. package/dist/adapters/layeredConfig.d.mts.map +1 -0
  64. package/dist/adapters/layeredConfig.mjs +2 -0
  65. package/dist/adapters/layeredConfig.mjs.map +1 -0
  66. package/dist/adapters/majorModes.cjs +2 -0
  67. package/dist/adapters/majorModes.cjs.map +1 -0
  68. package/dist/adapters/majorModes.d.cts +88 -0
  69. package/dist/adapters/majorModes.d.cts.map +1 -0
  70. package/dist/adapters/majorModes.d.mts +88 -0
  71. package/dist/adapters/majorModes.d.mts.map +1 -0
  72. package/dist/adapters/majorModes.mjs +2 -0
  73. package/dist/adapters/majorModes.mjs.map +1 -0
  74. package/dist/adapters/pi/configExtension.cjs +2 -0
  75. package/dist/adapters/pi/configExtension.cjs.map +1 -0
  76. package/dist/adapters/pi/configExtension.d.cts +8 -0
  77. package/dist/adapters/pi/configExtension.d.cts.map +1 -0
  78. package/dist/adapters/pi/configExtension.d.mts +8 -0
  79. package/dist/adapters/pi/configExtension.d.mts.map +1 -0
  80. package/dist/adapters/pi/configExtension.mjs +2 -0
  81. package/dist/adapters/pi/configExtension.mjs.map +1 -0
  82. package/dist/adapters/pi/doomConfigExtension.cjs +2 -0
  83. package/dist/adapters/pi/doomConfigExtension.cjs.map +1 -0
  84. package/dist/adapters/pi/doomConfigExtension.d.cts +8 -0
  85. package/dist/adapters/pi/doomConfigExtension.d.cts.map +1 -0
  86. package/dist/adapters/pi/doomConfigExtension.d.mts +8 -0
  87. package/dist/adapters/pi/doomConfigExtension.d.mts.map +1 -0
  88. package/dist/adapters/pi/doomConfigExtension.mjs +2 -0
  89. package/dist/adapters/pi/doomConfigExtension.mjs.map +1 -0
  90. package/dist/adapters/pi/helpContribution.cjs +2 -0
  91. package/dist/adapters/pi/helpContribution.cjs.map +1 -0
  92. package/dist/adapters/pi/helpContribution.mjs +2 -0
  93. package/dist/adapters/pi/helpContribution.mjs.map +1 -0
  94. package/dist/adapters/pi/piContext.cjs +2 -0
  95. package/dist/adapters/pi/piContext.cjs.map +1 -0
  96. package/dist/adapters/pi/piContext.d.cts +20 -0
  97. package/dist/adapters/pi/piContext.d.cts.map +1 -0
  98. package/dist/adapters/pi/piContext.d.mts +20 -0
  99. package/dist/adapters/pi/piContext.d.mts.map +1 -0
  100. package/dist/adapters/pi/piContext.mjs +2 -0
  101. package/dist/adapters/pi/piContext.mjs.map +1 -0
  102. package/dist/adapters/piConfig.cjs +2 -0
  103. package/dist/adapters/piConfig.cjs.map +1 -0
  104. package/dist/adapters/piConfig.d.cts +8 -0
  105. package/dist/adapters/piConfig.d.cts.map +1 -0
  106. package/dist/adapters/piConfig.d.mts +8 -0
  107. package/dist/adapters/piConfig.d.mts.map +1 -0
  108. package/dist/adapters/piConfig.mjs +2 -0
  109. package/dist/adapters/piConfig.mjs.map +1 -0
  110. package/dist/adapters/pluginCatalog.cjs +2 -0
  111. package/dist/adapters/pluginCatalog.cjs.map +1 -0
  112. package/dist/adapters/pluginCatalog.d.cts +12 -0
  113. package/dist/adapters/pluginCatalog.d.cts.map +1 -0
  114. package/dist/adapters/pluginCatalog.d.mts +12 -0
  115. package/dist/adapters/pluginCatalog.d.mts.map +1 -0
  116. package/dist/adapters/pluginCatalog.mjs +2 -0
  117. package/dist/adapters/pluginCatalog.mjs.map +1 -0
  118. package/dist/adapters/profiles.cjs +4 -0
  119. package/dist/adapters/profiles.cjs.map +1 -0
  120. package/dist/adapters/profiles.d.cts +36 -0
  121. package/dist/adapters/profiles.d.cts.map +1 -0
  122. package/dist/adapters/profiles.d.mts +36 -0
  123. package/dist/adapters/profiles.d.mts.map +1 -0
  124. package/dist/adapters/profiles.mjs +4 -0
  125. package/dist/adapters/profiles.mjs.map +1 -0
  126. package/dist/atomicJson.cjs +1 -2
  127. package/dist/atomicJson.d.cts +2 -6
  128. package/dist/atomicJson.d.mts +2 -6
  129. package/dist/atomicJson.mjs +1 -2
  130. package/dist/config/piConfig.cjs +1 -2
  131. package/dist/config/piConfig.d.cts +2 -7
  132. package/dist/config/piConfig.d.mts +2 -7
  133. package/dist/config/piConfig.mjs +1 -2
  134. package/dist/config/schema.d.cts +2 -33
  135. package/dist/config/schema.d.mts +2 -33
  136. package/dist/config.cjs +1 -2
  137. package/dist/config.d.cts +3 -24
  138. package/dist/config.d.mts +3 -24
  139. package/dist/config.mjs +1 -2
  140. package/dist/configWriter.cjs +1 -2
  141. package/dist/configWriter.d.cts +2 -52
  142. package/dist/configWriter.d.mts +2 -52
  143. package/dist/configWriter.mjs +1 -2
  144. package/dist/container/doomConfigContainer.cjs +2 -0
  145. package/dist/container/doomConfigContainer.cjs.map +1 -0
  146. package/dist/container/doomConfigContainer.d.cts +12 -0
  147. package/dist/container/doomConfigContainer.d.cts.map +1 -0
  148. package/dist/container/doomConfigContainer.d.mts +12 -0
  149. package/dist/container/doomConfigContainer.d.mts.map +1 -0
  150. package/dist/container/doomConfigContainer.mjs +2 -0
  151. package/dist/container/doomConfigContainer.mjs.map +1 -0
  152. package/dist/container.cjs +1 -2
  153. package/dist/container.d.cts +2 -12
  154. package/dist/container.d.mts +2 -12
  155. package/dist/container.mjs +1 -2
  156. package/dist/domains.cjs +1 -2
  157. package/dist/domains.d.cts +6 -77
  158. package/dist/domains.d.mts +6 -77
  159. package/dist/domains.mjs +1 -2
  160. package/dist/extensions/doom.cjs +1 -2
  161. package/dist/extensions/doom.d.cts +2 -8
  162. package/dist/extensions/doom.d.mts +2 -8
  163. package/dist/extensions/doom.mjs +1 -2
  164. package/dist/extensions/pi.cjs +1 -2
  165. package/dist/extensions/pi.d.cts +2 -8
  166. package/dist/extensions/pi.d.mts +2 -8
  167. package/dist/extensions/pi.mjs +1 -2
  168. package/dist/harnessState.cjs +1 -2
  169. package/dist/harnessState.d.cts +2 -50
  170. package/dist/harnessState.d.mts +2 -50
  171. package/dist/harnessState.mjs +1 -2
  172. package/dist/harnessStore.cjs +1 -2
  173. package/dist/harnessStore.d.cts +2 -102
  174. package/dist/harnessStore.d.mts +2 -102
  175. package/dist/harnessStore.mjs +1 -2
  176. package/dist/index.cjs +1 -1
  177. package/dist/index.d.cts +20 -16
  178. package/dist/index.d.mts +20 -16
  179. package/dist/index.mjs +1 -1
  180. package/dist/init.cjs +1 -76
  181. package/dist/init.d.cts +2 -33
  182. package/dist/init.d.mts +2 -33
  183. package/dist/init.mjs +1 -76
  184. package/dist/layeredConfig.cjs +1 -2
  185. package/dist/layeredConfig.d.cts +2 -49
  186. package/dist/layeredConfig.d.mts +2 -49
  187. package/dist/layeredConfig.mjs +1 -2
  188. package/dist/majorModes.cjs +1 -2
  189. package/dist/majorModes.d.cts +2 -75
  190. package/dist/majorModes.d.mts +2 -75
  191. package/dist/majorModes.mjs +1 -2
  192. package/dist/pi.cjs +1 -1
  193. package/dist/pi.d.cts +1 -1
  194. package/dist/pi.d.mts +1 -1
  195. package/dist/pi.mjs +1 -1
  196. package/dist/piContext.cjs +1 -2
  197. package/dist/piContext.d.cts +2 -19
  198. package/dist/piContext.d.mts +2 -19
  199. package/dist/piContext.mjs +1 -2
  200. package/dist/profiles.cjs +1 -4
  201. package/dist/profiles.d.cts +2 -35
  202. package/dist/profiles.d.mts +2 -35
  203. package/dist/profiles.mjs +1 -4
  204. package/dist/schemas/config/schema.d.cts +33 -0
  205. package/dist/schemas/config/schema.d.cts.map +1 -0
  206. package/dist/schemas/config/schema.d.mts +33 -0
  207. package/dist/schemas/config/schema.d.mts.map +1 -0
  208. package/dist/services/configPolicy.cjs +2 -0
  209. package/dist/services/configPolicy.cjs.map +1 -0
  210. package/dist/services/configPolicy.d.cts +19 -0
  211. package/dist/services/configPolicy.d.cts.map +1 -0
  212. package/dist/services/configPolicy.d.mts +19 -0
  213. package/dist/services/configPolicy.d.mts.map +1 -0
  214. package/dist/services/configPolicy.mjs +2 -0
  215. package/dist/services/configPolicy.mjs.map +1 -0
  216. package/dist/services/domains.cjs +2 -0
  217. package/dist/services/domains.cjs.map +1 -0
  218. package/dist/services/domains.d.cts +12 -0
  219. package/dist/services/domains.d.cts.map +1 -0
  220. package/dist/services/domains.d.mts +12 -0
  221. package/dist/services/domains.d.mts.map +1 -0
  222. package/dist/services/domains.mjs +2 -0
  223. package/dist/services/domains.mjs.map +1 -0
  224. package/dist/types/config.cjs +2 -0
  225. package/dist/types/config.cjs.map +1 -0
  226. package/dist/types/config.d.cts +136 -0
  227. package/dist/types/config.d.cts.map +1 -0
  228. package/dist/types/config.d.mts +136 -0
  229. package/dist/types/config.d.mts.map +1 -0
  230. package/dist/types/config.mjs +2 -0
  231. package/dist/types/config.mjs.map +1 -0
  232. package/dist/types/domains.d.cts +89 -0
  233. package/dist/types/domains.d.cts.map +1 -0
  234. package/dist/types/domains.d.mts +89 -0
  235. package/dist/types/domains.d.mts.map +1 -0
  236. package/dist/types.cjs +1 -2
  237. package/dist/types.d.cts +2 -132
  238. package/dist/types.d.mts +2 -132
  239. package/dist/types.mjs +1 -2
  240. package/llms.txt +9 -0
  241. package/package.json +18 -6
  242. package/skills/doom-pi-config/SKILL.md +6 -3
  243. package/skills/doom-pi-config/references/config-contract.md +123 -8
  244. package/dist/atomicJson.cjs.map +0 -1
  245. package/dist/atomicJson.d.cts.map +0 -1
  246. package/dist/atomicJson.d.mts.map +0 -1
  247. package/dist/atomicJson.mjs.map +0 -1
  248. package/dist/config/piConfig.cjs.map +0 -1
  249. package/dist/config/piConfig.d.cts.map +0 -1
  250. package/dist/config/piConfig.d.mts.map +0 -1
  251. package/dist/config/piConfig.mjs.map +0 -1
  252. package/dist/config/schema.d.cts.map +0 -1
  253. package/dist/config/schema.d.mts.map +0 -1
  254. package/dist/config.cjs.map +0 -1
  255. package/dist/config.d.cts.map +0 -1
  256. package/dist/config.d.mts.map +0 -1
  257. package/dist/config.mjs.map +0 -1
  258. package/dist/configWriter.cjs.map +0 -1
  259. package/dist/configWriter.d.cts.map +0 -1
  260. package/dist/configWriter.d.mts.map +0 -1
  261. package/dist/configWriter.mjs.map +0 -1
  262. package/dist/container.cjs.map +0 -1
  263. package/dist/container.d.cts.map +0 -1
  264. package/dist/container.d.mts.map +0 -1
  265. package/dist/container.mjs.map +0 -1
  266. package/dist/domains.cjs.map +0 -1
  267. package/dist/domains.d.cts.map +0 -1
  268. package/dist/domains.d.mts.map +0 -1
  269. package/dist/domains.mjs.map +0 -1
  270. package/dist/extensions/doom.cjs.map +0 -1
  271. package/dist/extensions/doom.d.cts.map +0 -1
  272. package/dist/extensions/doom.d.mts.map +0 -1
  273. package/dist/extensions/doom.mjs.map +0 -1
  274. package/dist/extensions/pi.cjs.map +0 -1
  275. package/dist/extensions/pi.d.cts.map +0 -1
  276. package/dist/extensions/pi.d.mts.map +0 -1
  277. package/dist/extensions/pi.mjs.map +0 -1
  278. package/dist/harnessState.cjs.map +0 -1
  279. package/dist/harnessState.d.cts.map +0 -1
  280. package/dist/harnessState.d.mts.map +0 -1
  281. package/dist/harnessState.mjs.map +0 -1
  282. package/dist/harnessStore.cjs.map +0 -1
  283. package/dist/harnessStore.d.cts.map +0 -1
  284. package/dist/harnessStore.d.mts.map +0 -1
  285. package/dist/harnessStore.mjs.map +0 -1
  286. package/dist/init.cjs.map +0 -1
  287. package/dist/init.d.cts.map +0 -1
  288. package/dist/init.d.mts.map +0 -1
  289. package/dist/init.mjs.map +0 -1
  290. package/dist/layeredConfig.cjs.map +0 -1
  291. package/dist/layeredConfig.d.cts.map +0 -1
  292. package/dist/layeredConfig.d.mts.map +0 -1
  293. package/dist/layeredConfig.mjs.map +0 -1
  294. package/dist/majorModes.cjs.map +0 -1
  295. package/dist/majorModes.d.cts.map +0 -1
  296. package/dist/majorModes.d.mts.map +0 -1
  297. package/dist/majorModes.mjs.map +0 -1
  298. package/dist/piContext.cjs.map +0 -1
  299. package/dist/piContext.d.cts.map +0 -1
  300. package/dist/piContext.d.mts.map +0 -1
  301. package/dist/piContext.mjs.map +0 -1
  302. package/dist/profiles.cjs.map +0 -1
  303. package/dist/profiles.d.cts.map +0 -1
  304. package/dist/profiles.d.mts.map +0 -1
  305. package/dist/profiles.mjs.map +0 -1
  306. package/dist/types.cjs.map +0 -1
  307. package/dist/types.d.cts.map +0 -1
  308. package/dist/types.d.mts.map +0 -1
  309. package/dist/types.mjs.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"configPolicy.mjs","names":["parseYaml"],"sources":["../../src/services/configPolicy.ts"],"sourcesContent":["import { parse as parseYaml } from 'yaml';\nimport type {\n DoomConfig,\n DoomSelectionConfig,\n EditorConfig,\n PlanningAgentConfig,\n PlanningModeConfig,\n PlanningThinkingLevel,\n ProjectTrust,\n ResolvedVoiceConfig,\n VoiceAdapterConfig,\n VoiceAutoCaptureConfig,\n VoiceConfig,\n VoiceEngine,\n VoiceModelConfig,\n VoiceTtsConfig,\n VoiceTtsEngine,\n} from '../types/config.ts';\n\nconst DEFAULT_PROJECT_TRUST: ProjectTrust = 'ask';\nconst DEFAULT_VOICE_ENGINE: VoiceEngine = 'auto';\nconst DEFAULT_VOICE_LANGUAGE = 'auto';\nconst DEFAULT_RECORDER_DEVICE = 'none:default';\nconst ROOT_KEYS = ['modes', 'projectTrust', 'editor', 'voice', 'selection'] as const;\nconst SELECTION_KEYS = ['majorMode', 'domains', 'profile'] as const;\nconst MODE_KEYS = ['planning'] as const;\nconst PLANNING_KEYS = ['main', 'subagents', 'plansDirectory'] as const;\nconst AGENT_KEYS = ['model', 'thinking'] as const;\nconst EDITOR_KEYS = ['command'] as const;\nconst VOICE_KEYS = ['engine', 'language', 'recorder', 'adapters', 'autoCapture'] as const;\nconst RECORDER_KEYS = ['binary', 'device'] as const;\nconst WHISPER_CPP_ENGINE = 'whisper-cpp' as const;\nconst OPENAI_WHISPER_ENGINE = 'openai-whisper' as const;\nconst MLX_WHISPER_ENGINE = 'mlx-whisper' as const;\nconst MACOS_SAY_TTS_ENGINE = 'macos-say' as const;\nconst ADAPTERS_KEYS = [WHISPER_CPP_ENGINE, OPENAI_WHISPER_ENGINE, MLX_WHISPER_ENGINE] as const;\nconst ADAPTER_KEYS = ['binary', 'model'] as const;\nconst MODEL_KEYS = ['path', 'id'] as const;\nconst AUTO_CAPTURE_KEYS = [\n 'model',\n 'startPhrases',\n 'stopPhrases',\n 'utteranceIdleMs',\n 'transcriptionTimeoutMs',\n 'tts',\n] as const;\nconst TTS_KEYS = ['engine', 'voice', 'rate'] as const;\nconst DEFAULT_UTTERANCE_IDLE_MS = 3_000;\nconst MIN_UTTERANCE_IDLE_MS = 1_500;\nconst MAX_UTTERANCE_IDLE_MS = 10_000;\nconst DEFAULT_TRANSCRIPTION_TIMEOUT_MS = 15_000;\nconst MIN_TRANSCRIPTION_TIMEOUT_MS = 1_000;\nconst MAX_TRANSCRIPTION_TIMEOUT_MS = 120_000;\nconst MAX_CONTROL_PHRASES = 16;\nconst MAX_CONTROL_PHRASE_LENGTH = 64;\nconst MAX_TTS_VOICE_LENGTH = 64;\nconst MIN_TTS_RATE = 80;\nconst MAX_TTS_RATE = 500;\nconst MODEL_REFERENCE_PATTERN = /^[^/\\s]+\\/[^/\\s]+(?:\\/[^/\\s]+)*$/u;\nconst PHRASE_PUNCTUATION_PATTERN = /[\\p{P}\\p{S}]+/gu;\n/**\n * The accepted values, in the order a picker should offer them.\n *\n * Exported because the config UI has to offer exactly what the parser accepts,\n * and a second hand-written list in the contributing package would drift. The\n * validating Sets below are built from these for the same reason.\n */\nexport const DOOM_PLANNING_THINKING_LEVELS = ['off', 'minimal', 'low', 'medium', 'high', 'xhigh', 'max'] as const;\nexport const DOOM_VOICE_ENGINES = [\n DEFAULT_VOICE_ENGINE,\n WHISPER_CPP_ENGINE,\n OPENAI_WHISPER_ENGINE,\n MLX_WHISPER_ENGINE,\n] as const;\nexport const DOOM_VOICE_TTS_ENGINES = [MACOS_SAY_TTS_ENGINE] as const;\n\nconst THINKING_VALUES = new Set<PlanningThinkingLevel>(DOOM_PLANNING_THINKING_LEVELS);\nconst TRUST_VALUES = new Set<ProjectTrust>(['ask', 'always', 'never']);\nconst ENGINE_VALUES = new Set<VoiceEngine>(DOOM_VOICE_ENGINES);\nconst TTS_ENGINE_VALUES = new Set<VoiceTtsEngine>(DOOM_VOICE_TTS_ENGINES);\ntype ConfigObject = Record<string, unknown>;\n\nfunction isObject(value: unknown): value is ConfigObject {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\nfunction assertKeys(value: ConfigObject, allowed: readonly string[], location: string, filePath: string): void {\n const unknown = Object.keys(value).filter((key) => !allowed.includes(key));\n if (unknown.length > 0)\n throw new Error(`Doom config at ${filePath} has unsupported ${location} field(s): ${unknown.join(', ')}`);\n}\nfunction optionalString(value: unknown, location: string, filePath: string): string | undefined {\n if (value === undefined) return undefined;\n if (typeof value !== 'string' || value.trim().length === 0)\n throw new Error(`Doom config at ${filePath} requires ${location} to be a non-empty string`);\n return value.trim();\n}\nfunction hasControlCharacters(value: string): boolean {\n for (const character of value) {\n const codePoint = character.codePointAt(0);\n if (codePoint !== undefined && (codePoint <= 0x1f || codePoint === 0x7f)) return true;\n }\n return false;\n}\nfunction boundedOptionalString(\n value: unknown,\n location: string,\n filePath: string,\n maximumLength: number,\n): string | undefined {\n const text = optionalString(value, location, filePath);\n if (!text) return undefined;\n if (text.length > maximumLength)\n throw new Error(`Doom config at ${filePath} requires ${location} to be at most ${maximumLength} characters`);\n if (hasControlCharacters(text))\n throw new Error(`Doom config at ${filePath} does not allow control characters in ${location}`);\n return text;\n}\nfunction parseModelReference(value: unknown, filePath: string): string {\n const location = 'voice.autoCapture.model';\n const model = optionalString(value, location, filePath);\n if (!model || !MODEL_REFERENCE_PATTERN.test(model))\n throw new Error(`Doom config at ${filePath} requires ${location} in provider/model-id form`);\n return model;\n}\nfunction normalizeControlPhrase(value: string): string {\n return value\n .normalize('NFKC')\n .toLocaleLowerCase('en-US')\n .replace(PHRASE_PUNCTUATION_PATTERN, ' ')\n .replace(/\\s+/gu, ' ')\n .trim();\n}\nfunction parseControlPhrases(value: unknown, location: string, filePath: string): string[] | undefined {\n if (value === undefined) return undefined;\n if (!Array.isArray(value) || value.some((phrase) => typeof phrase !== 'string'))\n throw new Error(`Doom config at ${filePath} requires ${location} to be an array of strings`);\n if (value.length > MAX_CONTROL_PHRASES)\n throw new Error(\n `Doom config at ${filePath} requires ${location} to contain at most ${MAX_CONTROL_PHRASES} phrases`,\n );\n const phrases = value.map((phrase) => phrase.trim());\n const normalized = new Set<string>();\n for (const phrase of phrases) {\n if (phrase.length === 0)\n throw new Error(`Doom config at ${filePath} requires ${location} to contain non-empty strings`);\n if (phrase.length > MAX_CONTROL_PHRASE_LENGTH)\n throw new Error(\n `Doom config at ${filePath} requires ${location} phrases to be at most ${MAX_CONTROL_PHRASE_LENGTH} characters`,\n );\n if (hasControlCharacters(phrase))\n throw new Error(`Doom config at ${filePath} does not allow control characters in ${location}`);\n const key = normalizeControlPhrase(phrase);\n if (!key) throw new Error(`Doom config at ${filePath} requires ${location} to contain words`);\n if (normalized.has(key))\n throw new Error(`Doom config at ${filePath} does not allow normalized duplicates in ${location}`);\n normalized.add(key);\n }\n return phrases;\n}\nfunction parseTtsConfig(value: unknown, filePath: string): VoiceTtsConfig {\n const location = 'voice.autoCapture.tts';\n if (!isObject(value)) throw new Error(`Doom config at ${filePath} requires ${location} to be an object`);\n assertKeys(value, TTS_KEYS, location, filePath);\n if (typeof value.engine !== 'string' || !TTS_ENGINE_VALUES.has(value.engine as VoiceTtsEngine))\n throw new Error(\n `Doom config at ${filePath} requires ${location}.engine to be one of: ${[...TTS_ENGINE_VALUES].join(', ')}`,\n );\n const voice = boundedOptionalString(value.voice, `${location}.voice`, filePath, MAX_TTS_VOICE_LENGTH);\n const rate = value.rate;\n if (\n rate !== undefined &&\n (typeof rate !== 'number' || !Number.isInteger(rate) || rate < MIN_TTS_RATE || rate > MAX_TTS_RATE)\n ) {\n throw new Error(\n `Doom config at ${filePath} requires ${location}.rate to be an integer from ${MIN_TTS_RATE} to ${MAX_TTS_RATE}`,\n );\n }\n return {\n engine: value.engine as VoiceTtsEngine,\n ...(voice ? { voice } : {}),\n ...(rate === undefined ? {} : { rate }),\n };\n}\nfunction parseAutoCapture(value: unknown, filePath: string): VoiceAutoCaptureConfig | undefined {\n if (value === undefined) return undefined;\n const location = 'voice.autoCapture';\n if (!isObject(value)) throw new Error(`Doom config at ${filePath} requires ${location} to be an object`);\n assertKeys(value, AUTO_CAPTURE_KEYS, location, filePath);\n const startPhrases = parseControlPhrases(value.startPhrases, `${location}.startPhrases`, filePath);\n const stopPhrases = parseControlPhrases(value.stopPhrases, `${location}.stopPhrases`, filePath);\n const utteranceIdleMs = value.utteranceIdleMs;\n if (\n utteranceIdleMs !== undefined &&\n (typeof utteranceIdleMs !== 'number' ||\n !Number.isInteger(utteranceIdleMs) ||\n utteranceIdleMs < MIN_UTTERANCE_IDLE_MS ||\n utteranceIdleMs > MAX_UTTERANCE_IDLE_MS)\n ) {\n throw new Error(\n `Doom config at ${filePath} requires ${location}.utteranceIdleMs to be an integer from ${MIN_UTTERANCE_IDLE_MS} to ${MAX_UTTERANCE_IDLE_MS}`,\n );\n }\n const transcriptionTimeoutMs = value.transcriptionTimeoutMs;\n if (\n transcriptionTimeoutMs !== undefined &&\n (typeof transcriptionTimeoutMs !== 'number' ||\n !Number.isInteger(transcriptionTimeoutMs) ||\n transcriptionTimeoutMs < MIN_TRANSCRIPTION_TIMEOUT_MS ||\n transcriptionTimeoutMs > MAX_TRANSCRIPTION_TIMEOUT_MS)\n ) {\n throw new Error(\n `Doom config at ${filePath} requires ${location}.transcriptionTimeoutMs to be an integer from ${MIN_TRANSCRIPTION_TIMEOUT_MS} to ${MAX_TRANSCRIPTION_TIMEOUT_MS}`,\n );\n }\n const startKeys = new Set((startPhrases ?? []).map(normalizeControlPhrase));\n if ((stopPhrases ?? []).some((phrase) => startKeys.has(normalizeControlPhrase(phrase))))\n throw new Error(`Doom config at ${filePath} does not allow a phrase in both startPhrases and stopPhrases`);\n return {\n model: parseModelReference(value.model, filePath),\n ...(startPhrases ? { startPhrases } : {}),\n ...(stopPhrases ? { stopPhrases } : {}),\n ...(utteranceIdleMs === undefined ? {} : { utteranceIdleMs }),\n ...(transcriptionTimeoutMs === undefined ? {} : { transcriptionTimeoutMs }),\n tts: parseTtsConfig(value.tts, filePath),\n };\n}\nfunction parseAgent(value: unknown, location: string, filePath: string): PlanningAgentConfig | undefined {\n if (value === undefined) return undefined;\n if (!isObject(value)) throw new Error(`Doom config at ${filePath} requires ${location} to be an object`);\n assertKeys(value, AGENT_KEYS, location, filePath);\n const thinking = value.thinking;\n if (\n thinking !== undefined &&\n (typeof thinking !== 'string' || !THINKING_VALUES.has(thinking as PlanningThinkingLevel))\n ) {\n throw new Error(\n `Doom config at ${filePath} requires ${location}.thinking to be one of: ${[...THINKING_VALUES].join(', ')}`,\n );\n }\n const model = optionalString(value.model, `${location}.model`, filePath);\n return { ...(model ? { model } : {}), ...(thinking ? { thinking: thinking as PlanningThinkingLevel } : {}) };\n}\nexport function parsePlanningModeConfig(\n value: unknown,\n filePath: string,\n location = 'modes.planning',\n): PlanningModeConfig {\n if (!isObject(value)) throw new Error(`Doom config at ${filePath} requires ${location} to be an object`);\n assertKeys(value, PLANNING_KEYS, location, filePath);\n return {\n main: parseAgent(value.main, `${location}.main`, filePath),\n subagents: parseAgent(value.subagents, `${location}.subagents`, filePath),\n plansDirectory: optionalString(value.plansDirectory, `${location}.plansDirectory`, filePath),\n };\n}\nfunction parseModel(value: unknown, location: string, filePath: string, allowId: boolean): VoiceModelConfig {\n if (!isObject(value)) throw new Error(`Doom config at ${filePath} requires ${location} to be an object`);\n assertKeys(value, MODEL_KEYS, location, filePath);\n const modelPath = optionalString(value.path, `${location}.path`, filePath);\n const id = optionalString(value.id, `${location}.id`, filePath);\n if (Boolean(modelPath) === Boolean(id))\n throw new Error(`Doom config at ${filePath} requires exactly one of ${location}.path or ${location}.id`);\n if (id && !allowId) throw new Error(`Doom config at ${filePath} does not support ${location}.id for whisper-cpp`);\n return { ...(modelPath ? { path: modelPath } : {}), ...(id ? { id } : {}) };\n}\nfunction parseAdapter(\n value: unknown,\n location: string,\n filePath: string,\n allowId: boolean,\n): VoiceAdapterConfig | undefined {\n if (value === undefined) return undefined;\n if (!isObject(value)) throw new Error(`Doom config at ${filePath} requires ${location} to be an object`);\n assertKeys(value, ADAPTER_KEYS, location, filePath);\n const binary = optionalString(value.binary, `${location}.binary`, filePath);\n return { ...(binary ? { binary } : {}), model: parseModel(value.model, `${location}.model`, filePath, allowId) };\n}\nfunction parseVoice(value: unknown, filePath: string): VoiceConfig | undefined {\n if (value === undefined) return undefined;\n if (!isObject(value)) throw new Error(`Doom config at ${filePath} requires voice to be an object`);\n assertKeys(value, VOICE_KEYS, 'voice', filePath);\n const result: VoiceConfig = {};\n if (value.engine !== undefined) {\n if (typeof value.engine !== 'string' || !ENGINE_VALUES.has(value.engine as VoiceEngine))\n throw new Error(\n `Doom config at ${filePath} requires voice.engine to be one of: ${[...ENGINE_VALUES].join(', ')}`,\n );\n result.engine = value.engine as VoiceEngine;\n }\n const language = optionalString(value.language, 'voice.language', filePath);\n if (language) result.language = language;\n if (value.recorder !== undefined) {\n if (!isObject(value.recorder))\n throw new Error(`Doom config at ${filePath} requires voice.recorder to be an object`);\n assertKeys(value.recorder, RECORDER_KEYS, 'voice.recorder', filePath);\n result.recorder = {};\n const binary = optionalString(value.recorder.binary, 'voice.recorder.binary', filePath);\n const device = optionalString(value.recorder.device, 'voice.recorder.device', filePath);\n if (binary) result.recorder.binary = binary;\n if (device) result.recorder.device = device;\n }\n if (value.adapters !== undefined) {\n if (!isObject(value.adapters))\n throw new Error(`Doom config at ${filePath} requires voice.adapters to be an object`);\n assertKeys(value.adapters, ADAPTERS_KEYS, 'voice.adapters', filePath);\n result.adapters = {\n [WHISPER_CPP_ENGINE]: parseAdapter(\n value.adapters[WHISPER_CPP_ENGINE],\n `voice.adapters.${WHISPER_CPP_ENGINE}`,\n filePath,\n false,\n ),\n [OPENAI_WHISPER_ENGINE]: parseAdapter(\n value.adapters[OPENAI_WHISPER_ENGINE],\n `voice.adapters.${OPENAI_WHISPER_ENGINE}`,\n filePath,\n true,\n ),\n [MLX_WHISPER_ENGINE]: parseAdapter(\n value.adapters[MLX_WHISPER_ENGINE],\n `voice.adapters.${MLX_WHISPER_ENGINE}`,\n filePath,\n true,\n ),\n };\n }\n const autoCapture = parseAutoCapture(value.autoCapture, filePath);\n if (autoCapture) result.autoCapture = autoCapture;\n return result;\n}\nfunction parseSelection(value: unknown, filePath: string): DoomSelectionConfig | undefined {\n if (value === undefined) return undefined;\n if (!isObject(value)) throw new Error(`Doom config at ${filePath} requires selection to be an object`);\n assertKeys(value, SELECTION_KEYS, 'selection', filePath);\n const domains = value.domains;\n if (domains !== undefined && (!Array.isArray(domains) || domains.some((name) => typeof name !== 'string'))) {\n throw new Error(`Doom config at ${filePath} requires selection.domains to be an array of strings`);\n }\n return {\n majorMode: optionalString(value.majorMode, 'selection.majorMode', filePath),\n // An empty list is meaningful: it selects no content domains at all.\n domains: domains as string[] | undefined,\n profile: optionalString(value.profile, 'selection.profile', filePath),\n };\n}\nfunction parseEditor(value: unknown, filePath: string): EditorConfig | undefined {\n if (value === undefined) return undefined;\n if (!isObject(value)) throw new Error(`Doom config at ${filePath} requires editor to be an object`);\n assertKeys(value, EDITOR_KEYS, 'editor', filePath);\n return { command: optionalString(value.command, 'editor.command', filePath) };\n}\nexport function parseDoomConfig(content: string, filePath: string): DoomConfig {\n let parsed: unknown;\n try {\n parsed = parseYaml(content) ?? {};\n } catch (error) {\n throw new Error(`Could not parse Doom config at ${filePath}`, { cause: error });\n }\n if (!isObject(parsed)) throw new Error(`Doom config at ${filePath} must be a YAML object`);\n assertKeys(parsed, ROOT_KEYS, 'root', filePath);\n let modes: DoomConfig['modes'];\n if (parsed.modes !== undefined) {\n if (!isObject(parsed.modes)) throw new Error(`Doom config at ${filePath} requires modes to be an object`);\n assertKeys(parsed.modes, MODE_KEYS, 'modes', filePath);\n modes =\n parsed.modes.planning === undefined ? {} : { planning: parsePlanningModeConfig(parsed.modes.planning, filePath) };\n }\n const trust = parsed.projectTrust === undefined ? DEFAULT_PROJECT_TRUST : parsed.projectTrust;\n if (typeof trust !== 'string' || !TRUST_VALUES.has(trust as ProjectTrust))\n throw new Error(`Doom config at ${filePath} projectTrust must be ask, always, or never`);\n return {\n modes,\n projectTrust: trust as ProjectTrust,\n editor: parseEditor(parsed.editor, filePath),\n voice: parseVoice(parsed.voice, filePath),\n selection: parseSelection(parsed.selection, filePath),\n };\n}\nfunction mergeAgent(\n globalValue?: PlanningAgentConfig,\n repositoryValue?: PlanningAgentConfig,\n): PlanningAgentConfig | undefined {\n return globalValue || repositoryValue ? { ...globalValue, ...repositoryValue } : undefined;\n}\nexport function mergeDoomConfigs(globalConfig: DoomConfig, repositoryConfig: DoomConfig): DoomConfig {\n if (repositoryConfig.voice?.autoCapture)\n throw new Error('Repository Doom config voice.autoCapture is global-only; configure it in ~/.pi/.doom/config.yaml');\n const globalPlanning = globalConfig.modes?.planning;\n const repositoryPlanning = repositoryConfig.modes?.planning;\n const planning =\n globalPlanning || repositoryPlanning\n ? {\n main: mergeAgent(globalPlanning?.main, repositoryPlanning?.main),\n subagents: mergeAgent(globalPlanning?.subagents, repositoryPlanning?.subagents),\n plansDirectory: repositoryPlanning?.plansDirectory ?? globalPlanning?.plansDirectory,\n }\n : undefined;\n const voice = mergeVoice(globalConfig.voice, repositoryConfig.voice);\n return {\n modes: planning ? { planning } : undefined,\n projectTrust: repositoryConfig.projectTrust,\n editor: globalConfig.editor,\n voice,\n // Per key, so a repository can pin one axis and inherit the rest.\n selection:\n globalConfig.selection || repositoryConfig.selection\n ? { ...globalConfig.selection, ...repositoryConfig.selection }\n : undefined,\n };\n}\nfunction mergeAdapter(\n globalValue?: VoiceAdapterConfig,\n repositoryValue?: VoiceAdapterConfig,\n): VoiceAdapterConfig | undefined {\n if (!globalValue && !repositoryValue) return undefined;\n return { ...globalValue, ...repositoryValue, model: repositoryValue?.model ?? globalValue!.model };\n}\nfunction mergeVoice(globalValue?: VoiceConfig, repositoryValue?: VoiceConfig): VoiceConfig | undefined {\n if (!globalValue && !repositoryValue) return undefined;\n return {\n ...globalValue,\n ...repositoryValue,\n recorder:\n globalValue?.recorder || repositoryValue?.recorder\n ? { ...globalValue?.recorder, ...repositoryValue?.recorder }\n : undefined,\n adapters:\n globalValue?.adapters || repositoryValue?.adapters\n ? {\n [WHISPER_CPP_ENGINE]: mergeAdapter(\n globalValue?.adapters?.[WHISPER_CPP_ENGINE],\n repositoryValue?.adapters?.[WHISPER_CPP_ENGINE],\n ),\n [OPENAI_WHISPER_ENGINE]: mergeAdapter(\n globalValue?.adapters?.[OPENAI_WHISPER_ENGINE],\n repositoryValue?.adapters?.[OPENAI_WHISPER_ENGINE],\n ),\n [MLX_WHISPER_ENGINE]: mergeAdapter(\n globalValue?.adapters?.[MLX_WHISPER_ENGINE],\n repositoryValue?.adapters?.[MLX_WHISPER_ENGINE],\n ),\n }\n : undefined,\n ...(globalValue?.autoCapture ? { autoCapture: globalValue.autoCapture } : {}),\n };\n}\nexport function resolveVoiceConfig(config: VoiceConfig): ResolvedVoiceConfig {\n return {\n engine: config.engine ?? DEFAULT_VOICE_ENGINE,\n language: config.language ?? DEFAULT_VOICE_LANGUAGE,\n recorder: { ...config.recorder, device: config.recorder?.device ?? DEFAULT_RECORDER_DEVICE },\n adapters: config.adapters ?? {},\n ...(config.autoCapture\n ? {\n autoCapture: {\n ...config.autoCapture,\n startPhrases: [...(config.autoCapture.startPhrases ?? [])],\n stopPhrases: [...(config.autoCapture.stopPhrases ?? [])],\n utteranceIdleMs: config.autoCapture.utteranceIdleMs ?? DEFAULT_UTTERANCE_IDLE_MS,\n transcriptionTimeoutMs: config.autoCapture.transcriptionTimeoutMs ?? DEFAULT_TRANSCRIPTION_TIMEOUT_MS,\n tts: { ...config.autoCapture.tts },\n },\n }\n : {}),\n };\n}\n"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ function e(e,t){return t.flatMap(e=>e.split(`,`).map(e=>e.trim()).filter(Boolean)).flatMap(t=>e.aliases[t]??[t])}function t(e){return e.match(/^\/domains\s+(?:[^\s,]+,)*([^\s,]*)$/)?.[1]}function n(e,t){let n=t.toLowerCase();return e.filter(e=>e.toLowerCase().startsWith(n)).map(e=>({value:e,label:e}))}exports.domainCompletionItems=n,exports.domainCompletionPrefix=t,exports.expandDomainNames=e;
2
+ //# sourceMappingURL=domains.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"domains.cjs","names":[],"sources":["../../src/services/domains.ts"],"sourcesContent":["import type { DomainManifest } from '../types/domains.ts';\n\nconst NAME_DELIMITER = ',';\n\n/** Splits comma-joined selections and expands aliases into concrete domain names. */\nexport function expandDomainNames(manifest: DomainManifest, domainNames: readonly string[]): string[] {\n return domainNames\n .flatMap((raw) =>\n raw\n .split(NAME_DELIMITER)\n .map((name) => name.trim())\n .filter(Boolean),\n )\n .flatMap((name) => manifest.aliases[name] ?? [name]);\n}\n\nexport function domainCompletionPrefix(textBeforeCursor: string): string | undefined {\n const match = textBeforeCursor.match(/^\\/domains\\s+(?:[^\\s,]+,)*([^\\s,]*)$/);\n return match?.[1];\n}\n\nexport function domainCompletionItems(domainNames: string[], query: string): Array<{ value: string; label: string }> {\n const normalizedQuery = query.toLowerCase();\n return domainNames\n .filter((name) => name.toLowerCase().startsWith(normalizedQuery))\n .map((name) => ({ value: name, label: name }));\n}\n"],"mappings":"AAKA,SAAgB,EAAkB,EAA0B,EAA0C,CACpG,OAAO,EACJ,QAAS,GACR,EACG,MAAM,GAAc,CAAC,CACrB,IAAK,GAAS,EAAK,KAAK,CAAC,CAAC,CAC1B,OAAO,OAAO,CACnB,CAAC,CACA,QAAS,GAAS,EAAS,QAAQ,IAAS,CAAC,CAAI,CAAC,CACvD,CAEA,SAAgB,EAAuB,EAA8C,CAEnF,OADc,EAAiB,MAAM,sCAC1B,CAAC,GAAG,EACjB,CAEA,SAAgB,EAAsB,EAAuB,EAAwD,CACnH,IAAM,EAAkB,EAAM,YAAY,EAC1C,OAAO,EACJ,OAAQ,GAAS,EAAK,YAAY,CAAC,CAAC,WAAW,CAAe,CAAC,CAAC,CAChE,IAAK,IAAU,CAAE,MAAO,EAAM,MAAO,CAAK,EAAE,CACjD"}
@@ -0,0 +1,12 @@
1
+ import { DomainManifest } from "../types/domains.cjs";
2
+ //#region src/services/domains.d.ts
3
+ /** Splits comma-joined selections and expands aliases into concrete domain names. */
4
+ declare function expandDomainNames(manifest: DomainManifest, domainNames: readonly string[]): string[];
5
+ declare function domainCompletionPrefix(textBeforeCursor: string): string | undefined;
6
+ declare function domainCompletionItems(domainNames: string[], query: string): Array<{
7
+ value: string;
8
+ label: string;
9
+ }>;
10
+ //#endregion
11
+ export { domainCompletionItems, domainCompletionPrefix, expandDomainNames };
12
+ //# sourceMappingURL=domains.d.cts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"domains.d.cts","names":[],"sources":["../../src/services/domains.ts"],"mappings":";;;iBAKgB,kBAAkB,UAAU,gBAAgB;iBAW5C,uBAAuB;iBAKvB,sBAAsB,uBAAuB,gBAAgB;EAAQ;EAAe"}
@@ -0,0 +1,12 @@
1
+ import { DomainManifest } from "../types/domains.mjs";
2
+ //#region src/services/domains.d.ts
3
+ /** Splits comma-joined selections and expands aliases into concrete domain names. */
4
+ declare function expandDomainNames(manifest: DomainManifest, domainNames: readonly string[]): string[];
5
+ declare function domainCompletionPrefix(textBeforeCursor: string): string | undefined;
6
+ declare function domainCompletionItems(domainNames: string[], query: string): Array<{
7
+ value: string;
8
+ label: string;
9
+ }>;
10
+ //#endregion
11
+ export { domainCompletionItems, domainCompletionPrefix, expandDomainNames };
12
+ //# sourceMappingURL=domains.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"domains.d.mts","names":[],"sources":["../../src/services/domains.ts"],"mappings":";;;iBAKgB,kBAAkB,UAAU,gBAAgB;iBAW5C,uBAAuB;iBAKvB,sBAAsB,uBAAuB,gBAAgB;EAAQ;EAAe"}
@@ -0,0 +1,2 @@
1
+ function e(e,t){return t.flatMap(e=>e.split(`,`).map(e=>e.trim()).filter(Boolean)).flatMap(t=>e.aliases[t]??[t])}function t(e){return e.match(/^\/domains\s+(?:[^\s,]+,)*([^\s,]*)$/)?.[1]}function n(e,t){let n=t.toLowerCase();return e.filter(e=>e.toLowerCase().startsWith(n)).map(e=>({value:e,label:e}))}export{n as domainCompletionItems,t as domainCompletionPrefix,e as expandDomainNames};
2
+ //# sourceMappingURL=domains.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"domains.mjs","names":[],"sources":["../../src/services/domains.ts"],"sourcesContent":["import type { DomainManifest } from '../types/domains.ts';\n\nconst NAME_DELIMITER = ',';\n\n/** Splits comma-joined selections and expands aliases into concrete domain names. */\nexport function expandDomainNames(manifest: DomainManifest, domainNames: readonly string[]): string[] {\n return domainNames\n .flatMap((raw) =>\n raw\n .split(NAME_DELIMITER)\n .map((name) => name.trim())\n .filter(Boolean),\n )\n .flatMap((name) => manifest.aliases[name] ?? [name]);\n}\n\nexport function domainCompletionPrefix(textBeforeCursor: string): string | undefined {\n const match = textBeforeCursor.match(/^\\/domains\\s+(?:[^\\s,]+,)*([^\\s,]*)$/);\n return match?.[1];\n}\n\nexport function domainCompletionItems(domainNames: string[], query: string): Array<{ value: string; label: string }> {\n const normalizedQuery = query.toLowerCase();\n return domainNames\n .filter((name) => name.toLowerCase().startsWith(normalizedQuery))\n .map((name) => ({ value: name, label: name }));\n}\n"],"mappings":"AAKA,SAAgB,EAAkB,EAA0B,EAA0C,CACpG,OAAO,EACJ,QAAS,GACR,EACG,MAAM,GAAc,CAAC,CACrB,IAAK,GAAS,EAAK,KAAK,CAAC,CAAC,CAC1B,OAAO,OAAO,CACnB,CAAC,CACA,QAAS,GAAS,EAAS,QAAQ,IAAS,CAAC,CAAI,CAAC,CACvD,CAEA,SAAgB,EAAuB,EAA8C,CAEnF,OADc,EAAiB,MAAM,sCAC1B,CAAC,GAAG,EACjB,CAEA,SAAgB,EAAsB,EAAuB,EAAwD,CACnH,IAAM,EAAkB,EAAM,YAAY,EAC1C,OAAO,EACJ,OAAQ,GAAS,EAAK,YAAY,CAAC,CAAC,WAAW,CAAe,CAAC,CAAC,CAChE,IAAK,IAAU,CAAE,MAAO,EAAM,MAAO,CAAK,EAAE,CACjD"}
@@ -0,0 +1,2 @@
1
+ const e={ConfigService:Symbol.for(`DoomConfig:ConfigService`)};exports.DOOM_CONFIG_TYPES=e;
2
+ //# sourceMappingURL=config.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.cjs","names":[],"sources":["../../src/types/config.ts"],"sourcesContent":["export const DOOM_CONFIG_TYPES = { ConfigService: Symbol.for('DoomConfig:ConfigService') } as const;\n\nexport type ProjectTrust = 'ask' | 'always' | 'never';\nexport type PlanningThinkingLevel = 'off' | 'minimal' | 'low' | 'medium' | 'high' | 'xhigh' | 'max';\nexport type VoiceEngine = 'auto' | 'whisper-cpp' | 'openai-whisper' | 'mlx-whisper';\nexport type VoiceTtsEngine = 'macos-say';\n\nexport interface PlanningAgentConfig {\n model?: string;\n thinking?: PlanningThinkingLevel;\n}\nexport interface PlanningModeConfig {\n main?: PlanningAgentConfig;\n subagents?: PlanningAgentConfig;\n plansDirectory?: string;\n}\nexport interface EditorConfig {\n command?: string;\n}\nexport interface VoiceModelConfig {\n path?: string;\n id?: string;\n}\nexport interface VoiceAdapterConfig {\n binary?: string;\n model: VoiceModelConfig;\n}\nexport interface VoiceTtsConfig {\n engine: VoiceTtsEngine;\n voice?: string;\n rate?: number;\n}\nexport interface VoiceAutoCaptureConfig {\n model: string;\n startPhrases?: string[];\n stopPhrases?: string[];\n utteranceIdleMs?: number;\n transcriptionTimeoutMs?: number;\n tts: VoiceTtsConfig;\n}\nexport interface ResolvedVoiceAutoCaptureConfig {\n model: string;\n startPhrases: string[];\n stopPhrases: string[];\n utteranceIdleMs: number;\n transcriptionTimeoutMs?: number;\n tts: VoiceTtsConfig;\n}\nexport interface VoiceConfig {\n engine?: VoiceEngine;\n language?: string;\n recorder?: { binary?: string; device?: string };\n adapters?: {\n 'whisper-cpp'?: VoiceAdapterConfig;\n 'openai-whisper'?: VoiceAdapterConfig;\n 'mlx-whisper'?: VoiceAdapterConfig;\n };\n autoCapture?: VoiceAutoCaptureConfig;\n}\nexport interface ResolvedVoiceConfig {\n engine: VoiceEngine;\n language: string;\n recorder: { binary?: string; device: string };\n adapters: NonNullable<VoiceConfig['adapters']>;\n autoCapture?: ResolvedVoiceAutoCaptureConfig;\n}\n/**\n * The matrix a repository selects by default.\n *\n * Read by `doom-pi sync`, which pins it into the generated Pi config so a plain\n * `pi` session starts on the same matrix the repository declares. The launcher\n * keeps taking its selection from flags and the environment.\n */\nexport interface DoomSelectionConfig {\n majorMode?: string;\n domains?: string[];\n profile?: string;\n}\n\nexport interface DoomConfig {\n modes?: { planning?: PlanningModeConfig };\n projectTrust: ProjectTrust;\n editor?: EditorConfig;\n voice?: VoiceConfig;\n selection?: DoomSelectionConfig;\n}\n\nexport interface PluginHookSource {\n pluginRoot: string;\n configPath: string;\n}\n\nexport interface HarnessState {\n root?: string;\n /** The one named major mode this session runs under. */\n majorMode: string;\n temporaryDirectory?: string;\n domains: string[];\n /** The layer components the major mode resolved to. */\n layers: string[];\n profile?: string;\n profileEnvironment: Record<string, string>;\n hookGroups?: string[];\n skillDirectories: string[];\n agentDirectories: string[];\n additionalDirectories: string[];\n childExtensions: string[];\n pluginDirectories: string[];\n pluginHooks: PluginHookSource[];\n mcpConfigPath?: string;\n personaFile?: string;\n workflowExtension?: string;\n allowProtectedWrites: boolean;\n hooks: boolean;\n agents: boolean;\n mcp: boolean;\n}\n\nexport type DeepReadonly<TValue> = TValue extends (...args: never[]) => unknown\n ? TValue\n : TValue extends readonly (infer TItem)[]\n ? readonly DeepReadonly<TItem>[]\n : TValue extends object\n ? { readonly [TKey in keyof TValue]: DeepReadonly<TValue[TKey]> }\n : TValue;\n\nexport type DoomHarnessContext = DeepReadonly<HarnessState>;\n\nexport interface DoomConfigContext {\n readonly settings: DeepReadonly<DoomConfig>;\n readonly harness: DoomHarnessContext;\n readonly requiresRelaunch: boolean;\n}\n\nexport interface IDoomConfigService {\n load(repoRoot: string, homeDirectory?: string): DoomConfig;\n}\n"],"mappings":"AAAA,MAAa,EAAoB,CAAE,cAAe,OAAO,IAAI,0BAA0B,CAAE"}
@@ -0,0 +1,136 @@
1
+ //#region src/types/config.d.ts
2
+ declare const DOOM_CONFIG_TYPES: {
3
+ readonly ConfigService: symbol;
4
+ };
5
+ type ProjectTrust = 'ask' | 'always' | 'never';
6
+ type PlanningThinkingLevel = 'off' | 'minimal' | 'low' | 'medium' | 'high' | 'xhigh' | 'max';
7
+ type VoiceEngine = 'auto' | 'whisper-cpp' | 'openai-whisper' | 'mlx-whisper';
8
+ type VoiceTtsEngine = 'macos-say';
9
+ interface PlanningAgentConfig {
10
+ model?: string;
11
+ thinking?: PlanningThinkingLevel;
12
+ }
13
+ interface PlanningModeConfig {
14
+ main?: PlanningAgentConfig;
15
+ subagents?: PlanningAgentConfig;
16
+ plansDirectory?: string;
17
+ }
18
+ interface EditorConfig {
19
+ command?: string;
20
+ }
21
+ interface VoiceModelConfig {
22
+ path?: string;
23
+ id?: string;
24
+ }
25
+ interface VoiceAdapterConfig {
26
+ binary?: string;
27
+ model: VoiceModelConfig;
28
+ }
29
+ interface VoiceTtsConfig {
30
+ engine: VoiceTtsEngine;
31
+ voice?: string;
32
+ rate?: number;
33
+ }
34
+ interface VoiceAutoCaptureConfig {
35
+ model: string;
36
+ startPhrases?: string[];
37
+ stopPhrases?: string[];
38
+ utteranceIdleMs?: number;
39
+ transcriptionTimeoutMs?: number;
40
+ tts: VoiceTtsConfig;
41
+ }
42
+ interface ResolvedVoiceAutoCaptureConfig {
43
+ model: string;
44
+ startPhrases: string[];
45
+ stopPhrases: string[];
46
+ utteranceIdleMs: number;
47
+ transcriptionTimeoutMs?: number;
48
+ tts: VoiceTtsConfig;
49
+ }
50
+ interface VoiceConfig {
51
+ engine?: VoiceEngine;
52
+ language?: string;
53
+ recorder?: {
54
+ binary?: string;
55
+ device?: string;
56
+ };
57
+ adapters?: {
58
+ 'whisper-cpp'?: VoiceAdapterConfig;
59
+ 'openai-whisper'?: VoiceAdapterConfig;
60
+ 'mlx-whisper'?: VoiceAdapterConfig;
61
+ };
62
+ autoCapture?: VoiceAutoCaptureConfig;
63
+ }
64
+ interface ResolvedVoiceConfig {
65
+ engine: VoiceEngine;
66
+ language: string;
67
+ recorder: {
68
+ binary?: string;
69
+ device: string;
70
+ };
71
+ adapters: NonNullable<VoiceConfig['adapters']>;
72
+ autoCapture?: ResolvedVoiceAutoCaptureConfig;
73
+ }
74
+ /**
75
+ * The matrix a repository selects by default.
76
+ *
77
+ * Read by `doom-pi sync`, which pins it into the generated Pi config so a plain
78
+ * `pi` session starts on the same matrix the repository declares. The launcher
79
+ * keeps taking its selection from flags and the environment.
80
+ */
81
+ interface DoomSelectionConfig {
82
+ majorMode?: string;
83
+ domains?: string[];
84
+ profile?: string;
85
+ }
86
+ interface DoomConfig {
87
+ modes?: {
88
+ planning?: PlanningModeConfig;
89
+ };
90
+ projectTrust: ProjectTrust;
91
+ editor?: EditorConfig;
92
+ voice?: VoiceConfig;
93
+ selection?: DoomSelectionConfig;
94
+ }
95
+ interface PluginHookSource {
96
+ pluginRoot: string;
97
+ configPath: string;
98
+ }
99
+ interface HarnessState {
100
+ root?: string;
101
+ /** The one named major mode this session runs under. */
102
+ majorMode: string;
103
+ temporaryDirectory?: string;
104
+ domains: string[];
105
+ /** The layer components the major mode resolved to. */
106
+ layers: string[];
107
+ profile?: string;
108
+ profileEnvironment: Record<string, string>;
109
+ hookGroups?: string[];
110
+ skillDirectories: string[];
111
+ agentDirectories: string[];
112
+ additionalDirectories: string[];
113
+ childExtensions: string[];
114
+ pluginDirectories: string[];
115
+ pluginHooks: PluginHookSource[];
116
+ mcpConfigPath?: string;
117
+ personaFile?: string;
118
+ workflowExtension?: string;
119
+ allowProtectedWrites: boolean;
120
+ hooks: boolean;
121
+ agents: boolean;
122
+ mcp: boolean;
123
+ }
124
+ type DeepReadonly<TValue> = TValue extends ((...args: never[]) => unknown) ? TValue : TValue extends readonly (infer TItem)[] ? readonly DeepReadonly<TItem>[] : TValue extends object ? { readonly [TKey in keyof TValue]: DeepReadonly<TValue[TKey]>; } : TValue;
125
+ type DoomHarnessContext = DeepReadonly<HarnessState>;
126
+ interface DoomConfigContext {
127
+ readonly settings: DeepReadonly<DoomConfig>;
128
+ readonly harness: DoomHarnessContext;
129
+ readonly requiresRelaunch: boolean;
130
+ }
131
+ interface IDoomConfigService {
132
+ load(repoRoot: string, homeDirectory?: string): DoomConfig;
133
+ }
134
+ //#endregion
135
+ export { DOOM_CONFIG_TYPES, DeepReadonly, DoomConfig, DoomConfigContext, DoomHarnessContext, DoomSelectionConfig, EditorConfig, HarnessState, IDoomConfigService, PlanningAgentConfig, PlanningModeConfig, PlanningThinkingLevel, PluginHookSource, ProjectTrust, ResolvedVoiceAutoCaptureConfig, ResolvedVoiceConfig, VoiceAdapterConfig, VoiceAutoCaptureConfig, VoiceConfig, VoiceEngine, VoiceModelConfig, VoiceTtsConfig, VoiceTtsEngine };
136
+ //# sourceMappingURL=config.d.cts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.cts","names":[],"sources":["../../src/types/config.ts"],"mappings":";cAAa;WAAA;;KAED;KACA;KACA;KACA;UAEK;EACf;EACA,WAAW;;UAEI;EACf,OAAO;EACP,YAAY;EACZ;;UAEe;EACf;;UAEe;EACf;EACA;;UAEe;EACf;EACA,OAAO;;UAEQ;EACf,QAAQ;EACR;EACA;;UAEe;EACf;EACA;EACA;EACA;EACA;EACA,KAAK;;UAEU;EACf;EACA;EACA;EACA;EACA;EACA,KAAK;;UAEU;EACf,SAAS;EACT;EACA;IAAa;IAAiB;;EAC9B;IACE,gBAAgB;IAChB,mBAAmB;IACnB,gBAAgB;;EAElB,cAAc;;UAEC;EACf,QAAQ;EACR;EACA;IAAY;IAAiB;;EAC7B,UAAU,YAAY;EACtB,cAAc;;;;;;;;;UASC;EACf;EACA;EACA;;UAGe;EACf;IAAU,WAAW;;EACrB,cAAc;EACd,SAAS;EACT,QAAQ;EACR,YAAY;;UAGG;EACf;EACA;;UAGe;EACf;;EAEA;EACA;EACA;;EAEA;EACA;EACA,oBAAoB;EACpB;EACA;EACA;EACA;EACA;EACA;EACA,aAAa;EACb;EACA;EACA;EACA;EACA;EACA;EACA;;KAGU,aAAa,UAAU,oBAAmB,6BAClD,SACA,+BAA+B,oBACpB,aAAa,WACtB,oCACc,cAAc,SAAS,aAAa,OAAO,YACvD;KAEI,qBAAqB,aAAa;UAE7B;WACN,UAAU,aAAa;WACvB,SAAS;WACT;;UAGM;EACf,KAAK,kBAAkB,yBAAyB"}
@@ -0,0 +1,136 @@
1
+ //#region src/types/config.d.ts
2
+ declare const DOOM_CONFIG_TYPES: {
3
+ readonly ConfigService: symbol;
4
+ };
5
+ type ProjectTrust = 'ask' | 'always' | 'never';
6
+ type PlanningThinkingLevel = 'off' | 'minimal' | 'low' | 'medium' | 'high' | 'xhigh' | 'max';
7
+ type VoiceEngine = 'auto' | 'whisper-cpp' | 'openai-whisper' | 'mlx-whisper';
8
+ type VoiceTtsEngine = 'macos-say';
9
+ interface PlanningAgentConfig {
10
+ model?: string;
11
+ thinking?: PlanningThinkingLevel;
12
+ }
13
+ interface PlanningModeConfig {
14
+ main?: PlanningAgentConfig;
15
+ subagents?: PlanningAgentConfig;
16
+ plansDirectory?: string;
17
+ }
18
+ interface EditorConfig {
19
+ command?: string;
20
+ }
21
+ interface VoiceModelConfig {
22
+ path?: string;
23
+ id?: string;
24
+ }
25
+ interface VoiceAdapterConfig {
26
+ binary?: string;
27
+ model: VoiceModelConfig;
28
+ }
29
+ interface VoiceTtsConfig {
30
+ engine: VoiceTtsEngine;
31
+ voice?: string;
32
+ rate?: number;
33
+ }
34
+ interface VoiceAutoCaptureConfig {
35
+ model: string;
36
+ startPhrases?: string[];
37
+ stopPhrases?: string[];
38
+ utteranceIdleMs?: number;
39
+ transcriptionTimeoutMs?: number;
40
+ tts: VoiceTtsConfig;
41
+ }
42
+ interface ResolvedVoiceAutoCaptureConfig {
43
+ model: string;
44
+ startPhrases: string[];
45
+ stopPhrases: string[];
46
+ utteranceIdleMs: number;
47
+ transcriptionTimeoutMs?: number;
48
+ tts: VoiceTtsConfig;
49
+ }
50
+ interface VoiceConfig {
51
+ engine?: VoiceEngine;
52
+ language?: string;
53
+ recorder?: {
54
+ binary?: string;
55
+ device?: string;
56
+ };
57
+ adapters?: {
58
+ 'whisper-cpp'?: VoiceAdapterConfig;
59
+ 'openai-whisper'?: VoiceAdapterConfig;
60
+ 'mlx-whisper'?: VoiceAdapterConfig;
61
+ };
62
+ autoCapture?: VoiceAutoCaptureConfig;
63
+ }
64
+ interface ResolvedVoiceConfig {
65
+ engine: VoiceEngine;
66
+ language: string;
67
+ recorder: {
68
+ binary?: string;
69
+ device: string;
70
+ };
71
+ adapters: NonNullable<VoiceConfig['adapters']>;
72
+ autoCapture?: ResolvedVoiceAutoCaptureConfig;
73
+ }
74
+ /**
75
+ * The matrix a repository selects by default.
76
+ *
77
+ * Read by `doom-pi sync`, which pins it into the generated Pi config so a plain
78
+ * `pi` session starts on the same matrix the repository declares. The launcher
79
+ * keeps taking its selection from flags and the environment.
80
+ */
81
+ interface DoomSelectionConfig {
82
+ majorMode?: string;
83
+ domains?: string[];
84
+ profile?: string;
85
+ }
86
+ interface DoomConfig {
87
+ modes?: {
88
+ planning?: PlanningModeConfig;
89
+ };
90
+ projectTrust: ProjectTrust;
91
+ editor?: EditorConfig;
92
+ voice?: VoiceConfig;
93
+ selection?: DoomSelectionConfig;
94
+ }
95
+ interface PluginHookSource {
96
+ pluginRoot: string;
97
+ configPath: string;
98
+ }
99
+ interface HarnessState {
100
+ root?: string;
101
+ /** The one named major mode this session runs under. */
102
+ majorMode: string;
103
+ temporaryDirectory?: string;
104
+ domains: string[];
105
+ /** The layer components the major mode resolved to. */
106
+ layers: string[];
107
+ profile?: string;
108
+ profileEnvironment: Record<string, string>;
109
+ hookGroups?: string[];
110
+ skillDirectories: string[];
111
+ agentDirectories: string[];
112
+ additionalDirectories: string[];
113
+ childExtensions: string[];
114
+ pluginDirectories: string[];
115
+ pluginHooks: PluginHookSource[];
116
+ mcpConfigPath?: string;
117
+ personaFile?: string;
118
+ workflowExtension?: string;
119
+ allowProtectedWrites: boolean;
120
+ hooks: boolean;
121
+ agents: boolean;
122
+ mcp: boolean;
123
+ }
124
+ type DeepReadonly<TValue> = TValue extends ((...args: never[]) => unknown) ? TValue : TValue extends readonly (infer TItem)[] ? readonly DeepReadonly<TItem>[] : TValue extends object ? { readonly [TKey in keyof TValue]: DeepReadonly<TValue[TKey]>; } : TValue;
125
+ type DoomHarnessContext = DeepReadonly<HarnessState>;
126
+ interface DoomConfigContext {
127
+ readonly settings: DeepReadonly<DoomConfig>;
128
+ readonly harness: DoomHarnessContext;
129
+ readonly requiresRelaunch: boolean;
130
+ }
131
+ interface IDoomConfigService {
132
+ load(repoRoot: string, homeDirectory?: string): DoomConfig;
133
+ }
134
+ //#endregion
135
+ export { DOOM_CONFIG_TYPES, DeepReadonly, DoomConfig, DoomConfigContext, DoomHarnessContext, DoomSelectionConfig, EditorConfig, HarnessState, IDoomConfigService, PlanningAgentConfig, PlanningModeConfig, PlanningThinkingLevel, PluginHookSource, ProjectTrust, ResolvedVoiceAutoCaptureConfig, ResolvedVoiceConfig, VoiceAdapterConfig, VoiceAutoCaptureConfig, VoiceConfig, VoiceEngine, VoiceModelConfig, VoiceTtsConfig, VoiceTtsEngine };
136
+ //# sourceMappingURL=config.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.mts","names":[],"sources":["../../src/types/config.ts"],"mappings":";cAAa;WAAA;;KAED;KACA;KACA;KACA;UAEK;EACf;EACA,WAAW;;UAEI;EACf,OAAO;EACP,YAAY;EACZ;;UAEe;EACf;;UAEe;EACf;EACA;;UAEe;EACf;EACA,OAAO;;UAEQ;EACf,QAAQ;EACR;EACA;;UAEe;EACf;EACA;EACA;EACA;EACA;EACA,KAAK;;UAEU;EACf;EACA;EACA;EACA;EACA;EACA,KAAK;;UAEU;EACf,SAAS;EACT;EACA;IAAa;IAAiB;;EAC9B;IACE,gBAAgB;IAChB,mBAAmB;IACnB,gBAAgB;;EAElB,cAAc;;UAEC;EACf,QAAQ;EACR;EACA;IAAY;IAAiB;;EAC7B,UAAU,YAAY;EACtB,cAAc;;;;;;;;;UASC;EACf;EACA;EACA;;UAGe;EACf;IAAU,WAAW;;EACrB,cAAc;EACd,SAAS;EACT,QAAQ;EACR,YAAY;;UAGG;EACf;EACA;;UAGe;EACf;;EAEA;EACA;EACA;;EAEA;EACA;EACA,oBAAoB;EACpB;EACA;EACA;EACA;EACA;EACA;EACA,aAAa;EACb;EACA;EACA;EACA;EACA;EACA;EACA;;KAGU,aAAa,UAAU,oBAAmB,6BAClD,SACA,+BAA+B,oBACpB,aAAa,WACtB,oCACc,cAAc,SAAS,aAAa,OAAO,YACvD;KAEI,qBAAqB,aAAa;UAE7B;WACN,UAAU,aAAa;WACvB,SAAS;WACT;;UAGM;EACf,KAAK,kBAAkB,yBAAyB"}
@@ -0,0 +1,2 @@
1
+ const e={ConfigService:Symbol.for(`DoomConfig:ConfigService`)};export{e as DOOM_CONFIG_TYPES};
2
+ //# sourceMappingURL=config.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.mjs","names":[],"sources":["../../src/types/config.ts"],"sourcesContent":["export const DOOM_CONFIG_TYPES = { ConfigService: Symbol.for('DoomConfig:ConfigService') } as const;\n\nexport type ProjectTrust = 'ask' | 'always' | 'never';\nexport type PlanningThinkingLevel = 'off' | 'minimal' | 'low' | 'medium' | 'high' | 'xhigh' | 'max';\nexport type VoiceEngine = 'auto' | 'whisper-cpp' | 'openai-whisper' | 'mlx-whisper';\nexport type VoiceTtsEngine = 'macos-say';\n\nexport interface PlanningAgentConfig {\n model?: string;\n thinking?: PlanningThinkingLevel;\n}\nexport interface PlanningModeConfig {\n main?: PlanningAgentConfig;\n subagents?: PlanningAgentConfig;\n plansDirectory?: string;\n}\nexport interface EditorConfig {\n command?: string;\n}\nexport interface VoiceModelConfig {\n path?: string;\n id?: string;\n}\nexport interface VoiceAdapterConfig {\n binary?: string;\n model: VoiceModelConfig;\n}\nexport interface VoiceTtsConfig {\n engine: VoiceTtsEngine;\n voice?: string;\n rate?: number;\n}\nexport interface VoiceAutoCaptureConfig {\n model: string;\n startPhrases?: string[];\n stopPhrases?: string[];\n utteranceIdleMs?: number;\n transcriptionTimeoutMs?: number;\n tts: VoiceTtsConfig;\n}\nexport interface ResolvedVoiceAutoCaptureConfig {\n model: string;\n startPhrases: string[];\n stopPhrases: string[];\n utteranceIdleMs: number;\n transcriptionTimeoutMs?: number;\n tts: VoiceTtsConfig;\n}\nexport interface VoiceConfig {\n engine?: VoiceEngine;\n language?: string;\n recorder?: { binary?: string; device?: string };\n adapters?: {\n 'whisper-cpp'?: VoiceAdapterConfig;\n 'openai-whisper'?: VoiceAdapterConfig;\n 'mlx-whisper'?: VoiceAdapterConfig;\n };\n autoCapture?: VoiceAutoCaptureConfig;\n}\nexport interface ResolvedVoiceConfig {\n engine: VoiceEngine;\n language: string;\n recorder: { binary?: string; device: string };\n adapters: NonNullable<VoiceConfig['adapters']>;\n autoCapture?: ResolvedVoiceAutoCaptureConfig;\n}\n/**\n * The matrix a repository selects by default.\n *\n * Read by `doom-pi sync`, which pins it into the generated Pi config so a plain\n * `pi` session starts on the same matrix the repository declares. The launcher\n * keeps taking its selection from flags and the environment.\n */\nexport interface DoomSelectionConfig {\n majorMode?: string;\n domains?: string[];\n profile?: string;\n}\n\nexport interface DoomConfig {\n modes?: { planning?: PlanningModeConfig };\n projectTrust: ProjectTrust;\n editor?: EditorConfig;\n voice?: VoiceConfig;\n selection?: DoomSelectionConfig;\n}\n\nexport interface PluginHookSource {\n pluginRoot: string;\n configPath: string;\n}\n\nexport interface HarnessState {\n root?: string;\n /** The one named major mode this session runs under. */\n majorMode: string;\n temporaryDirectory?: string;\n domains: string[];\n /** The layer components the major mode resolved to. */\n layers: string[];\n profile?: string;\n profileEnvironment: Record<string, string>;\n hookGroups?: string[];\n skillDirectories: string[];\n agentDirectories: string[];\n additionalDirectories: string[];\n childExtensions: string[];\n pluginDirectories: string[];\n pluginHooks: PluginHookSource[];\n mcpConfigPath?: string;\n personaFile?: string;\n workflowExtension?: string;\n allowProtectedWrites: boolean;\n hooks: boolean;\n agents: boolean;\n mcp: boolean;\n}\n\nexport type DeepReadonly<TValue> = TValue extends (...args: never[]) => unknown\n ? TValue\n : TValue extends readonly (infer TItem)[]\n ? readonly DeepReadonly<TItem>[]\n : TValue extends object\n ? { readonly [TKey in keyof TValue]: DeepReadonly<TValue[TKey]> }\n : TValue;\n\nexport type DoomHarnessContext = DeepReadonly<HarnessState>;\n\nexport interface DoomConfigContext {\n readonly settings: DeepReadonly<DoomConfig>;\n readonly harness: DoomHarnessContext;\n readonly requiresRelaunch: boolean;\n}\n\nexport interface IDoomConfigService {\n load(repoRoot: string, homeDirectory?: string): DoomConfig;\n}\n"],"mappings":"AAAA,MAAa,EAAoB,CAAE,cAAe,OAAO,IAAI,0BAA0B,CAAE"}
@@ -0,0 +1,89 @@
1
+ //#region src/types/domains.d.ts
2
+ interface LocalPluginSource {
3
+ type: 'local';
4
+ /** Absolute plugin directory after resolving the declaring config or marketplace root. */
5
+ path: string;
6
+ }
7
+ interface GitPluginSource {
8
+ type: 'git';
9
+ url: string;
10
+ /** Optional repository-relative plugin directory. */
11
+ path?: string;
12
+ ref?: string;
13
+ sha?: string;
14
+ }
15
+ interface NpmPluginSource {
16
+ type: 'npm';
17
+ package: string;
18
+ version?: string;
19
+ registry?: string;
20
+ }
21
+ type PluginSource = LocalPluginSource | GitPluginSource | NpmPluginSource;
22
+ type PluginSkillDiscovery = 'recursive' | 'direct-children';
23
+ interface PluginManifestMetadata {
24
+ path: string;
25
+ name?: string;
26
+ version?: string;
27
+ description?: string;
28
+ agentPluginSchema?: string;
29
+ }
30
+ interface PluginCatalogEntry {
31
+ source: PluginSource;
32
+ description?: string;
33
+ marketplace?: string;
34
+ manifest?: PluginManifestMetadata;
35
+ }
36
+ interface PluginCatalog {
37
+ /** Marketplace, plugin, or plugin-container roots resolved against their declaring config. */
38
+ roots: string[];
39
+ /** Supported marketplace manifests discovered in precedence order. */
40
+ marketplaces: string[];
41
+ /** Named explicit and marketplace plugin entries. */
42
+ entries: Record<string, PluginCatalogEntry>;
43
+ /** Non-fatal errors from automatic marketplace and folder discovery. */
44
+ diagnostics: string[];
45
+ }
46
+ /** A named plugin, or a subset of one. */
47
+ type DomainPlugin = string | {
48
+ name: string;
49
+ skills?: string[];
50
+ agents?: string[];
51
+ hooks?: boolean;
52
+ mcp?: boolean;
53
+ };
54
+ interface DomainMcpAllowlist {
55
+ /** Server names kept from the repository-level .mcp.json. */
56
+ servers?: string[];
57
+ /** Upstream server names kept in the agiflow-proxy config. */
58
+ proxy?: string[];
59
+ }
60
+ interface DomainDefinition {
61
+ description?: string;
62
+ plugins?: DomainPlugin[];
63
+ mcp?: DomainMcpAllowlist;
64
+ sharedSkills?: boolean;
65
+ }
66
+ interface ResolvedDomain extends DomainDefinition {
67
+ baseDirectory: string;
68
+ }
69
+ interface DomainManifest {
70
+ plugins: PluginCatalog;
71
+ domains: Record<string, ResolvedDomain>;
72
+ aliases: Record<string, string[]>;
73
+ defaultDomains?: string[];
74
+ }
75
+ interface PluginEntry {
76
+ /** Catalog identifier when the entry came from domains.yaml. */
77
+ name?: string;
78
+ directory: string;
79
+ /** Omitted for legacy programmatic callers that already supply a directory. */
80
+ source?: PluginSource;
81
+ skillDiscovery?: PluginSkillDiscovery;
82
+ skills?: string[];
83
+ agents?: string[];
84
+ hooks?: boolean;
85
+ mcp?: boolean;
86
+ }
87
+ //#endregion
88
+ export { DomainDefinition, DomainManifest, DomainMcpAllowlist, DomainPlugin, GitPluginSource, LocalPluginSource, NpmPluginSource, PluginCatalog, PluginCatalogEntry, PluginEntry, PluginManifestMetadata, PluginSkillDiscovery, PluginSource, ResolvedDomain };
89
+ //# sourceMappingURL=domains.d.cts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"domains.d.cts","names":[],"sources":["../../src/types/domains.ts"],"mappings":";UAAiB;EACf;;EAEA;;UAGe;EACf;EACA;;EAEA;EACA;EACA;;UAGe;EACf;EACA;EACA;EACA;;KAGU,eAAe,oBAAoB,kBAAkB;KACrD;UAEK;EACf;EACA;EACA;EACA;EACA;;UAGe;EACf,QAAQ;EACR;EACA;EACA,WAAW;;UAGI;;EAEf;;EAEA;;EAEA,SAAS,eAAe;;EAExB;;;KAIU;EAEN;EAAc;EAAmB;EAAmB;EAAiB;;UAE1D;;EAEf;;EAEA;;UAGe;EACf;EACA,UAAU;EACV,MAAM;EACN;;UAGe,uBAAuB;EACtC;;UAGe;EACf,SAAS;EACT,SAAS,eAAe;EACxB,SAAS;EACT;;UAGe;;EAEf;EACA;;EAEA,SAAS;EACT,iBAAiB;EACjB;EACA;EACA;EACA"}
@@ -0,0 +1,89 @@
1
+ //#region src/types/domains.d.ts
2
+ interface LocalPluginSource {
3
+ type: 'local';
4
+ /** Absolute plugin directory after resolving the declaring config or marketplace root. */
5
+ path: string;
6
+ }
7
+ interface GitPluginSource {
8
+ type: 'git';
9
+ url: string;
10
+ /** Optional repository-relative plugin directory. */
11
+ path?: string;
12
+ ref?: string;
13
+ sha?: string;
14
+ }
15
+ interface NpmPluginSource {
16
+ type: 'npm';
17
+ package: string;
18
+ version?: string;
19
+ registry?: string;
20
+ }
21
+ type PluginSource = LocalPluginSource | GitPluginSource | NpmPluginSource;
22
+ type PluginSkillDiscovery = 'recursive' | 'direct-children';
23
+ interface PluginManifestMetadata {
24
+ path: string;
25
+ name?: string;
26
+ version?: string;
27
+ description?: string;
28
+ agentPluginSchema?: string;
29
+ }
30
+ interface PluginCatalogEntry {
31
+ source: PluginSource;
32
+ description?: string;
33
+ marketplace?: string;
34
+ manifest?: PluginManifestMetadata;
35
+ }
36
+ interface PluginCatalog {
37
+ /** Marketplace, plugin, or plugin-container roots resolved against their declaring config. */
38
+ roots: string[];
39
+ /** Supported marketplace manifests discovered in precedence order. */
40
+ marketplaces: string[];
41
+ /** Named explicit and marketplace plugin entries. */
42
+ entries: Record<string, PluginCatalogEntry>;
43
+ /** Non-fatal errors from automatic marketplace and folder discovery. */
44
+ diagnostics: string[];
45
+ }
46
+ /** A named plugin, or a subset of one. */
47
+ type DomainPlugin = string | {
48
+ name: string;
49
+ skills?: string[];
50
+ agents?: string[];
51
+ hooks?: boolean;
52
+ mcp?: boolean;
53
+ };
54
+ interface DomainMcpAllowlist {
55
+ /** Server names kept from the repository-level .mcp.json. */
56
+ servers?: string[];
57
+ /** Upstream server names kept in the agiflow-proxy config. */
58
+ proxy?: string[];
59
+ }
60
+ interface DomainDefinition {
61
+ description?: string;
62
+ plugins?: DomainPlugin[];
63
+ mcp?: DomainMcpAllowlist;
64
+ sharedSkills?: boolean;
65
+ }
66
+ interface ResolvedDomain extends DomainDefinition {
67
+ baseDirectory: string;
68
+ }
69
+ interface DomainManifest {
70
+ plugins: PluginCatalog;
71
+ domains: Record<string, ResolvedDomain>;
72
+ aliases: Record<string, string[]>;
73
+ defaultDomains?: string[];
74
+ }
75
+ interface PluginEntry {
76
+ /** Catalog identifier when the entry came from domains.yaml. */
77
+ name?: string;
78
+ directory: string;
79
+ /** Omitted for legacy programmatic callers that already supply a directory. */
80
+ source?: PluginSource;
81
+ skillDiscovery?: PluginSkillDiscovery;
82
+ skills?: string[];
83
+ agents?: string[];
84
+ hooks?: boolean;
85
+ mcp?: boolean;
86
+ }
87
+ //#endregion
88
+ export { DomainDefinition, DomainManifest, DomainMcpAllowlist, DomainPlugin, GitPluginSource, LocalPluginSource, NpmPluginSource, PluginCatalog, PluginCatalogEntry, PluginEntry, PluginManifestMetadata, PluginSkillDiscovery, PluginSource, ResolvedDomain };
89
+ //# sourceMappingURL=domains.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"domains.d.mts","names":[],"sources":["../../src/types/domains.ts"],"mappings":";UAAiB;EACf;;EAEA;;UAGe;EACf;EACA;;EAEA;EACA;EACA;;UAGe;EACf;EACA;EACA;EACA;;KAGU,eAAe,oBAAoB,kBAAkB;KACrD;UAEK;EACf;EACA;EACA;EACA;EACA;;UAGe;EACf,QAAQ;EACR;EACA;EACA,WAAW;;UAGI;;EAEf;;EAEA;;EAEA,SAAS,eAAe;;EAExB;;;KAIU;EAEN;EAAc;EAAmB;EAAmB;EAAiB;;UAE1D;;EAEf;;EAEA;;UAGe;EACf;EACA,UAAU;EACV,MAAM;EACN;;UAGe,uBAAuB;EACtC;;UAGe;EACf,SAAS;EACT,SAAS,eAAe;EACxB,SAAS;EACT;;UAGe;;EAEf;EACA;;EAEA,SAAS;EACT,iBAAiB;EACjB;EACA;EACA;EACA"}
package/dist/types.cjs CHANGED
@@ -1,2 +1 @@
1
- Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e={ConfigService:Symbol.for(`DoomConfig:ConfigService`)};exports.DOOM_CONFIG_TYPES=e;
2
- //# sourceMappingURL=types.cjs.map
1
+ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("./types/config.cjs");exports.DOOM_CONFIG_TYPES=e.DOOM_CONFIG_TYPES;