@letta-ai/letta-code 0.30.11 → 0.30.13

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 (58) hide show
  1. package/dist/channels-public.js +302 -11
  2. package/dist/channels-public.js.map +5 -4
  3. package/dist/mcp-client.js +2 -2
  4. package/dist/mcp-client.js.map +1 -1
  5. package/dist/types/agent/subagents/subagent-model.d.ts.map +1 -1
  6. package/dist/types/channels/command-runtime-executor.d.ts +181 -0
  7. package/dist/types/channels/command-runtime-executor.d.ts.map +1 -0
  8. package/dist/types/channels/command-surface.d.ts +40 -3
  9. package/dist/types/channels/command-surface.d.ts.map +1 -1
  10. package/dist/types/channels-public.d.ts +3 -1
  11. package/dist/types/channels-public.d.ts.map +1 -1
  12. package/dist/types/mods/invocation-context.d.ts +8 -0
  13. package/dist/types/mods/invocation-context.d.ts.map +1 -0
  14. package/dist/types/mods/mod-engine.d.ts +2 -1
  15. package/dist/types/mods/mod-engine.d.ts.map +1 -1
  16. package/dist/types/mods/tool-registry.d.ts.map +1 -1
  17. package/dist/types/mods/ui-helpers.d.ts +3 -0
  18. package/dist/types/mods/ui-helpers.d.ts.map +1 -0
  19. package/dist/types/settings-manager.d.ts +7 -10
  20. package/dist/types/settings-manager.d.ts.map +1 -1
  21. package/dist/types/tools/impl/bash.d.ts.map +1 -1
  22. package/dist/types/tools/impl/enter-worktree-messages.d.ts +22 -0
  23. package/dist/types/tools/impl/enter-worktree-messages.d.ts.map +1 -0
  24. package/dist/types/tools/impl/enter-worktree.d.ts.map +1 -1
  25. package/dist/types/tools/impl/exec-command.d.ts.map +1 -1
  26. package/dist/types/tools/impl/github-pull-request-tracker.d.ts +18 -0
  27. package/dist/types/tools/impl/github-pull-request-tracker.d.ts.map +1 -0
  28. package/dist/types/tools/impl/kill-bash.d.ts.map +1 -1
  29. package/dist/types/tools/impl/process_manager.d.ts +6 -0
  30. package/dist/types/tools/impl/process_manager.d.ts.map +1 -1
  31. package/dist/types/tools/impl/shell-runner.d.ts +27 -7
  32. package/dist/types/tools/impl/shell-runner.d.ts.map +1 -1
  33. package/dist/types/tools/impl/shell.d.ts.map +1 -1
  34. package/dist/types/tools/impl/task.d.ts.map +1 -1
  35. package/dist/types/tools/impl/truncation.d.ts +1 -0
  36. package/dist/types/tools/impl/truncation.d.ts.map +1 -1
  37. package/dist/types/tools/toolset-types.d.ts +3 -0
  38. package/dist/types/tools/toolset-types.d.ts.map +1 -0
  39. package/dist/types/tools/toolset.d.ts +2 -3
  40. package/dist/types/tools/toolset.d.ts.map +1 -1
  41. package/dist/types/utils/task-notifications.d.ts +17 -0
  42. package/dist/types/utils/task-notifications.d.ts.map +1 -1
  43. package/dist/types/websocket/listener/mod-command-registry.d.ts +6 -0
  44. package/dist/types/websocket/listener/mod-command-registry.d.ts.map +1 -0
  45. package/letta.js +279558 -279030
  46. package/package.json +1 -1
  47. package/scripts/isolated-unit-tests.json +5 -0
  48. package/scripts/source-file-size-baseline.json +5 -5
  49. package/dist/types/cli/mods/command-runtime.d.ts +0 -13
  50. package/dist/types/cli/mods/command-runtime.d.ts.map +0 -1
  51. package/dist/types/cli/mods/types.d.ts +0 -2
  52. package/dist/types/cli/mods/types.d.ts.map +0 -1
  53. package/dist/types/websocket/listener/memfs-sync.d.ts +0 -24
  54. package/dist/types/websocket/listener/memfs-sync.d.ts.map +0 -1
  55. package/dist/types/websocket/listener/mod-adapter.d.ts +0 -49
  56. package/dist/types/websocket/listener/mod-adapter.d.ts.map +0 -1
  57. package/dist/types/websocket/listener/mod-commands.d.ts +0 -23
  58. package/dist/types/websocket/listener/mod-commands.d.ts.map +0 -1
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@letta-ai/letta-code",
3
- "version": "0.30.11",
3
+ "version": "0.30.13",
4
4
  "description": "Letta Code is a CLI tool for interacting with stateful Letta agents from the terminal.",
5
5
  "type": "module",
6
6
  "packageManager": "bun@1.3.0",
