@sema-agent/core 1.452.0 → 2.0.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 (162) hide show
  1. package/dist/agents/agent-transcript-tool.d.ts +15 -0
  2. package/dist/agents/agent-transcript-tool.js +122 -0
  3. package/dist/agents/cascade.js +5 -8
  4. package/dist/agents/repair-loop.d.ts +1 -1
  5. package/dist/agents/repair-loop.js +1 -1
  6. package/dist/agents/retain-ledger.d.ts +60 -0
  7. package/dist/agents/retain-ledger.js +225 -0
  8. package/dist/agents/roster-store.d.ts +1 -0
  9. package/dist/agents/roster-store.js +9 -0
  10. package/dist/agents/send-message-tool.d.ts +41 -0
  11. package/dist/agents/send-message-tool.js +469 -0
  12. package/dist/agents/subagent.d.ts +33 -108
  13. package/dist/agents/subagent.js +22 -834
  14. package/dist/agents/teacher.d.ts +0 -1
  15. package/dist/agents/teacher.js +0 -9
  16. package/dist/bin/sema-tb.js +3 -3
  17. package/dist/brain/anthropic.js +15 -40
  18. package/dist/brain/openai.js +15 -40
  19. package/dist/brain/reasoning.d.ts +1 -1
  20. package/dist/brain/stream-engine.js +2 -2
  21. package/dist/brain/stream-shared.d.ts +17 -0
  22. package/dist/brain/stream-shared.js +50 -0
  23. package/dist/brain/timeout.d.ts +1 -1
  24. package/dist/brain/timeout.js +1 -1
  25. package/dist/config/catalog.js +1 -3
  26. package/dist/config/defaults.d.ts +6 -0
  27. package/dist/config/defaults.js +6 -0
  28. package/dist/core/ask-question.d.ts +1 -1
  29. package/dist/core/background-shell.d.ts +1 -1
  30. package/dist/core/checkpoint-store.d.ts +0 -1
  31. package/dist/core/exec-gate.d.ts +1 -1
  32. package/dist/core/exec-output-tail.d.ts +1 -0
  33. package/dist/core/exec-output-tail.js +6 -0
  34. package/dist/core/file-snapshot-store.d.ts +1 -1
  35. package/dist/core/fs-write-gate-policy.d.ts +1 -1
  36. package/dist/core/git-worktree-env.d.ts +1 -1
  37. package/dist/core/hooks.d.ts +1 -1
  38. package/dist/core/image-downsample.d.ts +44 -0
  39. package/dist/core/image-downsample.js +97 -0
  40. package/dist/core/lsp.d.ts +1 -1
  41. package/dist/core/mcp.d.ts +3 -45
  42. package/dist/core/mcp.js +2 -97
  43. package/dist/core/media-byte-cap.d.ts +1 -1
  44. package/dist/core/memory-recall.d.ts +0 -12
  45. package/dist/core/memory-recall.js +0 -222
  46. package/dist/core/memory.d.ts +0 -6
  47. package/dist/core/memory.js +0 -88
  48. package/dist/core/message-utils.d.ts +1 -1
  49. package/dist/core/oracle-isolation.d.ts +1 -1
  50. package/dist/core/remote-env.d.ts +1 -1
  51. package/dist/core/roles.d.ts +1 -1
  52. package/dist/core/runner/active-skill-scope.d.ts +1 -1
  53. package/dist/core/runner/assemble-result.d.ts +0 -2
  54. package/dist/core/runner/memory-consolidation.d.ts +1 -1
  55. package/dist/core/runner/prepare-memory.d.ts +16 -0
  56. package/dist/core/runner/prepare-memory.js +191 -0
  57. package/dist/core/runner/prepare-task.d.ts +4 -28
  58. package/dist/core/runner/prepare-task.js +19 -207
  59. package/dist/core/runner/prompt-suggestions.d.ts +1 -1
  60. package/dist/core/runner/runtask.d.ts +2 -3
  61. package/dist/core/runner/runtask.js +337 -529
  62. package/dist/core/runner/session-rule-policy.d.ts +1 -1
  63. package/dist/core/runner/synthetic-tools.d.ts +5 -5
  64. package/dist/core/runner/synthetic-tools.js +4 -4
  65. package/dist/core/runner/tool-disclosure.d.ts +3 -3
  66. package/dist/core/runner/tool-disclosure.js +2 -2
  67. package/dist/core/runner/tool-output-projection.d.ts +6 -0
  68. package/dist/core/runner/tool-output-projection.js +81 -0
  69. package/dist/core/runtime.d.ts +1 -1
  70. package/dist/core/scheduler.d.ts +1 -1
  71. package/dist/core/sensitive-path-policy.d.ts +1 -1
  72. package/dist/core/session-reconcile.d.ts +1 -1
  73. package/dist/core/session-store.d.ts +2 -1
  74. package/dist/core/session-store.js +2 -1
  75. package/dist/core/session.d.ts +0 -1
  76. package/dist/core/task-registry-agent.d.ts +115 -0
  77. package/dist/core/task-registry-agent.js +1163 -0
  78. package/dist/core/task-registry-monitor.d.ts +13 -0
  79. package/dist/core/task-registry-monitor.js +347 -0
  80. package/dist/core/task-registry-shared.d.ts +294 -0
  81. package/dist/core/task-registry-shared.js +271 -0
  82. package/dist/core/task-registry-workflow.d.ts +5 -0
  83. package/dist/core/task-registry-workflow.js +143 -0
  84. package/dist/core/task-registry.d.ts +51 -216
  85. package/dist/core/task-registry.js +127 -1940
  86. package/dist/core/task-tool-shape.d.ts +32 -0
  87. package/dist/core/task-tool-shape.js +83 -0
  88. package/dist/core/tool-policy.d.ts +1 -2
  89. package/dist/core/tool-result-budget.d.ts +1 -1
  90. package/dist/core/tool-result-store.d.ts +2 -2
  91. package/dist/core/tool-result-store.js +1 -1
  92. package/dist/core/tools.d.ts +2 -3
  93. package/dist/core/tools.js +0 -8
  94. package/dist/core/trace.d.ts +2 -2
  95. package/dist/core/types.d.ts +0 -29
  96. package/dist/core/workflow-run-store-contract.d.ts +1 -1
  97. package/dist/core/workflow-run-store-contract.js +19 -19
  98. package/dist/engine/execution-env/node-execution-env.d.ts +13 -0
  99. package/dist/engine/execution-env/node-execution-env.js +55 -25
  100. package/dist/engine/lsp/frame-decoder.d.ts +1 -1
  101. package/dist/engine/lsp/frame-decoder.js +1 -1
  102. package/dist/engine/lsp/node-lsp-manager.d.ts +1 -1
  103. package/dist/engine/lsp/stdio-lsp-transport.js +2 -2
  104. package/dist/index.d.ts +16 -14
  105. package/dist/index.js +13 -11
  106. package/dist/internal/harness-types.d.ts +7 -0
  107. package/dist/internal/harness-types.js +1 -0
  108. package/dist/internal/harness.d.ts +1 -7
  109. package/dist/internal/harness.js +1 -0
  110. package/dist/orchestration/goal.js +2 -2
  111. package/dist/orchestration/run-workflow-tool.d.ts +1 -1
  112. package/dist/orchestration/workflow-types.d.ts +193 -0
  113. package/dist/orchestration/workflow-types.js +54 -0
  114. package/dist/orchestration/workflow.d.ts +3 -193
  115. package/dist/orchestration/workflow.js +7 -59
  116. package/dist/prompt-assembly/assemble.d.ts +3 -3
  117. package/dist/prompt-assembly/assemble.js +0 -16
  118. package/dist/prompt-assembly/explain.d.ts +1 -1
  119. package/dist/prompt-assembly/tool-catalog.d.ts +1 -1
  120. package/dist/prompts/default.d.ts +1 -6
  121. package/dist/prompts/default.js +3 -11
  122. package/dist/scenarios/env.d.ts +1 -1
  123. package/dist/scenarios/full-body.d.ts +0 -3
  124. package/dist/scenarios/full-body.js +0 -2
  125. package/dist/stores/file/background-agent-store.d.ts +2 -15
  126. package/dist/stores/file/background-agent-store.js +30 -100
  127. package/dist/stores/file/checkpoint-store.d.ts +1 -14
  128. package/dist/stores/file/checkpoint-store.js +47 -119
  129. package/dist/stores/file/file-snapshot-store.d.ts +1 -1
  130. package/dist/stores/file/shared-ledger.d.ts +35 -0
  131. package/dist/stores/file/shared-ledger.js +94 -0
  132. package/dist/stores/file/workflow-run-store.d.ts +1 -14
  133. package/dist/stores/file/workflow-run-store.js +24 -93
  134. package/dist/tools/fs/bash-readonly-classifier.d.ts +8 -0
  135. package/dist/tools/fs/bash-readonly-classifier.js +166 -0
  136. package/dist/tools/fs/fs-bash.d.ts +31 -0
  137. package/dist/tools/fs/fs-bash.js +672 -0
  138. package/dist/tools/fs/fs-pdf.d.ts +22 -0
  139. package/dist/tools/fs/fs-pdf.js +236 -0
  140. package/dist/tools/fs/fs-read.d.ts +8 -0
  141. package/dist/tools/fs/fs-read.js +286 -0
  142. package/dist/tools/fs/fs-search-tools.d.ts +5 -0
  143. package/dist/tools/fs/fs-search-tools.js +173 -0
  144. package/dist/tools/fs/fs-shared.d.ts +55 -0
  145. package/dist/tools/fs/fs-shared.js +144 -0
  146. package/dist/tools/fs/fs-write.d.ts +8 -0
  147. package/dist/tools/fs/fs-write.js +423 -0
  148. package/dist/tools/fs/index.d.ts +12 -65
  149. package/dist/tools/fs/index.js +26 -2090
  150. package/dist/tools/fs/pdf.d.ts +1 -1
  151. package/dist/tools/fs/repo-map.d.ts +3 -3
  152. package/dist/tools/fs/repo-map.js +1 -1
  153. package/dist/tools/fs/safety.d.ts +1 -1
  154. package/dist/tools/fs/search.d.ts +1 -1
  155. package/dist/tools/monitor.d.ts +1 -1
  156. package/dist/tools/scheduler-tools.d.ts +1 -1
  157. package/dist/tools/web.d.ts +2 -2
  158. package/dist/tools/web.js +1 -1
  159. package/dist/tools/worktree.d.ts +1 -1
  160. package/package.json +1 -1
  161. package/dist/core/dynamic-recall.d.ts +0 -32
  162. package/dist/core/dynamic-recall.js +0 -76
