@junctionpanel/server 0.1.92 → 0.1.94

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 (36) hide show
  1. package/dist/server/client/daemon-client.d.ts +3 -0
  2. package/dist/server/client/daemon-client.d.ts.map +1 -1
  3. package/dist/server/client/daemon-client.js +55 -0
  4. package/dist/server/client/daemon-client.js.map +1 -1
  5. package/dist/server/server/agent/agent-manager.d.ts +3 -0
  6. package/dist/server/server/agent/agent-manager.d.ts.map +1 -1
  7. package/dist/server/server/agent/agent-manager.js +63 -31
  8. package/dist/server/server/agent/agent-manager.js.map +1 -1
  9. package/dist/server/server/agent/agent-projections.d.ts.map +1 -1
  10. package/dist/server/server/agent/agent-projections.js +1 -0
  11. package/dist/server/server/agent/agent-projections.js.map +1 -1
  12. package/dist/server/server/agent/agent-sdk-types.d.ts +3 -0
  13. package/dist/server/server/agent/agent-sdk-types.d.ts.map +1 -1
  14. package/dist/server/server/agent/agent-sdk-types.js.map +1 -1
  15. package/dist/server/server/agent/providers/claude-agent.d.ts.map +1 -1
  16. package/dist/server/server/agent/providers/claude-agent.js +1 -0
  17. package/dist/server/server/agent/providers/claude-agent.js.map +1 -1
  18. package/dist/server/server/agent/providers/codex-app-server-agent.d.ts.map +1 -1
  19. package/dist/server/server/agent/providers/codex-app-server-agent.js +22 -0
  20. package/dist/server/server/agent/providers/codex-app-server-agent.js.map +1 -1
  21. package/dist/server/server/agent/providers/gemini-agent.d.ts.map +1 -1
  22. package/dist/server/server/agent/providers/gemini-agent.js +1 -0
  23. package/dist/server/server/agent/providers/gemini-agent.js.map +1 -1
  24. package/dist/server/server/agent/providers/opencode-agent.d.ts.map +1 -1
  25. package/dist/server/server/agent/providers/opencode-agent.js +1 -0
  26. package/dist/server/server/agent/providers/opencode-agent.js.map +1 -1
  27. package/dist/server/server/agent/providers/tool-call-detail-primitives.d.ts.map +1 -1
  28. package/dist/server/server/session.d.ts +3 -0
  29. package/dist/server/server/session.d.ts.map +1 -1
  30. package/dist/server/server/session.js +217 -3
  31. package/dist/server/server/session.js.map +1 -1
  32. package/dist/server/shared/messages.d.ts +2267 -26
  33. package/dist/server/shared/messages.d.ts.map +1 -1
  34. package/dist/server/shared/messages.js +45 -0
  35. package/dist/server/shared/messages.js.map +1 -1
  36. package/package.json +2 -2
@@ -888,6 +888,7 @@ export class AgentManager {
888
888
  text,
889
889
  messageId: normalizedMessageId,
890
890
  ...(options?.images?.length ? { images: options.images.map((image) => ({ ...image })) } : {}),
891
+ ...(options?.deliveryState ? { deliveryState: options.deliveryState } : {}),
891
892
  };
892
893
  const updatedAt = this.touchUpdatedAt(agent);
893
894
  agent.lastUserMessageAt = updatedAt;
@@ -907,6 +908,7 @@ export class AgentManager {
907
908
  }
