@deepagents/context 0.29.1 → 0.31.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/browser.js +41 -7
- package/dist/browser.js.map +2 -2
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +292 -56
- package/dist/index.js.map +4 -4
- package/dist/lib/engine.d.ts +0 -6
- package/dist/lib/engine.d.ts.map +1 -1
- package/dist/lib/fragments/message/environment-reminder.d.ts +26 -0
- package/dist/lib/fragments/message/environment-reminder.d.ts.map +1 -0
- package/dist/lib/fragments/message/user.d.ts +15 -1
- package/dist/lib/fragments/message/user.d.ts.map +1 -1
- package/dist/lib/fragments/reasoning.d.ts +32 -1
- package/dist/lib/fragments/reasoning.d.ts.map +1 -1
- package/package.json +4 -4
package/dist/index.d.ts
CHANGED
|
@@ -7,6 +7,7 @@ export * from './lib/engine.ts';
|
|
|
7
7
|
export * from './lib/estimate.ts';
|
|
8
8
|
export * from './lib/fragments.ts';
|
|
9
9
|
export * from './lib/fragments/domain.ts';
|
|
10
|
+
export * from './lib/fragments/message/environment-reminder.ts';
|
|
10
11
|
export * from './lib/fragments/message/user.ts';
|
|
11
12
|
export * from './lib/fragments/reasoning.ts';
|
|
12
13
|
export * from './lib/fragments/user.ts';
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,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,yBAAyB,CAAC;AACxC,cAAc,oBAAoB,CAAC;AACnC,cAAc,8CAA8C,CAAC;AAC7D,cAAc,2BAA2B,CAAC;AAC1C,cAAc,iBAAiB,CAAC;AAChC,cAAc,sCAAsC,CAAC;AACrD,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,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,iDAAiD,CAAC;AAChE,cAAc,iCAAiC,CAAC;AAChD,cAAc,8BAA8B,CAAC;AAC7C,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,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
|
@@ -426,7 +426,7 @@ import {
|
|
|
426
426
|
import { z } from "zod";
|
|
427
427
|
|
|
428
428
|
// packages/context/src/lib/engine.ts
|
|
429
|
-
import {
|
|
429
|
+
import { validateUIMessages } from "ai";
|
|
430
430
|
import { mergeWith } from "lodash-es";
|
|
431
431
|
|
|
432
432
|
// packages/context/src/lib/estimate.ts
|
|
@@ -753,14 +753,45 @@ function applyPartReminder(message2, value) {
|
|
|
753
753
|
};
|
|
754
754
|
}
|
|
755
755
|
function resolveReminderText(item, ctx) {
|
|
756
|
-
return
|
|
756
|
+
return resolveReminder(item, ctx)?.text ?? "";
|
|
757
|
+
}
|
|
758
|
+
function normalizeReminderResolution(value) {
|
|
759
|
+
if (typeof value === "string") {
|
|
760
|
+
return value.trim().length === 0 ? null : { text: value };
|
|
761
|
+
}
|
|
762
|
+
if (value.text.trim().length === 0) {
|
|
763
|
+
return null;
|
|
764
|
+
}
|
|
765
|
+
return value;
|
|
766
|
+
}
|
|
767
|
+
function resolveReminder(item, ctx) {
|
|
768
|
+
const resolvedText = typeof item.text === "function" ? item.text(ctx) : item.text;
|
|
769
|
+
const resolved = normalizeReminderResolution(resolvedText);
|
|
770
|
+
if (!resolved) {
|
|
771
|
+
return null;
|
|
772
|
+
}
|
|
773
|
+
const metadata = item.metadata || resolved.metadata ? {
|
|
774
|
+
...item.metadata ?? {},
|
|
775
|
+
...resolved.metadata ?? {}
|
|
776
|
+
} : void 0;
|
|
777
|
+
return metadata ? { ...resolved, metadata } : resolved;
|
|
778
|
+
}
|
|
779
|
+
function mergeMessageMetadata(message2, addedMetadata) {
|
|
780
|
+
if (Object.keys(addedMetadata).length === 0) {
|
|
781
|
+
return;
|
|
782
|
+
}
|
|
783
|
+
const metadata = isRecord(message2.metadata) ? { ...message2.metadata } : {};
|
|
784
|
+
message2.metadata = { ...metadata, ...addedMetadata };
|
|
757
785
|
}
|
|
758
786
|
function applyReminderToMessage(message2, item, ctx) {
|
|
759
|
-
const
|
|
760
|
-
if (
|
|
787
|
+
const resolved = resolveReminder(item, ctx);
|
|
788
|
+
if (!resolved) {
|
|
761
789
|
return null;
|
|
762
790
|
}
|
|
763
|
-
|
|
791
|
+
if (resolved.metadata) {
|
|
792
|
+
mergeMessageMetadata(message2, resolved.metadata);
|
|
793
|
+
}
|
|
794
|
+
return item.asPart ? applyPartReminder(message2, resolved.text) : applyInlineReminder(message2, resolved.text);
|
|
764
795
|
}
|
|
765
796
|
function mergeReminderMetadata(message2, addedReminders) {
|
|
766
797
|
if (addedReminders.length === 0) return;
|
|
@@ -798,14 +829,14 @@ function user(content, ...reminders) {
|
|
|
798
829
|
} : { ...content, role: "user", parts: [...content.parts] };
|
|
799
830
|
if (reminders.length > 0) {
|
|
800
831
|
const plainText = extractPlainText(message2);
|
|
801
|
-
const
|
|
832
|
+
const added = [];
|
|
802
833
|
for (const item of reminders) {
|
|
803
834
|
const meta = applyReminderToMessage(message2, item, {
|
|
804
835
|
content: plainText
|
|
805
836
|
});
|
|
806
|
-
if (meta)
|
|
837
|
+
if (meta) added.push(meta);
|
|
807
838
|
}
|
|
808
|
-
mergeReminderMetadata(message2,
|
|
839
|
+
mergeReminderMetadata(message2, added);
|
|
809
840
|
}
|
|
810
841
|
return {
|
|
811
842
|
id: message2.id,
|
|
@@ -1721,6 +1752,14 @@ var ContextEngine = class {
|
|
|
1721
1752
|
#initialized = false;
|
|
1722
1753
|
/** Initial metadata to merge on first initialization */
|
|
1723
1754
|
#initialMetadata;
|
|
1755
|
+
get #activeBranch() {
|
|
1756
|
+
if (!this.#branch) {
|
|
1757
|
+
throw new Error(
|
|
1758
|
+
"Branch not initialized. Call #ensureInitialized() first."
|
|
1759
|
+
);
|
|
1760
|
+
}
|
|
1761
|
+
return this.#branch;
|
|
1762
|
+
}
|
|
1724
1763
|
get #renderableFragments() {
|
|
1725
1764
|
return this.#fragments.filter((f) => !isConditionalReminder(f));
|
|
1726
1765
|
}
|
|
@@ -1757,7 +1796,13 @@ var ContextEngine = class {
|
|
|
1757
1796
|
});
|
|
1758
1797
|
this.#initialMetadata = void 0;
|
|
1759
1798
|
}
|
|
1760
|
-
|
|
1799
|
+
const branch = await this.#store.getActiveBranch(this.#chatId);
|
|
1800
|
+
if (!branch) {
|
|
1801
|
+
throw new Error(
|
|
1802
|
+
`Active branch not found for chat "${this.#chatId}" after upsertChat`
|
|
1803
|
+
);
|
|
1804
|
+
}
|
|
1805
|
+
this.#branch = branch;
|
|
1761
1806
|
this.#initialized = true;
|
|
1762
1807
|
}
|
|
1763
1808
|
/**
|
|
@@ -1841,30 +1886,35 @@ var ContextEngine = class {
|
|
|
1841
1886
|
};
|
|
1842
1887
|
}
|
|
1843
1888
|
/**
|
|
1844
|
-
* Count user
|
|
1845
|
-
* Includes persisted messages and pending messages.
|
|
1846
|
-
* A turn is one user message paired with one assistant message.
|
|
1847
|
-
* An unpaired trailing user message counts as the next turn.
|
|
1889
|
+
* Count user turns in the conversation and return the previous saved user message context.
|
|
1890
|
+
* Includes persisted messages and pending messages in the turn count.
|
|
1848
1891
|
*/
|
|
1849
|
-
async
|
|
1892
|
+
async #getChainContext() {
|
|
1850
1893
|
await this.#ensureInitialized();
|
|
1851
|
-
let
|
|
1894
|
+
let turn = 0;
|
|
1895
|
+
let lastMessageAt;
|
|
1896
|
+
let lastMessage;
|
|
1852
1897
|
if (this.#branch?.headMessageId) {
|
|
1853
1898
|
const chain = await this.#store.getMessageChain(
|
|
1854
1899
|
this.#branch.headMessageId
|
|
1855
1900
|
);
|
|
1856
1901
|
for (const msg of chain) {
|
|
1857
|
-
if (msg.name
|
|
1858
|
-
|
|
1902
|
+
if (msg.name !== "user") {
|
|
1903
|
+
continue;
|
|
1859
1904
|
}
|
|
1905
|
+
turn++;
|
|
1906
|
+
lastMessageAt = msg.createdAt;
|
|
1907
|
+
lastMessage = msg.data;
|
|
1860
1908
|
}
|
|
1861
1909
|
}
|
|
1862
1910
|
for (const fragment2 of this.#pendingMessages) {
|
|
1863
|
-
if (fragment2.name === "user")
|
|
1864
|
-
userCount++;
|
|
1865
|
-
}
|
|
1911
|
+
if (fragment2.name === "user") turn++;
|
|
1866
1912
|
}
|
|
1867
|
-
return
|
|
1913
|
+
return { turn, lastMessageAt, lastMessage };
|
|
1914
|
+
}
|
|
1915
|
+
async getTurnCount() {
|
|
1916
|
+
const { turn } = await this.#getChainContext();
|
|
1917
|
+
return turn;
|
|
1868
1918
|
}
|
|
1869
1919
|
/**
|
|
1870
1920
|
* Add fragments to the context.
|
|
@@ -1935,37 +1985,6 @@ var ContextEngine = class {
|
|
|
1935
1985
|
}
|
|
1936
1986
|
messages.push(fragment2.codec.encode());
|
|
1937
1987
|
}
|
|
1938
|
-
const conditionalReminders = this.#fragments.filter(isConditionalReminder);
|
|
1939
|
-
if (conditionalReminders.length > 0) {
|
|
1940
|
-
const turn = await this.getTurnCount();
|
|
1941
|
-
let lastUserIndex = -1;
|
|
1942
|
-
for (let i = messages.length - 1; i >= 0; i--) {
|
|
1943
|
-
if (messages[i].role === "user") {
|
|
1944
|
-
lastUserIndex = i;
|
|
1945
|
-
break;
|
|
1946
|
-
}
|
|
1947
|
-
}
|
|
1948
|
-
if (lastUserIndex >= 0) {
|
|
1949
|
-
const original = messages[lastUserIndex];
|
|
1950
|
-
const message2 = {
|
|
1951
|
-
...original,
|
|
1952
|
-
parts: [...original.parts]
|
|
1953
|
-
};
|
|
1954
|
-
const plainText = message2.parts.filter(isTextUIPart2).map((p) => p.text).join(" ");
|
|
1955
|
-
const addedReminders = [];
|
|
1956
|
-
for (const fragment2 of conditionalReminders) {
|
|
1957
|
-
const config = getConditionalReminder(fragment2);
|
|
1958
|
-
if (!config.when(turn)) continue;
|
|
1959
|
-
const meta = applyReminderToMessage(message2, config, {
|
|
1960
|
-
content: plainText,
|
|
1961
|
-
turn
|
|
1962
|
-
});
|
|
1963
|
-
if (meta) addedReminders.push(meta);
|
|
1964
|
-
}
|
|
1965
|
-
mergeReminderMetadata(message2, addedReminders);
|
|
1966
|
-
messages[lastUserIndex] = message2;
|
|
1967
|
-
}
|
|
1968
|
-
}
|
|
1969
1988
|
return {
|
|
1970
1989
|
systemPrompt,
|
|
1971
1990
|
messages: messages.length === 0 ? [] : await validateUIMessages({ messages })
|
|
@@ -2009,7 +2028,49 @@ var ContextEngine = class {
|
|
|
2009
2028
|
}
|
|
2010
2029
|
}
|
|
2011
2030
|
}
|
|
2012
|
-
|
|
2031
|
+
const conditionalReminders = this.#fragments.filter(isConditionalReminder);
|
|
2032
|
+
if (conditionalReminders.length > 0) {
|
|
2033
|
+
let lastUserIndex = -1;
|
|
2034
|
+
for (let i = this.#pendingMessages.length - 1; i >= 0; i--) {
|
|
2035
|
+
if (this.#pendingMessages[i].name === "user") {
|
|
2036
|
+
lastUserIndex = i;
|
|
2037
|
+
break;
|
|
2038
|
+
}
|
|
2039
|
+
}
|
|
2040
|
+
if (lastUserIndex >= 0) {
|
|
2041
|
+
const lastUserFragment = this.#pendingMessages[lastUserIndex];
|
|
2042
|
+
if (lastUserFragment.codec) {
|
|
2043
|
+
const { turn, lastMessageAt, lastMessage } = await this.#getChainContext();
|
|
2044
|
+
const firedReminders = conditionalReminders.map(getConditionalReminder).filter((config) => config.when(turn));
|
|
2045
|
+
if (firedReminders.length > 0) {
|
|
2046
|
+
const original = lastUserFragment.codec.encode();
|
|
2047
|
+
const plainText = extractPlainText(original);
|
|
2048
|
+
const reminders = firedReminders.flatMap((rem) => {
|
|
2049
|
+
const resolved = resolveReminder(rem, {
|
|
2050
|
+
content: plainText,
|
|
2051
|
+
turn,
|
|
2052
|
+
lastMessageAt,
|
|
2053
|
+
lastMessage
|
|
2054
|
+
});
|
|
2055
|
+
if (!resolved) {
|
|
2056
|
+
return [];
|
|
2057
|
+
}
|
|
2058
|
+
return [
|
|
2059
|
+
{
|
|
2060
|
+
text: resolved.text,
|
|
2061
|
+
asPart: rem.asPart,
|
|
2062
|
+
metadata: resolved.metadata
|
|
2063
|
+
}
|
|
2064
|
+
];
|
|
2065
|
+
});
|
|
2066
|
+
const recreated = user(original, ...reminders);
|
|
2067
|
+
recreated.id = lastUserFragment.id;
|
|
2068
|
+
this.#pendingMessages[lastUserIndex] = recreated;
|
|
2069
|
+
}
|
|
2070
|
+
}
|
|
2071
|
+
}
|
|
2072
|
+
}
|
|
2073
|
+
let parentId = this.#activeBranch.headMessageId;
|
|
2013
2074
|
const now = Date.now();
|
|
2014
2075
|
for (const fragment2 of this.#pendingMessages) {
|
|
2015
2076
|
if (!fragment2.codec) {
|
|
@@ -2037,10 +2098,10 @@ var ContextEngine = class {
|
|
|
2037
2098
|
await this.#store.addMessage(messageData);
|
|
2038
2099
|
parentId = messageData.id;
|
|
2039
2100
|
}
|
|
2040
|
-
await this.#store.updateBranchHead(this.#
|
|
2041
|
-
this.#
|
|
2101
|
+
await this.#store.updateBranchHead(this.#activeBranch.id, parentId);
|
|
2102
|
+
this.#activeBranch.headMessageId = parentId;
|
|
2042
2103
|
this.#pendingMessages = [];
|
|
2043
|
-
return { headMessageId: this.#
|
|
2104
|
+
return { headMessageId: this.#activeBranch.headMessageId ?? void 0 };
|
|
2044
2105
|
}
|
|
2045
2106
|
/**
|
|
2046
2107
|
* Resolve a lazy fragment by finding the appropriate ID.
|
|
@@ -3814,6 +3875,159 @@ function fromFragment(fragment2, options) {
|
|
|
3814
3875
|
throw new Error(`Fragment "${fragment2.name}" is missing codec`);
|
|
3815
3876
|
}
|
|
3816
3877
|
|
|
3878
|
+
// packages/context/src/lib/fragments/message/environment-reminder.ts
|
|
3879
|
+
var ENVIRONMENT_REMINDER_METADATA_KEY = "environment";
|
|
3880
|
+
function getSeason(month) {
|
|
3881
|
+
if (month >= 2 && month <= 4) return "Spring";
|
|
3882
|
+
if (month >= 5 && month <= 7) return "Summer";
|
|
3883
|
+
if (month >= 8 && month <= 10) return "Fall";
|
|
3884
|
+
return "Winter";
|
|
3885
|
+
}
|
|
3886
|
+
function isRecord2(value) {
|
|
3887
|
+
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
3888
|
+
}
|
|
3889
|
+
function buildEnvironmentSnapshot(now, options) {
|
|
3890
|
+
const { language, timeZone } = options;
|
|
3891
|
+
const currentDateTime = now.toLocaleString("en-CA", {
|
|
3892
|
+
timeZone,
|
|
3893
|
+
year: "numeric",
|
|
3894
|
+
month: "2-digit",
|
|
3895
|
+
day: "2-digit",
|
|
3896
|
+
hour: "2-digit",
|
|
3897
|
+
minute: "2-digit",
|
|
3898
|
+
second: "2-digit",
|
|
3899
|
+
hour12: false
|
|
3900
|
+
});
|
|
3901
|
+
const dayOfWeek = now.toLocaleString("default", {
|
|
3902
|
+
weekday: "long",
|
|
3903
|
+
timeZone
|
|
3904
|
+
});
|
|
3905
|
+
const month = now.toLocaleString("default", {
|
|
3906
|
+
month: "long",
|
|
3907
|
+
timeZone
|
|
3908
|
+
});
|
|
3909
|
+
const year = parseInt(
|
|
3910
|
+
now.toLocaleString("en-CA", { year: "numeric", timeZone }),
|
|
3911
|
+
10
|
|
3912
|
+
);
|
|
3913
|
+
const monthIndex = parseInt(now.toLocaleString("en-CA", { month: "numeric", timeZone }), 10) - 1;
|
|
3914
|
+
return {
|
|
3915
|
+
timeZone,
|
|
3916
|
+
language,
|
|
3917
|
+
currentDateTime,
|
|
3918
|
+
dateKey: now.toLocaleDateString("en-CA", { timeZone }),
|
|
3919
|
+
dayOfWeek,
|
|
3920
|
+
month,
|
|
3921
|
+
year,
|
|
3922
|
+
season: getSeason(monthIndex),
|
|
3923
|
+
timestamp: now.getTime()
|
|
3924
|
+
};
|
|
3925
|
+
}
|
|
3926
|
+
function buildEnvironmentBlock(snapshot) {
|
|
3927
|
+
return `TimeZone is always in ${snapshot.timeZone}.
|
|
3928
|
+
|
|
3929
|
+
Current Date & Time: "${snapshot.currentDateTime}"
|
|
3930
|
+
Day of Week: ${snapshot.dayOfWeek}
|
|
3931
|
+
Month: ${snapshot.month}
|
|
3932
|
+
Year: ${snapshot.year}
|
|
3933
|
+
Timestamp: ${snapshot.timestamp}
|
|
3934
|
+
Language: ${snapshot.language}
|
|
3935
|
+
Season: ${snapshot.season}`;
|
|
3936
|
+
}
|
|
3937
|
+
function formatChange(previous, current) {
|
|
3938
|
+
const changes = [];
|
|
3939
|
+
if (previous.timeZone !== current.timeZone) {
|
|
3940
|
+
changes.push(`time zone: ${previous.timeZone} -> ${current.timeZone}`);
|
|
3941
|
+
}
|
|
3942
|
+
if (previous.language !== current.language) {
|
|
3943
|
+
changes.push(`language: ${previous.language} -> ${current.language}`);
|
|
3944
|
+
}
|
|
3945
|
+
if (previous.dateKey !== current.dateKey) {
|
|
3946
|
+
changes.push(`date: ${previous.dateKey} -> ${current.dateKey}`);
|
|
3947
|
+
}
|
|
3948
|
+
if (previous.dayOfWeek !== current.dayOfWeek) {
|
|
3949
|
+
changes.push(`day of week: ${previous.dayOfWeek} -> ${current.dayOfWeek}`);
|
|
3950
|
+
}
|
|
3951
|
+
if (previous.month !== current.month) {
|
|
3952
|
+
changes.push(`month: ${previous.month} -> ${current.month}`);
|
|
3953
|
+
}
|
|
3954
|
+
if (previous.year !== current.year) {
|
|
3955
|
+
changes.push(`year: ${previous.year} -> ${current.year}`);
|
|
3956
|
+
}
|
|
3957
|
+
if (previous.season !== current.season) {
|
|
3958
|
+
changes.push(`season: ${previous.season} -> ${current.season}`);
|
|
3959
|
+
}
|
|
3960
|
+
return changes;
|
|
3961
|
+
}
|
|
3962
|
+
function buildChangeSummary(previous, current) {
|
|
3963
|
+
if (!previous) {
|
|
3964
|
+
return "";
|
|
3965
|
+
}
|
|
3966
|
+
const changes = formatChange(previous, current);
|
|
3967
|
+
if (changes.length === 0) {
|
|
3968
|
+
return "";
|
|
3969
|
+
}
|
|
3970
|
+
return `Changes since last environment snapshot:
|
|
3971
|
+
- ${changes.join("\n- ")}
|
|
3972
|
+
|
|
3973
|
+
`;
|
|
3974
|
+
}
|
|
3975
|
+
function parseEnvironmentSnapshot(value) {
|
|
3976
|
+
if (!isRecord2(value)) {
|
|
3977
|
+
return null;
|
|
3978
|
+
}
|
|
3979
|
+
if (typeof value.timeZone !== "string" || typeof value.language !== "string" || typeof value.currentDateTime !== "string" || typeof value.dateKey !== "string" || typeof value.dayOfWeek !== "string" || typeof value.month !== "string" || typeof value.year !== "number" || typeof value.season !== "string" || typeof value.timestamp !== "number") {
|
|
3980
|
+
return null;
|
|
3981
|
+
}
|
|
3982
|
+
return {
|
|
3983
|
+
timeZone: value.timeZone,
|
|
3984
|
+
language: value.language,
|
|
3985
|
+
currentDateTime: value.currentDateTime,
|
|
3986
|
+
dateKey: value.dateKey,
|
|
3987
|
+
dayOfWeek: value.dayOfWeek,
|
|
3988
|
+
month: value.month,
|
|
3989
|
+
year: value.year,
|
|
3990
|
+
season: value.season,
|
|
3991
|
+
timestamp: value.timestamp
|
|
3992
|
+
};
|
|
3993
|
+
}
|
|
3994
|
+
function getEnvironmentSnapshot(message2) {
|
|
3995
|
+
const metadata = isRecord2(message2?.metadata) ? message2.metadata : null;
|
|
3996
|
+
if (!metadata) {
|
|
3997
|
+
return null;
|
|
3998
|
+
}
|
|
3999
|
+
const stored = metadata[ENVIRONMENT_REMINDER_METADATA_KEY];
|
|
4000
|
+
if (!isRecord2(stored) || stored.version !== 1) {
|
|
4001
|
+
return null;
|
|
4002
|
+
}
|
|
4003
|
+
return parseEnvironmentSnapshot(stored.snapshot);
|
|
4004
|
+
}
|
|
4005
|
+
function environmentReminder(options) {
|
|
4006
|
+
const getNow = options?.getNow ?? (() => /* @__PURE__ */ new Date());
|
|
4007
|
+
const language = options?.language ?? "English (US)";
|
|
4008
|
+
const timeZone = options?.timeZone ?? "UTC";
|
|
4009
|
+
return reminder(
|
|
4010
|
+
(ctx) => {
|
|
4011
|
+
const snapshot = buildEnvironmentSnapshot(getNow(), {
|
|
4012
|
+
language,
|
|
4013
|
+
timeZone
|
|
4014
|
+
});
|
|
4015
|
+
const previousSnapshot = getEnvironmentSnapshot(ctx.lastMessage);
|
|
4016
|
+
const summary = buildChangeSummary(previousSnapshot, snapshot);
|
|
4017
|
+
return {
|
|
4018
|
+
text: `${summary}${buildEnvironmentBlock(snapshot)}`,
|
|
4019
|
+
metadata: {
|
|
4020
|
+
[ENVIRONMENT_REMINDER_METADATA_KEY]: {
|
|
4021
|
+
version: 1,
|
|
4022
|
+
snapshot
|
|
4023
|
+
}
|
|
4024
|
+
}
|
|
4025
|
+
};
|
|
4026
|
+
},
|
|
4027
|
+
{ when: everyNTurns(1) }
|
|
4028
|
+
);
|
|
4029
|
+
}
|
|
4030
|
+
|
|
3817
4031
|
// packages/context/src/lib/fragments/reasoning.ts
|
|
3818
4032
|
function reasoningFramework() {
|
|
3819
4033
|
return [
|
|
@@ -3922,6 +4136,21 @@ function reasoningFramework() {
|
|
|
3922
4136
|
)
|
|
3923
4137
|
];
|
|
3924
4138
|
}
|
|
4139
|
+
var DEFAULT_SELF_CRITIQUE_CHECKS = [
|
|
4140
|
+
"Did I answer the user's intent, not just their literal words?",
|
|
4141
|
+
"Is every claim grounded in the provided context, schema, or data?",
|
|
4142
|
+
"Did I follow the requested output format and constraints?"
|
|
4143
|
+
];
|
|
4144
|
+
function selfCritique(checks = DEFAULT_SELF_CRITIQUE_CHECKS) {
|
|
4145
|
+
return workflow({
|
|
4146
|
+
task: "Self-critique before returning final response",
|
|
4147
|
+
steps: [
|
|
4148
|
+
"Before returning your final response, review your generated output against the user's original constraints:",
|
|
4149
|
+
...checks.map((check, i) => `${i + 1}. ${check}`),
|
|
4150
|
+
"If any check fails, revise your response before returning it."
|
|
4151
|
+
]
|
|
4152
|
+
});
|
|
4153
|
+
}
|
|
3925
4154
|
|
|
3926
4155
|
// packages/context/src/lib/guardrails/error-recovery.guardrail.ts
|
|
3927
4156
|
import chalk2 from "chalk";
|
|
@@ -7335,6 +7564,7 @@ export {
|
|
|
7335
7564
|
DockerSandboxStrategy,
|
|
7336
7565
|
DockerfileBuildError,
|
|
7337
7566
|
DockerfileStrategy,
|
|
7567
|
+
ENVIRONMENT_REMINDER_METADATA_KEY,
|
|
7338
7568
|
InMemoryContextStore,
|
|
7339
7569
|
LAZY_ID,
|
|
7340
7570
|
MarkdownRenderer,
|
|
@@ -7372,17 +7602,20 @@ export {
|
|
|
7372
7602
|
defaultTokenizer,
|
|
7373
7603
|
discoverSkillsInDirectory,
|
|
7374
7604
|
encodeSerializedValue,
|
|
7605
|
+
environmentReminder,
|
|
7375
7606
|
errorRecoveryGuardrail,
|
|
7376
7607
|
estimate,
|
|
7377
7608
|
everyNTurns,
|
|
7378
7609
|
example,
|
|
7379
7610
|
explain,
|
|
7611
|
+
extractPlainText,
|
|
7380
7612
|
fail,
|
|
7381
7613
|
firstN,
|
|
7382
7614
|
fragment,
|
|
7383
7615
|
fromFragment,
|
|
7384
7616
|
generateChatTitle,
|
|
7385
7617
|
getConditionalReminder,
|
|
7618
|
+
getEnvironmentSnapshot,
|
|
7386
7619
|
getFragmentData,
|
|
7387
7620
|
getModelsRegistry,
|
|
7388
7621
|
getReminderRanges,
|
|
@@ -7399,6 +7632,7 @@ export {
|
|
|
7399
7632
|
isMessageFragment,
|
|
7400
7633
|
lastAssistantMessage,
|
|
7401
7634
|
loadSkillMetadata,
|
|
7635
|
+
mergeMessageMetadata,
|
|
7402
7636
|
mergeReminderMetadata,
|
|
7403
7637
|
message,
|
|
7404
7638
|
nextAdaptivePollingDelay,
|
|
@@ -7419,9 +7653,11 @@ export {
|
|
|
7419
7653
|
reminder,
|
|
7420
7654
|
render,
|
|
7421
7655
|
resetAdaptivePolling,
|
|
7656
|
+
resolveReminder,
|
|
7422
7657
|
resolveReminderText,
|
|
7423
7658
|
role,
|
|
7424
7659
|
runGuardrailChain,
|
|
7660
|
+
selfCritique,
|
|
7425
7661
|
skills,
|
|
7426
7662
|
skillsReminder,
|
|
7427
7663
|
soul,
|