@native-knowledge/knowledge-sdk 0.0.0-stage → 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 (203) hide show
  1. package/LICENSE +202 -0
  2. package/NOTICE +29 -0
  3. package/README.md +34 -2
  4. package/dist/agent-entry.d.ts +291 -0
  5. package/dist/agent-entry.js +153 -0
  6. package/dist/agent-guidance-error.d.ts +15 -0
  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/index.d.ts +290 -0
  11. package/dist/index.js +166 -0
  12. package/dist/internal/contracts/artifact.d.ts +120 -0
  13. package/dist/internal/contracts/artifact.js +103 -0
  14. package/dist/internal/contracts/collection-control.d.ts +160 -0
  15. package/dist/internal/contracts/collection-control.js +69 -0
  16. package/dist/internal/contracts/collection.d.ts +263 -0
  17. package/dist/internal/contracts/collection.js +174 -0
  18. package/dist/internal/contracts/common.d.ts +17 -0
  19. package/dist/internal/contracts/common.js +16 -0
  20. package/dist/internal/contracts/currentness.d.ts +477 -0
  21. package/dist/internal/contracts/currentness.js +221 -0
  22. package/dist/internal/contracts/event.d.ts +60 -0
  23. package/dist/internal/contracts/event.js +35 -0
  24. package/dist/internal/contracts/evidence.d.ts +202 -0
  25. package/dist/internal/contracts/evidence.js +171 -0
  26. package/dist/internal/contracts/index.d.ts +54 -0
  27. package/dist/internal/contracts/index.js +54 -0
  28. package/dist/internal/contracts/material-capability.d.ts +88 -0
  29. package/dist/internal/contracts/material-capability.js +8 -0
  30. package/dist/internal/contracts/material-carrier.d.ts +104 -0
  31. package/dist/internal/contracts/material-carrier.js +15 -0
  32. package/dist/internal/contracts/material-context.d.ts +28 -0
  33. package/dist/internal/contracts/material-context.js +9 -0
  34. package/dist/internal/contracts/material-read.d.ts +152 -0
  35. package/dist/internal/contracts/material-read.js +12 -0
  36. package/dist/internal/contracts/observation.d.ts +75 -0
  37. package/dist/internal/contracts/observation.js +39 -0
  38. package/dist/internal/contracts/persistence.d.ts +370 -0
  39. package/dist/internal/contracts/persistence.js +239 -0
  40. package/dist/internal/contracts/project-intent.d.ts +218 -0
  41. package/dist/internal/contracts/project-intent.js +121 -0
  42. package/dist/internal/contracts/projection.d.ts +380 -0
  43. package/dist/internal/contracts/projection.js +194 -0
  44. package/dist/internal/contracts/public-reference.d.ts +237 -0
  45. package/dist/internal/contracts/public-reference.js +87 -0
  46. package/dist/internal/contracts/reference-record.d.ts +124 -0
  47. package/dist/internal/contracts/reference-record.js +55 -0
  48. package/dist/internal/contracts/remote-file.d.ts +128 -0
  49. package/dist/internal/contracts/remote-file.js +159 -0
  50. package/dist/internal/contracts/resource-scope.d.ts +40 -0
  51. package/dist/internal/contracts/resource-scope.js +38 -0
  52. package/dist/internal/contracts/review-packet.d.ts +274 -0
  53. package/dist/internal/contracts/review-packet.js +61 -0
  54. package/dist/internal/contracts/review-plane.d.ts +90 -0
  55. package/dist/internal/contracts/review-plane.js +89 -0
  56. package/dist/internal/contracts/rich-document.d.ts +641 -0
  57. package/dist/internal/contracts/rich-document.js +184 -0
  58. package/dist/internal/contracts/runtime-compatibility.d.ts +22 -0
  59. package/dist/internal/contracts/runtime-compatibility.js +55 -0
  60. package/dist/internal/contracts/runtime.d.ts +59 -0
  61. package/dist/internal/contracts/runtime.js +68 -0
  62. package/dist/internal/contracts/scheduler.d.ts +348 -0
  63. package/dist/internal/contracts/scheduler.js +256 -0
  64. package/dist/internal/contracts/signal.d.ts +113 -0
  65. package/dist/internal/contracts/signal.js +77 -0
  66. package/dist/internal/contracts/source-governance.d.ts +375 -0
  67. package/dist/internal/contracts/source-governance.js +194 -0
  68. package/dist/internal/contracts/source.d.ts +62 -0
  69. package/dist/internal/contracts/source.js +32 -0
  70. package/dist/internal/contracts/tenant-budget.d.ts +59 -0
  71. package/dist/internal/contracts/tenant-budget.js +34 -0
  72. package/dist/internal/contracts/tenant-collection-request.d.ts +209 -0
  73. package/dist/internal/contracts/tenant-collection-request.js +58 -0
  74. package/dist/internal/contracts/tenant-collection.d.ts +199 -0
  75. package/dist/internal/contracts/tenant-collection.js +66 -0
  76. package/dist/internal/contracts/tenant-currentness.d.ts +117 -0
  77. package/dist/internal/contracts/tenant-currentness.js +26 -0
  78. package/dist/internal/contracts/tenant-management.d.ts +286 -0
  79. package/dist/internal/contracts/tenant-management.js +27 -0
  80. package/dist/internal/contracts/tenant-material-api.d.ts +584 -0
  81. package/dist/internal/contracts/tenant-material-api.js +46 -0
  82. package/dist/internal/contracts/tenant-material-json-schema.js +16 -0
  83. package/dist/internal/contracts/tenant-pdf-text.d.ts +27 -0
  84. package/dist/internal/contracts/tenant-pdf-text.js +13 -0
  85. package/dist/internal/contracts/tenant-project-control.d.ts +94 -0
  86. package/dist/internal/contracts/tenant-project-control.js +19 -0
  87. package/dist/internal/contracts/tenant-public-reference.d.ts +179 -0
  88. package/dist/internal/contracts/tenant-public-reference.js +26 -0
  89. package/dist/internal/contracts/tenant-resource-api.d.ts +738 -0
  90. package/dist/internal/contracts/tenant-resource-api.js +70 -0
  91. package/dist/internal/contracts/tenant-resource.d.ts +298 -0
  92. package/dist/internal/contracts/tenant-resource.js +118 -0
  93. package/dist/internal/contracts/tenant-rich-document.d.ts +317 -0
  94. package/dist/internal/contracts/tenant-rich-document.js +17 -0
  95. package/dist/internal/contracts/tenant-source-binding.d.ts +44 -0
  96. package/dist/internal/contracts/tenant-source-binding.js +33 -0
  97. package/dist/internal/contracts/tenant-source-bridge.d.ts +70 -0
  98. package/dist/internal/contracts/tenant-source-bridge.js +9 -0
  99. package/dist/internal/contracts/tenant-source-cutover.d.ts +226 -0
  100. package/dist/internal/contracts/tenant-source-cutover.js +26 -0
  101. package/dist/internal/contracts/tenant-source-document.d.ts +163 -0
  102. package/dist/internal/contracts/tenant-source-document.js +38 -0
  103. package/dist/internal/contracts/tenant-source-lease.d.ts +1 -0
  104. package/dist/internal/contracts/tenant-source-lease.js +5 -0
  105. package/dist/internal/contracts/tenant-source.d.ts +223 -0
  106. package/dist/internal/contracts/tenant-source.js +83 -0
  107. package/dist/internal/contracts/tenant-web-collection.d.ts +287 -0
  108. package/dist/internal/contracts/tenant-web-collection.js +118 -0
  109. package/dist/internal/contracts/tenant-web-content-plan.d.ts +86 -0
  110. package/dist/internal/contracts/tenant-web-content-plan.js +39 -0
  111. package/dist/internal/contracts/tenant-web-content-result.d.ts +63 -0
  112. package/dist/internal/contracts/tenant-web-content-result.js +15 -0
  113. package/dist/internal/contracts/tenant-web-content.d.ts +383 -0
  114. package/dist/internal/contracts/tenant-web-content.js +16 -0
  115. package/dist/internal/contracts/tenant-web-crawl.d.ts +310 -0
  116. package/dist/internal/contracts/tenant-web-crawl.js +55 -0
  117. package/dist/internal/contracts/tenant-web-dynamic.d.ts +698 -0
  118. package/dist/internal/contracts/tenant-web-dynamic.js +68 -0
  119. package/dist/internal/contracts/tenant-web-results.d.ts +66 -0
  120. package/dist/internal/contracts/tenant-web-results.js +41 -0
  121. package/dist/internal/contracts/tenant-web-workflow.d.ts +494 -0
  122. package/dist/internal/contracts/tenant-web-workflow.js +29 -0
  123. package/dist/internal/serving-contracts/agent-catalog.d.ts +70 -0
  124. package/dist/internal/serving-contracts/agent-catalog.js +56 -0
  125. package/dist/internal/serving-contracts/agent-entry.d.ts +13148 -0
  126. package/dist/internal/serving-contracts/agent-entry.js +57 -0
  127. package/dist/internal/serving-contracts/agent-guidance-shapes.d.ts +263 -0
  128. package/dist/internal/serving-contracts/agent-guidance-shapes.js +12 -0
  129. package/dist/internal/serving-contracts/agent-input-hints.d.ts +24 -0
  130. package/dist/internal/serving-contracts/agent-input-hints.js +104 -0
  131. package/dist/internal/serving-contracts/body-search.d.ts +231 -0
  132. package/dist/internal/serving-contracts/body-search.js +16 -0
  133. package/dist/internal/serving-contracts/consumer.d.ts +989 -0
  134. package/dist/internal/serving-contracts/consumer.js +45 -0
  135. package/dist/internal/serving-contracts/core.d.ts +333 -0
  136. package/dist/internal/serving-contracts/core.js +76 -0
  137. package/dist/internal/serving-contracts/http.d.ts +2874 -0
  138. package/dist/internal/serving-contracts/http.js +64 -0
  139. package/dist/internal/serving-contracts/index.d.ts +24 -0
  140. package/dist/internal/serving-contracts/index.js +25 -0
  141. package/dist/internal/serving-contracts/management.d.ts +424 -0
  142. package/dist/internal/serving-contracts/management.js +15 -0
  143. package/dist/internal/serving-contracts/material-capabilities.d.ts +508 -0
  144. package/dist/internal/serving-contracts/material-capabilities.js +14 -0
  145. package/dist/internal/serving-contracts/material-index-status.d.ts +55 -0
  146. package/dist/internal/serving-contracts/material-index-status.js +5 -0
  147. package/dist/internal/serving-contracts/mcp.d.ts +2218 -0
  148. package/dist/internal/serving-contracts/mcp.js +140 -0
  149. package/dist/internal/serving-contracts/tenant-governance.d.ts +236 -0
  150. package/dist/internal/serving-contracts/tenant-governance.js +13 -0
  151. package/dist/internal/serving-contracts/tenant-management.d.ts +6276 -0
  152. package/dist/internal/serving-contracts/tenant-management.js +89 -0
  153. package/dist/internal/serving-contracts/tenant-project.d.ts +7550 -0
  154. package/dist/internal/serving-contracts/tenant-project.js +39 -0
  155. package/dist/internal/serving-contracts/tenant-runtime.d.ts +9674 -0
  156. package/dist/internal/serving-contracts/tenant-runtime.js +37 -0
  157. package/dist/internal/serving-contracts/tenant-session.d.ts +87 -0
  158. package/dist/internal/serving-contracts/tenant-session.js +8 -0
  159. package/dist/internal/serving-contracts/tenant-web-content.d.ts +4606 -0
  160. package/dist/internal/serving-contracts/tenant-web-content.js +20 -0
  161. package/dist/internal/serving-contracts/tenant-web-crawl.d.ts +2958 -0
  162. package/dist/internal/serving-contracts/tenant-web-crawl.js +13 -0
  163. package/dist/internal/serving-contracts/tenant-web-dynamic.d.ts +3902 -0
  164. package/dist/internal/serving-contracts/tenant-web-dynamic.js +20 -0
  165. package/dist/internal/serving-contracts/tenant-web-workflow.d.ts +5750 -0
  166. package/dist/internal/serving-contracts/tenant-web-workflow.js +36 -0
  167. package/dist/internal/serving-contracts/tenant-web.d.ts +6418 -0
  168. package/dist/internal/serving-contracts/tenant-web.js +53 -0
  169. package/dist/internal/serving-contracts/tenant-workspace.d.ts +6451 -0
  170. package/dist/internal/serving-contracts/tenant-workspace.js +28 -0
  171. package/dist/internal/serving-contracts/workflow.d.ts +439 -0
  172. package/dist/internal/serving-contracts/workflow.js +37 -0
  173. package/dist/material-stream.d.ts +18 -0
  174. package/dist/material-stream.js +29 -0
  175. package/dist/oauth.d.ts +268 -0
  176. package/dist/oauth.js +539 -0
  177. package/dist/resource.d.ts +88 -0
  178. package/dist/resource.js +123 -0
  179. package/dist/session.d.ts +4 -0
  180. package/dist/session.js +3 -0
  181. package/dist/tenant-client.d.ts +169 -0
  182. package/dist/tenant-client.js +58 -0
  183. package/dist/tenant-management.d.ts +240 -0
  184. package/dist/tenant-management.js +149 -0
  185. package/dist/tenant-project.d.ts +57 -0
  186. package/dist/tenant-project.js +63 -0
  187. package/dist/tenant-runtime.d.ts +174 -0
  188. package/dist/tenant-runtime.js +17 -0
  189. package/dist/tenant-web-content.d.ts +44 -0
  190. package/dist/tenant-web-content.js +70 -0
  191. package/dist/tenant-web-crawl.d.ts +42 -0
  192. package/dist/tenant-web-crawl.js +39 -0
  193. package/dist/tenant-web-dynamic.d.ts +42 -0
  194. package/dist/tenant-web-dynamic.js +39 -0
  195. package/dist/tenant-web-workflow.d.ts +43 -0
  196. package/dist/tenant-web-workflow.js +63 -0
  197. package/dist/tenant-web.d.ts +42 -0
  198. package/dist/tenant-web.js +39 -0
  199. package/dist/tenant-workspace.d.ts +36 -0
  200. package/dist/tenant-workspace.js +21 -0
  201. package/dist/token-provider.d.ts +14 -0
  202. package/dist/token-provider.js +21 -0
  203. package/package.json +45 -3
