@undefineds.co/linx 0.3.5 → 0.3.7
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 +58 -23
- package/dist/generated/version.js +1 -1
- package/dist/generated/version.js.map +1 -1
- package/dist/index.js +334 -162
- package/dist/index.js.map +1 -1
- package/dist/lib/account-session.js +4 -8
- package/dist/lib/account-session.js.map +1 -1
- package/dist/lib/ai-command.js +228 -178
- package/dist/lib/ai-command.js.map +1 -1
- package/dist/lib/auto-mode/archive.js +38 -7
- package/dist/lib/auto-mode/archive.js.map +1 -1
- package/dist/lib/auto-mode/auth.js.map +1 -1
- package/dist/lib/auto-mode/display.js +71 -45
- package/dist/lib/auto-mode/display.js.map +1 -1
- package/dist/lib/auto-mode/format.js +9 -7
- package/dist/lib/auto-mode/format.js.map +1 -1
- package/dist/lib/auto-mode/hooks/claude.js +12 -2
- package/dist/lib/auto-mode/hooks/claude.js.map +1 -1
- package/dist/lib/auto-mode/hooks/codex.js +17 -7
- package/dist/lib/auto-mode/hooks/codex.js.map +1 -1
- package/dist/lib/auto-mode/hooks/index.js +28 -8
- package/dist/lib/auto-mode/hooks/index.js.map +1 -1
- package/dist/lib/auto-mode/pod-ai.js +20 -37
- package/dist/lib/auto-mode/pod-ai.js.map +1 -1
- package/dist/lib/auto-mode/pod-approval.js +124 -195
- package/dist/lib/auto-mode/pod-approval.js.map +1 -1
- package/dist/lib/auto-mode/pod-persistence.js +169 -90
- package/dist/lib/auto-mode/pod-persistence.js.map +1 -1
- package/dist/lib/auto-mode/runner.js +683 -81
- package/dist/lib/auto-mode/runner.js.map +1 -1
- package/dist/lib/auto-mode/secretary.js +186 -41
- package/dist/lib/auto-mode/secretary.js.map +1 -1
- package/dist/lib/auto-mode-command.js +32 -32
- package/dist/lib/auto-mode-command.js.map +1 -1
- package/dist/lib/chat-api.js +242 -50
- package/dist/lib/chat-api.js.map +1 -1
- package/dist/lib/codex-plugin/bridge.js +164 -17
- package/dist/lib/codex-plugin/bridge.js.map +1 -1
- package/dist/lib/codex-plugin/codex-native-proxy.js +370 -34
- package/dist/lib/codex-plugin/codex-native-proxy.js.map +1 -1
- package/dist/lib/credentials-store.js +33 -42
- package/dist/lib/credentials-store.js.map +1 -1
- package/dist/lib/linx-cloud-errors.js +61 -0
- package/dist/lib/linx-cloud-errors.js.map +1 -0
- package/dist/lib/linx-tui-contract.js +8 -5
- package/dist/lib/linx-tui-contract.js.map +1 -1
- package/dist/lib/login-command.js +9 -2
- package/dist/lib/login-command.js.map +1 -1
- package/dist/lib/models.js +3 -20
- package/dist/lib/models.js.map +1 -1
- package/dist/lib/oidc-auth.js +143 -17
- package/dist/lib/oidc-auth.js.map +1 -1
- package/dist/lib/oidc-session-storage.js +2 -6
- package/dist/lib/oidc-session-storage.js.map +1 -1
- package/dist/lib/pi-adapter/auto-input-controller.js +988 -0
- package/dist/lib/pi-adapter/auto-input-controller.js.map +1 -0
- package/dist/lib/pi-adapter/backend-command.js +2 -0
- package/dist/lib/pi-adapter/backend-command.js.map +1 -0
- package/dist/lib/pi-adapter/backend-credentials.js +80 -0
- package/dist/lib/pi-adapter/backend-credentials.js.map +1 -0
- package/dist/lib/pi-adapter/branding.js +246 -108
- package/dist/lib/pi-adapter/branding.js.map +1 -1
- package/dist/lib/pi-adapter/control-state.js +72 -0
- package/dist/lib/pi-adapter/control-state.js.map +1 -0
- package/dist/lib/pi-adapter/interactive.js +2634 -30
- package/dist/lib/pi-adapter/interactive.js.map +1 -1
- package/dist/lib/pi-adapter/pod-approval.js +382 -210
- package/dist/lib/pi-adapter/pod-approval.js.map +1 -1
- package/dist/lib/pi-adapter/pod-mirror-mapping.js +71 -17
- package/dist/lib/pi-adapter/pod-mirror-mapping.js.map +1 -1
- package/dist/lib/pi-adapter/pod-mirror.js +531 -64
- package/dist/lib/pi-adapter/pod-mirror.js.map +1 -1
- package/dist/lib/pi-adapter/pod-native.js +81 -85
- package/dist/lib/pi-adapter/pod-native.js.map +1 -1
- package/dist/lib/pi-adapter/pod-status-output.js +54 -0
- package/dist/lib/pi-adapter/pod-status-output.js.map +1 -0
- package/dist/lib/pi-adapter/runtime.js +458 -228
- package/dist/lib/pi-adapter/runtime.js.map +1 -1
- package/dist/lib/pi-adapter/session-control.js +509 -0
- package/dist/lib/pi-adapter/session-control.js.map +1 -0
- package/dist/lib/pi-adapter/session.js +35 -22
- package/dist/lib/pi-adapter/session.js.map +1 -1
- package/dist/lib/pi-adapter/stream.js +89 -32
- package/dist/lib/pi-adapter/stream.js.map +1 -1
- package/dist/lib/pi-adapter/sync-recovery.js +89 -0
- package/dist/lib/pi-adapter/sync-recovery.js.map +1 -0
- package/dist/lib/pi-adapter/web-fetch.js +13 -14
- package/dist/lib/pi-adapter/web-fetch.js.map +1 -1
- package/dist/lib/pod-chat-store.js +254 -78
- package/dist/lib/pod-chat-store.js.map +1 -1
- package/dist/lib/pod-data-session.js +156 -35
- package/dist/lib/pod-data-session.js.map +1 -1
- package/dist/lib/solid-auth-store.js +27 -0
- package/dist/lib/solid-auth-store.js.map +1 -0
- package/dist/lib/solid-auth.js +2 -4
- package/dist/lib/solid-auth.js.map +1 -1
- package/dist/lib/solid-client-credentials-login.js +100 -0
- package/dist/lib/solid-client-credentials-login.js.map +1 -0
- package/dist/lib/solid-local-store.js +31 -0
- package/dist/lib/solid-local-store.js.map +1 -0
- package/dist/lib/symphony/archive.js +328 -18
- package/dist/lib/symphony/archive.js.map +1 -1
- package/dist/lib/symphony/pod-projection.js +2222 -0
- package/dist/lib/symphony/pod-projection.js.map +1 -0
- package/dist/lib/symphony-command.js +602 -178
- package/dist/lib/symphony-command.js.map +1 -1
- package/dist/lib/sync-checkpoint-store.js +74 -0
- package/dist/lib/sync-checkpoint-store.js.map +1 -0
- package/dist/skills/symphony/SKILL.md +665 -0
- package/package.json +15 -9
- package/vendor/agent-runtime/dist/agent-runtime.d.ts +137 -0
- package/vendor/agent-runtime/dist/agent-runtime.js +211 -0
- package/vendor/agent-runtime/dist/auto-mode.d.ts +78 -13
- package/vendor/agent-runtime/dist/auto-mode.js +288 -31
- package/vendor/agent-runtime/dist/control-plane.d.ts +28 -0
- package/vendor/agent-runtime/dist/control-plane.js +79 -0
- package/vendor/agent-runtime/dist/file-sync.d.ts +157 -0
- package/vendor/agent-runtime/dist/file-sync.js +314 -0
- package/vendor/agent-runtime/dist/index.d.ts +7 -0
- package/vendor/agent-runtime/dist/index.js +7 -0
- package/vendor/agent-runtime/dist/reconciler.d.ts +117 -0
- package/vendor/agent-runtime/dist/reconciler.js +361 -0
- package/vendor/agent-runtime/dist/symphony.d.ts +128 -8
- package/vendor/agent-runtime/dist/symphony.js +362 -57
- package/vendor/agent-runtime/dist/sync.d.ts +271 -0
- package/vendor/agent-runtime/dist/sync.js +550 -0
- package/vendor/agent-runtime/dist/thread-reconciler-controller.d.ts +58 -0
- package/vendor/agent-runtime/dist/thread-reconciler-controller.js +137 -0
- package/vendor/agent-runtime/dist/turn-controller.js +2 -2
- package/vendor/agent-runtime/dist/wake-scheduler.d.ts +67 -0
- package/vendor/agent-runtime/dist/wake-scheduler.js +194 -0
- package/vendor/agent-runtime/package.json +8 -1
- package/vendor/pi-web-access/CHANGELOG.md +387 -0
- package/vendor/pi-web-access/LICENSE +21 -0
- package/vendor/pi-web-access/README.md +352 -0
- package/vendor/pi-web-access/activity.ts +101 -0
- package/vendor/pi-web-access/banner.png +0 -0
- package/vendor/pi-web-access/chrome-cookies.ts +322 -0
- package/vendor/pi-web-access/code-search.ts +107 -0
- package/vendor/pi-web-access/curator-page.ts +3359 -0
- package/vendor/pi-web-access/curator-server.ts +605 -0
- package/vendor/pi-web-access/exa.ts +520 -0
- package/vendor/pi-web-access/extract.ts +641 -0
- package/vendor/pi-web-access/gemini-api.ts +112 -0
- package/vendor/pi-web-access/gemini-search.ts +361 -0
- package/vendor/pi-web-access/gemini-url-context.ts +126 -0
- package/vendor/pi-web-access/gemini-web-config.ts +52 -0
- package/vendor/pi-web-access/gemini-web.ts +396 -0
- package/vendor/pi-web-access/github-api.ts +196 -0
- package/vendor/pi-web-access/github-extract.ts +634 -0
- package/vendor/pi-web-access/index.ts +2346 -0
- package/vendor/pi-web-access/package.json +45 -0
- package/vendor/pi-web-access/pdf-extract.ts +192 -0
- package/vendor/pi-web-access/perplexity.ts +195 -0
- package/vendor/pi-web-access/pi-web-fetch-demo.mp4 +0 -0
- package/vendor/pi-web-access/rsc-extract.ts +338 -0
- package/vendor/pi-web-access/skills/librarian/SKILL.md +195 -0
- package/vendor/pi-web-access/storage.ts +72 -0
- package/vendor/pi-web-access/summary-review.ts +276 -0
- package/vendor/pi-web-access/test/gemini-web-cookie-opt-in.test.mjs +41 -0
- package/vendor/pi-web-access/test/pdf-extract.test.mjs +95 -0
- package/vendor/pi-web-access/utils.ts +44 -0
- package/vendor/pi-web-access/video-extract.ts +378 -0
- package/vendor/pi-web-access/youtube-extract.ts +310 -0
- package/dist/lib/pi-adapter/auth.js +0 -68
- package/dist/lib/pi-adapter/auth.js.map +0 -1
- package/dist/lib/pi-adapter/pod-tools.js +0 -140
- package/dist/lib/pi-adapter/pod-tools.js.map +0 -1
- package/dist/skills/drizzle-solid/SKILL.md +0 -340
- package/dist/skills/pod-storage/SKILL.md +0 -100
- package/dist/skills/solid-modeling/SKILL.md +0 -274
- package/dist/skills/xpod-componentsjs/SKILL.md +0 -284
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
import { existsSync, readdirSync } from 'node:fs';
|
|
2
|
+
import { join } from 'node:path';
|
|
3
|
+
import { listLinxSyncCheckpoints, } from '../../../vendor/agent-runtime/dist/sync.js';
|
|
4
|
+
import { createFileSyncCheckpointStore } from '../sync-checkpoint-store.js';
|
|
5
|
+
import { LinxPiPodMirror } from './pod-mirror.js';
|
|
6
|
+
import { createLinxPiSessionManager } from './session.js';
|
|
7
|
+
export function getPiPodMirrorSyncDir(agentDir, sessionId) {
|
|
8
|
+
const baseDir = join(agentDir, 'sync', 'pi-pod-mirror');
|
|
9
|
+
return sessionId ? join(baseDir, sessionId) : baseDir;
|
|
10
|
+
}
|
|
11
|
+
export async function listPendingPiPodMirrorSync(agentDir) {
|
|
12
|
+
const baseDir = getPiPodMirrorSyncDir(agentDir);
|
|
13
|
+
if (!existsSync(baseDir)) {
|
|
14
|
+
return [];
|
|
15
|
+
}
|
|
16
|
+
const statuses = [];
|
|
17
|
+
for (const entry of readdirSync(baseDir, { withFileTypes: true })) {
|
|
18
|
+
if (!entry.isDirectory()) {
|
|
19
|
+
continue;
|
|
20
|
+
}
|
|
21
|
+
const sessionId = entry.name;
|
|
22
|
+
const checkpoints = await listLinxSyncCheckpoints(createFileSyncCheckpointStore({
|
|
23
|
+
dir: getPiPodMirrorSyncDir(agentDir, sessionId),
|
|
24
|
+
}), {
|
|
25
|
+
source: 'pi-runtime',
|
|
26
|
+
target: 'pod',
|
|
27
|
+
plane: 'projection',
|
|
28
|
+
status: ['failed', 'partial'],
|
|
29
|
+
metadata: {
|
|
30
|
+
resourceBindings: {
|
|
31
|
+
session: {
|
|
32
|
+
local: sessionId,
|
|
33
|
+
},
|
|
34
|
+
},
|
|
35
|
+
},
|
|
36
|
+
});
|
|
37
|
+
if (checkpoints.length > 0) {
|
|
38
|
+
statuses.push({ sessionId, checkpoints });
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
return statuses.sort((a, b) => {
|
|
42
|
+
const aLatest = a.checkpoints.at(-1)?.completedAt ?? '';
|
|
43
|
+
const bLatest = b.checkpoints.at(-1)?.completedAt ?? '';
|
|
44
|
+
return bLatest.localeCompare(aLatest) || a.sessionId.localeCompare(b.sessionId);
|
|
45
|
+
});
|
|
46
|
+
}
|
|
47
|
+
export async function retryPendingPiPodMirrorSync(options) {
|
|
48
|
+
const checkpointStore = createFileSyncCheckpointStore({
|
|
49
|
+
dir: getPiPodMirrorSyncDir(options.agentDir, options.sessionId),
|
|
50
|
+
});
|
|
51
|
+
const pending = await listLinxSyncCheckpoints(checkpointStore, {
|
|
52
|
+
source: 'pi-runtime',
|
|
53
|
+
target: 'pod',
|
|
54
|
+
plane: 'projection',
|
|
55
|
+
status: ['failed', 'partial'],
|
|
56
|
+
metadata: {
|
|
57
|
+
resourceBindings: {
|
|
58
|
+
session: {
|
|
59
|
+
local: options.sessionId,
|
|
60
|
+
},
|
|
61
|
+
},
|
|
62
|
+
},
|
|
63
|
+
});
|
|
64
|
+
if (pending.length === 0) {
|
|
65
|
+
return {
|
|
66
|
+
sessionId: options.sessionId,
|
|
67
|
+
attempted: false,
|
|
68
|
+
results: [],
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
const sessionManager = await createLinxPiSessionManager({
|
|
72
|
+
cwd: options.cwd,
|
|
73
|
+
agentDir: options.agentDir,
|
|
74
|
+
session: options.sessionId,
|
|
75
|
+
});
|
|
76
|
+
const mirror = new LinxPiPodMirror({
|
|
77
|
+
cwd: options.cwd,
|
|
78
|
+
sessionManager,
|
|
79
|
+
checkpointStore,
|
|
80
|
+
});
|
|
81
|
+
const results = await mirror.replayPendingSync();
|
|
82
|
+
await mirror.flush();
|
|
83
|
+
return {
|
|
84
|
+
sessionId: options.sessionId,
|
|
85
|
+
attempted: true,
|
|
86
|
+
results,
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
//# sourceMappingURL=sync-recovery.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sync-recovery.js","sourceRoot":"","sources":["../../../src/lib/pi-adapter/sync-recovery.ts"],"names":[],"mappings":"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"}
|
|
@@ -5,9 +5,9 @@
|
|
|
5
5
|
* user's Pod-backed shared credential model. The LLM must not read or write
|
|
6
6
|
* credential Turtle directly.
|
|
7
7
|
*/
|
|
8
|
-
import { Type } from '
|
|
8
|
+
import { Type } from 'typebox';
|
|
9
9
|
import { getDefaultPodDataSession } from '../pod-data-session.js';
|
|
10
|
-
import {
|
|
10
|
+
import { aiConfigRepository, drizzle, solidResources, } from '../models.js';
|
|
11
11
|
// ── Constants ───────────────────────────────────────────────────────────────
|
|
12
12
|
const JINA_READER_BASE = 'https://r.jina.ai';
|
|
13
13
|
const JINA_SEARCH_BASE = 'https://s.jina.ai';
|
|
@@ -44,13 +44,8 @@ export async function resolveJinaApiKey(runtime = activeCredentialRuntime) {
|
|
|
44
44
|
if (!session)
|
|
45
45
|
return null;
|
|
46
46
|
const db = runtime.createDb(session);
|
|
47
|
-
const
|
|
48
|
-
|
|
49
|
-
typeof db.findById === 'function'
|
|
50
|
-
? db.findById(aiProviderResource, JINA_PROVIDER_ID).catch(() => null)
|
|
51
|
-
: Promise.resolve(null),
|
|
52
|
-
]);
|
|
53
|
-
const selected = selectAIConfigCredential(JINA_PROVIDER_ID, credentialRows, providerRow ? [providerRow] : []);
|
|
47
|
+
const selected = await aiConfigRepository.loadCredentialForBackend(db, JINA_PROVIDER_ID);
|
|
48
|
+
await aiConfigRepository.markCredentialUsed(db, selected);
|
|
54
49
|
return selected?.apiKey ?? null;
|
|
55
50
|
}
|
|
56
51
|
function missingKeyMessage() {
|
|
@@ -163,9 +158,13 @@ export const webSearchTool = {
|
|
|
163
158
|
return { content: [{ type: 'text', text: `Results for "${query}":\n\n${formatResults(r.results)}` }] };
|
|
164
159
|
},
|
|
165
160
|
};
|
|
166
|
-
// ── Pi Extension
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
161
|
+
// ── Pi Extension (disabled; replaced by pi-web-access) ─────────────────────
|
|
162
|
+
//
|
|
163
|
+
// LinX now uses pi-web-access for web_search and fetch_content.
|
|
164
|
+
// The Jina utility functions below are kept for potential fallback use.
|
|
165
|
+
//
|
|
166
|
+
// export default function (pi: ExtensionAPI): void {
|
|
167
|
+
// pi.registerTool(webFetchTool);
|
|
168
|
+
// pi.registerTool(webSearchTool);
|
|
169
|
+
// }
|
|
171
170
|
//# sourceMappingURL=web-fetch.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"web-fetch.js","sourceRoot":"","sources":["../../../src/lib/pi-adapter/web-fetch.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,EAAE,IAAI,
|
|
1
|
+
{"version":3,"file":"web-fetch.js","sourceRoot":"","sources":["../../../src/lib/pi-adapter/web-fetch.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,31 +1,18 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { createLinxPodSyncScope, } from '../../vendor/agent-runtime/dist/sync.js';
|
|
2
|
+
import { agentResource, chatRepository, chatResource, drizzle, eq, solidResources, messageResource, threadResource, threadRepository, } from './models.js';
|
|
2
3
|
import { DEFAULT_LINX_CLOUD_MODEL_ID } from './default-model.js';
|
|
3
4
|
import { formatThreadLabel, toOpenAiMessages } from './thread-utils.js';
|
|
4
5
|
const DEFAULT_CHAT_ID = 'cli-default';
|
|
5
6
|
const DEFAULT_AGENT_ID = 'linx-cli-assistant';
|
|
7
|
+
const POD_WRITE_RETRY_ATTEMPTS = 2;
|
|
8
|
+
const POD_WRITE_RETRY_DELAY_MS = 250;
|
|
9
|
+
const cliChatSyncResults = [];
|
|
10
|
+
let cliChatSyncSeq = 0;
|
|
6
11
|
function extractChatId(chatIdOrUri) {
|
|
7
|
-
return
|
|
12
|
+
return chatRepository.idFromRef(chatIdOrUri) ?? chatIdOrUri ?? DEFAULT_CHAT_ID;
|
|
8
13
|
}
|
|
9
14
|
function extractThreadId(threadIdOrUri) {
|
|
10
|
-
return
|
|
11
|
-
}
|
|
12
|
-
function getPodBaseUrl(webId) {
|
|
13
|
-
return webId.replace('/profile/card#me', '').replace(/\/$/, '');
|
|
14
|
-
}
|
|
15
|
-
function buildAgentUri(webId, agentId) {
|
|
16
|
-
return `${getPodBaseUrl(webId)}/.data/agents/${agentId}.ttl`;
|
|
17
|
-
}
|
|
18
|
-
function requireFindById(db) {
|
|
19
|
-
if (typeof db.findById !== 'function') {
|
|
20
|
-
throw new Error('Solid database does not support findById');
|
|
21
|
-
}
|
|
22
|
-
return db.findById.bind(db);
|
|
23
|
-
}
|
|
24
|
-
function requireUpdateById(db) {
|
|
25
|
-
if (typeof db.updateById !== 'function') {
|
|
26
|
-
throw new Error('Solid database does not support updateById');
|
|
27
|
-
}
|
|
28
|
-
return db.updateById.bind(db);
|
|
15
|
+
return threadRepository.idFromRef(threadIdOrUri) ?? threadIdOrUri ?? undefined;
|
|
29
16
|
}
|
|
30
17
|
function createDb(session) {
|
|
31
18
|
return drizzle(session, {
|
|
@@ -35,25 +22,119 @@ function createDb(session) {
|
|
|
35
22
|
schema: solidResources,
|
|
36
23
|
});
|
|
37
24
|
}
|
|
25
|
+
const defaultRuntime = {
|
|
26
|
+
createDb,
|
|
27
|
+
now: () => new Date(),
|
|
28
|
+
randomUUID: () => crypto.randomUUID(),
|
|
29
|
+
};
|
|
30
|
+
let activeRuntime = defaultRuntime;
|
|
31
|
+
function getActiveRuntime() {
|
|
32
|
+
return activeRuntime;
|
|
33
|
+
}
|
|
34
|
+
async function runCliChatProjection(input, project) {
|
|
35
|
+
const runtime = getActiveRuntime();
|
|
36
|
+
const sync = createLinxPodSyncScope({
|
|
37
|
+
source: 'cli-chat-store',
|
|
38
|
+
target: 'pod',
|
|
39
|
+
direction: 'local-to-core',
|
|
40
|
+
plane: 'projection',
|
|
41
|
+
authority: 'core',
|
|
42
|
+
now: runtime.now,
|
|
43
|
+
onResult(result) {
|
|
44
|
+
cliChatSyncResults.push(result);
|
|
45
|
+
runtime.onSyncResult?.(result);
|
|
46
|
+
},
|
|
47
|
+
});
|
|
48
|
+
return await sync.run({
|
|
49
|
+
action: input.action,
|
|
50
|
+
operationId: nextCliChatSyncOperationId(input),
|
|
51
|
+
kind: input.kind,
|
|
52
|
+
description: `cli-chat-store:${input.action}`,
|
|
53
|
+
subject: input.messageId ?? input.threadId ?? input.chatId,
|
|
54
|
+
resourceBindings: buildCliChatSyncResourceBindings(input),
|
|
55
|
+
metadata: {
|
|
56
|
+
role: input.role,
|
|
57
|
+
},
|
|
58
|
+
task: () => withTransientPodWriteRetry(project),
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
async function withTransientPodWriteRetry(project) {
|
|
62
|
+
let lastError;
|
|
63
|
+
for (let attempt = 0; attempt <= POD_WRITE_RETRY_ATTEMPTS; attempt += 1) {
|
|
64
|
+
try {
|
|
65
|
+
return await project();
|
|
66
|
+
}
|
|
67
|
+
catch (error) {
|
|
68
|
+
lastError = error;
|
|
69
|
+
if (attempt >= POD_WRITE_RETRY_ATTEMPTS || !isTransientPodWriteError(error)) {
|
|
70
|
+
throw error;
|
|
71
|
+
}
|
|
72
|
+
await delay(POD_WRITE_RETRY_DELAY_MS * (attempt + 1));
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
throw lastError;
|
|
76
|
+
}
|
|
77
|
+
function isTransientPodWriteError(error) {
|
|
78
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
79
|
+
const normalized = message.toLowerCase();
|
|
80
|
+
return normalized.includes('502 bad gateway')
|
|
81
|
+
|| normalized.includes('503 service unavailable')
|
|
82
|
+
|| normalized.includes('504 gateway timeout')
|
|
83
|
+
|| normalized.includes('temporarily unavailable');
|
|
84
|
+
}
|
|
85
|
+
function delay(ms) {
|
|
86
|
+
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
87
|
+
}
|
|
88
|
+
function nextCliChatSyncOperationId(input) {
|
|
89
|
+
const subject = input.messageId ?? input.threadId ?? input.chatId ?? 'cli-chat';
|
|
90
|
+
const timestamp = getActiveRuntime().now().toISOString().replace(/[:.]/g, '-');
|
|
91
|
+
return `cli-chat-store:${input.action}:${subject}:${timestamp}:${++cliChatSyncSeq}`;
|
|
92
|
+
}
|
|
93
|
+
function buildCliChatSyncResourceBindings(input) {
|
|
94
|
+
const chatUri = input.chatId
|
|
95
|
+
? (input.webId ? chatResource.buildIri(input.webId, { id: input.chatId }) : undefined)
|
|
96
|
+
: undefined;
|
|
97
|
+
const threadUri = input.threadId && input.chatId
|
|
98
|
+
? (input.webId ? threadRepository.iriForChat(input.webId, input.chatId, input.threadId) : undefined)
|
|
99
|
+
: undefined;
|
|
100
|
+
const messageUri = input.messageId && input.chatId && input.createdAt
|
|
101
|
+
? (input.webId ? messageResource.buildIri(input.webId, {
|
|
102
|
+
id: input.messageId,
|
|
103
|
+
chat: chatResource.buildIri(input.webId, { id: input.chatId }),
|
|
104
|
+
...(threadUri ? { thread: threadUri } : {}),
|
|
105
|
+
createdAt: input.createdAt,
|
|
106
|
+
}) : undefined)
|
|
107
|
+
: undefined;
|
|
108
|
+
return {
|
|
109
|
+
chat: input.chatId ? { uri: chatUri, local: input.chatId } : undefined,
|
|
110
|
+
thread: input.threadId ? { uri: threadUri, local: input.threadId } : undefined,
|
|
111
|
+
message: input.messageId ? { uri: messageUri, local: input.messageId } : undefined,
|
|
112
|
+
};
|
|
113
|
+
}
|
|
38
114
|
export async function initPodData(session) {
|
|
39
|
-
const db = createDb(session);
|
|
115
|
+
const db = getActiveRuntime().createDb(session);
|
|
40
116
|
return db;
|
|
41
117
|
}
|
|
42
118
|
async function ensureCliAgent(db, webId) {
|
|
43
|
-
const
|
|
44
|
-
const existing = await findById(agentResource,
|
|
119
|
+
const agentId = agentResource.buildId({ id: DEFAULT_AGENT_ID });
|
|
120
|
+
const existing = await db.findById(agentResource, agentId);
|
|
45
121
|
if (existing) {
|
|
46
122
|
return;
|
|
47
123
|
}
|
|
48
|
-
const now =
|
|
49
|
-
await
|
|
50
|
-
|
|
124
|
+
const now = getActiveRuntime().now();
|
|
125
|
+
await runCliChatProjection({
|
|
126
|
+
action: 'agent.ensure',
|
|
127
|
+
kind: 'insert',
|
|
128
|
+
db,
|
|
129
|
+
webId,
|
|
130
|
+
}, () => db.insert(agentResource).values({
|
|
131
|
+
id: agentId,
|
|
51
132
|
name: 'LinX CLI Assistant',
|
|
52
133
|
provider: 'xpod',
|
|
53
134
|
model: DEFAULT_LINX_CLOUD_MODEL_ID,
|
|
54
135
|
createdAt: now,
|
|
55
136
|
updatedAt: now,
|
|
56
|
-
}).execute();
|
|
137
|
+
}).execute());
|
|
57
138
|
}
|
|
58
139
|
export async function getOrCreateDefaultChat(session) {
|
|
59
140
|
const db = await initPodData(session);
|
|
@@ -62,28 +143,38 @@ export async function getOrCreateDefaultChat(session) {
|
|
|
62
143
|
throw new Error('Missing webId in Solid session');
|
|
63
144
|
}
|
|
64
145
|
await ensureCliAgent(db, webId);
|
|
65
|
-
const
|
|
66
|
-
const existing = await findById(chatResource, DEFAULT_CHAT_ID);
|
|
146
|
+
const existing = await db.findById(chatResource, DEFAULT_CHAT_ID);
|
|
67
147
|
if (existing) {
|
|
68
148
|
return DEFAULT_CHAT_ID;
|
|
69
149
|
}
|
|
70
|
-
const now =
|
|
71
|
-
await
|
|
150
|
+
const now = getActiveRuntime().now();
|
|
151
|
+
await runCliChatProjection({
|
|
152
|
+
action: 'chat.create',
|
|
153
|
+
kind: 'insert',
|
|
154
|
+
db,
|
|
155
|
+
webId,
|
|
156
|
+
chatId: DEFAULT_CHAT_ID,
|
|
157
|
+
}, () => db.insert(chatResource).values({
|
|
72
158
|
id: DEFAULT_CHAT_ID,
|
|
73
159
|
title: 'LinX CLI',
|
|
74
160
|
participants: [],
|
|
75
161
|
createdAt: now,
|
|
76
162
|
updatedAt: now,
|
|
77
163
|
lastActiveAt: now,
|
|
78
|
-
}).execute();
|
|
164
|
+
}).execute());
|
|
79
165
|
return DEFAULT_CHAT_ID;
|
|
80
166
|
}
|
|
81
167
|
export async function listThreads(session, chatId) {
|
|
82
168
|
const db = await initPodData(session);
|
|
83
|
-
const
|
|
84
|
-
|
|
169
|
+
const webId = session.info.webId;
|
|
170
|
+
if (!webId) {
|
|
171
|
+
throw new Error('Missing webId in Solid session');
|
|
172
|
+
}
|
|
173
|
+
const chatUri = chatRepository.iri(webId, chatId);
|
|
174
|
+
const parentCol = threadResource.parent;
|
|
175
|
+
const rows = await db.select().from(threadResource).where(eq(parentCol, chatUri)).orderBy('updatedAt', 'desc').execute();
|
|
85
176
|
return rows.map((row) => ({
|
|
86
|
-
id: String(row.id),
|
|
177
|
+
id: threadRepository.idFromRef(String(row.id)) ?? String(row.id),
|
|
87
178
|
title: row.title || undefined,
|
|
88
179
|
workspace: row.workspace || undefined,
|
|
89
180
|
updatedAt: row.updatedAt ? new Date(row.updatedAt) : undefined,
|
|
@@ -91,24 +182,46 @@ export async function listThreads(session, chatId) {
|
|
|
91
182
|
}
|
|
92
183
|
export async function createThread(session, chatId, workspace, title) {
|
|
93
184
|
const db = await initPodData(session);
|
|
94
|
-
const
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
185
|
+
const webId = session.info.webId;
|
|
186
|
+
if (!webId) {
|
|
187
|
+
throw new Error('Missing webId in Solid session');
|
|
188
|
+
}
|
|
189
|
+
const threadId = getActiveRuntime().randomUUID();
|
|
190
|
+
const now = getActiveRuntime().now();
|
|
191
|
+
const chatUri = chatResource.buildIri(webId, { id: chatId });
|
|
192
|
+
await runCliChatProjection({
|
|
193
|
+
action: 'thread.create',
|
|
194
|
+
kind: 'insert',
|
|
195
|
+
db,
|
|
196
|
+
webId,
|
|
197
|
+
chatId,
|
|
198
|
+
threadId,
|
|
199
|
+
}, () => db.insert(threadResource).values({
|
|
200
|
+
id: threadRepository.idForChat(chatUri, threadId),
|
|
201
|
+
parent: chatUri,
|
|
99
202
|
title: title || 'CLI Session',
|
|
100
203
|
workspace: workspace || undefined,
|
|
101
204
|
createdAt: now,
|
|
102
205
|
updatedAt: now,
|
|
103
|
-
}).execute();
|
|
206
|
+
}).execute());
|
|
104
207
|
return threadId;
|
|
105
208
|
}
|
|
106
209
|
export async function touchThread(session, threadId) {
|
|
107
210
|
const db = await initPodData(session);
|
|
108
|
-
const
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
211
|
+
const webId = session.info.webId;
|
|
212
|
+
if (!webId) {
|
|
213
|
+
throw new Error('Missing webId in Solid session');
|
|
214
|
+
}
|
|
215
|
+
const chatId = threadRepository.chatId(await loadThread(session, threadId)) ?? DEFAULT_CHAT_ID;
|
|
216
|
+
const threadRecordId = threadRepository.idForChat(chatId, threadId);
|
|
217
|
+
await runCliChatProjection({
|
|
218
|
+
action: 'thread.touch',
|
|
219
|
+
kind: 'update',
|
|
220
|
+
db,
|
|
221
|
+
webId,
|
|
222
|
+
chatId,
|
|
223
|
+
threadId,
|
|
224
|
+
}, () => db.updateById(threadResource, threadRecordId, { updatedAt: getActiveRuntime().now() }));
|
|
112
225
|
}
|
|
113
226
|
export async function loadMessages(session, threadId) {
|
|
114
227
|
const db = await initPodData(session);
|
|
@@ -117,7 +230,7 @@ export async function loadMessages(session, threadId) {
|
|
|
117
230
|
if (!thread) {
|
|
118
231
|
return [];
|
|
119
232
|
}
|
|
120
|
-
const chatId =
|
|
233
|
+
const chatId = threadRepository.chatId(thread);
|
|
121
234
|
const rows = await db.select().from(messageResource).orderBy(createdAtCol).execute();
|
|
122
235
|
return rows
|
|
123
236
|
.filter((row) => (extractChatId(row.chat) === chatId
|
|
@@ -131,71 +244,108 @@ export async function loadMessages(session, threadId) {
|
|
|
131
244
|
}
|
|
132
245
|
export async function saveUserMessage(session, chatId, threadId, content) {
|
|
133
246
|
const db = await initPodData(session);
|
|
134
|
-
const now =
|
|
247
|
+
const now = getActiveRuntime().now();
|
|
135
248
|
const webId = session.info.webId;
|
|
136
249
|
if (!webId) {
|
|
137
250
|
throw new Error('Missing webId in Solid session');
|
|
138
251
|
}
|
|
139
|
-
const
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
252
|
+
const messageId = getActiveRuntime().randomUUID();
|
|
253
|
+
const chatUri = chatResource.buildIri(webId, { id: chatId });
|
|
254
|
+
const threadUri = threadRepository.iriForChat(webId, chatId, threadId);
|
|
255
|
+
await runCliChatProjection({
|
|
256
|
+
action: 'message.create',
|
|
257
|
+
kind: 'insert',
|
|
258
|
+
db,
|
|
259
|
+
webId,
|
|
260
|
+
chatId,
|
|
261
|
+
threadId,
|
|
262
|
+
messageId,
|
|
263
|
+
createdAt: now,
|
|
264
|
+
role: 'user',
|
|
265
|
+
}, () => db.insert(messageResource).values({
|
|
266
|
+
id: messageId,
|
|
267
|
+
chat: chatUri,
|
|
268
|
+
thread: threadUri,
|
|
144
269
|
maker: webId,
|
|
145
270
|
role: 'user',
|
|
146
271
|
content,
|
|
147
272
|
status: 'sent',
|
|
148
273
|
createdAt: now,
|
|
149
|
-
}).execute();
|
|
150
|
-
await
|
|
274
|
+
}).execute());
|
|
275
|
+
await runCliChatProjection({
|
|
276
|
+
action: 'chat.activity.update',
|
|
277
|
+
kind: 'update',
|
|
278
|
+
db,
|
|
279
|
+
webId,
|
|
280
|
+
chatId,
|
|
281
|
+
threadId,
|
|
282
|
+
messageId,
|
|
283
|
+
createdAt: now,
|
|
284
|
+
role: 'user',
|
|
285
|
+
}, () => db.updateById(chatResource, chatId, {
|
|
151
286
|
lastActiveAt: now,
|
|
152
287
|
lastMessagePreview: content.slice(0, 100),
|
|
153
288
|
updatedAt: now,
|
|
154
|
-
});
|
|
289
|
+
}));
|
|
155
290
|
await touchThread(session, threadId);
|
|
156
291
|
}
|
|
157
292
|
export async function saveAssistantMessage(session, chatId, threadId, content) {
|
|
158
293
|
const db = await initPodData(session);
|
|
159
|
-
const now =
|
|
294
|
+
const now = getActiveRuntime().now();
|
|
160
295
|
const webId = session.info.webId;
|
|
161
296
|
if (!webId) {
|
|
162
297
|
throw new Error('Missing webId in Solid session');
|
|
163
298
|
}
|
|
164
|
-
const
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
299
|
+
const messageId = getActiveRuntime().randomUUID();
|
|
300
|
+
const chatUri = chatResource.buildIri(webId, { id: chatId });
|
|
301
|
+
const threadUri = threadRepository.iriForChat(webId, chatId, threadId);
|
|
302
|
+
await runCliChatProjection({
|
|
303
|
+
action: 'message.create',
|
|
304
|
+
kind: 'insert',
|
|
305
|
+
db,
|
|
306
|
+
webId,
|
|
307
|
+
chatId,
|
|
308
|
+
threadId,
|
|
309
|
+
messageId,
|
|
310
|
+
createdAt: now,
|
|
311
|
+
role: 'assistant',
|
|
312
|
+
}, () => db.insert(messageResource).values({
|
|
313
|
+
id: messageId,
|
|
314
|
+
chat: chatUri,
|
|
315
|
+
thread: threadUri,
|
|
316
|
+
maker: agentResource.buildIri(webId, { id: DEFAULT_AGENT_ID }),
|
|
170
317
|
role: 'assistant',
|
|
171
318
|
content,
|
|
172
319
|
status: 'sent',
|
|
173
320
|
createdAt: now,
|
|
174
|
-
}).execute();
|
|
175
|
-
await
|
|
321
|
+
}).execute());
|
|
322
|
+
await runCliChatProjection({
|
|
323
|
+
action: 'chat.activity.update',
|
|
324
|
+
kind: 'update',
|
|
325
|
+
db,
|
|
326
|
+
webId,
|
|
327
|
+
chatId,
|
|
328
|
+
threadId,
|
|
329
|
+
messageId,
|
|
330
|
+
createdAt: now,
|
|
331
|
+
role: 'assistant',
|
|
332
|
+
}, () => db.updateById(chatResource, chatId, {
|
|
176
333
|
lastActiveAt: now,
|
|
177
334
|
lastMessagePreview: content.slice(0, 100),
|
|
178
335
|
updatedAt: now,
|
|
179
|
-
});
|
|
336
|
+
}));
|
|
180
337
|
await touchThread(session, threadId);
|
|
181
338
|
}
|
|
182
339
|
export async function loadThread(session, threadId) {
|
|
183
340
|
const db = await initPodData(session);
|
|
184
|
-
const
|
|
185
|
-
const directChatId = extractChatId(threadId);
|
|
341
|
+
const directChatId = threadRepository.chatIdFromRef(threadId);
|
|
186
342
|
const directThreadId = extractThreadId(threadId);
|
|
187
343
|
if (directChatId && directThreadId) {
|
|
188
|
-
const resourceId =
|
|
189
|
-
|
|
190
|
-
id: directThreadId,
|
|
191
|
-
});
|
|
192
|
-
return await findById(threadResource, resourceId);
|
|
344
|
+
const resourceId = threadRepository.idForChat(directChatId, directThreadId);
|
|
345
|
+
return await db.findById(threadResource, resourceId);
|
|
193
346
|
}
|
|
194
|
-
const resourceId =
|
|
195
|
-
|
|
196
|
-
id: threadId,
|
|
197
|
-
});
|
|
198
|
-
return await findById(threadResource, resourceId);
|
|
347
|
+
const resourceId = threadRepository.idForChat(DEFAULT_CHAT_ID, threadId);
|
|
348
|
+
return await db.findById(threadResource, resourceId);
|
|
199
349
|
}
|
|
200
350
|
export async function getLatestThreadId(session, chatId) {
|
|
201
351
|
const threads = await listThreads(session, chatId);
|
|
@@ -205,4 +355,30 @@ export { toOpenAiMessages, formatThreadLabel };
|
|
|
205
355
|
export function isMessageRow(_row) {
|
|
206
356
|
return true;
|
|
207
357
|
}
|
|
358
|
+
export const __podChatStoreInternal = {
|
|
359
|
+
resources: {
|
|
360
|
+
agentResource,
|
|
361
|
+
chatResource,
|
|
362
|
+
threadResource,
|
|
363
|
+
messageResource,
|
|
364
|
+
},
|
|
365
|
+
getSyncResults() {
|
|
366
|
+
return [...cliChatSyncResults];
|
|
367
|
+
},
|
|
368
|
+
resetSyncResults() {
|
|
369
|
+
cliChatSyncResults.length = 0;
|
|
370
|
+
cliChatSyncSeq = 0;
|
|
371
|
+
},
|
|
372
|
+
setRuntime(runtime = {}) {
|
|
373
|
+
activeRuntime = {
|
|
374
|
+
...defaultRuntime,
|
|
375
|
+
...runtime,
|
|
376
|
+
};
|
|
377
|
+
},
|
|
378
|
+
resetRuntime() {
|
|
379
|
+
activeRuntime = defaultRuntime;
|
|
380
|
+
cliChatSyncResults.length = 0;
|
|
381
|
+
cliChatSyncSeq = 0;
|
|
382
|
+
},
|
|
383
|
+
};
|
|
208
384
|
//# sourceMappingURL=pod-chat-store.js.map
|