908
909
  async appendTimelineItem(agentId, item) {
909
910
  const agent = this.requireAgent(agentId);
911
+ const previousPendingPlanReviewFingerprint = this.getCurrentPendingPlanReviewFingerprint(agent);
910
912
  this.touchUpdatedAt(agent);
911
913
  const row = this.recordTimeline(agent, item);
912
914
  this.dispatchStream(agentId, {
@@ -917,6 +919,10 @@ export class AgentManager {
917
919
  seq: row.seq,
918
920
  epoch: this.ensureTimelineState(agent).epoch,
919
921
  });
922
+ if (item.type !== "user_message" &&
923
+ this.didPendingPlanReviewFingerprintChange(agent, previousPendingPlanReviewFingerprint)) {
924
+ this.emitState(agent);
925
+ }
920
926
  await this.persistSnapshot(agent);
921
927
  }
922
928
  async emitLiveTimelineItem(agentId, item) {
@@ -1680,34 +1686,44 @@ export class AgentManager {
1680
1686
  }
1681
1687
  break;
1682
1688
  case "timeline":
1683
- // Skip provider-replayed user_message items during history hydration.
1684
- // These are already canonically recorded by recordUserMessage() and replaying them would
1685
- // create duplicates. Match by messageId (not text) to avoid dropping legitimate
1686
- // provider-origin messages that happen to reuse the same text.
1687
- if (options?.fromHistory &&
1688
- event.item.type === "user_message") {
1689
- const eventMessageId = normalizeMessageId(event.item.messageId);
1690
- if (eventMessageId) {
1691
- const canonicalText = options?.canonicalUserMessagesById?.get(eventMessageId);
1692
- if (canonicalText === event.item.text) {
1693
- break;
1689
+ {
1690
+ const previousPendingPlanReviewFingerprint = !options?.fromHistory
1691
+ ? this.getCurrentPendingPlanReviewFingerprint(agent)
1692
+ : null;
1693
+ // Skip provider-replayed user_message items during history hydration.
1694
+ // These are already canonically recorded by recordUserMessage() and replaying them would
1695
+ // create duplicates. Match by messageId (not text) to avoid dropping legitimate
1696
+ // provider-origin messages that happen to reuse the same text.
1697
+ if (options?.fromHistory &&
1698
+ event.item.type === "user_message") {
1699
+ const eventMessageId = normalizeMessageId(event.item.messageId);
1700
+ if (eventMessageId) {
1701
+ const canonicalText = options?.canonicalUserMessagesById?.get(eventMessageId);
1702
+ if (canonicalText === event.item.text) {
1703
+ break;
1704
+ }
1694
1705
  }
1695
1706
  }
1696
- }
1697
- if (this.shouldSuppressLiveUserMessageEcho(agent, event, options)) {
1698
- break;
1699
- }
1700
- timelineRow = this.recordTimeline(agent, event.item);
1701
- shouldPersistSnapshot = true;
1702
- if (!options?.fromHistory &&
1703
- event.item.type === "user_message") {
1704
- agent.lastUserMessageAt = new Date();
1705
- this.emitState(agent);
1706
- }
1707
- if (!options?.fromHistory &&
1708
- event.item.type !== "permission_request" &&
1709
- event.item.type !== "permission_resolution") {
1710
- this.touchActiveHarnessRunProgress(agent);
1707
+ if (this.shouldSuppressLiveUserMessageEcho(agent, event, options)) {
1708
+ break;
1709
+ }
1710
+ timelineRow = this.recordTimeline(agent, event.item);
1711
+ shouldPersistSnapshot = true;
1712
+ if (!options?.fromHistory &&
1713
+ event.item.type === "user_message") {
1714
+ agent.lastUserMessageAt = new Date();
1715
+ this.emitState(agent);
1716
+ }
1717
+ if (!options?.fromHistory &&
1718
+ event.item.type !== "permission_request" &&
1719
+ event.item.type !== "permission_resolution") {
1720
+ this.touchActiveHarnessRunProgress(agent);
1721
+ }
1722
+ if (!options?.fromHistory &&
1723
+ event.item.type !== "user_message" &&
1724
+ this.didPendingPlanReviewFingerprintChange(agent, previousPendingPlanReviewFingerprint)) {
1725
+ this.emitState(agent);
1726
+ }
1711
1727
  }
1712
1728
  break;
1713
1729
  case "turn_completed":
@@ -2097,12 +2113,14 @@ export class AgentManager {
2097
2113
  if (agent.internal) {
2098
2114
  return;
2099
2115
  }
2100
- // Skip if already requires attention
2101
- if (agent.attention.requiresAttention) {
2102
- return;
2103
- }
2116
+ const existingAttentionReason = agent.attention.requiresAttention
2117
+ ? agent.attention.attentionReason
2118
+ : null;
2104
2119
  // Check if agent entered error state
2105
- if (previousStatus !== "error" && currentStatus === "error") {
2120
+ if (currentStatus === "error") {
2121
+ if (existingAttentionReason === "error" || previousStatus === "error") {
2122
+ return;
2123
+ }
2106
2124
  this.pendingUserInterruptAgents.delete(agent.id);
2107
2125
  this.userInterruptedAgents.delete(agent.id);
2108
2126
  this.suppressedPermissionAttentionKeys.delete(agent.id);
@@ -2125,6 +2143,10 @@ export class AgentManager {
2125
2143
  if (this.suppressedPermissionAttentionKeys.get(agent.id) === currentPermissionAttentionKey) {
2126
2144
  return;
2127
2145
  }
2146
+ if (agent.attention.requiresAttention &&
2147
+ (existingAttentionReason === "permission" || existingAttentionReason === "error")) {
2148
+ return;
2149
+ }
2128
2150
  this.suppressedPermissionAttentionKeys.delete(agent.id);
2129
2151
  agent.attention = {
2130
2152
  requiresAttention: true,
@@ -2187,6 +2209,16 @@ export class AgentManager {
2187
2209
  }
2188
2210
  this.suppressedPermissionAttentionKeys.delete(agent.id);
2189
2211
  }
2212
+ getCurrentPendingPlanReviewFingerprint(agent) {
2213
+ return getPendingPlanReviewFingerprint({
2214
+ pendingPermissions: agent.pendingPermissions,
2215
+ timelineRows: agent.timelineRows,
2216
+ lifecycle: agent.lifecycle,
2217
+ });
2218
+ }
2219
+ didPendingPlanReviewFingerprintChange(agent, previousFingerprint) {
2220
+ return this.getCurrentPendingPlanReviewFingerprint(agent) !== previousFingerprint;
2221
+ }
2190
2222
  enqueueBackgroundPersist(agent) {
2191
2223
  this.enqueueBackgroundPersistById(agent.id);
2192
2224
  }