package/dist/oauth.js ADDED
@@ -0,0 +1,539 @@
1
+ import { authorizedFetch, tokenValue } from './token-provider.js';
2
+ import { materialStream } from './material-stream.js';
3
+ import { knowledgeMcpProviderContractV12Schema, oauthMaterialCapabilityResponseSchema, oauthMaterialCapabilityPageSchema, oauthMaterialMediaCapabilityPageSchema, oauthMaterialIndexStatusSchema } from './internal/serving-contracts/index.js';
4
+ /** OAuth 文件客户端只消费调用方已取得的 token,并从通用 Provider 发现完整字节端点。 */
5
+ import { createHash } from 'node:crypto';
6
+ import { consumerProjectRefSchema, knowledgeMcpProviderContractV3Schema, knowledgeMcpProviderContractV6Schema, knowledgeMcpProviderContractV7Schema, knowledgeMcpProviderContractV8Schema, knowledgeMcpProviderContractV9Schema, knowledgeMcpProviderContractV10Schema, knowledgeMcpProviderContractV11Schema, materialOutboxWindowSchema, knowledgeMaterialSearchInputSchema, knowledgeMaterialSearchResponseSchema, oauthMaterialPageResponseSchema, oauthMaterialRoutePageResponseSchema, oauthMaterialPartitionsResponseSchema, oauthMaterialPartitionPageResponseSchema, oauthMaterialPresentationResponseSchema, servingDecisionSchema } from './internal/serving-contracts/index.js';
7
+ const digest = (bytes) => `sha256:${createHash('sha256').update(bytes).digest('hex')}`;
8
+ function serviceUrl(value, allowInsecureHttp) {
9
+ const url = new URL(value);
10
+ if (url.username || url.password || url.search || url.hash || !['http:', 'https:'].includes(url.protocol))
11
+ throw new Error('OAUTH_FILE_BASE_URL_INVALID');
12
+ if (url.protocol === 'http:' && !allowInsecureHttp)
13
+ throw new Error('OAUTH_FILE_HTTPS_REQUIRED');
14
+ url.pathname = url.pathname.replace(/\/+$/, '');
15
+ return url;
16
+ }
17
+ function parseEndpoint(value, origin) {
18
+ const url = new URL(value);
19
+ // Bearer 只能发送到执行发现的服务源,禁止 Provider 元数据把凭据导向别处。
20
+ if (url.origin !== origin || url.username || url.password || url.search || url.hash)
21
+ throw new Error('OAUTH_FILE_ENDPOINT_INVALID');
22
+ return url;
23
+ }
24
+ export class KnowledgeOAuthFileClient {
25
+ projectRef;
26
+ root;
27
+ credentials;
28
+ fetchImpl;
29
+ providerPromise = null;
30
+ materialProviderPromise = null;
31
+ agentMaterialProviderPromise = null;
32
+ searchMaterialProviderPromise = null;
33
+ routeMaterialProviderPromise = null;
34
+ syncMaterialProviderPromise = null;
35
+ capabilityProviderPromise = null;
36
+ partitionMaterialProviderPromise = null;
37
+ constructor(options) {
38
+ this.root = serviceUrl(options.baseUrl, options.allowInsecureHttp === true);
39
+ this.projectRef = consumerProjectRefSchema.parse(options.projectRef);
40
+ if (!options.tokenProvider && (!options.token || options.token.length < 16 || options.token.length > 4096))
41
+ throw new Error('OAUTH_FILE_TOKEN_INVALID');
42
+ this.credentials = options;
43
+ const authenticated = authorizedFetch(options.fetchImpl ?? fetch, options, this.root.origin);
44
+ this.fetchImpl = (input, init) => new Headers(init?.headers).has('authorization') ? authenticated(input, init) : (options.fetchImpl ?? fetch)(input, init);
45
+ }
46
+ /** 公开 v3 元数据无需凭据;读取失败时清除缓存以便下次重试。 */
47
+ async discover() {
48
+ if (!this.providerPromise) {
49
+ this.providerPromise = (async () => {
50
+ const url = new URL(`${this.root.pathname === '/' ? '' : this.root.pathname}/v3/provider`, this.root.origin);
51
+ let response;
52
+ try {
53
+ response = await this.fetchImpl(url, { method: 'GET', headers: { accept: 'application/json' }, redirect: 'error' });
54
+ }
55
+ catch {
56
+ throw new Error('OAUTH_FILE_DISCOVERY_FAILURE');
57
+ }
58
+ if (!response.ok)
59
+ throw new Error('OAUTH_FILE_DISCOVERY_FAILURE');
60
+ let raw;
61
+ try {
62
+ raw = await response.json();
63
+ }
64
+ catch {
65
+ throw new Error('OAUTH_FILE_DISCOVERY_INVALID');
66
+ }
67
+ const provider = knowledgeMcpProviderContractV3Schema.parse(raw);
68
+ for (const value of [provider.contentEndpoint, provider.evidenceFileEndpoint, provider.mediaEndpoint])
69
+ if (!value)
70
+ throw new Error('OAUTH_FILE_ENDPOINT_MISSING');
71
+ else
72
+ parseEndpoint(value, this.root.origin);
73
+ return provider;
74
+ })().catch(error => { this.providerPromise = null; throw error; });
75
+ }
76
+ return this.providerPromise;
77
+ }
78
+ async discoverMaterials() {
79
+ if (!this.materialProviderPromise) {
80
+ this.materialProviderPromise = (async () => {
81
+ const url = new URL(`${this.root.pathname === '/' ? '' : this.root.pathname}/v6/provider`, this.root.origin);
82
+ let response;
83
+ try {
84
+ response = await this.fetchImpl(url, { method: 'GET', headers: { accept: 'application/json' }, redirect: 'error' });
85
+ }
86
+ catch {
87
+ throw new Error('OAUTH_MATERIAL_DISCOVERY_FAILURE');
88
+ }
89
+ if (!response.ok)
90
+ throw new Error('OAUTH_MATERIAL_DISCOVERY_FAILURE');
91
+ let raw;
92
+ try {
93
+ raw = await response.json();
94
+ }
95
+ catch {
96
+ throw new Error('OAUTH_MATERIAL_DISCOVERY_INVALID');
97
+ }
98
+ const provider = knowledgeMcpProviderContractV6Schema.parse(raw);
99
+ parseEndpoint(provider.materialPageEndpoint, this.root.origin);
100
+ parseEndpoint(provider.materialEndpoint, this.root.origin);
101
+ parseEndpoint(provider.materialPresentationEndpoint, this.root.origin);
102
+ return provider;
103
+ })().catch(error => { this.materialProviderPromise = null; throw error; });
104
+ }
105
+ return this.materialProviderPromise;
106
+ }
107
+ /** Explicit v7 Agent discovery leaves the stable v6 HTTP file contract untouched. */
108
+ async discoverAgentMaterials() {
109
+ if (!this.agentMaterialProviderPromise) {
110
+ this.agentMaterialProviderPromise = (async () => {
111
+ const url = new URL(`${this.root.pathname === '/' ? '' : this.root.pathname}/v7/provider`, this.root.origin);
112
+ let response;
113
+ try {
114
+ response = await this.fetchImpl(url, { method: 'GET', headers: { accept: 'application/json' }, redirect: 'error' });
115
+ }
116
+ catch {
117
+ throw new Error('OAUTH_AGENT_DISCOVERY_FAILURE');
118
+ }
119
+ if (!response.ok)
120
+ throw new Error('OAUTH_AGENT_DISCOVERY_FAILURE');
121
+ let raw;
122
+ try {
123
+ raw = await response.json();
124
+ }
125
+ catch {
126
+ throw new Error('OAUTH_AGENT_DISCOVERY_INVALID');
127
+ }
128
+ const provider = knowledgeMcpProviderContractV7Schema.parse(raw);
129
+ for (const value of [provider.endpoint, provider.materialPageEndpoint, provider.materialEndpoint, provider.materialPresentationEndpoint])
130
+ if (!value)
131
+ throw new Error('OAUTH_AGENT_ENDPOINT_MISSING');
132
+ else
133
+ parseEndpoint(value, this.root.origin);
134
+ for (const name of ['knowledge_material_list', 'knowledge_material_describe', 'knowledge_material_read', 'knowledge_material_changes'])
135
+ if (!provider.tools.some(tool => tool.name === name && tool.requiredScope === 'knowledge.material.read'))
136
+ throw new Error('OAUTH_AGENT_TOOL_MISSING');
137
+ return provider;
138
+ })().catch(error => { this.agentMaterialProviderPromise = null; throw error; });
139
+ }
140
+ return this.agentMaterialProviderPromise;
141
+ }
142
+ /** v8 only describes the bounded descriptive index; result coverage is reported per query. */
143
+ async discoverSearchMaterials() {
144
+ if (!this.searchMaterialProviderPromise) {
145
+ this.searchMaterialProviderPromise = (async () => {
146
+ const url = new URL(`${this.root.pathname === '/' ? '' : this.root.pathname}/v8/provider`, this.root.origin);
147
+ let response;
148
+ try {
149
+ response = await this.fetchImpl(url, { method: 'GET', headers: { accept: 'application/json' }, redirect: 'error' });
150
+ }
151
+ catch {
152
+ throw new Error('OAUTH_MATERIAL_SEARCH_DISCOVERY_FAILURE');
153
+ }
154
+ if (!response.ok)
155
+ throw new Error('OAUTH_MATERIAL_SEARCH_DISCOVERY_FAILURE');
156
+ let raw;
157
+ try {
158
+ raw = await response.json();
159
+ }
160
+ catch {
161
+ throw new Error('OAUTH_MATERIAL_SEARCH_DISCOVERY_INVALID');
162
+ }
163
+ const provider = knowledgeMcpProviderContractV8Schema.parse(raw);
164
+ for (const value of [provider.endpoint, provider.materialPageEndpoint, provider.materialEndpoint, provider.materialPresentationEndpoint, provider.materialSearchEndpoint])
165
+ if (!value)
166
+ throw new Error('OAUTH_MATERIAL_SEARCH_ENDPOINT_MISSING');
167
+ else
168
+ parseEndpoint(value, this.root.origin);
169
+ if (!provider.tools.some(tool => tool.name === 'knowledge_material_search' && tool.requiredScope === 'knowledge.material.read'))
170
+ throw new Error('OAUTH_MATERIAL_SEARCH_TOOL_MISSING');
171
+ return provider;
172
+ })().catch(error => { this.searchMaterialProviderPromise = null; throw error; });
173
+ }
174
+ return this.searchMaterialProviderPromise;
175
+ }
176
+ async discoverRouteMaterials() {
177
+ if (!this.routeMaterialProviderPromise) {
178
+ this.routeMaterialProviderPromise = (async () => {
179
+ const url = new URL(`${this.root.pathname === '/' ? '' : this.root.pathname}/v9/provider`, this.root.origin);
180
+ let response;
181
+ try {
182
+ response = await this.fetchImpl(url, { method: 'GET', headers: { accept: 'application/json' }, redirect: 'error' });
183
+ }
184
+ catch {
185
+ throw new Error('OAUTH_MATERIAL_ROUTE_DISCOVERY_FAILURE');
186
+ }
187
+ if (!response.ok)
188
+ throw new Error('OAUTH_MATERIAL_ROUTE_DISCOVERY_FAILURE');
189
+ let raw;
190
+ try {
191
+ raw = await response.json();
192
+ }
193
+ catch {
194
+ throw new Error('OAUTH_MATERIAL_ROUTE_DISCOVERY_INVALID');
195
+ }
196
+ const provider = knowledgeMcpProviderContractV9Schema.parse(raw);
197
+ parseEndpoint(provider.materialRoutePageEndpoint, this.root.origin);
198
+ return provider;
199
+ })().catch(error => { this.routeMaterialProviderPromise = null; throw error; });
200
+ }
201
+ return this.routeMaterialProviderPromise;
202
+ }
203
+ async discoverPartitionedMaterials() {
204
+ if (!this.partitionMaterialProviderPromise) {
205
+ this.partitionMaterialProviderPromise = (async () => {
206
+ const url = new URL(`${this.root.pathname === '/' ? '' : this.root.pathname}/v10/provider`, this.root.origin);
207
+ let response;
208
+ try {
209
+ response = await this.fetchImpl(url, { method: 'GET', headers: { accept: 'application/json' }, redirect: 'error' });
210
+ }
211
+ catch {
212
+ throw new Error('OAUTH_MATERIAL_PARTITION_DISCOVERY_FAILURE');
213
+ }
214
+ if (!response.ok)
215
+ throw new Error('OAUTH_MATERIAL_PARTITION_DISCOVERY_FAILURE');
216
+ let raw;
217
+ try {
218
+ raw = await response.json();
219
+ }
220
+ catch {
221
+ throw new Error('OAUTH_MATERIAL_PARTITION_DISCOVERY_INVALID');
222
+ }
223
+ const provider = knowledgeMcpProviderContractV10Schema.parse(raw);
224
+ parseEndpoint(provider.materialPartitionsEndpoint, this.root.origin);
225
+ parseEndpoint(provider.materialPartitionPageEndpoint, this.root.origin);
226
+ parseEndpoint(provider.materialRoutePageEndpoint, this.root.origin);
227
+ return provider;
228
+ })().catch(error => { this.partitionMaterialProviderPromise = null; throw error; });
229
+ }
230
+ return this.partitionMaterialProviderPromise;
231
+ }
232
+ async discoverMaterialSync() {
233
+ if (!this.syncMaterialProviderPromise) {
234
+ this.syncMaterialProviderPromise = (async () => {
235
+ const url = new URL(`${this.root.pathname === '/' ? '' : this.root.pathname}/v11/provider`, this.root.origin);
236
+ let response;
237
+ try {
238
+ response = await this.fetchImpl(url, { method: 'GET', headers: { accept: 'application/json' }, redirect: 'error' });
239
+ }
240
+ catch {
241
+ throw new Error('OAUTH_MATERIAL_SYNC_DISCOVERY_FAILURE');
242
+ }
243
+ if (!response.ok)
244
+ throw new Error('OAUTH_MATERIAL_SYNC_DISCOVERY_FAILURE');
245
+ const provider = knowledgeMcpProviderContractV11Schema.parse(await response.json());
246
+ parseEndpoint(provider.materialOutboxWindowEndpoint, this.root.origin);
247
+ if (!provider.tools.some(tool => tool.name === 'knowledge_material_window' && tool.requiredScope === 'knowledge.material.read'))
248
+ throw new Error('OAUTH_MATERIAL_SYNC_TOOL_MISSING');
249
+ return provider;
250
+ })().catch(error => { this.syncMaterialProviderPromise = null; throw error; });
251
+ }
252
+ return this.syncMaterialProviderPromise;
253
+ }
254
+ async discoverMaterialCapabilities() {
255
+ if (!this.capabilityProviderPromise)
256
+ this.capabilityProviderPromise = (async () => {
257
+ const url = new URL(`${this.root.pathname === '/' ? '' : this.root.pathname}/v12/provider`, this.root.origin), response = await this.fetchImpl(url, { method: 'GET', headers: { accept: 'application/json' }, redirect: 'error' });
258
+ if (!response.ok)
259
+ throw new Error('OAUTH_MATERIAL_CAPABILITY_DISCOVERY_FAILURE');
260
+ const provider = knowledgeMcpProviderContractV12Schema.parse(await response.json());
261
+ for (const endpoint of [provider.materialEndpoint, provider.materialCapabilitiesEndpoint, provider.materialCapabilityPageEndpoint, provider.materialMediaPageEndpoint, provider.materialIndexStatusEndpoint])
262
+ parseEndpoint(endpoint, this.root.origin);
263
+ for (const name of ['knowledge_material_capabilities', 'knowledge_material_media', 'knowledge_material_index_status'])
264
+ if (!provider.tools.some(tool => tool.name === name && tool.requiredScope === 'knowledge.material.read'))
265
+ throw new Error('OAUTH_MATERIAL_CAPABILITY_TOOL_MISSING');
266
+ return provider;
267
+ })().catch(error => { this.capabilityProviderPromise = null; throw error; });
268
+ return this.capabilityProviderPromise;
269
+ }
270
+ async capabilityGet(endpoint, params, schema) {
271
+ const value = await this.partitionGet(endpoint, params, schema);
272
+ if (value.projectRef !== this.projectRef)
273
+ throw new Error('OAUTH_MATERIAL_CAPABILITY_SCOPE_MISMATCH');
274
+ return value;
275
+ }
276
+ async getMaterialCapabilities(ref) { const provider = await this.discoverMaterialCapabilities(); return this.capabilityGet(provider.materialCapabilitiesEndpoint, { ref }, oauthMaterialCapabilityResponseSchema); }
277
+ async pageMaterialCapabilities(options = {}) { const provider = await this.discoverMaterialCapabilities(); return this.capabilityGet(provider.materialCapabilityPageEndpoint, options, oauthMaterialCapabilityPageSchema); }
278
+ async pageMaterialMedia(ref, options = {}) { const provider = await this.discoverMaterialCapabilities(); return this.capabilityGet(provider.materialMediaPageEndpoint, { ref, ...options }, oauthMaterialMediaCapabilityPageSchema); }
279
+ async getMaterialIndexStatus(options = {}) { const provider = await this.discoverMaterialCapabilities(); return this.capabilityGet(provider.materialIndexStatusEndpoint, options, oauthMaterialIndexStatusSchema); }
280
+ async openMaterialStream(ref, options = {}) { const provider = await this.discoverMaterialCapabilities(), url = parseEndpoint(provider.materialEndpoint, this.root.origin); url.searchParams.set('project_ref', this.projectRef); url.searchParams.set('ref', ref); return materialStream(this.fetchImpl, url, await tokenValue(this.credentials), options); }
281
+ async getMaterialOutboxWindow() {
282
+ const provider = await this.discoverMaterialSync();
283
+ return this.partitionGet(provider.materialOutboxWindowEndpoint, {}, materialOutboxWindowSchema);
284
+ }
285
+ async partitionGet(endpoint, params, schema) {
286
+ const url = parseEndpoint(endpoint, this.root.origin);
287
+ url.searchParams.set('project_ref', this.projectRef);
288
+ for (const [key, value] of Object.entries(params))
289
+ if (value !== undefined)
290
+ url.searchParams.set(key, String(value));
291
+ let response;
292
+ try {
293
+ response = await this.fetchImpl(url, { method: 'GET', headers: { authorization: `Bearer ${await tokenValue(this.credentials)}`, accept: 'application/json' }, redirect: 'error' });
294
+ }
295
+ catch {
296
+ throw new Error('OAUTH_MATERIAL_PARTITION_TRANSPORT_FAILURE');
297
+ }
298
+ if (!response.ok)
299
+ throw new Error(response.status === 401 ? 'OAUTH_FILE_UNAUTHORIZED' : response.status === 403 ? 'OAUTH_FILE_FORBIDDEN' : 'OAUTH_MATERIAL_PARTITION_PAGE_FAILURE');
300
+ let raw;
301
+ try {
302
+ raw = await response.json();
303
+ }
304
+ catch {
305
+ throw new Error('OAUTH_MATERIAL_PARTITION_PAGE_INVALID');
306
+ }
307
+ return schema.parse(raw);
308
+ }
309
+ async pageMaterialPartitions(options = {}) {
310
+ const provider = await this.discoverPartitionedMaterials();
311
+ if (options.afterRouteId && !/^[a-f0-9]{64}$/.test(options.afterRouteId))
312
+ throw new Error('OAUTH_MATERIAL_ROUTE_ID_INVALID');
313
+ const page = await this.partitionGet(provider.materialPartitionsEndpoint, { after_route_id: options.afterRouteId, limit: options.limit }, oauthMaterialPartitionsResponseSchema);
314
+ if (page.projectRef !== this.projectRef)
315
+ throw new Error('OAUTH_MATERIAL_PARTITION_SCOPE_MISMATCH');
316
+ return page;
317
+ }
318
+ async pageMaterialPartition(partition, options = {}) {
319
+ const provider = await this.discoverPartitionedMaterials();
320
+ const page = await this.partitionGet(provider.materialPartitionPageEndpoint, { partition, after: options.after, limit: options.limit }, oauthMaterialPartitionPageResponseSchema);
321
+ if (page.projectRef !== this.projectRef || page.partition !== partition)
322
+ throw new Error('OAUTH_MATERIAL_PARTITION_SCOPE_MISMATCH');
323
+ return page;
324
+ }
325
+ async searchMaterials(query, options = {}) {
326
+ const input = knowledgeMaterialSearchInputSchema.parse({ projectRef: this.projectRef, query, ...options });
327
+ const provider = await this.discoverSearchMaterials(), url = parseEndpoint(provider.materialSearchEndpoint, this.root.origin);
328
+ url.searchParams.set('project_ref', input.projectRef);
329
+ url.searchParams.set('query', input.query);
330
+ if (input.afterId !== undefined)
331
+ url.searchParams.set('after_id', String(input.afterId));
332
+ if (input.limit !== undefined)
333
+ url.searchParams.set('limit', String(input.limit));
334
+ if (input.resourceType)
335
+ url.searchParams.set('resource_type', input.resourceType);
336
+ if (input.sourceProjectKey)
337
+ url.searchParams.set('source_project_key', input.sourceProjectKey);
338
+ let response;
339
+ try {
340
+ response = await this.fetchImpl(url, { method: 'GET', headers: { authorization: `Bearer ${await tokenValue(this.credentials)}`, accept: 'application/json' }, redirect: 'error' });
341
+ }
342
+ catch {
343
+ throw new Error('OAUTH_MATERIAL_SEARCH_TRANSPORT_FAILURE');
344
+ }
345
+ if (!response.ok)
346
+ throw new Error(response.status === 401 ? 'OAUTH_FILE_UNAUTHORIZED' : response.status === 403 ? 'OAUTH_FILE_FORBIDDEN' : 'OAUTH_MATERIAL_SEARCH_FAILURE');
347
+ let raw;
348
+ try {
349
+ raw = await response.json();
350
+ }
351
+ catch {
352
+ throw new Error('OAUTH_MATERIAL_SEARCH_RESPONSE_INVALID');
353
+ }
354
+ const result = knowledgeMaterialSearchResponseSchema.parse(raw);
355
+ if (result.projectRef !== this.projectRef)
356
+ throw new Error('OAUTH_MATERIAL_SEARCH_SCOPE_MISMATCH');
357
+ return result;
358
+ }
359
+ async pageMaterials(resourceType, options = {}) {
360
+ const provider = await this.discoverMaterials(), url = parseEndpoint(provider.materialPageEndpoint, this.root.origin);
361
+ url.searchParams.set('project_ref', this.projectRef);
362
+ url.searchParams.set('resource_type', resourceType);
363
+ if (options.after)
364
+ url.searchParams.set('after', options.after);
365
+ if (options.limit !== undefined)
366
+ url.searchParams.set('limit', String(options.limit));
367
+ let response;
368
+ try {
369
+ response = await this.fetchImpl(url, { method: 'GET', headers: { authorization: `Bearer ${await tokenValue(this.credentials)}`, accept: 'application/json' }, redirect: 'error' });
370
+ }
371
+ catch {
372
+ throw new Error('OAUTH_MATERIAL_TRANSPORT_FAILURE');
373
+ }
374
+ if (!response.ok)
375
+ throw new Error(response.status === 401 ? 'OAUTH_FILE_UNAUTHORIZED' : response.status === 403 ? 'OAUTH_FILE_FORBIDDEN' : 'OAUTH_MATERIAL_PAGE_FAILURE');
376
+ let raw;
377
+ try {
378
+ raw = await response.json();
379
+ }
380
+ catch {
381
+ throw new Error('OAUTH_MATERIAL_PAGE_INVALID');
382
+ }
383
+ const page = oauthMaterialPageResponseSchema.parse(raw);
384
+ if (page.projectRef !== this.projectRef || page.resourceType !== resourceType)
385
+ throw new Error('OAUTH_MATERIAL_PAGE_SCOPE_MISMATCH');
386
+ return page;
387
+ }
388
+ pageAllMaterials(options = {}) { return this.pageMaterials('all', options); }
389
+ async pageRouteMaterials(routeId, options = {}) {
390
+ if (!/^[a-f0-9]{64}$/.test(routeId))
391
+ throw new Error('OAUTH_MATERIAL_ROUTE_ID_INVALID');
392
+ const provider = await this.discoverRouteMaterials(), url = parseEndpoint(provider.materialRoutePageEndpoint, this.root.origin);
393
+ url.searchParams.set('project_ref', this.projectRef);
394
+ url.searchParams.set('route_id', routeId);
395
+ if (options.after)
396
+ url.searchParams.set('after', options.after);
397
+ if (options.limit !== undefined)
398
+ url.searchParams.set('limit', String(options.limit));
399
+ let response;
400
+ try {
401
+ response = await this.fetchImpl(url, { method: 'GET', headers: { authorization: `Bearer ${await tokenValue(this.credentials)}`, accept: 'application/json' }, redirect: 'error' });
402
+ }
403
+ catch {
404
+ throw new Error('OAUTH_MATERIAL_ROUTE_TRANSPORT_FAILURE');
405
+ }
406
+ if (!response.ok)
407
+ throw new Error(response.status === 401 ? 'OAUTH_FILE_UNAUTHORIZED' : response.status === 403 ? 'OAUTH_FILE_FORBIDDEN' : 'OAUTH_MATERIAL_ROUTE_PAGE_FAILURE');
408
+ let raw;
409
+ try {
410
+ raw = await response.json();
411
+ }
412
+ catch {
413
+ throw new Error('OAUTH_MATERIAL_ROUTE_PAGE_INVALID');
414
+ }
415
+ const page = oauthMaterialRoutePageResponseSchema.parse(raw);
416
+ if (page.projectRef !== this.projectRef || page.routeId !== routeId)
417
+ throw new Error('OAUTH_MATERIAL_ROUTE_PAGE_SCOPE_MISMATCH');
418
+ return page;
419
+ }
420
+ async getMaterialPresentation(ref) {
421
+ if (!ref.startsWith('evidence://') || ref.length > 4096)
422
+ throw new Error('OAUTH_FILE_REF_INVALID');
423
+ const provider = await this.discoverMaterials(), url = parseEndpoint(provider.materialPresentationEndpoint, this.root.origin);
424
+ url.searchParams.set('project_ref', this.projectRef);
425
+ url.searchParams.set('ref', ref);
426
+ let response;
427
+ try {
428
+ response = await this.fetchImpl(url, { method: 'GET', headers: { authorization: `Bearer ${await tokenValue(this.credentials)}`, accept: 'application/json' }, redirect: 'error' });
429
+ }
430
+ catch {
431
+ throw new Error('OAUTH_MATERIAL_TRANSPORT_FAILURE');
432
+ }
433
+ if (response.status === 401)
434
+ throw new Error('OAUTH_FILE_UNAUTHORIZED');
435
+ let raw;
436
+ try {
437
+ raw = await response.json();
438
+ }
439
+ catch {
440
+ throw new Error('OAUTH_MATERIAL_PRESENTATION_INVALID');
441
+ }
442
+ const result = oauthMaterialPresentationResponseSchema.parse(raw);
443
+ if (result.projectRef !== this.projectRef || result.presentation && result.presentation.sourceEvidenceRef !== ref)
444
+ throw new Error('OAUTH_MATERIAL_PRESENTATION_SCOPE_MISMATCH');
445
+ return result;
446
+ }
447
+ async getMaterial(ref, expected) {
448
+ if (!ref || ref.length > 4096)
449
+ throw new Error('OAUTH_FILE_REF_INVALID');
450
+ const provider = await this.discoverMaterials(), url = parseEndpoint(provider.materialEndpoint, this.root.origin);
451
+ url.searchParams.set('project_ref', this.projectRef);
452
+ url.searchParams.set('ref', ref);
453
+ let response;
454
+ try {
455
+ response = await this.fetchImpl(url, { method: 'GET', headers: { authorization: `Bearer ${await tokenValue(this.credentials)}`, accept: 'application/octet-stream,application/json' }, redirect: 'error' });
456
+ }
457
+ catch {
458
+ throw new Error('OAUTH_FILE_TRANSPORT_FAILURE');
459
+ }
460
+ if (response.status === 200) {
461
+ const expectedClass = ref.startsWith('evidence://') ? 'RAW_EVIDENCE' : ref.startsWith('rich-media://') ? 'RAW_EVIDENCE_MEDIA' : ref.startsWith('reference://') ? 'REFERENCE_SNAPSHOT' : null, actualClass = response.headers.get('x-knowledge-content-class');
462
+ if (response.headers.get('x-knowledge-serving-action') !== 'ALLOW' || (expectedClass ? actualClass !== expectedClass : !['ARTIFACT_SNAPSHOT', 'REGISTERED_MATERIAL'].includes(actualClass ?? '')))
463
+ throw new Error('OAUTH_MATERIAL_CLASS_INVALID');
464
+ const content = Buffer.from(await response.arrayBuffer()), contentHash = response.headers.get('x-knowledge-content-hash'), mediaType = response.headers.get('content-type'), rawLength = response.headers.get('content-length'), assessedAt = response.headers.get('x-knowledge-assessed-at'), byteLength = Number(rawLength);
465
+ if (!contentHash || !mediaType || !rawLength || !assessedAt || !Number.isSafeInteger(byteLength) || byteLength !== content.byteLength || digest(content) !== contentHash || expected && (expected.contentHash !== contentHash || expected.mediaType !== mediaType || expected.byteLength !== byteLength))
466
+ throw new Error('OAUTH_FILE_INTEGRITY_MISMATCH');
467
+ return { decision: servingDecisionSchema.parse({ schemaVersion: 1, action: 'ALLOW', reasonCodes: [], assessedAt }), descriptor: { contentHash, mediaType, byteLength }, content };
468
+ }
469
+ if (response.status === 401)
470
+ throw new Error('OAUTH_FILE_UNAUTHORIZED');
471
+ let raw;
472
+ try {
473
+ raw = await response.json();
474
+ }
475
+ catch {
476
+ throw new Error('OAUTH_FILE_RESPONSE_INVALID');
477
+ }
478
+ if (raw && typeof raw === 'object' && !Array.isArray(raw)) {
479
+ const body = raw, decision = servingDecisionSchema.safeParse(body.decision);
480
+ if (decision.success && typeof body.error === 'string')
481
+ return { decision: decision.data, error: body.error };
482
+ }
483
+ throw new Error(response.status === 403 ? 'OAUTH_FILE_FORBIDDEN' : 'OAUTH_FILE_HTTP_FAILURE');
484
+ }
485
+ async read(kind, ref, expected) {
486
+ if (!ref || ref.length > 4096)
487
+ throw new Error('OAUTH_FILE_REF_INVALID');
488
+ const provider = await this.discover(), endpoint = kind === 'content' ? provider.contentEndpoint : kind === 'evidenceFile' ? provider.evidenceFileEndpoint : provider.mediaEndpoint;
489
+ if (!endpoint)
490
+ throw new Error('OAUTH_FILE_ENDPOINT_MISSING');
491
+ const url = parseEndpoint(endpoint, this.root.origin);
492
+ url.searchParams.set('project_ref', this.projectRef);
493
+ url.searchParams.set('ref', ref);
494
+ let response;
495
+ try {
496
+ response = await this.fetchImpl(url, { method: 'GET', headers: { authorization: `Bearer ${await tokenValue(this.credentials)}`, accept: 'application/octet-stream,application/json' }, redirect: 'error' });
497
+ }
498
+ catch {
499
+ throw new Error('OAUTH_FILE_TRANSPORT_FAILURE');
500
+ }
501
+ if (response.status === 200) {
502
+ if (response.headers.get('x-knowledge-serving-action') !== 'ALLOW')
503
+ throw new Error('OAUTH_FILE_ACTION_INVALID');
504
+ if (kind === 'evidenceFile' && response.headers.get('x-knowledge-evidence-class') !== 'RAW_EVIDENCE')
505
+ throw new Error('OAUTH_FILE_EVIDENCE_CLASS_MISSING');
506
+ const content = Buffer.from(await response.arrayBuffer()), contentHash = response.headers.get('x-knowledge-content-hash'), mediaType = response.headers.get('content-type'), rawLength = response.headers.get('content-length'), assessedAt = response.headers.get('x-knowledge-assessed-at');
507
+ if (!contentHash || !mediaType || !rawLength || !assessedAt || !/^[-\w.+]+\/[-\w.+]+(?:\s*;.*)?$/i.test(mediaType))
508
+ throw new Error('OAUTH_FILE_HEADERS_INVALID');
509
+ const byteLength = Number(rawLength);
510
+ if (!Number.isSafeInteger(byteLength) || byteLength !== content.byteLength || digest(content) !== contentHash || expected && (expected.contentHash !== contentHash || expected.mediaType !== mediaType || expected.byteLength !== byteLength))
511
+ throw new Error('OAUTH_FILE_INTEGRITY_MISMATCH');
512
+ const decision = servingDecisionSchema.parse({ schemaVersion: 1, action: 'ALLOW', reasonCodes: [], assessedAt });
513
+ return { decision, descriptor: { contentHash, mediaType, byteLength }, content };
514
+ }
515
+ if (response.status === 401)
516
+ throw new Error('OAUTH_FILE_UNAUTHORIZED');
517
+ let raw;
518
+ try {
519
+ raw = await response.json();
520
+ }
521
+ catch {
522
+ throw new Error('OAUTH_FILE_RESPONSE_INVALID');
523
+ }
524
+ if (raw && typeof raw === 'object' && !Array.isArray(raw)) {
525
+ const body = raw, decision = servingDecisionSchema.safeParse(body.decision);
526
+ if (decision.success && typeof body.error === 'string' && ['DENY', 'REVIEW_REQUIRED'].includes(decision.data.action))
527
+ return { decision: decision.data, error: body.error };
528
+ }
529
+ if (response.status === 403)
530
+ throw new Error('OAUTH_FILE_FORBIDDEN');
531
+ if (response.status === 503)
532
+ throw new Error('OAUTH_FILE_UNAVAILABLE');
533
+ throw new Error('OAUTH_FILE_HTTP_FAILURE');
534
+ }
535
+ getContent(ref, expected) { return this.read('content', ref, expected); }
536
+ /** 原始 Evidence 文件只代表已采集证据,不自动获得知识审核或 currentness 许可。 */
537
+ getEvidenceFile(ref, expected) { return this.read('evidenceFile', ref, expected); }
538
+ getMedia(ref, expected) { return this.read('media', ref, expected); }
539
+ }
@@ -0,0 +1,88 @@
1
+ import { type TokenProvider } from './token-provider.js';
2
+ /** Provider 16 客户端:Tenant 默认,Project 仅为显式收窄;正文复用既有有界流合同。 */
3
+ import { resourceToolSchemas, resourceDataSchemas, type ResourceToolName, type MaterialContext, type MaterialAuthorityPolicy } from './internal/contracts/index.js';
4
+ import { type MaterialStreamOptions } from './material-stream.js';
5
+ type SharedOptions = {
6
+ baseUrl: string;
7
+ token?: string;
8
+ tokenProvider?: TokenProvider;
9
+ fetchImpl?: typeof fetch;
10
+ allowInsecureHttp?: boolean;
11
+ expectedTenantId?: string;
12
+ };
13
+ export type KnowledgeResourceClientOptions = SharedOptions & ({
14
+ authentication: 'API_KEY';
15
+ tenantId: string;
16
+ } | {
17
+ authentication?: 'OAUTH';
18
+ tenantId?: never;
19
+ });
20
+ export type ResourceToolInput<K extends ResourceToolName> = ReturnType<(typeof resourceToolSchemas)[K]['parse']>;
21
+ export type ResourceToolResponse<K extends ResourceToolName> = {
22
+ schemaVersion: 2;
23
+ context: MaterialContext;
24
+ policy: MaterialAuthorityPolicy;
25
+ data: ReturnType<(typeof resourceDataSchemas)[K]['parse']>;
26
+ };
27
+ export declare class ResourceSdkError extends Error {
28
+ readonly code: string;
29
+ readonly status: number;
30
+ readonly recovery: 'CAPTURE_WINDOW_AND_REBOOTSTRAP' | null;
31
+ constructor(code: string, status: number);
32
+ }
33
+ export declare class KnowledgeResourceClient {
34
+ private readonly options;
35
+ private readonly root;
36
+ private readonly basePath;
37
+ private readonly fetchImpl;
38
+ constructor(options: KnowledgeResourceClientOptions);
39
+ private url;
40
+ private request;
41
+ private json;
42
+ private context;
43
+ tool<K extends ResourceToolName>(name: K, raw: ResourceToolInput<K>): Promise<ResourceToolResponse<K>>;
44
+ contract(projectRef?: string): Promise<{
45
+ schemaVersion: 2;
46
+ context: {
47
+ type: "TENANT";
48
+ tenantId: string;
49
+ tenantRef: string;
50
+ } | {
51
+ type: "PROJECT";
52
+ tenantId: string;
53
+ projectKey: string;
54
+ projectRef: string;
55
+ };
56
+ policy: "LEGACY_PROJECT" | "TENANT_NATIVE" | "TENANT_PROJECT_SCOPE";
57
+ capabilities: ["TENANT_RESOURCE_V1", "TENANT_AUTHORITY_V1"];
58
+ callEndpoint: string;
59
+ fileEndpoint: string;
60
+ tools: string[];
61
+ inlineMaxBytes: 32768;
62
+ readBufferMaxBytes: 16777216;
63
+ fileMethods: ["GET", "HEAD", "POST"];
64
+ verificationChunkBytes: 65536;
65
+ requestMaxBytes: 131072;
66
+ resultMaxBytes: 524288;
67
+ }>;
68
+ list(input?: ResourceToolInput<'knowledge_resource_list'>): Promise<ResourceToolResponse<"knowledge_resource_list">>;
69
+ describe(ref: string, input?: {
70
+ projectRef?: string;
71
+ }): Promise<ResourceToolResponse<"knowledge_resource_describe">>;
72
+ read(ref: string, input?: {
73
+ projectRef?: string;
74
+ }): Promise<ResourceToolResponse<"knowledge_resource_read">>;
75
+ capabilities(ref: string, input?: {
76
+ projectRef?: string;
77
+ }): Promise<ResourceToolResponse<"knowledge_resource_capabilities">>;
78
+ search(query: string, input?: Omit<ResourceToolInput<'knowledge_resource_search'>, 'query'>): Promise<ResourceToolResponse<"knowledge_resource_search">>;
79
+ window(input?: ResourceToolInput<'knowledge_resource_window'>): Promise<ResourceToolResponse<"knowledge_resource_window">>;
80
+ changes(input?: ResourceToolInput<'knowledge_resource_changes'>): Promise<ResourceToolResponse<"knowledge_resource_changes">>;
81
+ counts(input?: ResourceToolInput<'knowledge_resource_counts'>): Promise<ResourceToolResponse<"knowledge_resource_counts">>;
82
+ indexStatus(input?: ResourceToolInput<'knowledge_resource_index_status'>): Promise<ResourceToolResponse<"knowledge_resource_index_status">>;
83
+ media(ref: string, input?: Omit<ResourceToolInput<'knowledge_resource_media'>, 'ref'>): Promise<ResourceToolResponse<"knowledge_resource_media">>;
84
+ stream(ref: string, options?: MaterialStreamOptions & {
85
+ projectRef?: string;
86
+ }): Promise<import("./material-stream.js").MaterialStreamResponse>;
87
+ }
88
+ export {};