Commit Graph
100 Commits
Author SHA1 Message Date
creatixchu 72b204afa1 feat(images): expand source upload envelope 2026-08-21 15:06:11 +08:00
creatixchu 657ec56fbf test(images): cover attachment projection edges 2026-08-21 15:06:10 +08:00
creatixchu 48a58b9090 fix(images): address unified pipeline review 2026-08-21 15:06:10 +08:00
creatixchu de8ea5d715 docs: refresh image pipeline module graph 2026-08-21 15:05:55 +08:00
creatixchu c09a42ccb5 fix(images): parse listed missing Files ids 2026-08-21 15:05:55 +08:00
creatixchu c0dd8ec820 chore(images): align merged runtime closure 2026-08-21 15:05:54 +08:00
creatixchu d29855f97c feat(images): unify master and Files request pipeline 2026-08-21 15:05:54 +08:00
creatixchu c1bdac6939 docs: propose attachment read quarantine 2026-08-21 15:02:10 +08:00
creatixchu 118f244420 fix(attachment-local): exclude metadata carriers and animation from passthrough; validate the canonical budget up front
Review-round hardening of canonical admission:
- passthrough now requires a single-frame source free of EXIF/XMP/IPTC
  metadata, so location/device metadata never enters durable storage and
  stored dimensions always describe the perceived pixels; animated WebP joins
  GIF on the always-re-encode path (first frame only)
- SourceImageInfo records orientation-applied dimensions, keeping source and
  stored raster on shared axes for coordinate mapping
- validateImage runs a canonical-encoding dry run, so a validated batch can no
  longer be refused mid-write by the byte target (no partial writes)
- read_image names per-axis multipliers when rounding splits the two ratios
  and maps IMAGE_TOO_LARGE to actionable downscale guidance
