@undefineds.co/linx 0.2.3 → 0.2.11
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 +225 -51
- package/dist/index.js.map +1 -1
- package/dist/lib/ai-command.js +2 -2
- package/dist/lib/ai-command.js.map +1 -1
- package/dist/lib/chat-api.js +146 -15
- package/dist/lib/chat-api.js.map +1 -1
- package/dist/lib/credentials-store.js +6 -0
- package/dist/lib/credentials-store.js.map +1 -1
- package/dist/lib/default-model.js +1 -0
- package/dist/lib/default-model.js.map +1 -1
- package/dist/lib/login-command.js +16 -1
- package/dist/lib/login-command.js.map +1 -1
- package/dist/lib/models.js +2 -2
- package/dist/lib/models.js.map +1 -1
- package/dist/lib/node-warning-filter.js +34 -0
- package/dist/lib/node-warning-filter.js.map +1 -0
- package/dist/lib/oidc-auth.js +78 -13
- package/dist/lib/oidc-auth.js.map +1 -1
- package/dist/lib/pi-adapter/auth.js +12 -5
- package/dist/lib/pi-adapter/auth.js.map +1 -1
- package/dist/lib/pi-adapter/branding.js +553 -75
- package/dist/lib/pi-adapter/branding.js.map +1 -1
- package/dist/lib/pi-adapter/interactive.js +117 -4
- package/dist/lib/pi-adapter/interactive.js.map +1 -1
- package/dist/lib/pi-adapter/pod-approval.js +121 -0
- package/dist/lib/pi-adapter/pod-approval.js.map +1 -0
- package/dist/lib/pi-adapter/pod-mirror-mapping.js +189 -0
- package/dist/lib/pi-adapter/pod-mirror-mapping.js.map +1 -0
- package/dist/lib/pi-adapter/pod-mirror.js +390 -0
- package/dist/lib/pi-adapter/pod-mirror.js.map +1 -0
- package/dist/lib/pi-adapter/pod-native.js +422 -0
- package/dist/lib/pi-adapter/pod-native.js.map +1 -0
- package/dist/lib/pi-adapter/runtime.js +116 -21
- package/dist/lib/pi-adapter/runtime.js.map +1 -1
- package/dist/lib/pi-adapter/session.js +613 -0
- package/dist/lib/pi-adapter/session.js.map +1 -0
- package/dist/lib/pi-adapter/stream.js +74 -1
- package/dist/lib/pi-adapter/stream.js.map +1 -1
- package/dist/lib/profile-identity.js +5 -5
- package/dist/lib/profile-identity.js.map +1 -1
- package/dist/lib/watch/pod-ai.js +2 -1
- package/dist/lib/watch/pod-ai.js.map +1 -1
- package/dist/lib/watch/pod-approval.js +336 -84
- package/dist/lib/watch/pod-approval.js.map +1 -1
- package/dist/lib/watch/pod-persistence.js +2 -1
- package/dist/lib/watch/pod-persistence.js.map +1 -1
- package/package.json +3 -7
- package/dist/generated/version.js +0 -3
- package/dist/generated/version.js.map +0 -1
|
@@ -0,0 +1,613 @@
|
|
|
1
|
+
import { existsSync, mkdirSync, statSync, writeFileSync } from 'node:fs';
|
|
2
|
+
import { basename, join, resolve } from 'node:path';
|
|
3
|
+
import { CURRENT_SESSION_VERSION, SessionManager, } from '@mariozechner/pi-coding-agent';
|
|
4
|
+
import { getClientCredentialId, getClientCredentialKey } from '../credentials-store.js';
|
|
5
|
+
import { PI_CHAT_ID, buildChatUri, buildThreadUri } from './pod-mirror-mapping.js';
|
|
6
|
+
import { DCT_CREATED, DCT_MODIFIED, SIOC_CONTENT, SIOC_RICH_CONTENT, UDFS_ACTOR, UDFS_CONVERSATION, UDFS_IN_THREAD, UDFS_METADATA, UDFS_SESSION_TOOL, buildMessageResourceUrl, buildSessionResourceUrl, firstIri, firstLiteral, listTurtleResources, parseManagedTurtleBlocks, podBaseUrlFromWebId, readTurtleResource, } from './pod-native.js';
|
|
7
|
+
export function createNativeLinxPiPodSessionSource(context) {
|
|
8
|
+
const source = {
|
|
9
|
+
async listSessions(cwd) {
|
|
10
|
+
return listPodSessionSnapshots(context, cwd);
|
|
11
|
+
},
|
|
12
|
+
async findSession(input, cwd) {
|
|
13
|
+
const direct = await readPodSessionSnapshot(context, buildSessionResourceUrl(context.webId, input)).catch(() => null);
|
|
14
|
+
if (direct) {
|
|
15
|
+
return direct;
|
|
16
|
+
}
|
|
17
|
+
const sessions = await source.listSessions(cwd);
|
|
18
|
+
const exact = sessions.find((session) => session.id === input);
|
|
19
|
+
if (exact) {
|
|
20
|
+
return exact;
|
|
21
|
+
}
|
|
22
|
+
const matches = sessions.filter((session) => session.id.startsWith(input));
|
|
23
|
+
if (matches.length === 1) {
|
|
24
|
+
return matches[0];
|
|
25
|
+
}
|
|
26
|
+
return null;
|
|
27
|
+
},
|
|
28
|
+
};
|
|
29
|
+
return source;
|
|
30
|
+
}
|
|
31
|
+
export async function createLinxPiSessionManager(options) {
|
|
32
|
+
const sessionDir = getDefaultLinxPiSessionDir(options.cwd, options.agentDir);
|
|
33
|
+
if (options.session?.trim()) {
|
|
34
|
+
const session = await resolveLinxPiSession(options.session.trim(), options.cwd, sessionDir, {
|
|
35
|
+
podSessionSource: options.podSessionSource,
|
|
36
|
+
});
|
|
37
|
+
return SessionManager.open(session.path, sessionDir);
|
|
38
|
+
}
|
|
39
|
+
if (options.last) {
|
|
40
|
+
const sessions = await listLinxPiSessions(options.cwd, options.agentDir, {
|
|
41
|
+
podSessionSource: options.podSessionSource,
|
|
42
|
+
});
|
|
43
|
+
if (sessions[0]) {
|
|
44
|
+
return SessionManager.open(sessions[0].path, sessionDir);
|
|
45
|
+
}
|
|
46
|
+
return SessionManager.create(options.cwd, sessionDir);
|
|
47
|
+
}
|
|
48
|
+
return SessionManager.create(options.cwd, sessionDir);
|
|
49
|
+
}
|
|
50
|
+
export async function listLinxPiSessions(cwd, agentDir, options = {}) {
|
|
51
|
+
const sessionDir = getDefaultLinxPiSessionDir(cwd, agentDir);
|
|
52
|
+
const localSessions = await SessionManager.list(cwd, sessionDir);
|
|
53
|
+
const podSessions = await hydratePodSessions(cwd, sessionDir, options.podSessionSource, localSessions);
|
|
54
|
+
return sortSessionsByModified(mergeSessions(localSessions, podSessions));
|
|
55
|
+
}
|
|
56
|
+
export async function resolveLinxPiSession(input, cwd, sessionDir, options = {}) {
|
|
57
|
+
const directPath = resolve(input);
|
|
58
|
+
if (existsSync(directPath) && statSync(directPath).isFile()) {
|
|
59
|
+
const manager = SessionManager.open(directPath);
|
|
60
|
+
const header = manager.getHeader();
|
|
61
|
+
return {
|
|
62
|
+
path: directPath,
|
|
63
|
+
id: manager.getSessionId(),
|
|
64
|
+
cwd: manager.getCwd(),
|
|
65
|
+
created: header?.timestamp ? new Date(header.timestamp) : new Date(0),
|
|
66
|
+
modified: statSync(directPath).mtime,
|
|
67
|
+
messageCount: manager.getEntries().filter((entry) => entry.type === 'message').length,
|
|
68
|
+
firstMessage: '(session file)',
|
|
69
|
+
allMessagesText: '',
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
const localSessions = sessionDir
|
|
73
|
+
? await SessionManager.list(cwd, sessionDir)
|
|
74
|
+
: await SessionManager.list(cwd);
|
|
75
|
+
const globalSessions = sessionDir ? await SessionManager.listAll() : [];
|
|
76
|
+
const sessions = [...localSessions, ...globalSessions];
|
|
77
|
+
const exact = sessions.find((session) => session.id === input);
|
|
78
|
+
if (exact) {
|
|
79
|
+
return exact;
|
|
80
|
+
}
|
|
81
|
+
const byPrefix = sessions.filter((session) => session.id.startsWith(input));
|
|
82
|
+
if (byPrefix.length === 1) {
|
|
83
|
+
return byPrefix[0];
|
|
84
|
+
}
|
|
85
|
+
const byFilePrefix = sessions.filter((session) => session.path.includes(input));
|
|
86
|
+
if (byFilePrefix.length === 1) {
|
|
87
|
+
return byFilePrefix[0];
|
|
88
|
+
}
|
|
89
|
+
const scoped = (byPrefix.length > 0 ? byPrefix : byFilePrefix)
|
|
90
|
+
.filter((session) => session.cwd === cwd);
|
|
91
|
+
if (scoped.length === 1) {
|
|
92
|
+
return scoped[0];
|
|
93
|
+
}
|
|
94
|
+
if (sessionDir) {
|
|
95
|
+
const podSession = await hydratePodSession(input, cwd, sessionDir, options.podSessionSource);
|
|
96
|
+
if (podSession) {
|
|
97
|
+
return podSession;
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
if (byPrefix.length > 1 || byFilePrefix.length > 1) {
|
|
101
|
+
const matches = sortSessionsByModified([...new Map([...byPrefix, ...byFilePrefix].map((session) => [session.path, session])).values()])
|
|
102
|
+
.slice(0, 8)
|
|
103
|
+
.map((session) => `- ${formatLinxPiSessionSummary(session)}`)
|
|
104
|
+
.join('\n');
|
|
105
|
+
throw new Error(`Session id is ambiguous: ${input}\n${matches}`);
|
|
106
|
+
}
|
|
107
|
+
throw new Error(`No LinX session found for: ${input}`);
|
|
108
|
+
}
|
|
109
|
+
export function formatLinxPiSessionSummary(session) {
|
|
110
|
+
const label = session.name || session.firstMessage || '(no messages)';
|
|
111
|
+
const cwd = session.cwd || '(unknown cwd)';
|
|
112
|
+
return `${session.id.slice(0, 13)} ${label} ${cwd}`;
|
|
113
|
+
}
|
|
114
|
+
function sortSessionsByModified(sessions) {
|
|
115
|
+
return [...sessions].sort((a, b) => b.modified.getTime() - a.modified.getTime());
|
|
116
|
+
}
|
|
117
|
+
function mergeSessions(localSessions, podSessions) {
|
|
118
|
+
const merged = new Map();
|
|
119
|
+
for (const session of podSessions) {
|
|
120
|
+
merged.set(session.id, session);
|
|
121
|
+
}
|
|
122
|
+
for (const session of localSessions) {
|
|
123
|
+
merged.set(session.id, session);
|
|
124
|
+
}
|
|
125
|
+
return [...merged.values()];
|
|
126
|
+
}
|
|
127
|
+
function getDefaultLinxPiSessionDir(cwd, agentDir) {
|
|
128
|
+
const safePath = `--${cwd.replace(/^[/\\]/, '').replace(/[/\\:]/g, '-')}--`;
|
|
129
|
+
return join(agentDir, 'sessions', safePath);
|
|
130
|
+
}
|
|
131
|
+
async function hydratePodSessions(cwd, sessionDir, source, localSessions) {
|
|
132
|
+
const resolvedSource = await resolvePodSessionSource(source);
|
|
133
|
+
if (!resolvedSource) {
|
|
134
|
+
return [];
|
|
135
|
+
}
|
|
136
|
+
const localIds = new Set(localSessions.map((session) => session.id));
|
|
137
|
+
const snapshots = await resolvedSource.listSessions(cwd).catch(() => []);
|
|
138
|
+
const hydrated = [];
|
|
139
|
+
for (const snapshot of snapshots) {
|
|
140
|
+
if (localIds.has(snapshot.id)) {
|
|
141
|
+
continue;
|
|
142
|
+
}
|
|
143
|
+
hydrated.push(materializePodSessionSnapshot(snapshot, cwd, sessionDir));
|
|
144
|
+
}
|
|
145
|
+
return hydrated;
|
|
146
|
+
}
|
|
147
|
+
async function hydratePodSession(input, cwd, sessionDir, source) {
|
|
148
|
+
const resolvedSource = await resolvePodSessionSource(source);
|
|
149
|
+
if (!resolvedSource) {
|
|
150
|
+
return null;
|
|
151
|
+
}
|
|
152
|
+
const snapshot = await resolvedSource.findSession(input, cwd).catch(() => null);
|
|
153
|
+
if (!snapshot) {
|
|
154
|
+
return null;
|
|
155
|
+
}
|
|
156
|
+
return materializePodSessionSnapshot(snapshot, cwd, sessionDir);
|
|
157
|
+
}
|
|
158
|
+
async function resolvePodSessionSource(source) {
|
|
159
|
+
if (source !== undefined) {
|
|
160
|
+
return source;
|
|
161
|
+
}
|
|
162
|
+
return createDefaultLinxPiPodSessionSource().catch(() => null);
|
|
163
|
+
}
|
|
164
|
+
function materializePodSessionSnapshot(snapshot, fallbackCwd, sessionDir) {
|
|
165
|
+
mkdirSync(sessionDir, { recursive: true });
|
|
166
|
+
const created = toDate(snapshot.createdAt) ?? toDate(snapshot.updatedAt) ?? new Date();
|
|
167
|
+
const modified = toDate(snapshot.updatedAt) ?? created;
|
|
168
|
+
const cwd = snapshot.cwd?.trim() || fallbackCwd;
|
|
169
|
+
const entries = buildPodSessionEntries(snapshot);
|
|
170
|
+
const sessionFile = getMaterializedSessionFile(snapshot, sessionDir, created);
|
|
171
|
+
const header = {
|
|
172
|
+
type: 'session',
|
|
173
|
+
version: CURRENT_SESSION_VERSION,
|
|
174
|
+
id: snapshot.id,
|
|
175
|
+
timestamp: created.toISOString(),
|
|
176
|
+
cwd,
|
|
177
|
+
};
|
|
178
|
+
const lines = [header, ...entries].map((entry) => JSON.stringify(entry));
|
|
179
|
+
writeFileSync(sessionFile, `${lines.join('\n')}\n`);
|
|
180
|
+
const manager = SessionManager.open(sessionFile, sessionDir);
|
|
181
|
+
const info = buildSessionInfoFromManager(manager, sessionFile, created, modified);
|
|
182
|
+
return snapshot.name ? { ...info, name: snapshot.name } : info;
|
|
183
|
+
}
|
|
184
|
+
function buildPodSessionEntries(snapshot) {
|
|
185
|
+
const sortedMessages = [...(snapshot.messages ?? [])].sort((a, b) => {
|
|
186
|
+
const aTime = toDate(a.createdAt)?.getTime() ?? 0;
|
|
187
|
+
const bTime = toDate(b.createdAt)?.getTime() ?? 0;
|
|
188
|
+
return aTime - bTime;
|
|
189
|
+
});
|
|
190
|
+
const entries = [];
|
|
191
|
+
let previousId = null;
|
|
192
|
+
for (const row of sortedMessages) {
|
|
193
|
+
const parsed = parsePodRichContent(row.richContent);
|
|
194
|
+
const message = parsed.message ?? synthesizeAgentMessage(row);
|
|
195
|
+
if (!message) {
|
|
196
|
+
continue;
|
|
197
|
+
}
|
|
198
|
+
const id = parsed.entry?.id
|
|
199
|
+
?? extractEntryIdFromPodMessageId(snapshot.id, row.id);
|
|
200
|
+
const timestamp = parsed.entry?.timestamp
|
|
201
|
+
?? toDate(row.createdAt)?.toISOString()
|
|
202
|
+
?? new Date().toISOString();
|
|
203
|
+
const entry = {
|
|
204
|
+
type: 'message',
|
|
205
|
+
id,
|
|
206
|
+
parentId: parsed.entry?.parentId !== undefined ? parsed.entry.parentId : previousId,
|
|
207
|
+
timestamp,
|
|
208
|
+
message,
|
|
209
|
+
};
|
|
210
|
+
entries.push(entry);
|
|
211
|
+
previousId = id;
|
|
212
|
+
}
|
|
213
|
+
return entries;
|
|
214
|
+
}
|
|
215
|
+
function parsePodRichContent(richContent) {
|
|
216
|
+
if (!richContent?.trim()) {
|
|
217
|
+
return {};
|
|
218
|
+
}
|
|
219
|
+
try {
|
|
220
|
+
const parsed = JSON.parse(richContent);
|
|
221
|
+
if (isRecord(parsed) && parsed.type === 'message' && isRecord(parsed.message)) {
|
|
222
|
+
return {
|
|
223
|
+
entry: parsed,
|
|
224
|
+
message: parsed.message,
|
|
225
|
+
};
|
|
226
|
+
}
|
|
227
|
+
if (isRecord(parsed) && isRecord(parsed.linxPiSessionEntry)) {
|
|
228
|
+
const entry = parsed.linxPiSessionEntry;
|
|
229
|
+
return {
|
|
230
|
+
entry,
|
|
231
|
+
message: isRecord(entry.message) ? entry.message : parsed,
|
|
232
|
+
};
|
|
233
|
+
}
|
|
234
|
+
if (isRecord(parsed) && typeof parsed.role === 'string') {
|
|
235
|
+
return { message: parsed };
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
catch {
|
|
239
|
+
return {};
|
|
240
|
+
}
|
|
241
|
+
return {};
|
|
242
|
+
}
|
|
243
|
+
function synthesizeAgentMessage(row) {
|
|
244
|
+
const role = row.role === 'assistant' || row.role === 'system' ? row.role : 'user';
|
|
245
|
+
const timestamp = toDate(row.createdAt)?.getTime() ?? Date.now();
|
|
246
|
+
const content = [{ type: 'text', text: row.content ?? '' }];
|
|
247
|
+
if (role === 'assistant') {
|
|
248
|
+
return {
|
|
249
|
+
role: 'assistant',
|
|
250
|
+
content,
|
|
251
|
+
api: 'openai-completions',
|
|
252
|
+
provider: 'undefineds',
|
|
253
|
+
model: 'linx-lite',
|
|
254
|
+
usage: {
|
|
255
|
+
input: 0,
|
|
256
|
+
output: 0,
|
|
257
|
+
cacheRead: 0,
|
|
258
|
+
cacheWrite: 0,
|
|
259
|
+
totalTokens: 0,
|
|
260
|
+
cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, total: 0 },
|
|
261
|
+
},
|
|
262
|
+
stopReason: 'stop',
|
|
263
|
+
timestamp,
|
|
264
|
+
};
|
|
265
|
+
}
|
|
266
|
+
if (role === 'system') {
|
|
267
|
+
return {
|
|
268
|
+
role: 'custom',
|
|
269
|
+
customType: 'linx-pod-system',
|
|
270
|
+
content,
|
|
271
|
+
timestamp,
|
|
272
|
+
};
|
|
273
|
+
}
|
|
274
|
+
return {
|
|
275
|
+
role: 'user',
|
|
276
|
+
content,
|
|
277
|
+
timestamp,
|
|
278
|
+
};
|
|
279
|
+
}
|
|
280
|
+
function extractEntryIdFromPodMessageId(sessionId, messageId) {
|
|
281
|
+
const prefix = `${sessionId}-`;
|
|
282
|
+
return messageId.startsWith(prefix) ? messageId.slice(prefix.length) : messageId;
|
|
283
|
+
}
|
|
284
|
+
function getMaterializedSessionFile(snapshot, sessionDir, created) {
|
|
285
|
+
if (snapshot.sessionFile?.trim()) {
|
|
286
|
+
const fileName = basename(snapshot.sessionFile);
|
|
287
|
+
if (fileName.endsWith('.jsonl')) {
|
|
288
|
+
return join(sessionDir, fileName);
|
|
289
|
+
}
|
|
290
|
+
}
|
|
291
|
+
const fileTimestamp = created.toISOString().replace(/[:.]/g, '-');
|
|
292
|
+
return join(sessionDir, `${fileTimestamp}_${snapshot.id}.jsonl`);
|
|
293
|
+
}
|
|
294
|
+
function buildSessionInfoFromManager(manager, path, created, modified) {
|
|
295
|
+
const entries = manager.getEntries();
|
|
296
|
+
const messages = entries.filter((entry) => entry.type === 'message');
|
|
297
|
+
const allMessages = messages
|
|
298
|
+
.map((entry) => extractMessageText(entry.message))
|
|
299
|
+
.filter(Boolean);
|
|
300
|
+
const firstUserMessage = messages.find((entry) => {
|
|
301
|
+
const message = entry.message;
|
|
302
|
+
return message?.role === 'user';
|
|
303
|
+
});
|
|
304
|
+
return {
|
|
305
|
+
path,
|
|
306
|
+
id: manager.getSessionId(),
|
|
307
|
+
cwd: manager.getCwd(),
|
|
308
|
+
name: manager.getSessionName(),
|
|
309
|
+
created,
|
|
310
|
+
modified,
|
|
311
|
+
messageCount: messages.length,
|
|
312
|
+
firstMessage: firstUserMessage
|
|
313
|
+
? extractMessageText(firstUserMessage.message) || '(no messages)'
|
|
314
|
+
: '(no messages)',
|
|
315
|
+
allMessagesText: allMessages.join(' '),
|
|
316
|
+
};
|
|
317
|
+
}
|
|
318
|
+
function extractMessageText(message) {
|
|
319
|
+
if (!isRecord(message)) {
|
|
320
|
+
return '';
|
|
321
|
+
}
|
|
322
|
+
const content = message.content;
|
|
323
|
+
if (typeof content === 'string') {
|
|
324
|
+
return content;
|
|
325
|
+
}
|
|
326
|
+
if (!Array.isArray(content)) {
|
|
327
|
+
return '';
|
|
328
|
+
}
|
|
329
|
+
return content
|
|
330
|
+
.map((part) => {
|
|
331
|
+
if (typeof part === 'string')
|
|
332
|
+
return part;
|
|
333
|
+
if (!isRecord(part))
|
|
334
|
+
return '';
|
|
335
|
+
if (part.type === 'text')
|
|
336
|
+
return String(part.text ?? '');
|
|
337
|
+
if (part.type === 'thinking')
|
|
338
|
+
return String(part.thinking ?? '');
|
|
339
|
+
return '';
|
|
340
|
+
})
|
|
341
|
+
.join('');
|
|
342
|
+
}
|
|
343
|
+
function toDate(value) {
|
|
344
|
+
if (value instanceof Date) {
|
|
345
|
+
return Number.isNaN(value.getTime()) ? null : value;
|
|
346
|
+
}
|
|
347
|
+
if (typeof value === 'string' || typeof value === 'number') {
|
|
348
|
+
const parsed = new Date(value);
|
|
349
|
+
return Number.isNaN(parsed.getTime()) ? null : parsed;
|
|
350
|
+
}
|
|
351
|
+
return null;
|
|
352
|
+
}
|
|
353
|
+
async function createDefaultLinxPiPodSessionSource() {
|
|
354
|
+
const contextPromise = createDefaultPodSessionContext();
|
|
355
|
+
return {
|
|
356
|
+
async listSessions(cwd) {
|
|
357
|
+
const context = await contextPromise;
|
|
358
|
+
return context ? createNativeLinxPiPodSessionSource(context).listSessions(cwd) : [];
|
|
359
|
+
},
|
|
360
|
+
async findSession(input, cwd) {
|
|
361
|
+
const context = await contextPromise;
|
|
362
|
+
return context ? createNativeLinxPiPodSessionSource(context).findSession(input, cwd) : null;
|
|
363
|
+
},
|
|
364
|
+
};
|
|
365
|
+
}
|
|
366
|
+
async function createDefaultPodSessionContext() {
|
|
367
|
+
const [credentialsStore, oidcAuth, solidAuth] = await Promise.all([
|
|
368
|
+
import('../credentials-store.js'),
|
|
369
|
+
import('../oidc-auth.js'),
|
|
370
|
+
import('../solid-auth.js'),
|
|
371
|
+
]);
|
|
372
|
+
const credentials = credentialsStore.loadCredentials();
|
|
373
|
+
if (!credentials) {
|
|
374
|
+
return null;
|
|
375
|
+
}
|
|
376
|
+
const clientCredentials = credentialsStore.getClientCredentials(credentials);
|
|
377
|
+
let session;
|
|
378
|
+
if (clientCredentials) {
|
|
379
|
+
session = (await solidAuth.authenticate(getClientCredentialId(clientCredentials), getClientCredentialKey(clientCredentials), credentials.url)).session;
|
|
380
|
+
const webId = session.info.webId || credentials.webId;
|
|
381
|
+
if (!webId) {
|
|
382
|
+
return null;
|
|
383
|
+
}
|
|
384
|
+
return {
|
|
385
|
+
webId,
|
|
386
|
+
fetch: (url, init) => session.fetch(url, init),
|
|
387
|
+
};
|
|
388
|
+
}
|
|
389
|
+
else if (credentials.authType === 'oidc_oauth') {
|
|
390
|
+
const accessToken = await oidcAuth.getOidcAccessToken(credentials);
|
|
391
|
+
if (!accessToken) {
|
|
392
|
+
return null;
|
|
393
|
+
}
|
|
394
|
+
if (!credentials.webId) {
|
|
395
|
+
return null;
|
|
396
|
+
}
|
|
397
|
+
return {
|
|
398
|
+
webId: credentials.webId,
|
|
399
|
+
fetch: (url, init) => solidAuth.authenticatedFetch(url, accessToken, init),
|
|
400
|
+
};
|
|
401
|
+
}
|
|
402
|
+
else {
|
|
403
|
+
return null;
|
|
404
|
+
}
|
|
405
|
+
}
|
|
406
|
+
async function listPodSessionSnapshots(context, cwd) {
|
|
407
|
+
const sessionUrls = await listTurtleResources(context.fetch, `${podBaseUrlFromWebId(context.webId)}/.data/session/`);
|
|
408
|
+
const snapshots = (await mapWithConcurrency(sessionUrls, 6, (sessionUrl) => (readPodSessionSnapshot(context, sessionUrl, { expectedCwd: cwd }).catch(() => null))))
|
|
409
|
+
.filter((snapshot) => snapshot !== null);
|
|
410
|
+
return snapshots.sort((a, b) => {
|
|
411
|
+
const aTime = toDate(a.updatedAt)?.getTime() ?? 0;
|
|
412
|
+
const bTime = toDate(b.updatedAt)?.getTime() ?? 0;
|
|
413
|
+
return bTime - aTime;
|
|
414
|
+
});
|
|
415
|
+
}
|
|
416
|
+
async function readPodSessionSnapshot(context, sessionUrl, options = {}) {
|
|
417
|
+
const turtle = await readTurtleResource(context.fetch, sessionUrl);
|
|
418
|
+
if (!turtle) {
|
|
419
|
+
return null;
|
|
420
|
+
}
|
|
421
|
+
const blocks = parseManagedTurtleBlocks(turtle, sessionUrl);
|
|
422
|
+
const predicates = blocks.get(sessionUrl)
|
|
423
|
+
?? [...blocks.values()].find((entry) => firstLiteral(entry, UDFS_SESSION_TOOL) === 'linx');
|
|
424
|
+
if (!(predicates instanceof Map)) {
|
|
425
|
+
return null;
|
|
426
|
+
}
|
|
427
|
+
if (firstLiteral(predicates, UDFS_SESSION_TOOL) !== 'linx') {
|
|
428
|
+
return null;
|
|
429
|
+
}
|
|
430
|
+
const chatUri = firstIri(predicates, UDFS_CONVERSATION);
|
|
431
|
+
const legacyChatId = firstLiteral(predicates, UDFS_CONVERSATION);
|
|
432
|
+
if (chatUri && chatUri !== buildChatUri(context.webId)) {
|
|
433
|
+
return null;
|
|
434
|
+
}
|
|
435
|
+
if (!chatUri && legacyChatId !== PI_CHAT_ID) {
|
|
436
|
+
return null;
|
|
437
|
+
}
|
|
438
|
+
const ownerWebId = firstIri(predicates, UDFS_ACTOR);
|
|
439
|
+
if (ownerWebId && ownerWebId !== context.webId) {
|
|
440
|
+
return null;
|
|
441
|
+
}
|
|
442
|
+
const id = decodeURIComponent(sessionUrl.split('/').pop()?.replace(/\.ttl$/, '') ?? '');
|
|
443
|
+
if (!id) {
|
|
444
|
+
return null;
|
|
445
|
+
}
|
|
446
|
+
const metadata = parseMetadataPredicates(predicates);
|
|
447
|
+
const sessionCwd = typeof metadata.cwd === 'string' ? metadata.cwd : undefined;
|
|
448
|
+
if (options.expectedCwd && sessionCwd !== options.expectedCwd) {
|
|
449
|
+
return null;
|
|
450
|
+
}
|
|
451
|
+
const storedThreadUri = firstIri(predicates, UDFS_IN_THREAD);
|
|
452
|
+
const legacyThreadId = firstLiteral(predicates, UDFS_IN_THREAD);
|
|
453
|
+
const threadUri = storedThreadUri
|
|
454
|
+
?? (typeof metadata.threadUri === 'string'
|
|
455
|
+
? metadata.threadUri
|
|
456
|
+
: buildThreadUri(context.webId, PI_CHAT_ID, legacyThreadId ?? id));
|
|
457
|
+
const messages = await listPodSessionMessages(context, id, threadUri, metadata.messageResources);
|
|
458
|
+
return {
|
|
459
|
+
id,
|
|
460
|
+
cwd: sessionCwd,
|
|
461
|
+
createdAt: normalizeUnknownDate(firstLiteral(predicates, DCT_CREATED)),
|
|
462
|
+
updatedAt: normalizeUnknownDate(firstLiteral(predicates, DCT_MODIFIED)),
|
|
463
|
+
sessionFile: typeof metadata.sessionFile === 'string' ? metadata.sessionFile : undefined,
|
|
464
|
+
messages,
|
|
465
|
+
};
|
|
466
|
+
}
|
|
467
|
+
async function mapWithConcurrency(items, concurrency, mapper) {
|
|
468
|
+
const results = new Array(items.length);
|
|
469
|
+
let nextIndex = 0;
|
|
470
|
+
const workerCount = Math.min(Math.max(1, concurrency), items.length);
|
|
471
|
+
await Promise.all(Array.from({ length: workerCount }, async () => {
|
|
472
|
+
while (nextIndex < items.length) {
|
|
473
|
+
const index = nextIndex;
|
|
474
|
+
nextIndex += 1;
|
|
475
|
+
results[index] = await mapper(items[index]);
|
|
476
|
+
}
|
|
477
|
+
}));
|
|
478
|
+
return results;
|
|
479
|
+
}
|
|
480
|
+
async function listPodSessionMessages(context, sessionId, threadUri, messageResources) {
|
|
481
|
+
const resolvedThreadUri = typeof threadUri === 'string' && threadUri
|
|
482
|
+
? threadUri
|
|
483
|
+
: buildThreadUri(context.webId, PI_CHAT_ID, sessionId);
|
|
484
|
+
const urls = normalizeMessageResourceUrls(messageResources);
|
|
485
|
+
if (urls.length === 0) {
|
|
486
|
+
urls.push(...await candidateMessageResourceUrls(context.fetch, context.webId));
|
|
487
|
+
}
|
|
488
|
+
const messages = [];
|
|
489
|
+
for (const url of urls) {
|
|
490
|
+
const turtle = await readTurtleResource(context.fetch, url).catch(() => null);
|
|
491
|
+
if (!turtle) {
|
|
492
|
+
continue;
|
|
493
|
+
}
|
|
494
|
+
for (const [subject, predicates] of parseManagedTurtleBlocks(turtle, url)) {
|
|
495
|
+
if (!subject.includes(`${sessionId}-`)) {
|
|
496
|
+
continue;
|
|
497
|
+
}
|
|
498
|
+
const richContent = firstLiteral(predicates, SIOC_RICH_CONTENT);
|
|
499
|
+
if (richContent) {
|
|
500
|
+
const parsed = parsePodRichContent(richContent);
|
|
501
|
+
const entry = parsed.entry;
|
|
502
|
+
if (entry?.id && !subject.endsWith(`${sessionId}-${entry.id}`)) {
|
|
503
|
+
continue;
|
|
504
|
+
}
|
|
505
|
+
}
|
|
506
|
+
if (turtle.includes(`<${resolvedThreadUri}>`) || subject.includes(`${sessionId}-`)) {
|
|
507
|
+
messages.push({
|
|
508
|
+
id: decodeURIComponent(subject.split('#').pop() ?? subject),
|
|
509
|
+
role: firstLiteral(predicates, 'https://undefineds.co/ns#messageType'),
|
|
510
|
+
content: firstLiteral(predicates, SIOC_CONTENT),
|
|
511
|
+
richContent,
|
|
512
|
+
createdAt: normalizeUnknownDate(firstLiteral(predicates, DCT_CREATED)),
|
|
513
|
+
updatedAt: normalizeUnknownDate(firstLiteral(predicates, DCT_MODIFIED)),
|
|
514
|
+
});
|
|
515
|
+
}
|
|
516
|
+
}
|
|
517
|
+
}
|
|
518
|
+
return messages
|
|
519
|
+
.filter((message) => message.id)
|
|
520
|
+
.sort((a, b) => {
|
|
521
|
+
const aTime = toDate(a.createdAt)?.getTime() ?? 0;
|
|
522
|
+
const bTime = toDate(b.createdAt)?.getTime() ?? 0;
|
|
523
|
+
return aTime - bTime;
|
|
524
|
+
});
|
|
525
|
+
}
|
|
526
|
+
function normalizeMessageResourceUrls(value) {
|
|
527
|
+
if (!Array.isArray(value)) {
|
|
528
|
+
return [];
|
|
529
|
+
}
|
|
530
|
+
return [...new Set(value.filter((entry) => (typeof entry === 'string' && entry.startsWith('http') && entry.endsWith('.ttl'))))];
|
|
531
|
+
}
|
|
532
|
+
async function candidateMessageResourceUrls(fetcher, webId) {
|
|
533
|
+
const chatBase = `${podBaseUrlFromWebId(webId)}/.data/chat/${PI_CHAT_ID}/`;
|
|
534
|
+
const discovered = new Set();
|
|
535
|
+
const yearContainers = await listChildContainers(fetcher, chatBase);
|
|
536
|
+
for (const yearContainer of yearContainers) {
|
|
537
|
+
const monthContainers = await listChildContainers(fetcher, yearContainer);
|
|
538
|
+
for (const monthContainer of monthContainers) {
|
|
539
|
+
const dayContainers = await listChildContainers(fetcher, monthContainer);
|
|
540
|
+
for (const dayContainer of dayContainers) {
|
|
541
|
+
discovered.add(new URL('messages.ttl', dayContainer).toString());
|
|
542
|
+
}
|
|
543
|
+
}
|
|
544
|
+
}
|
|
545
|
+
if (discovered.size === 0) {
|
|
546
|
+
const now = new Date();
|
|
547
|
+
discovered.add(buildMessageResourceUrl(webId, PI_CHAT_ID, now));
|
|
548
|
+
}
|
|
549
|
+
return [...discovered].sort();
|
|
550
|
+
}
|
|
551
|
+
async function listChildContainers(fetcher, containerUrl) {
|
|
552
|
+
const response = await fetcher(containerUrl, {
|
|
553
|
+
method: 'GET',
|
|
554
|
+
headers: { Accept: 'text/turtle, application/ld+json;q=0.8, */*;q=0.1' },
|
|
555
|
+
});
|
|
556
|
+
if (response.status === 404) {
|
|
557
|
+
return [];
|
|
558
|
+
}
|
|
559
|
+
if (!response.ok) {
|
|
560
|
+
return [];
|
|
561
|
+
}
|
|
562
|
+
const text = await response.text();
|
|
563
|
+
const urls = new Set();
|
|
564
|
+
const base = new URL(containerUrl);
|
|
565
|
+
const relativeRegexp = /[<"]([^<>"']+\/)[>"]/g;
|
|
566
|
+
let match;
|
|
567
|
+
while ((match = relativeRegexp.exec(text))) {
|
|
568
|
+
urls.add(new URL(match[1], base).toString());
|
|
569
|
+
}
|
|
570
|
+
const absoluteRegexp = /(https?:\/\/[^<>"'\s)]+\/)/g;
|
|
571
|
+
for (const absolute of text.matchAll(absoluteRegexp)) {
|
|
572
|
+
const url = absolute[1];
|
|
573
|
+
if (url.startsWith(containerUrl) && url !== containerUrl) {
|
|
574
|
+
urls.add(url);
|
|
575
|
+
}
|
|
576
|
+
}
|
|
577
|
+
return [...urls].sort();
|
|
578
|
+
}
|
|
579
|
+
function normalizeUnknownDate(value) {
|
|
580
|
+
if (value instanceof Date || typeof value === 'string' || typeof value === 'number') {
|
|
581
|
+
return value;
|
|
582
|
+
}
|
|
583
|
+
return undefined;
|
|
584
|
+
}
|
|
585
|
+
function parseJsonObject(value) {
|
|
586
|
+
if (!value) {
|
|
587
|
+
return {};
|
|
588
|
+
}
|
|
589
|
+
try {
|
|
590
|
+
const parsed = JSON.parse(value);
|
|
591
|
+
return isRecord(parsed) ? parsed : {};
|
|
592
|
+
}
|
|
593
|
+
catch {
|
|
594
|
+
return {};
|
|
595
|
+
}
|
|
596
|
+
}
|
|
597
|
+
function parseMetadataPredicates(predicates) {
|
|
598
|
+
const values = predicates.get(UDFS_METADATA) ?? [];
|
|
599
|
+
const parsed = values
|
|
600
|
+
.filter((entry) => entry.type === 'literal')
|
|
601
|
+
.map((entry) => parseJsonObject(entry.value))
|
|
602
|
+
.filter((entry) => Object.keys(entry).length > 0);
|
|
603
|
+
for (let index = parsed.length - 1; index >= 0; index -= 1) {
|
|
604
|
+
if (Array.isArray(parsed[index].messageResources)) {
|
|
605
|
+
return parsed[index];
|
|
606
|
+
}
|
|
607
|
+
}
|
|
608
|
+
return parsed[parsed.length - 1] ?? {};
|
|
609
|
+
}
|
|
610
|
+
function isRecord(value) {
|
|
611
|
+
return typeof value === 'object' && value !== null;
|
|
612
|
+
}
|
|
613
|
+
//# sourceMappingURL=session.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session.js","sourceRoot":"","sources":["../../../src/lib/pi-adapter/session.ts"],"names":[],"mappings":"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"}
|