@aigne/afs 1.11.0-beta → 1.11.0-beta.10

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 (164) hide show
  1. package/LICENSE.md +17 -84
  2. package/README.md +4 -13
  3. package/dist/_virtual/rolldown_runtime.mjs +7 -0
  4. package/dist/afs.cjs +1330 -0
  5. package/dist/afs.d.cts +275 -0
  6. package/dist/afs.d.cts.map +1 -0
  7. package/dist/afs.d.mts +275 -0
  8. package/dist/afs.d.mts.map +1 -0
  9. package/dist/afs.mjs +1331 -0
  10. package/dist/afs.mjs.map +1 -0
  11. package/dist/capabilities/index.d.mts +2 -0
  12. package/dist/capabilities/types.d.cts +100 -0
  13. package/dist/capabilities/types.d.cts.map +1 -0
  14. package/dist/capabilities/types.d.mts +100 -0
  15. package/dist/capabilities/types.d.mts.map +1 -0
  16. package/dist/capabilities/world-mapping.cjs +20 -0
  17. package/dist/capabilities/world-mapping.d.cts +139 -0
  18. package/dist/capabilities/world-mapping.d.cts.map +1 -0
  19. package/dist/capabilities/world-mapping.d.mts +139 -0
  20. package/dist/capabilities/world-mapping.d.mts.map +1 -0
  21. package/dist/capabilities/world-mapping.mjs +20 -0
  22. package/dist/capabilities/world-mapping.mjs.map +1 -0
  23. package/dist/error.cjs +63 -0
  24. package/dist/error.d.cts +39 -0
  25. package/dist/error.d.cts.map +1 -0
  26. package/dist/error.d.mts +39 -0
  27. package/dist/error.d.mts.map +1 -0
  28. package/dist/error.mjs +59 -0
  29. package/dist/error.mjs.map +1 -0
  30. package/dist/index.cjs +72 -345
  31. package/dist/index.d.cts +18 -300
  32. package/dist/index.d.mts +20 -300
  33. package/dist/index.mjs +16 -342
  34. package/dist/loader/index.cjs +110 -0
  35. package/dist/loader/index.d.cts +48 -0
  36. package/dist/loader/index.d.cts.map +1 -0
  37. package/dist/loader/index.d.mts +48 -0
  38. package/dist/loader/index.d.mts.map +1 -0
  39. package/dist/loader/index.mjs +110 -0
  40. package/dist/loader/index.mjs.map +1 -0
  41. package/dist/meta/index.cjs +4 -0
  42. package/dist/meta/index.mjs +6 -0
  43. package/dist/meta/kind.cjs +161 -0
  44. package/dist/meta/kind.d.cts +134 -0
  45. package/dist/meta/kind.d.cts.map +1 -0
  46. package/dist/meta/kind.d.mts +134 -0
  47. package/dist/meta/kind.d.mts.map +1 -0
  48. package/dist/meta/kind.mjs +157 -0
  49. package/dist/meta/kind.mjs.map +1 -0
  50. package/dist/meta/path.cjs +116 -0
  51. package/dist/meta/path.d.cts +43 -0
  52. package/dist/meta/path.d.cts.map +1 -0
  53. package/dist/meta/path.d.mts +43 -0
  54. package/dist/meta/path.d.mts.map +1 -0
  55. package/dist/meta/path.mjs +112 -0
  56. package/dist/meta/path.mjs.map +1 -0
  57. package/dist/meta/type.d.cts +96 -0
  58. package/dist/meta/type.d.cts.map +1 -0
  59. package/dist/meta/type.d.mts +96 -0
  60. package/dist/meta/type.d.mts.map +1 -0
  61. package/dist/meta/validation.cjs +77 -0
  62. package/dist/meta/validation.d.cts +19 -0
  63. package/dist/meta/validation.d.cts.map +1 -0
  64. package/dist/meta/validation.d.mts +19 -0
  65. package/dist/meta/validation.d.mts.map +1 -0
  66. package/dist/meta/validation.mjs +77 -0
  67. package/dist/meta/validation.mjs.map +1 -0
  68. package/dist/meta/well-known-kinds.cjs +228 -0
  69. package/dist/meta/well-known-kinds.d.cts +52 -0
  70. package/dist/meta/well-known-kinds.d.cts.map +1 -0
  71. package/dist/meta/well-known-kinds.d.mts +52 -0
  72. package/dist/meta/well-known-kinds.d.mts.map +1 -0
  73. package/dist/meta/well-known-kinds.mjs +219 -0
  74. package/dist/meta/well-known-kinds.mjs.map +1 -0
  75. package/dist/node_modules/.pnpm/@types_json-schema@7.0.15/node_modules/@types/json-schema/index.d.cts +141 -0
  76. package/dist/node_modules/.pnpm/@types_json-schema@7.0.15/node_modules/@types/json-schema/index.d.cts.map +1 -0
  77. package/dist/node_modules/.pnpm/@types_json-schema@7.0.15/node_modules/@types/json-schema/index.d.mts +141 -0
  78. package/dist/node_modules/.pnpm/@types_json-schema@7.0.15/node_modules/@types/json-schema/index.d.mts.map +1 -0
  79. package/dist/path.cjs +255 -0
  80. package/dist/path.d.cts +93 -0
  81. package/dist/path.d.cts.map +1 -0
  82. package/dist/path.d.mts +93 -0
  83. package/dist/path.d.mts.map +1 -0
  84. package/dist/path.mjs +249 -0
  85. package/dist/path.mjs.map +1 -0
  86. package/dist/provider/base.cjs +425 -0
  87. package/dist/provider/base.d.cts +175 -0
  88. package/dist/provider/base.d.cts.map +1 -0
  89. package/dist/provider/base.d.mts +175 -0
  90. package/dist/provider/base.d.mts.map +1 -0
  91. package/dist/provider/base.mjs +426 -0
  92. package/dist/provider/base.mjs.map +1 -0
  93. package/dist/provider/decorators.cjs +268 -0
  94. package/dist/provider/decorators.d.cts +244 -0
  95. package/dist/provider/decorators.d.cts.map +1 -0
  96. package/dist/provider/decorators.d.mts +244 -0
  97. package/dist/provider/decorators.d.mts.map +1 -0
  98. package/dist/provider/decorators.mjs +256 -0
  99. package/dist/provider/decorators.mjs.map +1 -0
  100. package/dist/provider/index.cjs +19 -0
  101. package/dist/provider/index.d.cts +5 -0
  102. package/dist/provider/index.d.mts +5 -0
  103. package/dist/provider/index.mjs +5 -0
  104. package/dist/provider/router.cjs +185 -0
  105. package/dist/provider/router.d.cts +50 -0
  106. package/dist/provider/router.d.cts.map +1 -0
  107. package/dist/provider/router.d.mts +50 -0
  108. package/dist/provider/router.d.mts.map +1 -0
  109. package/dist/provider/router.mjs +185 -0
  110. package/dist/provider/router.mjs.map +1 -0
  111. package/dist/provider/types.d.cts +113 -0
  112. package/dist/provider/types.d.cts.map +1 -0
  113. package/dist/provider/types.d.mts +113 -0
  114. package/dist/provider/types.d.mts.map +1 -0
  115. package/dist/registry.cjs +358 -0
  116. package/dist/registry.d.cts +96 -0
  117. package/dist/registry.d.cts.map +1 -0
  118. package/dist/registry.d.mts +96 -0
  119. package/dist/registry.d.mts.map +1 -0
  120. package/dist/registry.mjs +360 -0
  121. package/dist/registry.mjs.map +1 -0
  122. package/dist/type.cjs +34 -0
  123. package/dist/type.d.cts +420 -0
  124. package/dist/type.d.cts.map +1 -0
  125. package/dist/type.d.mts +420 -0
  126. package/dist/type.d.mts.map +1 -0
  127. package/dist/type.mjs +33 -0
  128. package/dist/type.mjs.map +1 -0
  129. package/dist/utils/camelize.d.cts.map +1 -1
  130. package/dist/utils/camelize.d.mts.map +1 -1
  131. package/dist/utils/schema.cjs +129 -0
  132. package/dist/utils/schema.d.cts +65 -0
  133. package/dist/utils/schema.d.cts.map +1 -0
  134. package/dist/utils/schema.d.mts +65 -0
  135. package/dist/utils/schema.d.mts.map +1 -0
  136. package/dist/utils/schema.mjs +124 -0
  137. package/dist/utils/schema.mjs.map +1 -0
  138. package/dist/utils/type-utils.d.cts.map +1 -1
  139. package/dist/utils/type-utils.d.mts.map +1 -1
  140. package/dist/utils/uri-template.cjs +123 -0
  141. package/dist/utils/uri-template.d.cts +48 -0
  142. package/dist/utils/uri-template.d.cts.map +1 -0
  143. package/dist/utils/uri-template.d.mts +48 -0
  144. package/dist/utils/uri-template.d.mts.map +1 -0
  145. package/dist/utils/uri-template.mjs +120 -0
  146. package/dist/utils/uri-template.mjs.map +1 -0
  147. package/dist/utils/uri.cjs +49 -0
  148. package/dist/utils/uri.d.cts +34 -0
  149. package/dist/utils/uri.d.cts.map +1 -0
  150. package/dist/utils/uri.d.mts +34 -0
  151. package/dist/utils/uri.d.mts.map +1 -0
  152. package/dist/utils/uri.mjs +49 -0
  153. package/dist/utils/uri.mjs.map +1 -0
  154. package/dist/utils/zod.cjs +6 -8
  155. package/dist/utils/zod.d.cts +2 -2
  156. package/dist/utils/zod.d.cts.map +1 -1
  157. package/dist/utils/zod.d.mts +2 -2
  158. package/dist/utils/zod.d.mts.map +1 -1
  159. package/dist/utils/zod.mjs +6 -8
  160. package/dist/utils/zod.mjs.map +1 -1
  161. package/package.json +27 -4
  162. package/dist/index.d.cts.map +0 -1
  163. package/dist/index.d.mts.map +0 -1
  164. package/dist/index.mjs.map +0 -1