2026-08-21 15:02:10 +08:00
creatixchu c90a944abd docs: bring the zh config catalog along; pin read_image source fields in the code-mode prompt sidecar 2026-08-21 15:02:10 +08:00
creatixchu 867dc44697 docs(notes): record the canonical image admission decision 2026-08-21 15:02:10 +08:00
creatixchu fec8aa62df docs(attachment): document canonical admission; pin wide-image acceptance snapshot
READMEs (both languages) describe the wide source envelope, the canonical
encoding and its fixed encoder parameters, and read_image's downscale
envelope; tool/config catalogs regenerate for the new schema and Config
fields. The read-image-dimension scenario now pins the acceptance the old
2000px admission cap refused: the 2001x1 source is admitted and stored
byte-identically, so the fixture stays platform-independent.
2026-08-21 15:02:10 +08:00
creatixchu c6fa512e15 fix(attachment-local): keep reference field order stable for logged fixtures
The canonical ref serializes mediaType, width, height, bytes in the order the
pre-canonicalization store used, so existing session-log fixtures and logged
histories keep byte-identical reference JSON.
2026-08-21 15:01:45 +08:00
creatixchu 6e17c20804 feat(tool-fs): read_image reports downscaled dimensions and coordinate scale
When the attachment store's canonical encoding shrinks the file on disk, the
read_image envelope names the original dimensions and the multiplier that
maps coordinates measured on the attached image back onto the file, and the
output schema carries sourceWidth/sourceHeight for programmatic callers.
2026-08-21 15:01:45 +08:00
creatixchu 83a526eea1 feat(attachment-local): store a deterministic canonical image encoding
Admission now validates a wide source envelope (32MiB, 100MP, 16384px per
side) and persists a canonical encoding instead of refusing large sources:
EXIF orientation baked in, metadata stripped, long edge downscaled to the
configured canonical target (default 2048px), PNG palette for alpha/PNG/GIF
sources and a fixed JPEG quality ladder (85/75/60/45) until the canonical
byte target holds (default 1MiB). In-budget PNG/JPEG/WebP passes through
byte-identically so equal sources keep deduplicating to the same content
address; GIF always re-encodes to the PNG of its first frame, pinning the
first-frame meaning providers apply. Encoder parameters are fixed by design;
only the canonical budget is deployment configuration.
2026-08-21 15:01:45 +08:00
creatixchu 8f83853b60 refactor(attachment): saveImage returns the canonical ref beside source facts
AttachmentStore.saveImage now resolves SavedImageAttachment: the durable
reference paired with the submitted raster's intrinsic facts, so a store may
persist a canonical re-encoding while callers keep the source dimensions for
coordinate mapping. saveImages keeps returning refs; every fake store and the
cordis API catalog follow the new signature.
2026-08-21 15:01:45 +08:00
creatixchu 92a9741050 docs(llm): anchor unified request-image management design PR 2026-08-21 15:01:07 +08:00
creatixchu 54cd736a4e Merge remote-tracking branch 'origin/master' into worktree/web-file-session-references 2026-08-19 15:21:17 +08:00
creatixchu 09b3dfa06d Merge remote-tracking branch 'origin/master' into worktree/abort-partial-finalize 2026-08-19 15:09:59 +08:00
creatixchu ff88d3dd00 Merge remote-tracking branch 'origin/master' into worktree/abort-partial-finalize 2026-08-19 14:55:32 +08:00
creatixchu 9620a752c8 refactor(agent-loop): 缩小取消前缀收尾范围 2026-08-19 14:55:26 +08:00
creatixchu e7a668906a Merge remote-tracking branch 'origin/master' into worktree/web-file-session-references
# Conflicts:
#	packages/client/connection/src/client/fixture.ts
#	packages/client/ui-conversation/src/client/input/facade.ts
#	packages/client/ui-conversation/src/client/input/hub.ts
#	packages/client/ui-conversation/tests/input-matrix.client.spec.tsx
#	packages/client/ui-conversation/tests/input-scenarios.client.spec.tsx
#	packages/client/ui-conversation/tests/skeleton.client.spec.tsx
2026-08-19 14:49:57 +08:00
creatixchu fcaa0efec5 Merge remote-tracking branch 'origin/master' into worktree/command-attachment-envelope 2026-08-19 11:11:15 +08:00
creatixchu c91672a44a Merge remote-tracking branch 'origin/master' into worktree/abort-partial-finalize 2026-08-19 11:06:59 +08:00
creatixchu 5766480e5b Merge remote-tracking branch 'origin/master' into worktree/abort-partial-finalize 2026-08-19 10:51:25 +08:00
creatixchu bb3e1d46cb Merge remote-tracking branch 'origin/master' into worktree/command-attachment-envelope 2026-08-18 17:11:42 +08:00
creatixchu 96442bd4e5 test(subprocess): publish exit fixture state atomically 2026-08-18 17:06:46 +08:00
creatixchu bd1083d78a test(commands): align image dimension limits 2026-08-18 17:06:42 +08:00
creatixchu d71f744c16 Merge remote-tracking branch 'origin/master' into worktree/command-attachment-envelope 2026-08-18 16:58:46 +08:00
creatixchu 1022467d93 Merge remote-tracking branch 'origin/master' into worktree/image-request-budget 2026-08-18 16:43:58 +08:00
creatixchu 831670533b Merge remote-tracking branch 'origin/master' into worktree/image-request-budget 2026-08-18 16:31:40 +08:00
creatixchu d007f437cc Merge remote-tracking branch 'origin/master' into worktree/command-attachment-envelope 2026-08-18 16:25:11 +08:00
creatixchu 51fa8da8a3 fix(plan): accept image-only plan requests 2026-08-18 15:43:59 +08:00
creatixchu 35a10ec41a Merge remote-tracking branch 'origin/master' into worktree/web-file-session-references
# Conflicts:
#	docs/config-catalog.i18n.yaml
#	docs/config-catalog.md
#	docs/config-catalog.zh.md
#	docs/module-graph.i18n.yaml
#	docs/module-graph.md
#	docs/module-graph.zh.md
#	packages/client/ui-conversation/src/client/chat/MessageItem.tsx
#	packages/client/ui-conversation/tests/input-bar.client.spec.tsx
#	packages/client/ui-subagent/package.json
#	pnpm-lock.yaml
2026-08-18 15:22:32 +08:00
creatixchu 5849c57c0c fix(images): align provider-safe payload defaults 2026-08-18 14:00:00 +08:00
creatixchu 761d9d1978 fix(web): render command errors as banners 2026-08-18 12:06:40 +08:00
creatixchu 1492b0cfee Merge remote-tracking branch 'origin/master' into worktree/command-attachment-envelope
# Conflicts:
#	apps/web/tests/assembled-boot.ts
2026-08-18 12:00:46 +08:00
creatixchu a26332d38a Merge remote-tracking branch 'origin/master' into worktree/image-request-budget 2026-08-18 11:58:47 +08:00
creatixchu 28c2647293 fix(llm-pi-ai): address image offload review 2026-08-18 11:56:18 +08:00
creatixchu 2d895bfbb7 Merge remote-tracking branch 'origin/worktree/image-dimension-limit' into worktree/image-request-budget 2026-08-18 11:47:42 +08:00
creatixchu abfd537588 Merge remote-tracking branch 'origin/master' into worktree/image-dimension-limit 2026-08-18 11:45:08 +08:00
creatixchu bbb7651af3 Merge remote-tracking branch 'origin/worktree/image-dimension-limit' into worktree/image-request-budget 2026-08-18 11:42:12 +08:00
creatixchu d559ba9b2b fix(attachment): address dimension-limit review 2026-08-18 11:30:07 +08:00
creatixchu 0b4a322003 fix(llm-pi-ai): bound request image payload by offloading oldest images
Every image in history is base64-inlined into every request, so a long
session's request body grows until a gateway request-size cap rejects it
with 413 and every retry resends the same oversized body, permanently
wedging the session. Each provider route now carries maxRequestImageBytes
(default 24MiB): when the accumulated base64 image payload exceeds it,
the oldest images are replaced by a fixed model-facing placeholder until
the request fits, so the newest images survive and the session keeps
completing requests. 413 and request-body-cap wording now classify as
INVALID_REQUEST instead of the generic PI_AI_ERROR.

