@knowzai/api-client 0.1.0 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (44) hide show
  1. package/dist/.tsbuildinfo +1 -1
  2. package/dist/client.d.ts +24 -3
  3. package/dist/client.d.ts.map +1 -1
  4. package/dist/client.js +396 -36
  5. package/dist/client.js.map +1 -1
  6. package/dist/contracts.d.ts +102 -0
  7. package/dist/contracts.d.ts.map +1 -1
  8. package/dist/index.d.ts +3 -3
  9. package/dist/index.d.ts.map +1 -1
  10. package/dist/index.js +1 -1
  11. package/dist/index.js.map +1 -1
  12. package/dist/resources/api-keys.d.ts +19 -0
  13. package/dist/resources/api-keys.d.ts.map +1 -0
  14. package/dist/resources/api-keys.js +36 -0
  15. package/dist/resources/api-keys.js.map +1 -0
  16. package/dist/resources/auth.d.ts +10 -1
  17. package/dist/resources/auth.d.ts.map +1 -1
  18. package/dist/resources/auth.js +15 -1
  19. package/dist/resources/auth.js.map +1 -1
  20. package/dist/resources/federation.d.ts +98 -0
  21. package/dist/resources/federation.d.ts.map +1 -0
  22. package/dist/resources/federation.js +184 -0
  23. package/dist/resources/federation.js.map +1 -0
  24. package/dist/resources/files.d.ts +72 -0
  25. package/dist/resources/files.d.ts.map +1 -0
  26. package/dist/resources/files.js +205 -0
  27. package/dist/resources/files.js.map +1 -0
  28. package/dist/resources/index.d.ts +4 -0
  29. package/dist/resources/index.d.ts.map +1 -1
  30. package/dist/resources/index.js +4 -0
  31. package/dist/resources/index.js.map +1 -1
  32. package/dist/resources/knowledge.d.ts +6 -0
  33. package/dist/resources/knowledge.d.ts.map +1 -1
  34. package/dist/resources/knowledge.js +13 -0
  35. package/dist/resources/knowledge.js.map +1 -1
  36. package/dist/resources/portability.d.ts +133 -0
  37. package/dist/resources/portability.d.ts.map +1 -0
  38. package/dist/resources/portability.js +244 -0
  39. package/dist/resources/portability.js.map +1 -0
  40. package/dist/resources/schemas.d.ts +108 -37
  41. package/dist/resources/schemas.d.ts.map +1 -1
  42. package/dist/resources/schemas.js +61 -7
  43. package/dist/resources/schemas.js.map +1 -1
  44. package/package.json +3 -3
