dirsql 0.4.111__tar.gz → 0.4.112__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 (445) hide show
  1. {dirsql-0.4.111 → dirsql-0.4.112}/Cargo.lock +2 -2
  2. {dirsql-0.4.111 → dirsql-0.4.112}/PKG-INFO +1 -1
  3. {dirsql-0.4.111 → dirsql-0.4.112}/docs/reference/cli.md +34 -6
  4. {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/Cargo.toml +1 -1
  5. {dirsql-0.4.111/packages/rust → dirsql-0.4.112/packages/python}/docs/reference/cli.md +34 -6
  6. dirsql-0.4.112/packages/python/e2e-attestations/bot-1487-frontend-query-1011.json +7 -0
  7. dirsql-0.4.112/packages/python/e2e-attestations/bot-1488-frontend-metadata-1011.json +7 -0
  8. dirsql-0.4.112/packages/python/e2e-attestations/bot-1504-bench-names-1011.json +7 -0
  9. dirsql-0.4.112/packages/python/e2e-attestations/bot-speed-gap-childpath-1011.json +7 -0
  10. dirsql-0.4.112/packages/python/e2e-attestations/bot-speed-parse-overlap-1011.json +7 -0
  11. dirsql-0.4.112/packages/python/e2e-attestations/bot-speed-parse-pragmas-1011.json +7 -0
  12. dirsql-0.4.112/packages/python/e2e-attestations/bot-speed-walk-components-1011.json +7 -0
  13. dirsql-0.4.112/packages/python/e2e-attestations/bot-speed-walk-rowpath-1011.json +7 -0
  14. {dirsql-0.4.111 → dirsql-0.4.112}/packages/rust/Cargo.toml +1 -1
  15. {dirsql-0.4.111/packages/python → dirsql-0.4.112/packages/rust}/docs/reference/cli.md +34 -6
  16. {dirsql-0.4.111 → dirsql-0.4.112}/packages/rust/src/cli/frontend.html +20 -0
  17. dirsql-0.4.112/packages/rust/src/cli/frontend.js +161 -0
  18. {dirsql-0.4.111 → dirsql-0.4.112}/packages/rust/src/cli/router.rs +55 -1
  19. {dirsql-0.4.111 → dirsql-0.4.112}/packages/rust/src/db.rs +171 -4
  20. {dirsql-0.4.111 → dirsql-0.4.112}/packages/rust/src/lib.rs +194 -50
  21. {dirsql-0.4.111 → dirsql-0.4.112}/packages/rust/src/matcher.rs +70 -9
  22. {dirsql-0.4.111 → dirsql-0.4.112}/packages/rust/src/on_file.rs +211 -74
  23. {dirsql-0.4.111 → dirsql-0.4.112}/packages/rust/src/scanner.rs +56 -5
  24. {dirsql-0.4.111 → dirsql-0.4.112}/packages/rust/src/vtab.rs +39 -8
  25. {dirsql-0.4.111 → dirsql-0.4.112}/packages/rust/src/vtab_scaffold.rs +59 -1
  26. {dirsql-0.4.111 → dirsql-0.4.112}/Cargo.toml +0 -0
  27. {dirsql-0.4.111 → dirsql-0.4.112}/README.md +0 -0
  28. {dirsql-0.4.111 → dirsql-0.4.112}/dirsql/__init__.py +0 -0
  29. {dirsql-0.4.111 → dirsql-0.4.112}/dirsql/_async.py +0 -0
  30. {dirsql-0.4.111 → dirsql-0.4.112}/dirsql/_dirsql.pyi +0 -0
  31. {dirsql-0.4.111 → dirsql-0.4.112}/dirsql/cli/__init__.py +0 -0
  32. {dirsql-0.4.111 → dirsql-0.4.112}/dirsql/cli/discover_plugins/__init__.py +0 -0
  33. {dirsql-0.4.111 → dirsql-0.4.112}/dirsql/cli/discover_plugins/discovered_fragments.py +0 -0
  34. {dirsql-0.4.111 → dirsql-0.4.112}/dirsql/cli/discover_plugins/discovery_disabled.py +0 -0
  35. {dirsql-0.4.111 → dirsql-0.4.112}/dirsql/cli/discover_plugins/fragment_path.py +0 -0
  36. {dirsql-0.4.111 → dirsql-0.4.112}/dirsql/cli/discover_plugins/with_discovered_plugins.py +0 -0
  37. {dirsql-0.4.111 → dirsql-0.4.112}/dirsql/cli/main.py +0 -0
  38. {dirsql-0.4.111 → dirsql-0.4.112}/dirsql/cli/resolve_config_extensions.py +0 -0
  39. {dirsql-0.4.111 → dirsql-0.4.112}/dirsql/plan_entry_path.py +0 -0
  40. {dirsql-0.4.111 → dirsql-0.4.112}/dirsql/py.typed +0 -0
  41. {dirsql-0.4.111 → dirsql-0.4.112}/dirsql/read_config.py +0 -0
  42. {dirsql-0.4.111 → dirsql-0.4.112}/dirsql/resolve_configs_extension_specs.py +0 -0
  43. {dirsql-0.4.111 → dirsql-0.4.112}/dirsql/resolve_extension.py +0 -0
  44. {dirsql-0.4.111 → dirsql-0.4.112}/dirsql/resolve_package.py +0 -0
  45. {dirsql-0.4.111 → dirsql-0.4.112}/docs/.claude/CLAUDE.md +0 -0
  46. {dirsql-0.4.111 → dirsql-0.4.112}/docs/.vitepress/config.ts +0 -0
  47. {dirsql-0.4.111 → dirsql-0.4.112}/docs/.vitepress/theme/index.ts +0 -0
  48. {dirsql-0.4.111 → dirsql-0.4.112}/docs/.vitepress/theme/lang.ts +0 -0
  49. {dirsql-0.4.111 → dirsql-0.4.112}/docs/AGENTS.md +0 -0
  50. {dirsql-0.4.111 → dirsql-0.4.112}/docs/context/.gitattributes +0 -0
  51. {dirsql-0.4.111 → dirsql-0.4.112}/docs/context/recipes.md +0 -0
  52. {dirsql-0.4.111 → dirsql-0.4.112}/docs/context/troubleshooting.md +0 -0
  53. {dirsql-0.4.111 → dirsql-0.4.112}/docs/context/usage.md +0 -0
  54. {dirsql-0.4.111 → dirsql-0.4.112}/docs/explanation.md +0 -0
  55. {dirsql-0.4.111 → dirsql-0.4.112}/docs/getting-started.md +0 -0
  56. {dirsql-0.4.111 → dirsql-0.4.112}/docs/howto/agent-skill.md +0 -0
  57. {dirsql-0.4.111 → dirsql-0.4.112}/docs/howto/columns-from-paths.md +0 -0
  58. {dirsql-0.4.111 → dirsql-0.4.112}/docs/howto/define-tables.md +0 -0
  59. {dirsql-0.4.111 → dirsql-0.4.112}/docs/howto/embed.md +0 -0
  60. {dirsql-0.4.111 → dirsql-0.4.112}/docs/howto/extract-from-contents.md +0 -0
  61. {dirsql-0.4.111 → dirsql-0.4.112}/docs/howto/load-extension.md +0 -0
  62. {dirsql-0.4.111 → dirsql-0.4.112}/docs/howto/parse-files-into-columns.md +0 -0
  63. {dirsql-0.4.111 → dirsql-0.4.112}/docs/howto/persist.md +0 -0
  64. {dirsql-0.4.111 → dirsql-0.4.112}/docs/howto/query-json.md +0 -0
  65. {dirsql-0.4.111 → dirsql-0.4.112}/docs/howto/query-without-config.md +0 -0
  66. {dirsql-0.4.111 → dirsql-0.4.112}/docs/howto/react-to-changes.md +0 -0
  67. {dirsql-0.4.111 → dirsql-0.4.112}/docs/howto/search-by-meaning.md +0 -0
  68. {dirsql-0.4.111 → dirsql-0.4.112}/docs/howto/search-indexes.md +0 -0
  69. {dirsql-0.4.111 → dirsql-0.4.112}/docs/howto/skip-files.md +0 -0
  70. {dirsql-0.4.111 → dirsql-0.4.112}/docs/howto/write-a-plugin.md +0 -0
  71. {dirsql-0.4.111 → dirsql-0.4.112}/docs/index.md +0 -0
  72. {dirsql-0.4.111 → dirsql-0.4.112}/docs/package.json +0 -0
  73. {dirsql-0.4.111 → dirsql-0.4.112}/docs/plugins.md +0 -0
  74. {dirsql-0.4.111 → dirsql-0.4.112}/docs/pnpm-lock.yaml +0 -0
  75. {dirsql-0.4.111 → dirsql-0.4.112}/docs/pnpm-workspace.yaml +0 -0
  76. {dirsql-0.4.111 → dirsql-0.4.112}/docs/reference/columns.md +0 -0
  77. {dirsql-0.4.111 → dirsql-0.4.112}/docs/reference/config.md +0 -0
  78. {dirsql-0.4.111 → dirsql-0.4.112}/docs/reference/glob.md +0 -0
  79. {dirsql-0.4.111 → dirsql-0.4.112}/docs/reference/hooks.md +0 -0
  80. {dirsql-0.4.111 → dirsql-0.4.112}/docs/reference/http-api.md +0 -0
  81. {dirsql-0.4.111 → dirsql-0.4.112}/docs/reference/path-tables.md +0 -0
  82. {dirsql-0.4.111 → dirsql-0.4.112}/docs/reference/sdk.md +0 -0
  83. {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/CHANGELOG.md +0 -0
  84. {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/MIGRATIONS.md +0 -0
  85. {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/README.md +0 -0
  86. {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/changelog.d/2026-07-13-drop-cwd-config-auto-detect.md +0 -0
  87. {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/changelog.d/2026-07-13-plugin-discovery.md +0 -0
  88. {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/changelog.d/2026-07-13-rename-extract-to-on-file.md +0 -0
  89. {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/changelog.d/2026-07-13-repeatable-config.md +0 -0
  90. {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/changelog.d/2026-07-13-sdk-default-baked-in-config.md +0 -0
  91. {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/changelog.d/2026-07-20-drop-implicit-files-table.md +0 -0
  92. {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/changelog.d/2026-07-21-remove-glob-captures.md +0 -0
  93. {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/changelog.d/2026-07-24-hookless-table-config-error.md +0 -0
  94. {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/changelog.d/2026-07-24-remove-stat-fact-injection.md +0 -0
  95. {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/changelog.d/2026-07-29-restore-python-310.md +0 -0
  96. {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/changelog.d/2026-08-02-release-profile.md +0 -0
  97. {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/changelog.d/2026-08-02-scan-failures.md +0 -0
  98. {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/changelog.d/2026-08-03-discovery-ext-resolution.md +0 -0
  99. {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/changelog.d/2026-08-03-manylinux-dynamic-binary.md +0 -0
  100. {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/changelog.d/2026-08-03-python-no-ignore.md +0 -0
  101. {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/changelog.d/2026-08-04-cast-lints.md +0 -0
  102. {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/changelog.d/2026-08-04-cli-in-process.md +0 -0
  103. {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/changelog.d/2026-08-20-curtaincall-dev-dependency.md +0 -0
  104. {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/changelog.d/2026-08-20-declared-table-name.md +0 -0
  105. {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/changelog.d/2026-09-04-config-paths-from-argv-module.md +0 -0
  106. {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/changelog.d/2026-09-05-config-extension-loader-split.md +0 -0
  107. {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/changelog.d/2026-09-05-resolve-config-extensions-split.md +0 -0
  108. {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/changelog.d/2026-09-05-resolve-extension-split.md +0 -0
  109. {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/changelog.d/2026-09-09-launcher-config-path-scan.md +0 -0
  110. {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/changelog.d/2026-09-17-extension-resolution-via-core.md +0 -0
  111. {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/changelog.d/2026-09-18-export-scan-failure.md +0 -0
  112. {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/changelog.d/2026-09-18-flatten-row-event-in-core.md +0 -0
  113. {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/changelog.d/2026-09-18-programmatic-extension-plan.md +0 -0
  114. {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/changelog.d/2026-09-20-sigint-ends-a-run-in-progress.md +0 -0
  115. {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/changelog.d/2026-09-24-query-rows-in-projection-order.md +0 -0
  116. {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/changelog.d/2026-10-02-readme-docs-host.md +0 -0
  117. {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/changelog.d/2026-10-03-one-glob-rule-for-config-globs.md +0 -0
  118. {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/changelog.d/2026-10-03-path-table-directory-one-level.md +0 -0
  119. {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/changelog.d/2026-10-04-path-table-dotfiles-hidden.md +0 -0
  120. {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/changelog.d/2026-10-05-brace-groups-follow-bash.md +0 -0
  121. {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/changelog.d/2026-10-05-cli-context.md +0 -0
  122. {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/changelog.d/2026-10-05-gitignore-requires-repo.md +0 -0
  123. {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/changelog.d/2026-10-05-path-table-node-modules-named.md +0 -0
  124. {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/changelog.d/2026-10-05-path-table-symlinks.md +0 -0
  125. {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/changelog.d/2026-10-05-path-table-trailing-slash.md +0 -0
  126. {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/changelog.d/2026-10-05-unbalanced-brackets-literal.md +0 -0
  127. {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/changelog.d/2026-10-06-config-braces.md +0 -0
  128. {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/changelog.d/2026-10-06-config-directory.md +0 -0
  129. {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/changelog.d/2026-10-06-config-dotnames.md +0 -0
  130. {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/changelog.d/2026-10-06-config-gitignore.md +0 -0
  131. {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/changelog.d/2026-10-06-config-globs-anchor-at-the-config.md +0 -0
  132. {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/changelog.d/2026-10-06-config-links.md +0 -0
  133. {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/changelog.d/2026-10-06-one-glob-compiler.md +0 -0
  134. {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/changelog.d/2026-10-06-plugin-no-default-records.md +0 -0
  135. {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/changelog.d/2026-10-06-watch-broadcast.md +0 -0
  136. {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/changelog.d/2026-10-06-zero-match-config-table-warning.md +0 -0
  137. {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/changelog.d/2026-10-07-bracket-slash-literal.md +0 -0
  138. {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/changelog.d/2026-10-07-dotdot-and-double-slashes.md +0 -0
  139. {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/changelog.d/2026-10-07-dotdot-as-written.md +0 -0
  140. {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/changelog.d/2026-10-07-glob-walks-node-modules.md +0 -0
  141. {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/changelog.d/2026-10-07-literal-gitignore.md +0 -0
  142. {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/changelog.d/2026-10-07-on-file-ndjson.md +0 -0
  143. {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/changelog.d/2026-10-07-parallel-hooks.md +0 -0
  144. {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/changelog.d/2026-10-07-persist-cache-outside-root.md +0 -0
  145. {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/changelog.d/2026-10-07-posix-classes-unicode.md +0 -0
  146. {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/changelog.d/2026-10-07-spread-few-large-files.md +0 -0
  147. {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/changelog.d/2026-10-08-small-walks-stay-on-one-thread.md +0 -0
  148. {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/changelog.d/2026-10-08-watch-requires-named-table.md +0 -0
  149. {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/changelog.d/README.md +0 -0
  150. {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/conftest.py +0 -0
  151. {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/docs/.claude/CLAUDE.md +0 -0
  152. {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/docs/.vitepress/config.ts +0 -0
  153. {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/docs/.vitepress/theme/index.ts +0 -0
  154. {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/docs/.vitepress/theme/lang.ts +0 -0
  155. {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/docs/AGENTS.md +0 -0
  156. {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/docs/context/.gitattributes +0 -0
  157. {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/docs/context/recipes.md +0 -0
  158. {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/docs/context/troubleshooting.md +0 -0
  159. {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/docs/context/usage.md +0 -0
  160. {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/docs/explanation.md +0 -0
  161. {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/docs/getting-started.md +0 -0
  162. {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/docs/howto/agent-skill.md +0 -0
  163. {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/docs/howto/columns-from-paths.md +0 -0
  164. {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/docs/howto/define-tables.md +0 -0
  165. {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/docs/howto/embed.md +0 -0
  166. {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/docs/howto/extract-from-contents.md +0 -0
  167. {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/docs/howto/load-extension.md +0 -0
  168. {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/docs/howto/parse-files-into-columns.md +0 -0
  169. {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/docs/howto/persist.md +0 -0
  170. {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/docs/howto/query-json.md +0 -0
  171. {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/docs/howto/query-without-config.md +0 -0
  172. {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/docs/howto/react-to-changes.md +0 -0
  173. {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/docs/howto/search-by-meaning.md +0 -0
  174. {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/docs/howto/search-indexes.md +0 -0
  175. {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/docs/howto/skip-files.md +0 -0
  176. {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/docs/howto/write-a-plugin.md +0 -0
  177. {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/docs/index.md +0 -0
  178. {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/docs/package.json +0 -0
  179. {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/docs/plugins.md +0 -0
  180. {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/docs/pnpm-lock.yaml +0 -0
  181. {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/docs/pnpm-workspace.yaml +0 -0
  182. {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/docs/reference/columns.md +0 -0
  183. {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/docs/reference/config.md +0 -0
  184. {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/docs/reference/glob.md +0 -0
  185. {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/docs/reference/hooks.md +0 -0
  186. {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/docs/reference/http-api.md +0 -0
  187. {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/docs/reference/path-tables.md +0 -0
  188. {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/docs/reference/sdk.md +0 -0
  189. {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/e2e-attestations/bot-1334-listing-exemptions.json +0 -0
  190. {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/e2e-attestations/bot-1397-watch-broadcast.json +0 -0
  191. {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/e2e-attestations/bot-1398-inotify-error.json +0 -0
  192. {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/e2e-attestations/bot-1399-server-cors.json +0 -0
  193. {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/e2e-attestations/bot-1401-watch-scope.json +0 -0
  194. {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/e2e-attestations/bot-1406-watch-no-tables-1008.json +0 -0
  195. {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/e2e-attestations/bot-1407-child-place-depth.json +0 -0
  196. {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/e2e-attestations/bot-1414-stat-speed.json +0 -0
  197. {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/e2e-attestations/bot-1415-server-speed.json +0 -0
  198. {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/e2e-attestations/bot-1416-watch-speed-1008.json +0 -0
  199. {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/e2e-attestations/bot-1418-node-modules.json +0 -0
  200. {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/e2e-attestations/bot-1419-dotdot-slashes.json +0 -0
  201. {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/e2e-attestations/bot-1420-bracket-slash.json +0 -0
  202. {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/e2e-attestations/bot-1421-posix-unicode.json +0 -0
  203. {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/e2e-attestations/bot-1422-literal-gitignore.json +0 -0
  204. {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/e2e-attestations/bot-1426-walk-spawn-threshold-1008.json +0 -0
  205. {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/e2e-attestations/bot-1428-ndjson-hooks.json +0 -0
  206. {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/e2e-attestations/bot-1429-parallel-hooks.json +0 -0
  207. {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/e2e-attestations/bot-1430-dotdot-as-written.json +0 -0
  208. {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/e2e-attestations/bot-1431-persist-cache-dir.json +0 -0
  209. {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/e2e-attestations/bot-1437-test-cache-isolation.json +0 -0
  210. {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/e2e-attestations/bot-1440-fix-main-build.json +0 -0
  211. {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/e2e-attestations/bot-1448-wildcard-ignored-prefix.json +0 -0
  212. {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/e2e-attestations/bot-1451-named-dir-never-hidden.json +0 -0
  213. {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/e2e-attestations/bot-1454-split-few-files.json +0 -0
  214. {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/e2e-attestations/bot-1457-incremental-refresh-1008.json +0 -0
  215. {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/e2e-attestations/bot-1459-rescan-on-overflow-1008.json +0 -0
  216. {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/e2e-attestations/bot-1461-row-footprint-1008.json +0 -0
  217. {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/e2e-attestations/bot-1462-paired-speed-harness-1008.json +0 -0
  218. {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/e2e-attestations/bot-1464-fastest-native-1008.json +0 -0
  219. {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/e2e-attestations/bot-1469-ci-speed-sanity-1009.json +0 -0
  220. {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/e2e-attestations/bot-1470-perf-suite-1009.json +0 -0
  221. {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/e2e-attestations/bot-1503-bench-watch-1011.json +0 -0
  222. {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/e2e-attestations/bot-fix-main-place-depth-20261007.json +0 -0
  223. {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/e2e-attestations/bot-issue-1486-frontend-20261009.json +0 -0
  224. {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/e2e-attestations/bot-speed-parse-paths-1009.json +0 -0
  225. {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/e2e-attestations/bot-speed-walk-sched-1009.json +0 -0
  226. {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/e2e-attestations/cc-keen-knuth-f11gyq.json +0 -0
  227. {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/e2e-attestations/claude-1056-py-ofpf9.json +0 -0
  228. {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/e2e-attestations/claude-1066-p1-resolve-extension.json +0 -0
  229. {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/e2e-attestations/claude-1078-argv-config-paths-core.json +0 -0
  230. {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/e2e-attestations/claude-1079-p2-resolve-config-extensions.json +0 -0
  231. {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/e2e-attestations/claude-1080-share-vtab-scaffolding.json +0 -0
  232. {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/e2e-attestations/claude-1081-indicatif-progress.json +0 -0
  233. {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/e2e-attestations/claude-1096-watch-moved-dir.json +0 -0
  234. {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/e2e-attestations/claude-1109-watch-moved-out.json +0 -0
  235. {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/e2e-attestations/claude-1119-ext-plan.json +0 -0
  236. {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/e2e-attestations/claude-1120-py-ext.json +0 -0
  237. {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/e2e-attestations/claude-1122-ext-cleanup.json +0 -0
  238. {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/e2e-attestations/claude-1130-codec-crates.json +0 -0
  239. {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/e2e-attestations/claude-1131-flatten-row-event.json +0 -0
  240. {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/e2e-attestations/claude-1139-sse-flatten.json +0 -0
  241. {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/e2e-attestations/claude-1140-scan-failure-export.json +0 -0
  242. {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/e2e-attestations/claude-1148-clippy-all-targets.json +0 -0
  243. {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/e2e-attestations/claude-1164-sigint-fatal.json +0 -0
  244. {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/e2e-attestations/claude-1170-projection-order.json +0 -0
  245. {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/e2e-attestations/claude-1172-on-file-path.json +0 -0
  246. {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/e2e-attestations/claude-1173-py-projection-order.json +0 -0
  247. {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/e2e-attestations/claude-1184-win-rel-paths.json +0 -0
  248. {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/e2e-attestations/claude-1185-win-abs-table-names.json +0 -0
  249. {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/e2e-attestations/claude-1186-win-test-harness.json +0 -0
  250. {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/e2e-attestations/claude-1196-join-index.json +0 -0
  251. {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/e2e-attestations/claude-1199-glob-prefix.json +0 -0
  252. {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/e2e-attestations/claude-1201-single-walk.json +0 -0
  253. {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/e2e-attestations/claude-1204-embed-batch.json +0 -0
  254. {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/e2e-attestations/claude-1207-win-argv-quote.json +0 -0
  255. {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/e2e-attestations/claude-1208-win-nonverbatim-paths.json +0 -0
  256. {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/e2e-attestations/claude-1215-on-file-batch.json +0 -0
  257. {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/e2e-attestations/claude-1216-on-file-cleanup.json +0 -0
  258. {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/e2e-attestations/claude-1223-config-glob-rule.json +0 -0
  259. {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/e2e-attestations/claude-1223-dir-one-level.json +0 -0
  260. {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/e2e-attestations/claude-1225-plugin-no-default.json +0 -0
  261. {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/e2e-attestations/claude-1226-stale-docs.json +0 -0
  262. {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/e2e-attestations/claude-1232-anchor-plumbing.json +0 -0
  263. {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/e2e-attestations/claude-1232-config-anchor.json +0 -0
  264. {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/e2e-attestations/claude-1232-multi-watch.json +0 -0
  265. {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/e2e-attestations/claude-1232-zero-match.json +0 -0
  266. {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/e2e-attestations/claude-1238-parallel-walk.json +0 -0
  267. {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/e2e-attestations/claude-1241-content-prefetch.json +0 -0
  268. {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/e2e-attestations/claude-1243-ingest-perf.json +0 -0
  269. {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/e2e-attestations/claude-1249-dotfiles.json +0 -0
  270. {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/e2e-attestations/claude-1256-symlinks.json +0 -0
  271. {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/e2e-attestations/claude-1257-trailing-slash.json +0 -0
  272. {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/e2e-attestations/claude-1258-config-braces.json +0 -0
  273. {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/e2e-attestations/claude-1258-config-directory.json +0 -0
  274. {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/e2e-attestations/claude-1258-config-dotnames.json +0 -0
  275. {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/e2e-attestations/claude-1258-config-gitignore.json +0 -0
  276. {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/e2e-attestations/claude-1258-config-links.json +0 -0
  277. {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/e2e-attestations/claude-1258-one-pattern.json +0 -0
  278. {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/e2e-attestations/claude-1262-brace-literal.json +0 -0
  279. {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/e2e-attestations/claude-1264-context.json +0 -0
  280. {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/e2e-attestations/claude-1267-posix-classes.json +0 -0
  281. {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/e2e-attestations/claude-1268-unbalanced-brackets.json +0 -0
  282. {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/e2e-attestations/claude-1269-utf8-chars.json +0 -0
  283. {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/e2e-attestations/claude-1271-node-modules-named.json +0 -0
  284. {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/e2e-attestations/claude-1272-ancestor-gitignore.json +0 -0
  285. {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/e2e-attestations/claude-1273-walk-prune.json +0 -0
  286. {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/e2e-attestations/claude-1285-ingest-fast.json +0 -0
  287. {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/e2e-attestations/claude-1286-nested-repo.json +0 -0
  288. {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/e2e-attestations/claude-1305-glob-speed.json +0 -0
  289. {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/e2e-attestations/claude-1308-glob-speed.json +0 -0
  290. {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/e2e-attestations/claude-1310-glob-speed.json +0 -0
  291. {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/e2e-attestations/claude-1311-glob-speed.json +0 -0
  292. {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/e2e-attestations/claude-1312-glob-speed.json +0 -0
  293. {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/e2e-attestations/claude-1318-lazy-stat.json +0 -0
  294. {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/e2e-attestations/claude-1320-walk-speed.json +0 -0
  295. {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/e2e-attestations/claude-1322-walk-readdir.json +0 -0
  296. {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/e2e-attestations/claude-1325-parallel-walk.json +0 -0
  297. {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/e2e-attestations/claude-1326-stream-rows.json +0 -0
  298. {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/e2e-attestations/claude-1330-python-dirsql-patch.json +0 -0
  299. {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/e2e-attestations/claude-1330-python-extensions-patch.json +0 -0
  300. {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/e2e-attestations/claude-1330-scanner-effects.json +0 -0
  301. {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/e2e-attestations/claude-1330-scanner-gitignore.json +0 -0
  302. {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/e2e-attestations/claude-1330-vtab-prefetch-flag.json +0 -0
  303. {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/e2e-attestations/claude-1330-vtab-read.json +0 -0
  304. {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/e2e-attestations/claude-1351-dot-dirs.json +0 -0
  305. {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/e2e-attestations/claude-819-oneshot-timeout.json +0 -0
  306. {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/e2e-attestations/claude-827-unquote-doubled-quotes.json +0 -0
  307. {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/e2e-attestations/claude-epic-953-slice2-reedline.json +0 -0
  308. {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/e2e-attestations/claude-epic-953-slice3-format.json +0 -0
  309. {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/e2e-attestations/claude-epic-953-stacked-prs-x59wm3.json +0 -0
  310. {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/e2e-attestations/claude-github-issue-825-e4mhhp.json +0 -0
  311. {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/e2e-attestations/claude-issue-951-0eease.json +0 -0
  312. {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/e2e-attestations/claude-issue-962-0jjrfv.json +0 -0
  313. {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/e2e-attestations/claude-issue-986-red-test-e7sjrb.json +0 -0
  314. {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/e2e-attestations/claude-tackle-1034-cachesplit.json +0 -0
  315. {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/e2e-attestations/claude-tackle-1042-py12.json +0 -0
  316. {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/e2e-attestations/claude-tackle-956-xzen74.json +0 -0
  317. {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/e2e-attestations/claude-tackle-957-lrm0z6-worker-calls.json +0 -0
  318. {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/e2e-attestations/claude-tackle-957-lrm0z6.json +0 -0
  319. {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/e2e-attestations/claude-tackle-975-n8mc2h.json +0 -0
  320. {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/migrations.d/2026-07-13-drop-cwd-config-auto-detect.md +0 -0
  321. {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/migrations.d/2026-07-13-rename-extract-to-on-file.md +0 -0
  322. {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/migrations.d/2026-07-13-sdk-default-baked-in-config.md +0 -0
  323. {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/migrations.d/2026-07-20-drop-implicit-files-table.md +0 -0
  324. {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/migrations.d/2026-07-21-remove-glob-captures.md +0 -0
  325. {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/migrations.d/2026-07-24-hookless-table-config-error.md +0 -0
  326. {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/migrations.d/2026-07-24-remove-stat-fact-injection.md +0 -0
  327. {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/migrations.d/2026-07-29-restore-python-310.md +0 -0
  328. {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/migrations.d/2026-08-04-cli-in-process.md +0 -0
  329. {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/migrations.d/2026-08-20-declared-table-name.md +0 -0
  330. {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/migrations.d/2026-09-20-sigint-ends-a-run-in-progress.md +0 -0
  331. {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/migrations.d/2026-09-24-query-rows-in-projection-order.md +0 -0
  332. {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/migrations.d/2026-10-02-readme-docs-host.md +0 -0
  333. {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/migrations.d/2026-10-03-one-glob-rule-for-config-globs.md +0 -0
  334. {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/migrations.d/2026-10-03-path-table-directory-one-level.md +0 -0
  335. {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/migrations.d/2026-10-04-path-table-dotfiles-hidden.md +0 -0
  336. {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/migrations.d/2026-10-05-brace-groups-follow-bash.md +0 -0
  337. {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/migrations.d/2026-10-05-cli-context.md +0 -0
  338. {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/migrations.d/2026-10-05-gitignore-requires-repo.md +0 -0
  339. {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/migrations.d/2026-10-05-path-table-node-modules-named.md +0 -0
  340. {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/migrations.d/2026-10-05-path-table-symlinks.md +0 -0
  341. {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/migrations.d/2026-10-05-path-table-trailing-slash.md +0 -0
  342. {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/migrations.d/2026-10-05-unbalanced-brackets-literal.md +0 -0
  343. {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/migrations.d/2026-10-06-config-braces.md +0 -0
  344. {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/migrations.d/2026-10-06-config-directory.md +0 -0
  345. {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/migrations.d/2026-10-06-config-dotnames.md +0 -0
  346. {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/migrations.d/2026-10-06-config-gitignore.md +0 -0
  347. {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/migrations.d/2026-10-06-config-globs-anchor-at-the-config.md +0 -0
  348. {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/migrations.d/2026-10-06-config-links.md +0 -0
  349. {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/migrations.d/2026-10-06-one-glob-compiler.md +0 -0
  350. {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/migrations.d/2026-10-06-plugin-no-default-records.md +0 -0
  351. {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/migrations.d/2026-10-06-watch-broadcast.md +0 -0
  352. {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/migrations.d/2026-10-06-zero-match-config-table-warning.md +0 -0
  353. {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/migrations.d/2026-10-07-bracket-slash-literal.md +0 -0
  354. {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/migrations.d/2026-10-07-dotdot-and-double-slashes.md +0 -0
  355. {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/migrations.d/2026-10-07-dotdot-as-written.md +0 -0
  356. {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/migrations.d/2026-10-07-glob-walks-node-modules.md +0 -0
  357. {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/migrations.d/2026-10-07-literal-gitignore.md +0 -0
  358. {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/migrations.d/2026-10-07-on-file-ndjson.md +0 -0
  359. {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/migrations.d/2026-10-07-parallel-hooks.md +0 -0
  360. {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/migrations.d/2026-10-07-persist-cache-outside-root.md +0 -0
  361. {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/migrations.d/2026-10-07-posix-classes-unicode.md +0 -0
  362. {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/migrations.d/2026-10-07-spread-few-large-files.md +0 -0
  363. {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/migrations.d/2026-10-08-small-walks-stay-on-one-thread.md +0 -0
  364. {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/migrations.d/2026-10-08-watch-requires-named-table.md +0 -0
  365. {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/migrations.d/README.md +0 -0
  366. {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/src/lib.rs +0 -0
  367. {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/testing-conventions.toml +0 -0
  368. {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/tests/__init__.py +0 -0
  369. {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/tests/conftest.py +0 -0
  370. {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/tests/e2e/__init__.py +0 -0
  371. {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/tests/e2e/bench_report.py +0 -0
  372. {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/tests/e2e/bench_suite.py +0 -0
  373. {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/tests/e2e/fixtures/dirsql_plugin_fixture/__init__.py +0 -0
  374. {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/tests/e2e/fixtures/dirsql_plugin_fixture/dirsql.toml +0 -0
  375. {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/tests/e2e/speed_of_light.py +0 -0
  376. {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/tests/integration/__init__.py +0 -0
  377. {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/tests/integration/binding/__init__.py +0 -0
  378. {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/tests/integration/hermetic/__init__.py +0 -0
  379. {dirsql-0.4.111 → dirsql-0.4.112}/packages/rust/CHANGELOG.md +0 -0
  380. {dirsql-0.4.111 → dirsql-0.4.112}/packages/rust/MIGRATIONS.md +0 -0
  381. {dirsql-0.4.111 → dirsql-0.4.112}/packages/rust/README.md +0 -0
  382. {dirsql-0.4.111 → dirsql-0.4.112}/packages/rust/benches/db_bench.rs +0 -0
  383. {dirsql-0.4.111 → dirsql-0.4.112}/packages/rust/benches/differ_bench.rs +0 -0
  384. {dirsql-0.4.111 → dirsql-0.4.112}/packages/rust/benches/matcher_bench.rs +0 -0
  385. {dirsql-0.4.111 → dirsql-0.4.112}/packages/rust/benches/scanner_bench.rs +0 -0
  386. {dirsql-0.4.111 → dirsql-0.4.112}/packages/rust/docs/context/.gitattributes +0 -0
  387. {dirsql-0.4.111 → dirsql-0.4.112}/packages/rust/docs/context/recipes.md +0 -0
  388. {dirsql-0.4.111 → dirsql-0.4.112}/packages/rust/docs/context/troubleshooting.md +0 -0
  389. {dirsql-0.4.111 → dirsql-0.4.112}/packages/rust/docs/context/usage.md +0 -0
  390. {dirsql-0.4.111 → dirsql-0.4.112}/packages/rust/docs/explanation.md +0 -0
  391. {dirsql-0.4.111 → dirsql-0.4.112}/packages/rust/docs/getting-started.md +0 -0
  392. {dirsql-0.4.111 → dirsql-0.4.112}/packages/rust/docs/howto/agent-skill.md +0 -0
  393. {dirsql-0.4.111 → dirsql-0.4.112}/packages/rust/docs/howto/columns-from-paths.md +0 -0
  394. {dirsql-0.4.111 → dirsql-0.4.112}/packages/rust/docs/howto/define-tables.md +0 -0
  395. {dirsql-0.4.111 → dirsql-0.4.112}/packages/rust/docs/howto/embed.md +0 -0
  396. {dirsql-0.4.111 → dirsql-0.4.112}/packages/rust/docs/howto/extract-from-contents.md +0 -0
  397. {dirsql-0.4.111 → dirsql-0.4.112}/packages/rust/docs/howto/load-extension.md +0 -0
  398. {dirsql-0.4.111 → dirsql-0.4.112}/packages/rust/docs/howto/parse-files-into-columns.md +0 -0
  399. {dirsql-0.4.111 → dirsql-0.4.112}/packages/rust/docs/howto/persist.md +0 -0
  400. {dirsql-0.4.111 → dirsql-0.4.112}/packages/rust/docs/howto/query-json.md +0 -0
  401. {dirsql-0.4.111 → dirsql-0.4.112}/packages/rust/docs/howto/query-without-config.md +0 -0
  402. {dirsql-0.4.111 → dirsql-0.4.112}/packages/rust/docs/howto/react-to-changes.md +0 -0
  403. {dirsql-0.4.111 → dirsql-0.4.112}/packages/rust/docs/howto/search-by-meaning.md +0 -0
  404. {dirsql-0.4.111 → dirsql-0.4.112}/packages/rust/docs/howto/search-indexes.md +0 -0
  405. {dirsql-0.4.111 → dirsql-0.4.112}/packages/rust/docs/howto/skip-files.md +0 -0
  406. {dirsql-0.4.111 → dirsql-0.4.112}/packages/rust/docs/howto/write-a-plugin.md +0 -0
  407. {dirsql-0.4.111 → dirsql-0.4.112}/packages/rust/docs/index.md +0 -0
  408. {dirsql-0.4.111 → dirsql-0.4.112}/packages/rust/docs/plugins.md +0 -0
  409. {dirsql-0.4.111 → dirsql-0.4.112}/packages/rust/docs/reference/columns.md +0 -0
  410. {dirsql-0.4.111 → dirsql-0.4.112}/packages/rust/docs/reference/config.md +0 -0
  411. {dirsql-0.4.111 → dirsql-0.4.112}/packages/rust/docs/reference/glob.md +0 -0
  412. {dirsql-0.4.111 → dirsql-0.4.112}/packages/rust/docs/reference/hooks.md +0 -0
  413. {dirsql-0.4.111 → dirsql-0.4.112}/packages/rust/docs/reference/http-api.md +0 -0
  414. {dirsql-0.4.111 → dirsql-0.4.112}/packages/rust/docs/reference/path-tables.md +0 -0
  415. {dirsql-0.4.111 → dirsql-0.4.112}/packages/rust/docs/reference/sdk.md +0 -0
  416. {dirsql-0.4.111 → dirsql-0.4.112}/packages/rust/src/bin/dirsql.rs +0 -0
  417. {dirsql-0.4.111 → dirsql-0.4.112}/packages/rust/src/brace.rs +0 -0
  418. {dirsql-0.4.111 → dirsql-0.4.112}/packages/rust/src/cli/context.rs +0 -0
  419. {dirsql-0.4.111 → dirsql-0.4.112}/packages/rust/src/cli/execute.rs +0 -0
  420. {dirsql-0.4.111 → dirsql-0.4.112}/packages/rust/src/cli/init.rs +0 -0
  421. {dirsql-0.4.111 → dirsql-0.4.112}/packages/rust/src/cli/mod.rs +0 -0
  422. {dirsql-0.4.111 → dirsql-0.4.112}/packages/rust/src/cli/repl.rs +0 -0
  423. {dirsql-0.4.111 → dirsql-0.4.112}/packages/rust/src/cli/run.rs +0 -0
  424. {dirsql-0.4.111 → dirsql-0.4.112}/packages/rust/src/cli/serialize.rs +0 -0
  425. {dirsql-0.4.111 → dirsql-0.4.112}/packages/rust/src/cli/server.rs +0 -0
  426. {dirsql-0.4.111 → dirsql-0.4.112}/packages/rust/src/cli/table.rs +0 -0
  427. {dirsql-0.4.111 → dirsql-0.4.112}/packages/rust/src/command.rs +0 -0
  428. {dirsql-0.4.111 → dirsql-0.4.112}/packages/rust/src/config.rs +0 -0
  429. {dirsql-0.4.111 → dirsql-0.4.112}/packages/rust/src/default_config.toml +0 -0
  430. {dirsql-0.4.111 → dirsql-0.4.112}/packages/rust/src/differ.rs +0 -0
  431. {dirsql-0.4.111 → dirsql-0.4.112}/packages/rust/src/extension_resolution.rs +0 -0
  432. {dirsql-0.4.111 → dirsql-0.4.112}/packages/rust/src/functions.rs +0 -0
  433. {dirsql-0.4.111 → dirsql-0.4.112}/packages/rust/src/infer.rs +0 -0
  434. {dirsql-0.4.111 → dirsql-0.4.112}/packages/rust/src/launcher.rs +0 -0
  435. {dirsql-0.4.111 → dirsql-0.4.112}/packages/rust/src/listing.rs +0 -0
  436. {dirsql-0.4.111 → dirsql-0.4.112}/packages/rust/src/parsed_vtab.rs +0 -0
  437. {dirsql-0.4.111 → dirsql-0.4.112}/packages/rust/src/path_table.rs +0 -0
  438. {dirsql-0.4.111 → dirsql-0.4.112}/packages/rust/src/persist.rs +0 -0
  439. {dirsql-0.4.111 → dirsql-0.4.112}/packages/rust/src/posix_class.rs +0 -0
  440. {dirsql-0.4.111 → dirsql-0.4.112}/packages/rust/src/progress.rs +0 -0
  441. {dirsql-0.4.111 → dirsql-0.4.112}/packages/rust/src/row_event_flat.rs +0 -0
  442. {dirsql-0.4.111 → dirsql-0.4.112}/packages/rust/src/sql_literal.rs +0 -0
  443. {dirsql-0.4.111 → dirsql-0.4.112}/packages/rust/src/tree_walk.rs +0 -0
  444. {dirsql-0.4.111 → dirsql-0.4.112}/packages/rust/src/watcher.rs +0 -0
  445. {dirsql-0.4.111 → dirsql-0.4.112}/pyproject.toml +0 -0
@@ -573,7 +573,7 @@ dependencies = [
573
573
 
574
574
  [[package]]
575
575
  name = "dirsql"
576
- version = "0.4.111"
576
+ version = "0.4.112"
577
577
  dependencies = [
578
578
  "assert_cmd",
579
579
  "axum",
@@ -625,7 +625,7 @@ dependencies = [
625
625
 
626
626
  [[package]]
627
627
  name = "dirsql-py-ext"
628
- version = "0.4.111"
628
+ version = "0.4.112"
629
629
  dependencies = [
630
630
  "dirsql",
631
631
  "pyo3",
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: dirsql
3
- Version: 0.4.111
3
+ Version: 0.4.112
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
@@ -240,18 +240,46 @@ requests, closes open `/events` streams, and exits.
240
240
  Pass `--frontend` to serve the bundled dirsql SQL explorer shell at `/` on
241
241
  the same origin as the HTTP API. It works offline and prints `Frontend at
242
242
  http://<host>:<actual-port>/` without opening a browser. With `--port 0`, the
243
- printed URL uses the assigned port. The initial shell shows server status;
244
- query controls are coming in a subsequent update.
243
+ printed URL uses the assigned port. The page offers an editable SQL box
244
+ holding the starter query `SELECT * FROM './' LIMIT 100`. Nothing runs until
245
+ you press **Run** (or Ctrl/Cmd+Enter); pressing it again refreshes the
246
+ result. Queries go through `POST /query`, so the read-only rule applies, and
247
+ run exactly as written. The page shows elapsed time, the number of rows
248
+ returned, and errors. Values render as text (`NULL` is marked), and only the
249
+ first 1000 rows are displayed. An empty result says so and shows no column
250
+ names, since the response carries none.
245
251
 
246
252
  ```bash
247
253
  dirsql server --frontend
248
254
  dirsql server --frontend -c .dirsql.toml
249
255
  ```
250
256
 
251
- The shell reads `GET /frontend/state`: `{"error":null}` when the index is
252
- ready, or HTTP `503` with `{"error":"<diagnostic>"}` when config loading
253
- fails. Fix the config and restart the server. Without `--frontend`, the `/`
254
- and `/frontend/state` routes return `404`.
257
+ The shell reads `GET /frontend/state`. When the index is ready it returns
258
+ HTTP `200`:
259
+
260
+ ```json
261
+ {
262
+ "error": null,
263
+ "root": "/abs/path/of/the/invocation/directory",
264
+ "tables": [
265
+ {"name": "posts", "columns": [{"name": "basename", "type": "TEXT"}]}
266
+ ]
267
+ }
268
+ ```
269
+
270
+ `root` is the query root, where [path-tables](./path-tables.md) resolve.
271
+ `tables` lists the declared tables, ordered by name, each with its columns in
272
+ declaration order and the declared SQLite type (`""` when untyped). Empty
273
+ tables are listed. A configless server, or a config with only functions or
274
+ extensions, returns `"tables": []`. dirsql's bookkeeping tables, SQLite's own
275
+ tables, virtual tables with their shadow tables, and path-tables are never
276
+ listed. The metadata is read from SQLite's catalog: no file is parsed, no
277
+ directory walked, no table counted.
278
+
279
+ When config loading fails the endpoint returns HTTP `503` with
280
+ `{"error":"<diagnostic>"}` and no `root` or `tables`. Fix the config and
281
+ restart the server. Without `--frontend`, the `/` and `/frontend/state`
282
+ routes return `404`. `POST /query` is unchanged.
255
283
 
256
284
  ### Flags
257
285
 
@@ -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.111"
7
+ version = "0.4.112"
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
@@ -240,18 +240,46 @@ requests, closes open `/events` streams, and exits.
240
240
  Pass `--frontend` to serve the bundled dirsql SQL explorer shell at `/` on
241
241
  the same origin as the HTTP API. It works offline and prints `Frontend at
242
242
  http://<host>:<actual-port>/` without opening a browser. With `--port 0`, the
243
- printed URL uses the assigned port. The initial shell shows server status;
244
- query controls are coming in a subsequent update.
243
+ printed URL uses the assigned port. The page offers an editable SQL box
244
+ holding the starter query `SELECT * FROM './' LIMIT 100`. Nothing runs until
245
+ you press **Run** (or Ctrl/Cmd+Enter); pressing it again refreshes the
246
+ result. Queries go through `POST /query`, so the read-only rule applies, and
247
+ run exactly as written. The page shows elapsed time, the number of rows
248
+ returned, and errors. Values render as text (`NULL` is marked), and only the
249
+ first 1000 rows are displayed. An empty result says so and shows no column
250
+ names, since the response carries none.
245
251
 
246
252
  ```bash
247
253
  dirsql server --frontend
248
254
  dirsql server --frontend -c .dirsql.toml
249
255
  ```
250
256
 
251
- The shell reads `GET /frontend/state`: `{"error":null}` when the index is
252
- ready, or HTTP `503` with `{"error":"<diagnostic>"}` when config loading
253
- fails. Fix the config and restart the server. Without `--frontend`, the `/`
254
- and `/frontend/state` routes return `404`.
257
+ The shell reads `GET /frontend/state`. When the index is ready it returns
258
+ HTTP `200`:
259
+
260
+ ```json
261
+ {
262
+ "error": null,
263
+ "root": "/abs/path/of/the/invocation/directory",
264
+ "tables": [
265
+ {"name": "posts", "columns": [{"name": "basename", "type": "TEXT"}]}
266
+ ]
267
+ }
268
+ ```
269
+
270
+ `root` is the query root, where [path-tables](./path-tables.md) resolve.
271
+ `tables` lists the declared tables, ordered by name, each with its columns in
272
+ declaration order and the declared SQLite type (`""` when untyped). Empty
273
+ tables are listed. A configless server, or a config with only functions or
274
+ extensions, returns `"tables": []`. dirsql's bookkeeping tables, SQLite's own
275
+ tables, virtual tables with their shadow tables, and path-tables are never
276
+ listed. The metadata is read from SQLite's catalog: no file is parsed, no
277
+ directory walked, no table counted.
278
+
279
+ When config loading fails the endpoint returns HTTP `503` with
280
+ `{"error":"<diagnostic>"}` and no `root` or `tables`. Fix the config and
281
+ restart the server. Without `--frontend`, the `/` and `/frontend/state`
282
+ routes return `404`. `POST /query` is unchanged.
255
283
 
256
284
  ### Flags
257
285
 
@@ -0,0 +1,7 @@
1
+ {
2
+ "command": "uv run python -m pytest tests/e2e/cli_version_test.py tests/e2e/query_contract_test.py tests/e2e/fanout_test.py tests/e2e/extension_package_test.py tests/e2e/server_speed_test.py -x -q",
3
+ "ran_at": 1791765336,
4
+ "exit_code": 0,
5
+ "commit": "a2b5671787b3cfa038a128d5cbbeac13e6c268a9",
6
+ "branch": "bot/1487-frontend-query-1011"
7
+ }
@@ -0,0 +1,7 @@
1
+ {
2
+ "command": "uv run python -m pytest tests/e2e/cli_version_test.py tests/e2e/query_contract_test.py tests/e2e/declared_table_name_test.py tests/e2e/on_file_query_test.py -x -q",
3
+ "ran_at": 1791764712,
4
+ "exit_code": 0,
5
+ "commit": "ae61a26f7b9018c3e12aebeea7c6a3cf32ef4d87",
6
+ "branch": "bot/1488-frontend-metadata-1011"
7
+ }
@@ -0,0 +1,7 @@
1
+ {
2
+ "command": "uv run python -m tests.e2e.bench_suite --pairs 3 --out /tmp/bench-1504 -k \"glob_speed_symlink or glob_speed_dotfiles or glob_speed_recursive\"",
3
+ "ran_at": 1791770495,
4
+ "exit_code": 0,
5
+ "commit": "cce3e83ece8026cc8feedbb1cd64f73242f1d230",
6
+ "branch": "bot/1504-bench-names-1011"
7
+ }
@@ -0,0 +1,7 @@
1
+ {
2
+ "command": "uv run python -m pytest tests/e2e/glob_speed_depth_bound_test.py tests/e2e/glob_speed_one_level_test.py tests/e2e/glob_speed_recursive_test.py tests/e2e/glob_speed_symlink_test.py tests/e2e/glob_speed_matchers_test.py tests/e2e/glob_speed_dotfiles_test.py tests/e2e/glob_speed_gitignore_test.py -x -q",
3
+ "ran_at": 1791777891,
4
+ "exit_code": 0,
5
+ "commit": "fb7068d3883fd35c014146a174f4f342aaf93dab",
6
+ "branch": "bot/speed-gap-childpath-1011"
7
+ }
@@ -0,0 +1,7 @@
1
+ {
2
+ "command": "uv run python -m pytest tests/e2e/jsonl_parse_speed_test.py tests/e2e/frontmatter_parse_speed_test.py tests/e2e/on_file_query_test.py tests/e2e/query_contract_test.py -x -q",
3
+ "ran_at": 1791768023,
4
+ "exit_code": 0,
5
+ "commit": "db8e06627eb807a3932ae3989ef662019a288ce1",
6
+ "branch": "bot/speed-parse-overlap-1011"
7
+ }
@@ -0,0 +1,7 @@
1
+ {
2
+ "command": "uv run python -m pytest tests/e2e/jsonl_parse_speed_test.py tests/e2e/frontmatter_parse_speed_test.py tests/e2e/on_file_query_test.py tests/e2e/query_contract_test.py -x -q",
3
+ "ran_at": 1791766109,
4
+ "exit_code": 0,
5
+ "commit": "a2a42d2c9ac8c5aa5292f4d4d540296cf1e1ee6c",
6
+ "branch": "bot/speed-parse-pragmas-1011"
7
+ }
@@ -0,0 +1,7 @@
1
+ {
2
+ "command": "uv run python -m pytest tests/e2e/glob_speed_depth_bound_test.py tests/e2e/glob_speed_one_level_test.py tests/e2e/glob_speed_recursive_test.py tests/e2e/glob_speed_symlink_test.py tests/e2e/glob_speed_dotfiles_test.py tests/e2e/glob_speed_node_modules_test.py tests/e2e/glob_speed_matchers_test.py tests/e2e/glob_speed_gitignore_test.py tests/e2e/stat_speed_test.py tests/e2e/query_contract_test.py -x -q",
3
+ "ran_at": 1791771802,
4
+ "exit_code": 0,
5
+ "commit": "6a704d60f7963656097b921100e1f3aaefba6bbd",
6
+ "branch": "bot/speed-walk-components-1011"
7
+ }
@@ -0,0 +1,7 @@
1
+ {
2
+ "command": "uv run python -m pytest tests/e2e/glob_speed_depth_bound_test.py tests/e2e/glob_speed_one_level_test.py tests/e2e/glob_speed_recursive_test.py tests/e2e/glob_speed_symlink_test.py tests/e2e/glob_speed_dotfiles_test.py tests/e2e/glob_speed_node_modules_test.py tests/e2e/glob_speed_matchers_test.py tests/e2e/glob_speed_gitignore_test.py tests/e2e/stat_speed_test.py tests/e2e/query_contract_test.py -x -q",
3
+ "ran_at": 1791768231,
4
+ "exit_code": 0,
5
+ "commit": "d6653e1f4d8a1d8b4b723b6f24c0bc805e4aa7e1",
6
+ "branch": "bot/speed-walk-rowpath-1011"
7
+ }
@@ -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.111"
9
+ version = "0.4.112"
10
10
  edition.workspace = true
11
11
  # Literal `license` (not `license.workspace = true`) because
12
12
  # putitoutthere's preflight check reads `[package].license` directly
@@ -240,18 +240,46 @@ requests, closes open `/events` streams, and exits.
240
240
  Pass `--frontend` to serve the bundled dirsql SQL explorer shell at `/` on
241
241
  the same origin as the HTTP API. It works offline and prints `Frontend at
242
242
  http://<host>:<actual-port>/` without opening a browser. With `--port 0`, the
243
- printed URL uses the assigned port. The initial shell shows server status;
244
- query controls are coming in a subsequent update.
243
+ printed URL uses the assigned port. The page offers an editable SQL box
244
+ holding the starter query `SELECT * FROM './' LIMIT 100`. Nothing runs until
245
+ you press **Run** (or Ctrl/Cmd+Enter); pressing it again refreshes the
246
+ result. Queries go through `POST /query`, so the read-only rule applies, and
247
+ run exactly as written. The page shows elapsed time, the number of rows
248
+ returned, and errors. Values render as text (`NULL` is marked), and only the
249
+ first 1000 rows are displayed. An empty result says so and shows no column
250
+ names, since the response carries none.
245
251
 
246
252
  ```bash
247
253
  dirsql server --frontend
248
254
  dirsql server --frontend -c .dirsql.toml
249
255
  ```
250
256
 
251
- The shell reads `GET /frontend/state`: `{"error":null}` when the index is
252
- ready, or HTTP `503` with `{"error":"<diagnostic>"}` when config loading
253
- fails. Fix the config and restart the server. Without `--frontend`, the `/`
254
- and `/frontend/state` routes return `404`.
257
+ The shell reads `GET /frontend/state`. When the index is ready it returns
258
+ HTTP `200`:
259
+
260
+ ```json
261
+ {
262
+ "error": null,
263
+ "root": "/abs/path/of/the/invocation/directory",
264
+ "tables": [
265
+ {"name": "posts", "columns": [{"name": "basename", "type": "TEXT"}]}
266
+ ]
267
+ }
268
+ ```
269
+
270
+ `root` is the query root, where [path-tables](./path-tables.md) resolve.
271
+ `tables` lists the declared tables, ordered by name, each with its columns in
272
+ declaration order and the declared SQLite type (`""` when untyped). Empty
273
+ tables are listed. A configless server, or a config with only functions or
274
+ extensions, returns `"tables": []`. dirsql's bookkeeping tables, SQLite's own
275
+ tables, virtual tables with their shadow tables, and path-tables are never
276
+ listed. The metadata is read from SQLite's catalog: no file is parsed, no
277
+ directory walked, no table counted.
278
+
279
+ When config loading fails the endpoint returns HTTP `503` with
280
+ `{"error":"<diagnostic>"}` and no `root` or `tables`. Fix the config and
281
+ restart the server. Without `--frontend`, the `/` and `/frontend/state`
282
+ routes return `404`. `POST /query` is unchanged.
255
283
 
256
284
  ### Flags
257
285
 
@@ -16,6 +16,18 @@
16
16
  .panel { margin-top: 2.5rem; padding: 1.5rem; border: 1px solid #d9e1da; border-radius: 12px; background: #fff; box-shadow: 0 3px 12px #17302609; }
17
17
  .panel h2 { margin: 0 0 .5rem; font-size: 1rem; }
18
18
  .panel p { margin: 0; }
19
+ form { margin-top: 2rem; }
20
+ label { display: block; font-weight: 600; margin-bottom: .4rem; }
21
+ textarea { width: 100%; min-height: 7rem; padding: .7rem; border: 1px solid #b9c7bd; border-radius: 8px; font: .95rem/1.5 ui-monospace, monospace; resize: vertical; }
22
+ button { margin-top: .6rem; padding: .5rem 1.2rem; border: 0; border-radius: 8px; background: #1f6b46; color: #fff; font: inherit; font-weight: 600; cursor: pointer; }
23
+ button[aria-busy="true"] { opacity: .6; cursor: progress; }
24
+ .hint { font-size: .85rem; margin: .4rem 0 0; }
25
+ #result { margin-top: 1.5rem; overflow-x: auto; }
26
+ #result p.error { color: #a0362a; white-space: pre-wrap; overflow-wrap: anywhere; }
27
+ table { border-collapse: collapse; font: .85rem/1.4 ui-monospace, monospace; background: #fff; }
28
+ th, td { border: 1px solid #d9e1da; padding: .3rem .6rem; text-align: left; vertical-align: top; white-space: pre-wrap; overflow-wrap: anywhere; max-width: 40rem; }
29
+ th { background: #eef2ee; }
30
+ td.null { color: #7a8a80; font-style: italic; }
19
31
  .error { border-color: #d7a7a1; background: #fff8f7; }
20
32
  .error h2 { color: #a0362a; }
21
33
  .error pre { white-space: pre-wrap; overflow-wrap: anywhere; font: .9rem/1.5 ui-monospace, monospace; margin: .8rem 0; }
@@ -30,7 +42,15 @@
30
42
  <h2 id="state-title">Connecting to dirsql…</h2>
31
43
  <p id="state-message">Checking the server state.</p>
32
44
  </section>
45
+ <form id="query" onsubmit="return false">
46
+ <label for="sql">SQL (read-only)</label>
47
+ <textarea id="sql" name="sql" spellcheck="false" aria-describedby="sql-hint">SELECT * FROM './' LIMIT 100</textarea>
48
+ <button type="button" id="run">Run</button>
49
+ <p class="hint" id="sql-hint">Runs exactly as written; edit the LIMIT as needed. Press Ctrl+Enter or Cmd+Enter to run.</p>
50
+ </form>
51
+ <section id="result" aria-live="polite" aria-label="Query result"></section>
33
52
  </main>
53
+ <script type="module" src="/frontend.js"></script>
34
54
  <script>
35
55
  (async () => {
36
56
  const panel = document.getElementById('state');
@@ -0,0 +1,161 @@
1
+ export const STARTER_QUERY = "SELECT * FROM './' LIMIT 100";
2
+ export const DISPLAY_ROW_LIMIT = 1000;
3
+
4
+ export function formatCell(value) {
5
+ if (value === null || value === undefined) return { text: 'NULL', isNull: true };
6
+ if (typeof value === 'object') return { text: JSON.stringify(value), isNull: false };
7
+ return { text: String(value), isNull: false };
8
+ }
9
+
10
+ async function failureOf(response) {
11
+ let message = `HTTP ${response.status}`;
12
+ try {
13
+ const body = await response.json();
14
+ if (body && typeof body.error === 'string') message = body.error;
15
+ } catch {}
16
+ return { kind: response.status === 400 ? 'query' : 'server', httpStatus: response.status, message };
17
+ }
18
+
19
+ export function createQueryRunner({ fetch, now, onChange }) {
20
+ let current = { status: 'idle' };
21
+ let seq = 0;
22
+ let inflight = null;
23
+
24
+ const set = (state) => {
25
+ current = state;
26
+ onChange(state);
27
+ };
28
+
29
+ async function execute(sql, id, controller) {
30
+ const started = now();
31
+ const elapsed = () => Math.round(now() - started);
32
+ let outcome;
33
+ try {
34
+ const response = await fetch('/query', { method: 'POST', body: JSON.stringify({ sql }), signal: controller.signal });
35
+ if (response.ok) {
36
+ const rows = await response.json();
37
+ if (!Array.isArray(rows)) throw new Error('unexpected response');
38
+ const shown = rows.slice(0, DISPLAY_ROW_LIMIT);
39
+ outcome = {
40
+ status: 'success',
41
+ sql,
42
+ rows: shown,
43
+ columns: shown.length ? Object.keys(shown[0]) : [],
44
+ rowCount: rows.length,
45
+ shownCount: shown.length,
46
+ truncated: rows.length > shown.length,
47
+ };
48
+ } else {
49
+ outcome = { status: 'error', sql, ...(await failureOf(response)) };
50
+ }
51
+ } catch (error) {
52
+ outcome =
53
+ error instanceof TypeError || error.name === 'AbortError'
54
+ ? { status: 'error', sql, kind: 'network', message: error.message }
55
+ : { status: 'error', sql, kind: 'server', message: error.message };
56
+ }
57
+ if (id !== seq) return;
58
+ inflight = null;
59
+ set({ ...outcome, elapsedMs: elapsed() });
60
+ }
61
+
62
+ return {
63
+ state: () => current,
64
+ run(sql) {
65
+ if (inflight && inflight.sql === sql) return Promise.resolve();
66
+ if (inflight) inflight.controller.abort();
67
+ seq += 1;
68
+ const controller = new AbortController();
69
+ inflight = { sql, controller, done: null };
70
+ set({ status: 'running', sql });
71
+ inflight.done = execute(sql, seq, controller);
72
+ return inflight.done;
73
+ },
74
+ };
75
+ }
76
+
77
+ const plural = (n, word) => `${n} ${word}${n === 1 ? '' : 's'}`;
78
+
79
+ function summaryOf(state) {
80
+ const returned = `${plural(state.rowCount, 'row')} returned in ${state.elapsedMs} ms`;
81
+ if (state.truncated) return `${returned}. Display limit: first ${state.shownCount} shown.`;
82
+ if (state.rowCount === 0) return `${returned}. Column names are not available for an empty result.`;
83
+ return `${returned}.`;
84
+ }
85
+
86
+ function tableOf(doc, state) {
87
+ const table = doc.createElement('table');
88
+ const head = doc.createElement('tr');
89
+ for (const column of state.columns) {
90
+ const th = doc.createElement('th');
91
+ th.setAttribute('scope', 'col');
92
+ th.textContent = column;
93
+ head.append(th);
94
+ }
95
+ table.append(head);
96
+ for (const row of state.rows) {
97
+ const tr = doc.createElement('tr');
98
+ for (const column of state.columns) {
99
+ const { text, isNull } = formatCell(row[column]);
100
+ const td = doc.createElement('td');
101
+ td.textContent = text;
102
+ if (isNull) td.className = 'null';
103
+ tr.append(td);
104
+ }
105
+ table.append(tr);
106
+ }
107
+ return table;
108
+ }
109
+
110
+ const ERROR_LABEL = { query: 'Query error', server: 'Server error', network: 'Could not reach the server' };
111
+
112
+ function errorText(state) {
113
+ if (state.kind === 'network') return `${ERROR_LABEL.network}: ${state.message}`;
114
+ const status = state.httpStatus ? ` (HTTP ${state.httpStatus})` : '';
115
+ return `${ERROR_LABEL[state.kind]}${status}: ${state.message}`;
116
+ }
117
+
118
+ export function renderResult(doc, container, state) {
119
+ const note = doc.createElement('p');
120
+ if (state.status === 'running') {
121
+ note.textContent = 'Running…';
122
+ container.replaceChildren(note);
123
+ return;
124
+ }
125
+ if (state.status === 'error') {
126
+ note.className = 'error';
127
+ note.setAttribute('role', 'alert');
128
+ note.textContent = errorText(state);
129
+ container.replaceChildren(note);
130
+ return;
131
+ }
132
+ if (state.status !== 'success') {
133
+ container.replaceChildren();
134
+ return;
135
+ }
136
+ note.textContent = summaryOf(state);
137
+ container.replaceChildren(...(state.rowCount ? [note, tableOf(doc, state)] : [note]));
138
+ }
139
+
140
+ if (typeof document !== 'undefined') {
141
+ const sql = document.getElementById('sql');
142
+ const run = document.getElementById('run');
143
+ const result = document.getElementById('result');
144
+ sql.value = STARTER_QUERY;
145
+ const runner = createQueryRunner({
146
+ fetch: (url, init) => fetch(url, init),
147
+ now: () => performance.now(),
148
+ onChange(state) {
149
+ run.setAttribute('aria-busy', String(state.status === 'running'));
150
+ renderResult(document, result, state);
151
+ },
152
+ });
153
+ const submit = () => runner.run(sql.value);
154
+ run.addEventListener('click', submit);
155
+ sql.addEventListener('keydown', (event) => {
156
+ if (event.key === 'Enter' && (event.ctrlKey || event.metaKey)) {
157
+ event.preventDefault();
158
+ submit();
159
+ }
160
+ });
161
+ }
@@ -22,6 +22,7 @@ use tokio_stream::wrappers::BroadcastStream;
22
22
 
23
23
  use super::AppState;
24
24
  use super::execute::{QueryFailure, execute_query, require_ready};
25
+ use crate::TableInfo;
25
26
 
26
27
  pub(super) struct AppContext {
27
28
  pub state: AppState,
@@ -46,14 +47,31 @@ pub(super) fn router(ctx: SharedCtx, frontend: bool) -> Router {
46
47
  if frontend {
47
48
  app = app
48
49
  .route("/", get(|| async { Html(include_str!("frontend.html")) }))
50
+ .route("/frontend.js", get(handle_frontend_script))
49
51
  .route("/frontend/state", get(handle_frontend_state));
50
52
  }
51
53
  app.with_state(ctx)
52
54
  }
53
55
 
56
+ async fn handle_frontend_script() -> Response {
57
+ (
58
+ [(header::CONTENT_TYPE, "text/javascript; charset=utf-8")],
59
+ include_str!("frontend.js"),
60
+ )
61
+ .into_response()
62
+ }
63
+
54
64
  async fn handle_frontend_state(State(ctx): State<SharedCtx>) -> Response {
55
65
  match &ctx.state {
56
- AppState::Ready(_) => Json(json!({ "error": null })).into_response(),
66
+ AppState::Ready(db) => match db.tables() {
67
+ Ok(tables) => Json(json!({
68
+ "error": null,
69
+ "root": db.root().to_string_lossy(),
70
+ "tables": tables.iter().map(table_json).collect::<Vec<_>>(),
71
+ }))
72
+ .into_response(),
73
+ Err(err) => error_response(StatusCode::INTERNAL_SERVER_ERROR, err.to_string()),
74
+ },
57
75
  AppState::Unavailable(reason) => (
58
76
  StatusCode::SERVICE_UNAVAILABLE,
59
77
  Json(json!({ "error": reason })),
@@ -62,6 +80,17 @@ async fn handle_frontend_state(State(ctx): State<SharedCtx>) -> Response {
62
80
  }
63
81
  }
64
82
 
83
+ fn table_json(table: &TableInfo) -> serde_json::Value {
84
+ json!({
85
+ "name": table.name,
86
+ "columns": table
87
+ .columns
88
+ .iter()
89
+ .map(|c| json!({ "name": c.name, "type": c.sql_type }))
90
+ .collect::<Vec<_>>(),
91
+ })
92
+ }
93
+
65
94
  async fn handle_query(State(ctx): State<SharedCtx>, body: String) -> Response {
66
95
  match execute_query(&ctx.state, body, Some(ctx.query_timeout)).await {
67
96
  Ok(value) => Json(value).into_response(),
@@ -215,6 +244,31 @@ mod tests {
215
244
  assert_eq!(resp.status(), StatusCode::SERVICE_UNAVAILABLE);
216
245
  }
217
246
 
247
+ #[tokio::test]
248
+ async fn frontend_script_is_served_as_javascript() {
249
+ let resp = handle_frontend_script().await;
250
+ assert_eq!(resp.status(), StatusCode::OK);
251
+ assert_eq!(
252
+ resp.headers()[header::CONTENT_TYPE],
253
+ "text/javascript; charset=utf-8"
254
+ );
255
+ }
256
+
257
+ #[test]
258
+ fn table_json_names_each_column_with_its_type() {
259
+ let table = TableInfo {
260
+ name: "t".into(),
261
+ columns: vec![crate::ColumnInfo {
262
+ name: "a".into(),
263
+ sql_type: "TEXT".into(),
264
+ }],
265
+ };
266
+ assert_eq!(
267
+ table_json(&table),
268
+ json!({"name": "t", "columns": [{"name": "a", "type": "TEXT"}]})
269
+ );
270
+ }
271
+
218
272
  #[test]
219
273
  fn error_response_sets_json_content_type() {
220
274
  let resp = error_response(StatusCode::BAD_REQUEST, "boom");