@@ -11,11 +11,6 @@ import { primaryActivityArg } from "../arg-summary.js";
11
11
  import { materializeMcpTools } from "../mcp.js";
12
12
  import { Type } from "typebox";
13
13
  import { brainToRuntime } from "../runtime.js";
14
- import { MemoryEngine } from "../memory-engine/engine.js";
15
- import { deriveControlPlaneDir, deriveProjectControlDir, deriveProjectMemoryDir, deriveRepoMemoryDir, drainMemoryAnnouncements, enqueueMemoryAnnouncement, lookupProjectIdHint, recordProjectIdHint, resolveMemoryEngineRoot } from "../memory-engine/layout.js";
16
- import { assertScopeContractPlacement, parseScopeKey, resolveProjectId } from "../memory-engine/scope-contract.js";
17
- import { classifyScopePlanes, derivePersonalControlDir, derivePersonalMemoryDir, mergeHarvestReports, mergeInjections, needsDualRoots, parsedProjectPlane } from "../memory-engine/dual-root.js";
18
- import { FileMemoryEngineBackend } from "../memory-engine/file-backend.js";
19
14
  import { StoredSession, isSessionConflict, hasSessionFork } from "../session.js";
20
15
  import { createAgentTranscriptTool, createSendMessageTool, createSubagentWorktreeHelper, forkGovernanceDenial, AGENT_TRANSCRIPT_TOOL_NAME, SEND_MESSAGE_TOOL_NAME, SubagentRetainLedger } from "../../agents/subagent.js";
