@native-knowledge/cli 0.1.0-rc.3 → 0.1.0-rc.4

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/dist/commands.js CHANGED
@@ -4,6 +4,8 @@ export const commands = {
4
4
  'source list': 'tenant_source_list', 'source get': 'tenant_source_get', 'source define': 'tenant_source_define', 'source configure': 'tenant_source_configure',
5
5
  'collection request': 'tenant_collection_request', 'collection status': 'tenant_collection_status',
6
6
  'project list': 'tenant_project_list', 'project get': 'tenant_project_get', 'project materials': 'tenant_project_materials', 'project scope-set': 'tenant_project_scope_set', 'project lifecycle-set': 'tenant_project_lifecycle_set',
7
+ 'event materials': 'tenant_event_materials',
8
+ 'event connection': 'tenant_event_exchange_get', 'event status': 'tenant_event_connection_status', 'event connections': 'tenant_event_exchange_list', 'event configure': 'tenant_event_exchange_configure', 'event receipt': 'tenant_event_exchange_receipt', 'event deliveries': 'tenant_event_outbox_list', 'event recover': 'tenant_event_outbox_recover', 'event recovery-receipt': 'tenant_event_outbox_recovery_receipt', 'event gap-recover': 'tenant_event_gap_recover', 'event gap-receipt': 'tenant_event_gap_recovery_receipt', 'event baseline': 'tenant_event_gap_baseline_read',
7
9
  'runtime status': 'tenant_runtime_status', 'work queue': 'tenant_work_queue',
8
10
  'artifact draft': 'tenant_artifact_draft', 'artifact review': 'tenant_knowledge_review', 'artifact promote': 'tenant_artifact_promote', 'knowledge compose': 'tenant_knowledge_compose', 'insight compose': 'tenant_knowledge_compose', 'knowledge read': 'tenant_knowledge_read',
9
11
  'material share': 'tenant_material_share', 'material revoke': 'tenant_material_revoke', 'material routes': 'tenant_material_routes', 'snapshot declare': 'tenant_snapshot_declare', 'snapshot status': 'tenant_snapshot_status',
package/dist/errors.js CHANGED
@@ -1,7 +1,7 @@
1
- import { AuthError, TenantManagementSdkError, ResourceSdkError, TenantOperationUnknownError } from '@native-knowledge/knowledge-sdk';
1
+ import { AuthError, TenantManagementSdkError, ResourceSdkError, TenantOperationUnknownError, TenantEventOperationUnknownError } from '@native-knowledge/knowledge-sdk';
2
2
  import { agentEntryFailure } from './agent-entry-cli.js';
3
3
  /** A CLI failure never authorizes replay; retained phases remain partial completion. */
4
4
  export function cliFailure(e) {
5
5
  const status = e instanceof AuthError || e instanceof TenantManagementSdkError || e instanceof ResourceSdkError ? e.status : 0, raw = e instanceof AuthError ? e.code : e instanceof TenantManagementSdkError || e instanceof ResourceSdkError ? e.code : e instanceof Error && e.name === 'ZodError' ? 'CLI_INPUT_INVALID' : e instanceof Error && /^[A-Z][A-Z0-9_]{1,100}$/.test(e.message) ? e.message : 'CLI_OPERATION_FAILED', code = /^[A-Z][A-Z0-9_]{1,100}$/.test(raw) ? raw : 'CLI_OPERATION_FAILED', exit = (e instanceof TenantManagementSdkError || e instanceof TenantOperationUnknownError) && e.completedPhase ? 7 : code.includes('UNKNOWN') || code.includes('INCOMPLETE') ? 7 : status === 403 || code.includes('FORBIDDEN') ? 4 : status === 409 || code.includes('CONFLICT') ? 5 : status >= 500 || code.includes('TRANSPORT') ? 6 : code.includes('AUTH_') ? 3 : 2;
6
- return { exit, error: { code, status, ...(agentEntryFailure(e) ?? {}), retryable: false, nextActions: code === 'AUTH_LOGOUT_REQUIRED' ? [{ command: 'native-knowledge auth logout', automatic: false }] : code === 'AUTH_CREDENTIAL_SOURCE_CONFLICT' ? [{ command: 'native-knowledge help', automatic: false }] : e instanceof TenantOperationUnknownError && e.requestId ? [{ tool: 'tenant_operation_status', arguments: { requestId: e.requestId }, automatic: false, requiredScopes: ['knowledge.workflow.read'] }] : exit === 3 ? [{ command: 'native-knowledge auth login', automatic: false }] : code === 'CLI_LOCAL_ACCESS_REMOVED' ? [{ command: 'native-knowledge help', automatic: false, documentation: 'docs/operations/tenant-cli-migration.md' }] : [], ...((e instanceof TenantManagementSdkError || e instanceof TenantOperationUnknownError) ? { completedPhase: e.completedPhase, ref: e.ref } : {}), ...(e instanceof TenantOperationUnknownError ? { requestId: e.requestId } : {}) } };
6
+ return { exit, error: { code, status, ...(agentEntryFailure(e) ?? {}), retryable: false, nextActions: code === 'AUTH_LOGOUT_REQUIRED' ? [{ command: 'native-knowledge auth logout', automatic: false }] : code === 'AUTH_CREDENTIAL_SOURCE_CONFLICT' ? [{ command: 'native-knowledge help', automatic: false }] : e instanceof TenantEventOperationUnknownError ? [{ tool: e.receiptTool, arguments: { requestId: e.requestId }, automatic: false, requiredScopes: ['knowledge.material.route'] }] : e instanceof TenantOperationUnknownError && e.requestId ? [{ tool: 'tenant_operation_status', arguments: { requestId: e.requestId }, automatic: false, requiredScopes: ['knowledge.workflow.read'] }] : exit === 3 ? [{ command: 'native-knowledge auth login', automatic: false }] : code === 'CLI_LOCAL_ACCESS_REMOVED' ? [{ command: 'native-knowledge help', automatic: false, documentation: 'docs/operations/tenant-cli-migration.md' }] : [], ...((e instanceof TenantManagementSdkError || e instanceof TenantOperationUnknownError) ? { completedPhase: e.completedPhase, ref: e.ref } : {}), ...((e instanceof TenantOperationUnknownError || e instanceof TenantEventOperationUnknownError) ? { requestId: e.requestId } : {}) } };
7
7
  }
@@ -23,3 +23,4 @@ export * from './agent-catalog.js';
23
23
  export * from './body-search.js';
24
24
  export * from './agent-guidance-shapes.js';
25
25
  export * from './agent-input-hints.js';
26
+ export * from './tenant-events.js';
@@ -0,0 +1,57 @@
1
+ import { z } from 'zod';
2
+ // Data-only Native HTTP projection. EventSDK remains the server-side protocol validator.
3
+ const atom = (max = 256) => z.string().min(1).max(max).regex(/^[^\u0000-\u0020\u007f]+$/);
4
+ const uri = z.string().url().max(2048), positive = z.number().int().min(1).max(2147483647), generation = z.number().int().min(0).max(2147483647);
5
+ export const tenantMaterialEventType = 'io.nativeknowledge.tenant-material.changed.v1';
6
+ export const tenantEventSourceSchema = z.object({ source: uri, serviceRef: atom(), tenantRef: atom(), issuer: uri, subject: atom() }).strict();
7
+ export const tenantEventRegistrationSchema = z.object({ schemaVersion: z.literal(1), requestId: atom(), expectedRevision: positive.nullable(), source: tenantEventSourceSchema, target: z.object({ serviceRef: atom(), tenantRef: atom() }).strict(), grant: z.object({ grantRef: atom(), version: positive, eventType: atom().regex(/^[A-Za-z0-9][A-Za-z0-9._-]*\.v[1-9][0-9]*$/), consumerRef: atom() }).strict(), status: z.enum(['ACTIVE', 'REVOKED']) }).strict();
8
+ export const tenantEventOutboxRecoverySchema = z.object({ schemaVersion: z.literal(1), requestId: atom(), source: uri, id: atom(), deliveryid: z.string().regex(/^[a-f0-9]{64}$/), expectedGeneration: generation }).strict();
9
+ export const tenantEventGapRecoverySchema = z.object({ schemaVersion: z.literal(1), requestId: atom(), connectionRef: atom(128), expectedCursor: atom(), expectedOldestAvailableCursor: atom() }).strict();
10
+ const directoryPage = z.object({ connectionRef: atom(128), after: z.string().max(2048).optional(), limit: z.number().int().min(1).max(100).optional() }).strict();
11
+ const receiptInput = z.object({ requestId: atom() }).strict();
12
+ export const tenantEventToolSchemas = {
13
+ tenant_event_materials: directoryPage,
14
+ tenant_event_connection_status: z.object({}).strict(),
15
+ tenant_event_exchange_get: z.object({ connectionRef: atom(128) }).strict(),
16
+ tenant_event_exchange_list: z.object({ after: z.string().max(256).optional(), limit: z.number().int().min(1).max(100).optional() }).strict(),
17
+ tenant_event_exchange_configure: tenantEventRegistrationSchema,
18
+ tenant_event_exchange_receipt: receiptInput,
19
+ tenant_event_outbox_list: z.object({ after: z.number().int().nonnegative().optional(), limit: z.number().int().min(1).max(100).optional() }).strict(),
20
+ tenant_event_outbox_recover: tenantEventOutboxRecoverySchema,
21
+ tenant_event_outbox_recovery_receipt: receiptInput,
22
+ tenant_event_gap_recover: tenantEventGapRecoverySchema,
23
+ tenant_event_gap_recovery_receipt: receiptInput,
24
+ tenant_event_gap_baseline_read: z.object({ baselineRef: uri }).strict(),
25
+ };
26
+ export const tenantEventReadTools = new Set(['tenant_event_materials', 'tenant_event_connection_status', 'tenant_event_exchange_get', 'tenant_event_exchange_list', 'tenant_event_exchange_receipt', 'tenant_event_outbox_list', 'tenant_event_outbox_recovery_receipt', 'tenant_event_gap_recovery_receipt', 'tenant_event_gap_baseline_read']);
27
+ export const tenantEventWorkerSchema = z.object({ schemaVersion: z.literal(1), status: z.enum(['DISABLED', 'CONNECTED', 'RECONNECTING', 'STOPPED']), connected: z.boolean(), at: z.string().datetime(), revision: z.string().optional(), stale: z.boolean() }).strict();
28
+ const route = z.object({ connectionRef: atom(128), tenantId: atom(), revision: positive, binding: tenantEventRegistrationSchema }).strict();
29
+ const exchangeResult = z.object({ schemaVersion: z.literal(1), connectionRef: atom(128), revision: positive, status: z.enum(['ACTIVE', 'REVOKED']), grantRef: atom(), grantVersion: positive }).strict();
30
+ const baseline = z.object({ schemaVersion: z.literal(1), baselineRef: uri, source: uri, sourceTenant: atom(), targetService: atom(), targetTenant: atom(), connectionRef: atom(128), grantRef: atom(), grantVersion: positive, previousWatermark: atom(), retainedThrough: atom(), watermark: atom(), sourceRevision: atom(), createdAt: z.string().datetime(), readModel: z.literal('AUTHORITATIVE_ON_DEMAND'), directoryRef: uri }).strict();
31
+ const outboxResult = z.object({ schemaVersion: z.literal(1), requestId: atom(), source: uri, id: atom(), deliveryid: z.string().regex(/^[a-f0-9]{64}$/), status: z.literal('REQUEUED'), generation: positive, previousOutcome: z.json().nullable(), attempt: z.number().int().nonnegative() }).strict();
32
+ const gapResult = z.object({ schemaVersion: z.literal(1), requestId: atom(), status: z.literal('BASELINE_STAGED'), baseline, event: z.object({ source: uri, id: atom(), deliveryid: z.string().regex(/^[a-f0-9]{64}$/) }).strict(), checkpoint: z.object({ previous: atom(), current: atom() }).strict() }).strict();
33
+ const receipt = (result) => z.object({ schemaVersion: z.literal(1), requestId: atom(), result: result.nullable() }).strict();
34
+ export const tenantEventResultSchemas = {
35
+ tenant_event_materials: z.object({ schemaVersion: z.literal(1), connectionRef: atom(128), resourceAccess: z.object({ providerPath: z.literal('/v16/provider'), tools: z.tuple([z.literal('knowledge_resource_describe'), z.literal('knowledge_resource_read')]) }).strict(), items: z.array(z.object({ ref: uri, title: z.string().max(4096) }).strict()).max(100), nextAfter: uri.nullable() }).strict(),
36
+ tenant_event_connection_status: z.object({ schemaVersion: z.literal(1), configuration: z.enum(['DISABLED', 'PROFILE_VALID', 'INVALID']), mode: z.enum(['DISABLED', 'SHADOW', 'ACTIVE']).nullable(), source: tenantEventSourceSchema.nullable(), relay: z.enum(['NOT_CONFIGURED', 'AVAILABLE', 'UNAVAILABLE']), worker: tenantEventWorkerSchema.nullable(), eventType: z.literal(tenantMaterialEventType), counterpartAcceptance: z.literal('NOT_OBSERVED') }).strict(),
37
+ tenant_event_exchange_get: z.object({ schemaVersion: z.literal(1), item: route.nullable() }).strict(),
38
+ tenant_event_exchange_list: z.object({ schemaVersion: z.literal(1), items: z.array(route).max(100), nextAfter: z.string().max(256).nullable() }).strict(),
39
+ tenant_event_exchange_configure: exchangeResult,
40
+ tenant_event_exchange_receipt: receipt(exchangeResult),
41
+ tenant_event_outbox_list: z.object({ schemaVersion: z.literal(1), items: z.array(z.object({ source: uri, id: atom(), deliveryid: z.string().regex(/^[a-f0-9]{64}$/), status: z.enum(['PENDING', 'UNKNOWN', 'PUBLISHED', 'HOLD']), generation, attempt: z.number().int().nonnegative(), nextAttemptAt: z.number().int().nonnegative(), reasonCode: z.string().max(256).nullable() }).strict()).max(100), nextAfter: z.number().int().nonnegative().nullable(), gaps: z.array(z.object({ route_key: atom(), connectionRef: atom(128), cursor: atom(), gap_oldest: atom() }).strict()).max(100), worker: tenantEventWorkerSchema.nullable() }).strict(),
42
+ tenant_event_outbox_recover: outboxResult,
43
+ tenant_event_outbox_recovery_receipt: receipt(outboxResult),
44
+ tenant_event_gap_recover: gapResult,
45
+ tenant_event_gap_recovery_receipt: receipt(gapResult),
46
+ tenant_event_gap_baseline_read: z.object({ schemaVersion: z.literal(1), baseline: baseline.nullable() }).strict(),
47
+ };
48
+ export function tenantEventEnvelopeSchema(tool) { return z.object({ schemaVersion: z.literal(27), tenantId: atom(), tool: z.literal(tool), data: tenantEventResultSchemas[tool] }).strict(); }
49
+ export const tenantEventErrorCodes = ['EVENTSDK_OPERATION_RESULT_UNKNOWN', 'TENANT_MANAGEMENT_AUTHORITY_CHANGED', 'TENANT_MANAGEMENT_FORBIDDEN', 'EVENTSDK_INVALID_INPUT', 'EVENTSDK_SOURCE_NOT_CONFIGURED', 'EVENTSDK_RELAY_NOT_CONFIGURED', 'EVENTSDK_EXCHANGE_UNAVAILABLE', 'EVENTSDK_REQUEST_ID_CONFLICT', 'EVENTSDK_EXCHANGE_REVISION_CONFLICT', 'EVENTSDK_GRANT_VERSION_CONFLICT', 'EVENTSDK_GAP_CONFLICT', 'RECOVERY_REQUIRED', 'STALE_LEASE', 'EVENTSDK_GAP_SOURCE_CHANGED', 'TENANT_MANAGEMENT_INPUT_BUDGET'];
50
+ export const tenantEventErrorSchema = z.object({ errorCode: z.enum(tenantEventErrorCodes) }).strict();
51
+ export const tenantEventInputJsonSchemas = Object.fromEntries(Object.entries(tenantEventToolSchemas).map(([name, schema]) => [name, z.toJSONSchema(schema, { target: 'draft-07' })]));
52
+ export const tenantEventOutputJsonSchemas = Object.fromEntries(Object.keys(tenantEventToolSchemas).map(name => [name, z.toJSONSchema(tenantEventEnvelopeSchema(name), { target: 'draft-07' })]));
53
+ export const tenantEventProviderSchema = z.object({ schemaVersion: z.literal(27), authorityVersion: z.literal(2), requiredScope: z.literal('knowledge.material.route'), readScope: z.literal('knowledge.material.read'), resource: uri, callEndpoint: uri, mcpEndpoint: uri, tools: z.array(z.object({ name: z.enum(Object.keys(tenantEventToolSchemas)), description: z.string(), inputSchema: z.json(), outputSchema: z.json(), annotations: z.object({ readOnlyHint: z.boolean(), destructiveHint: z.boolean(), idempotentHint: z.boolean(), openWorldHint: z.boolean() }).strict(), _meta: z.object({ 'native-knowledge/requiredScope': z.enum(['knowledge.material.route', 'knowledge.material.read']) }).strict() }).strict()).max(32) }).strict();
54
+ /** Native event-link/1 handoff, separate from EventSDK transport contracts. */
55
+ export const tenantEventLinkProposalSchema = z.object({ schemaVersion: z.literal(1), requestId: atom(), source: tenantEventSourceSchema, target: tenantEventRegistrationSchema.shape.target, grant: tenantEventRegistrationSchema.shape.grant, connectionRef: atom(128), targetDisplayName: z.string().min(1).max(160), approvalRef: atom(), expiresAt: z.string().datetime() }).strict();
56
+ export const tenantEventLinkCatalogSchema = z.object({ schemaVersion: z.literal(1), applications: z.array(z.object({ id: atom(64), name: z.string().min(1).max(80), serviceRef: atom(), origin: z.string().url().max(512), clientId: atom(128), consumerRef: atom().optional() }).strict()).max(8) }).strict();
57
+ export function tenantEventToolScope(name) { return name === 'tenant_event_materials' ? 'knowledge.material.read' : 'knowledge.material.route'; }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@native-knowledge/cli",
3
- "version": "0.1.0-rc.3",
3
+ "version": "0.1.0-rc.4",
4
4
  "private": false,
5
5
  "type": "module",
6
6
  "engines": {
@@ -17,7 +17,7 @@
17
17
  "knowledge-v2": "./dist/cli.js"
18
18
  },
19
19
  "dependencies": {
20
- "@native-knowledge/knowledge-sdk": "0.1.0-rc.3",
20
+ "@native-knowledge/knowledge-sdk": "0.1.0-rc.4",
21
21
  "zod": "^4.6.7"
22
22
  }
23
23
  }