@undefineds.co/linx 0.2.1
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/README.md +91 -0
- package/dist/index.js +578 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/account-api.js +100 -0
- package/dist/lib/account-api.js.map +1 -0
- package/dist/lib/account-session.js +30 -0
- package/dist/lib/account-session.js.map +1 -0
- package/dist/lib/ai-command.js +411 -0
- package/dist/lib/ai-command.js.map +1 -0
- package/dist/lib/chat-api.js +122 -0
- package/dist/lib/chat-api.js.map +1 -0
- package/dist/lib/codex-plugin/bridge.js +109 -0
- package/dist/lib/codex-plugin/bridge.js.map +1 -0
- package/dist/lib/codex-plugin/codex-native-proxy.js +358 -0
- package/dist/lib/codex-plugin/codex-native-proxy.js.map +1 -0
- package/dist/lib/codex-plugin/index.js +4 -0
- package/dist/lib/codex-plugin/index.js.map +1 -0
- package/dist/lib/codex-plugin/runner.js +38 -0
- package/dist/lib/codex-plugin/runner.js.map +1 -0
- package/dist/lib/credentials-store.js +74 -0
- package/dist/lib/credentials-store.js.map +1 -0
- package/dist/lib/default-model.js +8 -0
- package/dist/lib/default-model.js.map +1 -0
- package/dist/lib/login-command.js +51 -0
- package/dist/lib/login-command.js.map +1 -0
- package/dist/lib/models.js +6 -0
- package/dist/lib/models.js.map +1 -0
- package/dist/lib/oidc-auth.js +451 -0
- package/dist/lib/oidc-auth.js.map +1 -0
- package/dist/lib/oidc-session-storage.js +37 -0
- package/dist/lib/oidc-session-storage.js.map +1 -0
- package/dist/lib/pi-adapter/auth.js +38 -0
- package/dist/lib/pi-adapter/auth.js.map +1 -0
- package/dist/lib/pi-adapter/branding.js +239 -0
- package/dist/lib/pi-adapter/branding.js.map +1 -0
- package/dist/lib/pi-adapter/index.js +4 -0
- package/dist/lib/pi-adapter/index.js.map +1 -0
- package/dist/lib/pi-adapter/interactive.js +63 -0
- package/dist/lib/pi-adapter/interactive.js.map +1 -0
- package/dist/lib/pi-adapter/runtime.js +271 -0
- package/dist/lib/pi-adapter/runtime.js.map +1 -0
- package/dist/lib/pi-adapter/stream.js +314 -0
- package/dist/lib/pi-adapter/stream.js.map +1 -0
- package/dist/lib/pi-adapter/theme.js +84 -0
- package/dist/lib/pi-adapter/theme.js.map +1 -0
- package/dist/lib/pod-chat-store.js +200 -0
- package/dist/lib/pod-chat-store.js.map +1 -0
- package/dist/lib/profile-identity.js +116 -0
- package/dist/lib/profile-identity.js.map +1 -0
- package/dist/lib/prompt.js +82 -0
- package/dist/lib/prompt.js.map +1 -0
- package/dist/lib/runtime-target.js +12 -0
- package/dist/lib/runtime-target.js.map +1 -0
- package/dist/lib/solid-auth.js +55 -0
- package/dist/lib/solid-auth.js.map +1 -0
- package/dist/lib/thread-utils.js +12 -0
- package/dist/lib/thread-utils.js.map +1 -0
- package/dist/lib/watch/archive.js +110 -0
- package/dist/lib/watch/archive.js.map +1 -0
- package/dist/lib/watch/auth.js +56 -0
- package/dist/lib/watch/auth.js.map +1 -0
- package/dist/lib/watch/codex-composer.js +219 -0
- package/dist/lib/watch/codex-composer.js.map +1 -0
- package/dist/lib/watch/codex-footer.js +88 -0
- package/dist/lib/watch/codex-footer.js.map +1 -0
- package/dist/lib/watch/codex-overlay.js +154 -0
- package/dist/lib/watch/codex-overlay.js.map +1 -0
- package/dist/lib/watch/codex-request-form.js +341 -0
- package/dist/lib/watch/codex-request-form.js.map +1 -0
- package/dist/lib/watch/codex-request-input.js +187 -0
- package/dist/lib/watch/codex-request-input.js.map +1 -0
- package/dist/lib/watch/display.js +1514 -0
- package/dist/lib/watch/display.js.map +1 -0
- package/dist/lib/watch/format.js +161 -0
- package/dist/lib/watch/format.js.map +1 -0
- package/dist/lib/watch/hooks/claude.js +12 -0
- package/dist/lib/watch/hooks/claude.js.map +1 -0
- package/dist/lib/watch/hooks/codebuddy.js +18 -0
- package/dist/lib/watch/hooks/codebuddy.js.map +1 -0
- package/dist/lib/watch/hooks/codex.js +13 -0
- package/dist/lib/watch/hooks/codex.js.map +1 -0
- package/dist/lib/watch/hooks/index.js +24 -0
- package/dist/lib/watch/hooks/index.js.map +1 -0
- package/dist/lib/watch/hooks/shared.js +19 -0
- package/dist/lib/watch/hooks/shared.js.map +1 -0
- package/dist/lib/watch/index.js +10 -0
- package/dist/lib/watch/index.js.map +1 -0
- package/dist/lib/watch/pod-ai.js +168 -0
- package/dist/lib/watch/pod-ai.js.map +1 -0
- package/dist/lib/watch/pod-approval.js +578 -0
- package/dist/lib/watch/pod-approval.js.map +1 -0
- package/dist/lib/watch/pod-persistence.js +226 -0
- package/dist/lib/watch/pod-persistence.js.map +1 -0
- package/dist/lib/watch/runner.js +1124 -0
- package/dist/lib/watch/runner.js.map +1 -0
- package/dist/lib/watch/types.js +2 -0
- package/dist/lib/watch/types.js.map +1 -0
- package/dist/watch-cli.js +142 -0
- package/dist/watch-cli.js.map +1 -0
- package/package.json +38 -0
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
import { mkdirSync, writeFileSync } from 'node:fs';
|
|
2
|
+
import { join } from 'node:path';
|
|
3
|
+
const LINX_THEME = {
|
|
4
|
+
$schema: 'https://raw.githubusercontent.com/badlogic/pi-mono/main/packages/coding-agent/src/modes/interactive/theme/theme-schema.json',
|
|
5
|
+
name: 'linx',
|
|
6
|
+
vars: {
|
|
7
|
+
cyan: '#6DB9C8',
|
|
8
|
+
blue: '#6F7FA8',
|
|
9
|
+
green: '#b5bd68',
|
|
10
|
+
red: '#cc6666',
|
|
11
|
+
yellow: '#ffff00',
|
|
12
|
+
gray: '#808080',
|
|
13
|
+
dimGray: '#666666',
|
|
14
|
+
darkGray: '#505050',
|
|
15
|
+
accent: '#8B7AA8',
|
|
16
|
+
selectedBg: '#2A2633',
|
|
17
|
+
userMsgBg: '#4F3F68',
|
|
18
|
+
toolPendingBg: '#282832',
|
|
19
|
+
toolSuccessBg: '#283228',
|
|
20
|
+
toolErrorBg: '#3c2828',
|
|
21
|
+
customMsgBg: '#292631',
|
|
22
|
+
},
|
|
23
|
+
colors: {
|
|
24
|
+
accent: 'accent',
|
|
25
|
+
border: 'blue',
|
|
26
|
+
borderAccent: 'cyan',
|
|
27
|
+
borderMuted: 'darkGray',
|
|
28
|
+
success: 'green',
|
|
29
|
+
error: 'red',
|
|
30
|
+
warning: 'yellow',
|
|
31
|
+
muted: 'gray',
|
|
32
|
+
dim: 'dimGray',
|
|
33
|
+
text: '',
|
|
34
|
+
thinkingText: 'gray',
|
|
35
|
+
selectedBg: 'selectedBg',
|
|
36
|
+
userMessageBg: 'userMsgBg',
|
|
37
|
+
userMessageText: '#FFFFFF',
|
|
38
|
+
customMessageBg: 'customMsgBg',
|
|
39
|
+
customMessageText: '',
|
|
40
|
+
customMessageLabel: '#8B7AA8',
|
|
41
|
+
toolPendingBg: 'toolPendingBg',
|
|
42
|
+
toolSuccessBg: 'toolSuccessBg',
|
|
43
|
+
toolErrorBg: 'toolErrorBg',
|
|
44
|
+
toolTitle: '',
|
|
45
|
+
toolOutput: 'gray',
|
|
46
|
+
mdHeading: '#f0c674',
|
|
47
|
+
mdLink: '#81a2be',
|
|
48
|
+
mdLinkUrl: 'dimGray',
|
|
49
|
+
mdCode: 'accent',
|
|
50
|
+
mdCodeBlock: 'green',
|
|
51
|
+
mdCodeBlockBorder: 'gray',
|
|
52
|
+
mdQuote: 'gray',
|
|
53
|
+
mdQuoteBorder: 'gray',
|
|
54
|
+
mdHr: 'gray',
|
|
55
|
+
mdListBullet: 'accent',
|
|
56
|
+
toolDiffAdded: 'green',
|
|
57
|
+
toolDiffRemoved: 'red',
|
|
58
|
+
toolDiffContext: 'gray',
|
|
59
|
+
syntaxComment: '#6A9955',
|
|
60
|
+
syntaxKeyword: '#569CD6',
|
|
61
|
+
syntaxFunction: '#DCDCAA',
|
|
62
|
+
syntaxVariable: '#9CDCFE',
|
|
63
|
+
syntaxString: '#CE9178',
|
|
64
|
+
syntaxNumber: '#B5CEA8',
|
|
65
|
+
syntaxType: '#4EC9B0',
|
|
66
|
+
syntaxOperator: '#D4D4D4',
|
|
67
|
+
syntaxPunctuation: '#D4D4D4',
|
|
68
|
+
thinkingOff: 'darkGray',
|
|
69
|
+
thinkingMinimal: '#6e6e6e',
|
|
70
|
+
thinkingLow: '#5f87af',
|
|
71
|
+
thinkingMedium: '#81a2be',
|
|
72
|
+
thinkingHigh: '#b294bb',
|
|
73
|
+
thinkingXhigh: '#d183e8',
|
|
74
|
+
bashMode: 'green',
|
|
75
|
+
},
|
|
76
|
+
};
|
|
77
|
+
export function ensureLinxPiTheme(agentDir) {
|
|
78
|
+
const themesDir = join(agentDir, 'themes');
|
|
79
|
+
mkdirSync(themesDir, { recursive: true });
|
|
80
|
+
const themePath = join(themesDir, 'linx.json');
|
|
81
|
+
writeFileSync(themePath, `${JSON.stringify(LINX_THEME, null, 2)}\n`);
|
|
82
|
+
return themePath;
|
|
83
|
+
}
|
|
84
|
+
//# sourceMappingURL=theme.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"theme.js","sourceRoot":"","sources":["../../../src/lib/pi-adapter/theme.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,SAAS,CAAA;AAClD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAEhC,MAAM,UAAU,GAAG;IACjB,OAAO,EAAE,6HAA6H;IACtI,IAAI,EAAE,MAAM;IACZ,IAAI,EAAE;QACJ,IAAI,EAAE,SAAS;QACf,IAAI,EAAE,SAAS;QACf,KAAK,EAAE,SAAS;QAChB,GAAG,EAAE,SAAS;QACd,MAAM,EAAE,SAAS;QACjB,IAAI,EAAE,SAAS;QACf,OAAO,EAAE,SAAS;QAClB,QAAQ,EAAE,SAAS;QACnB,MAAM,EAAE,SAAS;QACjB,UAAU,EAAE,SAAS;QACrB,SAAS,EAAE,SAAS;QACpB,aAAa,EAAE,SAAS;QACxB,aAAa,EAAE,SAAS;QACxB,WAAW,EAAE,SAAS;QACtB,WAAW,EAAE,SAAS;KACvB;IACD,MAAM,EAAE;QACN,MAAM,EAAE,QAAQ;QAChB,MAAM,EAAE,MAAM;QACd,YAAY,EAAE,MAAM;QACpB,WAAW,EAAE,UAAU;QACvB,OAAO,EAAE,OAAO;QAChB,KAAK,EAAE,KAAK;QACZ,OAAO,EAAE,QAAQ;QACjB,KAAK,EAAE,MAAM;QACb,GAAG,EAAE,SAAS;QACd,IAAI,EAAE,EAAE;QACR,YAAY,EAAE,MAAM;QACpB,UAAU,EAAE,YAAY;QACxB,aAAa,EAAE,WAAW;QAC1B,eAAe,EAAE,SAAS;QAC1B,eAAe,EAAE,aAAa;QAC9B,iBAAiB,EAAE,EAAE;QACrB,kBAAkB,EAAE,SAAS;QAC7B,aAAa,EAAE,eAAe;QAC9B,aAAa,EAAE,eAAe;QAC9B,WAAW,EAAE,aAAa;QAC1B,SAAS,EAAE,EAAE;QACb,UAAU,EAAE,MAAM;QAClB,SAAS,EAAE,SAAS;QACpB,MAAM,EAAE,SAAS;QACjB,SAAS,EAAE,SAAS;QACpB,MAAM,EAAE,QAAQ;QAChB,WAAW,EAAE,OAAO;QACpB,iBAAiB,EAAE,MAAM;QACzB,OAAO,EAAE,MAAM;QACf,aAAa,EAAE,MAAM;QACrB,IAAI,EAAE,MAAM;QACZ,YAAY,EAAE,QAAQ;QACtB,aAAa,EAAE,OAAO;QACtB,eAAe,EAAE,KAAK;QACtB,eAAe,EAAE,MAAM;QACvB,aAAa,EAAE,SAAS;QACxB,aAAa,EAAE,SAAS;QACxB,cAAc,EAAE,SAAS;QACzB,cAAc,EAAE,SAAS;QACzB,YAAY,EAAE,SAAS;QACvB,YAAY,EAAE,SAAS;QACvB,UAAU,EAAE,SAAS;QACrB,cAAc,EAAE,SAAS;QACzB,iBAAiB,EAAE,SAAS;QAC5B,WAAW,EAAE,UAAU;QACvB,eAAe,EAAE,SAAS;QAC1B,WAAW,EAAE,SAAS;QACtB,cAAc,EAAE,SAAS;QACzB,YAAY,EAAE,SAAS;QACvB,aAAa,EAAE,SAAS;QACxB,QAAQ,EAAE,OAAO;KAClB;CACF,CAAA;AAED,MAAM,UAAU,iBAAiB,CAAC,QAAgB;IAChD,MAAM,SAAS,GAAG,IAAI,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAA;IAC1C,SAAS,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;IACzC,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,EAAE,WAAW,CAAC,CAAA;IAC9C,aAAa,CAAC,SAAS,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,UAAU,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAA;IACpE,OAAO,SAAS,CAAA;AAClB,CAAC"}
|
|
@@ -0,0 +1,200 @@
|
|
|
1
|
+
import { agentTable, chatTable, drizzle, eq, findPodRowByStorageId, initSolidTables, solidSchema, messageTable, sessionTable, threadTable, whereByPodStorageId, } from './models.js';
|
|
2
|
+
import { DEFAULT_LINX_CLOUD_MODEL_ID } from './default-model.js';
|
|
3
|
+
import { formatThreadLabel, toOpenAiMessages } from './thread-utils.js';
|
|
4
|
+
const DEFAULT_CHAT_ID = 'cli-default';
|
|
5
|
+
const DEFAULT_AGENT_ID = 'linx-cli-assistant';
|
|
6
|
+
function extractChatId(chatIdOrUri) {
|
|
7
|
+
if (!chatIdOrUri)
|
|
8
|
+
return DEFAULT_CHAT_ID;
|
|
9
|
+
if (chatIdOrUri.includes('#')) {
|
|
10
|
+
const match = chatIdOrUri.match(/\.data\/chat\/([^/]+)\/index\.ttl#this/);
|
|
11
|
+
if (match)
|
|
12
|
+
return match[1];
|
|
13
|
+
}
|
|
14
|
+
return chatIdOrUri;
|
|
15
|
+
}
|
|
16
|
+
function extractThreadId(threadIdOrUri) {
|
|
17
|
+
if (!threadIdOrUri)
|
|
18
|
+
return undefined;
|
|
19
|
+
if (threadIdOrUri.includes('#')) {
|
|
20
|
+
return threadIdOrUri.split('#').pop() || undefined;
|
|
21
|
+
}
|
|
22
|
+
return threadIdOrUri;
|
|
23
|
+
}
|
|
24
|
+
function getPodBaseUrl(webId) {
|
|
25
|
+
return webId.replace('/profile/card#me', '').replace(/\/$/, '');
|
|
26
|
+
}
|
|
27
|
+
function buildAgentUri(webId, agentId) {
|
|
28
|
+
return `${getPodBaseUrl(webId)}/.data/agents/${agentId}.ttl`;
|
|
29
|
+
}
|
|
30
|
+
function createDb(session) {
|
|
31
|
+
return drizzle(session, {
|
|
32
|
+
logger: false,
|
|
33
|
+
disableInteropDiscovery: true,
|
|
34
|
+
schema: solidSchema,
|
|
35
|
+
});
|
|
36
|
+
}
|
|
37
|
+
export async function initPodData(session) {
|
|
38
|
+
const db = createDb(session);
|
|
39
|
+
try {
|
|
40
|
+
await initSolidTables(db, [chatTable, threadTable, messageTable, sessionTable, agentTable]);
|
|
41
|
+
}
|
|
42
|
+
catch {
|
|
43
|
+
// 容器可能已存在,MVP 允许继续。
|
|
44
|
+
}
|
|
45
|
+
return db;
|
|
46
|
+
}
|
|
47
|
+
async function ensureCliAgent(db, webId) {
|
|
48
|
+
const existing = await findPodRowByStorageId(db, webId, agentTable, DEFAULT_AGENT_ID);
|
|
49
|
+
if (existing) {
|
|
50
|
+
return;
|
|
51
|
+
}
|
|
52
|
+
const now = new Date();
|
|
53
|
+
await db.insert(agentTable).values({
|
|
54
|
+
id: DEFAULT_AGENT_ID,
|
|
55
|
+
name: 'LinX CLI Assistant',
|
|
56
|
+
provider: 'xpod',
|
|
57
|
+
model: DEFAULT_LINX_CLOUD_MODEL_ID,
|
|
58
|
+
createdAt: now,
|
|
59
|
+
updatedAt: now,
|
|
60
|
+
}).execute();
|
|
61
|
+
}
|
|
62
|
+
export async function getOrCreateDefaultChat(session) {
|
|
63
|
+
const db = await initPodData(session);
|
|
64
|
+
const webId = session.info.webId;
|
|
65
|
+
if (!webId) {
|
|
66
|
+
throw new Error('Missing webId in Solid session');
|
|
67
|
+
}
|
|
68
|
+
await ensureCliAgent(db, webId);
|
|
69
|
+
const existing = await findPodRowByStorageId(db, webId, chatTable, DEFAULT_CHAT_ID);
|
|
70
|
+
if (existing) {
|
|
71
|
+
return DEFAULT_CHAT_ID;
|
|
72
|
+
}
|
|
73
|
+
const now = new Date();
|
|
74
|
+
await db.insert(chatTable).values({
|
|
75
|
+
id: DEFAULT_CHAT_ID,
|
|
76
|
+
title: 'LinX CLI',
|
|
77
|
+
participants: [],
|
|
78
|
+
createdAt: now,
|
|
79
|
+
updatedAt: now,
|
|
80
|
+
lastActiveAt: now,
|
|
81
|
+
}).execute();
|
|
82
|
+
return DEFAULT_CHAT_ID;
|
|
83
|
+
}
|
|
84
|
+
export async function listThreads(session, chatId) {
|
|
85
|
+
const db = await initPodData(session);
|
|
86
|
+
const chatCol = threadTable.chat;
|
|
87
|
+
const rows = await db.select().from(threadTable).where(eq(chatCol, chatId)).orderBy('updatedAt', 'desc').execute();
|
|
88
|
+
return rows.map((row) => ({
|
|
89
|
+
id: String(row.id),
|
|
90
|
+
title: row.title || undefined,
|
|
91
|
+
workspace: row.workspace || undefined,
|
|
92
|
+
updatedAt: row.updatedAt ? new Date(row.updatedAt) : undefined,
|
|
93
|
+
}));
|
|
94
|
+
}
|
|
95
|
+
export async function createThread(session, chatId, workspace, title) {
|
|
96
|
+
const db = await initPodData(session);
|
|
97
|
+
const threadId = crypto.randomUUID();
|
|
98
|
+
const now = new Date();
|
|
99
|
+
await db.insert(threadTable).values({
|
|
100
|
+
id: threadId,
|
|
101
|
+
chat: chatId,
|
|
102
|
+
title: title || 'CLI Session',
|
|
103
|
+
workspace: workspace || undefined,
|
|
104
|
+
createdAt: now,
|
|
105
|
+
updatedAt: now,
|
|
106
|
+
}).execute();
|
|
107
|
+
return threadId;
|
|
108
|
+
}
|
|
109
|
+
export async function touchThread(session, threadId) {
|
|
110
|
+
const db = await initPodData(session);
|
|
111
|
+
const webId = session.info.webId;
|
|
112
|
+
if (!webId) {
|
|
113
|
+
throw new Error('Missing webId in Solid session');
|
|
114
|
+
}
|
|
115
|
+
await whereByPodStorageId(webId, threadTable, db.update(threadTable).set({ updatedAt: new Date() }), threadId).execute();
|
|
116
|
+
}
|
|
117
|
+
export async function loadMessages(session, threadId) {
|
|
118
|
+
const db = await initPodData(session);
|
|
119
|
+
const createdAtCol = messageTable.createdAt;
|
|
120
|
+
const thread = await loadThread(session, threadId);
|
|
121
|
+
if (!thread) {
|
|
122
|
+
return [];
|
|
123
|
+
}
|
|
124
|
+
const chatId = extractChatId(thread.chat);
|
|
125
|
+
const rows = await db.select().from(messageTable).orderBy(createdAtCol).execute();
|
|
126
|
+
return rows
|
|
127
|
+
.filter((row) => (extractChatId(row.chat) === chatId
|
|
128
|
+
&& extractThreadId(row.thread) === threadId))
|
|
129
|
+
.filter((row) => row.role === 'user' || row.role === 'assistant' || row.role === 'system')
|
|
130
|
+
.map((row) => ({
|
|
131
|
+
role: row.role,
|
|
132
|
+
content: row.content,
|
|
133
|
+
createdAt: row.createdAt ? new Date(row.createdAt).toISOString() : new Date().toISOString(),
|
|
134
|
+
}));
|
|
135
|
+
}
|
|
136
|
+
export async function saveUserMessage(session, chatId, threadId, content) {
|
|
137
|
+
const db = await initPodData(session);
|
|
138
|
+
const now = new Date();
|
|
139
|
+
const webId = session.info.webId;
|
|
140
|
+
if (!webId) {
|
|
141
|
+
throw new Error('Missing webId in Solid session');
|
|
142
|
+
}
|
|
143
|
+
await db.insert(messageTable).values({
|
|
144
|
+
id: crypto.randomUUID(),
|
|
145
|
+
chat: chatId,
|
|
146
|
+
thread: threadId,
|
|
147
|
+
maker: webId,
|
|
148
|
+
role: 'user',
|
|
149
|
+
content,
|
|
150
|
+
status: 'sent',
|
|
151
|
+
createdAt: now,
|
|
152
|
+
}).execute();
|
|
153
|
+
await whereByPodStorageId(webId, chatTable, db.update(chatTable).set({
|
|
154
|
+
lastActiveAt: now,
|
|
155
|
+
lastMessagePreview: content.slice(0, 100),
|
|
156
|
+
updatedAt: now,
|
|
157
|
+
}), chatId).execute();
|
|
158
|
+
await touchThread(session, threadId);
|
|
159
|
+
}
|
|
160
|
+
export async function saveAssistantMessage(session, chatId, threadId, content) {
|
|
161
|
+
const db = await initPodData(session);
|
|
162
|
+
const now = new Date();
|
|
163
|
+
const webId = session.info.webId;
|
|
164
|
+
if (!webId) {
|
|
165
|
+
throw new Error('Missing webId in Solid session');
|
|
166
|
+
}
|
|
167
|
+
await db.insert(messageTable).values({
|
|
168
|
+
id: crypto.randomUUID(),
|
|
169
|
+
chat: chatId,
|
|
170
|
+
thread: threadId,
|
|
171
|
+
maker: buildAgentUri(webId, DEFAULT_AGENT_ID),
|
|
172
|
+
role: 'assistant',
|
|
173
|
+
content,
|
|
174
|
+
status: 'sent',
|
|
175
|
+
createdAt: now,
|
|
176
|
+
}).execute();
|
|
177
|
+
await whereByPodStorageId(webId, chatTable, db.update(chatTable).set({
|
|
178
|
+
lastActiveAt: now,
|
|
179
|
+
lastMessagePreview: content.slice(0, 100),
|
|
180
|
+
updatedAt: now,
|
|
181
|
+
}), chatId).execute();
|
|
182
|
+
await touchThread(session, threadId);
|
|
183
|
+
}
|
|
184
|
+
export async function loadThread(session, threadId) {
|
|
185
|
+
const db = await initPodData(session);
|
|
186
|
+
const webId = session.info.webId;
|
|
187
|
+
if (!webId) {
|
|
188
|
+
throw new Error('Missing webId in Solid session');
|
|
189
|
+
}
|
|
190
|
+
return await findPodRowByStorageId(db, webId, threadTable, threadId);
|
|
191
|
+
}
|
|
192
|
+
export async function getLatestThreadId(session, chatId) {
|
|
193
|
+
const threads = await listThreads(session, chatId);
|
|
194
|
+
return threads[0]?.id ?? null;
|
|
195
|
+
}
|
|
196
|
+
export { toOpenAiMessages, formatThreadLabel };
|
|
197
|
+
export function isMessageRow(_row) {
|
|
198
|
+
return true;
|
|
199
|
+
}
|
|
200
|
+
//# sourceMappingURL=pod-chat-store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pod-chat-store.js","sourceRoot":"","sources":["../../src/lib/pod-chat-store.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
import { getClientCredentials, loadCredentials, } from './credentials-store.js';
|
|
2
|
+
import { extractProfileUsernameFromWebId } from '@undefineds.co/models/client';
|
|
3
|
+
import { resolveSolidProfileIdentity } from '@undefineds.co/models/profile';
|
|
4
|
+
import { getOidcAccessToken } from './oidc-auth.js';
|
|
5
|
+
import { authenticate } from './solid-auth.js';
|
|
6
|
+
const resourceCache = new Map();
|
|
7
|
+
const defaultResolveProfileIdentity = (session, webId) => {
|
|
8
|
+
return resolveSolidProfileIdentity(session, { webId });
|
|
9
|
+
};
|
|
10
|
+
const defaultRuntime = {
|
|
11
|
+
loadCredentials,
|
|
12
|
+
getClientCredentials,
|
|
13
|
+
getOidcAccessToken,
|
|
14
|
+
authenticate,
|
|
15
|
+
resolveProfileIdentity: defaultResolveProfileIdentity,
|
|
16
|
+
getCachedResource(key) {
|
|
17
|
+
return resourceCache.get(key) ?? null;
|
|
18
|
+
},
|
|
19
|
+
setCachedResource(key, resource) {
|
|
20
|
+
resourceCache.set(key, resource);
|
|
21
|
+
},
|
|
22
|
+
};
|
|
23
|
+
export async function resolveProfileDisplayName(options = {}) {
|
|
24
|
+
const runtime = options.runtime ?? defaultRuntime;
|
|
25
|
+
const credentials = runtime.loadCredentials();
|
|
26
|
+
if (!credentials) {
|
|
27
|
+
return null;
|
|
28
|
+
}
|
|
29
|
+
return await withTimeout(readProfileDisplayName(credentials, runtime).catch(() => null), options.timeoutMs ?? 5_000);
|
|
30
|
+
}
|
|
31
|
+
export function extractUsernameFromWebId(webId) {
|
|
32
|
+
return extractProfileUsernameFromWebId(webId);
|
|
33
|
+
}
|
|
34
|
+
export function clearProfileIdentityResourceCache() {
|
|
35
|
+
resourceCache.clear();
|
|
36
|
+
}
|
|
37
|
+
async function readProfileDisplayName(credentials, runtime) {
|
|
38
|
+
const resource = await getOrCreateProfileResource(credentials, runtime);
|
|
39
|
+
return resource.identity?.displayName ?? null;
|
|
40
|
+
}
|
|
41
|
+
async function getOrCreateProfileResource(credentials, runtime) {
|
|
42
|
+
const cacheKey = buildProfileResourceCacheKey(credentials);
|
|
43
|
+
const cached = runtime.getCachedResource?.(cacheKey);
|
|
44
|
+
if (cached) {
|
|
45
|
+
return cached;
|
|
46
|
+
}
|
|
47
|
+
const session = await createProfileSession(credentials, runtime);
|
|
48
|
+
const resolveIdentity = runtime.resolveProfileIdentity ?? defaultResolveProfileIdentity;
|
|
49
|
+
const resource = {
|
|
50
|
+
session,
|
|
51
|
+
identity: await resolveIdentity(session, credentials.webId),
|
|
52
|
+
};
|
|
53
|
+
runtime.setCachedResource?.(cacheKey, resource);
|
|
54
|
+
return resource;
|
|
55
|
+
}
|
|
56
|
+
async function createProfileSession(credentials, runtime) {
|
|
57
|
+
const clientCredentials = runtime.getClientCredentials(credentials);
|
|
58
|
+
if (clientCredentials) {
|
|
59
|
+
const { session } = await runtime.authenticate(clientCredentials.clientId, clientCredentials.clientSecret, credentials.url);
|
|
60
|
+
return session;
|
|
61
|
+
}
|
|
62
|
+
if (credentials.authType === 'oidc_oauth') {
|
|
63
|
+
const accessToken = await runtime.getOidcAccessToken(credentials);
|
|
64
|
+
if (!accessToken) {
|
|
65
|
+
throw new Error('Failed to restore OIDC access token for profile lookup');
|
|
66
|
+
}
|
|
67
|
+
return createOidcSessionLike(credentials, accessToken);
|
|
68
|
+
}
|
|
69
|
+
throw new Error('Unsupported credential type for profile lookup');
|
|
70
|
+
}
|
|
71
|
+
function buildProfileResourceCacheKey(credentials) {
|
|
72
|
+
const clientCredentials = getClientCredentials(credentials);
|
|
73
|
+
const secretVersion = clientCredentials
|
|
74
|
+
? clientCredentials.clientId
|
|
75
|
+
: 'oidcRefreshToken' in credentials.secrets
|
|
76
|
+
? credentials.secrets.oidcRefreshToken
|
|
77
|
+
: '';
|
|
78
|
+
return [
|
|
79
|
+
credentials.authType,
|
|
80
|
+
credentials.url,
|
|
81
|
+
credentials.webId,
|
|
82
|
+
secretVersion,
|
|
83
|
+
].join('\n');
|
|
84
|
+
}
|
|
85
|
+
function createOidcSessionLike(credentials, accessToken) {
|
|
86
|
+
const podUrl = credentials.webId.replace('/card#me', '').replace(/\/?$/, '/');
|
|
87
|
+
return {
|
|
88
|
+
info: {
|
|
89
|
+
isLoggedIn: true,
|
|
90
|
+
webId: credentials.webId,
|
|
91
|
+
podUrl,
|
|
92
|
+
},
|
|
93
|
+
async logout() { },
|
|
94
|
+
fetch(url, init) {
|
|
95
|
+
const headers = new Headers(init?.headers);
|
|
96
|
+
headers.set('Authorization', `Bearer ${accessToken}`);
|
|
97
|
+
return fetch(url, { ...init, headers });
|
|
98
|
+
},
|
|
99
|
+
};
|
|
100
|
+
}
|
|
101
|
+
async function withTimeout(promise, timeoutMs) {
|
|
102
|
+
let timer;
|
|
103
|
+
const timeout = new Promise((resolve) => {
|
|
104
|
+
timer = setTimeout(() => resolve(null), timeoutMs);
|
|
105
|
+
timer.unref?.();
|
|
106
|
+
});
|
|
107
|
+
try {
|
|
108
|
+
return await Promise.race([promise, timeout]);
|
|
109
|
+
}
|
|
110
|
+
finally {
|
|
111
|
+
if (timer) {
|
|
112
|
+
clearTimeout(timer);
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
//# sourceMappingURL=profile-identity.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"profile-identity.js","sourceRoot":"","sources":["../../src/lib/profile-identity.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
import { createInterface as createLegacyInterface } from 'node:readline';
|
|
2
|
+
import { createInterface } from 'node:readline/promises';
|
|
3
|
+
import { stdin as input, stdout as output } from 'node:process';
|
|
4
|
+
export async function promptText(prompt, signal) {
|
|
5
|
+
const rl = createInterface({ input, output });
|
|
6
|
+
try {
|
|
7
|
+
return signal
|
|
8
|
+
? await rl.question(prompt, { signal })
|
|
9
|
+
: await rl.question(prompt);
|
|
10
|
+
}
|
|
11
|
+
finally {
|
|
12
|
+
rl.close();
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
export async function promptPassword(prompt) {
|
|
16
|
+
return await new Promise((resolve) => {
|
|
17
|
+
const rl = createLegacyInterface({ input, output });
|
|
18
|
+
const stdin = process.stdin;
|
|
19
|
+
const setRawMode = 'setRawMode' in stdin ? stdin.setRawMode.bind(stdin) : null;
|
|
20
|
+
const originalRawMode = setRawMode ? Boolean(stdin.isRaw) : false;
|
|
21
|
+
let password = '';
|
|
22
|
+
let cleanedLine = false;
|
|
23
|
+
function cleanup() {
|
|
24
|
+
stdin.off('data', handleData);
|
|
25
|
+
if (setRawMode) {
|
|
26
|
+
setRawMode(originalRawMode);
|
|
27
|
+
}
|
|
28
|
+
rl.close();
|
|
29
|
+
}
|
|
30
|
+
function handleData(chunk) {
|
|
31
|
+
const value = chunk.toString('utf8');
|
|
32
|
+
if (!cleanedLine) {
|
|
33
|
+
output.write('\r');
|
|
34
|
+
output.write(' '.repeat(prompt.length + Math.max(password.length, 1) + 8));
|
|
35
|
+
output.write('\r');
|
|
36
|
+
output.write(prompt);
|
|
37
|
+
output.write('*'.repeat(password.length));
|
|
38
|
+
cleanedLine = true;
|
|
39
|
+
}
|
|
40
|
+
switch (value) {
|
|
41
|
+
case '\n':
|
|
42
|
+
case '\r':
|
|
43
|
+
case '\u0004':
|
|
44
|
+
cleanup();
|
|
45
|
+
output.write('\n');
|
|
46
|
+
resolve(password);
|
|
47
|
+
break;
|
|
48
|
+
case '\u0003':
|
|
49
|
+
cleanup();
|
|
50
|
+
process.exit(1);
|
|
51
|
+
case '\u007f':
|
|
52
|
+
case '\b':
|
|
53
|
+
if (password.length > 0) {
|
|
54
|
+
password = password.slice(0, -1);
|
|
55
|
+
output.write('\r');
|
|
56
|
+
output.write(prompt);
|
|
57
|
+
output.write('*'.repeat(password.length));
|
|
58
|
+
output.write(' ');
|
|
59
|
+
output.write('\r');
|
|
60
|
+
output.write(prompt);
|
|
61
|
+
output.write('*'.repeat(password.length));
|
|
62
|
+
}
|
|
63
|
+
break;
|
|
64
|
+
default:
|
|
65
|
+
{
|
|
66
|
+
const normalized = value.replace(/\r/g, '').replace(/\n/g, '');
|
|
67
|
+
if (!normalized) {
|
|
68
|
+
break;
|
|
69
|
+
}
|
|
70
|
+
password += normalized;
|
|
71
|
+
output.write('*'.repeat(normalized.length));
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
if (setRawMode) {
|
|
76
|
+
setRawMode(true);
|
|
77
|
+
}
|
|
78
|
+
output.write(prompt);
|
|
79
|
+
stdin.on('data', handleData);
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
//# sourceMappingURL=prompt.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prompt.js","sourceRoot":"","sources":["../../src/lib/prompt.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { resolveLinxRuntimeOriginForIssuerUrl } from '@undefineds.co/models/client';
|
|
2
|
+
export function resolveRuntimeTarget(options) {
|
|
3
|
+
const oidcIssuer = options.issuerUrl;
|
|
4
|
+
const runtimeUrl = typeof options.runtimeUrlOverride === 'string' && options.runtimeUrlOverride.trim()
|
|
5
|
+
? options.runtimeUrlOverride.trim()
|
|
6
|
+
: resolveLinxRuntimeOriginForIssuerUrl(oidcIssuer);
|
|
7
|
+
return {
|
|
8
|
+
oidcIssuer,
|
|
9
|
+
runtimeUrl,
|
|
10
|
+
};
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=runtime-target.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runtime-target.js","sourceRoot":"","sources":["../../src/lib/runtime-target.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oCAAoC,EAAE,MAAM,8BAA8B,CAAA;AAYnF,MAAM,UAAU,oBAAoB,CAAC,OAA6B;IAChE,MAAM,UAAU,GAAG,OAAO,CAAC,SAAS,CAAA;IACpC,MAAM,UAAU,GAAG,OAAO,OAAO,CAAC,kBAAkB,KAAK,QAAQ,IAAI,OAAO,CAAC,kBAAkB,CAAC,IAAI,EAAE;QACpG,CAAC,CAAC,OAAO,CAAC,kBAAkB,CAAC,IAAI,EAAE;QACnC,CAAC,CAAC,oCAAoC,CAAC,UAAU,CAAC,CAAA;IAEpD,OAAO;QACL,UAAU;QACV,UAAU;KACX,CAAA;AACH,CAAC"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import { Session } from '@inrupt/solid-client-authn-node';
|
|
2
|
+
export async function authenticate(clientId, clientSecret, oidcIssuer) {
|
|
3
|
+
const session = new Session();
|
|
4
|
+
await session.login({
|
|
5
|
+
clientId,
|
|
6
|
+
clientSecret,
|
|
7
|
+
oidcIssuer,
|
|
8
|
+
tokenType: 'Bearer',
|
|
9
|
+
});
|
|
10
|
+
if (!session.info.isLoggedIn) {
|
|
11
|
+
throw new Error('Failed to authenticate with Pod');
|
|
12
|
+
}
|
|
13
|
+
const credentials = `${clientId}:${clientSecret}`;
|
|
14
|
+
const apiKey = `sk-${Buffer.from(credentials, 'utf-8').toString('base64')}`;
|
|
15
|
+
return { session, apiKey };
|
|
16
|
+
}
|
|
17
|
+
export async function getAccessToken(clientId, clientSecret, baseUrl) {
|
|
18
|
+
try {
|
|
19
|
+
const base = baseUrl.endsWith('/') ? baseUrl : `${baseUrl}/`;
|
|
20
|
+
const res = await fetch(`${base}.well-known/openid-configuration`);
|
|
21
|
+
if (!res.ok)
|
|
22
|
+
return null;
|
|
23
|
+
const config = (await res.json());
|
|
24
|
+
if (!config.token_endpoint)
|
|
25
|
+
return null;
|
|
26
|
+
const tokenRes = await fetch(config.token_endpoint, {
|
|
27
|
+
method: 'POST',
|
|
28
|
+
headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
|
|
29
|
+
body: new URLSearchParams({
|
|
30
|
+
grant_type: 'client_credentials',
|
|
31
|
+
client_id: clientId,
|
|
32
|
+
client_secret: clientSecret,
|
|
33
|
+
}).toString(),
|
|
34
|
+
});
|
|
35
|
+
if (!tokenRes.ok)
|
|
36
|
+
return null;
|
|
37
|
+
const data = (await tokenRes.json());
|
|
38
|
+
if (!data.access_token)
|
|
39
|
+
return null;
|
|
40
|
+
return {
|
|
41
|
+
accessToken: data.access_token,
|
|
42
|
+
tokenType: 'Bearer',
|
|
43
|
+
expiresAt: new Date(Date.now() + (data.expires_in ?? 3600) * 1000),
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
catch {
|
|
47
|
+
return null;
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
export async function authenticatedFetch(url, token, init) {
|
|
51
|
+
const headers = new Headers(init?.headers);
|
|
52
|
+
headers.set('Authorization', `Bearer ${token}`);
|
|
53
|
+
return fetch(url, { ...init, headers });
|
|
54
|
+
}
|
|
55
|
+
//# sourceMappingURL=solid-auth.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"solid-auth.js","sourceRoot":"","sources":["../../src/lib/solid-auth.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,iCAAiC,CAAA;AAOzD,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,QAAgB,EAChB,YAAoB,EACpB,UAAkB;IAElB,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAA;IAE7B,MAAM,OAAO,CAAC,KAAK,CAAC;QAClB,QAAQ;QACR,YAAY;QACZ,UAAU;QACV,SAAS,EAAE,QAAQ;KACpB,CAAC,CAAA;IAEF,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC;QAC7B,MAAM,IAAI,KAAK,CAAC,iCAAiC,CAAC,CAAA;IACpD,CAAC;IAED,MAAM,WAAW,GAAG,GAAG,QAAQ,IAAI,YAAY,EAAE,CAAA;IACjD,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAA;IAE3E,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,CAAA;AAC5B,CAAC;AAQD,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,QAAgB,EAChB,YAAoB,EACpB,OAAe;IAEf,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,GAAG,CAAA;QAC5D,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,IAAI,kCAAkC,CAAC,CAAA;QAClE,IAAI,CAAC,GAAG,CAAC,EAAE;YAAE,OAAO,IAAI,CAAA;QAExB,MAAM,MAAM,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAgC,CAAA;QAChE,IAAI,CAAC,MAAM,CAAC,cAAc;YAAE,OAAO,IAAI,CAAA;QAEvC,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,MAAM,CAAC,cAAc,EAAE;YAClD,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,EAAE,cAAc,EAAE,mCAAmC,EAAE;YAChE,IAAI,EAAE,IAAI,eAAe,CAAC;gBACxB,UAAU,EAAE,oBAAoB;gBAChC,SAAS,EAAE,QAAQ;gBACnB,aAAa,EAAE,YAAY;aAC5B,CAAC,CAAC,QAAQ,EAAE;SACd,CAAC,CAAA;QAEF,IAAI,CAAC,QAAQ,CAAC,EAAE;YAAE,OAAO,IAAI,CAAA;QAE7B,MAAM,IAAI,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAmD,CAAA;QACtF,IAAI,CAAC,IAAI,CAAC,YAAY;YAAE,OAAO,IAAI,CAAA;QAEnC,OAAO;YACL,WAAW,EAAE,IAAI,CAAC,YAAY;YAC9B,SAAS,EAAE,QAAQ;YACnB,SAAS,EAAE,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC,GAAG,IAAI,CAAC;SACnE,CAAA;IACH,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAA;IACb,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,GAAW,EACX,KAAa,EACb,IAAkB;IAElB,MAAM,OAAO,GAAG,IAAI,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,CAAA;IAC1C,OAAO,CAAC,GAAG,CAAC,eAAe,EAAE,UAAU,KAAK,EAAE,CAAC,CAAA;IAC/C,OAAO,KAAK,CAAC,GAAG,EAAE,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,CAAC,CAAA;AACzC,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export function toOpenAiMessages(messages) {
|
|
2
|
+
return messages.map((message) => ({ role: message.role, content: message.content }));
|
|
3
|
+
}
|
|
4
|
+
export function formatThreadLabel(thread) {
|
|
5
|
+
const parts = [thread.id];
|
|
6
|
+
if (thread.title)
|
|
7
|
+
parts.push(thread.title);
|
|
8
|
+
if (thread.workspace)
|
|
9
|
+
parts.push(thread.workspace);
|
|
10
|
+
return parts.join(' · ');
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=thread-utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"thread-utils.js","sourceRoot":"","sources":["../../src/lib/thread-utils.ts"],"names":[],"mappings":"AAWA,MAAM,UAAU,gBAAgB,CAAC,QAA8B;IAC7D,OAAO,QAAQ,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC,CAAA;AACtF,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,MAAwB;IACxD,MAAM,KAAK,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAA;IACzB,IAAI,MAAM,CAAC,KAAK;QAAE,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;IAC1C,IAAI,MAAM,CAAC,SAAS;QAAE,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAA;IAClD,OAAO,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;AAC1B,CAAC"}
|