@agent-link/agent 0.1.258 → 0.1.259
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/backends/types.d.ts +6 -0
- package/dist/backends/types.js +10 -2
- package/dist/backends/types.js.map +1 -1
- package/dist/connection.js +133 -43
- package/dist/connection.js.map +1 -1
- package/dist/copilot.d.ts +28 -0
- package/dist/copilot.js +172 -59
- package/dist/copilot.js.map +1 -1
- package/dist/history.d.ts +19 -0
- package/dist/history.js +238 -54
- package/dist/history.js.map +1 -1
- package/dist/runtime.d.ts +1 -1
- package/dist/runtime.js +1 -1
- package/dist/runtime.js.map +1 -1
- package/package.json +1 -1
package/dist/backends/types.d.ts
CHANGED
|
@@ -90,6 +90,7 @@ export interface BackendCapabilities {
|
|
|
90
90
|
};
|
|
91
91
|
history: {
|
|
92
92
|
list: boolean;
|
|
93
|
+
pagination?: SessionPaginationCapability;
|
|
93
94
|
read: boolean;
|
|
94
95
|
rename: boolean;
|
|
95
96
|
delete: boolean;
|
|
@@ -122,6 +123,11 @@ export interface BackendCapabilities {
|
|
|
122
123
|
};
|
|
123
124
|
sandboxModes: SandboxMode[];
|
|
124
125
|
}
|
|
126
|
+
export type SessionPaginationCapability = Capability<{
|
|
127
|
+
surfaces: Array<'workdir' | 'global'>;
|
|
128
|
+
modeEcho: boolean;
|
|
129
|
+
requestIdEcho: boolean;
|
|
130
|
+
}>;
|
|
125
131
|
/** Approval / confirmation requests from the backend to the user. */
|
|
126
132
|
export type ApprovalRequest = {
|
|
127
133
|
kind: 'command';
|
package/dist/backends/types.js
CHANGED
|
@@ -33,7 +33,7 @@ export function emptyCapabilities() {
|
|
|
33
33
|
fsWatch: cap(),
|
|
34
34
|
remoteControl: { supported: false },
|
|
35
35
|
},
|
|
36
|
-
history: { list: false, read: false, rename: false, delete: false, search: false },
|
|
36
|
+
history: { list: false, pagination: { supported: false }, read: false, rename: false, delete: false, search: false },
|
|
37
37
|
models: { list: cap(), switchPerSession: false, switchPerTurn: false },
|
|
38
38
|
tools: { itemTypes: [], fallbackRenderer: false, specializedRenderers: [] },
|
|
39
39
|
integrations: {
|
|
@@ -89,7 +89,14 @@ export function claudeCapabilities() {
|
|
|
89
89
|
fsWatch: no(),
|
|
90
90
|
remoteControl: { supported: false },
|
|
91
91
|
},
|
|
92
|
-
history: {
|
|
92
|
+
history: {
|
|
93
|
+
list: true,
|
|
94
|
+
pagination: { supported: true, details: { surfaces: ['workdir', 'global'], modeEcho: true, requestIdEcho: true } },
|
|
95
|
+
read: true,
|
|
96
|
+
rename: true,
|
|
97
|
+
delete: true,
|
|
98
|
+
search: true,
|
|
99
|
+
},
|
|
93
100
|
models: { list: no(), switchPerSession: true, switchPerTurn: false },
|
|
94
101
|
tools: {
|
|
95
102
|
itemTypes: ['Read', 'Write', 'Edit', 'Bash', 'Glob', 'Grep', 'Task', 'Agent', 'WebFetch', 'WebSearch', 'TodoWrite'],
|
|
@@ -148,6 +155,7 @@ export function copilotCapabilities() {
|
|
|
148
155
|
},
|
|
149
156
|
history: {
|
|
150
157
|
list: true, // read workspace.yaml files
|
|
158
|
+
pagination: { supported: true, details: { surfaces: ['workdir', 'global'], modeEcho: true, requestIdEcho: true } },
|
|
151
159
|
read: true, // parse events.jsonl
|
|
152
160
|
rename: true, // edit workspace.yaml name field
|
|
153
161
|
delete: true, // filesystem delete
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/backends/types.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,MAAM,CAAC,MAAM,mBAAmB,GAA2B,CAAC,QAAQ,EAAE,OAAO,EAAE,SAAS,CAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/backends/types.ts"],"names":[],"mappings":"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"}
|
package/dist/connection.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import WebSocket from 'ws';
|
|
2
2
|
import os from 'os';
|
|
3
3
|
import path from 'path';
|
|
4
|
+
import { performance } from 'perf_hooks';
|
|
4
5
|
import { createRequire } from 'module';
|
|
5
6
|
import { loadRuntimeState, saveRuntimeState, getBrainDataDir, getConversationPermission, setConversationPermission, clearConversationPermission, getOrCreateE2EKey, encodeBase64Url, CONFIG_DIR } from './config.js';
|
|
6
7
|
import { handleListDirectory, handleReadFile, handleUpdateFile, handleCreateFile, handleCreateDirectory, handleDeleteFile, handleUploadFile, handleUploadFileChunk, handleDownloadFile, handleDownloadChunkAck } from './directory-handlers.js';
|
|
@@ -24,8 +25,9 @@ const require = createRequire(import.meta.url);
|
|
|
24
25
|
const pkg = require('../package.json');
|
|
25
26
|
const TEAM_SESSIONS_DIR = path.join(CONFIG_DIR, 'team-sessions');
|
|
26
27
|
const LOOP_SESSIONS_DIR = path.join(CONFIG_DIR, 'loop-sessions');
|
|
27
|
-
import { handleChat as claudeHandleChat, addSendFn, abort as abortClaude, abortAll as abortAllClaude, cancelExecution as claudeCancelExecution, handleUserAnswer, handleToolPermissionResponse, handleBtwQuestion, getConversation, getConversations, getIsCompacting, clearSessionId, evictByClaudeSessionId, rebindConversation, addOutputObserver, removeOutputObserver, addCloseObserver, removeCloseObserver, setOutputObserver, clearOutputObserver, setCloseObserver, clearCloseObserver, restartConversation, createPlaceholderConversation, getPendingQuestions, getPendingToolPermissions, setModel, addOnSessionStarted, getBackendType, setBackendType, isCopilotBackend, addCopilotSendFn, handleCopilotChat, cancelCopilotExecution,
|
|
28
|
-
import { DEFAULT_SESSION_LIST_LIMIT, listSessions,
|
|
28
|
+
import { handleChat as claudeHandleChat, addSendFn, abort as abortClaude, abortAll as abortAllClaude, cancelExecution as claudeCancelExecution, handleUserAnswer, handleToolPermissionResponse, handleBtwQuestion, getConversation, getConversations, getIsCompacting, clearSessionId, evictByClaudeSessionId, rebindConversation, addOutputObserver, removeOutputObserver, addCloseObserver, removeCloseObserver, setOutputObserver, clearOutputObserver, setCloseObserver, clearCloseObserver, restartConversation, createPlaceholderConversation, getPendingQuestions, getPendingToolPermissions, setModel, addOnSessionStarted, getBackendType, setBackendType, isCopilotBackend, addCopilotSendFn, handleCopilotChat, cancelCopilotExecution, listCopilotSessionsPage, listAllCopilotSessionsPage, readCopilotSessionMessages, deleteCopilotSession, renameCopilotSession, getCopilotConversation, getCopilotConversations, createCopilotPlaceholder, restartCopilotConversation, rebindCopilotConversation, copilotCapabilities } from './runtime.js';
|
|
29
|
+
import { DEFAULT_SESSION_LIST_LIMIT, LEGACY_SESSION_LIST_CAP, listSessions, listSessionsPageAsync, readSessionMessages, deleteSession, renameSession, listAllRecentSessionsPage, getSessionCacheStats } from './history.js';
|
|
30
|
+
import { claudeCapabilities } from './backends/types.js';
|
|
29
31
|
import { searchSessions } from './search-sessions.js';
|
|
30
32
|
import { formatSessionExport, isSessionExportFormat } from './session-export.js';
|
|
31
33
|
import { listMemoryFiles, updateMemoryFile, deleteMemoryFile } from './memory.js';
|
|
@@ -585,11 +587,11 @@ function handleServerMessage(msg) {
|
|
|
585
587
|
if (requiredBt !== getBackendType()) {
|
|
586
588
|
setBackendType(requiredBt);
|
|
587
589
|
console.log(`[AgentLink] Backend auto-switched to ${requiredBt} (chat providerId=${effectiveProviderId})`);
|
|
588
|
-
const caps = requiredBt === 'copilot' ? copilotCapabilities() :
|
|
590
|
+
const caps = requiredBt === 'copilot' ? copilotCapabilities() : claudeCapabilities();
|
|
589
591
|
send({
|
|
590
592
|
type: 'backend_info',
|
|
591
593
|
backend: requiredBt,
|
|
592
|
-
|
|
594
|
+
capabilities: caps,
|
|
593
595
|
});
|
|
594
596
|
}
|
|
595
597
|
}
|
|
@@ -623,10 +625,24 @@ function handleServerMessage(msg) {
|
|
|
623
625
|
? getBackendTypeForProvider(m.providerId)
|
|
624
626
|
: getBackendType();
|
|
625
627
|
if (sessionBackend === 'copilot') {
|
|
626
|
-
handleListCopilotSessionsFn(dir
|
|
628
|
+
handleListCopilotSessionsFn(dir, {
|
|
629
|
+
limit: m.limit,
|
|
630
|
+
cursor: m.cursor,
|
|
631
|
+
mode: m.mode,
|
|
632
|
+
requestId: m.requestId,
|
|
633
|
+
providerId: m.providerId,
|
|
634
|
+
legacy: m.limit == null && !m.cursor && !m.mode && !m.requestId,
|
|
635
|
+
});
|
|
627
636
|
}
|
|
628
637
|
else {
|
|
629
|
-
handleListSessions(dir, {
|
|
638
|
+
void handleListSessions(dir, {
|
|
639
|
+
limit: m.limit,
|
|
640
|
+
cursor: m.cursor,
|
|
641
|
+
mode: m.mode,
|
|
642
|
+
requestId: m.requestId,
|
|
643
|
+
providerId: m.providerId,
|
|
644
|
+
legacy: m.limit == null && !m.cursor && !m.mode && !m.requestId,
|
|
645
|
+
});
|
|
630
646
|
}
|
|
631
647
|
break;
|
|
632
648
|
}
|
|
@@ -639,13 +655,21 @@ function handleServerMessage(msg) {
|
|
|
639
655
|
? getBackendTypeForProvider(m.providerId)
|
|
640
656
|
: getBackendType();
|
|
641
657
|
if (recentBackend === 'copilot') {
|
|
642
|
-
const
|
|
643
|
-
|
|
644
|
-
|
|
645
|
-
|
|
658
|
+
const page = listAllCopilotSessionsPage({ limit: m.limit, cursor: m.cursor });
|
|
659
|
+
console.log(`[AgentLink] → recent_sessions_list (${page.sessions.length} copilot sessions) hasMore=${page.hasMore}`);
|
|
660
|
+
send({
|
|
661
|
+
type: 'recent_sessions_list',
|
|
662
|
+
sessions: page.sessions,
|
|
663
|
+
hasMore: page.hasMore,
|
|
664
|
+
nextCursor: page.nextCursor,
|
|
665
|
+
indexState: page.indexState,
|
|
666
|
+
...(m.mode ? { mode: m.mode } : {}),
|
|
667
|
+
...(m.requestId ? { requestId: m.requestId } : {}),
|
|
668
|
+
...(m.providerId ? { providerId: m.providerId } : {}),
|
|
669
|
+
});
|
|
646
670
|
}
|
|
647
671
|
else {
|
|
648
|
-
handleListRecentSessions(
|
|
672
|
+
handleListRecentSessions(m);
|
|
649
673
|
}
|
|
650
674
|
break;
|
|
651
675
|
}
|
|
@@ -1300,11 +1324,11 @@ function handleServerMessage(msg) {
|
|
|
1300
1324
|
if (backendChanged) {
|
|
1301
1325
|
const caps = newBackendType === 'copilot'
|
|
1302
1326
|
? copilotCapabilities()
|
|
1303
|
-
:
|
|
1327
|
+
: claudeCapabilities();
|
|
1304
1328
|
send({
|
|
1305
1329
|
type: 'backend_info',
|
|
1306
1330
|
backend: newBackendType,
|
|
1307
|
-
|
|
1331
|
+
capabilities: caps,
|
|
1308
1332
|
});
|
|
1309
1333
|
}
|
|
1310
1334
|
break;
|
|
@@ -1313,15 +1337,12 @@ function handleServerMessage(msg) {
|
|
|
1313
1337
|
const providers = listProviders();
|
|
1314
1338
|
const defaultId = getDefaultProviderId();
|
|
1315
1339
|
send({ type: 'providers_list', providers, default: defaultId });
|
|
1316
|
-
// Send backend_info
|
|
1317
|
-
|
|
1318
|
-
|
|
1319
|
-
|
|
1320
|
-
|
|
1321
|
-
|
|
1322
|
-
capabilities: copilotCapabilities(),
|
|
1323
|
-
});
|
|
1324
|
-
}
|
|
1340
|
+
// Send backend_info so the web can gate protocol-sensitive features.
|
|
1341
|
+
send({
|
|
1342
|
+
type: 'backend_info',
|
|
1343
|
+
backend: getBackendType(),
|
|
1344
|
+
capabilities: getBackendType() === 'copilot' ? copilotCapabilities() : claudeCapabilities(),
|
|
1345
|
+
});
|
|
1325
1346
|
break;
|
|
1326
1347
|
}
|
|
1327
1348
|
case 'save_provider': {
|
|
@@ -1776,41 +1797,93 @@ async function handleBrainChatDeleteSession(msg) {
|
|
|
1776
1797
|
send({ type: 'brainchat_error', message: String(err) });
|
|
1777
1798
|
}
|
|
1778
1799
|
}
|
|
1779
|
-
function handleListSessions(dir, options = {}) {
|
|
1800
|
+
async function handleListSessions(dir, options = {}) {
|
|
1780
1801
|
try {
|
|
1781
1802
|
// Use the provided dir so the response is tagged with the directory
|
|
1782
1803
|
// that was actually listed, not whatever state.workDir has mutated to by
|
|
1783
1804
|
// the time the async work finishes (guards against rapid switching races).
|
|
1784
1805
|
const requestedWorkDir = dir;
|
|
1785
|
-
|
|
1786
|
-
const page =
|
|
1787
|
-
limit:
|
|
1788
|
-
|
|
1789
|
-
|
|
1790
|
-
|
|
1806
|
+
const startedAt = performance.now();
|
|
1807
|
+
const page = options.legacy
|
|
1808
|
+
? { ...await listSessionsPageAsync(requestedWorkDir, { limit: Number.POSITIVE_INFINITY }), hasMore: false }
|
|
1809
|
+
: await listSessionsPageAsync(requestedWorkDir, {
|
|
1810
|
+
limit: options.limit ?? DEFAULT_SESSION_LIST_LIMIT,
|
|
1811
|
+
cursor: options.cursor,
|
|
1812
|
+
});
|
|
1813
|
+
if (options.legacy && page.sessions.length > LEGACY_SESSION_LIST_CAP) {
|
|
1814
|
+
page.sessions = page.sessions.slice(0, LEGACY_SESSION_LIST_CAP);
|
|
1815
|
+
}
|
|
1791
1816
|
const enriched = page.sessions.map(s => ({
|
|
1792
1817
|
...s,
|
|
1793
|
-
...
|
|
1818
|
+
...loadSessionMetadata(s.sessionId),
|
|
1794
1819
|
}));
|
|
1795
|
-
console.
|
|
1820
|
+
console.log(`[AgentLink] handleListSessions ${(performance.now() - startedAt).toFixed(3)}ms`);
|
|
1796
1821
|
const cs = getSessionCacheStats();
|
|
1797
1822
|
console.log(`[AgentLink] → sessions_list (${enriched.length} sessions for ${requestedWorkDir}) hasMore=${page.hasMore} cache size=${cs.size} hits=${cs.hits} misses=${cs.misses} stale=${cs.staleMisses} ttlSkips=${cs.ttlSkips} evictions=${cs.evictions}`);
|
|
1798
|
-
send({
|
|
1823
|
+
send({
|
|
1824
|
+
type: 'sessions_list',
|
|
1825
|
+
sessions: enriched,
|
|
1826
|
+
workDir: requestedWorkDir,
|
|
1827
|
+
hasMore: page.hasMore,
|
|
1828
|
+
nextCursor: page.nextCursor,
|
|
1829
|
+
indexState: 'ready',
|
|
1830
|
+
...(options.mode ? { mode: options.mode } : {}),
|
|
1831
|
+
...(options.requestId ? { requestId: options.requestId } : {}),
|
|
1832
|
+
...(options.providerId ? { providerId: options.providerId } : {}),
|
|
1833
|
+
});
|
|
1799
1834
|
}
|
|
1800
1835
|
catch (err) {
|
|
1801
1836
|
console.error(`[AgentLink] listSessions failed:`, err);
|
|
1802
|
-
send({
|
|
1837
|
+
send({
|
|
1838
|
+
type: 'sessions_list',
|
|
1839
|
+
sessions: [],
|
|
1840
|
+
workDir: dir,
|
|
1841
|
+
hasMore: false,
|
|
1842
|
+
indexState: 'ready',
|
|
1843
|
+
error: err.message,
|
|
1844
|
+
...(options.mode ? { mode: options.mode } : {}),
|
|
1845
|
+
...(options.requestId ? { requestId: options.requestId } : {}),
|
|
1846
|
+
...(options.providerId ? { providerId: options.providerId } : {}),
|
|
1847
|
+
});
|
|
1803
1848
|
}
|
|
1804
1849
|
}
|
|
1805
|
-
function handleListCopilotSessionsFn(dir) {
|
|
1850
|
+
function handleListCopilotSessionsFn(dir, options = {}) {
|
|
1806
1851
|
try {
|
|
1807
|
-
const
|
|
1808
|
-
|
|
1809
|
-
|
|
1852
|
+
const page = options.legacy
|
|
1853
|
+
? { ...listCopilotSessionsPage(dir, { limit: Number.POSITIVE_INFINITY }), hasMore: false }
|
|
1854
|
+
: listCopilotSessionsPage(dir, {
|
|
1855
|
+
limit: options.limit ?? DEFAULT_SESSION_LIST_LIMIT,
|
|
1856
|
+
cursor: options.cursor,
|
|
1857
|
+
});
|
|
1858
|
+
if (options.legacy && page.sessions.length > LEGACY_SESSION_LIST_CAP) {
|
|
1859
|
+
page.sessions = page.sessions.slice(0, LEGACY_SESSION_LIST_CAP);
|
|
1860
|
+
}
|
|
1861
|
+
console.log(`[AgentLink] → sessions_list (${page.sessions.length} copilot sessions for ${dir}) hasMore=${page.hasMore}`);
|
|
1862
|
+
send({
|
|
1863
|
+
type: 'sessions_list',
|
|
1864
|
+
sessions: page.sessions,
|
|
1865
|
+
workDir: dir,
|
|
1866
|
+
hasMore: page.hasMore,
|
|
1867
|
+
nextCursor: page.nextCursor,
|
|
1868
|
+
indexState: 'ready',
|
|
1869
|
+
...(options.mode ? { mode: options.mode } : {}),
|
|
1870
|
+
...(options.requestId ? { requestId: options.requestId } : {}),
|
|
1871
|
+
...(options.providerId ? { providerId: options.providerId } : {}),
|
|
1872
|
+
});
|
|
1810
1873
|
}
|
|
1811
1874
|
catch (err) {
|
|
1812
1875
|
console.error(`[AgentLink] listCopilotSessions failed:`, err);
|
|
1813
|
-
send({
|
|
1876
|
+
send({
|
|
1877
|
+
type: 'sessions_list',
|
|
1878
|
+
sessions: [],
|
|
1879
|
+
workDir: dir,
|
|
1880
|
+
hasMore: false,
|
|
1881
|
+
indexState: 'ready',
|
|
1882
|
+
error: err.message,
|
|
1883
|
+
...(options.mode ? { mode: options.mode } : {}),
|
|
1884
|
+
...(options.requestId ? { requestId: options.requestId } : {}),
|
|
1885
|
+
...(options.providerId ? { providerId: options.providerId } : {}),
|
|
1886
|
+
});
|
|
1814
1887
|
}
|
|
1815
1888
|
}
|
|
1816
1889
|
function sendSessionExportResult(requestId, sessionId, result) {
|
|
@@ -1880,14 +1953,31 @@ function handleListBrainSessions() {
|
|
|
1880
1953
|
}
|
|
1881
1954
|
async function handleListRecentSessions(msg) {
|
|
1882
1955
|
try {
|
|
1883
|
-
const
|
|
1884
|
-
|
|
1885
|
-
|
|
1886
|
-
|
|
1956
|
+
const page = await listAllRecentSessionsPage({ limit: msg.limit, cursor: msg.cursor, perProjectLimit: Number.POSITIVE_INFINITY });
|
|
1957
|
+
console.log(`[AgentLink] → recent_sessions_list (${page.sessions.length} sessions across all workDirs) hasMore=${page.hasMore}`);
|
|
1958
|
+
send({
|
|
1959
|
+
type: 'recent_sessions_list',
|
|
1960
|
+
sessions: page.sessions,
|
|
1961
|
+
hasMore: page.hasMore,
|
|
1962
|
+
nextCursor: page.nextCursor,
|
|
1963
|
+
indexState: page.indexState,
|
|
1964
|
+
...(msg.mode ? { mode: msg.mode } : {}),
|
|
1965
|
+
...(msg.requestId ? { requestId: msg.requestId } : {}),
|
|
1966
|
+
...(msg.providerId ? { providerId: msg.providerId } : {}),
|
|
1967
|
+
});
|
|
1887
1968
|
}
|
|
1888
1969
|
catch (err) {
|
|
1889
1970
|
console.error('[AgentLink] listAllRecentSessions failed:', err);
|
|
1890
|
-
send({
|
|
1971
|
+
send({
|
|
1972
|
+
type: 'recent_sessions_list',
|
|
1973
|
+
sessions: [],
|
|
1974
|
+
hasMore: false,
|
|
1975
|
+
indexState: 'ready',
|
|
1976
|
+
error: err.message,
|
|
1977
|
+
...(msg.mode ? { mode: msg.mode } : {}),
|
|
1978
|
+
...(msg.requestId ? { requestId: msg.requestId } : {}),
|
|
1979
|
+
...(msg.providerId ? { providerId: msg.providerId } : {}),
|
|
1980
|
+
});
|
|
1891
1981
|
}
|
|
1892
1982
|
}
|
|
1893
1983
|
// ── Session content search ───────────────────────────────────────────────
|