@getpaseo/server 0.1.26 → 0.1.27

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 (49) hide show
  1. package/dist/server/server/agent/provider-launch-config.d.ts +1 -0
  2. package/dist/server/server/agent/provider-launch-config.d.ts.map +1 -1
  3. package/dist/server/server/agent/provider-launch-config.js +14 -0
  4. package/dist/server/server/agent/provider-launch-config.js.map +1 -1
  5. package/dist/server/server/agent/providers/claude/tool-call-detail-parser.d.ts.map +1 -1
  6. package/dist/server/server/agent/providers/claude/tool-call-detail-parser.js +2 -0
  7. package/dist/server/server/agent/providers/claude/tool-call-detail-parser.js.map +1 -1
  8. package/dist/server/server/agent/providers/claude/tool-call-mapper.d.ts.map +1 -1
  9. package/dist/server/server/agent/providers/claude/tool-call-mapper.js +2 -0
  10. package/dist/server/server/agent/providers/claude/tool-call-mapper.js.map +1 -1
  11. package/dist/server/server/agent/providers/codex-app-server-agent.d.ts.map +1 -1
  12. package/dist/server/server/agent/providers/codex-app-server-agent.js +116 -45
  13. package/dist/server/server/agent/providers/codex-app-server-agent.js.map +1 -1
  14. package/dist/server/server/agent/providers/codex-rollout-timeline.d.ts.map +1 -1
  15. package/dist/server/server/agent/providers/codex-rollout-timeline.js +77 -9
  16. package/dist/server/server/agent/providers/codex-rollout-timeline.js.map +1 -1
  17. package/dist/server/server/agent/providers/opencode-agent.d.ts.map +1 -1
  18. package/dist/server/server/agent/providers/opencode-agent.js +5 -34
  19. package/dist/server/server/agent/providers/opencode-agent.js.map +1 -1
  20. package/dist/server/server/agent/providers/tool-call-mapper-utils.d.ts +1 -0
  21. package/dist/server/server/agent/providers/tool-call-mapper-utils.d.ts.map +1 -1
  22. package/dist/server/server/agent/providers/tool-call-mapper-utils.js +8 -0
  23. package/dist/server/server/agent/providers/tool-call-mapper-utils.js.map +1 -1
  24. package/dist/server/server/session.d.ts +6 -0
  25. package/dist/server/server/session.d.ts.map +1 -1
  26. package/dist/server/server/session.js +134 -57
  27. package/dist/server/server/session.js.map +1 -1
  28. package/dist/server/shared/tool-call-display.d.ts.map +1 -1
  29. package/dist/server/shared/tool-call-display.js +7 -0
  30. package/dist/server/shared/tool-call-display.js.map +1 -1
  31. package/dist/src/server/agent/provider-launch-config.js +14 -0
  32. package/dist/src/server/agent/provider-launch-config.js.map +1 -1
  33. package/dist/src/server/agent/providers/claude/tool-call-detail-parser.js +2 -0
  34. package/dist/src/server/agent/providers/claude/tool-call-detail-parser.js.map +1 -1
  35. package/dist/src/server/agent/providers/claude/tool-call-mapper.js +2 -0
  36. package/dist/src/server/agent/providers/claude/tool-call-mapper.js.map +1 -1
  37. package/dist/src/server/agent/providers/codex-app-server-agent.js +116 -45
  38. package/dist/src/server/agent/providers/codex-app-server-agent.js.map +1 -1
  39. package/dist/src/server/agent/providers/codex-rollout-timeline.js +77 -9
  40. package/dist/src/server/agent/providers/codex-rollout-timeline.js.map +1 -1
  41. package/dist/src/server/agent/providers/opencode-agent.js +5 -34
  42. package/dist/src/server/agent/providers/opencode-agent.js.map +1 -1
  43. package/dist/src/server/agent/providers/tool-call-mapper-utils.js +8 -0
  44. package/dist/src/server/agent/providers/tool-call-mapper-utils.js.map +1 -1
  45. package/dist/src/server/session.js +134 -57
  46. package/dist/src/server/session.js.map +1 -1
  47. package/dist/src/shared/tool-call-display.js +7 -0
  48. package/dist/src/shared/tool-call-display.js.map +1 -1
  49. package/package.json +5 -6
