Skip to content

refactor: streamline message handling in Conversations component - #18

Merged
M3gA-Mind merged 1 commit into
tinyhumansai:developfrom
M3gA-Mind:develop
Mar 26, 2026
Merged

M3gA-Mind merged 1 commit into
tinyhumansai:developfrom
M3gA-Mind:develop

Conversation

@M3gA-Mind

Copy link
Copy Markdown
Collaborator
  • Reorganized imports for better clarity and consistency.
  • Removed unnecessary parameter from handleSendMessageWeb function to simplify its signature.
  • Updated error handling in sendMessage thunk to enhance readability by consolidating the dispatch call for error responses.

- Reorganized imports for better clarity and consistency.
- Removed unnecessary parameter from `handleSendMessageWeb` function to simplify its signature.
- Updated error handling in `sendMessage` thunk to enhance readability by consolidating the dispatch call for error responses.
@M3gA-Mind
M3gA-Mind merged commit e3bdaf7 into tinyhumansai:develop Mar 26, 2026
2 of 4 checks passed
sanil-23 referenced this pull request in sanil-23/openhuman Apr 28, 2026
…ems)

#4  gmail unknown bucket — orphan:{id} fallback instead of collapsing
    all no-address messages into one "unknown" source tree; messages with
    neither address nor id are dropped with a warn (skip sentinel).

#5  PII in gmail/ingest.rs — participants, source_id, and owner wrapped
    with redact() before logging; no email addresses in log output.

#7  PII in chunker.rs — source_id in debug logs replaced with
    redact(source_id) hash.

#8  Parent dir fsync after rename in atomic.rs — on Unix, open the parent
    directory and call sync_all() after a successful rename so the dirent
    is durable across a crash; best-effort warn on failure, non-fatal.

#9  Body verify on re-stage in atomic.rs — when the path already exists,
    read and hash the on-disk body; if sha differs from the new body,
    remove the stale file and re-write atomically so SQLite content_sha256
    always matches the on-disk bytes. New unit test covers the re-write path.

#10 PII in paths.rs — malformed source_id fallback log now emits
    redact(source_id) instead of the raw string.

#11 PII in read.rs — sha256 mismatch warn logs now emit
    redact(abs_path) instead of abs_path.display().

#13 Same-tx enqueue in handle_extract — append_buffer and topic_route
    jobs are built before the transaction opens and enqueued via
    enqueue_tx() inside the same tx that commits the lifecycle update,
    eliminating the crash window where lifecycle commits but jobs are lost.

#16 PII in score/extract/mod.rs — LLM extractor info! log demoted to
    debug! and endpoint wrapped with redact_endpoint() to strip
    path/query/credentials from the URL.

#17 Non-email scope slug in bucket_seal.rs — only the gmail: prefix is
    stripped before slugify; all other source kinds (slack:, discord:,
    document:, …) slugify the full scope string so slack:#eng and
    discord:#eng no longer produce the same "eng" slug and collide in
    summaries/source/.

#18 Don't commit summary on stage_summary failure — bucket_seal.rs,
    global_tree/digest.rs, and global_tree/seal.rs now propagate
    stage_summary errors via .context()?  instead of falling back to a
    NULL content_path row; the seal is retried via the normal job-retry
    path. insert_summary_tx callers in those three paths now always pass
    Some(&staged) instead of Option.

#20 PII in topic_tree/backfill.rs — all entity_id occurrences in log
    lines (info/debug/warn) replaced with redact(entity_id).

New shared helper: src/openhuman/memory/tree/util/redact.rs
  - redact(s)          → stable 8-hex-char SHA-256 prefix for PII fields
  - redact_endpoint(u) → host:port only (strips scheme, creds, path, query)
  - Full unit-test coverage for both helpers

Items #14 (lease tokens) and #19 (preview-vs-disk reader audit)
intentionally deferred to follow-up commits — both have larger blast
radius and need separate review.

Items #1, #12, #15 pushed back on PR thread (verified false positive or
covered by upstream contract).

Items #2, #3 deferred (pre-existing in slack_backfill.rs, not introduced
by this PR).

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
AusAgentSmith pushed a commit to AusAgentSmith/openhuman that referenced this pull request May 23, 2026
chore: merge develop into main (v0.20.0)
AusAgentSmith pushed a commit to AusAgentSmith/openhuman that referenced this pull request May 23, 2026
refactor: streamline message handling in Conversations component
aashir-athar added a commit to aashir-athar/openhuman that referenced this pull request May 30, 2026
…rmation)

