@vinhnt-sdk/tools 0.1.2 → 0.2.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 (127) hide show
  1. package/dist/agent-provider.d.ts +34 -0
  2. package/dist/agent-provider.d.ts.map +1 -0
  3. package/dist/agent-provider.js +41 -0
  4. package/dist/agent-provider.js.map +1 -0
  5. package/dist/define-tool.d.ts +6 -1
  6. package/dist/define-tool.d.ts.map +1 -1
  7. package/dist/define-tool.js +8 -5
  8. package/dist/define-tool.js.map +1 -1
  9. package/dist/definitions.d.ts +12 -1
  10. package/dist/definitions.d.ts.map +1 -1
  11. package/dist/definitions.js +2 -1
  12. package/dist/definitions.js.map +1 -1
  13. package/dist/description-lint.d.ts +2 -0
  14. package/dist/description-lint.d.ts.map +1 -1
  15. package/dist/description-lint.js.map +1 -1
  16. package/dist/diff.d.ts +2 -0
  17. package/dist/diff.d.ts.map +1 -1
  18. package/dist/diff.js +1 -0
  19. package/dist/diff.js.map +1 -1
  20. package/dist/file-history.d.ts +4 -0
  21. package/dist/file-history.d.ts.map +1 -1
  22. package/dist/file-history.js +1 -0
  23. package/dist/file-history.js.map +1 -1
  24. package/dist/file-tools.d.ts +45 -12
  25. package/dist/file-tools.d.ts.map +1 -1
  26. package/dist/file-tools.js +104 -30
  27. package/dist/file-tools.js.map +1 -1
  28. package/dist/git-tools.d.ts +5 -1
  29. package/dist/git-tools.d.ts.map +1 -1
  30. package/dist/git-tools.js +7 -2
  31. package/dist/git-tools.js.map +1 -1
  32. package/dist/history-hook.d.ts +2 -1
  33. package/dist/history-hook.d.ts.map +1 -1
  34. package/dist/history-hook.js +4 -3
  35. package/dist/history-hook.js.map +1 -1
  36. package/dist/image-tools.d.ts +13 -3
  37. package/dist/image-tools.d.ts.map +1 -1
  38. package/dist/image-tools.js +62 -13
  39. package/dist/image-tools.js.map +1 -1
  40. package/dist/index.d.ts +37 -230
  41. package/dist/index.d.ts.map +1 -1
  42. package/dist/index.js +38 -131
  43. package/dist/index.js.map +1 -1
  44. package/dist/json-schema.d.ts +3 -0
  45. package/dist/json-schema.d.ts.map +1 -1
  46. package/dist/kill-tree.d.ts +36 -0
  47. package/dist/kill-tree.d.ts.map +1 -0
  48. package/dist/kill-tree.js +80 -0
  49. package/dist/kill-tree.js.map +1 -0
  50. package/dist/lazy-registry.d.ts +5 -3
  51. package/dist/lazy-registry.d.ts.map +1 -1
  52. package/dist/lazy-registry.js +1 -0
  53. package/dist/lazy-registry.js.map +1 -1
  54. package/dist/policy.d.ts +1 -0
  55. package/dist/policy.d.ts.map +1 -1
  56. package/dist/providers/builtin-provider.d.ts.map +1 -1
  57. package/dist/providers/builtin-provider.js +1 -4
  58. package/dist/providers/builtin-provider.js.map +1 -1
  59. package/dist/providers/file-loader.d.ts +20 -2
  60. package/dist/providers/file-loader.d.ts.map +1 -1
  61. package/dist/providers/file-loader.js +46 -6
  62. package/dist/providers/file-loader.js.map +1 -1
  63. package/dist/providers/index.d.ts +0 -4
  64. package/dist/providers/index.d.ts.map +1 -1
  65. package/dist/providers/index.js +0 -3
  66. package/dist/providers/index.js.map +1 -1
  67. package/dist/question-tool.d.ts +9 -3
  68. package/dist/question-tool.d.ts.map +1 -1
  69. package/dist/question-tool.js +5 -1
  70. package/dist/question-tool.js.map +1 -1
  71. package/dist/read-tracker.d.ts +10 -1
  72. package/dist/read-tracker.d.ts.map +1 -1
  73. package/dist/read-tracker.js +38 -8
  74. package/dist/read-tracker.js.map +1 -1
  75. package/dist/registry.d.ts +3 -0
  76. package/dist/registry.d.ts.map +1 -1
  77. package/dist/registry.js +14 -2
  78. package/dist/registry.js.map +1 -1
  79. package/dist/saga.d.ts +32 -0
  80. package/dist/saga.d.ts.map +1 -0
  81. package/dist/saga.js +65 -0
  82. package/dist/saga.js.map +1 -0
  83. package/dist/sandbox.d.ts +2 -0
  84. package/dist/sandbox.d.ts.map +1 -1
  85. package/dist/sandbox.js +10 -43
  86. package/dist/sandbox.js.map +1 -1
  87. package/dist/search-tools.d.ts +3 -1
  88. package/dist/search-tools.d.ts.map +1 -1
  89. package/dist/search-tools.js +7 -3
  90. package/dist/search-tools.js.map +1 -1
  91. package/dist/shell-parser.js +1 -0
  92. package/dist/shell-parser.js.map +1 -1
  93. package/dist/shell-tool.d.ts +11 -4
  94. package/dist/shell-tool.d.ts.map +1 -1
  95. package/dist/shell-tool.js +16 -9
  96. package/dist/shell-tool.js.map +1 -1
  97. package/dist/skill-provider.d.ts +21 -0
  98. package/dist/skill-provider.d.ts.map +1 -0
  99. package/dist/skill-provider.js +28 -0
  100. package/dist/skill-provider.js.map +1 -0
  101. package/dist/todo-tool.d.ts +2 -1
  102. package/dist/todo-tool.d.ts.map +1 -1
  103. package/dist/todo-tool.js +2 -1
  104. package/dist/todo-tool.js.map +1 -1
  105. package/dist/tool-sandbox.d.ts +19 -0
  106. package/dist/tool-sandbox.d.ts.map +1 -0
  107. package/dist/tool-sandbox.js +100 -0
  108. package/dist/tool-sandbox.js.map +1 -0
  109. package/dist/tool-search.d.ts +6 -3
  110. package/dist/tool-search.d.ts.map +1 -1
  111. package/dist/tool-search.js +2 -1
  112. package/dist/tool-search.js.map +1 -1
  113. package/dist/types.d.ts +2 -0
  114. package/dist/types.d.ts.map +1 -1
  115. package/dist/validate.d.ts +4 -1
  116. package/dist/validate.d.ts.map +1 -1
  117. package/dist/validate.js +3 -0
  118. package/dist/validate.js.map +1 -1
  119. package/dist/web-search-tool.d.ts +10 -5
  120. package/dist/web-search-tool.d.ts.map +1 -1
  121. package/dist/web-search-tool.js +5 -3
  122. package/dist/web-search-tool.js.map +1 -1
  123. package/dist/web-tools.d.ts +8 -3
  124. package/dist/web-tools.d.ts.map +1 -1
  125. package/dist/web-tools.js +5 -1
  126. package/dist/web-tools.js.map +1 -1
  127. package/package.json +11 -10
