@sema-agent/core 5.13.0 → 5.14.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (86) hide show
  1. package/CHANGELOG.md +296 -0
  2. package/dist/agents/send-message-tool.js +1 -0
  3. package/dist/agents/subagent.d.ts +4 -0
  4. package/dist/agents/subagent.js +133 -41
  5. package/dist/brain/anthropic.js +33 -10
  6. package/dist/brain/context-overflow.d.ts +20 -0
  7. package/dist/brain/context-overflow.js +58 -0
  8. package/dist/brain/open-responses.js +24 -10
  9. package/dist/brain/openai.js +29 -11
  10. package/dist/brain/request-params.d.ts +2 -0
  11. package/dist/brain/request-params.js +16 -0
  12. package/dist/brain/stream-engine.d.ts +9 -1
  13. package/dist/brain/stream-engine.js +256 -27
  14. package/dist/brain/timeout.d.ts +1 -0
  15. package/dist/brain/timeout.js +1 -0
  16. package/dist/core/a2a.d.ts +2 -2
  17. package/dist/core/a2a.js +3 -3
  18. package/dist/core/ask-question.d.ts +47 -2
  19. package/dist/core/ask-question.js +209 -28
  20. package/dist/core/background-agent-store.d.ts +2 -0
  21. package/dist/core/checkpoint-store.d.ts +41 -17
  22. package/dist/core/checkpoint-store.js +114 -3
  23. package/dist/core/hooks.d.ts +24 -2
  24. package/dist/core/hooks.js +97 -10
  25. package/dist/core/human-input-projection.d.ts +12 -0
  26. package/dist/core/human-input-projection.js +27 -0
  27. package/dist/core/mcp.d.ts +7 -2
  28. package/dist/core/mcp.js +7 -7
  29. package/dist/core/memory-admission.d.ts +4 -0
  30. package/dist/core/memory-admission.js +3 -0
  31. package/dist/core/runner/assemble-result.d.ts +1 -0
  32. package/dist/core/runner/assemble-result.js +1 -1
  33. package/dist/core/runner/prepare-task.d.ts +16 -6
  34. package/dist/core/runner/prepare-task.js +301 -24
  35. package/dist/core/runner/runtask.d.ts +3 -6
  36. package/dist/core/runner/runtask.js +186 -36
  37. package/dist/core/runner/tool-output-projection.js +1 -0
  38. package/dist/core/session-store.d.ts +3 -0
  39. package/dist/core/session-store.js +4 -0
  40. package/dist/core/session.d.ts +1 -0
  41. package/dist/core/store-contracts/background-agent-store-contract.js +19 -0
  42. package/dist/core/store-contracts/checkpoint-store-contract.js +62 -3
  43. package/dist/core/task-notification.d.ts +2 -0
  44. package/dist/core/task-notification.js +5 -3
  45. package/dist/core/task-registry-agent.d.ts +1 -0
  46. package/dist/core/task-registry-agent.js +6 -0
  47. package/dist/core/task-registry.d.ts +1 -0
  48. package/dist/core/task-registry.js +4 -1
  49. package/dist/core/tool-policy.d.ts +5 -0
  50. package/dist/core/tool-policy.js +2 -1
  51. package/dist/core/types.d.ts +32 -1
  52. package/dist/core/wiring-manifest.d.ts +97 -0
  53. package/dist/core/wiring-manifest.js +186 -0
  54. package/dist/engine/compaction/compaction.js +2 -2
  55. package/dist/engine/harness/agent-harness.d.ts +2 -1
  56. package/dist/engine/harness/agent-harness.js +8 -1
  57. package/dist/engine/harness/types.d.ts +3 -1
  58. package/dist/engine/llm/types.d.ts +7 -0
  59. package/dist/engine/llm/types.js +8 -1
  60. package/dist/engine/session/import-validate.d.ts +6 -1
  61. package/dist/engine/session/import-validate.js +29 -6
  62. package/dist/engine/session/memory-repo.d.ts +3 -1
  63. package/dist/engine/session/memory-repo.js +2 -2
  64. package/dist/index.d.ts +7 -4
  65. package/dist/index.js +7 -4
  66. package/dist/internal/harness-types.d.ts +1 -1
  67. package/dist/internal/llm.d.ts +2 -2
  68. package/dist/internal/llm.js +1 -1
  69. package/dist/orchestration/run-workflow-tool.d.ts +4 -0
  70. package/dist/orchestration/run-workflow-tool.js +3 -0
  71. package/dist/orchestration/workflow-types.d.ts +8 -0
  72. package/dist/orchestration/workflow-types.js +14 -0
  73. package/dist/orchestration/workflow.d.ts +4 -0
  74. package/dist/orchestration/workflow.js +134 -5
  75. package/dist/prompts/default.js +1 -1
  76. package/dist/stores/file/checkpoint-store.d.ts +3 -5
  77. package/dist/stores/file/checkpoint-store.js +31 -2
  78. package/dist/stores/file/index.js +1 -1
  79. package/dist/stores/file/session-store.d.ts +3 -1
  80. package/dist/stores/file/session-store.js +2 -2
  81. package/dist/stores/file/shared-ledger.js +8 -1
  82. package/dist/tools/fs/bash-readonly-classifier.d.ts +3 -0
  83. package/dist/tools/fs/bash-readonly-classifier.js +94 -0
  84. package/dist/tools/fs/fs-bash.js +31 -12
  85. package/dist/tools/fs/safety.js +34 -10
  86. package/package.json +1 -1
