@letta-ai/letta-code 0.30.20 → 0.30.22

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 (108) hide show
  1. package/dist/app-server-client.cjs +20 -10
  2. package/dist/app-server-client.cjs.map +3 -3
  3. package/dist/app-server-client.js +2 -2
  4. package/dist/app-server-client.js.map +3 -3
  5. package/dist/channels-public.js +29 -6
  6. package/dist/channels-public.js.map +4 -5
  7. package/dist/channels-slack.js +98 -9
  8. package/dist/channels-slack.js.map +7 -6
  9. package/dist/gateway-core.js +84 -10
  10. package/dist/gateway-core.js.map +4 -4
  11. package/dist/mcp-client.js +23 -5
  12. package/dist/mcp-client.js.map +2 -2
  13. package/dist/types/agent/message.d.ts.map +1 -1
  14. package/dist/types/backend/dev/headless-turn-executor.d.ts.map +1 -1
  15. package/dist/types/backend/dev/pi-model-factory.d.ts +1 -0
  16. package/dist/types/backend/dev/pi-model-factory.d.ts.map +1 -1
  17. package/dist/types/backend/dev/pi-models-runtime.d.ts +3 -1
  18. package/dist/types/backend/dev/pi-models-runtime.d.ts.map +1 -1
  19. package/dist/types/backend/dev/pi-ollama-provider.d.ts +35 -0
  20. package/dist/types/backend/dev/pi-ollama-provider.d.ts.map +1 -1
  21. package/dist/types/backend/dev/pi-stream-adapter.d.ts.map +1 -1
  22. package/dist/types/backend/dev/provider-turn-executor.d.ts +8 -0
  23. package/dist/types/backend/dev/provider-turn-executor.d.ts.map +1 -1
  24. package/dist/types/channels/gateway-core.d.ts +6 -0
  25. package/dist/types/channels/gateway-core.d.ts.map +1 -1
  26. package/dist/types/channels/message-references.d.ts +12 -0
  27. package/dist/types/channels/message-references.d.ts.map +1 -0
  28. package/dist/types/channels/slack/ingress-policy.d.ts +3 -0
  29. package/dist/types/channels/slack/ingress-policy.d.ts.map +1 -1
  30. package/dist/types/channels/slack/public-utils.d.ts +0 -1
  31. package/dist/types/channels/slack/public-utils.d.ts.map +1 -1
  32. package/dist/types/channels/slack/user-mentions.d.ts +10 -0
  33. package/dist/types/channels/slack/user-mentions.d.ts.map +1 -0
  34. package/dist/types/channels/slack/utils.d.ts +0 -1
  35. package/dist/types/channels/slack/utils.d.ts.map +1 -1
  36. package/dist/types/channels/types.d.ts +8 -1
  37. package/dist/types/channels/types.d.ts.map +1 -1
  38. package/dist/types/channels/xml.d.ts +2 -7
  39. package/dist/types/channels/xml.d.ts.map +1 -1
  40. package/dist/types/channels-public.d.ts +1 -0
  41. package/dist/types/channels-public.d.ts.map +1 -1
  42. package/dist/types/channels-slack.d.ts +2 -1
  43. package/dist/types/channels-slack.d.ts.map +1 -1
  44. package/dist/types/gateway-core.d.ts +1 -1
  45. package/dist/types/gateway-core.d.ts.map +1 -1
  46. package/dist/types/mods/conversation-handle.d.ts.map +1 -1
  47. package/dist/types/mods/conversation-title-events.d.ts +9 -0
  48. package/dist/types/mods/conversation-title-events.d.ts.map +1 -0
  49. package/dist/types/mods/types.d.ts +2 -0
  50. package/dist/types/mods/types.d.ts.map +1 -1
  51. package/dist/types/permissions/checker.d.ts.map +1 -1
  52. package/dist/types/permissions/workspace-sandbox.d.ts +19 -0
  53. package/dist/types/permissions/workspace-sandbox.d.ts.map +1 -0
  54. package/dist/types/runtime-context.d.ts +7 -0
  55. package/dist/types/runtime-context.d.ts.map +1 -1
  56. package/dist/types/telemetry/fatal-error-handler.d.ts +13 -0
  57. package/dist/types/telemetry/fatal-error-handler.d.ts.map +1 -0
  58. package/dist/types/telemetry/index.d.ts +2 -0
  59. package/dist/types/telemetry/index.d.ts.map +1 -1
  60. package/dist/types/tools/external-tool-content.d.ts +11 -0
  61. package/dist/types/tools/external-tool-content.d.ts.map +1 -0
  62. package/dist/types/tools/impl/bash-output.d.ts.map +1 -1
  63. package/dist/types/tools/impl/bash.d.ts.map +1 -1
  64. package/dist/types/tools/impl/exec-command.d.ts +1 -0
  65. package/dist/types/tools/impl/exec-command.d.ts.map +1 -1
  66. package/dist/types/tools/impl/github-pull-request-tracker.d.ts.map +1 -1
  67. package/dist/types/tools/impl/monitor.d.ts.map +1 -1
  68. package/dist/types/tools/impl/overflow.d.ts +4 -5
  69. package/dist/types/tools/impl/overflow.d.ts.map +1 -1
  70. package/dist/types/tools/impl/process_manager.d.ts +2 -0
  71. package/dist/types/tools/impl/process_manager.d.ts.map +1 -1
  72. package/dist/types/tools/impl/shell-command.d.ts.map +1 -1
  73. package/dist/types/tools/impl/shell-sandbox.d.ts +1 -1
  74. package/dist/types/tools/impl/shell-sandbox.d.ts.map +1 -1
  75. package/dist/types/tools/impl/truncation.d.ts +2 -0
  76. package/dist/types/tools/impl/truncation.d.ts.map +1 -1
  77. package/dist/types/tools/manager.d.ts.map +1 -1
  78. package/dist/types/tools/secret-substitution.d.ts +4 -4
  79. package/dist/types/tools/secret-substitution.d.ts.map +1 -1
  80. package/dist/types/tools/toolset.d.ts +1 -0
  81. package/dist/types/tools/toolset.d.ts.map +1 -1
  82. package/dist/types/types/app-server-info.d.ts +1 -0
  83. package/dist/types/types/app-server-info.d.ts.map +1 -1
  84. package/dist/types/types/cwd-protocol.d.ts +31 -0
  85. package/dist/types/types/cwd-protocol.d.ts.map +1 -0
  86. package/dist/types/types/protocol.d.ts +1 -1
  87. package/dist/types/types/protocol_v2.d.ts +8 -17
  88. package/dist/types/types/protocol_v2.d.ts.map +1 -1
  89. package/dist/types/types/teleport-protocol.d.ts +2 -0
  90. package/dist/types/types/teleport-protocol.d.ts.map +1 -1
  91. package/dist/types/utils/error.d.ts +1 -1
  92. package/dist/types/utils/error.d.ts.map +1 -1
  93. package/dist/types/websocket/listener/cwd.d.ts +6 -0
  94. package/dist/types/websocket/listener/cwd.d.ts.map +1 -1
  95. package/dist/types/websocket/listener/protocol-outbound.d.ts.map +1 -1
  96. package/dist/types/websocket/listener/runtime.d.ts.map +1 -1
  97. package/dist/types/websocket/listener/types.d.ts +6 -0
  98. package/dist/types/websocket/listener/types.d.ts.map +1 -1
  99. package/image-resize-worker.js +16 -2
  100. package/letta.js +17785 -16921
  101. package/package.json +2 -2
  102. package/scripts/isolated-unit-tests.json +5 -0
  103. package/scripts/source-file-size-baseline.json +5 -5
  104. package/skills/creating-mods/references/tools.md +1 -0
  105. package/dist/types/cli/helpers/session-context.d.ts +0 -25
  106. package/dist/types/cli/helpers/session-context.d.ts.map +0 -1
  107. package/dist/types/utils/shell-context.d.ts +0 -7
  108. package/dist/types/utils/shell-context.d.ts.map +0 -1