@@ -0,0 +1,36 @@
1
+ /**
2
+ * Tree-scoped process termination.
3
+ *
4
+ * `child.kill()` only terminates the direct child; grandchild processes keep
5
+ * running (orphaned). This module kills the whole process tree:
6
+ * - POSIX: child is spawned `detached` (own process group) → `kill(-pid)`
7
+ * - Windows: `taskkill /pid <pid> /T /F`
8
+ *
9
+ * Termination is idempotent: repeated kills for the same pid are no-ops.
10
+ *
11
+ * @module tool/kill-tree
12
+ * @packageDocumentation
13
+ */
14
+ import { type ChildProcess } from "node:child_process";
15
+ /** Clear the idempotency registry (used by tests). */
16
+ export declare function resetKillTreeState(): void;
17
+ /** True when the process (or its process group) is still alive. */
18
+ export declare function isPidAlive(pid: number): boolean;
19
+ /**
20
+ * Kill a child process and its whole subtree. Idempotent per pid.
21
+ *
22
+ * @param child - The spawned child process.
23
+ * @param signal - POSIX signal for the direct kill (default "SIGTERM").
24
+ * Windows always uses `taskkill /T /F`.
25
+ * @returns `true` when the kill was issued (or already issued), `false` when
26
+ * there is no pid yet (child not spawned).
27
+ */
28
+ export declare function killProcessTree(child: ChildProcess, signal?: NodeJS.Signals): boolean;
29
+ /**
30
+ * Cross-platform spawn option that makes `killProcessTree` reach the whole
31
+ * tree. On Windows no extra flag is needed (taskkill walks the tree).
32
+ */
33
+ export declare function treeKillSpawnOptions(): {
34
+ detached: boolean;
35
+ };
36
+ //# sourceMappingURL=kill-tree.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"kill-tree.d.ts","sourceRoot":"","sources":["../src/kill-tree.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAAS,KAAK,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAI9D,sDAAsD;AACtD,wBAAgB,kBAAkB,IAAI,IAAI,CAEzC;AAED,mEAAmE;AACnE,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAQ/C;AAED;;;;;;;;GAQG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,YAAY,EAAE,MAAM,GAAE,MAAM,CAAC,OAAmB,GAAG,OAAO,CA6BhG;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,IAAI;IAAE,QAAQ,EAAE,OAAO,CAAA;CAAE,CAE5D"}
@@ -0,0 +1,80 @@
1
+ /**
2
+ * Tree-scoped process termination.
3
+ *
4
+ * `child.kill()` only terminates the direct child; grandchild processes keep
5
+ * running (orphaned). This module kills the whole process tree:
6
+ * - POSIX: child is spawned `detached` (own process group) → `kill(-pid)`
7
+ * - Windows: `taskkill /pid <pid> /T /F`
8
+ *
9
+ * Termination is idempotent: repeated kills for the same pid are no-ops.
10
+ *
11
+ * @module tool/kill-tree
12
+ * @packageDocumentation
13
+ */
14
+ import { spawn } from "node:child_process";
15
+ const terminatedPids = new Set();
16
+ /** Clear the idempotency registry (used by tests). */
17
+ export function resetKillTreeState() {
18
+ terminatedPids.clear();
19
+ }
20
+ /** True when the process (or its process group) is still alive. */
21
+ export function isPidAlive(pid) {
22
+ if (!pid || pid <= 0)
23
+ return false;
24
+ try {
25
+ process.kill(pid, 0);
26
+ return true;
27
+ }
28
+ catch (err) {
29
+ return err.code !== "ESRCH";
30
+ }
31
+ }
32
+ /**
33
+ * Kill a child process and its whole subtree. Idempotent per pid.
34
+ *
35
+ * @param child - The spawned child process.
36
+ * @param signal - POSIX signal for the direct kill (default "SIGTERM").
37
+ * Windows always uses `taskkill /T /F`.
38
+ * @returns `true` when the kill was issued (or already issued), `false` when
39
+ * there is no pid yet (child not spawned).
40
+ */
41
+ export function killProcessTree(child, signal = "SIGTERM") {
42
+ const pid = child.pid;
43
+ if (!pid || pid <= 0)
44
+ return false;
45
+ if (terminatedPids.has(pid))
46
+ return true;
47
+ terminatedPids.add(pid);
48
+ if (process.platform === "win32") {
49
+ spawn("taskkill", ["/pid", String(pid), "/T", "/F"], {
50
+ windowsHide: true,
51
+ stdio: "ignore",
52
+ }).unref();
53
+ return true;
54
+ }
55
+ // POSIX: the child was spawned detached → kill the whole process group.
56
+ try {
57
+ process.kill(-pid, signal);
58
+ }
59
+ catch (err) {
60
+ if (err.code === "ESRCH") {
61
+ // Already gone — group kill is best-effort.
62
+ return true;
63
+ }
64
+ try {
65
+ process.kill(pid, signal);
66
+ }
67
+ catch {
68
+ // Already gone.
69
+ }
70
+ }
71
+ return true;
72
+ }
73
+ /**
74
+ * Cross-platform spawn option that makes `killProcessTree` reach the whole
75
+ * tree. On Windows no extra flag is needed (taskkill walks the tree).
76
+ */
77
+ export function treeKillSpawnOptions() {
78
+ return { detached: process.platform !== "win32" };
79
+ }
80
+ //# sourceMappingURL=kill-tree.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"kill-tree.js","sourceRoot":"","sources":["../src/kill-tree.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAAE,KAAK,EAAqB,MAAM,oBAAoB,CAAC;AAE9D,MAAM,cAAc,GAAG,IAAI,GAAG,EAAU,CAAC;AAEzC,sDAAsD;AACtD,MAAM,UAAU,kBAAkB;IAChC,cAAc,CAAC,KAAK,EAAE,CAAC;AACzB,CAAC;AAED,mEAAmE;AACnE,MAAM,UAAU,UAAU,CAAC,GAAW;IACpC,IAAI,CAAC,GAAG,IAAI,GAAG,IAAI,CAAC;QAAE,OAAO,KAAK,CAAC;IACnC,IAAI,CAAC;QACH,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;QACrB,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAQ,GAA6B,CAAC,IAAI,KAAK,OAAO,CAAC;IACzD,CAAC;AACH,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,eAAe,CAAC,KAAmB,EAAE,SAAyB,SAAS;IACrF,MAAM,GAAG,GAAG,KAAK,CAAC,GAAG,CAAC;IACtB,IAAI,CAAC,GAAG,IAAI,GAAG,IAAI,CAAC;QAAE,OAAO,KAAK,CAAC;IACnC,IAAI,cAAc,CAAC,GAAG,CAAC,GAAG,CAAC;QAAE,OAAO,IAAI,CAAC;IACzC,cAAc,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAExB,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO,EAAE,CAAC;QACjC,KAAK,CAAC,UAAU,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE;YACnD,WAAW,EAAE,IAAI;YACjB,KAAK,EAAE,QAAQ;SAChB,CAAC,CAAC,KAAK,EAAE,CAAC;QACX,OAAO,IAAI,CAAC;IACd,CAAC;IAED,wEAAwE;IACxE,IAAI,CAAC;QACH,OAAO,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;IAC7B,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAK,GAA6B,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;YACpD,4CAA4C;YAC5C,OAAO,IAAI,CAAC;QACd,CAAC;QACD,IAAI,CAAC;YACH,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;QAC5B,CAAC;QAAC,MAAM,CAAC;YACP,gBAAgB;QAClB,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,oBAAoB;IAClC,OAAO,EAAE,QAAQ,EAAE,OAAO,CAAC,QAAQ,KAAK,OAAO,EAAE,CAAC;AACpD,CAAC"}
@@ -1,11 +1,13 @@
1
- import type { ToolDefinition } from "./definitions.js";
1
+ import type { ToolDefinition, ToolRisk } from "./definitions.js";
2
2
  import { ToolRegistry } from "./registry.js";
