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.
- {dirsql-0.4.111 → dirsql-0.4.112}/Cargo.lock +2 -2
- {dirsql-0.4.111 → dirsql-0.4.112}/PKG-INFO +1 -1
- {dirsql-0.4.111 → dirsql-0.4.112}/docs/reference/cli.md +34 -6
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/Cargo.toml +1 -1
- {dirsql-0.4.111/packages/rust → dirsql-0.4.112/packages/python}/docs/reference/cli.md +34 -6
- dirsql-0.4.112/packages/python/e2e-attestations/bot-1487-frontend-query-1011.json +7 -0
- dirsql-0.4.112/packages/python/e2e-attestations/bot-1488-frontend-metadata-1011.json +7 -0
- dirsql-0.4.112/packages/python/e2e-attestations/bot-1504-bench-names-1011.json +7 -0
- dirsql-0.4.112/packages/python/e2e-attestations/bot-speed-gap-childpath-1011.json +7 -0
- dirsql-0.4.112/packages/python/e2e-attestations/bot-speed-parse-overlap-1011.json +7 -0
- dirsql-0.4.112/packages/python/e2e-attestations/bot-speed-parse-pragmas-1011.json +7 -0
- dirsql-0.4.112/packages/python/e2e-attestations/bot-speed-walk-components-1011.json +7 -0
- dirsql-0.4.112/packages/python/e2e-attestations/bot-speed-walk-rowpath-1011.json +7 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/rust/Cargo.toml +1 -1
- {dirsql-0.4.111/packages/python → dirsql-0.4.112/packages/rust}/docs/reference/cli.md +34 -6
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/rust/src/cli/frontend.html +20 -0
- dirsql-0.4.112/packages/rust/src/cli/frontend.js +161 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/rust/src/cli/router.rs +55 -1
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/rust/src/db.rs +171 -4
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/rust/src/lib.rs +194 -50
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/rust/src/matcher.rs +70 -9
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/rust/src/on_file.rs +211 -74
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/rust/src/scanner.rs +56 -5
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/rust/src/vtab.rs +39 -8
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/rust/src/vtab_scaffold.rs +59 -1
- {dirsql-0.4.111 → dirsql-0.4.112}/Cargo.toml +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/README.md +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/dirsql/__init__.py +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/dirsql/_async.py +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/dirsql/_dirsql.pyi +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/dirsql/cli/__init__.py +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/dirsql/cli/discover_plugins/__init__.py +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/dirsql/cli/discover_plugins/discovered_fragments.py +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/dirsql/cli/discover_plugins/discovery_disabled.py +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/dirsql/cli/discover_plugins/fragment_path.py +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/dirsql/cli/discover_plugins/with_discovered_plugins.py +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/dirsql/cli/main.py +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/dirsql/cli/resolve_config_extensions.py +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/dirsql/plan_entry_path.py +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/dirsql/py.typed +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/dirsql/read_config.py +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/dirsql/resolve_configs_extension_specs.py +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/dirsql/resolve_extension.py +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/dirsql/resolve_package.py +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/docs/.claude/CLAUDE.md +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/docs/.vitepress/config.ts +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/docs/.vitepress/theme/index.ts +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/docs/.vitepress/theme/lang.ts +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/docs/AGENTS.md +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/docs/context/.gitattributes +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/docs/context/recipes.md +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/docs/context/troubleshooting.md +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/docs/context/usage.md +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/docs/explanation.md +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/docs/getting-started.md +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/docs/howto/agent-skill.md +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/docs/howto/columns-from-paths.md +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/docs/howto/define-tables.md +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/docs/howto/embed.md +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/docs/howto/extract-from-contents.md +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/docs/howto/load-extension.md +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/docs/howto/parse-files-into-columns.md +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/docs/howto/persist.md +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/docs/howto/query-json.md +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/docs/howto/query-without-config.md +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/docs/howto/react-to-changes.md +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/docs/howto/search-by-meaning.md +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/docs/howto/search-indexes.md +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/docs/howto/skip-files.md +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/docs/howto/write-a-plugin.md +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/docs/index.md +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/docs/package.json +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/docs/plugins.md +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/docs/pnpm-lock.yaml +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/docs/pnpm-workspace.yaml +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/docs/reference/columns.md +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/docs/reference/config.md +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/docs/reference/glob.md +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/docs/reference/hooks.md +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/docs/reference/http-api.md +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/docs/reference/path-tables.md +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/docs/reference/sdk.md +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/CHANGELOG.md +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/MIGRATIONS.md +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/README.md +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/changelog.d/2026-07-13-drop-cwd-config-auto-detect.md +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/changelog.d/2026-07-13-plugin-discovery.md +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/changelog.d/2026-07-13-rename-extract-to-on-file.md +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/changelog.d/2026-07-13-repeatable-config.md +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/changelog.d/2026-07-13-sdk-default-baked-in-config.md +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/changelog.d/2026-07-20-drop-implicit-files-table.md +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/changelog.d/2026-07-21-remove-glob-captures.md +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/changelog.d/2026-07-24-hookless-table-config-error.md +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/changelog.d/2026-07-24-remove-stat-fact-injection.md +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/changelog.d/2026-07-29-restore-python-310.md +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/changelog.d/2026-08-02-release-profile.md +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/changelog.d/2026-08-02-scan-failures.md +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/changelog.d/2026-08-03-discovery-ext-resolution.md +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/changelog.d/2026-08-03-manylinux-dynamic-binary.md +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/changelog.d/2026-08-03-python-no-ignore.md +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/changelog.d/2026-08-04-cast-lints.md +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/changelog.d/2026-08-04-cli-in-process.md +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/changelog.d/2026-08-20-curtaincall-dev-dependency.md +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/changelog.d/2026-08-20-declared-table-name.md +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/changelog.d/2026-09-04-config-paths-from-argv-module.md +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/changelog.d/2026-09-05-config-extension-loader-split.md +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/changelog.d/2026-09-05-resolve-config-extensions-split.md +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/changelog.d/2026-09-05-resolve-extension-split.md +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/changelog.d/2026-09-09-launcher-config-path-scan.md +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/changelog.d/2026-09-17-extension-resolution-via-core.md +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/changelog.d/2026-09-18-export-scan-failure.md +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/changelog.d/2026-09-18-flatten-row-event-in-core.md +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/changelog.d/2026-09-18-programmatic-extension-plan.md +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/changelog.d/2026-09-20-sigint-ends-a-run-in-progress.md +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/changelog.d/2026-09-24-query-rows-in-projection-order.md +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/changelog.d/2026-10-02-readme-docs-host.md +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/changelog.d/2026-10-03-one-glob-rule-for-config-globs.md +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/changelog.d/2026-10-03-path-table-directory-one-level.md +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/changelog.d/2026-10-04-path-table-dotfiles-hidden.md +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/changelog.d/2026-10-05-brace-groups-follow-bash.md +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/changelog.d/2026-10-05-cli-context.md +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/changelog.d/2026-10-05-gitignore-requires-repo.md +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/changelog.d/2026-10-05-path-table-node-modules-named.md +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/changelog.d/2026-10-05-path-table-symlinks.md +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/changelog.d/2026-10-05-path-table-trailing-slash.md +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/changelog.d/2026-10-05-unbalanced-brackets-literal.md +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/changelog.d/2026-10-06-config-braces.md +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/changelog.d/2026-10-06-config-directory.md +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/changelog.d/2026-10-06-config-dotnames.md +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/changelog.d/2026-10-06-config-gitignore.md +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/changelog.d/2026-10-06-config-globs-anchor-at-the-config.md +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/changelog.d/2026-10-06-config-links.md +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/changelog.d/2026-10-06-one-glob-compiler.md +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/changelog.d/2026-10-06-plugin-no-default-records.md +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/changelog.d/2026-10-06-watch-broadcast.md +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/changelog.d/2026-10-06-zero-match-config-table-warning.md +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/changelog.d/2026-10-07-bracket-slash-literal.md +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/changelog.d/2026-10-07-dotdot-and-double-slashes.md +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/changelog.d/2026-10-07-dotdot-as-written.md +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/changelog.d/2026-10-07-glob-walks-node-modules.md +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/changelog.d/2026-10-07-literal-gitignore.md +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/changelog.d/2026-10-07-on-file-ndjson.md +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/changelog.d/2026-10-07-parallel-hooks.md +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/changelog.d/2026-10-07-persist-cache-outside-root.md +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/changelog.d/2026-10-07-posix-classes-unicode.md +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/changelog.d/2026-10-07-spread-few-large-files.md +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/changelog.d/2026-10-08-small-walks-stay-on-one-thread.md +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/changelog.d/2026-10-08-watch-requires-named-table.md +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/changelog.d/README.md +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/conftest.py +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/docs/.claude/CLAUDE.md +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/docs/.vitepress/config.ts +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/docs/.vitepress/theme/index.ts +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/docs/.vitepress/theme/lang.ts +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/docs/AGENTS.md +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/docs/context/.gitattributes +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/docs/context/recipes.md +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/docs/context/troubleshooting.md +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/docs/context/usage.md +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/docs/explanation.md +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/docs/getting-started.md +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/docs/howto/agent-skill.md +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/docs/howto/columns-from-paths.md +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/docs/howto/define-tables.md +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/docs/howto/embed.md +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/docs/howto/extract-from-contents.md +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/docs/howto/load-extension.md +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/docs/howto/parse-files-into-columns.md +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/docs/howto/persist.md +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/docs/howto/query-json.md +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/docs/howto/query-without-config.md +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/docs/howto/react-to-changes.md +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/docs/howto/search-by-meaning.md +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/docs/howto/search-indexes.md +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/docs/howto/skip-files.md +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/docs/howto/write-a-plugin.md +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/docs/index.md +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/docs/package.json +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/docs/plugins.md +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/docs/pnpm-lock.yaml +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/docs/pnpm-workspace.yaml +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/docs/reference/columns.md +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/docs/reference/config.md +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/docs/reference/glob.md +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/docs/reference/hooks.md +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/docs/reference/http-api.md +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/docs/reference/path-tables.md +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/docs/reference/sdk.md +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/e2e-attestations/bot-1334-listing-exemptions.json +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/e2e-attestations/bot-1397-watch-broadcast.json +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/e2e-attestations/bot-1398-inotify-error.json +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/e2e-attestations/bot-1399-server-cors.json +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/e2e-attestations/bot-1401-watch-scope.json +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/e2e-attestations/bot-1406-watch-no-tables-1008.json +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/e2e-attestations/bot-1407-child-place-depth.json +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/e2e-attestations/bot-1414-stat-speed.json +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/e2e-attestations/bot-1415-server-speed.json +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/e2e-attestations/bot-1416-watch-speed-1008.json +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/e2e-attestations/bot-1418-node-modules.json +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/e2e-attestations/bot-1419-dotdot-slashes.json +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/e2e-attestations/bot-1420-bracket-slash.json +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/e2e-attestations/bot-1421-posix-unicode.json +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/e2e-attestations/bot-1422-literal-gitignore.json +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/e2e-attestations/bot-1426-walk-spawn-threshold-1008.json +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/e2e-attestations/bot-1428-ndjson-hooks.json +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/e2e-attestations/bot-1429-parallel-hooks.json +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/e2e-attestations/bot-1430-dotdot-as-written.json +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/e2e-attestations/bot-1431-persist-cache-dir.json +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/e2e-attestations/bot-1437-test-cache-isolation.json +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/e2e-attestations/bot-1440-fix-main-build.json +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/e2e-attestations/bot-1448-wildcard-ignored-prefix.json +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/e2e-attestations/bot-1451-named-dir-never-hidden.json +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/e2e-attestations/bot-1454-split-few-files.json +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/e2e-attestations/bot-1457-incremental-refresh-1008.json +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/e2e-attestations/bot-1459-rescan-on-overflow-1008.json +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/e2e-attestations/bot-1461-row-footprint-1008.json +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/e2e-attestations/bot-1462-paired-speed-harness-1008.json +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/e2e-attestations/bot-1464-fastest-native-1008.json +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/e2e-attestations/bot-1469-ci-speed-sanity-1009.json +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/e2e-attestations/bot-1470-perf-suite-1009.json +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/e2e-attestations/bot-1503-bench-watch-1011.json +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/e2e-attestations/bot-fix-main-place-depth-20261007.json +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/e2e-attestations/bot-issue-1486-frontend-20261009.json +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/e2e-attestations/bot-speed-parse-paths-1009.json +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/e2e-attestations/bot-speed-walk-sched-1009.json +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/e2e-attestations/cc-keen-knuth-f11gyq.json +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/e2e-attestations/claude-1056-py-ofpf9.json +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/e2e-attestations/claude-1066-p1-resolve-extension.json +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/e2e-attestations/claude-1078-argv-config-paths-core.json +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/e2e-attestations/claude-1079-p2-resolve-config-extensions.json +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/e2e-attestations/claude-1080-share-vtab-scaffolding.json +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/e2e-attestations/claude-1081-indicatif-progress.json +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/e2e-attestations/claude-1096-watch-moved-dir.json +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/e2e-attestations/claude-1109-watch-moved-out.json +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/e2e-attestations/claude-1119-ext-plan.json +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/e2e-attestations/claude-1120-py-ext.json +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/e2e-attestations/claude-1122-ext-cleanup.json +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/e2e-attestations/claude-1130-codec-crates.json +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/e2e-attestations/claude-1131-flatten-row-event.json +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/e2e-attestations/claude-1139-sse-flatten.json +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/e2e-attestations/claude-1140-scan-failure-export.json +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/e2e-attestations/claude-1148-clippy-all-targets.json +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/e2e-attestations/claude-1164-sigint-fatal.json +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/e2e-attestations/claude-1170-projection-order.json +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/e2e-attestations/claude-1172-on-file-path.json +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/e2e-attestations/claude-1173-py-projection-order.json +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/e2e-attestations/claude-1184-win-rel-paths.json +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/e2e-attestations/claude-1185-win-abs-table-names.json +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/e2e-attestations/claude-1186-win-test-harness.json +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/e2e-attestations/claude-1196-join-index.json +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/e2e-attestations/claude-1199-glob-prefix.json +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/e2e-attestations/claude-1201-single-walk.json +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/e2e-attestations/claude-1204-embed-batch.json +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/e2e-attestations/claude-1207-win-argv-quote.json +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/e2e-attestations/claude-1208-win-nonverbatim-paths.json +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/e2e-attestations/claude-1215-on-file-batch.json +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/e2e-attestations/claude-1216-on-file-cleanup.json +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/e2e-attestations/claude-1223-config-glob-rule.json +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/e2e-attestations/claude-1223-dir-one-level.json +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/e2e-attestations/claude-1225-plugin-no-default.json +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/e2e-attestations/claude-1226-stale-docs.json +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/e2e-attestations/claude-1232-anchor-plumbing.json +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/e2e-attestations/claude-1232-config-anchor.json +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/e2e-attestations/claude-1232-multi-watch.json +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/e2e-attestations/claude-1232-zero-match.json +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/e2e-attestations/claude-1238-parallel-walk.json +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/e2e-attestations/claude-1241-content-prefetch.json +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/e2e-attestations/claude-1243-ingest-perf.json +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/e2e-attestations/claude-1249-dotfiles.json +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/e2e-attestations/claude-1256-symlinks.json +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/e2e-attestations/claude-1257-trailing-slash.json +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/e2e-attestations/claude-1258-config-braces.json +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/e2e-attestations/claude-1258-config-directory.json +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/e2e-attestations/claude-1258-config-dotnames.json +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/e2e-attestations/claude-1258-config-gitignore.json +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/e2e-attestations/claude-1258-config-links.json +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/e2e-attestations/claude-1258-one-pattern.json +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/e2e-attestations/claude-1262-brace-literal.json +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/e2e-attestations/claude-1264-context.json +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/e2e-attestations/claude-1267-posix-classes.json +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/e2e-attestations/claude-1268-unbalanced-brackets.json +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/e2e-attestations/claude-1269-utf8-chars.json +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/e2e-attestations/claude-1271-node-modules-named.json +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/e2e-attestations/claude-1272-ancestor-gitignore.json +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/e2e-attestations/claude-1273-walk-prune.json +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/e2e-attestations/claude-1285-ingest-fast.json +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/e2e-attestations/claude-1286-nested-repo.json +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/e2e-attestations/claude-1305-glob-speed.json +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/e2e-attestations/claude-1308-glob-speed.json +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/e2e-attestations/claude-1310-glob-speed.json +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/e2e-attestations/claude-1311-glob-speed.json +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/e2e-attestations/claude-1312-glob-speed.json +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/e2e-attestations/claude-1318-lazy-stat.json +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/e2e-attestations/claude-1320-walk-speed.json +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/e2e-attestations/claude-1322-walk-readdir.json +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/e2e-attestations/claude-1325-parallel-walk.json +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/e2e-attestations/claude-1326-stream-rows.json +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/e2e-attestations/claude-1330-python-dirsql-patch.json +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/e2e-attestations/claude-1330-python-extensions-patch.json +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/e2e-attestations/claude-1330-scanner-effects.json +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/e2e-attestations/claude-1330-scanner-gitignore.json +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/e2e-attestations/claude-1330-vtab-prefetch-flag.json +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/e2e-attestations/claude-1330-vtab-read.json +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/e2e-attestations/claude-1351-dot-dirs.json +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/e2e-attestations/claude-819-oneshot-timeout.json +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/e2e-attestations/claude-827-unquote-doubled-quotes.json +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/e2e-attestations/claude-epic-953-slice2-reedline.json +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/e2e-attestations/claude-epic-953-slice3-format.json +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/e2e-attestations/claude-epic-953-stacked-prs-x59wm3.json +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/e2e-attestations/claude-github-issue-825-e4mhhp.json +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/e2e-attestations/claude-issue-951-0eease.json +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/e2e-attestations/claude-issue-962-0jjrfv.json +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/e2e-attestations/claude-issue-986-red-test-e7sjrb.json +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/e2e-attestations/claude-tackle-1034-cachesplit.json +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/e2e-attestations/claude-tackle-1042-py12.json +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/e2e-attestations/claude-tackle-956-xzen74.json +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/e2e-attestations/claude-tackle-957-lrm0z6-worker-calls.json +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/e2e-attestations/claude-tackle-957-lrm0z6.json +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/e2e-attestations/claude-tackle-975-n8mc2h.json +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/migrations.d/2026-07-13-drop-cwd-config-auto-detect.md +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/migrations.d/2026-07-13-rename-extract-to-on-file.md +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/migrations.d/2026-07-13-sdk-default-baked-in-config.md +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/migrations.d/2026-07-20-drop-implicit-files-table.md +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/migrations.d/2026-07-21-remove-glob-captures.md +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/migrations.d/2026-07-24-hookless-table-config-error.md +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/migrations.d/2026-07-24-remove-stat-fact-injection.md +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/migrations.d/2026-07-29-restore-python-310.md +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/migrations.d/2026-08-04-cli-in-process.md +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/migrations.d/2026-08-20-declared-table-name.md +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/migrations.d/2026-09-20-sigint-ends-a-run-in-progress.md +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/migrations.d/2026-09-24-query-rows-in-projection-order.md +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/migrations.d/2026-10-02-readme-docs-host.md +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/migrations.d/2026-10-03-one-glob-rule-for-config-globs.md +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/migrations.d/2026-10-03-path-table-directory-one-level.md +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/migrations.d/2026-10-04-path-table-dotfiles-hidden.md +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/migrations.d/2026-10-05-brace-groups-follow-bash.md +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/migrations.d/2026-10-05-cli-context.md +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/migrations.d/2026-10-05-gitignore-requires-repo.md +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/migrations.d/2026-10-05-path-table-node-modules-named.md +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/migrations.d/2026-10-05-path-table-symlinks.md +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/migrations.d/2026-10-05-path-table-trailing-slash.md +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/migrations.d/2026-10-05-unbalanced-brackets-literal.md +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/migrations.d/2026-10-06-config-braces.md +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/migrations.d/2026-10-06-config-directory.md +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/migrations.d/2026-10-06-config-dotnames.md +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/migrations.d/2026-10-06-config-gitignore.md +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/migrations.d/2026-10-06-config-globs-anchor-at-the-config.md +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/migrations.d/2026-10-06-config-links.md +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/migrations.d/2026-10-06-one-glob-compiler.md +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/migrations.d/2026-10-06-plugin-no-default-records.md +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/migrations.d/2026-10-06-watch-broadcast.md +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/migrations.d/2026-10-06-zero-match-config-table-warning.md +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/migrations.d/2026-10-07-bracket-slash-literal.md +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/migrations.d/2026-10-07-dotdot-and-double-slashes.md +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/migrations.d/2026-10-07-dotdot-as-written.md +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/migrations.d/2026-10-07-glob-walks-node-modules.md +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/migrations.d/2026-10-07-literal-gitignore.md +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/migrations.d/2026-10-07-on-file-ndjson.md +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/migrations.d/2026-10-07-parallel-hooks.md +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/migrations.d/2026-10-07-persist-cache-outside-root.md +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/migrations.d/2026-10-07-posix-classes-unicode.md +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/migrations.d/2026-10-07-spread-few-large-files.md +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/migrations.d/2026-10-08-small-walks-stay-on-one-thread.md +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/migrations.d/2026-10-08-watch-requires-named-table.md +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/migrations.d/README.md +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/src/lib.rs +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/testing-conventions.toml +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/tests/__init__.py +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/tests/conftest.py +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/tests/e2e/__init__.py +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/tests/e2e/bench_report.py +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/tests/e2e/bench_suite.py +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/tests/e2e/fixtures/dirsql_plugin_fixture/__init__.py +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/tests/e2e/fixtures/dirsql_plugin_fixture/dirsql.toml +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/tests/e2e/speed_of_light.py +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/tests/integration/__init__.py +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/tests/integration/binding/__init__.py +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/python/tests/integration/hermetic/__init__.py +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/rust/CHANGELOG.md +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/rust/MIGRATIONS.md +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/rust/README.md +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/rust/benches/db_bench.rs +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/rust/benches/differ_bench.rs +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/rust/benches/matcher_bench.rs +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/rust/benches/scanner_bench.rs +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/rust/docs/context/.gitattributes +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/rust/docs/context/recipes.md +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/rust/docs/context/troubleshooting.md +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/rust/docs/context/usage.md +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/rust/docs/explanation.md +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/rust/docs/getting-started.md +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/rust/docs/howto/agent-skill.md +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/rust/docs/howto/columns-from-paths.md +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/rust/docs/howto/define-tables.md +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/rust/docs/howto/embed.md +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/rust/docs/howto/extract-from-contents.md +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/rust/docs/howto/load-extension.md +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/rust/docs/howto/parse-files-into-columns.md +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/rust/docs/howto/persist.md +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/rust/docs/howto/query-json.md +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/rust/docs/howto/query-without-config.md +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/rust/docs/howto/react-to-changes.md +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/rust/docs/howto/search-by-meaning.md +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/rust/docs/howto/search-indexes.md +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/rust/docs/howto/skip-files.md +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/rust/docs/howto/write-a-plugin.md +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/rust/docs/index.md +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/rust/docs/plugins.md +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/rust/docs/reference/columns.md +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/rust/docs/reference/config.md +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/rust/docs/reference/glob.md +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/rust/docs/reference/hooks.md +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/rust/docs/reference/http-api.md +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/rust/docs/reference/path-tables.md +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/rust/docs/reference/sdk.md +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/rust/src/bin/dirsql.rs +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/rust/src/brace.rs +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/rust/src/cli/context.rs +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/rust/src/cli/execute.rs +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/rust/src/cli/init.rs +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/rust/src/cli/mod.rs +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/rust/src/cli/repl.rs +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/rust/src/cli/run.rs +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/rust/src/cli/serialize.rs +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/rust/src/cli/server.rs +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/rust/src/cli/table.rs +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/rust/src/command.rs +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/rust/src/config.rs +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/rust/src/default_config.toml +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/rust/src/differ.rs +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/rust/src/extension_resolution.rs +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/rust/src/functions.rs +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/rust/src/infer.rs +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/rust/src/launcher.rs +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/rust/src/listing.rs +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/rust/src/parsed_vtab.rs +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/rust/src/path_table.rs +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/rust/src/persist.rs +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/rust/src/posix_class.rs +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/rust/src/progress.rs +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/rust/src/row_event_flat.rs +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/rust/src/sql_literal.rs +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/rust/src/tree_walk.rs +0 -0
- {dirsql-0.4.111 → dirsql-0.4.112}/packages/rust/src/watcher.rs +0 -0
- {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.
|
|
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.
|
|
628
|
+
version = "0.4.112"
|
|
629
629
|
dependencies = [
|
|
630
630
|
"dirsql",
|
|
631
631
|
"pyo3",
|
|
@@ -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
|
|
244
|
-
query
|
|
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
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
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.
|
|
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
|
|
244
|
-
query
|
|
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
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
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.
|
|
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
|
|
244
|
-
query
|
|
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
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
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(
|
|
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");
|