@wirecat/cli-core 0.292.0 → 0.294.0

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 (113) hide show
  1. package/dist/cli/index.d.ts +1 -1
  2. package/dist/cli/index.d.ts.map +1 -1
  3. package/dist/cli/index.js +1 -1
  4. package/dist/cli/index.js.map +1 -1
  5. package/dist/cli/meeting-batch.d.ts +16 -0
  6. package/dist/cli/meeting-batch.d.ts.map +1 -0
  7. package/dist/cli/meeting-batch.js +171 -0
  8. package/dist/cli/meeting-batch.js.map +1 -0
  9. package/dist/cli/messenger/store-maintenance-command.d.ts +1 -1
  10. package/dist/domain/mentions.d.ts +2 -0
  11. package/dist/domain/mentions.d.ts.map +1 -1
  12. package/dist/domain/mentions.js +16 -13
  13. package/dist/domain/mentions.js.map +1 -1
  14. package/dist/domain/models.d.ts +2 -0
  15. package/dist/domain/models.d.ts.map +1 -1
  16. package/dist/domain/models.js.map +1 -1
  17. package/dist/files/index.d.ts +4 -4
  18. package/dist/files/index.d.ts.map +1 -1
  19. package/dist/files/index.js +2 -63
  20. package/dist/files/index.js.map +1 -1
  21. package/dist/files/native-lease-inspection.d.ts +3 -0
  22. package/dist/files/native-lease-inspection.d.ts.map +1 -0
  23. package/dist/files/native-lease-inspection.js +64 -0
  24. package/dist/files/native-lease-inspection.js.map +1 -0
  25. package/dist/files/native-lease-owner.d.ts +11 -0
  26. package/dist/files/native-lease-owner.d.ts.map +1 -0
  27. package/dist/files/native-lease-owner.js +54 -0
  28. package/dist/files/native-lease-owner.js.map +1 -0
  29. package/dist/files/native-lease-release.d.ts +5 -0
  30. package/dist/files/native-lease-release.d.ts.map +1 -0
  31. package/dist/files/native-lease-release.js +23 -0
  32. package/dist/files/native-lease-release.js.map +1 -0
  33. package/dist/files/native-writer-lease.d.ts +8 -0
  34. package/dist/files/native-writer-lease.d.ts.map +1 -0
  35. package/dist/files/native-writer-lease.js +74 -0
  36. package/dist/files/native-writer-lease.js.map +1 -0
  37. package/dist/files/ordinary-file.d.ts +7 -0
  38. package/dist/files/ordinary-file.d.ts.map +1 -0
  39. package/dist/files/ordinary-file.js +82 -0
  40. package/dist/files/ordinary-file.js.map +1 -0
  41. package/dist/files/writer-lease.d.ts +33 -0
  42. package/dist/files/writer-lease.d.ts.map +1 -0
  43. package/dist/files/writer-lease.js +2 -0
  44. package/dist/files/writer-lease.js.map +1 -0
  45. package/dist/index.d.ts +1 -1
  46. package/dist/index.d.ts.map +1 -1
  47. package/dist/index.js +1 -1
  48. package/dist/index.js.map +1 -1
  49. package/dist/mcp/server.d.ts.map +1 -1
  50. package/dist/mcp/server.js +1 -1
  51. package/dist/mcp/server.js.map +1 -1
  52. package/dist/mcp/tools.d.ts +2 -0
  53. package/dist/mcp/tools.d.ts.map +1 -1
  54. package/dist/mcp/tools.js +9 -0
  55. package/dist/mcp/tools.js.map +1 -1
  56. package/dist/meetings/batch.d.ts +12 -0
  57. package/dist/meetings/batch.d.ts.map +1 -0
  58. package/dist/meetings/batch.js +2 -0
  59. package/dist/meetings/batch.js.map +1 -0
  60. package/dist/meetings/cli/index.d.ts +1 -1
  61. package/dist/meetings/cli/index.d.ts.map +1 -1
  62. package/dist/meetings/cli/index.js +1 -1
  63. package/dist/meetings/cli/index.js.map +1 -1
  64. package/dist/meetings/cli/passage.d.ts +11 -1
  65. package/dist/meetings/cli/passage.d.ts.map +1 -1
  66. package/dist/meetings/cli/passage.js +25 -21
  67. package/dist/meetings/cli/passage.js.map +1 -1
  68. package/dist/meetings/index.d.ts +1 -0
  69. package/dist/meetings/index.d.ts.map +1 -1
  70. package/dist/meetings/index.js.map +1 -1
  71. package/dist/models/types.d.ts +1 -0
  72. package/dist/models/types.d.ts.map +1 -1
  73. package/dist/models/types.js +3 -1
  74. package/dist/models/types.js.map +1 -1
  75. package/dist/render/messages.d.ts +3 -1
  76. package/dist/render/messages.d.ts.map +1 -1
  77. package/dist/render/messages.js +18 -2
  78. package/dist/render/messages.js.map +1 -1
  79. package/dist/search/lucene/registry.d.ts.map +1 -1
  80. package/dist/search/lucene/registry.js +7 -2
  81. package/dist/search/lucene/registry.js.map +1 -1
  82. package/dist/services/index.d.ts +1 -0
  83. package/dist/services/index.d.ts.map +1 -1
  84. package/dist/services/index.js +1 -0
  85. package/dist/services/index.js.map +1 -1
  86. package/dist/services/meeting-batch.d.ts +5 -0
  87. package/dist/services/meeting-batch.d.ts.map +1 -0
  88. package/dist/services/meeting-batch.js +18 -0
  89. package/dist/services/meeting-batch.js.map +1 -0
  90. package/dist/services/meeting-hit-search.d.ts +3 -1
  91. package/dist/services/meeting-hit-search.d.ts.map +1 -1
  92. package/dist/services/meeting-hit-search.js +3 -2
  93. package/dist/services/meeting-hit-search.js.map +1 -1
  94. package/dist/services/meeting-passage-format.d.ts +1 -0
  95. package/dist/services/meeting-passage-format.d.ts.map +1 -1
  96. package/dist/services/meeting-passage-format.js +1 -0
  97. package/dist/services/meeting-passage-format.js.map +1 -1
  98. package/dist/store/sqlite/emails.d.ts +2 -0
  99. package/dist/store/sqlite/emails.d.ts.map +1 -1
  100. package/dist/store/sqlite/emails.js +3 -0
  101. package/dist/store/sqlite/emails.js.map +1 -1
  102. package/dist/store/sqlite/lucene.d.ts.map +1 -1
  103. package/dist/store/sqlite/lucene.js +4 -1
  104. package/dist/store/sqlite/lucene.js.map +1 -1
  105. package/dist/store/sqlite/mention-links.d.ts +13 -0
  106. package/dist/store/sqlite/mention-links.d.ts.map +1 -0
  107. package/dist/store/sqlite/mention-links.js +32 -0
  108. package/dist/store/sqlite/mention-links.js.map +1 -0
  109. package/package.json +3 -3
  110. package/dist/mcp/personal.d.ts +0 -8
  111. package/dist/mcp/personal.d.ts.map +0 -1
  112. package/dist/mcp/personal.js +0 -21
  113. package/dist/mcp/personal.js.map +0 -1
