@jingyi0605/codingns 0.9.5 → 0.9.7

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 (206) hide show
  1. package/bin/codingns.mjs +75 -0
  2. package/dist/public/assets/{AdaptiveButlerPage-kkJDsnCO.js → AdaptiveButlerPage-DclGPzEx.js} +2 -2
  3. package/dist/public/assets/{App-DrNI9lWA.js → App-BxX5mm9o.js} +6 -6
  4. package/dist/public/assets/{BootstrapPage-QgVH5Mps.js → BootstrapPage-Bl21SsuW.js} +1 -1
  5. package/dist/public/assets/{ConversationPage-DVk8VfIj.js → ConversationPage-CmiVCV0q.js} +7 -7
  6. package/dist/public/assets/{DesktopDetachPreviewPage-BhfP0TpH.js → DesktopDetachPreviewPage-uaOHVsjV.js} +1 -1
  7. package/dist/public/assets/{DesktopModal-DRmDrv0S.js → DesktopModal-BxsogpLf.js} +1 -1
  8. package/dist/public/assets/{DesktopWindowPage-DNbJXnSs.js → DesktopWindowPage-Bubfw1nC.js} +1 -1
  9. package/dist/public/assets/{FileContextPanel---fLO4ve.js → FileContextPanel-DrYWcTkp.js} +1 -1
  10. package/dist/public/assets/{GitSidebar-sXUE0TqT.js → GitSidebar-CQsfJqun.js} +1 -1
  11. package/dist/public/assets/{MobileCreateSessionSheet-BftZ5pvb.js → MobileCreateSessionSheet-CqtmfVNo.js} +1 -1
  12. package/dist/public/assets/{MobileSheet-nw5SCa3N.js → MobileSheet-C5IVmUsO.js} +1 -1
  13. package/dist/public/assets/{MobileTopHeaderFrame-DH_D02Wy.js → MobileTopHeaderFrame-EoBm3-X0.js} +1 -1
  14. package/dist/public/assets/{MobileWorkspaceSwitcherHeader-2K406G5p.js → MobileWorkspaceSwitcherHeader-BC8MMQs_.js} +1 -1
  15. package/dist/public/assets/{PluginAccessOverview-BVJihw3D.js → PluginAccessOverview-CrQiQxxZ.js} +1 -1
  16. package/dist/public/assets/{PluginContainerPage-CR4vStvr.js → PluginContainerPage-_2u-9thM.js} +1 -1
  17. package/dist/public/assets/{PluginDetailPage-CrMX0Mnm.js → PluginDetailPage-F9cKjSCp.js} +1 -1
  18. package/dist/public/assets/{PluginsListPage-FtIL71Yg.js → PluginsListPage-BOhcua_4.js} +1 -1
  19. package/dist/public/assets/{RelayConnectEntryPage-Bt1apX53.js → RelayConnectEntryPage-Ck_uZLzj.js} +1 -1
  20. package/dist/public/assets/{ServerSettingsModal-D-guzPrI.js → ServerSettingsModal-ICd82a_x.js} +1 -1
  21. package/dist/public/assets/SessionIndexPage-Cox6P6dw.js +1 -0
  22. package/dist/public/assets/SettingsPage-BI5cM3j5.js +2 -0
  23. package/dist/public/assets/{TerminalManagerPanel-B5MKGPy-.js → TerminalManagerPanel-DiVhBQhf.js} +1 -1
  24. package/dist/public/assets/{TerminalPage-C2dTNGHK.js → TerminalPage-DUMUO7Ng.js} +1 -1
  25. package/dist/public/assets/{TerminalRuntimeFallbackModal-DAqOxFD8.js → TerminalRuntimeFallbackModal-DGPR_CMh.js} +1 -1
  26. package/dist/public/assets/{ToolFilesPage-IsNwyE6T.js → ToolFilesPage-m88CAp-r.js} +1 -1
  27. package/dist/public/assets/{ToolGitPage-BK1JBERN.js → ToolGitPage-DCYpfTsb.js} +1 -1
  28. package/dist/public/assets/{ToolProcessesPage-DwTYUQCK.js → ToolProcessesPage-Bk5ulsyq.js} +1 -1
  29. package/dist/public/assets/{ToolsHomePage-BLOy7lPg.js → ToolsHomePage-BrTwfjI7.js} +1 -1
  30. package/dist/public/assets/{WorkbenchLandingPage-CqZKR6EA.js → WorkbenchLandingPage-q4AAmdMV.js} +1 -1
  31. package/dist/public/assets/WorkbenchLayout-DD8b-m2G.js +1027 -0
  32. package/dist/public/assets/{WorkbenchModal-BM-OeW-b.js → WorkbenchModal-CsZeLArg.js} +1 -1
  33. package/dist/public/assets/WorkbenchShellRoute-BaiW_vfb.js +1 -0
  34. package/dist/public/assets/WorkbenchShellRoute-CxKYZ6uF.css +1 -0
  35. package/dist/public/assets/{WorkspaceDebugDetailPage-BMsEN5iG.js → WorkspaceDebugDetailPage-BcUUDEyw.js} +1 -1
  36. package/dist/public/assets/WorkspaceDetailPage-zEZ1VARA.js +1 -0
  37. package/dist/public/assets/{WorkspaceHomePage-DQiXKgiP.js → WorkspaceHomePage-CR0rqS4e.js} +1 -1
  38. package/dist/public/assets/{client-runtime-manager-CgPJq21V.js → client-runtime-manager-BgGugw8T.js} +1 -1
  39. package/dist/public/assets/index-CFyk1rgJ.js +50 -0
  40. package/dist/public/assets/index-CrU73EIV.css +1 -0
  41. package/dist/public/assets/{login-direct-candidate-resolver-CGaxAXV8.js → login-direct-candidate-resolver-ty2uOY5y.js} +1 -1
  42. package/dist/public/assets/{plugin-permission-copy-BR9gWy8b.js → plugin-permission-copy-iK3faI3n.js} +1 -1
  43. package/dist/public/assets/{plugins-api-CdCsrG2e.js → plugins-api-CmV7aDGA.js} +1 -1
  44. package/dist/public/assets/{preferences-service-lOhnlxzP.js → preferences-service-BoSmT_ny.js} +1 -1
  45. package/dist/public/assets/{relay-entry-CQpxTS8y.js → relay-entry-C8k5qsl5.js} +1 -1
  46. package/dist/public/assets/styles-BhKoKfQ_.css +1 -0
  47. package/dist/public/assets/{terminal-runtime-meta-oteTx66X.js → terminal-runtime-meta-okQIDzfA.js} +1 -1
  48. package/dist/public/assets/{useRegisteredDebugTemplates-Bu2ykZ6s.js → useRegisteredDebugTemplates-B_vXUtSe.js} +1 -1
  49. package/dist/public/assets/{workbench-navigation-DlgXuFW2.js → workbench-navigation-DoDaQR4z.js} +1 -1
  50. package/dist/public/index.html +2 -2
  51. package/dist/server/modules/affairs-indexer/core/src/repositories/catalog-repository.d.ts +1 -0
  52. package/dist/server/modules/affairs-indexer/core/src/repositories/catalog-repository.js +31 -0
  53. package/dist/server/modules/affairs-indexer/core/src/repositories/catalog-repository.js.map +1 -1
  54. package/dist/server/modules/affairs-indexer/core/src/services/dirty/dirty-scope-resolver.d.ts +1 -0
  55. package/dist/server/modules/affairs-indexer/core/src/services/dirty/dirty-scope-resolver.js +1 -0
  56. package/dist/server/modules/affairs-indexer/core/src/services/dirty/dirty-scope-resolver.js.map +1 -1
  57. package/dist/server/modules/affairs-indexer/core/src/services/export/export-builder.js +4 -1
  58. package/dist/server/modules/affairs-indexer/core/src/services/export/export-builder.js.map +1 -1
  59. package/dist/server/modules/affairs-indexer/core/src/services/search/search-index-builder.js +140 -16
  60. package/dist/server/modules/affairs-indexer/core/src/services/search/search-index-builder.js.map +1 -1
  61. package/dist/server/modules/assistant-capability/assistant-capability-controller.d.ts +1 -1
  62. package/dist/server/modules/assistant-capability/assistant-capability-controller.js +8 -7
  63. package/dist/server/modules/assistant-capability/assistant-capability-controller.js.map +1 -1
  64. package/dist/server/modules/assistant-capability/assistant-capability-service.d.ts +14 -13
  65. package/dist/server/modules/assistant-capability/assistant-capability-service.js +27 -24
  66. package/dist/server/modules/assistant-capability/assistant-capability-service.js.map +1 -1
  67. package/dist/server/modules/auth/auth-controller.d.ts +27 -1
  68. package/dist/server/modules/auth/auth-controller.js +20 -0
  69. package/dist/server/modules/auth/auth-controller.js.map +1 -1
  70. package/dist/server/modules/auth/auth-service.d.ts +32 -1
  71. package/dist/server/modules/auth/auth-service.js +217 -2
  72. package/dist/server/modules/auth/auth-service.js.map +1 -1
  73. package/dist/server/modules/bootstrap/bootstrap-service.js +1 -0
  74. package/dist/server/modules/bootstrap/bootstrap-service.js.map +1 -1
  75. package/dist/server/modules/butler/assistant-automation-service.d.ts +1 -1
  76. package/dist/server/modules/butler/assistant-automation-service.js +9 -10
  77. package/dist/server/modules/butler/assistant-automation-service.js.map +1 -1
  78. package/dist/server/modules/butler/butler-action-context-service.js +2 -2
  79. package/dist/server/modules/butler/butler-action-context-service.js.map +1 -1
  80. package/dist/server/modules/butler/butler-control-action-service.d.ts +5 -5
  81. package/dist/server/modules/butler/butler-control-action-service.js +19 -19
  82. package/dist/server/modules/butler/butler-control-action-service.js.map +1 -1
  83. package/dist/server/modules/butler/butler-control-session-service.d.ts +1 -1
  84. package/dist/server/modules/butler/butler-control-session-service.js +27 -26
  85. package/dist/server/modules/butler/butler-control-session-service.js.map +1 -1
  86. package/dist/server/modules/butler/butler-control-timer-service.js +4 -5
  87. package/dist/server/modules/butler/butler-control-timer-service.js.map +1 -1
  88. package/dist/server/modules/butler/butler-controller.d.ts +2 -2
  89. package/dist/server/modules/butler/butler-controller.js +19 -17
  90. package/dist/server/modules/butler/butler-controller.js.map +1 -1
  91. package/dist/server/modules/butler/butler-profile-service.d.ts +5 -5
  92. package/dist/server/modules/butler/butler-profile-service.js +17 -16
  93. package/dist/server/modules/butler/butler-profile-service.js.map +1 -1
  94. package/dist/server/modules/butler/butler-project-service.d.ts +7 -6
  95. package/dist/server/modules/butler/butler-project-service.js +35 -21
  96. package/dist/server/modules/butler/butler-project-service.js.map +1 -1
  97. package/dist/server/modules/butler/butler-session-service.d.ts +2 -2
  98. package/dist/server/modules/butler/butler-session-service.js +33 -27
  99. package/dist/server/modules/butler/butler-session-service.js.map +1 -1
  100. package/dist/server/modules/butler/butler-session-summary-service.d.ts +2 -2
  101. package/dist/server/modules/butler/butler-session-summary-service.js +23 -9
  102. package/dist/server/modules/butler/butler-session-summary-service.js.map +1 -1
  103. package/dist/server/modules/butler/context-aggregator.js +9 -9
  104. package/dist/server/modules/butler/context-aggregator.js.map +1 -1
  105. package/dist/server/modules/butler/patrol-execution-service.d.ts +0 -1
  106. package/dist/server/modules/butler/patrol-execution-service.js +6 -12
  107. package/dist/server/modules/butler/patrol-execution-service.js.map +1 -1
  108. package/dist/server/modules/provider/provider-discovery-runtime.js +16 -1
  109. package/dist/server/modules/provider/provider-discovery-runtime.js.map +1 -1
  110. package/dist/server/modules/sessions/codex-app-server-helper-client.js +14 -0
  111. package/dist/server/modules/sessions/codex-app-server-helper-client.js.map +1 -1
  112. package/dist/server/modules/sessions/codex-app-server-helper-process.js +59 -0
  113. package/dist/server/modules/sessions/codex-app-server-helper-process.js.map +1 -1
  114. package/dist/server/modules/sessions/codex-session-title-generator.d.ts +19 -0
  115. package/dist/server/modules/sessions/codex-session-title-generator.js +295 -0
  116. package/dist/server/modules/sessions/codex-session-title-generator.js.map +1 -0
  117. package/dist/server/modules/sessions/session-controller.js +3 -3
  118. package/dist/server/modules/sessions/session-controller.js.map +1 -1
  119. package/dist/server/modules/sessions/session-history-service.d.ts +13 -3
  120. package/dist/server/modules/sessions/session-history-service.js +309 -11
  121. package/dist/server/modules/sessions/session-history-service.js.map +1 -1
  122. package/dist/server/modules/sessions/session-live-runtime-service.js +25 -15
  123. package/dist/server/modules/sessions/session-live-runtime-service.js.map +1 -1
  124. package/dist/server/modules/sessions/session-permission-request-service.js +28 -15
  125. package/dist/server/modules/sessions/session-permission-request-service.js.map +1 -1
  126. package/dist/server/modules/tasks/task-types.d.ts +1 -0
  127. package/dist/server/modules/tasks/task-types.js +1 -0
  128. package/dist/server/modules/tasks/task-types.js.map +1 -1
  129. package/dist/server/modules/workbench/workbench-service.js +9 -9
  130. package/dist/server/modules/workbench/workbench-service.js.map +1 -1
  131. package/dist/server/modules/workspace/affairs-library-service.d.ts +3 -1
  132. package/dist/server/modules/workspace/affairs-library-service.js +112 -54
  133. package/dist/server/modules/workspace/affairs-library-service.js.map +1 -1
  134. package/dist/server/modules/workspace/affairs-lightweight-session-service.js +13 -9
  135. package/dist/server/modules/workspace/affairs-lightweight-session-service.js.map +1 -1
  136. package/dist/server/modules/workspace/affairs-tag-service.d.ts +12 -0
  137. package/dist/server/modules/workspace/affairs-tag-service.js +527 -2
  138. package/dist/server/modules/workspace/affairs-tag-service.js.map +1 -1
  139. package/dist/server/modules/workspace/workspace-controller.d.ts +1 -1
  140. package/dist/server/modules/workspace/workspace-controller.js +7 -7
  141. package/dist/server/modules/workspace/workspace-controller.js.map +1 -1
  142. package/dist/server/modules/workspace/workspace-service.d.ts +7 -0
  143. package/dist/server/modules/workspace/workspace-service.js +151 -10
  144. package/dist/server/modules/workspace/workspace-service.js.map +1 -1
  145. package/dist/server/routes/auth.js +6 -0
  146. package/dist/server/routes/auth.js.map +1 -1
  147. package/dist/server/server/create-server.d.ts +4 -0
  148. package/dist/server/server/create-server.js +26 -0
  149. package/dist/server/server/create-server.js.map +1 -1
  150. package/dist/server/server/start-host.js +20 -0
  151. package/dist/server/server/start-host.js.map +1 -1
  152. package/dist/server/shared/http/request-diagnostics.d.ts +56 -0
  153. package/dist/server/shared/http/request-diagnostics.js +256 -0
  154. package/dist/server/shared/http/request-diagnostics.js.map +1 -0
  155. package/dist/server/storage/repositories/auth-token-repository.d.ts +1 -0
  156. package/dist/server/storage/repositories/auth-token-repository.js +8 -0
  157. package/dist/server/storage/repositories/auth-token-repository.js.map +1 -1
  158. package/dist/server/storage/repositories/auth-user-repository.d.ts +50 -0
  159. package/dist/server/storage/repositories/auth-user-repository.js +198 -27
  160. package/dist/server/storage/repositories/auth-user-repository.js.map +1 -1
  161. package/dist/server/storage/repositories/butler-control-session-repository.d.ts +4 -1
  162. package/dist/server/storage/repositories/butler-control-session-repository.js +55 -8
  163. package/dist/server/storage/repositories/butler-control-session-repository.js.map +1 -1
  164. package/dist/server/storage/repositories/butler-profile-repository.d.ts +2 -1
  165. package/dist/server/storage/repositories/butler-profile-repository.js +35 -6
  166. package/dist/server/storage/repositories/butler-profile-repository.js.map +1 -1
  167. package/dist/server/storage/repositories/butler-project-repository.d.ts +2 -0
  168. package/dist/server/storage/repositories/butler-project-repository.js +38 -4
  169. package/dist/server/storage/repositories/butler-project-repository.js.map +1 -1
  170. package/dist/server/storage/repositories/butler-session-repository.d.ts +2 -1
  171. package/dist/server/storage/repositories/butler-session-repository.js +35 -6
  172. package/dist/server/storage/repositories/butler-session-repository.js.map +1 -1
  173. package/dist/server/storage/repositories/session-binding-repository.d.ts +3 -0
  174. package/dist/server/storage/repositories/session-binding-repository.js +70 -2
  175. package/dist/server/storage/repositories/session-binding-repository.js.map +1 -1
  176. package/dist/server/storage/repositories/session-index-repository.js +7 -5
  177. package/dist/server/storage/repositories/session-index-repository.js.map +1 -1
  178. package/dist/server/storage/repositories/workspace-repository.d.ts +3 -1
  179. package/dist/server/storage/repositories/workspace-repository.js +24 -10
  180. package/dist/server/storage/repositories/workspace-repository.js.map +1 -1
  181. package/dist/server/storage/sqlite/client.js +288 -0
  182. package/dist/server/storage/sqlite/client.js.map +1 -1
  183. package/dist/server/storage/sqlite/schema.sql +33 -9
  184. package/dist/server/types/domain.d.ts +8 -1
  185. package/node_modules/@codingns/session-sync-core/dist/providers/claude-session-store.js +34 -7
  186. package/node_modules/@codingns/session-sync-core/dist/providers/claude-session-store.js.map +1 -1
  187. package/node_modules/@codingns/session-sync-core/dist/providers/codex.d.ts +7 -0
  188. package/node_modules/@codingns/session-sync-core/dist/providers/codex.js +596 -6
  189. package/node_modules/@codingns/session-sync-core/dist/providers/codex.js.map +1 -1
  190. package/node_modules/@codingns/session-sync-core/dist/runtime/claude-runtime.js +3 -7
  191. package/node_modules/@codingns/session-sync-core/dist/runtime/claude-runtime.js.map +1 -1
  192. package/node_modules/@codingns/session-sync-core/dist/runtime/codex-runtime.d.ts +1 -0
  193. package/node_modules/@codingns/session-sync-core/dist/runtime/codex-runtime.js +249 -6
  194. package/node_modules/@codingns/session-sync-core/dist/runtime/codex-runtime.js.map +1 -1
  195. package/node_modules/@codingns/session-sync-core/dist/types.d.ts +11 -0
  196. package/package.json +1 -1
  197. package/dist/public/assets/SessionIndexPage-CX2FppcJ.js +0 -1
  198. package/dist/public/assets/SettingsPage-BI2Olcvr.js +0 -2
  199. package/dist/public/assets/WorkbenchLayout-CJHQtwuL.js +0 -1022
  200. package/dist/public/assets/WorkbenchShellRoute-2bKI6Q9k.js +0 -1
  201. package/dist/public/assets/WorkbenchShellRoute-BjuZD101.css +0 -1
  202. package/dist/public/assets/WorkspaceDetailPage-5H9Gosx2.js +0 -1
  203. package/dist/public/assets/index-BARqMVSw.css +0 -1
  204. package/dist/public/assets/index-BUoNjVrY.js +0 -50
  205. package/dist/public/assets/styles-DkbkRgWw.css +0 -1
  206. /package/dist/public/assets/{styles-JKFlsYFv.js → styles-DwSuZo1w.js} +0 -0
