Commit Graph

3406 Commits

Author SHA1 Message Date
NI0317
717852423f fix(fs): harden directory listing and glob sampling 2026-07-28 13:01:26 +08:00
NI0317
9b9b45e65e fix(fs-search): sample an over-cap glob result across the tree
Asked what a workspace contained, an agent described one subfolder as the
whole project. `glob {"pattern": "*"}` matched 10030 paths across 22
top-level entries and the inline page was the first 100 of them, all under a
single unpacked archive.

Three properties compose into that page: a pattern with no `/` matches
basenames at any depth, so `*` means the whole tree rather than its top
level; `--sort=modified` orders oldest first, and unpacking an archive
restores timestamps that predate everything the user wrote; and the page was
the head of that order. Each is defensible alone, and together they make the
most ordinary request an agent receives produce a confident wrong answer.

A result within `globMaxResults` is unchanged — shown whole, in
modification-time order. Beyond it the page is filled round-robin across the
complete result's top-level entries, so one subtree cannot own every slot,
and the footer states that the page was sampled rather than taken in
modification-time order. Measured on a 24-entry, 716-file reproduction, the
head of 100 reaches 7 top-level names and the sampled page reaches 21. The
spill artifact still holds the complete sorted list.

The guidance and schema stop steering away from `ls`, state the any-depth
pattern rule, say results are files and never directories, and point at
`list` for a directory's contents.
2026-07-28 12:05:36 +08:00
NI0317
d4614f92d6 feat(fs): add a model-facing directory listing tool
`ctx.fs.listDir` has shipped since the filesystem seam gained it, with skill
discovery as its only consumer; the model-facing tool was deferred to a
separate decision. Nothing else could answer "what is in this directory":
`rg --files` backs glob and grep and never emits a directory entry, so an
empty directory is invisible, no output says which names are directories,
and no output gives an entry count.

`list` takes an optional `path`, defaulting to the session workspace so the
common question needs no argument, and returns the direct children of one
directory with their type. Two presentation rules carry it: directories sort
first, then files, then non-regular children, each alphabetically — so
truncation loses leaves rather than the tree — and the footer always states
the complete listing's size and composition, so a capped view can never read
as a whole directory.