21
16
  import { combinePolicies, createTranscriptIntegrityPolicy, createUnverifiableDeletePolicy, resolveAsk, toolPolicyNameSets } from "../tool-policy.js";
@@ -32,12 +27,12 @@ import { reservedCollisions, reservedFor } from "../../brain/request-params.js";
32
27
  import { defineTool } from "../tools.js";
33
28
  import { canonicalToolName } from "../tool-name-aliases.js";
34
29
  import { pathToUri } from "../lsp-protocol.js";
35
- import { DEFAULT_TOOL_RESULT_THRESHOLD_CHARS, firstPartyOffloadPolicy, InMemoryToolResultStore, RunnerSharedToolResultStore, ScopedToolResultStore, isVolatileOffloadStore, OFFLOAD_TOOL_NAME, makeReadToolResultTool, withToolResultOffload, } from "../tool-result-store.js";
36
- import { OUTPUT_TOOL_NAME, REPORT_FINDINGS_TOOL_NAME, SKILL_CONTENT_MAX_CHARS, SKILL_TOOL_NAME, makeOutputTool, makeReportBlockedTool, makeReportFindingsTool, makeSkillTool, normalizeSkills } from "./synthetic-tools.js";
30
+ import { DEFAULT_TOOL_RESULT_THRESHOLD_CHARS, firstPartyOffloadPolicy, InMemoryToolResultStore, RunnerSharedToolResultStore, ScopedToolResultStore, isVolatileOffloadStore, OFFLOAD_TOOL_NAME, createReadToolResultTool, withToolResultOffload, } from "../tool-result-store.js";
31
+ import { OUTPUT_TOOL_NAME, REPORT_FINDINGS_TOOL_NAME, SKILL_CONTENT_MAX_CHARS, SKILL_TOOL_NAME, createOutputTool, createReportBlockedTool, createReportFindingsTool, createSkillTool, normalizeSkills } from "./synthetic-tools.js";
37
32
  import { compileOutputSchema } from "./strict-output-schema.js";