@@ -0,0 +1,72 @@
1
+ import type { RawCoreClient } from '../contracts.js';
2
+ /** Progress for one chunk of one file. `bytesSent` is cumulative for the file. */
3
+ export interface UploadProgress {
4
+ fileName: string;
5
+ chunkIndex: number;
6
+ totalChunks: number;
7
+ bytesSent: number;
8
+ totalBytes: number;
9
+ }
10
+ export interface UploadedFile {
11
+ fileRecordId: string;
12
+ fileName: string;
13
+ size: number;
14
+ contentType: string;
15
+ }
16
+ export interface UploadInput {
17
+ /** Local file path. Only its basename crosses the wire (R12). */
18
+ path: string;
19
+ /**
20
+ * An ALREADY-OPEN, already-approved descriptor for `path`.
21
+ *
22
+ * H7 (TOCTOU) — a caller that gated the file (`openSafeFile`: `O_NOFOLLOW`
23
+ * + `fstat` policy) hands the descriptor itself over rather than the path, and
24
+ * the uploader `fstat`s and reads THAT descriptor. Without this the uploader
25
+ * re-opens `path` after `initialize` has round-tripped, so the file that was
26
+ * judged and the file whose bytes are sent can differ — a path swapped for a
27
+ * symlink to a credential file in that window would be uploaded instead.
28
+ *
29
+ * The descriptor is BORROWED: the caller opened it and the caller closes it.
30
+ * `path` is still used, for its basename and content type only.
31
+ */
32
+ fd?: number;
33
+ /** Overrides the extension-derived content type (R11). */
34
+ contentType?: string;
35
+ /** Omit for a Standalone upload — required when attaching to an existing item (R2). */
36
+ createAs?: 'knowledge' | 'inbox';
37
+ /** Required when `createAs === 'knowledge'`. */
38
+ vaultId?: string;
39
+ title?: string;
40
+ /** Slides the parent's AwaitingAttachments TTL window forward across a multi-file run (R3). */
41
+ parentKnowledgeId?: string;
42
+ onProgress?: (progress: UploadProgress) => void;
43
+ signal?: AbortSignal;
44
+ /** Bounded per-chunk retry for retryable failures (R8). Default 2. */
45
+ chunkRetries?: number;
46
+ /** Base backoff between chunk retries, doubling each attempt. Default 250ms. */
47
+ chunkRetryDelayMs?: number;
48
+ }
49
+ /** Infer a content type from a file name (R11). Unknown → `application/octet-stream`. */
50
+ export declare function contentTypeForFile(fileName: string): string;
51
+ export declare class FilesApi {
52
+ private readonly core;
53
+ constructor(core: RawCoreClient);
54
+ /**
55
+ * Upload a local file with the platform's three-call chunked protocol (R1):
56
+ * `initialize` → N× `streaming` → `complete`. Bytes are streamed from disk one
57
+ * server-sized chunk at a time, so file size is bounded by the platform's
58
+ * ingestion limits rather than by client memory.
59
+ */
60
+ upload(input: UploadInput): Promise<UploadedFile>;
61
+ /**
62
+ * PUT one chunk. Retries only what is worth retrying (R8): a 404 means the
63
+ * session expired or is not ours, so retrying is pointless and misleading —
64
+ * it propagates immediately and fails the whole file.
65
+ *
66
+ * `X-Chunk-Hash` is deliberately NOT sent: the server compares it as base64
67
+ * MD5 (`ChunkedUploadService.UploadChunkAsync`), not the SHA-256 hex used for
68
+ * `X-File-Hash`, and it is optional. Whole-file integrity is covered on complete.
69
+ */
70
+ private sendChunk;
71
+ }
72
+ //# sourceMappingURL=files.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"files.d.ts","sourceRoot":"","sources":["../../src/resources/files.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAErD,kFAAkF;AAClF,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,YAAY;IAC3B,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,WAAW;IAC1B,iEAAiE;IACjE,IAAI,EAAE,MAAM,CAAC;IACb;;;;;;;;;;;;OAYG;IACH,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,0DAA0D;IAC1D,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,uFAAuF;IACvF,QAAQ,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC;IACjC,gDAAgD;IAChD,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,+FAA+F;IAC/F,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,UAAU,CAAC,EAAE,CAAC,QAAQ,EAAE,cAAc,KAAK,IAAI,CAAC;IAChD,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,sEAAsE;IACtE,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,gFAAgF;IAChF,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC5B;AAwDD,yFAAyF;AACzF,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAE3D;AAuBD,qBAAa,QAAQ;IACP,OAAO,CAAC,QAAQ,CAAC,IAAI;gBAAJ,IAAI,EAAE,aAAa;IAEhD;;;;;OAKG;IACG,MAAM,CAAC,KAAK,EAAE,WAAW,GAAG,OAAO,CAAC,YAAY,CAAC;IA0FvD;;;;;;;;OAQG;YACW,SAAS;CA4BxB"}
@@ -0,0 +1,205 @@
1
+ import { createHash } from 'node:crypto';
2
+ import { fstat as fstatCb, read as readCb } from 'node:fs';
3
+ import { open, stat } from 'node:fs/promises';
4
+ import { basename, extname } from 'node:path';
5
+ import { z } from 'zod';
6
+ import { ApiError } from '@knowzai/types';
7
+ const SessionSchema = z.object({
8
+ uploadId: z.string(),
9
+ fileRecordId: z.string(),
10
+ totalChunks: z.number().int().nonnegative(),
11
+ chunkSize: z.number().int().positive(),
12
+ expiresAt: z.string().optional(),
13
+ });
14
+ const CompletedSchema = z.object({
15
+ fileRecordId: z.string(),
16
+ fileName: z.string().optional(),
17
+ fileSize: z.number().optional(),
18
+ contentType: z.string().optional(),
19
+ });
20
+ /**
21
+ * Extension → content type. Node has no built-in MIME table and the CLI takes no
22
+ * runtime dependencies for this; unknown extensions fall through to
23
+ * `application/octet-stream`, which the platform handles (R11).
24
+ */
25
+ const CONTENT_TYPES = {
26
+ '.txt': 'text/plain',
27
+ '.md': 'text/markdown',
28
+ '.csv': 'text/csv',
29
+ '.html': 'text/html',
30
+ '.htm': 'text/html',
31
+ '.json': 'application/json',
32
+ '.xml': 'application/xml',
33
+ '.yaml': 'application/yaml',
34
+ '.yml': 'application/yaml',
35
+ '.pdf': 'application/pdf',
36
+ '.doc': 'application/msword',
37
+ '.docx': 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
38
+ '.xls': 'application/vnd.ms-excel',
39
+ '.xlsx': 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
40
+ '.ppt': 'application/vnd.ms-powerpoint',
41
+ '.pptx': 'application/vnd.openxmlformats-officedocument.presentationml.presentation',
42
+ '.png': 'image/png',
43
+ '.jpg': 'image/jpeg',
44
+ '.jpeg': 'image/jpeg',
45
+ '.gif': 'image/gif',
46
+ '.webp': 'image/webp',
47
+ '.svg': 'image/svg+xml',
48
+ '.heic': 'image/heic',
49
+ '.mp3': 'audio/mpeg',
50
+ '.wav': 'audio/wav',
51
+ '.m4a': 'audio/mp4',
52
+ '.ogg': 'audio/ogg',
53
+ '.webm': 'video/webm',
54
+ '.mp4': 'video/mp4',
55
+ '.mov': 'video/quicktime',
56
+ '.zip': 'application/zip',
57
+ };
58
+ /** Infer a content type from a file name (R11). Unknown → `application/octet-stream`. */
59
+ export function contentTypeForFile(fileName) {
60
+ return CONTENT_TYPES[extname(fileName).toLowerCase()] ?? 'application/octet-stream';
61
+ }
62
+ /** A chunk failure worth another attempt: upstream 5xx/429, or a transport error. */
63
+ function isRetryableChunkError(e) {
64
+ if (!(e instanceof ApiError))
65
+ return false;
66
+ return e.status === 0 || e.status === 429 || e.status >= 500;
67
+ }
68
+ const delay = (ms) => ms <= 0 ? Promise.resolve() : new Promise((resolve) => setTimeout(resolve, ms));
69
+ /** `fstat` of a borrowed descriptor — promisified so the upload loop stays async. */
70
+ function fstatFd(fd) {
71
+ return new Promise((resolve, reject) => fstatCb(fd, (e, s) => (e ? reject(e) : resolve(s))));
72
+ }
73
+ /** Positional read from a borrowed descriptor. Does not move the file offset. */
74
+ function readFd(fd, buffer, position) {
75
+ return new Promise((resolve, reject) => readCb(fd, buffer, 0, buffer.length, position, (e, bytesRead) => (e ? reject(e) : resolve(bytesRead))));
76
+ }
77
+ export class FilesApi {
78
+ core;
79
+ constructor(core) {
80
+ this.core = core;
81
+ }
82
+ /**
83
+ * Upload a local file with the platform's three-call chunked protocol (R1):
84
+ * `initialize` → N× `streaming` → `complete`. Bytes are streamed from disk one
85
+ * server-sized chunk at a time, so file size is bounded by the platform's
86
+ * ingestion limits rather than by client memory.
87
+ */
88
+ async upload(input) {
89
+ const fileName = basename(input.path); // R12 — no directory component crosses the wire.
90
+ // The size comes from the BORROWED descriptor when there is one, so it
91
+ // describes the file the caller approved rather than whatever the path
92
+ // resolves to now.
93
+ const { size } = input.fd === undefined ? await stat(input.path) : await fstatFd(input.fd);
94
+ if (size === 0) {
95
+ throw new ApiError(0, [`${fileName} is empty — there is nothing to upload.`], {
96
+ code: 'empty-file',
97
+ });
98
+ }
99
+ const contentType = input.contentType ?? contentTypeForFile(fileName);
100
+ // 1) initialize — the server issues the upload id, the fileRecordId (R4) and
101
+ // the chunk size (R5). A 413 here carries the ingestion-limit message.
102
+ const session = await this.core.request({
103
+ method: 'POST',
104
+ path: '/api/v1/files/upload/initialize',
105
+ body: { fileName, fileSize: size, contentType },
106
+ schema: SessionSchema,
107
+ });
108
+ const chunkSize = session.chunkSize;
109
+ const totalChunks = session.totalChunks || Math.ceil(size / chunkSize);
110
+ const retries = input.chunkRetries ?? 2;
111
+ const retryDelayMs = input.chunkRetryDelayMs ?? 250;
112
+ // 2) streaming — one call per chunk, 0-based contiguous indices, never an
113
+ // empty body. The whole-file hash is accumulated on the way past.
114
+ const fileHash = createHash('sha256');
115
+ // Only open the path when no descriptor was handed to us. A borrowed fd is
116
+ // never re-opened and never closed here — closing it would yank a handle the
117
+ // caller still owns.
118
+ const handle = input.fd === undefined ? await open(input.path, 'r') : undefined;
119
+ const fd = input.fd;
120
+ try {
121
+ let bytesSent = 0;
122
+ for (let chunkIndex = 0; bytesSent < size; chunkIndex++) {
123
+ const buffer = Buffer.allocUnsafe(Math.min(chunkSize, size - bytesSent));
124
+ const bytesRead = handle === undefined
125
+ ? await readFd(fd, buffer, bytesSent)
126
+ : (await handle.read(buffer, 0, buffer.length, bytesSent)).bytesRead;
127
+ if (bytesRead === 0)
128
+ break; // Truncated under us — stop rather than send an empty chunk.
129
+ const chunk = buffer.subarray(0, bytesRead);
130
+ fileHash.update(chunk);
131
+ await this.sendChunk(session.uploadId, chunkIndex, totalChunks, chunk, {
132
+ retries,
133
+ retryDelayMs,
134
+ signal: input.signal,
135
+ });
136
+ bytesSent += bytesRead;
137
+ input.onProgress?.({ fileName, chunkIndex, totalChunks, bytesSent, totalBytes: size });
138
+ }
139
+ }
140
+ finally {
141
+ await handle?.close();
142
+ }
143
+ // 3) complete — echo the server-issued fileRecordId verbatim (R4). `createAs`
144
+ // is omitted for the attach flow: HTTP /complete cannot express
145
+ // ExistingKnowledge and would silently degrade to Standalone (R2).
146
+ const completed = await this.core.request({
147
+ method: 'POST',
148
+ path: '/api/v1/files/upload/complete',
149
+ body: {
150
+ uploadId: session.uploadId,
151
+ fileRecordId: session.fileRecordId,
152
+ fileName,
153
+ fileSize: size,
154
+ contentType,
155
+ ...(input.createAs ? { createAs: input.createAs } : {}),
156
+ ...(input.vaultId ? { vaultId: input.vaultId } : {}),
157
+ ...(input.title ? { title: input.title } : {}),
158
+ ...(input.parentKnowledgeId ? { parentKnowledgeId: input.parentKnowledgeId } : {}),
159
+ },
160
+ // R6 — the server compares this against SHA-256 lowercase hex.
161
+ headers: { 'X-File-Hash': fileHash.digest('hex') },
162
+ schema: CompletedSchema,
163
+ });
164
+ return {
165
+ fileRecordId: completed.fileRecordId,
166
+ fileName: completed.fileName ?? fileName,
167
+ size,
168
+ contentType: completed.contentType ?? contentType,
169
+ };
170
+ }
171
+ /**
172
+ * PUT one chunk. Retries only what is worth retrying (R8): a 404 means the
173
+ * session expired or is not ours, so retrying is pointless and misleading —
174
+ * it propagates immediately and fails the whole file.
175
+ *
176
+ * `X-Chunk-Hash` is deliberately NOT sent: the server compares it as base64
177
+ * MD5 (`ChunkedUploadService.UploadChunkAsync`), not the SHA-256 hex used for
178
+ * `X-File-Hash`, and it is optional. Whole-file integrity is covered on complete.
179
+ */
180
+ async sendChunk(uploadId, chunkIndex, totalChunks, chunk, opts) {
181
+ for (let attempt = 0;; attempt++) {
182
+ try {
183
+ await this.core.rawRequest({
184
+ method: 'POST',
185
+ path: '/api/v1/files/upload/streaming',
186
+ body: chunk,
187
+ headers: {
188
+ 'X-Upload-Id': uploadId,
189
+ 'X-Chunk-Index': String(chunkIndex),
190
+ 'X-Total-Chunks': String(totalChunks),
191
+ },
192
+ schema: z.unknown(),
193
+ signal: opts.signal,
194
+ });
195
+ return;
196
+ }
197
+ catch (e) {
198
+ if (attempt >= opts.retries || !isRetryableChunkError(e))
199
+ throw e;
200
+ await delay(opts.retryDelayMs * 2 ** attempt);
201
+ }
202
+ }
203
+ }
204
+ }
205
+ //# sourceMappingURL=files.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"files.js","sourceRoot":"","sources":["../../src/resources/files.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,10 @@
1
1
  export { AuthApi } from './auth.js';
