@sema-agent/core 1.302.1 → 1.304.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 (117) hide show
  1. package/dist/agents/observer.d.ts.map +1 -1
  2. package/dist/agents/observer.js +1 -0
  3. package/dist/agents/observer.js.map +1 -1
  4. package/dist/agents/subagent.d.ts.map +1 -1
  5. package/dist/agents/subagent.js +3 -0
  6. package/dist/agents/subagent.js.map +1 -1
  7. package/dist/core/ask-question.d.ts.map +1 -1
  8. package/dist/core/ask-question.js +1 -0
  9. package/dist/core/ask-question.js.map +1 -1
  10. package/dist/core/auto-compaction.d.ts.map +1 -1
  11. package/dist/core/auto-compaction.js +4 -1
  12. package/dist/core/auto-compaction.js.map +1 -1
  13. package/dist/core/lsp.d.ts.map +1 -1
  14. package/dist/core/lsp.js +1 -0
  15. package/dist/core/lsp.js.map +1 -1
  16. package/dist/core/memory.d.ts.map +1 -1
  17. package/dist/core/memory.js +2 -0
  18. package/dist/core/memory.js.map +1 -1
  19. package/dist/core/present-plan-tool.d.ts.map +1 -1
  20. package/dist/core/present-plan-tool.js +2 -0
  21. package/dist/core/present-plan-tool.js.map +1 -1
  22. package/dist/core/runner/prepare-task.d.ts +18 -0
  23. package/dist/core/runner/prepare-task.d.ts.map +1 -1
  24. package/dist/core/runner/prepare-task.js +56 -70
  25. package/dist/core/runner/prepare-task.js.map +1 -1
  26. package/dist/core/runner/runtask.d.ts.map +1 -1
  27. package/dist/core/runner/runtask.js +2 -0
  28. package/dist/core/runner/runtask.js.map +1 -1
  29. package/dist/core/runner/synthetic-tools.d.ts.map +1 -1
  30. package/dist/core/runner/synthetic-tools.js +4 -0
  31. package/dist/core/runner/synthetic-tools.js.map +1 -1
  32. package/dist/core/runner/tool-disclosure.d.ts.map +1 -1
  33. package/dist/core/runner/tool-disclosure.js +1 -0
  34. package/dist/core/runner/tool-disclosure.js.map +1 -1
  35. package/dist/core/task-registry.d.ts.map +1 -1
  36. package/dist/core/task-registry.js +2 -0
  37. package/dist/core/task-registry.js.map +1 -1
  38. package/dist/core/tool-result-store.d.ts.map +1 -1
  39. package/dist/core/tool-result-store.js +1 -0
  40. package/dist/core/tool-result-store.js.map +1 -1
  41. package/dist/core/tools.d.ts.map +1 -1
  42. package/dist/core/tools.js +11 -1
  43. package/dist/core/tools.js.map +1 -1
  44. package/dist/core/trace.d.ts +18 -0
  45. package/dist/core/trace.d.ts.map +1 -1
  46. package/dist/core/trace.js.map +1 -1
  47. package/dist/core/types.d.ts +4 -0
  48. package/dist/core/types.d.ts.map +1 -1
  49. package/dist/engine/harness/types.d.ts +9 -1
  50. package/dist/engine/harness/types.d.ts.map +1 -1
  51. package/dist/engine/harness/types.js.map +1 -1
  52. package/dist/engine/session/import-validate.d.ts.map +1 -1
  53. package/dist/engine/session/import-validate.js +19 -0
  54. package/dist/engine/session/import-validate.js.map +1 -1
  55. package/dist/engine/session/session.d.ts +14 -0
  56. package/dist/engine/session/session.d.ts.map +1 -1
  57. package/dist/engine/session/session.js +27 -0
  58. package/dist/engine/session/session.js.map +1 -1
  59. package/dist/index.d.ts +6 -1
  60. package/dist/index.d.ts.map +1 -1
  61. package/dist/index.js +4 -0
  62. package/dist/index.js.map +1 -1
  63. package/dist/orchestration/run-workflow-tool.d.ts.map +1 -1
  64. package/dist/orchestration/run-workflow-tool.js +1 -0
  65. package/dist/orchestration/run-workflow-tool.js.map +1 -1
  66. package/dist/prompt-assembly/assemble.d.ts +29 -0
  67. package/dist/prompt-assembly/assemble.d.ts.map +1 -0
  68. package/dist/prompt-assembly/assemble.js +115 -0
  69. package/dist/prompt-assembly/assemble.js.map +1 -0
  70. package/dist/prompt-assembly/composer.d.ts +4 -0
  71. package/dist/prompt-assembly/composer.d.ts.map +1 -0
  72. package/dist/prompt-assembly/composer.js +64 -0
  73. package/dist/prompt-assembly/composer.js.map +1 -0
  74. package/dist/prompt-assembly/epoch.d.ts +18 -0
  75. package/dist/prompt-assembly/epoch.d.ts.map +1 -0
  76. package/dist/prompt-assembly/epoch.js +0 -0
  77. package/dist/prompt-assembly/epoch.js.map +1 -0
  78. package/dist/prompt-assembly/packs/sema-default.d.ts +3 -0
  79. package/dist/prompt-assembly/packs/sema-default.d.ts.map +1 -0
  80. package/dist/prompt-assembly/packs/sema-default.js +132 -0
  81. package/dist/prompt-assembly/packs/sema-default.js.map +1 -0
  82. package/dist/prompt-assembly/tool-catalog.d.ts +34 -0
  83. package/dist/prompt-assembly/tool-catalog.d.ts.map +1 -0
  84. package/dist/prompt-assembly/tool-catalog.js +0 -0
  85. package/dist/prompt-assembly/tool-catalog.js.map +1 -0
  86. package/dist/prompt-assembly/types.d.ts +70 -0
  87. package/dist/prompt-assembly/types.d.ts.map +1 -0
  88. package/dist/prompt-assembly/types.js +2 -0
  89. package/dist/prompt-assembly/types.js.map +1 -0
  90. package/dist/prompts/default.d.ts +6 -0
  91. package/dist/prompts/default.d.ts.map +1 -1
  92. package/dist/prompts/default.js.map +1 -1
  93. package/dist/tools/fs/index.d.ts.map +1 -1
  94. package/dist/tools/fs/index.js +10 -0
  95. package/dist/tools/fs/index.js.map +1 -1
  96. package/dist/tools/fs/repo-map.d.ts.map +1 -1
  97. package/dist/tools/fs/repo-map.js +1 -0
  98. package/dist/tools/fs/repo-map.js.map +1 -1
  99. package/dist/tools/monitor.d.ts.map +1 -1
  100. package/dist/tools/monitor.js +1 -0
  101. package/dist/tools/monitor.js.map +1 -1
  102. package/dist/tools/scheduler-tools.d.ts.map +1 -1
  103. package/dist/tools/scheduler-tools.js +4 -0
  104. package/dist/tools/scheduler-tools.js.map +1 -1
  105. package/dist/tools/task-list.d.ts.map +1 -1
  106. package/dist/tools/task-list.js +4 -0
  107. package/dist/tools/task-list.js.map +1 -1
  108. package/dist/tools/todo.d.ts.map +1 -1
  109. package/dist/tools/todo.js +1 -0
  110. package/dist/tools/todo.js.map +1 -1
  111. package/dist/tools/web.d.ts.map +1 -1
  112. package/dist/tools/web.js +2 -0
  113. package/dist/tools/web.js.map +1 -1
  114. package/dist/tools/worktree.d.ts.map +1 -1
  115. package/dist/tools/worktree.js +2 -0
  116. package/dist/tools/worktree.js.map +1 -1
  117. package/package.json +1 -1