Fixes #2644
2026-08-18 11:18:51 +08:00
creatixchu 609ee2facf Merge remote-tracking branch 'origin/master' into worktree/image-dimension-limit 2026-08-18 11:12:56 +08:00
creatixchu a8a028e26f test: avoid Windows metadata-version collision 2026-08-17 23:31:36 +08:00
creatixchu 8d17e63558 chore(ci): 刷新 PR 合并引用 2026-08-17 21:29:14 +08:00
creatixchu fdf6fec5c0 test(session-reference): 补齐预处理分支覆盖 2026-08-17 21:25:12 +08:00
creatixchu 9eab23c176 fix(release): 同步工作区包版本 2026-08-17 21:17:30 +08:00
creatixchu 29de639e99 fix(web): 按评审意见调整引用职责 2026-08-17 21:13:33 +08:00
creatixchu 0e39055121 fix(attachment): refuse oversized image sides at admission
An image with a side above the deployed routes' 2000px many-image bound
could be durably committed by read_image, ride every later request, and
permanently fail the session with provider 400s. Admission now enforces a
configurable maxImageDimension (default 2000) during the full decode, so
read_image surfaces a recoverable tool error naming the limit instead of
poisoning durable history; the Web composer gets dedicated copy for the
new IMAGE_DIMENSION_TOO_LARGE reason.