@@ -699,6 +699,100 @@ export class Session {
699
699
  paseoHome: this.paseoHome,
700
700
  });
701
701
  }
702
+ buildPersistedProjectRecord(input) {
703
+ return createPersistedProjectRecord({
704
+ projectId: input.placement.projectKey,
705
+ rootPath: deriveProjectRootPath({
706
+ cwd: input.workspaceId,
707
+ checkout: input.placement.checkout,
708
+ }),
709
+ kind: deriveProjectKind(input.placement.checkout),
710
+ displayName: input.placement.projectName,
711
+ createdAt: input.createdAt,
712
+ updatedAt: input.updatedAt,
713
+ archivedAt: null,
714
+ });
715
+ }
716
+ buildPersistedWorkspaceRecord(input) {
717
+ return createPersistedWorkspaceRecord({
718
+ workspaceId: input.workspaceId,
719
+ projectId: input.placement.projectKey,
720
+ cwd: input.workspaceId,
721
+ kind: deriveWorkspaceKind(input.placement.checkout),
722
+ displayName: deriveWorkspaceDisplayName({
723
+ cwd: input.workspaceId,
724
+ checkout: input.placement.checkout,
725
+ }),
726
+ createdAt: input.createdAt,
727
+ updatedAt: input.updatedAt,
728
+ archivedAt: null,
729
+ });
730
+ }
731
+ async archiveProjectRecordIfEmpty(projectId, archivedAt) {
732
+ const siblingWorkspaces = (await this.workspaceRegistry.list()).filter((workspace) => workspace.projectId === projectId && !workspace.archivedAt);
733
+ if (siblingWorkspaces.length === 0) {
734
+ await this.projectRegistry.archive(projectId, archivedAt);
735
+ }
736
+ }
737
+ async reconcileWorkspaceRecord(workspaceId) {
738
+ const normalizedWorkspaceId = normalizePersistedWorkspaceId(workspaceId);
739
+ const existing = await this.workspaceRegistry.get(normalizedWorkspaceId);
740
+ const placement = await this.buildProjectPlacement(normalizedWorkspaceId);
741
+ const now = new Date().toISOString();
742
+ const nextProjectCreatedAt = existing?.createdAt ?? now;
743
+ const nextWorkspaceCreatedAt = existing?.createdAt ?? now;
744
+ const currentProjectRecord = await this.projectRegistry.get(placement.projectKey);
745
+ const nextProjectRecord = this.buildPersistedProjectRecord({
746
+ workspaceId: normalizedWorkspaceId,
747
+ placement,
748
+ createdAt: currentProjectRecord?.createdAt ?? nextProjectCreatedAt,
749
+ updatedAt: now,
750
+ });
751
+ const nextWorkspaceRecord = this.buildPersistedWorkspaceRecord({
752
+ workspaceId: normalizedWorkspaceId,
753
+ placement,
754
+ createdAt: nextWorkspaceCreatedAt,
755
+ updatedAt: now,
756
+ });
757
+ const needsWorkspaceUpdate = !existing ||
758
+ existing.archivedAt ||
759
+ existing.projectId !== nextWorkspaceRecord.projectId ||
760
+ existing.kind !== nextWorkspaceRecord.kind ||
761
+ existing.displayName !== nextWorkspaceRecord.displayName;
762
+ const needsProjectUpdate = !currentProjectRecord ||
763
+ currentProjectRecord.archivedAt ||
764
+ currentProjectRecord.rootPath !== nextProjectRecord.rootPath ||
765
+ currentProjectRecord.kind !== nextProjectRecord.kind ||
766
+ currentProjectRecord.displayName !== nextProjectRecord.displayName;
767
+ if (!needsWorkspaceUpdate && !needsProjectUpdate) {
768
+ return {
769
+ workspace: existing,
770
+ changed: false,
771
+ };
772
+ }
773
+ await this.projectRegistry.upsert(nextProjectRecord);
774
+ await this.workspaceRegistry.upsert(nextWorkspaceRecord);
775
+ if (existing &&
776
+ !existing.archivedAt &&
777
+ existing.projectId !== nextWorkspaceRecord.projectId) {
778
+ await this.archiveProjectRecordIfEmpty(existing.projectId, now);
779
+ }
780
+ return {
781
+ workspace: nextWorkspaceRecord,
782
+ changed: true,
783
+ };
784
+ }
785
+ async reconcileActiveWorkspaceRecords() {
786
+ const changedWorkspaceIds = new Set();
787
+ const activeWorkspaces = (await this.workspaceRegistry.list()).filter((workspace) => !workspace.archivedAt);
788
+ for (const workspace of activeWorkspaces) {
789
+ const result = await this.reconcileWorkspaceRecord(workspace.workspaceId);
790
+ if (result.changed) {
791
+ changedWorkspaceIds.add(result.workspace.workspaceId);
792
+ }
793
+ }
794
+ return changedWorkspaceIds;
795
+ }
702
796
  async forwardAgentUpdate(agent) {
703
797
  try {
704
798
  await this.ensureWorkspaceRegistered(agent.cwd);
@@ -4027,7 +4121,7 @@ export class Session {
4027
4121
  diffStat,
4028
4122
  };
4029
4123
  }
4030
- async listWorkspaceDescriptors() {
4124
+ async listWorkspaceDescriptorsSnapshot() {
4031
4125
  const [agents, persistedWorkspaces, persistedProjects] = await Promise.all([
4032
4126
  this.listAgentPayloads(),
4033
4127
  this.workspaceRegistry.list(),
@@ -4058,6 +4152,10 @@ export class Session {
4058
4152
  }
4059
4153
  return Array.from(descriptorsByWorkspaceId.values());
4060
4154
  }
4155
+ async listWorkspaceDescriptors() {
4156
+ await this.reconcileActiveWorkspaceRecords();
4157
+ return this.listWorkspaceDescriptorsSnapshot();
4158
+ }
4061
4159
  normalizeFetchWorkspacesSort(sort) {
4062
4160
  const fallback = [{ key: 'activity_at', direction: 'desc' }];
4063
4161
  if (!sort || sort.length === 0) {
@@ -4257,41 +4355,7 @@ export class Session {
4257
4355
  }
4258
4356
  async ensureWorkspaceRegistered(cwd) {
4259
4357
  const workspaceId = normalizePersistedWorkspaceId(cwd);
4260
- const existing = await this.workspaceRegistry.get(workspaceId);
4261
- if (existing && !existing.archivedAt) {
4262
- return existing;
4263
- }
4264
- const placement = await this.buildProjectPlacement(workspaceId);
4265
- const now = new Date().toISOString();
4266
- const projectExisting = await this.projectRegistry.get(placement.projectKey);
4267
- const projectRecord = createPersistedProjectRecord({
4268
- projectId: placement.projectKey,
4269
- rootPath: deriveProjectRootPath({
4270
- cwd: workspaceId,
4271
- checkout: placement.checkout,
4272
- }),
4273
- kind: deriveProjectKind(placement.checkout),
4274
- displayName: placement.projectName,
4275
- createdAt: projectExisting?.createdAt ?? now,
4276
- updatedAt: now,
4277
- archivedAt: null,
4278
- });
4279
- await this.projectRegistry.upsert(projectRecord);
4280
- const workspaceRecord = createPersistedWorkspaceRecord({
4281
- workspaceId,
4282
- projectId: placement.projectKey,
4283
- cwd: workspaceId,
4284
- kind: deriveWorkspaceKind(placement.checkout),
4285
- displayName: deriveWorkspaceDisplayName({
4286
- cwd: workspaceId,
4287
- checkout: placement.checkout,
4288
- }),
4289
- createdAt: existing?.createdAt ?? now,
4290
- updatedAt: now,
4291
- archivedAt: null,
4292
- });
4293
- await this.workspaceRegistry.upsert(workspaceRecord);
4294
- return workspaceRecord;
4358
+ return (await this.reconcileWorkspaceRecord(workspaceId)).workspace;
4295
4359
  }
4296
4360
  async archiveWorkspaceRecord(workspaceId, archivedAt) {
4297
4361
  const existing = await this.workspaceRegistry.get(workspaceId);
@@ -4311,32 +4375,31 @@ export class Session {
4311
4375
  return;
4312
4376
  }
4313
4377
  const workspaceId = normalizePersistedWorkspaceId(cwd);
4314
- const all = await this.listWorkspaceDescriptors();
4315
- const workspace = all.find((entry) => entry.id === workspaceId);
4316
- if (!workspace) {
4317
- this.bufferOrEmitWorkspaceUpdate(subscription, {
4318
- kind: 'remove',
4319
- id: workspaceId,
4320
- });
4321
- return;
4322
- }
4323
- if (!this.matchesWorkspaceFilter({ workspace, filter: subscription.filter })) {
4378
+ const changedWorkspaceIds = await this.reconcileActiveWorkspaceRecords();
4379
+ const all = await this.listWorkspaceDescriptorsSnapshot();
4380
+ const descriptorsByWorkspaceId = new Map(all.map((entry) => [entry.id, entry]));
4381
+ const workspaceIdsToEmit = new Set([workspaceId, ...changedWorkspaceIds]);
4382
+ for (const nextWorkspaceId of workspaceIdsToEmit) {
4383
+ const workspace = descriptorsByWorkspaceId.get(nextWorkspaceId);
4384
+ if (!workspace || !this.matchesWorkspaceFilter({ workspace, filter: subscription.filter })) {
4385
+ this.bufferOrEmitWorkspaceUpdate(subscription, {
4386
+ kind: 'remove',
4387
+ id: nextWorkspaceId,
4388
+ });
4389
+ continue;
4390
+ }
4324
4391
  this.bufferOrEmitWorkspaceUpdate(subscription, {
4325
- kind: 'remove',
4326
- id: workspaceId,
4392
+ kind: 'upsert',
4393
+ workspace,
4327
4394
  });
4328
- return;
4329
4395
  }
4330
- this.bufferOrEmitWorkspaceUpdate(subscription, {
4331
- kind: 'upsert',
4332
- workspace,
4333
- });
4334
4396
  }
4335
4397
  async emitWorkspaceUpdatesForCwds(cwds) {
4336
4398
  if (!this.workspaceUpdatesSubscription) {
4337
4399
  return;
4338
4400
  }
4339
- const uniqueWorkspaceCwds = new Set();
4401
+ const changedWorkspaceIds = await this.reconcileActiveWorkspaceRecords();
4402
+ const uniqueWorkspaceCwds = new Set(changedWorkspaceIds);
4340
4403
  for (const cwd of cwds) {
4341
4404
  const normalized = normalizePersistedWorkspaceId(cwd);
4342
4405
  if (!normalized) {
@@ -4344,8 +4407,22 @@ export class Session {
4344
4407
  }
4345
4408
  uniqueWorkspaceCwds.add(normalized);
4346
4409
  }
4347
- for (const workspaceCwd of uniqueWorkspaceCwds) {
4348
- await this.emitWorkspaceUpdateForCwd(workspaceCwd);
4410
+ const subscription = this.workspaceUpdatesSubscription;
4411
+ const all = await this.listWorkspaceDescriptorsSnapshot();
4412
+ const descriptorsByWorkspaceId = new Map(all.map((entry) => [entry.id, entry]));
4413
+ for (const workspaceId of uniqueWorkspaceCwds) {
4414
+ const workspace = descriptorsByWorkspaceId.get(workspaceId);
4415
+ if (!workspace || !this.matchesWorkspaceFilter({ workspace, filter: subscription.filter })) {
4416
+ this.bufferOrEmitWorkspaceUpdate(subscription, {
4417
+ kind: 'remove',
4418
+ id: workspaceId,
4419
+ });
4420
+ continue;
4421
+ }
4422
+ this.bufferOrEmitWorkspaceUpdate(subscription, {
4423
+ kind: 'upsert',
4424
+ workspace,
4425
+ });
4349
4426
  }
4350
4427
  }
4351
4428
  async handleFetchAgents(request) {
@@ -5749,7 +5826,7 @@ export class Session {
5749
5826
  const streamId = this.allocateTerminalStreamId();
5750
5827
  const requestedResumeOffset = typeof msg.resumeOffset === 'number'
5751
5828
  ? msg.resumeOffset
5752
- : session.getOutputOffset();
5829
+ : 0;
5753
5830
  const initialOffset = Math.max(0, Math.floor(requestedResumeOffset));
5754
5831
  const binding = {
5755
5832
  terminalId: msg.terminalId,