@deepagents/context 0.38.1 → 0.39.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.
package/dist/index.d.ts CHANGED
@@ -13,8 +13,11 @@ export * from './lib/fragments/reasoning.ts';
13
13
  export * from './lib/fragments/reminders/classifier.ts';
14
14
  export * from './lib/fragments/reminders/combinators.ts';
15
15
  export * from './lib/fragments/reminders/content-predicates.ts';
16
+ export * from './lib/fragments/reminders/message-predicates.ts';
16
17
  export * from './lib/fragments/reminders/temporal/index.ts';
18
+ export * from './lib/fragments/reminders/tool-predicates.ts';
17
19
  export * from './lib/fragments/reminders/turn-predicates.ts';
20
+ export * from './lib/fragments/reminders/usage-predicates.ts';
18
21
  export * from './lib/fragments/socratic.ts';
19
22
  export * from './lib/fragments/user.ts';
20
23
  export * from './lib/guardrail.ts';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,kBAAkB,CAAC;AACjC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,eAAe,CAAC;AAC9B,cAAc,sBAAsB,CAAC;AACrC,cAAc,iCAAiC,CAAC;AAChD,cAAc,qCAAqC,CAAC;AACpD,cAAc,iBAAiB,CAAC;AAChC,cAAc,mBAAmB,CAAC;AAClC,cAAc,oBAAoB,CAAC;AACnC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,iCAAiC,CAAC;AAChD,cAAc,8BAA8B,CAAC;AAC7C,cAAc,yCAAyC,CAAC;AACxD,cAAc,0CAA0C,CAAC;AACzD,cAAc,iDAAiD,CAAC;AAChE,cAAc,6CAA6C,CAAC;AAC5D,cAAc,8CAA8C,CAAC;AAC7D,cAAc,6BAA6B,CAAC;AAC5C,cAAc,yBAAyB,CAAC;AACxC,cAAc,oBAAoB,CAAC;AACnC,cAAc,8CAA8C,CAAC;AAC7D,cAAc,2BAA2B,CAAC;AAC1C,cAAc,iBAAiB,CAAC;AAChC,cAAc,sCAAsC,CAAC;AACrD,cAAc,iBAAiB,CAAC;AAChC,cAAc,wBAAwB,CAAC;AACvC,cAAc,uBAAuB,CAAC;AACtC,cAAc,yBAAyB,CAAC;AACxC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,+BAA+B,CAAC;AAC9C,cAAc,6BAA6B,CAAC;AAC5C,cAAc,gCAAgC,CAAC;AAC/C,cAAc,sBAAsB,CAAC;AACrC,cAAc,wBAAwB,CAAC;AACvC,cAAc,gCAAgC,CAAC;AAC/C,cAAc,qCAAqC,CAAC;AACpD,cAAc,gCAAgC,CAAC;AAC/C,cAAc,8BAA8B,CAAC;AAC7C,cAAc,gBAAgB,CAAC;AAC/B,cAAc,oBAAoB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,kBAAkB,CAAC;AACjC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,eAAe,CAAC;AAC9B,cAAc,sBAAsB,CAAC;AACrC,cAAc,iCAAiC,CAAC;AAChD,cAAc,qCAAqC,CAAC;AACpD,cAAc,iBAAiB,CAAC;AAChC,cAAc,mBAAmB,CAAC;AAClC,cAAc,oBAAoB,CAAC;AACnC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,iCAAiC,CAAC;AAChD,cAAc,8BAA8B,CAAC;AAC7C,cAAc,yCAAyC,CAAC;AACxD,cAAc,0CAA0C,CAAC;AACzD,cAAc,iDAAiD,CAAC;AAChE,cAAc,iDAAiD,CAAC;AAChE,cAAc,6CAA6C,CAAC;AAC5D,cAAc,8CAA8C,CAAC;AAC7D,cAAc,8CAA8C,CAAC;AAC7D,cAAc,+CAA+C,CAAC;AAC9D,cAAc,6BAA6B,CAAC;AAC5C,cAAc,yBAAyB,CAAC;AACxC,cAAc,oBAAoB,CAAC;AACnC,cAAc,8CAA8C,CAAC;AAC7D,cAAc,2BAA2B,CAAC;AAC1C,cAAc,iBAAiB,CAAC;AAChC,cAAc,sCAAsC,CAAC;AACrD,cAAc,iBAAiB,CAAC;AAChC,cAAc,wBAAwB,CAAC;AACvC,cAAc,uBAAuB,CAAC;AACtC,cAAc,yBAAyB,CAAC;AACxC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,+BAA+B,CAAC;AAC9C,cAAc,6BAA6B,CAAC;AAC5C,cAAc,gCAAgC,CAAC;AAC/C,cAAc,sBAAsB,CAAC;AACrC,cAAc,wBAAwB,CAAC;AACvC,cAAc,gCAAgC,CAAC;AAC/C,cAAc,qCAAqC,CAAC;AACpD,cAAc,gCAAgC,CAAC;AAC/C,cAAc,8BAA8B,CAAC;AAC7C,cAAc,gBAAgB,CAAC;AAC/B,cAAc,oBAAoB,CAAC"}