Fixes #2626
2026-08-17 20:49:08 +08:00
creatixchu 7d19a6c2c7 Merge remote-tracking branch 'origin/master' into worktree/web-file-session-references 2026-08-17 20:46:35 +08:00
creatixchu 741b89963d Merge remote-tracking branch 'origin/master' into worktree/abort-partial-finalize 2026-08-17 20:38:52 +08:00
creatixchu 56efd81d19 fix(ci): sync release version and module graph 2026-08-17 20:32:14 +08:00
creatixchu c530de9edc Merge origin/master: fold admitEncodedImages onto AttachmentStore.saveImages
master introduced AttachmentStore.saveImages as the batch admission
(count/aggregate-byte/media-type limits, validate-all-before-save,
ordered commit). admitEncodedImages narrows to the shared wire entry:
canonical-base64 enforcement plus delegation to saveImages, keeping one
home for batch policy while both wire endpoints (prompt RPC and the
command executor) still call one function. Test doubles gain saveImages;
batch-limit error texts follow saveImages' wording.
2026-08-17 19:59:53 +08:00
creatixchu 4ed283a2ba fix(commands): address review-bot round on the attachment envelope
- Honor a cancellation that lands during image admission before the
  handler runs, settling command/done with the abort reason (executor
  re-check after admitEncodedImages; the committed objects stay
  unreferenced, deferred-GC territory, now recorded in the Agent Note).
- Never let a pending draft-image serialization reach claim.submit after
  the attempt died (dispose/session teardown race).
- Refuse image removal while a command submit is in flight so the rail
  cannot diverge from the serialized snapshot mid-transaction.
- Declare dsh-llm as a runtime peer dependency of command-goal.
- Mirror the host executor's ordering and the producer grammar
  rejections in the fixture command plane: image checks run after
  command resolution (unknown names stay lifecycle-free), bare /goal and
  /plan//plan off with images answer the producers' error texts.
- Explain the deliberate serialize/release asymmetry in the hub's
  commandImages plumbing.
2026-08-17 19:48:30 +08:00
creatixchu 8d9fee19f9 feat(commands): route composer image attachments through slash commands
A claimed slash command consumed only the text half of the composer
submission: /goal with reference images executed, cleared the draft, and
silently stranded the images in the rail. Model-visible attachment intent
had no route through the command plane.

The submission envelope is now modeled end to end. CommandDefinition
input.images declares acceptance; the declaration rides the descriptor to
every client, onto the minted CommandClaim, and into the input machine's
claim snapshot. commands.execute carries the submission's base64 images
and enforces the declaration in the executor: non-declaring commands, a
missing attachment store, and exceeded batch limits settle as logged
error results before the handler runs. Admission reuses the attachment
package's new admitEncodedImages, extracted from api-proxy's prompt path
so both wire endpoints share one limits/validation/commit sequence.

Producers own model visibility: /goal submits one user followup (image
blocks + a fixed reference line) after a successful create/edit so goal
rounds read the images from session history; /plan folds them into its
steered message. Grammar misfits (/goal pause, bare /plan, /plan off)
return direct errors and the composer keeps the images.

On the client, enter adjudication carries a SubmitEnvelope and every
command route that cannot consume images throws a localized refusal that
renders as one composer notice with draft and images retained; the
claimed pre-gate applies the same copy. An accepting claim serializes the
draft images, forwards them to commands.execute, and clears plus releases
them only on a success outcome.

The assembled web test roster gains the ui-input-trigger and ui-commands
plugins, mirroring the shipped composition, so slash submissions exercise
the command plane; a new keyless snapshot pins the refusal banner and the
accepting /goal flow over the built client graph.
2026-08-17 18:57:55 +08:00
creatixchu 862132faca test(web): cover the ui-reference node half 2026-08-17 18:47:11 +08:00
creatixchu e4560786f2 Merge remote-tracking branch 'origin/master' into worktree/web-file-session-references 2026-08-17 18:43:23 +08:00
creatixchu b19d1643f7 fix(web): harden the composer submit transaction
- wire the directory pick's continue flag through InsertTextRequest to the
  input shell, which re-tracks at the caret so descent reopens completion
  (the flag was produced and forwarded but never consumed)
- guard the image-only send against a second Enter during the Host round-trip
- keep text appended after the sent snapshot when a submit settles ok; only
  interleaved edits clear with the committed content
- drop the dead restoreImages left from the sink rewrite
- read recall labels through a shared defensive sessionRecallLabels helper
  instead of unchecked casts over durable log data, and take the reference
  summary separator from the locale dictionary
- align the composer specs merged from master with the transactional submit
  contract (sinks resolve SubmitOutcome, settlement is awaited, call
  assertions carry the AbortSignal), and restore master's forms where the
  divergence served nothing (queue-mode sink case, single-line filter
  expectation, component-identity slot lookup)
