@native-knowledge/knowledge-sdk 0.1.0-rc.1 → 0.1.0-rc.2

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 (206) hide show
  1. package/LICENSE +202 -21
  2. package/NOTICE +29 -0
  3. package/README.md +26 -38
  4. package/dist/{types/sdk/agent-entry.d.ts → agent-entry.d.ts} +3 -3
  5. package/dist/agent-entry.js +153 -0
  6. package/dist/{types/sdk/agent-guidance-error.d.ts → agent-guidance-error.d.ts} +1 -1
  7. package/dist/agent-guidance-error.js +46 -0
  8. package/dist/auth.d.ts +124 -0
  9. package/dist/auth.js +165 -0
  10. package/dist/{types/sdk/index.d.ts → index.d.ts} +15 -14
  11. package/dist/index.js +159 -6570
  12. package/dist/internal/contracts/artifact.js +103 -0
  13. package/dist/internal/contracts/collection-control.js +69 -0
  14. package/dist/internal/contracts/collection.js +174 -0
  15. package/dist/internal/contracts/common.js +16 -0
  16. package/dist/internal/contracts/currentness.js +221 -0
  17. package/dist/internal/contracts/event.js +35 -0
  18. package/dist/internal/contracts/evidence.js +171 -0
  19. package/dist/{types → internal}/contracts/index.d.ts +0 -1
  20. package/dist/internal/contracts/index.js +54 -0
  21. package/dist/internal/contracts/material-capability.js +8 -0
  22. package/dist/internal/contracts/material-carrier.js +15 -0
  23. package/dist/internal/contracts/material-context.js +9 -0
  24. package/dist/internal/contracts/material-read.js +12 -0
  25. package/dist/internal/contracts/observation.js +39 -0
  26. package/dist/internal/contracts/persistence.js +239 -0
  27. package/dist/internal/contracts/project-intent.js +121 -0
  28. package/dist/internal/contracts/projection.js +194 -0
  29. package/dist/internal/contracts/public-reference.js +87 -0
  30. package/dist/internal/contracts/reference-record.js +55 -0
  31. package/dist/internal/contracts/remote-file.js +159 -0
  32. package/dist/internal/contracts/resource-scope.js +38 -0
  33. package/dist/internal/contracts/review-packet.js +61 -0
  34. package/dist/internal/contracts/review-plane.js +89 -0
  35. package/dist/internal/contracts/rich-document.js +184 -0
  36. package/dist/internal/contracts/runtime-compatibility.js +55 -0
  37. package/dist/internal/contracts/runtime.js +68 -0
  38. package/dist/internal/contracts/scheduler.js +256 -0
  39. package/dist/internal/contracts/signal.js +77 -0
  40. package/dist/internal/contracts/source-governance.js +194 -0
  41. package/dist/internal/contracts/source.js +32 -0
  42. package/dist/internal/contracts/tenant-budget.js +34 -0
  43. package/dist/internal/contracts/tenant-collection-request.js +58 -0
  44. package/dist/internal/contracts/tenant-collection.js +66 -0
  45. package/dist/internal/contracts/tenant-currentness.js +26 -0
  46. package/dist/internal/contracts/tenant-management.js +27 -0
  47. package/dist/internal/contracts/tenant-material-api.js +46 -0
  48. package/dist/internal/contracts/tenant-material-json-schema.js +16 -0
  49. package/dist/internal/contracts/tenant-pdf-text.js +13 -0
  50. package/dist/internal/contracts/tenant-project-control.js +19 -0
  51. package/dist/internal/contracts/tenant-public-reference.js +26 -0
  52. package/dist/internal/contracts/tenant-resource-api.js +70 -0
  53. package/dist/internal/contracts/tenant-resource.js +118 -0
  54. package/dist/internal/contracts/tenant-rich-document.js +17 -0
  55. package/dist/internal/contracts/tenant-source-binding.js +33 -0
  56. package/dist/internal/contracts/tenant-source-bridge.js +9 -0
  57. package/dist/internal/contracts/tenant-source-cutover.js +26 -0
  58. package/dist/internal/contracts/tenant-source-document.js +38 -0
  59. package/dist/internal/contracts/tenant-source-lease.js +5 -0
  60. package/dist/internal/contracts/tenant-source.js +83 -0
  61. package/dist/internal/contracts/tenant-web-collection.js +118 -0
  62. package/dist/internal/contracts/tenant-web-content-plan.js +39 -0
  63. package/dist/internal/contracts/tenant-web-content-result.js +15 -0
  64. package/dist/internal/contracts/tenant-web-content.js +16 -0
  65. package/dist/internal/contracts/tenant-web-crawl.js +55 -0
  66. package/dist/internal/contracts/tenant-web-dynamic.js +68 -0
  67. package/dist/internal/contracts/tenant-web-results.js +41 -0
  68. package/dist/internal/contracts/tenant-web-workflow.js +29 -0
  69. package/dist/internal/serving-contracts/agent-catalog.js +56 -0
  70. package/dist/internal/serving-contracts/agent-entry.js +57 -0
  71. package/dist/internal/serving-contracts/agent-guidance-shapes.js +12 -0
  72. package/dist/internal/serving-contracts/agent-input-hints.js +104 -0
  73. package/dist/internal/serving-contracts/body-search.js +16 -0
  74. package/dist/internal/serving-contracts/consumer.js +45 -0
  75. package/dist/internal/serving-contracts/core.js +76 -0
  76. package/dist/internal/serving-contracts/http.js +64 -0
  77. package/dist/{types → internal}/serving-contracts/index.d.ts +1 -0
  78. package/dist/internal/serving-contracts/index.js +25 -0
  79. package/dist/internal/serving-contracts/management.js +15 -0
  80. package/dist/internal/serving-contracts/material-capabilities.js +14 -0
  81. package/dist/internal/serving-contracts/material-index-status.js +5 -0
  82. package/dist/internal/serving-contracts/mcp.js +140 -0
  83. package/dist/internal/serving-contracts/tenant-governance.js +13 -0
  84. package/dist/internal/serving-contracts/tenant-management.js +89 -0
  85. package/dist/internal/serving-contracts/tenant-project.js +39 -0
  86. package/dist/internal/serving-contracts/tenant-runtime.js +37 -0
  87. package/dist/internal/serving-contracts/tenant-session.d.ts +87 -0
  88. package/dist/internal/serving-contracts/tenant-session.js +8 -0
  89. package/dist/internal/serving-contracts/tenant-web-content.js +20 -0
  90. package/dist/internal/serving-contracts/tenant-web-crawl.js +13 -0
  91. package/dist/internal/serving-contracts/tenant-web-dynamic.js +20 -0
  92. package/dist/internal/serving-contracts/tenant-web-workflow.js +36 -0
  93. package/dist/internal/serving-contracts/tenant-web.js +53 -0
  94. package/dist/internal/serving-contracts/tenant-workspace.js +28 -0
  95. package/dist/internal/serving-contracts/workflow.js +37 -0
  96. package/dist/material-stream.js +29 -0
  97. package/dist/{types/sdk/oauth.d.ts → oauth.d.ts} +18 -18
  98. package/dist/oauth.js +539 -0
  99. package/dist/{types/sdk/resource.d.ts → resource.d.ts} +5 -5
  100. package/dist/resource.js +123 -0
  101. package/dist/session.d.ts +4 -0
  102. package/dist/session.js +3 -0
  103. package/dist/tenant-client.d.ts +169 -0
  104. package/dist/tenant-client.js +58 -0
  105. package/dist/{types/sdk/tenant-management.d.ts → tenant-management.d.ts} +6 -6
  106. package/dist/tenant-management.js +149 -0
  107. package/dist/{types/sdk/tenant-project.d.ts → tenant-project.d.ts} +1 -1
  108. package/dist/tenant-project.js +63 -0
  109. package/dist/{types/sdk/tenant-runtime.d.ts → tenant-runtime.d.ts} +1 -1
  110. package/dist/tenant-runtime.js +17 -0
  111. package/dist/{types/sdk/tenant-web-content.d.ts → tenant-web-content.d.ts} +1 -1
  112. package/dist/tenant-web-content.js +70 -0
  113. package/dist/{types/sdk/tenant-web-crawl.d.ts → tenant-web-crawl.d.ts} +1 -1
  114. package/dist/tenant-web-crawl.js +39 -0
  115. package/dist/{types/sdk/tenant-web-dynamic.d.ts → tenant-web-dynamic.d.ts} +1 -1
  116. package/dist/tenant-web-dynamic.js +39 -0
  117. package/dist/{types/sdk/tenant-web-workflow.d.ts → tenant-web-workflow.d.ts} +1 -1
  118. package/dist/tenant-web-workflow.js +63 -0
  119. package/dist/{types/sdk/tenant-web.d.ts → tenant-web.d.ts} +1 -1
  120. package/dist/tenant-web.js +39 -0
  121. package/dist/{types/sdk/tenant-workspace.d.ts → tenant-workspace.d.ts} +1 -1
  122. package/dist/tenant-workspace.js +21 -0
  123. package/dist/token-provider.d.ts +14 -0
  124. package/dist/token-provider.js +21 -0
  125. package/package.json +27 -15
  126. package/dist/types/contracts/resource-transfer.d.ts +0 -24
  127. package/dist/types/sdk/resource-integrity.d.ts +0 -21
  128. package/dist/types/sdk/transport.d.ts +0 -16
  129. /package/dist/{types → internal}/contracts/artifact.d.ts +0 -0
  130. /package/dist/{types → internal}/contracts/collection-control.d.ts +0 -0
  131. /package/dist/{types → internal}/contracts/collection.d.ts +0 -0
  132. /package/dist/{types → internal}/contracts/common.d.ts +0 -0
  133. /package/dist/{types → internal}/contracts/currentness.d.ts +0 -0
  134. /package/dist/{types → internal}/contracts/event.d.ts +0 -0
  135. /package/dist/{types → internal}/contracts/evidence.d.ts +0 -0
  136. /package/dist/{types → internal}/contracts/material-capability.d.ts +0 -0
  137. /package/dist/{types → internal}/contracts/material-carrier.d.ts +0 -0
  138. /package/dist/{types → internal}/contracts/material-context.d.ts +0 -0
  139. /package/dist/{types → internal}/contracts/material-read.d.ts +0 -0
  140. /package/dist/{types → internal}/contracts/observation.d.ts +0 -0
  141. /package/dist/{types → internal}/contracts/persistence.d.ts +0 -0
  142. /package/dist/{types → internal}/contracts/project-intent.d.ts +0 -0
  143. /package/dist/{types → internal}/contracts/projection.d.ts +0 -0
  144. /package/dist/{types → internal}/contracts/public-reference.d.ts +0 -0
  145. /package/dist/{types → internal}/contracts/reference-record.d.ts +0 -0
  146. /package/dist/{types → internal}/contracts/remote-file.d.ts +0 -0
  147. /package/dist/{types → internal}/contracts/resource-scope.d.ts +0 -0
  148. /package/dist/{types → internal}/contracts/review-packet.d.ts +0 -0
  149. /package/dist/{types → internal}/contracts/review-plane.d.ts +0 -0
  150. /package/dist/{types → internal}/contracts/rich-document.d.ts +0 -0
  151. /package/dist/{types → internal}/contracts/runtime-compatibility.d.ts +0 -0
  152. /package/dist/{types → internal}/contracts/runtime.d.ts +0 -0
  153. /package/dist/{types → internal}/contracts/scheduler.d.ts +0 -0
  154. /package/dist/{types → internal}/contracts/signal.d.ts +0 -0
  155. /package/dist/{types → internal}/contracts/source-governance.d.ts +0 -0
  156. /package/dist/{types → internal}/contracts/source.d.ts +0 -0
  157. /package/dist/{types → internal}/contracts/tenant-budget.d.ts +0 -0
  158. /package/dist/{types → internal}/contracts/tenant-collection-request.d.ts +0 -0
  159. /package/dist/{types → internal}/contracts/tenant-collection.d.ts +0 -0
  160. /package/dist/{types → internal}/contracts/tenant-currentness.d.ts +0 -0
  161. /package/dist/{types → internal}/contracts/tenant-management.d.ts +0 -0
  162. /package/dist/{types → internal}/contracts/tenant-material-api.d.ts +0 -0
  163. /package/dist/{types → internal}/contracts/tenant-pdf-text.d.ts +0 -0
  164. /package/dist/{types → internal}/contracts/tenant-project-control.d.ts +0 -0
  165. /package/dist/{types → internal}/contracts/tenant-public-reference.d.ts +0 -0
  166. /package/dist/{types → internal}/contracts/tenant-resource-api.d.ts +0 -0
  167. /package/dist/{types → internal}/contracts/tenant-resource.d.ts +0 -0
  168. /package/dist/{types → internal}/contracts/tenant-rich-document.d.ts +0 -0
  169. /package/dist/{types → internal}/contracts/tenant-source-binding.d.ts +0 -0
  170. /package/dist/{types → internal}/contracts/tenant-source-bridge.d.ts +0 -0
  171. /package/dist/{types → internal}/contracts/tenant-source-cutover.d.ts +0 -0
  172. /package/dist/{types → internal}/contracts/tenant-source-document.d.ts +0 -0
  173. /package/dist/{types → internal}/contracts/tenant-source-lease.d.ts +0 -0
  174. /package/dist/{types → internal}/contracts/tenant-source.d.ts +0 -0
  175. /package/dist/{types → internal}/contracts/tenant-web-collection.d.ts +0 -0
  176. /package/dist/{types → internal}/contracts/tenant-web-content-plan.d.ts +0 -0
  177. /package/dist/{types → internal}/contracts/tenant-web-content-result.d.ts +0 -0
  178. /package/dist/{types → internal}/contracts/tenant-web-content.d.ts +0 -0
  179. /package/dist/{types → internal}/contracts/tenant-web-crawl.d.ts +0 -0
  180. /package/dist/{types → internal}/contracts/tenant-web-dynamic.d.ts +0 -0
  181. /package/dist/{types → internal}/contracts/tenant-web-results.d.ts +0 -0
  182. /package/dist/{types → internal}/contracts/tenant-web-workflow.d.ts +0 -0
  183. /package/dist/{types → internal}/serving-contracts/agent-catalog.d.ts +0 -0
  184. /package/dist/{types → internal}/serving-contracts/agent-entry.d.ts +0 -0
  185. /package/dist/{types → internal}/serving-contracts/agent-guidance-shapes.d.ts +0 -0
  186. /package/dist/{types → internal}/serving-contracts/agent-input-hints.d.ts +0 -0
  187. /package/dist/{types → internal}/serving-contracts/body-search.d.ts +0 -0
  188. /package/dist/{types → internal}/serving-contracts/consumer.d.ts +0 -0
  189. /package/dist/{types → internal}/serving-contracts/core.d.ts +0 -0
  190. /package/dist/{types → internal}/serving-contracts/http.d.ts +0 -0
  191. /package/dist/{types → internal}/serving-contracts/management.d.ts +0 -0
  192. /package/dist/{types → internal}/serving-contracts/material-capabilities.d.ts +0 -0
  193. /package/dist/{types → internal}/serving-contracts/material-index-status.d.ts +0 -0
  194. /package/dist/{types → internal}/serving-contracts/mcp.d.ts +0 -0
  195. /package/dist/{types → internal}/serving-contracts/tenant-governance.d.ts +0 -0
  196. /package/dist/{types → internal}/serving-contracts/tenant-management.d.ts +0 -0
  197. /package/dist/{types → internal}/serving-contracts/tenant-project.d.ts +0 -0
  198. /package/dist/{types → internal}/serving-contracts/tenant-runtime.d.ts +0 -0
  199. /package/dist/{types → internal}/serving-contracts/tenant-web-content.d.ts +0 -0
  200. /package/dist/{types → internal}/serving-contracts/tenant-web-crawl.d.ts +0 -0
  201. /package/dist/{types → internal}/serving-contracts/tenant-web-dynamic.d.ts +0 -0
  202. /package/dist/{types → internal}/serving-contracts/tenant-web-workflow.d.ts +0 -0
  203. /package/dist/{types → internal}/serving-contracts/tenant-web.d.ts +0 -0
  204. /package/dist/{types → internal}/serving-contracts/tenant-workspace.d.ts +0 -0
  205. /package/dist/{types → internal}/serving-contracts/workflow.d.ts +0 -0
  206. /package/dist/{types/sdk/material-stream.d.ts → material-stream.d.ts} +0 -0