@@ -37,7 +37,11 @@ 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";
39
39
  import {} from "./memory-consolidation.js";
40
- import { composeSystemPrompt, composeConstitution, defaultPromptProvider, buildEnvironmentContext, buildGitSnapshot, formatLocalDate, isValidTimeZone, CYBER_RISK, URL_SAFETY, DEFAULT_SYSTEM_PROMPT, PROJECT_CONTEXT_FRAMING } from "../../prompts/default.js";
40
+ import { defaultPromptProvider, buildEnvironmentContext, buildGitSnapshot, formatLocalDate, isValidTimeZone, PROJECT_CONTEXT_FRAMING } from "../../prompts/default.js";
41
+ import { assemblePrompt } from "../../prompt-assembly/assemble.js";
42
+ import { projectToolManifest } from "../../prompt-assembly/tool-catalog.js";
43
+ import { resolveEpochAgainstBundled } from "../../prompt-assembly/epoch.js";
44
+ import { SEMA_DEFAULT_PACK } from "../../prompt-assembly/packs/sema-default.js";
41
45
  import { clearStaleToolResults, dropEmptyFailureAssistants, editBudget } from "../context-edit.js";
42
46
  import { capAggregateToolResults } from "../tool-result-budget.js";
43
47
  import { capAggregateMediaBytes, AGGREGATE_MEDIA_BUDGET_BYTES } from "../media-byte-cap.js";
@@ -285,7 +289,19 @@ export async function prepareTask(spec, deps, sessions, resume, _memorySelector,
285
289
  e.code = "resume_at.before_target_not_user";
286
290
  throw e;
287
291
  }