3
+ /** A tool registered for lazy, on-demand construction. */
3
4
  export interface LazyToolEntry {
4
5
  id: string;
5
- risk?: "low" | "medium" | "high";
6
+ risk?: ToolRisk;
6
7
  factory: () => Promise<ToolDefinition>;
7
8
  instance?: ToolDefinition;
8
9
  }
10
+ /** A {@link ToolRegistry} that constructs tools lazily on first resolve. */
9
11
  export declare class LazyToolRegistry extends ToolRegistry {
10
12
  private entries;
11
13
  private loading;
@@ -13,7 +15,7 @@ export declare class LazyToolRegistry extends ToolRegistry {
13
15
  resolve(id: string): Promise<ToolDefinition | undefined>;
14
16
  register(tool: ToolDefinition): void;
15
17
  unregister(id: string): boolean;
16
- list(): ToolDefinition[];
18
+ list(): readonly ToolDefinition[];
17
19
  listLazy(): LazyToolEntry[];
18
20
  count(): number;
19
21
  getOrThrow(id: string): ToolDefinition;
@@ -1 +1 @@
1
- {"version":3,"file":"lazy-registry.d.ts","sourceRoot":"","sources":["../src/lazy-registry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAG7C,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,CAAC,EAAE,KAAK,GAAG,QAAQ,GAAG,MAAM,CAAC;IACjC,OAAO,EAAE,MAAM,OAAO,CAAC,cAAc,CAAC,CAAC;IACvC,QAAQ,CAAC,EAAE,cAAc,CAAC;CAC3B;AAED,qBAAa,gBAAiB,SAAQ,YAAY;IAChD,OAAO,CAAC,OAAO,CAAoC;IACnD,OAAO,CAAC,OAAO,CAA8C;IAE7D,YAAY,CAAC,KAAK,EAAE,aAAa,GAAG,IAAI;IAIlC,OAAO,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,GAAG,SAAS,CAAC;IAkBrD,QAAQ,CAAC,IAAI,EAAE,cAAc,GAAG,IAAI;IAKpC,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO;IAI/B,IAAI,IAAI,cAAc,EAAE;IAMjC,QAAQ,IAAI,aAAa,EAAE;IAIlB,KAAK,IAAI,MAAM;IAIf,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,cAAc;IAM/C,QAAQ,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO;IAIvB,UAAU,IAAI,OAAO,CAAC,cAAc,EAAE,CAAC;CAQ9C"}
1
+ {"version":3,"file":"lazy-registry.d.ts","sourceRoot":"","sources":["../src/lazy-registry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AACjE,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAG7C,0DAA0D;AAC1D,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,CAAC,EAAE,QAAQ,CAAC;IAChB,OAAO,EAAE,MAAM,OAAO,CAAC,cAAc,CAAC,CAAC;IACvC,QAAQ,CAAC,EAAE,cAAc,CAAC;CAC3B;AAED,4EAA4E;AAC5E,qBAAa,gBAAiB,SAAQ,YAAY;IAChD,OAAO,CAAC,OAAO,CAAoC;IACnD,OAAO,CAAC,OAAO,CAA8C;IAE7D,YAAY,CAAC,KAAK,EAAE,aAAa,GAAG,IAAI;IAIlC,OAAO,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,GAAG,SAAS,CAAC;IAkBrD,QAAQ,CAAC,IAAI,EAAE,cAAc,GAAG,IAAI;IAKpC,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO;IAI/B,IAAI,IAAI,SAAS,cAAc,EAAE;IAM1C,QAAQ,IAAI,aAAa,EAAE;IAIlB,KAAK,IAAI,MAAM;IAIf,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,cAAc;IAM/C,QAAQ,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO;IAIvB,UAAU,IAAI,OAAO,CAAC,cAAc,EAAE,CAAC;CAQ9C"}
@@ -1,5 +1,6 @@
1
1
  import { ToolRegistry } from "./registry.js";
2
2
  import { ToolNotFoundError } from "@vinhnt-sdk/schema";
3
+ /** A {@link ToolRegistry} that constructs tools lazily on first resolve. */
3
4
  export class LazyToolRegistry extends ToolRegistry {
4
5
  entries = new Map();
5
6
  loading = new Map();
@@ -1 +1 @@
1
- {"version":3,"file":"lazy-registry.js","sourceRoot":"","sources":["../src/lazy-registry.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"lazy-registry.js","sourceRoot":"","sources":["../src/lazy-registry.ts"],"names":[],"mappings":"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"}
package/dist/policy.d.ts CHANGED
@@ -1,4 +1,5 @@
1
1
  import type { ToolDefinition } from "./definitions.js";
2
+ /** Handler contract for requesting human approval of a tool call. */
2
3
  export interface ApprovalHandler {
3
4
  requestApproval(tool: ToolDefinition, input: unknown): Promise<boolean>;
4
5
  }
@@ -1 +1 @@
1
- {"version":3,"file":"policy.d.ts","sourceRoot":"","sources":["../src/policy.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAEvD,MAAM,WAAW,eAAe;IAC9B,eAAe,CAAC,IAAI,EAAE,cAAc,EAAE,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;CACzE"}
1
+ {"version":3,"file":"policy.d.ts","sourceRoot":"","sources":["../src/policy.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAEvD,qEAAqE;AACrE,MAAM,WAAW,eAAe;IAC9B,eAAe,CAAC,IAAI,EAAE,cAAc,EAAE,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;CACzE"}
@@ -1 +1 @@
1
- {"version":3,"file":"builtin-provider.d.ts","sourceRoot":"","sources":["../../src/providers/builtin-provider.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AACnD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAKxD,OAAO,EAAuB,KAAK,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAKpF,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AACxD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAEnD,MAAM,WAAW,iBAAiB;IAChC,aAAa,EAAE,MAAM,GAAG,CAAC,MAAM,MAAM,CAAC,CAAC;IACvC,KAAK,EAAE,eAAe,CAAC;IACvB,kDAAkD;IAClD,iBAAiB,CAAC,EAAE,iBAAiB,CAAC;IACtC;;;OAGG;IACH,eAAe,CAAC,EAAE,MAAM,GAAG,CAAC,MAAM,MAAM,CAAC,CAAC;CAC3C;AAED;;;;;GAKG;AACH,qBAAa,mBAAoB,YAAW,YAAY;IACtD,QAAQ,CAAC,EAAE,aAAa;IACxB,QAAQ,CAAC,IAAI,oBAAoB;IACjC,QAAQ,CAAC,WAAW,iEAAiE;IAErF,OAAO,CAAC,MAAM,CAAiC;IAC/C,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAoB;gBAE/B,MAAM,EAAE,iBAAiB;IAIrC,IAAI,KAAK,IAAI,cAAc,EAAE,CAK5B;IAED,OAAO,CAAC,WAAW;IAqCnB,OAAO,CAAC,mBAAmB;IAuB3B,QAAQ,CAAC,SAAS,EAAE,YAAY,GAAG,IAAI;IAIvC,UAAU,CAAC,SAAS,EAAE,YAAY,GAAG,IAAI;CAG1C"}
1
+ {"version":3,"file":"builtin-provider.d.ts","sourceRoot":"","sources":["../../src/providers/builtin-provider.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AACnD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAKxD,OAAO,EAAuB,KAAK,iBAAiB,EAAwB,MAAM,uBAAuB,CAAC;AAK1G,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AACxD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAEnD,MAAM,WAAW,iBAAiB;IAChC,aAAa,EAAE,MAAM,GAAG,CAAC,MAAM,MAAM,CAAC,CAAC;IACvC,KAAK,EAAE,eAAe,CAAC;IACvB,kDAAkD;IAClD,iBAAiB,CAAC,EAAE,iBAAiB,CAAC;IACtC;;;OAGG;IACH,eAAe,CAAC,EAAE,MAAM,GAAG,CAAC,MAAM,MAAM,CAAC,CAAC;CAC3C;AAED;;;;;GAKG;AACH,qBAAa,mBAAoB,YAAW,YAAY;IACtD,QAAQ,CAAC,EAAE,aAAa;IACxB,QAAQ,CAAC,IAAI,oBAAoB;IACjC,QAAQ,CAAC,WAAW,iEAAiE;IAErF,OAAO,CAAC,MAAM,CAAiC;IAC/C,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAoB;gBAE/B,MAAM,EAAE,iBAAiB;IAIrC,IAAI,KAAK,IAAI,cAAc,EAAE,CAK5B;IAED,OAAO,CAAC,WAAW;IAqCnB,OAAO,CAAC,mBAAmB;IAoB3B,QAAQ,CAAC,SAAS,EAAE,YAAY,GAAG,IAAI;IAIvC,UAAU,CAAC,SAAS,EAAE,YAAY,GAAG,IAAI;CAG1C"}
@@ -2,7 +2,7 @@ import { createReadFileTool, createWriteFileTool, createEditFileTool, createAppl
2
2
  import { createShellTool } from "../shell-tool.js";
3
3
  import { createGlobFilesTool, createGrepFilesTool } from "../search-tools.js";
4
4
  import { createWebFetchTool } from "../web-tools.js";
5
- import { createWebSearchTool } from "../web-search-tool.js";
5
+ import { createWebSearchTool, TavilySearchProvider } from "../web-search-tool.js";
6
6
  import { createGitStatusTool, createGitDiffTool, createGitLogTool, createGitCommitTool } from "../git-tools.js";
7
7
  import { createTodoWriteTool } from "../todo-tool.js";
8
8
  import { createQuestionTool } from "../question-tool.js";
@@ -64,9 +64,6 @@ export class BuiltinToolProvider {
64
64
  }
65
65
  if (webSearchApiKey) {
66
66
  // Backward compatibility: create TavilySearchProvider from API key
67
- // Note: This imports TavilySearchProvider lazily to avoid circular deps
68
- // and to keep it optional
69
- const { TavilySearchProvider } = require("../web-search-tool.js");
70
67
  const apiKey = typeof webSearchApiKey === "function" ? webSearchApiKey() : webSearchApiKey;
71
68
  if (apiKey) {
72
69
  return [createWebSearchTool({
@@ -1 +1 @@
1
- {"version":3,"file":"builtin-provider.js","sourceRoot":"","sources":["../../src/providers/builtin-provider.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"builtin-provider.js","sourceRoot":"","sources":["../../src/providers/builtin-provider.ts"],"names":[],"mappings":"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"}
@@ -19,12 +19,30 @@ export declare class ToolFileProvider implements ToolProvider {
19
19
  }
20
20
  /**
21
21
  * ToolFileLoader — Discovers and loads tools from .vnt/tools/ directories.
22
+ *
23
+ * Files are verified before import (RV-48): symlinks are rejected, the file
24
+ * must resolve back inside its source directory, and an optional SHA-256 hash
25
+ * pin can be enforced so a swapped file is never executed.
22
26
  */
23
27
  export declare class ToolFileLoader {
24
28
  /**
25
29
  * Load tools from a single directory.
30
+ *
31
+ * @param dir - Directory to scan for `.ts`/`.js` tool files.
32
+ * @param hashes - Optional `{ fileName: sha256Hex }` pins — files whose
33
+ * content hash does not match are skipped (never imported).
34
+ */
35
+ loadFromDirectory(dir: string, hashes?: Record<string, string>): Promise<ToolDefinition[]>;
36
+ /**
37
+ * Verify a candidate tool file before importing it:
38
+ * 1. Rejects symlinks outright (closes the TOCTOU window between listing and
39
+ * import — Dirent already filters most symlinks, this is belt-and-braces).
40
+ * 2. The canonical real path must resolve back INSIDE the source directory —
41
+ * a file that escapes its directory is never executed.
42
+ * 3. Optional SHA-256 hash pin: when a hash is supplied for this file, a
43
+ * mismatch means the content changed on disk — skip, do not import.
26
44
  */
27
- loadFromDirectory(dir: string): Promise<ToolDefinition[]>;
45
+ private isVerifiedFile;
28
46
  /**
29
47
  * Load a single tool from a file.
30
48
  */
@@ -42,6 +60,6 @@ export declare class ToolFileLoader {
42
60
  *
43
61
  * Workspace tools override global tools with the same name.
44
62
  */
45
- discover(workspaceRoot: string): Promise<ToolFileProvider>;
63
+ discover(workspaceRoot: string, hashes?: Record<string, string>): Promise<ToolFileProvider>;
46
64
  }
47
65
  //# sourceMappingURL=file-loader.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"file-loader.d.ts","sourceRoot":"","sources":["../../src/providers/file-loader.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AACnD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACxD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAEnD;;;;;GAKG;AACH,qBAAa,gBAAiB,YAAW,YAAY;IACnD,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,WAAW,yCAAyC;IAE7D,OAAO,CAAC,MAAM,CAAwB;gBAGpC,EAAE,EAAE,MAAM,EACV,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,cAAc,EAAE;IAOzB,IAAI,KAAK,IAAI,cAAc,EAAE,CAE5B;IAED,QAAQ,CAAC,SAAS,EAAE,YAAY,GAAG,IAAI;IAIvC,UAAU,CAAC,SAAS,EAAE,YAAY,GAAG,IAAI;CAG1C;AAED;;GAEG;AACH,qBAAa,cAAc;IACzB;;OAEG;IACG,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC;IA2B/D;;OAEG;YACW,gBAAgB;IAmB9B;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAYxB;;;;;;;;OAQG;IACG,QAAQ,CAAC,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC;CAyBjE"}
1
+ {"version":3,"file":"file-loader.d.ts","sourceRoot":"","sources":["../../src/providers/file-loader.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AACnD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACxD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAEnD;;;;;GAKG;AACH,qBAAa,gBAAiB,YAAW,YAAY;IACnD,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,WAAW,yCAAyC;IAE7D,OAAO,CAAC,MAAM,CAAwB;gBAGpC,EAAE,EAAE,MAAM,EACV,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,cAAc,EAAE;IAOzB,IAAI,KAAK,IAAI,cAAc,EAAE,CAE5B;IAED,QAAQ,CAAC,SAAS,EAAE,YAAY,GAAG,IAAI;IAIvC,UAAU,CAAC,SAAS,EAAE,YAAY,GAAG,IAAI;CAG1C;AAED;;;;;;GAMG;AACH,qBAAa,cAAc;IACzB;;;;;;OAMG;IACG,iBAAiB,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC;IA4BhG;;;;;;;;OAQG;YACW,cAAc;IAe5B;;OAEG;YACW,gBAAgB;IAmB9B;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAYxB;;;;;;;;OAQG;IACG,QAAQ,CAAC,aAAa,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC,gBAAgB,CAAC;CAyBlG"}
@@ -1,5 +1,6 @@
1
- import { readdir } from "node:fs/promises";
2
- import { join } from "node:path";
1
+ import { readdir, lstat, realpath, readFile } from "node:fs/promises";
2
+ import { createHash } from "node:crypto";
3
+ import { join, relative, isAbsolute } from "node:path";
3
4
  import { pathToFileURL } from "node:url";
4
5
  /**
5
6
  * ToolFileProvider — Loads tools from .vnt/tools/ directories.
@@ -29,12 +30,20 @@ export class ToolFileProvider {
29
30
  }
30
31
  /**
31
32
  * ToolFileLoader — Discovers and loads tools from .vnt/tools/ directories.
33
+ *
34
+ * Files are verified before import (RV-48): symlinks are rejected, the file
35
+ * must resolve back inside its source directory, and an optional SHA-256 hash
36
+ * pin can be enforced so a swapped file is never executed.
32
37
  */
33
38
  export class ToolFileLoader {
34
39
  /**
35
40
  * Load tools from a single directory.
41
+ *
42
+ * @param dir - Directory to scan for `.ts`/`.js` tool files.
43
+ * @param hashes - Optional `{ fileName: sha256Hex }` pins — files whose
44
+ * content hash does not match are skipped (never imported).
36
45
  */
37
- async loadFromDirectory(dir) {
46
+ async loadFromDirectory(dir, hashes) {
38
47
  const tools = [];
39
48
  try {
40
49
  const entries = await readdir(dir, { withFileTypes: true });
@@ -45,6 +54,8 @@ export class ToolFileLoader {
45
54
  continue;
46
55
  const filePath = join(dir, entry.name);
47
56
  try {
57
+ if (!(await this.isVerifiedFile(filePath, dir, hashes?.[entry.name])))
58
+ continue;
48
59
  const tool = await this.loadToolFromFile(filePath);
49
60
  if (tool) {
50
61
  tools.push(tool);
@@ -60,6 +71,30 @@ export class ToolFileLoader {
60
71
  }
61
72
  return tools;
62
73
  }
74
+ /**
75
+ * Verify a candidate tool file before importing it:
76
+ * 1. Rejects symlinks outright (closes the TOCTOU window between listing and
77
+ * import — Dirent already filters most symlinks, this is belt-and-braces).
78
+ * 2. The canonical real path must resolve back INSIDE the source directory —
79
+ * a file that escapes its directory is never executed.
80
+ * 3. Optional SHA-256 hash pin: when a hash is supplied for this file, a
81
+ * mismatch means the content changed on disk — skip, do not import.
82
+ */
83
+ async isVerifiedFile(filePath, dir, expectedHash) {
84
+ const st = await lstat(filePath);
85
+ if (st.isSymbolicLink())
86
+ return false;
87
+ const [realDir, realFile] = await Promise.all([realpath(dir), realpath(filePath)]);
88
+ if (!isWithin(realDir, realFile))
89
+ return false;
90
+ if (expectedHash !== undefined) {
91
+ const content = await readFile(realFile);
92
+ const actual = createHash("sha256").update(content).digest("hex");
93
+ if (actual !== expectedHash)
94
+ return false;
95
+ }
96
+ return true;
97
+ }
63
98
  /**
64
99
  * Load a single tool from a file.
65
100
  */
@@ -99,13 +134,13 @@ export class ToolFileLoader {
99
134
  *
100
135
  * Workspace tools override global tools with the same name.
101
136
  */
102
- async discover(workspaceRoot) {
137
+ async discover(workspaceRoot, hashes) {
103
138
  const globalDir = join(process.env.HOME || process.env.USERPROFILE || "", ".vnt", "tools");
104
139
  const workspaceDir = join(workspaceRoot, ".vnt", "tools");
105
140
  // Load global tools first
106
- const globalTools = await this.loadFromDirectory(globalDir);
141
+ const globalTools = await this.loadFromDirectory(globalDir, hashes);
107
142
  // Load workspace tools (overrides global)
108
- const workspaceTools = await this.loadFromDirectory(workspaceDir);
143
+ const workspaceTools = await this.loadFromDirectory(workspaceDir, hashes);
109
144
  // Merge: workspace overrides global by name
110
145
  const toolMap = new Map();
111
146
  for (const tool of globalTools) {
@@ -117,4 +152,9 @@ export class ToolFileLoader {
117
152
  return new ToolFileProvider("user-tools", "User Tools", [...toolMap.values()]);
118
153
  }
119
154
  }
155
+ /** True when `child` is strictly inside `parent` (path-segment safe). */
156
+ function isWithin(parent, child) {
157
+ const rel = relative(parent, child);
158
+ return rel !== "" && !rel.startsWith("..") && !isAbsolute(rel);
159
+ }
120
160
  //# sourceMappingURL=file-loader.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"file-loader.js","sourceRoot":"","sources":["../../src/providers/file-loader.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"file-loader.js","sourceRoot":"","sources":["../../src/providers/file-loader.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,2 @@
1
- export { BuiltinToolProvider } from "./builtin-provider.js";
2
- export type { BuiltinToolConfig } from "./builtin-provider.js";
3
1
  export { ToolFileProvider, ToolFileLoader } from "./file-loader.js";
4
- export { AgentToolProvider } from "./agent-provider.js";
5
- export { SkillToolProvider } from "./skill-provider.js";
6
2
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/providers/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAC5D,YAAY,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAC/D,OAAO,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AACpE,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/providers/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC"}
@@ -1,5 +1,2 @@
1
- export { BuiltinToolProvider } from "./builtin-provider.js";
2
1
  export { ToolFileProvider, ToolFileLoader } from "./file-loader.js";
3
- export { AgentToolProvider } from "./agent-provider.js";
4
- export { SkillToolProvider } from "./skill-provider.js";
5
2
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/providers/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAE5D,OAAO,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AACpE,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/providers/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC"}
@@ -1,14 +1,20 @@
1
+ /** Input for the `question` tool. */
1
2
  export interface QuestionInput {
2
3
  header: string;
3
4
  question: string;
4
5
  options?: {
5
6
  label: string;
6
- description?: string;
7
+ description?: string | undefined;
7
8
  }[] | undefined;
8
- multiple?: boolean;
9
+ multiple?: boolean | undefined;
9
10
  }
11
+ /** Resolver that returns the user's answer for a {@link QuestionInput}. */
10
12
  export type QuestionHandler = (question: QuestionInput) => Promise<string>;
11
- export declare function createQuestionTool(handler?: QuestionHandler): import("./definitions.js").ToolDefinition<QuestionInput, {
13
+ /**
14
+ * Create the `question` tool that asks the user a question (with optional
15
+ * predefined options). Pass a {@link QuestionHandler} to resolve answers.
16
+ */
17
+ export declare function createQuestionTool(handler?: QuestionHandler): import("@vinhnt-sdk/tools").ToolDefinition<QuestionInput, {
12
18
  answer: string;
13
19
  error?: string;
14
20
  }>;
@@ -1 +1 @@
1
- {"version":3,"file":"question-tool.d.ts","sourceRoot":"","sources":["../src/question-tool.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,WAAW,CAAC,EAAE,MAAM,CAAA;KAAE,EAAE,GAAG,SAAS,CAAC;IAChE,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,MAAM,eAAe,GAAG,CAAC,QAAQ,EAAE,aAAa,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;AAY3E,wBAAgB,kBAAkB,CAAC,OAAO,CAAC,EAAE,eAAe;YACf,MAAM;YAAU,MAAM;GAqClE"}
1
+ {"version":3,"file":"question-tool.d.ts","sourceRoot":"","sources":["../src/question-tool.ts"],"names":[],"mappings":"AAGA,qCAAqC;AACrC,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,WAAW,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;KAAE,EAAE,GAAG,SAAS,CAAC;IAC5E,QAAQ,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;CAChC;AAED,2EAA2E;AAC3E,MAAM,MAAM,eAAe,GAAG,CAAC,QAAQ,EAAE,aAAa,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;AAY3E;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,CAAC,EAAE,eAAe;YACf,MAAM;YAAU,MAAM;GAqClE"}
@@ -1,5 +1,5 @@
1
1
  import { z } from "zod";
2
- import { defineTool } from "./define-tool.js";
2
+ import { defineTool } from "@vinhnt-sdk/tools";
3
3
  const QuestionSchema = z.object({
4
4
  header: z.string().min(1).max(30),
5
5
  question: z.string().min(1),
@@ -9,6 +9,10 @@ const QuestionSchema = z.object({
9
9
  })).min(1).max(6).optional(),
10
10
  multiple: z.boolean().optional(),
11
11
  });
12
+ /**
13
+ * Create the `question` tool that asks the user a question (with optional
14
+ * predefined options). Pass a {@link QuestionHandler} to resolve answers.
15
+ */
12
16
  export function createQuestionTool(handler) {
13
17
  return defineTool({
14
18
  name: "question",
@@ -1 +1 @@
1
- {"version":3,"file":"question-tool.js","sourceRoot":"","sources":["../src/question-tool.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAW9C,MAAM,cAAc,GAAG,CAAC,CAAC,MAAM,CAAC;IAC9B,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC;IACjC,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IAC3B,OAAO,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC;QACxB,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;QACxB,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;KACnC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE;IAC5B,QAAQ,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE;CACjC,CAAC,CAAC;AAEH,MAAM,UAAU,kBAAkB,CAAC,OAAyB;IAC1D,OAAO,UAAU,CAAoD;QACnE,IAAI,EAAE,UAAU;QAChB,WAAW,EAAE,qKAAqK;QAClL,IAAI,EAAE,UAAU;QAChB,KAAK,EAAE,cAAc;QACrB,UAAU,EAAE;YACV,IAAI,EAAE,QAAQ;YACd,UAAU,EAAE;gBACV,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,wDAAwD,EAAE;gBACjG,QAAQ,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,8BAA8B,EAAE;gBACzE,OAAO,EAAE;oBACP,IAAI,EAAE,OAAO;oBACb,KAAK,EAAE;wBACL,IAAI,EAAE,QAAQ;wBACd,UAAU,EAAE;4BACV,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,4BAA4B,EAAE;4BACpE,WAAW,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,sBAAsB,EAAE;yBACrE;wBACD,QAAQ,EAAE,CAAC,OAAO,CAAC;qBACpB;oBACD,WAAW,EAAE,kDAAkD;iBAChE;gBACD,QAAQ,EAAE;oBACR,IAAI,EAAE,SAAS;oBACf,WAAW,EAAE,mDAAmD;iBACjE;aACF;YACD,QAAQ,EAAE,CAAC,QAAQ,EAAE,UAAU,CAAC;SACjC;QACD,KAAK,CAAC,OAAO,CAAC,CAAC;YACb,IAAI,CAAC,OAAO,EAAE,CAAC;gBACb,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE,KAAK,EAAE,gCAAgC,EAAE,CAAC;YACjE,CAAC;YACD,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,CAAC,CAAC,CAAC;YAChC,OAAO,EAAE,MAAM,EAAE,CAAC;QACpB,CAAC;KACF,CAAC,CAAC,YAAY,EAAE,CAAC;AACpB,CAAC"}
1
+ {"version":3,"file":"question-tool.js","sourceRoot":"","sources":["../src/question-tool.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAa/C,MAAM,cAAc,GAAG,CAAC,CAAC,MAAM,CAAC;IAC9B,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC;IACjC,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IAC3B,OAAO,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC;QACxB,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;QACxB,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;KACnC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE;IAC5B,QAAQ,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE;CACjC,CAAC,CAAC;AAEH;;;GAGG;AACH,MAAM,UAAU,kBAAkB,CAAC,OAAyB;IAC1D,OAAO,UAAU,CAAoD;QACnE,IAAI,EAAE,UAAU;QAChB,WAAW,EAAE,qKAAqK;QAClL,IAAI,EAAE,UAAU;QAChB,KAAK,EAAE,cAAc;QACrB,UAAU,EAAE;YACV,IAAI,EAAE,QAAQ;YACd,UAAU,EAAE;gBACV,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,wDAAwD,EAAE;gBACjG,QAAQ,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,8BAA8B,EAAE;gBACzE,OAAO,EAAE;oBACP,IAAI,EAAE,OAAO;oBACb,KAAK,EAAE;wBACL,IAAI,EAAE,QAAQ;wBACd,UAAU,EAAE;4BACV,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,4BAA4B,EAAE;4BACpE,WAAW,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,sBAAsB,EAAE;yBACrE;wBACD,QAAQ,EAAE,CAAC,OAAO,CAAC;qBACpB;oBACD,WAAW,EAAE,kDAAkD;iBAChE;gBACD,QAAQ,EAAE;oBACR,IAAI,EAAE,SAAS;oBACf,WAAW,EAAE,mDAAmD;iBACjE;aACF;YACD,QAAQ,EAAE,CAAC,QAAQ,EAAE,UAAU,CAAC;SACjC;QACD,KAAK,CAAC,OAAO,CAAC,CAAC;YACb,IAAI,CAAC,OAAO,EAAE,CAAC;gBACb,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE,KAAK,EAAE,gCAAgC,EAAE,CAAC;YACjE,CAAC;YACD,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,CAAC,CAAC,CAAC;YAChC,OAAO,EAAE,MAAM,EAAE,CAAC;QACpB,CAAC;KACF,CAAC,CAAC,YAAY,EAAE,CAAC;AACpB,CAAC"}
@@ -1,6 +1,15 @@
1
+ import type { Stats } from "node:fs";
2
+ /**
3
+ * Tracks when files were read and enforces read-before-write: writes to a
4
+ * file that was never read (or changed externally since) are denied.
5
+ *
6
+ * Records are keyed by canonical real path and snapshotted with inode + size
7
+ * + mtime so external replacement (delete/recreate, rename over) is caught
8
+ * even when the modification time happens to be unchanged.
9
+ */
1
10
  export declare class FileReadTracker {
2
11
  private records;
3
- trackRead(filePath: string, mtimeMs: number): void;
12
+ trackRead(filePath: string, st: Stats): Promise<void>;
4
13
  assertWasRead(filePath: string): Promise<void>;
5
14
  clear(filePath: string): void;
6
15
  reset(): void;
@@ -1 +1 @@
1
- {"version":3,"file":"read-tracker.d.ts","sourceRoot":"","sources":["../src/read-tracker.ts"],"names":[],"mappings":"AAQA,qBAAa,eAAe;IAC1B,OAAO,CAAC,OAAO,CAAiC;IAEhD,SAAS,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI;IAI5C,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAuBpD,KAAK,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI;IAI7B,KAAK,IAAI,IAAI;CAGd"}
1
+ {"version":3,"file":"read-tracker.d.ts","sourceRoot":"","sources":["../src/read-tracker.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAqBrC;;;;;;;GAOG;AACH,qBAAa,eAAe;IAC1B,OAAO,CAAC,OAAO,CAAiC;IAE1C,SAAS,CAAC,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC;IAWrD,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IA6BpD,KAAK,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI;IAI7B,KAAK,IAAI,IAAI;CAGd"}
@@ -1,26 +1,56 @@
1
- import { stat } from "node:fs/promises";
1
+ import { realpath, stat } from "node:fs/promises";
2
2
  import { ToolPermissionDenied } from "@vinhnt-sdk/schema";
3
+ /** Resolve a file path to its canonical real path (RV-47) so symlinked and
4
+ * differently-spelled aliases of the same file share one tracker record. */
5
+ async function resolveKey(filePath) {
6
+ try {
7
+ return await realpath(filePath);
8
+ }
9
+ catch {
10
+ return filePath;
11
+ }
12
+ }
13
+ /**
14
+ * Tracks when files were read and enforces read-before-write: writes to a
15
+ * file that was never read (or changed externally since) are denied.
16
+ *
17
+ * Records are keyed by canonical real path and snapshotted with inode + size
18
+ * + mtime so external replacement (delete/recreate, rename over) is caught
19
+ * even when the modification time happens to be unchanged.
20
+ */
3
21
  export class FileReadTracker {
4
22
  records = new Map();
5
- trackRead(filePath, mtimeMs) {
6
- this.records.set(filePath, { readAt: Date.now(), mtimeMs });
23
+ async trackRead(filePath, st) {
24
+ const key = await resolveKey(filePath);
25
+ this.records.set(key, {
26
+ readAt: Date.now(),
27
+ ino: st.ino,
28
+ size: st.size,
29
+ ctimeMs: st.ctimeMs,
30
+ mtimeMs: st.mtimeMs,
31
+ });
7
32
  }
8
33
  async assertWasRead(filePath) {
9
- const record = this.records.get(filePath);
34
+ const key = await resolveKey(filePath);
35
+ const record = this.records.get(key);
10
36
  if (!record) {
11
37
  throw new ToolPermissionDenied("write_file", `File "${filePath}" has not been read before writing. Use read_file first.`);
12
38
  }
13
39
  try {
14
- const st = await stat(filePath);
15
- if (st.mtimeMs !== record.mtimeMs) {
16
- this.records.delete(filePath);
40
+ const st = await stat(key);
41
+ const changed = st.ino !== record.ino ||
42
+ st.size !== record.size ||
43
+ st.ctimeMs !== record.ctimeMs ||
44
+ st.mtimeMs !== record.mtimeMs;
45
+ if (changed) {
46
+ this.records.delete(key);
17
47
  throw new ToolPermissionDenied("write_file", `File "${filePath}" has been modified externally since it was last read. Read it again before writing.`);
18
48
  }
19
49
  }
20
50
  catch (err) {
21
51
  if (err instanceof ToolPermissionDenied)
22
52
  throw err;
23
- this.records.delete(filePath);
53
+ this.records.delete(key);
24
54
  }
25
55
  }
26
56
  clear(filePath) {
@@ -1 +1 @@
1
- {"version":3,"file":"read-tracker.js","sourceRoot":"","sources":["../src/read-tracker.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AACxC,OAAO,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAO1D,MAAM,OAAO,eAAe;IAClB,OAAO,GAAG,IAAI,GAAG,EAAsB,CAAC;IAEhD,SAAS,CAAC,QAAgB,EAAE,OAAe;QACzC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC;IAC9D,CAAC;IAED,KAAK,CAAC,aAAa,CAAC,QAAgB;QAClC,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAC1C,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,MAAM,IAAI,oBAAoB,CAC5B,YAAY,EACZ,SAAS,QAAQ,0DAA0D,CAC5E,CAAC;QACJ,CAAC;QACD,IAAI,CAAC;YACH,MAAM,EAAE,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,CAAC;YAChC,IAAI,EAAE,CAAC,OAAO,KAAK,MAAM,CAAC,OAAO,EAAE,CAAC;gBAClC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;gBAC9B,MAAM,IAAI,oBAAoB,CAC5B,YAAY,EACZ,SAAS,QAAQ,sFAAsF,CACxG,CAAC;YACJ,CAAC;QACH,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,GAAG,YAAY,oBAAoB;gBAAE,MAAM,GAAG,CAAC;YACnD,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QAChC,CAAC;IACH,CAAC;IAED,KAAK,CAAC,QAAgB;QACpB,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IAChC,CAAC;IAED,KAAK;QACH,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;IACvB,CAAC;CACF"}
1
+ {"version":3,"file":"read-tracker.js","sourceRoot":"","sources":["../src/read-tracker.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AAElD,OAAO,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAU1D;6EAC6E;AAC7E,KAAK,UAAU,UAAU,CAAC,QAAgB;IACxC,IAAI,CAAC;QACH,OAAO,MAAM,QAAQ,CAAC,QAAQ,CAAC,CAAC;IAClC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,QAAQ,CAAC;IAClB,CAAC;AACH,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,OAAO,eAAe;IAClB,OAAO,GAAG,IAAI,GAAG,EAAsB,CAAC;IAEhD,KAAK,CAAC,SAAS,CAAC,QAAgB,EAAE,EAAS;QACzC,MAAM,GAAG,GAAG,MAAM,UAAU,CAAC,QAAQ,CAAC,CAAC;QACvC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE;YACpB,MAAM,EAAE,IAAI,CAAC,GAAG,EAAE;YAClB,GAAG,EAAE,EAAE,CAAC,GAAG;YACX,IAAI,EAAE,EAAE,CAAC,IAAI;YACb,OAAO,EAAE,EAAE,CAAC,OAAO;YACnB,OAAO,EAAE,EAAE,CAAC,OAAO;SACpB,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,aAAa,CAAC,QAAgB;QAClC,MAAM,GAAG,GAAG,MAAM,UAAU,CAAC,QAAQ,CAAC,CAAC;QACvC,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACrC,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,MAAM,IAAI,oBAAoB,CAC5B,YAAY,EACZ,SAAS,QAAQ,0DAA0D,CAC5E,CAAC;QACJ,CAAC;QACD,IAAI,CAAC;YACH,MAAM,EAAE,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,CAAC;YAC3B,MAAM,OAAO,GACX,EAAE,CAAC,GAAG,KAAK,MAAM,CAAC,GAAG;gBACrB,EAAE,CAAC,IAAI,KAAK,MAAM,CAAC,IAAI;gBACvB,EAAE,CAAC,OAAO,KAAK,MAAM,CAAC,OAAO;gBAC7B,EAAE,CAAC,OAAO,KAAK,MAAM,CAAC,OAAO,CAAC;YAChC,IAAI,OAAO,EAAE,CAAC;gBACZ,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;gBACzB,MAAM,IAAI,oBAAoB,CAC5B,YAAY,EACZ,SAAS,QAAQ,sFAAsF,CACxG,CAAC;YACJ,CAAC;QACH,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,GAAG,YAAY,oBAAoB;gBAAE,MAAM,GAAG,CAAC;YACnD,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAC3B,CAAC;IACH,CAAC;IAED,KAAK,CAAC,QAAgB;QACpB,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IAChC,CAAC;IAED,KAAK;QACH,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;IACvB,CAAC;CACF"}
@@ -1,5 +1,6 @@
1
1
  import type { ToolDefinition, ToolContext, ToolRisk } from "./definitions.js";
2
2
  import type { DomainManifest, DomainSummary } from "./domain.js";
3
+ /** Filter options for listing tools. */
3
4
  export type ToolFilter = {
4
5
  risk?: ToolRisk;
5
6
  ids?: string[];
@@ -11,6 +12,7 @@ export interface ToolPermissionRule {
11
12
  action: string;
12
13
  effect: "allow" | "deny" | "ask";
13
14
  }
15
+ /** Tool set materialized for the model after filtering by permission rules. */
14
16
  export interface ToolMaterialization {
15
17
  /** Provider-facing definitions the model is ALLOWED to see/invoke. */
16
18
  definitions: readonly ToolDefinition[];
@@ -25,6 +27,7 @@ export interface ToolMaterialization {
25
27
  /** Lookup a tool definition by ID from the allowed set. */
26
28
  getTool(id: string): ToolDefinition | undefined;
27
29
  }
30
+ /** Registers tools and domains, filters by permission, and materializes model-visible tool sets. */
28
31
  export declare class ToolRegistry {
29
32
  protected readonly tools: Map<string, ToolDefinition<unknown, unknown>>;
30
33
  protected readonly domains: Map<string, DomainManifest>;
@@ -1 +1 @@
1
- {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../src/registry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAG9E,OAAO,KAAK,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAIjE,MAAM,MAAM,UAAU,GAAG;IACvB,IAAI,CAAC,EAAE,QAAQ,CAAC;IAChB,GAAG,CAAC,EAAE,MAAM,EAAE,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,CAAC;AAEF,gFAAgF;AAChF,MAAM,WAAW,kBAAkB;IACjC,0DAA0D;IAC1D,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,OAAO,GAAG,MAAM,GAAG,KAAK,CAAC;CAClC;AAED,MAAM,WAAW,mBAAmB;IAClC,sEAAsE;IACtE,WAAW,EAAE,SAAS,cAAc,EAAE,CAAC;IACvC,6DAA6D;IAC7D,MAAM,EAAE,SAAS,cAAc,EAAE,CAAC;IAClC,wDAAwD;IACxD,MAAM,CAAC,KAAK,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,OAAO,CAAC;QAAC,GAAG,CAAC,EAAE,WAAW,CAAA;KAAE,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACpF,2DAA2D;IAC3D,OAAO,CAAC,EAAE,EAAE,MAAM,GAAG,cAAc,GAAG,SAAS,CAAC;CACjD;AAED,qBAAa,YAAY;IACvB,SAAS,CAAC,QAAQ,CAAC,KAAK,gDAAqC;IAC7D,SAAS,CAAC,QAAQ,CAAC,OAAO,8BAAqC;IAE/D,QAAQ,CAAC,IAAI,EAAE,cAAc,GAAG,IAAI;IAIpC,qGAAqG;IACrG,cAAc,CAAC,QAAQ,EAAE,cAAc,GAAG,IAAI;IAI9C,UAAU,IAAI,SAAS,cAAc,EAAE;IAIvC,kFAAkF;IAClF,SAAS,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IAOzC,2CAA2C;IAC3C,WAAW,IAAI,SAAS,cAAc,EAAE;IAIxC,mDAAmD;IACnD,eAAe,IAAI,aAAa,EAAE;IAIlC,gDAAgD;IAChD,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,SAAS,cAAc,EAAE;IAK3D,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO;IAI/B,GAAG,CAAC,EAAE,EAAE,MAAM,GAAG,cAAc,GAAG,SAAS;IAI3C,IAAI,CAAC,MAAM,CAAC,EAAE,UAAU,GAAG,SAAS,cAAc,EAAE;IAWpD,KAAK,IAAI,MAAM;IAIf,4DAA4D;IAC5D,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,cAAc;IAMtC;;;;OAIG;IACH,WAAW,CAAC,WAAW,CAAC,EAAE,SAAS,kBAAkB,EAAE,GAAG,mBAAmB;IAmC7E,4EAA4E;IAC5E,OAAO,CAAC,aAAa;CAWtB"}
1
+ {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../src/registry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAG9E,OAAO,KAAK,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAKjE,wCAAwC;AACxC,MAAM,MAAM,UAAU,GAAG;IACvB,IAAI,CAAC,EAAE,QAAQ,CAAC;IAChB,GAAG,CAAC,EAAE,MAAM,EAAE,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,CAAC;AAEF,gFAAgF;AAChF,MAAM,WAAW,kBAAkB;IACjC,0DAA0D;IAC1D,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,OAAO,GAAG,MAAM,GAAG,KAAK,CAAC;CAClC;AAED,+EAA+E;AAC/E,MAAM,WAAW,mBAAmB;IAClC,sEAAsE;IACtE,WAAW,EAAE,SAAS,cAAc,EAAE,CAAC;IACvC,6DAA6D;IAC7D,MAAM,EAAE,SAAS,cAAc,EAAE,CAAC;IAClC,wDAAwD;IACxD,MAAM,CAAC,KAAK,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,OAAO,CAAC;QAAC,GAAG,CAAC,EAAE,WAAW,CAAA;KAAE,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACpF,2DAA2D;IAC3D,OAAO,CAAC,EAAE,EAAE,MAAM,GAAG,cAAc,GAAG,SAAS,CAAC;CACjD;AAED,oGAAoG;AACpG,qBAAa,YAAY;IACvB,SAAS,CAAC,QAAQ,CAAC,KAAK,gDAAqC;IAC7D,SAAS,CAAC,QAAQ,CAAC,OAAO,8BAAqC;IAE/D,QAAQ,CAAC,IAAI,EAAE,cAAc,GAAG,IAAI;IAYpC,qGAAqG;IACrG,cAAc,CAAC,QAAQ,EAAE,cAAc,GAAG,IAAI;IAI9C,UAAU,IAAI,SAAS,cAAc,EAAE;IAIvC,kFAAkF;IAClF,SAAS,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IAOzC,2CAA2C;IAC3C,WAAW,IAAI,SAAS,cAAc,EAAE;IAIxC,mDAAmD;IACnD,eAAe,IAAI,aAAa,EAAE;IAIlC,gDAAgD;IAChD,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,SAAS,cAAc,EAAE;IAK3D,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO;IAI/B,GAAG,CAAC,EAAE,EAAE,MAAM,GAAG,cAAc,GAAG,SAAS;IAI3C,IAAI,CAAC,MAAM,CAAC,EAAE,UAAU,GAAG,SAAS,cAAc,EAAE;IAWpD,KAAK,IAAI,MAAM;IAIf,4DAA4D;IAC5D,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,cAAc;IAMtC;;;;OAIG;IACH,WAAW,CAAC,WAAW,CAAC,EAAE,SAAS,kBAAkB,EAAE,GAAG,mBAAmB;IAwC7E,4EAA4E;IAC5E,OAAO,CAAC,aAAa;CAWtB"}