@@ -0,0 +1,49 @@
1
+
2
+ //#region src/utils/uri.ts
3
+ /**
4
+ * Parse an AFS URI into generic components.
5
+ *
6
+ * Accepts any scheme — no hardcoded scheme validation.
7
+ * Body is returned as-is (decoded for local paths, raw for MCP/HTTP).
8
+ *
9
+ * Special handling:
10
+ * - SSH-style git URLs: git@host:path → { scheme: "git", body: "path", host: "host" }
11
+ * - HTTP/HTTPS: Uses URL API for proper host/port parsing, body = host + path
12
+ */
13
+ function parseURI(uri) {
14
+ if (!uri || uri.trim() === "") throw new Error("URI cannot be empty");
15
+ const sshGitMatch = uri.match(/^git@([^:]+):(.+)$/);
16
+ if (sshGitMatch?.[1] && sshGitMatch[2]) return {
17
+ scheme: "git",
18
+ host: sshGitMatch[1],
19
+ body: sshGitMatch[2],
20
+ query: {}
21
+ };
22
+ const schemeMatch = uri.match(/^([a-z0-9][a-z0-9+.-]*):\/\//i);
23
+ if (!schemeMatch?.[1]) throw new Error(`Invalid URI format: cannot parse scheme from URI`);
24
+ const scheme = schemeMatch[1].toLowerCase();
25
+ const withoutScheme = uri.slice(scheme.length + 3);
26
+ const queryIndex = withoutScheme.indexOf("?");
27
+ let body;
28
+ let queryString;
29
+ if (queryIndex >= 0) {
30
+ body = withoutScheme.slice(0, queryIndex);
31
+ queryString = withoutScheme.slice(queryIndex + 1);
32
+ } else body = withoutScheme;
33
+ const query = {};
34
+ if (queryString) {
35
+ const searchParams = new URLSearchParams(queryString);
36
+ for (const key of new Set(searchParams.keys())) {
37
+ const values = searchParams.getAll(key);
38
+ query[key] = values.length === 1 ? values[0] : values;
39
+ }
40
+ }
41
+ return {
42
+ scheme,
43
+ body,
44
+ query
45
+ };
46
+ }
47
+
48
+ //#endregion
49
+ exports.parseURI = parseURI;
@@ -0,0 +1,34 @@
1
+ //#region src/utils/uri.d.ts
2
+ /**
3
+ * Generic AFS URI parser.
4
+ *
5
+ * Parses any URI into { scheme, body, query } without scheme-specific logic.
6
+ * Body interpretation is delegated to provider manifests via URI templates.
7
+ */
8
+ /**
9
+ * Parsed URI result — generic, scheme-agnostic.
10
+ */
11
+ interface ParsedURI {
12
+ /** URI scheme (lowercased), e.g. "fs", "s3", "mcp+stdio" */
13
+ scheme: string;
14
+ /** URI body — everything between "://" and "?" (opaque to core) */
15
+ body: string;
16
+ /** Query parameters (multi-valued keys become arrays) */
17
+ query: Record<string, string | string[]>;
18
+ /** Host — only for SSH-style git URLs (git@host:path) */
19
+ host?: string;
20
+ }
21
+ /**
22
+ * Parse an AFS URI into generic components.
23
+ *
24
+ * Accepts any scheme — no hardcoded scheme validation.
25
+ * Body is returned as-is (decoded for local paths, raw for MCP/HTTP).
26
+ *
27
+ * Special handling:
28
+ * - SSH-style git URLs: git@host:path → { scheme: "git", body: "path", host: "host" }
29
+ * - HTTP/HTTPS: Uses URL API for proper host/port parsing, body = host + path
30
+ */
31
+ declare function parseURI(uri: string): ParsedURI;
32
+ //#endregion
33
+ export { ParsedURI, parseURI };
34
+ //# sourceMappingURL=uri.d.cts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"uri.d.cts","names":[],"sources":["../../src/utils/uri.ts"],"mappings":";;AAUA;;;;;;;;UAAiB,SAAA;EAQX;EANJ,MAAA;EAmBc;EAjBd,IAAA;;EAEA,KAAA,EAAO,MAAA;EAeuC;EAb9C,IAAA;AAAA;;;;;;;;;;;iBAac,QAAA,CAAS,GAAA,WAAc,SAAA"}
@@ -0,0 +1,34 @@
1
+ //#region src/utils/uri.d.ts
2
+ /**
3
+ * Generic AFS URI parser.
4
+ *
5
+ * Parses any URI into { scheme, body, query } without scheme-specific logic.
6
+ * Body interpretation is delegated to provider manifests via URI templates.
7
+ */
8
+ /**
9
+ * Parsed URI result — generic, scheme-agnostic.
10
+ */
11
+ interface ParsedURI {
12
+ /** URI scheme (lowercased), e.g. "fs", "s3", "mcp+stdio" */
13
+ scheme: string;
14
+ /** URI body — everything between "://" and "?" (opaque to core) */
15
+ body: string;
16
+ /** Query parameters (multi-valued keys become arrays) */
17
+ query: Record<string, string | string[]>;
18
+ /** Host — only for SSH-style git URLs (git@host:path) */
19
+ host?: string;
20
+ }
21
+ /**
22
+ * Parse an AFS URI into generic components.
23
+ *
24
+ * Accepts any scheme — no hardcoded scheme validation.
25
+ * Body is returned as-is (decoded for local paths, raw for MCP/HTTP).
26
+ *
27
+ * Special handling:
28
+ * - SSH-style git URLs: git@host:path → { scheme: "git", body: "path", host: "host" }
29
+ * - HTTP/HTTPS: Uses URL API for proper host/port parsing, body = host + path
30
+ */
31
+ declare function parseURI(uri: string): ParsedURI;
32
+ //#endregion
33
+ export { ParsedURI, parseURI };
34
+ //# sourceMappingURL=uri.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"uri.d.mts","names":[],"sources":["../../src/utils/uri.ts"],"mappings":";;AAUA;;;;;;;;UAAiB,SAAA;EAQX;EANJ,MAAA;EAmBc;EAjBd,IAAA;;EAEA,KAAA,EAAO,MAAA;EAeuC;EAb9C,IAAA;AAAA;;;;;;;;;;;iBAac,QAAA,CAAS,GAAA,WAAc,SAAA"}
@@ -0,0 +1,49 @@
1
+ //#region src/utils/uri.ts
2
+ /**
3
+ * Parse an AFS URI into generic components.
4
+ *
5
+ * Accepts any scheme — no hardcoded scheme validation.
6
+ * Body is returned as-is (decoded for local paths, raw for MCP/HTTP).
7
+ *
8
+ * Special handling:
9
+ * - SSH-style git URLs: git@host:path → { scheme: "git", body: "path", host: "host" }
10
+ * - HTTP/HTTPS: Uses URL API for proper host/port parsing, body = host + path
11
+ */
12
+ function parseURI(uri) {
13
+ if (!uri || uri.trim() === "") throw new Error("URI cannot be empty");
14
+ const sshGitMatch = uri.match(/^git@([^:]+):(.+)$/);
15
+ if (sshGitMatch?.[1] && sshGitMatch[2]) return {
16
+ scheme: "git",
17
+ host: sshGitMatch[1],
18
+ body: sshGitMatch[2],
19
+ query: {}
20
+ };
21
+ const schemeMatch = uri.match(/^([a-z0-9][a-z0-9+.-]*):\/\//i);
22
+ if (!schemeMatch?.[1]) throw new Error(`Invalid URI format: cannot parse scheme from URI`);
23
+ const scheme = schemeMatch[1].toLowerCase();
24
+ const withoutScheme = uri.slice(scheme.length + 3);
25
+ const queryIndex = withoutScheme.indexOf("?");
26
+ let body;
27
+ let queryString;
28
+ if (queryIndex >= 0) {
29
+ body = withoutScheme.slice(0, queryIndex);
30
+ queryString = withoutScheme.slice(queryIndex + 1);
31
+ } else body = withoutScheme;
32
+ const query = {};
33
+ if (queryString) {
34
+ const searchParams = new URLSearchParams(queryString);
35
+ for (const key of new Set(searchParams.keys())) {
36
+ const values = searchParams.getAll(key);
37
+ query[key] = values.length === 1 ? values[0] : values;
38
+ }
39
+ }
40
+ return {
41
+ scheme,
42
+ body,
43
+ query
44
+ };
45
+ }
46
+
47
+ //#endregion
48
+ export { parseURI };
49
+ //# sourceMappingURL=uri.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"uri.mjs","names":[],"sources":["../../src/utils/uri.ts"],"sourcesContent":["/**\n * Generic AFS URI parser.\n *\n * Parses any URI into { scheme, body, query } without scheme-specific logic.\n * Body interpretation is delegated to provider manifests via URI templates.\n */\n\n/**\n * Parsed URI result — generic, scheme-agnostic.\n */\nexport interface ParsedURI {\n /** URI scheme (lowercased), e.g. \"fs\", \"s3\", \"mcp+stdio\" */\n scheme: string;\n /** URI body — everything between \"://\" and \"?\" (opaque to core) */\n body: string;\n /** Query parameters (multi-valued keys become arrays) */\n query: Record<string, string | string[]>;\n /** Host — only for SSH-style git URLs (git@host:path) */\n host?: string;\n}\n\n/**\n * Parse an AFS URI into generic components.\n *\n * Accepts any scheme — no hardcoded scheme validation.\n * Body is returned as-is (decoded for local paths, raw for MCP/HTTP).\n *\n * Special handling:\n * - SSH-style git URLs: git@host:path → { scheme: \"git\", body: \"path\", host: \"host\" }\n * - HTTP/HTTPS: Uses URL API for proper host/port parsing, body = host + path\n */\nexport function parseURI(uri: string): ParsedURI {\n if (!uri || uri.trim() === \"\") {\n throw new Error(\"URI cannot be empty\");\n }\n\n // Handle SSH-style git URLs: git@host:path\n const sshGitMatch = uri.match(/^git@([^:]+):(.+)$/);\n if (sshGitMatch?.[1] && sshGitMatch[2]) {\n return {\n scheme: \"git\",\n host: sshGitMatch[1],\n body: sshGitMatch[2],\n query: {},\n };\n }\n\n // Extract scheme (supports compound schemes like mcp+stdio)\n const schemeMatch = uri.match(/^([a-z0-9][a-z0-9+.-]*):\\/\\//i);\n if (!schemeMatch?.[1]) {\n throw new Error(`Invalid URI format: cannot parse scheme from URI`);\n }\n\n const scheme = schemeMatch[1].toLowerCase();\n\n // Everything after \"scheme://\"\n const withoutScheme = uri.slice(scheme.length + 3);\n\n // Split body and query\n const queryIndex = withoutScheme.indexOf(\"?\");\n let body: string;\n let queryString: string | undefined;\n\n if (queryIndex >= 0) {\n body = withoutScheme.slice(0, queryIndex);\n queryString = withoutScheme.slice(queryIndex + 1);\n } else {\n body = withoutScheme;\n }\n\n // Parse query params (multi-valued keys become arrays)\n const query: Record<string, string | string[]> = {};\n if (queryString) {\n const searchParams = new URLSearchParams(queryString);\n for (const key of new Set(searchParams.keys())) {\n const values = searchParams.getAll(key);\n query[key] = values.length === 1 ? values[0]! : values;\n }\n }\n\n return {\n scheme,\n body,\n query,\n };\n}\n"],"mappings":";;;;;;;;;;;AA+BA,SAAgB,SAAS,KAAwB;AAC/C,KAAI,CAAC,OAAO,IAAI,MAAM,KAAK,GACzB,OAAM,IAAI,MAAM,sBAAsB;CAIxC,MAAM,cAAc,IAAI,MAAM,qBAAqB;AACnD,KAAI,cAAc,MAAM,YAAY,GAClC,QAAO;EACL,QAAQ;EACR,MAAM,YAAY;EAClB,MAAM,YAAY;EAClB,OAAO,EAAE;EACV;CAIH,MAAM,cAAc,IAAI,MAAM,gCAAgC;AAC9D,KAAI,CAAC,cAAc,GACjB,OAAM,IAAI,MAAM,mDAAmD;CAGrE,MAAM,SAAS,YAAY,GAAG,aAAa;CAG3C,MAAM,gBAAgB,IAAI,MAAM,OAAO,SAAS,EAAE;CAGlD,MAAM,aAAa,cAAc,QAAQ,IAAI;CAC7C,IAAI;CACJ,IAAI;AAEJ,KAAI,cAAc,GAAG;AACnB,SAAO,cAAc,MAAM,GAAG,WAAW;AACzC,gBAAc,cAAc,MAAM,aAAa,EAAE;OAEjD,QAAO;CAIT,MAAM,QAA2C,EAAE;AACnD,KAAI,aAAa;EACf,MAAM,eAAe,IAAI,gBAAgB,YAAY;AACrD,OAAK,MAAM,OAAO,IAAI,IAAI,aAAa,MAAM,CAAC,EAAE;GAC9C,MAAM,SAAS,aAAa,OAAO,IAAI;AACvC,SAAM,OAAO,OAAO,WAAW,IAAI,OAAO,KAAM;;;AAIpD,QAAO;EACL;EACA;EACA;EACD"}
@@ -11,20 +11,18 @@ function camelize(schema, { shallow = true } = {}) {
11
11
  return zod.z.preprocess((v) => require_utils_type_utils.isRecord(v) ? require_utils_camelize.camelize(v, shallow) : v, schema);
12
12
  }
13
13
  function zodParse(schema, data, options) {
14
+ const formatOptions = {
15
+ ...options?.prefix !== void 0 ? { prefix: options.prefix } : {},
16
+ prefixSeparator: options?.prefixSeparator ?? ": "
17
+ };
14
18
  if (options?.async) return schema.parseAsync(data).catch((error) => {
15
- if (error instanceof zod.z.ZodError) throw (0, zod_validation_error.fromZodError)(error, {
16
- prefix: options?.prefix,
17
- prefixSeparator: options?.prefixSeparator ?? ": "
18
- });
19
+ if (error instanceof zod.z.ZodError) throw (0, zod_validation_error.fromZodError)(error, formatOptions);
19
20
  throw error;
20
21
  });
21
22
  try {
22
23
  return schema.parse(data);
23
24
  } catch (error) {
24
- if (error instanceof zod.z.ZodError) throw (0, zod_validation_error.fromZodError)(error, {
25
- prefix: options?.prefix,
26
- prefixSeparator: options?.prefixSeparator ?? ": "
27
- });
25
+ if (error instanceof zod.z.ZodError) throw (0, zod_validation_error.fromZodError)(error, formatOptions);
28
26
  throw error;
29
27
  }
30
28
  }
@@ -1,4 +1,4 @@
1
- import { ZodEffects, ZodType, z } from "zod";
1
+ import { ZodType, z } from "zod";
2
2
 
3
3
  //#region src/utils/zod.d.ts
4
4
  declare function optionalize<T>(schema: ZodType<T>): ZodType<T | undefined>;
@@ -6,7 +6,7 @@ declare function camelize<T extends ZodType>(schema: T, {
6
6
  shallow
7
7
  }?: {
8
8
  shallow?: boolean;
9
- }): ZodEffects<T, T["_output"], any>;
9
+ }): ZodType<T["_output"]>;
10
10
  interface ZodParseOptions {
11
11
  prefix?: string;
12
12
  prefixSeparator?: string;
@@ -1 +1 @@
1
- {"version":3,"file":"zod.d.cts","names":[],"sources":["../../src/utils/zod.ts"],"mappings":";;;iBAKgB,WAAA,GAAA,CAAA,MAAA,EAAuB,OAAA,CAAQ,CAAA,IAAK,OAAA,CAAQ,CAAA;AAAA,iBAI5C,QAAA,WAAmB,OAAA,CAAA,CAAA,MAAA,EACzB,CAAA;EAAA;AAAA;EAAA,OAAA;AAAA,IAEP,UAAA,CAAW,CAAA,EAAG,CAAA;AAAA,UAIA,eAAA;EAAA,MAAA;EAAA,eAAA;EAAA,KAAA;AAAA;AAAA,iBAMD,QAAA,WAAmB,OAAA,CAAA,CAAA,MAAA,EACzB,CAAA,EAAA,IAAA,WAAA,OAAA,GAEE,IAAA,CAAK,eAAA,cAA6B,eAAA;EAAA,KAAA;AAAA,KAC3C,CAAA,CAAE,KAAA,CAAM,CAAA;AAAA,iBAEK,QAAA,WAAmB,OAAA,CAAA,CAAA,MAAA,EACzB,CAAA,EAAA,IAAA,WAAA,OAAA,EAEC,eAAA;EAAA,KAAA;AAAA,IACR,OAAA,CAAQ,CAAA,CAAE,KAAA,CAAM,CAAA"}
1
+ {"version":3,"file":"zod.d.cts","names":[],"sources":["../../src/utils/zod.ts"],"mappings":";;;iBAKgB,WAAA,GAAA,CAAe,MAAA,EAAQ,OAAA,CAAQ,CAAA,IAAK,OAAA,CAAQ,CAAA;AAAA,iBAI5C,QAAA,WAAmB,OAAA,CAAA,CACjC,MAAA,EAAQ,CAAA;EACN;AAAA;EAAoB,OAAA;AAAA,IACrB,OAAA,CAAQ,CAAA;AAAA,UAMM,eAAA;EACf,MAAA;EACA,eAAA;EACA,KAAA;AAAA;AAAA,iBAGc,QAAA,WAAmB,OAAA,CAAA,CACjC,MAAA,EAAQ,CAAA,EACR,IAAA,WACA,OAAA,GAAU,IAAA,CAAK,eAAA,cAA6B,eAAA;EAAoB,KAAA;AAAA,KAC/D,CAAA,CAAE,KAAA,CAAM,CAAA;AAAA,iBAEK,QAAA,WAAmB,OAAA,CAAA,CACjC,MAAA,EAAQ,CAAA,EACR,IAAA,WACA,OAAA,EAAS,eAAA;EAAoB,KAAA;AAAA,IAC5B,OAAA,CAAQ,CAAA,CAAE,KAAA,CAAM,CAAA"}
@@ -1,4 +1,4 @@
1
- import { ZodEffects, ZodType, z } from "zod";
1
+ import { ZodType, z } from "zod";
2
2
 
3
3
  //#region src/utils/zod.d.ts
4
4
  declare function optionalize<T>(schema: ZodType<T>): ZodType<T | undefined>;
@@ -6,7 +6,7 @@ declare function camelize<T extends ZodType>(schema: T, {
6
6
  shallow
7
7
  }?: {
8
8
  shallow?: boolean;
9
- }): ZodEffects<T, T["_output"], any>;
9
+ }): ZodType<T["_output"]>;
10
10
  interface ZodParseOptions {
11
11
  prefix?: string;
12
12
  prefixSeparator?: string;
@@ -1 +1 @@
1
- {"version":3,"file":"zod.d.mts","names":[],"sources":["../../src/utils/zod.ts"],"mappings":";;;iBAKgB,WAAA,GAAA,CAAA,MAAA,EAAuB,OAAA,CAAQ,CAAA,IAAK,OAAA,CAAQ,CAAA;AAAA,iBAI5C,QAAA,WAAmB,OAAA,CAAA,CAAA,MAAA,EACzB,CAAA;EAAA;AAAA;EAAA,OAAA;AAAA,IAEP,UAAA,CAAW,CAAA,EAAG,CAAA;AAAA,UAIA,eAAA;EAAA,MAAA;EAAA,eAAA;EAAA,KAAA;AAAA;AAAA,iBAMD,QAAA,WAAmB,OAAA,CAAA,CAAA,MAAA,EACzB,CAAA,EAAA,IAAA,WAAA,OAAA,GAEE,IAAA,CAAK,eAAA,cAA6B,eAAA;EAAA,KAAA;AAAA,KAC3C,CAAA,CAAE,KAAA,CAAM,CAAA;AAAA,iBAEK,QAAA,WAAmB,OAAA,CAAA,CAAA,MAAA,EACzB,CAAA,EAAA,IAAA,WAAA,OAAA,EAEC,eAAA;EAAA,KAAA;AAAA,IACR,OAAA,CAAQ,CAAA,CAAE,KAAA,CAAM,CAAA"}
1
+ {"version":3,"file":"zod.d.mts","names":[],"sources":["../../src/utils/zod.ts"],"mappings":";;;iBAKgB,WAAA,GAAA,CAAe,MAAA,EAAQ,OAAA,CAAQ,CAAA,IAAK,OAAA,CAAQ,CAAA;AAAA,iBAI5C,QAAA,WAAmB,OAAA,CAAA,CACjC,MAAA,EAAQ,CAAA;EACN;AAAA;EAAoB,OAAA;AAAA,IACrB,OAAA,CAAQ,CAAA;AAAA,UAMM,eAAA;EACf,MAAA;EACA,eAAA;EACA,KAAA;AAAA;AAAA,iBAGc,QAAA,WAAmB,OAAA,CAAA,CACjC,MAAA,EAAQ,CAAA,EACR,IAAA,WACA,OAAA,GAAU,IAAA,CAAK,eAAA,cAA6B,eAAA;EAAoB,KAAA;AAAA,KAC/D,CAAA,CAAE,KAAA,CAAM,CAAA;AAAA,iBAEK,QAAA,WAAmB,OAAA,CAAA,CACjC,MAAA,EAAQ,CAAA,EACR,IAAA,WACA,OAAA,EAAS,eAAA;EAAoB,KAAA;AAAA,IAC5B,OAAA,CAAQ,CAAA,CAAE,KAAA,CAAM,CAAA"}
@@ -11,20 +11,18 @@ function camelize(schema, { shallow = true } = {}) {
11
11
  return z.preprocess((v) => isRecord(v) ? camelize$1(v, shallow) : v, schema);
12
12
  }
13
13
  function zodParse(schema, data, options) {
14
+ const formatOptions = {
15
+ ...options?.prefix !== void 0 ? { prefix: options.prefix } : {},
16
+ prefixSeparator: options?.prefixSeparator ?? ": "
17
+ };
14
18
  if (options?.async) return schema.parseAsync(data).catch((error) => {
15
- if (error instanceof z.ZodError) throw fromZodError(error, {
16
- prefix: options?.prefix,
17
- prefixSeparator: options?.prefixSeparator ?? ": "
18
- });
19
+ if (error instanceof z.ZodError) throw fromZodError(error, formatOptions);
19
20
  throw error;
20
21
  });
21
22
  try {
22
23
  return schema.parse(data);
23
24
  } catch (error) {
24
- if (error instanceof z.ZodError) throw fromZodError(error, {
25
- prefix: options?.prefix,
26
- prefixSeparator: options?.prefixSeparator ?? ": "
27
- });
25
+ if (error instanceof z.ZodError) throw fromZodError(error, formatOptions);
28
26
  throw error;
29
27
  }
30
28
  }
@@ -1 +1 @@
1
- {"version":3,"file":"zod.mjs","names":["camelizeObject"],"sources":["../../src/utils/zod.ts"],"sourcesContent":["import { type ZodEffects, type ZodType, z } from \"zod\";\nimport { fromZodError } from \"zod-validation-error\";\nimport { camelize as camelizeObject } from \"./camelize.js\";\nimport { isRecord } from \"./type-utils.js\";\n\nexport function optionalize<T>(schema: ZodType<T>): ZodType<T | undefined> {\n return schema.nullish().transform((v) => v ?? undefined) as ZodType<T | undefined>;\n}\n\nexport function camelize<T extends ZodType>(\n schema: T,\n { shallow = true }: { shallow?: boolean } = {},\n): ZodEffects<T, T[\"_output\"], any> {\n return z.preprocess((v) => (isRecord(v) ? camelizeObject(v, shallow) : v), schema);\n}\n\nexport interface ZodParseOptions {\n prefix?: string;\n prefixSeparator?: string;\n async?: boolean;\n}\n\nexport function zodParse<T extends ZodType>(\n schema: T,\n data: unknown,\n options?: Omit<ZodParseOptions, \"async\"> | (ZodParseOptions & { async?: false }),\n): z.infer<T>;\n\nexport function zodParse<T extends ZodType>(\n schema: T,\n data: unknown,\n options: ZodParseOptions & { async: true },\n): Promise<z.infer<T>>;\n\nexport function zodParse<T extends ZodType>(\n schema: T,\n data: unknown,\n options?: ZodParseOptions,\n): z.infer<T> | Promise<z.infer<T>> {\n if (options?.async) {\n return schema.parseAsync(data).catch((error) => {\n if (error instanceof z.ZodError) {\n throw fromZodError(error, {\n prefix: options?.prefix,\n prefixSeparator: options?.prefixSeparator ?? \": \",\n });\n }\n throw error;\n });\n }\n\n try {\n return schema.parse(data);\n } catch (error) {\n if (error instanceof z.ZodError) {\n throw fromZodError(error, {\n prefix: options?.prefix,\n prefixSeparator: options?.prefixSeparator ?? \": \",\n });\n }\n throw error;\n }\n}\n"],"mappings":";;;;;;AAKA,SAAgB,YAAe,QAA4C;AACzE,QAAO,OAAO,SAAS,CAAC,WAAW,MAAM,KAAK,OAAU;;AAG1D,SAAgB,SACd,QACA,EAAE,UAAU,SAAgC,EAAE,EACZ;AAClC,QAAO,EAAE,YAAY,MAAO,SAAS,EAAE,GAAGA,WAAe,GAAG,QAAQ,GAAG,GAAI,OAAO;;AAqBpF,SAAgB,SACd,QACA,MACA,SACkC;AAClC,KAAI,SAAS,MACX,QAAO,OAAO,WAAW,KAAK,CAAC,OAAO,UAAU;AAC9C,MAAI,iBAAiB,EAAE,SACrB,OAAM,aAAa,OAAO;GACxB,QAAQ,SAAS;GACjB,iBAAiB,SAAS,mBAAmB;GAC9C,CAAC;AAEJ,QAAM;GACN;AAGJ,KAAI;AACF,SAAO,OAAO,MAAM,KAAK;UAClB,OAAO;AACd,MAAI,iBAAiB,EAAE,SACrB,OAAM,aAAa,OAAO;GACxB,QAAQ,SAAS;GACjB,iBAAiB,SAAS,mBAAmB;GAC9C,CAAC;AAEJ,QAAM"}
1
+ {"version":3,"file":"zod.mjs","names":["camelizeObject"],"sources":["../../src/utils/zod.ts"],"sourcesContent":["import { type ZodType, z } from \"zod\";\nimport { fromZodError } from \"zod-validation-error\";\nimport { camelize as camelizeObject } from \"./camelize.js\";\nimport { isRecord } from \"./type-utils.js\";\n\nexport function optionalize<T>(schema: ZodType<T>): ZodType<T | undefined> {\n return schema.nullish().transform((v) => v ?? undefined) as ZodType<T | undefined>;\n}\n\nexport function camelize<T extends ZodType>(\n schema: T,\n { shallow = true }: { shallow?: boolean } = {},\n): ZodType<T[\"_output\"]> {\n return z.preprocess((v) => (isRecord(v) ? camelizeObject(v, shallow) : v), schema) as ZodType<\n T[\"_output\"]\n >;\n}\n\nexport interface ZodParseOptions {\n prefix?: string;\n prefixSeparator?: string;\n async?: boolean;\n}\n\nexport function zodParse<T extends ZodType>(\n schema: T,\n data: unknown,\n options?: Omit<ZodParseOptions, \"async\"> | (ZodParseOptions & { async?: false }),\n): z.infer<T>;\n\nexport function zodParse<T extends ZodType>(\n schema: T,\n data: unknown,\n options: ZodParseOptions & { async: true },\n): Promise<z.infer<T>>;\n\nexport function zodParse<T extends ZodType>(\n schema: T,\n data: unknown,\n options?: ZodParseOptions,\n): z.infer<T> | Promise<z.infer<T>> {\n const formatOptions = {\n ...(options?.prefix !== undefined ? { prefix: options.prefix } : {}),\n prefixSeparator: options?.prefixSeparator ?? \": \",\n };\n\n if (options?.async) {\n return schema.parseAsync(data).catch((error) => {\n if (error instanceof z.ZodError) {\n throw fromZodError(error, formatOptions);\n }\n throw error;\n });\n }\n\n try {\n return schema.parse(data);\n } catch (error) {\n if (error instanceof z.ZodError) {\n throw fromZodError(error, formatOptions);\n }\n throw error;\n }\n}\n"],"mappings":";;;;;;AAKA,SAAgB,YAAe,QAA4C;AACzE,QAAO,OAAO,SAAS,CAAC,WAAW,MAAM,KAAK,OAAU;;AAG1D,SAAgB,SACd,QACA,EAAE,UAAU,SAAgC,EAAE,EACvB;AACvB,QAAO,EAAE,YAAY,MAAO,SAAS,EAAE,GAAGA,WAAe,GAAG,QAAQ,GAAG,GAAI,OAAO;;AAuBpF,SAAgB,SACd,QACA,MACA,SACkC;CAClC,MAAM,gBAAgB;EACpB,GAAI,SAAS,WAAW,SAAY,EAAE,QAAQ,QAAQ,QAAQ,GAAG,EAAE;EACnE,iBAAiB,SAAS,mBAAmB;EAC9C;AAED,KAAI,SAAS,MACX,QAAO,OAAO,WAAW,KAAK,CAAC,OAAO,UAAU;AAC9C,MAAI,iBAAiB,EAAE,SACrB,OAAM,aAAa,OAAO,cAAc;AAE1C,QAAM;GACN;AAGJ,KAAI;AACF,SAAO,OAAO,MAAM,KAAK;UAClB,OAAO;AACd,MAAI,iBAAiB,EAAE,SACrB,OAAM,aAAa,OAAO,cAAc;AAE1C,QAAM"}
package/package.json CHANGED
@@ -1,8 +1,8 @@
1
1
  {
2
2
  "name": "@aigne/afs",
3
- "version": "1.11.0-beta",
3
+ "version": "1.11.0-beta.10",
4
4
  "description": "Agentic File System (AFS) is a virtual file system that supports various storage backends and provides a unified API for file operations.",
5
- "license": "Elastic-2.0",
5
+ "license": "UNLICENSED",
6
6
  "publishConfig": {
7
7
  "access": "public"
8
8
  },
@@ -24,14 +24,34 @@
24
24
  "require": "./dist/index.cjs",
25
25
  "import": "./dist/index.mjs"
26
26
  },
27
+ "./loader": {
28
+ "require": "./dist/loader/index.cjs",
29
+ "import": "./dist/loader/index.mjs"
30
+ },
31
+ "./provider": {
32
+ "require": "./dist/provider/index.cjs",
33
+ "import": "./dist/provider/index.mjs"
34
+ },
27
35
  "./utils/camelize": {
28
36
  "require": "./dist/utils/camelize.cjs",
29
37
  "import": "./dist/utils/camelize.mjs"
30
38
  },
39
+ "./utils/schema": {
40
+ "require": "./dist/utils/schema.cjs",
41
+ "import": "./dist/utils/schema.mjs"
42
+ },
31
43
  "./utils/type-utils": {
32
44
  "require": "./dist/utils/type-utils.cjs",
33
45
  "import": "./dist/utils/type-utils.mjs"
34
46
  },
47
+ "./utils/uri": {
48
+ "require": "./dist/utils/uri.cjs",
49
+ "import": "./dist/utils/uri.mjs"
50
+ },
51
+ "./utils/uri-template": {
52
+ "require": "./dist/utils/uri-template.cjs",
53
+ "import": "./dist/utils/uri-template.mjs"
54
+ },
35
55
  "./utils/zod": {
36
56
  "require": "./dist/utils/zod.cjs",
37
57
  "import": "./dist/utils/zod.mjs"
@@ -46,11 +66,14 @@
46
66
  ],
47
67
  "dependencies": {
48
68
  "@aigne/uuid": "^13.0.1",
69
+ "@types/json-schema": "^7.0.15",
49
70
  "@types/node": "^25.0.9",
71
+ "minimatch": "^10.1.1",
50
72
  "strict-event-emitter": "^0.5.1",
51
73
  "ufo": "^1.6.3",
52
- "zod": "^3.25.67",
53
- "zod-validation-error": "^3.5.4"
74
+ "zod": "^4.0.0",
75
+ "zod-from-json-schema": "^0.5.0",
76
+ "zod-validation-error": "^4.0.0"
54
77
  },
55
78
  "devDependencies": {
56
79
  "@types/bun": "^1.3.6",
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.cts","names":[],"sources":["../src/type.ts","../src/afs.ts","../src/error.ts"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.mts","names":[],"sources":["../src/type.ts","../src/afs.ts","../src/error.ts"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.mjs","names":[],"sources":["../src/error.ts","../src/type.ts","../src/afs.ts"],"sourcesContent":["/**\n * Base error class for all AFS errors.\n */\nexport class AFSError extends Error {\n readonly code: string;\n\n constructor(message: string, code: string) {\n super(message);\n this.name = \"AFSError\";\n this.code = code;\n }\n}\n\n/**\n * Error thrown when attempting write operations on a readonly AFS or module.\n */\nexport class AFSReadonlyError extends AFSError {\n constructor(message: string) {\n super(message, \"AFS_READONLY\");\n this.name = \"AFSReadonlyError\";\n }\n}\n","import type { Emitter } from \"strict-event-emitter\";\nimport { type ZodType, z } from \"zod\";\n\n/**\n * Access mode for AFS modules and root.\n * - \"readonly\": Only read operations are allowed (list, read, search)\n * - \"readwrite\": All operations are allowed\n */\nexport type AFSAccessMode = \"readonly\" | \"readwrite\";\n\n/**\n * Zod schema for access mode validation.\n * Can be reused across modules that support access mode configuration.\n */\nexport const accessModeSchema = z\n .enum([\"readonly\", \"readwrite\"])\n .describe(\"Access mode for this module\")\n .optional();\n\nexport interface AFSOperationOptions {\n context?: any;\n}\n\nexport interface AFSListOptions extends AFSOperationOptions {\n filter?: {\n agentId?: string;\n userId?: string;\n sessionId?: string;\n before?: string;\n after?: string;\n };\n maxDepth?: number;\n limit?: number;\n orderBy?: [string, \"asc\" | \"desc\"][];\n maxChildren?: number;\n onOverflow?: \"truncate\";\n /**\n * Whether to disable .gitignore files when listing files.\n * @default false\n */\n disableGitignore?: boolean;\n /**\n * Glob pattern to filter entries by path.\n * Examples: \"*.ts\", \"**\\/*.js\", \"src/**\\/*.{ts,tsx}\"\n */\n pattern?: string;\n}\n\nexport interface AFSListResult {\n data: AFSEntry[];\n message?: string;\n}\n\nexport interface AFSSearchOptions extends AFSOperationOptions {\n limit?: number;\n caseSensitive?: boolean;\n}\n\nexport interface AFSSearchResult {\n data: AFSEntry[];\n message?: string;\n}\n\nexport interface AFSReadOptions extends AFSOperationOptions {\n filter?: AFSListOptions[\"filter\"];\n}\n\nexport interface AFSReadResult {\n data?: AFSEntry;\n message?: string;\n}\n\nexport interface AFSDeleteOptions extends AFSOperationOptions {\n recursive?: boolean;\n}\n\nexport interface AFSDeleteResult {\n message?: string;\n}\n\nexport interface AFSRenameOptions extends AFSOperationOptions {\n overwrite?: boolean;\n}\n\nexport interface AFSRenameResult {\n message?: string;\n}\n\nexport interface AFSWriteOptions extends AFSOperationOptions {\n append?: boolean;\n}\n\nexport interface AFSWriteResult {\n data: AFSEntry;\n message?: string;\n context?: any;\n}\n\nexport interface AFSWriteEntryPayload extends Omit<AFSEntry, \"id\" | \"path\"> {}\n\nexport interface AFSExecOptions extends AFSOperationOptions {}\n\nexport interface AFSExecResult {\n data: Record<string, any>;\n}\n\nexport interface AFSModule {\n readonly name: string;\n\n readonly description?: string;\n\n /**\n * Access mode for this module.\n * - \"readonly\": Only read operations are allowed\n * - \"readwrite\": All operations are allowed\n * Default behavior is implementation-specific.\n */\n readonly accessMode?: AFSAccessMode;\n\n /**\n * Enable automatic agent skill scanning for this module.\n * When set to true, the system will scan this module for agent skills.\n * @default false\n */\n readonly agentSkills?: boolean;\n\n onMount?(root: AFSRoot): void;\n\n symlinkToPhysical?(path: string): Promise<void>;\n\n list?(path: string, options?: AFSListOptions): Promise<AFSListResult>;\n\n read?(path: string, options?: AFSReadOptions): Promise<AFSReadResult>;\n\n write?(\n path: string,\n content: AFSWriteEntryPayload,\n options?: AFSWriteOptions,\n ): Promise<AFSWriteResult>;\n\n delete?(path: string, options?: AFSDeleteOptions): Promise<AFSDeleteResult>;\n\n rename?(oldPath: string, newPath: string, options?: AFSRenameOptions): Promise<AFSRenameResult>;\n\n search?(path: string, query: string, options?: AFSSearchOptions): Promise<AFSSearchResult>;\n\n // TODO: options.context should be typed properly\n exec?(path: string, args: Record<string, any>, options: AFSExecOptions): Promise<AFSExecResult>;\n}\n\n/**\n * Parameters for loading a module from configuration.\n */\nexport interface AFSModuleLoadParams {\n /** Path to the configuration file */\n filepath: string;\n /** Parsed configuration object */\n parsed?: object;\n}\n\n/**\n * Interface for module classes that support schema validation and loading from configuration.\n * This describes the static part of a module class.\n *\n * @example\n * ```typescript\n * class MyModule implements AFSModule {\n * static schema() { return mySchema; }\n * static async load(params: AFSModuleLoadParams) { ... }\n * // ...\n * }\n *\n * // Type check\n * const _check: AFSModuleClass<MyModule, MyModuleOptions> = MyModule;\n * ```\n */\nexport interface AFSModuleClass<T extends AFSModule = AFSModule, O extends object = object> {\n /** Returns the Zod schema for validating module configuration */\n schema(): ZodType<O>;\n\n /** Loads a module instance from configuration file path and parsed config */\n load(params: AFSModuleLoadParams): Promise<T>;\n\n /** Constructor */\n new (options: O): T;\n}\n\nexport type AFSRootEvents = {\n agentSucceed: [\n {\n agentId?: string;\n userId?: string;\n sessionId?: string;\n input: object;\n output: object;\n messages?: object[];\n },\n ];\n historyCreated: [{ entry: AFSEntry }, options: AFSOperationOptions];\n};\n\nexport interface AFSRootListOptions extends AFSListOptions, AFSContextPreset {\n preset?: string;\n}\n\nexport interface AFSRootListResult extends Omit<AFSListResult, \"data\"> {\n data: any;\n}\n\nexport interface AFSRootSearchOptions extends AFSSearchOptions, AFSContextPreset {\n preset?: string;\n}\n\nexport interface AFSRootSearchResult extends Omit<AFSSearchResult, \"data\"> {\n data: any;\n}\n\nexport interface AFSRoot extends Emitter<AFSRootEvents>, AFSModule {\n list(path: string, options?: AFSRootListOptions): Promise<AFSRootListResult>;\n\n search(path: string, query: string, options: AFSRootSearchOptions): Promise<AFSRootSearchResult>;\n\n initializePhysicalPath(): Promise<string>;\n\n cleanupPhysicalPath(): Promise<void>;\n}\n\nexport interface AFSEntryMetadata extends Record<string, any> {\n execute?: {\n name: string;\n description?: string;\n inputSchema?: Record<string, any>;\n outputSchema?: Record<string, any>;\n };\n childrenCount?: number;\n childrenTruncated?: boolean;\n gitignored?: boolean;\n}\n\nexport interface AFSEntry<T = any> {\n id: string;\n createdAt?: Date;\n updatedAt?: Date;\n path: string;\n agentId?: string | null;\n userId?: string | null;\n sessionId?: string | null;\n summary?: string | null;\n description?: string | null;\n metadata?: AFSEntryMetadata | null;\n linkTo?: string | null;\n content?: T;\n}\n\nexport const afsEntrySchema: ZodType<AFSEntry> = z.object({\n id: z.string(),\n createdAt: z.date().optional(),\n updatedAt: z.date().optional(),\n path: z.string(),\n userId: z.string().nullable().optional(),\n sessionId: z.string().nullable().optional(),\n summary: z.string().nullable().optional(),\n description: z.string().nullable().optional(),\n metadata: z.record(z.any()).nullable().optional(),\n linkTo: z.string().nullable().optional(),\n content: z.any().optional(),\n});\n\nexport interface AFSContextPreset {\n /**\n * The view template for presenting the search results.\n */\n view?: string;\n\n select?: AFSContextPresetOptionAgent<{ path: string; query?: string }, { data: string[] }>;\n\n per?: AFSContextPresetOptionAgent<{ data: AFSEntry }, { data: unknown }>;\n\n dedupe?: AFSContextPresetOptionAgent<{ data: unknown[] }, { data: unknown }>;\n\n format?:\n | \"default\"\n | \"simple-list\"\n | \"tree\"\n | AFSContextPresetOptionAgent<{ data: unknown }, { data: unknown }>;\n}\n\nexport interface AFSContextPresetOptionAgent<I = any, O = any> {\n invoke(input: I, options?: any): Promise<O>;\n}\n\nexport interface AFSContext {\n search?: {\n presets?: Record<string, AFSContextPreset>;\n };\n list?: {\n presets?: Record<string, AFSContextPreset>;\n };\n}\n","import { v7 } from \"@aigne/uuid\";\nimport { Emitter } from \"strict-event-emitter\";\nimport { joinURL } from \"ufo\";\nimport { z } from \"zod\";\nimport { AFSReadonlyError } from \"./error.js\";\nimport {\n type AFSContext,\n type AFSContextPreset,\n type AFSDeleteOptions,\n type AFSDeleteResult,\n type AFSEntry,\n type AFSExecOptions,\n type AFSExecResult,\n type AFSListResult,\n type AFSModule,\n type AFSReadOptions,\n type AFSReadResult,\n type AFSRenameOptions,\n type AFSRenameResult,\n type AFSRoot,\n type AFSRootEvents,\n type AFSRootListOptions,\n type AFSRootListResult,\n type AFSRootSearchOptions,\n type AFSRootSearchResult,\n type AFSSearchOptions,\n type AFSSearchResult,\n type AFSWriteEntryPayload,\n type AFSWriteOptions,\n type AFSWriteResult,\n afsEntrySchema,\n} from \"./type.js\";\n\nconst DEFAULT_MAX_DEPTH = 1;\n\nconst MODULES_ROOT_DIR = \"/modules\";\n\nexport interface AFSOptions {\n modules?: AFSModule[];\n context?: AFSContext;\n}\n\nexport class AFS extends Emitter<AFSRootEvents> implements AFSRoot {\n name: string = \"AFSRoot\";\n\n constructor(public options: AFSOptions = {}) {\n super();\n\n for (const module of options?.modules ?? []) {\n this.mount(module);\n }\n }\n\n private modules = new Map<string, AFSModule>();\n\n /**\n * Check if write operations are allowed for the given module.\n * Throws AFSReadonlyError if not allowed.\n */\n private checkWritePermission(module: AFSModule, operation: string, path: string): void {\n // Module-level readonly (undefined means readonly by default)\n if (module.accessMode !== \"readwrite\") {\n throw new AFSReadonlyError(\n `Module '${module.name}' is readonly, cannot perform ${operation} to ${path}`,\n );\n }\n }\n\n mount(module: AFSModule): this {\n // Validate module name (should not contain '/')\n if (module.name.includes(\"/\")) {\n throw new Error(`Invalid module name: ${module.name}. Module name must not contain '/'`);\n }\n\n const path = joinURL(MODULES_ROOT_DIR, module.name);\n\n if (this.modules.has(path)) {\n throw new Error(`Module already mounted at path: ${path}`);\n }\n\n this.modules.set(path, module);\n module.onMount?.(this);\n return this;\n }\n\n async listModules(): Promise<\n { name: string; path: string; description?: string; module: AFSModule }[]\n > {\n return Array.from(this.modules.entries()).map(([path, module]) => ({\n path,\n name: module.name,\n description: module.description,\n module,\n }));\n }\n\n async list(path: string, options: AFSRootListOptions = {}): Promise<AFSRootListResult> {\n let preset: AFSContextPreset | undefined;\n if (options.preset) {\n preset = this.options?.context?.list?.presets?.[options.preset];\n if (!preset) throw new Error(`Preset not found: ${options.preset}`);\n }\n\n return await this.processWithPreset(path, undefined, preset, {\n ...options,\n defaultSelect: () => this._list(path, options),\n });\n }\n\n private async _list(path: string, options: AFSRootListOptions = {}): Promise<AFSListResult> {\n const results: AFSEntry[] = [];\n\n // Special case: listing root \"/\" should return /modules directory\n if (path === \"/\" && this.modules.size > 0) {\n const maxDepth = options?.maxDepth ?? DEFAULT_MAX_DEPTH;\n\n // Always include /modules directory first\n results.push({\n id: \"modules\",\n path: MODULES_ROOT_DIR,\n summary: \"All mounted modules\",\n });\n\n if (maxDepth === 1) {\n // Only show /modules directory\n return { data: results };\n }\n\n // For maxDepth > 1, also get children of /modules with reduced depth\n const childrenResult = await this._list(MODULES_ROOT_DIR, {\n ...options,\n maxDepth: maxDepth - 1,\n });\n results.push(...childrenResult.data);\n\n return { data: results };\n }\n\n const matches = this.findModules(path, options);\n\n for (const matched of matches) {\n if (matched.maxDepth === 0) {\n // When maxDepth is 0, show the module entry\n const moduleEntry = {\n id: matched.module.name,\n path: matched.modulePath,\n summary: matched.module.description,\n };\n\n results.push(moduleEntry);\n continue;\n }\n\n if (!matched.module.list) continue;\n\n try {\n const { data } = await matched.module.list(matched.subpath, {\n ...options,\n maxDepth: matched.maxDepth,\n });\n\n const children = data.map((entry) => ({\n ...entry,\n path: joinURL(matched.modulePath, entry.path),\n }));\n\n // Always include all nodes (including the current path itself)\n // This ensures consistent behavior across all listing scenarios\n results.push(...children);\n } catch (error) {\n throw new Error(`Error listing from module at ${matched.modulePath}: ${error.message}`);\n }\n }\n\n return { data: results };\n }\n\n async read(path: string, _options?: AFSReadOptions): Promise<AFSReadResult> {\n const modules = this.findModules(path, { exactMatch: true });\n\n for (const { module, modulePath, subpath } of modules) {\n const res = await module.read?.(subpath);\n\n if (res?.data) {\n return {\n ...res,\n data: {\n ...res.data,\n path: joinURL(modulePath, res.data.path),\n },\n };\n }\n }\n\n return { data: undefined, message: \"File not found\" };\n }\n\n async write(\n path: string,\n content: AFSWriteEntryPayload,\n options?: AFSWriteOptions,\n ): Promise<AFSWriteResult> {\n const module = this.findModules(path, { exactMatch: true })[0];\n if (!module?.module.write) throw new Error(`No module found for path: ${path}`);\n\n this.checkWritePermission(module.module, \"write\", path);\n\n const res = await module.module.write(module.subpath, content, options);\n\n return {\n ...res,\n data: {\n ...res.data,\n path: joinURL(module.modulePath, res.data.path),\n },\n };\n }\n\n async delete(path: string, options?: AFSDeleteOptions): Promise<AFSDeleteResult> {\n const module = this.findModules(path, { exactMatch: true })[0];\n if (!module?.module.delete) throw new Error(`No module found for path: ${path}`);\n\n this.checkWritePermission(module.module, \"delete\", path);\n\n return await module.module.delete(module.subpath, options);\n }\n\n async rename(\n oldPath: string,\n newPath: string,\n options?: AFSRenameOptions,\n ): Promise<AFSRenameResult> {\n const oldModule = this.findModules(oldPath, { exactMatch: true })[0];\n const newModule = this.findModules(newPath, { exactMatch: true })[0];\n\n // Both paths must be in the same module\n if (!oldModule || !newModule || oldModule.modulePath !== newModule.modulePath) {\n throw new Error(\n `Cannot rename across different modules. Both paths must be in the same module.`,\n );\n }\n\n if (!oldModule.module.rename) {\n throw new Error(`Module does not support rename operation: ${oldModule.modulePath}`);\n }\n\n this.checkWritePermission(oldModule.module, \"rename\", oldPath);\n\n return await oldModule.module.rename(oldModule.subpath, newModule.subpath, options);\n }\n\n async search(\n path: string,\n query: string,\n options: AFSRootSearchOptions = {},\n ): Promise<AFSRootSearchResult> {\n let preset: AFSContextPreset | undefined;\n if (options.preset) {\n preset = this.options?.context?.search?.presets?.[options.preset];\n if (!preset) throw new Error(`Preset not found: ${options.preset}`);\n }\n\n return await this.processWithPreset(path, query, preset, {\n ...options,\n defaultSelect: () => this._search(path, query, options),\n });\n }\n\n private async processWithPreset(\n path: string,\n query: string | undefined,\n preset: AFSContextPreset | undefined,\n options: AFSContextPreset & { defaultSelect: () => Promise<AFSListResult> },\n ): Promise<AFSRootSearchResult> {\n const select = options.select || preset?.select;\n const per = options.per || preset?.per;\n const dedupe = options.dedupe || preset?.dedupe;\n const format = options.format || preset?.format;\n\n const entries = select\n ? (await this._select(path, query, select, options)).data\n : (await options.defaultSelect()).data;\n\n const mapped = per\n ? await Promise.all(\n entries.map((data) => per.invoke({ data }, options).then((res) => res.data)),\n )\n : entries;\n\n const deduped = dedupe\n ? await dedupe.invoke({ data: mapped }, options).then((res) => res.data)\n : mapped;\n\n let formatted = deduped;\n\n if (format === \"simple-list\" || format === \"tree\") {\n const valid = z.array(afsEntrySchema).safeParse(deduped);\n if (!valid.data) throw new Error(\"Tree format requires entries to be AFSEntry objects\");\n if (format === \"tree\") formatted = this.buildTreeView(valid.data);\n else if (format === \"simple-list\") formatted = this.buildSimpleListView(valid.data);\n } else if (typeof format === \"object\" && typeof format.invoke === \"function\") {\n formatted = await format.invoke({ data: deduped }, options).then((res) => res.data);\n }\n\n return { data: formatted };\n }\n\n private async _select(\n path: string,\n query: string | undefined,\n select: NonNullable<AFSContextPreset[\"select\"]>,\n options?: AFSRootSearchOptions,\n ): Promise<AFSSearchResult> {\n const { data } = await select.invoke({ path, query }, options);\n\n const results: AFSEntry[] = (\n await Promise.all(data.map((p: string) => this.read(p).then((res) => res.data)))\n ).filter((i): i is NonNullable<typeof i> => !!i);\n\n return { data: results };\n }\n\n private async _search(\n path: string,\n query: string,\n options?: AFSSearchOptions,\n ): Promise<AFSSearchResult> {\n const results: AFSEntry[] = [];\n const messages: string[] = [];\n\n for (const { module, modulePath, subpath } of this.findModules(path)) {\n if (!module.search) continue;\n\n try {\n const { data, message } = await module.search(subpath, query, options);\n\n results.push(\n ...data.map((entry) => ({\n ...entry,\n path: joinURL(modulePath, entry.path),\n })),\n );\n if (message) messages.push(message);\n } catch (error) {\n throw new Error(`Error searching in module at ${modulePath}: ${error.message}`);\n }\n }\n\n return { data: results, message: messages.join(\"; \") };\n }\n\n private findModules(\n path: string,\n options?: { maxDepth?: number; exactMatch?: boolean },\n ): {\n module: AFSModule;\n modulePath: string;\n maxDepth: number;\n subpath: string;\n remainedModulePath: string;\n }[] {\n const maxDepth = Math.max(options?.maxDepth ?? DEFAULT_MAX_DEPTH, 1);\n const matched: ReturnType<typeof this.findModules> = [];\n\n for (const [modulePath, module] of this.modules) {\n const pathSegments = path.split(\"/\").filter(Boolean);\n const modulePathSegments = modulePath.split(\"/\").filter(Boolean);\n\n let newMaxDepth: number;\n let subpath: string;\n let remainedModulePath: string;\n\n if (!options?.exactMatch && modulePath.startsWith(path)) {\n newMaxDepth = Math.max(0, maxDepth - (modulePathSegments.length - pathSegments.length));\n subpath = \"/\";\n remainedModulePath = joinURL(\n \"/\",\n ...modulePathSegments.slice(pathSegments.length).slice(0, maxDepth),\n );\n } else if (path.startsWith(modulePath)) {\n newMaxDepth = maxDepth;\n subpath = joinURL(\"/\", ...pathSegments.slice(modulePathSegments.length));\n remainedModulePath = \"/\";\n } else {\n continue;\n }\n\n if (newMaxDepth < 0) continue;\n\n matched.push({\n module,\n modulePath,\n maxDepth: newMaxDepth,\n subpath,\n remainedModulePath,\n });\n }\n\n return matched;\n }\n\n async exec(\n path: string,\n args: Record<string, any>,\n options: AFSExecOptions,\n ): Promise<AFSExecResult> {\n const module = this.findModules(path)[0];\n if (!module?.module.exec) throw new Error(`No module found for path: ${path}`);\n\n return await module.module.exec(module.subpath, args, options);\n }\n\n private buildSimpleListView(entries: AFSEntry[]): string[] {\n return entries.map((entry) => `${entry.path}${this.buildMetadataSuffix(entry)}`);\n }\n\n private buildTreeView(entries: AFSEntry[]): string {\n const tree: Record<string, any> = {};\n const entryMap = new Map<string, AFSEntry>();\n\n for (const entry of entries) {\n entryMap.set(entry.path, entry);\n const parts = entry.path.split(\"/\").filter(Boolean);\n let current = tree;\n\n for (const part of parts) {\n if (!current[part]) {\n current[part] = {};\n }\n current = current[part];\n }\n }\n\n const renderTree = (node: Record<string, any>, prefix = \"\", currentPath = \"\"): string => {\n let result = \"\";\n const keys = Object.keys(node);\n keys.forEach((key, index) => {\n const isLast = index === keys.length - 1;\n const fullPath = currentPath ? `${currentPath}/${key}` : `/${key}`;\n const entry = entryMap.get(fullPath);\n\n result += `${prefix}${isLast ? \"└── \" : \"├── \"}${key}${entry ? this.buildMetadataSuffix(entry) : \"\"}`;\n result += `\\n`;\n result += renderTree(node[key], `${prefix}${isLast ? \" \" : \"│ \"}`, fullPath);\n });\n return result;\n };\n\n return renderTree(tree);\n }\n\n private buildMetadataSuffix(entry: AFSEntry): string {\n // Build metadata suffix\n const metadataParts: string[] = [];\n\n // Children count\n const childrenCount = entry?.metadata?.childrenCount;\n if (typeof childrenCount === \"number\") {\n metadataParts.push(`${childrenCount} items`);\n }\n\n // Children truncated\n if (entry?.metadata?.childrenTruncated) {\n metadataParts.push(\"truncated\");\n }\n\n // Gitignored\n if (entry?.metadata?.gitignored) {\n metadataParts.push(\"gitignored\");\n }\n\n // Executable\n if (entry?.metadata?.execute) {\n metadataParts.push(\"executable\");\n }\n\n const metadataSuffix = metadataParts.length > 0 ? ` [${metadataParts.join(\", \")}]` : \"\";\n\n return metadataSuffix;\n }\n\n private physicalPath?: Promise<string>;\n\n async initializePhysicalPath(): Promise<string> {\n this.physicalPath ??= (async () => {\n const path = await import(\"node:path\");\n const os = await import(\"node:os\");\n const fs = await import(\"node:fs/promises\");\n\n const rootDir = path.join(os.tmpdir(), v7());\n await fs.mkdir(rootDir, { recursive: true });\n\n for (const [modulePath, module] of this.modules) {\n const physicalModulePath = path.join(rootDir, modulePath);\n await fs.mkdir(path.dirname(physicalModulePath), { recursive: true });\n await module.symlinkToPhysical?.(physicalModulePath);\n }\n\n return rootDir;\n })();\n\n return this.physicalPath;\n }\n\n async cleanupPhysicalPath(): Promise<void> {\n if (this.physicalPath) {\n const fs = await import(\"node:fs/promises\");\n\n await fs.rm(await this.physicalPath, { recursive: true, force: true });\n this.physicalPath = undefined;\n }\n }\n}\n"],"mappings":"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"}