@deepagents/context 0.19.0 → 0.20.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
@@ -29,113 +29,6 @@ function fragment(name, ...children) {
29
29
  data: children
30
30
  };
31
31
  }
32
- var SYSTEM_REMINDER_OPEN_TAG = "<system-reminder>";
33
- var SYSTEM_REMINDER_CLOSE_TAG = "</system-reminder>";
34
- function isRecord(value) {
35
- return typeof value === "object" && value !== null && !Array.isArray(value);
36
- }
37
- function assertReminderText(text) {
38
- if (text.trim().length === 0) {
39
- throw new Error("Reminder text must not be empty");
40
- }
41
- }
42
- function formatTaggedReminder(text) {
43
- return `${SYSTEM_REMINDER_OPEN_TAG}${text}${SYSTEM_REMINDER_CLOSE_TAG}`;
44
- }
45
- function findLastTextPartIndex(message2) {
46
- for (let i = message2.parts.length - 1; i >= 0; i--) {
47
- if (message2.parts[i].type === "text") {
48
- return i;
49
- }
50
- }
51
- return void 0;
52
- }
53
- function ensureTextPart(message2) {
54
- const existingIndex = findLastTextPartIndex(message2);
55
- if (existingIndex !== void 0) {
56
- return existingIndex;
57
- }
58
- const reminderPart = {
59
- type: "text",
60
- text: ""
61
- };
62
- message2.parts.push(reminderPart);
63
- return message2.parts.length - 1;
64
- }
65
- function applyInlineReminder(message2, value) {
66
- const partIndex = ensureTextPart(message2);
67
- const textPart = message2.parts[partIndex];
68
- if (textPart.type !== "text") {
69
- throw new Error("Failed to resolve text part for inline reminder");
70
- }
71
- const reminderText = formatTaggedReminder(value);
72
- const start = textPart.text.length;
73
- const updatedText = `${textPart.text}${reminderText}`;
74
- message2.parts[partIndex] = { ...textPart, text: updatedText };
75
- return {
76
- id: generateId(),
77
- text: value,
78
- partIndex,
79
- start,
80
- end: start + reminderText.length,
81
- mode: "inline"
82
- };
83
- }
84
- function applyPartReminder(message2, value) {
85
- const part = { type: "text", text: value };
86
- message2.parts.push(part);
87
- const partIndex = message2.parts.length - 1;
88
- return {
89
- id: generateId(),
90
- text: value,
91
- partIndex,
92
- start: 0,
93
- end: value.length,
94
- mode: "part"
95
- };
96
- }
97
- function reminder(text, options) {
98
- assertReminderText(text);
99
- return {
100
- text,
101
- asPart: options?.asPart ?? false
102
- };
103
- }
104
- function user(content, ...reminders) {
105
- const message2 = typeof content === "string" ? {
106
- id: generateId(),
107
- role: "user",
108
- parts: [{ type: "text", text: content }]
109
- } : { ...content, role: "user", parts: [...content.parts] };
110
- if (reminders.length > 0) {
111
- const addedReminders = [];
112
- for (const item of reminders) {
113
- assertReminderText(item.text);
114
- addedReminders.push(
115
- item.asPart ? applyPartReminder(message2, item.text) : applyInlineReminder(message2, item.text)
116
- );
117
- }
118
- const metadata = isRecord(message2.metadata) ? { ...message2.metadata } : {};
119
- const existingReminders = Array.isArray(metadata.reminders) ? metadata.reminders : [];
120
- metadata.reminders = [...existingReminders, ...addedReminders];
121
- message2.metadata = metadata;
122
- }
123
- return {
124
- id: message2.id,
125
- name: "user",
126
- data: "content",
127
- type: "message",
128
- persist: true,
129
- codec: {
130
- decode() {
131
- return message2;
132
- },
133
- encode() {
134
- return message2;
135
- }
136
- }
137
- };
138
- }
139
32
  function assistant(message2) {
140
33
  return {
141
34
  id: message2.id,
@@ -2362,6 +2255,145 @@ function policy(input) {
2362
2255
  };
2363
2256
  }
2364
2257
 
2258
+ // packages/context/src/lib/fragments/message/user.ts
2259
+ import { generateId as generateId3 } from "ai";
2260
+ var SYSTEM_REMINDER_OPEN_TAG = "<system-reminder>";
2261
+ var SYSTEM_REMINDER_CLOSE_TAG = "</system-reminder>";
2262
+ function getReminderRanges(metadata) {
2263
+ return metadata?.reminders ?? [];
2264
+ }
2265
+ function stripTextByRanges(text, ranges) {
2266
+ if (ranges.length === 0) {
2267
+ return text;
2268
+ }
2269
+ const normalized = ranges.map((range) => ({
2270
+ start: Math.max(0, Math.min(text.length, range.start)),
2271
+ end: Math.max(0, Math.min(text.length, range.end))
2272
+ })).filter((range) => range.end > range.start).sort((a, b) => a.start - b.start);
2273
+ if (normalized.length === 0) {
2274
+ return text;
2275
+ }
2276
+ let cursor = 0;
2277
+ let output = "";
2278
+ for (const range of normalized) {
2279
+ if (range.start < cursor) {
2280
+ if (range.end > cursor) {
2281
+ cursor = range.end;
2282
+ }
2283
+ continue;
2284
+ }
2285
+ output += text.slice(cursor, range.start);
2286
+ cursor = range.end;
2287
+ }
2288
+ output += text.slice(cursor);
2289
+ return output.trimEnd();
2290
+ }
2291
+ function isRecord(value) {
2292
+ return typeof value === "object" && value !== null && !Array.isArray(value);
2293
+ }
2294
+ function assertReminderText(text) {
2295
+ if (text.trim().length === 0) {
2296
+ throw new Error("Reminder text must not be empty");
2297
+ }
2298
+ }
2299
+ function formatTaggedReminder(text) {
2300
+ return `${SYSTEM_REMINDER_OPEN_TAG}${text}${SYSTEM_REMINDER_CLOSE_TAG}`;
2301
+ }
2302
+ function findLastTextPartIndex(message2) {
2303
+ for (let i = message2.parts.length - 1; i >= 0; i--) {
2304
+ if (message2.parts[i].type === "text") {
2305
+ return i;
2306
+ }
2307
+ }
2308
+ return void 0;
2309
+ }
2310
+ function ensureTextPart(message2) {
2311
+ const existingIndex = findLastTextPartIndex(message2);
2312
+ if (existingIndex !== void 0) {
2313
+ return existingIndex;
2314
+ }
2315
+ const reminderPart = {
2316
+ type: "text",
2317
+ text: ""
2318
+ };
2319
+ message2.parts.push(reminderPart);
2320
+ return message2.parts.length - 1;
2321
+ }
2322
+ function applyInlineReminder(message2, value) {
2323
+ const partIndex = ensureTextPart(message2);
2324
+ const textPart = message2.parts[partIndex];
2325
+ if (textPart.type !== "text") {
2326
+ throw new Error("Failed to resolve text part for inline reminder");
2327
+ }
2328
+ const reminderText = formatTaggedReminder(value);
2329
+ const start = textPart.text.length;
2330
+ const updatedText = `${textPart.text}${reminderText}`;
2331
+ message2.parts[partIndex] = { ...textPart, text: updatedText };
2332
+ return {
2333
+ id: generateId3(),
2334
+ text: value,
2335
+ partIndex,
2336
+ start,
2337
+ end: start + reminderText.length,
2338
+ mode: "inline"
2339
+ };
2340
+ }
2341
+ function applyPartReminder(message2, value) {
2342
+ const part = { type: "text", text: value };
2343
+ message2.parts.push(part);
2344
+ const partIndex = message2.parts.length - 1;
2345
+ return {
2346
+ id: generateId3(),
2347
+ text: value,
2348
+ partIndex,
2349
+ start: 0,
2350
+ end: value.length,
2351
+ mode: "part"
2352
+ };
2353
+ }
2354
+ function reminder(text, options) {
2355
+ assertReminderText(text);
2356
+ return {
2357
+ text,
2358
+ asPart: options?.asPart ?? false
2359
+ };
2360
+ }
2361
+ function user(content, ...reminders) {
2362
+ const message2 = typeof content === "string" ? {
2363
+ id: generateId3(),
2364
+ role: "user",
2365
+ parts: [{ type: "text", text: content }]
2366
+ } : { ...content, role: "user", parts: [...content.parts] };
2367
+ if (reminders.length > 0) {
2368
+ const addedReminders = [];
2369
+ for (const item of reminders) {
2370
+ assertReminderText(item.text);
2371
+ addedReminders.push(
2372
+ item.asPart ? applyPartReminder(message2, item.text) : applyInlineReminder(message2, item.text)
2373
+ );
2374
+ }
2375
+ const metadata = isRecord(message2.metadata) ? { ...message2.metadata } : {};
2376
+ const existingReminders = Array.isArray(metadata.reminders) ? metadata.reminders : [];
2377
+ metadata.reminders = [...existingReminders, ...addedReminders];
2378
+ message2.metadata = metadata;
2379
+ }
2380
+ return {
2381
+ id: message2.id,
2382
+ name: "user",
2383
+ data: "content",
2384
+ type: "message",
2385
+ persist: true,
2386
+ codec: {
2387
+ decode() {
2388
+ return message2;
2389
+ },
2390
+ encode() {
2391
+ return message2;
2392
+ }
2393
+ }
2394
+ };
2395
+ }
2396
+
2365
2397
  // packages/context/src/lib/fragments/user.ts
2366
2398
  function identity(input) {
2367
2399
  return {
@@ -6322,6 +6354,7 @@ export {
6322
6354
  fail,
6323
6355
  fragment,
6324
6356
  getModelsRegistry,
6357
+ getReminderRanges,
6325
6358
  glossary,
6326
6359
  guardrail,
6327
6360
  hint,
@@ -6354,6 +6387,7 @@ export {
6354
6387
  skills,
6355
6388
  soul,
6356
6389
  stop,
6390
+ stripTextByRanges,
6357
6391
  structuredOutput,
6358
6392
  styleGuide,
6359
6393
  term,