It emits no `fs/observed`: seeing a filename is not reading a file, and a
listing must never satisfy the read-before-write gate.
2026-07-28 11:59:52 +08:00
Tianyi Cui
dd03c88083 Merge commit 'refs/codex-unblock/20260727/pr660-master' into worktree/pr660-merge-20260727
# Conflicts:
#	scripts/doc-budgets.manifest.json
2026-07-27 19:34:55 +08:00
Tianyi Cui
961bde6473 test(sdk): keep fresh Yarn installs mutable in CI
The live-link E2E intentionally creates a project without a lockfile. Prevent ambient CI=true from making Yarn 4's first install immutable, while preserving the CI environment for every other behavior under test.
2026-07-27 18:48:11 +08:00
Tianyi Cui
d897dcc7ea Merge remote-tracking branch 'origin/master' into worktree/pr682-retarget-20260727
# Conflicts:
#	.agents/notes/rejected/simplification/2026-07-26-dependency-swaps-rejected-by-nih-audit.i18n.yaml
2026-07-27 17:55:56 +08:00
Tianyi Cui
94d5816142 Merge remote-tracking branch 'origin/master' into worktree-process-service-seam 2026-07-27 17:38:01 +08:00
Tianyi Cui
1ee8029bc6 Merge remote-tracking branch 'origin/master' into worktree-process-service-seam 2026-07-27 17:24:20 +08:00
imccyu
e8cbf6cc72 fix: remove orig 2026-07-27 17:22:01 +08:00
imccyu
0052ea49ff Merge branch 'master' into feature/delete-workspace 2026-07-27 16:59:28 +08:00
imccyu
cbcb911781 Merge branch 'master' into feat/todo-tool-ui 2026-07-27 16:55:35 +08:00
imccyu
50ec3b1db0 Merge branch 'master' into feat/todo-tool-ui 2026-07-27 16:54:34 +08:00
imccyu
5b81025b58 Merge branch 'master' into feature/delete-workspace 2026-07-27 16:52:24 +08:00
07akioni
87a94b58d2 fix: ci 2026-07-27 16:47:20 +08:00
Tianyi Cui
aa95a3007f Merge remote-tracking branch 'origin/master' into worktree/pr683-retarget-20260727 2026-07-27 16:40:42 +08:00
Tianyi Cui
21fe97d19d Merge remote-tracking branch 'origin/master' into worktree-process-service-seam
# Conflicts:
#	docs/architecture.i18n.yaml
#	docs/core-data-structures/core.i18n.yaml
2026-07-27 16:40:07 +08:00
Tianyi Cui
9801a0d102 fix(tool-web): bound HTML conversion work 2026-07-27 16:40:02 +08:00
07akioni
16598f7159 fix: cr 2026-07-27 16:36:36 +08:00
07akioni
900e45b365 feat: optimize todo tool ui 2026-07-27 16:24:30 +08:00
Tianyi Cui
ab25c34ea0 Merge remote-tracking branch 'origin/master' into worktree/fix-ci-timing-flakes-20260727 2026-07-27 16:09:50 +08:00
NI0317
c171ecc60b Merge remote-tracking branch 'origin/master' into feature/delete-workspace 2026-07-27 16:07:11 +08:00
Tianyi Cui
ae18216199 Merge remote-tracking branch 'origin/master' into worktree/pr683-retarget-20260727 2026-07-27 16:03:33 +08:00
07akioni
62e2551edd fix: darkmode 滚动条颜色 2026-07-27 16:01:01 +08:00
Tianyi Cui
9b8e6e6548 Merge remote-tracking branch 'origin/master' into worktree/fix-ci-timing-flakes-20260727 2026-07-27 15:58:37 +08:00
imccyu
52985d688d Merge branch 'master' into markdown-ui 2026-07-27 15:58:13 +08:00
NI0317
dcf06e8272 Merge remote-tracking branch 'origin/master' into feature/delete-workspace
# Conflicts:
#	packages/client/runtime/README.i18n.yaml
#	packages/host/apiproxy/README.i18n.yaml
2026-07-27 15:54:51 +08:00
Tianyi Cui
77a85f9b1a Merge remote-tracking branch 'origin/master' into worktree/fix-ci-timing-flakes-20260727 2026-07-27 15:53:08 +08:00
NI0317
4701373fc2 fix(workspace): remove transient duplicate warning 2026-07-27 15:52:35 +08:00
Tianyi Cui
bfdaf7600b Merge remote-tracking branch 'origin/master' into worktree/pr674-retarget-20260727
# Conflicts:
#	docs/cookbook/adding-an-llm-adapter.i18n.yaml
#	docs/core-data-structures/llm-streaming.i18n.yaml
#	packages/llm/llm-deepseek/README.i18n.yaml
#	packages/llm/llm/README.i18n.yaml
2026-07-27 15:48:17 +08:00
imccyu
b8d7938498 Merge branch 'master' into markdown-ui 2026-07-27 15:44:30 +08:00
imccyu
0a7c8a284d chore 2026-07-27 15:44:10 +08:00
Tianyi Cui
9c53cd7d07 test: stabilize timing-sensitive terminal checks 2026-07-27 15:33:36 +08:00
Tianyi Cui
f6de42a886 Merge remote-tracking branch 'origin/master' into worktree/pr674-retarget-20260727 2026-07-27 15:30:30 +08:00
Yichen Jiang
c3dfed668d Merge branch 'master' into worktree/llm-reasoning-effort 2026-07-27 15:30:00 +08:00
imccyu
b241d4332c Merge branch 'master' into markdown-ui 2026-07-27 15:23:13 +08:00
NI0317
7bd96af5eb fix(workspace): make deletion recoverable 2026-07-27 14:37:04 +08:00
Yichen Jiang
21aeff3029 Merge remote-tracking branch 'origin/master' into worktree/llm-reasoning-effort
# Conflicts:
#	.agents/notes/implemented/testing/2026-07-24-web-gui-browser-e2e-lane.i18n.yaml
#	docs/config-catalog.md
#	docs/core-data-structures/session.i18n.yaml
#	scripts/type-equiv.manifest.json
2026-07-27 13:35:10 +08:00
Tianyi Cui
73d2a787a7 Merge branch 'master' into nih-imp-sse 2026-07-27 13:13:57 +08:00
07akioni
0d2a8a3090 Merge branch 'master' into markdown-ui 2026-07-27 12:59:37 +08:00
07akioni
55fc87a7a0 fix: cr 2026-07-27 12:58:20 +08:00
Tianyi Cui
a70923ba21 fix(session-checkpoint-policy): fail fast on an impossible crash marker
vi.waitFor retries every callback throw, so the mismatch branch inside
the callback waited the full 30s deadline for a fixture that writes the
marker once and cannot recover. Terminal states (complete marker, or
content that can no longer become the expected marker) now resolve out
of the retry loop and the mismatch throws after it, restoring the old
loop's immediate failure.
2026-07-27 12:51:47 +08:00
Tianyi Cui
109b469a7e fix(tool-web): bound conversion depth and complete fetch output
Two review findings on the turndown swap, both verified empirically:

- Unclosed-tag nesting makes the synchronous turndown/domino walk
  superlinear (measured: depth 512 ~0.15s, 2k ~2s, 20k ~5s), during
  which the cooperative fetchTimeoutMs timer cannot fire. renderBody
  now preflights nesting depth with a linear tag scan and passes
  bodies past 512 levels through raw; the try/catch stays for markup
  the scan cannot see (comment-hidden tags), simulated in tests via a
  converter throw.