@@ -14,6 +14,67 @@ export function cloneObserverInput(input) {
14
14
  return input;
15
15
  }
16
16
  }
17
+ const reflectApply = Reflect.apply;
18
+ const getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor;
19
+ const getPrototypeOf = Object.getPrototypeOf;
20
+ const objectPrototype = Object.prototype;
21
+ function findEnvSlot(env, key) {
22
+ for (let o = env; o !== null && o !== objectPrototype; o = getPrototypeOf(o)) {
23
+ const desc = getOwnPropertyDescriptor(o, key);
24
+ if (desc !== undefined)
25
+ return { holder: o, desc };
26
+ }
27
+ return undefined;
28
+ }
29
+ function readEnvPrimitive(env, key) {
30
+ const slot = findEnvSlot(env, key);
31
+ if (slot === undefined)
32
+ return undefined;
33
+ return slot.desc.get !== undefined ? reflectApply(slot.desc.get, env, []) : slot.desc.value;
34
+ }
35
+ function createCwdReader(env) {
36
+ const slot = findEnvSlot(env, "cwd");
37
+ if (slot === undefined)
38
+ return undefined;
39
+ const getter = slot.desc.get;
40
+ const initial = getter !== undefined ? reflectApply(getter, env, []) : slot.desc.value;
41
+ if (typeof initial !== "string")
42
+ return undefined;
43
+ let last = initial;
44
+ return () => {
45
+ const desc = getOwnPropertyDescriptor(slot.holder, "cwd");
46
+ const value = desc === undefined
47
+ ? undefined
48
+ : desc.get !== undefined
49
+ ? desc.get === getter
50
+ ? reflectApply(desc.get, env, [])
51
+ : undefined
52
+ : desc.value;
53
+ if (typeof value === "string")
54
+ last = value;
55
+ return last;
56
+ };
57
+ }
58
+ export function createHookEnvCapabilities(env) {
59
+ const face = Object.create(null);
60
+ const canonicalPath = readEnvPrimitive(env, "canonicalPath");
61
+ const exists = readEnvPrimitive(env, "exists");
62
+ const readLink = readEnvPrimitive(env, "readLink");
63
+ const cwd = createCwdReader(env);
64
+ if (typeof canonicalPath === "function") {
65
+ face.canonicalPath = (path, abortSignal) => reflectApply(canonicalPath, env, [path, abortSignal]);
66
+ }
67
+ if (typeof exists === "function") {
68
+ face.exists = (path, abortSignal) => reflectApply(exists, env, [path, abortSignal]);
69
+ }
70
+ if (typeof readLink === "function") {
71
+ face.readLink = (path, abortSignal) => reflectApply(readLink, env, [path, abortSignal]);
72
+ }
73
+ if (cwd !== undefined) {
74
+ face.cwd = cwd;
75
+ }
76
+ return Object.freeze(face);
77
+ }
17
78
  export function formatHookFeedback(text) {
18
79
  return `<system-reminder>\n${text}\n</system-reminder>`;
19
80
  }
