@trusty-squire/mcp 1.1.13-rc.8 → 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 +139 -62
  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 +134 -77
  13. package/dist/bot/browser.d.ts.map +1 -1
  14. package/dist/bot/browser.js +1788 -1543
  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 +127 -0
  53. package/dist/bot/operator-browser-watchdog.d.ts.map +1 -0
  54. package/dist/bot/operator-browser-watchdog.js +438 -0
  55. package/dist/bot/operator-browser-watchdog.js.map +1 -0
  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 +13 -2
  65. package/dist/bot/pay-operator.d.ts.map +1 -1
  66. package/dist/bot/pay-operator.js +319 -123
  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 +60 -164
  75. package/dist/bot/provision-session.d.ts.map +1 -1
  76. package/dist/bot/provision-session.js +2049 -1546
  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 +163 -96
  142. package/dist/tools/operate-pay.js.map +1 -1
  143. package/dist/tools/provision-drive.d.ts +43 -35
  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/session.js CHANGED
@@ -1,164 +1,283 @@
1
1
  // MCP session storage.
2
2
  //
3
- // Prefer keytar (OS keychain) when available. Fall back to a 0600
4
- // file at $XDG_CONFIG_HOME/trusty-squire/session.json (or
5
- // ~/.config/trusty-squire/session.json) so the install works on
6
- // minimal Linux containers and CI machines without libsecret.
3
+ // ONE store, ONE pathway: 0600 JSON files under
4
+ // $XDG_CONFIG_HOME/trusty-squire/ (or ~/.config/trusty-squire/). There is no
5
+ // keychain backend or environment-selectable alternate store.
6
+ //
7
+ // Each account owns its source-of-truth `sessions/<account_id>.json`, written
8
+ // atomically. Do not add a cross-process lock: a write touches only one
9
+ // account's file, so accounts cannot lose each other's updates.
10
+ //
11
+ // `session.json` remains the last-write-wins current-account pointer and a
12
+ // flat compatibility mirror for older running builds. Reads never rewrite it;
13
+ // migration to `sessions/<account_id>.json` happens only on an explicit write.
14
+ import { randomUUID } from "node:crypto";
7
15
  import { promises as fs } from "node:fs";
8
16
  import os from "node:os";
9
17
  import path from "node:path";
10
- const KEYTAR_SERVICE = "trusty-squire";
11
- const KEYTAR_ACCOUNT = "session";
12
- // rc.21 — DO NOT cache the fallback path at module-load time. Tests
13
- // sandbox via beforeEach { process.env.HOME = tmpdir }; a path cached
14
- // at import time captures the REAL ~/.config/trusty-squire/ and the
15
- // test then writes the test-fixture session.json to the user's actual
16
- // home, destroying live credentials. Resolve per-call so the env
17
- // override in effect at write-time wins.
18
- function resolveFallbackFile() {
19
- return path.join(process.env.XDG_CONFIG_HOME ?? path.join(os.homedir(), ".config"), "trusty-squire", "session.json");
20
- }
21
- // Tries keytar first. Falls back to the file backend if keytar isn't
22
- // installed or its native binding can't load. The fallback is also the
23
- // chosen backend for CI / tests.
24
- export async function openSessionStorage(options = {}) {
25
- if (options.preferFile === true || preferFileFromEnv()) {
26
- return new FileStorage();
27
- }
28
- const keytar = await tryLoadKeytar();
29
- if (keytar !== null)
30
- return new KeytarStorage(keytar);
31
- return new FileStorage();
18
+ import { VERSION } from "./version.js";
19
+ // rc.21 — DO NOT cache the file path at module-load time. Tests sandbox via
20
+ // beforeEach { process.env.HOME = tmpdir }; a path cached at import time
21
+ // captures the REAL ~/.config/trusty-squire/ and the test then writes the
22
+ // test-fixture session.json to the user's actual home, destroying live
23
+ // credentials. Resolve per-call so the env override in effect at write-time
24
+ // wins.
25
+ function resolveConfigDir() {
26
+ return path.join(process.env.XDG_CONFIG_HOME ?? path.join(os.homedir(), ".config"), "trusty-squire");
32
27
  }
33
- // Escape hatch for boxes where the OS keychain is present-but-ephemeral —
34
- // a headless Linux server's per-login gnome-keyring "session" collection is
35
- // the common case: keytar's write/delete probe passes (so it gets picked),
36
- // but the saved session is wiped between SSH logins, leaving `connect`
37
- // re-pairing on every run. Set TRUSTY_SQUIRE_SESSION_FILE=1 to force the
38
- // durable 0600 session.json instead. Set it GLOBALLY (shell profile / the
39
- // service env) so `connect` AND the spawned MCP server agree on the backend.
40
- function preferFileFromEnv() {
41
- const v = (process.env.TRUSTY_SQUIRE_SESSION_FILE ?? "").trim().toLowerCase();
42
- return v === "1" || v === "true" || v === "yes";
28
+ /**
29
+ * Slot for an entry whose claim has not landed yet, so it has no account to be
30
+ * keyed by. A real account_id is a ULID, so this can never collide with one.
31
+ */
32
+ export const UNBOUND_ACCOUNT_KEY = "__unbound__";
33
+ export function accountKey(data) {
34
+ const id = data.account_id;
35
+ return id !== undefined && id.length > 0 ? id : UNBOUND_ACCOUNT_KEY;
43
36
  }
44
- async function tryLoadKeytar() {
45
- // Two things can fail here:
46
- // 1. The module itself can't load (no native binding for this Node
47
- // version, or the package isn't installed).
48
- // 2. The module loads but the OS keychain isn't available (no
49
- // D-Bus secrets daemon on a headless Linux box, locked Keychain
50
- // on macOS, etc.) — load succeeds, the first call throws.
51
- // Probe with a write to a throwaway entry: getPassword() can succeed
52
- // (returning null) on a half-broken D-Bus where the secrets service
53
- // is present but no collection is unlocked — only setPassword
54
- // surfaces that. We delete the probe right after so we don't pollute
55
- // the keychain.
56
- try {
57
- const mod = await import("keytar");
58
- const probeAccount = `${KEYTAR_ACCOUNT}__probe`;
59
- await mod.default.setPassword(KEYTAR_SERVICE, probeAccount, "1");
60
- await mod.default.deletePassword(KEYTAR_SERVICE, probeAccount);
61
- return {
62
- getPassword: mod.default.getPassword,
63
- setPassword: mod.default.setPassword,
64
- deletePassword: mod.default.deletePassword,
65
- };
66
- }
67
- catch {
68
- return null;
37
+ /**
38
+ * The account entry a server bound to is gone — logged out, or erased by hand.
39
+ * Loud rather than an empty read, because an empty read reports "not installed"
40
+ * for a machine that is installed, just not under this account any more.
41
+ */
42
+ export class AccountSessionMissingError extends Error {
43
+ accountId;
44
+ available;
45
+ code = "account_session_missing";
46
+ constructor(accountId, available, self = { pid: process.pid, version: VERSION }) {
47
+ super(`This Trusty Squire server (pid ${self.pid}, v${self.version}) is bound to account ` +
48
+ `${accountId}, but that account no longer has a session on this machine ` +
49
+ `(${available.length === 0 ? "no accounts are installed" : `installed: ${available.join(", ")}`}). ` +
50
+ `Refusing to fall back to another account — a credential in one account's vault is ` +
51
+ `not visible from another. Re-run \`npx @trusty-squire/mcp connect\` under account ` +
52
+ `${accountId}, or restart this host agent's Trusty Squire connection to adopt the ` +
53
+ `account it is now installed under.`);
54
+ this.accountId = accountId;
55
+ this.available = available;
56
+ this.name = "AccountSessionMissingError";
69
57
  }
70
58
  }
71
59
  function withoutLegacyProxy(data) {
72
60
  const stored = data;
73
- if (!Object.prototype.hasOwnProperty.call(stored, "proxy_url")) {
74
- return { data, changed: false };
75
- }
61
+ if (!Object.prototype.hasOwnProperty.call(stored, "proxy_url"))
62
+ return data;
76
63
  const clean = { ...stored };
77
64
  delete clean.proxy_url;
78
- return { data: clean, changed: true };
65
+ return clean;
79
66
  }
80
- async function migrateLegacyProxy(clean, write) {
81
- if (!clean.changed)
82
- return;
83
- try {
84
- await write(clean.data);
85
- }
86
- catch {
87
- return;
88
- }
67
+ /** A stored entry, or null when the file is absent or not an object. */
68
+ function parseEntry(raw) {
69
+ if (raw === null || typeof raw !== "object")
70
+ return null;
71
+ return withoutLegacyProxy(raw);
89
72
  }
90
- class KeytarStorage {
91
- kt;
92
- constructor(kt) {
93
- this.kt = kt;
94
- }
95
- async read() {
96
- const raw = await this.kt.getPassword(KEYTAR_SERVICE, KEYTAR_ACCOUNT);
97
- if (raw === null)
98
- return null;
99
- let data;
100
- try {
101
- data = JSON.parse(raw);
102
- }
103
- catch {
104
- return null;
105
- }
106
- const clean = withoutLegacyProxy(data);
107
- await migrateLegacyProxy(clean, async (session) => {
108
- await this.kt.setPassword(KEYTAR_SERVICE, KEYTAR_ACCOUNT, JSON.stringify(session));
109
- });
110
- return clean.data;
111
- }
112
- async write(data) {
113
- const clean = withoutLegacyProxy(data).data;
114
- await this.kt.setPassword(KEYTAR_SERVICE, KEYTAR_ACCOUNT, JSON.stringify(clean));
115
- }
116
- async clear() {
117
- await this.kt.deletePassword(KEYTAR_SERVICE, KEYTAR_ACCOUNT);
118
- }
119
- backendName() {
120
- return "keytar";
121
- }
73
+ /** Account ids are ULIDs; refuse anything that could escape the directory. */
74
+ function isSafeAccountKey(key) {
75
+ return /^[A-Za-z0-9_-]{1,128}$/.test(key) || key === UNBOUND_ACCOUNT_KEY;
122
76
  }
123
- export class FileStorage {
124
- filePath;
125
- // Allow tests to override the default file path. When no override is
126
- // supplied, resolve the path NOW (constructor invocation) instead of
127
- // capturing a value cached at module-import time — see
128
- // resolveFallbackFile's comment.
77
+ export class SessionStore {
78
+ /** The current-account pointer and pre-per-account compatibility mirror. */
79
+ path;
80
+ dir;
81
+ // Allow tests to override the location. When no override is supplied, resolve
82
+ // the path NOW (constructor invocation) instead of capturing a value cached
83
+ // at module-import time — see resolveConfigDir.
129
84
  constructor(filePath) {
130
- this.filePath = filePath ?? resolveFallbackFile();
85
+ this.path = filePath ?? path.join(resolveConfigDir(), "session.json");
86
+ this.dir = path.dirname(this.path);
87
+ }
88
+ get sessionsDir() {
89
+ return path.join(this.dir, "sessions");
90
+ }
91
+ accountFile(accountId) {
92
+ return path.join(this.sessionsDir, `${accountId}.json`);
131
93
  }
132
- async read() {
133
- let raw;
94
+ async readJson(file) {
134
95
  try {
135
- raw = await fs.readFile(this.filePath, "utf8");
96
+ return JSON.parse(await fs.readFile(file, "utf8"));
136
97
  }
137
98
  catch (err) {
138
99
  if (err.code === "ENOENT")
139
100
  return null;
140
101
  throw err;
141
102
  }
142
- const clean = withoutLegacyProxy(JSON.parse(raw));
143
- await migrateLegacyProxy(clean, async (session) => await this.write(session));
144
- return clean.data;
145
103
  }
146
- async write(data) {
147
- const clean = withoutLegacyProxy(data).data;
148
- await fs.mkdir(path.dirname(this.filePath), { recursive: true, mode: 0o700 });
149
- await fs.writeFile(this.filePath, JSON.stringify(clean, null, 2), { mode: 0o600 });
104
+ /**
105
+ * The legacy flat pointer/mirror. Also the pre-per-account file, which is
106
+ * why a read falls back to it: an install that predates `sessions/` has its
107
+ * only copy here, and reading must not require migrating it first.
108
+ */
109
+ async readPointer() {
110
+ return parseEntry(await this.readJson(this.path));
111
+ }
112
+ async writeAtomic(file, value) {
113
+ await fs.mkdir(path.dirname(file), { recursive: true, mode: 0o700 });
114
+ // Write-then-rename so a reader — including an older server reading the
115
+ // pointer — never observes a partially written file. rename within the
116
+ // same directory is atomic.
117
+ const temporary = `${file}.tmp-${randomUUID()}`;
118
+ try {
119
+ await fs.writeFile(temporary, `${JSON.stringify(value, null, 2)}\n`, {
120
+ mode: 0o600,
121
+ flag: "wx",
122
+ });
123
+ await fs.rename(temporary, file);
124
+ }
125
+ finally {
126
+ await fs.rm(temporary, { force: true });
127
+ }
128
+ }
129
+ async writeAtomicIfMissing(file, value) {
130
+ await fs.mkdir(path.dirname(file), { recursive: true, mode: 0o700 });
131
+ const temporary = `${file}.tmp-${randomUUID()}`;
132
+ try {
133
+ await fs.writeFile(temporary, `${JSON.stringify(value, null, 2)}\n`, {
134
+ mode: 0o600,
135
+ flag: "wx",
136
+ });
137
+ try {
138
+ await fs.link(temporary, file);
139
+ }
140
+ catch (err) {
141
+ if (err.code !== "EEXIST")
142
+ throw err;
143
+ }
144
+ }
145
+ finally {
146
+ await fs.rm(temporary, { force: true });
147
+ }
150
148
  }
151
- async clear() {
149
+ /** Every account installed on this machine. */
150
+ async listAccounts() {
151
+ let names;
152
152
  try {
153
- await fs.unlink(this.filePath);
153
+ names = await fs.readdir(this.sessionsDir);
154
154
  }
155
155
  catch (err) {
156
156
  if (err.code !== "ENOENT")
157
157
  throw err;
158
+ names = [];
158
159
  }
160
+ const accounts = names
161
+ .filter((name) => name.endsWith(".json") && !name.includes(".tmp-"))
162
+ .map((name) => name.slice(0, -".json".length))
163
+ .filter(isSafeAccountKey);
164
+ // An install that predates `sessions/` lives only in the pointer file.
165
+ if (accounts.length === 0) {
166
+ const legacy = await this.readPointer();
167
+ if (legacy !== null)
168
+ return [accountKey(legacy)];
169
+ }
170
+ return accounts.sort();
159
171
  }
160
- backendName() {
161
- return "file";
172
+ /** The account the most recent connect bound, for a reader that has no own. */
173
+ async currentAccountId() {
174
+ const pointer = await this.readPointer();
175
+ if (pointer !== null)
176
+ return accountKey(pointer);
177
+ const accounts = await this.listAccounts();
178
+ return accounts.length === 1 ? accounts[0] : null;
162
179
  }
180
+ /**
181
+ * One account's entry. With `accountId`, ONLY that account's file — a caller
182
+ * bound to an account never silently reads another's. Without it, the account
183
+ * the most recent connect bound.
184
+ */
185
+ async read(accountId) {
186
+ if (accountId === undefined) {
187
+ const current = await this.currentAccountId();
188
+ return current === null ? null : await this.read(current);
189
+ }
190
+ if (!isSafeAccountKey(accountId))
191
+ return null;
192
+ const own = parseEntry(await this.readJson(this.accountFile(accountId)));
193
+ if (own !== null)
194
+ return own;
195
+ // Mixed builds can still write a flat pointer for an account with no
196
+ // per-account file. That fallback is required for those live sessions;
197
+ // only a manual file deletion leaves it masking a missing account.
198
+ const pointer = await this.readPointer();
199
+ return pointer !== null && accountKey(pointer) === accountId ? pointer : null;
200
+ }
201
+ /**
202
+ * Upsert ONE account's entry. Structurally cannot touch another account's:
203
+ * it writes that account's own file, then refreshes the pointer/mirror.
204
+ */
205
+ async write(data) {
206
+ const key = accountKey(data);
207
+ if (!isSafeAccountKey(key)) {
208
+ throw new Error(`Invalid session account ID: ${key}`);
209
+ }
210
+ const entry = withoutLegacyProxy(data);
211
+ await this.writeAtomic(this.accountFile(key), entry);
212
+ // A claim that finally names an account supersedes the transient pre-claim
213
+ // entry rather than leaving it behind forever.
214
+ if (key !== UNBOUND_ACCOUNT_KEY) {
215
+ await fs.rm(this.accountFile(UNBOUND_ACCOUNT_KEY), { force: true });
216
+ }
217
+ const pointer = await this.readPointer();
218
+ if (pointer !== null) {
219
+ const pointerKey = accountKey(pointer);
220
+ if (pointerKey !== key &&
221
+ pointerKey !== UNBOUND_ACCOUNT_KEY &&
222
+ isSafeAccountKey(pointerKey)) {
223
+ await this.writeAtomicIfMissing(this.accountFile(pointerKey), pointer);
224
+ }
225
+ }
226
+ // The pointer, in the ORIGINAL flat shape, so servers already running an
227
+ // older build keep reading a binding they understand. Last-write-wins is
228
+ // the correct semantics: the most recent connect IS the current account.
229
+ await this.writeAtomic(this.path, entry);
230
+ }
231
+ /**
232
+ * Remove ONE account's entry (the current one by default). Other accounts'
233
+ * files are untouched; the pointer moves to a survivor, or is deleted when
234
+ * nothing is left.
235
+ */
236
+ async clear(accountId) {
237
+ const key = accountId ?? (await this.currentAccountId());
238
+ if (key === null || key === undefined)
239
+ return;
240
+ if (!isSafeAccountKey(key)) {
241
+ throw new Error(`Invalid session account ID: ${key}`);
242
+ }
243
+ const pointer = await this.readPointer();
244
+ if (pointer !== null && accountKey(pointer) === key) {
245
+ const remaining = (await this.listAccounts()).filter((id) => id !== key);
246
+ if (remaining.length > 0) {
247
+ const survivor = await this.read(remaining[0]);
248
+ if (survivor !== null) {
249
+ await this.writeAtomic(this.path, survivor);
250
+ }
251
+ else {
252
+ try {
253
+ await fs.unlink(this.path);
254
+ }
255
+ catch (err) {
256
+ if (err.code !== "ENOENT")
257
+ throw err;
258
+ }
259
+ }
260
+ }
261
+ else {
262
+ try {
263
+ await fs.unlink(this.path);
264
+ }
265
+ catch (err) {
266
+ if (err.code !== "ENOENT")
267
+ throw err;
268
+ }
269
+ }
270
+ }
271
+ const targetFile = this.accountFile(key);
272
+ await fs.rm(targetFile, { force: true });
273
+ // This catches a writer that re-materialized the legacy-only pointer
274
+ // account while logout retargeted the pointer. A writer already paused
275
+ // after its snapshot can still land later, but only for a legacy-only
276
+ // account and only as a stale credential file, never cross-account reads.
277
+ await fs.rm(targetFile, { force: true });
278
+ }
279
+ }
280
+ export async function openSessionStorage(options = {}) {
281
+ return new SessionStore(options.filePath);
163
282
  }
164
283
  //# sourceMappingURL=session.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"session.js","sourceRoot":"","sources":["../src/session.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"session.js","sourceRoot":"","sources":["../src/session.ts"],"names":[],"mappings":"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"}
@@ -1,21 +1,35 @@
1
1
  import { z } from "zod";
2
2
  import { type Tool } from "./index.js";
3
+ import { normalizeAuditType } from "./audit-rollup.js";
3
4
  declare const inputSchema: z.ZodObject<{
4
5
  limit: z.ZodOptional<z.ZodNumber>;
5
6
  before: z.ZodOptional<z.ZodString>;
6
7
  type: z.ZodOptional<z.ZodString>;
7
8
  reference: z.ZodOptional<z.ZodString>;
9
+ view: z.ZodOptional<z.ZodEnum<["ledger", "raw"]>>;
10
+ scan: z.ZodOptional<z.ZodNumber>;
11
+ window_minutes: z.ZodOptional<z.ZodNumber>;
12
+ expand: z.ZodOptional<z.ZodString>;
8
13
  }, "strip", z.ZodTypeAny, {
9
14
  limit?: number | undefined;
10
15
  before?: string | undefined;
11
16
  type?: string | undefined;
12
17
  reference?: string | undefined;
18
+ view?: "raw" | "ledger" | undefined;
19
+ scan?: number | undefined;
20
+ window_minutes?: number | undefined;
21
+ expand?: string | undefined;
13
22
  }, {
14
23
  limit?: number | undefined;
15
24
  before?: string | undefined;
16
25
  type?: string | undefined;
17
26
  reference?: string | undefined;
27
+ view?: "raw" | "ledger" | undefined;
28
+ scan?: number | undefined;
29
+ window_minutes?: number | undefined;
30
+ expand?: string | undefined;
18
31
  }>;
19
- export declare const auditLogTool: Tool<z.infer<typeof inputSchema>>;
20
- export {};
32
+ type AuditLogArgs = z.infer<typeof inputSchema>;
33
+ export declare const auditLogTool: Tool<AuditLogArgs>;
34
+ export { normalizeAuditType };
21
35
  //# sourceMappingURL=audit-log.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"audit-log.d.ts","sourceRoot":"","sources":["../../src/tools/audit-log.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAa,KAAK,IAAI,EAAE,MAAM,YAAY,CAAC;AAQlD,QAAA,MAAM,WAAW;;;;;;;;;;;;;;;EAKf,CAAC;AAYH,eAAO,MAAM,YAAY,EAAE,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,WAAW,CAAC,CAwB1D,CAAC"}
1
+ {"version":3,"file":"audit-log.d.ts","sourceRoot":"","sources":["../../src/tools/audit-log.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAa,KAAK,IAAI,EAAE,MAAM,YAAY,CAAC;AAGlD,OAAO,EASL,kBAAkB,EAGnB,MAAM,mBAAmB,CAAC;AAa3B,QAAA,MAAM,WAAW;;;;;;;;;;;;;;;;;;;;;;;;;;;EAef,CAAC;AAEH,KAAK,YAAY,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,WAAW,CAAC,CAAC;AA6BhD,eAAO,MAAM,YAAY,EAAE,IAAI,CAAC,YAAY,CA4B3C,CAAC;AAmNF,OAAO,EAAE,kBAAkB,EAAE,CAAC"}