@deepagents/context 0.33.0 → 0.34.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.js CHANGED
@@ -591,7 +591,18 @@ async function estimate(modelId, renderer, ...fragments) {
591
591
  }
592
592
 
593
593
  // packages/context/src/lib/fragments/message/user.ts
594
- import { generateId as generateId3, isTextUIPart } from "ai";
594
+ import { generateId as generateId3 } from "ai";
595
+
596
+ // packages/context/src/lib/text.ts
597
+ import { isTextUIPart } from "ai";
598
+ function getTextParts(message2) {
599
+ return message2.parts.filter(isTextUIPart).map((part) => part.text);
600
+ }
601
+ function extractPlainText(message2) {
602
+ return getTextParts(message2).join(" ");
603
+ }
604
+
605
+ // packages/context/src/lib/fragments/message/user.ts
595
606
  function everyNTurns(n) {
596
607
  return ({ turn }) => turn % n === 0;
597
608
  }
@@ -762,9 +773,6 @@ function stripReminders(message2) {
762
773
  }
763
774
  return nextMessage;
764
775
  }
765
- function extractPlainText(message2) {
766
- return message2.parts.filter(isTextUIPart).map((part) => part.text).join(" ");
767
- }
768
776
  function isRecord(value) {
769
777
  return typeof value === "object" && value !== null && !Array.isArray(value);
770
778
  }
@@ -1814,6 +1822,9 @@ var ContextStore = class {
1814
1822
  function estimateMessageContent(data) {
1815
1823
  return typeof data === "string" ? data : JSON.stringify(data);
1816
1824
  }
1825
+ function isLanguageModelUsage(value) {
1826
+ return typeof value === "object" && value !== null && "totalTokens" in value;
1827
+ }
1817
1828
  var ContextEngine = class {
1818
1829
  /** Non-message fragments (role, hints, etc.) - not persisted in graph */
1819
1830
  #fragments = [];
@@ -1949,17 +1960,7 @@ var ContextEngine = class {
1949
1960
  * Returns null if the chat hasn't been initialized yet.
1950
1961
  */
1951
1962
  get chat() {
1952
- if (!this.#chatData) {
1953
- return null;
1954
- }
1955
- return {
1956
- id: this.#chatData.id,
1957
- userId: this.#chatData.userId,
1958
- createdAt: this.#chatData.createdAt,
1959
- updatedAt: this.#chatData.updatedAt,
1960
- title: this.#chatData.title,
1961
- metadata: this.#chatData.metadata
1962
- };
1963
+ return this.#chatData;
1963
1964
  }
1964
1965
  /**
1965
1966
  * Count user turns in the conversation and return the previous saved user message context.
@@ -1968,13 +1969,19 @@ var ContextEngine = class {
1968
1969
  async #getChainContext() {
1969
1970
  await this.#ensureInitialized();
1970
1971
  let turn = 0;
1972
+ let messageCount = 0;
1971
1973
  let lastMessageAt;
1972
1974
  let lastMessage;
1975
+ let lastAssistantMessage2;
1973
1976
  if (this.#branch?.headMessageId) {
1974
1977
  const chain = await this.#store.getMessageChain(
1975
1978
  this.#branch.headMessageId
1976
1979
  );
1977
1980
  for (const msg of chain) {
1981
+ messageCount++;
1982
+ if (msg.name === "assistant") {
1983
+ lastAssistantMessage2 = msg.data;
1984
+ }
1978
1985
  if (msg.name !== "user") {
1979
1986
  continue;
1980
1987
  }
@@ -1984,9 +1991,16 @@ var ContextEngine = class {
1984
1991
  }
1985
1992
  }
1986
1993
  for (const fragment2 of this.#pendingMessages) {
1994
+ messageCount++;
1987
1995
  if (fragment2.name === "user") turn++;
1988
1996
  }
1989
- return { turn, lastMessageAt, lastMessage };
1997
+ return {
1998
+ turn,
1999
+ messageCount,
2000
+ lastMessageAt,
2001
+ lastMessage,
2002
+ lastAssistantMessage: lastAssistantMessage2
2003
+ };
1990
2004
  }
1991
2005
  async getTurnCount() {
1992
2006
  const { turn } = await this.#getChainContext();
@@ -2116,25 +2130,34 @@ var ContextEngine = class {
2116
2130
  if (lastUserIndex >= 0) {
2117
2131
  const lastUserFragment = this.#pendingMessages[lastUserIndex];
2118
2132
  if (lastUserFragment.codec) {
2119
- const { turn, lastMessageAt, lastMessage } = await this.#getChainContext();
2133
+ const {
2134
+ turn,
2135
+ messageCount,
2136
+ lastMessageAt,
2137
+ lastMessage,
2138
+ lastAssistantMessage: lastAssistantMessage2
2139
+ } = await this.#getChainContext();
2120
2140
  const original = lastUserFragment.codec.encode();
2121
2141
  const plainText = extractPlainText(original);
2122
- const firedReminders = conditionalReminders.map(getConditionalReminder).filter(
2123
- (config) => config.when({
2124
- turn,
2125
- content: plainText,
2126
- lastMessageAt,
2127
- lastMessage
2128
- })
2129
- );
2142
+ const rawUsage = this.#chatData?.metadata?.usage;
2143
+ const usage = isLanguageModelUsage(rawUsage) ? rawUsage : void 0;
2144
+ const elapsed = lastMessageAt !== void 0 ? Date.now() - lastMessageAt : void 0;
2145
+ const whenCtx = {
2146
+ turn,
2147
+ content: plainText,
2148
+ lastMessageAt,
2149
+ lastMessage,
2150
+ chat: this.#chatData,
2151
+ usage,
2152
+ branch: this.#branchName,
2153
+ elapsed,
2154
+ messageCount,
2155
+ lastAssistantMessage: lastAssistantMessage2
2156
+ };
2157
+ const firedReminders = conditionalReminders.map(getConditionalReminder).filter((config) => config.when(whenCtx));
2130
2158
  if (firedReminders.length > 0) {
2131
2159
  const reminders = firedReminders.flatMap((rem) => {
2132
- const resolved = resolveReminder(rem, {
2133
- content: plainText,
2134
- turn,
2135
- lastMessageAt,
2136
- lastMessage
2137
- });
2160
+ const resolved = resolveReminder(rem, whenCtx);
2138
2161
  if (!resolved) {
2139
2162
  return [];
2140
2163
  }
@@ -7959,7 +7982,6 @@ export {
7959
7982
  everyNTurns,
7960
7983
  example,
7961
7984
  explain,
7962
- extractPlainText,
7963
7985
  fail,
7964
7986
  firstN,
7965
7987
  fragment,