letagents 0.12.9 → 0.12.11

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 (124) hide show
  1. package/README.md +18 -15
  2. package/dist/api/board-intent-payloads.js +25 -0
  3. package/dist/mcp/agent-prompt-delivery.js +20 -0
  4. package/dist/mcp/codex-session/app-server.js +89 -0
  5. package/dist/mcp/codex-session/index.js +10 -0
  6. package/dist/mcp/codex-session/rpc-client.js +85 -0
  7. package/dist/mcp/codex-session/runtime-bridge.js +271 -0
  8. package/dist/mcp/codex-session/runtime-summary.js +220 -0
  9. package/dist/mcp/codex-session/session-inspection.js +100 -0
  10. package/dist/mcp/codex-session/session-mapper.js +51 -0
  11. package/dist/mcp/codex-session/session-start.js +182 -0
  12. package/dist/mcp/codex-session/session-status.js +77 -0
  13. package/dist/mcp/codex-session/session-stop.js +43 -0
  14. package/dist/mcp/codex-session/session-supervisor.js +111 -0
  15. package/dist/mcp/codex-session/start-prompt.js +49 -0
  16. package/dist/mcp/codex-session/types.js +1 -0
  17. package/dist/mcp/codex-session.js +1 -672
  18. package/dist/mcp/config-reader.js +10 -2
  19. package/dist/mcp/git-remote.js +90 -14
  20. package/dist/mcp/local-state/agent-identity.js +26 -0
  21. package/dist/mcp/local-state/agent-sessions.js +66 -0
  22. package/dist/mcp/local-state/auth.js +57 -0
  23. package/dist/mcp/local-state/codex-live-sessions.js +59 -0
  24. package/dist/mcp/local-state/index.js +8 -0
  25. package/dist/mcp/local-state/local-chat.js +808 -0
  26. package/dist/mcp/local-state/room-sessions.js +51 -0
  27. package/dist/mcp/local-state/storage.js +95 -0
  28. package/dist/mcp/local-state/types.js +1 -0
  29. package/dist/mcp/local-state.js +1 -351
  30. package/dist/mcp/managed-agent-providers.js +65 -0
  31. package/dist/mcp/rental-tools/activity.js +37 -0
  32. package/dist/mcp/rental-tools/budget.js +36 -0
  33. package/dist/mcp/rental-tools/context.js +92 -0
  34. package/dist/mcp/rental-tools/lifecycle.js +47 -0
  35. package/dist/mcp/rental-tools/metering.js +73 -0
  36. package/dist/mcp/rental-tools/patches.js +100 -0
  37. package/dist/mcp/rental-tools/provider.js +117 -0
  38. package/dist/mcp/rental-tools/shared.js +19 -0
  39. package/dist/mcp/rental-tools/types.js +1 -0
  40. package/dist/mcp/rental-tools.js +7 -0
  41. package/dist/mcp/repo-visibility.js +8 -6
  42. package/dist/mcp/server/register-tools.js +19 -0
  43. package/dist/mcp/server/repo-context.js +28 -0
  44. package/dist/mcp/server/resources.js +77 -0
  45. package/dist/mcp/server/runtime/agent-sessions.js +173 -0
  46. package/dist/mcp/server/runtime/api.js +104 -0
  47. package/dist/mcp/server/runtime/auth-cache.js +20 -0
  48. package/dist/mcp/server/runtime/device-auth.js +48 -0
  49. package/dist/mcp/server/runtime/identity/config.js +58 -0
  50. package/dist/mcp/server/runtime/identity/directory.js +94 -0
  51. package/dist/mcp/server/runtime/identity/liveness.js +32 -0
  52. package/dist/mcp/server/runtime/identity/names.js +74 -0
  53. package/dist/mcp/server/runtime/identity/public.js +19 -0
  54. package/dist/mcp/server/runtime/identity/state.js +32 -0
  55. package/dist/mcp/server/runtime/identity.js +97 -0
  56. package/dist/mcp/server/runtime/messages.js +160 -0
  57. package/dist/mcp/server/runtime/presence.js +52 -0
  58. package/dist/mcp/server/runtime/room-api.js +42 -0
  59. package/dist/mcp/server/runtime/room-state.js +122 -0
  60. package/dist/mcp/server/runtime/rooms.js +374 -0
  61. package/dist/mcp/server/runtime/supervisor-bridge.js +94 -0
  62. package/dist/mcp/server/runtime/worker-bearer.js +67 -0
  63. package/dist/mcp/server/runtime.js +14 -0
  64. package/dist/mcp/server/tools/agent-sessions.js +415 -0
  65. package/dist/mcp/server/tools/messages/index.js +14 -0
  66. package/dist/mcp/server/tools/messages/message-lookup.js +75 -0
  67. package/dist/mcp/server/tools/messages/read-tool.js +176 -0
  68. package/dist/mcp/server/tools/messages/reasoning-tool.js +179 -0
  69. package/dist/mcp/server/tools/messages/response.js +17 -0
  70. package/dist/mcp/server/tools/messages/send-tool.js +160 -0
  71. package/dist/mcp/server/tools/messages/status-tool.js +87 -0
  72. package/dist/mcp/server/tools/messages/wait-tool.js +403 -0
  73. package/dist/mcp/server/tools/messages.js +1 -0
  74. package/dist/mcp/server/tools/onboarding/device-auth-tools.js +158 -0
  75. package/dist/mcp/server/tools/onboarding/name-tool.js +93 -0
  76. package/dist/mcp/server/tools/onboarding/responses.js +10 -0
  77. package/dist/mcp/server/tools/onboarding/status-tool.js +125 -0
  78. package/dist/mcp/server/tools/onboarding.js +8 -0
  79. package/dist/mcp/server/tools/rental/activity-tools.js +43 -0
  80. package/dist/mcp/server/tools/rental/context-tools.js +43 -0
  81. package/dist/mcp/server/tools/rental/index.js +17 -0
  82. package/dist/mcp/server/tools/rental/metering-tools.js +39 -0
  83. package/dist/mcp/server/tools/rental/patch-tools.js +53 -0
  84. package/dist/mcp/server/tools/rental/provider-tools.js +44 -0
  85. package/dist/mcp/server/tools/rental/response.js +10 -0
  86. package/dist/mcp/server/tools/rental/types.js +1 -0
  87. package/dist/mcp/server/tools/rental.js +1 -0
  88. package/dist/mcp/server/tools/rooms/index.js +5 -0
  89. package/dist/mcp/server/tools/rooms/inspection-tools.js +140 -0
  90. package/dist/mcp/server/tools/rooms/join-tools.js +37 -0
  91. package/dist/mcp/server/tools/rooms/repo-initialization-tool.js +113 -0
  92. package/dist/mcp/server/tools/rooms/repo-visibility-tool.js +20 -0
  93. package/dist/mcp/server/tools/rooms/response.js +10 -0
  94. package/dist/mcp/server/tools/rooms/resume-tool.js +48 -0
  95. package/dist/mcp/server/tools/rooms.js +1 -0
  96. package/dist/mcp/server/tools/tasks/api.js +222 -0
  97. package/dist/mcp/server/tools/tasks/artifact-tools.js +75 -0
  98. package/dist/mcp/server/tools/tasks/board-intent-tools.js +326 -0
  99. package/dist/mcp/server/tools/tasks/board-tools.js +73 -0
  100. package/dist/mcp/server/tools/tasks/context.js +35 -0
  101. package/dist/mcp/server/tools/tasks/event-tools.js +40 -0
  102. package/dist/mcp/server/tools/tasks/index.js +16 -0
  103. package/dist/mcp/server/tools/tasks/lease-tools.js +145 -0
  104. package/dist/mcp/server/tools/tasks/mutation-tools.js +121 -0
  105. package/dist/mcp/server/tools/tasks/response.js +13 -0
  106. package/dist/mcp/server/tools/tasks/schemas.js +68 -0
  107. package/dist/mcp/server/tools/tasks/verdict-tools.js +51 -0
  108. package/dist/mcp/server/tools/tasks.js +1 -0
  109. package/dist/mcp/server.js +12 -3157
  110. package/dist/mcp/sse-client.js +9 -17
  111. package/dist/shared/activation-routing.js +272 -0
  112. package/dist/shared/agent-identity.js +21 -5
  113. package/dist/shared/agent-presence.js +5 -3
  114. package/dist/shared/agent-session-bearer.js +28 -0
  115. package/dist/shared/board-manager-failover.js +16 -0
  116. package/dist/shared/rental/lrt.js +214 -0
  117. package/dist/shared/rental/meter-types.js +14 -0
  118. package/dist/shared/room-agent-prompts.js +14 -1
  119. package/package.json +31 -16
  120. package/dist/mcp/__tests__/config-reader.test.js +0 -93
  121. package/dist/mcp/__tests__/git-remote.test.js +0 -37
  122. package/dist/mcp/__tests__/server-helpers.test.js +0 -121
  123. package/dist/shared/agent-reasoning.js +0 -49
  124. /package/dist/{mcp → shared}/codenames.js +0 -0
