Some checks failed
build-packages / resolve bundled mosh-client (push) Has been cancelled
build-packages / resolve bundled et-client (push) Has been cancelled
build-packages / build-macos (push) Has been cancelled
build-packages / build-windows (push) Has been cancelled
build-packages / build-linux-x64 (push) Has been cancelled
build-packages / build-linux-arm64 (push) Has been cancelled
build-packages / release (push) Has been cancelled
build-packages / update Nix release metadata (push) Has been cancelled
build-packages / bump homebrew tap (push) Has been cancelled
test / lint-and-test (push) Has been cancelled
AI automation / Route event (push) Has been cancelled
AI automation / Hand reopened issue to maintainers (push) Has been cancelled
AI automation / Clean source issue state (push) Has been cancelled
AI automation / Reconcile handoffs (push) Has been cancelled
AI automation / Classify issue (push) Has been cancelled
AI automation / Claude Code smoke (push) Has been cancelled
AI automation / Review issue follow-up (push) Has been cancelled
AI automation / Publish issue follow-up (push) Has been cancelled
AI automation / Implement with Claude Code (push) Has been cancelled
AI automation / Publish implement PR (push) Has been cancelled
AI automation / Continue queued issue comments (push) Has been cancelled
AI automation / Codex review loop (push) Has been cancelled
AI automation / Publish Codex fix (push) Has been cancelled
AI automation / Clear Codex dispatch marker (push) Has been cancelled
AI automation / Own PR re-request Codex (push) Has been cancelled
AI automation / External PR re-request Codex (push) Has been cancelled
AI automation / Poll Codex reaction / retry (push) Has been cancelled
build-et-binaries / build-linux-x64 (push) Has been cancelled
build-et-binaries / build-linux-arm64 (push) Has been cancelled
build-et-binaries / build-macos-universal (push) Has been cancelled
build-et-binaries / build-windows-x64 (push) Has been cancelled
build-et-binaries / release (push) Has been cancelled
82 lines
2.4 KiB
TypeScript
82 lines
2.4 KiB
TypeScript
import { normalizeArtifactToolName } from './toolArtifactNames';
|
|
import { parseResultPayload } from './toolArtifactResultPayload';
|
|
|
|
export type TerminalToolArtifact =
|
|
| {
|
|
kind: 'terminal.context';
|
|
sessionId: string;
|
|
label?: string;
|
|
range: string;
|
|
totalLines: number;
|
|
startLine: number;
|
|
endLine: number;
|
|
returnedLines: number;
|
|
hasMoreBefore: boolean;
|
|
hasMoreAfter: boolean;
|
|
source?: string;
|
|
preview: string;
|
|
}
|
|
| {
|
|
kind: 'error';
|
|
message: string;
|
|
};
|
|
|
|
const TERMINAL_ARTIFACT_TOOL_NAMES = new Set([
|
|
'terminal_read_context',
|
|
]);
|
|
|
|
function readString(value: unknown): string | undefined {
|
|
return typeof value === 'string' && value.trim() ? value.trim() : undefined;
|
|
}
|
|
|
|
function readNumber(value: unknown): number | undefined {
|
|
return typeof value === 'number' && Number.isFinite(value) ? value : undefined;
|
|
}
|
|
|
|
function readBoolean(value: unknown): boolean {
|
|
return value === true;
|
|
}
|
|
|
|
export function parseTerminalToolArtifact(
|
|
toolName: string,
|
|
result: unknown,
|
|
): TerminalToolArtifact | null {
|
|
const normalizedToolName = normalizeArtifactToolName(toolName);
|
|
if (!normalizedToolName || !TERMINAL_ARTIFACT_TOOL_NAMES.has(normalizedToolName)) return null;
|
|
|
|
const payload = parseResultPayload(result);
|
|
if (!payload) return null;
|
|
|
|
if (payload.ok === false || payload.isError === true || typeof payload.error === 'string') {
|
|
return {
|
|
kind: 'error',
|
|
message: readString(payload.error) ?? 'Terminal context read failed.',
|
|
};
|
|
}
|
|
|
|
const sessionId = readString(payload.sessionId);
|
|
const content = typeof payload.content === 'string' ? payload.content : '';
|
|
const totalLines = readNumber(payload.totalLines);
|
|
const startLine = readNumber(payload.startLine);
|
|
const endLine = readNumber(payload.endLine);
|
|
const returnedLines = readNumber(payload.returnedLines);
|
|
if (!sessionId || totalLines == null || startLine == null || endLine == null || returnedLines == null) {
|
|
return null;
|
|
}
|
|
|
|
return {
|
|
kind: 'terminal.context',
|
|
sessionId,
|
|
label: readString(payload.label),
|
|
range: readString(payload.range) ?? 'viewport',
|
|
totalLines,
|
|
startLine,
|
|
endLine,
|
|
returnedLines,
|
|
hasMoreBefore: readBoolean(payload.hasMoreBefore),
|
|
hasMoreAfter: readBoolean(payload.hasMoreAfter),
|
|
source: readString(payload.source),
|
|
preview: content.split('\n').slice(0, 6).join('\n'),
|
|
};
|
|
}
|