@letta-ai/letta-code 0.28.8 → 0.28.10

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 (43) hide show
  1. package/dist/agent-presets.js +26 -1
  2. package/dist/agent-presets.js.map +2 -2
  3. package/dist/channels-public.js +1053 -0
  4. package/dist/channels-public.js.map +13 -0
  5. package/dist/channels-slack.js +534 -0
  6. package/dist/channels-slack.js.map +15 -0
  7. package/dist/types/agent/model-catalog.d.ts +38 -0
  8. package/dist/types/agent/model-catalog.d.ts.map +1 -1
  9. package/dist/types/channels/core-stream.d.ts +35 -0
  10. package/dist/types/channels/core-stream.d.ts.map +1 -0
  11. package/dist/types/channels/plugin-types.d.ts +226 -0
  12. package/dist/types/channels/plugin-types.d.ts.map +1 -0
  13. package/dist/types/channels/processor.d.ts +27 -0
  14. package/dist/types/channels/processor.d.ts.map +1 -0
  15. package/dist/types/channels/progress-builder.d.ts +13 -0
  16. package/dist/types/channels/progress-builder.d.ts.map +1 -0
  17. package/dist/types/channels/progress-formatting.d.ts +34 -0
  18. package/dist/types/channels/progress-formatting.d.ts.map +1 -0
  19. package/dist/types/channels/slack/ingress-policy.d.ts +72 -0
  20. package/dist/types/channels/slack/ingress-policy.d.ts.map +1 -0
  21. package/dist/types/channels/slack/progress.d.ts +7 -0
  22. package/dist/types/channels/slack/progress.d.ts.map +1 -0
  23. package/dist/types/channels/slack/public-utils.d.ts +11 -0
  24. package/dist/types/channels/slack/public-utils.d.ts.map +1 -0
  25. package/dist/types/channels/slack/sender.d.ts +39 -0
  26. package/dist/types/channels/slack/sender.d.ts.map +1 -0
  27. package/dist/types/channels/slack/status-controller.d.ts +35 -0
  28. package/dist/types/channels/slack/status-controller.d.ts.map +1 -0
  29. package/dist/types/channels/types.d.ts +766 -0
  30. package/dist/types/channels/types.d.ts.map +1 -0
  31. package/dist/types/channels-public.d.ts +8 -0
  32. package/dist/types/channels-public.d.ts.map +1 -0
  33. package/dist/types/channels-slack.d.ts +9 -0
  34. package/dist/types/channels-slack.d.ts.map +1 -0
  35. package/dist/types/permissions/mode.d.ts +52 -0
  36. package/dist/types/permissions/mode.d.ts.map +1 -0
  37. package/dist/types/types/protocol_v2.d.ts +4 -0
  38. package/dist/types/types/protocol_v2.d.ts.map +1 -1
  39. package/letta.js +2478 -1790
  40. package/package.json +33 -2
  41. package/scripts/isolated-unit-tests.json +12 -0
  42. package/scripts/run-unit-tests.cjs +5 -2
  43. package/scripts/source-file-size-baseline.json +4 -4
