@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
package/README.md ADDED
@@ -0,0 +1,208 @@
1
+ # TypeScript TreeDX SDK
2
+
3
+ `@treeseed/treedx` is the generic TypeScript SDK for TreeDX. It implements the
4
+ shared `packages/sdk-spec` architecture, follows `docs/api/openapi.yaml`, and
5
+ does not encode TreeSeed product semantics. `packages/trsd-sdk` is a downstream
6
+ TreeSeed consumer/reference only.
7
+
8
+ The current `sdk-manifest.yaml` reports modules, capabilities, and test roots as
9
+ `implemented`. The SDK exposes all 113 `/api/v1` OpenAPI operations through
10
+ first-class module methods and a validated raw operation fallback.
11
+
12
+ ## Install
13
+
14
+ ```bash
15
+ npm install @treeseed/treedx
16
+ ```
17
+
18
+ Import the package as:
19
+
20
+ ```ts
21
+ import { TreeDxClient, TreeDxApiError } from '@treeseed/treedx';
22
+ ```
23
+
24
+ ## Configure Client
25
+
26
+ ```ts
27
+ import { TreeDxClient } from '@treeseed/treedx';
28
+
29
+ const client = new TreeDxClient({
30
+ baseUrl: 'http://localhost:4000',
31
+ token: process.env.TREEDX_TOKEN
32
+ });
33
+ ```
34
+
35
+ The client also accepts a custom auth provider, custom transport, and default
36
+ headers for tests or embedding.
37
+
38
+ ## Authenticate
39
+
40
+ Bearer authentication uses the `Authorization: Bearer <token>` header. Tokens
41
+ may come from `token` or an auth provider. The SDK must not place production
42
+ identity in request JSON and must not log bearer tokens.
43
+
44
+ ## Basic Health Call
45
+
46
+ ```ts
47
+ const health = await client.health();
48
+ const version = await client.version();
49
+ ```
50
+
51
+ ## Repository Query
52
+
53
+ Repository-scoped query helpers live under `client.query`:
54
+
55
+ ```ts
56
+ const result = await client.query.searchFiles('repo_demo', {
57
+ query: 'release provenance',
58
+ paths: ['docs/**']
59
+ });
60
+
61
+ const file = await client.query.readFile('repo_demo', {
62
+ ref: 'refs/heads/main',
63
+ path: 'docs/index.md'
64
+ });
65
+ ```
66
+
67
+ ## Workspace File Lifecycle
68
+
69
+ Workspace-scoped file helpers live under `client.workspaces` and
70
+ `client.files`:
71
+
72
+ ```ts
73
+ const workspace = await client.workspaces.create('repo_demo', {
74
+ ref: 'refs/heads/main'
75
+ });
76
+
77
+ await client.files.write('workspace_123', {
78
+ path: 'docs/new.md',
79
+ content: '# New'
80
+ });
81
+
82
+ await client.files.patch('workspace_123', {
83
+ path: 'docs/new.md',
84
+ patch: '...'
85
+ });
86
+
87
+ await client.files.commit('workspace_123', {
88
+ message: 'Update docs'
89
+ });
90
+
91
+ await client.workspaces.close('workspace_123');
92
+ ```
93
+
94
+ ## Blob Upload And Download
95
+
96
+ Binary helpers preserve byte payloads and do not coerce arbitrary text strings
97
+ into binary upload bodies.
98
+
99
+ ```ts
100
+ await client.blobs.upload('workspace_123', new Uint8Array([1, 2, 3]));
101
+ const blob = await client.blobs.download('workspace_123', { path: 'asset.bin' });
102
+ ```
103
+
104
+ Multipart helpers expose create, part upload, complete, and abort:
105
+
106
+ ```ts
107
+ const upload = await client.blobs.createMultipartUpload('workspace_123', {
108
+ path: 'large.bin'
109
+ });
110
+
111
+ await client.blobs.uploadPart('workspace_123', upload.uploadId, 1, new Uint8Array([1]));
112
+ await client.blobs.completeMultipartUpload('workspace_123', upload.uploadId, {
113
+ parts: [{ partNumber: 1 }]
114
+ });
115
+ ```
116
+
117
+ ## Graph And Context Query
118
+
119
+ ```ts
120
+ await client.graph.refresh('repo_demo');
121
+ const graph = await client.graph.query('repo_demo', { query: 'MATCH ...' });
122
+ const context = await client.context.build('repo_demo', { query: 'ctx docs' });
123
+ const parsed = await client.context.parse('repo_demo', { source: 'ctx docs' });
124
+ ```
125
+
126
+ ## Federated Query
127
+
128
+ Federation helpers use portfolio/global TreeDX routes rather than a single
129
+ configured repository:
130
+
131
+ ```ts
132
+ const plan = await client.federation.plan({ query: 'release provenance' });
133
+ const results = await client.federation.search({ query: 'release provenance' });
134
+ ```
135
+
136
+ ## Scoped Admin And Internal Modules
137
+
138
+ Full OpenAPI coverage includes sensitive scoped modules: Admin, Audit, Policy,
139
+ SearchIndex, and FederationInternal. These APIs require appropriate TreeDX
140
+ credentials and should be used carefully against production systems. They remain
141
+ generic TreeDX APIs and do not encode TreeSeed product semantics.
142
+
143
+ The raw operation fallback validates method/path pairs against generated OpenAPI
144
+ metadata before dispatch.
145
+
146
+ ## Error Handling
147
+
148
+ Non-2xx responses and network failures surface as `TreeDxApiError` with
149
+ `status`, `code`, `message`, `details`, and `payload`. Network failures use
150
+ `status = 0` and `code = "network_error"`.
151
+
152
+ ```ts
153
+ try {
154
+ await client.whoami();
155
+ } catch (error) {
156
+ if (error instanceof TreeDxApiError) {
157
+ console.error(error.status, error.code, error.message);
158
+ }
159
+ }
160
+ ```
161
+
162
+ ## Pagination
163
+
164
+ Pagination helpers preserve opaque cursor values and page metadata. SDK code
165
+ must not decode TreeDX cursor internals.
166
+
167
+ ```ts
168
+ import { getNextCursor } from '@treeseed/treedx/treedx/client';
169
+ ```
170
+
171
+ ## Binary And Multipart
172
+
173
+ Binary bodies may be `Uint8Array`, `ArrayBuffer`, `Buffer`, or
174
+ `ReadableStream<Uint8Array>`. Multipart part numbers are passed through to
175
+ TreeDX without SDK renumbering.
176
+
177
+ ## Conformance
178
+
179
+ The shared scenario catalog loads through `TreeDxConformanceAdapter`. Live
180
+ conformance runs against the local TreeDX harness for implemented SDK
181
+ verification. Optional integration checks may still report a clean
182
+ not-configured path when no server is configured.
183
+
184
+ ```bash
185
+ npm run test:treedx-conformance
186
+ ```
187
+
188
+ ## Integration
189
+
190
+ Integration tests call a live TreeDX server only when `TREEDX_BASE_URL` is set.
191
+ Without that environment variable, they pass cleanly by reporting
192
+ not-configured behavior.
193
+
194
+ ```bash
195
+ npm run test:treedx-integration
196
+ ```
197
+
198
+ ## Development Commands
199
+
200
+ ```bash
201
+ npm ci
202
+ npm run treedx:check-generated
203
+ npm run build
204
+ npm run test:treedx-unit
205
+ npm run test:treedx-conformance
206
+ npm run test:treedx-integration
207
+ npm test
208
+ ```
@@ -0,0 +1,20 @@
1
+ import { type TreeDxAdapterContext } from './common.js';
2
+ export declare class AdminAdapter {
3
+ private readonly context;
4
+ constructor(context: TreeDxAdapterContext);
5
+ deepHealth(): Promise<unknown>;
6
+ storageHealth(): Promise<unknown>;
7
+ storageCheck(input?: unknown): Promise<unknown>;
8
+ storageRecover(input?: unknown): Promise<unknown>;
9
+ storageCompact(input?: unknown): Promise<unknown>;
10
+ storageBackup(input?: unknown): Promise<unknown>;
11
+ storageMigrations(): Promise<unknown>;
12
+ storageMigrationPlan(input: unknown): Promise<unknown>;
13
+ storageMigrationApply(input: unknown): Promise<unknown>;
14
+ storageMigrationRollback(input: unknown): Promise<unknown>;
15
+ storageRestoreVerify(input: unknown): Promise<unknown>;
16
+ storageRestore(input: unknown): Promise<unknown>;
17
+ quarantinedWorkspaces(): Promise<unknown>;
18
+ cleanupArtifacts(input?: unknown): Promise<unknown>;
19
+ importLocalRepo(input: unknown): Promise<unknown>;
20
+ }
@@ -0,0 +1,22 @@
1
+ import { jsonRequest } from './common.js';
2
+ export class AdminAdapter {
3
+ context;
4
+ constructor(context) {
5
+ this.context = context;
6
+ }
7
+ deepHealth() { return jsonRequest(this.context.transport, 'GET', '/api/v1/admin/health/deep'); }
8
+ storageHealth() { return jsonRequest(this.context.transport, 'GET', '/api/v1/admin/storage/health'); }
9
+ storageCheck(input) { return jsonRequest(this.context.transport, 'POST', '/api/v1/admin/storage/check', input); }
10
+ storageRecover(input) { return jsonRequest(this.context.transport, 'POST', '/api/v1/admin/storage/recover', input); }
11
+ storageCompact(input) { return jsonRequest(this.context.transport, 'POST', '/api/v1/admin/storage/compact', input); }
12
+ storageBackup(input) { return jsonRequest(this.context.transport, 'POST', '/api/v1/admin/storage/backup', input); }
13
+ storageMigrations() { return jsonRequest(this.context.transport, 'GET', '/api/v1/admin/storage/migrations'); }
14
+ storageMigrationPlan(input) { return jsonRequest(this.context.transport, 'POST', '/api/v1/admin/storage/migrations/plan', input); }
15
+ storageMigrationApply(input) { return jsonRequest(this.context.transport, 'POST', '/api/v1/admin/storage/migrations/apply', input); }
16
+ storageMigrationRollback(input) { return jsonRequest(this.context.transport, 'POST', '/api/v1/admin/storage/migrations/rollback', input); }
17
+ storageRestoreVerify(input) { return jsonRequest(this.context.transport, 'POST', '/api/v1/admin/storage/restore/verify', input); }
18
+ storageRestore(input) { return jsonRequest(this.context.transport, 'POST', '/api/v1/admin/storage/restore', input); }
19
+ quarantinedWorkspaces() { return jsonRequest(this.context.transport, 'GET', '/api/v1/admin/workspaces/quarantined'); }
20
+ cleanupArtifacts(input) { return jsonRequest(this.context.transport, 'POST', '/api/v1/admin/artifacts/cleanup', input); }
21
+ importLocalRepo(input) { return jsonRequest(this.context.transport, 'POST', '/api/v1/admin/repos/import-local', input); }
22
+ }
@@ -0,0 +1,9 @@
1
+ import { type TreeDxAdapterContext } from './common.js';
2
+ export declare class ArtifactsAdapter {
3
+ private readonly context;
4
+ constructor(context: TreeDxAdapterContext);
5
+ export(repoId: string, input: unknown): Promise<unknown>;
6
+ list(repoId: string): Promise<unknown>;
7
+ get(repoId: string, artifactId: string): Promise<unknown>;
8
+ delete(repoId: string, artifactId: string): Promise<unknown>;
9
+ }
@@ -0,0 +1,11 @@
1
+ import { jsonRequest, segment } from './common.js';
2
+ export class ArtifactsAdapter {
3
+ context;
4
+ constructor(context) {
5
+ this.context = context;
6
+ }
7
+ export(repoId, input) { return jsonRequest(this.context.transport, 'POST', `/api/v1/repos/${segment(repoId)}/artifacts/export`, input); }
8
+ list(repoId) { return jsonRequest(this.context.transport, 'GET', `/api/v1/repos/${segment(repoId)}/artifacts`); }
9
+ get(repoId, artifactId) { return jsonRequest(this.context.transport, 'GET', `/api/v1/repos/${segment(repoId)}/artifacts/${segment(artifactId)}`); }
10
+ delete(repoId, artifactId) { return jsonRequest(this.context.transport, 'DELETE', `/api/v1/repos/${segment(repoId)}/artifacts/${segment(artifactId)}`); }
11
+ }
@@ -0,0 +1,6 @@
1
+ import { type TreeDxAdapterContext } from './common.js';
2
+ export declare class AuditAdapter {
3
+ private readonly context;
4
+ constructor(context: TreeDxAdapterContext);
5
+ events(query?: Record<string, string | number | boolean | undefined>): Promise<unknown>;
6
+ }
@@ -0,0 +1,8 @@
1
+ import { jsonRequest } from './common.js';
2
+ export class AuditAdapter {
3
+ context;
4
+ constructor(context) {
5
+ this.context = context;
6
+ }
7
+ events(query) { return jsonRequest(this.context.transport, 'GET', '/api/v1/audit/events', undefined, query); }
8
+ }
@@ -0,0 +1,15 @@
1
+ import { type TreeDxAdapterContext } from './common.js';
2
+ import type { BinaryBody } from '../types/index.js';
3
+ export declare class BlobsAdapter {
4
+ private readonly context;
5
+ constructor(context: TreeDxAdapterContext);
6
+ read(repoId: string, input: unknown): Promise<unknown>;
7
+ write(workspaceId: string, input: unknown): Promise<unknown>;
8
+ delete(workspaceId: string, input: unknown): Promise<unknown>;
9
+ download(workspaceId: string, query?: Record<string, string | number | boolean | undefined>): Promise<unknown>;
10
+ upload(workspaceId: string, body: BinaryBody, query?: Record<string, string | number | boolean | undefined>): Promise<unknown>;
11
+ createMultipartUpload(workspaceId: string, input: unknown): Promise<unknown>;
12
+ uploadPart(workspaceId: string, uploadId: string, partNumber: number, body: BinaryBody): Promise<unknown>;
13
+ completeMultipartUpload(workspaceId: string, uploadId: string, input: unknown): Promise<unknown>;
14
+ abortMultipartUpload(workspaceId: string, uploadId: string): Promise<unknown>;
15
+ }
@@ -0,0 +1,16 @@
1
+ import { binaryRequest, jsonRequest, segment } from './common.js';
2
+ export class BlobsAdapter {
3
+ context;
4
+ constructor(context) {
5
+ this.context = context;
6
+ }
7
+ read(repoId, input) { return jsonRequest(this.context.transport, 'POST', `/api/v1/repos/${segment(repoId)}/blobs/read`, input); }
8
+ write(workspaceId, input) { return jsonRequest(this.context.transport, 'POST', `/api/v1/workspaces/${segment(workspaceId)}/blobs/write`, input); }
9
+ delete(workspaceId, input) { return jsonRequest(this.context.transport, 'POST', `/api/v1/workspaces/${segment(workspaceId)}/blobs/delete`, input); }
10
+ download(workspaceId, query) { return jsonRequest(this.context.transport, 'GET', `/api/v1/workspaces/${segment(workspaceId)}/blobs/download`, undefined, query); }
11
+ upload(workspaceId, body, query) { return binaryRequest(this.context.transport, 'PUT', `/api/v1/workspaces/${segment(workspaceId)}/blobs/upload`, body, query); }
12
+ createMultipartUpload(workspaceId, input) { return jsonRequest(this.context.transport, 'POST', `/api/v1/workspaces/${segment(workspaceId)}/blobs/uploads`, input); }
13
+ uploadPart(workspaceId, uploadId, partNumber, body) { return binaryRequest(this.context.transport, 'PUT', `/api/v1/workspaces/${segment(workspaceId)}/blobs/uploads/${segment(uploadId)}/parts/${partNumber}`, body); }
14
+ completeMultipartUpload(workspaceId, uploadId, input) { return jsonRequest(this.context.transport, 'POST', `/api/v1/workspaces/${segment(workspaceId)}/blobs/uploads/${segment(uploadId)}/complete`, input); }
15
+ abortMultipartUpload(workspaceId, uploadId) { return jsonRequest(this.context.transport, 'DELETE', `/api/v1/workspaces/${segment(workspaceId)}/blobs/uploads/${segment(uploadId)}`); }
16
+ }
@@ -0,0 +1,7 @@
1
+ import type { BinaryBody, Transport, TreeDxHttpMethod } from '../types/index.js';
2
+ export interface TreeDxAdapterContext {
3
+ transport: Transport;
4
+ }
5
+ export declare function segment(value: string): string;
6
+ export declare function jsonRequest<T>(transport: Transport, method: TreeDxHttpMethod, path: string, body?: unknown, query?: Record<string, string | number | boolean | undefined>): Promise<T>;
7
+ export declare function binaryRequest<T>(transport: Transport, method: TreeDxHttpMethod, path: string, binaryBody: BinaryBody, query?: Record<string, string | number | boolean | undefined>): Promise<T>;
@@ -0,0 +1,11 @@
1
+ export function segment(value) {
2
+ return encodeURIComponent(value);
3
+ }
4
+ export async function jsonRequest(transport, method, path, body, query) {
5
+ const response = await transport.request({ method, path, body, query });
6
+ return response.data;
7
+ }
8
+ export async function binaryRequest(transport, method, path, binaryBody, query) {
9
+ const response = await transport.request({ method, path, binaryBody, query });
10
+ return response.data;
11
+ }
@@ -0,0 +1,7 @@
1
+ import { type TreeDxAdapterContext } from './common.js';
2
+ export declare class ContextAdapter {
3
+ private readonly context;
4
+ constructor(context: TreeDxAdapterContext);
5
+ build(repoId: string, input: unknown): Promise<unknown>;
6
+ parse(repoId: string, input: unknown): Promise<unknown>;
7
+ }
@@ -0,0 +1,9 @@
1
+ import { jsonRequest, segment } from './common.js';
2
+ export class ContextAdapter {
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)}/context/build`, input); }
8
+ parse(repoId, input) { return jsonRequest(this.context.transport, 'POST', `/api/v1/repos/${segment(repoId)}/context/parse-ctx`, input); }
9
+ }
@@ -0,0 +1,6 @@
1
+ import { type TreeDxAdapterContext } from './common.js';
2
+ export declare class ExecAdapter {
3
+ private readonly context;
4
+ constructor(context: TreeDxAdapterContext);
5
+ run(workspaceId: string, input: unknown): Promise<unknown>;
6
+ }
@@ -0,0 +1,8 @@
1
+ import { jsonRequest, segment } from './common.js';
2
+ export class ExecAdapter {
3
+ context;
4
+ constructor(context) {
5
+ this.context = context;
6
+ }
7
+ run(workspaceId, input) { return jsonRequest(this.context.transport, 'POST', `/api/v1/workspaces/${segment(workspaceId)}/exec`, input); }
8
+ }
@@ -0,0 +1,9 @@
1
+ import { type TreeDxAdapterContext } from './common.js';
2
+ export declare class FederationInternalAdapter {
3
+ private readonly context;
4
+ constructor(context: TreeDxAdapterContext);
5
+ health(): Promise<unknown>;
6
+ proxy(input: unknown): Promise<unknown>;
7
+ exportMirror(repoId: string, input: unknown): Promise<unknown>;
8
+ importMirror(repoId: string, input: unknown): Promise<unknown>;
9
+ }
@@ -0,0 +1,11 @@
1
+ import { jsonRequest, segment } from './common.js';
2
+ export class FederationInternalAdapter {
3
+ context;
4
+ constructor(context) {
5
+ this.context = context;
6
+ }
7
+ health() { return jsonRequest(this.context.transport, 'GET', '/api/v1/internal/federation/health'); }
8
+ proxy(input) { return jsonRequest(this.context.transport, 'POST', '/api/v1/internal/federation/proxy', input); }
9
+ exportMirror(repoId, input) { return jsonRequest(this.context.transport, 'POST', `/api/v1/internal/federation/repos/${segment(repoId)}/mirror/export`, input); }
10
+ importMirror(repoId, input) { return jsonRequest(this.context.transport, 'POST', `/api/v1/internal/federation/repos/${segment(repoId)}/mirror/import`, input); }
11
+ }
@@ -0,0 +1,20 @@
1
+ import { segment, type TreeDxAdapterContext } from './common.js';
2
+ export declare class FederationAdapter {
3
+ private readonly context;
4
+ constructor(context: TreeDxAdapterContext);
5
+ plan(input: unknown): Promise<unknown>;
6
+ search(input: unknown): Promise<unknown>;
7
+ query(input: unknown): Promise<unknown>;
8
+ contextBuild(input: unknown): Promise<unknown>;
9
+ graphQuery(input: unknown): Promise<unknown>;
10
+ catalog(): Promise<unknown>;
11
+ pushCatalog(input?: unknown): Promise<unknown>;
12
+ syncCatalog(input?: unknown): Promise<unknown>;
13
+ peers(): Promise<unknown>;
14
+ peer(nodeId: string): Promise<unknown>;
15
+ registerNode(input: unknown): Promise<unknown>;
16
+ trustPeer(nodeId: string, input?: unknown): Promise<unknown>;
17
+ revokePeer(nodeId: string, input?: unknown): Promise<unknown>;
18
+ routes(): Promise<unknown>;
19
+ }
20
+ export { segment };
@@ -0,0 +1,22 @@
1
+ import { jsonRequest, segment } from './common.js';
2
+ export class FederationAdapter {
3
+ context;
4
+ constructor(context) {
5
+ this.context = context;
6
+ }
7
+ plan(input) { return jsonRequest(this.context.transport, 'POST', '/api/v1/federation/query/plan', input); }
8
+ search(input) { return jsonRequest(this.context.transport, 'POST', '/api/v1/search', input); }
9
+ query(input) { return jsonRequest(this.context.transport, 'POST', '/api/v1/query', input); }
10
+ contextBuild(input) { return jsonRequest(this.context.transport, 'POST', '/api/v1/context/build', input); }
11
+ graphQuery(input) { return jsonRequest(this.context.transport, 'POST', '/api/v1/graph/query', input); }
12
+ catalog() { return jsonRequest(this.context.transport, 'GET', '/api/v1/federation/catalog'); }
13
+ pushCatalog(input) { return jsonRequest(this.context.transport, 'POST', '/api/v1/federation/catalog/push', input); }
14
+ syncCatalog(input) { return jsonRequest(this.context.transport, 'POST', '/api/v1/federation/catalog/sync', input); }
15
+ peers() { return jsonRequest(this.context.transport, 'GET', '/api/v1/federation/peers'); }
16
+ peer(nodeId) { return jsonRequest(this.context.transport, 'GET', `/api/v1/federation/peers/${segment(nodeId)}`); }
17
+ registerNode(input) { return jsonRequest(this.context.transport, 'POST', '/api/v1/federation/nodes/register', input); }
18
+ trustPeer(nodeId, input) { return jsonRequest(this.context.transport, 'POST', `/api/v1/federation/peers/${segment(nodeId)}/trust`, input); }
19
+ revokePeer(nodeId, input) { return jsonRequest(this.context.transport, 'POST', `/api/v1/federation/peers/${segment(nodeId)}/revoke`, input); }
20
+ routes() { return jsonRequest(this.context.transport, 'GET', '/api/v1/federation/routes'); }
21
+ }
22
+ export { segment };
@@ -0,0 +1,14 @@
1
+ import { type TreeDxAdapterContext } from './common.js';
2
+ export declare class FilesAdapter {
3
+ private readonly context;
4
+ constructor(context: TreeDxAdapterContext);
5
+ tree(workspaceId: string, query?: Record<string, string | number | boolean | undefined>): Promise<unknown>;
6
+ read(workspaceId: string, query?: Record<string, string | number | boolean | undefined>): Promise<unknown>;
7
+ write(workspaceId: string, input: unknown): Promise<unknown>;
8
+ patch(workspaceId: string, input: unknown): Promise<unknown>;
9
+ delete(workspaceId: string, query?: Record<string, string | number | boolean | undefined>): Promise<unknown>;
10
+ search(workspaceId: string, input: unknown): Promise<unknown>;
11
+ status(workspaceId: string): Promise<unknown>;
12
+ diff(workspaceId: string, query?: Record<string, string | number | boolean | undefined>): Promise<unknown>;
13
+ commit(workspaceId: string, input: unknown): Promise<unknown>;
14
+ }
@@ -0,0 +1,16 @@
1
+ import { jsonRequest, segment } from './common.js';
2
+ export class FilesAdapter {
3
+ context;
4
+ constructor(context) {
5
+ this.context = context;
6
+ }
7
+ tree(workspaceId, query) { return jsonRequest(this.context.transport, 'GET', `/api/v1/workspaces/${segment(workspaceId)}/tree`, undefined, query); }
8
+ read(workspaceId, query) { return jsonRequest(this.context.transport, 'GET', `/api/v1/workspaces/${segment(workspaceId)}/files`, undefined, query); }
9
+ write(workspaceId, input) { return jsonRequest(this.context.transport, 'PUT', `/api/v1/workspaces/${segment(workspaceId)}/files`, input); }
10
+ patch(workspaceId, input) { return jsonRequest(this.context.transport, 'PATCH', `/api/v1/workspaces/${segment(workspaceId)}/files`, input); }
11
+ delete(workspaceId, query) { return jsonRequest(this.context.transport, 'DELETE', `/api/v1/workspaces/${segment(workspaceId)}/files`, undefined, query); }
12
+ search(workspaceId, input) { return jsonRequest(this.context.transport, 'POST', `/api/v1/workspaces/${segment(workspaceId)}/search`, input); }
13
+ status(workspaceId) { return jsonRequest(this.context.transport, 'GET', `/api/v1/workspaces/${segment(workspaceId)}/status`); }
14
+ diff(workspaceId, query) { return jsonRequest(this.context.transport, 'GET', `/api/v1/workspaces/${segment(workspaceId)}/diff`, undefined, query); }
15
+ commit(workspaceId, input) { return jsonRequest(this.context.transport, 'POST', `/api/v1/workspaces/${segment(workspaceId)}/commit`, input); }
16
+ }
@@ -0,0 +1,14 @@
1
+ import { type TreeDxAdapterContext } from './common.js';
2
+ export declare class GraphAdapter {
3
+ private readonly context;
4
+ constructor(context: TreeDxAdapterContext);
5
+ refresh(repoId: string, input?: unknown): Promise<unknown>;
6
+ query(repoId: string, input: unknown): Promise<unknown>;
7
+ refreshJob(repoId: string, jobId: string): Promise<unknown>;
8
+ node(repoId: string, nodeId: string, query?: Record<string, string | number | boolean | undefined>): Promise<unknown>;
9
+ related(repoId: string, input: unknown): Promise<unknown>;
10
+ subgraph(repoId: string, input: unknown): Promise<unknown>;
11
+ searchFiles(repoId: string, input: unknown): Promise<unknown>;
12
+ searchSections(repoId: string, input: unknown): Promise<unknown>;
13
+ searchEntities(repoId: string, input: unknown): Promise<unknown>;
14
+ }
@@ -0,0 +1,16 @@
1
+ import { jsonRequest, segment } from './common.js';
2
+ export class GraphAdapter {
3
+ context;
4
+ constructor(context) {
5
+ this.context = context;
6
+ }
7
+ refresh(repoId, input) { return jsonRequest(this.context.transport, 'POST', `/api/v1/repos/${segment(repoId)}/graph/refresh`, input); }
8
+ query(repoId, input) { return jsonRequest(this.context.transport, 'POST', `/api/v1/repos/${segment(repoId)}/graph/query`, input); }
9
+ refreshJob(repoId, jobId) { return jsonRequest(this.context.transport, 'GET', `/api/v1/repos/${segment(repoId)}/graph/refresh-jobs/${segment(jobId)}`); }
10
+ node(repoId, nodeId, query) { return jsonRequest(this.context.transport, 'GET', `/api/v1/repos/${segment(repoId)}/graph/nodes/${segment(nodeId)}`, undefined, query); }
11
+ related(repoId, input) { return jsonRequest(this.context.transport, 'POST', `/api/v1/repos/${segment(repoId)}/graph/related`, input); }
12
+ subgraph(repoId, input) { return jsonRequest(this.context.transport, 'POST', `/api/v1/repos/${segment(repoId)}/graph/subgraph`, input); }
13
+ searchFiles(repoId, input) { return jsonRequest(this.context.transport, 'POST', `/api/v1/repos/${segment(repoId)}/graph/search-files`, input); }
14
+ searchSections(repoId, input) { return jsonRequest(this.context.transport, 'POST', `/api/v1/repos/${segment(repoId)}/graph/search-sections`, input); }
15
+ searchEntities(repoId, input) { return jsonRequest(this.context.transport, 'POST', `/api/v1/repos/${segment(repoId)}/graph/search-entities`, input); }
16
+ }
@@ -0,0 +1,21 @@
1
+ export * from './common.js';
2
+ export * from './repositories.js';
3
+ export * from './workspaces.js';
4
+ export * from './files.js';
5
+ export * from './blobs.js';
6
+ export * from './query.js';
7
+ export * from './graph.js';
8
+ export * from './context.js';
9
+ export * from './federation.js';
10
+ export * from './registry.js';
11
+ export * from './snapshots.js';
12
+ export * from './artifacts.js';
13
+ export * from './mirrors.js';
14
+ export * from './migrations.js';
15
+ export * from './exec.js';
16
+ export * from './observability.js';
17
+ export * from './admin.js';
18
+ export * from './audit.js';
19
+ export * from './policy.js';
20
+ export * from './search-index.js';
21
+ export * from './federation-internal.js';
@@ -0,0 +1,21 @@
1
+ export * from './common.js';
2
+ export * from './repositories.js';
3
+ export * from './workspaces.js';
4
+ export * from './files.js';
5
+ export * from './blobs.js';
6
+ export * from './query.js';
7
+ export * from './graph.js';
8
+ export * from './context.js';
9
+ export * from './federation.js';
10
+ export * from './registry.js';
11
+ export * from './snapshots.js';
12
+ export * from './artifacts.js';
13
+ export * from './mirrors.js';
14
+ export * from './migrations.js';
15
+ export * from './exec.js';
16
+ export * from './observability.js';
17
+ export * from './admin.js';
18
+ export * from './audit.js';
19
+ export * from './policy.js';
20
+ export * from './search-index.js';
21
+ export * from './federation-internal.js';
@@ -0,0 +1,7 @@
1
+ import { type TreeDxAdapterContext } from './common.js';
2
+ export declare class MigrationsAdapter {
3
+ private readonly context;
4
+ constructor(context: TreeDxAdapterContext);
5
+ create(repoId: string, input: unknown): Promise<unknown>;
6
+ get(repoId: string, migrationId: string): Promise<unknown>;
7
+ }
@@ -0,0 +1,9 @@
1
+ import { jsonRequest, segment } from './common.js';
2
+ export class MigrationsAdapter {
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)}/migrations`, input); }
8
+ get(repoId, migrationId) { return jsonRequest(this.context.transport, 'GET', `/api/v1/repos/${segment(repoId)}/migrations/${segment(migrationId)}`); }
9
+ }
@@ -0,0 +1,10 @@
1
+ import { type TreeDxAdapterContext } from './common.js';
2
+ export declare class MirrorsAdapter {
3
+ private readonly context;
4
+ constructor(context: TreeDxAdapterContext);
5
+ list(repoId: string): Promise<unknown>;
6
+ upsert(repoId: string, input: unknown): Promise<unknown>;
7
+ sync(repoId: string, mirrorId: string, input?: unknown): Promise<unknown>;
8
+ health(repoId: string, mirrorId: string, input?: unknown): Promise<unknown>;
9
+ promote(repoId: string, mirrorId: string, input?: unknown): Promise<unknown>;
10
+ }
@@ -0,0 +1,12 @@
1
+ import { jsonRequest, segment } from './common.js';
2
+ export class MirrorsAdapter {
3
+ context;
4
+ constructor(context) {
5
+ this.context = context;
6
+ }
7
+ list(repoId) { return jsonRequest(this.context.transport, 'GET', `/api/v1/repos/${segment(repoId)}/mirrors`); }
8
+ upsert(repoId, input) { return jsonRequest(this.context.transport, 'POST', `/api/v1/repos/${segment(repoId)}/mirrors`, input); }
9
+ sync(repoId, mirrorId, input) { return jsonRequest(this.context.transport, 'POST', `/api/v1/repos/${segment(repoId)}/mirrors/${segment(mirrorId)}/sync`, input); }
10
+ health(repoId, mirrorId, input) { return jsonRequest(this.context.transport, 'POST', `/api/v1/repos/${segment(repoId)}/mirrors/${segment(mirrorId)}/health`, input); }
11
+ promote(repoId, mirrorId, input) { return jsonRequest(this.context.transport, 'POST', `/api/v1/repos/${segment(repoId)}/mirrors/${segment(mirrorId)}/promote`, input); }
12
+ }
@@ -0,0 +1,9 @@
1
+ import { type TreeDxAdapterContext } from './common.js';
2
+ export declare class ObservabilityAdapter {
3
+ private readonly context;
4
+ constructor(context: TreeDxAdapterContext);
5
+ health(): Promise<unknown>;
6
+ ready(): Promise<unknown>;
7
+ deepHealth(): Promise<unknown>;
8
+ metrics(): Promise<unknown>;
9
+ }
@@ -0,0 +1,11 @@
1
+ import { jsonRequest } from './common.js';
2
+ export class ObservabilityAdapter {
3
+ context;
4
+ constructor(context) {
5
+ this.context = context;
6
+ }
7
+ health() { return jsonRequest(this.context.transport, 'GET', '/api/v1/health'); }
8
+ ready() { return jsonRequest(this.context.transport, 'GET', '/api/v1/ready'); }
9
+ deepHealth() { return jsonRequest(this.context.transport, 'GET', '/api/v1/health/deep'); }
10
+ metrics() { return jsonRequest(this.context.transport, 'GET', '/api/v1/metrics'); }
11
+ }