@getpaseo/server 0.1.15 → 0.1.16

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 (65) hide show
  1. package/dist/server/client/daemon-client.d.ts +41 -4
  2. package/dist/server/client/daemon-client.d.ts.map +1 -1
  3. package/dist/server/client/daemon-client.js +355 -84
  4. package/dist/server/client/daemon-client.js.map +1 -1
  5. package/dist/server/server/agent/agent-manager.d.ts +10 -0
  6. package/dist/server/server/agent/agent-manager.d.ts.map +1 -1
  7. package/dist/server/server/agent/agent-manager.js +261 -18
  8. package/dist/server/server/agent/agent-manager.js.map +1 -1
  9. package/dist/server/server/agent/agent-projections.d.ts +5 -0
  10. package/dist/server/server/agent/agent-projections.d.ts.map +1 -1
  11. package/dist/server/server/agent/agent-projections.js +24 -0
  12. package/dist/server/server/agent/agent-projections.js.map +1 -1
  13. package/dist/server/server/agent/agent-sdk-types.d.ts +11 -0
  14. package/dist/server/server/agent/agent-sdk-types.d.ts.map +1 -1
  15. package/dist/server/server/agent/agent-storage.d.ts +15 -5
  16. package/dist/server/server/agent/agent-storage.d.ts.map +1 -1
  17. package/dist/server/server/agent/agent-storage.js +2 -0
  18. package/dist/server/server/agent/agent-storage.js.map +1 -1
  19. package/dist/server/server/agent/providers/claude/tool-call-detail-parser.d.ts.map +1 -1
  20. package/dist/server/server/agent/providers/claude/tool-call-detail-parser.js +2 -0
  21. package/dist/server/server/agent/providers/claude/tool-call-detail-parser.js.map +1 -1
  22. package/dist/server/server/agent/providers/claude/tool-call-mapper.d.ts.map +1 -1
  23. package/dist/server/server/agent/providers/claude/tool-call-mapper.js +2 -0
  24. package/dist/server/server/agent/providers/claude/tool-call-mapper.js.map +1 -1
  25. package/dist/server/server/agent/providers/claude-agent.d.ts +7 -1
  26. package/dist/server/server/agent/providers/claude-agent.d.ts.map +1 -1
  27. package/dist/server/server/agent/providers/claude-agent.js +1470 -232
  28. package/dist/server/server/agent/providers/claude-agent.js.map +1 -1
  29. package/dist/server/server/agent/providers/codex-app-server-agent.d.ts.map +1 -1
  30. package/dist/server/server/agent/providers/codex-app-server-agent.js +19 -4
  31. package/dist/server/server/agent/providers/codex-app-server-agent.js.map +1 -1
  32. package/dist/server/server/agent/providers/tool-call-detail-primitives.d.ts +40 -0
  33. package/dist/server/server/agent/providers/tool-call-detail-primitives.d.ts.map +1 -1
  34. package/dist/server/server/agent/providers/tool-call-detail-primitives.js +1 -0
  35. package/dist/server/server/agent/providers/tool-call-detail-primitives.js.map +1 -1
  36. package/dist/server/server/client-message-id.d.ts +3 -0
  37. package/dist/server/server/client-message-id.d.ts.map +1 -0
  38. package/dist/server/server/client-message-id.js +12 -0
  39. package/dist/server/server/client-message-id.js.map +1 -0
  40. package/dist/server/server/persisted-config.d.ts +8 -8
  41. package/dist/server/server/persistence-hooks.js +1 -1
  42. package/dist/server/server/persistence-hooks.js.map +1 -1
  43. package/dist/server/server/relay-transport.d.ts.map +1 -1
  44. package/dist/server/server/relay-transport.js +27 -28
  45. package/dist/server/server/relay-transport.js.map +1 -1
  46. package/dist/server/server/session.d.ts +4 -2
  47. package/dist/server/server/session.d.ts.map +1 -1
  48. package/dist/server/server/session.js +122 -31
  49. package/dist/server/server/session.js.map +1 -1
  50. package/dist/server/server/websocket-server.d.ts +8 -4
  51. package/dist/server/server/websocket-server.d.ts.map +1 -1
  52. package/dist/server/server/websocket-server.js +272 -75
  53. package/dist/server/server/websocket-server.js.map +1 -1
  54. package/dist/server/shared/daemon-endpoints.d.ts +9 -1
  55. package/dist/server/shared/daemon-endpoints.d.ts.map +1 -1
  56. package/dist/server/shared/daemon-endpoints.js +18 -3
  57. package/dist/server/shared/daemon-endpoints.js.map +1 -1
  58. package/dist/server/shared/messages.d.ts +2065 -313
  59. package/dist/server/shared/messages.d.ts.map +1 -1
  60. package/dist/server/shared/messages.js +40 -1
  61. package/dist/server/shared/messages.js.map +1 -1
  62. package/dist/server/shared/tool-call-display.d.ts.map +1 -1
  63. package/dist/server/shared/tool-call-display.js +4 -0
  64. package/dist/server/shared/tool-call-display.js.map +1 -1
  65. package/package.json +3 -3
