@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.
Files changed (100) hide show
  1. package/README.md +91 -0
  2. package/dist/index.js +578 -0
  3. package/dist/index.js.map +1 -0
  4. package/dist/lib/account-api.js +100 -0
  5. package/dist/lib/account-api.js.map +1 -0
  6. package/dist/lib/account-session.js +30 -0
  7. package/dist/lib/account-session.js.map +1 -0
  8. package/dist/lib/ai-command.js +411 -0
  9. package/dist/lib/ai-command.js.map +1 -0
  10. package/dist/lib/chat-api.js +122 -0
  11. package/dist/lib/chat-api.js.map +1 -0
  12. package/dist/lib/codex-plugin/bridge.js +109 -0
  13. package/dist/lib/codex-plugin/bridge.js.map +1 -0
  14. package/dist/lib/codex-plugin/codex-native-proxy.js +358 -0
  15. package/dist/lib/codex-plugin/codex-native-proxy.js.map +1 -0
  16. package/dist/lib/codex-plugin/index.js +4 -0
  17. package/dist/lib/codex-plugin/index.js.map +1 -0
  18. package/dist/lib/codex-plugin/runner.js +38 -0
  19. package/dist/lib/codex-plugin/runner.js.map +1 -0
  20. package/dist/lib/credentials-store.js +74 -0
  21. package/dist/lib/credentials-store.js.map +1 -0
  22. package/dist/lib/default-model.js +8 -0
  23. package/dist/lib/default-model.js.map +1 -0
  24. package/dist/lib/login-command.js +51 -0
  25. package/dist/lib/login-command.js.map +1 -0
  26. package/dist/lib/models.js +6 -0
  27. package/dist/lib/models.js.map +1 -0
  28. package/dist/lib/oidc-auth.js +451 -0
  29. package/dist/lib/oidc-auth.js.map +1 -0
  30. package/dist/lib/oidc-session-storage.js +37 -0
  31. package/dist/lib/oidc-session-storage.js.map +1 -0
  32. package/dist/lib/pi-adapter/auth.js +38 -0
  33. package/dist/lib/pi-adapter/auth.js.map +1 -0
  34. package/dist/lib/pi-adapter/branding.js +239 -0
  35. package/dist/lib/pi-adapter/branding.js.map +1 -0
  36. package/dist/lib/pi-adapter/index.js +4 -0
  37. package/dist/lib/pi-adapter/index.js.map +1 -0
  38. package/dist/lib/pi-adapter/interactive.js +63 -0
  39. package/dist/lib/pi-adapter/interactive.js.map +1 -0
  40. package/dist/lib/pi-adapter/runtime.js +271 -0
  41. package/dist/lib/pi-adapter/runtime.js.map +1 -0
  42. package/dist/lib/pi-adapter/stream.js +314 -0
  43. package/dist/lib/pi-adapter/stream.js.map +1 -0
  44. package/dist/lib/pi-adapter/theme.js +84 -0
  45. package/dist/lib/pi-adapter/theme.js.map +1 -0
  46. package/dist/lib/pod-chat-store.js +200 -0
  47. package/dist/lib/pod-chat-store.js.map +1 -0
  48. package/dist/lib/profile-identity.js +116 -0
  49. package/dist/lib/profile-identity.js.map +1 -0
  50. package/dist/lib/prompt.js +82 -0
  51. package/dist/lib/prompt.js.map +1 -0
  52. package/dist/lib/runtime-target.js +12 -0
  53. package/dist/lib/runtime-target.js.map +1 -0
  54. package/dist/lib/solid-auth.js +55 -0
  55. package/dist/lib/solid-auth.js.map +1 -0
  56. package/dist/lib/thread-utils.js +12 -0
  57. package/dist/lib/thread-utils.js.map +1 -0
  58. package/dist/lib/watch/archive.js +110 -0
  59. package/dist/lib/watch/archive.js.map +1 -0
  60. package/dist/lib/watch/auth.js +56 -0
  61. package/dist/lib/watch/auth.js.map +1 -0
  62. package/dist/lib/watch/codex-composer.js +219 -0
  63. package/dist/lib/watch/codex-composer.js.map +1 -0
  64. package/dist/lib/watch/codex-footer.js +88 -0
  65. package/dist/lib/watch/codex-footer.js.map +1 -0
  66. package/dist/lib/watch/codex-overlay.js +154 -0
  67. package/dist/lib/watch/codex-overlay.js.map +1 -0
  68. package/dist/lib/watch/codex-request-form.js +341 -0
  69. package/dist/lib/watch/codex-request-form.js.map +1 -0
  70. package/dist/lib/watch/codex-request-input.js +187 -0
  71. package/dist/lib/watch/codex-request-input.js.map +1 -0
  72. package/dist/lib/watch/display.js +1514 -0
  73. package/dist/lib/watch/display.js.map +1 -0
  74. package/dist/lib/watch/format.js +161 -0
  75. package/dist/lib/watch/format.js.map +1 -0
  76. package/dist/lib/watch/hooks/claude.js +12 -0
  77. package/dist/lib/watch/hooks/claude.js.map +1 -0
  78. package/dist/lib/watch/hooks/codebuddy.js +18 -0
  79. package/dist/lib/watch/hooks/codebuddy.js.map +1 -0
  80. package/dist/lib/watch/hooks/codex.js +13 -0
  81. package/dist/lib/watch/hooks/codex.js.map +1 -0
  82. package/dist/lib/watch/hooks/index.js +24 -0
  83. package/dist/lib/watch/hooks/index.js.map +1 -0
  84. package/dist/lib/watch/hooks/shared.js +19 -0
  85. package/dist/lib/watch/hooks/shared.js.map +1 -0
  86. package/dist/lib/watch/index.js +10 -0
  87. package/dist/lib/watch/index.js.map +1 -0
  88. package/dist/lib/watch/pod-ai.js +168 -0
  89. package/dist/lib/watch/pod-ai.js.map +1 -0
  90. package/dist/lib/watch/pod-approval.js +578 -0
  91. package/dist/lib/watch/pod-approval.js.map +1 -0
  92. package/dist/lib/watch/pod-persistence.js +226 -0
  93. package/dist/lib/watch/pod-persistence.js.map +1 -0
  94. package/dist/lib/watch/runner.js +1124 -0
  95. package/dist/lib/watch/runner.js.map +1 -0
  96. package/dist/lib/watch/types.js +2 -0
  97. package/dist/lib/watch/types.js.map +1 -0
  98. package/dist/watch-cli.js +142 -0
  99. package/dist/watch-cli.js.map +1 -0
  100. 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"}