@sema-agent/core 1.300.0 → 1.302.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 (87) hide show
  1. package/dist/agents/subagent.d.ts.map +1 -1
  2. package/dist/agents/subagent.js +124 -50
  3. package/dist/agents/subagent.js.map +1 -1
  4. package/dist/core/auto-mode-prompt.d.ts.map +1 -1
  5. package/dist/core/auto-mode-prompt.js +25 -2
  6. package/dist/core/auto-mode-prompt.js.map +1 -1
  7. package/dist/core/checkpoint-store.d.ts +5 -0
  8. package/dist/core/checkpoint-store.d.ts.map +1 -1
  9. package/dist/core/checkpoint-store.js.map +1 -1
  10. package/dist/core/memory-engine/engine.d.ts +2 -2
  11. package/dist/core/memory-engine/engine.d.ts.map +1 -1
  12. package/dist/core/memory-engine/engine.js +17 -3
  13. package/dist/core/memory-engine/engine.js.map +1 -1
  14. package/dist/core/memory-engine/file-backend.d.ts.map +1 -1
  15. package/dist/core/memory-engine/file-backend.js +34 -1
  16. package/dist/core/memory-engine/file-backend.js.map +1 -1
  17. package/dist/core/memory-engine/frontmatter.d.ts.map +1 -1
  18. package/dist/core/memory-engine/frontmatter.js +62 -1
  19. package/dist/core/memory-engine/frontmatter.js.map +1 -1
  20. package/dist/core/memory-engine/memory-backend-contract.d.ts.map +1 -1
  21. package/dist/core/memory-engine/memory-backend-contract.js +45 -0
  22. package/dist/core/memory-engine/memory-backend-contract.js.map +1 -1
  23. package/dist/core/memory-engine/sync-client.d.ts.map +1 -1
  24. package/dist/core/memory-engine/sync-client.js +23 -0
  25. package/dist/core/memory-engine/sync-client.js.map +1 -1
  26. package/dist/core/memory-engine/types.d.ts +8 -0
  27. package/dist/core/memory-engine/types.d.ts.map +1 -1
  28. package/dist/core/runner/prepare-task.d.ts +16 -1
  29. package/dist/core/runner/prepare-task.d.ts.map +1 -1
  30. package/dist/core/runner/prepare-task.js +109 -9
  31. package/dist/core/runner/prepare-task.js.map +1 -1
  32. package/dist/core/runner/prompt-suggestions.d.ts.map +1 -1
  33. package/dist/core/runner/prompt-suggestions.js +14 -2
  34. package/dist/core/runner/prompt-suggestions.js.map +1 -1
  35. package/dist/core/runner/runtask.d.ts.map +1 -1
  36. package/dist/core/runner/runtask.js +190 -58
  37. package/dist/core/runner/runtask.js.map +1 -1
  38. package/dist/core/runner/synthetic-tools.d.ts +11 -1
  39. package/dist/core/runner/synthetic-tools.d.ts.map +1 -1
  40. package/dist/core/runner/synthetic-tools.js +47 -28
  41. package/dist/core/runner/synthetic-tools.js.map +1 -1
  42. package/dist/core/runner/turn-attachments.d.ts +32 -3
  43. package/dist/core/runner/turn-attachments.d.ts.map +1 -1
  44. package/dist/core/runner/turn-attachments.js +146 -7
  45. package/dist/core/runner/turn-attachments.js.map +1 -1
  46. package/dist/core/scheduler.d.ts +5 -0
  47. package/dist/core/scheduler.d.ts.map +1 -1
  48. package/dist/core/scheduler.js.map +1 -1
  49. package/dist/core/task-registry.d.ts +31 -2
  50. package/dist/core/task-registry.d.ts.map +1 -1
  51. package/dist/core/task-registry.js +35 -6
  52. package/dist/core/task-registry.js.map +1 -1
  53. package/dist/core/trace.d.ts.map +1 -1
  54. package/dist/core/trace.js.map +1 -1
  55. package/dist/core/types.d.ts +17 -2
  56. package/dist/core/types.d.ts.map +1 -1
  57. package/dist/core/untrusted-text.d.ts +23 -0
  58. package/dist/core/untrusted-text.d.ts.map +1 -1
  59. package/dist/core/untrusted-text.js +69 -0
  60. package/dist/core/untrusted-text.js.map +1 -1
  61. package/dist/engine/compaction/utils.d.ts.map +1 -1
  62. package/dist/engine/compaction/utils.js +20 -1
  63. package/dist/engine/compaction/utils.js.map +1 -1
  64. package/dist/engine/harness/agent-harness.d.ts +11 -4
  65. package/dist/engine/harness/agent-harness.d.ts.map +1 -1
  66. package/dist/engine/harness/agent-harness.js +23 -6
  67. package/dist/engine/harness/agent-harness.js.map +1 -1
  68. package/dist/engine/harness/messages.d.ts.map +1 -1
  69. package/dist/engine/harness/messages.js +1 -0
  70. package/dist/engine/harness/messages.js.map +1 -1
  71. package/dist/engine/harness/types.d.ts.map +1 -1
  72. package/dist/engine/harness/types.js.map +1 -1
  73. package/dist/engine/llm/types.d.ts +7 -0
  74. package/dist/engine/llm/types.d.ts.map +1 -1
  75. package/dist/engine/loop/agent-loop.js +7 -0
  76. package/dist/engine/loop/agent-loop.js.map +1 -1
  77. package/dist/engine/loop/types.d.ts +1 -0
  78. package/dist/engine/loop/types.d.ts.map +1 -1
  79. package/dist/engine/session/import-validate.d.ts.map +1 -1
  80. package/dist/engine/session/import-validate.js +31 -0
  81. package/dist/engine/session/import-validate.js.map +1 -1
  82. package/dist/prompts/default.d.ts.map +1 -1
  83. package/dist/prompts/default.js.map +1 -1
  84. package/dist/tools/scheduler-tools.d.ts.map +1 -1
  85. package/dist/tools/scheduler-tools.js +71 -16
  86. package/dist/tools/scheduler-tools.js.map +1 -1
  87. package/package.json +1 -1