@@ -17,7 +17,7 @@ import { buildConfigOverrides, buildSessionConfig, extractTimestamps } from './p
17
17
  import { experimental_createMCPClient } from 'ai';
18
18
  import { buildProviderRegistry } from './agent/provider-registry.js';
19
19
  import { scheduleAgentMetadataGeneration } from './agent/agent-metadata-generator.js';
20
- import { toAgentPayload } from './agent/agent-projections.js';
20
+ import { resolveEffectiveThinkingOptionId, toAgentPayload } from './agent/agent-projections.js';
21
21
  import { appendTimelineItemIfAgentKnown, emitLiveTimelineItemIfAgentKnown, } from './agent/timeline-append.js';
22
22
  import { projectTimelineRows } from './agent/timeline-projection.js';
23
23
  import { DEFAULT_STRUCTURED_GENERATION_PROVIDERS, StructuredAgentFallbackError, StructuredAgentResponseError, generateStructuredAgentResponseWithFallback, } from './agent/agent-response-loop.js';
@@ -32,6 +32,7 @@ import { getProjectIcon } from '../utils/project-icon.js';
32
32
  import { expandTilde } from '../utils/path.js';
33
33
  import { searchHomeDirectories, searchWorkspaceEntries } from '../utils/directory-suggestions.js';
34
34
  import { ensureLocalSpeechModels, getLocalSpeechModelDir, listLocalSpeechModels, } from './speech/providers/local/models.js';
35
+ import { resolveClientMessageId } from './client-message-id.js';
35
36
  const execAsync = promisify(exec);