A new read-only "Specialisation" tab. The vocabulary lens (tinyhumansai#17 Predicate
Diversity) tells you how varied the global predicate set is. The thickness
lens (tinyhumansai#18 Predicate Bundles) tells you which entity pairs share many
predicates. The frequency lens (tinyhumansai#7 Relationship Types) tells you which
predicates dominate overall. None of them answers the question this lens
does: how much does knowing the SUBJECT predict which predicate it will
use? And which entities speak in a specialised vocabulary versus a
generalist one?

Engine (pure, deterministic — no React/RPC/clock/RNG):
- Global: I(S; P) in bits with canonical-order summation; H(S) and H(P);
  normalisedMI = I / min(H(S), H(P)).
- Per-subject: specialisation = 1 - H(P|S=s)/log2(D_s) in [0,1] (1 when
  D_s <= 1 — single-predicate subject is maximally specialised by
  convention), plus dominantPredicate (tie-broken by predicate ASC) and
  dominantPredicateShare.
- All p·log2(p) and joint·log2 ratio sums walk pairs in canonical
  (sortedSubjects, sortedPredicates) order so the result is byte-identical
  regardless of relation insertion order (lesson from tinyhumansai#2978 Cohesion's
  float-order bug).

Selected from the prior loop-19 design workflow's runner-up (8.35/10 — a
genuinely new lens not covered by any of the 19 shipped features).

Adds ZERO new core surface: composes the already-shipped memoryGraphQuery
/ memoryListNamespaces wrappers. Container/presentational split with a
monotonic request-token race guard for load-on-mount; i18n across all 13
locales.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
aashir-athar added a commit to aashir-athar/openhuman that referenced this pull request May 30, 2026
…rmation)

A new read-only "Specialisation" tab. The vocabulary lens (tinyhumansai#17 Predicate
Diversity) tells you how varied the global predicate set is. The thickness
lens (tinyhumansai#18 Predicate Bundles) tells you which entity pairs share many
predicates. The frequency lens (tinyhumansai#7 Relationship Types) tells you which
predicates dominate overall. None of them answers the question this lens
does: how much does knowing the SUBJECT predict which predicate it will
use? And which entities speak in a specialised vocabulary versus a
generalist one?

Engine (pure, deterministic — no React/RPC/clock/RNG):
- Global: I(S; P) in bits with canonical-order summation; H(S) and H(P);
  normalisedMI = I / min(H(S), H(P)).
- Per-subject: specialisation = 1 - H(P|S=s)/log2(D_s) in [0,1] (1 when
  D_s <= 1 — single-predicate subject is maximally specialised by
  convention), plus dominantPredicate (tie-broken by predicate ASC) and
  dominantPredicateShare.
- All p·log2(p) and joint·log2 ratio sums walk pairs in canonical
  (sortedSubjects, sortedPredicates) order so the result is byte-identical
  regardless of relation insertion order (lesson from tinyhumansai#2978 Cohesion's
  float-order bug).

Selected from the prior loop-19 design workflow's runner-up (8.35/10 — a
genuinely new lens not covered by any of the 19 shipped features).

Adds ZERO new core surface: composes the already-shipped memoryGraphQuery
/ memoryListNamespaces wrappers. Container/presentational split with a
monotonic request-token race guard for load-on-mount; i18n across all 13
locales.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
aashir-athar added a commit to aashir-athar/openhuman that referenced this pull request May 30, 2026
…rmation)

A new read-only "Specialisation" tab. The vocabulary lens (tinyhumansai#17 Predicate
Diversity) tells you how varied the global predicate set is. The thickness
lens (tinyhumansai#18 Predicate Bundles) tells you which entity pairs share many
predicates. The frequency lens (tinyhumansai#7 Relationship Types) tells you which
predicates dominate overall. None of them answers the question this lens
does: how much does knowing the SUBJECT predict which predicate it will
use? And which entities speak in a specialised vocabulary versus a
generalist one?

Engine (pure, deterministic — no React/RPC/clock/RNG):
- Global: I(S; P) in bits with canonical-order summation; H(S) and H(P);
  normalisedMI = I / min(H(S), H(P)).
- Per-subject: specialisation = 1 - H(P|S=s)/log2(D_s) in [0,1] (1 when
  D_s <= 1 — single-predicate subject is maximally specialised by
  convention), plus dominantPredicate (tie-broken by predicate ASC) and
  dominantPredicateShare.
- All p·log2(p) and joint·log2 ratio sums walk pairs in canonical
  (sortedSubjects, sortedPredicates) order so the result is byte-identical
  regardless of relation insertion order (lesson from tinyhumansai#2978 Cohesion's
  float-order bug).

Selected from the prior loop-19 design workflow's runner-up (8.35/10 — a
genuinely new lens not covered by any of the 19 shipped features).

Adds ZERO new core surface: composes the already-shipped memoryGraphQuery
/ memoryListNamespaces wrappers. Container/presentational split with a
monotonic request-token race guard for load-on-mount; i18n across all 13
locales.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
aashir-athar added a commit to aashir-athar/openhuman that referenced this pull request May 31, 2026
…rmation)