@@ -400,11 +400,13 @@ export class AffairsLibraryService {
400
400
  return false;
401
401
  }
402
402
  if (browseMode === "tag") {
403
- const tagPaths = selectedFavorite?.kind === "tag"
404
- ? [selectedFavorite.path]
405
- : normalizedSelectedTagPaths.length > 0
406
- ? normalizedSelectedTagPaths
407
- : (input.selectedTagPath?.trim() ? [input.selectedTagPath.trim()] : []);
403
+ const tagPaths = selectedFavorite?.kind === "tag_filter"
404
+ ? normalizeSelectedTagPaths(selectedFavorite.tagPaths ?? selectedFavorite.path.split("|"))
405
+ : selectedFavorite?.kind === "tag"
406
+ ? [selectedFavorite.path]
407
+ : normalizedSelectedTagPaths.length > 0
408
+ ? normalizedSelectedTagPaths
409
+ : (input.selectedTagPath?.trim() ? [input.selectedTagPath.trim()] : []);
408
410
  return tagPaths.length === 0 || tagPaths.every((tagPath) => matchesTagPath(document, tagPath));
409
411
  }
410
412
  const folderPath = selectedFavorite?.kind === "folder"
@@ -902,13 +904,18 @@ export class AffairsLibraryService {
902
904
  };