@@ -0,0 +1,111 @@
1
+ import { getStoredCodexLiveSession, } from "../local-state.js";
2
+ import { terminateSpawnedProcess } from "./app-server.js";
3
+ import { createCodexRuntimeBridgeController } from "./runtime-bridge.js";
4
+ import { isTerminalCodexSessionStatus } from "./session-status.js";
5
+ const SESSION_MONITOR_INTERVAL_MS = 30_000;
6
+ const spawnedServerPids = new Set();
7
+ const sessionMonitorTimers = new Map();
8
+ let inspectSession = null;
9
+ let cleanupRegistered = false;
10
+ function inspectConfiguredSession(sessionId) {
11
+ if (!inspectSession) {
12
+ throw new Error("Codex session inspector has not been configured.");
13
+ }
14
+ return inspectSession(sessionId);
15
+ }
16
+ const runtimeBridge = createCodexRuntimeBridgeController({
17
+ inspectSession: inspectConfiguredSession,
18
+ isTerminalStatus: isTerminalCodexSessionStatus,
19
+ });
20
+ export function configureCodexSessionInspector(inspector) {
21
+ inspectSession = inspector;
22
+ }
23
+ function registerProcessCleanup() {
24
+ if (cleanupRegistered)
25
+ return;
26
+ cleanupRegistered = true;
27
+ const cleanup = () => {
28
+ for (const timer of sessionMonitorTimers.values()) {
29
+ clearInterval(timer);
30
+ }
31
+ sessionMonitorTimers.clear();
32
+ runtimeBridge.cleanup();
33
+ for (const pid of spawnedServerPids) {
34
+ terminateSpawnedProcess(pid);
35
+ }
36
+ spawnedServerPids.clear();
37
+ };
38
+ process.on("exit", cleanup);
39
+ process.on("SIGINT", () => { cleanup(); process.exit(130); });
40
+ process.on("SIGTERM", () => { cleanup(); process.exit(143); });
41
+ }
42
+ export function registerLaunchedAppServer(pid) {
43
+ spawnedServerPids.add(pid);
44
+ registerProcessCleanup();
45
+ }
46
+ export function forgetLaunchedAppServer(pid) {
47
+ spawnedServerPids.delete(pid);
48
+ }
49
+ export function clearSessionMonitor(sessionId) {
50
+ const timer = sessionMonitorTimers.get(sessionId);
51
+ if (!timer) {
52
+ return;
53
+ }
54
+ clearInterval(timer);
55
+ sessionMonitorTimers.delete(sessionId);
56
+ }
57
+ export function killOwnedAppServer(session) {
58
+ if (!session.launched_server || !session.server_pid) {
59
+ return;
60
+ }
61
+ terminateSpawnedProcess(session.server_pid);
62
+ spawnedServerPids.delete(session.server_pid);
63
+ }
64
+ export function scheduleOwnedSessionMonitor(session) {
65
+ if (!session.launched_server || sessionMonitorTimers.has(session.session_id)) {
66
+ return;
67
+ }
68
+ const timer = setInterval(() => {
69
+ void inspectConfiguredSession(session.session_id)
70
+ .then((status) => {
71
+ if (!status ||
72
+ !status.server_reachable ||
73
+ isTerminalCodexSessionStatus(status.session.status)) {
74
+ runtimeBridge.stop(session.session_id);
75
+ clearSessionMonitor(session.session_id);
76
+ return;
77
+ }
78
+ void runtimeBridge.maybeStart(status.session).catch(() => {
79
+ // The monitor should keep supervising even when the optional stream bridge is unavailable.
80
+ });
81
+ })
82
+ .catch(() => {
83
+ const latest = getStoredCodexLiveSession(session.session_id);
84
+ if (latest?.launched_server) {
85
+ killOwnedAppServer(latest);
86
+ }
87
+ runtimeBridge.stop(session.session_id);
88
+ clearSessionMonitor(session.session_id);
89
+ });
90
+ }, SESSION_MONITOR_INTERVAL_MS);
91
+ timer.unref?.();
92
+ sessionMonitorTimers.set(session.session_id, timer);
93
+ }
94
+ export async function bindCodexRuntimeStreamBridgeForAgentSession(workerSession) {
95
+ return runtimeBridge.bindForAgentSession(workerSession);
96
+ }
97
+ export function scheduleCodexRuntimeStreamBridgeBind(workerSession, attempts) {
98
+ runtimeBridge.scheduleBind(workerSession, attempts);
99
+ }
100
+ export async function maybeStartCodexRuntimeBridge(session) {
101
+ await runtimeBridge.maybeStart(session);
102
+ }
103
+ export function startCodexRuntimeBridge(session, client) {
104
+ runtimeBridge.start(session, client);
105
+ }
106
+ export async function postCodexRuntimeReasoningSummary(session, summary) {
107
+ if (!summary) {
108
+ return;
109
+ }
110
+ await runtimeBridge.postReasoningSummary(session, summary);
111
+ }
@@ -0,0 +1,49 @@
1
+ import { randomUUID } from "crypto";
2
+ export const DEFAULT_STOP_PHRASE = "/stop-codex-room";
3
+ export function makeToken() {
4
+ return `LOCAL_CODEX_ROOM_${randomUUID()}`;
5
+ }
6
+ export function formatDeadline(minutes) {
7
+ if (minutes <= 0) {
8
+ return { utc: null };
9
+ }
10
+ const deadline = new Date(Date.now() + minutes * 60 * 1000);
11
+ return {
12
+ utc: deadline.toISOString().replace("T", " ").replace(".000Z", " UTC"),
13
+ };
14
+ }
15
+ function buildJoinInstruction(joinedVia, roomIdentifier) {
16
+ if (joinedVia === "join_code") {
17
+ return `Call the LetAgents MCP tool join_code with {"code":"${roomIdentifier}","session_mode":"current"}.`;
18
+ }
19
+ return `Call the LetAgents MCP tool join_room with {"name":"${roomIdentifier}","session_mode":"current"}.`;
20
+ }
21
+ export function buildStartPrompt(input) {
22
+ const deadlineInstruction = input.max_minutes > 0 && input.deadline_utc
23
+ ? `Hard stop deadline: ${input.deadline_utc}. Stop when the stop phrase appears or when that deadline is reached, whichever comes first.`
24
+ : "There is no hard deadline. Stop only when the stop phrase appears or when you are interrupted.";
25
+ return [
26
+ "Run as a persistent local Codex worker for a LetAgents room.",
27
+ `Primary working directory: ${input.cwd}. Use this repository/worktree when the room asks for implementation or repo work.`,
28
+ input.repo_branch ? `Active git branch at startup: ${input.repo_branch}.` : null,
29
+ deadlineInstruction,
30
+ "",
31
+ "Instructions:",
32
+ `1. ${buildJoinInstruction(input.joined_via, input.room_identifier)}`,
33
+ "2. Call register_agent_session with session_kind=\"worker\" and runtime=\"codex\". Keep the returned agent_session_id.",
34
+ "3. Pass that agent_session_id to wait_for_messages, send_message, send_thread_message, post_status, and task tools whenever the tool accepts it.",
35
+ "4. Do not start another live session. Join the room inline in this worker only.",
36
+ "5. Read the room and task board before contributing so you have current context.",
37
+ "6. Keep polling with wait_for_messages using a 30000 ms timeout. Track the latest returned message id, or last_observed_message_id when present even if messages is empty.",
38
+ "7. When new messages arrive, contribute when useful. Be concise, thoughtful, and non-repetitive.",
39
+ "8. When the room asks for coding work, do the work locally in this repository: inspect files, edit code, run checks, commit when asked, and push only when explicitly requested.",
40
+ "9. Post short status updates to the room when you start meaningful work, when you are blocked, and when you finish meaningful work.",
41
+ `10. Stop immediately if a browser/user room message text exactly equals: ${input.stop_phrase}`,
42
+ `11. When stopping, reply in this thread with exactly: ${input.token}_DONE`,
43
+ "",
44
+ "Constraints:",
45
+ "- Do not narrate hidden chain-of-thought.",
46
+ "- Do not spam the room with keepalive messages.",
47
+ "- Stay in the room continuously until stopped.",
48
+ ].filter(Boolean).join("\n");
49
+ }
@@ -0,0 +1 @@
1
+ export {};