@@ -1,64 +1,3 @@
1
- import { constants } from "node:fs";
2
- import { lstat, open } from "node:fs/promises";
3
- import { CliError } from "@wirecat/cli-base";
4
- // Node 22's Windows path stat uses a 64-bit volume serial; handle stat uses its low DWORD.
5
- const deviceOf = (dev) => (process.platform === "win32" ? BigInt.asUintN(32, dev) : dev);
6
- /** Check the opened object before reading: Windows has no O_NOFOLLOW support. */
7
- export const openOrdinaryFile = async (path) => {
8
- const before = await lstat(path, { bigint: true });
9
- if (before.isSymbolicLink())
10
- throw new CliError("validation_error", "archive path must be an ordinary file without a symlink");
11
- if (!before.isFile())
12
- throw new CliError("validation_error", "archive path must be an ordinary file");
13
- const flags = process.platform === "win32"
14
- ? constants.O_RDONLY
15
- : constants.O_RDONLY | (constants.O_NOFOLLOW ?? 0) | (constants.O_NONBLOCK ?? 0);
16
- const file = await open(path, flags);
17
- try {
18
- const opened = await file.stat({ bigint: true });
19
- const after = await lstat(path, { bigint: true });
20
- if (!opened.isFile() || !after.isFile() || before.ino !== opened.ino || before.ino !== after.ino)
21
- throw new CliError("validation_error", "archive file changed while opening");
22
- if (process.platform === "win32" && before.dev === 0n && after.dev === 0n) {
23
- // Older Windows path stats omit the device; compare two handles before any content read.
24
- const witness = await open(path, flags);
25
- try {
26
- const identified = await witness.stat({ bigint: true });
27
- const final = await lstat(path, { bigint: true });
28
- if (opened.dev === 0n ||
29
- !identified.isFile() ||
30
- !final.isFile() ||
31
- deviceOf(identified.dev) !== deviceOf(opened.dev) ||
32
- identified.ino !== opened.ino ||
33
- final.ino !== before.ino ||
34
- (final.dev !== 0n && deviceOf(final.dev) !== deviceOf(opened.dev)))
35
- throw new CliError("validation_error", "archive file changed while opening");
36
- }
37
- finally {
38
- await witness.close();
39
- }
40
- }
41
- else if (deviceOf(before.dev) !== deviceOf(opened.dev) || deviceOf(before.dev) !== deviceOf(after.dev)) {
42
- throw new CliError("validation_error", "archive file changed while opening");
43
- }
44
- return file;
45
- }
46
- catch (error) {
47
- await file.close();
48
- throw error;
49
- }
50
- };
51
- export const syncDirectory = async (path) => {
52
- if (process.platform === "win32")
53
- return;
54
- const directory = await open(path, constants.O_RDONLY | (constants.O_DIRECTORY ?? 0) | (constants.O_NOFOLLOW ?? 0));
55
- try {
56
- if (!(await directory.stat()).isDirectory())
57
- throw new CliError("validation_error", "archive publication directory must be ordinary");
58
- await directory.sync();
59
- }
60
- finally {
61
- await directory.close();
62
- }
63
- };
1
+ export { nativeWriterLeaseStore } from "./native-writer-lease.js";
2
+ export { openOrdinaryFile, syncDirectory } from "./ordinary-file.js";
64
3
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/files/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/files/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAA;AACjE,OAAO,EAAE,gBAAgB,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAA"}
@@ -0,0 +1,3 @@
1
+ import type { WriterLeaseStore } from "./writer-lease.js";
2
+ export declare const leaseInspection: (markerDirectory: string) => Pick<WriterLeaseStore, "inspect" | "recover">;
3
+ //# sourceMappingURL=native-lease-inspection.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"native-lease-inspection.d.ts","sourceRoot":"","sources":["../../src/files/native-lease-inspection.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAmB,gBAAgB,EAAE,MAAM,mBAAmB,CAAA;AAE1E,eAAO,MAAM,eAAe,oBAAqB,MAAM,KAAG,IAAI,CAAC,gBAAgB,EAAE,SAAS,GAAG,SAAS,CAoDrG,CAAA"}
@@ -0,0 +1,64 @@
1
+ import { lstat, readdir, realpath, unlink } from "node:fs/promises";
2
+ import { join } from "node:path";
3
+ import { CliError } from "@wirecat/cli-base";
4
+ import { leaseOwnerStatus, missingLeaseFile, readLeaseOwner } from "./native-lease-owner.js";
5
+ export const leaseInspection = (markerDirectory) => {
6
+ const inspect = async (destination, options = {}) => {
7
+ options.signal?.throwIfAborted();
8
+ const root = await realpath(destination);
9
+ options.signal?.throwIfAborted();
10
+ const folder = join(root, markerDirectory);
11
+ let names;
12
+ try {
13
+ if ((await lstat(folder)).isSymbolicLink())
14
+ throw new Error("symlink");
15
+ names = await readdir(folder);
16
+ }
17
+ catch (error) {
18
+ options.signal?.throwIfAborted();
19
+ if (missingLeaseFile(error))
20
+ return [];
21
+ throw new CliError("configuration_error", "archive lock directory could not be read");
22
+ }
23
+ options.signal?.throwIfAborted();
24
+ const result = [];
25
+ for (const name of names.sort()) {
26
+ options.signal?.throwIfAborted();
27
+ const owner = await readLeaseOwner(join(folder, name), name, options.signal);
28
+ result.push({
29
+ name,
30
+ status: owner ? leaseOwnerStatus(owner) : "unrecognized",
31
+ pid: owner?.pid ?? null,
32
+ host: owner?.host ?? null,
33
+ });
34
+ }
35
+ return result;
36
+ };
37
+ const recover = async (destination, options = {}) => {
38
+ options.signal?.throwIfAborted();
39
+ const root = await realpath(destination);
40
+ const locks = await inspect(root, options);
41
+ const removed = [];
42
+ if (options.apply)
43
+ for (const lock of locks) {
44
+ options.signal?.throwIfAborted();
45
+ if (lock.status !== "stale")
46
+ continue;
47
+ const path = join(root, markerDirectory, lock.name);
48
+ const owner = await readLeaseOwner(path, lock.name, options.signal);
49
+ if (!owner || leaseOwnerStatus(owner) !== "stale")
50
+ continue;
51
+ try {
52
+ await unlink(path);
53
+ removed.push(lock.name);
54
+ }
55
+ catch (error) {
56
+ if (!missingLeaseFile(error))
57
+ throw new CliError("configuration_error", "stale archive lock could not be removed");
58
+ }
59
+ }
60
+ return { locks, removed };
61
+ };
62
+ return { inspect, recover };
63
+ };
64
+ //# sourceMappingURL=native-lease-inspection.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"native-lease-inspection.js","sourceRoot":"","sources":["../../src/files/native-lease-inspection.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ import type { WriterLeaseInfo } from "./writer-lease.js";
2
+ export interface NativeLeaseOwner {
3
+ version: 1;
4
+ pid: number;
5
+ host: string;
6
+ nonce: string;
7
+ }
8
+ export declare const missingLeaseFile: (error: unknown) => boolean;
9
+ export declare const readLeaseOwner: (path: string, name: string, signal?: AbortSignal) => Promise<NativeLeaseOwner | null>;
10
+ export declare const leaseOwnerStatus: (owner: NativeLeaseOwner) => WriterLeaseInfo["status"];
11
+ //# sourceMappingURL=native-lease-owner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"native-lease-owner.d.ts","sourceRoot":"","sources":["../../src/files/native-lease-owner.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAA;AAExD,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,CAAC,CAAA;IACV,GAAG,EAAE,MAAM,CAAA;IACX,IAAI,EAAE,MAAM,CAAA;IACZ,KAAK,EAAE,MAAM,CAAA;CACd;AAED,eAAO,MAAM,gBAAgB,UAAW,OAAO,KAAG,OACyC,CAAA;AAE3F,eAAO,MAAM,cAAc,SACnB,MAAM,QACN,MAAM,WACH,WAAW,KACnB,OAAO,CAAC,gBAAgB,GAAG,IAAI,CAmCjC,CAAA;AAED,eAAO,MAAM,gBAAgB,UAAW,gBAAgB,KAAG,eAAe,CAAC,QAAQ,CAQlF,CAAA"}
@@ -0,0 +1,54 @@
1
+ import { hostname } from "node:os";
2
+ import { openOrdinaryFile } from "./ordinary-file.js";
3
+ export const missingLeaseFile = (error) => typeof error === "object" && error !== null && "code" in error && error.code === "ENOENT";
4
+ export const readLeaseOwner = async (path, name, signal) => {
5
+ signal?.throwIfAborted();
6
+ try {
7
+ const file = await openOrdinaryFile(path);
8
+ try {
9
+ if ((await file.stat()).size > 4096)
10
+ return null;
11
+ const buffer = Buffer.alloc(4097);
12
+ let size = 0;
13
+ while (size < buffer.length) {
14
+ signal?.throwIfAborted();
15
+ const { bytesRead } = await file.read(buffer, size, buffer.length - size, size);
16
+ if (bytesRead === 0)
17
+ break;
18
+ size += bytesRead;
19
+ }
20
+ signal?.throwIfAborted();
21
+ if (size > 4096)
22
+ return null;
23
+ const owner = JSON.parse(buffer.subarray(0, size).toString("utf8"));
24
+ if (owner?.version !== 1 ||
25
+ !Number.isSafeInteger(owner.pid) ||
26
+ owner.pid <= 0 ||
27
+ typeof owner.host !== "string" ||
28
+ !owner.host.trim() ||
29
+ !/^[a-f0-9-]{36}$/.test(owner.nonce) ||
30
+ name !== `${owner.pid}-${owner.nonce}.json`)
31
+ return null;
32
+ return owner;
33
+ }
34
+ finally {
35
+ await file.close();
36
+ }
37
+ }
38
+ catch {
39
+ signal?.throwIfAborted();
40
+ return null;
41
+ }
42
+ };
43
+ export const leaseOwnerStatus = (owner) => {
44
+ if (owner.host !== hostname())
45
+ return "foreign";
46
+ try {
47
+ process.kill(owner.pid, 0);
48
+ return "active";
49
+ }
50
+ catch (error) {
51
+ return typeof error === "object" && error !== null && "code" in error && error.code === "ESRCH" ? "stale" : "active";
52
+ }
53
+ };
54
+ //# sourceMappingURL=native-lease-owner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"native-lease-owner.js","sourceRoot":"","sources":["../../src/files/native-lease-owner.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import { type NativeLeaseOwner } from "./native-lease-owner.js";
2
+ import type { WriterLease } from "./writer-lease.js";
3
+ export declare const ownedNativeLease: (path: string, name: string, owner: NativeLeaseOwner, folder: string, identity: BigIntStats) => WriterLease;
4
+ import type { BigIntStats } from "node:fs";
5
+ //# sourceMappingURL=native-lease-release.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"native-lease-release.d.ts","sourceRoot":"","sources":["../../src/files/native-lease-release.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,gBAAgB,EAAkB,MAAM,yBAAyB,CAAA;AAE/E,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA;AAEpD,eAAO,MAAM,gBAAgB,SACrB,MAAM,QACN,MAAM,SACL,gBAAgB,UACf,MAAM,YACJ,WAAW,KACpB,WAkBF,CAAA;AAED,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,SAAS,CAAA"}
@@ -0,0 +1,23 @@
1
+ import { rmdir, unlink } from "node:fs/promises";
2
+ import { CliError } from "@wirecat/cli-base";
3
+ import { readLeaseOwner } from "./native-lease-owner.js";
4
+ import { sameOrdinaryFile } from "./ordinary-file.js";
5
+ export const ownedNativeLease = (path, name, owner, folder, identity) => {
6
+ let releasing;
7
+ const release = async () => {
8
+ if (!(await sameOrdinaryFile(path, identity)))
9
+ throw new CliError("configuration_error", "owned archive lock changed before release");
10
+ const current = await readLeaseOwner(path, name);
11
+ if (!current || current.host !== owner.host || current.pid !== owner.pid || current.nonce !== owner.nonce)
12
+ throw new CliError("configuration_error", "owned archive lock changed before release");
13
+ await unlink(path);
14
+ await rmdir(folder).catch(() => undefined);
15
+ };
16
+ return {
17
+ release: () => (releasing ??= release().catch((error) => {
18
+ releasing = undefined;
19
+ throw error;
20
+ })),
21
+ };
22
+ };
23
+ //# sourceMappingURL=native-lease-release.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"native-lease-release.js","sourceRoot":"","sources":["../../src/files/native-lease-release.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAA;AAChD,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAA;AAC5C,OAAO,EAAyB,cAAc,EAAE,MAAM,yBAAyB,CAAA;AAC/E,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAA;AAGrD,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAC9B,IAAY,EACZ,IAAY,EACZ,KAAuB,EACvB,MAAc,EACd,QAAqB,EACR,EAAE;IACf,IAAI,SAAoC,CAAA;IACxC,MAAM,OAAO,GAAG,KAAK,IAAI,EAAE;QACzB,IAAI,CAAC,CAAC,MAAM,gBAAgB,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;YAC3C,MAAM,IAAI,QAAQ,CAAC,qBAAqB,EAAE,2CAA2C,CAAC,CAAA;QACxF,MAAM,OAAO,GAAG,MAAM,cAAc,CAAC,IAAI,EAAE,IAAI,CAAC,CAAA;QAChD,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,IAAI,KAAK,KAAK,CAAC,IAAI,IAAI,OAAO,CAAC,GAAG,KAAK,KAAK,CAAC,GAAG,IAAI,OAAO,CAAC,KAAK,KAAK,KAAK,CAAC,KAAK;YACvG,MAAM,IAAI,QAAQ,CAAC,qBAAqB,EAAE,2CAA2C,CAAC,CAAA;QACxF,MAAM,MAAM,CAAC,IAAI,CAAC,CAAA;QAClB,MAAM,KAAK,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAA;IAC5C,CAAC,CAAA;IACD,OAAO;QACL,OAAO,EAAE,GAAG,EAAE,CACZ,CAAC,SAAS,KAAK,OAAO,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;YACvC,SAAS,GAAG,SAAS,CAAA;YACrB,MAAM,KAAK,CAAA;QACb,CAAC,CAAC,CAAC;KACN,CAAA;AACH,CAAC,CAAA"}
@@ -0,0 +1,8 @@
1
+ import type { WriterLeaseStore } from "./writer-lease.js";
2
+ export interface NativeWriterLeaseLayout {
3
+ markerDirectory: string;
4
+ legacyMarker?: string;
5
+ }
6
+ /** Native PID/nonce markers; cooperating writers must use the same root and marker layout. */
7
+ export declare const nativeWriterLeaseStore: (layout: NativeWriterLeaseLayout) => WriterLeaseStore;
8
+ //# sourceMappingURL=native-writer-lease.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"native-writer-lease.d.ts","sourceRoot":"","sources":["../../src/files/native-writer-lease.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAA;AAEzD,MAAM,WAAW,uBAAuB;IACtC,eAAe,EAAE,MAAM,CAAA;IACvB,YAAY,CAAC,EAAE,MAAM,CAAA;CACtB;AAKD,8FAA8F;AAC9F,eAAO,MAAM,sBAAsB,WAAY,uBAAuB,KAAG,gBA0DxE,CAAA"}
@@ -0,0 +1,74 @@
1
+ import { randomUUID } from "node:crypto";
2
+ import { lstat, mkdir, open, realpath, rmdir, unlink } from "node:fs/promises";
3
+ import { hostname } from "node:os";
4
+ import { join } from "node:path";
5
+ import { CliError } from "@wirecat/cli-base";
6
+ import { leaseInspection } from "./native-lease-inspection.js";
7
+ import { missingLeaseFile } from "./native-lease-owner.js";
8
+ import { ownedNativeLease } from "./native-lease-release.js";
9
+ import { sameOrdinaryFile } from "./ordinary-file.js";
10
+ const validName = (value) => typeof value === "string" && value.length > 0 && value !== "." && value !== ".." && !/[\\/\0:]/.test(value);
11
+ /** Native PID/nonce markers; cooperating writers must use the same root and marker layout. */
12
+ export const nativeWriterLeaseStore = (layout) => {
13
+ const { markerDirectory, legacyMarker } = layout;
14
+ if (!validName(markerDirectory) ||
15
+ (legacyMarker !== undefined && (!validName(legacyMarker) || legacyMarker === markerDirectory)))
16
+ throw new CliError("validation_error", "archive lock layout requires distinct ordinary entry names");
17
+ const inspection = leaseInspection(markerDirectory);
18
+ return {
19
+ ...inspection,
20
+ acquire: async (destination, { signal } = {}) => {
21
+ signal?.throwIfAborted();
22
+ const root = await realpath(destination);
23
+ signal?.throwIfAborted();
24
+ const folder = join(root, markerDirectory);
25
+ await mkdir(folder, { recursive: true });
26
+ if ((await lstat(folder)).isSymbolicLink())
27
+ throw new CliError("validation_error", "archive lock directory must not be a symlink");
28
+ await inspection.recover(root, { apply: true, signal });
29
+ signal?.throwIfAborted();
30
+ const owner = { version: 1, pid: process.pid, host: hostname(), nonce: randomUUID() };
31
+ const name = `${owner.pid}-${owner.nonce}.json`;
32
+ const path = join(folder, name);
33
+ const file = await open(path, "wx", 0o600);
34
+ let retained = false;
35
+ let identity;
36
+ try {
37
+ identity = await file.stat({ bigint: true });
38
+ await file.writeFile(JSON.stringify(owner));
39
+ await file.sync();
40
+ await file.close();
41
+ signal?.throwIfAborted();
42
+ const inspected = await inspection.inspect(root, { signal });
43
+ const own = inspected.find((lock) => lock.name === name);
44
+ if (own?.status !== "active" || own.pid !== owner.pid || own.host !== owner.host)
45
+ throw new CliError("configuration_error", "archive writer lost its lock before acquisition");
46
+ const locks = inspected.filter((lock) => lock.name !== name);
47
+ if (locks.length)
48
+ return { status: "busy", locks };
49
+ if (legacyMarker) {
50
+ try {
51
+ await lstat(join(root, legacyMarker));
52
+ return { status: "legacy" };
53
+ }
54
+ catch (error) {
55
+ if (!missingLeaseFile(error))
56
+ throw error;
57
+ }
58
+ }
59
+ signal?.throwIfAborted();
60
+ retained = true;
61
+ return { status: "acquired", lease: ownedNativeLease(path, name, owner, folder, identity) };
62
+ }
63
+ finally {
64
+ await file.close().catch(() => undefined);
65
+ if (!retained) {
66
+ if (identity && (await sameOrdinaryFile(path, identity)))
67
+ await unlink(path).catch(() => undefined);
68
+ await rmdir(folder).catch(() => undefined);
69
+ }
70
+ }
71
+ },
72
+ };
73
+ };
74
+ //# sourceMappingURL=native-writer-lease.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"native-writer-lease.js","sourceRoot":"","sources":["../../src/files/native-writer-lease.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import { type BigIntStats } from "node:fs";
2
+ import { type FileHandle } from "node:fs/promises";
3
+ /** Check the opened object before reading: Windows has no O_NOFOLLOW support. */
4
+ export declare const openOrdinaryFile: (path: string) => Promise<FileHandle>;
5
+ export declare const sameOrdinaryFile: (path: string, created: BigIntStats) => Promise<boolean>;
6
+ export declare const syncDirectory: (path: string) => Promise<void>;
7
+ //# sourceMappingURL=ordinary-file.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ordinary-file.d.ts","sourceRoot":"","sources":["../../src/files/ordinary-file.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,WAAW,EAAa,MAAM,SAAS,CAAA;AACrD,OAAO,EAAE,KAAK,UAAU,EAAe,MAAM,kBAAkB,CAAA;AAQ/D,iFAAiF;AACjF,eAAO,MAAM,gBAAgB,SAAgB,MAAM,KAAG,OAAO,CAAC,UAAU,CAyCvE,CAAA;AAED,eAAO,MAAM,gBAAgB,SAAgB,MAAM,WAAW,WAAW,KAAG,OAAO,CAAC,OAAO,CAiB1F,CAAA;AAED,eAAO,MAAM,aAAa,SAAgB,MAAM,KAAG,OAAO,CAAC,IAAI,CAU9D,CAAA"}
@@ -0,0 +1,82 @@
1
+ import { constants } from "node:fs";
2
+ import { lstat, open } from "node:fs/promises";
3
+ import { CliError } from "@wirecat/cli-base";
4
+ // Node 22's Windows path stat uses a 64-bit volume serial; handle stat uses its low DWORD.
5
+ const deviceOf = (dev) => (process.platform === "win32" ? BigInt.asUintN(32, dev) : dev);
6
+ const sameIdentity = (left, right) => left.ino === right.ino && deviceOf(left.dev) === deviceOf(right.dev);
7
+ /** Check the opened object before reading: Windows has no O_NOFOLLOW support. */
8
+ export const openOrdinaryFile = async (path) => {
9
+ const before = await lstat(path, { bigint: true });
10
+ if (before.isSymbolicLink())
11
+ throw new CliError("validation_error", "archive path must be an ordinary file without a symlink");
12
+ if (!before.isFile())
13
+ throw new CliError("validation_error", "archive path must be an ordinary file");
14
+ const flags = process.platform === "win32"
15
+ ? constants.O_RDONLY
16
+ : constants.O_RDONLY | (constants.O_NOFOLLOW ?? 0) | (constants.O_NONBLOCK ?? 0);
17
+ const file = await open(path, flags);
18
+ try {
19
+ const opened = await file.stat({ bigint: true });
20
+ const after = await lstat(path, { bigint: true });
21
+ if (!opened.isFile() || !after.isFile() || before.ino !== opened.ino || before.ino !== after.ino)
22
+ throw new CliError("validation_error", "archive file changed while opening");
23
+ if (process.platform === "win32" && before.dev === 0n && after.dev === 0n) {
24
+ // Older Windows path stats omit the device; compare two handles before any content read.
25
+ const witness = await open(path, flags);
26
+ try {
27
+ const identified = await witness.stat({ bigint: true });
28
+ const final = await lstat(path, { bigint: true });
29
+ if (opened.dev === 0n ||
30
+ !identified.isFile() ||
31
+ !final.isFile() ||
32
+ !sameIdentity(identified, opened) ||
33
+ final.ino !== before.ino ||
34
+ (final.dev !== 0n && deviceOf(final.dev) !== deviceOf(opened.dev)))
35
+ throw new CliError("validation_error", "archive file changed while opening");
36
+ }
37
+ finally {
38
+ await witness.close();
39
+ }
40
+ }
41
+ else if (deviceOf(before.dev) !== deviceOf(opened.dev) || deviceOf(before.dev) !== deviceOf(after.dev)) {
42
+ throw new CliError("validation_error", "archive file changed while opening");
43
+ }
44
+ return file;
45
+ }
46
+ catch (error) {
47
+ await file.close();
48
+ throw error;
49
+ }
50
+ };
51
+ export const sameOrdinaryFile = async (path, created) => {
52
+ let file;
53
+ try {
54
+ file = await openOrdinaryFile(path);
55
+ }
56
+ catch (error) {
57
+ if (error instanceof CliError ||
58
+ (typeof error === "object" && error !== null && "code" in error && error.code === "ENOENT"))
59
+ return false;
60
+ throw error;
61
+ }
62
+ try {
63
+ return sameIdentity(created, await file.stat({ bigint: true }));
64
+ }
65
+ finally {
66
+ await file.close();
67
+ }
68
+ };
69
+ export const syncDirectory = async (path) => {
70
+ if (process.platform === "win32")
71
+ return;
72
+ const directory = await open(path, constants.O_RDONLY | (constants.O_DIRECTORY ?? 0) | (constants.O_NOFOLLOW ?? 0));
73
+ try {
74
+ if (!(await directory.stat()).isDirectory())
75
+ throw new CliError("validation_error", "archive publication directory must be ordinary");
76
+ await directory.sync();
77
+ }
78
+ finally {
79
+ await directory.close();
80
+ }
81
+ };
82
+ //# sourceMappingURL=ordinary-file.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ordinary-file.js","sourceRoot":"","sources":["../../src/files/ordinary-file.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,33 @@
1
+ export interface WriterLease {
2
+ /** Releases this owner's marker; cleanup remains usable after cancellation. */
3
+ release(): Promise<void>;
4
+ }
5
+ export interface WriterLeaseInfo {
6
+ name: string;
7
+ status: "active" | "stale" | "foreign" | "unrecognized";
8
+ pid: number | null;
9
+ host: string | null;
10
+ }
11
+ export interface WriterLeaseOptions {
12
+ signal?: AbortSignal;
13
+ }
14
+ export type WriterLeaseAcquisition = {
15
+ status: "acquired";
16
+ lease: WriterLease;
17
+ } | {
18
+ status: "busy";
19
+ locks: WriterLeaseInfo[];
20
+ } | {
21
+ status: "legacy";
22
+ };
23
+ export interface WriterLeaseStore {
24
+ inspect(destination: string, options?: WriterLeaseOptions): Promise<WriterLeaseInfo[]>;
25
+ recover(destination: string, options?: WriterLeaseOptions & {
26
+ apply?: boolean;
27
+ }): Promise<{
28
+ locks: WriterLeaseInfo[];
29
+ removed: string[];
30
+ }>;
31
+ acquire(destination: string, options?: WriterLeaseOptions): Promise<WriterLeaseAcquisition>;
32
+ }
33
+ //# sourceMappingURL=writer-lease.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"writer-lease.d.ts","sourceRoot":"","sources":["../../src/files/writer-lease.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,WAAW;IAC1B,+EAA+E;IAC/E,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAAA;CACzB;AAED,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAA;IACZ,MAAM,EAAE,QAAQ,GAAG,OAAO,GAAG,SAAS,GAAG,cAAc,CAAA;IACvD,GAAG,EAAE,MAAM,GAAG,IAAI,CAAA;IAClB,IAAI,EAAE,MAAM,GAAG,IAAI,CAAA;CACpB;AAED,MAAM,WAAW,kBAAkB;IACjC,MAAM,CAAC,EAAE,WAAW,CAAA;CACrB;AAED,MAAM,MAAM,sBAAsB,GAC9B;IAAE,MAAM,EAAE,UAAU,CAAC;IAAC,KAAK,EAAE,WAAW,CAAA;CAAE,GAC1C;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,eAAe,EAAE,CAAA;CAAE,GAC5C;IAAE,MAAM,EAAE,QAAQ,CAAA;CAAE,CAAA;AAExB,MAAM,WAAW,gBAAgB;IAC/B,OAAO,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,kBAAkB,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC,CAAA;IACtF,OAAO,CACL,WAAW,EAAE,MAAM,EACnB,OAAO,CAAC,EAAE,kBAAkB,GAAG;QAAE,KAAK,CAAC,EAAE,OAAO,CAAA;KAAE,GACjD,OAAO,CAAC;QAAE,KAAK,EAAE,eAAe,EAAE,CAAC;QAAC,OAAO,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC,CAAA;IAC3D,OAAO,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,kBAAkB,GAAG,OAAO,CAAC,sBAAsB,CAAC,CAAA;CAC5F"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=writer-lease.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"writer-lease.js","sourceRoot":"","sources":["../../src/files/writer-lease.ts"],"names":[],"mappings":""}
package/dist/index.d.ts CHANGED
@@ -17,7 +17,7 @@ export { act, judge } from "./moderation/check.js";
17
17
  export type { GroupRules } from "./moderation/rules.js";