@@ -1449,12 +1449,7 @@ class ChannelGateway {
1449
1449
  state.pendingSourcesByClientMessageId.delete(delivery.clientMessageId);
1450
1450
  return false;
1451
1451
  }
1452
- state.acceptedClientMessageIds.add(delivery.clientMessageId);
1453
- if (state.acceptedClientMessageIds.size > MAX_ACCEPTED_CLIENT_MESSAGE_IDS) {
1454
- const oldest = state.acceptedClientMessageIds.values().next().value;
1455
- if (oldest)
1456
- state.acceptedClientMessageIds.delete(oldest);
1457
- }
1452
+ this.rememberAcceptedClientMessageId(state, delivery.clientMessageId);
1458
1453
  const queuedEvents = delivery.sources.map((source) => this.enqueueHook(state, () => this.hooks.onLifecycle({ type: "queued", source })));
1459
1454
  if (response.disposition === "started") {
1460
1455
  this.activateSources(state, delivery.clientMessageId, delivery.sources);
@@ -1501,6 +1496,78 @@ class ChannelGateway {
1501
1496
  }
1502
1497
  return replayedRequestIds;
1503
1498
  }
1499
+ async adoptActiveDelivery(delivery) {
1500
+ const key = runtimeKey(delivery.runtime);
1501
+ const stateExisted = this.states.has(key);
1502
+ const state = this.getState(delivery.runtime);
1503
+ const batchId = `channel-${delivery.clientMessageId}`;
1504
+ await this.enqueueRegistration(async () => {
1505
+ if (state.active) {
1506
+ if (state.active.batchId !== batchId) {
1507
+ throw new Error(`Cannot adopt ${batchId}; ${state.active.batchId} is already active`);
1508
+ }
1509
+ this.activateSources(state, delivery.clientMessageId, delivery.sources);
1510
+ this.rememberAcceptedClientMessageId(state, delivery.clientMessageId);
1511
+ return;
1512
+ }
1513
+ const previousRoutedSources = state.routedSources;
1514
+ const wasAccepted = state.acceptedClientMessageIds.has(delivery.clientMessageId);
1515
+ const routingSources = uniqueRoutedSources(delivery.sources);
1516
+ const active = {
1517
+ batchId,
1518
+ routingSources,
1519
+ lifecycleSources: uniqueLifecycleSources(delivery.sources),
1520
+ progress: createChannelTurnProgressBuilder(),
1521
+ richDraft: null,
1522
+ idempotencyScope: createMessageChannelIdempotencyScope()
1523
+ };
1524
+ state.active = active;
1525
+ state.routedSources = uniqueRoutedSources([
1526
+ ...state.routedSources,
1527
+ ...delivery.sources
1528
+ ]);
1529
+ this.rememberAcceptedClientMessageId(state, delivery.clientMessageId);
1530
+ try {
1531
+ await this.performRuntimeRegistration(state, {
1532
+ ...delivery,
1533
+ content: ""
1534
+ });
1535
+ if (state.active !== active)
1536
+ return;
1537
+ active.richDraft = this.hooks.createRichDraft?.({
1538
+ batchId,
1539
+ sources: routingSources
1540
+ }) ?? null;
1541
+ await this.enqueueHook(state, () => this.hooks.onLifecycle({
1542
+ type: "processing",
1543
+ batchId,
1544
+ sources: active.lifecycleSources
1545
+ }));
1546
+ } catch (error) {
1547
+ active.richDraft?.dispose();
1548
+ if (state.active === active)
1549
+ state.active = null;
1550
+ state.routedSources = previousRoutedSources;
1551
+ if (!wasAccepted) {
1552
+ state.acceptedClientMessageIds.delete(delivery.clientMessageId);
1553
+ }
1554
+ if (!stateExisted && state.active === null)
1555
+ this.states.delete(key);
1556
+ throw error;
1557
+ }
1558
+ });
1559
+ }
1560
+ releaseActiveDelivery(runtime, clientMessageId) {
1561
+ const key = runtimeKey(runtime);
1562
+ const state = this.states.get(key);
1563
+ const active = state?.active;
1564
+ if (!state || active?.batchId !== `channel-${clientMessageId}`) {
1565
+ return false;
1566
+ }
1567
+ active.richDraft?.dispose();
1568
+ this.states.delete(key);
1569
+ return true;
1570
+ }
1504
1571
  async registerRuntime(runtime, sources = [], defaultPermissionMode) {
1505
1572
  const state = this.getState(runtime);
1506
1573
  await this.enqueueRegistration(async () => {
@@ -1605,6 +1672,15 @@ class ChannelGateway {
1605
1672
  }
1606
1673
  return state;
1607
1674
  }
1675
+ rememberAcceptedClientMessageId(state, clientMessageId) {
1676
+ state.acceptedClientMessageIds.delete(clientMessageId);
1677
+ state.acceptedClientMessageIds.add(clientMessageId);
1678
+ if (state.acceptedClientMessageIds.size <= MAX_ACCEPTED_CLIENT_MESSAGE_IDS)
1679
+ return;
1680
+ const oldest = state.acceptedClientMessageIds.values().next().value;
1681
+ if (oldest)
1682
+ state.acceptedClientMessageIds.delete(oldest);
1683
+ }
1608
1684
  enqueueHook(state, hook) {
1609
1685
  let pending;
1610
1686
  if (state.hookQueue) {
@@ -2822,9 +2898,7 @@ No external channel adapters are currently running.`;
2822
2898
  const channelList = discovery.displayNames.join(", ");
2823
2899
  const actionList = discovery.actions.join(", ");
2824
2900
  const hasAction = (action) => discovery.actions.includes(action);
2825
- const scopedReplyContract = scoped ? `
2826
-
2827
- This tool is currently scoped to a routed external channel turn. Plain assistant text is not delivered to that external user. If a user-visible reply is appropriate, your final action for the turn must be one MessageChannel call with action="send", channel from the notification, chat_id from the notification, and message containing the reply. If no user-visible response is appropriate, do not call MessageChannel and do not send an empty acknowledgement. For lightweight acknowledgement, prefer action="react" when supported. If the useful response belongs later, schedule the follow-up instead of sending a placeholder.` : "";
2901
+ const scopedReplyContract = scoped ? '\n\nThis tool is currently scoped to a routed external channel turn. Plain assistant text is not delivered to that external user. If a user-visible reply is appropriate, your final action for the turn must be one MessageChannel call with action="send", channel from the notification, chat_id from the notification, and message containing the reply. After that final send succeeds, do not repeat or paraphrase the sent message in assistant text; finish with only `Sent.` as the internal confirmation. This does not apply to a short acknowledgement sent before continuing substantive work. If no user-visible response is appropriate, do not call MessageChannel and do not send an empty acknowledgement. For lightweight acknowledgement, prefer action="react" when supported. If the useful response belongs later, schedule the follow-up instead of sending a placeholder.' : "";
2828
2902
  const slackWorkAcknowledgement = discovery.activeChannels.includes("slack") ? `
2829
2903
 
2830
2904
  For Slack requests that require nontrivial work or several tool calls, send one short MessageChannel call with action="send" before starting other tools. This gives the Slack user verbal acknowledgement and a View in web link. Do not do this for no-ops, reaction-only responses, or simple no-tool answers.` : "";
@@ -2891,4 +2965,4 @@ export {
2891
2965
  ChannelControlRequestCoordinator
2892
2966
  };
2893
2967
 
2894
- //# debugId=CA56D3159193925764756E2164756E21
2968
+ //# debugId=63BD901807F6B5C964756E2164756E21