@native-knowledge/knowledge-sdk 0.0.0-stage → 0.1.0-rc.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (203) hide show
  1. package/LICENSE +202 -0
  2. package/NOTICE +29 -0
  3. package/README.md +34 -2
  4. package/dist/agent-entry.d.ts +291 -0
  5. package/dist/agent-entry.js +153 -0
  6. package/dist/agent-guidance-error.d.ts +15 -0
  7. package/dist/agent-guidance-error.js +46 -0
  8. package/dist/auth.d.ts +124 -0
  9. package/dist/auth.js +165 -0
  10. package/dist/index.d.ts +290 -0
  11. package/dist/index.js +166 -0
  12. package/dist/internal/contracts/artifact.d.ts +120 -0
  13. package/dist/internal/contracts/artifact.js +103 -0
  14. package/dist/internal/contracts/collection-control.d.ts +160 -0
  15. package/dist/internal/contracts/collection-control.js +69 -0
  16. package/dist/internal/contracts/collection.d.ts +263 -0
  17. package/dist/internal/contracts/collection.js +174 -0
  18. package/dist/internal/contracts/common.d.ts +17 -0
  19. package/dist/internal/contracts/common.js +16 -0
  20. package/dist/internal/contracts/currentness.d.ts +477 -0
  21. package/dist/internal/contracts/currentness.js +221 -0
  22. package/dist/internal/contracts/event.d.ts +60 -0
  23. package/dist/internal/contracts/event.js +35 -0
  24. package/dist/internal/contracts/evidence.d.ts +202 -0
  25. package/dist/internal/contracts/evidence.js +171 -0
  26. package/dist/internal/contracts/index.d.ts +54 -0
  27. package/dist/internal/contracts/index.js +54 -0
  28. package/dist/internal/contracts/material-capability.d.ts +88 -0
  29. package/dist/internal/contracts/material-capability.js +8 -0
  30. package/dist/internal/contracts/material-carrier.d.ts +104 -0
  31. package/dist/internal/contracts/material-carrier.js +15 -0
  32. package/dist/internal/contracts/material-context.d.ts +28 -0
  33. package/dist/internal/contracts/material-context.js +9 -0
  34. package/dist/internal/contracts/material-read.d.ts +152 -0
  35. package/dist/internal/contracts/material-read.js +12 -0
  36. package/dist/internal/contracts/observation.d.ts +75 -0
  37. package/dist/internal/contracts/observation.js +39 -0
  38. package/dist/internal/contracts/persistence.d.ts +370 -0
  39. package/dist/internal/contracts/persistence.js +239 -0
  40. package/dist/internal/contracts/project-intent.d.ts +218 -0
  41. package/dist/internal/contracts/project-intent.js +121 -0
  42. package/dist/internal/contracts/projection.d.ts +380 -0
  43. package/dist/internal/contracts/projection.js +194 -0
  44. package/dist/internal/contracts/public-reference.d.ts +237 -0
  45. package/dist/internal/contracts/public-reference.js +87 -0
  46. package/dist/internal/contracts/reference-record.d.ts +124 -0
  47. package/dist/internal/contracts/reference-record.js +55 -0
  48. package/dist/internal/contracts/remote-file.d.ts +128 -0
  49. package/dist/internal/contracts/remote-file.js +159 -0
  50. package/dist/internal/contracts/resource-scope.d.ts +40 -0
  51. package/dist/internal/contracts/resource-scope.js +38 -0
  52. package/dist/internal/contracts/review-packet.d.ts +274 -0
  53. package/dist/internal/contracts/review-packet.js +61 -0
  54. package/dist/internal/contracts/review-plane.d.ts +90 -0
  55. package/dist/internal/contracts/review-plane.js +89 -0
  56. package/dist/internal/contracts/rich-document.d.ts +641 -0
  57. package/dist/internal/contracts/rich-document.js +184 -0
  58. package/dist/internal/contracts/runtime-compatibility.d.ts +22 -0
  59. package/dist/internal/contracts/runtime-compatibility.js +55 -0
  60. package/dist/internal/contracts/runtime.d.ts +59 -0
  61. package/dist/internal/contracts/runtime.js +68 -0
  62. package/dist/internal/contracts/scheduler.d.ts +348 -0
  63. package/dist/internal/contracts/scheduler.js +256 -0
  64. package/dist/internal/contracts/signal.d.ts +113 -0
  65. package/dist/internal/contracts/signal.js +77 -0
  66. package/dist/internal/contracts/source-governance.d.ts +375 -0
  67. package/dist/internal/contracts/source-governance.js +194 -0
  68. package/dist/internal/contracts/source.d.ts +62 -0
  69. package/dist/internal/contracts/source.js +32 -0
  70. package/dist/internal/contracts/tenant-budget.d.ts +59 -0
  71. package/dist/internal/contracts/tenant-budget.js +34 -0
  72. package/dist/internal/contracts/tenant-collection-request.d.ts +209 -0
  73. package/dist/internal/contracts/tenant-collection-request.js +58 -0
  74. package/dist/internal/contracts/tenant-collection.d.ts +199 -0
  75. package/dist/internal/contracts/tenant-collection.js +66 -0
  76. package/dist/internal/contracts/tenant-currentness.d.ts +117 -0
  77. package/dist/internal/contracts/tenant-currentness.js +26 -0
  78. package/dist/internal/contracts/tenant-management.d.ts +286 -0
  79. package/dist/internal/contracts/tenant-management.js +27 -0
  80. package/dist/internal/contracts/tenant-material-api.d.ts +584 -0
  81. package/dist/internal/contracts/tenant-material-api.js +46 -0
  82. package/dist/internal/contracts/tenant-material-json-schema.js +16 -0
  83. package/dist/internal/contracts/tenant-pdf-text.d.ts +27 -0
  84. package/dist/internal/contracts/tenant-pdf-text.js +13 -0
  85. package/dist/internal/contracts/tenant-project-control.d.ts +94 -0
  86. package/dist/internal/contracts/tenant-project-control.js +19 -0
  87. package/dist/internal/contracts/tenant-public-reference.d.ts +179 -0
  88. package/dist/internal/contracts/tenant-public-reference.js +26 -0
  89. package/dist/internal/contracts/tenant-resource-api.d.ts +738 -0
  90. package/dist/internal/contracts/tenant-resource-api.js +70 -0
  91. package/dist/internal/contracts/tenant-resource.d.ts +298 -0
  92. package/dist/internal/contracts/tenant-resource.js +118 -0
  93. package/dist/internal/contracts/tenant-rich-document.d.ts +317 -0
  94. package/dist/internal/contracts/tenant-rich-document.js +17 -0
  95. package/dist/internal/contracts/tenant-source-binding.d.ts +44 -0
  96. package/dist/internal/contracts/tenant-source-binding.js +33 -0
  97. package/dist/internal/contracts/tenant-source-bridge.d.ts +70 -0
  98. package/dist/internal/contracts/tenant-source-bridge.js +9 -0
  99. package/dist/internal/contracts/tenant-source-cutover.d.ts +226 -0
  100. package/dist/internal/contracts/tenant-source-cutover.js +26 -0
  101. package/dist/internal/contracts/tenant-source-document.d.ts +163 -0
  102. package/dist/internal/contracts/tenant-source-document.js +38 -0
  103. package/dist/internal/contracts/tenant-source-lease.d.ts +1 -0
  104. package/dist/internal/contracts/tenant-source-lease.js +5 -0
  105. package/dist/internal/contracts/tenant-source.d.ts +223 -0
  106. package/dist/internal/contracts/tenant-source.js +83 -0
  107. package/dist/internal/contracts/tenant-web-collection.d.ts +287 -0
  108. package/dist/internal/contracts/tenant-web-collection.js +118 -0
  109. package/dist/internal/contracts/tenant-web-content-plan.d.ts +86 -0
  110. package/dist/internal/contracts/tenant-web-content-plan.js +39 -0
  111. package/dist/internal/contracts/tenant-web-content-result.d.ts +63 -0
  112. package/dist/internal/contracts/tenant-web-content-result.js +15 -0
  113. package/dist/internal/contracts/tenant-web-content.d.ts +383 -0
  114. package/dist/internal/contracts/tenant-web-content.js +16 -0
  115. package/dist/internal/contracts/tenant-web-crawl.d.ts +310 -0
  116. package/dist/internal/contracts/tenant-web-crawl.js +55 -0
  117. package/dist/internal/contracts/tenant-web-dynamic.d.ts +698 -0
  118. package/dist/internal/contracts/tenant-web-dynamic.js +68 -0
  119. package/dist/internal/contracts/tenant-web-results.d.ts +66 -0
  120. package/dist/internal/contracts/tenant-web-results.js +41 -0
  121. package/dist/internal/contracts/tenant-web-workflow.d.ts +494 -0
  122. package/dist/internal/contracts/tenant-web-workflow.js +29 -0
  123. package/dist/internal/serving-contracts/agent-catalog.d.ts +70 -0
  124. package/dist/internal/serving-contracts/agent-catalog.js +56 -0
  125. package/dist/internal/serving-contracts/agent-entry.d.ts +13148 -0
  126. package/dist/internal/serving-contracts/agent-entry.js +57 -0
  127. package/dist/internal/serving-contracts/agent-guidance-shapes.d.ts +263 -0
  128. package/dist/internal/serving-contracts/agent-guidance-shapes.js +12 -0
  129. package/dist/internal/serving-contracts/agent-input-hints.d.ts +24 -0
  130. package/dist/internal/serving-contracts/agent-input-hints.js +104 -0
  131. package/dist/internal/serving-contracts/body-search.d.ts +231 -0
  132. package/dist/internal/serving-contracts/body-search.js +16 -0
  133. package/dist/internal/serving-contracts/consumer.d.ts +989 -0
  134. package/dist/internal/serving-contracts/consumer.js +45 -0
  135. package/dist/internal/serving-contracts/core.d.ts +333 -0
  136. package/dist/internal/serving-contracts/core.js +76 -0
  137. package/dist/internal/serving-contracts/http.d.ts +2874 -0
  138. package/dist/internal/serving-contracts/http.js +64 -0
  139. package/dist/internal/serving-contracts/index.d.ts +24 -0
  140. package/dist/internal/serving-contracts/index.js +25 -0
  141. package/dist/internal/serving-contracts/management.d.ts +424 -0
  142. package/dist/internal/serving-contracts/management.js +15 -0
  143. package/dist/internal/serving-contracts/material-capabilities.d.ts +508 -0
  144. package/dist/internal/serving-contracts/material-capabilities.js +14 -0
  145. package/dist/internal/serving-contracts/material-index-status.d.ts +55 -0
  146. package/dist/internal/serving-contracts/material-index-status.js +5 -0
  147. package/dist/internal/serving-contracts/mcp.d.ts +2218 -0
  148. package/dist/internal/serving-contracts/mcp.js +140 -0
  149. package/dist/internal/serving-contracts/tenant-governance.d.ts +236 -0
  150. package/dist/internal/serving-contracts/tenant-governance.js +13 -0
  151. package/dist/internal/serving-contracts/tenant-management.d.ts +6276 -0
  152. package/dist/internal/serving-contracts/tenant-management.js +89 -0
  153. package/dist/internal/serving-contracts/tenant-project.d.ts +7550 -0
  154. package/dist/internal/serving-contracts/tenant-project.js +39 -0
  155. package/dist/internal/serving-contracts/tenant-runtime.d.ts +9674 -0
  156. package/dist/internal/serving-contracts/tenant-runtime.js +37 -0
  157. package/dist/internal/serving-contracts/tenant-session.d.ts +87 -0
  158. package/dist/internal/serving-contracts/tenant-session.js +8 -0
  159. package/dist/internal/serving-contracts/tenant-web-content.d.ts +4606 -0
  160. package/dist/internal/serving-contracts/tenant-web-content.js +20 -0
  161. package/dist/internal/serving-contracts/tenant-web-crawl.d.ts +2958 -0
  162. package/dist/internal/serving-contracts/tenant-web-crawl.js +13 -0
  163. package/dist/internal/serving-contracts/tenant-web-dynamic.d.ts +3902 -0
  164. package/dist/internal/serving-contracts/tenant-web-dynamic.js +20 -0
  165. package/dist/internal/serving-contracts/tenant-web-workflow.d.ts +5750 -0
  166. package/dist/internal/serving-contracts/tenant-web-workflow.js +36 -0
  167. package/dist/internal/serving-contracts/tenant-web.d.ts +6418 -0
  168. package/dist/internal/serving-contracts/tenant-web.js +53 -0
  169. package/dist/internal/serving-contracts/tenant-workspace.d.ts +6451 -0
  170. package/dist/internal/serving-contracts/tenant-workspace.js +28 -0
  171. package/dist/internal/serving-contracts/workflow.d.ts +439 -0
  172. package/dist/internal/serving-contracts/workflow.js +37 -0
  173. package/dist/material-stream.d.ts +18 -0
  174. package/dist/material-stream.js +29 -0
  175. package/dist/oauth.d.ts +268 -0
  176. package/dist/oauth.js +539 -0
  177. package/dist/resource.d.ts +88 -0
  178. package/dist/resource.js +123 -0
  179. package/dist/session.d.ts +4 -0
  180. package/dist/session.js +3 -0
  181. package/dist/tenant-client.d.ts +169 -0
  182. package/dist/tenant-client.js +58 -0
  183. package/dist/tenant-management.d.ts +240 -0
  184. package/dist/tenant-management.js +149 -0
  185. package/dist/tenant-project.d.ts +57 -0
  186. package/dist/tenant-project.js +63 -0
  187. package/dist/tenant-runtime.d.ts +174 -0
  188. package/dist/tenant-runtime.js +17 -0
  189. package/dist/tenant-web-content.d.ts +44 -0
  190. package/dist/tenant-web-content.js +70 -0
  191. package/dist/tenant-web-crawl.d.ts +42 -0
  192. package/dist/tenant-web-crawl.js +39 -0
  193. package/dist/tenant-web-dynamic.d.ts +42 -0
  194. package/dist/tenant-web-dynamic.js +39 -0
  195. package/dist/tenant-web-workflow.d.ts +43 -0
  196. package/dist/tenant-web-workflow.js +63 -0
  197. package/dist/tenant-web.d.ts +42 -0
  198. package/dist/tenant-web.js +39 -0
  199. package/dist/tenant-workspace.d.ts +36 -0
  200. package/dist/tenant-workspace.js +21 -0
  201. package/dist/token-provider.d.ts +14 -0
  202. package/dist/token-provider.js +21 -0
  203. package/package.json +45 -3
