feat: implement PI-090 product tools
This commit is contained in:
@@ -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;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user