288
- if (entry.parentId === null) {
292
+ let ancestorId = entry.parentId;
293
+ let sawConversationAbove = false;
294
+ while (ancestorId !== null) {
295
+ const ancestor = await session.getEntry(ancestorId);
296
+ if (!ancestor)
297
+ break;
298
+ if (ancestor.type === "message" || ancestor.type === "custom_message") {
299
+ sawConversationAbove = true;
300
+ break;
301
+ }
302
+ ancestorId = ancestor.parentId;
303
+ }
304
+ if (!sawConversationAbove) {
289
305
  const e = new Error(`resumeAt entry "${spec.resumeAt}" is the session's first message; resumeAtMode "before" cannot rewind past the session root — start a NEW session instead`);
290
306
  e.code = "resume_at.before_root_unsupported";
291
307
  throw e;
@@ -310,6 +326,14 @@ export async function prepareTask(spec, deps, sessions, resume, _memorySelector,
310
326
  }
311
327
  const sessionId = acquired.sessionId;
312
328
  const hostTaskId = spec.taskId ?? sessionId;
329
+ {
330
+ const pinned = await session.getPromptEpoch();
331
+ const resolved = resolveEpochAgainstBundled(pinned, SEMA_DEFAULT_PACK);
332
+ if (resolved.migrated) {
333
+ const activatedBy = pinned === undefined && !spec.sessionId ? "session_start" : "legacy_migration";
334
+ await session.appendPromptEpoch({ ...resolved.descriptor, activatedBy });
335
+ }
336
+ }
313
337
  if (compModel !== undefined) {
314
338
  const compWindow = compModel.contextTokens ?? compModel.contextWindow;
315
339
  const mainWindow = model.autoCompactTokens ?? model.contextTokens ?? model.contextWindow;
@@ -1265,7 +1289,8 @@ export async function prepareTask(spec, deps, sessions, resume, _memorySelector,
1265
1289
  if (spec.sessionId) {
1266
1290
  try {
1267
1291
  const branch = await session.getBranch();
1268
- if (branch.length === 0)
1292
+ const hasConversation = branch.some((e) => e.type === "message" || e.type === "custom_message" || e.type === "compaction");
1293
+ if (!hasConversation)
1269
1294
  projectMemoryPhase = "fresh";
1270
1295
  else {
1271
1296
  for (let i = branch.length - 1; i >= 0; i--) {
@@ -1458,76 +1483,37 @@ export async function prepareTask(spec, deps, sessions, resume, _memorySelector,
1458
1483
  }
1459
1484
  }
1460
1485
  }
1461
- let systemPrompt;
1462
- let renderWithDate;
1463
- const promptCtx = { userSystemPrompt, userAppendSystemPrompt, tools, memoryEnabled: false, consolidationEnabled: false, ...featureFlags };
1464
- let promptConstitution = "core";
1465
- let promptBlocks = [];
1466
- const finishStable = (stableCore) => {
1467
- const stable = composeSystemPrompt(stableCore, mcpInstructionsBlock);
1468
- if (mcpInstructionsBlock?.trim())
1469
- promptBlocks.push({ id: "mcp.instructions", text: mcpInstructionsBlock });
1470
- renderWithDate = (date) => composeSystemPrompt(composeSystemPrompt(stable, buildEnvironmentContext({ ...envFacts, date }) || undefined), memoryBlock);
1471
- systemPrompt = renderWithDate(envFacts.date);
1472
- const envBlock = buildEnvironmentContext({ ...envFacts, date: envFacts.date });
1473
- if (envBlock?.trim())
1474
- promptBlocks.push({ id: "env.context", text: envBlock });
1475
- if (memoryBlock?.trim())
1476
- promptBlocks.push({ id: "memory.tail", text: memoryBlock });
1477
- };
1478
- if (provider === defaultPromptProvider) {
1479
- const c = composeConstitution(userSystemPrompt ?? DEFAULT_SYSTEM_PROMPT, promptCtx);
1480
- promptBlocks = [...c.blocks];
1481
- finishStable(c.text);
1482
- }
1483
- else if (provider.stableSystem) {
1484
- const roleOut = provider.stableSystem(promptCtx);
1485
- if (provider.replaceAll) {
1486
- promptConstitution = "replaced";
1487
- promptBlocks = [{ id: "provider.replace_all", text: roleOut }];
1488
- finishStable(roleOut);
1489
- }
1490
- else if (roleOut.includes(CYBER_RISK) && roleOut.includes(URL_SAFETY) && roleOut.includes("# Harness")) {
1491
- promptConstitution = "provider-assembled";
1492
- promptBlocks = [{ id: "provider.assembled", text: roleOut }];
1493
- deps.onError?.(new Error("prompt-constitution: this PromptProvider returns an already-assembled prompt (constitution anchor found). Core now appends the constitution structurally — return ONLY the role base from stableSystem (or set replaceAll:true to own the whole base). Passed through un-doubled."), { phase: "prompt-constitution", sessionId });
1494
- finishStable(roleOut);
1495
- }
1496
- else {
1497
- const c = composeConstitution(roleOut, promptCtx);
1498
- promptBlocks = [...c.blocks];
1499
- finishStable(c.text);
1500
- }
1501
- }
1502
- else if (provider.system) {
1503
- systemPrompt = provider.system({ ...promptCtx, memoryBlock });
1504
- promptConstitution = "legacy";
1505
- promptBlocks = [{ id: "provider.legacy", text: systemPrompt }];
1506
- const memTrim = memoryBlock?.trim();
1507
- if (memTrim && systemPrompt.includes(memTrim) && !systemPrompt.trimEnd().endsWith(memTrim)) {
1508
- deps.onError?.(new Error("prompt-cache: the <user_memory> block is not at the END of the system prompt — the cacheable prefix changes every turn, so vLLM/Anthropic prefix caching will miss. Put memoryBlock LAST (STABLE→VARIABLE), or implement PromptProvider.stableSystem and let core place memory."), { phase: "prompt-cache", sessionId });
1509
- }
1510
- }
1511
- else {
1512
- const c = composeConstitution(userSystemPrompt ?? DEFAULT_SYSTEM_PROMPT, promptCtx);
1513
- promptBlocks = [...c.blocks];
1514
- finishStable(c.text);
1515
- }
1516
- if (model.promptGuidance && model.promptGuidance.length > 0) {
1517
- const guidance = model.promptGuidance.join("\n\n");
1518
- const baseRender = renderWithDate;
1519
- if (baseRender) {
1520
- renderWithDate = (date) => composeSystemPrompt(baseRender(date), guidance);
1521
- systemPrompt = renderWithDate(envFacts.date);
1522
- }
1523
- else {
1524
- systemPrompt = composeSystemPrompt(systemPrompt, guidance) ?? systemPrompt;
1486
+ const assembled = assemblePrompt({
1487
+ provider,
1488
+ isDefaultProvider: provider === defaultPromptProvider,
1489
+ userSystemPrompt,
1490
+ userAppendSystemPrompt,
1491
+ tools,
1492
+ facts: { supervisorEnabled: false, ...featureFlags },
1493
+ mcpInstructionsBlock,
1494
+ memoryBlock,
1495
+ buildEnvBlock: (date) => buildEnvironmentContext({ ...envFacts, date }) || undefined,
1496
+ date: envFacts.date,
1497
+ ...(model.promptGuidance && model.promptGuidance.length > 0 ? { modelGuidance: model.promptGuidance.join("\n\n") } : {}),
1498
+ onWarn: (message, phase) => deps.onError?.(new Error(message), { phase, sessionId }),
1499
+ });
1500
+ let systemPrompt = assembled.systemPrompt;
1501
+ const renderWithDate = assembled.renderWithDate
1502
+ ? (date) => {
1503
+ systemPrompt = assembled.renderWithDate(date);
1504
+ return systemPrompt;
1525
1505
  }
1526
- promptBlocks.push({ id: "model.guidance", text: guidance });
1527
- }
1506
+ : undefined;
1507
+ const promptConstitution = assembled.constitution;
1508
+ const promptBlocks = assembled.legacyBlocks;
1509
+ const saltedHash = (text) => createHash("sha256").update(PROMPT_HASH_SALT).update(text).digest("hex").slice(0, 12);
1528
1510
  const promptManifest = {
1529
1511
  constitution: promptConstitution,
1530
- blocks: promptBlocks.map((b) => ({ id: b.id, chars: b.text.length, hash: createHash("sha256").update(PROMPT_HASH_SALT).update(b.text).digest("hex").slice(0, 12) })),
1512
+ blocks: promptBlocks.map((b) => ({ id: b.id, chars: b.text.length, hash: saltedHash(b.text) })),
1513
+ ...(assembled.sections
1514
+ ? { sections: assembled.sections.map((s) => ({ id: s.id, slot: s.slot, carrier: s.carrier, cadence: s.cadence, cacheClass: s.cacheClass, chars: s.text.length, hash: saltedHash(s.text) })) }
1515
+ : {}),
1516
+ tools: projectToolManifest(tools, (t) => (t.name.startsWith("mcp__") ? "mcp" : "caller")),
1531
1517
  };
1532
1518
  const userToolNames = (spec.tools ?? []).map((t) => t.name);
1533
1519
  const mcpToolNames = mcp.tools.map((t) => t.name);