package/dist/index.js CHANGED
@@ -1402,27 +1402,27 @@ import {
1402
1402
  } from "ai";
1403
1403
  import chalk from "chalk";
1404
1404
  function createRepairToolCall(model, abortSignal) {
1405
- return async ({ toolCall, tools, inputSchema, error }) => {
1405
+ return async ({ toolCall: toolCall2, tools, inputSchema, error }) => {
1406
1406
  if (NoSuchToolError.isInstance(error)) {
1407
1407
  return null;
1408
1408
  }
1409
1409
  console.log(
1410
- `Debug: ${chalk.yellow("RepairingToolCall")}: ${toolCall.toolName}`
1410
+ `Debug: ${chalk.yellow("RepairingToolCall")}: ${toolCall2.toolName}`
1411
1411
  );
1412
- const tool3 = tools[toolCall.toolName];
1412
+ const tool3 = tools[toolCall2.toolName];
1413
1413
  const { output } = await generateText({
1414
1414
  abortSignal,
1415
1415
  model,
1416
1416
  output: Output.object({ schema: tool3.inputSchema }),
1417
1417
  prompt: [
1418
- `The model tried to call the tool "${toolCall.toolName}" with the following inputs:`,
1419
- JSON.stringify(toolCall.input),
1418
+ `The model tried to call the tool "${toolCall2.toolName}" with the following inputs:`,
1419
+ JSON.stringify(toolCall2.input),
1420
1420
  `The tool accepts the following schema:`,
1421
- JSON.stringify(inputSchema(toolCall)),
1421
+ JSON.stringify(inputSchema(toolCall2)),
1422
1422
  "Please fix the inputs."
1423
1423
  ].join("\n")
1424
1424
  });
1425
- return { ...toolCall, input: JSON.stringify(output) };
1425
+ return { ...toolCall2, input: JSON.stringify(output) };
1426
1426
  };
1427
1427
  }
1428
1428
 
@@ -1470,10 +1470,10 @@ var Agent = class _Agent {
1470
1470
  ),
1471
1471
  toolChoice: this.#options.toolChoice,
1472
1472
  onStepFinish: (step) => {
1473
- const toolCall = step.toolCalls.at(-1);
1474
- if (toolCall) {
1473
+ const toolCall2 = step.toolCalls.at(-1);
1474
+ if (toolCall2) {
1475
1475
  console.log(
1476
- `Debug: ${chalk2.yellow("ToolCalled")}: ${toolCall.toolName}(${JSON.stringify(toolCall.input)})`
1476
+ `Debug: ${chalk2.yellow("ToolCalled")}: ${toolCall2.toolName}(${JSON.stringify(toolCall2.input)})`
1477
1477
  );
1478
1478
  }
1479
1479
  }
@@ -1544,10 +1544,10 @@ var Agent = class _Agent {
1544
1544
  experimental_context: contextVariables,
1545
1545
  toolChoice: this.#options.toolChoice,
1546
1546
  onStepFinish: (step) => {
1547
- const toolCall = step.toolCalls.at(-1);
1548
- if (toolCall) {
1547
+ const toolCall2 = step.toolCalls.at(-1);
1548
+ if (toolCall2) {
1549
1549
  console.log(
1550
- `Debug: (${runId}) ${chalk2.bold.yellow("ToolCalled")}: ${toolCall.toolName}(${JSON.stringify(toolCall.input)})`
1550
+ `Debug: (${runId}) ${chalk2.bold.yellow("ToolCalled")}: ${toolCall2.toolName}(${JSON.stringify(toolCall2.input)})`
1551
1551
  );
1552
1552
  }
1553
1553
  }
@@ -2744,6 +2744,7 @@ var ContextEngine = class _ContextEngine {
2744
2744
  let lastMessageAt;
2745
2745
  let lastMessage;
2746
2746
  let lastAssistantMessage;
2747
+ const lastAssistantMessages = [];
2747
2748
  if (this.#branch?.headMessageId) {
2748
2749
  const chain = await this.#store.getMessageChain(
2749
2750
  this.#branch.headMessageId
@@ -2751,7 +2752,9 @@ var ContextEngine = class _ContextEngine {
2751
2752
  for (const msg of chain) {
2752
2753
  messageCount++;
2753
2754
  if (msg.name === "assistant") {
2754
- lastAssistantMessage = msg.data;
2755
+ const assistantMsg = msg.data;
2756
+ lastAssistantMessage = assistantMsg;
2757
+ lastAssistantMessages.push(assistantMsg);
2755
2758
  }
2756
2759
  if (msg.name !== "user") {
2757
2760
  continue;
@@ -2770,7 +2773,8 @@ var ContextEngine = class _ContextEngine {
2770
2773
  messageCount,
2771
2774
  lastMessageAt,
2772
2775
  lastMessage,
2773
- lastAssistantMessage
2776
+ lastAssistantMessage,
2777
+ lastAssistantMessages
2774
2778
  };
2775
2779
  }
2776
2780
  async getTurnCount() {
@@ -2989,7 +2993,8 @@ var ContextEngine = class _ContextEngine {
2989
2993
  messageCount,
2990
2994
  lastMessageAt,
2991
2995
  lastMessage,
2992
- lastAssistantMessage
2996
+ lastAssistantMessage,
2997
+ lastAssistantMessages
2993
2998
  } = await this.#getChainContext();
2994
2999
  const original = lastUserFragment.codec.encode();
2995
3000
  const plainText = extractPlainText(original);
@@ -3007,7 +3012,8 @@ var ContextEngine = class _ContextEngine {
3007
3012
  branch: this.#branchName,
3008
3013
  elapsed,
3009
3014
  messageCount,
3010
- lastAssistantMessage
3015
+ lastAssistantMessage,
3016
+ lastAssistantMessages
3011
3017
  };
3012
3018
  const configs = conditionalReminders.map(
3013
3019
  (it) => it.metadata.reminder
@@ -4515,6 +4521,32 @@ function or(...predicates) {
4515
4521
  function not(predicate) {
4516
4522
  return async (ctx) => !await predicate(ctx);
4517
4523
  }
4524
+ function withinLastN(n, predicate) {
4525
+ return async (ctx) => {
4526
+ if (n <= 0) return false;
4527
+ const candidates = (ctx.lastAssistantMessages ?? []).slice(-n);
4528
+ for (const message2 of candidates) {
4529
+ if (await predicate({ ...ctx, lastAssistantMessage: message2 })) {
4530
+ return true;
4531
+ }
4532
+ }
4533
+ return false;
4534
+ };
4535
+ }
4536
+ function everyOfLastN(n, predicate) {
4537
+ return async (ctx) => {
4538
+ if (n <= 0) return false;
4539
+ const history = ctx.lastAssistantMessages ?? [];
4540
+ if (history.length < n) return false;
4541
+ const candidates = history.slice(-n);
4542
+ for (const message2 of candidates) {
4543
+ if (!await predicate({ ...ctx, lastAssistantMessage: message2 })) {
4544
+ return false;
4545
+ }
4546
+ }
4547
+ return true;
4548
+ };
4549
+ }
4518
4550
 
4519
4551
  // packages/context/src/lib/fragments/reminders/content-predicates.ts
4520
4552
  function contentMatches(topics, options) {
@@ -4540,6 +4572,37 @@ function contentPattern(pattern) {
4540
4572
  };
4541
4573
  }
4542
4574
 
4575
+ // packages/context/src/lib/fragments/reminders/message-predicates.ts
4576
+ function assertCountSpec(spec) {
4577
+ const hasEq = spec.eq !== void 0;
4578
+ const hasRange = spec.gte !== void 0 || spec.lte !== void 0;
4579
+ if (!hasEq && !hasRange) {
4580
+ throw new Error("CountSpec must include at least one of gte/lte/eq");
4581
+ }
4582
+ if (hasEq && hasRange) {
4583
+ throw new Error("CountSpec.eq cannot be combined with gte/lte");
4584
+ }
4585
+ }
4586
+ function checkCount(count, spec) {
4587
+ if (spec.eq !== void 0) return count === spec.eq;
4588
+ if (spec.gte !== void 0 && count < spec.gte) return false;
4589
+ if (spec.lte !== void 0 && count > spec.lte) return false;
4590
+ return true;
4591
+ }
4592
+ function lastAssistantLength(spec) {
4593
+ assertCountSpec(spec);
4594
+ return (ctx) => {
4595
+ const message2 = ctx.lastAssistantMessage;
4596
+ const text = message2 ? extractPlainText(message2) : "";
4597
+ return checkCount(text.length, spec);
4598
+ };
4599
+ }
4600
+
4601
+ // packages/context/src/lib/fragments/reminders/temporal/elapsed.ts
4602
+ function elapsedExceeds(ms) {
4603
+ return (ctx) => (ctx.elapsed ?? 0) >= ms;
4604
+ }
4605
+
4543
4606
  // packages/context/src/lib/fragments/reminders/temporal/predicates.ts
4544
4607
  var LOCALE_METADATA_KEY = "locale";
4545
4608
  function getLocaleFromMessage(message2) {
@@ -4811,6 +4874,73 @@ function temporalReminder(options) {
4811
4874
  ];
4812
4875
  }
4813
4876
 
4877
+ // packages/context/src/lib/fragments/reminders/tool-predicates.ts
4878
+ import { isStaticToolUIPart } from "ai";
4879
+ var COMPLETED_STATES = /* @__PURE__ */ new Set([
4880
+ "input-available",
4881
+ "output-available",
4882
+ "output-error"
4883
+ ]);
4884
+ function matchesName(spec, name) {
4885
+ return typeof spec === "function" ? spec(name) : spec === name;
4886
+ }
4887
+ function toolNameOf(part) {
4888
+ return part.type.slice("tool-".length);
4889
+ }
4890
+ function toolPartsOf(message2) {
4891
+ if (!message2) return [];
4892
+ return message2.parts.filter(isStaticToolUIPart);
4893
+ }
4894
+ function toolCall(options) {
4895
+ return (ctx) => {
4896
+ const parts = toolPartsOf(ctx.lastAssistantMessage);
4897
+ return parts.some((part) => {
4898
+ if (options.state) {
4899
+ if (part.state !== options.state) return false;
4900
+ } else if (!COMPLETED_STATES.has(part.state)) {
4901
+ return false;
4902
+ }
4903
+ if (options.name !== void 0 && !matchesName(options.name, toolNameOf(part))) {
4904
+ return false;
4905
+ }
4906
+ if (options.input && !options.input(part.input)) {
4907
+ return false;
4908
+ }
4909
+ if (options.output) {
4910
+ if (part.state !== "output-available") return false;
4911
+ if (!options.output(part.output))
4912
+ return false;
4913
+ }
4914
+ if (options.errorText) {
4915
+ if (part.state !== "output-error") return false;
4916
+ const text = part.errorText ?? "";
4917
+ if (!options.errorText(text)) return false;
4918
+ }
4919
+ return true;
4920
+ });
4921
+ };
4922
+ }
4923
+ function toolCalled(name) {
4924
+ return toolCall({ name });
4925
+ }
4926
+ function toolFailed(name) {
4927
+ return toolCall({ name, state: "output-error" });
4928
+ }
4929
+ function anyToolCalled() {
4930
+ return (ctx) => toolPartsOf(ctx.lastAssistantMessage).some(
4931
+ (part) => COMPLETED_STATES.has(part.state)
4932
+ );
4933
+ }
4934
+ function toolCallCount(name, spec) {
4935
+ assertCountSpec(spec);
4936
+ return (ctx) => {
4937
+ const count = toolPartsOf(ctx.lastAssistantMessage).filter(
4938
+ (part) => COMPLETED_STATES.has(part.state) && matchesName(name, toolNameOf(part))
4939
+ ).length;
4940
+ return checkCount(count, spec);
4941
+ };
4942
+ }
4943
+
4814
4944
  // packages/context/src/lib/fragments/reminders/turn-predicates.ts
4815
4945
  function everyNTurns(n) {
4816
4946
  return ({ turn }) => turn % n === 0;
@@ -4825,6 +4955,11 @@ function afterTurn(n) {
4825
4955
  return ({ turn }) => turn > n;
4826
4956
  }
4827
4957
 
4958
+ // packages/context/src/lib/fragments/reminders/usage-predicates.ts
4959
+ function usageExceeds(totalTokens) {
4960
+ return (ctx) => (ctx.usage?.totalTokens ?? 0) >= totalTokens;
4961
+ }
4962
+
4828
4963
  // packages/context/src/lib/fragments/socratic.ts
4829
4964
  function socraticPrompting() {
4830
4965
  return [
@@ -9346,17 +9481,20 @@ export {
9346
9481
  alias,
9347
9482
  analogy,
9348
9483
  and,
9484
+ anyToolCalled,
9349
9485
  applyInlineReminder,
9350
9486
  applyPartReminder,
9351
9487
  applyReminderToMessage,
9352
9488
  asStaticWordPartText,
9353
9489
  asStaticWordText,
9490
+ assertCountSpec,
9354
9491
  assistant,
9355
9492
  assistantText,
9356
9493
  buildSchemaSubcommand,
9357
9494
  buildSubcommandRepair,
9358
9495
  chainHooks,
9359
9496
  chat,
9497
+ checkCount,
9360
9498
  clarification,
9361
9499
  classifies,
9362
9500
  contentIncludes,
@@ -9379,10 +9517,12 @@ export {
9379
9517
  defaultTokenizer,
9380
9518
  defineSubcommandGroup,
9381
9519
  discoverSkillsInDirectory,
9520
+ elapsedExceeds,
9382
9521
  encodeSerializedValue,
9383
9522
  errorRecoveryGuardrail,
9384
9523
  estimate,
9385
9524
  everyNTurns,
9525
+ everyOfLastN,
9386
9526
  example,
9387
9527
  executorContext,
9388
9528
  explain,
@@ -9412,6 +9552,7 @@ export {
9412
9552
  isInstallable,
9413
9553
  isMessageFragment,
9414
9554
  isRecord,
9555
+ lastAssistantLength,
9415
9556
  loadSkillMetadata,
9416
9557
  localeReminder,
9417
9558
  mapGenerateErrorToCode,
@@ -9467,13 +9608,19 @@ export {
9467
9608
  timeReminder,
9468
9609
  toFragment,
9469
9610
  toMessageFragment,
9611
+ toolCall,
9612
+ toolCallCount,
9613
+ toolCalled,
9614
+ toolFailed,
9470
9615
  uploadSkills,
9616
+ usageExceeds,
9471
9617
  useAgentOsSandbox,
9472
9618
  useBashMeta,
9473
9619
  useSandbox,
9474
9620
  user,
9475
9621
  visualizeGraph,
9476
9622
  weekChanged,
9623
+ withinLastN,
9477
9624
  workflow,
9478
9625
  yearChanged,
9479
9626
  yearReminder