@@ -70,6 +70,11 @@
70
70
  "timeoutMs": 15000,
71
71
  "reason": "Mutates the settings singleton, keychain test overrides, HOME, and the secrets service name."
72
72
  },
73
+ {
74
+ "path": "src/settings-manager-toolset.test.ts",
75
+ "timeoutMs": 15000,
76
+ "reason": "Mutates the settings singleton and HOME while checking persisted conversation overrides."
77
+ },
73
78
  {
74
79
  "path": "src/cli/reflection-worktree-completion.test.ts",
75
80
  "timeoutMs": 15000,
@@ -8,7 +8,7 @@
8
8
  "src/cli/app/AppCoordinator.tsx": 5188,
9
9
  "src/cli/app/AppView.tsx": 1735,
10
10
  "src/cli/app/use-approval-flow.ts": 1163,
11
- "src/cli/app/use-configuration-handlers.ts": 1433,
11
+ "src/cli/app/use-configuration-handlers.ts": 1421,
12
12
  "src/cli/app/use-conversation-loop.ts": 2936,
13
13
  "src/cli/app/use-submit-handler.ts": 4077,
14
14
  "src/cli/components/AgentSelector.tsx": 1104,
@@ -26,7 +26,7 @@
26
26
  "src/index.ts": 2773,
27
27
  "src/mods/learning-harness.ts": 2434,
28
28
  "src/mods/mod-engine.test.ts": 2153,
29
- "src/mods/mod-engine.ts": 1841,
29
+ "src/mods/mod-engine.ts": 1840,
30
30
  "src/mods/package-installer.test.ts": 1248,
31
31
  "src/mods/package-installer.ts": 1201,
32
32
  "src/mods/package-registry.ts": 1033,
@@ -34,9 +34,9 @@
34
34
  "src/permissions/read-only-shell.test.ts": 1303,
35
35
  "src/permissions/read-only-shell.ts": 2009,
36
36
  "src/providers/chatgpt-usage-service.ts": 1112,
37
- "src/settings-manager.test.ts": 1669,
38
- "src/settings-manager.ts": 2112,
39
- "src/tools/impl/enter-worktree.ts": 1260,
37
+ "src/settings-manager.test.ts": 1635,
38
+ "src/settings-manager.ts": 2102,
39
+ "src/tools/impl/enter-worktree.ts": 1197,
40
40
  "src/tools/manager.ts": 3077,
41
41
  "src/tools/tool-execution-context.test.ts": 1138,
42
42
  "src/types/protocol_v2.ts": 2911,
@@ -1,13 +0,0 @@
1
- import type { ModCommand, ModCommandContext, ModCommandResult } from "./types";
2
- export declare function parseModSlashCommand(trimmed: string): {
3
- command: string;
4
- args: string;
5
- } | null;
6
- export declare function parseModCommandArgv(args: string): string[];
7
- export declare function normalizeModCommandResult(result: unknown): ModCommandResult;
8
- export declare function buildModCommandPrompt(result: {
9
- content: string;
10
- systemReminder?: boolean;
11
- }): string;
12
- export declare function runModCommandWithTimeout(command: ModCommand, context: ModCommandContext): Promise<ModCommandResult>;
13
- //# sourceMappingURL=command-runtime.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"command-runtime.d.ts","sourceRoot":"","sources":["../../../../src/cli/mods/command-runtime.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,UAAU,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAC;AAI/E,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,MAAM,GAAG;IACrD,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;CACd,GAAG,IAAI,CAUP;AAED,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAkD1D;AAED,wBAAgB,yBAAyB,CAAC,MAAM,EAAE,OAAO,GAAG,gBAAgB,CAyC3E;AAED,wBAAgB,qBAAqB,CAAC,MAAM,EAAE;IAC5C,OAAO,EAAE,MAAM,CAAC;IAChB,cAAc,CAAC,EAAE,OAAO,CAAC;CAC1B,GAAG,MAAM,CAKT;AAED,wBAAsB,wBAAwB,CAC5C,OAAO,EAAE,UAAU,EACnB,OAAO,EAAE,iBAAiB,GACzB,OAAO,CAAC,gBAAgB,CAAC,CAuC3B"}
@@ -1,2 +0,0 @@
1
- export type { ModAgentContext, ModBackgroundAgentContext, ModCapabilities, ModCapabilityKind, ModCapabilityRecord, ModCommand, ModCommandContext, ModCommandRegistration, ModCommandResult, ModContext, ModContextWindowContext, ModConversationCloseEvent, ModConversationCloseReason, ModConversationForkOptions, ModConversationHandle, ModConversationHistoryOptions, ModConversationMessage, ModConversationOpenEvent, ModConversationOpenReason, ModConversationSendMessageOptions, ModConversationSendMessageRequestOptions, ModCostContext, ModDiagnostic, ModDiagnosticPhase, ModEventCapabilities, ModEventContext, ModEventEmissionResult, ModEventHandler, ModEventMap, ModEventName, ModEventRegistration, ModEventResultMap, ModMemfsContext, ModModelContext, ModOwner, ModPanel, ModPanelHandle, ModPanelOptions, ModPanelRender, ModPanelRenderContext, ModReflectionContext, ModSourceScope, ModTokenUsageContext, ModTool, ModToolContent, ModToolContentImage, ModToolContentText, ModToolRegistration, ModToolRunContext, ModToolRunResult, ModToolStartEvent, ModToolStartResult, ModTurnStartEvent, ModTurnStartResult, ModUiCapabilities, ModWorkspaceContext, } from "../../mods/types";
2
- //# sourceMappingURL=types.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../src/cli/mods/types.ts"],"names":[],"mappings":"AAAA,YAAY,EACV,eAAe,EACf,yBAAyB,EACzB,eAAe,EACf,iBAAiB,EACjB,mBAAmB,EACnB,UAAU,EACV,iBAAiB,EACjB,sBAAsB,EACtB,gBAAgB,EAChB,UAAU,EACV,uBAAuB,EACvB,yBAAyB,EACzB,0BAA0B,EAC1B,0BAA0B,EAC1B,qBAAqB,EACrB,6BAA6B,EAC7B,sBAAsB,EACtB,wBAAwB,EACxB,yBAAyB,EACzB,iCAAiC,EACjC,wCAAwC,EACxC,cAAc,EACd,aAAa,EACb,kBAAkB,EAClB,oBAAoB,EACpB,eAAe,EACf,sBAAsB,EACtB,eAAe,EACf,WAAW,EACX,YAAY,EACZ,oBAAoB,EACpB,iBAAiB,EACjB,eAAe,EACf,eAAe,EACf,QAAQ,EACR,QAAQ,EACR,cAAc,EACd,eAAe,EACf,cAAc,EACd,qBAAqB,EACrB,oBAAoB,EACpB,cAAc,EACd,oBAAoB,EACpB,OAAO,EACP,cAAc,EACd,mBAAmB,EACnB,kBAAkB,EAClB,mBAAmB,EACnB,iBAAiB,EACjB,gBAAgB,EAChB,iBAAiB,EACjB,kBAAkB,EAClB,iBAAiB,EACjB,kBAAkB,EAClB,iBAAiB,EACjB,mBAAmB,GACpB,MAAM,cAAc,CAAC"}
@@ -1,24 +0,0 @@
1
- /**
2
- * Lazy memfs sync for listen mode.
3
- *
4
- * When the listener receives the first message for an agent, this module
5
- * checks whether the agent has the `git-memory-enabled` tag and, if so,
6
- * clones or pulls the memory repo so the Memory tool and $MEMORY_DIR work
7
- * correctly — mirroring what the local headless path does during bootstrap.
8
- */
9
- import type { ListenerRuntime } from "./types";
10
- /**
11
- * Ensure the memfs git repo is cloned/pulled for the given agent.
12
- *
13
- * No-ops if:
14
- * - The agent was already synced this session
15
- * - The agent doesn't have the `git-memory-enabled` tag
16
- *
17
- * Concurrent callers for the same agent coalesce onto a single in-flight
18
- * promise so turn ordering stays deterministic.
19
- *
20
- * Non-fatal: logs a warning and returns false on failure so source consumers
21
- * do not read a stale checkout.
22
- */
23
- export declare function ensureMemfsSyncedForAgent(listener: ListenerRuntime, agentId: string): Promise<boolean>;
24
- //# sourceMappingURL=memfs-sync.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"memfs-sync.d.ts","sourceRoot":"","sources":["../../../../src/websocket/listener/memfs-sync.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAGH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAiE/C;;;;;;;;;;;;GAYG;AACH,wBAAsB,yBAAyB,CAC7C,QAAQ,EAAE,eAAe,EACzB,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,OAAO,CAAC,CAsBlB"}
@@ -1,49 +0,0 @@
1
- import type { ModEvents } from "../../mods/event-emitter";
2
- import { type ModAdapter } from "../../mods/mod-adapter";
3
- import type { ModCapabilities, ModContext } from "../../mods/types";
4
- import { ensureMemfsSyncedForAgent } from "./memfs-sync";
5
- import type { ListenerRuntime } from "./types";
6
- export declare const LISTENER_MOD_CAPABILITIES: ModCapabilities;
7
- export interface CreateListenerModAdapterOptions {
8
- agentModsDirectory?: string;
9
- cacheDirectory?: string;
10
- capabilities?: ModCapabilities;
11
- diagnosticsRootDirectory?: string;
12
- disabled?: boolean;
13
- globalModsDirectory?: string;
14
- includeGlobalMods?: boolean;
15
- registerCapabilitiesGlobally?: boolean;
16
- sessionId?: string | null;
17
- workingDirectory?: string | null;
18
- }
19
- export declare function createListenerModContext(options?: Pick<CreateListenerModAdapterOptions, "sessionId" | "workingDirectory"> & {
20
- agent?: {
21
- id: string;
22
- name?: string | null;
23
- model?: string | null;
24
- llm_config?: {
25
- model?: string | null;
26
- model_endpoint_type?: string | null;
27
- reasoning_effort?: string | null;
28
- } | null;
29
- } | null;
30
- modelIdentifier?: string | null;
31
- permissionMode?: string | null;
32
- toolset?: string | null;
33
- }): ModContext;
34
- export declare function createListenerAgentModContext(agentId: string): ModContext;
35
- export declare function createListenerModAdapter(options?: CreateListenerModAdapterOptions): ModAdapter;
36
- export declare function ensureListenerModAdapter(runtime: ListenerRuntime): ModAdapter;
37
- export declare function ensureListenerAgentModAdapter(runtime: ListenerRuntime, agentId: string): Promise<ModAdapter | null>;
38
- export declare function ensureListenerModAdaptersForAgent(runtime: ListenerRuntime, agentId: string): Promise<ModAdapter[]>;
39
- export declare function getLoadedListenerModAdapters(runtime: ListenerRuntime, agentId?: string | null): ModAdapter[];
40
- export declare function createListenerModEvents(adapters: ModAdapter[]): ModEvents;
41
- export declare function reloadListenerModAdapter(runtime: ListenerRuntime, agentId?: string | null): Promise<void>;
42
- export declare const __listenerModAdapterTestUtils: {
43
- setAgentModsDirectoryResolverForTests(resolver: (agentId: string) => string | null): void;
44
- setAgentModCacheDirectoryResolverForTests(resolver: (agentId: string) => string): void;
45
- setEnsureMemfsSyncedForAgentForTests(ensureSynced: typeof ensureMemfsSyncedForAgent): void;
46
- resetForTests(): void;
47
- };
48
- export declare function disposeListenerModAdapter(runtime: ListenerRuntime): void;
49
- //# sourceMappingURL=mod-adapter.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"mod-adapter.d.ts","sourceRoot":"","sources":["../../../../src/websocket/listener/mod-adapter.ts"],"names":[],"mappings":"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"}
@@ -1,23 +0,0 @@
1
- import type { ModCommand, ModCommandResult } from "../../mods/types";
2
- import type { ModCommandInfo } from "../../types/protocol_v2";
3
- import type { ConversationRuntime, ListenerRuntime } from "./types";
4
- /**
5
- * Registered mod commands as advertisable facts. Clients read these to surface
6
- * mod commands in their palette by their own policy (separate from the built-in
7
- * `supported_commands` allowlist).
8
- */
9
- export declare function listListenerModCommands(runtime: ListenerRuntime, agentId?: string | null): ModCommandInfo[];
10
- /** Look up a registered mod command by id, if any. */
11
- export declare function getListenerModCommand(runtime: ListenerRuntime, commandId: string, agentId?: string | null): ModCommand | undefined;
12
- /**
13
- * Run a mod command in the listener and return its result. Builds a
14
- * ModCommandContext that mirrors the TUI command path (createModConversationHandle
15
- * with the shared sendMessageStreamWithBackend so fork/send/updateLlmConfig work
16
- * across local and Letta Cloud backends).
17
- */
18
- export declare function runListenerModCommand(conversationRuntime: ConversationRuntime, modCommand: ModCommand, parsed: {
19
- commandId: string;
20
- args: string;
21
- rawInput: string;
22
- }): Promise<ModCommandResult>;
23
- //# sourceMappingURL=mod-commands.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"mod-commands.d.ts","sourceRoot":"","sources":["../../../../src/websocket/listener/mod-commands.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EACV,UAAU,EAEV,gBAAgB,EACjB,MAAM,cAAc,CAAC;AACtB,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAO1D,OAAO,KAAK,EAAE,mBAAmB,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAEpE;;;;GAIG;AACH,wBAAgB,uBAAuB,CACrC,OAAO,EAAE,eAAe,EACxB,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,GACtB,cAAc,EAAE,CAclB;AAED,sDAAsD;AACtD,wBAAgB,qBAAqB,CACnC,OAAO,EAAE,eAAe,EACxB,SAAS,EAAE,MAAM,EACjB,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,GACtB,UAAU,GAAG,SAAS,CAMxB;AAED;;;;;GAKG;AACH,wBAAsB,qBAAqB,CACzC,mBAAmB,EAAE,mBAAmB,EACxC,UAAU,EAAE,UAAU,EACtB,MAAM,EAAE;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,GAC5D,OAAO,CAAC,gBAAgB,CAAC,CAuC3B"}