feat: implement PI-090 product tools

This commit is contained in:
2026-08-23 15:14:50 +08:00
parent 77cdee7e73
commit 13ab383e53
32 changed files with 2035 additions and 49 deletions

View File

@@ -14,6 +14,7 @@ import type {
KnownToolDetails,
PublicWorkerState,
} from './contracts';
import { productToolDetails } from './product-tool-protocol';
import { projectSubagentDetailsV1 } from './subagent-protocol';
export type ConversationInvalidationCode =
@@ -146,21 +147,10 @@ function isContentBlock(value: unknown): value is ConversationContentBlock {
function isKnownToolDetails(value: unknown): value is KnownToolDetails {
const record = asRecord(value);
if (!record || !isNonEmptyString(record.schema)) return false;
if (record.schema === 'changed-file.v1') {
return Array.isArray(record.paths) && record.paths.every(isNonEmptyString);
}
if (productToolDetails(record)) return true;
if (record.schema === 'write-lease.v1') {
return record.status === 'waiting' || record.status === 'held' || record.status === 'released';
}
if (record.schema === 'task-state.v1') {
return Array.isArray(record.tasks) && record.tasks.every((task) => {
const item = asRecord(task);
return item !== null
&& isNonEmptyString(item.id)
&& isNonEmptyString(item.title)
&& ['pending', 'running', 'complete', 'error'].includes(String(item.status));
});
}
if (record.schema === 'subagent.v1') {
return projectSubagentDetailsV1(record) !== undefined;
}