mirror of
https://github.com/openclaw/openclaw.git
synced 2026-05-01 17:30:21 +00:00
Add inline file attachment support for sessions_spawn (subagent runtime only): - Schema: attachments[] (name, content, encoding, mimeType) and attachAs.mountPath hint - Materialization: files written to .openclaw/attachments/<uuid>/ with manifest.json - Validation: strict base64 decode, filename checks, size limits, duplicate detection - Transcript redaction: sanitizeToolCallInputs redacts attachment content from persisted transcripts - Lifecycle cleanup: safeRemoveAttachmentsDir with symlink-safe path containment check - Config: tools.sessions_spawn.attachments (enabled, maxFiles, maxFileBytes, maxTotalBytes, retainOnSessionKeep) - Registry: attachmentsDir/attachmentsRootDir/retainAttachmentsOnKeep on SubagentRunRecord - ACP rejection: attachments rejected for runtime=acp with clear error message - Docs: updated tools/index.md, concepts/session-tool.md, configuration-reference.md - Tests: 85 new/updated tests across 5 test files Fixes: - Guard fs.rm in materialization catch block with try/catch (review concern #1) - Remove unreachable fallback in safeRemoveAttachmentsDir (review concern #7) - Move attachment cleanup out of retry path to avoid timing issues with announce loop Co-authored-by: Tyler Yust <TYTYYUST@YAHOO.COM> Co-authored-by: napetrov <napetrov@users.noreply.github.com>
39 lines
1.4 KiB
TypeScript
39 lines
1.4 KiB
TypeScript
import type { DeliveryContext } from "../utils/delivery-context.js";
|
|
import type { SubagentRunOutcome } from "./subagent-announce.js";
|
|
import type { SubagentLifecycleEndedReason } from "./subagent-lifecycle-events.js";
|
|
import type { SpawnSubagentMode } from "./subagent-spawn.js";
|
|
|
|
export type SubagentRunRecord = {
|
|
runId: string;
|
|
childSessionKey: string;
|
|
requesterSessionKey: string;
|
|
requesterOrigin?: DeliveryContext;
|
|
requesterDisplayKey: string;
|
|
task: string;
|
|
cleanup: "delete" | "keep";
|
|
label?: string;
|
|
model?: string;
|
|
runTimeoutSeconds?: number;
|
|
spawnMode?: SpawnSubagentMode;
|
|
createdAt: number;
|
|
startedAt?: number;
|
|
endedAt?: number;
|
|
outcome?: SubagentRunOutcome;
|
|
archiveAtMs?: number;
|
|
cleanupCompletedAt?: number;
|
|
cleanupHandled?: boolean;
|
|
suppressAnnounceReason?: "steer-restart" | "killed";
|
|
expectsCompletionMessage?: boolean;
|
|
/** Number of announce delivery attempts that returned false (deferred). */
|
|
announceRetryCount?: number;
|
|
/** Timestamp of the last announce retry attempt (for backoff). */
|
|
lastAnnounceRetryAt?: number;
|
|
/** Terminal lifecycle reason recorded when the run finishes. */
|
|
endedReason?: SubagentLifecycleEndedReason;
|
|
/** Set after the subagent_ended hook has been emitted successfully once. */
|
|
endedHookEmittedAt?: number;
|
|
attachmentsDir?: string;
|
|
attachmentsRootDir?: string;
|
|
retainAttachmentsOnKeep?: boolean;
|
|
};
|