dirsql 0.4.84__tar.gz → 0.4.85__tar.gz

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 (354) hide show
  1. {dirsql-0.4.84 → dirsql-0.4.85}/Cargo.lock +2 -2
  2. {dirsql-0.4.84 → dirsql-0.4.85}/PKG-INFO +1 -1
  3. {dirsql-0.4.84/packages/rust → dirsql-0.4.85}/docs/reference/http-api.md +1 -1
  4. {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/Cargo.toml +1 -1
  5. dirsql-0.4.85/packages/python/changelog.d/2026-10-06-one-glob-compiler.md +3 -0
  6. {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/docs/reference/http-api.md +1 -1
  7. dirsql-0.4.85/packages/python/e2e-attestations/bot-1398-inotify-error.json +7 -0
  8. dirsql-0.4.85/packages/python/e2e-attestations/bot-1407-child-place-depth.json +7 -0
  9. dirsql-0.4.85/packages/python/e2e-attestations/claude-1258-one-pattern.json +7 -0
  10. dirsql-0.4.85/packages/python/e2e-attestations/claude-1330-vtab-prefetch-flag.json +7 -0
  11. dirsql-0.4.85/packages/python/migrations.d/2026-10-06-one-glob-compiler.md +28 -0
  12. {dirsql-0.4.84 → dirsql-0.4.85}/packages/rust/Cargo.toml +1 -1
  13. {dirsql-0.4.84 → dirsql-0.4.85/packages/rust}/docs/reference/http-api.md +1 -1
  14. {dirsql-0.4.84 → dirsql-0.4.85}/packages/rust/src/cli/router.rs +19 -0
  15. {dirsql-0.4.84 → dirsql-0.4.85}/packages/rust/src/cli/server.rs +39 -11
  16. {dirsql-0.4.84 → dirsql-0.4.85}/packages/rust/src/lib.rs +9 -4
  17. {dirsql-0.4.84 → dirsql-0.4.85}/packages/rust/src/matcher.rs +3 -2
  18. {dirsql-0.4.84 → dirsql-0.4.85}/packages/rust/src/scanner.rs +29 -0
  19. {dirsql-0.4.84 → dirsql-0.4.85}/packages/rust/src/vtab_scaffold.rs +1 -1
  20. {dirsql-0.4.84 → dirsql-0.4.85}/packages/rust/src/watcher.rs +74 -2
  21. {dirsql-0.4.84 → dirsql-0.4.85}/Cargo.toml +0 -0
  22. {dirsql-0.4.84 → dirsql-0.4.85}/README.md +0 -0
  23. {dirsql-0.4.84 → dirsql-0.4.85}/dirsql/__init__.py +0 -0
  24. {dirsql-0.4.84 → dirsql-0.4.85}/dirsql/_async.py +0 -0
  25. {dirsql-0.4.84 → dirsql-0.4.85}/dirsql/_dirsql.pyi +0 -0
  26. {dirsql-0.4.84 → dirsql-0.4.85}/dirsql/cli/__init__.py +0 -0
  27. {dirsql-0.4.84 → dirsql-0.4.85}/dirsql/cli/discover_plugins/__init__.py +0 -0
  28. {dirsql-0.4.84 → dirsql-0.4.85}/dirsql/cli/discover_plugins/discovered_fragments.py +0 -0
  29. {dirsql-0.4.84 → dirsql-0.4.85}/dirsql/cli/discover_plugins/discovery_disabled.py +0 -0
  30. {dirsql-0.4.84 → dirsql-0.4.85}/dirsql/cli/discover_plugins/fragment_path.py +0 -0
  31. {dirsql-0.4.84 → dirsql-0.4.85}/dirsql/cli/discover_plugins/with_discovered_plugins.py +0 -0
  32. {dirsql-0.4.84 → dirsql-0.4.85}/dirsql/cli/main.py +0 -0
  33. {dirsql-0.4.84 → dirsql-0.4.85}/dirsql/cli/resolve_config_extensions.py +0 -0
  34. {dirsql-0.4.84 → dirsql-0.4.85}/dirsql/plan_entry_path.py +0 -0
  35. {dirsql-0.4.84 → dirsql-0.4.85}/dirsql/py.typed +0 -0
  36. {dirsql-0.4.84 → dirsql-0.4.85}/dirsql/read_config.py +0 -0
  37. {dirsql-0.4.84 → dirsql-0.4.85}/dirsql/resolve_configs_extension_specs.py +0 -0
  38. {dirsql-0.4.84 → dirsql-0.4.85}/dirsql/resolve_extension.py +0 -0
  39. {dirsql-0.4.84 → dirsql-0.4.85}/dirsql/resolve_package.py +0 -0
  40. {dirsql-0.4.84 → dirsql-0.4.85}/docs/.claude/CLAUDE.md +0 -0
  41. {dirsql-0.4.84 → dirsql-0.4.85}/docs/.vitepress/config.ts +0 -0
  42. {dirsql-0.4.84 → dirsql-0.4.85}/docs/.vitepress/theme/index.ts +0 -0
  43. {dirsql-0.4.84 → dirsql-0.4.85}/docs/.vitepress/theme/lang.ts +0 -0
  44. {dirsql-0.4.84 → dirsql-0.4.85}/docs/AGENTS.md +0 -0
  45. {dirsql-0.4.84 → dirsql-0.4.85}/docs/context/.gitattributes +0 -0
  46. {dirsql-0.4.84 → dirsql-0.4.85}/docs/context/recipes.md +0 -0
  47. {dirsql-0.4.84 → dirsql-0.4.85}/docs/context/troubleshooting.md +0 -0
  48. {dirsql-0.4.84 → dirsql-0.4.85}/docs/context/usage.md +0 -0
  49. {dirsql-0.4.84 → dirsql-0.4.85}/docs/explanation.md +0 -0
  50. {dirsql-0.4.84 → dirsql-0.4.85}/docs/getting-started.md +0 -0
  51. {dirsql-0.4.84 → dirsql-0.4.85}/docs/howto/agent-skill.md +0 -0
  52. {dirsql-0.4.84 → dirsql-0.4.85}/docs/howto/columns-from-paths.md +0 -0
  53. {dirsql-0.4.84 → dirsql-0.4.85}/docs/howto/define-tables.md +0 -0
  54. {dirsql-0.4.84 → dirsql-0.4.85}/docs/howto/embed.md +0 -0
  55. {dirsql-0.4.84 → dirsql-0.4.85}/docs/howto/extract-from-contents.md +0 -0
  56. {dirsql-0.4.84 → dirsql-0.4.85}/docs/howto/load-extension.md +0 -0
  57. {dirsql-0.4.84 → dirsql-0.4.85}/docs/howto/parse-files-into-columns.md +0 -0
  58. {dirsql-0.4.84 → dirsql-0.4.85}/docs/howto/persist.md +0 -0
  59. {dirsql-0.4.84 → dirsql-0.4.85}/docs/howto/query-json.md +0 -0
  60. {dirsql-0.4.84 → dirsql-0.4.85}/docs/howto/query-without-config.md +0 -0
  61. {dirsql-0.4.84 → dirsql-0.4.85}/docs/howto/react-to-changes.md +0 -0
  62. {dirsql-0.4.84 → dirsql-0.4.85}/docs/howto/search-by-meaning.md +0 -0
  63. {dirsql-0.4.84 → dirsql-0.4.85}/docs/howto/search-indexes.md +0 -0
  64. {dirsql-0.4.84 → dirsql-0.4.85}/docs/howto/skip-files.md +0 -0
  65. {dirsql-0.4.84 → dirsql-0.4.85}/docs/howto/write-a-plugin.md +0 -0
  66. {dirsql-0.4.84 → dirsql-0.4.85}/docs/index.md +0 -0
  67. {dirsql-0.4.84 → dirsql-0.4.85}/docs/package.json +0 -0
  68. {dirsql-0.4.84 → dirsql-0.4.85}/docs/plugins.md +0 -0
  69. {dirsql-0.4.84 → dirsql-0.4.85}/docs/pnpm-lock.yaml +0 -0
  70. {dirsql-0.4.84 → dirsql-0.4.85}/docs/pnpm-workspace.yaml +0 -0
  71. {dirsql-0.4.84 → dirsql-0.4.85}/docs/reference/cli.md +0 -0
  72. {dirsql-0.4.84 → dirsql-0.4.85}/docs/reference/columns.md +0 -0
  73. {dirsql-0.4.84 → dirsql-0.4.85}/docs/reference/config.md +0 -0
  74. {dirsql-0.4.84 → dirsql-0.4.85}/docs/reference/hooks.md +0 -0
  75. {dirsql-0.4.84 → dirsql-0.4.85}/docs/reference/path-tables.md +0 -0
  76. {dirsql-0.4.84 → dirsql-0.4.85}/docs/reference/sdk.md +0 -0
  77. {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/CHANGELOG.md +0 -0
  78. {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/MIGRATIONS.md +0 -0
  79. {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/README.md +0 -0
  80. {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/changelog.d/2026-07-13-drop-cwd-config-auto-detect.md +0 -0
  81. {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/changelog.d/2026-07-13-plugin-discovery.md +0 -0
  82. {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/changelog.d/2026-07-13-rename-extract-to-on-file.md +0 -0
  83. {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/changelog.d/2026-07-13-repeatable-config.md +0 -0
  84. {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/changelog.d/2026-07-13-sdk-default-baked-in-config.md +0 -0
  85. {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/changelog.d/2026-07-20-drop-implicit-files-table.md +0 -0
  86. {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/changelog.d/2026-07-21-remove-glob-captures.md +0 -0
  87. {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/changelog.d/2026-07-24-hookless-table-config-error.md +0 -0
  88. {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/changelog.d/2026-07-24-remove-stat-fact-injection.md +0 -0
  89. {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/changelog.d/2026-07-29-restore-python-310.md +0 -0
  90. {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/changelog.d/2026-08-02-release-profile.md +0 -0
  91. {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/changelog.d/2026-08-02-scan-failures.md +0 -0
  92. {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/changelog.d/2026-08-03-discovery-ext-resolution.md +0 -0
  93. {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/changelog.d/2026-08-03-manylinux-dynamic-binary.md +0 -0
  94. {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/changelog.d/2026-08-03-python-no-ignore.md +0 -0
  95. {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/changelog.d/2026-08-04-cast-lints.md +0 -0
  96. {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/changelog.d/2026-08-04-cli-in-process.md +0 -0
  97. {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/changelog.d/2026-08-20-curtaincall-dev-dependency.md +0 -0
  98. {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/changelog.d/2026-08-20-declared-table-name.md +0 -0
  99. {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/changelog.d/2026-09-04-config-paths-from-argv-module.md +0 -0
  100. {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/changelog.d/2026-09-05-config-extension-loader-split.md +0 -0
  101. {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/changelog.d/2026-09-05-resolve-config-extensions-split.md +0 -0
  102. {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/changelog.d/2026-09-05-resolve-extension-split.md +0 -0
  103. {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/changelog.d/2026-09-09-launcher-config-path-scan.md +0 -0
  104. {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/changelog.d/2026-09-17-extension-resolution-via-core.md +0 -0
  105. {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/changelog.d/2026-09-18-export-scan-failure.md +0 -0
  106. {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/changelog.d/2026-09-18-flatten-row-event-in-core.md +0 -0
  107. {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/changelog.d/2026-09-18-programmatic-extension-plan.md +0 -0
  108. {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/changelog.d/2026-09-20-sigint-ends-a-run-in-progress.md +0 -0
  109. {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/changelog.d/2026-09-24-query-rows-in-projection-order.md +0 -0
  110. {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/changelog.d/2026-10-02-readme-docs-host.md +0 -0
  111. {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/changelog.d/2026-10-03-one-glob-rule-for-config-globs.md +0 -0
  112. {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/changelog.d/2026-10-03-path-table-directory-one-level.md +0 -0
  113. {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/changelog.d/2026-10-04-path-table-dotfiles-hidden.md +0 -0
  114. {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/changelog.d/2026-10-05-brace-groups-follow-bash.md +0 -0
  115. {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/changelog.d/2026-10-05-cli-context.md +0 -0
  116. {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/changelog.d/2026-10-05-gitignore-requires-repo.md +0 -0
  117. {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/changelog.d/2026-10-05-path-table-node-modules-named.md +0 -0
  118. {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/changelog.d/2026-10-05-path-table-symlinks.md +0 -0
  119. {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/changelog.d/2026-10-05-path-table-trailing-slash.md +0 -0
  120. {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/changelog.d/2026-10-06-config-globs-anchor-at-the-config.md +0 -0
  121. {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/changelog.d/2026-10-06-plugin-no-default-records.md +0 -0
  122. {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/changelog.d/2026-10-06-watch-broadcast.md +0 -0
  123. {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/changelog.d/2026-10-06-zero-match-config-table-warning.md +0 -0
  124. {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/changelog.d/README.md +0 -0
  125. {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/conftest.py +0 -0
  126. {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/docs/.claude/CLAUDE.md +0 -0
  127. {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/docs/.vitepress/config.ts +0 -0
  128. {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/docs/.vitepress/theme/index.ts +0 -0
  129. {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/docs/.vitepress/theme/lang.ts +0 -0
  130. {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/docs/AGENTS.md +0 -0
  131. {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/docs/context/.gitattributes +0 -0
  132. {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/docs/context/recipes.md +0 -0
  133. {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/docs/context/troubleshooting.md +0 -0
  134. {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/docs/context/usage.md +0 -0
  135. {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/docs/explanation.md +0 -0
  136. {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/docs/getting-started.md +0 -0
  137. {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/docs/howto/agent-skill.md +0 -0
  138. {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/docs/howto/columns-from-paths.md +0 -0
  139. {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/docs/howto/define-tables.md +0 -0
  140. {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/docs/howto/embed.md +0 -0
  141. {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/docs/howto/extract-from-contents.md +0 -0
  142. {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/docs/howto/load-extension.md +0 -0
  143. {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/docs/howto/parse-files-into-columns.md +0 -0
  144. {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/docs/howto/persist.md +0 -0
  145. {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/docs/howto/query-json.md +0 -0
  146. {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/docs/howto/query-without-config.md +0 -0
  147. {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/docs/howto/react-to-changes.md +0 -0
  148. {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/docs/howto/search-by-meaning.md +0 -0
  149. {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/docs/howto/search-indexes.md +0 -0
  150. {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/docs/howto/skip-files.md +0 -0
  151. {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/docs/howto/write-a-plugin.md +0 -0
  152. {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/docs/index.md +0 -0
  153. {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/docs/package.json +0 -0
  154. {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/docs/plugins.md +0 -0
  155. {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/docs/pnpm-lock.yaml +0 -0
  156. {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/docs/pnpm-workspace.yaml +0 -0
  157. {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/docs/reference/cli.md +0 -0
  158. {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/docs/reference/columns.md +0 -0
  159. {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/docs/reference/config.md +0 -0
  160. {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/docs/reference/hooks.md +0 -0
  161. {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/docs/reference/path-tables.md +0 -0
  162. {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/docs/reference/sdk.md +0 -0
  163. {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/e2e-attestations/bot-1397-watch-broadcast.json +0 -0
  164. {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/e2e-attestations/cc-keen-knuth-f11gyq.json +0 -0
  165. {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/e2e-attestations/claude-1056-py-ofpf9.json +0 -0
  166. {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/e2e-attestations/claude-1066-p1-resolve-extension.json +0 -0
  167. {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/e2e-attestations/claude-1078-argv-config-paths-core.json +0 -0
  168. {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/e2e-attestations/claude-1079-p2-resolve-config-extensions.json +0 -0
  169. {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/e2e-attestations/claude-1080-share-vtab-scaffolding.json +0 -0
  170. {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/e2e-attestations/claude-1081-indicatif-progress.json +0 -0
  171. {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/e2e-attestations/claude-1096-watch-moved-dir.json +0 -0
  172. {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/e2e-attestations/claude-1109-watch-moved-out.json +0 -0
  173. {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/e2e-attestations/claude-1119-ext-plan.json +0 -0
  174. {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/e2e-attestations/claude-1120-py-ext.json +0 -0
  175. {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/e2e-attestations/claude-1122-ext-cleanup.json +0 -0
  176. {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/e2e-attestations/claude-1130-codec-crates.json +0 -0
  177. {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/e2e-attestations/claude-1131-flatten-row-event.json +0 -0
  178. {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/e2e-attestations/claude-1139-sse-flatten.json +0 -0
  179. {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/e2e-attestations/claude-1140-scan-failure-export.json +0 -0
  180. {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/e2e-attestations/claude-1148-clippy-all-targets.json +0 -0
  181. {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/e2e-attestations/claude-1164-sigint-fatal.json +0 -0
  182. {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/e2e-attestations/claude-1170-projection-order.json +0 -0
  183. {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/e2e-attestations/claude-1172-on-file-path.json +0 -0
  184. {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/e2e-attestations/claude-1173-py-projection-order.json +0 -0
  185. {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/e2e-attestations/claude-1184-win-rel-paths.json +0 -0
  186. {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/e2e-attestations/claude-1185-win-abs-table-names.json +0 -0
  187. {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/e2e-attestations/claude-1186-win-test-harness.json +0 -0
  188. {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/e2e-attestations/claude-1196-join-index.json +0 -0
  189. {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/e2e-attestations/claude-1199-glob-prefix.json +0 -0
  190. {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/e2e-attestations/claude-1201-single-walk.json +0 -0
  191. {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/e2e-attestations/claude-1204-embed-batch.json +0 -0
  192. {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/e2e-attestations/claude-1207-win-argv-quote.json +0 -0
  193. {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/e2e-attestations/claude-1208-win-nonverbatim-paths.json +0 -0
  194. {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/e2e-attestations/claude-1215-on-file-batch.json +0 -0
  195. {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/e2e-attestations/claude-1216-on-file-cleanup.json +0 -0
  196. {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/e2e-attestations/claude-1223-config-glob-rule.json +0 -0
  197. {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/e2e-attestations/claude-1223-dir-one-level.json +0 -0
  198. {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/e2e-attestations/claude-1225-plugin-no-default.json +0 -0
  199. {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/e2e-attestations/claude-1226-stale-docs.json +0 -0
  200. {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/e2e-attestations/claude-1232-anchor-plumbing.json +0 -0
  201. {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/e2e-attestations/claude-1232-config-anchor.json +0 -0
  202. {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/e2e-attestations/claude-1232-multi-watch.json +0 -0
  203. {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/e2e-attestations/claude-1232-zero-match.json +0 -0
  204. {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/e2e-attestations/claude-1238-parallel-walk.json +0 -0
  205. {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/e2e-attestations/claude-1241-content-prefetch.json +0 -0
  206. {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/e2e-attestations/claude-1243-ingest-perf.json +0 -0
  207. {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/e2e-attestations/claude-1249-dotfiles.json +0 -0
  208. {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/e2e-attestations/claude-1256-symlinks.json +0 -0
  209. {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/e2e-attestations/claude-1257-trailing-slash.json +0 -0
  210. {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/e2e-attestations/claude-1262-brace-literal.json +0 -0
  211. {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/e2e-attestations/claude-1264-context.json +0 -0
  212. {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/e2e-attestations/claude-1267-posix-classes.json +0 -0
  213. {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/e2e-attestations/claude-1269-utf8-chars.json +0 -0
  214. {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/e2e-attestations/claude-1271-node-modules-named.json +0 -0
  215. {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/e2e-attestations/claude-1272-ancestor-gitignore.json +0 -0
  216. {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/e2e-attestations/claude-1273-walk-prune.json +0 -0
  217. {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/e2e-attestations/claude-1285-ingest-fast.json +0 -0
  218. {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/e2e-attestations/claude-1286-nested-repo.json +0 -0
  219. {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/e2e-attestations/claude-1305-glob-speed.json +0 -0
  220. {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/e2e-attestations/claude-1308-glob-speed.json +0 -0
  221. {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/e2e-attestations/claude-1310-glob-speed.json +0 -0
  222. {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/e2e-attestations/claude-1311-glob-speed.json +0 -0
  223. {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/e2e-attestations/claude-1312-glob-speed.json +0 -0
  224. {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/e2e-attestations/claude-1318-lazy-stat.json +0 -0
  225. {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/e2e-attestations/claude-1320-walk-speed.json +0 -0
  226. {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/e2e-attestations/claude-1322-walk-readdir.json +0 -0
  227. {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/e2e-attestations/claude-1325-parallel-walk.json +0 -0
  228. {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/e2e-attestations/claude-1326-stream-rows.json +0 -0
  229. {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/e2e-attestations/claude-1330-python-dirsql-patch.json +0 -0
  230. {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/e2e-attestations/claude-1330-python-extensions-patch.json +0 -0
  231. {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/e2e-attestations/claude-1330-scanner-effects.json +0 -0
  232. {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/e2e-attestations/claude-1330-scanner-gitignore.json +0 -0
  233. {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/e2e-attestations/claude-1330-vtab-read.json +0 -0
  234. {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/e2e-attestations/claude-1351-dot-dirs.json +0 -0
  235. {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/e2e-attestations/claude-819-oneshot-timeout.json +0 -0
  236. {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/e2e-attestations/claude-827-unquote-doubled-quotes.json +0 -0
  237. {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/e2e-attestations/claude-epic-953-slice2-reedline.json +0 -0
  238. {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/e2e-attestations/claude-epic-953-slice3-format.json +0 -0
  239. {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/e2e-attestations/claude-epic-953-stacked-prs-x59wm3.json +0 -0
  240. {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/e2e-attestations/claude-github-issue-825-e4mhhp.json +0 -0
  241. {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/e2e-attestations/claude-issue-951-0eease.json +0 -0
  242. {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/e2e-attestations/claude-issue-962-0jjrfv.json +0 -0
  243. {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/e2e-attestations/claude-issue-986-red-test-e7sjrb.json +0 -0
  244. {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/e2e-attestations/claude-tackle-1034-cachesplit.json +0 -0
  245. {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/e2e-attestations/claude-tackle-1042-py12.json +0 -0
  246. {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/e2e-attestations/claude-tackle-956-xzen74.json +0 -0
  247. {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/e2e-attestations/claude-tackle-957-lrm0z6-worker-calls.json +0 -0
  248. {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/e2e-attestations/claude-tackle-957-lrm0z6.json +0 -0
  249. {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/e2e-attestations/claude-tackle-975-n8mc2h.json +0 -0
  250. {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/migrations.d/2026-07-13-drop-cwd-config-auto-detect.md +0 -0
  251. {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/migrations.d/2026-07-13-rename-extract-to-on-file.md +0 -0
  252. {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/migrations.d/2026-07-13-sdk-default-baked-in-config.md +0 -0
  253. {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/migrations.d/2026-07-20-drop-implicit-files-table.md +0 -0
  254. {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/migrations.d/2026-07-21-remove-glob-captures.md +0 -0
  255. {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/migrations.d/2026-07-24-hookless-table-config-error.md +0 -0
  256. {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/migrations.d/2026-07-24-remove-stat-fact-injection.md +0 -0
  257. {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/migrations.d/2026-07-29-restore-python-310.md +0 -0
  258. {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/migrations.d/2026-08-04-cli-in-process.md +0 -0
  259. {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/migrations.d/2026-08-20-declared-table-name.md +0 -0
  260. {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/migrations.d/2026-09-20-sigint-ends-a-run-in-progress.md +0 -0
  261. {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/migrations.d/2026-09-24-query-rows-in-projection-order.md +0 -0
  262. {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/migrations.d/2026-10-02-readme-docs-host.md +0 -0
  263. {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/migrations.d/2026-10-03-one-glob-rule-for-config-globs.md +0 -0
  264. {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/migrations.d/2026-10-03-path-table-directory-one-level.md +0 -0
  265. {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/migrations.d/2026-10-04-path-table-dotfiles-hidden.md +0 -0
  266. {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/migrations.d/2026-10-05-brace-groups-follow-bash.md +0 -0
  267. {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/migrations.d/2026-10-05-cli-context.md +0 -0
  268. {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/migrations.d/2026-10-05-gitignore-requires-repo.md +0 -0
  269. {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/migrations.d/2026-10-05-path-table-node-modules-named.md +0 -0
  270. {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/migrations.d/2026-10-05-path-table-symlinks.md +0 -0
  271. {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/migrations.d/2026-10-05-path-table-trailing-slash.md +0 -0
  272. {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/migrations.d/2026-10-06-config-globs-anchor-at-the-config.md +0 -0
  273. {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/migrations.d/2026-10-06-plugin-no-default-records.md +0 -0
  274. {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/migrations.d/2026-10-06-watch-broadcast.md +0 -0
  275. {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/migrations.d/2026-10-06-zero-match-config-table-warning.md +0 -0
  276. {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/migrations.d/README.md +0 -0
  277. {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/src/lib.rs +0 -0
  278. {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/testing-conventions.toml +0 -0
  279. {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/tests/__init__.py +0 -0
  280. {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/tests/conftest.py +0 -0
  281. {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/tests/e2e/__init__.py +0 -0
  282. {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/tests/e2e/fixtures/dirsql_plugin_fixture/__init__.py +0 -0
  283. {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/tests/e2e/fixtures/dirsql_plugin_fixture/dirsql.toml +0 -0
  284. {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/tests/e2e/speed_of_light.py +0 -0
  285. {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/tests/integration/__init__.py +0 -0
  286. {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/tests/integration/binding/__init__.py +0 -0
  287. {dirsql-0.4.84 → dirsql-0.4.85}/packages/python/tests/integration/hermetic/__init__.py +0 -0
  288. {dirsql-0.4.84 → dirsql-0.4.85}/packages/rust/CHANGELOG.md +0 -0
  289. {dirsql-0.4.84 → dirsql-0.4.85}/packages/rust/MIGRATIONS.md +0 -0
  290. {dirsql-0.4.84 → dirsql-0.4.85}/packages/rust/README.md +0 -0
  291. {dirsql-0.4.84 → dirsql-0.4.85}/packages/rust/benches/db_bench.rs +0 -0
  292. {dirsql-0.4.84 → dirsql-0.4.85}/packages/rust/benches/differ_bench.rs +0 -0
  293. {dirsql-0.4.84 → dirsql-0.4.85}/packages/rust/benches/matcher_bench.rs +0 -0
  294. {dirsql-0.4.84 → dirsql-0.4.85}/packages/rust/benches/scanner_bench.rs +0 -0
  295. {dirsql-0.4.84 → dirsql-0.4.85}/packages/rust/docs/context/.gitattributes +0 -0
  296. {dirsql-0.4.84 → dirsql-0.4.85}/packages/rust/docs/context/recipes.md +0 -0
  297. {dirsql-0.4.84 → dirsql-0.4.85}/packages/rust/docs/context/troubleshooting.md +0 -0
  298. {dirsql-0.4.84 → dirsql-0.4.85}/packages/rust/docs/context/usage.md +0 -0
  299. {dirsql-0.4.84 → dirsql-0.4.85}/packages/rust/docs/explanation.md +0 -0
  300. {dirsql-0.4.84 → dirsql-0.4.85}/packages/rust/docs/getting-started.md +0 -0
  301. {dirsql-0.4.84 → dirsql-0.4.85}/packages/rust/docs/howto/agent-skill.md +0 -0
  302. {dirsql-0.4.84 → dirsql-0.4.85}/packages/rust/docs/howto/columns-from-paths.md +0 -0
  303. {dirsql-0.4.84 → dirsql-0.4.85}/packages/rust/docs/howto/define-tables.md +0 -0
  304. {dirsql-0.4.84 → dirsql-0.4.85}/packages/rust/docs/howto/embed.md +0 -0
  305. {dirsql-0.4.84 → dirsql-0.4.85}/packages/rust/docs/howto/extract-from-contents.md +0 -0
  306. {dirsql-0.4.84 → dirsql-0.4.85}/packages/rust/docs/howto/load-extension.md +0 -0
  307. {dirsql-0.4.84 → dirsql-0.4.85}/packages/rust/docs/howto/parse-files-into-columns.md +0 -0
  308. {dirsql-0.4.84 → dirsql-0.4.85}/packages/rust/docs/howto/persist.md +0 -0
  309. {dirsql-0.4.84 → dirsql-0.4.85}/packages/rust/docs/howto/query-json.md +0 -0
  310. {dirsql-0.4.84 → dirsql-0.4.85}/packages/rust/docs/howto/query-without-config.md +0 -0
  311. {dirsql-0.4.84 → dirsql-0.4.85}/packages/rust/docs/howto/react-to-changes.md +0 -0
  312. {dirsql-0.4.84 → dirsql-0.4.85}/packages/rust/docs/howto/search-by-meaning.md +0 -0
  313. {dirsql-0.4.84 → dirsql-0.4.85}/packages/rust/docs/howto/search-indexes.md +0 -0
  314. {dirsql-0.4.84 → dirsql-0.4.85}/packages/rust/docs/howto/skip-files.md +0 -0
  315. {dirsql-0.4.84 → dirsql-0.4.85}/packages/rust/docs/howto/write-a-plugin.md +0 -0
  316. {dirsql-0.4.84 → dirsql-0.4.85}/packages/rust/docs/index.md +0 -0
  317. {dirsql-0.4.84 → dirsql-0.4.85}/packages/rust/docs/plugins.md +0 -0
  318. {dirsql-0.4.84 → dirsql-0.4.85}/packages/rust/docs/reference/cli.md +0 -0
  319. {dirsql-0.4.84 → dirsql-0.4.85}/packages/rust/docs/reference/columns.md +0 -0
  320. {dirsql-0.4.84 → dirsql-0.4.85}/packages/rust/docs/reference/config.md +0 -0
  321. {dirsql-0.4.84 → dirsql-0.4.85}/packages/rust/docs/reference/hooks.md +0 -0
  322. {dirsql-0.4.84 → dirsql-0.4.85}/packages/rust/docs/reference/path-tables.md +0 -0
  323. {dirsql-0.4.84 → dirsql-0.4.85}/packages/rust/docs/reference/sdk.md +0 -0
  324. {dirsql-0.4.84 → dirsql-0.4.85}/packages/rust/src/bin/dirsql.rs +0 -0
  325. {dirsql-0.4.84 → dirsql-0.4.85}/packages/rust/src/brace.rs +0 -0
  326. {dirsql-0.4.84 → dirsql-0.4.85}/packages/rust/src/cli/context.rs +0 -0
  327. {dirsql-0.4.84 → dirsql-0.4.85}/packages/rust/src/cli/execute.rs +0 -0
  328. {dirsql-0.4.84 → dirsql-0.4.85}/packages/rust/src/cli/init.rs +0 -0
  329. {dirsql-0.4.84 → dirsql-0.4.85}/packages/rust/src/cli/mod.rs +0 -0
  330. {dirsql-0.4.84 → dirsql-0.4.85}/packages/rust/src/cli/repl.rs +0 -0
  331. {dirsql-0.4.84 → dirsql-0.4.85}/packages/rust/src/cli/run.rs +0 -0
  332. {dirsql-0.4.84 → dirsql-0.4.85}/packages/rust/src/cli/serialize.rs +0 -0
  333. {dirsql-0.4.84 → dirsql-0.4.85}/packages/rust/src/cli/table.rs +0 -0
  334. {dirsql-0.4.84 → dirsql-0.4.85}/packages/rust/src/command.rs +0 -0
  335. {dirsql-0.4.84 → dirsql-0.4.85}/packages/rust/src/config.rs +0 -0
  336. {dirsql-0.4.84 → dirsql-0.4.85}/packages/rust/src/db.rs +0 -0
  337. {dirsql-0.4.84 → dirsql-0.4.85}/packages/rust/src/default_config.toml +0 -0
  338. {dirsql-0.4.84 → dirsql-0.4.85}/packages/rust/src/differ.rs +0 -0
  339. {dirsql-0.4.84 → dirsql-0.4.85}/packages/rust/src/extension_resolution.rs +0 -0
  340. {dirsql-0.4.84 → dirsql-0.4.85}/packages/rust/src/functions.rs +0 -0
  341. {dirsql-0.4.84 → dirsql-0.4.85}/packages/rust/src/infer.rs +0 -0
  342. {dirsql-0.4.84 → dirsql-0.4.85}/packages/rust/src/launcher.rs +0 -0
  343. {dirsql-0.4.84 → dirsql-0.4.85}/packages/rust/src/listing.rs +0 -0
  344. {dirsql-0.4.84 → dirsql-0.4.85}/packages/rust/src/on_file.rs +0 -0
  345. {dirsql-0.4.84 → dirsql-0.4.85}/packages/rust/src/parsed_vtab.rs +0 -0
  346. {dirsql-0.4.84 → dirsql-0.4.85}/packages/rust/src/path_table.rs +0 -0
  347. {dirsql-0.4.84 → dirsql-0.4.85}/packages/rust/src/persist.rs +0 -0
  348. {dirsql-0.4.84 → dirsql-0.4.85}/packages/rust/src/posix_class.rs +0 -0
  349. {dirsql-0.4.84 → dirsql-0.4.85}/packages/rust/src/progress.rs +0 -0
  350. {dirsql-0.4.84 → dirsql-0.4.85}/packages/rust/src/row_event_flat.rs +0 -0
  351. {dirsql-0.4.84 → dirsql-0.4.85}/packages/rust/src/sql_literal.rs +0 -0
  352. {dirsql-0.4.84 → dirsql-0.4.85}/packages/rust/src/tree_walk.rs +0 -0
  353. {dirsql-0.4.84 → dirsql-0.4.85}/packages/rust/src/vtab.rs +0 -0
  354. {dirsql-0.4.84 → dirsql-0.4.85}/pyproject.toml +0 -0
@@ -552,7 +552,7 @@ checksum = "6184e33543162437515c2e2b48714794e37845ec9851711914eec9d308f6ebe8"
552
552
 
553
553
  [[package]]
554
554
  name = "dirsql"
555
- version = "0.4.84"
555
+ version = "0.4.85"
556
556
  dependencies = [
557
557
  "assert_cmd",
558
558
  "axum",
@@ -602,7 +602,7 @@ dependencies = [
602
602
 
603
603
  [[package]]
604
604
  name = "dirsql-py-ext"
605
- version = "0.4.84"
605
+ version = "0.4.85"
606
606
  dependencies = [
607
607
  "dirsql",
608
608
  "pyo3",
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: dirsql
3
- Version: 0.4.84
3
+ Version: 0.4.85
4
4
  Requires-Dist: bin-shim>=0.1
5
5
  Summary: Ephemeral SQL index over a local directory
6
6
  Keywords: sql,filesystem,directory,sqlite,index
@@ -112,4 +112,4 @@ Row values serialize as in [`POST /query`](#value-serialization).
112
112
  |---|---|
113
113
  | `200` | Stream opened (`text/event-stream`). |
114
114
  | `405` | `POST /events`. Plain-text body `method not allowed`. |
115
- | `503` | The server is in [degraded mode](./cli.md#degraded-mode). JSON `{"error": …}` body. |
115
+ | `503` | The server is in [degraded mode](./cli.md#degraded-mode), or its filesystem watcher failed to start (for example, the inotify limit is exhausted). JSON `{"error": …}` body; for a watcher failure the message starts `filesystem watcher failed to start:` and gives the reason. `POST /query` keeps working. |
@@ -4,7 +4,7 @@ name = "dirsql-py-ext"
4
4
  # pypi/maturin handler can rewrite it via `write-version` before
5
5
  # `maturin build`. `pyproject.toml` declares `dynamic = ["version"]`
6
6
  # and maturin reads this field. Mirrors `packages/rust/Cargo.toml`.
7
- version = "0.4.84"
7
+ version = "0.4.85"
8
8
  # abi3 note: the `abi3-py310` pyo3 feature (below) builds ONE stable-ABI
9
9
  # `cp310-abi3` wheel per platform that loads on every CPython >= 3.10
10
10
  # (matching `pyproject.toml`'s `requires-python = ">=3.10"`), instead of
@@ -0,0 +1,3 @@
1
+ **Changed** A declared `[[table]] glob` is compiled by the same glob compiler
2
+ as a path-table, so brace ranges such as `f{1..3}.md` and the other bash brace
3
+ rules now read the same on both surfaces.
@@ -112,4 +112,4 @@ Row values serialize as in [`POST /query`](#value-serialization).
112
112
  |---|---|
113
113
  | `200` | Stream opened (`text/event-stream`). |
114
114
  | `405` | `POST /events`. Plain-text body `method not allowed`. |
115
- | `503` | The server is in [degraded mode](./cli.md#degraded-mode). JSON `{"error": …}` body. |
115
+ | `503` | The server is in [degraded mode](./cli.md#degraded-mode), or its filesystem watcher failed to start (for example, the inotify limit is exhausted). JSON `{"error": …}` body; for a watcher failure the message starts `filesystem watcher failed to start:` and gives the reason. `POST /query` keeps working. |
@@ -0,0 +1,7 @@
1
+ {
2
+ "command": "uv run python -m pytest tests/e2e/cli_version_test.py tests/e2e/query_contract_test.py -x -q",
3
+ "ran_at": 1791309015,
4
+ "exit_code": 0,
5
+ "commit": "d60aff48881ae3201bccd0e6e77f52e6cd62c646",
6
+ "branch": "bot/1398-inotify-error"
7
+ }
@@ -0,0 +1,7 @@
1
+ {
2
+ "command": "uv run python -m pytest tests/e2e/fanout_test.py -x -q",
3
+ "ran_at": 1791310157,
4
+ "exit_code": 0,
5
+ "commit": "7104e6400efd6f912a92a53dd0d8f6d4c6c3a947",
6
+ "branch": "bot/1407-child-place-depth"
7
+ }
@@ -0,0 +1,7 @@
1
+ {
2
+ "command": "uv run python -m pytest tests/e2e/capture_collision_test.py tests/e2e/declared_table_name_test.py tests/e2e/extension_package_test.py tests/e2e/query_contract_test.py tests/e2e/plugin_discovery_test.py tests/e2e/sigint_interrupt_test.py tests/e2e/fanout_test.py tests/e2e/use_case_transcripts_test.py tests/e2e/plugin_extension_discovery_test.py -x -q",
3
+ "ran_at": 1791301900,
4
+ "exit_code": 0,
5
+ "commit": "14d2a11edd69bb0715bbffdb085b1d6582728dd8",
6
+ "branch": "claude/1258-one-pattern"
7
+ }
@@ -0,0 +1,7 @@
1
+ {
2
+ "command": "uv run python -m pytest tests/e2e/query_contract_test.py tests/e2e/declared_table_name_test.py tests/e2e/fanout_test.py -x -q",
3
+ "ran_at": 1791310416,
4
+ "exit_code": 0,
5
+ "commit": "bcedde49401cf6f9cc01deb2d95af1d1e907f0f7",
6
+ "branch": "claude/1330-vtab-prefetch-flag"
7
+ }
@@ -0,0 +1,28 @@
1
+ ### Config table globs share the path-table glob compiler
2
+
3
+ #### Summary
4
+
5
+ A declared `[[table]] glob` is now compiled by the same compiler as a
6
+ path-table. A brace range such as `f{1..3}.md` expands as in bash instead of
7
+ matching nothing. Nothing else changes.
8
+
9
+ #### Required changes
10
+
11
+ _None._
12
+
13
+ #### Deprecations removed
14
+
15
+ _None._
16
+
17
+ #### Behavior changes without code changes
18
+
19
+ - `glob = "f{1..3}.md"` matches `f1.md`, `f2.md` and `f3.md`.
20
+
21
+ #### Verification
22
+
23
+ ```bash
24
+ cd "$(mktemp -d)"
25
+ touch f1.md f2.md f3.md f4.md
26
+ dirsql query "SELECT path FROM './f{1..3}.md' ORDER BY path"
27
+ # expected: [{"path":"f1.md"},{"path":"f2.md"},{"path":"f3.md"}]
28
+ ```
@@ -6,7 +6,7 @@ description = "Ephemeral SQL index over a local directory"
6
6
  # version stays for the binding crates (publish = false). The literal
7
7
  # intentionally lags the published version: putitoutthere rewrites it to
8
8
  # the planned release version at build time and never commits it back.
9
- version = "0.4.84"
9
+ version = "0.4.85"
10
10
  edition.workspace = true
11
11
  # Literal `license` (not `license.workspace = true`) because
12
12
  # putitoutthere's preflight check reads `[package].license` directly
@@ -112,4 +112,4 @@ Row values serialize as in [`POST /query`](#value-serialization).
112
112
  |---|---|
113
113
  | `200` | Stream opened (`text/event-stream`). |
114
114
  | `405` | `POST /events`. Plain-text body `method not allowed`. |
115
- | `503` | The server is in [degraded mode](./cli.md#degraded-mode). JSON `{"error": …}` body. |
115
+ | `503` | The server is in [degraded mode](./cli.md#degraded-mode), or its filesystem watcher failed to start (for example, the inotify limit is exhausted). JSON `{"error": …}` body; for a watcher failure the message starts `filesystem watcher failed to start:` and gives the reason. `POST /query` keeps working. |
@@ -26,6 +26,7 @@ use super::execute::{QueryFailure, execute_query, require_ready};
26
26
  pub(super) struct AppContext {
27
27
  pub state: AppState,
28
28
  pub events: broadcast::Sender<String>,
29
+ pub watch_failure: Option<String>,
29
30
  pub cancel: watch::Receiver<bool>,
30
31
  pub query_timeout: Duration,
31
32
  }
@@ -72,6 +73,9 @@ async fn handle_events(State(ctx): State<SharedCtx>) -> Response {
72
73
  if let Err(failure) = require_ready(&ctx.state) {
73
74
  return failure_response(&failure);
74
75
  }
76
+ if let Some(reason) = &ctx.watch_failure {
77
+ return failure_response(&QueryFailure::Unavailable(reason.clone()));
78
+ }
75
79
 
76
80
  // Subscribe BEFORE anything that might block so we don't drop events
77
81
  // that fire between subscribing and the first poll.
@@ -163,6 +167,21 @@ mod tests {
163
167
  );
164
168
  }
165
169
 
170
+ #[tokio::test]
171
+ async fn events_return_503_while_the_server_is_unavailable() {
172
+ let (events, _) = broadcast::channel::<String>(1);
173
+ let (_cancel_tx, cancel) = watch::channel(false);
174
+ let ctx = Arc::new(AppContext {
175
+ state: AppState::Unavailable("config failed to load".into()),
176
+ events,
177
+ watch_failure: None,
178
+ cancel,
179
+ query_timeout: Duration::from_secs(1),
180
+ });
181
+ let resp = handle_events(State(ctx)).await;
182
+ assert_eq!(resp.status(), StatusCode::SERVICE_UNAVAILABLE);
183
+ }
184
+
166
185
  #[test]
167
186
  fn error_response_sets_json_content_type() {
168
187
  let resp = error_response(StatusCode::BAD_REQUEST, "boom");
@@ -38,14 +38,16 @@ pub async fn serve_with_state(
38
38
  // the underlying notify watcher (which `DirSQL::watch` only permits
39
39
  // once per instance).
40
40
  let (event_tx, _) = broadcast::channel::<String>(256);
41
- if let AppState::Ready(ref db) = state {
42
- start_watch_task(db.clone(), event_tx.clone());
43
- }
41
+ let watch_failure = match state {
42
+ AppState::Ready(ref db) => start_watch_task(db.clone(), event_tx.clone()),
43
+ AppState::Unavailable(_) => None,
44
+ };
44
45
 
45
46
  let (cancel_tx, cancel_rx) = watch::channel(false);
46
47
  let shared = Arc::new(AppContext {
47
48
  state,
48
49
  events: event_tx,
50
+ watch_failure,
49
51
  cancel: cancel_rx,
50
52
  query_timeout: config.query_timeout,
51
53
  });
@@ -69,18 +71,20 @@ pub async fn serve_with_state(
69
71
  })
70
72
  }
71
73
 
72
- fn start_watch_task(db: DirSQL, tx: broadcast::Sender<String>) {
74
+ /// Returns the reason `/events` must refuse requests when the watcher
75
+ /// could not attach.
76
+ fn start_watch_task(db: DirSQL, tx: broadcast::Sender<String>) -> Option<String> {
73
77
  // `db.watch()` spawns its own OS thread and returns an async stream.
74
78
  // We pump the stream into the broadcast channel. If no subscribers
75
79
  // exist, send() errors but we keep pumping (future subscribers
76
80
  // will get subsequent events).
77
- let Ok(mut stream) = db.watch().map_err(|err| {
78
- eprintln!(
79
- "dirsql: failed to attach filesystem watcher ({err}); \
80
- /events will return an empty stream"
81
- );
82
- }) else {
83
- return;
81
+ let mut stream = match db.watch() {
82
+ Ok(stream) => stream,
83
+ Err(err) => {
84
+ let reason = format!("filesystem watcher failed to start: {err}");
85
+ eprintln!("dirsql: {reason}; /events will return 503");
86
+ return Some(reason);
87
+ }
84
88
  };
85
89
  tokio::spawn(async move {
86
90
  while let Some(event) = stream.next().await {
@@ -88,6 +92,7 @@ fn start_watch_task(db: DirSQL, tx: broadcast::Sender<String>) {
88
92
  let _ = tx.send(payload);
89
93
  }
90
94
  });
95
+ None
91
96
  }
92
97
 
93
98
  #[cfg(test)]
@@ -122,6 +127,29 @@ mod tests {
122
127
  handle.shutdown().await.expect("graceful shutdown");
123
128
  }
124
129
 
130
+ #[tokio::test]
131
+ async fn start_watch_task_reports_no_failure_once_the_watcher_attaches() {
132
+ let dir = tempfile::tempdir().unwrap();
133
+ let db = DirSQL::new(dir.path(), Vec::new()).unwrap();
134
+ let (tx, _) = broadcast::channel::<String>(1);
135
+ assert_eq!(start_watch_task(db, tx), None);
136
+ }
137
+
138
+ // `poll_events` locks out `watch`, the one deterministic way to make the
139
+ // watcher refuse to attach without exhausting inotify.
140
+ #[tokio::test]
141
+ async fn start_watch_task_returns_the_reason_when_the_watcher_cannot_attach() {
142
+ let dir = tempfile::tempdir().unwrap();
143
+ let db = DirSQL::new(dir.path(), Vec::new()).unwrap();
144
+ db.poll_events(std::time::Duration::ZERO).unwrap();
145
+ let (tx, _) = broadcast::channel::<String>(1);
146
+ let reason = start_watch_task(db, tx).expect("watch() must fail");
147
+ assert!(
148
+ reason.starts_with("filesystem watcher failed to start: "),
149
+ "got: {reason}"
150
+ );
151
+ }
152
+
125
153
  // Binding to a non-local TEST-NET address (RFC 5737) fails with
126
154
  // "cannot assign requested address", surfacing `ServerError::Bind` rather
127
155
  // than panicking — deterministic and DNS-free.
@@ -224,9 +224,9 @@ impl DirSqlError {
224
224
  DirSqlError::Lock(e.to_string())
225
225
  }
226
226
 
227
- fn watch<E: StdError + Send + Sync + 'static>(e: E) -> Self {
227
+ fn watch(e: notify::Error) -> Self {
228
228
  DirSqlError::Watch {
229
- message: e.to_string(),
229
+ message: watcher::describe_watch_error(&e, cfg!(target_os = "linux")),
230
230
  source: Some(Box::new(e)),
231
231
  }
232
232
  }
@@ -2527,6 +2527,11 @@ struct AsyncDirSqlInner {
2527
2527
  ready_notify: tokio::sync::Notify,
2528
2528
  }
2529
2529
 
2530
+ #[cfg(test)]
2531
+ fn generic_watch_error(message: &str) -> notify::Error {
2532
+ notify::Error::generic(message)
2533
+ }
2534
+
2530
2535
  #[cfg(test)]
2531
2536
  impl AsyncDirSqlInner {
2532
2537
  /// Fresh inner with an empty `db` cell — the pre-`ready` state.
@@ -2681,10 +2686,10 @@ mod readonly_tests {
2681
2686
  DirSqlError::lock("x").to_string(),
2682
2687
  "failed to lock shared state: x"
2683
2688
  );
2684
- // `watch`, `config`, `matcher` wrap a typed StdError to preserve a
2689
+ // `watch`, `config`, `matcher` wrap a typed error to preserve a
2685
2690
  // `source()` chain.
2686
2691
  let io = || std::io::Error::other("x");
2687
- let watch_err = DirSqlError::watch(io());
2692
+ let watch_err = DirSqlError::watch(generic_watch_error("x"));
2688
2693
  assert_eq!(watch_err.to_string(), "watcher error: x");
2689
2694
  assert!(StdError::source(&watch_err).is_some());
2690
2695
 
@@ -1,4 +1,5 @@
1
1
  use crate::posix_class::expand_posix_classes;
2
+ use crate::scanner::{PathGlob, compile_glob};
2
3
  use globset::GlobBuilder;
3
4
  use regex::{Regex, RegexBuilder};
4
5
  use std::path::Path;
@@ -81,7 +82,7 @@ pub struct MatchResult {
81
82
  /// A compiled glob pattern. `{name}` placeholders are rewritten to `*` before
82
83
  /// compilation, so they are pure match wildcards.
83
84
  struct PatternEntry {
84
- pattern: Pattern,
85
+ pattern: PathGlob,
85
86
  table_name: String,
86
87
  }
87
88
 
@@ -161,7 +162,7 @@ impl TableMatcher {
161
162
  let mut entries = Vec::new();
162
163
  for (pattern, table_name) in mappings {
163
164
  entries.push(PatternEntry {
164
- pattern: Pattern::new(&glob_with_placeholders_as_star(pattern))?,
165
+ pattern: compile_glob(&glob_with_placeholders_as_star(pattern))?,
165
166
  table_name: table_name.to_string(),
166
167
  });
167
168
  }
@@ -921,6 +921,35 @@ mod tests {
921
921
  );
922
922
  }
923
923
 
924
+ fn explored_dirs(place: Place<'_>) -> Vec<Place<'_>> {
925
+ place
926
+ .explore(&|_| true)
927
+ .into_iter()
928
+ .filter_map(|step| match step {
929
+ Step::Dir(child) => Some(*child),
930
+ Step::Leaf(_) => None,
931
+ })
932
+ .collect()
933
+ }
934
+
935
+ #[test]
936
+ fn explore_enters_a_dirsql_directory_below_the_top_level() {
937
+ let root = tempfile::tempdir().unwrap();
938
+ fs::create_dir_all(root.path().join("a").join(RESERVED_DIR)).unwrap();
939
+ let ignore = TableMatcher::new(&[], &[]).unwrap();
940
+ let top = Place {
941
+ walk: walk_with(&ignore, None, Vec::new()),
942
+ dir: root.path().to_path_buf(),
943
+ rel: PathBuf::new(),
944
+ depth: 0,
945
+ states: Vec::new(),
946
+ linked: false,
947
+ };
948
+ let [a] = <[Place<'_>; 1]>::try_from(explored_dirs(top)).ok().unwrap();
949
+ let nested: Vec<PathBuf> = explored_dirs(a).into_iter().map(|p| p.rel).collect();
950
+ assert_eq!(nested, vec![Path::new("a").join(RESERVED_DIR)]);
951
+ }
952
+
924
953
  #[test]
925
954
  fn is_reserved_dir_matches_top_level_dirsql() {
926
955
  assert!(is_reserved_dir(1, true, OsStr::new(RESERVED_DIR)));
@@ -331,7 +331,7 @@ fn lookup_cost(prefetch: bool) -> f64 {
331
331
  fn plan_idx_num(lookup: Option<usize>, prefetch: bool) -> c_int {
332
332
  let lookup = lookup.map_or(SCAN_IDX, lookup_idx_num);
333
333
  if prefetch {
334
- lookup | PREFETCH_IDX
334
+ lookup + PREFETCH_IDX
335
335
  } else {
336
336
  lookup
337
337
  }
@@ -1,11 +1,14 @@
1
1
  use notify::event::{ModifyKind, RenameMode};
2
2
  use notify::{
3
- Config, Event, EventKind, RecommendedWatcher, RecursiveMode, Watcher as NotifyWatcher,
3
+ Config, ErrorKind, Event, EventKind, RecommendedWatcher, RecursiveMode,
4
+ Watcher as NotifyWatcher,
4
5
  };
5
6
  use std::path::{Path, PathBuf};
6
7
  use std::sync::mpsc;
7
8
  use std::time::Duration;
8
9
 
10
+ const EMFILE: i32 = 24;
11
+
9
12
  /// Events emitted by the file watcher.
10
13
  #[derive(Debug, Clone, PartialEq, Eq)]
11
14
  pub enum FileEvent {
@@ -74,6 +77,25 @@ impl Watcher {
74
77
  }
75
78
  }
76
79
 
80
+ /// The message for a watcher that failed to start. On inotify, the opaque
81
+ /// limit errors name the exhausted limit and the sysctl that raises it.
82
+ pub(crate) fn describe_watch_error(err: &notify::Error, inotify: bool) -> String {
83
+ let base = err.to_string();
84
+ if !inotify {
85
+ return base;
86
+ }
87
+ let (limit, sysctl) = match &err.kind {
88
+ ErrorKind::Io(io) if io.raw_os_error() == Some(EMFILE) => {
89
+ ("inotify instance limit", "fs.inotify.max_user_instances")
90
+ }
91
+ ErrorKind::MaxFilesWatch => ("inotify watch limit", "fs.inotify.max_user_watches"),
92
+ _ => return base,
93
+ };
94
+ format!(
95
+ "{base}; the {limit} is likely exhausted: raise it with `sudo sysctl {sysctl}=<higher value>`"
96
+ )
97
+ }
98
+
77
99
  /// Translate a notify Event into zero or more FileEvents.
78
100
  fn translate_event(event: &Event) -> Vec<FileEvent> {
79
101
  let mut results = Vec::new();
@@ -106,7 +128,7 @@ fn translate_event(event: &Event) -> Vec<FileEvent> {
106
128
  results
107
129
  }
108
130
 
109
- // Test fixtures: build `notify::Event`s without the unit tests naming the
131
+ // Test fixtures: build `notify::Event`s and `notify::Error`s without the unit tests naming the
110
132
  // `notify::event::*` inner-kind types (the unit-lint isolation rule).
111
133
  // `translate_event` matches only the outer variant, so the inner kind is an
112
134
  // arbitrary valid value.
@@ -192,6 +214,21 @@ fn access_event(paths: Vec<PathBuf>) -> Event {
192
214
  }
193
215
  }
194
216
 
217
+ #[cfg(test)]
218
+ fn io_error(raw_os_error: i32) -> notify::Error {
219
+ notify::Error::io(std::io::Error::from_raw_os_error(raw_os_error))
220
+ }
221
+
222
+ #[cfg(test)]
223
+ fn max_files_watch_error() -> notify::Error {
224
+ notify::Error::new(ErrorKind::MaxFilesWatch)
225
+ }
226
+
227
+ #[cfg(test)]
228
+ fn path_not_found_error() -> notify::Error {
229
+ notify::Error::path_not_found()
230
+ }
231
+
195
232
  #[cfg(test)]
196
233
  mod tests {
197
234
  use super::*;
@@ -200,6 +237,41 @@ mod tests {
200
237
  // `tests/watcher.rs` (unit-lint isolation); only the pure
201
238
  // `translate_event` mapping tests belong here.
202
239
 
240
+ #[test]
241
+ fn describe_watch_error_names_the_instance_limit_for_emfile_on_inotify() {
242
+ let err = io_error(24);
243
+ let msg = describe_watch_error(&err, true);
244
+ assert!(msg.starts_with(&err.to_string()), "{msg}");
245
+ assert!(msg.contains("inotify instance limit"), "{msg}");
246
+ assert!(msg.contains("fs.inotify.max_user_instances"), "{msg}");
247
+ }
248
+
249
+ #[test]
250
+ fn describe_watch_error_names_the_watch_limit_for_max_files_watch_on_inotify() {
251
+ let err = max_files_watch_error();
252
+ let msg = describe_watch_error(&err, true);
253
+ assert!(msg.starts_with(&err.to_string()), "{msg}");
254
+ assert!(msg.contains("inotify watch limit"), "{msg}");
255
+ assert!(msg.contains("fs.inotify.max_user_watches"), "{msg}");
256
+ }
257
+
258
+ #[test]
259
+ fn describe_watch_error_leaves_emfile_alone_off_inotify() {
260
+ let err = io_error(24);
261
+ assert_eq!(describe_watch_error(&err, false), err.to_string());
262
+ }
263
+
264
+ #[test]
265
+ fn describe_watch_error_leaves_other_errors_alone() {
266
+ let other_io = io_error(2);
267
+ assert_eq!(describe_watch_error(&other_io, true), other_io.to_string());
268
+ let not_found = path_not_found_error();
269
+ assert_eq!(
270
+ describe_watch_error(&not_found, true),
271
+ not_found.to_string()
272
+ );
273
+ }
274
+
203
275
  #[test]
204
276
  fn translate_event_maps_create() {
205
277
  let results = translate_event(&create_event(vec![PathBuf::from("/tmp/test.txt")]));
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes