@trusty-squire/mcp 1.1.13-rc.9 → 1.1.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 (162) hide show
  1. package/README.md +136 -64
  2. package/assets/login/vnc-input.js +9 -0
  3. package/assets/login/vnc.html +214 -202
  4. package/assets/screencaps/connect-walkthrough.png +0 -0
  5. package/assets/screencaps/connect-walkthrough.svg +1 -1
  6. package/dist/api-client.d.ts +26 -3
  7. package/dist/api-client.d.ts.map +1 -1
  8. package/dist/api-client.js +19 -31
  9. package/dist/api-client.js.map +1 -1
  10. package/dist/bin.js +2 -3
  11. package/dist/bin.js.map +1 -1
  12. package/dist/bot/browser.d.ts +85 -80
  13. package/dist/bot/browser.d.ts.map +1 -1
  14. package/dist/bot/browser.js +1314 -1570
  15. package/dist/bot/browser.js.map +1 -1
  16. package/dist/bot/compact-observation-v2.d.ts +167 -0
  17. package/dist/bot/compact-observation-v2.d.ts.map +1 -0
  18. package/dist/bot/compact-observation-v2.js +1038 -0
  19. package/dist/bot/compact-observation-v2.js.map +1 -0
  20. package/dist/bot/credential-shape.d.ts +2 -0
  21. package/dist/bot/credential-shape.d.ts.map +1 -1
  22. package/dist/bot/credential-shape.js +21 -8
  23. package/dist/bot/credential-shape.js.map +1 -1
  24. package/dist/bot/element-fingerprint.d.ts +9 -0
  25. package/dist/bot/element-fingerprint.d.ts.map +1 -0
  26. package/dist/bot/element-fingerprint.js +147 -0
  27. package/dist/bot/element-fingerprint.js.map +1 -0
  28. package/dist/bot/email-verification.d.ts +7 -1
  29. package/dist/bot/email-verification.d.ts.map +1 -1
  30. package/dist/bot/email-verification.js +48 -14
  31. package/dist/bot/email-verification.js.map +1 -1
  32. package/dist/bot/google-login.d.ts +28 -52
  33. package/dist/bot/google-login.d.ts.map +1 -1
  34. package/dist/bot/google-login.js +246 -1119
  35. package/dist/bot/google-login.js.map +1 -1
  36. package/dist/bot/install-completion.d.ts +1 -2
  37. package/dist/bot/install-completion.d.ts.map +1 -1
  38. package/dist/bot/install-completion.js +1 -2
  39. package/dist/bot/install-completion.js.map +1 -1
  40. package/dist/bot/login-state.d.ts +13 -7
  41. package/dist/bot/login-state.d.ts.map +1 -1
  42. package/dist/bot/login-state.js +50 -114
  43. package/dist/bot/login-state.js.map +1 -1
  44. package/dist/bot/oauth-providers.d.ts +1 -1
  45. package/dist/bot/oauth-providers.d.ts.map +1 -1
  46. package/dist/bot/oauth-providers.js +3 -3
  47. package/dist/bot/oauth-providers.js.map +1 -1
  48. package/dist/bot/oauth-scope.d.ts +4 -0
  49. package/dist/bot/oauth-scope.d.ts.map +1 -0
  50. package/dist/bot/oauth-scope.js +58 -0
  51. package/dist/bot/oauth-scope.js.map +1 -0
  52. package/dist/bot/operator-browser-watchdog.d.ts +18 -6
  53. package/dist/bot/operator-browser-watchdog.d.ts.map +1 -1
  54. package/dist/bot/operator-browser-watchdog.js +91 -37
  55. package/dist/bot/operator-browser-watchdog.js.map +1 -1
  56. package/dist/bot/owner-process-reaper-worker.d.ts +2 -0
  57. package/dist/bot/owner-process-reaper-worker.d.ts.map +1 -0
  58. package/dist/bot/owner-process-reaper-worker.js +17 -0
  59. package/dist/bot/owner-process-reaper-worker.js.map +1 -0
  60. package/dist/bot/owner-process-reaper.d.ts +103 -0
  61. package/dist/bot/owner-process-reaper.d.ts.map +1 -0
  62. package/dist/bot/owner-process-reaper.js +1058 -0
  63. package/dist/bot/owner-process-reaper.js.map +1 -0
  64. package/dist/bot/pay-operator.d.ts +7 -1
  65. package/dist/bot/pay-operator.d.ts.map +1 -1
  66. package/dist/bot/pay-operator.js +269 -103
  67. package/dist/bot/pay-operator.js.map +1 -1
  68. package/dist/bot/profile.d.ts +10 -1
  69. package/dist/bot/profile.d.ts.map +1 -1
  70. package/dist/bot/profile.js +137 -11
  71. package/dist/bot/profile.js.map +1 -1
  72. package/dist/bot/promote-to-skill.js +1 -1
  73. package/dist/bot/promote-to-skill.js.map +1 -1
  74. package/dist/bot/provision-session.d.ts +57 -186
  75. package/dist/bot/provision-session.d.ts.map +1 -1
  76. package/dist/bot/provision-session.js +1976 -1812
  77. package/dist/bot/provision-session.js.map +1 -1
  78. package/dist/bot/remote-login-display.d.ts +61 -0
  79. package/dist/bot/remote-login-display.d.ts.map +1 -0
  80. package/dist/bot/remote-login-display.js +765 -0
  81. package/dist/bot/remote-login-display.js.map +1 -0
  82. package/dist/bot/session/hosts.d.ts +8 -0
  83. package/dist/bot/session/hosts.d.ts.map +1 -0
  84. package/dist/bot/session/hosts.js +36 -0
  85. package/dist/bot/session/hosts.js.map +1 -0
  86. package/dist/bot/session/lifecycle.d.ts +56 -0
  87. package/dist/bot/session/lifecycle.d.ts.map +1 -0
  88. package/dist/bot/session/lifecycle.js +962 -0
  89. package/dist/bot/session/lifecycle.js.map +1 -0
  90. package/dist/bot/session/model.d.ts +175 -0
  91. package/dist/bot/session/model.d.ts.map +1 -0
  92. package/dist/bot/session/model.js +77 -0
  93. package/dist/bot/session/model.js.map +1 -0
  94. package/dist/install/cli.d.ts +29 -9
  95. package/dist/install/cli.d.ts.map +1 -1
  96. package/dist/install/cli.js +243 -322
  97. package/dist/install/cli.js.map +1 -1
  98. package/dist/install/interactive.d.ts +1 -0
  99. package/dist/install/interactive.d.ts.map +1 -1
  100. package/dist/install/interactive.js +19 -5
  101. package/dist/install/interactive.js.map +1 -1
  102. package/dist/install/ui.d.ts.map +1 -1
  103. package/dist/install/ui.js +3 -15
  104. package/dist/install/ui.js.map +1 -1
  105. package/dist/operator-env.js +1 -1
  106. package/dist/operator-env.js.map +1 -1
  107. package/dist/server-instance-registry.d.ts +103 -0
  108. package/dist/server-instance-registry.d.ts.map +1 -0
  109. package/dist/server-instance-registry.js +392 -0
  110. package/dist/server-instance-registry.js.map +1 -0
  111. package/dist/server.d.ts +15 -1
  112. package/dist/server.d.ts.map +1 -1
  113. package/dist/server.js +164 -62
  114. package/dist/server.js.map +1 -1
  115. package/dist/session-guard.d.ts +28 -0
  116. package/dist/session-guard.d.ts.map +1 -0
  117. package/dist/session-guard.js +84 -0
  118. package/dist/session-guard.js.map +1 -0
  119. package/dist/session.d.ts +57 -13
  120. package/dist/session.d.ts.map +1 -1
  121. package/dist/session.js +246 -127
  122. package/dist/session.js.map +1 -1
  123. package/dist/tools/audit-log.d.ts +16 -2
  124. package/dist/tools/audit-log.d.ts.map +1 -1
  125. package/dist/tools/audit-log.js +223 -13
  126. package/dist/tools/audit-log.js.map +1 -1
  127. package/dist/tools/audit-rollup.d.ts +80 -0
  128. package/dist/tools/audit-rollup.d.ts.map +1 -0
  129. package/dist/tools/audit-rollup.js +0 -0
  130. package/dist/tools/audit-rollup.js.map +1 -0
  131. package/dist/tools/fetch-credential.d.ts +37 -0
  132. package/dist/tools/fetch-credential.d.ts.map +1 -0
  133. package/dist/tools/fetch-credential.js +153 -0
  134. package/dist/tools/fetch-credential.js.map +1 -0
  135. package/dist/tools/index.d.ts +3 -1
  136. package/dist/tools/index.d.ts.map +1 -1
  137. package/dist/tools/index.js +7 -3
  138. package/dist/tools/index.js.map +1 -1
  139. package/dist/tools/operate-pay.d.ts +4 -4
  140. package/dist/tools/operate-pay.d.ts.map +1 -1
  141. package/dist/tools/operate-pay.js +151 -96
  142. package/dist/tools/operate-pay.js.map +1 -1
  143. package/dist/tools/provision-drive.d.ts +47 -39
  144. package/dist/tools/provision-drive.d.ts.map +1 -1
  145. package/dist/tools/provision-drive.js +268 -164
  146. package/dist/tools/provision-drive.js.map +1 -1
  147. package/dist/tools/use-credential.d.ts.map +1 -1
  148. package/dist/tools/use-credential.js +3 -2
  149. package/dist/tools/use-credential.js.map +1 -1
  150. package/package.json +4 -6
  151. package/dist/bot/operator-direct-identity.d.ts +0 -26
  152. package/dist/bot/operator-direct-identity.d.ts.map +0 -1
  153. package/dist/bot/operator-direct-identity.js +0 -120
  154. package/dist/bot/operator-direct-identity.js.map +0 -1
  155. package/dist/bot/operator-profile-pool.d.ts +0 -97
  156. package/dist/bot/operator-profile-pool.d.ts.map +0 -1
  157. package/dist/bot/operator-profile-pool.js +0 -855
  158. package/dist/bot/operator-profile-pool.js.map +0 -1
  159. package/dist/bot/xvfb.d.ts +0 -13
  160. package/dist/bot/xvfb.d.ts.map +0 -1
  161. package/dist/bot/xvfb.js +0 -146
  162. package/dist/bot/xvfb.js.map +0 -1
package/dist/server.js CHANGED
@@ -1,4 +1,4 @@
1
- // MCP server: reads the session from keytar/file, sets up an ApiClient
1
+ // MCP server: reads its account's session from the session file, sets up an ApiClient
2
2
  // against the configured API base URL, and exposes the registered tools
3
3
  // over stdio.
4
4
  //
@@ -16,9 +16,11 @@ import { CallToolRequestSchema, ListToolsRequestSchema } from "@modelcontextprot
16
16
  import { ApiClient } from "./api-client.js";
17
17
  import { setSelfManagedChromeTerminationSignalExitEnabled } from "./bot/browser.js";
18
18
  import { cancelActiveLoginBrowsers } from "./bot/google-login.js";
19
+ import { startOwnerProcessReaper } from "./bot/owner-process-reaper.js";
19
20
  import { activeSessionCount, closeAllProvisionSessions, withProvisionSessionCall, } from "./bot/provision-session.js";
21
+ import { heartbeatIntervalMs, idleCheckIntervalMs, idleTimeoutMs, idleTimeoutWithSessionMs, reapStaleServerInstances, registerServerInstance, } from "./server-instance-registry.js";
20
22
  import { buildToolRegistry, findTool } from "./tools/index.js";
21
- import { openSessionStorage } from "./session.js";
23
+ import { createSessionGuard, setServingAccountId } from "./session-guard.js";
22
24
  import { VERSION } from "./version.js";
23
25
  const SERVER_NAME = "trusty-squire";
24
26
  const DEFAULT_REGISTRY_BASE = process.env.ADAPTER_REGISTRY_URL ?? "https://registry.trustysquire.ai";
@@ -30,39 +32,18 @@ const DEFAULT_REGISTRY_BASE = process.env.ADAPTER_REGISTRY_URL ?? "https://regis
30
32
  // from a host like that will ever arrive, so this is a time bound, not an
31
33
  // event.
32
34
  //
33
- // It also has to cover a server that still holds an open provision session:
34
- // the operator-profile-pool ACTIVE-slot reclaim (operator-profile-pool.ts,
35
- // scavengeActiveSlots) only ever reclaims a slot once its *owning process* is
36
- // provably dead — a live-but-abandoned zombie server is, by that design, a
37
- // "genuine concurrent run" the pool must never touch. So a background
38
- // pool-level reaper cannot free an active session's Chrome on its own; only
39
- // the owning server exiting (which runs closeAllProvisionSessions, which
40
- // calls browser.close() on the leased Chrome — already timeout-capped down
41
- // to a SIGKILL reap, see browser.ts's closeWithProfileGuard) can. Hence two
35
+ // It also has to cover a server that still holds an open provision session.
36
+ // Its browser is owned by that server, so only the owning server's bounded
37
+ // terminal teardown can close Chrome and destroy its private profile. Hence two
42
38
  // bounds: a short one when idle with no session (routine), and a longer one
43
39
  // when a session is still open — wide enough that no real in-flight flow
44
- // (operate_pay no longer blocks a call for approval; verification polling is
45
- // bounded in the minutes) should ever cross it, so crossing it is a reliable
40
+ // (operate_pay's approval wait is bounded to one minute; post-submit outcome
41
+ // checks are bounded in the minutes) should ever cross it, so crossing it is a reliable
46
42
  // abandoned-session signal, not a false kill of live work.
47
- const DEFAULT_IDLE_TIMEOUT_MS = 20 * 60 * 1_000; // 20m, no open session
48
- const DEFAULT_IDLE_TIMEOUT_WITH_SESSION_MS = 12 * 60 * 60 * 1_000; // 12h, session open
49
- const DEFAULT_IDLE_CHECK_INTERVAL_MS = 5 * 60 * 1_000; // 5m — must stay well under the 20m bound above
50
- function envMs(name, fallback) {
51
- const raw = process.env[name];
52
- if (raw === undefined)
53
- return fallback;
54
- const parsed = Number(raw);
55
- return Number.isFinite(parsed) && parsed > 0 ? parsed : fallback;
56
- }
57
- function idleTimeoutMs() {
58
- return envMs("TRUSTY_SQUIRE_SERVER_IDLE_TIMEOUT_MS", DEFAULT_IDLE_TIMEOUT_MS);
59
- }
60
- function idleTimeoutWithSessionMs() {
61
- return envMs("TRUSTY_SQUIRE_SERVER_IDLE_TIMEOUT_WITH_SESSION_MS", DEFAULT_IDLE_TIMEOUT_WITH_SESSION_MS);
62
- }
63
- function idleCheckIntervalMs() {
64
- return envMs("TRUSTY_SQUIRE_SERVER_IDLE_CHECK_INTERVAL_MS", DEFAULT_IDLE_CHECK_INTERVAL_MS);
65
- }
43
+ //
44
+ // The bounds themselves live in server-instance-registry.ts, because the
45
+ // startup reaper there applies the same policy from the outside to a prior
46
+ // instance that failed to apply it to itself.
66
47
  // Exported for unit testing; kept pure so the branches (recent activity,
67
48
  // no-session idle, session-open idle) don't need a live process/interval.
68
49
  export function shouldIdleExit(now, lastActivityAt, sessionCount, timeoutMs, timeoutWithSessionMs) {
@@ -72,12 +53,13 @@ export function shouldIdleExit(now, lastActivityAt, sessionCount, timeoutMs, tim
72
53
  // Injected into the model's system prompt every turn (≤2KB). Teaches
73
54
  // the routing between store / use / request so the agent reaches for
74
55
  // the right credential tool without the user spelling it out.
75
- const SERVER_INSTRUCTIONS = `This is Trusty Squire — it drives a real browser through signup, provisioning,
56
+ export const SERVER_INSTRUCTIONS = `This is Trusty Squire — it drives a real browser through signup, provisioning,
76
57
  and checkout flows on the user's behalf (\`operate_start\`/\`operate_observe\`/
77
58
  \`operate_act\`/\`operate_pay\`/\`operate_finish\`, plus recipe replay), and backs it
78
59
  with a write-only credential vault.
79
60
  The user's secrets (API keys, tokens, passwords) live in the vault encrypted;
80
- they are NOT in the conversation context and CANNOT be read back to you.
61
+ they are NOT in the conversation context. Reading one back is possible but
62
+ costly — see fetch_credential below.
81
63
  Routing rules for THIS server's vault tools:
82
64
 
83
65
  - User pastes a secret-shaped value (sk-…, ghp_…, AKIA…, eyJ…) into chat
@@ -95,10 +77,44 @@ Routing rules for THIS server's vault tools:
95
77
  with the returned approval_id only after the user signs the exact mutation.
96
78
  - Rotating a secret value = call store_credential again with the new value (it
97
79
  overwrites). edit_credential cannot read or change secret fields.
98
- - There is NO way to extract a raw secret value to you — by design. If a
99
- user wants the plaintext (e.g. for a .env file), they read it from the
100
- Trusty Squire web vault themselves.`;
101
- export async function buildServer(api) {
80
+ - The raw value reaches you ONLY via fetch_credential, and only after the
81
+ user signs a passkey approval. It then lives in your transcript forever,
82
+ so use it only when the plaintext must land somewhere you control (a
83
+ GitHub Actions secret, a .env, a config file) with no server-side
84
+ injection path. For calling an API, use_credential is always the answer.`;
85
+ export function createServerCallAdmission() {
86
+ let accepting = true;
87
+ let inFlight = 0;
88
+ let drain;
89
+ let finishDrain;
90
+ return {
91
+ started: () => {
92
+ if (!accepting)
93
+ return false;
94
+ inFlight += 1;
95
+ return true;
96
+ },
97
+ finished: () => {
98
+ inFlight -= 1;
99
+ if (inFlight === 0) {
100
+ finishDrain?.();
101
+ finishDrain = undefined;
102
+ }
103
+ },
104
+ closeAndDrain: () => {
105
+ accepting = false;
106
+ if (inFlight === 0)
107
+ return Promise.resolve();
108
+ drain ??= new Promise((resolveDrain) => {
109
+ finishDrain = resolveDrain;
110
+ });
111
+ return drain;
112
+ },
113
+ inFlightCount: () => inFlight,
114
+ };
115
+ }
116
+ export async function buildServer(api, callLifecycle, loadPublishedAccountSession, sessionGuard) {
117
+ let activeApi = api;
102
118
  const tools = buildToolRegistry();
103
119
  const server = new Server({ name: SERVER_NAME, version: VERSION }, { capabilities: { tools: {} }, instructions: SERVER_INSTRUCTIONS });
104
120
  server.setRequestHandler(ListToolsRequestSchema, async () => ({
@@ -129,13 +145,33 @@ export async function buildServer(api) {
129
145
  .map((i) => (i.path.length > 0 ? `${i.path.join(".")}: ${i.message}` : i.message))
130
146
  .join("; ")}`);
131
147
  }
132
- if (api === null) {
148
+ // Which account is this server serving? Sessions are stored per account, so
149
+ // a `connect` under a different account no longer overwrites this one — but
150
+ // this server must still refuse rather than fall back to another account's
151
+ // scope if its own entry is gone.
152
+ if (sessionGuard !== undefined) {
153
+ const report = await sessionGuard.inspect();
154
+ if (report.problem !== null) {
155
+ return errorContent(report.problem.code, report.problem.message);
156
+ }
157
+ }
158
+ // The install ceremony publishes the agent token after the operator may
159
+ // already have launched this stdio server. Retry the canonical session
160
+ // read only while unauthenticated; once bound, keep the in-memory client
161
+ // for the rest of this server lifetime.
162
+ if (activeApi === null && loadPublishedAccountSession !== undefined) {
163
+ activeApi = await loadPublishedAccountSession();
164
+ }
165
+ if (activeApi === null) {
133
166
  return errorContent("reconnect_required", `This install is from before single-tier auth and isn't bound to an account. ` +
134
167
  `Run \`npx @trusty-squire/mcp connect\` to reconnect.`);
135
168
  }
169
+ if (callLifecycle !== undefined && !callLifecycle.started()) {
170
+ return errorContent("server_unavailable", "server is shutting down");
171
+ }
136
172
  try {
137
- api.setRequestingAgent(server.getClientVersion()?.name ?? "unknown-agent");
138
- const invoke = async () => await tool.handler(parsed.data, api, {
173
+ activeApi.setRequestingAgent(server.getClientVersion()?.name ?? "unknown-agent");
174
+ const invoke = async () => await tool.handler(parsed.data, activeApi, {
139
175
  notifyUser: async (message, data) => {
140
176
  await server.sendLoggingMessage({
141
177
  level: "notice",
@@ -145,8 +181,8 @@ export async function buildServer(api) {
145
181
  },
146
182
  });
147
183
  // Tool handlers await independently. A finish must therefore close the
148
- // admission gate and drain calls that already entered before it resets or
149
- // pools a browser. `operate_finish*` owns that transition itself.
184
+ // admission gate and drain calls that already entered before it snapshots
185
+ // eligible state and closes the browser. `operate_finish*` owns that transition.
150
186
  const sessionId = typeof parsed.data.session_id === "string" ? parsed.data.session_id : undefined;
151
187
  const result = sessionId !== undefined && !/^operate_finish(?:_task)?$/.test(tool.name)
152
188
  ? await withProvisionSessionCall(sessionId, async () => await invoke())
@@ -163,6 +199,9 @@ export async function buildServer(api) {
163
199
  })
164
200
  : errorContent(malformedAction ? "invalid_arguments" : "tool_execution_failed", message);
165
201
  }
202
+ finally {
203
+ callLifecycle?.finished();
204
+ }
166
205
  });
167
206
  return server;
168
207
  }
@@ -186,15 +225,25 @@ function toolResultContent(result) {
186
225
  const { image, ...meta } = result;
187
226
  return {
188
227
  content: [
189
- { type: "text", text: JSON.stringify(meta, null, 2) },
228
+ { type: "text", text: compactToolResultText(meta) },
190
229
  { type: "image", data: image.data_base64, mimeType: image.mime_type },
191
230
  ],
192
231
  };
193
232
  }
194
233
  return {
195
- content: [{ type: "text", text: JSON.stringify(result, null, 2) }],
234
+ content: [{ type: "text", text: compactToolResultText(result) }],
196
235
  };
197
236
  }
237
+ /** Compact V2 is a model wire protocol; indentation adds no information. */
238
+ export function compactToolResultText(result) {
239
+ if (typeof result === "object" &&
240
+ result !== null &&
241
+ "format" in result &&
242
+ result.format === "compact-v2") {
243
+ return JSON.stringify(result);
244
+ }
245
+ return JSON.stringify(result, null, 2);
246
+ }
198
247
  function errorContent(code, message, guidance) {
199
248
  return {
200
249
  isError: true,
@@ -214,8 +263,8 @@ function errorContent(code, message, guidance) {
214
263
  // kill the process, which turns one bad operate_* call into "MCP server
215
264
  // unreachable" for the host agent. Log the escape and keep serving: the
216
265
  // in-flight call fails on its own (its awaited promise threw or timed out),
217
- // session/browser state is self-contained and recycled by the warm-browser
218
- // health checks, and no security gate depends on process death — a crash
266
+ // session/browser state is self-contained and bounded by its watchdog and
267
+ // terminal teardown, and no security gate depends on process death — a crash
219
268
  // leaves any half-done page action in exactly the same state, minus the
220
269
  // transport. Installed only for `mcp server`; the CLI keeps fail-fast.
221
270
  export function installServerProcessGuards() {
@@ -232,27 +281,60 @@ export function installServerProcessGuards() {
232
281
  export async function runServer() {
233
282
  installServerProcessGuards();
234
283
  setSelfManagedChromeTerminationSignalExitEnabled(false);
284
+ // The detached Linux watchdog survives SIGKILL/parent death. It asynchronously
285
+ // sweeps strict process-only manifests, then tracks exact local browser and
286
+ // session-helper identities for launches owned by this server.
287
+ startOwnerProcessReaper();
288
+ // Reconnects leave the superseded instance behind: a live box carried a
289
+ // superseded server beside its replacement plus two orphaned to init for
290
+ // ~31 hours, each keeping a browser tree resident. Reap prior instances of
291
+ // OUR agent identity that are orphaned or past their own idle bound, before
292
+ // serving — never by process name, never one still serving a client. Purely
293
+ // housekeeping, so a failure here must not stop the server from starting.
294
+ try {
295
+ await reapStaleServerInstances();
296
+ }
297
+ catch (err) {
298
+ process.stderr.write(`[trusty-squire] stale server reap failed: ${err instanceof Error ? err.message : String(err)}\n`);
299
+ }
235
300
  // Startup breadcrumb on stderr (which lands in the host agent's MCP
236
301
  // log). A silent no-op was the worst part of the entrypoint-guard
237
302
  // bug — this line makes "did the server actually start?" answerable
238
303
  // at a glance.
239
304
  process.stderr.write(`[trusty-squire] server v${VERSION} starting\n`);
240
- const storage = await openSessionStorage();
241
- const session = await storage.read();
242
- // Single-tier: every session is account-bound. A session with just a
243
- // machine_token (pre-collapse install) yields api=null, and every
244
- // tool call returns the re-install instruction.
245
- const api = session !== null && session.agent_session_token !== undefined
246
- ? new ApiClient({
247
- apiBaseUrl: session.api_base_url,
248
- registryBaseUrl: DEFAULT_REGISTRY_BASE,
249
- agentSessionToken: session.agent_session_token,
250
- agentIdentity: process.env.TRUSTY_SQUIRE_AGENT_IDENTITY ?? "unknown",
251
- ...(session.account_id !== undefined ? { accountId: session.account_id } : {}),
252
- })
253
- : null;
254
- const server = await buildServer(api);
305
+ // Owns this server's answer to "which account am I serving?".
306
+ const sessionGuard = createSessionGuard();
307
+ const loadPublishedAccountSession = async () => {
308
+ try {
309
+ const session = await sessionGuard.bind();
310
+ setServingAccountId(sessionGuard.boundAccountId());
311
+ // Single-tier: every session is account-bound. A session with just a
312
+ // machine_token (pre-collapse install) yields api=null, and every
313
+ // tool call returns the re-install instruction.
314
+ if (session === null || session.agent_session_token === undefined)
315
+ return null;
316
+ return new ApiClient({
317
+ apiBaseUrl: session.api_base_url,
318
+ registryBaseUrl: DEFAULT_REGISTRY_BASE,
319
+ agentSessionToken: session.agent_session_token,
320
+ agentIdentity: process.env.TRUSTY_SQUIRE_AGENT_IDENTITY ?? "unknown",
321
+ ...(session.account_id !== undefined ? { accountId: session.account_id } : {}),
322
+ });
323
+ }
324
+ catch {
325
+ // A failed session read must remain fail-closed; the next tool call can
326
+ // retry after a transient session-storage problem clears.
327
+ return null;
328
+ }
329
+ };
330
+ const api = await loadPublishedAccountSession();
331
+ const callAdmission = createServerCallAdmission();
332
+ const server = await buildServer(api, callAdmission, loadPublishedAccountSession, sessionGuard);
255
333
  const transport = new StdioServerTransport();
334
+ // Publishes what a later launch of this identity needs to tell "still
335
+ // serving a client" from "wedged": last inbound message, open sessions,
336
+ // in-flight calls. Without it every prior instance looks equally idle.
337
+ const instance = registerServerInstance();
256
338
  // A stdio client can disappear without sending a signal (for example when
257
339
  // its parent agent exits). Chrome keeps Node's event loop alive in that
258
340
  // case, so close every active provisioning browser and explicitly exit.
@@ -260,22 +342,29 @@ export async function runServer() {
260
342
  // idle backstop below racing together cannot run teardown twice.
261
343
  let shutdown;
262
344
  let idleTimer;
345
+ let heartbeatTimer;
263
346
  const requestShutdown = () => {
264
347
  if (shutdown !== undefined)
265
348
  return;
349
+ const admittedCallsDrained = callAdmission.closeAndDrain();
266
350
  shutdown = (async () => {
267
351
  process.stdin.removeListener("end", requestShutdown);
268
352
  process.stdin.removeListener("close", requestShutdown);
353
+ process.removeListener("SIGHUP", requestShutdown);
269
354
  process.removeListener("SIGTERM", requestShutdown);
270
355
  process.removeListener("SIGINT", requestShutdown);
271
356
  if (idleTimer !== undefined)
272
357
  clearInterval(idleTimer);
358
+ if (heartbeatTimer !== undefined)
359
+ clearInterval(heartbeatTimer);
360
+ instance?.release();
273
361
  try {
274
362
  // The OAuth-bootstrap login Chrome (google-login) is tracked apart
275
363
  // from provision sessions — drain it too so it cannot outlive the
276
364
  // server. Its own signal handlers stand down in server mode (see
277
365
  // registerHeadlessRigCleanup), leaving this coordinator as the one
278
366
  // exit owner.
367
+ await admittedCallsDrained;
279
368
  await cancelActiveLoginBrowsers();
280
369
  await closeAllProvisionSessions();
281
370
  await server.close();
@@ -296,6 +385,7 @@ export async function runServer() {
296
385
  transport.onclose = requestShutdown;
297
386
  process.stdin.once("end", requestShutdown);
298
387
  process.stdin.once("close", requestShutdown);
388
+ process.once("SIGHUP", requestShutdown);
299
389
  process.once("SIGTERM", requestShutdown);
300
390
  process.once("SIGINT", requestShutdown);
301
391
  // Protocol.connect chains transport.onmessage the same way it chains
@@ -318,6 +408,18 @@ export async function runServer() {
318
408
  requestShutdown();
319
409
  }, idleCheckIntervalMs());
320
410
  idleTimer.unref();
411
+ if (instance !== null) {
412
+ heartbeatTimer = setInterval(() => {
413
+ if (shutdown !== undefined)
414
+ return;
415
+ instance.heartbeat({
416
+ lastActivityAt,
417
+ activeSessions: activeSessionCount(),
418
+ inFlightCalls: callAdmission.inFlightCount(),
419
+ });
420
+ }, heartbeatIntervalMs());
421
+ heartbeatTimer.unref();
422
+ }
321
423
  await server.connect(transport);
322
424
  }
323
425
  //# sourceMappingURL=server.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,28 @@
1
+ import { type SessionData, type SessionStore } from "./session.js";
2
+ export interface SessionStateProblem {
3
+ code: "account_session_missing";
4
+ message: string;
5
+ }
6
+ export interface SessionGuardReport {
7
+ /** Non-null means the read cannot be trusted; surface it as a tool error. */
8
+ problem: SessionStateProblem | null;
9
+ }
10
+ export interface SessionGuard {
11
+ /** Read this server's account entry, adopting an account on first success. */
12
+ bind(): Promise<SessionData | null>;
13
+ /** Per-tool-call check; never throws. */
14
+ inspect(): Promise<SessionGuardReport>;
15
+ /** The account this server is serving, once bound. */
16
+ boundAccountId(): string | null;
17
+ }
18
+ export declare function setServingAccountId(accountId: string | null): void;
19
+ export declare function servingAccountId(): string | undefined;
20
+ export declare function createSessionGuard(options?: {
21
+ openStorage?: () => Promise<SessionStore>;
22
+ self?: {
23
+ pid: number;
24
+ version: string;
25
+ };
26
+ accountId?: string | undefined;
27
+ }): SessionGuard;
28
+ //# sourceMappingURL=session-guard.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-guard.d.ts","sourceRoot":"","sources":["../src/session-guard.ts"],"names":[],"mappings":"AAcA,OAAO,EAGL,KAAK,WAAW,EAChB,KAAK,YAAY,EAClB,MAAM,cAAc,CAAC;AAGtB,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,yBAAyB,CAAC;IAChC,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,kBAAkB;IACjC,6EAA6E;IAC7E,OAAO,EAAE,mBAAmB,GAAG,IAAI,CAAC;CACrC;AAED,MAAM,WAAW,YAAY;IAC3B,8EAA8E;IAC9E,IAAI,IAAI,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC,CAAC;IACpC,yCAAyC;IACzC,OAAO,IAAI,OAAO,CAAC,kBAAkB,CAAC,CAAC;IACvC,sDAAsD;IACtD,cAAc,IAAI,MAAM,GAAG,IAAI,CAAC;CACjC;AAaD,wBAAgB,mBAAmB,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI,CAElE;AAED,wBAAgB,gBAAgB,IAAI,MAAM,GAAG,SAAS,CAGrD;AAOD,wBAAgB,kBAAkB,CAChC,OAAO,GAAE;IACP,WAAW,CAAC,EAAE,MAAM,OAAO,CAAC,YAAY,CAAC,CAAC;IAC1C,IAAI,CAAC,EAAE;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;IACxC,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CAC3B,GACL,YAAY,CAiDd"}
@@ -0,0 +1,84 @@
1
+ // A server's account-scoped view of the session store.
2
+ //
3
+ // The store keeps one entry per account, so a `connect` under a second account
4
+ // no longer overwrites the first account's binding. What remains is telling the
5
+ // server WHICH account it is: it binds one at startup and reads only that
6
+ // entry, so it can never fall back to another account's scope, and it says so
7
+ // loudly if its own entry is removed.
8
+ //
9
+ // The account a server binds comes from TRUSTY_SQUIRE_ACCOUNT_ID — `connect`
10
+ // writes it into the host agent's MCP config env, so an already-running server
11
+ // keeps the account it was launched for even after a later connect installs a
12
+ // different one. Without that env (a config written before this existed) it
13
+ // falls back to the store's most recently connected account.
14
+ import { AccountSessionMissingError, openSessionStorage, } from "./session.js";
15
+ import { VERSION } from "./version.js";
16
+ // The account THIS process is acting for, published by whoever owns the guard.
17
+ //
18
+ // Tools must read it from here and must NEVER fall back to the store's
19
+ // current-account pointer: a server launched from a pre-pin config binds by
20
+ // fallback, and re-resolving later would hand it whichever account connected
21
+ // most recently — the original "acting as an account it never bound to"
22
+ // defect. The launch env is a different thing and is a legitimate source: it
23
+ // is the pinned value the guard itself starts from, and operator/CI paths
24
+ // (skill CLI, direct registry publishes) run with no guard at all.
25
+ let servingAccount = null;
26
+ export function setServingAccountId(accountId) {
27
+ servingAccount = accountId;
28
+ }
29
+ export function servingAccountId() {
30
+ if (servingAccount !== null)
31
+ return servingAccount;
32
+ return accountFromEnv();
33
+ }
34
+ function accountFromEnv() {
35
+ const id = (process.env.TRUSTY_SQUIRE_ACCOUNT_ID ?? "").trim();
36
+ return id.length > 0 ? id : undefined;
37
+ }
38
+ export function createSessionGuard(options = {}) {
39
+ const openStorage = options.openStorage ?? (async () => await openSessionStorage());
40
+ const self = options.self ?? { pid: process.pid, version: VERSION };
41
+ const configured = "accountId" in options ? options.accountId : accountFromEnv();
42
+ let bound = configured ?? null;
43
+ // Only an account this server has actually served can go missing. Before
44
+ // that, a read that comes back empty is "not installed yet" — the install
45
+ // ceremony can still publish while this server is already running — and the
46
+ // existing unauthenticated path owns that message.
47
+ let served = false;
48
+ const readOwn = async (storage) => bound === null ? await storage.read() : await storage.read(bound);
49
+ return {
50
+ async bind() {
51
+ const storage = await openStorage();
52
+ const data = await readOwn(storage);
53
+ if (data !== null &&
54
+ data.agent_session_token !== undefined &&
55
+ data.account_id !== undefined) {
56
+ bound = data.account_id;
57
+ served = true;
58
+ }
59
+ return data;
60
+ },
61
+ async inspect() {
62
+ if (bound === null || !served)
63
+ return { problem: null };
64
+ let storage;
65
+ let data;
66
+ try {
67
+ storage = await openStorage();
68
+ data = await storage.read(bound);
69
+ }
70
+ catch {
71
+ // A transient read failure is not evidence the account is gone. Stay
72
+ // quiet and let the existing unauthenticated path report it.
73
+ return { problem: null };
74
+ }
75
+ if (data !== null)
76
+ return { problem: null };
77
+ const available = await storage.listAccounts().catch(() => []);
78
+ const error = new AccountSessionMissingError(bound, available, self);
79
+ return { problem: { code: error.code, message: error.message } };
80
+ },
81
+ boundAccountId: () => bound,
82
+ };
83
+ }
84
+ //# sourceMappingURL=session-guard.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-guard.js","sourceRoot":"","sources":["../src/session-guard.ts"],"names":[],"mappings":"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"}
package/dist/session.d.ts CHANGED
@@ -8,21 +8,65 @@ export interface SessionData {
8
8
  consent_skillify_telemetry?: boolean;
9
9
  consent_operator_inbox_otp?: boolean;
10
10
  }
11
- export interface SessionStorage {
12
- read(): Promise<SessionData | null>;
13
- write(data: SessionData): Promise<void>;
14
- clear(): Promise<void>;
15
- backendName(): string;
11
+ /**
12
+ * Slot for an entry whose claim has not landed yet, so it has no account to be
13
+ * keyed by. A real account_id is a ULID, so this can never collide with one.
14
+ */
15
+ export declare const UNBOUND_ACCOUNT_KEY = "__unbound__";
16
+ export declare function accountKey(data: SessionData): string;
17
+ /**
18
+ * The account entry a server bound to is gone — logged out, or erased by hand.
19
+ * Loud rather than an empty read, because an empty read reports "not installed"
20
+ * for a machine that is installed, just not under this account any more.
21
+ */
22
+ export declare class AccountSessionMissingError extends Error {
23
+ readonly accountId: string;
24
+ readonly available: string[];
25
+ readonly code = "account_session_missing";
26
+ constructor(accountId: string, available: string[], self?: {
27
+ pid: number;
28
+ version: string;
29
+ });
16
30
  }
17
- export declare function openSessionStorage(options?: {
18
- preferFile?: boolean;
19
- }): Promise<SessionStorage>;
20
- export declare class FileStorage implements SessionStorage {
21
- private readonly filePath;
31
+ export declare class SessionStore {
32
+ /** The current-account pointer and pre-per-account compatibility mirror. */
33
+ readonly path: string;
34
+ private readonly dir;
22
35
  constructor(filePath?: string);
23
- read(): Promise<SessionData | null>;
36
+ private get sessionsDir();
37
+ private accountFile;
38
+ private readJson;
39
+ /**
40
+ * The legacy flat pointer/mirror. Also the pre-per-account file, which is
41
+ * why a read falls back to it: an install that predates `sessions/` has its
42
+ * only copy here, and reading must not require migrating it first.
43
+ */
44
+ private readPointer;
45
+ private writeAtomic;
46
+ private writeAtomicIfMissing;
47
+ /** Every account installed on this machine. */
48
+ listAccounts(): Promise<string[]>;
49
+ /** The account the most recent connect bound, for a reader that has no own. */
50
+ currentAccountId(): Promise<string | null>;
51
+ /**
52
+ * One account's entry. With `accountId`, ONLY that account's file — a caller
53
+ * bound to an account never silently reads another's. Without it, the account
54
+ * the most recent connect bound.
55
+ */
56
+ read(accountId?: string): Promise<SessionData | null>;
57
+ /**
58
+ * Upsert ONE account's entry. Structurally cannot touch another account's:
59
+ * it writes that account's own file, then refreshes the pointer/mirror.
60
+ */
24
61
  write(data: SessionData): Promise<void>;
25
- clear(): Promise<void>;
26
- backendName(): string;
62
+ /**
63
+ * Remove ONE account's entry (the current one by default). Other accounts'
64
+ * files are untouched; the pointer moves to a survivor, or is deleted when
65
+ * nothing is left.
66
+ */
67
+ clear(accountId?: string): Promise<void>;
27
68
  }
69
+ export declare function openSessionStorage(options?: {
70
+ filePath?: string;
71
+ }): Promise<SessionStore>;
28
72
  //# sourceMappingURL=session.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../src/session.ts"],"names":[],"mappings":"AAyCA,MAAM,WAAW,WAAW;IAC1B,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;IACjB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,UAAU,CAAC,EAAE,MAAM,CAAC;IAapB,mBAAmB,CAAC,EAAE,MAAM,EAAE,CAAC;IAG/B,0BAA0B,CAAC,EAAE,OAAO,CAAC;IACrC,0BAA0B,CAAC,EAAE,OAAO,CAAC;CACtC;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,IAAI,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC,CAAC;IACpC,KAAK,CAAC,IAAI,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACxC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACvB,WAAW,IAAI,MAAM,CAAC;CACvB;AAKD,wBAAsB,kBAAkB,CACtC,OAAO,GAAE;IAAE,UAAU,CAAC,EAAE,OAAO,CAAA;CAAO,GACrC,OAAO,CAAC,cAAc,CAAC,CAOzB;AA0GD,qBAAa,WAAY,YAAW,cAAc;IAChD,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;gBAKtB,QAAQ,CAAC,EAAE,MAAM;IAIvB,IAAI,IAAI,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC;IAanC,KAAK,CAAC,IAAI,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;IAMvC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAQ5B,WAAW,IAAI,MAAM;CAGtB"}
1
+ {"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../src/session.ts"],"names":[],"mappings":"AA6CA,MAAM,WAAW,WAAW;IAC1B,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;IACjB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,UAAU,CAAC,EAAE,MAAM,CAAC;IAMpB,mBAAmB,CAAC,EAAE,MAAM,EAAE,CAAC;IAG/B,0BAA0B,CAAC,EAAE,OAAO,CAAC;IACrC,0BAA0B,CAAC,EAAE,OAAO,CAAC;CACtC;AAED;;;GAGG;AACH,eAAO,MAAM,mBAAmB,gBAAgB,CAAC;AAEjD,wBAAgB,UAAU,CAAC,IAAI,EAAE,WAAW,GAAG,MAAM,CAGpD;AAED;;;;GAIG;AACH,qBAAa,0BAA2B,SAAQ,KAAK;IAGjD,QAAQ,CAAC,SAAS,EAAE,MAAM;IAC1B,QAAQ,CAAC,SAAS,EAAE,MAAM,EAAE;IAH9B,QAAQ,CAAC,IAAI,6BAA6B;gBAE/B,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,MAAM,EAAE,EAC5B,IAAI,GAAE;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAA2C;CAalF;AAqBD,qBAAa,YAAY;IACvB,4EAA4E;IAC5E,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAS;gBAKjB,QAAQ,CAAC,EAAE,MAAM;IAK7B,OAAO,KAAK,WAAW,GAEtB;IAED,OAAO,CAAC,WAAW;YAIL,QAAQ;IAStB;;;;OAIG;YACW,WAAW;YAIX,WAAW;YAiBX,oBAAoB;IAkBlC,+CAA+C;IACzC,YAAY,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;IAoBvC,+EAA+E;IACzE,gBAAgB,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAOhD;;;;OAIG;IACG,IAAI,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC;IAe3D;;;OAGG;IACG,KAAK,CAAC,IAAI,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;IA6B7C;;;;OAIG;IACG,KAAK,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAoC/C;AAED,wBAAsB,kBAAkB,CACtC,OAAO,GAAE;IAAE,QAAQ,CAAC,EAAE,MAAM,CAAA;CAAO,GAClC,OAAO,CAAC,YAAY,CAAC,CAEvB"}