@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
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
/** Explicit Provider25 operations; earlier registries remain frozen. */
|
|
2
|
+
import { z } from 'zod';
|
|
3
|
+
import { tenantWebWorkflowStatusSchema, tenantWebScheduleSchema, tenantWebControlInputSchema, tenantWebLifecycleReceiptSchema, tenantWebWorkflowJobSchema, tenantWebContentOutcomeSchema, tenantWebJobRefSchema, tenantCollectionCycleSchema, tenantResourceRefSchema, sha256Schema, isoDateTimeSchema, materialTenantIdSchema, tenantStorageKey, resourceDataSchemas } from '../contracts/index.js';
|
|
4
|
+
import { tenantWebContentToolSchemas, tenantWebContentDataSchemas, tenantWebContentWorkspaceToolSchemas, tenantWebContentProviderSchema, tenantWebContentErrorSchema } from './tenant-web-content.js';
|
|
5
|
+
import { tenantWebScopesForInput } from './tenant-web.js';
|
|
6
|
+
import { tenantRuntimeEnvelopeSchema } from './tenant-runtime.js';
|
|
7
|
+
const count = z.number().int().nonnegative().safe(), cursor = z.string().min(1).max(4096), job = z.object({ jobRef: tenantWebJobRefSchema }).strict(), page = job.extend({ after: cursor.optional(), limit: z.number().int().min(1).max(100).default(20) }), schedule = tenantWebScheduleSchema.default({ mode: 'ONCE' }), observation = z.object({ ref: tenantResourceRefSchema, contentHash: sha256Schema, sourceUrl: z.string().url(), observedAt: isoDateTimeSchema }).strict().nullable();
|
|
8
|
+
export const tenantWebWorkflowToolSchemas = {
|
|
9
|
+
tenant_web_collect_preview: tenantWebContentToolSchemas.tenant_web_collect_preview.extend({ schedule }),
|
|
10
|
+
tenant_web_collect_submit: tenantWebContentToolSchemas.tenant_web_collect_submit.extend({ schedule }),
|
|
11
|
+
tenant_web_collect_status: job, tenant_web_collect_results: page, tenant_web_collect_cycles: page,
|
|
12
|
+
tenant_web_collect_control: tenantWebControlInputSchema,
|
|
13
|
+
tenant_web_collect_refresh: job.extend({ requestId: tenantCollectionCycleSchema, expectedEpoch: count }),
|
|
14
|
+
tenant_web_collect_read: job.extend({ kind: z.enum(['ORIGINAL', 'DOM', 'RESULT']), index: count.max(21999), stateIndex: count.max(100).optional() }).refine(v => v.kind === 'DOM' ? v.stateIndex !== undefined : v.stateIndex === undefined),
|
|
15
|
+
tenant_web_collect_index_status: z.object({}).strict(),
|
|
16
|
+
};
|
|
17
|
+
export const tenantWebWorkflowWorkspaceToolSchemas = { ...tenantWebContentWorkspaceToolSchemas, ...tenantWebWorkflowToolSchemas };
|
|
18
|
+
export function tenantWebWorkflowScopesForInput(name, raw) { if (!Object.hasOwn(tenantWebWorkflowToolSchemas, name))
|
|
19
|
+
return tenantWebScopesForInput(name, raw); tenantWebWorkflowToolSchemas[name].parse(raw); return name === 'tenant_web_collect_read' || name === 'tenant_web_collect_index_status' ? ['knowledge.collect', 'knowledge.material.read'] : ['tenant_web_collect_status', 'tenant_web_collect_results', 'tenant_web_collect_cycles'].includes(name) ? ['knowledge.collect'] : ['knowledge.collect', 'knowledge.source.manage']; }
|
|
20
|
+
export const tenantWebWorkflowDataSchemas = {
|
|
21
|
+
tenant_web_collect_preview: tenantWebContentDataSchemas.tenant_web_collect_preview.safeExtend({ schedule: tenantWebScheduleSchema }),
|
|
22
|
+
tenant_web_collect_submit: z.object({ inserted: z.boolean(), job: tenantWebWorkflowStatusSchema }).strict(),
|
|
23
|
+
tenant_web_collect_status: tenantWebWorkflowStatusSchema,
|
|
24
|
+
tenant_web_collect_results: job.extend({ items: z.array(tenantWebContentOutcomeSchema.safeExtend({ original: observation, observation })).max(100), through: count, nextAfter: cursor.nullable(), available: count, terminal: z.boolean() }),
|
|
25
|
+
tenant_web_collect_cycles: job.extend({ rootJobRef: tenantWebJobRefSchema, items: z.array(z.object({ jobRef: tenantWebJobRefSchema, cycle: tenantWebWorkflowJobSchema.shape.cycle, submittedAt: isoDateTimeSchema }).strict()).max(100), through: count, nextAfter: cursor.nullable() }),
|
|
26
|
+
tenant_web_collect_control: z.object({ replayed: z.boolean(), receipt: tenantWebLifecycleReceiptSchema, job: tenantWebWorkflowStatusSchema }).strict(),
|
|
27
|
+
tenant_web_collect_refresh: z.object({ inserted: z.boolean(), job: tenantWebWorkflowStatusSchema }).strict(),
|
|
28
|
+
tenant_web_collect_read: job.extend({ ref: tenantResourceRefSchema, result: resourceDataSchemas.knowledge_resource_read }),
|
|
29
|
+
tenant_web_collect_index_status: resourceDataSchemas.knowledge_resource_index_status,
|
|
30
|
+
};
|
|
31
|
+
export const tenantWebWorkflowErrorSchema = tenantWebContentErrorSchema.extend({ completedPhase: z.enum([...tenantWebContentErrorSchema.shape.completedPhase.unwrap().options, 'WEB_CONTROL_COMMITTED']).optional(), errorCode: z.enum([...tenantWebContentErrorSchema.shape.errorCode.options, 'TENANT_WEB_CONTROL_CONFLICT', 'TENANT_WEB_CANCELLED', 'TENANT_WEB_PAUSED', 'TENANT_WEB_CYCLE_PENDING', 'TENANT_WEB_RUNTIME_OR_DELEGATION_UNAVAILABLE']) }).strict();
|
|
32
|
+
export function tenantWebWorkflowEnvelopeSchema(tool) { return z.object({ schemaVersion: z.literal(2), tenantId: materialTenantIdSchema, tool: z.literal(tool), data: tenantWebWorkflowDataSchemas[tool] }).strict().superRefine((v, c) => { const d = v.data, key = tenantStorageKey(v.tenantId); if ([d.jobRef, d.rootJobRef, d.job?.jobRef, ...(d.items ?? []).map(i => i.jobRef)].some(ref => ref && !ref.startsWith('tenant-web-collection://' + key + '/')) || [d.ref, ...(d.items ?? []).flatMap(i => [i.documentRef, i.original?.ref, i.observation?.ref])].some(ref => ref && !ref.startsWith('tenant-resource://' + key + '/')) || d.result?.item && (d.result.item.ownerTenantId !== v.tenantId || d.result.item.ref !== d.ref))
|
|
33
|
+
c.addIssue({ code: 'custom', message: 'Exact Tenant workflow/result identity required' }); }); }
|
|
34
|
+
export const tenantWebWorkflowInputJsonSchemas = Object.fromEntries(Object.entries(tenantWebWorkflowWorkspaceToolSchemas).map(([n, s]) => [n, z.toJSONSchema(s, { target: 'draft-07' })]));
|
|
35
|
+
export const tenantWebWorkflowOutputJsonSchemas = Object.fromEntries(Object.keys(tenantWebWorkflowWorkspaceToolSchemas).map(n => [n, { type: 'object', oneOf: [z.toJSONSchema(Object.hasOwn(tenantWebWorkflowToolSchemas, n) ? tenantWebWorkflowEnvelopeSchema(n) : tenantRuntimeEnvelopeSchema(n), { target: 'draft-07' }), z.toJSONSchema(tenantWebWorkflowErrorSchema, { target: 'draft-07' })] }]));
|
|
36
|
+
export const tenantWebWorkflowProviderSchema = z.object({ ...tenantWebContentProviderSchema.shape, schemaVersion: z.literal(25), collectionMode: z.literal('EXPLICIT_HOST_WITH_OPT_IN_DUE'), tools: z.array(z.string()).length(Object.keys(tenantWebWorkflowWorkspaceToolSchemas).length), capabilities: z.tuple([z.literal('TENANT_MANAGEMENT_V1'), z.literal('TENANT_WORKFLOW_V1'), z.literal('TENANT_CURRENTNESS_V2'), z.literal('TENANT_SOURCE_V1'), z.literal('TENANT_WORKSPACE_METADATA_V1'), z.literal('TENANT_PROJECT_CONTEXT_V1'), z.literal('TENANT_RUNTIME_STATUS_V1'), z.literal('TENANT_WEB_COLLECTION_SPEC_V1'), z.literal('TENANT_WEB_CRAWL_V1'), z.literal('TENANT_WEB_DYNAMIC_V1'), z.literal('TENANT_WEB_CONTENT_V1'), z.literal('TENANT_WEB_WORKFLOW_V1')]) }).strict().refine(v => new Set(v.tools).size === Object.keys(tenantWebWorkflowWorkspaceToolSchemas).length && v.tools.every(t => Object.hasOwn(tenantWebWorkflowWorkspaceToolSchemas, t)));
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
/** Provider21 增量能力;17–20 的注册表、默认版本和既有错误合同保持。 */
|
|
2
|
+
import { z } from 'zod';
|
|
3
|
+
import { tenantWebSpecSchema, tenantWebSummarySchema, tenantWebJobRefSchema, tenantWebSpecRevision, tenantCollectionCycleSchema, materialTenantIdSchema, tenantStorageKey, TENANT_WEB_SPEC_CAPABILITY } from '../contracts/index.js';
|
|
4
|
+
import { tenantRuntimeWorkspaceToolSchemas, tenantRuntimeWorkspaceDataSchemas, tenantRuntimeEnvelopeSchema, tenantRuntimeProviderSchema, tenantRuntimeScopesForInput, tenantRuntimeAuthorization } from './tenant-runtime.js';
|
|
5
|
+
import { tenantProjectErrorSchema } from './tenant-project.js';
|
|
6
|
+
import { tenantManagementSafeErrorRef } from './tenant-management.js';
|
|
7
|
+
export const tenantWebToolSchemas = {
|
|
8
|
+
tenant_web_collect_preview: z.object({ spec: tenantWebSpecSchema }).strict(),
|
|
9
|
+
tenant_web_collect_submit: z.object({ requestId: tenantCollectionCycleSchema, spec: tenantWebSpecSchema }).strict(),
|
|
10
|
+
tenant_web_collect_status: z.object({ jobRef: tenantWebJobRefSchema }).strict(),
|
|
11
|
+
};
|
|
12
|
+
export const tenantWebDataSchemas = {
|
|
13
|
+
tenant_web_collect_preview: z.object({ spec: tenantWebSpecSchema, specRevision: tenantWebSummarySchema.shape.specRevision, networkValidated: z.literal(false), budgetReserved: z.literal(false), execution: z.literal('UNAVAILABLE'), reason: z.literal('S2_NOT_IMPLEMENTED'), requirementsState: z.literal('DECLARED_NOT_EVALUATED') }).strict().superRefine((v, ctx) => { if (v.specRevision !== tenantWebSpecRevision(v.spec))
|
|
14
|
+
ctx.addIssue({ code: 'custom', message: 'Preview specification identity mismatch' }); }),
|
|
15
|
+
tenant_web_collect_submit: z.object({ inserted: z.boolean(), job: tenantWebSummarySchema }).strict(),
|
|
16
|
+
tenant_web_collect_status: tenantWebSummarySchema,
|
|
17
|
+
};
|
|
18
|
+
export const tenantWebWorkspaceToolSchemas = { ...tenantRuntimeWorkspaceToolSchemas, ...tenantWebToolSchemas };
|
|
19
|
+
export const tenantWebWorkspaceDataSchemas = { ...tenantRuntimeWorkspaceDataSchemas, ...tenantWebDataSchemas };
|
|
20
|
+
export const tenantWebErrorSchema = tenantProjectErrorSchema.extend({ completedPhase: z.enum([...tenantProjectErrorSchema.shape.completedPhase.unwrap().options, 'WEB_INTENT_PERSISTED']).optional() }).strict();
|
|
21
|
+
export function tenantWebSafeErrorRef(raw, tenantId) {
|
|
22
|
+
if (typeof raw === 'string' && new RegExp('^tenant-web-collection://' + tenantStorageKey(tenantId) + '/[a-f0-9]{64}$').test(raw))
|
|
23
|
+
return raw;
|
|
24
|
+
return tenantManagementSafeErrorRef(raw, tenantId);
|
|
25
|
+
}
|
|
26
|
+
export function tenantWebScopesForInput(name, raw) {
|
|
27
|
+
if (Object.hasOwn(tenantWebToolSchemas, name)) {
|
|
28
|
+
tenantWebToolSchemas[name].parse(raw);
|
|
29
|
+
return name === 'tenant_web_collect_status' ? ['knowledge.collect'] : ['knowledge.source.manage', 'knowledge.collect'];
|
|
30
|
+
}
|
|
31
|
+
return tenantRuntimeScopesForInput(name, raw);
|
|
32
|
+
}
|
|
33
|
+
export function tenantWebAuthorization(name) {
|
|
34
|
+
if (Object.hasOwn(tenantWebToolSchemas, name))
|
|
35
|
+
return { selection: 'FIXED', scopeAlternatives: [name === 'tenant_web_collect_status' ? ['knowledge.collect'] : ['knowledge.source.manage', 'knowledge.collect']] };
|
|
36
|
+
return tenantRuntimeAuthorization(name);
|
|
37
|
+
}
|
|
38
|
+
export function tenantWebEnvelopeSchema(tool) {
|
|
39
|
+
return z.object({ schemaVersion: z.literal(2), tenantId: materialTenantIdSchema, tool: z.literal(tool), data: tenantWebDataSchemas[tool] }).strict().superRefine((value, ctx) => {
|
|
40
|
+
const envelope = value, ref = envelope.data.jobRef ?? envelope.data.job?.jobRef;
|
|
41
|
+
if (ref && !ref.startsWith('tenant-web-collection://' + tenantStorageKey(envelope.tenantId) + '/'))
|
|
42
|
+
ctx.addIssue({ code: 'custom', message: 'Web intent must belong to the exact authenticated Tenant' });
|
|
43
|
+
});
|
|
44
|
+
}
|
|
45
|
+
export const tenantWebInputJsonSchemas = Object.fromEntries(Object.entries(tenantWebWorkspaceToolSchemas).map(([name, schema]) => [name, z.toJSONSchema(schema, { target: 'draft-07' })]));
|
|
46
|
+
export const tenantWebOutputJsonSchemas = Object.fromEntries(Object.keys(tenantWebWorkspaceToolSchemas).map(name => [name, { type: 'object', oneOf: [z.toJSONSchema(Object.hasOwn(tenantWebToolSchemas, name) ? tenantWebEnvelopeSchema(name) : tenantRuntimeEnvelopeSchema(name), { target: 'draft-07' }), z.toJSONSchema(tenantWebErrorSchema, { target: 'draft-07' })] }]));
|
|
47
|
+
export const tenantWebProviderSchema = z.object({ ...tenantRuntimeProviderSchema.shape,
|
|
48
|
+
schemaVersion: z.literal(21), tools: z.array(z.string()).length(Object.keys(tenantWebWorkspaceToolSchemas).length),
|
|
49
|
+
capabilities: z.tuple([z.literal('TENANT_MANAGEMENT_V1'), z.literal('TENANT_WORKFLOW_V1'), z.literal('TENANT_CURRENTNESS_V2'), z.literal('TENANT_SOURCE_V1'), z.literal('TENANT_WORKSPACE_METADATA_V1'), z.literal('TENANT_PROJECT_CONTEXT_V1'), z.literal('TENANT_RUNTIME_STATUS_V1'), z.literal(TENANT_WEB_SPEC_CAPABILITY)]),
|
|
50
|
+
}).strict().superRefine((value, ctx) => {
|
|
51
|
+
if (new Set(value.tools).size !== Object.keys(tenantWebWorkspaceToolSchemas).length || value.tools.some(name => !Object.hasOwn(tenantWebWorkspaceToolSchemas, name)))
|
|
52
|
+
ctx.addIssue({ code: 'custom', message: 'Provider21 tools must match the exact versioned registry' });
|
|
53
|
+
});
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/** Provider18 adds explicit metadata reads; Provider17 remains the exact original twenty tools. */
|
|
2
|
+
import { z } from 'zod';
|
|
3
|
+
import { tenantResourceRefSchema, tenantSourceIdSchema, collectionRefreshSchema, stableUriSchema, isoDateTimeSchema, materialTenantIdSchema } from '../contracts/index.js';
|
|
4
|
+
import { tenantManagementToolSchemas, tenantManagementDataSchemas, tenantManagementScopesForInput, tenantManagementAuthorization, tenantManagementProviderBaseSchema, tenantManagementErrorSchema } from './tenant-management.js';
|
|
5
|
+
const page = { after: z.string().min(1).max(4096).optional(), limit: z.number().int().min(1).max(100).optional() };
|
|
6
|
+
export const tenantWorkStageSchema = z.enum(['ALL', 'RESEARCH', 'DRAFT', 'READY_FOR_REVIEW', 'REWORK_REQUIRED', 'APPROVED']);
|
|
7
|
+
export const tenantWorkspaceExtraToolSchemas = { tenant_source_inventory: z.object(page).strict(), tenant_work_queue: z.object({ ...page, stage: tenantWorkStageSchema.default('ALL') }).strict() };
|
|
8
|
+
const source = z.object({ sourceId: tenantSourceIdSchema, title: z.string().min(1).max(512).nullable(), revisionRef: stableUriSchema.nullable(), generation: z.number().int().positive().safe().nullable(), paused: z.boolean().nullable(), tenantEnabled: z.boolean().nullable(), refresh: collectionRefreshSchema.nullable(), canonicalState: z.enum(['READY', 'UNAVAILABLE', 'INTEGRITY_MISMATCH']) }).strict();
|
|
9
|
+
const artifact = z.object({ ref: tenantResourceRefSchema, title: z.string().max(512), kind: z.string().max(128).nullable(), status: z.string().max(128).nullable(), version: z.number().int().positive().safe().nullable(), recordedAt: isoDateTimeSchema.nullable(), availability: z.enum(['READY', 'UNAVAILABLE', 'INTEGRITY_MISMATCH']), succession: z.enum(['SUCCESSOR_VISIBLE', 'NO_VISIBLE_SUCCESSOR', 'UNCONFIRMED']) }).strict();
|
|
10
|
+
export const tenantWorkspaceExtraDataSchemas = {
|
|
11
|
+
tenant_source_inventory: z.object({ items: z.array(source).max(100), nextAfter: z.string().max(4096).nullable(), coverage: z.literal('REGISTERED_TENANT_SOURCES') }).strict(),
|
|
12
|
+
tenant_work_queue: z.object({ items: z.array(artifact).max(100), nextAfter: z.string().max(4096).nullable(), stage: tenantWorkStageSchema, candidateCount: z.number().int().min(0).max(100), coverage: z.literal('AUTHORIZED_NATIVE_ARTIFACT_METADATA'), total: z.null() }).strict(),
|
|
13
|
+
};
|
|
14
|
+
export const tenantWorkspaceToolSchemas = { ...tenantManagementToolSchemas, ...tenantWorkspaceExtraToolSchemas };
|
|
15
|
+
export const tenantWorkspaceDataSchemas = { ...tenantManagementDataSchemas, ...tenantWorkspaceExtraDataSchemas };
|
|
16
|
+
export function tenantWorkspaceScopesForInput(name, raw) { if (name === 'tenant_source_inventory') {
|
|
17
|
+
tenantWorkspaceExtraToolSchemas[name].parse(raw);
|
|
18
|
+
return ['knowledge.source.read'];
|
|
19
|
+
} if (name === 'tenant_work_queue') {
|
|
20
|
+
tenantWorkspaceExtraToolSchemas[name].parse(raw);
|
|
21
|
+
return ['knowledge.workflow.read'];
|
|
22
|
+
} return tenantManagementScopesForInput(name, raw); }
|
|
23
|
+
export function tenantWorkspaceAuthorization(name) { return name === 'tenant_source_inventory' || name === 'tenant_work_queue' ? { selection: 'FIXED', scopeAlternatives: [[name === 'tenant_source_inventory' ? 'knowledge.source.read' : 'knowledge.workflow.read']] } : tenantManagementAuthorization(name); }
|
|
24
|
+
export function tenantWorkspaceEnvelopeSchema(tool) { return z.object({ schemaVersion: z.literal(2), tenantId: materialTenantIdSchema, tool: z.literal(tool), data: tenantWorkspaceDataSchemas[tool] }).strict(); }
|
|
25
|
+
export const tenantWorkspaceInputJsonSchemas = Object.fromEntries(Object.entries(tenantWorkspaceToolSchemas).map(([name, schema]) => [name, z.toJSONSchema(schema, { target: 'draft-07' })]));
|
|
26
|
+
export const tenantWorkspaceOutputJsonSchemas = Object.fromEntries(Object.keys(tenantWorkspaceToolSchemas).map(name => [name, { type: 'object', oneOf: [z.toJSONSchema(tenantWorkspaceEnvelopeSchema(name), { target: 'draft-07' }), z.toJSONSchema(tenantManagementErrorSchema, { target: 'draft-07' })] }]));
|
|
27
|
+
export const tenantWorkspaceProviderSchema = tenantManagementProviderBaseSchema.extend({ schemaVersion: z.literal(18), tools: z.array(z.string()).length(Object.keys(tenantWorkspaceToolSchemas).length), capabilities: z.tuple([z.literal('TENANT_MANAGEMENT_V1'), z.literal('TENANT_WORKFLOW_V1'), z.literal('TENANT_CURRENTNESS_V2'), z.literal('TENANT_SOURCE_V1'), z.literal('TENANT_WORKSPACE_METADATA_V1')]) }).strict().superRefine((value, ctx) => { if (new Set(value.tools).size !== Object.keys(tenantWorkspaceToolSchemas).length || value.tools.some(name => !Object.hasOwn(tenantWorkspaceToolSchemas, name)))
|
|
28
|
+
ctx.addIssue({ code: 'custom', message: 'Workspace tools must match the exact version18 contract' }); });
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/** Agent 的治理合同描述真实状态和下一步,不把写入权限解释为审核或正文权限。 */
|
|
2
|
+
import { z } from 'zod';
|
|
3
|
+
import { artifactStatusSchema, idSchema, isoDateTimeSchema, publicationReadinessReportSchema, sha256Schema, stableUriSchema } from '../contracts/index.js';
|
|
4
|
+
import { consumerProjectRefSchema } from './consumer.js';
|
|
5
|
+
import { managementToolInputSchemas } from './management.js';
|
|
6
|
+
const project = z.object({ projectRef: consumerProjectRefSchema }).strict();
|
|
7
|
+
export const workflowPlanInputSchema = project.extend({ ref: stableUriSchema }).strict();
|
|
8
|
+
export const workflowGuideInputSchema = project;
|
|
9
|
+
export const workflowActionSchema = z.enum(['PREPARE_SOURCE', 'SUBMIT_REVIEW', 'FINALIZE_REVIEW', 'REGISTER']);
|
|
10
|
+
export const workflowAdvanceInputSchema = workflowPlanInputSchema.extend({ action: workflowActionSchema, expectedVersion: z.number().int().nonnegative().optional(), actedAt: isoDateTimeSchema.optional() }).strict().superRefine((value, ctx) => {
|
|
11
|
+
if (['SUBMIT_REVIEW', 'FINALIZE_REVIEW'].includes(value.action) && (!value.expectedVersion || !value.actedAt))
|
|
12
|
+
ctx.addIssue({ code: 'custom', message: 'transition requires exact expectedVersion and actedAt' });
|
|
13
|
+
});
|
|
14
|
+
export const agentSubmitInputSchema = project.extend({ sourceId: idSchema, contentBase64: z.string().min(1).max(87384), mediaType: z.string().trim().min(1).max(256), access: z.enum(['PUBLIC', 'TENANT', 'INTERNAL', 'FDE_INTERNAL']).default('TENANT'), submittedAt: isoDateTimeSchema.optional(), freshnessSeconds: z.number().int().min(60).max(86400).optional() }).strict();
|
|
15
|
+
const argumentsSchema = z.record(z.string(), z.json());
|
|
16
|
+
export const workflowNextActionSchema = z.object({ id: z.string(), tool: z.string().nullable(), arguments: argumentsSchema, requiredScopes: z.array(z.string()), missingScopes: z.array(z.string()), missingFields: z.array(z.string()), canExecute: z.boolean(), automatic: z.boolean(), reasonCode: z.string(), cli: z.object({ command: z.string(), flags: argumentsSchema }).strict(), http: z.object({ method: z.literal('POST'), path: z.literal('/mcp/management'), tool: z.string().nullable() }).strict() }).strict();
|
|
17
|
+
const readDecision = z.object({ action: z.enum(['ALLOW', 'REVIEW_REQUIRED', 'DENY']), reasonCodes: z.array(z.string()), authority: z.enum(['AUTHENTICATED_READER', 'LOCAL_PROFILE_SIMULATION']) }).strict();
|
|
18
|
+
export const workflowPlanSchema = z.object({ schemaVersion: z.literal(1), projectRef: consumerProjectRefSchema, ref: stableUriSchema, contentHash: sha256Schema, kind: z.string(), version: z.number().int().positive().nullable(), status: artifactStatusSchema.or(z.enum(['RAW_EVIDENCE', 'RAW_MATERIAL'])), productionPhase: z.enum(['PERSISTED', 'CATALOG_PROJECTED', 'REGISTERED']), rawMaterialAvailable: z.boolean().nullable(), readiness: publicationReadinessReportSchema.nullable(), reviewRef: stableUriSchema.nullable(), reviewDecision: z.enum(['PASS', 'REWORK', 'REJECT']).nullable(), support: z.object({ action: z.enum(['ALLOW', 'REVIEW_REQUIRED', 'DENY']), reasonCodes: z.array(z.string()), missingEvidenceRefs: z.array(stableUriSchema) }).strict().nullable(), governedPolicyReady: z.boolean(), consumerReadDecision: readDecision.nullable(), externalReady: z.boolean(), successorRef: stableUriSchema.nullable(), blockers: z.array(z.string()), nextActions: z.array(workflowNextActionSchema).max(70) }).strict();
|
|
19
|
+
export const workflowAdvanceResultSchema = z.object({ schemaVersion: z.literal(1), action: workflowActionSchema, previousRef: stableUriSchema, inserted: z.boolean(), plan: workflowPlanSchema }).strict();
|
|
20
|
+
export const workflowErrorSchema = z.object({ errorCode: z.string(), completedPhase: z.enum(['VALIDATED', 'PERSISTED', 'CATALOG_PROJECTED', 'REGISTERED']).optional(), ref: stableUriSchema.optional() }).strict();
|
|
21
|
+
export const workflowToolInputSchemas = { knowledge_workflow_guide: z.toJSONSchema(workflowGuideInputSchema, { target: 'draft-07' }), knowledge_workflow_plan: z.toJSONSchema(workflowPlanInputSchema, { target: 'draft-07' }), knowledge_workflow_advance: z.toJSONSchema(workflowAdvanceInputSchema, { target: 'draft-07' }), knowledge_agent_submit: z.toJSONSchema(agentSubmitInputSchema, { target: 'draft-07' }) };
|
|
22
|
+
export const workflowToolScopes = { knowledge_workflow_guide: 'knowledge.workflow.read', knowledge_workflow_plan: 'knowledge.workflow.read', knowledge_workflow_advance: 'knowledge.workflow.read', knowledge_agent_submit: 'knowledge.material.write' };
|
|
23
|
+
export const workflowActionScopes = { PREPARE_SOURCE: 'knowledge.compose', SUBMIT_REVIEW: 'knowledge.compose', FINALIZE_REVIEW: 'knowledge.approve', REGISTER: 'knowledge.material.write' };
|
|
24
|
+
/** 网络成功和失败共享可发现 schema,阶段包含已经完成注册后的尾部失败。 */
|
|
25
|
+
export const agentSubmitResultSchema = z.object({ schemaVersion: z.literal(1), production: z.object({ phase: z.enum(['CATALOG_PROJECTED', 'REGISTERED']), ref: stableUriSchema, registered: z.boolean(), identity: z.enum(['CONFIGURED', 'NOT_CONFIGURED']) }).strict(), presentation: z.object({ documentRef: stableUriSchema, inserted: z.boolean(), contentHash: sha256Schema }).strict().nullable(), evidenceRef: stableUriSchema, projectRef: consumerProjectRefSchema, contentHash: sha256Schema, byteLength: z.number().int().min(1).max(65536), inserted: z.boolean(), lifecycle: z.literal('QUEUED'), contentClass: z.literal('RAW_EVIDENCE'), nextStep: z.object({ tool: z.literal('knowledge_workflow_plan'), arguments: workflowPlanInputSchema }).strict() }).strict();
|
|
26
|
+
const guideSchema = z.object({ schemaVersion: z.literal(1), model: z.record(z.string(), z.json()), rules: z.array(z.string()), tools: z.record(z.string(), z.object({ requiredScope: z.string(), inputSchema: z.json() }).strict()), advanceScopes: z.record(z.string(), z.string()), https: z.json() }).strict();
|
|
27
|
+
const output = (success) => ({ type: 'object', oneOf: [z.toJSONSchema(success, { target: 'draft-07' }), z.toJSONSchema(workflowErrorSchema, { target: 'draft-07' })] });
|
|
28
|
+
export const workflowToolOutputSchemas = { knowledge_workflow_guide: output(guideSchema), knowledge_workflow_plan: output(workflowPlanSchema), knowledge_workflow_advance: output(workflowAdvanceResultSchema), knowledge_agent_submit: output(agentSubmitResultSchema) };
|
|
29
|
+
/** 同一份模型与参数 schema 供 CLI、MCP guide 和文档示例使用;不给 review 默认 PASS。 */
|
|
30
|
+
export function workflowGuide() {
|
|
31
|
+
const tools = {};
|
|
32
|
+
for (const [name, schema] of Object.entries(workflowToolInputSchemas))
|
|
33
|
+
tools[name] = { requiredScope: workflowToolScopes[name], inputSchema: schema };
|
|
34
|
+
for (const [name, schema] of Object.entries(managementToolInputSchemas))
|
|
35
|
+
tools[name] = { requiredScope: name === 'knowledge_review' ? 'knowledge.review' : name === 'knowledge_finalize_review' ? 'knowledge.approve' : 'knowledge.compose', inputSchema: schema };
|
|
36
|
+
return { schemaVersion: 1, model: { raw: 'Evidence / Material 保留原字节和 provenance;原文可读不等于结论已审核。', reviewed: 'KNOWLEDGE / INSIGHT', lifecycle: ['DRAFT', 'READY_FOR_REVIEW', 'REVIEW(PASS|REWORK|REJECT)', 'APPROVED|REWORK_REQUIRED|REJECTED'], publication: ['PERSISTED', 'CATALOG_PROJECTED', 'REGISTERED', 'consumer read ALLOW'] }, rules: ['先调用 knowledge_workflow_plan,再执行 canExecute 动作;缺字段由 Agent 补齐并重新计划。', '读取原文、核对引用和适用范围后,获授权 reviewer 显式写 PASS / REWORK / REJECT;不根据写入成功推断 PASS。', 'RESEARCH 先正式合成为 KNOWLEDGE / INSIGHT;Claim Currentness proposal 使用专门审核链。', 'freshnessSeconds 仅为作者在系统内首次保存的精确快照时效,不证明外部网页已复核;同身份重放不延长时效。', 'externalReady 需要注册、治理门通过及当前已鉴权消费者实际 read ALLOW;CLI profile 是模拟。', 'Plan 不提供正文或 Review summary;审核时使用独立 read scope 读取 exact ref。'], tools, advanceScopes: workflowActionScopes, https: { method: 'POST', path: '/mcp/management', body: { tool: 'tool name', arguments: '对应 inputSchema' }, authorization: 'OAuth Bearer + client/project binding;API key 不授予管理权限' } };
|
|
37
|
+
}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/** Streaming does not buffer large payloads; the whole-object hash is not a hash of a Range segment. */
|
|
2
|
+
export async function materialStream(fetchImpl, url, token, options) {
|
|
3
|
+
const requested = options.range ? /^bytes=(\d*)-(\d*)$/.exec(options.range) : null;
|
|
4
|
+
if (options.range && (!requested || !requested[1] && !requested[2] || requested.slice(1).some(part => part !== '' && !Number.isSafeInteger(Number(part))) || !requested[1] && Number(requested[2]) === 0))
|
|
5
|
+
throw new Error('MATERIAL_STREAM_RANGE_INVALID');
|
|
6
|
+
const response = await fetchImpl(url, { method: options.head ? 'HEAD' : 'GET', headers: { authorization: `Bearer ${token}`, accept: 'application/octet-stream', ...(options.range ? { range: options.range } : {}) }, redirect: 'error', ...(options.signal ? { signal: options.signal } : {}) });
|
|
7
|
+
const fail = async (code) => { await response.body?.cancel(); throw new Error(code); };
|
|
8
|
+
if (response.status !== 200 && response.status !== 206)
|
|
9
|
+
return fail(`MATERIAL_STREAM_HTTP_${response.status}`);
|
|
10
|
+
const contentClass = response.headers.get('x-knowledge-content-class');
|
|
11
|
+
if (!contentClass || !['ARTIFACT_SNAPSHOT', 'RAW_EVIDENCE', 'RAW_EVIDENCE_MEDIA', 'REFERENCE_SNAPSHOT', 'REGISTERED_MATERIAL'].includes(contentClass))
|
|
12
|
+
return fail('MATERIAL_STREAM_CLASS_INVALID');
|
|
13
|
+
const hash = response.headers.get('x-knowledge-content-hash'), type = response.headers.get('content-type'), rawLength = response.headers.get('content-length'), contentRange = response.headers.get('content-range');
|
|
14
|
+
if (response.headers.get('x-knowledge-serving-action') !== 'ALLOW' || !hash || !/^sha256:[a-f0-9]{64}$/.test(hash) || !type || rawLength === null || !/^\d+$/.test(rawLength) || !Number.isSafeInteger(Number(rawLength)))
|
|
15
|
+
return fail('MATERIAL_STREAM_DESCRIPTOR_INVALID');
|
|
16
|
+
if (options.expectedContentHash && hash !== options.expectedContentHash)
|
|
17
|
+
return fail('MATERIAL_STREAM_IDENTITY_MISMATCH');
|
|
18
|
+
if (response.status === 206) {
|
|
19
|
+
const parts = /^bytes (\d+)-(\d+)\/(\d+)$/.exec(contentRange ?? '');
|
|
20
|
+
if (!requested || !parts || parts.slice(1).some(part => !Number.isSafeInteger(Number(part))) || Number(parts[1]) > Number(parts[2]) || Number(parts[2]) - Number(parts[1]) + 1 !== Number(rawLength) || Number(parts[2]) >= Number(parts[3]))
|
|
21
|
+
return fail('MATERIAL_STREAM_RANGE_RESPONSE_INVALID');
|
|
22
|
+
const total = Number(parts[3]), start = requested[1] ? Number(requested[1]) : Math.max(0, total - Number(requested[2])), end = requested[1] && requested[2] ? Math.min(total - 1, Number(requested[2])) : total - 1;
|
|
23
|
+
if (start !== Number(parts[1]) || end !== Number(parts[2]))
|
|
24
|
+
return fail('MATERIAL_STREAM_RANGE_RESPONSE_INVALID');
|
|
25
|
+
}
|
|
26
|
+
if (!options.head && !response.body && Number(rawLength) > 0)
|
|
27
|
+
return fail('MATERIAL_STREAM_BODY_MISSING');
|
|
28
|
+
return { status: response.status, contentClass, contentHash: hash, mediaType: type, contentLength: Number(rawLength), contentRange, body: response.body, verification: 'SERVER_VERIFIED_BEFORE_HEADERS' };
|
|
29
|
+
}
|
|
@@ -1,10 +1,11 @@
|
|
|
1
|
-
import { type
|
|
1
|
+
import { type TokenProvider } from './token-provider.js';
|
|
2
2
|
import { type MaterialStreamOptions } from './material-stream.js';
|
|
3
|
-
import { type KnowledgeMcpProviderContractV12 } from '
|
|
4
|
-
import { type KnowledgeMcpProviderContractV11, type MaterialOutboxWindow, type KnowledgeMcpProviderContractV3, type KnowledgeMcpProviderContractV6, type KnowledgeMcpProviderContractV7, type KnowledgeMcpProviderContractV8, type KnowledgeMcpProviderContractV9, type KnowledgeMcpProviderContractV10, type OAuthMaterialPageResponse, type OAuthMaterialRoutePageResponse, type OAuthMaterialPartitionsResponse, type OAuthMaterialPartitionPageResponse, type OAuthMaterialPresentationResponse, type ServingDecision } from '
|
|
5
|
-
export interface KnowledgeOAuthFileClientOptions
|
|
3
|
+
import { type KnowledgeMcpProviderContractV12 } from './internal/serving-contracts/index.js';
|
|
4
|
+
import { type KnowledgeMcpProviderContractV11, type MaterialOutboxWindow, type KnowledgeMcpProviderContractV3, type KnowledgeMcpProviderContractV6, type KnowledgeMcpProviderContractV7, type KnowledgeMcpProviderContractV8, type KnowledgeMcpProviderContractV9, type KnowledgeMcpProviderContractV10, type OAuthMaterialPageResponse, type OAuthMaterialRoutePageResponse, type OAuthMaterialPartitionsResponse, type OAuthMaterialPartitionPageResponse, type OAuthMaterialPresentationResponse, type ServingDecision } from './internal/serving-contracts/index.js';
|
|
5
|
+
export interface KnowledgeOAuthFileClientOptions {
|
|
6
6
|
baseUrl: string;
|
|
7
|
-
token
|
|
7
|
+
token?: string;
|
|
8
|
+
tokenProvider?: TokenProvider;
|
|
8
9
|
projectRef: string;
|
|
9
10
|
fetchImpl?: typeof fetch;
|
|
10
11
|
allowInsecureHttp?: boolean;
|
|
@@ -23,10 +24,9 @@ export type OAuthFileResult = {
|
|
|
23
24
|
error: string;
|
|
24
25
|
};
|
|
25
26
|
export declare class KnowledgeOAuthFileClient {
|
|
26
|
-
private readonly limits;
|
|
27
27
|
readonly projectRef: string;
|
|
28
28
|
private readonly root;
|
|
29
|
-
private readonly
|
|
29
|
+
private readonly credentials;
|
|
30
30
|
private readonly fetchImpl;
|
|
31
31
|
private providerPromise;
|
|
32
32
|
private materialProviderPromise;
|
|
@@ -59,19 +59,19 @@ export declare class KnowledgeOAuthFileClient {
|
|
|
59
59
|
sourceProjectKey: string;
|
|
60
60
|
identityHash: string;
|
|
61
61
|
kind: string;
|
|
62
|
-
classification: "
|
|
62
|
+
classification: "TENANT" | "PUBLIC" | "PUBLIC_METADATA" | "INTERNAL" | "FDE_INTERNAL" | "ACCESS_CONTROLLED" | "UNKNOWN";
|
|
63
63
|
mediaType: string;
|
|
64
64
|
decision: {
|
|
65
65
|
schemaVersion: 1;
|
|
66
66
|
action: "ALLOW" | "DENY";
|
|
67
|
-
reasonCodes: ("
|
|
67
|
+
reasonCodes: ("NOT_FOUND" | "UNAVAILABLE" | "INTEGRITY_MISMATCH" | "CONTENT_ACCESS_DENIED" | "UNSUPPORTED_RESOURCE")[];
|
|
68
68
|
assessedAt: string;
|
|
69
69
|
};
|
|
70
70
|
};
|
|
71
71
|
materialAccess: {
|
|
72
72
|
schemaVersion: 1;
|
|
73
73
|
action: "ALLOW" | "DENY";
|
|
74
|
-
reasonCodes: ("
|
|
74
|
+
reasonCodes: ("NOT_FOUND" | "UNAVAILABLE" | "INTEGRITY_MISMATCH" | "CONTENT_ACCESS_DENIED" | "UNSUPPORTED_RESOURCE")[];
|
|
75
75
|
assessedAt: string;
|
|
76
76
|
};
|
|
77
77
|
representation: {
|
|
@@ -81,7 +81,7 @@ export declare class KnowledgeOAuthFileClient {
|
|
|
81
81
|
contentHash: string | null;
|
|
82
82
|
mediaType: string;
|
|
83
83
|
byteLength: number | null;
|
|
84
|
-
methods: ("
|
|
84
|
+
methods: ("GET" | "HEAD")[];
|
|
85
85
|
range: "NONE" | "SINGLE";
|
|
86
86
|
verification: "ON_READ";
|
|
87
87
|
verificationChunkBytes: number | null;
|
|
@@ -105,19 +105,19 @@ export declare class KnowledgeOAuthFileClient {
|
|
|
105
105
|
sourceProjectKey: string;
|
|
106
106
|
identityHash: string;
|
|
107
107
|
kind: string;
|
|
108
|
-
classification: "
|
|
108
|
+
classification: "TENANT" | "PUBLIC" | "PUBLIC_METADATA" | "INTERNAL" | "FDE_INTERNAL" | "ACCESS_CONTROLLED" | "UNKNOWN";
|
|
109
109
|
mediaType: string;
|
|
110
110
|
decision: {
|
|
111
111
|
schemaVersion: 1;
|
|
112
112
|
action: "ALLOW" | "DENY";
|
|
113
|
-
reasonCodes: ("
|
|
113
|
+
reasonCodes: ("NOT_FOUND" | "UNAVAILABLE" | "INTEGRITY_MISMATCH" | "CONTENT_ACCESS_DENIED" | "UNSUPPORTED_RESOURCE")[];
|
|
114
114
|
assessedAt: string;
|
|
115
115
|
};
|
|
116
116
|
};
|
|
117
117
|
materialAccess: {
|
|
118
118
|
schemaVersion: 1;
|
|
119
119
|
action: "ALLOW" | "DENY";
|
|
120
|
-
reasonCodes: ("
|
|
120
|
+
reasonCodes: ("NOT_FOUND" | "UNAVAILABLE" | "INTEGRITY_MISMATCH" | "CONTENT_ACCESS_DENIED" | "UNSUPPORTED_RESOURCE")[];
|
|
121
121
|
assessedAt: string;
|
|
122
122
|
};
|
|
123
123
|
representation: {
|
|
@@ -127,7 +127,7 @@ export declare class KnowledgeOAuthFileClient {
|
|
|
127
127
|
contentHash: string | null;
|
|
128
128
|
mediaType: string;
|
|
129
129
|
byteLength: number | null;
|
|
130
|
-
methods: ("
|
|
130
|
+
methods: ("GET" | "HEAD")[];
|
|
131
131
|
range: "NONE" | "SINGLE";
|
|
132
132
|
verification: "ON_READ";
|
|
133
133
|
verificationChunkBytes: number | null;
|
|
@@ -166,7 +166,7 @@ export declare class KnowledgeOAuthFileClient {
|
|
|
166
166
|
contentHash: string | null;
|
|
167
167
|
mediaType: string;
|
|
168
168
|
byteLength: number | null;
|
|
169
|
-
methods: ("
|
|
169
|
+
methods: ("GET" | "HEAD")[];
|
|
170
170
|
range: "NONE" | "SINGLE";
|
|
171
171
|
verification: "ON_READ";
|
|
172
172
|
verificationChunkBytes: number | null;
|
|
@@ -232,12 +232,12 @@ export declare class KnowledgeOAuthFileClient {
|
|
|
232
232
|
sourceProjectKey: string;
|
|
233
233
|
identityHash: string;
|
|
234
234
|
kind: string;
|
|
235
|
-
classification: "
|
|
235
|
+
classification: "TENANT" | "PUBLIC" | "PUBLIC_METADATA" | "INTERNAL" | "FDE_INTERNAL" | "ACCESS_CONTROLLED" | "UNKNOWN";
|
|
236
236
|
mediaType: string;
|
|
237
237
|
decision: {
|
|
238
238
|
schemaVersion: 1;
|
|
239
239
|
action: "ALLOW" | "DENY";
|
|
240
|
-
reasonCodes: ("
|
|
240
|
+
reasonCodes: ("NOT_FOUND" | "UNAVAILABLE" | "INTEGRITY_MISMATCH" | "CONTENT_ACCESS_DENIED" | "UNSUPPORTED_RESOURCE")[];
|
|
241
241
|
assessedAt: string;
|
|
242
242
|
};
|
|
243
243
|
};
|