2
+ export { ApiKeysApi } from './api-keys.js';
2
3
  export { KnowledgeApi } from './knowledge.js';
3
4
  export { VaultsApi } from './vaults.js';
4
5
  export { SearchApi, type SearchQuery } from './search.js';
5
6
  export { AskApi, type AskRequest } from './ask.js';
7
+ export { FilesApi, contentTypeForFile, type UploadInput, type UploadProgress, type UploadedFile, } from './files.js';
8
+ export { PortabilityApi, type PortabilityDialect, type ConflictStrategy, type ExportScopeType, type PortabilitySchema, type ExportScopeInput, type ExportToFileInput, type ExportToFileResult, type ExportJob, type ExportJobPart, type ExportJobStatus, type ImportValidation, type EntityCounts, type ImportOutcome, } from './portability.js';
9
+ export { FederationApi, type FederationPeer, type FederationVaultLink, type FederationRunSummary, type FederationSyncOptionsInput, } from './federation.js';
6
10
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/resources/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,SAAS,EAAE,KAAK,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1D,OAAO,EAAE,MAAM,EAAE,KAAK,UAAU,EAAE,MAAM,UAAU,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/resources/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAC3C,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,SAAS,EAAE,KAAK,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1D,OAAO,EAAE,MAAM,EAAE,KAAK,UAAU,EAAE,MAAM,UAAU,CAAC;AACnD,OAAO,EACL,QAAQ,EACR,kBAAkB,EAClB,KAAK,WAAW,EAChB,KAAK,cAAc,EACnB,KAAK,YAAY,GAClB,MAAM,YAAY,CAAC;AACpB,OAAO,EACL,cAAc,EACd,KAAK,kBAAkB,EACvB,KAAK,gBAAgB,EACrB,KAAK,eAAe,EACpB,KAAK,iBAAiB,EACtB,KAAK,gBAAgB,EACrB,KAAK,iBAAiB,EACtB,KAAK,kBAAkB,EACvB,KAAK,SAAS,EACd,KAAK,aAAa,EAClB,KAAK,eAAe,EACpB,KAAK,gBAAgB,EACrB,KAAK,YAAY,EACjB,KAAK,aAAa,GACnB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EACL,aAAa,EACb,KAAK,cAAc,EACnB,KAAK,mBAAmB,EACxB,KAAK,oBAAoB,EACzB,KAAK,0BAA0B,GAChC,MAAM,iBAAiB,CAAC"}
@@ -1,6 +1,10 @@
1
1
  export { AuthApi } from './auth.js';
2
+ export { ApiKeysApi } from './api-keys.js';
2
3
  export { KnowledgeApi } from './knowledge.js';
3
4
  export { VaultsApi } from './vaults.js';
4
5
  export { SearchApi } from './search.js';
5
6
  export { AskApi } from './ask.js';
7
+ export { FilesApi, contentTypeForFile, } from './files.js';
8
+ export { PortabilityApi, } from './portability.js';
9
+ export { FederationApi, } from './federation.js';
6
10
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/resources/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,SAAS,EAAoB,MAAM,aAAa,CAAC;AAC1D,OAAO,EAAE,MAAM,EAAmB,MAAM,UAAU,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/resources/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAC3C,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,SAAS,EAAoB,MAAM,aAAa,CAAC;AAC1D,OAAO,EAAE,MAAM,EAAmB,MAAM,UAAU,CAAC;AACnD,OAAO,EACL,QAAQ,EACR,kBAAkB,GAInB,MAAM,YAAY,CAAC;AACpB,OAAO,EACL,cAAc,GAcf,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EACL,aAAa,GAKd,MAAM,iBAAiB,CAAC"}
@@ -7,6 +7,12 @@ export declare class KnowledgeApi {
7
7
  create(req: CreateKnowledgeRequest): Promise<KnowledgeDetail>;
8
8
  get(id: string): Promise<KnowledgeDetail>;
9
9
  update(id: string, req: UpdateKnowledgeRequest): Promise<KnowledgeDetail>;
10
+ /**
11
+ * Link an already-uploaded FileRecord to a knowledge item. This is the second
12
+ * half of the attach flow — `files.upload` completes as Standalone because HTTP
13
+ * `/complete` cannot express ExistingKnowledge (CLI_KnowledgeAttachUpload R2).
14
+ */
15
+ attachFile(knowledgeId: string, fileRecordId: string, displayOrder?: number): Promise<void>;
10
16
  remove(id: string): Promise<void>;
11
17
  status(id: string): Promise<KnowledgeStatus>;
12
18
  }
@@ -1 +1 @@
1
- {"version":3,"file":"knowledge.d.ts","sourceRoot":"","sources":["../../src/resources/knowledge.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,KAAK,EACV,sBAAsB,EACtB,sBAAsB,EACtB,eAAe,EACf,gBAAgB,EAChB,eAAe,EACf,kBAAkB,EAClB,KAAK,EACN,MAAM,gBAAgB,CAAC;AAWxB,qBAAa,YAAY;IACX,OAAO,CAAC,QAAQ,CAAC,IAAI;gBAAJ,IAAI,EAAE,UAAU;IAEvC,IAAI,CAAC,CAAC,GAAE,kBAAuB,GAAG,OAAO,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC;IAkBlE,MAAM,CAAC,GAAG,EAAE,sBAAsB,GAAG,OAAO,CAAC,eAAe,CAAC;IAwBnE,GAAG,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC;IAQnC,MAAM,CAAC,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,sBAAsB,GAAG,OAAO,CAAC,eAAe,CAAC;IAsBzE,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAQvC,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC;CAO7C"}
1
+ {"version":3,"file":"knowledge.d.ts","sourceRoot":"","sources":["../../src/resources/knowledge.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,KAAK,EACV,sBAAsB,EACtB,sBAAsB,EACtB,eAAe,EACf,gBAAgB,EAChB,eAAe,EACf,kBAAkB,EAClB,KAAK,EACN,MAAM,gBAAgB,CAAC;AAWxB,qBAAa,YAAY;IACX,OAAO,CAAC,QAAQ,CAAC,IAAI;gBAAJ,IAAI,EAAE,UAAU;IAEvC,IAAI,CAAC,CAAC,GAAE,kBAAuB,GAAG,OAAO,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC;IAkBlE,MAAM,CAAC,GAAG,EAAE,sBAAsB,GAAG,OAAO,CAAC,eAAe,CAAC;IAwBnE,GAAG,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC;IAQnC,MAAM,CAAC,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,sBAAsB,GAAG,OAAO,CAAC,eAAe,CAAC;IAsB/E;;;;OAIG;IACG,UAAU,CAAC,WAAW,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAS3F,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAQvC,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC;CAO7C"}
@@ -74,6 +74,19 @@ export class KnowledgeApi {
74
74
  version: res.version ?? 0,
75
75
  };
76
76
  }
77
+ /**
78
+ * Link an already-uploaded FileRecord to a knowledge item. This is the second
79
+ * half of the attach flow — `files.upload` completes as Standalone because HTTP
80
+ * `/complete` cannot express ExistingKnowledge (CLI_KnowledgeAttachUpload R2).
81
+ */
82
+ async attachFile(knowledgeId, fileRecordId, displayOrder) {
83
+ await this.core.request({
84
+ method: 'POST',
85
+ path: `/api/v1/knowledge/${encodeURIComponent(knowledgeId)}/attachments`,
86
+ body: { fileRecordId, ...(displayOrder === undefined ? {} : { displayOrder }) },
87
+ schema: z.unknown(),
88
+ });
89
+ }
77
90
  async remove(id) {
78
91
  await this.core.request({
79
92
  method: 'DELETE',
@@ -1 +1 @@
1
- {"version":3,"file":"knowledge.js","sourceRoot":"","sources":["../../src/resources/knowledge.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"knowledge.js","sourceRoot":"","sources":["../../src/resources/knowledge.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,133 @@
1
+ import type { PortabilityCoreClient, DownloadSpec, DownloadResult } from '../contracts.js';
2
+ export type PortabilityDialect = 'platform' | 'selfhosted';
3
+ export type ConflictStrategy = 'skip' | 'overwrite' | 'merge';
4
+ export type ExportScopeType = 'Tenant' | 'Vault' | 'VaultWithChildren' | 'MultiSelect' | 'SingleItem';
5
+ export interface PortabilitySchema {
6
+ version: number;
7
+ minReadableVersion: number;
8
+ compatibility: string;
9
+ dialect: PortabilityDialect;
10
+ }
11
+ export interface ExportScopeInput {
12
+ scopeType: ExportScopeType;
13
+ vaultIds?: string[];
14
+ knowledgeItemIds?: string[];
15
+ }
16
+ export interface ExportToFileInput extends ExportScopeInput {
17
+ mode: 'Light' | 'Full';
18
+ outPath: string;
19
+ acknowledgementCopyVersion?: string;
20
+ onProgress?: (bytesReceived: number, totalBytes?: number) => void;
21
+ }
22
+ export interface ExportToFileResult {
23
+ path: string;
24
+ bytes: number;
25
+ kind: 'json' | 'zip';
26
+ }
27
+ export interface ExportJob {
28
+ jobId: string;
29
+ status: string;
30
+ estimatedItems: number;
31
+ queuedAt: string;
32
+ }
33
+ export interface ExportJobPart {
34
+ partNumber: number;
35
+ downloadUrl: string;
36
+ sizeBytes: number;
37
+ fileName: string;
38
+ itemCount: number;
39
+ }
40
+ export interface ExportJobStatus {
41
+ jobId: string;
42
+ status: string;
43
+ progressPercentage: number;
44
+ completedAt?: string | null;
45
+ totalItems: number;
46
+ errorMessage?: string | null;
47
+ parts?: ExportJobPart[] | null;
48
+ }
49
+ export interface ImportValidation {
50
+ isValid: boolean;
51
+ schemaVersion: number;
52
+ schemaCompatible: boolean;
53
+ schemaError?: string | null;
54
+ sourceEdition?: string | null;
55
+ totalVaults: number;
56
+ totalKnowledgeItems: number;
57
+ totalTopics: number;
58
+ totalTags: number;
59
+ totalPersons: number;
60
+ totalLocations: number;
61
+ totalEvents: number;
62
+ totalComments: number;
63
+ totalFileRecords: number;
64
+ conflictingVaults: number;
65
+ conflictingKnowledgeItems: number;
66
+ conflictingTopics: number;
67
+ conflictingPersons: number;
68
+ warnings: string[];
69
+ errors: string[];
70
+ }
71
+ export interface EntityCounts {
72
+ created: number;
73
+ skipped: number;
74
+ overwritten: number;
75
+ merged: number;
76
+ }
77
+ export interface ImportOutcome {
78
+ success: boolean;
79
+ strategyUsed: number | string;
80
+ vaults: EntityCounts;
81
+ knowledgeItems: EntityCounts;
82
+ topics: EntityCounts;
83
+ tags: EntityCounts;
84
+ persons: EntityCounts;
85
+ locations: EntityCounts;
86
+ events: EntityCounts;
87
+ comments: EntityCounts;
88
+ fileRecords: EntityCounts;
89
+ junctionsRestored: number;
90
+ filesBlobFailed: number;
91
+ warnings: string[];
92
+ error?: string | null;
93
+ }
94
+ export declare class PortabilityApi {
95
+ private readonly core;
96
+ /** Memoized dialect probe — the ONE `GET /schema` preflight (R6). */
97
+ private schemaProbe?;
98
+ constructor(core: PortabilityCoreClient);
99
+ getSchema(): Promise<PortabilitySchema>;
100
+ private probeSchema;
101
+ /**
102
+ * Synchronous export streamed to disk (R1, R4). Light streams the BARE
103
+ * package JSON byte-identically; Full streams the ZIP. 409 (lock), 413 (use
104
+ * the job path) and 403 surface as `ApiError` for the caller to map.
105
+ */
106
+ exportToFile(input: ExportToFileInput): Promise<ExportToFileResult>;
107
+ createExportJob(input: ExportScopeInput & {
108
+ mode: 'Light' | 'Full';
109
+ acknowledgementCopyVersion?: string;
110
+ }): Promise<ExportJob>;
111
+ getExportJob(jobId: string): Promise<ExportJobStatus>;
112
+ /** Part download over the redirect-safe leg (R3) — the SAS hop carries NO credentials. */
113
+ downloadExportPart(input: {
114
+ jobId: string;
115
+ partNumber: number;
116
+ outPath: string;
117
+ onProgress?: DownloadSpec['onProgress'];
118
+ }): Promise<DownloadResult>;
119
+ /** Dry-run validation — HTTP 200, central 400-with-envelope and selfhosted bare-422 all PARSE (R2). */
120
+ validateImport(pkg: unknown): Promise<ImportValidation>;
121
+ /** JSON import — a 400/422 ImportOutcome is an ANSWER, not an error (R9). Never retried. */
122
+ importPackage(pkg: unknown, opts: {
123
+ strategy: ConflictStrategy;
124
+ targetVaultId?: string;
125
+ }): Promise<ImportOutcome>;
126
+ /** ZIP import — multipart field `file` (R6), streamed from disk, no automatic retry. */
127
+ importZip(input: {
128
+ path: string;
129
+ strategy: ConflictStrategy;
130
+ targetVaultId?: string;
131
+ }): Promise<ImportOutcome>;
132
+ }
133
+ //# sourceMappingURL=portability.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"portability.d.ts","sourceRoot":"","sources":["../../src/resources/portability.ts"],"names":[],"mappings":"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"}