A new read-only "Specialisation" tab. The vocabulary lens (tinyhumansai#17 Predicate
Diversity) tells you how varied the global predicate set is. The thickness
lens (tinyhumansai#18 Predicate Bundles) tells you which entity pairs share many
predicates. The frequency lens (tinyhumansai#7 Relationship Types) tells you which
predicates dominate overall. None of them answers the question this lens
does: how much does knowing the SUBJECT predict which predicate it will
use? And which entities speak in a specialised vocabulary versus a
generalist one?

Engine (pure, deterministic — no React/RPC/clock/RNG):
- Global: I(S; P) in bits with canonical-order summation; H(S) and H(P);
  normalisedMI = I / min(H(S), H(P)).
- Per-subject: specialisation = 1 - H(P|S=s)/log2(D_s) in [0,1] (1 when
  D_s <= 1 — single-predicate subject is maximally specialised by
  convention), plus dominantPredicate (tie-broken by predicate ASC) and
  dominantPredicateShare.
- All p·log2(p) and joint·log2 ratio sums walk pairs in canonical
  (sortedSubjects, sortedPredicates) order so the result is byte-identical
  regardless of relation insertion order (lesson from tinyhumansai#2978 Cohesion's
  float-order bug).

Selected from the prior loop-19 design workflow's runner-up (8.35/10 — a
genuinely new lens not covered by any of the 19 shipped features).

Adds ZERO new core surface: composes the already-shipped memoryGraphQuery
/ memoryListNamespaces wrappers. Container/presentational split with a
monotonic request-token race guard for load-on-mount; i18n across all 13
locales.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
aashir-athar added a commit to aashir-athar/openhuman that referenced this pull request May 31, 2026
…rmation)

A new read-only "Specialisation" tab. The vocabulary lens (tinyhumansai#17 Predicate
Diversity) tells you how varied the global predicate set is. The thickness
lens (tinyhumansai#18 Predicate Bundles) tells you which entity pairs share many
predicates. The frequency lens (tinyhumansai#7 Relationship Types) tells you which
predicates dominate overall. None of them answers the question this lens
does: how much does knowing the SUBJECT predict which predicate it will
use? And which entities speak in a specialised vocabulary versus a
generalist one?

Engine (pure, deterministic — no React/RPC/clock/RNG):
- Global: I(S; P) in bits with canonical-order summation; H(S) and H(P);
  normalisedMI = I / min(H(S), H(P)).
- Per-subject: specialisation = 1 - H(P|S=s)/log2(D_s) in [0,1] (1 when
  D_s <= 1 — single-predicate subject is maximally specialised by
  convention), plus dominantPredicate (tie-broken by predicate ASC) and
  dominantPredicateShare.
- All p·log2(p) and joint·log2 ratio sums walk pairs in canonical
  (sortedSubjects, sortedPredicates) order so the result is byte-identical
  regardless of relation insertion order (lesson from tinyhumansai#2978 Cohesion's
  float-order bug).

Selected from the prior loop-19 design workflow's runner-up (8.35/10 — a
genuinely new lens not covered by any of the 19 shipped features).

Adds ZERO new core surface: composes the already-shipped memoryGraphQuery
/ memoryListNamespaces wrappers. Container/presentational split with a
monotonic request-token race guard for load-on-mount; i18n across all 13
locales.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
aashir-athar added a commit to aashir-athar/openhuman that referenced this pull request May 31, 2026
…rmation)