@@ -32,7 +32,7 @@ import { defineTool } from "../tools.js";
32
32
  import { canonicalToolName } from "../tool-name-aliases.js";
33
33
  import { pathToUri } from "../lsp-protocol.js";
34
34
  import { DEFAULT_TOOL_RESULT_THRESHOLD_CHARS, firstPartyOffloadPolicy, InMemoryToolResultStore, RunnerSharedToolResultStore, ScopedToolResultStore, isVolatileOffloadStore, OFFLOAD_TOOL_NAME, makeReadToolResultTool, withToolResultOffload, } from "../tool-result-store.js";
35
- import { OUTPUT_TOOL_NAME, REPORT_FINDINGS_TOOL_NAME, SKILL_CONTENT_MAX_CHARS, SKILL_TOOL_NAME, buildSkillsBlock, makeOutputTool, makeReportBlockedTool, makeReportFindingsTool, makeSkillTool, normalizeSkills } from "./synthetic-tools.js";
35
+ import { OUTPUT_TOOL_NAME, REPORT_FINDINGS_TOOL_NAME, SKILL_CONTENT_MAX_CHARS, SKILL_TOOL_NAME, makeOutputTool, makeReportBlockedTool, makeReportFindingsTool, makeSkillTool, normalizeSkills } from "./synthetic-tools.js";
36
36
  import { compileOutputSchema } from "./strict-output-schema.js";
37
37
  import { TOOL_SEARCH_NAME, buildDeferredRegistry, classifyDeferred, extractDiscoveredToolNames, makePlaceholderTool, makeToolSearchTool, } from "./tool-disclosure.js";
38
38
  import { composeMemoryBlock, normalizeMemorySpec } from "../memory.js";
@@ -382,6 +382,12 @@ export async function prepareTask(spec, deps, sessions, resume, _memorySelector,
382
382
  }
383
383
  let ownedEnv;
384
384
  let mcp;