@@ -0,0 +1,123 @@
1
+ import { AuthError } from './auth.js';
2
+ import { authorizedFetch, tokenValue } from './token-provider.js';
3
+ /** Provider 16 客户端:Tenant 默认,Project 仅为显式收窄;正文复用既有有界流合同。 */
4
+ import { resourceToolSchemas, resourceDataSchemas, resourceEnvelopeSchema, resourceHttpContractSchema, materialTenantIdSchema } from './internal/contracts/index.js';
5
+ import { materialStream } from './material-stream.js';
6
+ export class ResourceSdkError extends Error {
7
+ code;
8
+ status;
9
+ recovery;
10
+ constructor(code, status) {
11
+ super(code);
12
+ this.code = code;
13
+ this.status = status;
14
+ this.name = 'ResourceSdkError';
15
+ this.recovery = /OUTBOX_RESYNC_REQUIRED|CURSOR_STALE/.test(code) ? 'CAPTURE_WINDOW_AND_REBOOTSTRAP' : null;
16
+ }
17
+ }
18
+ export class KnowledgeResourceClient {
19
+ options;
20
+ root;
21
+ basePath;
22
+ fetchImpl;
23
+ constructor(options) {
24
+ this.options = options;
25
+ const url = new URL(options.baseUrl);
26
+ if (url.username || url.password || url.search || url.hash || !['https:', 'http:'].includes(url.protocol) || url.protocol === 'http:' && options.allowInsecureHttp !== true)
27
+ throw new Error('RESOURCE_SDK_BASE_URL_INVALID');
28
+ if (!options.tokenProvider && (typeof options.token !== 'string' || options.token.length < 16 || options.token.length > 4096 || /[\u0000-\u0020\u007f]/.test(options.token)))
29
+ throw new Error('RESOURCE_SDK_TOKEN_INVALID');
30
+ if (options.authentication !== undefined && options.authentication !== 'OAUTH' && options.authentication !== 'API_KEY')
31
+ throw new Error('RESOURCE_SDK_AUTHENTICATION_INVALID');
32
+ if (options.authentication === 'API_KEY')
33
+ materialTenantIdSchema.parse(options.tenantId);
34
+ if (options.expectedTenantId)
35
+ materialTenantIdSchema.parse(options.expectedTenantId);
36
+ this.root = url;
37
+ this.basePath = url.pathname === '/' ? '' : url.pathname.replace(/\/+$/, '');
38
+ this.fetchImpl = authorizedFetch(options.fetchImpl ?? fetch, options, url.origin);
39
+ }
40
+ url(operation) { const url = new URL(this.basePath + (this.options.authentication === 'API_KEY' ? '/v16/tenant/' : '/mcp/resources/') + operation, this.root.origin); if (this.options.authentication === 'API_KEY')
41
+ url.searchParams.set('tenantId', this.options.tenantId); return url; }
42
+ async request(url, options = {}) { try {
43
+ return await this.fetchImpl(url, { ...options, headers: { authorization: `Bearer ${await tokenValue(this.options)}`, accept: 'application/json', ...Object.fromEntries(new Headers(options.headers)) }, redirect: 'error' });
44
+ }
45
+ catch (error) {
46
+ if (error instanceof AuthError)
47
+ throw error;
48
+ throw new Error('RESOURCE_SDK_TRANSPORT_FAILURE');
49
+ } }
50
+ async json(response) {
51
+ if (!response.body)
52
+ throw new Error('RESOURCE_SDK_RESPONSE_INVALID');
53
+ const reader = response.body.getReader(), chunks = [];
54
+ let bytes = 0;
55
+ try {
56
+ while (true) {
57
+ const part = await reader.read();
58
+ if (part.done)
59
+ break;
60
+ bytes += part.value.byteLength;
61
+ if (bytes > 512 * 1024) {
62
+ await reader.cancel();
63
+ throw new Error('RESOURCE_SDK_RESULT_TOO_LARGE');
64
+ }
65
+ chunks.push(Buffer.from(part.value));
66
+ }
67
+ }
68
+ finally {
69
+ reader.releaseLock();
70
+ }
71
+ let raw;
72
+ try {
73
+ raw = JSON.parse(new TextDecoder('utf-8', { fatal: true }).decode(Buffer.concat(chunks)));
74
+ }
75
+ catch {
76
+ throw new Error('RESOURCE_SDK_RESPONSE_INVALID');
77
+ }
78
+ if (!response.ok) {
79
+ const value = raw && typeof raw === 'object' && !Array.isArray(raw) ? raw.errorCode : null;
80
+ throw new ResourceSdkError(typeof value === 'string' && /^[A-Z][A-Z0-9_]{1,100}$/.test(value) ? value : 'RESOURCE_SDK_HTTP_FAILURE', response.status);
81
+ }
82
+ return raw;
83
+ }
84
+ context(context, projectRef) {
85
+ const tenant = this.options.authentication === 'API_KEY' ? this.options.tenantId : this.options.expectedTenantId;
86
+ if ((tenant && context.tenantId !== tenant) || (projectRef ? (context.type !== 'PROJECT' || context.projectRef !== projectRef) : context.type !== 'TENANT'))
87
+ throw new Error('RESOURCE_SDK_CONTEXT_MISMATCH');
88
+ }
89
+ async tool(name, raw) {
90
+ if (!Object.hasOwn(resourceToolSchemas, name))
91
+ throw new Error('RESOURCE_SDK_OPERATION_UNSUPPORTED');
92
+ const input = resourceToolSchemas[name].parse(raw), body = JSON.stringify({ tool: name, arguments: input });
93
+ if (Buffer.byteLength(body) > 128 * 1024)
94
+ throw new Error('RESOURCE_SDK_REQUEST_TOO_LARGE');
95
+ const response = await this.request(this.url('call'), { method: 'POST', headers: { 'content-type': 'application/json' }, body }), envelope = resourceEnvelopeSchema.parse(await this.json(response));
96
+ this.context(envelope.context, input.projectRef);
97
+ return { ...envelope, data: resourceDataSchemas[name].parse(envelope.data) };
98
+ }
99
+ async contract(projectRef) { const input = resourceToolSchemas.knowledge_resource_window.parse(projectRef ? { projectRef } : {}), url = this.url('contract'); if (input.projectRef)
100
+ url.searchParams.set('projectRef', input.projectRef); const result = resourceHttpContractSchema.parse(await this.json(await this.request(url))); this.context(result.context, input.projectRef); return result; }
101
+ list(input = {}) { return this.tool('knowledge_resource_list', input); }
102
+ describe(ref, input = {}) { return this.tool('knowledge_resource_describe', { ...input, ref }); }
103
+ read(ref, input = {}) { return this.tool('knowledge_resource_read', { ...input, ref }); }
104
+ capabilities(ref, input = {}) { return this.tool('knowledge_resource_capabilities', { ...input, ref }); }
105
+ search(query, input = {}) { return this.tool('knowledge_resource_search', { ...input, query }); }
106
+ window(input = {}) { return this.tool('knowledge_resource_window', input); }
107
+ changes(input = {}) { return this.tool('knowledge_resource_changes', input); }
108
+ counts(input = {}) { return this.tool('knowledge_resource_counts', input); }
109
+ indexStatus(input = {}) { return this.tool('knowledge_resource_index_status', input); }
110
+ media(ref, input = {}) { return this.tool('knowledge_resource_media', { ...input, ref }); }
111
+ async stream(ref, options = {}) {
112
+ const input = resourceToolSchemas.knowledge_resource_read.parse({ ref, ...(options.projectRef ? { projectRef: options.projectRef } : {}) }), url = this.url('file');
113
+ if (options.head) {
114
+ url.searchParams.set('ref', input.ref);
115
+ if (input.projectRef)
116
+ url.searchParams.set('projectRef', input.projectRef);
117
+ return materialStream(this.fetchImpl, url, await tokenValue(this.options), options);
118
+ }
119
+ // POST 原件读取避免旧 ref 的 UTF-8 URL 膨胀;同一 Range、hash 与取消检查保持不变。
120
+ const post = (request, init) => this.fetchImpl(request, { ...init, method: 'POST', headers: { ...Object.fromEntries(new Headers(init?.headers)), 'content-type': 'application/json' }, body: JSON.stringify(input) });
121
+ return materialStream(post, url, await tokenValue(this.options), options);
122
+ }
123
+ }
@@ -0,0 +1,4 @@
1
+ /// <reference types="node" />
2
+ export { KnowledgeAuthClient, AuthError, type TenantSession } from './auth.js';
3
+ export { tenantSessionSchema, tenantOperationStatusSchema } from './internal/serving-contracts/index.js';
4
+ export { type TokenProvider, authorizedFetch, tokenValue } from './token-provider.js';
@@ -0,0 +1,3 @@
1
+ export { KnowledgeAuthClient, AuthError } from './auth.js';
2
+ export { tenantSessionSchema, tenantOperationStatusSchema } from './internal/serving-contracts/index.js';
3
+ export { authorizedFetch, tokenValue } from './token-provider.js';
@@ -0,0 +1,169 @@
1
+ import { KnowledgeTenantWebWorkflowClient } from './tenant-web-workflow.js';
2
+ import { KnowledgeResourceClient } from './resource.js';
3
+ import { type KnowledgeTenantManagementClientOptions } from './tenant-management.js';
4
+ export declare class TenantOperationUnknownError extends Error {
5
+ readonly requestId: string | undefined;
6
+ readonly code = "OPERATION_RESULT_UNKNOWN";
7
+ readonly completedPhase: string | undefined;
8
+ readonly ref: string | undefined;
9
+ constructor(requestId: string | undefined, details?: {
10
+ completedPhase?: string | undefined;
11
+ ref?: string | undefined;
12
+ });
13
+ }
14
+ export declare class KnowledgeTenantClient {
15
+ private o;
16
+ readonly resources: KnowledgeResourceClient;
17
+ readonly management: KnowledgeTenantWebWorkflowClient;
18
+ constructor(o: KnowledgeTenantManagementClientOptions);
19
+ call(name: string, input: unknown): Promise<{
20
+ schemaVersion: 1;
21
+ tenantId: string;
22
+ requestId: string;
23
+ state: "NOT_FOUND" | "INTENT_PERSISTED";
24
+ operationRef: string | null;
25
+ action: string | null;
26
+ receivedAt: string | null;
27
+ completion: "NOT_PROVEN";
28
+ } | {
29
+ schemaVersion: 2;
30
+ tenantId: string;
31
+ tool: "tenant_runtime_status";
32
+ data: {
33
+ nodeId: string;
34
+ kind: "REQUESTS" | "RESOURCES" | "PROJECTIONS" | "PROJECTS";
35
+ observedAt: string;
36
+ coverage: "OWN_TENANT_METADATA_SAMPLE";
37
+ metadataOnly: true;
38
+ pageState: "UNAVAILABLE" | "READY";
39
+ items: ({
40
+ kind: "REQUESTS";
41
+ requestRef: string;
42
+ batchRef: string;
43
+ admission: "COMPLETED" | "PENDING" | "FAILED" | "STOPPED";
44
+ stopReason: "GRANT_REVOKED" | "DELEGATION_SUPERSEDED" | null;
45
+ executionAuthority: "UNAVAILABLE" | "CURRENT" | "BLOCKED" | "NOT_CONFIGURED" | "NOT_PENDING";
46
+ budgetReason: "READY" | "PAUSED" | "TENANT_UNCONFIGURED" | "HOST_IN_FLIGHT" | "TENANT_IN_FLIGHT" | "WORK_BUDGET" | "TIME_BUDGET" | "WORK_ACTIVE" | null;
47
+ captureRecord: "MISSING" | "UNAVAILABLE" | "PRESENT";
48
+ raw: {
49
+ ref: string;
50
+ contentHash: string | null;
51
+ recordedBytes: number | null;
52
+ manifest: "MISSING" | "UNAVAILABLE" | "INTEGRITY_MISMATCH" | "PRESENT";
53
+ blob: "MISSING" | "UNAVAILABLE" | "INTEGRITY_MISMATCH" | "PRESENT_UNVERIFIED";
54
+ contentHashReverified: false;
55
+ catalog: "MISSING" | "UNAVAILABLE" | "INTEGRITY_MISMATCH" | "NOT_REGISTERED" | "MATCH";
56
+ directory: "MISSING" | "UNAVAILABLE" | "INTEGRITY_MISMATCH" | "NOT_REGISTERED" | "MATCH";
57
+ search: "MISSING" | "UNAVAILABLE" | "INTEGRITY_MISMATCH" | "NOT_REGISTERED" | "MATCH";
58
+ };
59
+ derivation: "REGISTERED" | "UNAVAILABLE" | "PENDING" | "NOT_REQUIRED";
60
+ completedPhase: "RAW_REGISTERED" | "DERIVED_REGISTERED" | null;
61
+ process: {
62
+ runtimeNodeId: string;
63
+ workloadId: string;
64
+ runId: string;
65
+ attribution: "COMPLETION_RUN" | "FAILURE_RUN" | "SOURCE_WORKLOAD_LATEST" | "PROJECT_WORKLOAD_LATEST";
66
+ batchMatches: boolean | null;
67
+ outcome: "FAILED" | "SUCCEEDED" | "TIMED_OUT" | "OUTPUT_LIMIT" | "SPAWN_FAILED" | "RECEIPT_MISSING" | null;
68
+ receiptStatus: "BLOCKED" | "PARTIAL" | "FAILED" | "SUCCEEDED" | "SKIPPED" | null;
69
+ durationMs: number | null;
70
+ finishedAt: string;
71
+ category: "NONE" | "OUTPUT_LIMIT" | "TIMEOUT" | "SPAWN_FAILURE" | "V8_HEAP_EXHAUSTED" | "NATIVE_ASSERTION_FAILURE" | "UNCAUGHT_EXCEPTION" | "PROCESS_SIGNAL" | "UNKNOWN_FAILURE" | null;
72
+ peakRssBytes: number | null;
73
+ sampleCount: number | null;
74
+ } | null;
75
+ failureCode?: "TENANT_SOURCE_HTTP_TERMINAL" | null | undefined;
76
+ } | {
77
+ ref: string;
78
+ contentHash: string | null;
79
+ recordedBytes: number | null;
80
+ manifest: "MISSING" | "UNAVAILABLE" | "INTEGRITY_MISMATCH" | "PRESENT";
81
+ blob: "MISSING" | "UNAVAILABLE" | "INTEGRITY_MISMATCH" | "PRESENT_UNVERIFIED";
82
+ contentHashReverified: false;
83
+ catalog: "MISSING" | "UNAVAILABLE" | "INTEGRITY_MISMATCH" | "NOT_REGISTERED" | "MATCH";
84
+ directory: "MISSING" | "UNAVAILABLE" | "INTEGRITY_MISMATCH" | "NOT_REGISTERED" | "MATCH";
85
+ search: "MISSING" | "UNAVAILABLE" | "INTEGRITY_MISMATCH" | "NOT_REGISTERED" | "MATCH";
86
+ kind: "RESOURCES";
87
+ } | {
88
+ ref: string;
89
+ contentHash: string | null;
90
+ recordedBytes: number | null;
91
+ manifest: "MISSING" | "UNAVAILABLE" | "INTEGRITY_MISMATCH" | "PRESENT";
92
+ blob: "MISSING" | "UNAVAILABLE" | "INTEGRITY_MISMATCH" | "PRESENT_UNVERIFIED";
93
+ contentHashReverified: false;
94
+ catalog: "MISSING" | "UNAVAILABLE" | "INTEGRITY_MISMATCH" | "NOT_REGISTERED" | "MATCH";
95
+ directory: "MISSING" | "UNAVAILABLE" | "INTEGRITY_MISMATCH" | "NOT_REGISTERED" | "MATCH";
96
+ search: "MISSING" | "UNAVAILABLE" | "INTEGRITY_MISMATCH" | "NOT_REGISTERED" | "MATCH";
97
+ kind: "PROJECTIONS";
98
+ expectedManifestRevision: string;
99
+ preparedAt: string;
100
+ } | {
101
+ kind: "PROJECTS";
102
+ projectKey: string;
103
+ lifecycle: "ACTIVE" | "ARCHIVED";
104
+ runtimeState: "UNAVAILABLE" | "AVAILABLE";
105
+ projection: {
106
+ requestedGeneration: number;
107
+ completedGeneration: number;
108
+ pendingGenerationDelta: number;
109
+ } | null;
110
+ checkpointState: "UNAVAILABLE" | "READY" | "EPOCH_MISMATCH";
111
+ directoryThroughSeq: number | null;
112
+ searchThroughSeq: number | null;
113
+ searchObservedMaxSeq: number | null;
114
+ searchSequenceDelta: number | null;
115
+ process: {
116
+ runtimeNodeId: string;
117
+ workloadId: string;
118
+ runId: string;
119
+ attribution: "COMPLETION_RUN" | "FAILURE_RUN" | "SOURCE_WORKLOAD_LATEST" | "PROJECT_WORKLOAD_LATEST";
120
+ batchMatches: boolean | null;
121
+ outcome: "FAILED" | "SUCCEEDED" | "TIMED_OUT" | "OUTPUT_LIMIT" | "SPAWN_FAILED" | "RECEIPT_MISSING" | null;
122
+ receiptStatus: "BLOCKED" | "PARTIAL" | "FAILED" | "SUCCEEDED" | "SKIPPED" | null;
123
+ durationMs: number | null;
124
+ finishedAt: string;
125
+ category: "NONE" | "OUTPUT_LIMIT" | "TIMEOUT" | "SPAWN_FAILURE" | "V8_HEAP_EXHAUSTED" | "NATIVE_ASSERTION_FAILURE" | "UNCAUGHT_EXCEPTION" | "PROCESS_SIGNAL" | "UNKNOWN_FAILURE" | null;
126
+ peakRssBytes: number | null;
127
+ sampleCount: number | null;
128
+ } | null;
129
+ })[];
130
+ nextAfter: string | null;
131
+ sampleCount: number;
132
+ total: null;
133
+ budget: {
134
+ state: "READY";
135
+ scope: "RUNTIME_OWNER_DATA_ROOT";
136
+ windowStart: string;
137
+ windowEnd: string;
138
+ usage: {
139
+ inFlight: number;
140
+ workUnits: number;
141
+ runtimeMs: number;
142
+ };
143
+ limits: {
144
+ tenantId: string;
145
+ maxInFlight: number;
146
+ maxWorkUnits: number;
147
+ maxRuntimeMs: number;
148
+ weight: number;
149
+ paused: boolean;
150
+ };
151
+ maxWaitRounds: number;
152
+ } | {
153
+ state: "UNAVAILABLE" | "NOT_CONFIGURED";
154
+ reason: "CONFIGURATION_REQUIRED" | "TENANT_NOT_CONFIGURED" | "BINDING_MISMATCH" | "STATE_UNAVAILABLE";
155
+ };
156
+ delivery: {
157
+ headSeq: number;
158
+ retainedThroughSeq: number;
159
+ businessOutcome: "NOT_ASSERTED";
160
+ };
161
+ };
162
+ } | import("./resource.js").ResourceToolResponse<never> | {
163
+ schemaVersion: 2;
164
+ tenantId: string;
165
+ tool: never;
166
+ data?: never;
167
+ }>;
168
+ private dispatch;
169
+ }
@@ -0,0 +1,58 @@
1
+ import { KnowledgeAuthClient } from './auth.js';
2
+ import { tokenValue } from './token-provider.js';
3
+ /** 统一客户端只组合既有 typed owner,不再实现一套工具或业务状态机。 */
4
+ import { resourceToolSchemas } from './internal/contracts/index.js';
5
+ import { tenantWebWorkflowToolSchemas, tenantWebContentToolSchemas, tenantProjectToolSchemas, tenantWorkspaceExtraToolSchemas } from './internal/serving-contracts/index.js';
6
+ import { KnowledgeTenantWebWorkflowClient } from './tenant-web-workflow.js';
7
+ import { KnowledgeResourceClient } from './resource.js';
8
+ import { TenantManagementSdkError } from './tenant-management.js';
9
+ const reads = new Set(['tenant_operation_status', 'tenant_workflow_guide', 'tenant_workflow_plan', 'tenant_knowledge_read', 'tenant_snapshot_status', 'tenant_material_routes', 'tenant_source_get', 'tenant_source_list', 'tenant_source_inventory', 'tenant_work_queue', 'tenant_project_list', 'tenant_project_get', 'tenant_project_materials', 'tenant_runtime_status', 'tenant_web_collect_preview', 'tenant_web_collect_status', 'tenant_web_collect_results', 'tenant_web_collect_cycles', 'tenant_web_collect_read', 'tenant_web_collect_index_status']);
10
+ export class TenantOperationUnknownError extends Error {
11
+ requestId;
12
+ code = 'OPERATION_RESULT_UNKNOWN';
13
+ completedPhase;
14
+ ref;
15
+ constructor(requestId, details) {
16
+ super('OPERATION_RESULT_UNKNOWN');
17
+ this.requestId = requestId;
18
+ this.completedPhase = details?.completedPhase;
19
+ this.ref = details?.ref;
20
+ }
21
+ }
22
+ export class KnowledgeTenantClient {
23
+ o;
24
+ resources;
25
+ management;
26
+ constructor(o) {
27
+ this.o = o;
28
+ this.resources = new KnowledgeResourceClient(o);
29
+ this.management = new KnowledgeTenantWebWorkflowClient(o);
30
+ }
31
+ async call(name, input) { try {
32
+ return await this.dispatch(name, input);
33
+ }
34
+ catch (e) {
35
+ const code = e instanceof Error ? e.message : '';
36
+ if (!name.startsWith('knowledge_resource_') && !reads.has(name) && /TRANSPORT_FAILURE|RESPONSE_INVALID|HTTP_FAILURE/.test(code))
37
+ throw new TenantOperationUnknownError(input && typeof input === 'object' && 'requestId' in input && typeof input.requestId === 'string' ? input.requestId : undefined, e instanceof TenantManagementSdkError ? { completedPhase: e.completedPhase, ref: e.ref } : undefined);
38
+ throw e;
39
+ } }
40
+ async dispatch(name, input) {
41
+ const c = this.management;
42
+ if (name === 'tenant_operation_status')
43
+ return new KnowledgeAuthClient(this.o).operationStatus(await tokenValue(this.o), input, this.o.expectedTenantId);
44
+ if (Object.hasOwn(resourceToolSchemas, name))
45
+ return this.resources.tool(name, input);
46
+ if (Object.hasOwn(tenantWebWorkflowToolSchemas, name))
47
+ return c.workflowTool(name, input);
48
+ if (Object.hasOwn(tenantWebContentToolSchemas, name))
49
+ return c.webTool(name, input);
50
+ if (name === 'tenant_runtime_status')
51
+ return c.runtimeStatus(input);
52
+ if (Object.hasOwn(tenantProjectToolSchemas, name))
53
+ return c.projectTool(name, input);
54
+ if (Object.hasOwn(tenantWorkspaceExtraToolSchemas, name))
55
+ return c.workspaceTool(name, input);
56
+ return c.tool(name, input);
57
+ }
58
+ }
@@ -1,10 +1,11 @@
1
- import { type SdkTransportOptions } from './transport.js';
2
- import { tenantManagementErrorSchema, type TenantManagementToolName, type TenantManagementToolInput, type TenantManagementToolResponse } from '../serving-contracts/index.js';
1
+ import { type TokenProvider } from './token-provider.js';
2
+ import { tenantManagementErrorSchema, type TenantManagementToolName, type TenantManagementToolInput, type TenantManagementToolResponse } from './internal/serving-contracts/index.js';
3
3
  import { type MaterialStreamOptions } from './material-stream.js';