903
905
  }
904
906
  if (opType === "delete") {
907
+ const refreshTargetPath = source.stats?.isDirectory()
908
+ ? source.relativePath
909
+ : getParentFolderPath(source.relativePath);
910
+ const deletedPath = source.relativePath;
905
911
  if (source.stats?.isDirectory()) {
906
912
  fs.rmSync(source.absolutePath, { recursive: true, force: false });
907
913
  }
908
914
  else {
909
915
  fs.rmSync(source.absolutePath, { force: false });
910
916
  }
911
- this.afterFileMutation(workspaceId, source.rootDir, `library_delete:${source.relativePath}`, source.relativePath);
917
+ this.removePathFromHotDirectoryCache(workspaceId, source.rootDir, deletedPath);
918
+ this.afterFileMutation(workspaceId, source.rootDir, `library_delete:${source.relativePath}`, source.relativePath, { refreshTargetPath });
912
919
  return {
913
920
  success: true,
914
921
  opType,
@@ -1044,9 +1051,9 @@ export class AffairsLibraryService {
1044
1051
  });
1045
1052
  }
1046
1053
  }
1047
- afterFileMutation(workspaceId, rootDir, reason, targetPath) {
1054
+ afterFileMutation(workspaceId, rootDir, reason, targetPath, options = {}) {
1048
1055
  this.invalidateExportCache(rootDir);
1049
- this.scheduleAutoRefresh(workspaceId, reason, normalizeMutationRefreshTarget(targetPath) ?? undefined);
1056
+ this.scheduleAutoRefresh(workspaceId, reason, normalizeMutationRefreshTarget(options.refreshTargetPath ?? targetPath) ?? undefined);
1050
1057
  }
1051
1058
  requestRefresh(workspaceId, userId, reason) {
1052
1059
  const binding = this.requireBinding(workspaceId, userId);
@@ -1156,7 +1163,9 @@ export class AffairsLibraryService {
1156
1163
  if (relativePath === ".ai-index" || relativePath.startsWith(".ai-index/")) {
1157
1164
  return;
1158
1165
  }
1159
- const targetPath = normalizeMutationRefreshTarget(relativePath);
1166
+ const targetPath = normalizeMutationRefreshTarget(input.kind === "delete"
1167
+ ? getParentFolderPath(relativePath)
1168
+ : relativePath);
1160
1169
  if (!targetPath) {
1161
1170
  return;
1162
1171
  }
@@ -1707,6 +1716,38 @@ export class AffairsLibraryService {
1707
1716
  entry.staleReason = null;
1708
1717
  this.ensureDirectoryWindow(workspaceId, rootDir, directoryPath);
1709
1718
  }
1719
+ removePathFromHotDirectoryCache(workspaceId, rootDir, targetPath) {
1720
+ const normalizedTargetPath = normalizeMutationRefreshTarget(targetPath);
1721
+ if (!normalizedTargetPath) {
1722
+ return;
1723
+ }
1724
+ const deletedDirectoryPath = normalizeFolderPath(normalizedTargetPath);
1725
+ const parentDirectoryPath = normalizeFolderPath(getParentFolderPath(normalizedTargetPath));
1726
+ for (const entry of this.hotDirectoryCache.values()) {
1727
+ if (entry.workspaceId !== workspaceId || entry.rootDir !== rootDir) {
1728
+ continue;
1729
+ }
1730
+ const normalizedEntryDirectoryPath = normalizeFolderPath(entry.directoryPath);
1731
+ const beforeCount = entry.items.length;
1732
+ entry.items = entry.items.filter((item) => {
1733
+ const itemPath = normalizeMutationRefreshTarget(item.path);
1734
+ if (!itemPath) {
1735
+ return false;
1736
+ }
1737
+ return itemPath !== normalizedTargetPath && !itemPath.startsWith(`${normalizedTargetPath}/`);
1738
+ });
1739
+ if (beforeCount !== entry.items.length
1740
+ || normalizedEntryDirectoryPath === parentDirectoryPath
1741
+ || normalizedEntryDirectoryPath === deletedDirectoryPath
1742
+ || normalizedEntryDirectoryPath.startsWith(`${deletedDirectoryPath}/`)) {
1743
+ entry.dirty = true;
1744
+ entry.status = entry.status === "running" ? "running" : "idle";
1745
+ entry.pendingHintReasons.add(`library_delete:${normalizedTargetPath}`);
1746
+ entry.lastHintAt = nowIso();
1747
+ entry.staleReason = null;
1748
+ }
1749
+ }
1750
+ }
1710
1751
  ensureDirectoryWindow(workspaceId, rootDir, directoryPath) {
1711
1752
  const entry = this.getOrCreateHotDirectoryEntry(workspaceId, rootDir, directoryPath);
1712
1753
  entry.updatedAtMs = Math.max(entry.updatedAtMs, Date.now());
@@ -1877,11 +1918,14 @@ export class AffairsLibraryService {
1877
1918
  }
1878
1919
  return parsed
1879
1920
  .filter((item) => Boolean(item) && typeof item === "object")
1880
- .filter((item) => (item.kind === "folder" || item.kind === "tag") && typeof item.path === "string" && item.path.trim())
1921
+ .filter((item) => isAffairsLibraryFavoriteKind(item.kind) && typeof item.path === "string" && item.path.trim())
1881
1922
  .map((item) => ({
1882
1923
  kind: item.kind,
1883
1924
  path: item.path.trim(),
1884
- label: typeof item.label === "string" && item.label.trim() ? item.label.trim() : item.path.trim()
1925
+ label: typeof item.label === "string" && item.label.trim() ? item.label.trim() : item.path.trim(),
1926
+ ...(item.kind === "tag_filter"
1927
+ ? { tagPaths: normalizeSelectedTagPaths(Array.isArray(item.tagPaths) ? item.tagPaths : item.path.split("|")) }
1928
+ : {})
1885
1929
  }));
1886
1930
  }
1887
1931
  catch {
@@ -2969,11 +3013,14 @@ export class AffairsLibraryService {
2969
3013
  }
2970
3014
  normalizeFavorites(favorites) {
2971
3015
  return favorites
2972
- .filter((item) => item && (item.kind === "folder" || item.kind === "tag") && item.path.trim())
3016
+ .filter((item) => item && isAffairsLibraryFavoriteKind(item.kind) && item.path.trim())
2973
3017
  .map((item) => ({
2974
3018
  kind: item.kind,
2975
3019
  path: item.path.trim(),
2976
- label: item.label.trim() || item.path.trim()
3020
+ label: item.label.trim() || item.path.trim(),
3021
+ ...(item.kind === "tag_filter"
3022
+ ? { tagPaths: normalizeSelectedTagPaths(item.tagPaths ?? item.path.split("|")) }
3023
+ : {})
2977
3024
  }));
2978
3025
  }
2979
3026
  resolvePreferredWorkspaceId(preferredWorkspaceId) {
@@ -3198,7 +3245,7 @@ function resolveAffairsLibraryRelativePath(rootDir, absolutePath) {
3198
3245
  return relativePath;
3199
3246
  }
3200
3247
  function normalizeMutationRefreshTarget(relativePath) {
3201
- const normalizedPath = relativePath.trim().replace(/^\.\/+/, "").replace(/\/+$/, "");
3248
+ const normalizedPath = relativePath?.trim().replace(/^\.\/+/, "").replace(/\/+$/, "") ?? "";
3202
3249
  return normalizedPath || null;
3203
3250
  }
3204
3251
  function normalizeHintTargetPath(targetPath) {
@@ -3314,11 +3361,18 @@ function matchesFavorite(favorite, documentPath, directTags, derivedTags) {
3314
3361
  const normalizedPath = favorite.path === "." ? "" : favorite.path.replace(/\/+$/g, "");
3315
3362
  return !normalizedPath || documentPath === normalizedPath || documentPath.startsWith(`${normalizedPath}/`);
3316
3363
  }
3364
+ if (favorite.kind === "tag_filter") {
3365
+ const tagPaths = normalizeSelectedTagPaths(favorite.tagPaths ?? favorite.path.split("|"));
3366
+ return tagPaths.length > 0 && tagPaths.every((tagPath) => ([...directTags, ...derivedTags].some((tag) => tag === tagPath || tag.startsWith(`${tagPath}/`))));
3367
+ }
3317
3368
  return [...directTags, ...derivedTags].some((tag) => tag === favorite.path || tag.startsWith(`${favorite.path}/`));
3318
3369
  }
3319
3370
  function buildFavoriteNodeId(kind, pathValue) {
3320
3371
  return `library:favorite:${kind}:${pathValue}`;
3321
3372
  }
3373
+ function isAffairsLibraryFavoriteKind(kind) {
3374
+ return kind === "folder" || kind === "tag" || kind === "tag_filter";
3375
+ }
3322
3376
  function matchesTagPath(document, tagPath) {
3323
3377
  const normalizedTagPath = tagPath.trim();
3324
3378
  if (!normalizedTagPath) {
@@ -3477,6 +3531,16 @@ function buildAffairsFolderDocumentsFromFilesystem(rootDir, normalizedFolderPath
3477
3531
  const documentMap = new Map();
3478
3532
  let hasSnapshotData = false;
3479
3533
  let hasLiveData = false;
3534
+ let targetStats = null;
3535
+ if (fs.existsSync(targetDir)) {
3536
+ try {
3537
+ targetStats = fs.statSync(targetDir);
3538
+ }
3539
+ catch {
3540
+ targetStats = null;
3541
+ }
3542
+ }
3543
+ const canVerifyLiveFiles = targetStats?.isDirectory() === true;
3480
3544
  for (const document of exportData?.documents ?? []) {
3481
3545
  if (!matchesDirectFolder(document.path, normalizedFolderPath)) {
3482
3546
  continue;
@@ -3489,6 +3553,9 @@ function buildAffairsFolderDocumentsFromFilesystem(rootDir, normalizedFolderPath
3489
3553
  continue;
3490
3554
  }
3491
3555
  const stat = readAffairsLibraryStatsSafe(rootDir, document.path);
3556
+ if (canVerifyLiveFiles && !stat?.isFile()) {
3557
+ continue;
3558
+ }
3492
3559
  documentMap.set(document.path, {
3493
3560
  ...document,
3494
3561
  createdAt: document.createdAt ?? toIsoOrNull(stat?.birthtime),
@@ -3498,47 +3565,38 @@ function buildAffairsFolderDocumentsFromFilesystem(rootDir, normalizedFolderPath
3498
3565
  });
3499
3566
  hasSnapshotData = true;
3500
3567
  }
3501
- if (fs.existsSync(targetDir)) {
3502
- let targetStats = null;
3503
- try {
3504
- targetStats = fs.statSync(targetDir);
3505
- }
3506
- catch {
3507
- targetStats = null;
3508
- }
3509
- if (targetStats?.isDirectory()) {
3510
- for (const entry of fs.readdirSync(targetDir, { withFileTypes: true })) {
3511
- const relativePath = normalizedFolderPath ? `${normalizedFolderPath}/${entry.name}` : entry.name;
3512
- if ((entry.name.startsWith(".") || hasHiddenPathSegment(relativePath))
3513
- && !isIncludedHiddenPath(relativePath, config.includedHiddenPaths)) {
3514
- continue;
3515
- }
3516
- if (!entry.isFile()) {
3517
- continue;
3518
- }
3519
- const extension = path.extname(entry.name).toLowerCase();
3520
- if (!supportedExtensions.has(extension)) {
3521
- continue;
3522
- }
3523
- if (configuredExtensions.size > 0 && !configuredExtensions.has(extension)) {
3524
- continue;
3525
- }
3526
- const stat = readAffairsLibraryStatsSafe(rootDir, relativePath);
3527
- const exported = documentMap.get(relativePath);
3528
- documentMap.set(relativePath, {
3529
- documentId: exported?.documentId ?? relativePath,
3530
- path: relativePath,
3531
- title: exported?.title?.trim() || path.basename(entry.name, extension) || entry.name,
3532
- summary: exported?.summary ?? "",
3533
- updatedAt: stat?.mtime.toISOString() ?? exported?.updatedAt ?? "",
3534
- createdAt: toIsoOrNull(stat?.birthtime) ?? exported?.createdAt ?? null,
3535
- sizeBytes: stat?.size ?? exported?.sizeBytes ?? null,
3536
- tags: exported?.tags ?? [],
3537
- derivedTags: exported?.derivedTags ?? [],
3538
- isFavorite: false
3539
- });
3540
- hasLiveData = true;
3568
+ if (targetStats?.isDirectory()) {
3569
+ for (const entry of fs.readdirSync(targetDir, { withFileTypes: true })) {
3570
+ const relativePath = normalizedFolderPath ? `${normalizedFolderPath}/${entry.name}` : entry.name;
3571
+ if ((entry.name.startsWith(".") || hasHiddenPathSegment(relativePath))
3572
+ && !isIncludedHiddenPath(relativePath, config.includedHiddenPaths)) {
3573
+ continue;
3574
+ }
3575
+ if (!entry.isFile()) {
3576
+ continue;
3541
3577
  }
3578
+ const extension = path.extname(entry.name).toLowerCase();
3579
+ if (!supportedExtensions.has(extension)) {
3580
+ continue;
3581
+ }
3582
+ if (configuredExtensions.size > 0 && !configuredExtensions.has(extension)) {
3583
+ continue;
3584
+ }
3585
+ const stat = readAffairsLibraryStatsSafe(rootDir, relativePath);
3586
+ const exported = documentMap.get(relativePath);
3587
+ documentMap.set(relativePath, {
3588
+ documentId: exported?.documentId ?? relativePath,
3589
+ path: relativePath,
3590
+ title: exported?.title?.trim() || path.basename(entry.name, extension) || entry.name,
3591
+ summary: exported?.summary ?? "",
3592
+ updatedAt: stat?.mtime.toISOString() ?? exported?.updatedAt ?? "",
3593
+ createdAt: toIsoOrNull(stat?.birthtime) ?? exported?.createdAt ?? null,
3594
+ sizeBytes: stat?.size ?? exported?.sizeBytes ?? null,
3595
+ tags: exported?.tags ?? [],
3596
+ derivedTags: exported?.derivedTags ?? [],
3597
+ isFavorite: false
3598
+ });
3599
+ hasLiveData = true;
3542
3600
  }
3543
3601
  }
3544
3602
  return {