ktx/packages/cli/src/context/ingest
Andrey Avtomonov f3f893bf01
fix: read semantic sources safely (#284)
* fix: read semantic sources safely

* test: retarget reindex per-scope error case to a broken manifest

Reading a broken standalone source was made non-fatal in de1f1a8d (it is
surfaced for repair instead of throwing), so the reindex per-scope error
test no longer captured an error. Point it at a corrupt manifest shard,
which is the remaining fatal read failure the per-scope catch must
isolate, and assert the captured error names the offending file.

* fix(sl): decouple semantic-layer file names from warehouse naming rules

The in-file `name:` field is now the sole source identity; the filename is
a derived label that never participates in identity. This removes the
"Unsafe semantic-layer source name" failure class entirely: any warehouse
identifier (Snowflake's uppercase SIGNED_UP, EVENT$LOG, dotted names) can
be read, overlaid, edited, and deleted.

- New `source-files.ts`: one total filename derivation (safe lowercase
  names verbatim; otherwise slug + sha256-hash suffix, immune to
  case-insensitive-filesystem collisions) and one by-name file resolver.
- Reads resolve by name everywhere; the path-from-name fast path and
  `assertSafeSourceName` are gone.
- Writes resolve-then-write: rewrites land on the file that declares the
  name (human renames survive); new sources get a derived filename; a
  derived path occupied by a different source fails instead of clobbering.
- `readSourceFile` returns null for missing files instead of forcing every
  caller to launder IO errors; `deleteSource` distinguishes manifest-backed
  sources from not-found instead of silently succeeding.
- `sl_write_source` accepts verbatim warehouse identifiers (snake_case is
  now a recommendation for new sources) and rejects sourceName/source.name
  mismatches; `sl_edit_source` rejects name-changing edits.
- Ingest projection commits, gate-repair allowlists, and touched-source
  derivation use resolved paths / in-file names instead of interpolating
  `<connId>/<name>.yaml`.
- Collapsed the five parallel path derivations and duplicated path-token
  helpers onto the shared module; dropped dead service methods.

* fix(sl): resolve sources by declared name end-to-end and gate warehouse SQL with the parser-backed validator

- Key broken/renamed semantic-layer files by their recoverable in-file
  name (slSourceNameForFile) so mid-edit sources stay reachable under
  their real identity in reads, listings, and search
- Derive finalization touched sources from composed-source diffs and
  recover deleted files' declared names from the pre-change commit
  instead of parsing hash-derived filenames
- Resolve revert/rollback paths against history (listFilesAtCommit) so
  human-renamed files are restored where they lived at preHead
- Validate ingest sql_execution through the daemon's sqlglot
  validateReadOnly in the connection's dialect, sharing one
  driver-to-dialect map (sql-analysis/dialect.ts) across MCP and ingest
- Harden the local read-only SQL backstop: accept leading comments,
  reject smuggled second statements, and strip trailing
  semicolons/comments before row-limit wrapping
2026-06-10 14:06:13 +02:00
..
adapters fix: read semantic sources safely (#284) 2026-06-10 14:06:13 +02:00
clustering test: split cli tests from source tree (#216) 2026-05-26 08:49:05 +02:00
context-candidates fix(ingest): drive work-unit progress from tool calls, not turn counts (#269) 2026-06-08 15:30:35 +02:00
context-evidence test: split cli tests from source tree (#216) 2026-05-26 08:49:05 +02:00
dbt-shared test: split cli tests from source tree (#216) 2026-05-26 08:49:05 +02:00
historic-sql-probes test: split cli tests from source tree (#216) 2026-05-26 08:49:05 +02:00
isolated-diff feat(cli): add ingest LLM rate-limit governor with paced retries (#261) 2026-06-05 12:10:27 +02:00
memory-flow fix(ingest): drive work-unit progress from tool calls, not turn counts (#269) 2026-06-08 15:30:35 +02:00
page-triage test: split cli tests from source tree (#216) 2026-05-26 08:49:05 +02:00
stages fix(ingest): drive work-unit progress from tool calls, not turn counts (#269) 2026-06-08 15:30:35 +02:00
tools fix: read semantic sources safely (#284) 2026-06-10 14:06:13 +02:00
action-identity.ts chore(workspace): gate dead-code with knip production mode (#196) 2026-05-21 15:28:58 +02:00
artifact-gates.ts chore(workspace): gate dead-code with knip production mode (#196) 2026-05-21 15:28:58 +02:00
canonical-pins.ts chore(workspace): gate dead-code with knip production mode (#196) 2026-05-21 15:28:58 +02:00
diff-set.service.ts chore(workspace): gate dead-code with knip production mode (#196) 2026-05-21 15:28:58 +02:00
final-gate-repair.ts fix: read semantic sources safely (#284) 2026-06-10 14:06:13 +02:00
finalization-scope.ts fix: read semantic sources safely (#284) 2026-06-10 14:06:13 +02:00
git-env.ts chore(workspace): gate dead-code with knip production mode (#196) 2026-05-21 15:28:58 +02:00
historic-sql-probes.ts feat(connectors): generalize readiness and constraint handling (#212) 2026-05-24 19:30:06 +02:00
ingest-bundle.runner.ts fix: read semantic sources safely (#284) 2026-06-10 14:06:13 +02:00
ingest-profile.ts feat(cli): profile ingest runs and split model vs tool time (#249) 2026-06-01 15:49:17 +02:00
ingest-trace.ts chore(workspace): gate dead-code with knip production mode (#196) 2026-05-21 15:28:58 +02:00
local-adapters.ts feat(query-history): scope mining to modeled schemas by default (#258) 2026-06-03 17:19:42 +02:00
local-bundle-runtime.ts fix: read semantic sources safely (#284) 2026-06-10 14:06:13 +02:00
local-ingest.ts fix: read semantic sources safely (#284) 2026-06-10 14:06:13 +02:00
local-mapping-reconcile.ts chore(workspace): gate dead-code with knip production mode (#196) 2026-05-21 15:28:58 +02:00
local-stage-ingest.ts fix(snowflake): unblock multi-schema ingest and relationship discovery (#204) 2026-05-23 10:41:30 +02:00
parsed-target-table.ts chore(workspace): gate dead-code with knip production mode (#196) 2026-05-21 15:28:58 +02:00
ports.ts fix(ingest): drive work-unit progress from tool calls, not turn counts (#269) 2026-06-08 15:30:35 +02:00
raw-sources-paths.ts chore(workspace): gate dead-code with knip production mode (#196) 2026-05-21 15:28:58 +02:00
repo-fetch.ts chore(workspace): gate dead-code with knip production mode (#196) 2026-05-21 15:28:58 +02:00
report-snapshot.ts chore(workspace): gate dead-code with knip production mode (#196) 2026-05-21 15:28:58 +02:00
reports.ts fix(cli): treat artifact-producing ingests with failures as partial (#238) 2026-05-30 00:42:59 +02:00
semantic-layer-target-policy.ts chore(workspace): gate dead-code with knip production mode (#196) 2026-05-21 15:28:58 +02:00
source-adapter-registry.ts chore(workspace): gate dead-code with knip production mode (#196) 2026-05-21 15:28:58 +02:00
sqlite-bundle-ingest-store.ts chore(workspace): gate dead-code with knip production mode (#196) 2026-05-21 15:28:58 +02:00
sqlite-local-ingest-store.ts chore(workspace): gate dead-code with knip production mode (#196) 2026-05-21 15:28:58 +02:00
types.ts feat(cli): add ingest LLM rate-limit governor with paced retries (#261) 2026-06-05 12:10:27 +02:00
wiki-body-refs.ts chore(workspace): gate dead-code with knip production mode (#196) 2026-05-21 15:28:58 +02:00
wiki-sl-ref-repair.ts chore(workspace): gate dead-code with knip production mode (#196) 2026-05-21 15:28:58 +02:00