@@ -0,0 +1,72 @@
1
+ export interface SlackInboundMessageEventLike {
2
+ channel?: unknown;
3
+ user?: unknown;
4
+ bot_id?: unknown;
5
+ ts?: unknown;
6
+ text?: unknown;
7
+ thread_ts?: unknown;
8
+ subtype?: unknown;
9
+ hidden?: boolean;
10
+ message?: unknown;
11
+ }
12
+ export interface SlackAppMentionEventLike {
13
+ channel?: unknown;
14
+ user?: unknown;
15
+ bot_id?: unknown;
16
+ ts?: unknown;
17
+ text?: unknown;
18
+ thread_ts?: unknown;
19
+ }
20
+ export interface ResolveSlackMessageIngressPolicyParams {
21
+ message: SlackInboundMessageEventLike;
22
+ botUserId?: string | null;
23
+ isAgentThread?: boolean;
24
+ }
25
+ export interface ResolveSlackAppMentionIngressPolicyParams {
26
+ event: SlackAppMentionEventLike;
27
+ }
28
+ export interface SlackMessageIngressAccepted {
29
+ shouldRoute: true;
30
+ channelId: string;
31
+ senderId: string;
32
+ senderUserId?: string;
33
+ senderBotId?: string;
34
+ messageId: string;
35
+ threadId: string | null;
36
+ chatType: "direct" | "channel";
37
+ text: string;
38
+ rawText: string;
39
+ wasMentioned: boolean;
40
+ effectiveMention: boolean;
41
+ isAgentThread: boolean;
42
+ }
43
+ export interface SlackAppMentionIngressAccepted {
44
+ shouldRoute: true;
45
+ channelId: string;
46
+ senderId: string;
47
+ senderUserId?: string;
48
+ senderBotId?: string;
49
+ messageId: string;
50
+ threadId: string;
51
+ chatType: "channel";
52
+ text: string;
53
+ rawText: string;
54
+ wasMentioned: true;
55
+ effectiveMention: true;
56
+ isAgentThread: false;
57
+ }
58
+ export type SlackIngressIgnoreReason = "missing_channel" | "missing_sender" | "missing_timestamp" | "hidden_message" | "ignored_subtype" | "wrapper_message" | "top_level_channel_message";
59
+ export interface SlackIngressIgnored {
60
+ shouldRoute: false;
61
+ reason: SlackIngressIgnoreReason;
62
+ }
63
+ export type SlackMessageIngressPolicy = SlackMessageIngressAccepted | SlackIngressIgnored;
64
+ export type SlackAppMentionIngressPolicy = SlackAppMentionIngressAccepted | SlackIngressIgnored;
65
+ export declare function isProcessableSlackInboundMessage(message: SlackInboundMessageEventLike): boolean;
66
+ export declare function shouldSkipSlackMessageByLastSeen(params: {
67
+ lastSeenMessageTs?: string | null;
68
+ messageTs: string;
69
+ }): boolean;
70
+ export declare function resolveSlackMessageIngressPolicy(params: ResolveSlackMessageIngressPolicyParams): SlackMessageIngressPolicy;
71
+ export declare function resolveSlackAppMentionIngressPolicy(params: ResolveSlackAppMentionIngressPolicyParams): SlackAppMentionIngressPolicy;
72
+ //# sourceMappingURL=ingress-policy.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ingress-policy.d.ts","sourceRoot":"","sources":["../../../../src/channels/slack/ingress-policy.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import type { ChannelTurnProgressEvent } from "../types";
2
+ export declare const SLACK_ASSISTANT_STARTUP_STATUS = "is thinking...";
3
+ export declare const SLACK_ASSISTANT_WORKING_STATUS = "is working...";
4
+ export declare function sanitizeSlackStatusText(text: string, maxLength: number): string;
5
+ export declare function formatSlackToolNameForDisplay(toolName: string): string;
6
+ export declare function resolveSlackConcreteActivity(event: ChannelTurnProgressEvent): string | null;
7
+ //# sourceMappingURL=progress.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"progress.d.ts","sourceRoot":"","sources":["../../../../src/channels/slack/progress.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,kBAAkB,CAAC;AAGjE,eAAO,MAAM,8BAA8B,mBAAmB,CAAC;AAC/D,eAAO,MAAM,8BAA8B,kBAAkB,CAAC;AAI9D,wBAAgB,uBAAuB,CACrC,IAAI,EAAE,MAAM,EACZ,SAAS,EAAE,MAAM,GAChB,MAAM,CAOR;AAED,wBAAgB,6BAA6B,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CActE;AAYD,wBAAgB,4BAA4B,CAC1C,KAAK,EAAE,wBAAwB,GAC9B,MAAM,GAAG,IAAI,CAiCf"}
@@ -0,0 +1,11 @@
1
+ import type { ChannelTurnSource, OutboundChannelMessage } from "../types";
2
+ export declare function isNonEmptyString(value: unknown): value is string;
3
+ export declare function firstNonEmptyString(...values: unknown[]): string | undefined;
4
+ export declare function normalizeSlackText(text: string): string;
5
+ export declare function resolveSlackChatType(chatId: string): "direct" | "channel";
6
+ export declare function resolveSlackSourceThreadTs(source: ChannelTurnSource): string | undefined;
7
+ export declare function resolveSlackProgressThreadTs(source: ChannelTurnSource): string | undefined;
8
+ export declare function resolveSlackOutboundThreadTs(msg: Pick<OutboundChannelMessage, "chatId" | "threadId" | "replyToMessageId">): string | undefined;
9
+ export declare function normalizeSlackReactionName(value: string): string;
10
+ export declare function slackTimestampToMillis(value: string): number;
11
+ //# sourceMappingURL=public-utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"public-utils.d.ts","sourceRoot":"","sources":["../../../../src/channels/slack/public-utils.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,iBAAiB,EACjB,sBAAsB,EACvB,MAAM,kBAAkB,CAAC;AAE1B,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,MAAM,CAEhE;AAED,wBAAgB,mBAAmB,CAAC,GAAG,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,GAAG,SAAS,CAE5E;AAED,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEvD;AAED,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,MAAM,GAAG,QAAQ,GAAG,SAAS,CAEzE;AAED,wBAAgB,0BAA0B,CACxC,MAAM,EAAE,iBAAiB,GACxB,MAAM,GAAG,SAAS,CAQpB;AAED,wBAAgB,4BAA4B,CAC1C,MAAM,EAAE,iBAAiB,GACxB,MAAM,GAAG,SAAS,CAQpB;AAED,wBAAgB,4BAA4B,CAC1C,GAAG,EAAE,IAAI,CAAC,sBAAsB,EAAE,QAAQ,GAAG,UAAU,GAAG,kBAAkB,CAAC,GAC5E,MAAM,GAAG,SAAS,CAKpB;AAED,wBAAgB,0BAA0B,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAEhE;AAED,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAE5D"}
@@ -0,0 +1,39 @@
1
+ import type { OutboundChannelMessage } from "../types";
2
+ export interface SlackSenderPostMessageParams {
3
+ channel: string;
4
+ text: string;
5
+ threadTs?: string;
6
+ blocks?: unknown[];
7
+ }
8
+ export interface SlackSenderPostMessageResult {
9
+ messageId: string;
10
+ }
11
+ export interface SlackSenderMessageResult {
12
+ messageId: string;
13
+ }
14
+ export interface SlackSenderReactionParams {
15
+ channel: string;
16
+ timestamp: string;
17
+ name: string;
18
+ }
19
+ export interface SlackSenderClient {
20
+ postMessage(params: SlackSenderPostMessageParams): Promise<SlackSenderPostMessageResult>;
21
+ addReaction?(params: SlackSenderReactionParams): Promise<void>;
22
+ removeReaction?(params: SlackSenderReactionParams): Promise<void>;
23
+ }
24
+ export interface SlackChannelSender {
25
+ sendMessage(message: OutboundChannelMessage): Promise<SlackSenderMessageResult>;
26
+ sendDirectReply(params: SlackDirectReplyParams): Promise<void>;
27
+ }
28
+ export interface SlackDirectReplyParams {
29
+ chatId: string;
30
+ text: string;
31
+ replyToMessageId?: string;
32
+ threadId?: string | null;
33
+ blocks?: unknown[];
34
+ }
35
+ export interface CreateSlackChannelSenderParams {
36
+ client: SlackSenderClient;
37
+ }
38
+ export declare function createSlackChannelSender(params: CreateSlackChannelSenderParams): SlackChannelSender;
39
+ //# sourceMappingURL=sender.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sender.d.ts","sourceRoot":"","sources":["../../../../src/channels/slack/sender.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,kBAAkB,CAAC;AAM/D,MAAM,WAAW,4BAA4B;IAC3C,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,OAAO,EAAE,CAAC;CACpB;AAED,MAAM,WAAW,4BAA4B;IAC3C,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,wBAAwB;IACvC,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,yBAAyB;IACxC,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,iBAAiB;IAChC,WAAW,CACT,MAAM,EAAE,4BAA4B,GACnC,OAAO,CAAC,4BAA4B,CAAC,CAAC;IACzC,WAAW,CAAC,CAAC,MAAM,EAAE,yBAAyB,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC/D,cAAc,CAAC,CAAC,MAAM,EAAE,yBAAyB,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACnE;AAED,MAAM,WAAW,kBAAkB;IACjC,WAAW,CACT,OAAO,EAAE,sBAAsB,GAC9B,OAAO,CAAC,wBAAwB,CAAC,CAAC;IACrC,eAAe,CAAC,MAAM,EAAE,sBAAsB,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAChE;AAED,MAAM,WAAW,sBAAsB;IACrC,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,MAAM,CAAC,EAAE,OAAO,EAAE,CAAC;CACpB;AAED,MAAM,WAAW,8BAA8B;IAC7C,MAAM,EAAE,iBAAiB,CAAC;CAC3B;AAqCD,wBAAgB,wBAAwB,CACtC,MAAM,EAAE,8BAA8B,GACrC,kBAAkB,CAmCpB"}
@@ -0,0 +1,35 @@
1
+ import type { ChannelTurnSource, OutboundChannelMessage } from "../types";
2
+ export interface SlackStatusWriteClient {
3
+ assistant?: {
4
+ threads?: {
5
+ setStatus?: (args: {
6
+ channel_id: string;
7
+ thread_ts: string;
8
+ status: string;
9
+ loading_messages?: string[];
10
+ }) => Promise<unknown>;
11
+ };
12
+ };
13
+ }
14
+ export type AgentConvSlackState = {
15
+ isThinkingActive: boolean;
16
+ thinkingText: string;
17
+ typingFooterText: string;
18
+ };
19
+ export type SlackStatusController = {
20
+ getUniqueSources: (sources: ChannelTurnSource[]) => ChannelTurnSource[];
21
+ getLifecycleErrorReplyKey: (source: ChannelTurnSource) => string | null;
22
+ activate: (source: ChannelTurnSource, footerText: string, loadingText: string) => Promise<void>;
23
+ deactivate: (source: ChannelTurnSource) => Promise<void>;
24
+ clearStale: (source: ChannelTurnSource) => Promise<void>;
25
+ markAutoCleared: (source: ChannelTurnSource) => void;
26
+ markAutoClearedForMessage: (msg: Pick<OutboundChannelMessage, "agentId" | "conversationId" | "chatId" | "threadId" | "replyToMessageId">) => void;
27
+ activeSources: () => ChannelTurnSource[];
28
+ clear: () => void;
29
+ };
30
+ export declare function createSlackStatusController(params: {
31
+ ensureApp: () => Promise<unknown>;
32
+ ensureWriteClient: () => Promise<SlackStatusWriteClient>;
33
+ resolveKnownThreadRoot: (messageId: string) => string;
34
+ }): SlackStatusController;
35
+ //# sourceMappingURL=status-controller.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status-controller.d.ts","sourceRoot":"","sources":["../../../../src/channels/slack/status-controller.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,iBAAiB,EACjB,sBAAsB,EACvB,MAAM,kBAAkB,CAAC;AAW1B,MAAM,WAAW,sBAAsB;IACrC,SAAS,CAAC,EAAE;QACV,OAAO,CAAC,EAAE;YACR,SAAS,CAAC,EAAE,CAAC,IAAI,EAAE;gBACjB,UAAU,EAAE,MAAM,CAAC;gBACnB,SAAS,EAAE,MAAM,CAAC;gBAClB,MAAM,EAAE,MAAM,CAAC;gBACf,gBAAgB,CAAC,EAAE,MAAM,EAAE,CAAC;aAC7B,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;SACxB,CAAC;KACH,CAAC;CACH;AAED,MAAM,MAAM,mBAAmB,GAAG;IAChC,gBAAgB,EAAE,OAAO,CAAC;IAC1B,YAAY,EAAE,MAAM,CAAC;IACrB,gBAAgB,EAAE,MAAM,CAAC;CAC1B,CAAC;AAEF,MAAM,MAAM,qBAAqB,GAAG;IAClC,gBAAgB,EAAE,CAAC,OAAO,EAAE,iBAAiB,EAAE,KAAK,iBAAiB,EAAE,CAAC;IACxE,yBAAyB,EAAE,CAAC,MAAM,EAAE,iBAAiB,KAAK,MAAM,GAAG,IAAI,CAAC;IACxE,QAAQ,EAAE,CACR,MAAM,EAAE,iBAAiB,EACzB,UAAU,EAAE,MAAM,EAClB,WAAW,EAAE,MAAM,KAChB,OAAO,CAAC,IAAI,CAAC,CAAC;IACnB,UAAU,EAAE,CAAC,MAAM,EAAE,iBAAiB,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACzD,UAAU,EAAE,CAAC,MAAM,EAAE,iBAAiB,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACzD,eAAe,EAAE,CAAC,MAAM,EAAE,iBAAiB,KAAK,IAAI,CAAC;IACrD,yBAAyB,EAAE,CACzB,GAAG,EAAE,IAAI,CACP,sBAAsB,EACtB,SAAS,GAAG,gBAAgB,GAAG,QAAQ,GAAG,UAAU,GAAG,kBAAkB,CAC1E,KACE,IAAI,CAAC;IACV,aAAa,EAAE,MAAM,iBAAiB,EAAE,CAAC;IACzC,KAAK,EAAE,MAAM,IAAI,CAAC;CACnB,CAAC;AAEF,wBAAgB,2BAA2B,CAAC,MAAM,EAAE;IAClD,SAAS,EAAE,MAAM,OAAO,CAAC,OAAO,CAAC,CAAC;IAClC,iBAAiB,EAAE,MAAM,OAAO,CAAC,sBAAsB,CAAC,CAAC;IACzD,sBAAsB,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,MAAM,CAAC;CACvD,GAAG,qBAAqB,CAsPxB"}