@treeseed/treedx 0.1.1

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 (121) hide show
  1. package/README.md +208 -0
  2. package/dist/treedx/adapters/admin.d.ts +20 -0
  3. package/dist/treedx/adapters/admin.js +22 -0
  4. package/dist/treedx/adapters/artifacts.d.ts +9 -0
  5. package/dist/treedx/adapters/artifacts.js +11 -0
  6. package/dist/treedx/adapters/audit.d.ts +6 -0
  7. package/dist/treedx/adapters/audit.js +8 -0
  8. package/dist/treedx/adapters/blobs.d.ts +15 -0
  9. package/dist/treedx/adapters/blobs.js +16 -0
  10. package/dist/treedx/adapters/common.d.ts +7 -0
  11. package/dist/treedx/adapters/common.js +11 -0
  12. package/dist/treedx/adapters/context.d.ts +7 -0
  13. package/dist/treedx/adapters/context.js +9 -0
  14. package/dist/treedx/adapters/exec.d.ts +6 -0
  15. package/dist/treedx/adapters/exec.js +8 -0
  16. package/dist/treedx/adapters/federation-internal.d.ts +9 -0
  17. package/dist/treedx/adapters/federation-internal.js +11 -0
  18. package/dist/treedx/adapters/federation.d.ts +20 -0
  19. package/dist/treedx/adapters/federation.js +22 -0
  20. package/dist/treedx/adapters/files.d.ts +14 -0
  21. package/dist/treedx/adapters/files.js +16 -0
  22. package/dist/treedx/adapters/graph.d.ts +14 -0
  23. package/dist/treedx/adapters/graph.js +16 -0
  24. package/dist/treedx/adapters/index.d.ts +21 -0
  25. package/dist/treedx/adapters/index.js +21 -0
  26. package/dist/treedx/adapters/migrations.d.ts +7 -0
  27. package/dist/treedx/adapters/migrations.js +9 -0
  28. package/dist/treedx/adapters/mirrors.d.ts +10 -0
  29. package/dist/treedx/adapters/mirrors.js +12 -0
  30. package/dist/treedx/adapters/observability.d.ts +9 -0
  31. package/dist/treedx/adapters/observability.js +11 -0
  32. package/dist/treedx/adapters/policy.d.ts +9 -0
  33. package/dist/treedx/adapters/policy.js +11 -0
  34. package/dist/treedx/adapters/query.d.ts +9 -0
  35. package/dist/treedx/adapters/query.js +11 -0
  36. package/dist/treedx/adapters/registry.d.ts +9 -0
  37. package/dist/treedx/adapters/registry.js +11 -0
  38. package/dist/treedx/adapters/repositories.d.ts +14 -0
  39. package/dist/treedx/adapters/repositories.js +16 -0
  40. package/dist/treedx/adapters/search-index.d.ts +8 -0
  41. package/dist/treedx/adapters/search-index.js +10 -0
  42. package/dist/treedx/adapters/snapshots.d.ts +7 -0
  43. package/dist/treedx/adapters/snapshots.js +9 -0
  44. package/dist/treedx/adapters/workspaces.d.ts +8 -0
  45. package/dist/treedx/adapters/workspaces.js +10 -0
  46. package/dist/treedx/client/TreeDxClient.d.ts +41 -0
  47. package/dist/treedx/client/TreeDxClient.js +83 -0
  48. package/dist/treedx/client/TreeDxFederatedClient.d.ts +7 -0
  49. package/dist/treedx/client/TreeDxFederatedClient.js +10 -0
  50. package/dist/treedx/client/TreeDxRegistryClient.d.ts +7 -0
  51. package/dist/treedx/client/TreeDxRegistryClient.js +10 -0
  52. package/dist/treedx/client/auth.d.ts +8 -0
  53. package/dist/treedx/client/auth.js +26 -0
  54. package/dist/treedx/client/binary.d.ts +4 -0
  55. package/dist/treedx/client/binary.js +39 -0
  56. package/dist/treedx/client/errors.d.ts +17 -0
  57. package/dist/treedx/client/errors.js +35 -0
  58. package/dist/treedx/client/index.d.ts +8 -0
  59. package/dist/treedx/client/index.js +8 -0
  60. package/dist/treedx/client/pagination.d.ts +4 -0
  61. package/dist/treedx/client/pagination.js +15 -0
  62. package/dist/treedx/client/transport.d.ts +15 -0
  63. package/dist/treedx/client/transport.js +61 -0
  64. package/dist/treedx/conformance/adapter.d.ts +28 -0
  65. package/dist/treedx/conformance/adapter.js +43 -0
  66. package/dist/treedx/conformance/index.d.ts +1 -0
  67. package/dist/treedx/conformance/index.js +1 -0
  68. package/dist/treedx/generated/index.d.ts +1 -0
  69. package/dist/treedx/generated/index.js +1 -0
  70. package/dist/treedx/generated/openapi-types.d.ts +348 -0
  71. package/dist/treedx/generated/openapi-types.js +117 -0
  72. package/dist/treedx/index.d.ts +5 -0
  73. package/dist/treedx/index.js +5 -0
  74. package/dist/treedx/ports/admin-port.d.ts +1 -0
  75. package/dist/treedx/ports/admin-port.js +1 -0
  76. package/dist/treedx/ports/artifact-port.d.ts +2 -0
  77. package/dist/treedx/ports/artifact-port.js +1 -0
  78. package/dist/treedx/ports/audit-port.d.ts +1 -0
  79. package/dist/treedx/ports/audit-port.js +1 -0
  80. package/dist/treedx/ports/auth-provider.d.ts +1 -0
  81. package/dist/treedx/ports/auth-provider.js +1 -0
  82. package/dist/treedx/ports/blob-port.d.ts +2 -0
  83. package/dist/treedx/ports/blob-port.js +1 -0
  84. package/dist/treedx/ports/context-port.d.ts +2 -0
  85. package/dist/treedx/ports/context-port.js +1 -0
  86. package/dist/treedx/ports/exec-port.d.ts +2 -0
  87. package/dist/treedx/ports/exec-port.js +1 -0
  88. package/dist/treedx/ports/federation-internal-port.d.ts +1 -0
  89. package/dist/treedx/ports/federation-internal-port.js +1 -0
  90. package/dist/treedx/ports/federation-port.d.ts +2 -0
  91. package/dist/treedx/ports/federation-port.js +1 -0
  92. package/dist/treedx/ports/file-port.d.ts +2 -0
  93. package/dist/treedx/ports/file-port.js +1 -0
  94. package/dist/treedx/ports/graph-port.d.ts +2 -0
  95. package/dist/treedx/ports/graph-port.js +1 -0
  96. package/dist/treedx/ports/index.d.ts +21 -0
  97. package/dist/treedx/ports/index.js +21 -0
  98. package/dist/treedx/ports/migration-port.d.ts +2 -0
  99. package/dist/treedx/ports/migration-port.js +1 -0
  100. package/dist/treedx/ports/mirror-port.d.ts +2 -0
  101. package/dist/treedx/ports/mirror-port.js +1 -0
  102. package/dist/treedx/ports/policy-port.d.ts +1 -0
  103. package/dist/treedx/ports/policy-port.js +1 -0
  104. package/dist/treedx/ports/query-port.d.ts +2 -0
  105. package/dist/treedx/ports/query-port.js +1 -0
  106. package/dist/treedx/ports/registry-port.d.ts +2 -0
  107. package/dist/treedx/ports/registry-port.js +1 -0
  108. package/dist/treedx/ports/repository-port.d.ts +2 -0
  109. package/dist/treedx/ports/repository-port.js +1 -0
  110. package/dist/treedx/ports/search-index-port.d.ts +1 -0
  111. package/dist/treedx/ports/search-index-port.js +1 -0
  112. package/dist/treedx/ports/snapshot-port.d.ts +2 -0
  113. package/dist/treedx/ports/snapshot-port.js +1 -0
  114. package/dist/treedx/ports/transport.d.ts +1 -0
  115. package/dist/treedx/ports/transport.js +1 -0
  116. package/dist/treedx/ports/workspace-port.d.ts +2 -0
  117. package/dist/treedx/ports/workspace-port.js +1 -0
  118. package/dist/treedx/types/index.d.ts +55 -0
  119. package/dist/treedx/types/index.js +1 -0
  120. package/package.json +66 -0
  121. package/sdk-manifest.yaml +64 -0