- Markdown escaping can expand converted HTML ~2x (100k underscores
  render as 200k chars), so provider body caps no longer bounded the
  model-visible result. formatFetchOutput now caps the complete output
  (header + body + footer) under new fetchMaxOutputChars config
  (default 200000 = 2x the local provider's default body cap), reusing
  the truncation notice.

README EN+ZH, config catalog, Agent Note EN+ZH updated; the new
web-fetch fixture is migrated to the packed layout master now
requires; tool-web coverage stays 100% per-file.
2026-07-27 12:41:36 +08:00
NI0317
187cf6f804 feat(web): delete workspace registrations 2026-07-27 12:38:11 +08:00
Chinesezjc
710a3b1686 docs(ui-conversation): document the two todo registrations in the owning README pair
The todo row and the todo plan strip were registered without a contract in this
package's README, which still described only the bash sample. Both sides now
carry the two registrations: TodoRow's `todo_write` toolview key with its
attempted-write summary and non-ok dot semantics, and TodoDock's
`conversation.input.dock` entry at `order: -1` with the dock-owned selection,
empty-hidden panel, collapse behavior, and the composer-takeover consequence
that hides the whole dock. README.i18n.yaml re-recorded.
2026-07-27 12:20:17 +08:00
Chinesezjc
d2bb2a809b fix(web-todo): dock-owned selection, keyboard-openable row, documented tail todos field
Three ds-review-bot round-8 findings on the todo display surfaces.

TodoPanel took the whole `useSession` hook and cast the snapshot to reach
`todos`, which put slot plumbing and an unchecked cast inside the presentation
component. The panel now takes `todos: readonly TodoItem[]`; TodoDock does the
selecting, matching the QueueDock posture the dock slot already establishes.

The todo row carried `onClick` with no keyboard route, so its details panel was
mouse-only. It now takes ToolRow's route verbatim: `role="button"`,
`tabIndex={0}`, and an Enter/Space handler that claims the event. The row stays
a `<div>` because a `<button>` flattens its inline spans.

`session.history`'s tail-only `todos` field was documented at the TS signature
but not in the apiproxy README pair, and the Agent Note claimed the feature
added no new wire vocabulary. Both README sides now state the tail/omission
semantics (an omitted field on a tail response is the empty plan, not unchanged
state), and the note records the one added field instead of denying it.

Tests: TodoPanel specs render the plain list; new TodoDock specs cover selection,
live follow, rollback-to-empty, and the registration shape; a new row spec pins
Enter/Space activation and non-activating keys.
2026-07-27 12:08:46 +08:00
07akioni
3ee2982f85 optimize chat ui 2026-07-27 12:04:12 +08:00
Chinesezjc
8ebdad5076 reset the plan when a tail history response omits the todo projection
An omitted `todos` on a tail request was treated as "no projection carried"
and preserved the prior value. Every installWindow caller is a tail request
(doOpen, its gap re-pull, repairGap; loadOlder prepends without it), which the
host answers with the full-log projection or omits only when the log holds no
todo/write — so the field's absence is the authoritative empty list. A live
write whose host crashed before persisting therefore left the rolled-back plan
on screen indefinitely; the assignment now clears it on the next open or
resync. Widened the parameter to an explicit `| undefined` so the two meanings
cannot be conflated again, and updated the JSDoc at both declaring seams plus
the bilingual README/note pair.
2026-07-27 11:41:26 +08:00
Tianyi Cui
38a05724f4 Merge remote-tracking branch 'origin/master' into worktree-process-service-seam
# Conflicts:
#	apps/cli/package.json
2026-07-27 11:36:03 +08:00
Tianyi Cui
eaa9ced271 Merge remote-tracking branch 'origin/worktree-process-service-seam' into subprocess-simpl/d-one-env-channel
# Conflicts:
#	docs/cordis-catalog/services.md
#	docs/core-data-structures/subprocess.i18n.yaml
#	packages/lsp/lsp-local/src/connection.ts
#	packages/subagent/subagent-acp/README.i18n.yaml
#	packages/subprocess/subprocess-local/README.i18n.yaml
#	packages/subprocess/subprocess-local/src/spawn.ts
#	packages/subprocess/subprocess/README.i18n.yaml
#	packages/subprocess/subprocess/README.md
#	packages/subprocess/subprocess/README.zh.md
#	packages/subprocess/subprocess/tests/service.spec.ts
2026-07-27 11:31:38 +08:00
Tianyi Cui
cc2f15a83d Merge remote-tracking branch 'origin/worktree-process-service-seam' into subprocess-simpl/c-one-termination-verb
# Conflicts:
#	.agents/notes/implemented/architecture/2026-07-26-subprocess-consumer-migration.i18n.yaml
#	.agents/notes/implemented/architecture/2026-07-26-subprocess-consumer-migration.md
#	.agents/notes/implemented/architecture/2026-07-26-subprocess-consumer-migration.zh.md
#	docs/cordis-catalog/services.md
#	docs/core-data-structures/subprocess.i18n.yaml
#	docs/core-data-structures/subprocess.md
#	docs/core-data-structures/subprocess.zh.md
#	packages/cordis/tool-cordis/src/api-catalog.ts
#	packages/subprocess/subprocess-local/README.i18n.yaml
#	packages/subprocess/subprocess-local/README.md
#	packages/subprocess/subprocess-local/README.zh.md
#	packages/subprocess/subprocess/README.i18n.yaml
#	packages/subprocess/subprocess/README.md
#	packages/subprocess/subprocess/README.zh.md
#	packages/subprocess/subprocess/src/index.ts
2026-07-27 11:22:21 +08:00