38
- import { TOOL_SEARCH_NAME, buildDeferredRegistry, classifyDeferred, extractDiscoveredToolNames, makePlaceholderTool, makeToolSearchTool, } from "./tool-disclosure.js";
39
- import { composeMemoryBlock, normalizeMemorySpec } from "../memory.js";
40
- import {} from "./memory-consolidation.js";
33
+ import { TOOL_SEARCH_NAME, buildDeferredRegistry, classifyDeferred, extractDiscoveredToolNames, createPlaceholderTool, createToolSearchTool, } from "./tool-disclosure.js";
34
+ import { composeMemoryBlock } from "../memory.js";
35
+ import { prepareMemory } from "./prepare-memory.js";
41
36
  import { defaultPromptProvider, buildEnvironmentContext, buildGitSnapshot, formatLocalDate, isValidTimeZone, PROJECT_CONTEXT_FRAMING } from "../../prompts/default.js";
42
37
  import { assemblePrompt } from "../../prompt-assembly/assemble.js";
43
38
  import { auditToolCollisions, projectToolManifest } from "../../prompt-assembly/tool-catalog.js";
@@ -171,7 +166,7 @@ export function rebaseWorkspacePath(p, fromRaw, toRaw) {
171
166
  const suffix = p.slice(fromPrefix.length).replace(/^\/+/, "");
172
167
  return to === "/" ? `${to}${suffix}` : `${to}/${suffix}`;
173
168
  }