2026-08-17 18:35:45 +08:00
creatixchu 6bb79911ba refactor(reference): serve discovery through typert Remote faces
Replace the legacy reference.* API Proxy domain with @Remote methods on the
owning services, following the typert gateway design master adopted on
2026-08-02 (message-feedback and plugin-inventory precedents):

- FileReferenceService and SessionReferenceResolver extend TypertRemoteService;
  fileReferences/list and sessionReferenceResolver/candidates are unary Remote
  methods cancelled through the reserved trailing signal, and the candidates
  face attaches each candidate's canonical mention under the configured limit
- move the wire types to type-only ./types subpaths (FileReferenceCandidate,
  SessionReferenceMentionCandidate) and export ./typert plus ./remote artifacts
- mount both contributions in the api-remotes client assembly; ui-reference
  consumes ctx.remote instead of connection.api.references and registers zh/en
  locale dictionaries for its sections and labels
- delete the reference.* routes, schemas, map rows, client stubs, and fixtures;
  the connection fixture serves the Remote endpoints instead
- release deliverPrompt admission listeners when the agent is disposed with the
  prepared prompt still pending, and cover the reference-* RpcError codes in
  the schema spec
- add the missing tsconfig paths for the /grammar and /types subpaths (clean-
  tree vitest could not resolve @deepseek-ai/dsh-file-reference/grammar)
- regenerate the cordis catalog, capability seams, and event matrix; update the
  owning bilingual READMEs, Agent Notes, and the reference-composer golden
2026-08-17 18:35:30 +08:00
creatixchu 74b220d362 Merge remote-tracking branch 'origin/master' into worktree/abort-partial-finalize 2026-08-17 17:49:31 +08:00
creatixchu f750213a19 Merge remote-tracking branch 'origin/master' into worktree/abort-partial-finalize
# Conflicts:
#	apps/web/tests/snapshots/live-interactions/cancel.expected.md
#	apps/web/tests/snapshots/queue-actions/preserved.expected.md
#	docs/persistence-catalog.i18n.yaml
#	docs/persistence-catalog.md
#	docs/persistence-catalog.zh.md
#	examples/acp-agent/tests/goal-snapshots/goal-round-driver/session.expected.jsonl
#	examples/acp-agent/tests/snapshots/cordis-inspect-jsdoc/session.jsonl
#	examples/headless-agent/tests/snapshots/advanced-toolchain/session.1.jsonl
#	examples/headless-agent/tests/snapshots/advanced-toolchain/session.2.jsonl
#	examples/headless-agent/tests/snapshots/advanced-toolchain/session.jsonl
#	examples/headless-agent/tests/snapshots/pty-tools/session.jsonl
#	packages/client/runtime/src/client/sessions/request-inspection.ts
#	packages/client/runtime/tests/request-inspection.spec.ts
#	packages/self-modification/tool-cordis/src/api-catalog.ts
2026-08-17 17:46:57 +08:00
creatixchu e7bace1c5d Merge remote-tracking branch 'origin/master' into worktree/web-file-session-references
# Conflicts:
#	docs/config-catalog.i18n.yaml
#	packages/host/apiproxy/README.i18n.yaml
2026-08-17 17:06:35 +08:00
creatixchu 0f1c29c751 test(web): cover onboarding branches 2026-08-13 18:03:15 +08:00
creatixchu fc90114ad9 fix(web): add English onboarding copy 2026-08-13 17:35:21 +08:00
creatixchu 780e788dfe Merge remote-tracking branch 'origin/master' into worktree/drop-beta-welcome-notice 2026-08-13 14:41:08 +08:00
creatixchu 0dcf37fbaf Merge remote-tracking branch 'origin/master' into worktree/drop-beta-welcome-notice 2026-08-13 14:33:50 +08:00
creatixchu 45f417fb6a Merge remote-tracking branch 'origin/master' into worktree/drop-beta-welcome-notice 2026-08-13 14:18:54 +08:00
creatixchu 37247ea705 Merge remote-tracking branch 'origin/master' into worktree/drop-beta-welcome-notice 2026-08-13 14:14:55 +08:00
creatixchu b70a549714 fix(review): update smoke-real onboarding path and telemetry disclosure facts 2026-08-13 14:10:42 +08:00
creatixchu b37243a317 Merge remote-tracking branch 'origin/master' into worktree/drop-beta-welcome-notice 2026-08-13 14:01:24 +08:00
creatixchu 5061ec2ef0 feat(web): 移除首启内测声明,遥测保持默认关闭 2026-08-13 13:47:09 +08:00
creatixchu 7c8ec67102 Merge remote-tracking branch 'origin/master' into worktree/attachment-alignment-2 2026-08-12 16:14:56 +08:00
creatixchu 941449d92c fix(web): apply review round — notice anchors before turn-tail, published node kind, fixture nextTurn
Anchor the max-tokens notice between the closing assistant and the
turn-tail so the tail stays the turn's last chat node and its branch
action survives; forward the ChatNodeDataMap augmentation through the
client entry so built declarations publish the new kind; advance the
fixture's nextTurn past the appended history; drop the engine-unreachable
buildViewNode fallback; deduplicate the runtime README tail sentence.
2026-08-12 16:04:03 +08:00
creatixchu b108c6c1c9 Merge remote-tracking branch 'origin/master' into worktree/attachment-alignment-2 2026-08-12 15:41:01 +08:00
creatixchu e4ca03cb85 fix(web): surface max-tokens turn ends as a localized truncation notice
A turn the provider ends at its per-request output cap previously produced
no visible sign in the Web chat flow: only error-kind turn/end events built
a conversation node, so the truncated answer read as a normal completion.

