obsidian-mcp-server 2.0.7 → 3.0.0

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 (253) hide show
  1. package/CLAUDE.md +364 -0
  2. package/Dockerfile +99 -0
  3. package/LICENSE +4 -6
  4. package/README.md +246 -206
  5. package/changelog/3.0.x/3.0.0.md +102 -0
  6. package/changelog/template.md +51 -0
  7. package/dist/config/server-config.d.ts +19 -0
  8. package/dist/config/server-config.d.ts.map +1 -0
  9. package/dist/config/server-config.js +55 -0
  10. package/dist/config/server-config.js.map +1 -0
  11. package/dist/index.d.ts +7 -0
  12. package/dist/index.d.ts.map +1 -0
  13. package/dist/index.js +23 -295
  14. package/dist/index.js.map +1 -0
  15. package/dist/mcp-server/prompts/definitions/index.d.ts +8 -0
  16. package/dist/mcp-server/prompts/definitions/index.d.ts.map +1 -0
  17. package/dist/mcp-server/prompts/definitions/index.js +8 -0
  18. package/dist/mcp-server/prompts/definitions/index.js.map +1 -0
  19. package/dist/mcp-server/resources/definitions/index.d.ts +36 -0
  20. package/dist/mcp-server/resources/definitions/index.d.ts.map +1 -0
  21. package/dist/mcp-server/resources/definitions/index.js +9 -0
  22. package/dist/mcp-server/resources/definitions/index.js.map +1 -0
  23. package/dist/mcp-server/resources/definitions/obsidian-status.resource.d.ts +23 -0
  24. package/dist/mcp-server/resources/definitions/obsidian-status.resource.d.ts.map +1 -0
  25. package/dist/mcp-server/resources/definitions/obsidian-status.resource.js +47 -0
  26. package/dist/mcp-server/resources/definitions/obsidian-status.resource.js.map +1 -0
  27. package/dist/mcp-server/resources/definitions/obsidian-tags.resource.d.ts +13 -0
  28. package/dist/mcp-server/resources/definitions/obsidian-tags.resource.d.ts.map +1 -0
  29. package/dist/mcp-server/resources/definitions/obsidian-tags.resource.js +30 -0
  30. package/dist/mcp-server/resources/definitions/obsidian-tags.resource.js.map +1 -0
  31. package/dist/mcp-server/resources/definitions/obsidian-vault-note.resource.d.ts +21 -0
  32. package/dist/mcp-server/resources/definitions/obsidian-vault-note.resource.d.ts.map +1 -0
  33. package/dist/mcp-server/resources/definitions/obsidian-vault-note.resource.js +38 -0
  34. package/dist/mcp-server/resources/definitions/obsidian-vault-note.resource.js.map +1 -0
  35. package/dist/mcp-server/tools/definitions/_shared/schemas.d.ts +45 -0
  36. package/dist/mcp-server/tools/definitions/_shared/schemas.d.ts.map +1 -0
  37. package/dist/mcp-server/tools/definitions/_shared/schemas.js +66 -0
  38. package/dist/mcp-server/tools/definitions/_shared/schemas.js.map +1 -0
  39. package/dist/mcp-server/tools/definitions/_shared/suggest-paths.d.ts +51 -0
  40. package/dist/mcp-server/tools/definitions/_shared/suggest-paths.d.ts.map +1 -0
  41. package/dist/mcp-server/tools/definitions/_shared/suggest-paths.js +120 -0
  42. package/dist/mcp-server/tools/definitions/_shared/suggest-paths.js.map +1 -0
  43. package/dist/mcp-server/tools/definitions/index.d.ts +531 -0
  44. package/dist/mcp-server/tools/definitions/index.d.ts.map +1 -0
  45. package/dist/mcp-server/tools/definitions/index.js +38 -0
  46. package/dist/mcp-server/tools/definitions/index.js.map +1 -0
  47. package/dist/mcp-server/tools/definitions/obsidian-append-to-note.tool.d.ts +42 -0
  48. package/dist/mcp-server/tools/definitions/obsidian-append-to-note.tool.d.ts.map +1 -0
  49. package/dist/mcp-server/tools/definitions/obsidian-append-to-note.tool.js +58 -0
  50. package/dist/mcp-server/tools/definitions/obsidian-append-to-note.tool.js.map +1 -0
  51. package/dist/mcp-server/tools/definitions/obsidian-delete-note.tool.d.ts +46 -0
  52. package/dist/mcp-server/tools/definitions/obsidian-delete-note.tool.d.ts.map +1 -0
  53. package/dist/mcp-server/tools/definitions/obsidian-delete-note.tool.js +66 -0
  54. package/dist/mcp-server/tools/definitions/obsidian-delete-note.tool.js.map +1 -0
  55. package/dist/mcp-server/tools/definitions/obsidian-execute-command.tool.d.ts +19 -0
  56. package/dist/mcp-server/tools/definitions/obsidian-execute-command.tool.d.ts.map +1 -0
  57. package/dist/mcp-server/tools/definitions/obsidian-execute-command.tool.js +43 -0
  58. package/dist/mcp-server/tools/definitions/obsidian-execute-command.tool.js.map +1 -0
  59. package/dist/mcp-server/tools/definitions/obsidian-get-note.tool.d.ts +92 -0
  60. package/dist/mcp-server/tools/definitions/obsidian-get-note.tool.d.ts.map +1 -0
  61. package/dist/mcp-server/tools/definitions/obsidian-get-note.tool.js +245 -0
  62. package/dist/mcp-server/tools/definitions/obsidian-get-note.tool.js.map +1 -0
  63. package/dist/mcp-server/tools/definitions/obsidian-list-commands.tool.d.ts +13 -0
  64. package/dist/mcp-server/tools/definitions/obsidian-list-commands.tool.d.ts.map +1 -0
  65. package/dist/mcp-server/tools/definitions/obsidian-list-commands.tool.js +38 -0
  66. package/dist/mcp-server/tools/definitions/obsidian-list-commands.tool.js.map +1 -0
  67. package/dist/mcp-server/tools/definitions/obsidian-list-notes.tool.d.ts +59 -0
  68. package/dist/mcp-server/tools/definitions/obsidian-list-notes.tool.d.ts.map +1 -0
  69. package/dist/mcp-server/tools/definitions/obsidian-list-notes.tool.js +273 -0
  70. package/dist/mcp-server/tools/definitions/obsidian-list-notes.tool.js.map +1 -0
  71. package/dist/mcp-server/tools/definitions/obsidian-list-tags.tool.d.ts +13 -0
  72. package/dist/mcp-server/tools/definitions/obsidian-list-tags.tool.d.ts.map +1 -0
  73. package/dist/mcp-server/tools/definitions/obsidian-list-tags.tool.js +38 -0
  74. package/dist/mcp-server/tools/definitions/obsidian-list-tags.tool.js.map +1 -0
  75. package/dist/mcp-server/tools/definitions/obsidian-manage-frontmatter.tool.d.ts +68 -0
  76. package/dist/mcp-server/tools/definitions/obsidian-manage-frontmatter.tool.d.ts.map +1 -0
  77. package/dist/mcp-server/tools/definitions/obsidian-manage-frontmatter.tool.js +178 -0
  78. package/dist/mcp-server/tools/definitions/obsidian-manage-frontmatter.tool.js.map +1 -0
  79. package/dist/mcp-server/tools/definitions/obsidian-manage-tags.tool.d.ts +77 -0
  80. package/dist/mcp-server/tools/definitions/obsidian-manage-tags.tool.d.ts.map +1 -0
  81. package/dist/mcp-server/tools/definitions/obsidian-manage-tags.tool.js +172 -0
  82. package/dist/mcp-server/tools/definitions/obsidian-manage-tags.tool.js.map +1 -0
  83. package/dist/mcp-server/tools/definitions/obsidian-open-in-ui.tool.d.ts +22 -0
  84. package/dist/mcp-server/tools/definitions/obsidian-open-in-ui.tool.d.ts.map +1 -0
  85. package/dist/mcp-server/tools/definitions/obsidian-open-in-ui.tool.js +88 -0
  86. package/dist/mcp-server/tools/definitions/obsidian-open-in-ui.tool.js.map +1 -0
  87. package/dist/mcp-server/tools/definitions/obsidian-patch-note.tool.d.ts +81 -0
  88. package/dist/mcp-server/tools/definitions/obsidian-patch-note.tool.d.ts.map +1 -0
  89. package/dist/mcp-server/tools/definitions/obsidian-patch-note.tool.js +83 -0
  90. package/dist/mcp-server/tools/definitions/obsidian-patch-note.tool.js.map +1 -0
  91. package/dist/mcp-server/tools/definitions/obsidian-replace-in-note.tool.d.ts +59 -0
  92. package/dist/mcp-server/tools/definitions/obsidian-replace-in-note.tool.d.ts.map +1 -0
  93. package/dist/mcp-server/tools/definitions/obsidian-replace-in-note.tool.js +167 -0
  94. package/dist/mcp-server/tools/definitions/obsidian-replace-in-note.tool.js.map +1 -0
  95. package/dist/mcp-server/tools/definitions/obsidian-search-notes.tool.d.ts +76 -0
  96. package/dist/mcp-server/tools/definitions/obsidian-search-notes.tool.d.ts.map +1 -0
  97. package/dist/mcp-server/tools/definitions/obsidian-search-notes.tool.js +244 -0
  98. package/dist/mcp-server/tools/definitions/obsidian-search-notes.tool.js.map +1 -0
  99. package/dist/mcp-server/tools/definitions/obsidian-write-note.tool.d.ts +41 -0
  100. package/dist/mcp-server/tools/definitions/obsidian-write-note.tool.d.ts.map +1 -0
  101. package/dist/mcp-server/tools/definitions/obsidian-write-note.tool.js +76 -0
  102. package/dist/mcp-server/tools/definitions/obsidian-write-note.tool.js.map +1 -0
  103. package/dist/services/obsidian/frontmatter-ops.d.ts +34 -0
  104. package/dist/services/obsidian/frontmatter-ops.d.ts.map +1 -0
  105. package/dist/services/obsidian/frontmatter-ops.js +230 -0
  106. package/dist/services/obsidian/frontmatter-ops.js.map +1 -0
  107. package/dist/services/obsidian/obsidian-service.d.ts +73 -0
  108. package/dist/services/obsidian/obsidian-service.d.ts.map +1 -0
  109. package/dist/services/obsidian/obsidian-service.js +399 -0
  110. package/dist/services/obsidian/obsidian-service.js.map +1 -0
  111. package/dist/services/obsidian/section-extractor.d.ts +13 -0
  112. package/dist/services/obsidian/section-extractor.d.ts.map +1 -0
  113. package/dist/services/obsidian/section-extractor.js +124 -0
  114. package/dist/services/obsidian/section-extractor.js.map +1 -0
  115. package/dist/services/obsidian/types.d.ts +91 -0
  116. package/dist/services/obsidian/types.d.ts.map +1 -0
  117. package/dist/services/obsidian/types.js +7 -0
  118. package/dist/services/obsidian/types.js.map +1 -0
  119. package/package.json +63 -69
  120. package/server.json +167 -0
  121. package/CHANGELOG.md +0 -124
  122. package/dist/config/index.d.ts +0 -41
  123. package/dist/config/index.js +0 -191
  124. package/dist/mcp-server/server.d.ts +0 -33
  125. package/dist/mcp-server/server.js +0 -211
  126. package/dist/mcp-server/tools/obsidianDeleteNoteTool/index.d.ts +0 -12
  127. package/dist/mcp-server/tools/obsidianDeleteNoteTool/index.js +0 -12
  128. package/dist/mcp-server/tools/obsidianDeleteNoteTool/logic.d.ts +0 -51
  129. package/dist/mcp-server/tools/obsidianDeleteNoteTool/logic.js +0 -168
  130. package/dist/mcp-server/tools/obsidianDeleteNoteTool/registration.d.ts +0 -19
  131. package/dist/mcp-server/tools/obsidianDeleteNoteTool/registration.js +0 -91
  132. package/dist/mcp-server/tools/obsidianGlobalSearchTool/index.d.ts +0 -12
  133. package/dist/mcp-server/tools/obsidianGlobalSearchTool/index.js +0 -12
  134. package/dist/mcp-server/tools/obsidianGlobalSearchTool/logic.d.ts +0 -77
  135. package/dist/mcp-server/tools/obsidianGlobalSearchTool/logic.js +0 -341
  136. package/dist/mcp-server/tools/obsidianGlobalSearchTool/registration.d.ts +0 -18
  137. package/dist/mcp-server/tools/obsidianGlobalSearchTool/registration.js +0 -69
  138. package/dist/mcp-server/tools/obsidianListNotesTool/index.d.ts +0 -12
  139. package/dist/mcp-server/tools/obsidianListNotesTool/index.js +0 -12
  140. package/dist/mcp-server/tools/obsidianListNotesTool/logic.d.ts +0 -68
  141. package/dist/mcp-server/tools/obsidianListNotesTool/logic.js +0 -215
  142. package/dist/mcp-server/tools/obsidianListNotesTool/registration.d.ts +0 -23
  143. package/dist/mcp-server/tools/obsidianListNotesTool/registration.js +0 -98
  144. package/dist/mcp-server/tools/obsidianManageFrontmatterTool/index.d.ts +0 -3
  145. package/dist/mcp-server/tools/obsidianManageFrontmatterTool/index.js +0 -2
  146. package/dist/mcp-server/tools/obsidianManageFrontmatterTool/logic.d.ts +0 -42
  147. package/dist/mcp-server/tools/obsidianManageFrontmatterTool/logic.js +0 -152
  148. package/dist/mcp-server/tools/obsidianManageFrontmatterTool/registration.d.ts +0 -3
  149. package/dist/mcp-server/tools/obsidianManageFrontmatterTool/registration.js +0 -52
  150. package/dist/mcp-server/tools/obsidianManageTagsTool/index.d.ts +0 -3
  151. package/dist/mcp-server/tools/obsidianManageTagsTool/index.js +0 -2
  152. package/dist/mcp-server/tools/obsidianManageTagsTool/logic.d.ts +0 -28
  153. package/dist/mcp-server/tools/obsidianManageTagsTool/logic.js +0 -161
  154. package/dist/mcp-server/tools/obsidianManageTagsTool/registration.d.ts +0 -3
  155. package/dist/mcp-server/tools/obsidianManageTagsTool/registration.js +0 -52
  156. package/dist/mcp-server/tools/obsidianReadNoteTool/index.d.ts +0 -12
  157. package/dist/mcp-server/tools/obsidianReadNoteTool/index.js +0 -12
  158. package/dist/mcp-server/tools/obsidianReadNoteTool/logic.d.ts +0 -87
  159. package/dist/mcp-server/tools/obsidianReadNoteTool/logic.js +0 -216
  160. package/dist/mcp-server/tools/obsidianReadNoteTool/registration.d.ts +0 -20
  161. package/dist/mcp-server/tools/obsidianReadNoteTool/registration.js +0 -101
  162. package/dist/mcp-server/tools/obsidianSearchReplaceTool/index.d.ts +0 -12
  163. package/dist/mcp-server/tools/obsidianSearchReplaceTool/index.js +0 -12
  164. package/dist/mcp-server/tools/obsidianSearchReplaceTool/logic.d.ts +0 -255
  165. package/dist/mcp-server/tools/obsidianSearchReplaceTool/logic.js +0 -583
  166. package/dist/mcp-server/tools/obsidianSearchReplaceTool/registration.d.ts +0 -22
  167. package/dist/mcp-server/tools/obsidianSearchReplaceTool/registration.js +0 -111
  168. package/dist/mcp-server/tools/obsidianUpdateNoteTool/index.d.ts +0 -12
  169. package/dist/mcp-server/tools/obsidianUpdateNoteTool/index.js +0 -12
  170. package/dist/mcp-server/tools/obsidianUpdateNoteTool/logic.d.ts +0 -183
  171. package/dist/mcp-server/tools/obsidianUpdateNoteTool/logic.js +0 -490
  172. package/dist/mcp-server/tools/obsidianUpdateNoteTool/registration.d.ts +0 -21
  173. package/dist/mcp-server/tools/obsidianUpdateNoteTool/registration.js +0 -108
  174. package/dist/mcp-server/transports/auth/core/authContext.d.ts +0 -33
  175. package/dist/mcp-server/transports/auth/core/authContext.js +0 -24
  176. package/dist/mcp-server/transports/auth/core/authTypes.d.ts +0 -17
  177. package/dist/mcp-server/transports/auth/core/authTypes.js +0 -5
  178. package/dist/mcp-server/transports/auth/core/authUtils.d.ts +0 -18
  179. package/dist/mcp-server/transports/auth/core/authUtils.js +0 -45
  180. package/dist/mcp-server/transports/auth/index.d.ts +0 -10
  181. package/dist/mcp-server/transports/auth/index.js +0 -9
  182. package/dist/mcp-server/transports/auth/strategies/jwt/jwtMiddleware.d.ts +0 -27
  183. package/dist/mcp-server/transports/auth/strategies/jwt/jwtMiddleware.js +0 -149
  184. package/dist/mcp-server/transports/auth/strategies/oauth/oauthMiddleware.d.ts +0 -20
  185. package/dist/mcp-server/transports/auth/strategies/oauth/oauthMiddleware.js +0 -124
  186. package/dist/mcp-server/transports/httpErrorHandler.d.ts +0 -26
  187. package/dist/mcp-server/transports/httpErrorHandler.js +0 -73
  188. package/dist/mcp-server/transports/httpTransport.d.ts +0 -21
  189. package/dist/mcp-server/transports/httpTransport.js +0 -208
  190. package/dist/mcp-server/transports/stdioTransport.d.ts +0 -42
  191. package/dist/mcp-server/transports/stdioTransport.js +0 -63
  192. package/dist/services/obsidianRestAPI/index.d.ts +0 -15
  193. package/dist/services/obsidianRestAPI/index.js +0 -17
  194. package/dist/services/obsidianRestAPI/methods/activeFileMethods.d.ts +0 -38
  195. package/dist/services/obsidianRestAPI/methods/activeFileMethods.js +0 -62
  196. package/dist/services/obsidianRestAPI/methods/commandMethods.d.ts +0 -22
  197. package/dist/services/obsidianRestAPI/methods/commandMethods.js +0 -31
  198. package/dist/services/obsidianRestAPI/methods/openMethods.d.ts +0 -16
  199. package/dist/services/obsidianRestAPI/methods/openMethods.js +0 -21
  200. package/dist/services/obsidianRestAPI/methods/patchMethods.d.ts +0 -37
  201. package/dist/services/obsidianRestAPI/methods/patchMethods.js +0 -94
  202. package/dist/services/obsidianRestAPI/methods/periodicNoteMethods.d.ts +0 -42
  203. package/dist/services/obsidianRestAPI/methods/periodicNoteMethods.js +0 -66
  204. package/dist/services/obsidianRestAPI/methods/searchMethods.d.ts +0 -25
  205. package/dist/services/obsidianRestAPI/methods/searchMethods.js +0 -36
  206. package/dist/services/obsidianRestAPI/methods/vaultMethods.d.ts +0 -58
  207. package/dist/services/obsidianRestAPI/methods/vaultMethods.js +0 -144
  208. package/dist/services/obsidianRestAPI/service.d.ts +0 -195
  209. package/dist/services/obsidianRestAPI/service.js +0 -379
  210. package/dist/services/obsidianRestAPI/types.d.ts +0 -127
  211. package/dist/services/obsidianRestAPI/types.js +0 -7
  212. package/dist/services/obsidianRestAPI/vaultCache/index.d.ts +0 -4
  213. package/dist/services/obsidianRestAPI/vaultCache/index.js +0 -4
  214. package/dist/services/obsidianRestAPI/vaultCache/service.d.ts +0 -88
  215. package/dist/services/obsidianRestAPI/vaultCache/service.js +0 -299
  216. package/dist/types-global/errors.d.ts +0 -73
  217. package/dist/types-global/errors.js +0 -71
  218. package/dist/utils/index.d.ts +0 -5
  219. package/dist/utils/index.js +0 -13
  220. package/dist/utils/internal/asyncUtils.d.ts +0 -54
  221. package/dist/utils/internal/asyncUtils.js +0 -101
  222. package/dist/utils/internal/errorHandler.d.ts +0 -176
  223. package/dist/utils/internal/errorHandler.js +0 -351
  224. package/dist/utils/internal/index.d.ts +0 -4
  225. package/dist/utils/internal/index.js +0 -4
  226. package/dist/utils/internal/logger.d.ts +0 -141
  227. package/dist/utils/internal/logger.js +0 -406
  228. package/dist/utils/internal/requestContext.d.ts +0 -83
  229. package/dist/utils/internal/requestContext.js +0 -72
  230. package/dist/utils/metrics/index.d.ts +0 -1
  231. package/dist/utils/metrics/index.js +0 -1
  232. package/dist/utils/metrics/tokenCounter.d.ts +0 -27
  233. package/dist/utils/metrics/tokenCounter.js +0 -128
  234. package/dist/utils/obsidian/index.d.ts +0 -5
  235. package/dist/utils/obsidian/index.js +0 -5
  236. package/dist/utils/obsidian/obsidianApiUtils.d.ts +0 -14
  237. package/dist/utils/obsidian/obsidianApiUtils.js +0 -29
  238. package/dist/utils/obsidian/obsidianStatUtils.d.ts +0 -68
  239. package/dist/utils/obsidian/obsidianStatUtils.js +0 -143
  240. package/dist/utils/parsing/dateParser.d.ts +0 -56
  241. package/dist/utils/parsing/dateParser.js +0 -104
  242. package/dist/utils/parsing/index.d.ts +0 -2
  243. package/dist/utils/parsing/index.js +0 -3
  244. package/dist/utils/parsing/jsonParser.d.ts +0 -80
  245. package/dist/utils/parsing/jsonParser.js +0 -133
  246. package/dist/utils/security/idGenerator.d.ts +0 -140
  247. package/dist/utils/security/idGenerator.js +0 -194
  248. package/dist/utils/security/index.d.ts +0 -3
  249. package/dist/utils/security/index.js +0 -3
  250. package/dist/utils/security/rateLimiter.d.ts +0 -156
  251. package/dist/utils/security/rateLimiter.js +0 -235
  252. package/dist/utils/security/sanitization.d.ts +0 -244
  253. package/dist/utils/security/sanitization.js +0 -599
