@aikdna/kdna-core 0.18.0 → 0.19.0

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 (44) hide show
  1. package/CHANGELOG.md +128 -94
  2. package/README.md +109 -215
  3. package/package.json +7 -2
  4. package/schema/agent-host-capabilities.schema.json +62 -0
  5. package/schema/agent-host-receipt.schema.json +371 -0
  6. package/schema/agent-host-request.schema.json +223 -0
  7. package/schema/{bundle-profile-v1.schema.json → bundle-profile.schema.json} +9 -5
  8. package/schema/checksums.schema.json +8 -8
  9. package/schema/consumption-plan.schema.json +428 -0
  10. package/schema/digest-evidence.schema.json +115 -26
  11. package/schema/{kdna-envelope-external-grant-v1.schema.json → external-grant-envelope.schema.json} +17 -4
  12. package/schema/{kdna-key-grant-v1.schema.json → external-key-grant.schema.json} +39 -7
  13. package/schema/judgment-trace.schema.json +1251 -0
  14. package/schema/load-plan.schema.json +5 -3
  15. package/schema/manifest.schema.json +70 -10
  16. package/schema/{payload-profile-v1.schema.json → payload-profile.schema.json} +30 -6
  17. package/schema/{runtime-capsule-2.schema.json → runtime-capsule.schema.json} +7 -31
  18. package/src/asset-reader.js +8 -2
  19. package/src/{v1 → container}/index.js +385 -198
  20. package/src/container/index.mjs +20 -0
  21. package/src/container-dispatcher.js +6 -6
  22. package/src/crypto-profile.js +37 -107
  23. package/src/external-key-grant.js +41 -15
  24. package/src/index.js +11 -8
  25. package/src/index.mjs +49 -45
  26. package/src/loader-compatibility.js +59 -0
  27. package/src/loader.js +1 -1
  28. package/src/public-api.js +5 -5
  29. package/src/remote-runtime.d.ts +13 -0
  30. package/src/remote-runtime.js +27 -0
  31. package/src/remote-runtime.mjs +3 -0
  32. package/src/runtime-api.js +5 -5
  33. package/src/{capsule-v2.js → runtime-capsule.js} +96 -254
  34. package/src/{execution-contract-v1.js → runtime-contract.js} +184 -152
  35. package/src/types.d.ts +200 -277
  36. package/src/workpack-pure.js +1 -1
  37. package/schema/agent-host-2-receipt.schema.json +0 -206
  38. package/schema/agent-host-2-request.schema.json +0 -135
  39. package/schema/agent-host-capabilities-1.schema.json +0 -40
  40. package/schema/consumption-plan-1.schema.json +0 -280
  41. package/schema/judgment-trace-1.schema.json +0 -748
  42. package/schema/runtime-capsule-1.schema.json +0 -68
  43. package/src/lint-pure.js +0 -433
  44. package/src/v1/index.mjs +0 -21