@@ -0,0 +1,9 @@
1
+ import { type TreeDxAdapterContext } from './common.js';
2
+ export declare class PolicyAdapter {
3
+ private readonly context;
4
+ constructor(context: TreeDxAdapterContext);
5
+ capabilities(): Promise<unknown>;
6
+ grants(query?: Record<string, string | number | boolean | undefined>): Promise<unknown>;
7
+ createGrant(input: unknown): Promise<unknown>;
8
+ refresh(input?: unknown): Promise<unknown>;
9
+ }
@@ -0,0 +1,11 @@
1
+ import { jsonRequest } from './common.js';
2
+ export class PolicyAdapter {
3
+ context;
4
+ constructor(context) {
5
+ this.context = context;
6
+ }
7
+ capabilities() { return jsonRequest(this.context.transport, 'GET', '/api/v1/policy/capabilities'); }
8
+ grants(query) { return jsonRequest(this.context.transport, 'GET', '/api/v1/policy/grants', undefined, query); }
9
+ createGrant(input) { return jsonRequest(this.context.transport, 'POST', '/api/v1/policy/grants', input); }
10
+ refresh(input) { return jsonRequest(this.context.transport, 'POST', '/api/v1/policy/refresh', input); }
11
+ }
@@ -0,0 +1,9 @@
1
+ import { type TreeDxAdapterContext } from './common.js';
2
+ export declare class QueryAdapter {
3
+ private readonly context;
4
+ constructor(context: TreeDxAdapterContext);
5
+ readFile(repoId: string, input: unknown): Promise<unknown>;
6
+ listPaths(repoId: string, input: unknown): Promise<unknown>;
7
+ searchFiles(repoId: string, input: unknown): Promise<unknown>;
8
+ repository(repoId: string, input: unknown): Promise<unknown>;
9
+ }
@@ -0,0 +1,11 @@
1
+ import { jsonRequest, segment } from './common.js';
2
+ export class QueryAdapter {
3
+ context;
4
+ constructor(context) {
5
+ this.context = context;
6
+ }
7
+ readFile(repoId, input) { return jsonRequest(this.context.transport, 'POST', `/api/v1/repos/${segment(repoId)}/files/read`, input); }
8
+ listPaths(repoId, input) { return jsonRequest(this.context.transport, 'POST', `/api/v1/repos/${segment(repoId)}/paths/list`, input); }
9
+ searchFiles(repoId, input) { return jsonRequest(this.context.transport, 'POST', `/api/v1/repos/${segment(repoId)}/files/search`, input); }
10
+ repository(repoId, input) { return jsonRequest(this.context.transport, 'POST', `/api/v1/repos/${segment(repoId)}/query`, input); }
11
+ }
@@ -0,0 +1,9 @@
1
+ import { type TreeDxAdapterContext } from './common.js';
2
+ export declare class RegistryAdapter {
3
+ private readonly context;
4
+ constructor(context: TreeDxAdapterContext);
5
+ localNode(): Promise<unknown>;
6
+ nodes(): Promise<unknown>;
7
+ getPlacement(repoId: string): Promise<unknown>;
8
+ setPlacement(repoId: string, input: unknown): Promise<unknown>;
9
+ }
@@ -0,0 +1,11 @@
1
+ import { jsonRequest, segment } from './common.js';
2
+ export class RegistryAdapter {
3
+ context;
4
+ constructor(context) {
5
+ this.context = context;
6
+ }
7
+ localNode() { return jsonRequest(this.context.transport, 'GET', '/api/v1/node'); }
8
+ nodes() { return jsonRequest(this.context.transport, 'GET', '/api/v1/registry/nodes'); }
9
+ getPlacement(repoId) { return jsonRequest(this.context.transport, 'GET', `/api/v1/registry/repos/${segment(repoId)}/placement`); }
10
+ setPlacement(repoId, input) { return jsonRequest(this.context.transport, 'POST', `/api/v1/registry/repos/${segment(repoId)}/placement`, input); }
11
+ }
@@ -0,0 +1,14 @@
1
+ import { type TreeDxAdapterContext } from './common.js';
2
+ export declare class RepositoriesAdapter {
3
+ private readonly context;
4
+ constructor(context: TreeDxAdapterContext);
5
+ register(input: unknown): Promise<unknown>;
6
+ list(): Promise<unknown>;
7
+ create(input: unknown): Promise<unknown>;
8
+ get(repoId: string): Promise<unknown>;
9
+ status(repoId: string): Promise<unknown>;
10
+ refs(repoId: string): Promise<unknown>;
11
+ remotes(repoId: string): Promise<unknown>;
12
+ push(repoId: string, input?: unknown): Promise<unknown>;
13
+ sync(repoId: string, input?: unknown): Promise<unknown>;
14
+ }
@@ -0,0 +1,16 @@
1
+ import { jsonRequest, segment } from './common.js';
2
+ export class RepositoriesAdapter {
3
+ context;
4
+ constructor(context) {
5
+ this.context = context;
6
+ }
7
+ register(input) { return jsonRequest(this.context.transport, 'POST', '/api/v1/repos/register', input); }
8
+ list() { return jsonRequest(this.context.transport, 'GET', '/api/v1/repos'); }
9
+ create(input) { return jsonRequest(this.context.transport, 'POST', '/api/v1/repos', input); }
10
+ get(repoId) { return jsonRequest(this.context.transport, 'GET', `/api/v1/repos/${segment(repoId)}`); }
11
+ status(repoId) { return jsonRequest(this.context.transport, 'GET', `/api/v1/repos/${segment(repoId)}/status`); }
12
+ refs(repoId) { return jsonRequest(this.context.transport, 'GET', `/api/v1/repos/${segment(repoId)}/refs`); }
13
+ remotes(repoId) { return jsonRequest(this.context.transport, 'GET', `/api/v1/repos/${segment(repoId)}/remotes`); }
14
+ push(repoId, input) { return jsonRequest(this.context.transport, 'POST', `/api/v1/repos/${segment(repoId)}/push`, input); }
15
+ sync(repoId, input) { return jsonRequest(this.context.transport, 'POST', `/api/v1/repos/${segment(repoId)}/sync`, input); }
16
+ }
@@ -0,0 +1,8 @@
1
+ import { type TreeDxAdapterContext } from './common.js';
2
+ export declare class SearchIndexAdapter {
3
+ private readonly context;
4
+ constructor(context: TreeDxAdapterContext);
5
+ status(repoId: string, query?: Record<string, string | number | boolean | undefined>): Promise<unknown>;
6
+ refresh(repoId: string, input?: unknown): Promise<unknown>;
7
+ compact(repoId: string, input?: unknown): Promise<unknown>;
8
+ }
@@ -0,0 +1,10 @@
1
+ import { jsonRequest, segment } from './common.js';
2
+ export class SearchIndexAdapter {
3
+ context;
4
+ constructor(context) {
5
+ this.context = context;
6
+ }
7
+ status(repoId, query) { return jsonRequest(this.context.transport, 'GET', `/api/v1/repos/${segment(repoId)}/search/index/status`, undefined, query); }
8
+ refresh(repoId, input) { return jsonRequest(this.context.transport, 'POST', `/api/v1/repos/${segment(repoId)}/search/index/refresh`, input); }
9
+ compact(repoId, input) { return jsonRequest(this.context.transport, 'POST', `/api/v1/repos/${segment(repoId)}/search/index/compact`, input); }
10
+ }
@@ -0,0 +1,7 @@
1
+ import { type TreeDxAdapterContext } from './common.js';
2
+ export declare class SnapshotsAdapter {
3
+ private readonly context;
4
+ constructor(context: TreeDxAdapterContext);
5
+ build(repoId: string, input: unknown): Promise<unknown>;
6
+ get(repoId: string, snapshotId: string): Promise<unknown>;
7
+ }
@@ -0,0 +1,9 @@
1
+ import { jsonRequest, segment } from './common.js';
2
+ export class SnapshotsAdapter {
3
+ context;
4
+ constructor(context) {
5
+ this.context = context;
6
+ }
7
+ build(repoId, input) { return jsonRequest(this.context.transport, 'POST', `/api/v1/repos/${segment(repoId)}/snapshots/build`, input); }
8
+ get(repoId, snapshotId) { return jsonRequest(this.context.transport, 'GET', `/api/v1/repos/${segment(repoId)}/snapshots/${segment(snapshotId)}`); }
9
+ }
@@ -0,0 +1,8 @@
1
+ import { type TreeDxAdapterContext } from './common.js';
2
+ export declare class WorkspacesAdapter {
3
+ private readonly context;
4
+ constructor(context: TreeDxAdapterContext);
5
+ create(repoId: string, input: unknown): Promise<unknown>;
6
+ get(workspaceId: string): Promise<unknown>;
7
+ close(workspaceId: string, input?: unknown): Promise<unknown>;
8
+ }
@@ -0,0 +1,10 @@
1
+ import { jsonRequest, segment } from './common.js';
2
+ export class WorkspacesAdapter {
3
+ context;
4
+ constructor(context) {
5
+ this.context = context;
6
+ }
7
+ create(repoId, input) { return jsonRequest(this.context.transport, 'POST', `/api/v1/repos/${segment(repoId)}/workspaces`, input); }
8
+ get(workspaceId) { return jsonRequest(this.context.transport, 'GET', `/api/v1/workspaces/${segment(workspaceId)}`); }
9
+ close(workspaceId, input) { return jsonRequest(this.context.transport, 'POST', `/api/v1/workspaces/${segment(workspaceId)}/close`, input); }
10
+ }
@@ -0,0 +1,41 @@
1
+ import { AdminAdapter, ArtifactsAdapter, AuditAdapter, BlobsAdapter, ContextAdapter, ExecAdapter, FederationAdapter, FederationInternalAdapter, FilesAdapter, GraphAdapter, MigrationsAdapter, MirrorsAdapter, ObservabilityAdapter, PolicyAdapter, QueryAdapter, RegistryAdapter, RepositoriesAdapter, SearchIndexAdapter, SnapshotsAdapter, WorkspacesAdapter } from '../adapters/index.js';
2
+ import { type TreeDxOpenApiMethod, type TreeDxOpenApiPath } from '../generated/index.js';
3
+ import type { BinaryBody, TreeDxClientConfig, Transport } from '../types/index.js';
4
+ export declare class TreeDxClient {
5
+ readonly config: TreeDxClientConfig;
6
+ readonly transport: Transport;
7
+ readonly repositories: RepositoriesAdapter;
8
+ readonly workspaces: WorkspacesAdapter;
9
+ readonly files: FilesAdapter;
10
+ readonly blobs: BlobsAdapter;
11
+ readonly query: QueryAdapter;
12
+ readonly graph: GraphAdapter;
13
+ readonly context: ContextAdapter;
14
+ readonly federation: FederationAdapter;
15
+ readonly registry: RegistryAdapter;
16
+ readonly snapshots: SnapshotsAdapter;
17
+ readonly artifacts: ArtifactsAdapter;
18
+ readonly mirrors: MirrorsAdapter;
19
+ readonly migrations: MigrationsAdapter;
20
+ readonly exec: ExecAdapter;
21
+ readonly observability: ObservabilityAdapter;
22
+ readonly admin: AdminAdapter;
23
+ readonly audit: AuditAdapter;
24
+ readonly policy: PolicyAdapter;
25
+ readonly searchIndex: SearchIndexAdapter;
26
+ readonly federationInternal: FederationInternalAdapter;
27
+ constructor(config: TreeDxClientConfig);
28
+ health(): Promise<unknown>;
29
+ version(): Promise<unknown>;
30
+ whoami(): Promise<unknown>;
31
+ effectiveScope(): Promise<unknown>;
32
+ authMode(): Promise<unknown>;
33
+ createDevToken(input?: unknown): Promise<unknown>;
34
+ operation<T = unknown>(method: TreeDxOpenApiMethod, path: TreeDxOpenApiPath, options?: {
35
+ pathParams?: Record<string, string | number>;
36
+ query?: Record<string, string | number | boolean | undefined>;
37
+ body?: unknown;
38
+ binaryBody?: BinaryBody;
39
+ headers?: Record<string, string>;
40
+ }): Promise<T>;
41
+ }
@@ -0,0 +1,83 @@
1
+ import { AdminAdapter, ArtifactsAdapter, AuditAdapter, BlobsAdapter, ContextAdapter, ExecAdapter, FederationAdapter, FederationInternalAdapter, FilesAdapter, GraphAdapter, MigrationsAdapter, MirrorsAdapter, ObservabilityAdapter, PolicyAdapter, QueryAdapter, RegistryAdapter, RepositoriesAdapter, SearchIndexAdapter, SnapshotsAdapter, WorkspacesAdapter } from '../adapters/index.js';
2
+ import { TREEDX_OPENAPI_OPERATIONS } from '../generated/index.js';
3
+ import { FetchTransport } from './transport.js';
4
+ export class TreeDxClient {
5
+ config;
6
+ transport;
7
+ repositories;
8
+ workspaces;
9
+ files;
10
+ blobs;
11
+ query;
12
+ graph;
13
+ context;
14
+ federation;
15
+ registry;
16
+ snapshots;
17
+ artifacts;
18
+ mirrors;
19
+ migrations;
20
+ exec;
21
+ observability;
22
+ admin;
23
+ audit;
24
+ policy;
25
+ searchIndex;
26
+ federationInternal;
27
+ constructor(config) {
28
+ this.config = config;
29
+ this.transport = config.transport ?? new FetchTransport(config);
30
+ const adapterContext = { transport: this.transport };
31
+ this.repositories = new RepositoriesAdapter(adapterContext);
32
+ this.workspaces = new WorkspacesAdapter(adapterContext);
33
+ this.files = new FilesAdapter(adapterContext);
34
+ this.blobs = new BlobsAdapter(adapterContext);
35
+ this.query = new QueryAdapter(adapterContext);
36
+ this.graph = new GraphAdapter(adapterContext);
37
+ this.context = new ContextAdapter(adapterContext);
38
+ this.federation = new FederationAdapter(adapterContext);
39
+ this.registry = new RegistryAdapter(adapterContext);
40
+ this.snapshots = new SnapshotsAdapter(adapterContext);
41
+ this.artifacts = new ArtifactsAdapter(adapterContext);
42
+ this.mirrors = new MirrorsAdapter(adapterContext);
43
+ this.migrations = new MigrationsAdapter(adapterContext);
44
+ this.exec = new ExecAdapter(adapterContext);
45
+ this.observability = new ObservabilityAdapter(adapterContext);
46
+ this.admin = new AdminAdapter(adapterContext);
47
+ this.audit = new AuditAdapter(adapterContext);
48
+ this.policy = new PolicyAdapter(adapterContext);
49
+ this.searchIndex = new SearchIndexAdapter(adapterContext);
50
+ this.federationInternal = new FederationInternalAdapter(adapterContext);
51
+ }
52
+ health() {
53
+ return this.observability.health();
54
+ }
55
+ version() {
56
+ return this.transport.request({ method: 'GET', path: '/api/v1/version' }).then((response) => response.data);
57
+ }
58
+ whoami() {
59
+ return this.transport.request({ method: 'GET', path: '/api/v1/auth/whoami' }).then((response) => response.data);
60
+ }
61
+ effectiveScope() {
62
+ return this.transport.request({ method: 'GET', path: '/api/v1/policy/effective-scope' }).then((response) => response.data);
63
+ }
64
+ authMode() {
65
+ return this.transport.request({ method: 'GET', path: '/api/v1/auth/mode' }).then((response) => response.data);
66
+ }
67
+ createDevToken(input) {
68
+ return this.transport.request({ method: 'POST', path: '/api/v1/auth/dev-token', body: input }).then((response) => response.data);
69
+ }
70
+ operation(method, path, options = {}) {
71
+ if (!TREEDX_OPENAPI_OPERATIONS.some((operation) => operation.method === method && operation.path === path)) {
72
+ throw new Error(`Unknown TreeDX OpenAPI operation: ${method} ${path}`);
73
+ }
74
+ const resolvedPath = path.replace(/\{([^}]+)\}/g, (_match, key) => {
75
+ const value = options.pathParams?.[key];
76
+ if (value === undefined) {
77
+ throw new Error(`Missing path parameter ${key} for ${method} ${path}`);
78
+ }
79
+ return encodeURIComponent(String(value));
80
+ });
81
+ return this.transport.request({ method, path: resolvedPath, query: options.query, body: options.body, binaryBody: options.binaryBody, headers: options.headers }).then((response) => response.data);
82
+ }
83
+ }
@@ -0,0 +1,7 @@
1
+ import { FederationAdapter } from '../adapters/index.js';
2
+ import type { TreeDxClientConfig, Transport } from '../types/index.js';
3
+ export declare class TreeDxFederatedClient {
4
+ readonly transport: Transport;
5
+ readonly federation: FederationAdapter;
6
+ constructor(config: TreeDxClientConfig);
7
+ }
@@ -0,0 +1,10 @@
1
+ import { FederationAdapter } from '../adapters/index.js';
2
+ import { FetchTransport } from './transport.js';
3
+ export class TreeDxFederatedClient {
4
+ transport;
5
+ federation;
6
+ constructor(config) {
7
+ this.transport = config.transport ?? new FetchTransport(config);
8
+ this.federation = new FederationAdapter({ transport: this.transport });
9
+ }
10
+ }
@@ -0,0 +1,7 @@
1
+ import { RegistryAdapter } from '../adapters/index.js';
2
+ import type { TreeDxClientConfig, Transport } from '../types/index.js';
3
+ export declare class TreeDxRegistryClient {
4
+ readonly transport: Transport;
5
+ readonly registry: RegistryAdapter;
6
+ constructor(config: TreeDxClientConfig);
7
+ }
@@ -0,0 +1,10 @@
1
+ import { RegistryAdapter } from '../adapters/index.js';
2
+ import { FetchTransport } from './transport.js';
3
+ export class TreeDxRegistryClient {
4
+ transport;
5
+ registry;
6
+ constructor(config) {
7
+ this.transport = config.transport ?? new FetchTransport(config);
8
+ this.registry = new RegistryAdapter({ transport: this.transport });
9
+ }
10
+ }
@@ -0,0 +1,8 @@
1
+ import type { AuthProvider, TreeDxClientConfig } from '../types/index.js';
2
+ export declare class StaticBearerTokenAuthProvider implements AuthProvider {
3
+ private readonly token;
4
+ constructor(token: string);
5
+ getToken(): string;
6
+ }
7
+ export declare function createAuthProvider(tokenOrProvider?: string | AuthProvider): AuthProvider | undefined;
8
+ export declare function resolveAuthorizationHeader(config: Pick<TreeDxClientConfig, 'token' | 'authProvider'>): Promise<Record<string, string>>;
@@ -0,0 +1,26 @@
1
+ export class StaticBearerTokenAuthProvider {
2
+ token;
3
+ constructor(token) {
4
+ this.token = token;
5
+ }
6
+ getToken() {
7
+ return this.token;
8
+ }
9
+ }
10
+ export function createAuthProvider(tokenOrProvider) {
11
+ if (!tokenOrProvider) {
12
+ return undefined;
13
+ }
14
+ if (typeof tokenOrProvider === 'string') {
15
+ return new StaticBearerTokenAuthProvider(tokenOrProvider);
16
+ }
17
+ return tokenOrProvider;
18
+ }
19
+ export async function resolveAuthorizationHeader(config) {
20
+ const provider = config.authProvider ?? createAuthProvider(config.token);
21
+ if (!provider) {
22
+ return {};
23
+ }
24
+ const token = await provider.getToken();
25
+ return token ? { Authorization: `Bearer ${token}` } : {};
26
+ }
@@ -0,0 +1,4 @@
1
+ import type { BinaryBody } from '../types/index.js';
2
+ export declare function isBinaryBody(value: unknown): value is BinaryBody;
3
+ export declare function assertBinaryBody(value: unknown): asserts value is BinaryBody;
4
+ export declare function toUint8Array(value: BinaryBody): Promise<Uint8Array>;
@@ -0,0 +1,39 @@
1
+ export function isBinaryBody(value) {
2
+ return (value instanceof Uint8Array ||
3
+ value instanceof ArrayBuffer ||
4
+ Buffer.isBuffer(value) ||
5
+ (typeof ReadableStream !== 'undefined' && value instanceof ReadableStream));
6
+ }
7
+ export function assertBinaryBody(value) {
8
+ if (!isBinaryBody(value)) {
9
+ throw new TypeError('Expected a binary-safe body value');
10
+ }
11
+ }
12
+ export async function toUint8Array(value) {
13
+ if (value instanceof Uint8Array) {
14
+ return value;
15
+ }
16
+ if (value instanceof ArrayBuffer) {
17
+ return new Uint8Array(value);
18
+ }
19
+ if (Buffer.isBuffer(value)) {
20
+ return new Uint8Array(value.buffer, value.byteOffset, value.byteLength);
21
+ }
22
+ const chunks = [];
23
+ const reader = value.getReader();
24
+ while (true) {
25
+ const result = await reader.read();
26
+ if (result.done) {
27
+ break;
28
+ }
29
+ chunks.push(result.value);
30
+ }
31
+ const total = chunks.reduce((sum, chunk) => sum + chunk.byteLength, 0);
32
+ const combined = new Uint8Array(total);
33
+ let offset = 0;
34
+ for (const chunk of chunks) {
35
+ combined.set(chunk, offset);
36
+ offset += chunk.byteLength;
37
+ }
38
+ return combined;
39
+ }
@@ -0,0 +1,17 @@
1
+ export declare class TreeDxApiError extends Error {
2
+ readonly status: number;
3
+ readonly code: string;
4
+ readonly details?: unknown;
5
+ readonly payload?: unknown;
6
+ readonly cause?: unknown;
7
+ constructor(input: {
8
+ status: number;
9
+ code: string;
10
+ message: string;
11
+ details?: unknown;
12
+ payload?: unknown;
13
+ cause?: unknown;
14
+ });
15
+ static fromResponse(status: number, payload: unknown): TreeDxApiError;
16
+ static network(message: string, cause?: unknown): TreeDxApiError;
17
+ }
@@ -0,0 +1,35 @@
1
+ export class TreeDxApiError extends Error {
2
+ status;
3
+ code;
4
+ details;
5
+ payload;
6
+ cause;
7
+ constructor(input) {
8
+ super(input.message);
9
+ this.name = 'TreeDxApiError';
10
+ this.status = input.status;
11
+ this.code = input.code;
12
+ this.details = input.details;
13
+ this.payload = input.payload;
14
+ this.cause = input.cause;
15
+ }
16
+ static fromResponse(status, payload) {
17
+ const envelope = payload;
18
+ const error = envelope?.error;
19
+ return new TreeDxApiError({
20
+ status,
21
+ code: error?.code ?? 'internal_error',
22
+ message: error?.message ?? `TreeDX request failed with status ${status}`,
23
+ details: error?.details,
24
+ payload
25
+ });
26
+ }
27
+ static network(message, cause) {
28
+ return new TreeDxApiError({
29
+ status: 0,
30
+ code: 'network_error',
31
+ message,
32
+ cause
33
+ });
34
+ }
35
+ }
@@ -0,0 +1,8 @@
1
+ export * from './TreeDxClient.js';
2
+ export * from './TreeDxRegistryClient.js';
3
+ export * from './TreeDxFederatedClient.js';
4
+ export * from './transport.js';
5
+ export * from './errors.js';
6
+ export * from './auth.js';
7
+ export * from './pagination.js';
8
+ export * from './binary.js';
@@ -0,0 +1,8 @@
1
+ export * from './TreeDxClient.js';
2
+ export * from './TreeDxRegistryClient.js';
3
+ export * from './TreeDxFederatedClient.js';
4
+ export * from './transport.js';
5
+ export * from './errors.js';
6
+ export * from './auth.js';
7
+ export * from './pagination.js';
8
+ export * from './binary.js';
@@ -0,0 +1,4 @@
1
+ import type { TreeDxPage } from '../types/index.js';
2
+ export declare function createPage<T>(input: TreeDxPage<T>): TreeDxPage<T>;
3
+ export declare function isTreeDxPage(value: unknown): value is TreeDxPage<unknown>;
4
+ export declare function getNextCursor<T>(page: TreeDxPage<T>): string | undefined;
@@ -0,0 +1,15 @@
1
+ export function createPage(input) {
2
+ return {
3
+ items: input.items,
4
+ nextCursor: input.nextCursor,
5
+ hasMore: input.hasMore,
6
+ cursor: input.cursor,
7
+ limit: input.limit
8
+ };
9
+ }
10
+ export function isTreeDxPage(value) {
11
+ return typeof value === 'object' && value !== null && Array.isArray(value.items);
12
+ }
13
+ export function getNextCursor(page) {
14
+ return page.nextCursor;
15
+ }
@@ -0,0 +1,15 @@
1
+ import type { TreeDxClientConfig, TreeDxRequest, TreeDxResponse, Transport } from '../types/index.js';
2
+ export type TreeDxFetch = typeof fetch;
3
+ export interface FetchTransportOptions {
4
+ baseUrl: string;
5
+ defaultHeaders?: Record<string, string>;
6
+ token?: string;
7
+ authProvider?: TreeDxClientConfig['authProvider'];
8
+ fetchImpl?: TreeDxFetch;
9
+ }
10
+ export declare class FetchTransport implements Transport {
11
+ private readonly options;
12
+ private readonly fetchImpl;
13
+ constructor(options: FetchTransportOptions);
14
+ request<T = unknown>(request: TreeDxRequest): Promise<TreeDxResponse<T>>;
15
+ }
@@ -0,0 +1,61 @@
1
+ import { resolveAuthorizationHeader } from './auth.js';
2
+ import { TreeDxApiError } from './errors.js';
3
+ export class FetchTransport {
4
+ options;
5
+ fetchImpl;
6
+ constructor(options) {
7
+ this.options = options;
8
+ this.fetchImpl = options.fetchImpl ?? fetch;
9
+ }
10
+ async request(request) {
11
+ const url = new URL(request.path, this.options.baseUrl);
12
+ for (const [key, value] of Object.entries(request.query ?? {})) {
13
+ if (value !== undefined) {
14
+ url.searchParams.set(key, String(value));
15
+ }
16
+ }
17
+ const authHeaders = await resolveAuthorizationHeader(this.options);
18
+ const headers = {
19
+ ...this.options.defaultHeaders,
20
+ ...authHeaders,
21
+ ...request.headers
22
+ };
23
+ let body;
24
+ if (request.binaryBody) {
25
+ body = request.binaryBody;
26
+ }
27
+ else if (request.body !== undefined) {
28
+ headers['Content-Type'] ??= 'application/json';
29
+ body = JSON.stringify(request.body);
30
+ }
31
+ let response;
32
+ try {
33
+ response = await this.fetchImpl(url, { method: request.method, headers, body });
34
+ }
35
+ catch (error) {
36
+ throw TreeDxApiError.network('TreeDX network request failed', error);
37
+ }
38
+ const data = await parseResponseBody(response);
39
+ if (!response.ok) {
40
+ throw TreeDxApiError.fromResponse(response.status, data);
41
+ }
42
+ return {
43
+ status: response.status,
44
+ headers: Object.fromEntries(response.headers.entries()),
45
+ data: data
46
+ };
47
+ }
48
+ }
49
+ async function parseResponseBody(response) {
50
+ if (response.status === 204) {
51
+ return undefined;
52
+ }
53
+ const contentType = response.headers.get('content-type') ?? '';
54
+ if (contentType.includes('application/json')) {
55
+ return response.json();
56
+ }
57
+ if (contentType.startsWith('text/')) {
58
+ return response.text();
59
+ }
60
+ return response.arrayBuffer();
61
+ }
@@ -0,0 +1,28 @@
1
+ import type { TreeDxClient } from '../client/TreeDxClient.js';
2
+ export interface TreeDxConformanceAdapterOptions {
3
+ client: TreeDxClient;
4
+ serverConfigured?: boolean;
5
+ }
6
+ export interface TreeDxConformanceScenario {
7
+ id: string;
8
+ capabilityId: string;
9
+ title: string;
10
+ required: boolean;
11
+ endpointRefs: string[];
12
+ steps: Array<{
13
+ name: string;
14
+ action: string;
15
+ description: string;
16
+ }>;
17
+ assertions: string[];
18
+ }
19
+ export interface TreeDxConformanceResult {
20
+ scenarioId: string;
21
+ status: 'passed' | 'failed' | 'not_configured';
22
+ message?: string;
23
+ }
24
+ export declare class TreeDxConformanceAdapter {
25
+ private readonly options;
26
+ constructor(options: TreeDxConformanceAdapterOptions);
27
+ runScenario(scenario: TreeDxConformanceScenario): Promise<TreeDxConformanceResult>;
28
+ }