Add a turn-max-tokens conversation node Definition over the durable
turn/end event, a warning-styled localized notice row distinct from
turn-error, a fixture max-tokens sample turn, and an assembled keyless
snapshot pinning the dot state, title, and hint.

Closes #1522
2026-08-12 15:36:27 +08:00
creatixchu 2014d354e3 Merge remote-tracking branch 'origin/master' into worktree/attachment-alignment-2 2026-08-12 15:19:32 +08:00
creatixchu 51dc55ec3d fix(web): cap default images at 5 MiB 2026-08-12 14:47:20 +08:00
creatixchu 8d4c3f8a0a review: format check precedes limits, INVALID_IMAGE/IMAGE_TYPE_MISMATCH as format copy, tile-sized retry control 2026-08-12 13:50:07 +08:00
creatixchu c9a536e0c8 review: theme-owned drop mask token, overlay fade-in, stable gallery keys, close-button stacking, stale note defaults 2026-08-12 13:12:06 +08:00
creatixchu 7259252536 Merge remote-tracking branch 'origin/master' into worktree/attachment-alignment-2 2026-08-12 13:02:39 +08:00
creatixchu 2c9036b102 feat(web): whole-page image drop, projected intake limits, and thumbnail tiling
Second alignment step for #2248: document-level drag intake behind the new
DropOverlay atom, lightbox close icon and shared dialog mask, DeepSeek Chat
thumbnail rules (single 240px long edge with ratio clamp, 64px tiles, merged
consecutive assistant images), image limits raised to 20/10MiB/100MiB and
published to clients as the imageLimits projection, whole-batch intake
pre-check with product-copy banners, and attachment-error reasons mapped to
localized copy.
2026-08-12 12:31:52 +08:00
creatixchu b9e6113af0 Merge remote-tracking branch 'origin/master' into worktree/multimodal-ui
# Conflicts:
#	docs/module-graph.i18n.yaml
#	docs/module-graph.md
#	docs/module-graph.zh.md
2026-08-11 19:44:01 +08:00
creatixchu 6a95fdc424 Merge remote-tracking branch 'origin/master' into worktree/multimodal-ui 2026-08-11 19:29:53 +08:00
creatixchu 3beb138b3f Merge remote-tracking branch 'origin/master' into worktree/multimodal-ui 2026-08-11 19:23:04 +08:00
creatixchu 4e639b1ac4 Merge remote-tracking branch 'origin/master' into worktree/multimodal-ui 2026-08-11 18:55:35 +08:00
creatixchu 2838087ec4 chore: merge master and refresh module graph for ui-attachment 2026-08-11 18:23:36 +08:00
creatixchu 0d380d29c4 Merge remote-tracking branch 'origin/master' into worktree/multimodal-ui 2026-08-11 18:20:35 +08:00
creatixchu 8adcd473fe Merge remote-tracking branch 'origin/master' into worktree/multimodal-ui 2026-08-11 18:04:23 +08:00
creatixchu dc42e6b822 feat(web): toast anchoring and model-selection rejection banner
The toast sits 120px from the viewport top and centers over its anchor —
the composer card, so it centers on the chat column rather than the window;
a rejected model selection (e.g. picking a text-only model while the
session holds images) announces through the same banner while the in-menu
strip with Retry stays the catalog-load surface. The attachment rail
consumes every wheel tick with a vertical component: a diagonal pan keeps
its horizontal intent and nothing scrolls the conversation behind the
composer.
2026-08-11 18:00:56 +08:00
creatixchu 87e3c95027 fix(web): review-round attachment refinements
Body-portal the lightbox and toast so transformed ancestors cannot trap
their fixed positioning (a lightbox opened from a chat message covered only
the chat column); make the toast pointer-transparent; observe the rail
element's own size instead of window resizes; consume vertical wheel ticks
exclusively via a non-passive listener with LINE/PAGE delta normalization;
keep the start position when the rail mounts over an existing draft; honor
prefers-reduced-motion for the toast, remove-control, and paging; retry
loads through the guarded load effect; note the deliberate promptError
re-announce; pin the intake toast in the assembled snapshot; sync the
superseded multimodal note and package docs.
2026-08-11 17:45:11 +08:00
creatixchu e611e825b1 feat(web): align attachment display with DeepSeek Chat via ui-attachment atoms
Single-click original preview in the composer rail and chat history; remove
control inside the thumbnail, revealed on hover/focus (always on touch);
hidden-scrollbar rail overflow paged by edge arrows with wheel panning and
end-reveal on add; image-intake rejections and prompt failures announce as a
transient top-center toast instead of inline strips.