385
+ if (internals?.requestedCwd !== undefined && deps.executionEnvFactory === undefined) {
386
+ await forgetOnThrow();
387
+ const e = new Error(`Agent cwd "${internals.requestedCwd}" cannot take effect: this deployment has no executionEnvFactory (a static execution environment cannot be re-rooted per agent). Drop the cwd parameter or deploy a factory.`);
388
+ e.code = "config.cwd_unsupported";
389
+ throw e;
390
+ }
385
391
  try {
386
392
  ownedEnv = deps.executionEnvFactory
387
393
  ? await deps.executionEnvFactory({
@@ -397,8 +403,39 @@ export async function prepareTask(spec, deps, sessions, resume, _memorySelector,
397
403
  throw factoryErr;
398
404
  }
399
405
  const executionEnv = ownedEnv ?? deps.executionEnv ?? new StubExecutionEnv();
406
+ if (internals?.requestedCwd !== undefined) {
407
+ const canon = async (p) => {
408
+ const r = await executionEnv.canonicalPath(p);
409
+ return r.ok ? r.value : p;
410
+ };
411
+ const want = await canon(internals.requestedCwd);
412
+ const rejectCwd = async (message, code) => {
413
+ await forgetOnThrow();
414
+ try {
415
+ if (ownedEnv && hasDestroy(ownedEnv))
416
+ await ownedEnv.destroy();
417
+ }
418
+ catch {
419
+ }
420
+ const e = new Error(message);
421
+ e.code = code;
422
+ throw e;
423
+ };
424
+ if (deps.rootPath !== undefined) {
425
+ const root = await canon(deps.rootPath);
426
+ const sep = root.includes("\\") && !root.includes("/") ? "\\" : "/";
427
+ const rootPrefix = root.endsWith(sep) ? root : root + sep;
428
+ if (want !== root && !want.startsWith(rootPrefix)) {
429
+ await rejectCwd(`Agent cwd "${internals.requestedCwd}" is outside this deployment's declared root "${deps.rootPath}" — the cwd must be located within the deployment root.`, "config.cwd_outside_root");
430
+ }
431
+ }
432
+ const got = await canon(executionEnv.cwd);
433
+ if (want !== got) {
434
+ await rejectCwd(`Agent cwd "${internals.requestedCwd}" was not honored by the execution environment (it rooted at "${executionEnv.cwd}") — failing loud instead of running the agent in the wrong tree.`, "config.cwd_not_honored");
435
+ }
436
+ }
400
437
  const handsEnabled = ownedEnv !== undefined || deps.executionEnv !== undefined;
401
- const taskRootPath = internals?.isolation === "worktree" || !deps.rootPath ? executionEnv.cwd : deps.rootPath;
438
+ const taskRootPath = internals?.isolation === "worktree" || internals?.requestedCwd !== undefined || !deps.rootPath ? executionEnv.cwd : deps.rootPath;
402
439
  const abortController = new AbortController();
403
440
  if (spec.signal?.aborted)
404
441
  abortController.abort();
@@ -1222,7 +1259,29 @@ export async function prepareTask(spec, deps, sessions, resume, _memorySelector,
1222
1259
  if (injection.block.trim())
1223
1260
  memoryBlock = injection.block;
1224
1261
  }
1262
+ let instructionSources;
1225
1263
  if (deps.loadProjectMemory) {
1264
+ let projectMemoryPhase = spec.sessionId ? "resume" : "fresh";
1265
+ if (spec.sessionId) {
1266
+ try {
1267
+ const branch = await session.getBranch();
1268
+ if (branch.length === 0)
1269
+ projectMemoryPhase = "fresh";
1270
+ else {
1271
+ for (let i = branch.length - 1; i >= 0; i--) {
1272
+ const e = branch[i];
1273
+ if (e.type === "compaction") {
1274
+ projectMemoryPhase = "post-compact";
1275
+ break;
1276
+ }
1277
+ if (e.type === "message" && e.message.role === "user")
1278
+ break;
1279
+ }
1280
+ }
1281
+ }
1282
+ catch {
1283
+ }
1284
+ }
1226
1285
  let loaded = null;
1227
1286
  try {
1228
1287
  loaded = await Promise.resolve(deps.loadProjectMemory({
@@ -1230,6 +1289,8 @@ export async function prepareTask(spec, deps, sessions, resume, _memorySelector,
1230
1289
  handsEnabled,
1231
1290
  isSubagent: internals?.parentTaskId !== undefined,
1232
1291
  ...(internals?.agentName ? { agentName: internals.agentName } : {}),
1292
+ sessionId,
1293
+ phase: projectMemoryPhase,
1233
1294
  }));
1234
1295
  }
1235
1296
  catch (err) {
@@ -1237,6 +1298,9 @@ export async function prepareTask(spec, deps, sessions, resume, _memorySelector,
1237
1298
  }
1238
1299
  const projectMem = loaded !== null && typeof loaded === "object" ? loaded.content : loaded;
1239
1300
  const seededFiles = loaded !== null && typeof loaded === "object" ? loaded.seededFiles : undefined;
1301
+ const declaredSources = loaded !== null && typeof loaded === "object" ? loaded.instructionSources : undefined;
1302
+ if (declaredSources !== undefined && declaredSources.length > 0)
1303
+ instructionSources = declaredSources;
1240
1304
  if (seededFiles?.length && seedContextFiles) {
1241
1305
  try {
1242
1306
  await seedContextFiles(seededFiles);
@@ -1269,7 +1333,19 @@ export async function prepareTask(spec, deps, sessions, resume, _memorySelector,
1269
1333
  }
1270
1334
  tools.push(makeSkillTool(skillSpecs, skillScope));
1271
1335
  }
1272
- const skillsBlock = buildSkillsBlock(skillSpecs);
1336
+ const skillsListing = skillSpecs.length > 0
1337
+ ? {
1338
+ entries: skillSpecs.map((s) => ({
1339
+ name: s.name,
1340
+ description: s.description,
1341
+ ...(s.files !== undefined ? { files: s.files.map((f) => ({ path: f.path })) } : {}),
1342
+ })),
1343
+ seedAnnounced: resume !== undefined,
1344
+ }
1345
+ :
1346
+ (resume?.seed.announcedListings?.skills?.length ?? 0) > 0
1347
+ ? { entries: [], seedAnnounced: true }
1348
+ : undefined;
1273
1349
  const provider = spec.promptProvider ?? deps.promptProvider ?? defaultPromptProvider;
1274
1350
  const promptPolicyEnabled = Boolean(spec.toolPolicy ?? deps.toolPolicy);
1275
1351
  const promptHooks = spec.hooks ?? deps.hooks;
@@ -1388,9 +1464,7 @@ export async function prepareTask(spec, deps, sessions, resume, _memorySelector,
1388
1464
  let promptConstitution = "core";
1389
1465
  let promptBlocks = [];
1390
1466
  const finishStable = (stableCore) => {
1391
- const stable = composeSystemPrompt(composeSystemPrompt(stableCore, skillsBlock), mcpInstructionsBlock);
1392
- if (skillsBlock?.trim())
1393
- promptBlocks.push({ id: "skills.block", text: skillsBlock });
1467
+ const stable = composeSystemPrompt(stableCore, mcpInstructionsBlock);
1394
1468
  if (mcpInstructionsBlock?.trim())
1395
1469
  promptBlocks.push({ id: "mcp.instructions", text: mcpInstructionsBlock });
1396
1470
  renderWithDate = (date) => composeSystemPrompt(composeSystemPrompt(stable, buildEnvironmentContext({ ...envFacts, date }) || undefined), memoryBlock);
@@ -1534,8 +1608,27 @@ export async function prepareTask(spec, deps, sessions, resume, _memorySelector,
1534
1608
  }
1535
1609
  const agentListingSpec = (spec.tools ?? []).find((t) => t.agentListing !== undefined && t.agentListing.length > 0);
1536
1610
  const agentListing = agentListingSpec
1537
- ? { entries: agentListingSpec.agentListing, toolName: agentListingSpec.name, seedAnnounced: resume !== undefined }
1538
- : undefined;
1611
+ ? {
1612
+ entries: agentListingSpec.agentListing,
1613
+ toolName: agentListingSpec.name,
1614
+ seedAnnounced: resume !== undefined,
1615
+ ...(agentListingSpec.agentModels !== undefined ? { models: agentListingSpec.agentModels } : {}),
1616
+ }
1617
+ :
1618
+ (resume?.seed.announcedListings?.agents?.length ?? 0) > 0
1619
+ ? {
1620
+ entries: [],
1621
+ toolName: (spec.tools ?? []).find((t) => t.agentListing !== undefined)?.name ?? "Agent",
1622
+ seedAnnounced: true,
1623
+ }
1624
+ : undefined;
1625
+ if (spec.attachments?.agentListing === false && agentListing !== undefined && agentListing.entries.length > 0) {
1626
+ deps.onError?.(new Error(`attachments.agentListing is explicitly false but the "${agentListing.toolName}" delegation tool mounts a ${agentListing.entries.length}-type roster — the model will never see the agent-type listing its tool description points to.`), { phase: "config", sessionId });
1627
+ }
1628
+ if (spec.attachments?.skillsListing === false && skillsListing !== undefined && skillsListing.entries.length > 0) {
1629
+ deps.onError?.(new Error(`attachments.skillsListing is explicitly false but ${skillsListing.entries.length} skill(s) are mounted — the model will never see the skills listing the ${SKILL_TOOL_NAME} tool description points to.`), { phase: "config", sessionId });
1630
+ }
1631
+ const announcedListingsRef = {};
1539
1632
  const dateChange = renderWithDate
1540
1633
  ? { legDate: envFacts.date, today: () => formatLocalDate(new Date(), tzValid ? userTz : undefined) }
1541
1634
  : undefined;
@@ -2001,6 +2094,13 @@ export async function prepareTask(spec, deps, sessions, resume, _memorySelector,
2001
2094
  }
2002
2095
  : undefined;
2003
2096
  })(),
2097
+ announcedListings: announcedListingsRef.agents !== undefined || announcedListingsRef.skills !== undefined || announcedListingsRef.models !== undefined
2098
+ ? {
2099
+ ...(announcedListingsRef.agents !== undefined ? { agents: [...announcedListingsRef.agents] } : {}),
2100
+ ...(announcedListingsRef.skills !== undefined ? { skills: [...announcedListingsRef.skills] } : {}),
2101
+ ...(announcedListingsRef.models !== undefined ? { models: [...announcedListingsRef.models] } : {}),
2102
+ }
2103
+ : undefined,
2004
2104
  });
2005
2105
  const commitSuspendSaga = async (token, cp, remoteEnv, remoteHandle) => {
2006
2106
  if (!checkpointStore)
@@ -2546,7 +2646,7 @@ export async function prepareTask(spec, deps, sessions, resume, _memorySelector,
2546
2646
  .list({ owner: hostTaskId, scope: taskScope, sessionId })
2547
2647
  .filter((t) => t.status === "pending" || t.status === "running")
2548
2648
  .map((t) => ({ id: t.task_id, ...(t.description !== undefined ? { description: t.description } : {}), status: t.status }));
2549
- return { harness, session, sessionId, taskRootPath, model, thinking, compModel, mcp, blockedRef, outputRef, abortController, conflictRef, blockedToolCalls, nestedStats, cwdRef: handsCwdRef, denyNarrowingPolicy, releaseSignal, cacheBreakDetector, cacheFingerprint, promptManifest, activeTools, ownedEnv, suspendRef, reviewRef, reviewRequestRef, suspendLoopRef, suspendForResource, ...(callCapRef ? { callCapRef } : {}), ...(cutKills ? { cutKills } : {}), ...(callCapRef ? { callIssuedAtRef } : {}), suspendForReview, resourceLedger: priorLedger, liveSpendRef, humanReviewRef, now, tools, toolEffects, promptOverheadTokens, readTaskFile, recentlyReadFiles, compactionReuseRef, trimPressureRef, ...(memoryEngineSession ? { memoryEngineSession } : {}), ...(subagentRetain ? { subagentRetain } : {}), ...(lspDiagnostics && nudgeLspOnEdit ? { lspDiagnostics: { registry: lspDiagnostics, nudge: nudgeLspOnEdit } } : {}), planModeRef, ...(dateChange ? { dateChange } : {}), ...(detectExternalChanges ? { detectExternalChanges } : {}), ...(toolsDeltaRef ? { toolsDeltaRef } : {}), ...(agentListing ? { agentListing } : {}), listBackgroundTasks };
2649
+ return { harness, session, sessionId, taskRootPath, model, thinking, compModel, mcp, blockedRef, outputRef, abortController, conflictRef, blockedToolCalls, nestedStats, cwdRef: handsCwdRef, denyNarrowingPolicy, releaseSignal, cacheBreakDetector, cacheFingerprint, promptManifest, activeTools, ownedEnv, suspendRef, reviewRef, reviewRequestRef, suspendLoopRef, suspendForResource, ...(callCapRef ? { callCapRef } : {}), ...(cutKills ? { cutKills } : {}), ...(callCapRef ? { callIssuedAtRef } : {}), suspendForReview, resourceLedger: priorLedger, liveSpendRef, humanReviewRef, now, tools, toolEffects, promptOverheadTokens, readTaskFile, recentlyReadFiles, compactionReuseRef, trimPressureRef, ...(memoryEngineSession ? { memoryEngineSession } : {}), ...(subagentRetain ? { subagentRetain } : {}), ...(lspDiagnostics && nudgeLspOnEdit ? { lspDiagnostics: { registry: lspDiagnostics, nudge: nudgeLspOnEdit } } : {}), planModeRef, ...(dateChange ? { dateChange } : {}), ...(instructionSources ? { instructionSources } : {}), ...(detectExternalChanges ? { detectExternalChanges } : {}), ...(toolsDeltaRef ? { toolsDeltaRef } : {}), ...(agentListing ? { agentListing } : {}), ...(skillsListing ? { skillsListing } : {}), announcedListingsRef, listBackgroundTasks };
2550
2650
  }
2551
2651
  catch (prepareErr) {
2552
2652
  if (mcp) {