@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.
- package/LICENSE +202 -21
- package/NOTICE +29 -0
- package/README.md +26 -38
- package/dist/{types/sdk/agent-entry.d.ts → agent-entry.d.ts} +3 -3
- package/dist/agent-entry.js +153 -0
- package/dist/{types/sdk/agent-guidance-error.d.ts → agent-guidance-error.d.ts} +1 -1
- package/dist/agent-guidance-error.js +46 -0
- package/dist/auth.d.ts +124 -0
- package/dist/auth.js +165 -0
- package/dist/{types/sdk/index.d.ts → index.d.ts} +15 -14
- package/dist/index.js +159 -6570
- package/dist/internal/contracts/artifact.js +103 -0
- package/dist/internal/contracts/collection-control.js +69 -0
- package/dist/internal/contracts/collection.js +174 -0
- package/dist/internal/contracts/common.js +16 -0
- package/dist/internal/contracts/currentness.js +221 -0
- package/dist/internal/contracts/event.js +35 -0
- package/dist/internal/contracts/evidence.js +171 -0
- package/dist/{types → internal}/contracts/index.d.ts +0 -1
- package/dist/internal/contracts/index.js +54 -0
- package/dist/internal/contracts/material-capability.js +8 -0
- package/dist/internal/contracts/material-carrier.js +15 -0
- package/dist/internal/contracts/material-context.js +9 -0
- package/dist/internal/contracts/material-read.js +12 -0
- package/dist/internal/contracts/observation.js +39 -0
- package/dist/internal/contracts/persistence.js +239 -0
- package/dist/internal/contracts/project-intent.js +121 -0
- package/dist/internal/contracts/projection.js +194 -0
- package/dist/internal/contracts/public-reference.js +87 -0
- package/dist/internal/contracts/reference-record.js +55 -0
- package/dist/internal/contracts/remote-file.js +159 -0
- package/dist/internal/contracts/resource-scope.js +38 -0
- package/dist/internal/contracts/review-packet.js +61 -0
- package/dist/internal/contracts/review-plane.js +89 -0
- package/dist/internal/contracts/rich-document.js +184 -0
- package/dist/internal/contracts/runtime-compatibility.js +55 -0
- package/dist/internal/contracts/runtime.js +68 -0
- package/dist/internal/contracts/scheduler.js +256 -0
- package/dist/internal/contracts/signal.js +77 -0
- package/dist/internal/contracts/source-governance.js +194 -0
- package/dist/internal/contracts/source.js +32 -0
- package/dist/internal/contracts/tenant-budget.js +34 -0
- package/dist/internal/contracts/tenant-collection-request.js +58 -0
- package/dist/internal/contracts/tenant-collection.js +66 -0
- package/dist/internal/contracts/tenant-currentness.js +26 -0
- package/dist/internal/contracts/tenant-management.js +27 -0
- package/dist/internal/contracts/tenant-material-api.js +46 -0
- package/dist/internal/contracts/tenant-material-json-schema.js +16 -0
- package/dist/internal/contracts/tenant-pdf-text.js +13 -0
- package/dist/internal/contracts/tenant-project-control.js +19 -0
- package/dist/internal/contracts/tenant-public-reference.js +26 -0
- package/dist/internal/contracts/tenant-resource-api.js +70 -0
- package/dist/internal/contracts/tenant-resource.js +118 -0
- package/dist/internal/contracts/tenant-rich-document.js +17 -0
- package/dist/internal/contracts/tenant-source-binding.js +33 -0
- package/dist/internal/contracts/tenant-source-bridge.js +9 -0
- package/dist/internal/contracts/tenant-source-cutover.js +26 -0
- package/dist/internal/contracts/tenant-source-document.js +38 -0
- package/dist/internal/contracts/tenant-source-lease.js +5 -0
- package/dist/internal/contracts/tenant-source.js +83 -0
- package/dist/internal/contracts/tenant-web-collection.js +118 -0
- package/dist/internal/contracts/tenant-web-content-plan.js +39 -0
- package/dist/internal/contracts/tenant-web-content-result.js +15 -0
- package/dist/internal/contracts/tenant-web-content.js +16 -0
- package/dist/internal/contracts/tenant-web-crawl.js +55 -0
- package/dist/internal/contracts/tenant-web-dynamic.js +68 -0
- package/dist/internal/contracts/tenant-web-results.js +41 -0
- package/dist/internal/contracts/tenant-web-workflow.js +29 -0
- package/dist/internal/serving-contracts/agent-catalog.js +56 -0
- package/dist/internal/serving-contracts/agent-entry.js +57 -0
- package/dist/internal/serving-contracts/agent-guidance-shapes.js +12 -0
- package/dist/internal/serving-contracts/agent-input-hints.js +104 -0
- package/dist/internal/serving-contracts/body-search.js +16 -0
- package/dist/internal/serving-contracts/consumer.js +45 -0
- package/dist/internal/serving-contracts/core.js +76 -0
- package/dist/internal/serving-contracts/http.js +64 -0
- package/dist/{types → internal}/serving-contracts/index.d.ts +1 -0
- package/dist/internal/serving-contracts/index.js +25 -0
- package/dist/internal/serving-contracts/management.js +15 -0
- package/dist/internal/serving-contracts/material-capabilities.js +14 -0
- package/dist/internal/serving-contracts/material-index-status.js +5 -0
- package/dist/internal/serving-contracts/mcp.js +140 -0
- package/dist/internal/serving-contracts/tenant-governance.js +13 -0
- package/dist/internal/serving-contracts/tenant-management.js +89 -0
- package/dist/internal/serving-contracts/tenant-project.js +39 -0
- package/dist/internal/serving-contracts/tenant-runtime.js +37 -0
- package/dist/internal/serving-contracts/tenant-session.d.ts +87 -0
- package/dist/internal/serving-contracts/tenant-session.js +8 -0
- package/dist/internal/serving-contracts/tenant-web-content.js +20 -0
- package/dist/internal/serving-contracts/tenant-web-crawl.js +13 -0
- package/dist/internal/serving-contracts/tenant-web-dynamic.js +20 -0
- package/dist/internal/serving-contracts/tenant-web-workflow.js +36 -0
- package/dist/internal/serving-contracts/tenant-web.js +53 -0
- package/dist/internal/serving-contracts/tenant-workspace.js +28 -0
- package/dist/internal/serving-contracts/workflow.js +37 -0
- package/dist/material-stream.js +29 -0
- package/dist/{types/sdk/oauth.d.ts → oauth.d.ts} +18 -18
- package/dist/oauth.js +539 -0
- package/dist/{types/sdk/resource.d.ts → resource.d.ts} +5 -5
- package/dist/resource.js +123 -0
- package/dist/session.d.ts +4 -0
- package/dist/session.js +3 -0
- package/dist/tenant-client.d.ts +169 -0
- package/dist/tenant-client.js +58 -0
- package/dist/{types/sdk/tenant-management.d.ts → tenant-management.d.ts} +6 -6
- package/dist/tenant-management.js +149 -0
- package/dist/{types/sdk/tenant-project.d.ts → tenant-project.d.ts} +1 -1
- package/dist/tenant-project.js +63 -0
- package/dist/{types/sdk/tenant-runtime.d.ts → tenant-runtime.d.ts} +1 -1
- package/dist/tenant-runtime.js +17 -0
- package/dist/{types/sdk/tenant-web-content.d.ts → tenant-web-content.d.ts} +1 -1
- package/dist/tenant-web-content.js +70 -0
- package/dist/{types/sdk/tenant-web-crawl.d.ts → tenant-web-crawl.d.ts} +1 -1
- package/dist/tenant-web-crawl.js +39 -0
- package/dist/{types/sdk/tenant-web-dynamic.d.ts → tenant-web-dynamic.d.ts} +1 -1
- package/dist/tenant-web-dynamic.js +39 -0
- package/dist/{types/sdk/tenant-web-workflow.d.ts → tenant-web-workflow.d.ts} +1 -1
- package/dist/tenant-web-workflow.js +63 -0
- package/dist/{types/sdk/tenant-web.d.ts → tenant-web.d.ts} +1 -1
- package/dist/tenant-web.js +39 -0
- package/dist/{types/sdk/tenant-workspace.d.ts → tenant-workspace.d.ts} +1 -1
- package/dist/tenant-workspace.js +21 -0
- package/dist/token-provider.d.ts +14 -0
- package/dist/token-provider.js +21 -0
- package/package.json +27 -15
- package/dist/types/contracts/resource-transfer.d.ts +0 -24
- package/dist/types/sdk/resource-integrity.d.ts +0 -21
- package/dist/types/sdk/transport.d.ts +0 -16
- /package/dist/{types → internal}/contracts/artifact.d.ts +0 -0
- /package/dist/{types → internal}/contracts/collection-control.d.ts +0 -0
- /package/dist/{types → internal}/contracts/collection.d.ts +0 -0
- /package/dist/{types → internal}/contracts/common.d.ts +0 -0
- /package/dist/{types → internal}/contracts/currentness.d.ts +0 -0
- /package/dist/{types → internal}/contracts/event.d.ts +0 -0
- /package/dist/{types → internal}/contracts/evidence.d.ts +0 -0
- /package/dist/{types → internal}/contracts/material-capability.d.ts +0 -0
- /package/dist/{types → internal}/contracts/material-carrier.d.ts +0 -0
- /package/dist/{types → internal}/contracts/material-context.d.ts +0 -0
- /package/dist/{types → internal}/contracts/material-read.d.ts +0 -0
- /package/dist/{types → internal}/contracts/observation.d.ts +0 -0
- /package/dist/{types → internal}/contracts/persistence.d.ts +0 -0
- /package/dist/{types → internal}/contracts/project-intent.d.ts +0 -0
- /package/dist/{types → internal}/contracts/projection.d.ts +0 -0
- /package/dist/{types → internal}/contracts/public-reference.d.ts +0 -0
- /package/dist/{types → internal}/contracts/reference-record.d.ts +0 -0
- /package/dist/{types → internal}/contracts/remote-file.d.ts +0 -0
- /package/dist/{types → internal}/contracts/resource-scope.d.ts +0 -0
- /package/dist/{types → internal}/contracts/review-packet.d.ts +0 -0
- /package/dist/{types → internal}/contracts/review-plane.d.ts +0 -0
- /package/dist/{types → internal}/contracts/rich-document.d.ts +0 -0
- /package/dist/{types → internal}/contracts/runtime-compatibility.d.ts +0 -0
- /package/dist/{types → internal}/contracts/runtime.d.ts +0 -0
- /package/dist/{types → internal}/contracts/scheduler.d.ts +0 -0
- /package/dist/{types → internal}/contracts/signal.d.ts +0 -0
- /package/dist/{types → internal}/contracts/source-governance.d.ts +0 -0
- /package/dist/{types → internal}/contracts/source.d.ts +0 -0
- /package/dist/{types → internal}/contracts/tenant-budget.d.ts +0 -0
- /package/dist/{types → internal}/contracts/tenant-collection-request.d.ts +0 -0
- /package/dist/{types → internal}/contracts/tenant-collection.d.ts +0 -0
- /package/dist/{types → internal}/contracts/tenant-currentness.d.ts +0 -0
- /package/dist/{types → internal}/contracts/tenant-management.d.ts +0 -0
- /package/dist/{types → internal}/contracts/tenant-material-api.d.ts +0 -0
- /package/dist/{types → internal}/contracts/tenant-pdf-text.d.ts +0 -0
- /package/dist/{types → internal}/contracts/tenant-project-control.d.ts +0 -0
- /package/dist/{types → internal}/contracts/tenant-public-reference.d.ts +0 -0
- /package/dist/{types → internal}/contracts/tenant-resource-api.d.ts +0 -0
- /package/dist/{types → internal}/contracts/tenant-resource.d.ts +0 -0
- /package/dist/{types → internal}/contracts/tenant-rich-document.d.ts +0 -0
- /package/dist/{types → internal}/contracts/tenant-source-binding.d.ts +0 -0
- /package/dist/{types → internal}/contracts/tenant-source-bridge.d.ts +0 -0
- /package/dist/{types → internal}/contracts/tenant-source-cutover.d.ts +0 -0
- /package/dist/{types → internal}/contracts/tenant-source-document.d.ts +0 -0
- /package/dist/{types → internal}/contracts/tenant-source-lease.d.ts +0 -0
- /package/dist/{types → internal}/contracts/tenant-source.d.ts +0 -0
- /package/dist/{types → internal}/contracts/tenant-web-collection.d.ts +0 -0
- /package/dist/{types → internal}/contracts/tenant-web-content-plan.d.ts +0 -0
- /package/dist/{types → internal}/contracts/tenant-web-content-result.d.ts +0 -0
- /package/dist/{types → internal}/contracts/tenant-web-content.d.ts +0 -0
- /package/dist/{types → internal}/contracts/tenant-web-crawl.d.ts +0 -0
- /package/dist/{types → internal}/contracts/tenant-web-dynamic.d.ts +0 -0
- /package/dist/{types → internal}/contracts/tenant-web-results.d.ts +0 -0
- /package/dist/{types → internal}/contracts/tenant-web-workflow.d.ts +0 -0
- /package/dist/{types → internal}/serving-contracts/agent-catalog.d.ts +0 -0
- /package/dist/{types → internal}/serving-contracts/agent-entry.d.ts +0 -0
- /package/dist/{types → internal}/serving-contracts/agent-guidance-shapes.d.ts +0 -0
- /package/dist/{types → internal}/serving-contracts/agent-input-hints.d.ts +0 -0
- /package/dist/{types → internal}/serving-contracts/body-search.d.ts +0 -0
- /package/dist/{types → internal}/serving-contracts/consumer.d.ts +0 -0
- /package/dist/{types → internal}/serving-contracts/core.d.ts +0 -0
- /package/dist/{types → internal}/serving-contracts/http.d.ts +0 -0
- /package/dist/{types → internal}/serving-contracts/management.d.ts +0 -0
- /package/dist/{types → internal}/serving-contracts/material-capabilities.d.ts +0 -0
- /package/dist/{types → internal}/serving-contracts/material-index-status.d.ts +0 -0
- /package/dist/{types → internal}/serving-contracts/mcp.d.ts +0 -0
- /package/dist/{types → internal}/serving-contracts/tenant-governance.d.ts +0 -0
- /package/dist/{types → internal}/serving-contracts/tenant-management.d.ts +0 -0
- /package/dist/{types → internal}/serving-contracts/tenant-project.d.ts +0 -0
- /package/dist/{types → internal}/serving-contracts/tenant-runtime.d.ts +0 -0
- /package/dist/{types → internal}/serving-contracts/tenant-web-content.d.ts +0 -0
- /package/dist/{types → internal}/serving-contracts/tenant-web-crawl.d.ts +0 -0
- /package/dist/{types → internal}/serving-contracts/tenant-web-dynamic.d.ts +0 -0
- /package/dist/{types → internal}/serving-contracts/tenant-web-workflow.d.ts +0 -0
- /package/dist/{types → internal}/serving-contracts/tenant-web.d.ts +0 -0
- /package/dist/{types → internal}/serving-contracts/tenant-workspace.d.ts +0 -0
- /package/dist/{types → internal}/serving-contracts/workflow.d.ts +0 -0
- /package/dist/{types/sdk/material-stream.d.ts → material-stream.d.ts} +0 -0
package/dist/auth.d.ts
ADDED
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
/// <reference types="node" />
|
|
2
|
+
import { type TenantClientProvider, type TenantSession } from './internal/serving-contracts/index.js';
|
|
3
|
+
export { type TenantSession, type TenantClientProvider };
|
|
4
|
+
export interface OAuthTokens {
|
|
5
|
+
accessToken: string;
|
|
6
|
+
refreshToken: string;
|
|
7
|
+
expiresAt: string;
|
|
8
|
+
scopes: string[];
|
|
9
|
+
}
|
|
10
|
+
export interface AuthorizationTransaction {
|
|
11
|
+
issuer: string;
|
|
12
|
+
resource: string;
|
|
13
|
+
clientId: string;
|
|
14
|
+
redirectUri: string;
|
|
15
|
+
state: string;
|
|
16
|
+
verifier: string;
|
|
17
|
+
authorizationUrl: string;
|
|
18
|
+
expiresAt: number;
|
|
19
|
+
scopes: string[];
|
|
20
|
+
}
|
|
21
|
+
export interface AuthClientOptions {
|
|
22
|
+
baseUrl: string;
|
|
23
|
+
expectedIssuer?: string;
|
|
24
|
+
expectedResource?: string;
|
|
25
|
+
allowInsecureHttp?: boolean;
|
|
26
|
+
fetchImpl?: typeof fetch;
|
|
27
|
+
}
|
|
28
|
+
export declare class AuthError extends Error {
|
|
29
|
+
readonly code: string;
|
|
30
|
+
readonly status: number;
|
|
31
|
+
constructor(code: string, status?: number);
|
|
32
|
+
}
|
|
33
|
+
export declare function authUrl(raw: string, insecure?: boolean): URL;
|
|
34
|
+
export declare class KnowledgeAuthClient {
|
|
35
|
+
private options;
|
|
36
|
+
private root;
|
|
37
|
+
private fetchImpl;
|
|
38
|
+
private cached;
|
|
39
|
+
constructor(options: AuthClientOptions);
|
|
40
|
+
private request;
|
|
41
|
+
discover(): Promise<{
|
|
42
|
+
schemaVersion: 26;
|
|
43
|
+
provider: "knowledge-v2";
|
|
44
|
+
revision: string;
|
|
45
|
+
issuer: string;
|
|
46
|
+
resource: string;
|
|
47
|
+
authorizationServerMetadataUrl: string;
|
|
48
|
+
tenantSessionEndpoint: string;
|
|
49
|
+
tenantOperationStatusEndpoint: string;
|
|
50
|
+
resourceCallEndpoint: string;
|
|
51
|
+
resourceFileEndpoint: string;
|
|
52
|
+
registrationModes: ("PRE_REGISTERED_NATIVE" | "CIMD_READ_ONLY")[];
|
|
53
|
+
callbackModes: "NATIVE_LOOPBACK_PORT_V1"[];
|
|
54
|
+
providers: {
|
|
55
|
+
version: number;
|
|
56
|
+
endpoint: string;
|
|
57
|
+
}[];
|
|
58
|
+
tools: {
|
|
59
|
+
name: string;
|
|
60
|
+
endpoint: string;
|
|
61
|
+
method: "GET" | "POST";
|
|
62
|
+
inputSchema: import("zod").JSONType;
|
|
63
|
+
outputSchema: import("zod").JSONType;
|
|
64
|
+
scopeAlternatives: string[][];
|
|
65
|
+
}[];
|
|
66
|
+
limits: {
|
|
67
|
+
requestMaxBytes: 131072;
|
|
68
|
+
resultMaxBytes: 524288;
|
|
69
|
+
};
|
|
70
|
+
}>;
|
|
71
|
+
metadata(): Promise<{
|
|
72
|
+
issuer: string;
|
|
73
|
+
authorizationEndpoint: string;
|
|
74
|
+
tokenEndpoint: string;
|
|
75
|
+
revocationEndpoint: string;
|
|
76
|
+
}>;
|
|
77
|
+
begin(input: {
|
|
78
|
+
clientId: string;
|
|
79
|
+
redirectUri: string;
|
|
80
|
+
scopes: string[];
|
|
81
|
+
authorityVersion?: 1 | 2;
|
|
82
|
+
expectedTenantRef?: string;
|
|
83
|
+
}): Promise<{
|
|
84
|
+
issuer: string;
|
|
85
|
+
resource: string;
|
|
86
|
+
clientId: string;
|
|
87
|
+
redirectUri: string;
|
|
88
|
+
state: string;
|
|
89
|
+
verifier: string;
|
|
90
|
+
authorizationUrl: string;
|
|
91
|
+
expiresAt: number;
|
|
92
|
+
scopes: string[];
|
|
93
|
+
}>;
|
|
94
|
+
exchange(t: AuthorizationTransaction, callback: URL): Promise<OAuthTokens>;
|
|
95
|
+
private tokens;
|
|
96
|
+
refresh(clientId: string, refreshToken: string, scopes?: string[]): Promise<OAuthTokens>;
|
|
97
|
+
session(token: string, expected?: Partial<Pick<TenantSession, 'issuer' | 'resource' | 'clientId' | 'userId' | 'tenantId' | 'authorityVersion'>>): Promise<{
|
|
98
|
+
schemaVersion: 1;
|
|
99
|
+
issuer: string;
|
|
100
|
+
resource: string;
|
|
101
|
+
clientId: string;
|
|
102
|
+
userId: string;
|
|
103
|
+
tenantId: string;
|
|
104
|
+
tenantRef: string;
|
|
105
|
+
contextType: "TENANT";
|
|
106
|
+
authorityVersion: 2 | 1;
|
|
107
|
+
tokenScopes: string[];
|
|
108
|
+
effectiveScopes: string[];
|
|
109
|
+
expiresAt: string;
|
|
110
|
+
managementConfigured: boolean;
|
|
111
|
+
blockers: string[];
|
|
112
|
+
}>;
|
|
113
|
+
operationStatus(token: string, raw: unknown, expectedTenantId?: string): Promise<{
|
|
114
|
+
schemaVersion: 1;
|
|
115
|
+
tenantId: string;
|
|
116
|
+
requestId: string;
|
|
117
|
+
state: "NOT_FOUND" | "INTENT_PERSISTED";
|
|
118
|
+
operationRef: string | null;
|
|
119
|
+
action: string | null;
|
|
120
|
+
receivedAt: string | null;
|
|
121
|
+
completion: "NOT_PROVEN";
|
|
122
|
+
}>;
|
|
123
|
+
revoke(clientId: string, token: string): Promise<void>;
|
|
124
|
+
}
|
package/dist/auth.js
ADDED
|
@@ -0,0 +1,165 @@
|
|
|
1
|
+
import { randomBytes, createHash } from 'node:crypto';
|
|
2
|
+
import { tenantClientProviderSchema, tenantSessionSchema, tenantOperationStatusInputSchema, tenantOperationStatusSchema } from './internal/serving-contracts/index.js';
|
|
3
|
+
export {};
|
|
4
|
+
export class AuthError extends Error {
|
|
5
|
+
code;
|
|
6
|
+
status;
|
|
7
|
+
constructor(code, status = 0) {
|
|
8
|
+
super(code);
|
|
9
|
+
this.code = code;
|
|
10
|
+
this.status = status;
|
|
11
|
+
this.name = 'AuthError';
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
export function authUrl(raw, insecure = false) { let u; try {
|
|
15
|
+
u = new URL(raw);
|
|
16
|
+
}
|
|
17
|
+
catch {
|
|
18
|
+
throw new AuthError('AUTH_URL_INVALID');
|
|
19
|
+
} if (u.username || u.password || u.search || u.hash || u.protocol !== 'https:' && !(insecure && u.protocol === 'http:' && ['127.0.0.1', '[::1]', 'localhost'].includes(u.hostname)))
|
|
20
|
+
throw new AuthError('AUTH_URL_INVALID'); return u; }
|
|
21
|
+
export class KnowledgeAuthClient {
|
|
22
|
+
options;
|
|
23
|
+
root;
|
|
24
|
+
fetchImpl;
|
|
25
|
+
cached;
|
|
26
|
+
constructor(options) {
|
|
27
|
+
this.options = options;
|
|
28
|
+
this.root = authUrl(options.baseUrl, options.allowInsecureHttp);
|
|
29
|
+
this.fetchImpl = options.fetchImpl ?? fetch;
|
|
30
|
+
}
|
|
31
|
+
async request(url, init = {}) {
|
|
32
|
+
let response;
|
|
33
|
+
try {
|
|
34
|
+
response = await this.fetchImpl(url, { ...init, redirect: 'error', signal: AbortSignal.timeout(15000) });
|
|
35
|
+
}
|
|
36
|
+
catch {
|
|
37
|
+
throw new AuthError('AUTH_TRANSPORT_FAILURE');
|
|
38
|
+
}
|
|
39
|
+
if (!response.body)
|
|
40
|
+
throw new AuthError('AUTH_RESPONSE_INVALID', response.status);
|
|
41
|
+
const reader = response.body.getReader(), chunks = [];
|
|
42
|
+
let n = 0;
|
|
43
|
+
try {
|
|
44
|
+
while (true) {
|
|
45
|
+
const p = await reader.read();
|
|
46
|
+
if (p.done)
|
|
47
|
+
break;
|
|
48
|
+
n += p.value.length;
|
|
49
|
+
if (n > 524288) {
|
|
50
|
+
await reader.cancel();
|
|
51
|
+
throw new AuthError('AUTH_RESPONSE_BUDGET');
|
|
52
|
+
}
|
|
53
|
+
chunks.push(p.value);
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
finally {
|
|
57
|
+
reader.releaseLock();
|
|
58
|
+
}
|
|
59
|
+
let data;
|
|
60
|
+
try {
|
|
61
|
+
data = JSON.parse(new TextDecoder('utf-8', { fatal: true }).decode(Buffer.concat(chunks)));
|
|
62
|
+
}
|
|
63
|
+
catch {
|
|
64
|
+
throw new AuthError('AUTH_RESPONSE_INVALID', response.status);
|
|
65
|
+
}
|
|
66
|
+
if (!response.ok)
|
|
67
|
+
throw new AuthError(response.status === 401 ? 'AUTH_REQUIRED' : response.status === 403 ? 'AUTH_FORBIDDEN' : response.status === 404 ? 'SERVER_CAPABILITY_UNAVAILABLE' : 'AUTH_REQUEST_FAILED', response.status);
|
|
68
|
+
return data;
|
|
69
|
+
}
|
|
70
|
+
async discover() {
|
|
71
|
+
if (this.cached)
|
|
72
|
+
return this.cached;
|
|
73
|
+
let p;
|
|
74
|
+
try {
|
|
75
|
+
p = tenantClientProviderSchema.parse(await this.request(new URL(this.root.pathname.replace(/\/$/, '') + '/v1/tenant/client-provider', this.root.origin)));
|
|
76
|
+
}
|
|
77
|
+
catch (e) {
|
|
78
|
+
if (e instanceof AuthError)
|
|
79
|
+
throw e;
|
|
80
|
+
throw new AuthError('AUTH_DISCOVERY_INVALID');
|
|
81
|
+
}
|
|
82
|
+
if (this.options.expectedIssuer && p.issuer !== this.options.expectedIssuer || this.options.expectedResource && p.resource !== this.options.expectedResource)
|
|
83
|
+
throw new AuthError('AUTH_ISSUER_MISMATCH');
|
|
84
|
+
authUrl(p.issuer, this.options.allowInsecureHttp);
|
|
85
|
+
authUrl(p.resource, this.options.allowInsecureHttp);
|
|
86
|
+
for (const raw of [p.tenantSessionEndpoint, p.tenantOperationStatusEndpoint, p.resourceCallEndpoint, p.resourceFileEndpoint, ...p.tools.map(t => t.endpoint), ...p.providers.map(t => t.endpoint)])
|
|
87
|
+
if (authUrl(raw, this.options.allowInsecureHttp).origin !== this.root.origin)
|
|
88
|
+
throw new AuthError('AUTH_ENDPOINT_MISMATCH');
|
|
89
|
+
const issuer = authUrl(p.issuer, this.options.allowInsecureHttp);
|
|
90
|
+
if (authUrl(p.authorizationServerMetadataUrl, this.options.allowInsecureHttp).origin !== issuer.origin)
|
|
91
|
+
throw new AuthError('AUTH_ISSUER_MISMATCH');
|
|
92
|
+
this.cached = p;
|
|
93
|
+
return p;
|
|
94
|
+
}
|
|
95
|
+
async metadata() { const p = await this.discover(), m = await this.request(p.authorizationServerMetadataUrl); if (m.issuer !== p.issuer || !Array.isArray(m.code_challenge_methods_supported) || !m.code_challenge_methods_supported.includes('S256') || !Array.isArray(m.grant_types_supported) || !m.grant_types_supported.includes('authorization_code'))
|
|
96
|
+
throw new AuthError('AUTH_DISCOVERY_INVALID'); for (const key of ['authorization_endpoint', 'token_endpoint', 'revocation_endpoint'])
|
|
97
|
+
if (typeof m[key] !== 'string' || (key !== 'authorization_endpoint' && authUrl(m[key], this.options.allowInsecureHttp).origin !== new URL(p.issuer).origin))
|
|
98
|
+
throw new AuthError('AUTH_ENDPOINT_MISMATCH'); authUrl(m.authorization_endpoint, this.options.allowInsecureHttp); return { issuer: p.issuer, authorizationEndpoint: m.authorization_endpoint, tokenEndpoint: m.token_endpoint, revocationEndpoint: m.revocation_endpoint }; }
|
|
99
|
+
async begin(input) {
|
|
100
|
+
const p = await this.discover();
|
|
101
|
+
if (!p.registrationModes.includes('PRE_REGISTERED_NATIVE'))
|
|
102
|
+
throw new AuthError('SERVER_CAPABILITY_UNAVAILABLE');
|
|
103
|
+
const m = await this.metadata(), state = randomBytes(32).toString('base64url'), verifier = randomBytes(48).toString('base64url'), u = new URL(m.authorizationEndpoint);
|
|
104
|
+
const redirect = new URL(input.redirectUri);
|
|
105
|
+
if (redirect.protocol !== 'http:' || !['127.0.0.1', '[::1]'].includes(redirect.hostname) || redirect.search || redirect.hash || redirect.username || redirect.password || !input.scopes.length || input.scopes.length > 32)
|
|
106
|
+
throw new AuthError('AUTH_INPUT_INVALID');
|
|
107
|
+
for (const [k, v] of Object.entries({ response_type: 'code', client_id: input.clientId, redirect_uri: redirect.href, resource: p.resource, scope: input.scopes.join(' '), authority_version: String(input.authorityVersion ?? 1), state, code_challenge: createHash('sha256').update(verifier).digest('base64url'), code_challenge_method: 'S256', ...(input.expectedTenantRef ? { tenant_ref: input.expectedTenantRef } : {}) }))
|
|
108
|
+
u.searchParams.set(k, v);
|
|
109
|
+
return { issuer: p.issuer, resource: p.resource, clientId: input.clientId, redirectUri: redirect.href, state, verifier, authorizationUrl: u.href, expiresAt: Date.now() + 300000, scopes: input.scopes };
|
|
110
|
+
}
|
|
111
|
+
async exchange(t, callback) {
|
|
112
|
+
if (Date.now() >= t.expiresAt || callback.origin !== new URL(t.redirectUri).origin || callback.pathname !== new URL(t.redirectUri).pathname || callback.hash || callback.username || callback.password)
|
|
113
|
+
throw new AuthError('AUTH_CALLBACK_INVALID');
|
|
114
|
+
for (const k of callback.searchParams.keys())
|
|
115
|
+
if (!['state', 'iss', 'code', 'error', 'error_description', 'error_uri'].includes(k) || callback.searchParams.getAll(k).length !== 1)
|
|
116
|
+
throw new AuthError('AUTH_CALLBACK_INVALID');
|
|
117
|
+
if (callback.searchParams.get('state') !== t.state || callback.searchParams.get('iss') !== t.issuer)
|
|
118
|
+
throw new AuthError('AUTH_CALLBACK_INVALID');
|
|
119
|
+
if (callback.searchParams.has('error'))
|
|
120
|
+
throw new AuthError('AUTH_CONSENT_DENIED');
|
|
121
|
+
const code = callback.searchParams.get('code');
|
|
122
|
+
if (!code)
|
|
123
|
+
throw new AuthError('AUTH_CALLBACK_INVALID');
|
|
124
|
+
const p = await this.discover();
|
|
125
|
+
if (p.issuer !== t.issuer || p.resource !== t.resource)
|
|
126
|
+
throw new AuthError('AUTH_ISSUER_MISMATCH');
|
|
127
|
+
return this.tokens(new URLSearchParams({ grant_type: 'authorization_code', client_id: t.clientId, resource: t.resource, redirect_uri: t.redirectUri, code, code_verifier: t.verifier }), t.scopes);
|
|
128
|
+
}
|
|
129
|
+
async tokens(body, allowed) {
|
|
130
|
+
const m = await this.metadata();
|
|
131
|
+
let raw;
|
|
132
|
+
try {
|
|
133
|
+
raw = await this.request(m.tokenEndpoint, { method: 'POST', headers: { 'content-type': 'application/x-www-form-urlencoded' }, body });
|
|
134
|
+
}
|
|
135
|
+
catch (e) {
|
|
136
|
+
throw new AuthError(e instanceof AuthError && e.status === 400 ? 'AUTH_REAUTH_REQUIRED' : 'AUTH_TOKEN_RESULT_UNKNOWN');
|
|
137
|
+
}
|
|
138
|
+
const r = raw;
|
|
139
|
+
if (r.token_type !== 'Bearer' || typeof r.access_token !== 'string' || typeof r.refresh_token !== 'string' || !/^[-\w]{43}$/.test(r.access_token) || !/^[-\w]{43}$/.test(r.refresh_token) || typeof r.expires_in !== 'number' || !Number.isSafeInteger(r.expires_in) || r.expires_in < 1 || r.expires_in > 86400 || typeof r.scope !== 'string')
|
|
140
|
+
throw new AuthError('AUTH_TOKEN_RESULT_UNKNOWN');
|
|
141
|
+
const scopes = r.scope.split(' ');
|
|
142
|
+
if (allowed && scopes.some(s => !allowed.includes(s)))
|
|
143
|
+
throw new AuthError('AUTH_SCOPE_MISMATCH');
|
|
144
|
+
return { accessToken: r.access_token, refreshToken: r.refresh_token, expiresAt: new Date(Date.now() + r.expires_in * 1000).toISOString(), scopes };
|
|
145
|
+
}
|
|
146
|
+
async refresh(clientId, refreshToken, scopes) { const p = await this.discover(); return this.tokens(new URLSearchParams({ grant_type: 'refresh_token', client_id: clientId, resource: p.resource, refresh_token: refreshToken }), scopes); }
|
|
147
|
+
async session(token, expected) {
|
|
148
|
+
const p = await this.discover();
|
|
149
|
+
let s;
|
|
150
|
+
try {
|
|
151
|
+
s = tenantSessionSchema.parse(await this.request(p.tenantSessionEndpoint, { headers: { authorization: 'Bearer ' + token } }));
|
|
152
|
+
}
|
|
153
|
+
catch (e) {
|
|
154
|
+
if (e instanceof AuthError)
|
|
155
|
+
throw e;
|
|
156
|
+
throw new AuthError('AUTH_SESSION_INVALID');
|
|
157
|
+
}
|
|
158
|
+
if (s.issuer !== p.issuer || s.resource !== p.resource || expected && Object.entries(expected).some(([k, v]) => s[k] !== v))
|
|
159
|
+
throw new AuthError('AUTH_CONTEXT_MISMATCH');
|
|
160
|
+
return s;
|
|
161
|
+
}
|
|
162
|
+
async operationStatus(token, raw, expectedTenantId) { const input = tenantOperationStatusInputSchema.parse(raw), p = await this.discover(), url = new URL(p.tenantOperationStatusEndpoint); url.searchParams.set('requestId', input.requestId); const result = tenantOperationStatusSchema.parse(await this.request(url, { headers: { authorization: 'Bearer ' + token } })); if (expectedTenantId && result.tenantId !== expectedTenantId)
|
|
163
|
+
throw new AuthError('AUTH_CONTEXT_MISMATCH'); return result; }
|
|
164
|
+
async revoke(clientId, token) { const m = await this.metadata(); await this.request(m.revocationEndpoint, { method: 'POST', headers: { 'content-type': 'application/x-www-form-urlencoded' }, body: new URLSearchParams({ client_id: clientId, token }) }); }
|
|
165
|
+
}
|
|
@@ -1,11 +1,10 @@
|
|
|
1
|
-
|
|
2
|
-
export type { SdkTransportOptions } from './transport.js';
|
|
1
|
+
/// <reference types="node" />
|
|
3
2
|
import { type MaterialStreamOptions } from './material-stream.js';
|
|
4
3
|
export * from './resource.js';
|
|
5
4
|
export type { MaterialStreamOptions, MaterialStreamResponse } from './material-stream.js';
|
|
6
5
|
export * from './oauth.js';
|
|
7
|
-
import { type MaterialOutboxWindow, type ServingArtifactListResponse, type ServingArtifactPageResponse, type ServingArtifactMaterialPageResponse, type ServingArtifactMaterialResponse, type ServingMaterialPageResponse, type ServingMaterialRoutePageResponse, type ServingMaterialPartitionsResponse, type ServingMaterialPartitionPageResponse, type ServingMaterialSearchResponse, type ServingArtifactResponse, type ServingContentDecisionResponse, type ServingCurrentnessResponse, type ServingEvidenceListResponse, type ServingEvidencePageResponse, type ServingEvidencePresentationResponse, type ServingEvidenceResponse, type ServingHealthResponse, type ServingReferenceListResponse, type ServingReferenceLookupResponse, type ServingReferenceResponse, type ServingReferenceMaterialPageResponse, type ServingReferenceMaterialResponse, type ReferenceLookupFilter, type ServingProjectIntentResponse, type ServingProjectSourceListResponse, type ServingProjectSourceResponse, type ServingSourceResponse } from '
|
|
8
|
-
export interface KnowledgeServingClientOptions
|
|
6
|
+
import { type MaterialOutboxWindow, type ServingArtifactListResponse, type ServingArtifactPageResponse, type ServingArtifactMaterialPageResponse, type ServingArtifactMaterialResponse, type ServingMaterialPageResponse, type ServingMaterialRoutePageResponse, type ServingMaterialPartitionsResponse, type ServingMaterialPartitionPageResponse, type ServingMaterialSearchResponse, type ServingArtifactResponse, type ServingContentDecisionResponse, type ServingCurrentnessResponse, type ServingEvidenceListResponse, type ServingEvidencePageResponse, type ServingEvidencePresentationResponse, type ServingEvidenceResponse, type ServingHealthResponse, type ServingReferenceListResponse, type ServingReferenceLookupResponse, type ServingReferenceResponse, type ServingReferenceMaterialPageResponse, type ServingReferenceMaterialResponse, type ReferenceLookupFilter, type ServingProjectIntentResponse, type ServingProjectSourceListResponse, type ServingProjectSourceResponse, type ServingSourceResponse } from './internal/serving-contracts/index.js';
|
|
7
|
+
export interface KnowledgeServingClientOptions {
|
|
9
8
|
baseUrl: string;
|
|
10
9
|
token: string;
|
|
11
10
|
projectKey: string;
|
|
@@ -22,7 +21,6 @@ export interface ServingContentResponse {
|
|
|
22
21
|
content: Buffer;
|
|
23
22
|
}
|
|
24
23
|
export declare class KnowledgeServingClient {
|
|
25
|
-
private readonly limits;
|
|
26
24
|
readonly projectKey: string;
|
|
27
25
|
private readonly root;
|
|
28
26
|
private readonly basePath;
|
|
@@ -128,19 +126,19 @@ export declare class KnowledgeServingClient {
|
|
|
128
126
|
sourceProjectKey: string;
|
|
129
127
|
identityHash: string;
|
|
130
128
|
kind: string;
|
|
131
|
-
classification: "
|
|
129
|
+
classification: "TENANT" | "PUBLIC" | "PUBLIC_METADATA" | "INTERNAL" | "FDE_INTERNAL" | "ACCESS_CONTROLLED" | "UNKNOWN";
|
|
132
130
|
mediaType: string;
|
|
133
131
|
decision: {
|
|
134
132
|
schemaVersion: 1;
|
|
135
133
|
action: "ALLOW" | "DENY";
|
|
136
|
-
reasonCodes: ("
|
|
134
|
+
reasonCodes: ("NOT_FOUND" | "UNAVAILABLE" | "INTEGRITY_MISMATCH" | "CONTENT_ACCESS_DENIED" | "UNSUPPORTED_RESOURCE")[];
|
|
137
135
|
assessedAt: string;
|
|
138
136
|
};
|
|
139
137
|
};
|
|
140
138
|
materialAccess: {
|
|
141
139
|
schemaVersion: 1;
|
|
142
140
|
action: "ALLOW" | "DENY";
|
|
143
|
-
reasonCodes: ("
|
|
141
|
+
reasonCodes: ("NOT_FOUND" | "UNAVAILABLE" | "INTEGRITY_MISMATCH" | "CONTENT_ACCESS_DENIED" | "UNSUPPORTED_RESOURCE")[];
|
|
144
142
|
assessedAt: string;
|
|
145
143
|
};
|
|
146
144
|
representation: {
|
|
@@ -150,7 +148,7 @@ export declare class KnowledgeServingClient {
|
|
|
150
148
|
contentHash: string | null;
|
|
151
149
|
mediaType: string;
|
|
152
150
|
byteLength: number | null;
|
|
153
|
-
methods: ("
|
|
151
|
+
methods: ("GET" | "HEAD")[];
|
|
154
152
|
range: "NONE" | "SINGLE";
|
|
155
153
|
verification: "ON_READ";
|
|
156
154
|
verificationChunkBytes: number | null;
|
|
@@ -173,19 +171,19 @@ export declare class KnowledgeServingClient {
|
|
|
173
171
|
sourceProjectKey: string;
|
|
174
172
|
identityHash: string;
|
|
175
173
|
kind: string;
|
|
176
|
-
classification: "
|
|
174
|
+
classification: "TENANT" | "PUBLIC" | "PUBLIC_METADATA" | "INTERNAL" | "FDE_INTERNAL" | "ACCESS_CONTROLLED" | "UNKNOWN";
|
|
177
175
|
mediaType: string;
|
|
178
176
|
decision: {
|
|
179
177
|
schemaVersion: 1;
|
|
180
178
|
action: "ALLOW" | "DENY";
|
|
181
|
-
reasonCodes: ("
|
|
179
|
+
reasonCodes: ("NOT_FOUND" | "UNAVAILABLE" | "INTEGRITY_MISMATCH" | "CONTENT_ACCESS_DENIED" | "UNSUPPORTED_RESOURCE")[];
|
|
182
180
|
assessedAt: string;
|
|
183
181
|
};
|
|
184
182
|
};
|
|
185
183
|
materialAccess: {
|
|
186
184
|
schemaVersion: 1;
|
|
187
185
|
action: "ALLOW" | "DENY";
|
|
188
|
-
reasonCodes: ("
|
|
186
|
+
reasonCodes: ("NOT_FOUND" | "UNAVAILABLE" | "INTEGRITY_MISMATCH" | "CONTENT_ACCESS_DENIED" | "UNSUPPORTED_RESOURCE")[];
|
|
189
187
|
assessedAt: string;
|
|
190
188
|
};
|
|
191
189
|
representation: {
|
|
@@ -195,7 +193,7 @@ export declare class KnowledgeServingClient {
|
|
|
195
193
|
contentHash: string | null;
|
|
196
194
|
mediaType: string;
|
|
197
195
|
byteLength: number | null;
|
|
198
|
-
methods: ("
|
|
196
|
+
methods: ("GET" | "HEAD")[];
|
|
199
197
|
range: "NONE" | "SINGLE";
|
|
200
198
|
verification: "ON_READ";
|
|
201
199
|
verificationChunkBytes: number | null;
|
|
@@ -233,7 +231,7 @@ export declare class KnowledgeServingClient {
|
|
|
233
231
|
contentHash: string | null;
|
|
234
232
|
mediaType: string;
|
|
235
233
|
byteLength: number | null;
|
|
236
|
-
methods: ("
|
|
234
|
+
methods: ("GET" | "HEAD")[];
|
|
237
235
|
range: "NONE" | "SINGLE";
|
|
238
236
|
verification: "ON_READ";
|
|
239
237
|
verificationChunkBytes: number | null;
|
|
@@ -285,5 +283,8 @@ export * from './tenant-web-crawl.js';
|
|
|
285
283
|
export * from './tenant-web-dynamic.js';
|
|
286
284
|
export * from './tenant-web-content.js';
|
|
287
285
|
export * from './tenant-web-workflow.js';
|
|
286
|
+
export * from './auth.js';
|
|
287
|
+
export * from './token-provider.js';
|
|
288
|
+
export * from './tenant-client.js';
|
|
288
289
|
export * from './agent-entry.js';
|
|
289
290
|
export * from './agent-guidance-error.js';
|