@@ -0,0 +1 @@
1
+ {"version":3,"file":"frontmatter-ops.js","sourceRoot":"","sources":["../../../src/services/obsidian/frontmatter-ops.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,73 @@
1
+ /**
2
+ * @fileoverview Obsidian Local REST API service. Wraps every upstream HTTP
3
+ * endpoint we use, builds the right URL/headers/body for the consolidated
4
+ * `target` discriminator, and classifies errors for the framework.
5
+ * @module services/obsidian/obsidian-service
6
+ */
7
+ import type { Context } from '@cyanheads/mcp-ts-core';
8
+ import { type Dispatcher, type RequestInit, fetch as undiciFetch } from 'undici';
9
+ import { type ServerConfig } from '../../config/server-config.js';
10
+ import type { DocumentMap, FileListing, NoteJson, NoteTarget, ObsidianCommand, ObsidianTag, PatchHeaders, StructuredSearchHit, TextSearchHit, VaultStatus } from './types.js';
11
+ type UndiciResponse = Awaited<ReturnType<typeof undiciFetch>>;
12
+ /**
13
+ * The HTTP fetch contract this service depends on. Defaults to undici's
14
+ * `fetch`; tests inject a stub here instead of mocking the `undici` module
15
+ * (Bun's runtime treats `undici` as a builtin, so `vi.mock('undici')` has no
16
+ * effect under `bunx vitest`).
17
+ */
18
+ export type ObsidianFetch = (url: string, init: RequestInit & {
19
+ dispatcher?: Dispatcher;
20
+ signal?: AbortSignal;
21
+ }) => Promise<UndiciResponse>;
22
+ export declare class ObsidianService {
23
+ #private;
24
+ /**
25
+ * @param config - Validated server config (api key, base URL, TLS, timeouts).
26
+ * @param fetchImpl - Optional fetch override for tests. Defaults to undici's
27
+ * `fetch`, which honors the constructed TLS dispatcher in production.
28
+ */
29
+ constructor(config: ServerConfig, fetchImpl?: ObsidianFetch);
30
+ getStatus(ctx: Context): Promise<VaultStatus>;
31
+ /**
32
+ * Probe whether the configured `OBSIDIAN_API_KEY` is accepted. Hits the
33
+ * authenticated `/vault/` listing endpoint and reports `true` only on a 2xx
34
+ * response. Network/auth errors yield `false` — the resource caller wants a
35
+ * boolean, not an exception. Aborts are re-thrown so cancellation/timeout
36
+ * doesn't masquerade as an auth failure.
37
+ */
38
+ probeAuthenticated(ctx: Context): Promise<boolean>;
39
+ getNoteContent(ctx: Context, target: NoteTarget): Promise<string>;
40
+ getNoteJson(ctx: Context, target: NoteTarget): Promise<NoteJson>;
41
+ /**
42
+ * Resolve `target` to a vault-relative path. For path targets this is a
43
+ * no-op; for `active` and `periodic` targets we have to ask upstream which
44
+ * concrete file is currently in play.
45
+ */
46
+ resolvePath(ctx: Context, target: NoteTarget): Promise<string>;
47
+ getDocumentMap(ctx: Context, target: NoteTarget): Promise<DocumentMap>;
48
+ writeNote(ctx: Context, target: NoteTarget, content: string, contentType?: 'markdown' | 'json'): Promise<void>;
49
+ appendToNote(ctx: Context, target: NoteTarget, content: string, contentType?: 'markdown' | 'json'): Promise<void>;
50
+ patchNote(ctx: Context, target: NoteTarget, content: string, headers: PatchHeaders): Promise<void>;
51
+ deleteNote(ctx: Context, target: NoteTarget): Promise<void>;
52
+ listFiles(ctx: Context, dirPath?: string): Promise<FileListing>;
53
+ listTags(ctx: Context): Promise<ObsidianTag[]>;
54
+ listCommands(ctx: Context): Promise<ObsidianCommand[]>;
55
+ searchText(ctx: Context, query: string, contextLength?: number): Promise<TextSearchHit[]>;
56
+ searchDataview(ctx: Context, dql: string): Promise<StructuredSearchHit[]>;
57
+ searchJsonLogic(ctx: Context, logic: Record<string, unknown>): Promise<StructuredSearchHit[]>;
58
+ executeCommand(ctx: Context, commandId: string): Promise<void>;
59
+ openInUi(ctx: Context, path: string, opts?: {
60
+ newLeaf?: boolean;
61
+ }): Promise<void>;
62
+ }
63
+ /**
64
+ * Encode a vault-relative path for the URL. Each segment is URL-encoded so
65
+ * folder slashes are preserved while spaces and unicode are escaped.
66
+ */
67
+ export declare function encodeVaultPath(path: string): string;
68
+ export declare function initObsidianService(config?: ServerConfig, fetchImpl?: ObsidianFetch): void;
69
+ /** Test-only: directly install an instance (e.g., one backed by a stub fetch). */
70
+ export declare function setObsidianService(service: ObsidianService | undefined): void;
71
+ export declare function getObsidianService(): ObsidianService;
72
+ export {};
73
+ //# sourceMappingURL=obsidian-service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"obsidian-service.d.ts","sourceRoot":"","sources":["../../../src/services/obsidian/obsidian-service.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAC;AAStD,OAAO,EAAS,KAAK,UAAU,EAAE,KAAK,WAAW,EAAE,KAAK,IAAI,WAAW,EAAE,MAAM,QAAQ,CAAC;AACxF,OAAO,EAAmB,KAAK,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAC/E,OAAO,KAAK,EACV,WAAW,EACX,WAAW,EACX,QAAQ,EACR,UAAU,EACV,eAAe,EACf,WAAW,EACX,YAAY,EACZ,mBAAmB,EACnB,aAAa,EACb,WAAW,EACZ,MAAM,YAAY,CAAC;AAEpB,KAAK,cAAc,GAAG,OAAO,CAAC,UAAU,CAAC,OAAO,WAAW,CAAC,CAAC,CAAC;AAE9D;;;;;GAKG;AACH,MAAM,MAAM,aAAa,GAAG,CAC1B,GAAG,EAAE,MAAM,EACX,IAAI,EAAE,WAAW,GAAG;IAAE,UAAU,CAAC,EAAE,UAAU,CAAC;IAAC,MAAM,CAAC,EAAE,WAAW,CAAA;CAAE,KAClE,OAAO,CAAC,cAAc,CAAC,CAAC;AAsC7B,qBAAa,eAAe;;IAK1B;;;;OAIG;gBACS,MAAM,EAAE,YAAY,EAAE,SAAS,CAAC,EAAE,aAAa;IAuBrD,SAAS,CAAC,GAAG,EAAE,OAAO,GAAG,OAAO,CAAC,WAAW,CAAC;IAKnD;;;;;;OAMG;IACG,kBAAkB,CAAC,GAAG,EAAE,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;IAiBlD,cAAc,CAAC,GAAG,EAAE,OAAO,EAAE,MAAM,EAAE,UAAU,GAAG,OAAO,CAAC,MAAM,CAAC;IASjE,WAAW,CAAC,GAAG,EAAE,OAAO,EAAE,MAAM,EAAE,UAAU,GAAG,OAAO,CAAC,QAAQ,CAAC;IAStE;;;;OAIG;IACG,WAAW,CAAC,GAAG,EAAE,OAAO,EAAE,MAAM,EAAE,UAAU,GAAG,OAAO,CAAC,MAAM,CAAC;IAK9D,cAAc,CAAC,GAAG,EAAE,OAAO,EAAE,MAAM,EAAE,UAAU,GAAG,OAAO,CAAC,WAAW,CAAC;IAStE,SAAS,CACb,GAAG,EAAE,OAAO,EACZ,MAAM,EAAE,UAAU,EAClB,OAAO,EAAE,MAAM,EACf,WAAW,GAAE,UAAU,GAAG,MAAmB,GAC5C,OAAO,CAAC,IAAI,CAAC;IASV,YAAY,CAChB,GAAG,EAAE,OAAO,EACZ,MAAM,EAAE,UAAU,EAClB,OAAO,EAAE,MAAM,EACf,WAAW,GAAE,UAAU,GAAG,MAAmB,GAC5C,OAAO,CAAC,IAAI,CAAC;IASV,SAAS,CACb,GAAG,EAAE,OAAO,EACZ,MAAM,EAAE,UAAU,EAClB,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,YAAY,GACpB,OAAO,CAAC,IAAI,CAAC;IASV,UAAU,CAAC,GAAG,EAAE,OAAO,EAAE,MAAM,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;IAO3D,SAAS,CAAC,GAAG,EAAE,OAAO,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC;IAU/D,QAAQ,CAAC,GAAG,EAAE,OAAO,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;IAM9C,YAAY,CAAC,GAAG,EAAE,OAAO,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC;IAQtD,UAAU,CAAC,GAAG,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,aAAa,SAAM,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC;IAMtF,cAAc,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,mBAAmB,EAAE,CAAC;IASzE,eAAe,CACnB,GAAG,EAAE,OAAO,EACZ,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC7B,OAAO,CAAC,mBAAmB,EAAE,CAAC;IAW3B,cAAc,CAAC,GAAG,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAI9D,QAAQ,CAAC,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE;QAAE,OAAO,CAAC,EAAE,OAAO,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC;CAkLxF;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAMpD;AA6DD,wBAAgB,mBAAmB,CACjC,MAAM,GAAE,YAAgC,EACxC,SAAS,CAAC,EAAE,aAAa,GACxB,IAAI,CAEN;AAED,kFAAkF;AAClF,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,eAAe,GAAG,SAAS,GAAG,IAAI,CAE7E;AAED,wBAAgB,kBAAkB,IAAI,eAAe,CAKpD"}
@@ -0,0 +1,399 @@
1
+ /**
2
+ * @fileoverview Obsidian Local REST API service. Wraps every upstream HTTP
3
+ * endpoint we use, builds the right URL/headers/body for the consolidated
4
+ * `target` discriminator, and classifies errors for the framework.
5
+ * @module services/obsidian/obsidian-service
6
+ */
7
+ import { forbidden, notFound, serviceUnavailable, unauthorized, validationError, } from '@cyanheads/mcp-ts-core/errors';
8
+ import { withRetry } from '@cyanheads/mcp-ts-core/utils';
9
+ import { Agent, fetch as undiciFetch } from 'undici';
10
+ import { getServerConfig } from '../../config/server-config.js';
11
+ const NOTE_JSON_ACCEPT = 'application/vnd.olrapi.note+json';
12
+ const DOCUMENT_MAP_ACCEPT = 'application/vnd.olrapi.document-map+json';
13
+ const DATAVIEW_DQL_CT = 'application/vnd.olrapi.dataview.dql+txt';
14
+ const JSONLOGIC_CT = 'application/vnd.olrapi.jsonlogic+json';
15
+ export class ObsidianService {
16
+ #config;
17
+ #dispatcher;
18
+ #fetch;
19
+ /**
20
+ * @param config - Validated server config (api key, base URL, TLS, timeouts).
21
+ * @param fetchImpl - Optional fetch override for tests. Defaults to undici's
22
+ * `fetch`, which honors the constructed TLS dispatcher in production.
23
+ */
24
+ constructor(config, fetchImpl) {
25
+ this.#config = config;
26
+ /**
27
+ * Bun's runtime ignores undici's per-dispatcher `connect.rejectUnauthorized`
28
+ * option, so the only reliable opt-out under Bun is the process-wide
29
+ * `NODE_TLS_REJECT_UNAUTHORIZED=0` flag. Node honors the dispatcher option
30
+ * (set below), so the env var fallback is scoped to Bun to avoid mutating
31
+ * process-wide TLS behavior on Node. Default Obsidian Local REST API ships
32
+ * a self-signed cert, so most users run with `OBSIDIAN_VERIFY_SSL=false`.
33
+ */
34
+ if (!config.verifySsl && typeof globalThis.Bun !== 'undefined') {
35
+ process.env.NODE_TLS_REJECT_UNAUTHORIZED = '0';
36
+ }
37
+ this.#dispatcher = new Agent({
38
+ connect: { rejectUnauthorized: config.verifySsl },
39
+ headersTimeout: config.requestTimeoutMs,
40
+ bodyTimeout: config.requestTimeoutMs,
41
+ });
42
+ this.#fetch = fetchImpl ?? undiciFetch;
43
+ }
44
+ // ── Status ───────────────────────────────────────────────────────────────
45
+ async getStatus(ctx) {
46
+ const res = await this.#request(ctx, '/', { method: 'GET', skipAuth: true });
47
+ return (await res.json());
48
+ }
49
+ /**
50
+ * Probe whether the configured `OBSIDIAN_API_KEY` is accepted. Hits the
51
+ * authenticated `/vault/` listing endpoint and reports `true` only on a 2xx
52
+ * response. Network/auth errors yield `false` — the resource caller wants a
53
+ * boolean, not an exception. Aborts are re-thrown so cancellation/timeout
54
+ * doesn't masquerade as an auth failure.
55
+ */
56
+ async probeAuthenticated(ctx) {
57
+ try {
58
+ const res = await this.#fetch(`${this.#config.baseUrl}/vault/`, {
59
+ method: 'GET',
60
+ headers: { Authorization: `Bearer ${this.#config.apiKey}` },
61
+ dispatcher: this.#dispatcher,
62
+ signal: ctx.signal,
63
+ });
64
+ return res.ok;
65
+ }
66
+ catch (err) {
67
+ if (ctx.signal?.aborted)
68
+ throw err;
69
+ return false;
70
+ }
71
+ }
72
+ // ── Notes ────────────────────────────────────────────────────────────────
73
+ async getNoteContent(ctx, target) {
74
+ const url = this.#targetToPath(target);
75
+ const res = await this.#request(ctx, url, {
76
+ method: 'GET',
77
+ headers: { Accept: 'text/markdown' },
78
+ });
79
+ return await res.text();
80
+ }
81
+ async getNoteJson(ctx, target) {
82
+ const url = this.#targetToPath(target);
83
+ const res = await this.#request(ctx, url, {
84
+ method: 'GET',
85
+ headers: { Accept: NOTE_JSON_ACCEPT },
86
+ });
87
+ return (await res.json());
88
+ }
89
+ /**
90
+ * Resolve `target` to a vault-relative path. For path targets this is a
91
+ * no-op; for `active` and `periodic` targets we have to ask upstream which
92
+ * concrete file is currently in play.
93
+ */
94
+ async resolvePath(ctx, target) {
95
+ if (target.type === 'path')
96
+ return target.path;
97
+ return (await this.getNoteJson(ctx, target)).path;
98
+ }
99
+ async getDocumentMap(ctx, target) {
100
+ const url = this.#targetToPath(target);
101
+ const res = await this.#request(ctx, url, {
102
+ method: 'GET',
103
+ headers: { Accept: DOCUMENT_MAP_ACCEPT },
104
+ });
105
+ return (await res.json());
106
+ }
107
+ async writeNote(ctx, target, content, contentType = 'markdown') {
108
+ const url = this.#targetToPath(target);
109
+ await this.#request(ctx, url, {
110
+ method: 'PUT',
111
+ headers: { 'Content-Type': contentType === 'json' ? 'application/json' : 'text/markdown' },
112
+ body: content,
113
+ });
114
+ }
115
+ async appendToNote(ctx, target, content, contentType = 'markdown') {
116
+ const url = this.#targetToPath(target);
117
+ await this.#request(ctx, url, {
118
+ method: 'POST',
119
+ headers: { 'Content-Type': contentType === 'json' ? 'application/json' : 'text/markdown' },
120
+ body: content,
121
+ });
122
+ }
123
+ async patchNote(ctx, target, content, headers) {
124
+ const url = this.#targetToPath(target);
125
+ await this.#request(ctx, url, {
126
+ method: 'PATCH',
127
+ headers: this.#buildPatchHeaders(headers),
128
+ body: content,
129
+ });
130
+ }
131
+ async deleteNote(ctx, target) {
132
+ const url = this.#targetToPath(target);
133
+ await this.#request(ctx, url, { method: 'DELETE' });
134
+ }
135
+ // ── Listings ─────────────────────────────────────────────────────────────
136
+ async listFiles(ctx, dirPath) {
137
+ let url = '/vault/';
138
+ if (dirPath) {
139
+ const normalized = dirPath.replace(/^\/+|\/+$/g, '');
140
+ if (normalized)
141
+ url = `/vault/${encodeVaultPath(normalized)}/`;
142
+ }
143
+ const res = await this.#request(ctx, url, { method: 'GET' });
144
+ return (await res.json());
145
+ }
146
+ async listTags(ctx) {
147
+ const res = await this.#request(ctx, '/tags/', { method: 'GET' });
148
+ const body = (await res.json());
149
+ return body.tags ?? [];
150
+ }
151
+ async listCommands(ctx) {
152
+ const res = await this.#request(ctx, '/commands/', { method: 'GET' });
153
+ const body = (await res.json());
154
+ return body.commands ?? [];
155
+ }
156
+ // ── Search ───────────────────────────────────────────────────────────────
157
+ async searchText(ctx, query, contextLength = 100) {
158
+ const params = new URLSearchParams({ query, contextLength: String(contextLength) });
159
+ const res = await this.#request(ctx, `/search/simple/?${params}`, { method: 'POST' });
160
+ return (await res.json());
161
+ }
162
+ async searchDataview(ctx, dql) {
163
+ const res = await this.#request(ctx, '/search/', {
164
+ method: 'POST',
165
+ headers: { 'Content-Type': DATAVIEW_DQL_CT },
166
+ body: dql,
167
+ });
168
+ return (await res.json());
169
+ }
170
+ async searchJsonLogic(ctx, logic) {
171
+ const res = await this.#request(ctx, '/search/', {
172
+ method: 'POST',
173
+ headers: { 'Content-Type': JSONLOGIC_CT },
174
+ body: JSON.stringify(logic),
175
+ });
176
+ return (await res.json());
177
+ }
178
+ // ── UI / commands ────────────────────────────────────────────────────────
179
+ async executeCommand(ctx, commandId) {
180
+ await this.#request(ctx, `/commands/${encodeURIComponent(commandId)}/`, { method: 'POST' });
181
+ }
182
+ async openInUi(ctx, path, opts) {
183
+ const params = new URLSearchParams();
184
+ if (opts?.newLeaf)
185
+ params.set('newLeaf', 'true');
186
+ const qs = params.toString();
187
+ await this.#request(ctx, `/open/${encodeVaultPath(path)}${qs ? `?${qs}` : ''}`, {
188
+ method: 'POST',
189
+ });
190
+ }
191
+ // ── Internals ────────────────────────────────────────────────────────────
192
+ #targetToPath(target) {
193
+ switch (target.type) {
194
+ case 'path':
195
+ return `/vault/${encodeVaultPath(target.path)}`;
196
+ case 'active':
197
+ return '/active/';
198
+ case 'periodic': {
199
+ if (target.date) {
200
+ const m = /^(\d{4})-(\d{2})-(\d{2})$/.exec(target.date);
201
+ if (!m) {
202
+ throw validationError(`Invalid date '${target.date}', expected YYYY-MM-DD.`);
203
+ }
204
+ const [, y, mo, d] = m;
205
+ return `/periodic/${target.period}/${y}/${mo}/${d}/`;
206
+ }
207
+ return `/periodic/${target.period}/`;
208
+ }
209
+ }
210
+ }
211
+ #buildPatchHeaders(p) {
212
+ const headers = {
213
+ Operation: p.operation,
214
+ 'Target-Type': p.targetType,
215
+ Target: encodeURIComponent(p.target),
216
+ 'Content-Type': p.contentType === 'json' ? 'application/json' : 'text/markdown',
217
+ };
218
+ if (p.targetDelimiter)
219
+ headers['Target-Delimiter'] = p.targetDelimiter;
220
+ if (p.createTargetIfMissing)
221
+ headers['Create-Target-If-Missing'] = 'true';
222
+ if (p.applyIfContentPreexists)
223
+ headers['Apply-If-Content-Preexists'] = 'true';
224
+ if (p.trimTargetWhitespace)
225
+ headers['Trim-Target-Whitespace'] = 'true';
226
+ return headers;
227
+ }
228
+ #request(ctx, pathAndQuery, init) {
229
+ const url = `${this.#config.baseUrl}${pathAndQuery}`;
230
+ const headers = { ...(init.headers ?? {}) };
231
+ if (!init.skipAuth) {
232
+ headers.Authorization = `Bearer ${this.#config.apiKey}`;
233
+ }
234
+ return withRetry(async () => {
235
+ const res = await this.#fetch(url, {
236
+ method: init.method,
237
+ headers,
238
+ ...(init.body !== undefined ? { body: init.body } : {}),
239
+ dispatcher: this.#dispatcher,
240
+ signal: ctx.signal,
241
+ });
242
+ if (!res.ok) {
243
+ await this.#throwForStatus(res, pathAndQuery);
244
+ }
245
+ return res;
246
+ }, {
247
+ operation: `obsidian.${init.method} ${pathAndQuery}`,
248
+ context: {
249
+ requestId: ctx.requestId,
250
+ timestamp: ctx.timestamp,
251
+ ...(ctx.tenantId !== undefined ? { tenantId: ctx.tenantId } : {}),
252
+ ...(ctx.traceId !== undefined ? { traceId: ctx.traceId } : {}),
253
+ ...(ctx.spanId !== undefined ? { spanId: ctx.spanId } : {}),
254
+ },
255
+ baseDelayMs: 200,
256
+ maxRetries: 3,
257
+ signal: ctx.signal,
258
+ });
259
+ }
260
+ async #throwForStatus(res, path) {
261
+ const text = await this.#readBodySafe(res);
262
+ const body = parseJsonObject(text);
263
+ const display = displayPath(path);
264
+ const upstream = safeUpstream(body, text);
265
+ const data = (extra) => ({
266
+ path: display,
267
+ ...(extra ?? {}),
268
+ ...(upstream ? { upstream } : {}),
269
+ });
270
+ switch (res.status) {
271
+ case 401:
272
+ throw unauthorized('Obsidian Local REST API rejected the API key. Verify OBSIDIAN_API_KEY matches the value in Obsidian → Settings → Local REST API.', data());
273
+ case 403:
274
+ throw forbidden('Obsidian Local REST API forbids this request. Check the plugin permissions.', data());
275
+ case 404: {
276
+ if (path.startsWith('/active/')) {
277
+ throw notFound('No file is currently active in Obsidian — open a file in the app first.', data({ reason: 'no_active_file' }));
278
+ }
279
+ if (path.startsWith('/periodic/')) {
280
+ const periodMatch = /^\/periodic\/(daily|weekly|monthly|quarterly|yearly)\//.exec(path);
281
+ const period = periodMatch?.[1] ?? 'periodic';
282
+ const dateMatch = /\/(\d{4})\/(\d{2})\/(\d{2})\/?$/.exec(path);
283
+ const suffix = dateMatch ? ` for ${dateMatch[1]}-${dateMatch[2]}-${dateMatch[3]}` : '';
284
+ throw notFound(`No ${period} note found${suffix}. Check that the Periodic Notes plugin is enabled and the note exists.`, data({ reason: 'periodic_not_found' }));
285
+ }
286
+ if (path.startsWith('/commands/')) {
287
+ throw notFound(`Unknown Obsidian command: ${display}. Use \`obsidian_list_commands\` to discover valid command IDs.`, data({ reason: 'command_unknown' }));
288
+ }
289
+ throw notFound(`Not found: ${display}`, data({ reason: 'note_missing' }));
290
+ }
291
+ case 405:
292
+ throw validationError(`${display} cannot accept this method (often: the path is a directory, not a file).`, data({ reason: 'path_is_directory' }));
293
+ case 400: {
294
+ const upstreamMsg = body?.message ?? `Bad request to ${display}`;
295
+ // The Local REST API returns a "could not be applied to the target
296
+ // content" / "invalid-target" message when a PATCH names a section that
297
+ // doesn't exist. Translate to actionable guidance.
298
+ const isTargetMiss = /\bcould not be applied\b|\binvalid-target\b/i.test(upstreamMsg);
299
+ if (isTargetMiss) {
300
+ throw validationError(`Section target not found in ${display}. Use \`obsidian_get_note\` with \`format: "document-map"\` to list available headings, blocks, and frontmatter fields. Nested headings need \`Parent::Child\` syntax.`, data({ reason: 'section_target_missing' }));
301
+ }
302
+ throw validationError(upstreamMsg, data());
303
+ }
304
+ default:
305
+ if (res.status >= 500 && res.status < 600) {
306
+ throw serviceUnavailable(`Obsidian Local REST API returned ${res.status}: ${body?.message ?? 'upstream error'}`, data({ status: res.status }));
307
+ }
308
+ throw serviceUnavailable(`Unexpected status ${res.status} from Obsidian Local REST API`, data({ status: res.status }));
309
+ }
310
+ }
311
+ async #readBodySafe(res) {
312
+ try {
313
+ return await res.text();
314
+ }
315
+ catch {
316
+ return '';
317
+ }
318
+ }
319
+ }
320
+ /**
321
+ * Encode a vault-relative path for the URL. Each segment is URL-encoded so
322
+ * folder slashes are preserved while spaces and unicode are escaped.
323
+ */
324
+ export function encodeVaultPath(path) {
325
+ return path
326
+ .split('/')
327
+ .filter((seg) => seg.length > 0)
328
+ .map((seg) => encodeURIComponent(seg))
329
+ .join('/');
330
+ }
331
+ /**
332
+ * Convert an internal URL path (e.g. `/vault/Projects/My%20Note.md`) to the
333
+ * vault-relative form a caller would recognize. Used in error messages so the
334
+ * user sees the same path they sent in.
335
+ */
336
+ function displayPath(urlPath) {
337
+ if (urlPath.startsWith('/active/'))
338
+ return '(active file)';
339
+ const noQuery = urlPath.split('?')[0] ?? urlPath;
340
+ let decoded;
341
+ try {
342
+ decoded = decodeURIComponent(noQuery);
343
+ }
344
+ catch {
345
+ decoded = noQuery;
346
+ }
347
+ const periodic = /^\/periodic\/(daily|weekly|monthly|quarterly|yearly)\/(?:(\d{4})\/(\d{2})\/(\d{2})\/?)?$/.exec(decoded);
348
+ if (periodic) {
349
+ const [, period, y, mo, d] = periodic;
350
+ return y && mo && d
351
+ ? `${period} note for ${y}-${mo}-${d}`
352
+ : `${period} note for the current period`;
353
+ }
354
+ for (const prefix of ['/vault/', '/open/', '/commands/']) {
355
+ if (decoded.startsWith(prefix)) {
356
+ return decoded.slice(prefix.length).replace(/\/+$/, '') || decoded;
357
+ }
358
+ }
359
+ return decoded;
360
+ }
361
+ /**
362
+ * Trim the upstream error body down to a safe, user-presentable shape — drops
363
+ * `errorCode` and any other plugin-internal fields that would otherwise leak
364
+ * into JSON-RPC `error.data`.
365
+ */
366
+ function safeUpstream(body, text) {
367
+ if (body?.message)
368
+ return { message: body.message };
369
+ const trimmed = text.trim();
370
+ if (trimmed)
371
+ return { message: trimmed.length > 200 ? `${trimmed.slice(0, 200)}…` : trimmed };
372
+ return;
373
+ }
374
+ function parseJsonObject(text) {
375
+ if (!text)
376
+ return;
377
+ try {
378
+ const v = JSON.parse(text);
379
+ return v && typeof v === 'object' ? v : undefined;
380
+ }
381
+ catch {
382
+ return;
383
+ }
384
+ }
385
+ let _service;
386
+ export function initObsidianService(config = getServerConfig(), fetchImpl) {
387
+ _service = new ObsidianService(config, fetchImpl);
388
+ }
389
+ /** Test-only: directly install an instance (e.g., one backed by a stub fetch). */
390
+ export function setObsidianService(service) {
391
+ _service = service;
392
+ }
393
+ export function getObsidianService() {
394
+ if (!_service) {
395
+ throw new Error('ObsidianService not initialized — call initObsidianService() in setup().');
396
+ }
397
+ return _service;
398
+ }
399
+ //# sourceMappingURL=obsidian-service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"obsidian-service.js","sourceRoot":"","sources":["../../../src/services/obsidian/obsidian-service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * @fileoverview Client-side section extraction from a NoteJson body.
3
+ * The upstream Local REST API exposes section *targeting* for PATCH but not
4
+ * section-extracted GET, so we slice the markdown ourselves for `format: 'section'`.
5
+ * @module services/obsidian/section-extractor
6
+ */
7
+ import type { NoteJson, SectionTarget } from './types.js';
8
+ /**
9
+ * Extract a section's raw markdown (heading/block) or JSON value (frontmatter).
10
+ * Throws `NotFound` if the target does not exist in the note.
11
+ */
12
+ export declare function extractSection(note: NoteJson, section: SectionTarget): string | unknown;
13
+ //# sourceMappingURL=section-extractor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"section-extractor.d.ts","sourceRoot":"","sources":["../../../src/services/obsidian/section-extractor.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,KAAK,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAE1D;;;GAGG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,aAAa,GAAG,MAAM,GAAG,OAAO,CASvF"}