174
- export async function prepareTask(spec, deps, sessions, resume, _memorySelector, internals, runnerSelf) {
169
+ export async function prepareTask(spec, deps, sessions, resume, internals, runnerSelf) {
175
170
  const toolFaceSnapshot = {
176
171
  exclude: spec.excludeTools ? Object.freeze([...spec.excludeTools]) : undefined,
177
172
  defer: spec.deferTools ? Object.freeze([...spec.deferTools]) : undefined,
@@ -413,19 +408,17 @@ export async function prepareTask(spec, deps, sessions, resume, _memorySelector,
413
408
  if (extraBodyCollisions.length > 0) {
414
409
  deps.onError?.(new Error(`model.extraBody contains reserved key(s) [${extraBodyCollisions.join(", ")}] that core owns and sets itself — they are ignored. Remove them from extraBody.`), { phase: "config", sessionId });
415
410
  }
416
- const nestedStats = { tokens: 0, turns: 0, tasks: 0, costUsd: 0, costMicroUsd: 0 };
411
+ const nestedStats = { tokens: 0, turns: 0, tasks: 0, costMicroUsd: 0 };
417
412
  if (resume) {
418
413
  nestedStats.tokens = resume.seed.nestedStats.tokens;
419
414
  nestedStats.turns = resume.seed.nestedStats.turns;
420
415
  nestedStats.tasks = resume.seed.nestedStats.tasks;
421
- nestedStats.costUsd = resume.seed.nestedStats.costUsd;
422
416
  nestedStats.costMicroUsd = resume.seed.nestedStats.costMicroUsd;
423
417
  }
424
418
  const reportUsage = (u) => {
425
419
  nestedStats.tokens += u.tokens;
426
420
  nestedStats.turns += u.turns;
427
421
  nestedStats.tasks += u.tasks;
428
- nestedStats.costUsd += u.costUsd ?? 0;
429
422
  nestedStats.costMicroUsd += u.costMicroUsd ?? 0;
430
423
  };
431
424
  const explicitGlobalThreshold = spec.toolResultThresholdChars ?? deps.toolResultThresholdChars;
@@ -801,10 +794,10 @@ export async function prepareTask(spec, deps, sessions, resume, _memorySelector,
801
794
  }), t));
802
795
  const blockedRef = {};
803
796
  if (spec.enableBlockedReport !== false) {
804
- tools.push(makeReportBlockedTool(blockedRef));
797
+ tools.push(createReportBlockedTool(blockedRef));
805
798
  }
806
799
  if (!(spec.tools ?? []).some((t) => t.name === REPORT_FINDINGS_TOOL_NAME || t.aliases?.includes(REPORT_FINDINGS_TOOL_NAME))) {
807
- tools.push(makeReportFindingsTool());
800
+ tools.push(createReportFindingsTool());
808
801
  }
809
802
  if (spec.enablePlanMode === true && spec.interactiveTools !== false) {
810
803
  const planReviewFace = (spec.checkpointStore ?? deps.checkpointStore) !== undefined;
@@ -963,7 +956,7 @@ export async function prepareTask(spec, deps, sessions, resume, _memorySelector,
963
956
  catch {
964
957
  }
965
958
  }
966
- tools.push(makeOutputTool(outputRef, spec.outputSchema, compiled.strict ? compiled.modelSchema : undefined));
959
+ tools.push(createOutputTool(outputRef, spec.outputSchema, compiled.strict ? compiled.modelSchema : undefined));
967
960
  }
968
961
  mcp = spec.mcp?.length
969
962
  ? await materializeMcpTools(spec.mcp, spec.principal, deps.onElicit, deps.mcpImageResizer)
@@ -1215,7 +1208,7 @@ export async function prepareTask(spec, deps, sessions, resume, _memorySelector,
1215
1208
  if (backgroundTaskToolsActive || workflowToolsActive) {
1216
1209
  toolEffects.set("TaskOutput", "read");
1217
1210
  toolEffects.set("TaskStop", "write");
1218
- tools.push(firstPartyOffload(createTaskOutputTool({ registry: defaultTaskRegistry, owner: hostTaskId, scope: taskScope, sessionId, workflowStore: deps.workflowRunStore, agentStore: deps.backgroundAgentStore, ...(callCapRef ? { deadlineMs: () => toolCutDeadlineMs(callCapRef, Date.now()) } : {}) })), firstPartyOffload(createTaskStopTool({ registry: defaultTaskRegistry, owner: hostTaskId, scope: taskScope, sessionId, workflowStore: deps.workflowRunStore, agentStore: deps.backgroundAgentStore })));
1211
+ tools.push(firstPartyOffload(createTaskOutputTool({ registry: defaultTaskRegistry, owner: hostTaskId, scope: taskScope, sessionId, workflowStore: deps.workflowRunStore, agentStore: deps.backgroundAgentStore, notificationWired: internals?.onTaskNotification !== undefined, ...(callCapRef ? { deadlineMs: () => toolCutDeadlineMs(callCapRef, Date.now()) } : {}) })), firstPartyOffload(createTaskStopTool({ registry: defaultTaskRegistry, owner: hostTaskId, scope: taskScope, sessionId, workflowStore: deps.workflowRunStore, agentStore: deps.backgroundAgentStore })));
1219
1212
  if (runnerSelf && !(spec.tools ?? []).some((t) => t.name === SEND_MESSAGE_TOOL_NAME)) {
1220
1213
  const delegationForRevive = (spec.tools ?? []).find((t) => t.agentListing !== undefined);
1221
1214
  const reviveSpawn = delegationForRevive !== undefined && deps.backgroundAgentStore !== undefined && deps.mailboxStore !== undefined
@@ -1304,7 +1297,7 @@ export async function prepareTask(spec, deps, sessions, resume, _memorySelector,
1304
1297
  tools.push(...createWorktreeTools(executionEnv, { repoRoot: taskRootPath, cwdRef: handsCwdRef, session: worktreeSessionRef }).map((t) => firstPartyOffload(t)));
1305
1298
  }
1306
1299
  if (offloadStore)
1307
- tools.push(makeReadToolResultTool(offloadStore));
1300
+ tools.push(createReadToolResultTool(offloadStore));
1308
1301
  const onQuestion = spec.onQuestion ?? deps.onQuestion;
1309
1302
  const durableQuestionFace = (spec.checkpointStore ?? deps.checkpointStore) !== undefined &&
1310
1303
  (spec.durableApproval !== undefined || runtimeCaps?.forceDurableGate === true);
@@ -1369,189 +1362,8 @@ export async function prepareTask(spec, deps, sessions, resume, _memorySelector,
1369
1362
  .catch(() => undefined);
1370
1363
  }
1371
1364
  : undefined;
1372
- const memorySpec = normalizeMemorySpec(spec.memory);
1373
- const useMemoryEngine = Boolean(memorySpec && memorySpec.enabled && deps.memoryBackend);
1374
- let memoryEngineSession;
1375
- if (useMemoryEngine && memorySpec) {
1376
- try {
1377
- const backend = deps.memoryBackend;
1378
- const pinned = backend.directoryRoot;
1379
- const engineRoot = resolveMemoryEngineRoot(deps.memoryEngineDir);
1380
- const repoRoot = deps.rootPath ?? taskRootPath;
1381
- let identityKey;
1382
- if (memorySpec.scopeContract === "v2" && repoRoot) {
1383
- const consumesProjectIdentity = [...memorySpec.scopes, ...(memorySpec.writeScope !== null ? [memorySpec.writeScope] : [])]
1384
- .map(parseScopeKey)
1385
- .some((k) => k.kind === "proj" || k.kind === "userproj");
1386
- let marker = null;
1387
- try {
1388
- marker = resolveProjectId(repoRoot);
1389
- }
1390
- catch (err) {
1391
- if (consumesProjectIdentity)
1392
- throw err;
1393
- deps.onError?.(err instanceof Error ? err : new Error(String(err)), { phase: "config", sessionId });
1394
- }
1395
- if (marker) {
1396
- identityKey = marker.projectId;
1397
- const firstSwitch = lookupProjectIdHint(engineRoot, repoRoot) !== marker.projectId;
1398
- recordProjectIdHint(engineRoot, repoRoot, marker.projectId);
1399
- if (firstSwitch) {
1400
- try {
1401
- const oldCtl = deriveControlPlaneDir(engineRoot, repoRoot);
1402
- const newCtl = deriveProjectControlDir(engineRoot, marker.projectId);
1403
- const drained = drainMemoryAnnouncements(oldCtl);
1404
- for (const ann of drained.queue)
1405
- enqueueMemoryAnnouncement(newCtl, ann);
1406
- }
1407
- catch {
1408
- }
1409
- }
1410
- if (memorySpec.writeScope !== null) {
1411
- const w = parseScopeKey(memorySpec.writeScope);
1412
- if ((w.kind === "proj" || w.kind === "userproj") && w.projectId !== marker.projectId) {
1413
- const e = new Error(`memory scope contract v2: writeScope ${memorySpec.writeScope} targets projectId ${w.projectId}, ` +
1414
- `but this checkout's marker (.sema/project) declares ${marker.projectId} — refusing a mis-addressed write.`);
1415
- e.code = "config.memory_project_identity";
1416
- throw e;
1417
- }
1418
- }
1419
- }
1420
- else {
1421
- const hint = lookupProjectIdHint(engineRoot, repoRoot);
1422
- if (hint !== undefined) {
1423
- deps.onError?.(new Error(`memory project marker missing but recoverable: ${repoRoot} previously carried projectId ${hint} ` +
1424
- `(.sema/project deleted?). Restore the marker to keep the identity-keyed memory mount; this session ` +
1425
- `falls back to the path-derived key.`), { phase: "config", sessionId });
1426
- }
1427
- }
1428
- }
1429
- const memoryDir = typeof pinned === "string" && pinned
1430
- ? pinned
1431
- : identityKey !== undefined
1432
- ? deriveProjectMemoryDir(engineRoot, identityKey)
1433
- : deriveRepoMemoryDir(engineRoot, repoRoot);
1434
- const planes = memorySpec.scopeContract === "v2" ? classifyScopePlanes(memorySpec.scopes, memorySpec.writeScope) : undefined;
1435
- const dual = planes !== undefined && needsDualRoots(planes);
1436
- const personalOnly = planes !== undefined && !dual && planes.project.length === 0 && planes.writePlane !== "project" && (planes.personal.length > 0 || planes.writePlane === "personal");
1437
- if (memorySpec.scopeContract === "v2" && !personalOnly) {
1438
- assertScopeContractPlacement({
1439
- parsedScopes: dual
1440
- ? parsedProjectPlane(planes, memorySpec.writeScope)
1441
- : [...memorySpec.scopes, ...(memorySpec.writeScope !== null ? [memorySpec.writeScope] : [])].map(parseScopeKey),
1442
- memoryDir,
1443
- repoRoot,
1444
- });
1445
- }
1446
- const personalMemoryDir = derivePersonalMemoryDir(engineRoot);
1447
- const personalControlDir = derivePersonalControlDir(engineRoot);
1448
- const makePersonalEngine = () => new MemoryEngine({
1449
- backend: typeof pinned === "string" && pinned
1450
- ? new FileMemoryEngineBackend(personalMemoryDir, { controlDir: personalControlDir })
1451
- : backend,
1452
- memoryDir: personalMemoryDir,
1453
- controlDir: personalControlDir,
1454
- });
1455
- let writeEngine;
1456
- let writeHandle;
1457
- let injectFn;
1458
- let harvestBoth;
1459
- if (dual) {
1460
- const projectEngine = new MemoryEngine({
1461
- backend,
1462
- memoryDir,
1463
- controlDir: identityKey !== undefined ? deriveProjectControlDir(engineRoot, identityKey) : deriveControlPlaneDir(engineRoot, repoRoot),
1464
- });
1465
- const personalEngine = makePersonalEngine();
1466
- const p = planes;
1467
- const projectHandle = await projectEngine.materialize(p.project, p.writePlane === "project" ? memorySpec.writeScope : null);
1468
- const personalHandle = await personalEngine.materialize(p.personal, p.writePlane === "personal" ? memorySpec.writeScope : null);
1469
- const writeIsPersonal = p.writePlane === "personal";
1470
- writeEngine = writeIsPersonal ? personalEngine : projectEngine;
1471
- writeHandle = writeIsPersonal ? personalHandle : projectHandle;
1472
- injectFn = () => mergeInjections(projectEngine.inject(projectHandle), personalEngine.inject(personalHandle));
1473
- harvestBoth = async () => {
1474
- const writeFirst = writeIsPersonal ? [personalEngine, personalHandle] : [projectEngine, projectHandle];
1475
- const readOther = writeIsPersonal ? [projectEngine, projectHandle] : [personalEngine, personalHandle];
1476
- const writeReport = await writeFirst[0].harvest(writeFirst[1]);
1477
- let readReport;
1478
- let readFailure;
1479
- try {
1480
- readReport = await readOther[0].harvest(readOther[1]);
1481
- }
1482
- catch (err) {
1483
- readFailure = err instanceof Error ? err.message : String(err);
1484
- }
1485
- const merged = readReport !== undefined ? mergeHarvestReports(writeReport, readReport) : writeReport;
1486
- if (readFailure !== undefined)
1487
- merged.warnings.push(`read-plane harvest failed (write-plane yield committed): ${readFailure}`);
1488
- return merged;
1489
- };
1490
- }
1491
- else if (personalOnly) {
1492
- const personalEngine = makePersonalEngine();
1493
- const handle = await personalEngine.materialize(memorySpec.scopes, memorySpec.writeScope);
1494
- writeEngine = personalEngine;
1495
- writeHandle = handle;
1496
- injectFn = () => personalEngine.inject(handle);
1497
- harvestBoth = () => personalEngine.harvest(handle);
1498
- }
1499
- else {
1500
- const engine = new MemoryEngine({
1501
- backend,
1502
- memoryDir,
1503
- controlDir: identityKey !== undefined ? deriveProjectControlDir(engineRoot, identityKey) : deriveControlPlaneDir(engineRoot, repoRoot),
1504
- });
1505
- const handle = await engine.materialize(memorySpec.scopes, memorySpec.writeScope);
1506
- writeEngine = engine;
1507
- writeHandle = handle;
1508
- injectFn = () => engine.inject(handle);
1509
- harvestBoth = () => engine.harvest(handle);
1510
- }
1511
- memoryWriteGateRef.current = (w) => writeEngine.gateWrite(writeHandle, w.key, w.content);
1512
- const harvestSafe = async (phase = "terminal") => {
1513
- try {
1514
- const report = await harvestBoth();
1515
- if (!report.ok && report.incident) {
1516
- deps.onError?.(new Error(`memory harvest refused (${report.incident.kind}): ${report.incident.detail}`), { phase: "memory", sessionId });
1517
- }
1518
- try {
1519
- deps.onMemoryHarvestReport?.(report, { sessionId, phase });
1520
- }
1521
- catch {
1522
- }
1523
- return report;
1524
- }
1525
- catch (err) {
1526
- try {
1527
- deps.onError?.(err instanceof Error ? err : new Error(String(err)), { phase: "memory", sessionId });
1528
- }
1529
- catch {
1530
- }
1531
- return undefined;
1532
- }
1533
- };
1534
- memoryEngineSession = { engine: writeEngine, handle: writeHandle, inject: injectFn, harvest: harvestSafe };
1535
- }
1536
- catch (err) {
1537
- if (typeof err.code === "string" && (err.code.startsWith("config.memory_scope") || err.code.startsWith("config.memory_project"))) {
1538
- throw err;
1539
- }
1540
- deps.onError?.(err instanceof Error ? err : new Error(String(err)), { phase: "memory", sessionId });
1541
- }
1542
- }
1543
- let memoryBlock;
1544
- if (memorySpec && memorySpec.enabled && !useMemoryEngine) {
1545
- const detail = deps.memoryStore
1546
- ? "RunnerDeps.memoryStore is retired (design/138 S4): the legacy remember/recall tools and <user_memory> injection no longer run. Configure RunnerDeps.memoryBackend (memory engine) instead; this task runs memory-less."
1547
- : "TaskSpec.memory is enabled but RunnerDeps.memoryBackend is not configured; memory is inactive for this task (the legacy memoryStore fallback was retired in design/138 S4).";
1548
- deps.onError?.(new Error(detail), { phase: "config", sessionId });
1549
- }
1550
- if (memoryEngineSession) {
1551
- const injection = memoryEngineSession.inject();
1552
- if (injection.block.trim())
1553
- memoryBlock = injection.block;
1554
- }
1365
+ const { memoryEngineSession, memoryBlock: memoryBlockFromEngine } = await prepareMemory({ spec, deps, sessionId, taskRootPath, memoryWriteGateRef });
1366
+ let memoryBlock = memoryBlockFromEngine;
1555
1367
  let instructionSources;
1556
1368
  if (deps.loadProjectMemory) {
1557
1369
  let projectMemoryPhase = spec.sessionId ? "resume" : "fresh";
@@ -1625,7 +1437,7 @@ export async function prepareTask(spec, deps, sessions, resume, _memorySelector,
1625
1437
  e.code = "config.reserved_tool_name";
1626
1438
  throw e;
1627
1439
  }
1628
- tools.push(makeSkillTool(skillSpecs, skillScope));
1440
+ tools.push(createSkillTool(skillSpecs, skillScope));
1629
1441
  }
1630
1442
  const skillsListing = skillSpecs.length > 0
1631
1443
  ? {
@@ -1861,10 +1673,10 @@ export async function prepareTask(spec, deps, sessions, resume, _memorySelector,
1861
1673
  });
1862
1674
  const assembled = assemblePrompt(buildAssembleInputs(centerAdoption !== undefined ? artifactDeclarations(centerAdoption.artifact) : undefined));
1863
1675
  if (centerAdoption !== undefined && assembled.centerMounted !== true) {
1864
- const ownsWholePrompt = assembled.constitution === "legacy" || assembled.constitution === "provider-assembled";
1676
+ const ownsWholePrompt = assembled.constitution === "provider-assembled";
1865
1677
  const digest = centerAdoption.artifact.artifactDigest.slice(0, 23);
1866
1678
  if (ownsWholePrompt) {
1867
- const e = new Error(`center prompt artifact ${digest}… cannot mount: this PromptProvider owns the whole prompt (legacy system()/assembled-identity pass-through) — upgrade the provider to stableBlocks/stableSystem or remove RunnerDeps.promptSource for this deployment`);
1679
+ const e = new Error(`center prompt artifact ${digest}… cannot mount: this PromptProvider owns the whole prompt (assembled-identity pass-through) — upgrade the provider to stableBlocks/stableSystem or remove RunnerDeps.promptSource for this deployment`);
1868
1680
  e.code = "prompt.center_unmountable";
1869
1681
  throw e;
1870
1682
  }
@@ -1957,7 +1769,7 @@ export async function prepareTask(spec, deps, sessions, resume, _memorySelector,
1957
1769
  throw e;
1958
1770
  }
1959
1771
  const registry = buildDeferredRegistry(deferred, tools);
1960
- const placeholders = new Map([...registry.values()].map((i) => [i.name, makePlaceholderTool(i)]));
1772
+ const placeholders = new Map([...registry.values()].map((i) => [i.name, createPlaceholderTool(i)]));
1961
1773
  const { messages } = await session.buildContext();
1962
1774
  for (const n of extractDiscoveredToolNames(messages, registry)) {
1963
1775
  if (deferred.has(n))
@@ -1991,7 +1803,7 @@ export async function prepareTask(spec, deps, sessions, resume, _memorySelector,
1991
1803
  }
1992
1804
  };
1993
1805
  rebuildHarnessToolsRef.current = () => rematerialize(activeTools);
1994
- toolSearch = makeToolSearchTool({
1806
+ toolSearch = createToolSearchTool({
1995
1807
  registry,
1996
1808
  active: activeTools,
1997
1809
  rematerialize,
@@ -1,5 +1,5 @@
1
1
  import type { Model } from "../../internal/llm.js";
2
- import type { AgentMessage, ThinkingLevel } from "../../internal/harness.js";
2
+ import type { AgentMessage, ThinkingLevel } from "../../internal/harness-types.js";
3
3
  import type { Brain } from "../types.js";
4
4
  import type { ModelPricing } from "../pricing.js";
5
5
  export interface SuggestionLLM {
@@ -5,7 +5,8 @@ import { type TaskOutcome } from "../task-outcome.js";
5
5
  import { type SideQuerySpec, type SideQueryResult } from "../side-query.js";
6
6
  import type { SessionStore } from "../session.js";
7
7
  import type { AgentDefinition, RunnerDeps, TaskEvent, TaskResult, TaskSpec, TaskStream } from "../types.js";
8
- export declare const DEFAULT_MAX_TURNS = 1000;
8
+ import { DEFAULT_MAX_TURNS } from "../../config/defaults.js";
9
+ export { DEFAULT_MAX_TURNS };
9
10
  export type ResumeTaskConfig = Omit<TaskSpec, "objective" | "sessionId">;
10
11
  interface ResumeRun {
11
12
  cp: Checkpoint;
@@ -42,7 +43,6 @@ export declare class Runner {
42
43
  sideQuery(spec: SideQuerySpec): Promise<SideQueryResult>;
43
44
  runTaskStream(spec: TaskSpec, resume?: ResumeRun, internals?: RunInternals): TaskStream;
44
45
  private runLocked;
45
- private consolidateMemory;
46
46
  private suggestNextPrompts;
47
47
  private snapshotTurn;
48
48
  runTask(spec: TaskSpec, internals?: RunInternals): Promise<TaskResult>;
@@ -51,7 +51,6 @@ export declare class Runner {
51
51
  private applyResumeDecision;
52
52
  private resolvePendingCall;
53
53
  private seamCCompactionOptions;
54
- private maybeDynamicRecall;
55
54
  private compactionHookOptions;
56
55
  private recordCompactionReuse;
57
56
  private finish;