@@ -0,0 +1,239 @@
1
+ import { z } from 'zod';
2
+ import { artifactKindSchema } from './artifact.js';
3
+ import { evidenceRefSchema } from './evidence.js';
4
+ import { accessClassificationSchema, idSchema, isoDateTimeSchema, projectKeySchema, schemaVersionSchema, sha256Schema, stableUriSchema, } from './common.js';
5
+ import { sourceDeclaredStateSchema } from './source-governance.js';
6
+ export const portableRelativePathSchema = z.string().trim().min(1).max(4096).superRefine((value, ctx) => {
7
+ if (value.startsWith('/') || value.includes('\\'))
8
+ ctx.addIssue({ code: 'custom', message: 'Path must be portable and relative' });
9
+ const parts = value.split('/');
10
+ if (parts.some((part) => !part || part === '.' || part === '..'))
11
+ ctx.addIssue({ code: 'custom', message: 'Path contains invalid segment' });
12
+ });
13
+ export const sourceSetRegistryHashSchema = z.object({
14
+ acquisitionSourceId: idSchema,
15
+ relativePath: portableRelativePathSchema,
16
+ contentHash: sha256Schema,
17
+ }).strict();
18
+ export const sourceSetItemBindingSchema = z.object({
19
+ acquisitionSourceId: idSchema,
20
+ concreteSourceId: idSchema,
21
+ authority: z.string().trim().min(1).max(512).nullable(),
22
+ access: accessClassificationSchema,
23
+ declaredGitSha: z.string().trim().min(1).max(128).nullable(),
24
+ }).strict();
25
+ export const sourceSetItemSchema = z.object({
26
+ itemId: idSchema,
27
+ kind: z.enum(['WEB', 'FILE']),
28
+ logicalSourceRef: stableUriSchema,
29
+ sourceIds: z.array(idSchema).min(1).max(64),
30
+ bindings: z.array(sourceSetItemBindingSchema).min(1).max(64),
31
+ contentPolicy: z.enum(['public-excerpt', 'metadata-only']),
32
+ cadenceMs: z.number().int().positive(),
33
+ url: z.url().nullable(),
34
+ rootBinding: projectKeySchema.nullable(),
35
+ relativePath: portableRelativePathSchema.nullable(),
36
+ }).strict().superRefine((value, ctx) => {
37
+ if (value.kind === 'WEB' && (!value.url || value.rootBinding || value.relativePath))
38
+ ctx.addIssue({ code: 'custom', path: ['url'], message: 'WEB item requires url only' });
39
+ if (value.kind === 'FILE' && (value.url || !value.rootBinding || !value.relativePath))
40
+ ctx.addIssue({ code: 'custom', path: ['relativePath'], message: 'FILE item requires rootBinding + relativePath only' });
41
+ });
42
+ export const sourceSetLogicalSourceSchema = z.object({
43
+ logicalSourceId: idSchema,
44
+ familyId: idSchema,
45
+ declaredState: sourceDeclaredStateSchema,
46
+ locator: stableUriSchema.nullable(),
47
+ acquisitionSourceIds: z.array(idSchema).max(64),
48
+ itemIds: z.array(idSchema).max(5000),
49
+ }).strict();
50
+ export const sourceSetSnapshotSchema = z.object({
51
+ schemaVersion: schemaVersionSchema,
52
+ sourceSetId: sha256Schema,
53
+ sourceSetRef: stableUriSchema,
54
+ projectKey: projectKeySchema,
55
+ programRevision: z.string().regex(/^[a-f0-9]{40,64}$/),
56
+ acquisitionConfigHash: sha256Schema,
57
+ sourceUniverseHash: sha256Schema.nullable(),
58
+ registryHashes: z.array(sourceSetRegistryHashSchema).max(256),
59
+ items: z.array(sourceSetItemSchema).max(20000),
60
+ logicalSources: z.array(sourceSetLogicalSourceSchema).max(5000),
61
+ }).strict().superRefine((value, ctx) => {
62
+ const digest = value.sourceSetId.slice('sha256:'.length);
63
+ if (value.sourceSetRef !== `source-set://${value.projectKey}/${digest}`)
64
+ ctx.addIssue({ code: 'custom', path: ['sourceSetRef'], message: 'sourceSetRef must match sourceSetId' });
65
+ const itemIds = value.items.map((row) => row.itemId);
66
+ if (new Set(itemIds).size !== itemIds.length)
67
+ ctx.addIssue({ code: 'custom', path: ['items'], message: 'itemId must be unique' });
68
+ const logicalIds = value.logicalSources.map((row) => row.logicalSourceId);
69
+ if (new Set(logicalIds).size !== logicalIds.length)
70
+ ctx.addIssue({ code: 'custom', path: ['logicalSources'], message: 'logicalSourceId must be unique' });
71
+ const registryKeys = value.registryHashes.map((row) => `${row.acquisitionSourceId}\n${row.relativePath}`);
72
+ if (new Set(registryKeys).size !== registryKeys.length)
73
+ ctx.addIssue({ code: 'custom', path: ['registryHashes'], message: 'registry hash binding must be unique' });
74
+ });
75
+ export const sourceSetPointerSchema = z.object({
76
+ schemaVersion: schemaVersionSchema,
77
+ projectKey: projectKeySchema,
78
+ sourceSetId: sha256Schema,
79
+ sourceSetRef: stableUriSchema,
80
+ manifestRelativePath: portableRelativePathSchema,
81
+ updatedAt: isoDateTimeSchema,
82
+ }).strict();
83
+ export const libraryProjectionSchema = z.object({
84
+ schemaVersion: schemaVersionSchema,
85
+ projectionId: sha256Schema,
86
+ projectKey: projectKeySchema,
87
+ subjectType: z.enum(['ARTIFACT', 'EVIDENCE']),
88
+ subjectRef: stableUriSchema,
89
+ contentHash: sha256Schema,
90
+ mediaType: z.string().trim().min(1).max(256),
91
+ byteLength: z.number().int().nonnegative(),
92
+ relativePath: portableRelativePathSchema,
93
+ manifestRelativePath: portableRelativePathSchema,
94
+ }).strict();
95
+ export const deliverySupportProofSchema = z.object({
96
+ action: z.literal('ALLOW'),
97
+ supportState: z.string().trim().min(1).max(128),
98
+ semanticHash: sha256Schema,
99
+ }).strict();
100
+ export const deliveryConsumerRequestSchema = z.object({
101
+ mediaType: z.string().trim().min(1).max(256),
102
+ contentHash: sha256Schema,
103
+ byteLength: z.number().int().nonnegative(),
104
+ }).strict();
105
+ export const knowledgeDeliveryEnvelopeSchema = z.object({
106
+ schemaVersion: schemaVersionSchema,
107
+ deliveryId: sha256Schema,
108
+ producerProjectKey: projectKeySchema,
109
+ producerProjectRef: stableUriSchema.optional(),
110
+ consumerKey: projectKeySchema,
111
+ artifactRef: stableUriSchema,
112
+ artifactKind: artifactKindSchema,
113
+ artifactAccess: accessClassificationSchema,
114
+ contentHash: sha256Schema,
115
+ mediaType: z.string().trim().min(1).max(256),
116
+ byteLength: z.number().int().nonnegative(),
117
+ libraryPath: portableRelativePathSchema,
118
+ observedAt: isoDateTimeSchema.nullable(),
119
+ validUntil: isoDateTimeSchema.nullable(),
120
+ support: deliverySupportProofSchema.nullable(),
121
+ consumerRequest: deliveryConsumerRequestSchema.nullable(),
122
+ createdAt: isoDateTimeSchema,
123
+ }).strict().superRefine((value, ctx) => { if (value.producerProjectRef) {
124
+ try {
125
+ const url = new URL(value.producerProjectRef);
126
+ if (url.protocol !== 'knowledge-project:' || url.hostname.toLowerCase() !== value.producerProjectKey.toLowerCase())
127
+ ctx.addIssue({ code: 'custom', path: ['producerProjectRef'], message: 'producerProjectRef project must match producer project' });
128
+ }
129
+ catch {
130
+ ctx.addIssue({ code: 'custom', path: ['producerProjectRef'], message: 'Invalid producerProjectRef' });
131
+ }
132
+ } });
133
+ export const knowledgeDeliveryClaimSchema = z.object({
134
+ schemaVersion: schemaVersionSchema,
135
+ deliveryId: sha256Schema,
136
+ producerProjectKey: projectKeySchema,
137
+ producerProjectRef: stableUriSchema.optional(),
138
+ consumerKey: projectKeySchema,
139
+ claimId: z.string().uuid(),
140
+ workerId: z.string().trim().min(1).max(128).regex(/^[A-Za-z0-9._-]+$/),
141
+ claimedAt: isoDateTimeSchema,
142
+ expiresAt: isoDateTimeSchema,
143
+ }).strict().superRefine((value, ctx) => {
144
+ if (value.producerProjectRef) {
145
+ try {
146
+ const url = new URL(value.producerProjectRef);
147
+ if (url.protocol !== 'knowledge-project:' || url.hostname.toLowerCase() !== value.producerProjectKey.toLowerCase())
148
+ ctx.addIssue({ code: 'custom', path: ['producerProjectRef'], message: 'producerProjectRef project must match producer project' });
149
+ }
150
+ catch {
151
+ ctx.addIssue({ code: 'custom', path: ['producerProjectRef'], message: 'Invalid producerProjectRef' });
152
+ }
153
+ }
154
+ const claimedAt = Date.parse(value.claimedAt), expiresAt = Date.parse(value.expiresAt), leaseSeconds = (expiresAt - claimedAt) / 1000;
155
+ if (expiresAt <= claimedAt)
156
+ ctx.addIssue({ code: 'custom', path: ['expiresAt'], message: 'Delivery claim expiry must be after claim time' });
157
+ else if (leaseSeconds < 30 || leaseSeconds > 3600)
158
+ ctx.addIssue({ code: 'custom', path: ['expiresAt'], message: 'Delivery claim lease must be between 30 and 3600 seconds' });
159
+ });
160
+ export const knowledgeDeliveryOutcomeSchema = z.enum(['DELIVERED', 'BLOCKED', 'FAILED_RETRYABLE', 'FAILED_TERMINAL']);
161
+ export const knowledgeDeliveryReceiptSchema = z.object({
162
+ schemaVersion: schemaVersionSchema,
163
+ deliveryId: sha256Schema,
164
+ producerProjectKey: projectKeySchema,
165
+ producerProjectRef: stableUriSchema.optional(),
166
+ consumerKey: projectKeySchema,
167
+ artifactRef: stableUriSchema,
168
+ contentHash: sha256Schema,
169
+ outcome: knowledgeDeliveryOutcomeSchema,
170
+ attempts: z.number().int().positive().max(999999),
171
+ deliveredAt: isoDateTimeSchema,
172
+ nextAttemptAt: isoDateTimeSchema.nullable(),
173
+ externalRef: stableUriSchema.nullable(),
174
+ consumerResponseHash: sha256Schema.nullable(),
175
+ message: z.string().trim().min(1).max(4000).nullable(),
176
+ }).strict().superRefine((value, ctx) => {
177
+ if (value.producerProjectRef) {
178
+ try {
179
+ const url = new URL(value.producerProjectRef);
180
+ if (url.protocol !== 'knowledge-project:' || url.hostname.toLowerCase() !== value.producerProjectKey.toLowerCase())
181
+ ctx.addIssue({ code: 'custom', path: ['producerProjectRef'], message: 'producerProjectRef project must match producer project' });
182
+ }
183
+ catch {
184
+ ctx.addIssue({ code: 'custom', path: ['producerProjectRef'], message: 'Invalid producerProjectRef' });
185
+ }
186
+ }
187
+ if (value.outcome === 'DELIVERED' && value.nextAttemptAt)
188
+ ctx.addIssue({ code: 'custom', path: ['nextAttemptAt'], message: 'DELIVERED cannot schedule retry' });
189
+ if (value.outcome === 'FAILED_RETRYABLE' && !value.nextAttemptAt)
190
+ ctx.addIssue({ code: 'custom', path: ['nextAttemptAt'], message: 'FAILED_RETRYABLE requires nextAttemptAt' });
191
+ if (value.outcome === 'FAILED_RETRYABLE' && value.nextAttemptAt && Date.parse(value.nextAttemptAt) <= Date.parse(value.deliveredAt))
192
+ ctx.addIssue({ code: 'custom', path: ['nextAttemptAt'], message: 'Retry must be scheduled after this attempt completes' });
193
+ if (value.outcome !== 'FAILED_RETRYABLE' && value.nextAttemptAt)
194
+ ctx.addIssue({ code: 'custom', path: ['nextAttemptAt'], message: 'Only retryable failure may schedule retry' });
195
+ });
196
+ export const distributionConsumerSchema = z.object({
197
+ consumerKey: projectKeySchema,
198
+ enabled: z.boolean(),
199
+ artifactKinds: z.array(artifactKindSchema).min(1).max(16),
200
+ acceptedAccess: z.array(accessClassificationSchema).min(1).max(7),
201
+ supportPolicy: z.enum(['NONE', 'REQUIRE_ALLOW']),
202
+ adapter: z.string().trim().min(1).max(128),
203
+ }).strict().superRefine((value, ctx) => {
204
+ if (value.artifactKinds.some((kind) => ['KNOWLEDGE', 'INSIGHT'].includes(kind)) && value.supportPolicy !== 'REQUIRE_ALLOW') {
205
+ ctx.addIssue({ code: 'custom', path: ['supportPolicy'], message: 'Knowledge/Insight distribution requires REQUIRE_ALLOW' });
206
+ }
207
+ if (new Set(value.acceptedAccess).size !== value.acceptedAccess.length)
208
+ ctx.addIssue({ code: 'custom', path: ['acceptedAccess'], message: 'acceptedAccess must be unique' });
209
+ });
210
+ export const distributionConfigSchema = z.object({
211
+ schemaVersion: schemaVersionSchema,
212
+ projectKey: projectKeySchema,
213
+ consumers: z.array(distributionConsumerSchema).max(128),
214
+ }).strict().superRefine((value, ctx) => {
215
+ const keys = value.consumers.map((row) => row.consumerKey);
216
+ if (new Set(keys).size !== keys.length)
217
+ ctx.addIssue({ code: 'custom', path: ['consumers'], message: 'consumerKey must be unique' });
218
+ });
219
+ export const durableEvidenceManifestSchema = z.object({
220
+ schemaVersion: schemaVersionSchema,
221
+ projectKey: projectKeySchema,
222
+ evidenceRef: stableUriSchema,
223
+ evidence: evidenceRefSchema,
224
+ }).strict().superRefine((value, ctx) => {
225
+ if (value.evidence.projectKey !== value.projectKey)
226
+ ctx.addIssue({ code: 'custom', path: ['evidence', 'projectKey'], message: 'Durable Evidence project must match manifest project' });
227
+ const expected = `evidence://${value.projectKey}/${encodeURIComponent(value.evidence.evidenceId)}`;
228
+ if (value.evidenceRef !== expected)
229
+ ctx.addIssue({ code: 'custom', path: ['evidenceRef'], message: 'Durable Evidence ref must match evidence identity' });
230
+ if (value.evidence.sourceSetRef) {
231
+ try {
232
+ if (new URL(value.evidence.sourceSetRef).hostname.toLowerCase() !== value.projectKey.toLowerCase())
233
+ ctx.addIssue({ code: 'custom', path: ['evidence', 'sourceSetRef'], message: 'Source Set project must match Evidence project' });
234
+ }
235
+ catch {
236
+ ctx.addIssue({ code: 'custom', path: ['evidence', 'sourceSetRef'], message: 'Invalid Source Set ref' });
237
+ }
238
+ }
239
+ });
@@ -0,0 +1,218 @@
1
+ import { z } from 'zod';
2
+ /**
3
+ * Attribution for an Agent-native Knowledge write. This is provenance, not an
4
+ * authorization decision. agentId is deliberately nullable because humans,
5
+ * schedulers and migrations may write without an Agent identity.
6
+ */
7
+ export declare const knowledgeActorContextSchema: z.ZodObject<{
8
+ tenantId: z.ZodString;
9
+ userId: z.ZodString;
10
+ agentId: z.ZodDefault<z.ZodNullable<z.ZodString>>;
11
+ }, z.core.$strict>;
12
+ export declare const projectIntentScopeSchema: z.ZodObject<{
13
+ scopeId: z.ZodString;
14
+ title: z.ZodString;
15
+ description: z.ZodString;
16
+ sourceRequirements: z.ZodDefault<z.ZodArray<z.ZodString>>;
17
+ sourceFamilies: z.ZodDefault<z.ZodArray<z.ZodString>>;
18
+ notes: z.ZodDefault<z.ZodNullable<z.ZodString>>;
19
+ }, z.core.$strict>;
20
+ export declare const projectIdentitySchema: z.ZodObject<{
21
+ name: z.ZodString;
22
+ summary: z.ZodString;
23
+ domains: z.ZodDefault<z.ZodArray<z.ZodString>>;
24
+ notes: z.ZodDefault<z.ZodNullable<z.ZodString>>;
25
+ }, z.core.$strict>;
26
+ export declare const projectIntentBasisSchema: z.ZodObject<{
27
+ schemaVersion: z.ZodLiteral<1>;
28
+ projectKey: z.ZodString;
29
+ actor: z.ZodObject<{
30
+ tenantId: z.ZodString;
31
+ userId: z.ZodString;
32
+ agentId: z.ZodDefault<z.ZodNullable<z.ZodString>>;
33
+ }, z.core.$strict>;
34
+ projectIdentity: z.ZodObject<{
35
+ name: z.ZodString;
36
+ summary: z.ZodString;
37
+ domains: z.ZodDefault<z.ZodArray<z.ZodString>>;
38
+ notes: z.ZodDefault<z.ZodNullable<z.ZodString>>;
39
+ }, z.core.$strict>;
40
+ scopes: z.ZodDefault<z.ZodArray<z.ZodObject<{
41
+ scopeId: z.ZodString;
42
+ title: z.ZodString;
43
+ description: z.ZodString;
44
+ sourceRequirements: z.ZodDefault<z.ZodArray<z.ZodString>>;
45
+ sourceFamilies: z.ZodDefault<z.ZodArray<z.ZodString>>;
46
+ notes: z.ZodDefault<z.ZodNullable<z.ZodString>>;
47
+ }, z.core.$strict>>>;
48
+ }, z.core.$strict>;
49
+ export declare const projectIntentSnapshotSchema: z.ZodObject<{
50
+ schemaVersion: z.ZodLiteral<1>;
51
+ projectKey: z.ZodString;
52
+ actor: z.ZodObject<{
53
+ tenantId: z.ZodString;
54
+ userId: z.ZodString;
55
+ agentId: z.ZodDefault<z.ZodNullable<z.ZodString>>;
56
+ }, z.core.$strict>;
57
+ projectIdentity: z.ZodObject<{
58
+ name: z.ZodString;
59
+ summary: z.ZodString;
60
+ domains: z.ZodDefault<z.ZodArray<z.ZodString>>;
61
+ notes: z.ZodDefault<z.ZodNullable<z.ZodString>>;
62
+ }, z.core.$strict>;
63
+ scopes: z.ZodDefault<z.ZodArray<z.ZodObject<{
64
+ scopeId: z.ZodString;
65
+ title: z.ZodString;
66
+ description: z.ZodString;
67
+ sourceRequirements: z.ZodDefault<z.ZodArray<z.ZodString>>;
68
+ sourceFamilies: z.ZodDefault<z.ZodArray<z.ZodString>>;
69
+ notes: z.ZodDefault<z.ZodNullable<z.ZodString>>;
70
+ }, z.core.$strict>>>;
71
+ projectRef: z.ZodString;
72
+ revisionId: z.ZodString;
73
+ revisionRef: z.ZodString;
74
+ }, z.core.$strict>;
75
+ export declare const projectIntentPointerSchema: z.ZodObject<{
76
+ schemaVersion: z.ZodLiteral<1>;
77
+ projectKey: z.ZodString;
78
+ tenantId: z.ZodString;
79
+ projectRef: z.ZodString;
80
+ revisionId: z.ZodString;
81
+ revisionRef: z.ZodString;
82
+ manifestRelativePath: z.ZodString;
83
+ updatedAt: z.ZodISODateTime;
84
+ }, z.core.$strict>;
85
+ export declare const collectionRefreshSchema: z.ZodDiscriminatedUnion<[z.ZodObject<{
86
+ mode: z.ZodLiteral<"MANUAL">;
87
+ }, z.core.$strict>, z.ZodObject<{
88
+ mode: z.ZodLiteral<"INTERVAL">;
89
+ intervalSeconds: z.ZodNumber;
90
+ }, z.core.$strict>], "mode">;
91
+ export declare const acquisitionTargetSchema: z.ZodDiscriminatedUnion<[z.ZodObject<{
92
+ kind: z.ZodLiteral<"URL">;
93
+ locator: z.ZodURL;
94
+ }, z.core.$strict>, z.ZodObject<{
95
+ kind: z.ZodLiteral<"FILE">;
96
+ rootBinding: z.ZodString;
97
+ relativePath: z.ZodString;
98
+ }, z.core.$strict>, z.ZodObject<{
99
+ kind: z.ZodLiteral<"EXECUTOR">;
100
+ executorId: z.ZodString;
101
+ bindingRef: z.ZodDefault<z.ZodNullable<z.ZodString>>;
102
+ parameters: z.ZodDefault<z.ZodRecord<z.ZodString, z.ZodUnion<readonly [z.ZodUnion<readonly [z.ZodString, z.ZodNumber, z.ZodBoolean, z.ZodNull]>, z.ZodArray<z.ZodUnion<readonly [z.ZodString, z.ZodNumber, z.ZodBoolean, z.ZodNull]>>]>>>;
103
+ }, z.core.$strict>], "kind">;
104
+ export declare const projectSourceBasisSchema: z.ZodObject<{
105
+ schemaVersion: z.ZodLiteral<1>;
106
+ projectKey: z.ZodString;
107
+ actor: z.ZodObject<{
108
+ tenantId: z.ZodString;
109
+ userId: z.ZodString;
110
+ agentId: z.ZodDefault<z.ZodNullable<z.ZodString>>;
111
+ }, z.core.$strict>;
112
+ target: z.ZodDiscriminatedUnion<[z.ZodObject<{
113
+ kind: z.ZodLiteral<"URL">;
114
+ locator: z.ZodURL;
115
+ }, z.core.$strict>, z.ZodObject<{
116
+ kind: z.ZodLiteral<"FILE">;
117
+ rootBinding: z.ZodString;
118
+ relativePath: z.ZodString;
119
+ }, z.core.$strict>, z.ZodObject<{
120
+ kind: z.ZodLiteral<"EXECUTOR">;
121
+ executorId: z.ZodString;
122
+ bindingRef: z.ZodDefault<z.ZodNullable<z.ZodString>>;
123
+ parameters: z.ZodDefault<z.ZodRecord<z.ZodString, z.ZodUnion<readonly [z.ZodUnion<readonly [z.ZodString, z.ZodNumber, z.ZodBoolean, z.ZodNull]>, z.ZodArray<z.ZodUnion<readonly [z.ZodString, z.ZodNumber, z.ZodBoolean, z.ZodNull]>>]>>>;
124
+ }, z.core.$strict>], "kind">;
125
+ enabled: z.ZodDefault<z.ZodBoolean>;
126
+ access: z.ZodDefault<z.ZodEnum<{
127
+ PUBLIC: "PUBLIC";
128
+ PUBLIC_METADATA: "PUBLIC_METADATA";
129
+ TENANT: "TENANT";
130
+ INTERNAL: "INTERNAL";
131
+ FDE_INTERNAL: "FDE_INTERNAL";
132
+ ACCESS_CONTROLLED: "ACCESS_CONTROLLED";
133
+ UNKNOWN: "UNKNOWN";
134
+ }>>;
135
+ scopeIds: z.ZodDefault<z.ZodArray<z.ZodString>>;
136
+ sourceFamilies: z.ZodDefault<z.ZodArray<z.ZodString>>;
137
+ purpose: z.ZodDefault<z.ZodNullable<z.ZodString>>;
138
+ refresh: z.ZodDefault<z.ZodDiscriminatedUnion<[z.ZodObject<{
139
+ mode: z.ZodLiteral<"MANUAL">;
140
+ }, z.core.$strict>, z.ZodObject<{
141
+ mode: z.ZodLiteral<"INTERVAL">;
142
+ intervalSeconds: z.ZodNumber;
143
+ }, z.core.$strict>], "mode">>;
144
+ metadata: z.ZodDefault<z.ZodRecord<z.ZodString, z.ZodUnion<readonly [z.ZodString, z.ZodNumber, z.ZodBoolean, z.ZodNull]>>>;
145
+ }, z.core.$strict>;
146
+ export declare const projectSourceSnapshotSchema: z.ZodObject<{
147
+ schemaVersion: z.ZodLiteral<1>;
148
+ projectKey: z.ZodString;
149
+ actor: z.ZodObject<{
150
+ tenantId: z.ZodString;
151
+ userId: z.ZodString;
152
+ agentId: z.ZodDefault<z.ZodNullable<z.ZodString>>;
153
+ }, z.core.$strict>;
154
+ target: z.ZodDiscriminatedUnion<[z.ZodObject<{
155
+ kind: z.ZodLiteral<"URL">;
156
+ locator: z.ZodURL;
157
+ }, z.core.$strict>, z.ZodObject<{
158
+ kind: z.ZodLiteral<"FILE">;
159
+ rootBinding: z.ZodString;
160
+ relativePath: z.ZodString;
161
+ }, z.core.$strict>, z.ZodObject<{
162
+ kind: z.ZodLiteral<"EXECUTOR">;
163
+ executorId: z.ZodString;
164
+ bindingRef: z.ZodDefault<z.ZodNullable<z.ZodString>>;
165
+ parameters: z.ZodDefault<z.ZodRecord<z.ZodString, z.ZodUnion<readonly [z.ZodUnion<readonly [z.ZodString, z.ZodNumber, z.ZodBoolean, z.ZodNull]>, z.ZodArray<z.ZodUnion<readonly [z.ZodString, z.ZodNumber, z.ZodBoolean, z.ZodNull]>>]>>>;
166
+ }, z.core.$strict>], "kind">;
167
+ enabled: z.ZodDefault<z.ZodBoolean>;
168
+ access: z.ZodDefault<z.ZodEnum<{
169
+ PUBLIC: "PUBLIC";
170
+ PUBLIC_METADATA: "PUBLIC_METADATA";
171
+ TENANT: "TENANT";
172
+ INTERNAL: "INTERNAL";
173
+ FDE_INTERNAL: "FDE_INTERNAL";
174
+ ACCESS_CONTROLLED: "ACCESS_CONTROLLED";
175
+ UNKNOWN: "UNKNOWN";
176
+ }>>;
177
+ scopeIds: z.ZodDefault<z.ZodArray<z.ZodString>>;
178
+ sourceFamilies: z.ZodDefault<z.ZodArray<z.ZodString>>;
179
+ purpose: z.ZodDefault<z.ZodNullable<z.ZodString>>;
180
+ refresh: z.ZodDefault<z.ZodDiscriminatedUnion<[z.ZodObject<{
181
+ mode: z.ZodLiteral<"MANUAL">;
182
+ }, z.core.$strict>, z.ZodObject<{
183
+ mode: z.ZodLiteral<"INTERVAL">;
184
+ intervalSeconds: z.ZodNumber;
185
+ }, z.core.$strict>], "mode">>;
186
+ metadata: z.ZodDefault<z.ZodRecord<z.ZodString, z.ZodUnion<readonly [z.ZodString, z.ZodNumber, z.ZodBoolean, z.ZodNull]>>>;
187
+ projectRef: z.ZodString;
188
+ projectIntentRef: z.ZodDefault<z.ZodNullable<z.ZodString>>;
189
+ targetId: z.ZodString;
190
+ sourceId: z.ZodString;
191
+ revisionId: z.ZodString;
192
+ sourceRef: z.ZodString;
193
+ revisionRef: z.ZodString;
194
+ }, z.core.$strict>;
195
+ export declare const projectSourcePointerSchema: z.ZodObject<{
196
+ schemaVersion: z.ZodLiteral<1>;
197
+ projectKey: z.ZodString;
198
+ projectRef: z.ZodString;
199
+ projectIntentRef: z.ZodNullable<z.ZodString>;
200
+ sourceId: z.ZodString;
201
+ targetId: z.ZodString;
202
+ sourceRef: z.ZodString;
203
+ revisionId: z.ZodString;
204
+ revisionRef: z.ZodString;
205
+ manifestRelativePath: z.ZodString;
206
+ updatedAt: z.ZodISODateTime;
207
+ }, z.core.$strict>;
208
+ export type KnowledgeActorContext = z.infer<typeof knowledgeActorContextSchema>;
209
+ export type ProjectIntentScope = z.infer<typeof projectIntentScopeSchema>;
210
+ export type ProjectIdentity = z.infer<typeof projectIdentitySchema>;
211
+ export type ProjectIntentBasis = z.infer<typeof projectIntentBasisSchema>;
212
+ export type ProjectIntentSnapshot = z.infer<typeof projectIntentSnapshotSchema>;
213
+ export type ProjectIntentPointer = z.infer<typeof projectIntentPointerSchema>;
214
+ export type CollectionRefresh = z.infer<typeof collectionRefreshSchema>;
215
+ export type AcquisitionTarget = z.infer<typeof acquisitionTargetSchema>;
216
+ export type ProjectSourceBasis = z.infer<typeof projectSourceBasisSchema>;
217
+ export type ProjectSourceSnapshot = z.infer<typeof projectSourceSnapshotSchema>;
218
+ export type ProjectSourcePointer = z.infer<typeof projectSourcePointerSchema>;
@@ -0,0 +1,121 @@
1
+ import { z } from 'zod';
2
+ import { accessClassificationSchema, idSchema, isoDateTimeSchema, projectKeySchema, schemaVersionSchema, sha256Schema, stableUriSchema, } from './common.js';
3
+ const text = (max) => z.string().trim().min(1).max(max);
4
+ const optionalText = (max) => z.string().trim().min(1).max(max).nullable().default(null);
5
+ /**
6
+ * Attribution for an Agent-native Knowledge write. This is provenance, not an
7
+ * authorization decision. agentId is deliberately nullable because humans,
8
+ * schedulers and migrations may write without an Agent identity.
9
+ */
10
+ export const knowledgeActorContextSchema = z.object({
11
+ tenantId: idSchema,
12
+ userId: idSchema,
13
+ agentId: idSchema.nullable().default(null),
14
+ }).strict();
15
+ export const projectIntentScopeSchema = z.object({
16
+ scopeId: idSchema,
17
+ title: text(256),
18
+ description: text(4000),
19
+ sourceRequirements: z.array(text(1000)).max(256).default([]),
20
+ sourceFamilies: z.array(idSchema).max(256).default([]),
21
+ notes: optionalText(4000),
22
+ }).strict();
23
+ export const projectIdentitySchema = z.object({
24
+ name: text(256),
25
+ summary: text(4000),
26
+ domains: z.array(text(256)).max(256).default([]),
27
+ notes: optionalText(4000),
28
+ }).strict();
29
+ export const projectIntentBasisSchema = z.object({
30
+ schemaVersion: schemaVersionSchema,
31
+ projectKey: projectKeySchema,
32
+ actor: knowledgeActorContextSchema,
33
+ projectIdentity: projectIdentitySchema,
34
+ scopes: z.array(projectIntentScopeSchema).max(1000).default([]),
35
+ }).strict().superRefine((value, ctx) => {
36
+ const seen = new Set();
37
+ for (let i = 0; i < value.scopes.length; i += 1) {
38
+ const scopeId = value.scopes[i].scopeId;
39
+ if (seen.has(scopeId))
40
+ ctx.addIssue({ code: 'custom', path: ['scopes', i, 'scopeId'], message: 'scopeId must be unique' });
41
+ seen.add(scopeId);
42
+ }
43
+ });
44
+ export const projectIntentSnapshotSchema = projectIntentBasisSchema.extend({
45
+ projectRef: stableUriSchema,
46
+ revisionId: sha256Schema,
47
+ revisionRef: stableUriSchema,
48
+ }).strict();
49
+ export const projectIntentPointerSchema = z.object({
50
+ schemaVersion: schemaVersionSchema,
51
+ projectKey: projectKeySchema,
52
+ tenantId: idSchema,
53
+ projectRef: stableUriSchema,
54
+ revisionId: sha256Schema,
55
+ revisionRef: stableUriSchema,
56
+ manifestRelativePath: text(2048),
57
+ updatedAt: isoDateTimeSchema,
58
+ }).strict();
59
+ export const collectionRefreshSchema = z.discriminatedUnion('mode', [
60
+ z.object({ mode: z.literal('MANUAL') }).strict(),
61
+ z.object({ mode: z.literal('INTERVAL'), intervalSeconds: z.number().int().min(60).max(31_536_000) }).strict(),
62
+ ]);
63
+ /** Project-neutral executable target. Project/domain semantics stay on ProjectSource. */
64
+ const relativeTargetPathSchema = z.string().trim().min(1).max(2048).superRefine((value, ctx) => {
65
+ if (value.includes('\\') || value.startsWith('/') || value.endsWith('/')) {
66
+ ctx.addIssue({ code: 'custom', message: 'FILE target path must be a normalized relative file path' });
67
+ return;
68
+ }
69
+ const parts = value.split('/');
70
+ if (parts.some((part) => !part || part === '.' || part === '..'))
71
+ ctx.addIssue({ code: 'custom', message: 'FILE target path must not contain empty, dot or parent segments' });
72
+ });
73
+ const executorParameterScalarSchema = z.union([z.string().max(4000), z.number().finite(), z.boolean(), z.null()]);
74
+ const executorParameterValueSchema = z.union([executorParameterScalarSchema, z.array(executorParameterScalarSchema).max(256)]);
75
+ const urlAcquisitionTargetSchema = z.object({ kind: z.literal('URL'), locator: z.url() }).strict();
76
+ const fileAcquisitionTargetSchema = z.object({ kind: z.literal('FILE'), rootBinding: projectKeySchema, relativePath: relativeTargetPathSchema }).strict();
77
+ const executorAcquisitionTargetSchema = z.object({
78
+ kind: z.literal('EXECUTOR'), executorId: idSchema, bindingRef: stableUriSchema.nullable().default(null), parameters: z.record(z.string().trim().min(1).max(128), executorParameterValueSchema).default({}),
79
+ }).strict().superRefine((value, ctx) => {
80
+ if (Object.keys(value.parameters).length > 128)
81
+ ctx.addIssue({ code: 'custom', path: ['parameters'], message: 'EXECUTOR target supports at most 128 parameters' });
82
+ if (Buffer.byteLength(JSON.stringify(value.parameters), 'utf8') > 32 * 1024)
83
+ ctx.addIssue({ code: 'custom', path: ['parameters'], message: 'EXECUTOR target parameters exceed 32 KiB' });
84
+ });
85
+ export const acquisitionTargetSchema = z.discriminatedUnion('kind', [urlAcquisitionTargetSchema, fileAcquisitionTargetSchema, executorAcquisitionTargetSchema]);
86
+ const metadataScalarSchema = z.union([z.string().max(4000), z.number(), z.boolean(), z.null()]);
87
+ export const projectSourceBasisSchema = z.object({
88
+ schemaVersion: schemaVersionSchema,
89
+ projectKey: projectKeySchema,
90
+ actor: knowledgeActorContextSchema,
91
+ target: acquisitionTargetSchema,
92
+ enabled: z.boolean().default(true),
93
+ access: accessClassificationSchema.default('PUBLIC'),
94
+ scopeIds: z.array(idSchema).max(256).default([]),
95
+ sourceFamilies: z.array(idSchema).max(256).default([]),
96
+ purpose: optionalText(4000),
97
+ refresh: collectionRefreshSchema.default({ mode: 'MANUAL' }),
98
+ metadata: z.record(z.string().trim().min(1).max(128), metadataScalarSchema).default({}),
99
+ }).strict();
100
+ export const projectSourceSnapshotSchema = projectSourceBasisSchema.extend({
101
+ projectRef: stableUriSchema,
102
+ projectIntentRef: stableUriSchema.nullable().default(null),
103
+ targetId: sha256Schema,
104
+ sourceId: idSchema,
105
+ revisionId: sha256Schema,
106
+ sourceRef: stableUriSchema,
107
+ revisionRef: stableUriSchema,
108
+ }).strict();
109
+ export const projectSourcePointerSchema = z.object({
110
+ schemaVersion: schemaVersionSchema,
111
+ projectKey: projectKeySchema,
112
+ projectRef: stableUriSchema,
113
+ projectIntentRef: stableUriSchema.nullable(),
114
+ sourceId: idSchema,
115
+ targetId: sha256Schema,
116
+ sourceRef: stableUriSchema,
117
+ revisionId: sha256Schema,
118
+ revisionRef: stableUriSchema,
119
+ manifestRelativePath: text(2048),
120
+ updatedAt: isoDateTimeSchema,
121
+ }).strict();