@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.
@@ -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';
@@ -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: { list: true, read: true, rename: true, delete: true, search: true },
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":"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"}
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/backends/types.ts"],"names":[],"mappings":"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"}
@@ -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, listCopilotSessions, listAllCopilotSessions, readCopilotSessionMessages, deleteCopilotSession, renameCopilotSession, getCopilotConversation, getCopilotConversations, createCopilotPlaceholder, restartCopilotConversation, rebindCopilotConversation, copilotCapabilities } from './runtime.js';
28
- import { DEFAULT_SESSION_LIST_LIMIT, listSessions, listSessionsPage, readSessionMessages, deleteSession, renameSession, listAllRecentSessions, getSessionCacheStats } from './history.js';
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() : undefined;
590
+ const caps = requiredBt === 'copilot' ? copilotCapabilities() : claudeCapabilities();
589
591
  send({
590
592
  type: 'backend_info',
591
593
  backend: requiredBt,
592
- ...(caps ? { capabilities: caps } : {}),
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, { limit: m.limit, cursor: m.cursor });
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 limit = m.limit && m.limit > 0 ? m.limit : 500;
643
- const sessions = listAllCopilotSessions(limit);
644
- console.log(`[AgentLink] → recent_sessions_list (${sessions.length} copilot sessions)`);
645
- send({ type: 'recent_sessions_list', sessions });
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(msg);
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
- : undefined; // Claude doesn't send capabilities yet (Phase 2)
1327
+ : claudeCapabilities();
1304
1328
  send({
1305
1329
  type: 'backend_info',
1306
1330
  backend: newBackendType,
1307
- ...(caps ? { capabilities: caps } : {}),
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 if currently on copilot so web knows capabilities.
1317
- // Backend switching is driven by set_provider, not here.
1318
- if (getBackendType() === 'copilot') {
1319
- send({
1320
- type: 'backend_info',
1321
- backend: 'copilot',
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
- console.time('[AgentLink] handleListSessions');
1786
- const page = listSessionsPage(requestedWorkDir, {
1787
- limit: options.limit ?? DEFAULT_SESSION_LIST_LIMIT,
1788
- cursor: options.cursor,
1789
- });
1790
- const metaMap = loadAllSessionMetadata();
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
- ...metaMap.get(s.sessionId),
1818
+ ...loadSessionMetadata(s.sessionId),
1794
1819
  }));
1795
- console.timeEnd('[AgentLink] handleListSessions');
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({ type: 'sessions_list', sessions: enriched, workDir: requestedWorkDir, hasMore: page.hasMore, nextCursor: page.nextCursor });
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({ type: 'sessions_list', sessions: [], workDir: dir, hasMore: false });
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 sessions = listCopilotSessions(dir);
1808
- console.log(`[AgentLink] sessions_list (${sessions.length} copilot sessions for ${dir})`);
1809
- send({ type: 'sessions_list', sessions, workDir: dir });
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({ type: 'sessions_list', sessions: [], workDir: dir });
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 limit = msg.limit && msg.limit > 0 ? msg.limit : 20;
1884
- const sessions = await listAllRecentSessions(limit);
1885
- console.log(`[AgentLink] → recent_sessions_list (${sessions.length} sessions across all workDirs)`);
1886
- send({ type: 'recent_sessions_list', sessions });
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({ type: 'recent_sessions_list', sessions: [] });
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 ───────────────────────────────────────────────