18
18
  export { defaultRules, ModerationRules, moderationPathFor } from "./moderation/rules.js";
19
19
  export { type OutputOptions, resolveOutput } from "./output.js";
20
- export { type RenderOptions, renderMessage, renderMessages } from "./render/messages.js";
20
+ export { pollLines, type RenderOptions, renderMessage, renderMessages } from "./render/messages.js";
21
21
  export { isId, type PeopleLookup, pickChat, pickPerson } from "./resolve.js";
22
22
  export { readSecret, type SecretInput } from "./terminal/prompt.js";
23
23
  export { qrPng, terminalQr } from "./terminal/qr.js";
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,YAAY,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAA;AAC/G,OAAO,EAAE,cAAc,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAA;AACrF,OAAO,EACL,KAAK,aAAa,EAClB,KAAK,cAAc,EACnB,KAAK,kBAAkB,EACvB,KAAK,QAAQ,EACb,qBAAqB,GACtB,MAAM,wBAAwB,CAAA;AAC/B,OAAO,EAAE,aAAa,EAAE,SAAS,EAAE,KAAK,cAAc,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAA;AACjG,OAAO,EAAE,KAAK,MAAM,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAA;AACjE,YAAY,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAA;AAC7E,mBAAmB,oBAAoB,CAAA;AACvC,YAAY,EAAE,oBAAoB,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAA;AACxF,YAAY,EACV,gBAAgB,EAChB,YAAY,EACZ,cAAc,EACd,cAAc,EACd,aAAa,EACb,cAAc,EACd,WAAW,GACZ,MAAM,8BAA8B,CAAA;AACrC,OAAO,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAA;AAC7D,OAAO,EAAE,kBAAkB,EAAE,eAAe,EAAE,cAAc,EAAE,KAAK,SAAS,EAAE,MAAM,wBAAwB,CAAA;AAC5G,OAAO,EAAE,YAAY,EAAE,SAAS,EAAE,KAAK,OAAO,EAAE,MAAM,kBAAkB,CAAA;AACxE,OAAO,EAAE,KAAK,SAAS,EAAE,OAAO,IAAI,YAAY,EAAE,cAAc,EAAE,OAAO,IAAI,YAAY,EAAE,MAAM,qBAAqB,CAAA;AACtH,OAAO,EACL,yBAAyB,EACzB,sBAAsB,EACtB,KAAK,gBAAgB,EACrB,qBAAqB,GACtB,MAAM,qBAAqB,CAAA;AAC5B,YAAY,EAAE,QAAQ,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAA;AACzE,OAAO,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,uBAAuB,CAAA;AAClD,YAAY,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAA;AACvD,OAAO,EAAE,YAAY,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAA;AACxF,OAAO,EAAE,KAAK,aAAa,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA;AAC/D,OAAO,EAAE,KAAK,aAAa,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA;AACxF,OAAO,EAAE,IAAI,EAAE,KAAK,YAAY,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,cAAc,CAAA;AAC5E,OAAO,EAAE,UAAU,EAAE,KAAK,WAAW,EAAE,MAAM,sBAAsB,CAAA;AACnE,OAAO,EAAE,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,YAAY,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAA;AAC/G,OAAO,EAAE,cAAc,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAA;AACrF,OAAO,EACL,KAAK,aAAa,EAClB,KAAK,cAAc,EACnB,KAAK,kBAAkB,EACvB,KAAK,QAAQ,EACb,qBAAqB,GACtB,MAAM,wBAAwB,CAAA;AAC/B,OAAO,EAAE,aAAa,EAAE,SAAS,EAAE,KAAK,cAAc,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAA;AACjG,OAAO,EAAE,KAAK,MAAM,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAA;AACjE,YAAY,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAA;AAC7E,mBAAmB,oBAAoB,CAAA;AACvC,YAAY,EAAE,oBAAoB,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAA;AACxF,YAAY,EACV,gBAAgB,EAChB,YAAY,EACZ,cAAc,EACd,cAAc,EACd,aAAa,EACb,cAAc,EACd,WAAW,GACZ,MAAM,8BAA8B,CAAA;AACrC,OAAO,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAA;AAC7D,OAAO,EAAE,kBAAkB,EAAE,eAAe,EAAE,cAAc,EAAE,KAAK,SAAS,EAAE,MAAM,wBAAwB,CAAA;AAC5G,OAAO,EAAE,YAAY,EAAE,SAAS,EAAE,KAAK,OAAO,EAAE,MAAM,kBAAkB,CAAA;AACxE,OAAO,EAAE,KAAK,SAAS,EAAE,OAAO,IAAI,YAAY,EAAE,cAAc,EAAE,OAAO,IAAI,YAAY,EAAE,MAAM,qBAAqB,CAAA;AACtH,OAAO,EACL,yBAAyB,EACzB,sBAAsB,EACtB,KAAK,gBAAgB,EACrB,qBAAqB,GACtB,MAAM,qBAAqB,CAAA;AAC5B,YAAY,EAAE,QAAQ,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAA;AACzE,OAAO,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,uBAAuB,CAAA;AAClD,YAAY,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAA;AACvD,OAAO,EAAE,YAAY,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAA;AACxF,OAAO,EAAE,KAAK,aAAa,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA;AAC/D,OAAO,EAAE,SAAS,EAAE,KAAK,aAAa,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA;AACnG,OAAO,EAAE,IAAI,EAAE,KAAK,YAAY,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,cAAc,CAAA;AAC5E,OAAO,EAAE,UAAU,EAAE,KAAK,WAAW,EAAE,MAAM,sBAAsB,CAAA;AACnE,OAAO,EAAE,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA"}
package/dist/index.js CHANGED
@@ -10,7 +10,7 @@ export { canonicalMeetingReference, formatMeetingReference, parseMeetingReferenc
10
10
  export { act, judge } from "./moderation/check.js";
11
11
  export { defaultRules, ModerationRules, moderationPathFor } from "./moderation/rules.js";
12
12
  export { resolveOutput } from "./output.js";
13
- export { renderMessage, renderMessages } from "./render/messages.js";
13
+ export { pollLines, renderMessage, renderMessages } from "./render/messages.js";
14
14
  export { isId, pickChat, pickPerson } from "./resolve.js";
15
15
  export { readSecret } from "./terminal/prompt.js";
16
16
  export { qrPng, terminalQr } from "./terminal/qr.js";
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAA;AACrF,OAAO,EAKL,qBAAqB,GACtB,MAAM,wBAAwB,CAAA;AAC/B,OAAO,EAAE,aAAa,EAAE,SAAS,EAAuB,YAAY,EAAE,MAAM,qBAAqB,CAAA;AACjG,OAAO,EAAe,aAAa,EAAE,MAAM,sBAAsB,CAAA;AAajE,OAAO,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAA;AAC7D,OAAO,EAAE,kBAAkB,EAAE,eAAe,EAAE,cAAc,EAAkB,MAAM,wBAAwB,CAAA;AAC5G,OAAO,EAAE,YAAY,EAAE,SAAS,EAAgB,MAAM,kBAAkB,CAAA;AACxE,OAAO,EAAkB,OAAO,IAAI,YAAY,EAAE,cAAc,EAAE,OAAO,IAAI,YAAY,EAAE,MAAM,qBAAqB,CAAA;AACtH,OAAO,EACL,yBAAyB,EACzB,sBAAsB,EAEtB,qBAAqB,GACtB,MAAM,qBAAqB,CAAA;AAE5B,OAAO,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,uBAAuB,CAAA;AAElD,OAAO,EAAE,YAAY,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAA;AACxF,OAAO,EAAsB,aAAa,EAAE,MAAM,aAAa,CAAA;AAC/D,OAAO,EAAsB,aAAa,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA;AACxF,OAAO,EAAE,IAAI,EAAqB,QAAQ,EAAE,UAAU,EAAE,MAAM,cAAc,CAAA;AAC5E,OAAO,EAAE,UAAU,EAAoB,MAAM,sBAAsB,CAAA;AACnE,OAAO,EAAE,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAA;AACrF,OAAO,EAKL,qBAAqB,GACtB,MAAM,wBAAwB,CAAA;AAC/B,OAAO,EAAE,aAAa,EAAE,SAAS,EAAuB,YAAY,EAAE,MAAM,qBAAqB,CAAA;AACjG,OAAO,EAAe,aAAa,EAAE,MAAM,sBAAsB,CAAA;AAajE,OAAO,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAA;AAC7D,OAAO,EAAE,kBAAkB,EAAE,eAAe,EAAE,cAAc,EAAkB,MAAM,wBAAwB,CAAA;AAC5G,OAAO,EAAE,YAAY,EAAE,SAAS,EAAgB,MAAM,kBAAkB,CAAA;AACxE,OAAO,EAAkB,OAAO,IAAI,YAAY,EAAE,cAAc,EAAE,OAAO,IAAI,YAAY,EAAE,MAAM,qBAAqB,CAAA;AACtH,OAAO,EACL,yBAAyB,EACzB,sBAAsB,EAEtB,qBAAqB,GACtB,MAAM,qBAAqB,CAAA;AAE5B,OAAO,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,uBAAuB,CAAA;AAElD,OAAO,EAAE,YAAY,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAA;AACxF,OAAO,EAAsB,aAAa,EAAE,MAAM,aAAa,CAAA;AAC/D,OAAO,EAAE,SAAS,EAAsB,aAAa,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA;AACnG,OAAO,EAAE,IAAI,EAAqB,QAAQ,EAAE,UAAU,EAAE,MAAM,cAAc,CAAA;AAC5E,OAAO,EAAE,UAAU,EAAoB,MAAM,sBAAsB,CAAA;AACnE,OAAO,EAAE,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/mcp/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,8BAA8B,CAAA;AAQxD,OAAO,EAAa,KAAK,SAAS,EAAE,KAAK,gBAAgB,EAAE,MAAM,6BAA6B,CAAA;AAO9F,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAA;AAKlD,OAAO,EAAE,gBAAgB,EAAE,KAAK,cAAc,EAAE,MAAM,cAAc,CAAA;AAIpE,MAAM,MAAM,aAAa,GAAG,cAAc,GAAG;IAAE,QAAQ,CAAC,EAAE,OAAO,8BAA8B,EAAE,QAAQ,CAAA;CAAE,CAAA;AAE3G,KAAK,UAAU,GAAG,UAAU,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;AAErD;;;;GAIG;AACH,eAAO,MAAM,YAAY,YACd,UAAU,WACV,gBAAgB,aACd,SAAS,kBACJ,aAAa;;;iBAuDX,SAAS;;;;;CA2E5B,CAAA;AAED;;;;GAIG;AACH,eAAO,MAAM,cAAc,YAChB,UAAU,WACV,gBAAgB,aACd,SAAS,WACX,aAAa,KACrB,OAAO,CAAC,IAAI,CAkBd,CAAA;AAED,wDAAwD;AACxD,eAAO,MAAM,yBAAyB,YAC3B,UAAU,WACV,gBAAgB,aACd,SAAS,WACX,aAAa,QAChB,IAAI,CAAC,WAAW,EAAE,QAAQ,GAAG,SAAS,GAAG,SAAS,CAAC,KACxD,OAAO,CAAC,IAAI,CAoCd,CAAA"}
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/mcp/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,8BAA8B,CAAA;AAQxD,OAAO,EAAa,KAAK,SAAS,EAAE,KAAK,gBAAgB,EAAE,MAAM,6BAA6B,CAAA;AAO9F,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAA;AAIlD,OAAO,EAAE,gBAAgB,EAAE,KAAK,cAAc,EAAE,MAAM,cAAc,CAAA;AAKpE,MAAM,MAAM,aAAa,GAAG,cAAc,GAAG;IAAE,QAAQ,CAAC,EAAE,OAAO,8BAA8B,EAAE,QAAQ,CAAA;CAAE,CAAA;AAE3G,KAAK,UAAU,GAAG,UAAU,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;AAErD;;;;GAIG;AACH,eAAO,MAAM,YAAY,YACd,UAAU,WACV,gBAAgB,aACd,SAAS,kBACJ,aAAa;;;iBAuDX,SAAS;;;;;CA2E5B,CAAA;AAED;;;;GAIG;AACH,eAAO,MAAM,cAAc,YAChB,UAAU,WACV,gBAAgB,aACd,SAAS,WACX,aAAa,KACrB,OAAO,CAAC,IAAI,CAkBd,CAAA;AAED,wDAAwD;AACxD,eAAO,MAAM,yBAAyB,YAC3B,UAAU,WACV,gBAAgB,aACd,SAAS,WACX,aAAa,QAChB,IAAI,CAAC,WAAW,EAAE,QAAQ,GAAG,SAAS,GAAG,SAAS,CAAC,KACxD,OAAO,CAAC,IAAI,CAoCd,CAAA"}
@@ -14,12 +14,12 @@ import { levelFor, readKeysForCommand } from "../sends/permissions.js";
14
14
  import { openStore } from "../store/store.js";
15
15
  import { agentLog } from "./agent-log.js";
16
16
  import { instructions } from "./instructions.js";
17
- import { personalMcpTools } from "./personal.js";
18
17
  import { registerPrompts } from "./prompts.js";
19
18
  import { registerResources } from "./resources.js";
20
19
  import { MessengerSession } from "./session.js";
21
20
  import { commandOf, registerSurface } from "./surface.js";
22
21
  import { READ, tool, toolKey } from "./tool.js";
22
+ import { personalMcpTools } from "./tools.js";
23
23
  /**
24
24
  * A factory of servers over one session. `serveStdio` may build a probe instance and throw it away
25
25
  * before settling on the protocol era, so each call is a fresh server — and all of them share the