Merge remote-tracking branch 'origin/master' into feat/search-presenter

# Conflicts:
#	docs/config-catalog.md
#	docs/cookbook/adding-a-tool.i18n.yaml
#	docs/cookbook/adding-a-tool.md
#	docs/cookbook/adding-a-tool.zh.md
#	docs/cordis-catalog/events.md
#	docs/cordis-catalog/services.md
#	docs/core-data-structures/tools.i18n.yaml
#	docs/core-data-structures/tools.md
#	docs/core-data-structures/tools.zh.md
#	docs/event-producer-consumer.md
#	examples/acp-agent/tests/snapshots/cordis-inspect-jsdoc/session.jsonl
#	packages/cordis/tool-cordis/src/api-catalog.ts
#	packages/core/tools/README.i18n.yaml
#	packages/core/tools/README.md
#	packages/core/tools/README.zh.md
#	packages/core/tools/src/index.ts
#	packages/core/tools/src/presentation.ts
#	packages/fs/tool-fs-search/src/glob.ts
#	packages/fs/tool-fs-search/src/index.ts
#	packages/ui/tui/src/components/transcript.ts
#	packages/ui/tui/tests/tui.spec.ts
This commit is contained in:
Chinesezjc
2026-07-31 11:31:32 +08:00
946 changed files with 28921 additions and 4610 deletions

View File

@@ -34,6 +34,15 @@ import type {
import type { RetainedItems } from '@deepseek-ai/dsh-retention'
import type { GrepMatch } from './search-core.ts'
/**
* The retention fields a meta projection reads: the retained page, whether the
* complete result was capped, and the pre-cap total. Both a full
* {@link RetainedItems} (from `retainGrepMatches`) and `glob`'s sampled page
* satisfy this structural subset, so a projection consumes either without a fake
* `kept`/`omitted`.
*/
type RetainedPage<T> = Pick<RetainedItems<T>, 'items' | 'truncated' | 'seen'>
/**
* The `grep`/`glob` tools' private `tool/result` `meta` payload: the capped,
* structured search result. Attached opaquely (as `JsonValue`) on the tool result
@@ -118,7 +127,7 @@ function capMetaBytes(meta: SearchMeta, maxMetaBytes: number): SearchMeta {
* @param maxMetaBytes - the serialized-meta byte budget.
* @returns the `matches`-shaped search metadata.
*/
export function grepSearchMeta(retained: RetainedItems<GrepMatch>, maxMetaBytes: number): SearchMeta {
export function grepSearchMeta(retained: RetainedPage<GrepMatch>, maxMetaBytes: number): SearchMeta {
const meta: SearchMeta = {
shape: 'matches',
files: groupMatchesByFile(retained.items),
@@ -138,7 +147,7 @@ export function grepSearchMeta(retained: RetainedItems<GrepMatch>, maxMetaBytes:
* @param maxMetaBytes - the serialized-meta byte budget.
* @returns the `paths`-shaped search metadata.
*/
export function globSearchMeta(retained: RetainedItems<string>, maxMetaBytes: number): SearchMeta {
export function globSearchMeta(retained: RetainedPage<string>, maxMetaBytes: number): SearchMeta {
const meta: SearchMeta = {
shape: 'paths',
paths: retained.items,