A new read-only "Specialisation" tab. The vocabulary lens (tinyhumansai#17 Predicate
Diversity) tells you how varied the global predicate set is. The thickness
lens (tinyhumansai#18 Predicate Bundles) tells you which entity pairs share many
predicates. The frequency lens (tinyhumansai#7 Relationship Types) tells you which
predicates dominate overall. None of them answers the question this lens
does: how much does knowing the SUBJECT predict which predicate it will
use? And which entities speak in a specialised vocabulary versus a
generalist one?

Engine (pure, deterministic — no React/RPC/clock/RNG):
- Global: I(S; P) in bits with canonical-order summation; H(S) and H(P);
  normalisedMI = I / min(H(S), H(P)).
- Per-subject: specialisation = 1 - H(P|S=s)/log2(D_s) in [0,1] (1 when
  D_s <= 1 — single-predicate subject is maximally specialised by
  convention), plus dominantPredicate (tie-broken by predicate ASC) and
  dominantPredicateShare.
- All p·log2(p) and joint·log2 ratio sums walk pairs in canonical
  (sortedSubjects, sortedPredicates) order so the result is byte-identical
  regardless of relation insertion order (lesson from tinyhumansai#2978 Cohesion's
  float-order bug).

Selected from the prior loop-19 design workflow's runner-up (8.35/10 — a
genuinely new lens not covered by any of the 19 shipped features).

Adds ZERO new core surface: composes the already-shipped memoryGraphQuery
/ memoryListNamespaces wrappers. Container/presentational split with a
monotonic request-token race guard for load-on-mount; i18n across all 13
locales.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
oxoxDev added a commit to oxoxDev/openhuman that referenced this pull request Jun 5, 2026
…tk prelude + macOS NSAlert unsafe (TAURI-RUST-F)
senamakel referenced this pull request in senamakel/openhuman Jul 5, 2026
…_ms)

tinyhumansai/tinyagents#19 (REPL host-embedding: ReplCancelFlag cancellation,
live ReplCall events, set_cancel_flag) is now merged to tinyagents main, which
also carries #18 (`AgentEvent::ToolCompleted.started_at_ms`) that openhuman's
observability path now requires. Pin the submodule at tinyagents main (e72036d)
so the crate provides both — superseding the earlier pin at the pre-merge
#19 branch head, which predated #18 and left `observability.rs` referencing a
field the crate lacked.
senamakel referenced this pull request in senamakel/openhuman Jul 5, 2026
tinyhumansai/tinyagents#19 (REPL host-embedding: ReplCancelFlag cancellation,
live ReplCall events, set_cancel_flag) is now merged to tinyagents main
(released v1.6.0, e72036d), which also carries #18's `ToolCompleted`/
`ModelCompleted` field additions (started_at_ms/duration_ms/output_bytes/error).
Pin the submodule at tinyagents main so the crate provides the REPL surface the
`rlm` domain needs.

Because the `rlm` domain requires tinyagents ≥ #19 (linearly after #18), this
also completes openhuman's partial 1.6.0 adoption in `tinyagents/observability.rs`:
the `ToolCompleted` projector match ignores the new fields via `..`, and the
test-only `ToolCompleted`/`ModelCompleted` constructions carry the new fields
(`None`). The projector's `_ => {}` catch-all already handles the new
`ReplCall`/`ModelOverrideSkipped` variants. Regenerated Cargo.lock (1.5.0→1.6.0).
senamakel referenced this pull request in senamakel/openhuman Aug 13, 2026
tinywallet #18 is on `main`, so the submodule no longer needs a branch pin.
Picks up #19's two follow-ups to the merged code as well: a rustdoc intra-doc
link in `tx::proto` and a let-chain rewritten as a nested `if` for MSRV. Both
are cosmetic; behaviour is unchanged.

It also picks up #7, a dependabot bump of `sha3` 0.10 -> 0.12, which is NOT
free: `coins-bip32` 0.8 pins `sha3` 0.10 via `coins-core`, and cargo cannot
unify across a major, so 0.12 lands beside it rather than replacing it. The
product profile goes 459 -> 463 packages — `sha3` 0.12.0, `keccak` 0.2.1 and
`sponge-cursor` 0.1.0 — for an API this crate uses identically in both.
tinyhumansai/tinywallet#20 pins it back; take that in the next bump and the
three go away. Called out rather than absorbed silently, because a reduction
that quietly re-adds packages on the way in is how floors grow back.

Verified against this pin: 142 web3 tests pass, 0 failed.