@@ -61,6 +122,7 @@ function withProbeTimeout(p, ms, signal) {
61
122
  export async function runToolGate(input) {
62
123
  const { event, preToolUse, adjudicate, resolveAsk, suspendAsk } = input;
63
124
  const { toolCallId, toolName } = event;
125
+ const hookCtx = () => ({ toolCallId, toolName, ...(input.hookEnv !== undefined ? { env: input.hookEnv } : {}) });
64
126
  let currentInput = event.input;
65
127
  const preToolContext = [];
66
128
  let hookAsk;
@@ -68,7 +130,7 @@ export async function runToolGate(input) {
68
130
  if (preToolUse) {
69
131
  let r;
70
132
  try {
71
- r = screenPreToolUseResult(await preToolUse(toolName, currentInput, { toolCallId, toolName }));
133
+ r = screenPreToolUseResult(await preToolUse(toolName, currentInput, hookCtx()));
72
134
  }
73
135
  catch (err) {
74
136
  const reason = preToolUseCrashReason(`this call to "${toolName}"`, err);
@@ -147,7 +209,10 @@ export async function runToolGate(input) {
147
209
  currentInput = policyRewrite;
148
210
  req.args = policyRewrite;
149
211
  }
150
- if (input.autoMode && decision.action === "ask" && input.isMarkedUnresolvable?.(input.event.toolCallId) !== true) {
212
+ if (input.autoMode &&
213
+ decision.action === "ask" &&
214
+ req.toolName !== ASK_USER_QUESTION_TOOL_NAME &&
215
+ input.isMarkedUnresolvable?.(input.event.toolCallId) !== true) {
151
216
  const verdict = await input.autoMode.decider
152
217
  .decide({ req, askMessage: decisionText(decision) }, input.abortSignal)
153
218
  .catch(() => ({ kind: "unavailable", cause: "error" }));
@@ -180,13 +245,35 @@ export async function runToolGate(input) {
180
245
  }
181
246
  }
182
247
  if (decision.action === "ask" && req.toolName === ASK_USER_QUESTION_TOOL_NAME) {
183
- decision = {
184
- action: "deny",
185
- message: "AskUserQuestion could not be parked for a durable human answer on this path (no checkpoint " +
186
- "facility, or the suspend failed) and a synchronous permission approver cannot carry an answer — " +
187
- "the question was NOT shown to anyone. Proceed with your best judgment and state the assumption " +
188
- "you made.",
189
- };
248
+ const outcome = input.resolveContentAsk !== undefined ? await input.resolveContentAsk(req) : { kind: "unavailable", parkDeclined: false };
249
+ if (outcome.kind === "answered") {
250
+ decision = { action: "allow", updatedInput: outcome.presentedInput };
251
+ }
252
+ else if (outcome.kind === "unavailable") {
253
+ if (outcome.presentedInput !== undefined) {
254
+ currentInput = outcome.presentedInput;
255
+ req.args = outcome.presentedInput;
256
+ }
257
+ if (suspendAsk && outcome.parkDeclined) {
258
+ const suspended = await suspendAsk(req, currentInput, safety, true);
259
+ if (suspended) {
260
+ return { suspend: suspended, preToolContext };
261
+ }
262
+ }
263
+ decision = {
264
+ action: "deny",
265
+ message: "AskUserQuestion could not be parked for a durable human answer on this path (no checkpoint " +
266
+ "facility, or the suspend failed) and a synchronous permission approver cannot carry an answer — " +
267
+ "the question was NOT shown to anyone. Proceed with your best judgment and state the assumption " +
268
+ "you made.",
269
+ };
270
+ }
271
+ else {
272
+ if (outcome.presentedInput !== undefined)
273
+ decision = { action: "allow", updatedInput: outcome.presentedInput };
274
+ else
275
+ decision = { action: "allow" };
276
+ }
190
277
  }
191
278
  if (decision.action === "ask") {
192
279
  const resolved = await resolveAsk(decision, req);
@@ -212,7 +299,7 @@ export async function runToolGate(input) {
212
299
  if (preToolUse) {
213
300
  let hr;
214
301
  try {
215
- hr = screenPreToolUseResult(await preToolUse(toolName, editArgs, { toolCallId, toolName }));
302
+ hr = screenPreToolUseResult(await preToolUse(toolName, editArgs, hookCtx()));
216
303
  }
217
304
  catch (err) {
218
305
  traceHookCrash(input, err, notifier);
@@ -0,0 +1,12 @@
1
+ import { type ActorAssertion } from "../internal/llm.js";
2
+ import type { HumanInputEvent, HumanInputSource, TaskEventIdentity } from "./types.js";
3
+ export type { HumanInputSource, HumanInputDelivery, HumanInputEvent } from "./types.js";
4
+ export interface HumanInputFrame {
5
+ text: string;
6
+ actor?: ActorAssertion;
7
+ source: HumanInputSource;
8
+ }
9
+ export declare function projectHumanInput(frame: HumanInputFrame): string;
10
+ export declare function buildHumanInputEvent(input: Omit<HumanInputEvent, "type" | "inputId" | keyof TaskEventIdentity> & {
11
+ inputId?: string;
12
+ }): HumanInputEvent;
@@ -0,0 +1,27 @@
1
+ import { snapshotActorAssertion } from "../internal/llm.js";
2
+ import { uuidv7 } from "../internal/harness.js";
3
+ import { inlineUntrusted } from "./untrusted-text.js";
4
+ import { attrEscape, EXTERNAL_SOURCE_MAX } from "./task-notification.js";
5
+ export function projectHumanInput(frame) {
6
+ if (frame.actor === undefined || frame.source === "system")
7
+ return frame.text;
8
+ if (frame.text.trim().length === 0)
9
+ return frame.text;
10
+ const label = attrEscape(inlineUntrusted(frame.actor.id, EXTERNAL_SOURCE_MAX));
11
+ const mark = frame.actor.hostAsserted ? "" : " (unverified)";
12
+ return `[from "${label}"${mark}]\n${frame.text}`;
13
+ }
14
+ export function buildHumanInputEvent(input) {
15
+ return {
16
+ type: "human_input",
17
+ inputId: input.inputId ?? uuidv7(),
18
+ sessionSeq: input.sessionSeq,
19
+ carrier: input.carrier,
20
+ source: input.source,
21
+ delivery: input.delivery,
22
+ ...(input.issuer !== undefined ? { issuer: input.issuer } : {}),
23
+ ...(input.actor !== undefined ? { actor: snapshotActorAssertion(input.actor) } : {}),
24
+ ...(input.principal !== undefined ? { principal: input.principal } : {}),
25
+ ...(input.entryId !== undefined ? { entryId: input.entryId } : {}),
26
+ };
27
+ }
@@ -5,8 +5,8 @@ import { type McpImageResizer } from "./image-downsample.js";
5
5
  import type { McpServerSpec, OnElicit, ToolEffect } from "./types.js";
6
6
  export interface McpToolAxis {
7
7
  name: string;
8
- irreversibility?: "always";
9
- egress?: true;
8
+ irreversibility?: "always" | "never";
9
+ egress?: boolean;
10
10
  effect?: ToolEffect;
11
11
  }
12
12
  export interface McpDroppedTool {
@@ -114,6 +114,11 @@ export type McpSchemaNormalizeResult = {
114
114
  export declare function normalizeMcpToolSchema(schema: unknown): McpSchemaNormalizeResult;
115
115
  export declare function mcpToolSchemaProblem(schema: unknown): string | undefined;
116
116
  export declare function materializeMcpTools(specs: McpServerSpec[], principal?: string, onElicit?: OnElicit, imageResizer?: McpImageResizer): Promise<MaterializedMcp>;
117
+ export declare function applyCallerAxisOverride(name: string, hint: McpToolAxis | undefined, override: {
118
+ effect?: ToolEffect;
119
+ egress?: boolean;
120
+ irreversibility?: "always" | "never";
121
+ } | undefined): McpToolAxis | undefined;
117
122
  export declare function classifyDirReadInvalidParams(message: string): "not_found" | "not_directory";
118
123
  export declare function parseCallToolResultLenient(data: unknown): {
119
124
  success: true;
package/dist/core/mcp.js CHANGED
@@ -720,7 +720,7 @@ function mcpAxisFor(namespacedName, annotations) {
720
720
  }
721
721
  return any ? axis : undefined;
722
722
  }
723
- function applyCallerAxisOverride(name, hint, override) {
723
+ export function applyCallerAxisOverride(name, hint, override) {
724
724
  if (!override)
725
725
  return hint;
726
726
  let effect = hint?.effect;
@@ -729,16 +729,16 @@ function applyCallerAxisOverride(name, hint, override) {
729
729
  if (override.effect !== undefined)
730
730
  effect = override.effect;
731
731
  if (override.egress !== undefined)
732
- egress = override.egress ? true : undefined;
732
+ egress = override.egress;
733
733
  if (override.irreversibility !== undefined)
734
- irrev = override.irreversibility === "always" ? "always" : undefined;
734
+ irrev = override.irreversibility;
735
735
  const axis = { name };
736
736
  if (effect !== undefined)
737
737
  axis.effect = effect;
738
- if (egress)
739
- axis.egress = true;
740
- if (irrev)
741
- axis.irreversibility = "always";
738
+ if (egress !== undefined)
739
+ axis.egress = egress;
740
+ if (irrev !== undefined)
741
+ axis.irreversibility = irrev;
742
742
  return axis.effect !== undefined || axis.egress !== undefined || axis.irreversibility !== undefined ? axis : undefined;
743
743
  }
744
744
  const LIST_MCP_RESOURCES = "ListMcpResourcesTool";
@@ -44,4 +44,8 @@ export interface OwnOrgAdmissionVerdict {
44
44
  scopes: readonly string[];
45
45
  writeScope: string | null;
46
46
  }
47
+ export declare function readDurableOrgAdmission(row: {
48
+ admittedOrgScopes?: readonly string[];
49
+ admittedOrgWriteScope?: string | null;
50
+ }): OwnOrgAdmissionVerdict;
47
51
  export declare function admitMemoryScopes(input: MemoryAdmissionInput): Promise<MemoryAdmissionOutcome>;
@@ -7,6 +7,9 @@ function codedError(code, message) {
7
7
  export function foldAdmissionFreeze(input) {
8
8
  return input.delegated ? (input.inherited ?? []) : input.inherited;
9
9
  }
10
+ export function readDurableOrgAdmission(row) {
11
+ return { scopes: row.admittedOrgScopes ?? [], writeScope: row.admittedOrgWriteScope ?? null };
12
+ }
10
13
  const ORG_SHAPE = /^org:/;
11
14
  function orgScopesOf(spec) {
12
15
  if (spec.scopeContract !== "v2")
@@ -58,6 +58,7 @@ export interface ResultFlags {
58
58
  model?: string;
59
59
  unpricedSpend?: boolean;
60
60
  rewindNotes?: TaskResult["rewindNotes"];
61
+ strandedHumanAnswers?: TaskResult["strandedHumanAnswers"];
61
62
  remoteEnvFailures?: TaskResult["remoteEnvFailures"];
62
63
  retryAfterMs?: number;
63
64
  abortedForTimeout: boolean;
@@ -159,5 +159,5 @@ export function assembleResult(spec, sessionId, final, stats, flags) {
159
159
  void _internalCompaction;
160
160
  if (flags.unpricedSpend)
161
161
  delete publicStats.costMicroUsd;
162
- return { taskId, sessionId, status, ...(flags.model !== undefined ? { model: flags.model } : {}), result: result.trim(), salvagedOutput, blockedReason, errorMessage, errorCode, ...(retryAfterMs !== undefined ? { retryAfterMs } : {}), checkpointToken, checkpointGate, ...(workspaceRestoreMode !== undefined ? { workspaceRestoreMode } : {}), ...(flags.rewindNotes !== undefined && flags.rewindNotes.length > 0 ? { rewindNotes: flags.rewindNotes } : {}), ...(flags.remoteEnvFailures !== undefined && flags.remoteEnvFailures.length > 0 ? { remoteEnvFailures: flags.remoteEnvFailures } : {}), stats: publicStats };
162
+ return { taskId, sessionId, status, ...(flags.model !== undefined ? { model: flags.model } : {}), result: result.trim(), salvagedOutput, blockedReason, errorMessage, errorCode, ...(retryAfterMs !== undefined ? { retryAfterMs } : {}), checkpointToken, checkpointGate, ...(workspaceRestoreMode !== undefined ? { workspaceRestoreMode } : {}), ...(flags.rewindNotes !== undefined && flags.rewindNotes.length > 0 ? { rewindNotes: flags.rewindNotes } : {}), ...(flags.remoteEnvFailures !== undefined && flags.remoteEnvFailures.length > 0 ? { remoteEnvFailures: flags.remoteEnvFailures } : {}), ...(flags.strandedHumanAnswers !== undefined && flags.strandedHumanAnswers.length > 0 ? { strandedHumanAnswers: flags.strandedHumanAnswers } : {}), stats: publicStats };
163
163
  }
@@ -20,7 +20,8 @@ import type { TaskNotificationPayload } from "../task-notification.js";
20
20
  import { type CwdRef } from "../../tools/fs/index.js";
21
21
  import { type WorkflowSizeGuideline } from "../../orchestration/workflow-size-guideline.js";
22
22
  import type { Runner } from "./runtask.js";
23
- import { type CheckpointGate, type CheckpointState, type CheckpointStore, type CheckpointToken, type ResourceLedger, type PlatformLimitReason, type ResourceLimitReason } from "../checkpoint-store.js";
23
+ import { type CheckpointGate, type CheckpointState, type CheckpointToken, type ResourceLedger, type PlatformLimitReason, type ResourceLimitReason } from "../checkpoint-store.js";
24
+ import { type WiringManifest } from "../wiring-manifest.js";
24
25
  import type { ActiveWorktreeSession, AgentMessage, AgentTool, ExecutionEnv } from "../../internal/harness.js";
25
26
  import type { NestedUsageAccum, RunnerDeps, TaskEvent, TaskLimits, TaskResult, TaskSpec, ToolActivity, ToolEffect } from "../types.js";
26
27
  import type { RepairBundle } from "../../agents/repair-loop.js";
@@ -44,11 +45,7 @@ export declare function checkpointScopeOf(spec: {
44
45
  };
45
46
  principal?: string;
46
47
  }): string;
47
- export declare function resolveCheckpointStore(spec: {
48
- checkpointStore?: CheckpointStore | null;
49
- }, deps: {
50
- checkpointStore?: CheckpointStore;
51
- }): CheckpointStore | undefined;
48
+ export { resolveCheckpointStore } from "../checkpoint-store.js";
52
49
  export interface Prepared {
53
50
  harness: AgentHarness;
54
51
  session: StoredSession;
@@ -81,11 +78,16 @@ export interface Prepared {
81
78
  denyNarrowingPolicy?: ToolPolicy;
82
79
  basePolicyForResumeEdit?: ToolPolicy;
83
80
  releaseSignal: () => void;
81
+ settleContentAskBindings: () => ReadonlyArray<{
82
+ deliveryId: string;
83
+ toolCallId: string;
84
+ }>;
84
85
  cacheBreakDetector?: CacheBreakDetector;
85
86
  cacheFingerprint?: {
86
87
  systemPrompt: string;
87
88
  tools: ToolFingerprintInput[];
88
89
  };
90
+ wiringManifest: WiringManifest;
89
91
  promptManifest: {
90
92
  constitution: "core" | "replaced" | "provider-assembled";
91
93
  blocks: Array<{
@@ -294,6 +296,8 @@ export interface PrepareResume {
294
296
  }>;
295
297
  };
296
298
  workspaceHandle?: import("../remote-env.js").WorkspaceHandle;
299
+ redeemedContentAskCallId?: string;
300
+ redeemedContentAskQuestionsHash?: string;
297
301
  executesApprovedAction?: boolean;
298
302
  }
299
303
  export interface InheritedGate {
@@ -325,8 +329,13 @@ export declare function resolveModelPromptTraits(model: {
325
329
  };
326
330
  export interface RunInternals {
327
331
  repairBundle?: RepairBundle;
332
+ questionFaceStripped?: true;
333
+ parentInteractionPosture?: "interactive" | "headless";
328
334
  afterCheckpointResolve?: () => Promise<void>;
329
335
  inheritedGate?: InheritedGate;
336
+ ownOrgAdmissionRef?: {
337
+ current: import("../memory-admission.js").OwnOrgAdmissionVerdict | undefined;
338
+ };
330
339
  workflowDepth?: number;
331
340
  insideFork?: boolean;
332
341
  isDelegatedChild?: boolean;
@@ -338,6 +347,7 @@ export interface RunInternals {
338
347
  explicitAgentName?: string;
339
348
  parentTaskId?: string;
340
349
  parentSessionId?: string;
350
+ delegationTaskType?: import("../types.js").DelegationTaskType;
341
351
  rootSessionId?: string;
342
352
  registryScope?: string;
343
353
  parentCenterArtifactDigest?: string;