@@ -1,68 +0,0 @@
1
- {
2
- "$schema": "https://json-schema.org/draft/2020-12/schema",
3
- "$id": "https://github.com/aikdna/kdna/specs/runtime-capsule-1.schema.json",
4
- "title": "KDNA Runtime Capsule 1",
5
- "description": "Frozen compatibility schema. The historical asset_digest member means E (kdna-runtime-entry-set-v1), never the final container digest A.",
6
- "type": "object",
7
- "required": [
8
- "type",
9
- "version",
10
- "domain",
11
- "judgment_version",
12
- "asset_digest",
13
- "signature",
14
- "access",
15
- "risk_level",
16
- "profile",
17
- "context",
18
- "trace"
19
- ],
20
- "additionalProperties": true,
21
- "properties": {
22
- "type": { "const": "kdna.context.capsule" },
23
- "version": { "const": "1.0" },
24
- "domain": { "type": ["string", "null"] },
25
- "judgment_version": { "type": ["string", "null"] },
26
- "asset_digest": {
27
- "description": "Frozen Capsule 1 name for the runtime entry-set digest E.",
28
- "oneOf": [{ "type": "string", "pattern": "^sha256:[0-9a-f]{64}$" }, { "type": "null" }]
29
- },
30
- "signature": { "$ref": "#/$defs/signature" },
31
- "access": { "type": "string" },
32
- "risk_level": { "type": ["string", "null"] },
33
- "profile": { "enum": ["index", "compact", "scenario", "full"] },
34
- "context": { "type": "object" },
35
- "trace": { "$ref": "#/$defs/trace" }
36
- },
37
- "$defs": {
38
- "signature": {
39
- "type": "object",
40
- "required": ["state"],
41
- "additionalProperties": false,
42
- "properties": {
43
- "state": { "enum": ["verified", "not_checked", "absent"] },
44
- "issuer": { "type": "string", "minLength": 1 }
45
- }
46
- },
47
- "trace": {
48
- "type": "object",
49
- "required": [
50
- "payload_encoding",
51
- "loaded_by",
52
- "loaded_at",
53
- "schema_valid",
54
- "signature_state",
55
- "profile"
56
- ],
57
- "additionalProperties": true,
58
- "properties": {
59
- "payload_encoding": { "const": "cbor" },
60
- "loaded_by": { "const": "kdna-core" },
61
- "loaded_at": { "type": "string", "format": "date-time" },
62
- "schema_valid": { "type": "boolean" },
63
- "signature_state": { "enum": ["verified", "not_checked", "absent"] },
64
- "profile": { "enum": ["index", "compact", "scenario", "full"] }
65
- }
66
- }
67
- }
68
- }
package/src/lint-pure.js DELETED
@@ -1,433 +0,0 @@
1
- /**
2
- * KDNA Lint — Pure structural and content validation.
3
- *
4
- * Operates on in-memory data maps. No fs, no path, no Node.js dependencies.
5
- * Input: { 'KDNA_Core.json': parsedObj, 'KDNA_Patterns.json': parsedObj, ... }
6
- * Output: { errors: string[], warnings: string[] }
7
- */
8
-
9
- /**
10
- * Map of old/informal field names → correct v0.4 spec field names.
11
- * Used to give helpful error messages when users write from scratch without the template.
12
- */
13
- const OLD_FIELD_HINTS = {
14
- statement: 'one_sentence or full_statement',
15
- description: 'one_sentence',
16
- summary: 'one_sentence',
17
- claim: 'wrong',
18
- misreading: 'wrong',
19
- reality: 'correct',
20
- definition: 'essence or one_sentence (on ontology entries)',
21
- brief: 'title or context',
22
- bad_pattern: 'what_happened',
23
- master_pattern: 'structural_pattern',
24
- conclusion: 'one_sentence',
25
- capability_layers: 'stages',
26
- name: 'id (on ontology entries — use id instead of name)',
27
- input: 'from',
28
- output: 'to',
29
- judgment: 'via',
30
- };
31
-
32
- const KDNA_DOMAIN_FILES = new Set([
33
- 'KDNA_Core.json',
34
- 'KDNA_Patterns.json',
35
- 'KDNA_Scenarios.json',
36
- 'KDNA_Cases.json',
37
- 'KDNA_Reasoning.json',
38
- 'KDNA_Evolution.json',
39
- ]);
40
-
41
- /**
42
- * Lint a KDNA domain from a map of parsed JSON objects.
43
- *
44
- * @param {Object} dataMap — keyed by filename, e.g. { 'KDNA_Core.json': {...}, ... }
45
- * @returns {{ errors: string[], warnings: string[] }}
46
- */
47
- function lintDomain(dataMap) {
48
- const errors = [];
49
- const warnings = [];
50
-
51
- function has(o, k) {
52
- return Object.prototype.hasOwnProperty.call(o || {}, k);
53
- }
54
-
55
- function req(o, k, loc, hint) {
56
- if (!has(o, k) || o[k] === '' || o[k] == null) {
57
- let msg = `${loc}: missing required field "${k}"`;
58
- // Check for common old field name and suggest the correct one
59
- if (o && typeof o === 'object') {
60
- for (const [oldName, newName] of Object.entries(OLD_FIELD_HINTS)) {
61
- if (has(o, oldName)) {
62
- msg += `\n → Found field "${oldName}" — this looks like an old/informal field name. Use "${newName}" instead.`;
63
- break;
64
- }
65
- }
66
- }
67
- if (hint) msg += `\n → ${hint}`;
68
- errors.push(msg);
69
- }
70
- }
71
-
72
- function meta(o, file) {
73
- req(o, 'meta', file);
74
- if (!o.meta) return;
75
- ['version', 'domain', 'created', 'purpose', 'load_condition'].forEach((f) =>
76
- req(o.meta, f, `${file}.meta`),
77
- );
78
- }
79
-
80
- function ids(v, file, set) {
81
- if (Array.isArray(v)) return v.forEach((x) => ids(x, file, set));
82
- if (v && typeof v === 'object') {
83
- if (typeof v.id === 'string') {
84
- if (set.has(v.id)) errors.push(`${file}: duplicate id "${v.id}"`);
85
- set.add(v.id);
86
- }
87
- Object.values(v).forEach((x) => ids(x, file, set));
88
- }
89
- }
90
-
91
- function yesno(s, loc) {
92
- const t = String(s || '')
93
- .trim()
94
- .toLowerCase();
95
- const cn = String(s || '').trim();
96
- if (
97
- t.endsWith('?') ||
98
- cn.endsWith('?') ||
99
- cn.endsWith('吗') ||
100
- cn.includes('是否') ||
101
- /^(have|has|can|does|do|is|are|did|was|were|should|will|would|could|might|能不能|会不会|有没有|要不要|是不是)/.test(t)
102
- )
103
- return;
104
- warnings.push(
105
- `${loc}: self_check should be answerable with yes/no\n → Try: "Did the response [do X specific domain check]?"`,
106
- );
107
- }
108
-
109
- // Check required files
110
- const requiredFiles = ['KDNA_Core.json', 'KDNA_Patterns.json'];
111
- for (const f of requiredFiles) {
112
- if (!dataMap[f]) errors.push(`Missing required file: ${f}`);
113
- }
114
-
115
- // Check file count
116
- const kdnaFiles = Object.keys(dataMap).filter((f) => KDNA_DOMAIN_FILES.has(f));
117
- if (kdnaFiles.length > 6) errors.push(`Domain has ${kdnaFiles.length} JSON files; KDNA allows at most 6.`);
118
-
119
- // Validate meta on all files
120
- for (const f of kdnaFiles) {
121
- if (dataMap[f]) meta(dataMap[f], f);
122
- }
123
-
124
- // Check duplicate IDs
125
- const seen = new Set();
126
- for (const f of kdnaFiles) {
127
- if (dataMap[f]) ids(dataMap[f], f, seen);
128
- }
129
-
130
- // Validate KDNA_Core.json
131
- const core = dataMap['KDNA_Core.json'];
132
- if (core) {
133
- ['axioms', 'ontology', 'frameworks', 'core_structure', 'stances'].forEach((f) =>
134
- req(core, f, 'KDNA_Core.json'),
135
- );
136
- (core.axioms || []).forEach((a, i) =>
137
- [
138
- ['id', 'Unique identifier like "AX-001". See SPEC.md §5.2'],
139
- [
140
- 'one_sentence',
141
- 'One-sentence judgment principle. Must be specific enough to change agent behavior. See docs/authoring-guide.md',
142
- ],
143
- [
144
- 'full_statement',
145
- 'Full explanation of the axiom — testable and domain-specific. See SPEC.md §5.2',
146
- ],
147
- ['why', 'What the agent would get wrong WITHOUT this axiom. See SPEC.md §5.2'],
148
- ].forEach(([f, hint]) => req(a, f, `KDNA_Core.json.axioms[${i}]`, hint)),
149
- );
150
- (core.ontology || []).forEach((c, i) =>
151
- [
152
- ['id', 'Unique identifier like "CON-001". See SPEC.md §5.3'],
153
- ['one_sentence', 'Name one central concept the agent must distinguish.'],
154
- [
155
- 'essence',
156
- 'Operational meaning in this domain — not a dictionary definition. See docs/authoring-guide.md',
157
- ],
158
- [
159
- 'boundary',
160
- 'What this concept is NOT. Name a specific concept it is often confused with. See docs/authoring-guide.md',
161
- ],
162
- [
163
- 'trigger_signal',
164
- 'Observable words or patterns that signal this concept is relevant. See SPEC.md §5.3',
165
- ],
166
- ].forEach(([f, hint]) => req(c, f, `KDNA_Core.json.ontology[${i}]`, hint)),
167
- );
168
- (core.frameworks || []).forEach((fw, i) =>
169
- [
170
- ['id', 'Unique identifier like "FW-001". See SPEC.md §5.4'],
171
- ['name', 'Descriptive name for this framework.'],
172
- ['when_to_use', 'Specific condition or context where this framework applies.'],
173
- [
174
- 'steps',
175
- 'Array of actionable steps. Each step should tell the agent what to do. See SPEC.md §5.4',
176
- ],
177
- ].forEach(([f, hint]) => req(fw, f, `KDNA_Core.json.frameworks[${i}]`, hint)),
178
- );
179
- }
180
-
181
- // Validate KDNA_Patterns.json
182
- const pat = dataMap['KDNA_Patterns.json'];
183
- if (pat) {
184
- ['terminology', 'misunderstandings', 'self_check'].forEach((f) =>
185
- req(pat, f, 'KDNA_Patterns.json'),
186
- );
187
- ((pat.terminology || {}).banned_terms || []).forEach((b, i) =>
188
- ['term', 'why', 'replace_with'].forEach((f) =>
189
- req(b, f, `KDNA_Patterns.json.terminology.banned_terms[${i}]`),
190
- ),
191
- );
192
- (pat.misunderstandings || []).forEach((m, i) =>
193
- [
194
- ['id', 'Unique identifier like "MS-001". See SPEC.md §6.3'],
195
- [
196
- 'wrong',
197
- 'Common wrong interpretation an agent without domain cognition would make. See docs/authoring-guide.md',
198
- ],
199
- ['correct', 'Correct interpretation according to domain principles. See SPEC.md §6.3'],
200
- [
201
- 'key_distinction',
202
- 'The specific conceptual boundary the agent must preserve. See SPEC.md §6.3',
203
- ],
204
- ['why', 'What bad judgment results from the wrong interpretation. See SPEC.md §6.3'],
205
- ].forEach(([f, hint]) => req(m, f, `KDNA_Patterns.json.misunderstandings[${i}]`, hint)),
206
- );
207
- (pat.self_check || []).forEach((s, i) => yesno(s, `KDNA_Patterns.json.self_check[${i}]`));
208
- }
209
-
210
- // Anti-vagueness: axioms must be domain-specific, not generic platitudes
211
- if (core && Array.isArray(core.axioms)) {
212
- const vaguePhrases = [
213
- 'be helpful', 'be professional', 'be accurate', 'best practices',
214
- 'user-centric', 'customer-focused', 'excellence', 'innovation',
215
- '以人为本', '用户至上', '最佳实践', '卓越',
216
- ];
217
- core.axioms.forEach((a, i) => {
218
- const text = ((a.one_sentence || '') + ' ' + (a.full_statement || '')).toLowerCase();
219
- vaguePhrases.forEach((phrase) => {
220
- if (text.includes(phrase)) {
221
- warnings.push(
222
- `KDNA_Core.json.axioms[${i}]: axiom contains vague phrase "${phrase}" — axioms must be testable and domain-specific, not generic platitudes`,
223
- );
224
- }
225
- });
226
- });
227
- }
228
-
229
- // Validate KDNA_Reasoning.json
230
- const rea = dataMap['KDNA_Reasoning.json'];
231
- if (rea) {
232
- (rea.reasoning_chains || []).forEach((r, i) =>
233
- ['id', 'one_sentence', 'logic', 'so_what'].forEach((f) =>
234
- req(r, f, `KDNA_Reasoning.json.reasoning_chains[${i}]`),
235
- ),
236
- );
237
- }
238
-
239
- // Cross-reference: scene_id in cases
240
- const scen = dataMap['KDNA_Scenarios.json'];
241
- const sceneIds = new Set();
242
- if (scen) (scen.scenes || []).forEach((s) => sceneIds.add(s.id));
243
- const cases = dataMap['KDNA_Cases.json'];
244
- if (cases && scen)
245
- (cases.cases || []).forEach((c, i) => {
246
- if (c.scene_id && !sceneIds.has(c.scene_id))
247
- errors.push(
248
- `KDNA_Cases.json.cases[${i}]: scene_id "${c.scene_id}" not found in KDNA_Scenarios.json`,
249
- );
250
- });
251
-
252
- return { errors, warnings };
253
- }
254
-
255
- /**
256
- * Legacy authoring-source enum tables for migration validation.
257
- * These do not define the current Runtime manifest contract.
258
- */
259
- const VALID_STATUS = new Set(['draft', 'experimental', 'stable', 'deprecated', 'staging']);
260
- const VALID_BADGE = new Set(['untested', 'tested', 'validated', 'expert_reviewed', 'production_ready']);
261
- const VALID_ACCESS = new Set(['public', 'licensed', 'remote']);
262
- const VALID_RISK = new Set(['R0', 'R1', 'R2', 'R3']);
263
- const VALID_I18N = new Set(['L0', 'L1', 'L2', 'L3']);
264
- const VALID_PRIVACY = new Set(['public', 'private', 'sensitive', 'regulated']);
265
- const VALID_ASSET_TYPE = new Set([
266
- 'domain_judgment',
267
- 'personal_judgment',
268
- 'organization_standard',
269
- 'team_policy',
270
- 'creator_style',
271
- 'risk_guard',
272
- 'bundle',
273
- ]);
274
-
275
- const MANIFEST_REQUIRED = [
276
- 'kdna_version', 'name', 'version',
277
- 'judgment_version', 'description', 'author', 'license', 'status',
278
- 'quality_badge', 'access', 'languages', 'default_language',
279
- ];
280
-
281
- /**
282
- * Validate a legacy authoring-source kdna.json manifest.
283
- *
284
- * This function is retained for explicit source migration. Current Runtime
285
- * containers are validated against schema/manifest.schema.json by v1.validate.
286
- *
287
- * @param {Object} manifest — parsed kdna.json
288
- * @returns {{ errors: string[], warnings: string[] }}
289
- */
290
- function validateManifest(manifest) {
291
- const errors = [];
292
- const warnings = [];
293
-
294
- if (!manifest || typeof manifest !== 'object') {
295
- errors.push('kdna.json: missing or empty manifest');
296
- return { errors, warnings };
297
- }
298
-
299
- // 1. Check disallowed pre-v1.0 manifest aliases
300
- if ('kdna_spec' in manifest) {
301
- errors.push(
302
- 'kdna.json: kdna_spec is not allowed. Use kdna_version.',
303
- );
304
- }
305
- if ('language' in manifest) {
306
- errors.push('kdna.json: language is not allowed. Use default_language and languages.');
307
- }
308
-
309
- // 2. Check required fields
310
- for (const field of MANIFEST_REQUIRED) {
311
- if (!(field in manifest) || manifest[field] === undefined || manifest[field] === '') {
312
- errors.push(`kdna.json: missing required field "${field}"`);
313
- }
314
- }
315
-
316
- // 3. Validate name format
317
- if (manifest.name && !/^@[a-z][a-z0-9-]*\/[a-z][a-z0-9_]*$/.test(manifest.name)) {
318
- errors.push(`kdna.json.name: invalid format "${manifest.name}". Expected @scope/name.`);
319
- }
320
-
321
- // 4. Validate enum fields
322
- if (manifest.format && manifest.format !== 'kdna') {
323
- errors.push(`kdna.json.format: invalid value "${manifest.format}". Expected "kdna".`);
324
- }
325
- if (!manifest.kdna_version) {
326
- errors.push('kdna.json: missing required field "kdna_version"');
327
- } else if (manifest.kdna_version !== '1.0') {
328
- errors.push(
329
- `kdna.json.kdna_version: invalid value "${manifest.kdna_version}". Expected "1.0".`,
330
- );
331
- }
332
- if (manifest.status && !VALID_STATUS.has(manifest.status)) {
333
- errors.push(
334
- `kdna.json.status: invalid value "${manifest.status}". ` +
335
- `Valid: ${[...VALID_STATUS].join(', ')}`,
336
- );
337
- }
338
- if (manifest.quality_badge && !VALID_BADGE.has(manifest.quality_badge)) {
339
- errors.push(
340
- `kdna.json.quality_badge: invalid value "${manifest.quality_badge}". ` +
341
- `Valid: ${[...VALID_BADGE].join(', ')}`,
342
- );
343
- }
344
- if (manifest.access && !VALID_ACCESS.has(manifest.access)) {
345
- errors.push(
346
- `kdna.json.access: invalid value "${manifest.access}". ` +
347
- `Valid: ${[...VALID_ACCESS].join(', ')}`,
348
- );
349
- }
350
- if (manifest.risk_level && !VALID_RISK.has(manifest.risk_level)) {
351
- errors.push(
352
- `kdna.json.risk_level: invalid value "${manifest.risk_level}". ` +
353
- `Valid: ${[...VALID_RISK].join(', ')}`,
354
- );
355
- }
356
- if (manifest.i18n_level && !VALID_I18N.has(manifest.i18n_level)) {
357
- warnings.push(
358
- `kdna.json.i18n_level: non-standard value "${manifest.i18n_level}". ` +
359
- `Valid: ${[...VALID_I18N].join(', ')}`,
360
- );
361
- }
362
- if (manifest.privacy_level && !VALID_PRIVACY.has(manifest.privacy_level)) {
363
- warnings.push(
364
- `kdna.json.privacy_level: non-standard value "${manifest.privacy_level}". ` +
365
- `Valid: ${[...VALID_PRIVACY].join(', ')}`,
366
- );
367
- }
368
- if (manifest.asset_type && !VALID_ASSET_TYPE.has(manifest.asset_type)) {
369
- warnings.push(
370
- `kdna.json.asset_type: non-standard value "${manifest.asset_type}". ` +
371
- `Valid: ${[...VALID_ASSET_TYPE].join(', ')}`,
372
- );
373
- }
374
-
375
- // 5. Deprecated status must have replaced_by
376
- if (manifest.status === 'deprecated' && !manifest.replaced_by) {
377
- errors.push('kdna.json: status is "deprecated" but replaced_by is missing');
378
- }
379
-
380
- // 6. Tested+ badge must have signature
381
- const needsSig = ['tested', 'validated', 'expert_reviewed', 'production_ready'];
382
- if (needsSig.includes(manifest.quality_badge) && !manifest.signature) {
383
- warnings.push(
384
- `kdna.json: quality_badge "${manifest.quality_badge}" should have a signature`,
385
- );
386
- }
387
-
388
- // 7. Validate author
389
- if (manifest.author) {
390
- if (!manifest.author.name) errors.push('kdna.json.author: missing "name"');
391
- if (!manifest.author.id) errors.push('kdna.json.author: missing "id"');
392
- if (manifest.author.pubkey && !/^ed25519:[0-9a-f]{64}$/.test(manifest.author.pubkey)) {
393
- warnings.push('kdna.json.author.pubkey: non-standard format. Expected ed25519:<64 hex chars>.');
394
- }
395
- }
396
-
397
- // 8. Validate license
398
- if (manifest.license && !manifest.license.type) {
399
- errors.push('kdna.json.license: missing "type"');
400
- }
401
-
402
- // 9. Validate version format
403
- if (manifest.version && !/^\d+\.\d+\.\d+/.test(manifest.version)) {
404
- warnings.push(
405
- `kdna.json.version: non-semver format "${manifest.version}". Expected MAJOR.MINOR.PATCH.`,
406
- );
407
- }
408
-
409
- // 11. Check for removed fields
410
- const removedFields = ['release_status', 'domain_field', 'judgment_patterns', 'files', 'registry'];
411
- for (const field of removedFields) {
412
- if (field in manifest) {
413
- warnings.push(
414
- `kdna.json: field "${field}" is not in the canonical domain manifest and should be removed`,
415
- );
416
- }
417
- }
418
-
419
- // 12. Check removed license sub-fields
420
- if (manifest.license && typeof manifest.license === 'object') {
421
- for (const field of ['commercial', 'allow_agent_use', 'allow_redistribution', 'allow_training']) {
422
- if (field in manifest.license) {
423
- warnings.push(
424
- `kdna.json.license.${field}: license-type-specific field, not universal. Consider removing.`,
425
- );
426
- }
427
- }
428
- }
429
-
430
- return { errors, warnings };
431
- }
432
-
433
- module.exports = { lintDomain, validateManifest };
package/src/v1/index.mjs DELETED
@@ -1,21 +0,0 @@
1
- import v1 from './index.js';
2
-
3
- export const MIMETYPE = v1.MIMETYPE;
4
- export const REQUIRED_DIR_ENTRIES = v1.REQUIRED_DIR_ENTRIES;
5
- export const isKdnaSourceDir = v1.isKdnaSourceDir;
6
- export const detectContainerFormat = v1.detectContainerFormat;
7
- export const readLayout = v1.readLayout;
8
- export const inspect = v1.inspect;
9
- export const validate = v1.validate;
10
- export const planLoad = v1.planLoad;
11
- export const loadAuthorized = v1.loadAuthorized;
12
- export const buildChecksums = v1.buildChecksums;
13
- export const computeRuntimeEntrySetDigest = v1.computeRuntimeEntrySetDigest;
14
- export const pack = v1.pack;
15
- export const unpack = v1.unpack;
16
- export const load = v1.load;
17
- export const loadAsset = v1.loadAsset;
18
- export const buildCapsule = v1.buildCapsule;
19
- export const FORBIDDEN_OUTPUT_TERMS = v1.FORBIDDEN_OUTPUT_TERMS;
20
-
21
- export default v1;