@farazirfan/costar-server-executor 1.6.0 → 1.7.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/agent/agent.d.ts +14 -0
- package/dist/agent/agent.d.ts.map +1 -1
- package/dist/agent/agent.js +57 -2
- package/dist/agent/agent.js.map +1 -1
- package/dist/agent/pi-embedded-runner/system-prompt.d.ts +4 -1
- package/dist/agent/pi-embedded-runner/system-prompt.d.ts.map +1 -1
- package/dist/agent/pi-embedded-runner/system-prompt.js +104 -17
- package/dist/agent/pi-embedded-runner/system-prompt.js.map +1 -1
- package/dist/agent/pi-embedded-runner/tools.d.ts +10 -0
- package/dist/agent/pi-embedded-runner/tools.d.ts.map +1 -1
- package/dist/agent/pi-embedded-runner/tools.js +67 -0
- package/dist/agent/pi-embedded-runner/tools.js.map +1 -1
- package/dist/config/types.d.ts +13 -0
- package/dist/config/types.d.ts.map +1 -1
- package/dist/heartbeat/runner.d.ts +10 -8
- package/dist/heartbeat/runner.d.ts.map +1 -1
- package/dist/heartbeat/runner.js +124 -47
- package/dist/heartbeat/runner.js.map +1 -1
- package/dist/memory/curation-state.d.ts +51 -0
- package/dist/memory/curation-state.d.ts.map +1 -0
- package/dist/memory/curation-state.js +82 -0
- package/dist/memory/curation-state.js.map +1 -0
- package/dist/memory/curator.d.ts +73 -0
- package/dist/memory/curator.d.ts.map +1 -0
- package/dist/memory/curator.js +198 -0
- package/dist/memory/curator.js.map +1 -0
- package/dist/memory/daily-log.d.ts +56 -0
- package/dist/memory/daily-log.d.ts.map +1 -0
- package/dist/memory/daily-log.js +176 -0
- package/dist/memory/daily-log.js.map +1 -0
- package/dist/memory/index.d.ts +10 -0
- package/dist/memory/index.d.ts.map +1 -0
- package/dist/memory/index.js +13 -0
- package/dist/memory/index.js.map +1 -0
- package/dist/supabase/index.d.ts +2 -2
- package/dist/supabase/index.d.ts.map +1 -1
- package/dist/supabase/index.js +2 -2
- package/dist/supabase/index.js.map +1 -1
- package/dist/supabase/notifications.d.ts.map +1 -1
- package/dist/supabase/notifications.js +10 -1
- package/dist/supabase/notifications.js.map +1 -1
- package/dist/supabase/requests.d.ts +10 -0
- package/dist/supabase/requests.d.ts.map +1 -1
- package/dist/supabase/requests.js +34 -0
- package/dist/supabase/requests.js.map +1 -1
- package/dist/supabase/workspace-storage.d.ts +41 -0
- package/dist/supabase/workspace-storage.d.ts.map +1 -1
- package/dist/supabase/workspace-storage.js +126 -0
- package/dist/supabase/workspace-storage.js.map +1 -1
- package/dist/tools/message.d.ts +8 -2
- package/dist/tools/message.d.ts.map +1 -1
- package/dist/tools/message.js +183 -9
- package/dist/tools/message.js.map +1 -1
- package/dist/workspace/templates.d.ts +3 -3
- package/dist/workspace/templates.d.ts.map +1 -1
- package/dist/workspace/templates.js +97 -69
- package/dist/workspace/templates.js.map +1 -1
- package/dist/workspace/workspace.d.ts +2 -1
- package/dist/workspace/workspace.d.ts.map +1 -1
- package/dist/workspace/workspace.js +19 -4
- package/dist/workspace/workspace.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,198 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CoStar Server Executor - Memory Curator
|
|
3
|
+
*
|
|
4
|
+
* Incremental, cursor-based memory curation.
|
|
5
|
+
* Fetches only new/unprocessed data (client conversations + daily logs),
|
|
6
|
+
* builds a compact digest, and produces a curation prompt to append to heartbeats.
|
|
7
|
+
*
|
|
8
|
+
* The LLM then processes the digest and updates MEMORY.md, USER.md,
|
|
9
|
+
* and the daily log in a single heartbeat turn.
|
|
10
|
+
*/
|
|
11
|
+
import { getNewUserRequestsSince } from "../supabase/requests.js";
|
|
12
|
+
import { readDailyLogSince, todayDateString } from "./daily-log.js";
|
|
13
|
+
/**
|
|
14
|
+
* Fetch unprocessed data since the last curation cursors.
|
|
15
|
+
*
|
|
16
|
+
* 1. Queries user_requests after lastProcessedRequestAt (new client conversations)
|
|
17
|
+
* 2. Reads today's daily log from lastProcessedLogSize offset (new LLM-written entries)
|
|
18
|
+
* Also checks yesterday if lastProcessedLogDate != today (handles midnight rollover)
|
|
19
|
+
* 3. Returns only the delta — if both empty, hasNewData = false
|
|
20
|
+
*
|
|
21
|
+
* @param userId - User ID for querying conversations
|
|
22
|
+
* @param workspaceDir - Workspace root for reading daily logs
|
|
23
|
+
* @param state - Current curation state (cursors)
|
|
24
|
+
* @param maxConversations - Max conversations to fetch per curation cycle
|
|
25
|
+
* @returns The delta of new data
|
|
26
|
+
*/
|
|
27
|
+
export async function fetchUnprocessedData(userId, workspaceDir, state, maxConversations = 20) {
|
|
28
|
+
// 1. Fetch new client conversations from user_requests
|
|
29
|
+
const newConversations = [];
|
|
30
|
+
try {
|
|
31
|
+
const rows = await getNewUserRequestsSince(userId, state.lastProcessedRequestAt, maxConversations);
|
|
32
|
+
for (const row of rows) {
|
|
33
|
+
newConversations.push({
|
|
34
|
+
id: row.id,
|
|
35
|
+
request: row.request,
|
|
36
|
+
response: row.response ?? null,
|
|
37
|
+
createdAt: row.created_at,
|
|
38
|
+
});
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
catch (err) {
|
|
42
|
+
console.warn("[MEMORY] Failed to fetch new user requests:", err);
|
|
43
|
+
}
|
|
44
|
+
// 2. Read new daily log content
|
|
45
|
+
let newLogContent = "";
|
|
46
|
+
const today = todayDateString();
|
|
47
|
+
try {
|
|
48
|
+
// If the last processed log was from a previous day, read yesterday's remaining content
|
|
49
|
+
if (state.lastProcessedLogDate && state.lastProcessedLogDate !== today) {
|
|
50
|
+
const yesterdayResult = readDailyLogSince(workspaceDir, state.lastProcessedLogDate, state.lastProcessedLogSize);
|
|
51
|
+
if (yesterdayResult.content) {
|
|
52
|
+
newLogContent += yesterdayResult.content;
|
|
53
|
+
}
|
|
54
|
+
// For today's log, start from 0 since we haven't read it yet
|
|
55
|
+
const todayResult = readDailyLogSince(workspaceDir, today, 0);
|
|
56
|
+
if (todayResult.content) {
|
|
57
|
+
newLogContent += (newLogContent ? "\n\n" : "") + todayResult.content;
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
else {
|
|
61
|
+
// Same day or first run — read from last offset
|
|
62
|
+
const offset = state.lastProcessedLogDate === today ? state.lastProcessedLogSize : 0;
|
|
63
|
+
const result = readDailyLogSince(workspaceDir, today, offset);
|
|
64
|
+
if (result.content) {
|
|
65
|
+
newLogContent = result.content;
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
catch (err) {
|
|
70
|
+
console.warn("[MEMORY] Failed to read daily log:", err);
|
|
71
|
+
}
|
|
72
|
+
const hasNewData = newConversations.length > 0 || newLogContent.length > 0;
|
|
73
|
+
return {
|
|
74
|
+
newConversations,
|
|
75
|
+
newLogContent: newLogContent.trim(),
|
|
76
|
+
hasNewData,
|
|
77
|
+
};
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Build a compact markdown digest from the curation delta.
|
|
81
|
+
* Caps total content at maxChars to keep the heartbeat prompt small.
|
|
82
|
+
*
|
|
83
|
+
* @param delta - The curation delta
|
|
84
|
+
* @param maxChars - Maximum characters for the digest (default: 3000)
|
|
85
|
+
* @returns Formatted markdown digest string
|
|
86
|
+
*/
|
|
87
|
+
export function buildCurationDigest(delta, maxChars = 3000) {
|
|
88
|
+
const parts = [];
|
|
89
|
+
// Format new conversations
|
|
90
|
+
if (delta.newConversations.length > 0) {
|
|
91
|
+
parts.push(`### User Conversations (${delta.newConversations.length} new)`);
|
|
92
|
+
for (const conv of delta.newConversations) {
|
|
93
|
+
const timestamp = conv.createdAt.slice(0, 16).replace("T", " ");
|
|
94
|
+
const request = truncate(conv.request, 200);
|
|
95
|
+
const response = conv.response ? truncate(conv.response, 300) : "(no response)";
|
|
96
|
+
parts.push(`**[${timestamp}]** User: ${request}`);
|
|
97
|
+
parts.push(`Response: ${response}`);
|
|
98
|
+
parts.push("");
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
// Format new daily log content
|
|
102
|
+
if (delta.newLogContent) {
|
|
103
|
+
parts.push("### Server Activity (new daily log entries)");
|
|
104
|
+
parts.push(delta.newLogContent);
|
|
105
|
+
}
|
|
106
|
+
let digest = parts.join("\n");
|
|
107
|
+
// Trim if over budget
|
|
108
|
+
if (digest.length > maxChars) {
|
|
109
|
+
digest = digest.slice(0, maxChars - 50) + "\n\n[... digest truncated ...]";
|
|
110
|
+
}
|
|
111
|
+
return digest;
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* Build the curation prompt to append to the heartbeat message.
|
|
115
|
+
* Only called when new data exists.
|
|
116
|
+
*
|
|
117
|
+
* @param digest - The formatted digest from buildCurationDigest()
|
|
118
|
+
* @returns Full curation instructions + digest
|
|
119
|
+
*/
|
|
120
|
+
export function buildCurationPrompt(digest) {
|
|
121
|
+
return `
|
|
122
|
+
MEMORY CURATION + PROACTIVE SIGNALS: New activity since your last check is below.
|
|
123
|
+
|
|
124
|
+
MEMORY CURATION — review and update:
|
|
125
|
+
1. Update MEMORY.md with new facts, preferences, decisions, or lessons worth keeping.
|
|
126
|
+
2. Update USER.md if you learned something new about the user.
|
|
127
|
+
3. Write today's notes to memory/${todayDateString()}.md (create memory/ dir if needed).
|
|
128
|
+
4. Do NOT duplicate what's already in MEMORY.md or USER.md.
|
|
129
|
+
5. Keep MEMORY.md concise — it is loaded in every session's system prompt.
|
|
130
|
+
6. Remove outdated entries from MEMORY.md if no longer relevant.
|
|
131
|
+
7. Conversations below are from the user's mobile app — treat as context, don't re-execute.
|
|
132
|
+
|
|
133
|
+
PROACTIVE ACTION — analyze the activity below and cross-reference with what you know from MEMORY.md and USER.md. Think about what a thoughtful human assistant would do — not just monitoring, but real, substantive help:
|
|
134
|
+
|
|
135
|
+
TAKE ACTION NOW (during this heartbeat turn) when you spot opportunities to:
|
|
136
|
+
8. Do research the user would find valuable (competitor analysis, market trends, topic deep-dives)
|
|
137
|
+
9. Create useful documents (meeting prep notes, trip itineraries, project summaries, comparison tables)
|
|
138
|
+
10. Prepare for upcoming events (gather context for tomorrow's meeting, draft agendas, check travel details)
|
|
139
|
+
11. Follow up on things the user started but didn't finish (drafts, half-explored ideas, pending decisions)
|
|
140
|
+
12. Find information the user will need soon (based on their calendar, projects, or recent conversations)
|
|
141
|
+
Save substantial outputs to /home/user/task/ (auto-synced to user's device) and notify via message tool.
|
|
142
|
+
|
|
143
|
+
UPDATE HEARTBEAT.md for ongoing monitoring when you detect:
|
|
144
|
+
13. Recurring interests worth periodic checking (stocks, products, topics, people)
|
|
145
|
+
14. Things the user is waiting on (replies, deliveries, results, approvals)
|
|
146
|
+
15. Deadlines or events that need tracking over time
|
|
147
|
+
16. Behavioral patterns worth supporting (daily routines, recurring needs)
|
|
148
|
+
Read HEARTBEAT.md first, then add: "- [ ] Check X — alert user if Y"
|
|
149
|
+
|
|
150
|
+
HEARTBEAT.md RULES:
|
|
151
|
+
17. Do NOT add items already in HEARTBEAT.md — check before adding.
|
|
152
|
+
18. Remove stale or resolved items (event passed, task done, user said stop).
|
|
153
|
+
19. PRESERVE items the user added via the app — never remove user-requested monitoring.
|
|
154
|
+
20. Keep under 10 items — each costs tokens every 30 minutes.
|
|
155
|
+
21. If nothing warrants action or monitoring, that's fine. Don't force it.
|
|
156
|
+
|
|
157
|
+
## New Since Last Check
|
|
158
|
+
${digest}
|
|
159
|
+
`.trim();
|
|
160
|
+
}
|
|
161
|
+
/**
|
|
162
|
+
* Compute updated cursor state after a curation cycle.
|
|
163
|
+
*
|
|
164
|
+
* @param state - Previous curation state
|
|
165
|
+
* @param delta - The delta that was just processed
|
|
166
|
+
* @param workspaceDir - Workspace root for reading current log size
|
|
167
|
+
* @returns New curation state with updated cursors
|
|
168
|
+
*/
|
|
169
|
+
export function updatedCursors(state, delta, workspaceDir) {
|
|
170
|
+
const today = todayDateString();
|
|
171
|
+
const newState = { ...state };
|
|
172
|
+
// Update conversation cursor to the last processed request
|
|
173
|
+
if (delta.newConversations.length > 0) {
|
|
174
|
+
const lastConv = delta.newConversations[delta.newConversations.length - 1];
|
|
175
|
+
newState.lastProcessedRequestId = lastConv.id;
|
|
176
|
+
newState.lastProcessedRequestAt = lastConv.createdAt;
|
|
177
|
+
}
|
|
178
|
+
// Update daily log cursor to today's current file size
|
|
179
|
+
const todayLogResult = readDailyLogSince(workspaceDir, today, 0);
|
|
180
|
+
newState.lastProcessedLogDate = today;
|
|
181
|
+
newState.lastProcessedLogSize = todayLogResult.newSize;
|
|
182
|
+
// Increment total entries curated
|
|
183
|
+
newState.totalEntriesCurated += delta.newConversations.length;
|
|
184
|
+
if (delta.newLogContent.length > 0) {
|
|
185
|
+
newState.totalEntriesCurated += 1; // Count new log content as one entry
|
|
186
|
+
}
|
|
187
|
+
return newState;
|
|
188
|
+
}
|
|
189
|
+
// ---------- Helpers ----------
|
|
190
|
+
/**
|
|
191
|
+
* Truncate a string to maxLen, adding ellipsis if truncated.
|
|
192
|
+
*/
|
|
193
|
+
function truncate(text, maxLen) {
|
|
194
|
+
if (text.length <= maxLen)
|
|
195
|
+
return text;
|
|
196
|
+
return text.slice(0, maxLen - 3) + "...";
|
|
197
|
+
}
|
|
198
|
+
//# sourceMappingURL=curator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"curator.js","sourceRoot":"","sources":["../../src/memory/curator.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CoStar Server Executor - Daily Log Utilities
|
|
3
|
+
*
|
|
4
|
+
* Reads and prunes LLM-written daily log files (memory/YYYY-MM-DD.md).
|
|
5
|
+
* The LLM writes to these files via write/edit tools during heartbeat turns —
|
|
6
|
+
* no programmatic append logic here.
|
|
7
|
+
*
|
|
8
|
+
* Following OpenClaw's pattern: daily logs are free-form markdown written by the LLM.
|
|
9
|
+
*/
|
|
10
|
+
/**
|
|
11
|
+
* Ensure the memory/ directory exists inside the workspace.
|
|
12
|
+
* Called during workspace bootstrap.
|
|
13
|
+
*/
|
|
14
|
+
export declare function ensureMemoryDir(workspaceDir: string): string;
|
|
15
|
+
/**
|
|
16
|
+
* Read a daily log file starting from a byte offset.
|
|
17
|
+
* Returns only the new content appended since the last read.
|
|
18
|
+
*
|
|
19
|
+
* @param workspaceDir - Workspace root directory
|
|
20
|
+
* @param date - Date string in YYYY-MM-DD format
|
|
21
|
+
* @param byteOffset - Byte offset to start reading from (0 = read entire file)
|
|
22
|
+
* @returns Object with new content and the current file size
|
|
23
|
+
*/
|
|
24
|
+
export declare function readDailyLogSince(workspaceDir: string, date: string, byteOffset?: number): {
|
|
25
|
+
content: string;
|
|
26
|
+
newSize: number;
|
|
27
|
+
};
|
|
28
|
+
/**
|
|
29
|
+
* List all daily log files in the memory/ directory, sorted by date ascending.
|
|
30
|
+
*
|
|
31
|
+
* @param workspaceDir - Workspace root directory
|
|
32
|
+
* @returns Sorted array of filenames (e.g., ["2026-02-05.md", "2026-02-06.md"])
|
|
33
|
+
*/
|
|
34
|
+
export declare function listDailyLogFiles(workspaceDir: string): string[];
|
|
35
|
+
/**
|
|
36
|
+
* Prune local daily log files older than keepDays.
|
|
37
|
+
*
|
|
38
|
+
* @param workspaceDir - Workspace root directory
|
|
39
|
+
* @param keepDays - Number of days to retain (default: 7)
|
|
40
|
+
* @returns Array of deleted filenames
|
|
41
|
+
*/
|
|
42
|
+
export declare function pruneOldDailyLogs(workspaceDir: string, keepDays?: number): string[];
|
|
43
|
+
/**
|
|
44
|
+
* Prune old daily log files from Supabase Storage.
|
|
45
|
+
* Lists memory/ files in the user's Storage bucket and deletes those older than keepDays.
|
|
46
|
+
*
|
|
47
|
+
* @param userId - User ID for Storage path
|
|
48
|
+
* @param keepDays - Number of days to retain (default: 7)
|
|
49
|
+
* @returns Array of deleted storage paths
|
|
50
|
+
*/
|
|
51
|
+
export declare function pruneOldDailyLogsFromStorage(userId: string, keepDays?: number): Promise<string[]>;
|
|
52
|
+
/**
|
|
53
|
+
* Get today's date string in YYYY-MM-DD format.
|
|
54
|
+
*/
|
|
55
|
+
export declare function todayDateString(): string;
|
|
56
|
+
//# sourceMappingURL=daily-log.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"daily-log.d.ts","sourceRoot":"","sources":["../../src/memory/daily-log.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAaH;;;GAGG;AACH,wBAAgB,eAAe,CAAC,YAAY,EAAE,MAAM,GAAG,MAAM,CAO5D;AAED;;;;;;;;GAQG;AACH,wBAAgB,iBAAiB,CAC/B,YAAY,EAAE,MAAM,EACpB,IAAI,EAAE,MAAM,EACZ,UAAU,GAAE,MAAU,GACrB;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CA0BtC;AAED;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,YAAY,EAAE,MAAM,GAAG,MAAM,EAAE,CAchE;AAED;;;;;;GAMG;AACH,wBAAgB,iBAAiB,CAC/B,YAAY,EAAE,MAAM,EACpB,QAAQ,GAAE,MAAU,GACnB,MAAM,EAAE,CA6BV;AAED;;;;;;;GAOG;AACH,wBAAsB,4BAA4B,CAChD,MAAM,EAAE,MAAM,EACd,QAAQ,GAAE,MAAU,GACnB,OAAO,CAAC,MAAM,EAAE,CAAC,CAoDnB;AAED;;GAEG;AACH,wBAAgB,eAAe,IAAI,MAAM,CAExC"}
|
|
@@ -0,0 +1,176 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CoStar Server Executor - Daily Log Utilities
|
|
3
|
+
*
|
|
4
|
+
* Reads and prunes LLM-written daily log files (memory/YYYY-MM-DD.md).
|
|
5
|
+
* The LLM writes to these files via write/edit tools during heartbeat turns —
|
|
6
|
+
* no programmatic append logic here.
|
|
7
|
+
*
|
|
8
|
+
* Following OpenClaw's pattern: daily logs are free-form markdown written by the LLM.
|
|
9
|
+
*/
|
|
10
|
+
import fs from "node:fs";
|
|
11
|
+
import path from "node:path";
|
|
12
|
+
import { getSupabase } from "../supabase/client.js";
|
|
13
|
+
import { isSupabaseInitialized } from "../supabase/client.js";
|
|
14
|
+
/** Name of the memory subdirectory inside the workspace */
|
|
15
|
+
const MEMORY_DIR = "memory";
|
|
16
|
+
/** Storage bucket name (same as workspace-storage.ts) */
|
|
17
|
+
const WORKSPACE_BUCKET = "costar";
|
|
18
|
+
/**
|
|
19
|
+
* Ensure the memory/ directory exists inside the workspace.
|
|
20
|
+
* Called during workspace bootstrap.
|
|
21
|
+
*/
|
|
22
|
+
export function ensureMemoryDir(workspaceDir) {
|
|
23
|
+
const memDir = path.join(workspaceDir, MEMORY_DIR);
|
|
24
|
+
if (!fs.existsSync(memDir)) {
|
|
25
|
+
fs.mkdirSync(memDir, { recursive: true });
|
|
26
|
+
console.log(`[MEMORY] Created memory directory: ${memDir}`);
|
|
27
|
+
}
|
|
28
|
+
return memDir;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Read a daily log file starting from a byte offset.
|
|
32
|
+
* Returns only the new content appended since the last read.
|
|
33
|
+
*
|
|
34
|
+
* @param workspaceDir - Workspace root directory
|
|
35
|
+
* @param date - Date string in YYYY-MM-DD format
|
|
36
|
+
* @param byteOffset - Byte offset to start reading from (0 = read entire file)
|
|
37
|
+
* @returns Object with new content and the current file size
|
|
38
|
+
*/
|
|
39
|
+
export function readDailyLogSince(workspaceDir, date, byteOffset = 0) {
|
|
40
|
+
const filePath = path.join(workspaceDir, MEMORY_DIR, `${date}.md`);
|
|
41
|
+
if (!fs.existsSync(filePath)) {
|
|
42
|
+
return { content: "", newSize: byteOffset };
|
|
43
|
+
}
|
|
44
|
+
const stat = fs.statSync(filePath);
|
|
45
|
+
const fileSize = stat.size;
|
|
46
|
+
// No new content since last read
|
|
47
|
+
if (byteOffset >= fileSize) {
|
|
48
|
+
return { content: "", newSize: byteOffset };
|
|
49
|
+
}
|
|
50
|
+
// Read from offset to end of file
|
|
51
|
+
const fd = fs.openSync(filePath, "r");
|
|
52
|
+
try {
|
|
53
|
+
const bufferSize = fileSize - byteOffset;
|
|
54
|
+
const buffer = Buffer.alloc(bufferSize);
|
|
55
|
+
fs.readSync(fd, buffer, 0, bufferSize, byteOffset);
|
|
56
|
+
const content = buffer.toString("utf-8");
|
|
57
|
+
return { content, newSize: fileSize };
|
|
58
|
+
}
|
|
59
|
+
finally {
|
|
60
|
+
fs.closeSync(fd);
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* List all daily log files in the memory/ directory, sorted by date ascending.
|
|
65
|
+
*
|
|
66
|
+
* @param workspaceDir - Workspace root directory
|
|
67
|
+
* @returns Sorted array of filenames (e.g., ["2026-02-05.md", "2026-02-06.md"])
|
|
68
|
+
*/
|
|
69
|
+
export function listDailyLogFiles(workspaceDir) {
|
|
70
|
+
const memDir = path.join(workspaceDir, MEMORY_DIR);
|
|
71
|
+
if (!fs.existsSync(memDir)) {
|
|
72
|
+
return [];
|
|
73
|
+
}
|
|
74
|
+
const files = fs.readdirSync(memDir);
|
|
75
|
+
// Filter for YYYY-MM-DD.md pattern and sort ascending
|
|
76
|
+
const datePattern = /^\d{4}-\d{2}-\d{2}\.md$/;
|
|
77
|
+
return files
|
|
78
|
+
.filter((f) => datePattern.test(f))
|
|
79
|
+
.sort();
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Prune local daily log files older than keepDays.
|
|
83
|
+
*
|
|
84
|
+
* @param workspaceDir - Workspace root directory
|
|
85
|
+
* @param keepDays - Number of days to retain (default: 7)
|
|
86
|
+
* @returns Array of deleted filenames
|
|
87
|
+
*/
|
|
88
|
+
export function pruneOldDailyLogs(workspaceDir, keepDays = 7) {
|
|
89
|
+
const files = listDailyLogFiles(workspaceDir);
|
|
90
|
+
if (files.length === 0)
|
|
91
|
+
return [];
|
|
92
|
+
const cutoff = new Date();
|
|
93
|
+
cutoff.setDate(cutoff.getDate() - keepDays);
|
|
94
|
+
cutoff.setHours(0, 0, 0, 0);
|
|
95
|
+
const cutoffStr = cutoff.toISOString().slice(0, 10); // YYYY-MM-DD
|
|
96
|
+
const deleted = [];
|
|
97
|
+
const memDir = path.join(workspaceDir, MEMORY_DIR);
|
|
98
|
+
for (const file of files) {
|
|
99
|
+
const dateStr = file.replace(".md", "");
|
|
100
|
+
if (dateStr < cutoffStr) {
|
|
101
|
+
try {
|
|
102
|
+
fs.unlinkSync(path.join(memDir, file));
|
|
103
|
+
deleted.push(file);
|
|
104
|
+
}
|
|
105
|
+
catch (err) {
|
|
106
|
+
console.warn(`[MEMORY] Failed to delete local log ${file}:`, err);
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
if (deleted.length > 0) {
|
|
111
|
+
console.log(`[MEMORY] Pruned ${deleted.length} old daily logs: ${deleted.join(", ")}`);
|
|
112
|
+
}
|
|
113
|
+
return deleted;
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* Prune old daily log files from Supabase Storage.
|
|
117
|
+
* Lists memory/ files in the user's Storage bucket and deletes those older than keepDays.
|
|
118
|
+
*
|
|
119
|
+
* @param userId - User ID for Storage path
|
|
120
|
+
* @param keepDays - Number of days to retain (default: 7)
|
|
121
|
+
* @returns Array of deleted storage paths
|
|
122
|
+
*/
|
|
123
|
+
export async function pruneOldDailyLogsFromStorage(userId, keepDays = 7) {
|
|
124
|
+
if (!isSupabaseInitialized())
|
|
125
|
+
return [];
|
|
126
|
+
const supabase = getSupabase();
|
|
127
|
+
const storagePath = `${userId}/memory`;
|
|
128
|
+
try {
|
|
129
|
+
// List all files in the user's memory/ directory
|
|
130
|
+
const { data: files, error } = await supabase.storage
|
|
131
|
+
.from(WORKSPACE_BUCKET)
|
|
132
|
+
.list(storagePath);
|
|
133
|
+
if (error) {
|
|
134
|
+
console.warn(`[MEMORY] Failed to list Storage memory files:`, error.message);
|
|
135
|
+
return [];
|
|
136
|
+
}
|
|
137
|
+
if (!files || files.length === 0)
|
|
138
|
+
return [];
|
|
139
|
+
const cutoff = new Date();
|
|
140
|
+
cutoff.setDate(cutoff.getDate() - keepDays);
|
|
141
|
+
cutoff.setHours(0, 0, 0, 0);
|
|
142
|
+
const cutoffStr = cutoff.toISOString().slice(0, 10);
|
|
143
|
+
const datePattern = /^\d{4}-\d{2}-\d{2}\.md$/;
|
|
144
|
+
const toDelete = [];
|
|
145
|
+
for (const file of files) {
|
|
146
|
+
if (!datePattern.test(file.name))
|
|
147
|
+
continue;
|
|
148
|
+
const dateStr = file.name.replace(".md", "");
|
|
149
|
+
if (dateStr < cutoffStr) {
|
|
150
|
+
toDelete.push(`${storagePath}/${file.name}`);
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
if (toDelete.length === 0)
|
|
154
|
+
return [];
|
|
155
|
+
const { error: deleteError } = await supabase.storage
|
|
156
|
+
.from(WORKSPACE_BUCKET)
|
|
157
|
+
.remove(toDelete);
|
|
158
|
+
if (deleteError) {
|
|
159
|
+
console.warn(`[MEMORY] Failed to delete old Storage logs:`, deleteError.message);
|
|
160
|
+
return [];
|
|
161
|
+
}
|
|
162
|
+
console.log(`[MEMORY] Pruned ${toDelete.length} old daily logs from Storage`);
|
|
163
|
+
return toDelete;
|
|
164
|
+
}
|
|
165
|
+
catch (err) {
|
|
166
|
+
console.warn(`[MEMORY] Error pruning Storage daily logs:`, err);
|
|
167
|
+
return [];
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
/**
|
|
171
|
+
* Get today's date string in YYYY-MM-DD format.
|
|
172
|
+
*/
|
|
173
|
+
export function todayDateString() {
|
|
174
|
+
return new Date().toISOString().slice(0, 10);
|
|
175
|
+
}
|
|
176
|
+
//# sourceMappingURL=daily-log.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"daily-log.js","sourceRoot":"","sources":["../../src/memory/daily-log.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CoStar Server Executor - Memory Module
|
|
3
|
+
*
|
|
4
|
+
* Incremental, cursor-based memory curation system.
|
|
5
|
+
* LLM-written daily logs + automatic curation into MEMORY.md and USER.md.
|
|
6
|
+
*/
|
|
7
|
+
export { ensureMemoryDir, readDailyLogSince, listDailyLogFiles, pruneOldDailyLogs, pruneOldDailyLogsFromStorage, todayDateString, } from "./daily-log.js";
|
|
8
|
+
export { loadCurationState, saveCurationState, shouldPrune, type CurationState, } from "./curation-state.js";
|
|
9
|
+
export { fetchUnprocessedData, buildCurationDigest, buildCurationPrompt, updatedCursors, type CurationDelta, type ConversationEntry, } from "./curator.js";
|
|
10
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/memory/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,EACL,eAAe,EACf,iBAAiB,EACjB,iBAAiB,EACjB,iBAAiB,EACjB,4BAA4B,EAC5B,eAAe,GAChB,MAAM,gBAAgB,CAAC;AAGxB,OAAO,EACL,iBAAiB,EACjB,iBAAiB,EACjB,WAAW,EACX,KAAK,aAAa,GACnB,MAAM,qBAAqB,CAAC;AAG7B,OAAO,EACL,oBAAoB,EACpB,mBAAmB,EACnB,mBAAmB,EACnB,cAAc,EACd,KAAK,aAAa,EAClB,KAAK,iBAAiB,GACvB,MAAM,cAAc,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CoStar Server Executor - Memory Module
|
|
3
|
+
*
|
|
4
|
+
* Incremental, cursor-based memory curation system.
|
|
5
|
+
* LLM-written daily logs + automatic curation into MEMORY.md and USER.md.
|
|
6
|
+
*/
|
|
7
|
+
// Daily log utilities (read + prune only — LLM writes via tools)
|
|
8
|
+
export { ensureMemoryDir, readDailyLogSince, listDailyLogFiles, pruneOldDailyLogs, pruneOldDailyLogsFromStorage, todayDateString, } from "./daily-log.js";
|
|
9
|
+
// Curation state (cursor tracking)
|
|
10
|
+
export { loadCurationState, saveCurationState, shouldPrune, } from "./curation-state.js";
|
|
11
|
+
// Memory curator (fetch delta, build digest, build prompt)
|
|
12
|
+
export { fetchUnprocessedData, buildCurationDigest, buildCurationPrompt, updatedCursors, } from "./curator.js";
|
|
13
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/memory/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,iEAAiE;AACjE,OAAO,EACL,eAAe,EACf,iBAAiB,EACjB,iBAAiB,EACjB,iBAAiB,EACjB,4BAA4B,EAC5B,eAAe,GAChB,MAAM,gBAAgB,CAAC;AAExB,mCAAmC;AACnC,OAAO,EACL,iBAAiB,EACjB,iBAAiB,EACjB,WAAW,GAEZ,MAAM,qBAAqB,CAAC;AAE7B,2DAA2D;AAC3D,OAAO,EACL,oBAAoB,EACpB,mBAAmB,EACnB,mBAAmB,EACnB,cAAc,GAGf,MAAM,cAAc,CAAC"}
|
package/dist/supabase/index.d.ts
CHANGED
|
@@ -7,7 +7,7 @@ export { getActiveCronJobs, getAllCronJobs, getDueCronJobs, updateCronJobStatus,
|
|
|
7
7
|
export { sendNotification, createHeartbeatHistory, type Notification, } from "./notifications.js";
|
|
8
8
|
export { storeMemory, searchMemories, getMemoryById, getRecentMemories, updateMemory, deleteMemory, getMemoriesByType, } from "./memory.js";
|
|
9
9
|
export { getExecutorContext, saveExecutorContext, clearExecutorContext, updateLastActivity, } from "./context.js";
|
|
10
|
-
export { createUserRequest, completeUserRequest, failUserRequest, getUserRequestById, getRecentUserRequests, getUserRequestsByStatus, getUserRequestsStats, searchUserRequests, } from "./requests.js";
|
|
11
|
-
export { syncWorkspaceToLocal, syncLocalFileToStorage, syncAllLocalFilesToStorage, downloadWorkspaceFile, uploadWorkspaceFile, downloadAllWorkspaceFiles, workspaceFileExists, deleteWorkspaceFile, WORKSPACE_FILES, type WorkspaceFileName, } from "./workspace-storage.js";
|
|
10
|
+
export { createUserRequest, completeUserRequest, failUserRequest, getUserRequestById, getRecentUserRequests, getNewUserRequestsSince, getUserRequestsByStatus, getUserRequestsStats, searchUserRequests, } from "./requests.js";
|
|
11
|
+
export { syncWorkspaceToLocal, syncLocalFileToStorage, syncAllLocalFilesToStorage, downloadWorkspaceFile, uploadWorkspaceFile, downloadAllWorkspaceFiles, workspaceFileExists, deleteWorkspaceFile, syncMemoryDirToStorage, syncMemoryDirFromStorage, deleteMemoryFileFromStorage, syncCurationStateToStorage, syncCurationStateFromStorage, WORKSPACE_FILES, type WorkspaceFileName, } from "./workspace-storage.js";
|
|
12
12
|
export type { UserMemory, UserRequest, ExecutorContext, MemorySearchResult, } from "./types.js";
|
|
13
13
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/supabase/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EACL,kBAAkB,EAClB,WAAW,EACX,qBAAqB,GACtB,MAAM,aAAa,CAAC;AAErB,OAAO,EACL,iBAAiB,EACjB,cAAc,EACd,cAAc,EACd,mBAAmB,EACnB,iBAAiB,EACjB,oBAAoB,EACpB,cAAc,EACd,wBAAwB,EACxB,aAAa,EACb,aAAa,EACb,aAAa,EACb,aAAa,EACb,mBAAmB,EACnB,eAAe,GAChB,MAAM,gBAAgB,CAAC;AAExB,OAAO,EACL,gBAAgB,EAChB,sBAAsB,EACtB,KAAK,YAAY,GAClB,MAAM,oBAAoB,CAAC;AAE5B,OAAO,EACL,WAAW,EACX,cAAc,EACd,aAAa,EACb,iBAAiB,EACjB,YAAY,EACZ,YAAY,EACZ,iBAAiB,GAClB,MAAM,aAAa,CAAC;AAErB,OAAO,EACL,kBAAkB,EAClB,mBAAmB,EACnB,oBAAoB,EACpB,kBAAkB,GACnB,MAAM,cAAc,CAAC;AAEtB,OAAO,EACL,iBAAiB,EACjB,mBAAmB,EACnB,eAAe,EACf,kBAAkB,EAClB,qBAAqB,EACrB,uBAAuB,EACvB,oBAAoB,EACpB,kBAAkB,GACnB,MAAM,eAAe,CAAC;AAEvB,OAAO,EACL,oBAAoB,EACpB,sBAAsB,EACtB,0BAA0B,EAC1B,qBAAqB,EACrB,mBAAmB,EACnB,yBAAyB,EACzB,mBAAmB,EACnB,mBAAmB,EACnB,eAAe,EACf,KAAK,iBAAiB,GACvB,MAAM,wBAAwB,CAAC;AAMhC,YAAY,EACV,UAAU,EACV,WAAW,EACX,eAAe,EACf,kBAAkB,GACnB,MAAM,YAAY,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/supabase/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EACL,kBAAkB,EAClB,WAAW,EACX,qBAAqB,GACtB,MAAM,aAAa,CAAC;AAErB,OAAO,EACL,iBAAiB,EACjB,cAAc,EACd,cAAc,EACd,mBAAmB,EACnB,iBAAiB,EACjB,oBAAoB,EACpB,cAAc,EACd,wBAAwB,EACxB,aAAa,EACb,aAAa,EACb,aAAa,EACb,aAAa,EACb,mBAAmB,EACnB,eAAe,GAChB,MAAM,gBAAgB,CAAC;AAExB,OAAO,EACL,gBAAgB,EAChB,sBAAsB,EACtB,KAAK,YAAY,GAClB,MAAM,oBAAoB,CAAC;AAE5B,OAAO,EACL,WAAW,EACX,cAAc,EACd,aAAa,EACb,iBAAiB,EACjB,YAAY,EACZ,YAAY,EACZ,iBAAiB,GAClB,MAAM,aAAa,CAAC;AAErB,OAAO,EACL,kBAAkB,EAClB,mBAAmB,EACnB,oBAAoB,EACpB,kBAAkB,GACnB,MAAM,cAAc,CAAC;AAEtB,OAAO,EACL,iBAAiB,EACjB,mBAAmB,EACnB,eAAe,EACf,kBAAkB,EAClB,qBAAqB,EACrB,uBAAuB,EACvB,uBAAuB,EACvB,oBAAoB,EACpB,kBAAkB,GACnB,MAAM,eAAe,CAAC;AAEvB,OAAO,EACL,oBAAoB,EACpB,sBAAsB,EACtB,0BAA0B,EAC1B,qBAAqB,EACrB,mBAAmB,EACnB,yBAAyB,EACzB,mBAAmB,EACnB,mBAAmB,EACnB,sBAAsB,EACtB,wBAAwB,EACxB,2BAA2B,EAC3B,0BAA0B,EAC1B,4BAA4B,EAC5B,eAAe,EACf,KAAK,iBAAiB,GACvB,MAAM,wBAAwB,CAAC;AAMhC,YAAY,EACV,UAAU,EACV,WAAW,EACX,eAAe,EACf,kBAAkB,GACnB,MAAM,YAAY,CAAC"}
|
package/dist/supabase/index.js
CHANGED
|
@@ -7,6 +7,6 @@ export { getActiveCronJobs, getAllCronJobs, getDueCronJobs, updateCronJobStatus,
|
|
|
7
7
|
export { sendNotification, createHeartbeatHistory, } from "./notifications.js";
|
|
8
8
|
export { storeMemory, searchMemories, getMemoryById, getRecentMemories, updateMemory, deleteMemory, getMemoriesByType, } from "./memory.js";
|
|
9
9
|
export { getExecutorContext, saveExecutorContext, clearExecutorContext, updateLastActivity, } from "./context.js";
|
|
10
|
-
export { createUserRequest, completeUserRequest, failUserRequest, getUserRequestById, getRecentUserRequests, getUserRequestsByStatus, getUserRequestsStats, searchUserRequests, } from "./requests.js";
|
|
11
|
-
export { syncWorkspaceToLocal, syncLocalFileToStorage, syncAllLocalFilesToStorage, downloadWorkspaceFile, uploadWorkspaceFile, downloadAllWorkspaceFiles, workspaceFileExists, deleteWorkspaceFile, WORKSPACE_FILES, } from "./workspace-storage.js";
|
|
10
|
+
export { createUserRequest, completeUserRequest, failUserRequest, getUserRequestById, getRecentUserRequests, getNewUserRequestsSince, getUserRequestsByStatus, getUserRequestsStats, searchUserRequests, } from "./requests.js";
|
|
11
|
+
export { syncWorkspaceToLocal, syncLocalFileToStorage, syncAllLocalFilesToStorage, downloadWorkspaceFile, uploadWorkspaceFile, downloadAllWorkspaceFiles, workspaceFileExists, deleteWorkspaceFile, syncMemoryDirToStorage, syncMemoryDirFromStorage, deleteMemoryFileFromStorage, syncCurationStateToStorage, syncCurationStateFromStorage, WORKSPACE_FILES, } from "./workspace-storage.js";
|
|
12
12
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/supabase/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EACL,kBAAkB,EAClB,WAAW,EACX,qBAAqB,GACtB,MAAM,aAAa,CAAC;AAErB,OAAO,EACL,iBAAiB,EACjB,cAAc,EACd,cAAc,EACd,mBAAmB,EACnB,iBAAiB,EACjB,oBAAoB,EACpB,cAAc,EACd,wBAAwB,EACxB,aAAa,EACb,aAAa,EACb,aAAa,EACb,aAAa,EACb,mBAAmB,EACnB,eAAe,GAChB,MAAM,gBAAgB,CAAC;AAExB,OAAO,EACL,gBAAgB,EAChB,sBAAsB,GAEvB,MAAM,oBAAoB,CAAC;AAE5B,OAAO,EACL,WAAW,EACX,cAAc,EACd,aAAa,EACb,iBAAiB,EACjB,YAAY,EACZ,YAAY,EACZ,iBAAiB,GAClB,MAAM,aAAa,CAAC;AAErB,OAAO,EACL,kBAAkB,EAClB,mBAAmB,EACnB,oBAAoB,EACpB,kBAAkB,GACnB,MAAM,cAAc,CAAC;AAEtB,OAAO,EACL,iBAAiB,EACjB,mBAAmB,EACnB,eAAe,EACf,kBAAkB,EAClB,qBAAqB,EACrB,uBAAuB,EACvB,oBAAoB,EACpB,kBAAkB,GACnB,MAAM,eAAe,CAAC;AAEvB,OAAO,EACL,oBAAoB,EACpB,sBAAsB,EACtB,0BAA0B,EAC1B,qBAAqB,EACrB,mBAAmB,EACnB,yBAAyB,EACzB,mBAAmB,EACnB,mBAAmB,EACnB,eAAe,GAEhB,MAAM,wBAAwB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/supabase/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EACL,kBAAkB,EAClB,WAAW,EACX,qBAAqB,GACtB,MAAM,aAAa,CAAC;AAErB,OAAO,EACL,iBAAiB,EACjB,cAAc,EACd,cAAc,EACd,mBAAmB,EACnB,iBAAiB,EACjB,oBAAoB,EACpB,cAAc,EACd,wBAAwB,EACxB,aAAa,EACb,aAAa,EACb,aAAa,EACb,aAAa,EACb,mBAAmB,EACnB,eAAe,GAChB,MAAM,gBAAgB,CAAC;AAExB,OAAO,EACL,gBAAgB,EAChB,sBAAsB,GAEvB,MAAM,oBAAoB,CAAC;AAE5B,OAAO,EACL,WAAW,EACX,cAAc,EACd,aAAa,EACb,iBAAiB,EACjB,YAAY,EACZ,YAAY,EACZ,iBAAiB,GAClB,MAAM,aAAa,CAAC;AAErB,OAAO,EACL,kBAAkB,EAClB,mBAAmB,EACnB,oBAAoB,EACpB,kBAAkB,GACnB,MAAM,cAAc,CAAC;AAEtB,OAAO,EACL,iBAAiB,EACjB,mBAAmB,EACnB,eAAe,EACf,kBAAkB,EAClB,qBAAqB,EACrB,uBAAuB,EACvB,uBAAuB,EACvB,oBAAoB,EACpB,kBAAkB,GACnB,MAAM,eAAe,CAAC;AAEvB,OAAO,EACL,oBAAoB,EACpB,sBAAsB,EACtB,0BAA0B,EAC1B,qBAAqB,EACrB,mBAAmB,EACnB,yBAAyB,EACzB,mBAAmB,EACnB,mBAAmB,EACnB,sBAAsB,EACtB,wBAAwB,EACxB,2BAA2B,EAC3B,0BAA0B,EAC1B,4BAA4B,EAC5B,eAAe,GAEhB,MAAM,wBAAwB,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"notifications.d.ts","sourceRoot":"","sources":["../../src/supabase/notifications.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAOH;;GAEG;AACH,MAAM,MAAM,YAAY,GAAG;IACzB,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,KAAK,GAAG,QAAQ,GAAG,MAAM,CAAC;IACrC,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACpC,CAAC;
|
|
1
|
+
{"version":3,"file":"notifications.d.ts","sourceRoot":"","sources":["../../src/supabase/notifications.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAOH;;GAEG;AACH,MAAM,MAAM,YAAY,GAAG;IACzB,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,KAAK,GAAG,QAAQ,GAAG,MAAM,CAAC;IACrC,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACpC,CAAC;AA4CF;;;GAGG;AACH,wBAAsB,gBAAgB,CACpC,YAAY,EAAE,YAAY,GACzB,OAAO,CAAC,IAAI,CAAC,CA0Bf;AAED;;GAEG;AACH,wBAAsB,sBAAsB,CAAC,MAAM,EAAE;IACnD,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,KAAK,GAAG,SAAS,CAAC;IAC1B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,gBAAgB,EAAE,OAAO,CAAC;IAC1B,UAAU,EAAE,MAAM,CAAC;CACpB,GAAG,OAAO,CAAC,IAAI,CAAC,CAiBhB"}
|
|
@@ -8,16 +8,25 @@ const PUSH_API_URL = "https://api-dev.asterizk.ai/email/notifications/send";
|
|
|
8
8
|
/**
|
|
9
9
|
* Send a push notification to the user's device via the push API.
|
|
10
10
|
* Non-blocking — failures are logged but do not throw.
|
|
11
|
+
*
|
|
12
|
+
* Merges structured metadata (classification, senderName, significance, snippet,
|
|
13
|
+
* actionUrl, category) into the push `data` field so the client app can parse
|
|
14
|
+
* them from OneSignal's `additionalData`.
|
|
11
15
|
*/
|
|
12
16
|
async function sendPushNotification(notification) {
|
|
13
17
|
try {
|
|
18
|
+
// Merge type + metadata into `data` so client can read from additionalData
|
|
19
|
+
const data = {
|
|
20
|
+
type: notification.type,
|
|
21
|
+
...notification.metadata,
|
|
22
|
+
};
|
|
14
23
|
const body = {
|
|
15
24
|
user_id: notification.user_id,
|
|
16
25
|
title: notification.title || "CoStar",
|
|
17
26
|
message: notification.message,
|
|
18
27
|
notification_type: notification.type,
|
|
19
28
|
priority: notification.priority || "normal",
|
|
20
|
-
data
|
|
29
|
+
data,
|
|
21
30
|
};
|
|
22
31
|
const res = await fetch(PUSH_API_URL, {
|
|
23
32
|
method: "POST",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"notifications.js","sourceRoot":"","sources":["../../src/supabase/notifications.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE1C,qCAAqC;AACrC,MAAM,YAAY,GAAG,sDAAsD,CAAC;AAiB5E
|
|
1
|
+
{"version":3,"file":"notifications.js","sourceRoot":"","sources":["../../src/supabase/notifications.ts"],"names":[],"mappings":"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"}
|
|
@@ -55,6 +55,16 @@ export declare function searchUserRequests(params: {
|
|
|
55
55
|
created_at: string;
|
|
56
56
|
score: number;
|
|
57
57
|
}>>;
|
|
58
|
+
/**
|
|
59
|
+
* Get new user requests since a given cursor (timestamp + optional ID).
|
|
60
|
+
* Used by the memory curation system to fetch only unprocessed client conversations.
|
|
61
|
+
*
|
|
62
|
+
* @param userId - User ID to filter by
|
|
63
|
+
* @param afterTimestamp - Only return requests created after this ISO timestamp (exclusive)
|
|
64
|
+
* @param limit - Max number of requests to return (default: 30)
|
|
65
|
+
* @returns Completed user requests ordered by created_at ASC (oldest first)
|
|
66
|
+
*/
|
|
67
|
+
export declare function getNewUserRequestsSince(userId: string, afterTimestamp?: string | null, limit?: number): Promise<UserRequest[]>;
|
|
58
68
|
/**
|
|
59
69
|
* Get user requests statistics
|
|
60
70
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"requests.d.ts","sourceRoot":"","sources":["../../src/supabase/requests.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAE9C;;GAEG;AACH,wBAAsB,iBAAiB,CAAC,MAAM,EAAE;IAC9C,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,QAAQ,GAAG,QAAQ,CAAC;CAC/B,GAAG,OAAO,CAAC,WAAW,CAAC,CAsBvB;AAED;;GAEG;AACH,wBAAsB,mBAAmB,CAAC,MAAM,EAAE;IAChD,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB,GAAG,OAAO,CAAC,WAAW,CAAC,CAsBvB;AAED;;GAEG;AACH,wBAAsB,eAAe,CAAC,MAAM,EAAE;IAC5C,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB,GAAG,OAAO,CAAC,WAAW,CAAC,CAqBvB;AAED;;GAEG;AACH,wBAAsB,kBAAkB,CACtC,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC,CAmB7B;AAED;;GAEG;AACH,wBAAsB,qBAAqB,CACzC,MAAM,EAAE,MAAM,EACd,KAAK,GAAE,MAAW,GACjB,OAAO,CAAC,WAAW,EAAE,CAAC,CAgBxB;AAED;;GAEG;AACH,wBAAsB,uBAAuB,CAC3C,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,SAAS,GAAG,WAAW,GAAG,QAAQ,EAC1C,KAAK,GAAE,MAAW,GACjB,OAAO,CAAC,WAAW,EAAE,CAAC,CAmBxB;AAED;;;GAGG;AACH,wBAAsB,kBAAkB,CAAC,MAAM,EAAE;IAC/C,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB,GAAG,OAAO,CAAC,KAAK,CAAC;IAChB,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;CACf,CAAC,CAAC,CA0EF;AAED;;GAEG;AACH,wBAAsB,oBAAoB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC;IAClE,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB,CAAC,CAuDD"}
|
|
1
|
+
{"version":3,"file":"requests.d.ts","sourceRoot":"","sources":["../../src/supabase/requests.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAE9C;;GAEG;AACH,wBAAsB,iBAAiB,CAAC,MAAM,EAAE;IAC9C,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,QAAQ,GAAG,QAAQ,CAAC;CAC/B,GAAG,OAAO,CAAC,WAAW,CAAC,CAsBvB;AAED;;GAEG;AACH,wBAAsB,mBAAmB,CAAC,MAAM,EAAE;IAChD,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB,GAAG,OAAO,CAAC,WAAW,CAAC,CAsBvB;AAED;;GAEG;AACH,wBAAsB,eAAe,CAAC,MAAM,EAAE;IAC5C,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB,GAAG,OAAO,CAAC,WAAW,CAAC,CAqBvB;AAED;;GAEG;AACH,wBAAsB,kBAAkB,CACtC,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC,CAmB7B;AAED;;GAEG;AACH,wBAAsB,qBAAqB,CACzC,MAAM,EAAE,MAAM,EACd,KAAK,GAAE,MAAW,GACjB,OAAO,CAAC,WAAW,EAAE,CAAC,CAgBxB;AAED;;GAEG;AACH,wBAAsB,uBAAuB,CAC3C,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,SAAS,GAAG,WAAW,GAAG,QAAQ,EAC1C,KAAK,GAAE,MAAW,GACjB,OAAO,CAAC,WAAW,EAAE,CAAC,CAmBxB;AAED;;;GAGG;AACH,wBAAsB,kBAAkB,CAAC,MAAM,EAAE;IAC/C,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB,GAAG,OAAO,CAAC,KAAK,CAAC;IAChB,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;CACf,CAAC,CAAC,CA0EF;AAED;;;;;;;;GAQG;AACH,wBAAsB,uBAAuB,CAC3C,MAAM,EAAE,MAAM,EACd,cAAc,CAAC,EAAE,MAAM,GAAG,IAAI,EAC9B,KAAK,GAAE,MAAW,GACjB,OAAO,CAAC,WAAW,EAAE,CAAC,CA4BxB;AAED;;GAEG;AACH,wBAAsB,oBAAoB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC;IAClE,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB,CAAC,CAuDD"}
|