The attachment atoms move to a new zero-cordis package
@deepseek-ai/dsh-client-ui-attachment (rail, message gallery, lightbox),
seeded as a platform module; the toast is a ui-primitives atom. Strings
arrive as label props bridged from the conversation dictionary.
2026-08-11 17:01:29 +08:00
creatixchu 10d9fd21f2 Merge remote-tracking branch 'origin/master' into feat/read-image-context 2026-08-11 12:08:33 +08:00
creatixchu a3e448ee5d docs(fs): document bounded byte reads 2026-08-11 12:07:21 +08:00
creatixchu 2a755f2863 Merge remote-tracking branch 'origin/master' into feat/read-image-context 2026-08-11 11:54:22 +08:00
creatixchu d8abd97b1c Merge remote-tracking branch 'origin/master' into feat/read-image-context 2026-08-11 11:25:15 +08:00
creatixchu 5265fd084d fix(snapshot): use rescoped Cordis package 2026-08-11 11:23:49 +08:00
creatixchu 11bfb21e91 test(session-persistence-jsonl): cover the version guard's non-object and non-string-id paths 2026-08-11 11:23:48 +08:00
creatixchu 0a95a9eed8 fix(session): refuse foreign format versions before parsing current structure
Review round: the JSONL backend now refuses a foreign header version straight
from the raw header line, before validating today's header shape or decoding
any event row, so a structurally different future format reports the upgrade
direction instead of corruption (shared message builder
sessionFormatVersionRefusal). HMR live-prefix adoption runs the unknown-type
guard like the other read paths. The appendCore comment now states why the
unknown-type guard is read-side only, the loadStoredFrom JSDoc and README pin
the seek-vs-sequential refusal-scope divergence, and the generated catalog
preamble lists the ignorable envelope field.
2026-08-11 11:23:48 +08:00