36
37
  const READ_ONLY_GIT_ENV = {
37
38
  ...process.env,
@@ -516,12 +517,33 @@ export class Session {
516
517
  const updatedAt = new Date(record.lastActivityAt ?? record.updatedAt);
517
518
  const lastUserMessageAt = record.lastUserMessageAt ? new Date(record.lastUserMessageAt) : null;
518
519
  const provider = coerceAgentProvider(this.sessionLogger, record.provider, record.id);
520
+ const runtimeInfo = record.runtimeInfo
521
+ ? {
522
+ provider: coerceAgentProvider(this.sessionLogger, record.runtimeInfo.provider, record.id),
523
+ sessionId: record.runtimeInfo.sessionId,
524
+ ...(Object.prototype.hasOwnProperty.call(record.runtimeInfo, 'model')
525
+ ? { model: record.runtimeInfo.model ?? null }
526
+ : {}),
527
+ ...(Object.prototype.hasOwnProperty.call(record.runtimeInfo, 'thinkingOptionId')
528
+ ? { thinkingOptionId: record.runtimeInfo.thinkingOptionId ?? null }
529
+ : {}),
530
+ ...(Object.prototype.hasOwnProperty.call(record.runtimeInfo, 'modeId')
531
+ ? { modeId: record.runtimeInfo.modeId ?? null }
532
+ : {}),
533
+ ...(record.runtimeInfo.extra ? { extra: record.runtimeInfo.extra } : {}),
534
+ }
535
+ : undefined;
519
536
  return {
520
537
  id: record.id,
521
538
  provider,
522
539
  cwd: record.cwd,
523
540
  model: record.config?.model ?? null,
524
541
  thinkingOptionId: record.config?.thinkingOptionId ?? null,
542
+ effectiveThinkingOptionId: resolveEffectiveThinkingOptionId({
543
+ runtimeInfo,
544
+ configuredThinkingOptionId: record.config?.thinkingOptionId ?? null,
545
+ }),
546
+ ...(runtimeInfo ? { runtimeInfo } : {}),
525
547
  createdAt: createdAt.toISOString(),
526
548
  updatedAt: updatedAt.toISOString(),
527
549
  lastUserMessageAt: lastUserMessageAt ? lastUserMessageAt.toISOString() : null,
@@ -592,6 +614,19 @@ export class Session {
592
614
  if (!includeArchived && agent.archivedAt) {
593
615
  return false;
594
616
  }
617
+ if (filter?.thinkingOptionId !== undefined) {
618
+ const expectedThinkingOptionId = resolveEffectiveThinkingOptionId({
619
+ configuredThinkingOptionId: filter.thinkingOptionId ?? null,
620
+ });
621
+ const resolvedThinkingOptionId = agent.effectiveThinkingOptionId ??
622
+ resolveEffectiveThinkingOptionId({
623
+ runtimeInfo: agent.runtimeInfo,
624
+ configuredThinkingOptionId: agent.thinkingOptionId ?? null,
625
+ });
626
+ if (resolvedThinkingOptionId !== expectedThinkingOptionId) {
627
+ return false;
628
+ }
629
+ }
595
630
  if (filter?.statuses && filter.statuses.length > 0) {
596
631
  const statuses = new Set(filter.statuses);
597
632
  if (!statuses.has(agent.status)) {
@@ -1093,6 +1128,9 @@ export class Session {
1093
1128
  }
1094
1129
  async handleArchiveAgentRequest(agentId, requestId) {
1095
1130
  this.sessionLogger.info({ agentId }, `Archiving agent ${agentId}`);
1131
+ if (this.agentManager.getAgent(agentId)) {
1132
+ await this.interruptAgentIfRunning(agentId);
1133
+ }
1096
1134
  const archivedAt = new Date().toISOString();
1097
1135
  const existing = await this.agentStorage.get(agentId);
1098
1136
  let archivedRecord = existing;
@@ -1102,7 +1140,6 @@ export class Session {
1102
1140
  throw new Error(`Agent not found: ${agentId}`);
1103
1141
  }
1104
1142
  await this.agentStorage.applySnapshot(liveAgent, {
1105
- title: liveAgent.config.title ?? null,
1106
1143
  internal: liveAgent.internal,
1107
1144
  });
1108
1145
  archivedRecord = await this.agentStorage.get(agentId);
@@ -1130,6 +1167,10 @@ export class Session {
1130
1167
  requestId,
1131
1168
  });
1132
1169
  }
1170
+ async getArchivedAt(agentId) {
1171
+ const record = await this.agentStorage.get(agentId);
1172
+ return record?.archivedAt ?? null;
1173
+ }
1133
1174
  async handleUpdateAgentRequest(agentId, name, labels, requestId) {
1134
1175
  this.sessionLogger.info({
1135
1176
  agentId,
@@ -1608,6 +1649,11 @@ export class Session {
1608
1649
  this.handleAgentRunError(agentId, error, 'Failed to initialize agent before sending prompt');
1609
1650
  return;
1610
1651
  }
1652
+ const archivedAt = await this.getArchivedAt(agentId);
1653
+ if (archivedAt) {
1654
+ this.handleAgentRunError(agentId, new Error(`Agent ${agentId} is archived`), 'Refusing to send prompt to archived agent');
1655
+ return;
1656
+ }
1611
1657
  try {
1612
1658
  await this.interruptAgentIfRunning(agentId);
1613
1659
  }
@@ -1631,7 +1677,7 @@ export class Session {
1631
1677
  * Handle create agent request
1632
1678
  */
1633
1679
  async handleCreateAgentRequest(msg) {
1634
- const { config, worktreeName, requestId, initialPrompt, outputSchema, git, images, labels } = msg;
1680
+ const { config, worktreeName, requestId, initialPrompt, clientMessageId, outputSchema, git, images, labels, } = msg;
1635
1681
  this.sessionLogger.info({ cwd: config.cwd, provider: config.provider, worktreeName }, `Creating agent in ${config.cwd} (${config.provider})${worktreeName ? ` with worktree ${worktreeName}` : ''}`);
1636
1682
  try {
1637
1683
  const { sessionConfig, worktreeConfig } = await this.buildAgentSessionConfig(config, git, worktreeName, labels);
@@ -1649,7 +1695,7 @@ export class Session {
1649
1695
  logger: this.sessionLogger,
1650
1696
  });
1651
1697
  try {
1652
- await this.handleSendAgentMessage(snapshot.id, trimmedPrompt, uuidv4(), images, outputSchema ? { outputSchema } : undefined);
1698
+ await this.handleSendAgentMessage(snapshot.id, trimmedPrompt, resolveClientMessageId(clientMessageId), images, outputSchema ? { outputSchema } : undefined);
1653
1699
  }
1654
1700
  catch (promptError) {
1655
1701
  this.sessionLogger.error({ err: promptError, agentId: snapshot.id }, `Failed to run initial prompt for agent ${snapshot.id}`);
@@ -3767,6 +3813,18 @@ export class Session {
3767
3813
  return entry.agent.title?.toLocaleLowerCase() ?? '';
3768
3814
  }
3769
3815
  }
3816
+ getFetchAgentsSortValueFromAgent(agent, key) {
3817
+ switch (key) {
3818
+ case 'status_priority':
3819
+ return this.getStatusPriority(agent);
3820
+ case 'created_at':
3821
+ return Date.parse(agent.createdAt);
3822
+ case 'updated_at':
3823
+ return Date.parse(agent.updatedAt);
3824
+ case 'title':
3825
+ return agent.title?.toLocaleLowerCase() ?? '';
3826
+ }
3827
+ }
3770
3828
  compareSortValues(left, right) {
3771
3829
  if (left === right) {
3772
3830
  return 0;
@@ -3782,17 +3840,17 @@ export class Session {
3782
3840
  }
3783
3841
  return String(left).localeCompare(String(right));
3784
3842
  }
3785
- compareFetchAgentsEntries(left, right, sort) {
3843
+ compareFetchAgentsAgents(left, right, sort) {
3786
3844
  for (const spec of sort) {
3787
- const leftValue = this.getFetchAgentsSortValue(left, spec.key);
3788
- const rightValue = this.getFetchAgentsSortValue(right, spec.key);
3845
+ const leftValue = this.getFetchAgentsSortValueFromAgent(left, spec.key);
3846
+ const rightValue = this.getFetchAgentsSortValueFromAgent(right, spec.key);
3789
3847
  const base = this.compareSortValues(leftValue, rightValue);
3790
3848
  if (base === 0) {
3791
3849
  continue;
3792
3850
  }
3793
3851
  return spec.direction === 'asc' ? base : -base;
3794
3852
  }
3795
- return left.agent.id.localeCompare(right.agent.id);
3853
+ return left.id.localeCompare(right.id);
3796
3854
  }
3797
3855
  encodeFetchAgentsCursor(entry, sort) {
3798
3856
  const values = {};
@@ -3852,9 +3910,9 @@ export class Session {
3852
3910
  id: payload.id,
3853
3911
  };
3854
3912
  }
3855
- compareEntryWithCursor(entry, cursor, sort) {
3913
+ compareAgentWithCursor(agent, cursor, sort) {
3856
3914
  for (const spec of sort) {
3857
- const leftValue = this.getFetchAgentsSortValue(entry, spec.key);
3915
+ const leftValue = this.getFetchAgentsSortValueFromAgent(agent, spec.key);
3858
3916
  const rightValue = cursor.values[spec.key] !== undefined ? (cursor.values[spec.key] ?? null) : null;
3859
3917
  const base = this.compareSortValues(leftValue, rightValue);
3860
3918
  if (base === 0) {
@@ -3862,7 +3920,7 @@ export class Session {
3862
3920
  }
3863
3921
  return spec.direction === 'asc' ? base : -base;
3864
3922
  }
3865
- return entry.agent.id.localeCompare(cursor.id);
3923
+ return agent.id.localeCompare(cursor.id);
3866
3924
  }
3867
3925
  async listFetchAgentsEntries(request) {
3868
3926
  const filter = request.filter;
@@ -3880,24 +3938,38 @@ export class Session {
3880
3938
  placementByCwd.set(cwd, placementPromise);
3881
3939
  return placementPromise;
3882
3940
  };
3883
- let entries = await Promise.all(agents.map(async (agent) => ({
3884
- agent,
3885
- project: await getPlacement(agent.cwd),
3886
- })));
3887
- entries = entries.filter((entry) => this.matchesAgentFilter({
3888
- agent: entry.agent,
3889
- project: entry.project,
3890
- filter,
3891
- }));
3892
- entries.sort((left, right) => this.compareFetchAgentsEntries(left, right, sort));
3941
+ let candidates = [...agents];
3942
+ candidates.sort((left, right) => this.compareFetchAgentsAgents(left, right, sort));
3893
3943
  const cursorToken = request.page?.cursor;
3894
3944
  if (cursorToken) {
3895
3945
  const cursor = this.decodeFetchAgentsCursor(cursorToken, sort);
3896
- entries = entries.filter((entry) => this.compareEntryWithCursor(entry, cursor, sort) > 0);
3946
+ candidates = candidates.filter((agent) => this.compareAgentWithCursor(agent, cursor, sort) > 0);
3947
+ }
3948
+ const limit = request.page?.limit ?? 200;
3949
+ const matchedEntries = [];
3950
+ const batchSize = 25;
3951
+ for (let start = 0; start < candidates.length && matchedEntries.length <= limit; start += batchSize) {
3952
+ const batch = candidates.slice(start, start + batchSize);
3953
+ const batchEntries = await Promise.all(batch.map(async (agent) => ({
3954
+ agent,
3955
+ project: await getPlacement(agent.cwd),
3956
+ })));
3957
+ for (const entry of batchEntries) {
3958
+ if (!this.matchesAgentFilter({
3959
+ agent: entry.agent,
3960
+ project: entry.project,
3961
+ filter,
3962
+ })) {
3963
+ continue;
3964
+ }
3965
+ matchedEntries.push(entry);
3966
+ if (matchedEntries.length > limit) {
3967
+ break;
3968
+ }
3969
+ }
3897
3970
  }
3898
- const limit = request.page?.limit ?? entries.length;
3899
- const pagedEntries = entries.slice(0, limit);
3900
- const hasMore = entries.length > limit;
3971
+ const pagedEntries = matchedEntries.slice(0, limit);
3972
+ const hasMore = matchedEntries.length > limit;
3901
3973
  const nextCursor = hasMore && pagedEntries.length > 0
3902
3974
  ? this.encodeFetchAgentsCursor(pagedEntries[pagedEntries.length - 1], sort)
3903
3975
  : null;
@@ -3969,7 +4041,7 @@ export class Session {
3969
4041
  if (!resolved.ok) {
3970
4042
  this.emit({
3971
4043
  type: 'fetch_agent_response',
3972
- payload: { requestId, agent: null, error: resolved.error },
4044
+ payload: { requestId, agent: null, project: null, error: resolved.error },
3973
4045
  });
3974
4046
  return;
3975
4047
  }
@@ -3977,13 +4049,19 @@ export class Session {
3977
4049
  if (!agent) {
3978
4050
  this.emit({
3979
4051
  type: 'fetch_agent_response',
3980
- payload: { requestId, agent: null, error: `Agent not found: ${resolved.agentId}` },
4052
+ payload: {
4053
+ requestId,
4054
+ agent: null,
4055
+ project: null,
4056
+ error: `Agent not found: ${resolved.agentId}`,
4057
+ },
3981
4058
  });
3982
4059
  return;
3983
4060
  }
4061
+ const project = await this.buildProjectPlacement(agent.cwd);
3984
4062
  this.emit({
3985
4063
  type: 'fetch_agent_response',
3986
- payload: { requestId, agent, error: null },
4064
+ payload: { requestId, agent, project, error: null },
3987
4065
  });
3988
4066
  }
3989
4067
  async handleFetchAgentTimelineRequest(msg) {
@@ -4069,6 +4147,19 @@ export class Session {
4069
4147
  }
4070
4148
  try {
4071
4149
  const agentId = resolved.agentId;
4150
+ const archivedAt = await this.getArchivedAt(agentId);
4151
+ if (archivedAt) {
4152
+ this.emit({
4153
+ type: 'send_agent_message_response',
4154
+ payload: {
4155
+ requestId: msg.requestId,
4156
+ agentId,
4157
+ accepted: false,
4158
+ error: `Agent ${agentId} is archived`,
4159
+ },
4160
+ });
4161
+ return;
4162
+ }
4072
4163
  await this.ensureAgentLoaded(agentId);
4073
4164
  await this.interruptAgentIfRunning(agentId);
4074
4165
  try {
@@ -4193,14 +4284,14 @@ export class Session {
4193
4284
  abortController.abort('timeout');
4194
4285
  }, effectiveTimeoutMs);
4195
4286
  try {
4196
- const result = await this.agentManager.waitForAgentEvent(agentId, {
4287
+ let result = await this.agentManager.waitForAgentEvent(agentId, {
4197
4288
  signal: abortController.signal,
4198
4289
  });
4199
- const final = await this.getAgentPayloadById(agentId);
4290
+ let final = await this.getAgentPayloadById(agentId);
4200
4291
  if (!final) {
4201
4292
  throw new Error(`Agent ${agentId} disappeared while waiting`);
4202
4293
  }
4203
- const status = result.permission ? 'permission' : result.status === 'error' ? 'error' : 'idle';
4294
+ let status = result.permission ? 'permission' : result.status === 'error' ? 'error' : 'idle';
4204
4295
  this.emit({
4205
4296
  type: 'wait_for_finish_response',
4206
4297
  payload: { requestId, status, final, error: null, lastMessage: result.lastMessage },