4
4
  type Failure = ReturnType<typeof tenantManagementErrorSchema.parse>;
5
- export interface KnowledgeTenantManagementClientOptions extends SdkTransportOptions {
5
+ export interface KnowledgeTenantManagementClientOptions {
6
6
  baseUrl: string;
7
- token: string;
7
+ token?: string;
8
+ tokenProvider?: TokenProvider;
8
9
  expectedTenantId: string;
9
10
  allowInsecureHttp?: boolean;
10
11
  fetchImpl?: typeof fetch;
@@ -21,7 +22,6 @@ export declare class TenantManagementSdkError<Phase extends string = NonNullable
21
22
  }
22
23
  export declare class KnowledgeTenantManagementClient {
23
24
  protected readonly options: KnowledgeTenantManagementClientOptions;
24
- private readonly limits;
25
25
  private readonly root;
26
26
  private readonly path;
27
27
  private readonly fetchImpl;
@@ -180,7 +180,7 @@ export declare class KnowledgeTenantManagementClient {
180
180
  decision: {
181
181
  schemaVersion: 1;
182
182
  action: "ALLOW" | "DENY" | "REVIEW_REQUIRED";
183
- reasonCodes: ("UNAVAILABLE" | "INTEGRITY_MISMATCH" | "NOT_FOUND" | "CONTENT_ACCESS_DENIED" | "UNSUPPORTED_RESOURCE" | "STALE" | "ACCESS_DENIED" | "ARTIFACT_NOT_APPROVED" | "ARTIFACT_SUPERSEDED" | "SEMANTIC_REVIEW_REQUIRED" | "SEMANTIC_DENIED" | "SEMANTIC_ADMISSION_MISSING" | "CURRENTNESS_MISSING" | "CURRENTNESS_REVIEW_REQUIRED" | "CURRENTNESS_DENIED" | "VALIDITY_EXPIRED" | "CLAIM_REVIEW_REQUIRED" | "CLAIM_DENIED" | "CLAIM_NOT_EFFECTIVE" | "REFERENCE_NOT_COVERED" | "REFERENCE_NOT_EFFECTIVE" | "REFERENCE_VALIDITY_EXPIRED" | "REFERENCE_STALE" | "REFERENCE_UNAVAILABLE" | "REFERENCE_REVIEW_REQUIRED" | "REFERENCE_DENIED" | "GOVERNANCE_NOT_CONFIGURED")[];
183
+ reasonCodes: ("NOT_FOUND" | "UNAVAILABLE" | "INTEGRITY_MISMATCH" | "CONTENT_ACCESS_DENIED" | "UNSUPPORTED_RESOURCE" | "STALE" | "ACCESS_DENIED" | "ARTIFACT_NOT_APPROVED" | "ARTIFACT_SUPERSEDED" | "SEMANTIC_REVIEW_REQUIRED" | "SEMANTIC_DENIED" | "SEMANTIC_ADMISSION_MISSING" | "CURRENTNESS_MISSING" | "CURRENTNESS_REVIEW_REQUIRED" | "CURRENTNESS_DENIED" | "VALIDITY_EXPIRED" | "CLAIM_REVIEW_REQUIRED" | "CLAIM_DENIED" | "CLAIM_NOT_EFFECTIVE" | "REFERENCE_NOT_COVERED" | "REFERENCE_NOT_EFFECTIVE" | "REFERENCE_VALIDITY_EXPIRED" | "REFERENCE_STALE" | "REFERENCE_UNAVAILABLE" | "REFERENCE_REVIEW_REQUIRED" | "REFERENCE_DENIED" | "GOVERNANCE_NOT_CONFIGURED")[];
184
184
  assessedAt: string;
185
185
  };
186
186
  descriptor: {
@@ -0,0 +1,149 @@
1
+ import { AuthError } from './auth.js';
2
+ import { authorizedFetch, tokenValue } from './token-provider.js';
3
+ /** Provider17 客户端:Tenant 必填,Project/actor/authority 不进入请求上下文。 */
4
+ import { materialTenantIdSchema, tenantResourceRefSchema } from './internal/contracts/index.js';
5
+ import { tenantManagementToolSchemas, tenantManagementEnvelopeSchema, tenantManagementErrorSchema, tenantManagementProviderSchema, tenantManagementSafeErrorRef } from './internal/serving-contracts/index.js';
6
+ import { materialStream } from './material-stream.js';
7
+ export class TenantManagementSdkError extends Error {
8
+ code;
9
+ status;
10
+ completedPhase;
11
+ ref;
12
+ constructor(code, status, details) {
13
+ super(code);
14
+ this.code = code;
15
+ this.status = status;
16
+ this.name = 'TenantManagementSdkError';
17
+ this.completedPhase = details?.completedPhase;
18
+ this.ref = details?.ref;
19
+ }
20
+ }
21
+ export class KnowledgeTenantManagementClient {
22
+ options;
23
+ root;
24
+ path;
25
+ fetchImpl;
26
+ constructor(options) {
27
+ this.options = options;
28
+ let url;
29
+ try {
30
+ url = new URL(options.baseUrl);
31
+ }
32
+ catch {
33
+ throw new TenantManagementSdkError('TENANT_MANAGEMENT_SDK_BASE_URL_INVALID', 0);
34
+ }
35
+ if (url.username || url.password || url.search || url.hash || !['https:', 'http:'].includes(url.protocol) || url.protocol === 'http:' && options.allowInsecureHttp !== true)
36
+ throw new TenantManagementSdkError('TENANT_MANAGEMENT_SDK_BASE_URL_INVALID', 0);
37
+ materialTenantIdSchema.parse(options.expectedTenantId);
38
+ if (!options.tokenProvider && (typeof options.token !== 'string' || !/^[A-Za-z0-9_-]{43}$/.test(options.token)))
39
+ throw new TenantManagementSdkError('TENANT_MANAGEMENT_SDK_TOKEN_INVALID', 0);
40
+ this.root = url;
41
+ this.path = url.pathname === '/' ? '' : url.pathname.replace(/\/+$/, '');
42
+ this.fetchImpl = authorizedFetch(options.fetchImpl ?? fetch, options, url.origin);
43
+ }
44
+ protocolVersion() { return 17; }
45
+ url(operation, version = this.protocolVersion()) { return new URL(this.path + (operation === 'provider' ? `/v${version}/provider` : `/v${version}/tenant/` + operation), this.root.origin); }
46
+ async request(url, init = {}) { try {
47
+ return await this.fetchImpl(url, { ...init, headers: { authorization: `Bearer ${await tokenValue(this.options)}`, accept: 'application/json', ...Object.fromEntries(new Headers(init.headers)) }, redirect: 'error' });
48
+ }
49
+ catch (error) {
50
+ if (error instanceof AuthError)
51
+ throw error;
52
+ throw new TenantManagementSdkError('TENANT_MANAGEMENT_SDK_TRANSPORT_FAILURE', 0);
53
+ } }
54
+ failure(raw, status) { const failure = tenantManagementErrorSchema.safeParse(raw); if (!failure.success)
55
+ return null; const ref = tenantManagementSafeErrorRef(failure.data.ref, this.options.expectedTenantId); return new TenantManagementSdkError(failure.data.errorCode, status, { ...failure.data, ...(ref ? { ref } : { ref: undefined }) }); }
56
+ async json(response) {
57
+ if (!response.headers.get('content-type')?.toLowerCase().startsWith('application/json') || !response.body) {
58
+ await response.body?.cancel();
59
+ throw new TenantManagementSdkError('TENANT_MANAGEMENT_SDK_RESPONSE_INVALID', response.status);
60
+ }
61
+ const reader = response.body.getReader(), chunks = [];
62
+ let bytes = 0;
63
+ try {
64
+ while (true) {
65
+ const part = await reader.read();
66
+ if (part.done)
67
+ break;
68
+ bytes += part.value.length;
69
+ if (bytes > 524288) {
70
+ await reader.cancel();
71
+ throw new TenantManagementSdkError('TENANT_MANAGEMENT_SDK_RESULT_TOO_LARGE', response.status);
72
+ }
73
+ chunks.push(Buffer.from(part.value));
74
+ }
75
+ }
76
+ catch (error) {
77
+ if (error instanceof TenantManagementSdkError)
78
+ throw error;
79
+ throw new TenantManagementSdkError('TENANT_MANAGEMENT_SDK_TRANSPORT_FAILURE', response.status);
80
+ }
81
+ finally {
82
+ reader.releaseLock();
83
+ }
84
+ let raw;
85
+ try {
86
+ raw = JSON.parse(new TextDecoder('utf-8', { fatal: true }).decode(Buffer.concat(chunks)));
87
+ }
88
+ catch {
89
+ throw new TenantManagementSdkError('TENANT_MANAGEMENT_SDK_RESPONSE_INVALID', response.status);
90
+ }
91
+ const failure = this.failure(raw, response.status);
92
+ if (failure)
93
+ throw failure;
94
+ if (!response.ok)
95
+ throw new TenantManagementSdkError('TENANT_MANAGEMENT_SDK_RESPONSE_INVALID', response.status);
96
+ return raw;
97
+ }
98
+ async tool(name, raw, options = {}) {
99
+ if (!Object.hasOwn(tenantManagementToolSchemas, name))
100
+ throw new TenantManagementSdkError('TENANT_MANAGEMENT_SDK_OPERATION_UNSUPPORTED', 0);
101
+ const input = tenantManagementToolSchemas[name].parse(raw), body = JSON.stringify({ tool: name, arguments: input });
102
+ if (Buffer.byteLength(body) > 131072)
103
+ throw new TenantManagementSdkError('TENANT_MANAGEMENT_SDK_REQUEST_TOO_LARGE', 0);
104
+ const response = await this.request(this.url('call'), { method: 'POST', headers: { 'content-type': 'application/json' }, body, ...(options.signal ? { signal: options.signal } : {}) }), result = tenantManagementEnvelopeSchema(name).safeParse(await this.json(response));
105
+ if (!result.success)
106
+ throw new TenantManagementSdkError('TENANT_MANAGEMENT_SDK_RESPONSE_INVALID', response.status);
107
+ if (result.data.tenantId !== this.options.expectedTenantId)
108
+ throw new TenantManagementSdkError('TENANT_MANAGEMENT_SDK_CONTEXT_MISMATCH', response.status);
109
+ return result.data;
110
+ }
111
+ async provider() { const response = await this.request(this.url('provider', 17)), result = tenantManagementProviderSchema.safeParse(await this.json(response)); if (!result.success)
112
+ throw new TenantManagementSdkError('TENANT_MANAGEMENT_SDK_RESPONSE_INVALID', response.status); return result.data; }
113
+ guide() { return this.tool('tenant_workflow_guide', {}); }
114
+ plan(ref) { return this.tool('tenant_workflow_plan', { ref }); }
115
+ read(ref) { return this.tool('tenant_knowledge_read', { ref }); }
116
+ snapshot(ref) { return this.tool('tenant_snapshot_status', { ref }); }
117
+ async stream(ref, options = {}) {
118
+ tenantResourceRefSchema.parse(ref);
119
+ const url = this.url('content');
120
+ url.searchParams.set('ref', ref);
121
+ const checked = async (input, init) => { let response; try {
122
+ response = await this.fetchImpl(input, { ...init, redirect: 'error' });
123
+ }
124
+ catch (error) {
125
+ if (error instanceof AuthError)
126
+ throw error;
127
+ throw new TenantManagementSdkError('TENANT_MANAGEMENT_SDK_TRANSPORT_FAILURE', 0);
128
+ } if (response.status !== 200 && response.status !== 206) {
129
+ await this.json(response);
130
+ throw new TenantManagementSdkError('TENANT_MANAGEMENT_SDK_CONTENT_FAILURE', response.status);
131
+ } if (response.headers.get('x-knowledge-tenant-id') !== this.options.expectedTenantId) {
132
+ await response.body?.cancel();
133
+ throw new TenantManagementSdkError('TENANT_MANAGEMENT_SDK_CONTEXT_MISMATCH', response.status);
134
+ } return response; };
135
+ try {
136
+ const result = await materialStream(checked, url, await tokenValue(this.options), options);
137
+ if (result.contentClass !== 'ARTIFACT_SNAPSHOT') {
138
+ await result.body?.cancel();
139
+ throw new TenantManagementSdkError('TENANT_MANAGEMENT_SDK_RESPONSE_INVALID', result.status);
140
+ }
141
+ return result;
142
+ }
143
+ catch (error) {
144
+ if (error instanceof TenantManagementSdkError)
145
+ throw error;
146
+ throw new TenantManagementSdkError('TENANT_MANAGEMENT_SDK_CONTENT_FAILURE', 0);
147
+ }
148
+ }
149
+ }
@@ -1,4 +1,4 @@
1
- import { type TenantProjectToolName, type TenantProjectToolInput, type TenantProjectToolResponse } from '../serving-contracts/index.js';
1
+ import { type TenantProjectToolName, type TenantProjectToolInput, type TenantProjectToolResponse } from './internal/serving-contracts/index.js';
2
2
  import { KnowledgeTenantWorkspaceClient } from './tenant-workspace.js';
3
3
  import { TenantManagementSdkError } from './tenant-management.js';
4
4
  import { type MaterialStreamOptions } from './material-stream.js';
@@ -0,0 +1,63 @@
1
+ import { tokenValue } from './token-provider.js';
2
+ /** Explicit v19 Project context client; v17/v18 discovery and defaults remain available. */
3
+ import { projectKeySchema, stableUriSchema, tenantProjectOperationRef } from './internal/contracts/index.js';
4
+ import { tenantProjectToolSchemas, tenantProjectEnvelopeSchema, tenantProjectErrorSchema, tenantProjectProviderSchema, tenantManagementSafeErrorRef } from './internal/serving-contracts/index.js';
5
+ import { KnowledgeTenantWorkspaceClient } from './tenant-workspace.js';
6
+ import { TenantManagementSdkError } from './tenant-management.js';
7
+ import { materialStream } from './material-stream.js';
8
+ export class KnowledgeTenantProjectClient extends KnowledgeTenantWorkspaceClient {
9
+ protocolVersion() { return 19; }
10
+ failure(raw, status) { const failure = tenantProjectErrorSchema.safeParse(raw); if (!failure.success)
11
+ return null; const ref = tenantManagementSafeErrorRef(failure.data.ref, this.options.expectedTenantId); return new TenantManagementSdkError(failure.data.errorCode, status, { ...failure.data, ...(ref ? { ref } : { ref: undefined }) }); }
12
+ async projectTool(name, raw, options = {}) {
13
+ if (!Object.hasOwn(tenantProjectToolSchemas, name))
14
+ throw new TenantManagementSdkError('TENANT_MANAGEMENT_SDK_OPERATION_UNSUPPORTED', 0);
15
+ const input = tenantProjectToolSchemas[name].parse(raw), body = JSON.stringify({ tool: name, arguments: input });
16
+ if (Buffer.byteLength(body) > 131072)
17
+ throw new TenantManagementSdkError('TENANT_MANAGEMENT_SDK_REQUEST_TOO_LARGE', 0);
18
+ const response = await this.request(this.url('call'), { method: 'POST', headers: { 'content-type': 'application/json' }, body, ...(options.signal ? { signal: options.signal } : {}) }), result = tenantProjectEnvelopeSchema(name).safeParse(await this.json(response));
19
+ if (!result.success)
20
+ throw new TenantManagementSdkError('TENANT_MANAGEMENT_SDK_RESPONSE_INVALID', response.status);
21
+ if (result.data.tenantId !== this.options.expectedTenantId)
22
+ throw new TenantManagementSdkError('TENANT_MANAGEMENT_SDK_CONTEXT_MISMATCH', response.status);
23
+ const data = result.data.data;
24
+ if ('projectKey' in input && data.projectKey !== input.projectKey)
25
+ throw new TenantManagementSdkError('TENANT_MANAGEMENT_SDK_CONTEXT_MISMATCH', response.status);
26
+ if ('requestId' in input && input.requestId) {
27
+ const expected = tenantProjectOperationRef(this.options.expectedTenantId, input.requestId);
28
+ if (data.operationRef && data.operationRef !== expected || data.receipt && data.receipt.operationRef !== expected)
29
+ throw new TenantManagementSdkError('TENANT_MANAGEMENT_SDK_CONTEXT_MISMATCH', response.status);
30
+ }
31
+ return result.data;
32
+ }
33
+ async projectProvider() { const response = await this.request(this.url('provider', 19)), result = tenantProjectProviderSchema.safeParse(await this.json(response)); if (!result.success)
34
+ throw new TenantManagementSdkError('TENANT_MANAGEMENT_SDK_RESPONSE_INVALID', response.status); return result.data; }
35
+ async projectStream(projectKey, ref, options = {}) {
36
+ const checkedProject = projectKeySchema.parse(projectKey), checkedRef = stableUriSchema.parse(ref);
37
+ const url = this.url('content', 19);
38
+ url.pathname = url.pathname.replace(/\/tenant\/content$/, '/project/content');
39
+ url.searchParams.set('projectKey', checkedProject);
40
+ url.searchParams.set('ref', checkedRef);
41
+ const fetchImpl = this.options.fetchImpl ?? fetch;
42
+ const checked = async (input, init) => { let response; try {
43
+ response = await fetchImpl(input, { ...init, redirect: 'error' });
44
+ }
45
+ catch {
46
+ throw new TenantManagementSdkError('TENANT_MANAGEMENT_SDK_TRANSPORT_FAILURE', 0);
47
+ } if (response.status !== 200 && response.status !== 206) {
48
+ await this.json(response);
49
+ throw new TenantManagementSdkError('TENANT_MANAGEMENT_SDK_CONTENT_FAILURE', response.status);
50
+ } if (response.headers.get('x-knowledge-tenant-id') !== this.options.expectedTenantId || response.headers.get('x-knowledge-project-key') !== checkedProject || response.headers.get('x-knowledge-authority-policy') !== 'TENANT_PROJECT_SCOPE') {
51
+ await response.body?.cancel();
52
+ throw new TenantManagementSdkError('TENANT_MANAGEMENT_SDK_CONTEXT_MISMATCH', response.status);
53
+ } return response; };
54
+ try {
55
+ return { ...await materialStream(checked, url, await tokenValue(this.options), options), context: { tenantId: this.options.expectedTenantId, projectKey: checkedProject, policy: 'TENANT_PROJECT_SCOPE' } };
56
+ }
57
+ catch (error) {
58
+ if (error instanceof TenantManagementSdkError)
59
+ throw error;
60
+ throw new TenantManagementSdkError('TENANT_MANAGEMENT_SDK_CONTENT_FAILURE', 0);
61
+ }
62
+ }
63
+ }
@@ -1,5 +1,5 @@
1
1
  /** 明确Provider20;仅此新client采用新registry,旧client默认保持原版本。 */
2
- import { type TenantRuntimeInput } from '../serving-contracts/index.js';
2
+ import { type TenantRuntimeInput } from './internal/serving-contracts/index.js';
3
3
  import { KnowledgeTenantProjectClient } from './tenant-project.js';
4
4
  export declare class KnowledgeTenantRuntimeClient extends KnowledgeTenantProjectClient {
5
5
  protected protocolVersion(): 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25;