cc-transcript 14.31.1__tar.gz → 14.32.1__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.
- {cc_transcript-14.31.1 → cc_transcript-14.32.1}/PKG-INFO +1 -1
- {cc_transcript-14.31.1 → cc_transcript-14.32.1}/pyproject.toml +1 -1
- {cc_transcript-14.31.1 → cc_transcript-14.32.1}/rust/crates/core/src/snapshot.rs +170 -57
- {cc_transcript-14.31.1 → cc_transcript-14.32.1}/rust/crates/core/src/snapshot_codec.rs +42 -0
- {cc_transcript-14.31.1 → cc_transcript-14.32.1}/rust/crates/core/src/snapshot_prepared_service.rs +27 -29
- {cc_transcript-14.31.1 → cc_transcript-14.32.1}/rust/crates/core/src/snapshot_projection.rs +188 -96
- {cc_transcript-14.31.1 → cc_transcript-14.32.1}/Cargo.lock +0 -0
- {cc_transcript-14.31.1 → cc_transcript-14.32.1}/Cargo.toml +0 -0
- {cc_transcript-14.31.1 → cc_transcript-14.32.1}/LICENSE +0 -0
- {cc_transcript-14.31.1 → cc_transcript-14.32.1}/README.md +0 -0
- {cc_transcript-14.31.1 → cc_transcript-14.32.1}/cc_transcript/__init__.py +0 -0
- {cc_transcript-14.31.1 → cc_transcript-14.32.1}/cc_transcript/__init__.pyi +0 -0
- {cc_transcript-14.31.1 → cc_transcript-14.32.1}/cc_transcript/_native.pyi +0 -0
- {cc_transcript-14.31.1 → cc_transcript-14.32.1}/cc_transcript/activity.py +0 -0
- {cc_transcript-14.31.1 → cc_transcript-14.32.1}/cc_transcript/activity_probe.py +0 -0
- {cc_transcript-14.31.1 → cc_transcript-14.32.1}/cc_transcript/builders.py +0 -0
- {cc_transcript-14.31.1 → cc_transcript-14.32.1}/cc_transcript/codex.py +0 -0
- {cc_transcript-14.31.1 → cc_transcript-14.32.1}/cc_transcript/command.py +0 -0
- {cc_transcript-14.31.1 → cc_transcript-14.32.1}/cc_transcript/context.py +0 -0
- {cc_transcript-14.31.1 → cc_transcript-14.32.1}/cc_transcript/corrections.py +0 -0
- {cc_transcript-14.31.1 → cc_transcript-14.32.1}/cc_transcript/cost.py +0 -0
- {cc_transcript-14.31.1 → cc_transcript-14.32.1}/cc_transcript/decision_store.py +0 -0
- {cc_transcript-14.31.1 → cc_transcript-14.32.1}/cc_transcript/decisions.py +0 -0
- {cc_transcript-14.31.1 → cc_transcript-14.32.1}/cc_transcript/discovery.py +0 -0
- {cc_transcript-14.31.1 → cc_transcript-14.32.1}/cc_transcript/disktruth.py +0 -0
- {cc_transcript-14.31.1 → cc_transcript-14.32.1}/cc_transcript/evidence.py +0 -0
- {cc_transcript-14.31.1 → cc_transcript-14.32.1}/cc_transcript/extract/__init__.py +0 -0
- {cc_transcript-14.31.1 → cc_transcript-14.32.1}/cc_transcript/extract/correct.py +0 -0
- {cc_transcript-14.31.1 → cc_transcript-14.32.1}/cc_transcript/facts.py +0 -0
- {cc_transcript-14.31.1 → cc_transcript-14.32.1}/cc_transcript/filterspec.py +0 -0
- {cc_transcript-14.31.1 → cc_transcript-14.32.1}/cc_transcript/heartbeats.py +0 -0
- {cc_transcript-14.31.1 → cc_transcript-14.32.1}/cc_transcript/ids.py +0 -0
- {cc_transcript-14.31.1 → cc_transcript-14.32.1}/cc_transcript/judge/__init__.py +0 -0
- {cc_transcript-14.31.1 → cc_transcript-14.32.1}/cc_transcript/judge/llm.py +0 -0
- {cc_transcript-14.31.1 → cc_transcript-14.32.1}/cc_transcript/judge/similar.py +0 -0
- {cc_transcript-14.31.1 → cc_transcript-14.32.1}/cc_transcript/judge/verdicts.py +0 -0
- {cc_transcript-14.31.1 → cc_transcript-14.32.1}/cc_transcript/ledger.py +0 -0
- {cc_transcript-14.31.1 → cc_transcript-14.32.1}/cc_transcript/literals.py +0 -0
- {cc_transcript-14.31.1 → cc_transcript-14.32.1}/cc_transcript/mining/__init__.py +0 -0
- {cc_transcript-14.31.1 → cc_transcript-14.32.1}/cc_transcript/mining/candidates.py +0 -0
- {cc_transcript-14.31.1 → cc_transcript-14.32.1}/cc_transcript/mining/confidence.py +0 -0
- {cc_transcript-14.31.1 → cc_transcript-14.32.1}/cc_transcript/mining/engine.py +0 -0
- {cc_transcript-14.31.1 → cc_transcript-14.32.1}/cc_transcript/mining/formats.py +0 -0
- {cc_transcript-14.31.1 → cc_transcript-14.32.1}/cc_transcript/mining/sampling.py +0 -0
- {cc_transcript-14.31.1 → cc_transcript-14.32.1}/cc_transcript/mining/signals.py +0 -0
- {cc_transcript-14.31.1 → cc_transcript-14.32.1}/cc_transcript/mining/sourcekind.py +0 -0
- {cc_transcript-14.31.1 → cc_transcript-14.32.1}/cc_transcript/mining/spec.py +0 -0
- {cc_transcript-14.31.1 → cc_transcript-14.32.1}/cc_transcript/mining/store.py +0 -0
- {cc_transcript-14.31.1 → cc_transcript-14.32.1}/cc_transcript/models.py +0 -0
- {cc_transcript-14.31.1 → cc_transcript-14.32.1}/cc_transcript/nlp.py +0 -0
- {cc_transcript-14.31.1 → cc_transcript-14.32.1}/cc_transcript/notifications.py +0 -0
- {cc_transcript-14.31.1 → cc_transcript-14.32.1}/cc_transcript/parser.py +0 -0
- {cc_transcript-14.31.1 → cc_transcript-14.32.1}/cc_transcript/py.typed +0 -0
- {cc_transcript-14.31.1 → cc_transcript-14.32.1}/cc_transcript/query.py +0 -0
- {cc_transcript-14.31.1 → cc_transcript-14.32.1}/cc_transcript/render.py +0 -0
- {cc_transcript-14.31.1 → cc_transcript-14.32.1}/cc_transcript/sentiment/__init__.py +0 -0
- {cc_transcript-14.31.1 → cc_transcript-14.32.1}/cc_transcript/sentiment/buckets.py +0 -0
- {cc_transcript-14.31.1 → cc_transcript-14.32.1}/cc_transcript/sentiment/data/afinn-en-165.tsv +0 -0
- {cc_transcript-14.31.1 → cc_transcript-14.32.1}/cc_transcript/sentiment/data/domain_overrides.tsv +0 -0
- {cc_transcript-14.31.1 → cc_transcript-14.32.1}/cc_transcript/sentiment/data/en-ewt.udpipe +0 -0
- {cc_transcript-14.31.1 → cc_transcript-14.32.1}/cc_transcript/sentiment/engine.py +0 -0
- {cc_transcript-14.31.1 → cc_transcript-14.32.1}/cc_transcript/sentiment/lexicon.py +0 -0
- {cc_transcript-14.31.1 → cc_transcript-14.32.1}/cc_transcript/sentiment/scorespec.py +0 -0
- {cc_transcript-14.31.1 → cc_transcript-14.32.1}/cc_transcript/snapshot_schema/config.schema.json +0 -0
- {cc_transcript-14.31.1 → cc_transcript-14.32.1}/cc_transcript/snapshot_schema/context.schema.json +0 -0
- {cc_transcript-14.31.1 → cc_transcript-14.32.1}/cc_transcript/snapshot_schema/request.schema.json +0 -0
- {cc_transcript-14.31.1 → cc_transcript-14.32.1}/cc_transcript/snapshot_schema/response.schema.json +0 -0
- {cc_transcript-14.31.1 → cc_transcript-14.32.1}/cc_transcript/snapshot_schema/tool_registry.schema.json +0 -0
- {cc_transcript-14.31.1 → cc_transcript-14.32.1}/cc_transcript/snapshots.py +0 -0
- {cc_transcript-14.31.1 → cc_transcript-14.32.1}/cc_transcript/synthetic.py +0 -0
- {cc_transcript-14.31.1 → cc_transcript-14.32.1}/cc_transcript/tools.py +0 -0
- {cc_transcript-14.31.1 → cc_transcript-14.32.1}/cc_transcript/watch.py +0 -0
- {cc_transcript-14.31.1 → cc_transcript-14.32.1}/rust/crates/cli/Cargo.toml +0 -0
- {cc_transcript-14.31.1 → cc_transcript-14.32.1}/rust/crates/cli/src/commands/blame.rs +0 -0
- {cc_transcript-14.31.1 → cc_transcript-14.32.1}/rust/crates/cli/src/commands/corpus.rs +0 -0
- {cc_transcript-14.31.1 → cc_transcript-14.32.1}/rust/crates/cli/src/commands/corrections.rs +0 -0
- {cc_transcript-14.31.1 → cc_transcript-14.32.1}/rust/crates/cli/src/commands/digest.rs +0 -0
- {cc_transcript-14.31.1 → cc_transcript-14.32.1}/rust/crates/cli/src/commands/facts.rs +0 -0
- {cc_transcript-14.31.1 → cc_transcript-14.32.1}/rust/crates/cli/src/commands/grep.rs +0 -0
- {cc_transcript-14.31.1 → cc_transcript-14.32.1}/rust/crates/cli/src/commands/list.rs +0 -0
- {cc_transcript-14.31.1 → cc_transcript-14.32.1}/rust/crates/cli/src/commands/mod.rs +0 -0
- {cc_transcript-14.31.1 → cc_transcript-14.32.1}/rust/crates/cli/src/commands/scratchpad.rs +0 -0
- {cc_transcript-14.31.1 → cc_transcript-14.32.1}/rust/crates/cli/src/commands/show.rs +0 -0
- {cc_transcript-14.31.1 → cc_transcript-14.32.1}/rust/crates/cli/src/commands/slice.rs +0 -0
- {cc_transcript-14.31.1 → cc_transcript-14.32.1}/rust/crates/cli/src/commands/stats.rs +0 -0
- {cc_transcript-14.31.1 → cc_transcript-14.32.1}/rust/crates/cli/src/commands/watch.rs +0 -0
- {cc_transcript-14.31.1 → cc_transcript-14.32.1}/rust/crates/cli/src/lib.rs +0 -0
- {cc_transcript-14.31.1 → cc_transcript-14.32.1}/rust/crates/cli/src/main.rs +0 -0
- {cc_transcript-14.31.1 → cc_transcript-14.32.1}/rust/crates/cli/src/output.rs +0 -0
- {cc_transcript-14.31.1 → cc_transcript-14.32.1}/rust/crates/cli/src/target.rs +0 -0
- {cc_transcript-14.31.1 → cc_transcript-14.32.1}/rust/crates/cli/src/timearg.rs +0 -0
- {cc_transcript-14.31.1 → cc_transcript-14.32.1}/rust/crates/core/Cargo.toml +0 -0
- {cc_transcript-14.31.1 → cc_transcript-14.32.1}/rust/crates/core/benches/parse.rs +0 -0
- {cc_transcript-14.31.1 → cc_transcript-14.32.1}/rust/crates/core/benches/render.rs +0 -0
- {cc_transcript-14.31.1 → cc_transcript-14.32.1}/rust/crates/core/benches/toolcall.rs +0 -0
- {cc_transcript-14.31.1 → cc_transcript-14.32.1}/rust/crates/core/src/activity.rs +0 -0
- {cc_transcript-14.31.1 → cc_transcript-14.32.1}/rust/crates/core/src/actor.rs +0 -0
- {cc_transcript-14.31.1 → cc_transcript-14.32.1}/rust/crates/core/src/blame.rs +0 -0
- {cc_transcript-14.31.1 → cc_transcript-14.32.1}/rust/crates/core/src/buckets.rs +0 -0
- {cc_transcript-14.31.1 → cc_transcript-14.32.1}/rust/crates/core/src/codex/discovery.rs +0 -0
- {cc_transcript-14.31.1 → cc_transcript-14.32.1}/rust/crates/core/src/codex/lower.rs +0 -0
- {cc_transcript-14.31.1 → cc_transcript-14.32.1}/rust/crates/core/src/codex/mod.rs +0 -0
- {cc_transcript-14.31.1 → cc_transcript-14.32.1}/rust/crates/core/src/codex/parse.rs +0 -0
- {cc_transcript-14.31.1 → cc_transcript-14.32.1}/rust/crates/core/src/codex/probe.rs +0 -0
- {cc_transcript-14.31.1 → cc_transcript-14.32.1}/rust/crates/core/src/codex/protocol.rs +0 -0
- {cc_transcript-14.31.1 → cc_transcript-14.32.1}/rust/crates/core/src/codex/types.rs +0 -0
- {cc_transcript-14.31.1 → cc_transcript-14.32.1}/rust/crates/core/src/command.rs +0 -0
- {cc_transcript-14.31.1 → cc_transcript-14.32.1}/rust/crates/core/src/context.rs +0 -0
- {cc_transcript-14.31.1 → cc_transcript-14.32.1}/rust/crates/core/src/corrections.rs +0 -0
- {cc_transcript-14.31.1 → cc_transcript-14.32.1}/rust/crates/core/src/cost.rs +0 -0
- {cc_transcript-14.31.1 → cc_transcript-14.32.1}/rust/crates/core/src/discovery.rs +0 -0
- {cc_transcript-14.31.1 → cc_transcript-14.32.1}/rust/crates/core/src/facts.rs +0 -0
- {cc_transcript-14.31.1 → cc_transcript-14.32.1}/rust/crates/core/src/feedback.rs +0 -0
- {cc_transcript-14.31.1 → cc_transcript-14.32.1}/rust/crates/core/src/filter.rs +0 -0
- {cc_transcript-14.31.1 → cc_transcript-14.32.1}/rust/crates/core/src/gateway.rs +0 -0
- {cc_transcript-14.31.1 → cc_transcript-14.32.1}/rust/crates/core/src/ids.rs +0 -0
- {cc_transcript-14.31.1 → cc_transcript-14.32.1}/rust/crates/core/src/judge.rs +0 -0
- {cc_transcript-14.31.1 → cc_transcript-14.32.1}/rust/crates/core/src/lib.rs +0 -0
- {cc_transcript-14.31.1 → cc_transcript-14.32.1}/rust/crates/core/src/literals/command.rs +0 -0
- {cc_transcript-14.31.1 → cc_transcript-14.32.1}/rust/crates/core/src/literals/corrections.rs +0 -0
- {cc_transcript-14.31.1 → cc_transcript-14.32.1}/rust/crates/core/src/literals/feedback.rs +0 -0
- {cc_transcript-14.31.1 → cc_transcript-14.32.1}/rust/crates/core/src/literals/mining.rs +0 -0
- {cc_transcript-14.31.1 → cc_transcript-14.32.1}/rust/crates/core/src/literals/mod.rs +0 -0
- {cc_transcript-14.31.1 → cc_transcript-14.32.1}/rust/crates/core/src/literals/protocol.rs +0 -0
- {cc_transcript-14.31.1 → cc_transcript-14.32.1}/rust/crates/core/src/notifications.rs +0 -0
- {cc_transcript-14.31.1 → cc_transcript-14.32.1}/rust/crates/core/src/parse.rs +0 -0
- {cc_transcript-14.31.1 → cc_transcript-14.32.1}/rust/crates/core/src/protocol.rs +0 -0
- {cc_transcript-14.31.1 → cc_transcript-14.32.1}/rust/crates/core/src/pystr.rs +0 -0
- {cc_transcript-14.31.1 → cc_transcript-14.32.1}/rust/crates/core/src/query.rs +0 -0
- {cc_transcript-14.31.1 → cc_transcript-14.32.1}/rust/crates/core/src/render.rs +0 -0
- {cc_transcript-14.31.1 → cc_transcript-14.32.1}/rust/crates/core/src/rng.rs +0 -0
- {cc_transcript-14.31.1 → cc_transcript-14.32.1}/rust/crates/core/src/scan.rs +0 -0
- {cc_transcript-14.31.1 → cc_transcript-14.32.1}/rust/crates/core/src/scan_grep.rs +0 -0
- {cc_transcript-14.31.1 → cc_transcript-14.32.1}/rust/crates/core/src/scan_regressions.rs +0 -0
- {cc_transcript-14.31.1 → cc_transcript-14.32.1}/rust/crates/core/src/schema.rs +0 -0
- {cc_transcript-14.31.1 → cc_transcript-14.32.1}/rust/crates/core/src/snapshot_activity.rs +0 -0
- {cc_transcript-14.31.1 → cc_transcript-14.32.1}/rust/crates/core/src/snapshot_codex_append.rs +0 -0
- {cc_transcript-14.31.1 → cc_transcript-14.32.1}/rust/crates/core/src/snapshot_labels.rs +0 -0
- {cc_transcript-14.31.1 → cc_transcript-14.32.1}/rust/crates/core/src/snapshot_memory.rs +0 -0
- {cc_transcript-14.31.1 → cc_transcript-14.32.1}/rust/crates/core/src/snapshot_owned.rs +0 -0
- {cc_transcript-14.31.1 → cc_transcript-14.32.1}/rust/crates/core/src/snapshot_prepared.rs +0 -0
- {cc_transcript-14.31.1 → cc_transcript-14.32.1}/rust/crates/core/src/snapshot_prepared_disk.rs +0 -0
- {cc_transcript-14.31.1 → cc_transcript-14.32.1}/rust/crates/core/src/snapshot_regressions.rs +0 -0
- {cc_transcript-14.31.1 → cc_transcript-14.32.1}/rust/crates/core/src/snapshot_root_warm.rs +0 -0
- {cc_transcript-14.31.1 → cc_transcript-14.32.1}/rust/crates/core/src/snapshot_text.rs +0 -0
- {cc_transcript-14.31.1 → cc_transcript-14.32.1}/rust/crates/core/src/sqlite.rs +0 -0
- {cc_transcript-14.31.1 → cc_transcript-14.32.1}/rust/crates/core/src/toolcall.rs +0 -0
- {cc_transcript-14.31.1 → cc_transcript-14.32.1}/rust/crates/core/src/types.rs +0 -0
- {cc_transcript-14.31.1 → cc_transcript-14.32.1}/rust/crates/core/src/value.rs +0 -0
- {cc_transcript-14.31.1 → cc_transcript-14.32.1}/rust/crates/core/src/watch.rs +0 -0
- {cc_transcript-14.31.1 → cc_transcript-14.32.1}/rust/crates/py/Cargo.toml +0 -0
- {cc_transcript-14.31.1 → cc_transcript-14.32.1}/rust/crates/py/build.rs +0 -0
- {cc_transcript-14.31.1 → cc_transcript-14.32.1}/rust/crates/py/data/command_prefix_pins.tsv +0 -0
- {cc_transcript-14.31.1 → cc_transcript-14.32.1}/rust/crates/py/src/actor_bridge.rs +0 -0
- {cc_transcript-14.31.1 → cc_transcript-14.32.1}/rust/crates/py/src/bin/stub_gen.rs +0 -0
- {cc_transcript-14.31.1 → cc_transcript-14.32.1}/rust/crates/py/src/codex.rs +0 -0
- {cc_transcript-14.31.1 → cc_transcript-14.32.1}/rust/crates/py/src/command.rs +0 -0
- {cc_transcript-14.31.1 → cc_transcript-14.32.1}/rust/crates/py/src/context.rs +0 -0
- {cc_transcript-14.31.1 → cc_transcript-14.32.1}/rust/crates/py/src/corrections.rs +0 -0
- {cc_transcript-14.31.1 → cc_transcript-14.32.1}/rust/crates/py/src/discovery.rs +0 -0
- {cc_transcript-14.31.1 → cc_transcript-14.32.1}/rust/crates/py/src/feedback.rs +0 -0
- {cc_transcript-14.31.1 → cc_transcript-14.32.1}/rust/crates/py/src/judge.rs +0 -0
- {cc_transcript-14.31.1 → cc_transcript-14.32.1}/rust/crates/py/src/lexicon.rs +0 -0
- {cc_transcript-14.31.1 → cc_transcript-14.32.1}/rust/crates/py/src/lib.rs +0 -0
- {cc_transcript-14.31.1 → cc_transcript-14.32.1}/rust/crates/py/src/mining.rs +0 -0
- {cc_transcript-14.31.1 → cc_transcript-14.32.1}/rust/crates/py/src/nlp.rs +0 -0
- {cc_transcript-14.31.1 → cc_transcript-14.32.1}/rust/crates/py/src/python.rs +0 -0
- {cc_transcript-14.31.1 → cc_transcript-14.32.1}/rust/crates/py/src/render.rs +0 -0
- {cc_transcript-14.31.1 → cc_transcript-14.32.1}/rust/crates/py/src/score.rs +0 -0
- {cc_transcript-14.31.1 → cc_transcript-14.32.1}/rust/crates/py/src/snapshot_decode.rs +0 -0
- {cc_transcript-14.31.1 → cc_transcript-14.32.1}/rust/crates/py/src/snapshots.rs +0 -0
- {cc_transcript-14.31.1 → cc_transcript-14.32.1}/rust/crates/py/src/sqlite.rs +0 -0
- {cc_transcript-14.31.1 → cc_transcript-14.32.1}/rust/crates/py/src/toolcall.rs +0 -0
- {cc_transcript-14.31.1 → cc_transcript-14.32.1}/rust/crates/py/src/views/attachment.rs +0 -0
- {cc_transcript-14.31.1 → cc_transcript-14.32.1}/rust/crates/py/src/views/blocks.rs +0 -0
- {cc_transcript-14.31.1 → cc_transcript-14.32.1}/rust/crates/py/src/views/command.rs +0 -0
- {cc_transcript-14.31.1 → cc_transcript-14.32.1}/rust/crates/py/src/views/convert.rs +0 -0
- {cc_transcript-14.31.1 → cc_transcript-14.32.1}/rust/crates/py/src/views/dunder.rs +0 -0
- {cc_transcript-14.31.1 → cc_transcript-14.32.1}/rust/crates/py/src/views/events.rs +0 -0
- {cc_transcript-14.31.1 → cc_transcript-14.32.1}/rust/crates/py/src/views/meta.rs +0 -0
- {cc_transcript-14.31.1 → cc_transcript-14.32.1}/rust/crates/py/src/views/mod.rs +0 -0
- {cc_transcript-14.31.1 → cc_transcript-14.32.1}/rust/crates/py/src/views/print.rs +0 -0
- {cc_transcript-14.31.1 → cc_transcript-14.32.1}/rust/crates/py/src/views/store.rs +0 -0
- {cc_transcript-14.31.1 → cc_transcript-14.32.1}/rust/crates/py/src/views/system.rs +0 -0
- {cc_transcript-14.31.1 → cc_transcript-14.32.1}/rust/crates/py/src/views/toolcall.rs +0 -0
- {cc_transcript-14.31.1 → cc_transcript-14.32.1}/rust/crates/py/src/views/toolresult.rs +0 -0
- {cc_transcript-14.31.1 → cc_transcript-14.32.1}/rust/crates/py/src/views/transcript.rs +0 -0
- {cc_transcript-14.31.1 → cc_transcript-14.32.1}/rust/crates/py/src/watch.rs +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
[project]
|
|
2
2
|
name = "cc-transcript"
|
|
3
|
-
version = "14.
|
|
3
|
+
version = "14.32.1" # informational — releases stamp the version from the git tag
|
|
4
4
|
description = "Grep every Claude Code session you've ever run."
|
|
5
5
|
readme = "README.md"
|
|
6
6
|
license = "PolyForm-Noncommercial-1.0.0"
|
|
@@ -689,7 +689,7 @@ struct PreparedQueryCursor {
|
|
|
689
689
|
graph_id: String,
|
|
690
690
|
query: Value,
|
|
691
691
|
pending: Option<PendingPreparedSource>,
|
|
692
|
-
|
|
692
|
+
input_records: Option<VecDeque<String>>,
|
|
693
693
|
next: usize,
|
|
694
694
|
page_output_bytes: usize,
|
|
695
695
|
remaining: WorkLimits,
|
|
@@ -764,7 +764,7 @@ struct GraphCursor {
|
|
|
764
764
|
prepared: bool,
|
|
765
765
|
root_checked: bool,
|
|
766
766
|
projection_at: usize,
|
|
767
|
-
|
|
767
|
+
pending_records: VecDeque<(usize, String)>,
|
|
768
768
|
published_members: Vec<usize>,
|
|
769
769
|
expires: u64,
|
|
770
770
|
accounted: usize,
|
|
@@ -2488,9 +2488,8 @@ impl NativeStore {
|
|
|
2488
2488
|
.projections
|
|
2489
2489
|
.values()
|
|
2490
2490
|
.map(|cursor| {
|
|
2491
|
-
crate::snapshot_memory::value_charge(&cursor.request)
|
|
2492
|
-
|
|
2493
|
-
.opaque_dom_accounted_bytes
|
|
2491
|
+
let charge = crate::snapshot_memory::value_charge(&cursor.request);
|
|
2492
|
+
charge.owned_capacity_bytes + charge.opaque_dom_accounted_bytes
|
|
2494
2493
|
})
|
|
2495
2494
|
.sum();
|
|
2496
2495
|
let graph_bytes: usize = state
|
|
@@ -2508,7 +2507,10 @@ impl NativeStore {
|
|
|
2508
2507
|
.values()
|
|
2509
2508
|
.map(|cursor| {
|
|
2510
2509
|
size_of::<PreparedQueryCursor>()
|
|
2511
|
-
+ cursor
|
|
2510
|
+
+ cursor
|
|
2511
|
+
.input_records
|
|
2512
|
+
.as_ref()
|
|
2513
|
+
.map_or(0, |records| records.iter().map(String::capacity).sum())
|
|
2512
2514
|
+ crate::snapshot_memory::value_charge(&cursor.query).owned_capacity_bytes
|
|
2513
2515
|
})
|
|
2514
2516
|
.sum::<usize>()
|
|
@@ -2666,24 +2668,25 @@ impl NativeStore {
|
|
|
2666
2668
|
let cap = self.memory_cap(context)?;
|
|
2667
2669
|
if number(&Self::gauges(state), "retained_total_accounted_bytes")?
|
|
2668
2670
|
.saturating_add(additional)
|
|
2669
|
-
|
|
2671
|
+
<= cap
|
|
2670
2672
|
{
|
|
2671
|
-
|
|
2672
|
-
.lock()
|
|
2673
|
-
.expect("classified snapshots")
|
|
2674
|
-
.retain(|_, snapshot| Arc::strong_count(snapshot) > 1);
|
|
2675
|
-
let leased: HashSet<_> = state
|
|
2676
|
-
.leases
|
|
2677
|
-
.values()
|
|
2678
|
-
.map(|lease| lease.snapshot.id.clone())
|
|
2679
|
-
.collect();
|
|
2680
|
-
state.latest.retain(|_, snapshot| {
|
|
2681
|
-
leased.contains(&snapshot.id) || Arc::strong_count(snapshot) > 1
|
|
2682
|
-
});
|
|
2683
|
-
state
|
|
2684
|
-
.carried_classifications
|
|
2685
|
-
.retain(|_, carried| Arc::strong_count(carried) > 1);
|
|
2673
|
+
return Ok(());
|
|
2686
2674
|
}
|
|
2675
|
+
self.classified
|
|
2676
|
+
.lock()
|
|
2677
|
+
.expect("classified snapshots")
|
|
2678
|
+
.retain(|_, snapshot| Arc::strong_count(snapshot) > 1);
|
|
2679
|
+
let leased: HashSet<_> = state
|
|
2680
|
+
.leases
|
|
2681
|
+
.values()
|
|
2682
|
+
.map(|lease| lease.snapshot.id.clone())
|
|
2683
|
+
.collect();
|
|
2684
|
+
state
|
|
2685
|
+
.latest
|
|
2686
|
+
.retain(|_, snapshot| leased.contains(&snapshot.id) || Arc::strong_count(snapshot) > 1);
|
|
2687
|
+
state
|
|
2688
|
+
.carried_classifications
|
|
2689
|
+
.retain(|_, carried| Arc::strong_count(carried) > 1);
|
|
2687
2690
|
if number(&Self::gauges(state), "retained_total_accounted_bytes")?
|
|
2688
2691
|
.saturating_add(additional)
|
|
2689
2692
|
> cap
|
|
@@ -5071,7 +5074,7 @@ impl NativeStore {
|
|
|
5071
5074
|
prepared: false,
|
|
5072
5075
|
root_checked: false,
|
|
5073
5076
|
projection_at: 0,
|
|
5074
|
-
|
|
5077
|
+
pending_records: VecDeque::new(),
|
|
5075
5078
|
published_members: Vec::new(),
|
|
5076
5079
|
expires: (now_ms() + self.config.ttl).min(bounds.deadline_unix_ms),
|
|
5077
5080
|
accounted: 0,
|
|
@@ -5152,9 +5155,10 @@ impl NativeStore {
|
|
|
5152
5155
|
.sum::<usize>()
|
|
5153
5156
|
+ graph.tasks.capacity() * size_of::<GraphTask>()
|
|
5154
5157
|
+ graph
|
|
5155
|
-
.
|
|
5156
|
-
.
|
|
5157
|
-
.
|
|
5158
|
+
.pending_records
|
|
5159
|
+
.iter()
|
|
5160
|
+
.map(|(_, record)| record.capacity())
|
|
5161
|
+
.sum::<usize>()
|
|
5158
5162
|
+ graph.listing.as_ref().map_or(0, |listing| {
|
|
5159
5163
|
listing
|
|
5160
5164
|
.children
|
|
@@ -5566,7 +5570,7 @@ impl NativeStore {
|
|
|
5566
5570
|
let mut output_bytes = 128usize;
|
|
5567
5571
|
let page_limit = self.config.page_items.min(graph.remaining.max_items);
|
|
5568
5572
|
let mut projected = 0usize;
|
|
5569
|
-
while graph.projection_at < total || graph.
|
|
5573
|
+
while graph.projection_at < total || !graph.pending_records.is_empty() {
|
|
5570
5574
|
cancel.check(graph.remaining.deadline_unix_ms)?;
|
|
5571
5575
|
if boolean && projected >= self.config.page_items {
|
|
5572
5576
|
return Ok(GraphYield::Pending(Value::new_null()));
|
|
@@ -5574,7 +5578,7 @@ impl NativeStore {
|
|
|
5574
5578
|
if records.len() >= page_limit {
|
|
5575
5579
|
break;
|
|
5576
5580
|
}
|
|
5577
|
-
let (index, record) = if let Some(pending) = graph.
|
|
5581
|
+
let (index, record) = if let Some(pending) = graph.pending_records.pop_front() {
|
|
5578
5582
|
pending
|
|
5579
5583
|
} else {
|
|
5580
5584
|
let position = if reverse {
|
|
@@ -5607,27 +5611,27 @@ impl NativeStore {
|
|
|
5607
5611
|
let mut bounds = graph.remaining;
|
|
5608
5612
|
bounds.max_items = 1;
|
|
5609
5613
|
bounds.max_output_bytes = bounds.max_output_bytes.min(MAX_DATA_BYTES);
|
|
5610
|
-
let projection = crate::snapshot_projection::project(
|
|
5611
|
-
&node.snapshot,
|
|
5612
|
-
&request,
|
|
5613
|
-
&bounds,
|
|
5614
|
-
cancel,
|
|
5615
|
-
0,
|
|
5616
|
-
)?;
|
|
5617
|
-
graph.remaining.max_read_bytes = graph
|
|
5618
|
-
.remaining
|
|
5619
|
-
.max_read_bytes
|
|
5620
|
-
.saturating_sub(projection.read_bytes);
|
|
5621
|
-
graph.remaining.max_events =
|
|
5622
|
-
graph.remaining.max_events.saturating_sub(projection.events);
|
|
5623
|
-
if !projection.complete {
|
|
5624
|
-
return Err(SnapshotError::new(
|
|
5625
|
-
Status::Incomplete,
|
|
5626
|
-
"graph member projection incomplete",
|
|
5627
|
-
));
|
|
5628
|
-
}
|
|
5629
|
-
graph.projection_at += 1;
|
|
5630
5614
|
if boolean {
|
|
5615
|
+
let projection = crate::snapshot_projection::project(
|
|
5616
|
+
&node.snapshot,
|
|
5617
|
+
&request,
|
|
5618
|
+
&bounds,
|
|
5619
|
+
cancel,
|
|
5620
|
+
0,
|
|
5621
|
+
)?;
|
|
5622
|
+
graph.remaining.max_read_bytes = graph
|
|
5623
|
+
.remaining
|
|
5624
|
+
.max_read_bytes
|
|
5625
|
+
.saturating_sub(projection.read_bytes);
|
|
5626
|
+
graph.remaining.max_events =
|
|
5627
|
+
graph.remaining.max_events.saturating_sub(projection.events);
|
|
5628
|
+
if !projection.complete {
|
|
5629
|
+
return Err(SnapshotError::new(
|
|
5630
|
+
Status::Incomplete,
|
|
5631
|
+
"graph member projection incomplete",
|
|
5632
|
+
));
|
|
5633
|
+
}
|
|
5634
|
+
graph.projection_at += 1;
|
|
5631
5635
|
projected += 1;
|
|
5632
5636
|
if projection.data["value"].as_bool() == Some(true) {
|
|
5633
5637
|
return Ok(GraphYield::Complete(projection.data));
|
|
@@ -5637,20 +5641,29 @@ impl NativeStore {
|
|
|
5637
5641
|
}
|
|
5638
5642
|
continue;
|
|
5639
5643
|
}
|
|
5640
|
-
(
|
|
5641
|
-
|
|
5642
|
-
|
|
5643
|
-
|
|
5644
|
-
|
|
5645
|
-
|
|
5646
|
-
|
|
5644
|
+
let (member_records, read_bytes, events) =
|
|
5645
|
+
crate::snapshot_projection::predicate_input_records(
|
|
5646
|
+
&node.snapshot,
|
|
5647
|
+
&request["view"]["selectors"],
|
|
5648
|
+
&bounds,
|
|
5649
|
+
cancel,
|
|
5650
|
+
)?;
|
|
5651
|
+
graph.remaining.max_read_bytes =
|
|
5652
|
+
graph.remaining.max_read_bytes.saturating_sub(read_bytes);
|
|
5653
|
+
graph.remaining.max_events = graph.remaining.max_events.saturating_sub(events);
|
|
5654
|
+
graph.projection_at += 1;
|
|
5655
|
+
let mut member_records =
|
|
5656
|
+
member_records.into_iter().map(|record| (index, record));
|
|
5657
|
+
let first = member_records.next().expect("predicate member record");
|
|
5658
|
+
graph.pending_records.extend(member_records);
|
|
5659
|
+
first
|
|
5647
5660
|
}
|
|
5648
5661
|
};
|
|
5649
5662
|
let record_bytes = encoded_size(&json!(&record), MAX_DATA_BYTES)?;
|
|
5650
5663
|
if output_bytes.saturating_add(record_bytes)
|
|
5651
5664
|
> graph.remaining.max_output_bytes.min(MAX_DATA_BYTES)
|
|
5652
5665
|
{
|
|
5653
|
-
graph.
|
|
5666
|
+
graph.pending_records.push_front((index, record));
|
|
5654
5667
|
if records.is_empty() {
|
|
5655
5668
|
return Err(SnapshotError::new(
|
|
5656
5669
|
Status::OutputLimit,
|
|
@@ -5674,7 +5687,7 @@ impl NativeStore {
|
|
|
5674
5687
|
.remaining
|
|
5675
5688
|
.max_items
|
|
5676
5689
|
.saturating_sub(data["records_json"].as_array().expect("records").len());
|
|
5677
|
-
if graph.projection_at >= total && graph.
|
|
5690
|
+
if graph.projection_at >= total && graph.pending_records.is_empty() {
|
|
5678
5691
|
Ok(GraphYield::Complete(data))
|
|
5679
5692
|
} else if graph.remaining.max_items == 0 {
|
|
5680
5693
|
Err(SnapshotError::new(
|
|
@@ -7055,6 +7068,34 @@ mod tests {
|
|
|
7055
7068
|
);
|
|
7056
7069
|
}
|
|
7057
7070
|
|
|
7071
|
+
#[test]
|
|
7072
|
+
fn projection_reservations_preserve_exact_admission_caps_and_release_capacity() {
|
|
7073
|
+
for background in [false, true] {
|
|
7074
|
+
let store = store();
|
|
7075
|
+
let mut owner = context("a");
|
|
7076
|
+
if background {
|
|
7077
|
+
owner.insert("work_class", json!("background"));
|
|
7078
|
+
}
|
|
7079
|
+
let baseline = store.retained_accounted_bytes();
|
|
7080
|
+
let cap = if background {
|
|
7081
|
+
32 * 1024 * 1024 - 4096
|
|
7082
|
+
} else {
|
|
7083
|
+
32 * 1024 * 1024
|
|
7084
|
+
};
|
|
7085
|
+
let reservation = store.reserve_projection(&owner, cap - baseline).unwrap();
|
|
7086
|
+
assert_eq!(store.retained_accounted_bytes(), cap);
|
|
7087
|
+
let refused = store.reserve_projection(&owner, 1);
|
|
7088
|
+
assert!(matches!(refused, Err(error) if error.status == Status::RetainedLimit));
|
|
7089
|
+
assert_eq!(store.retained_accounted_bytes(), cap);
|
|
7090
|
+
drop(reservation);
|
|
7091
|
+
assert_eq!(store.retained_accounted_bytes(), baseline);
|
|
7092
|
+
let reused = store.reserve_projection(&owner, cap - baseline).unwrap();
|
|
7093
|
+
assert_eq!(store.retained_accounted_bytes(), cap);
|
|
7094
|
+
drop(reused);
|
|
7095
|
+
assert_eq!(store.retained_accounted_bytes(), baseline);
|
|
7096
|
+
}
|
|
7097
|
+
}
|
|
7098
|
+
|
|
7058
7099
|
#[test]
|
|
7059
7100
|
fn escaped_borrowed_entries_remain_accounted_after_release() {
|
|
7060
7101
|
let source = Source::new(&format!("{}\n", user("a")));
|
|
@@ -9251,6 +9292,78 @@ mod tests {
|
|
|
9251
9292
|
assert_eq!(after[15], after_first[15]);
|
|
9252
9293
|
}
|
|
9253
9294
|
|
|
9295
|
+
#[test]
|
|
9296
|
+
fn deep_predicate_inputs_split_a_window_over_the_record_bound() {
|
|
9297
|
+
let commands: Vec<String> = (0..48)
|
|
9298
|
+
.map(|index| format!("echo {index:02} {}", "x".repeat(32 * 1024)))
|
|
9299
|
+
.collect();
|
|
9300
|
+
let tools: String = commands
|
|
9301
|
+
.iter()
|
|
9302
|
+
.enumerate()
|
|
9303
|
+
.map(|(index, command)| format!(
|
|
9304
|
+
"{}\n",
|
|
9305
|
+
format_args!(r#"{{"type":"assistant","uuid":"tool-{index}","sessionId":"s","timestamp":"2026-01-02T03:04:06Z","message":{{"model":"test","content":[{{"type":"tool_use","id":"bash-{index}","name":"Bash","input":{{"command":"{command}"}}}}]}}}}"#)
|
|
9306
|
+
))
|
|
9307
|
+
.collect();
|
|
9308
|
+
let source = Source::new(&format!("{}\n{tools}", user("root")));
|
|
9309
|
+
let store = NativeStore::new(&json!({"max_read_bytes_per_step":4*1024*1024,"max_events_per_step":256,"max_entry_bytes":64*1024,"max_retained_bytes":64*1024*1024,"reserved_hook_accounted_bytes":4096,"max_leases":16,"reserved_hook_leases":1})).unwrap();
|
|
9310
|
+
let owner = context("a");
|
|
9311
|
+
let mut template = acquire(&source.path);
|
|
9312
|
+
template["limits"].insert("max_read_bytes", json!(64 * 1024 * 1024));
|
|
9313
|
+
template["limits"].insert("max_source_read_bytes", json!(64 * 1024 * 1024));
|
|
9314
|
+
template["limits"].insert("max_output_bytes", json!(16 * 1024 * 1024));
|
|
9315
|
+
let root = finish(
|
|
9316
|
+
&store,
|
|
9317
|
+
store.request(&template, &owner, &Cancellation::default()),
|
|
9318
|
+
&owner,
|
|
9319
|
+
);
|
|
9320
|
+
let commands_of = |records: &[String]| -> Vec<String> {
|
|
9321
|
+
assert!(records.len() > 1, "{} records", records.len());
|
|
9322
|
+
for record in records {
|
|
9323
|
+
assert!(record.len() <= crate::snapshot_codec::MAX_RECORD_BYTES);
|
|
9324
|
+
}
|
|
9325
|
+
crate::snapshot_codec::decode_predicate_inputs(
|
|
9326
|
+
records,
|
|
9327
|
+
crate::snapshot_codec::MAX_PAGE_BYTES,
|
|
9328
|
+
)
|
|
9329
|
+
.unwrap()
|
|
9330
|
+
.into_iter()
|
|
9331
|
+
.flat_map(|record| record.commands)
|
|
9332
|
+
.collect()
|
|
9333
|
+
};
|
|
9334
|
+
let pages = |mut page: Value| -> Vec<String> {
|
|
9335
|
+
let mut records = Vec::new();
|
|
9336
|
+
for _ in 0..64 {
|
|
9337
|
+
records.extend(
|
|
9338
|
+
page["data"]["records_json"]
|
|
9339
|
+
.as_array()
|
|
9340
|
+
.unwrap_or_else(|| panic!("{page:?}"))
|
|
9341
|
+
.iter()
|
|
9342
|
+
.map(|item| item.as_str().unwrap().to_owned()),
|
|
9343
|
+
);
|
|
9344
|
+
if page["status"].as_str() == Some("ok") {
|
|
9345
|
+
return records;
|
|
9346
|
+
}
|
|
9347
|
+
assert_eq!(page["status"].as_str(), Some("incomplete"), "{page:?}");
|
|
9348
|
+
page = store.request(&json!({"schema":SCHEMA,"id":"resume","operation":"resume","cursor":page["cursor"]}), &owner, &Cancellation::default());
|
|
9349
|
+
}
|
|
9350
|
+
panic!("deep predicate inputs did not finish");
|
|
9351
|
+
};
|
|
9352
|
+
let mut query = graph_request(
|
|
9353
|
+
&root,
|
|
9354
|
+
json!({"kind":"deep_predicate_inputs","order":"forward"}),
|
|
9355
|
+
Vec::new(),
|
|
9356
|
+
json!([]),
|
|
9357
|
+
);
|
|
9358
|
+
query["limits"] = template["limits"].clone();
|
|
9359
|
+
let lease = pages(store.request(&query, &owner, &Cancellation::default()));
|
|
9360
|
+
assert_eq!(commands_of(&lease), commands);
|
|
9361
|
+
let prepare = finish_prepared(&store, store.request(&json!({"schema":SCHEMA,"id":"prepare","operation":"prepare_graph","view":{"handle":handle(&root),"classifier":{"id":"native","version":"1"},"selectors":[],"attachments":[]},"thread_ids":[],"roots":[],"direct_paths":[],"deadline_unix_ms":template["deadline_unix_ms"],"limits":template["limits"]}), &owner, &Cancellation::default()), &owner);
|
|
9362
|
+
assert_eq!(prepare["status"].as_str(), Some("ok"), "{prepare:?}");
|
|
9363
|
+
let prepared = pages(store.request(&json!({"schema":SCHEMA,"id":"inputs","operation":"query_graph","handle":prepare["data"]["handle"],"selectors":[],"query":{"kind":"deep_predicate_inputs","order":"forward"},"deadline_unix_ms":template["deadline_unix_ms"],"limits":template["limits"]}), &owner, &Cancellation::default()));
|
|
9364
|
+
assert_eq!(commands_of(&prepared), commands);
|
|
9365
|
+
}
|
|
9366
|
+
|
|
9254
9367
|
#[test]
|
|
9255
9368
|
fn expired_prepared_query_reports_deadline_after_pruning() {
|
|
9256
9369
|
let source = Source::new(&format!("{}\n", user("root")));
|
|
@@ -144,6 +144,48 @@ pub struct PredicateInputsRecord {
|
|
|
144
144
|
pub skills: Vec<String>,
|
|
145
145
|
}
|
|
146
146
|
|
|
147
|
+
pub const PREDICATE_INPUT_CHUNK_BYTES: usize = 256 * 1024;
|
|
148
|
+
|
|
149
|
+
pub fn predicate_input_records(inputs: &sonic_rs::Value) -> Result<Vec<String>, SnapshotError> {
|
|
150
|
+
use sonic_rs::JsonContainerTrait;
|
|
151
|
+
|
|
152
|
+
let mut records = Vec::new();
|
|
153
|
+
let mut fields: [Vec<String>; 4] = Default::default();
|
|
154
|
+
let mut bytes = 0usize;
|
|
155
|
+
for (slot, name) in ["calls", "commands", "edited_files", "skills"]
|
|
156
|
+
.into_iter()
|
|
157
|
+
.enumerate()
|
|
158
|
+
{
|
|
159
|
+
for item in inputs[name]
|
|
160
|
+
.as_array()
|
|
161
|
+
.expect("predicate input field")
|
|
162
|
+
.iter()
|
|
163
|
+
{
|
|
164
|
+
let item = encode(item, MAX_RECORD_BYTES)?;
|
|
165
|
+
let cost = encoded_size(item.as_str(), MAX_RECORD_BYTES)? + 1;
|
|
166
|
+
if bytes > 0 && bytes + cost > PREDICATE_INPUT_CHUNK_BYTES {
|
|
167
|
+
records.push(predicate_input_record(&fields));
|
|
168
|
+
fields = Default::default();
|
|
169
|
+
bytes = 0;
|
|
170
|
+
}
|
|
171
|
+
bytes += cost;
|
|
172
|
+
fields[slot].push(item);
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
records.push(predicate_input_record(&fields));
|
|
176
|
+
Ok(records)
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
fn predicate_input_record([calls, commands, edited_files, skills]: &[Vec<String>; 4]) -> String {
|
|
180
|
+
format!(
|
|
181
|
+
r#"{{"calls":[{}],"commands":[{}],"edited_files":[{}],"skills":[{}]}}"#,
|
|
182
|
+
calls.join(","),
|
|
183
|
+
commands.join(","),
|
|
184
|
+
edited_files.join(","),
|
|
185
|
+
skills.join(",")
|
|
186
|
+
)
|
|
187
|
+
}
|
|
188
|
+
|
|
147
189
|
#[derive(Debug, Serialize, Deserialize)]
|
|
148
190
|
#[serde(deny_unknown_fields)]
|
|
149
191
|
pub struct SidechainRecord {
|
{cc_transcript-14.31.1 → cc_transcript-14.32.1}/rust/crates/core/src/snapshot_prepared_service.rs
RENAMED
|
@@ -1465,8 +1465,8 @@ impl NativeStore {
|
|
|
1465
1465
|
}
|
|
1466
1466
|
(graph.sources.clone(), graph.sidechain_dirs.clone())
|
|
1467
1467
|
};
|
|
1468
|
-
let inputs = cursor.
|
|
1469
|
-
let total = sources.len()
|
|
1468
|
+
let inputs = cursor.input_records.is_some();
|
|
1469
|
+
let total = sources.len();
|
|
1470
1470
|
let mut records = Vec::new();
|
|
1471
1471
|
let mut bytes = 128usize;
|
|
1472
1472
|
let mut steps = 0usize;
|
|
@@ -1483,27 +1483,30 @@ impl NativeStore {
|
|
|
1483
1483
|
"prepared query output budget exhausted",
|
|
1484
1484
|
));
|
|
1485
1485
|
}
|
|
1486
|
-
while cursor.next < total
|
|
1486
|
+
while (cursor.next < total
|
|
1487
|
+
|| cursor.input_records.as_ref().is_some_and(|records| !records.is_empty()))
|
|
1487
1488
|
&& steps < page_steps
|
|
1488
1489
|
&& uncached_steps < 8
|
|
1489
1490
|
&& (!inputs || records.len() < page_items)
|
|
1490
1491
|
{
|
|
1491
1492
|
cancel.check(cursor.remaining.deadline_unix_ms)?;
|
|
1492
|
-
if
|
|
1493
|
-
let record = cursor.root_record.as_ref().expect("input root record").clone();
|
|
1493
|
+
if let Some(record) = cursor.input_records.as_mut().and_then(VecDeque::pop_front) {
|
|
1494
1494
|
let record_bytes = encoded_size(&json!(&record), MAX_DATA_BYTES)? + 1;
|
|
1495
1495
|
if bytes + record_bytes > output_limit {
|
|
1496
|
-
|
|
1497
|
-
|
|
1498
|
-
|
|
1499
|
-
|
|
1496
|
+
if records.is_empty() {
|
|
1497
|
+
return Err(SnapshotError::new(
|
|
1498
|
+
Status::OutputLimit,
|
|
1499
|
+
"prepared input record exceeds page bound",
|
|
1500
|
+
));
|
|
1501
|
+
}
|
|
1502
|
+
cursor.input_records.as_mut().expect("input records").push_front(record);
|
|
1503
|
+
break;
|
|
1500
1504
|
}
|
|
1501
1505
|
bytes += record_bytes;
|
|
1502
1506
|
records.push(record);
|
|
1503
|
-
cursor.next += 1;
|
|
1504
1507
|
continue;
|
|
1505
1508
|
}
|
|
1506
|
-
let source = &sources[cursor.next
|
|
1509
|
+
let source = &sources[cursor.next];
|
|
1507
1510
|
self.authority(context, Some(&source.path))?;
|
|
1508
1511
|
let metadata = std::fs::metadata(&source.path).map_err(io_error)?;
|
|
1509
1512
|
if SourceStamp::of(&metadata) != source.stamp {
|
|
@@ -1576,20 +1579,11 @@ impl NativeStore {
|
|
|
1576
1579
|
));
|
|
1577
1580
|
}
|
|
1578
1581
|
if inputs {
|
|
1579
|
-
|
|
1580
|
-
.
|
|
1581
|
-
|
|
1582
|
-
|
|
1583
|
-
|
|
1584
|
-
return Err(SnapshotError::new(
|
|
1585
|
-
Status::OutputLimit,
|
|
1586
|
-
"prepared input record exceeds page bound",
|
|
1587
|
-
));
|
|
1588
|
-
}
|
|
1589
|
-
break;
|
|
1590
|
-
}
|
|
1591
|
-
bytes += record_bytes;
|
|
1592
|
-
records.push(record);
|
|
1582
|
+
cursor
|
|
1583
|
+
.input_records
|
|
1584
|
+
.as_mut()
|
|
1585
|
+
.expect("input records")
|
|
1586
|
+
.extend(crate::snapshot_codec::predicate_input_records(&facts.inputs)?);
|
|
1593
1587
|
} else if facts.query(&cursor.query)?["value"].as_bool() == Some(true) {
|
|
1594
1588
|
let data = json!({"kind":"scalar","value":true});
|
|
1595
1589
|
encoded_size(&data, output_limit)?;
|
|
@@ -1599,7 +1593,9 @@ impl NativeStore {
|
|
|
1599
1593
|
steps += 1;
|
|
1600
1594
|
uncached_steps += usize::from(!cached);
|
|
1601
1595
|
}
|
|
1602
|
-
if cursor.next == total
|
|
1596
|
+
if cursor.next == total
|
|
1597
|
+
&& cursor.input_records.as_ref().is_none_or(VecDeque::is_empty)
|
|
1598
|
+
{
|
|
1603
1599
|
if !self.validate_source_stamps(
|
|
1604
1600
|
&sources,
|
|
1605
1601
|
context,
|
|
@@ -1781,8 +1777,10 @@ impl NativeStore {
|
|
|
1781
1777
|
encoded_size(&data, bounds.max_output_bytes)?;
|
|
1782
1778
|
return Ok((data, None, None));
|
|
1783
1779
|
}
|
|
1784
|
-
let
|
|
1785
|
-
Some(
|
|
1780
|
+
let input_records = if kind == "deep_predicate_inputs" {
|
|
1781
|
+
Some(VecDeque::from(crate::snapshot_codec::predicate_input_records(
|
|
1782
|
+
&root_facts.inputs,
|
|
1783
|
+
)?))
|
|
1786
1784
|
} else {
|
|
1787
1785
|
None
|
|
1788
1786
|
};
|
|
@@ -1791,7 +1789,7 @@ impl NativeStore {
|
|
|
1791
1789
|
graph_id: token.to_owned(),
|
|
1792
1790
|
query: query.clone(),
|
|
1793
1791
|
pending: None,
|
|
1794
|
-
|
|
1792
|
+
input_records,
|
|
1795
1793
|
next: 0,
|
|
1796
1794
|
page_output_bytes: bounds.max_output_bytes.min(MAX_DATA_BYTES),
|
|
1797
1795
|
remaining: bounds,
|