Files
NetMesh/components/ai/toolArtifacts/terminalToolArtifact.ts
zhaolei 3c72efcb7f
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
[Init] Initial commit - NetMesh terminal manager
2026-09-13 18:24:01 +08:00

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'),
};
}