@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.
- package/README.md +208 -0
- package/dist/treedx/adapters/admin.d.ts +20 -0
- package/dist/treedx/adapters/admin.js +22 -0
- package/dist/treedx/adapters/artifacts.d.ts +9 -0
- package/dist/treedx/adapters/artifacts.js +11 -0
- package/dist/treedx/adapters/audit.d.ts +6 -0
- package/dist/treedx/adapters/audit.js +8 -0
- package/dist/treedx/adapters/blobs.d.ts +15 -0
- package/dist/treedx/adapters/blobs.js +16 -0
- package/dist/treedx/adapters/common.d.ts +7 -0
- package/dist/treedx/adapters/common.js +11 -0
- package/dist/treedx/adapters/context.d.ts +7 -0
- package/dist/treedx/adapters/context.js +9 -0
- package/dist/treedx/adapters/exec.d.ts +6 -0
- package/dist/treedx/adapters/exec.js +8 -0
- package/dist/treedx/adapters/federation-internal.d.ts +9 -0
- package/dist/treedx/adapters/federation-internal.js +11 -0
- package/dist/treedx/adapters/federation.d.ts +20 -0
- package/dist/treedx/adapters/federation.js +22 -0
- package/dist/treedx/adapters/files.d.ts +14 -0
- package/dist/treedx/adapters/files.js +16 -0
- package/dist/treedx/adapters/graph.d.ts +14 -0
- package/dist/treedx/adapters/graph.js +16 -0
- package/dist/treedx/adapters/index.d.ts +21 -0
- package/dist/treedx/adapters/index.js +21 -0
- package/dist/treedx/adapters/migrations.d.ts +7 -0
- package/dist/treedx/adapters/migrations.js +9 -0
- package/dist/treedx/adapters/mirrors.d.ts +10 -0
- package/dist/treedx/adapters/mirrors.js +12 -0
- package/dist/treedx/adapters/observability.d.ts +9 -0
- package/dist/treedx/adapters/observability.js +11 -0
- package/dist/treedx/adapters/policy.d.ts +9 -0
- package/dist/treedx/adapters/policy.js +11 -0
- package/dist/treedx/adapters/query.d.ts +9 -0
- package/dist/treedx/adapters/query.js +11 -0
- package/dist/treedx/adapters/registry.d.ts +9 -0
- package/dist/treedx/adapters/registry.js +11 -0
- package/dist/treedx/adapters/repositories.d.ts +14 -0
- package/dist/treedx/adapters/repositories.js +16 -0
- package/dist/treedx/adapters/search-index.d.ts +8 -0
- package/dist/treedx/adapters/search-index.js +10 -0
- package/dist/treedx/adapters/snapshots.d.ts +7 -0
- package/dist/treedx/adapters/snapshots.js +9 -0
- package/dist/treedx/adapters/workspaces.d.ts +8 -0
- package/dist/treedx/adapters/workspaces.js +10 -0
- package/dist/treedx/client/TreeDxClient.d.ts +41 -0
- package/dist/treedx/client/TreeDxClient.js +83 -0
- package/dist/treedx/client/TreeDxFederatedClient.d.ts +7 -0
- package/dist/treedx/client/TreeDxFederatedClient.js +10 -0
- package/dist/treedx/client/TreeDxRegistryClient.d.ts +7 -0
- package/dist/treedx/client/TreeDxRegistryClient.js +10 -0
- package/dist/treedx/client/auth.d.ts +8 -0
- package/dist/treedx/client/auth.js +26 -0
- package/dist/treedx/client/binary.d.ts +4 -0
- package/dist/treedx/client/binary.js +39 -0
- package/dist/treedx/client/errors.d.ts +17 -0
- package/dist/treedx/client/errors.js +35 -0
- package/dist/treedx/client/index.d.ts +8 -0
- package/dist/treedx/client/index.js +8 -0
- package/dist/treedx/client/pagination.d.ts +4 -0
- package/dist/treedx/client/pagination.js +15 -0
- package/dist/treedx/client/transport.d.ts +15 -0
- package/dist/treedx/client/transport.js +61 -0
- package/dist/treedx/conformance/adapter.d.ts +28 -0
- package/dist/treedx/conformance/adapter.js +43 -0
- package/dist/treedx/conformance/index.d.ts +1 -0
- package/dist/treedx/conformance/index.js +1 -0
- package/dist/treedx/generated/index.d.ts +1 -0
- package/dist/treedx/generated/index.js +1 -0
- package/dist/treedx/generated/openapi-types.d.ts +348 -0
- package/dist/treedx/generated/openapi-types.js +117 -0
- package/dist/treedx/index.d.ts +5 -0
- package/dist/treedx/index.js +5 -0
- package/dist/treedx/ports/admin-port.d.ts +1 -0
- package/dist/treedx/ports/admin-port.js +1 -0
- package/dist/treedx/ports/artifact-port.d.ts +2 -0
- package/dist/treedx/ports/artifact-port.js +1 -0
- package/dist/treedx/ports/audit-port.d.ts +1 -0
- package/dist/treedx/ports/audit-port.js +1 -0
- package/dist/treedx/ports/auth-provider.d.ts +1 -0
- package/dist/treedx/ports/auth-provider.js +1 -0
- package/dist/treedx/ports/blob-port.d.ts +2 -0
- package/dist/treedx/ports/blob-port.js +1 -0
- package/dist/treedx/ports/context-port.d.ts +2 -0
- package/dist/treedx/ports/context-port.js +1 -0
- package/dist/treedx/ports/exec-port.d.ts +2 -0
- package/dist/treedx/ports/exec-port.js +1 -0
- package/dist/treedx/ports/federation-internal-port.d.ts +1 -0
- package/dist/treedx/ports/federation-internal-port.js +1 -0
- package/dist/treedx/ports/federation-port.d.ts +2 -0
- package/dist/treedx/ports/federation-port.js +1 -0
- package/dist/treedx/ports/file-port.d.ts +2 -0
- package/dist/treedx/ports/file-port.js +1 -0
- package/dist/treedx/ports/graph-port.d.ts +2 -0
- package/dist/treedx/ports/graph-port.js +1 -0
- package/dist/treedx/ports/index.d.ts +21 -0
- package/dist/treedx/ports/index.js +21 -0
- package/dist/treedx/ports/migration-port.d.ts +2 -0
- package/dist/treedx/ports/migration-port.js +1 -0
- package/dist/treedx/ports/mirror-port.d.ts +2 -0
- package/dist/treedx/ports/mirror-port.js +1 -0
- package/dist/treedx/ports/policy-port.d.ts +1 -0
- package/dist/treedx/ports/policy-port.js +1 -0
- package/dist/treedx/ports/query-port.d.ts +2 -0
- package/dist/treedx/ports/query-port.js +1 -0
- package/dist/treedx/ports/registry-port.d.ts +2 -0
- package/dist/treedx/ports/registry-port.js +1 -0
- package/dist/treedx/ports/repository-port.d.ts +2 -0
- package/dist/treedx/ports/repository-port.js +1 -0
- package/dist/treedx/ports/search-index-port.d.ts +1 -0
- package/dist/treedx/ports/search-index-port.js +1 -0
- package/dist/treedx/ports/snapshot-port.d.ts +2 -0
- package/dist/treedx/ports/snapshot-port.js +1 -0
- package/dist/treedx/ports/transport.d.ts +1 -0
- package/dist/treedx/ports/transport.js +1 -0
- package/dist/treedx/ports/workspace-port.d.ts +2 -0
- package/dist/treedx/ports/workspace-port.js +1 -0
- package/dist/treedx/types/index.d.ts +55 -0
- package/dist/treedx/types/index.js +1 -0
- package/package.json +66 -0
- 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,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,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
|
+
}
|