Co-authored-by: Medulla <medulla@tinyhumans.ai>
senamakel pushed a commit that referenced this pull request Aug 19, 2026
vendor/tinymemory: dc3a725 -> f8bd9af (85 commits: the whole tinymemory#18
restructure -- contract crate, per-engine features, sync moved off the
engine, conformance suite -- plus the follow-up fixes through #62).
vendor/tinycortex: 5fdeac9 -> 8401346, exactly the SHA tinymemory vendors;
the two must move together because tinycortex-api is now a re-export of
the TinyMemory contract rather than a duplicate of it (tinymemory#18 §A1).

Both cargo workspaces gain the
`[patch."https://github.com/tinyhumansai/tinymemory"]` table mapping
tinymemory-api to the submodule path. The new tinycortex takes that crate
by git; without the entry cargo resolves the git copy and the path copy
as two distinct crates and type identity splits at the seam. The app
workspace is its own cargo world and needs its own copy of the table.

Everything else was verified ready ahead of this bump by the three-repo
audit: all 102 tinymemory_core paths this tree names resolve against the
new pin (the four compatibility surfaces tinymemory#60 added exist for
exactly this bump), the episodic_insert Result<i64> change was already
absorbed (store_golden.rs, hook_impl.rs), and the contacts/memory-git
feature forwards already target the new feature names. The bump includes
tinymemory#61 deliberately: its {toolkit}:{connection_id} tree-scope
parity commit is required content -- an older SHA would reintroduce the
#5473 unreachable-items regression through the engine-free sync path.

Locks regenerated by resolution only (cargo metadata); the compile gate
is CI's.
senamakel added a commit that referenced this pull request Aug 19, 2026
…bump

Bump tinymemory across the #18 arc (tinycortex in lockstep)
YellowSnnowmann added a commit to YellowSnnowmann/openhuman that referenced this pull request Aug 23, 2026
`FacadeRevealed` meant "nobody has looked at this yet", and 82 of the 107
allowlist entries carried it. Draining it was always the next step; the
result is the finding, not the formality: **none of the 82 is
`SeamExpressible`.** Every remaining direct engine call is blocked on
contract surface the module does not expose, so what is left of tinyhumansai#5560 is
upstream work in `tinymemory` rather than a routing pass in this repo.

Each entry now names the symbols the file actually reaches for, so the
verdict is checkable against the code instead of taken on trust, and the
module docs carry the ask grouped by gap rather than by file:

- the engine handle itself (~28 files) — `global::{init, client,
  client_if_ready}`, `store::{UnifiedMemory, MemoryClient,
  MemoryClientRef}`, `create_memory`;
- chunk writes and transactions (~21) — `with_connection`,
  `upsert_chunks`, `upsert_staged_chunks_tx`, plus `fts5` / `segments` /
  `profile` / `events` / `content`;
- host policy living in the engine crate (~14) — `store::safety::*`,
  `util::redact`, `source_scope::*`;
- the re-embed queue (~8), engine-shaped integration internals (~11),
  chat / ingest-pipeline / preferences (~12), and the engine-owned types.

One of those decides the architecture rather than the schedule.
`chunks::store::with_connection` hands the caller a SQLite handle. A
contract containing it could only ever be implemented by a SQLite engine,
so widening the seam to fit these callers would make the supermemory,
mem0 and cognee drivers unimplementable — the property the whole
extraction exists to protect. Moving the subsystems behind the bus is the
shape that survives; the docs now say so where the next person will read
it.

Also migrates the two call sites that were naming the engine for a type
`tinymemory-core` only re-exports: `MemoryCategory` comes from
`tinymemory_api::types` now. A comment claiming those were the engine's
type rather than the contract's is corrected — tinyhumansai#18 §A1 moved the memory
value types onto the contract precisely so they would not be.

The `FacadeRevealed` variant is kept rather than removed, as its own docs
instruct: if a re-export facade regrows and hides engine users again, the
label for them already exists and already says what it means.

Issue tinyhumansai#5560.
senamakel pushed a commit to nocstah/openhuman that referenced this pull request Sep 11, 2026
…p\n\nvendor/tinymemory: dc3a725 -> f8bd9af (85 commits: the whole tinymemory#18\nrestructure -- contract crate, per-engine features, sync moved off the\nengine, conformance suite -- plus the follow-up fixes through tinyhumansai#62).\nvendor/tinycortex: 5fdeac9 -> 8401346, exactly the SHA tinymemory vendors;\nthe two must move together because tinycortex-api is now a re-export of\nthe TinyMemory contract rather than a duplicate of it (tinymemory#18 §A1).\n\nBoth cargo workspaces gain the\n`[patch."https://github.com/tinyhumansai/tinymemory"]` table mapping\ntinymemory-api to the submodule path. The new tinycortex takes that crate\nby git; without the entry cargo resolves the git copy and the path copy\nas two distinct crates and type identity splits at the seam. The app\nworkspace is its own cargo world and needs its own copy of the table.\n\nEverything else was verified ready ahead of this bump by the three-repo\naudit: all 102 tinymemory_core paths this tree names resolve against the\nnew pin (the four compatibility surfaces tinymemory#60 added exist for\nexactly this bump), the episodic_insert Result<i64> change was already\nabsorbed (store_golden.rs, hook_impl.rs), and the contacts/memory-git\nfeature forwards already target the new feature names. The bump includes\ntinymemory#61 deliberately: its {toolkit}:{connection_id} tree-scope\nparity commit is required content -- an older SHA would reintroduce the\n#5473 unreachable-items regression through the engine-free sync path.\n\nLocks regenerated by resolution only (cargo metadata); the compile gate\nis CI's.\n
senamakel added a commit to nocstah/openhuman that referenced this pull request Sep 11, 2026
…mory-18-pin-bump\n\nBump tinymemory across the tinyhumansai#18 arc (tinycortex in lockstep)\n
senamakel added a commit to nocstah/openhuman that referenced this pull request Sep 11, 2026
senamakel pushed a commit to nocstah/openhuman that referenced this pull request Sep 11, 2026
…: streamline message handling in Conversations component\n
senamakel pushed a commit to nocstah/openhuman that referenced this pull request Sep 11, 2026
…ask\n\n`FacadeRevealed` meant "nobody has looked at this yet", and 82 of the 107\nallowlist entries carried it. Draining it was always the next step; the\nresult is the finding, not the formality: **none of the 82 is\n`SeamExpressible`.** Every remaining direct engine call is blocked on\ncontract surface the module does not expose, so what is left of tinyhumansai#5560 is\nupstream work in `tinymemory` rather than a routing pass in this repo.\n\nEach entry now names the symbols the file actually reaches for, so the\nverdict is checkable against the code instead of taken on trust, and the\nmodule docs carry the ask grouped by gap rather than by file:\n\n- the engine handle itself (~28 files) — `global::{init, client,\n  client_if_ready}`, `store::{UnifiedMemory, MemoryClient,\n  MemoryClientRef}`, `create_memory`;\n- chunk writes and transactions (~21) — `with_connection`,\n  `upsert_chunks`, `upsert_staged_chunks_tx`, plus `fts5` / `segments` /\n  `profile` / `events` / `content`;\n- host policy living in the engine crate (~14) — `store::safety::*`,\n  `util::redact`, `source_scope::*`;\n- the re-embed queue (~8), engine-shaped integration internals (~11),\n  chat / ingest-pipeline / preferences (~12), and the engine-owned types.\n\nOne of those decides the architecture rather than the schedule.\n`chunks::store::with_connection` hands the caller a SQLite handle. A\ncontract containing it could only ever be implemented by a SQLite engine,\nso widening the seam to fit these callers would make the supermemory,\nmem0 and cognee drivers unimplementable — the property the whole\nextraction exists to protect. Moving the subsystems behind the bus is the\nshape that survives; the docs now say so where the next person will read\nit.\n\nAlso migrates the two call sites that were naming the engine for a type\n`tinymemory-core` only re-exports: `MemoryCategory` comes from\n`tinymemory_api::types` now. A comment claiming those were the engine's\ntype rather than the contract's is corrected — tinyhumansai#18 §A1 moved the memory\nvalue types onto the contract precisely so they would not be.\n\nThe `FacadeRevealed` variant is kept rather than removed, as its own docs\ninstruct: if a re-export facade regrows and hides engine users again, the\nlabel for them already exists and already says what it means.\n\nIssue tinyhumansai#5560.\n
sanil-23 added a commit that referenced this pull request Oct 16, 2026
Review #15/#17/#18:
- the coverage matrix row cites the current tests instead of the deleted
  ChatFilesPanel test and describes cards and the save dialog;
- AGENTS.md's submodule table gains `tiny-artifacts`;
- comments in `artifact_commands.rs`, `lib.rs` and
  `artifactDownloadService.ts` describe the save dialog that exists again,
  and the permissions README drops the missing `allow-artifact-save` set;
- `save_artifact_as` takes its chooser through `save_to_chosen_path`, so its
  refusals (empty, unknown, path-like filename) and the cancel and copy
  paths are tested without a dialog.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant