@feltdb/core 0.2.0 → 0.3.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 (95) hide show
  1. package/LICENSE +19 -0
  2. package/dist/analytics-backend.d.ts +39 -0
  3. package/dist/analytics-backend.d.ts.map +1 -0
  4. package/dist/analytics-backend.js +152 -0
  5. package/dist/application-contract.d.ts +49 -0
  6. package/dist/application-contract.d.ts.map +1 -0
  7. package/dist/application-contract.js +13 -0
  8. package/dist/application-manifest.d.ts +305 -0
  9. package/dist/application-manifest.d.ts.map +1 -0
  10. package/dist/application-manifest.js +26 -0
  11. package/dist/artifact.d.ts +73 -0
  12. package/dist/artifact.d.ts.map +1 -0
  13. package/dist/artifact.js +21 -0
  14. package/dist/authorization.d.ts +99 -0
  15. package/dist/authorization.d.ts.map +1 -0
  16. package/dist/authorization.js +15 -0
  17. package/dist/bundle.d.ts +55 -0
  18. package/dist/bundle.d.ts.map +1 -0
  19. package/dist/bundle.js +13 -0
  20. package/dist/collection.d.ts +28 -0
  21. package/dist/collection.d.ts.map +1 -1
  22. package/dist/collection.js +83 -0
  23. package/dist/db.d.ts +18 -0
  24. package/dist/db.d.ts.map +1 -1
  25. package/dist/db.js +20 -8
  26. package/dist/distributed-indexing.d.ts +170 -0
  27. package/dist/distributed-indexing.d.ts.map +1 -0
  28. package/dist/distributed-indexing.js +260 -0
  29. package/dist/flowspec.d.ts +4 -0
  30. package/dist/flowspec.d.ts.map +1 -1
  31. package/dist/flowspec.js +8 -0
  32. package/dist/http-client.d.ts +35 -0
  33. package/dist/http-client.d.ts.map +1 -0
  34. package/dist/http-client.js +70 -0
  35. package/dist/identity.d.ts +40 -0
  36. package/dist/identity.d.ts.map +1 -0
  37. package/dist/identity.js +10 -0
  38. package/dist/index-analytics.d.ts +121 -0
  39. package/dist/index-analytics.d.ts.map +1 -0
  40. package/dist/index-analytics.js +279 -0
  41. package/dist/index-backend.d.ts +26 -0
  42. package/dist/index-backend.d.ts.map +1 -0
  43. package/dist/index-backend.js +115 -0
  44. package/dist/index-dashboard.d.ts +114 -0
  45. package/dist/index-dashboard.d.ts.map +1 -0
  46. package/dist/index-dashboard.js +256 -0
  47. package/dist/index-manager.d.ts +18 -0
  48. package/dist/index-manager.d.ts.map +1 -0
  49. package/dist/index-manager.js +333 -0
  50. package/dist/index-monitoring.d.ts +133 -0
  51. package/dist/index-monitoring.d.ts.map +1 -0
  52. package/dist/index-monitoring.js +218 -0
  53. package/dist/index-recovery.d.ts +57 -0
  54. package/dist/index-recovery.d.ts.map +1 -0
  55. package/dist/index-recovery.js +117 -0
  56. package/dist/index-store.d.ts +62 -0
  57. package/dist/index-store.d.ts.map +1 -0
  58. package/dist/index-store.js +141 -0
  59. package/dist/index-types.d.ts +70 -0
  60. package/dist/index-types.d.ts.map +1 -0
  61. package/dist/index-types.js +6 -0
  62. package/dist/index.d.ts +26 -0
  63. package/dist/index.d.ts.map +1 -1
  64. package/dist/index.js +26 -0
  65. package/dist/observe.d.ts +51 -0
  66. package/dist/observe.d.ts.map +1 -0
  67. package/dist/observe.js +14 -0
  68. package/dist/protocol.d.ts +25 -0
  69. package/dist/protocol.d.ts.map +1 -0
  70. package/dist/protocol.js +18 -0
  71. package/dist/provider.d.ts +61 -0
  72. package/dist/provider.d.ts.map +1 -0
  73. package/dist/provider.js +17 -0
  74. package/dist/query-planner.d.ts +69 -0
  75. package/dist/query-planner.d.ts.map +1 -0
  76. package/dist/query-planner.js +184 -0
  77. package/dist/release.d.ts +60 -0
  78. package/dist/release.d.ts.map +1 -0
  79. package/dist/release.js +18 -0
  80. package/dist/sharding.d.ts +159 -0
  81. package/dist/sharding.d.ts.map +1 -0
  82. package/dist/sharding.js +317 -0
  83. package/dist/state-contract.d.ts +173 -0
  84. package/dist/state-contract.d.ts.map +1 -0
  85. package/dist/state-contract.js +24 -0
  86. package/dist/sync-contract.d.ts +101 -0
  87. package/dist/sync-contract.d.ts.map +1 -0
  88. package/dist/sync-contract.js +90 -0
  89. package/dist/worker.d.ts +90 -0
  90. package/dist/worker.d.ts.map +1 -0
  91. package/dist/worker.js +26 -0
  92. package/dist/workload.d.ts +102 -0
  93. package/dist/workload.d.ts.map +1 -0
  94. package/dist/workload.js +23 -0
  95. package/package.json +17 -5
package/LICENSE ADDED
@@ -0,0 +1,19 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 FeltDB Contributors
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE.
@@ -0,0 +1,39 @@
1
+ /**
2
+ * Analytics Backend - Dynamic Rust/WASM with TypeScript fallback
3
+ *
4
+ * Provides a unified interface to analytics with automatic fallback:
5
+ * - Primary: Rust-based implementation via WASM for performance
6
+ * - Fallback: Pure TypeScript implementation when WASM unavailable
7
+ */
8
+ export interface IAnalyticsBackend {
9
+ recordIndexUsage(index_name: string, operation: 'read' | 'write', time_ms: number): void;
10
+ recordQuery(fields: string[], operator: string, executionTimeMs: number, rowsScanned: number, resultCount: number, indexUsed?: string): void;
11
+ getIndexMetrics(index_name: string): any | null;
12
+ getAllMetrics(): any[];
13
+ getSlowestQueries(limit: number): any[];
14
+ getFrequentFields(limit: number): Array<[string, number]>;
15
+ generateReport(collectionName: string, period: string): any;
16
+ reset(): void;
17
+ }
18
+ /**
19
+ * Analytics backend selector with dynamic WASM loading
20
+ */
21
+ export declare class AnalyticsBackend implements IAnalyticsBackend {
22
+ private backend;
23
+ private wasmLoaded;
24
+ constructor();
25
+ private loadWasm;
26
+ recordIndexUsage(index_name: string, operation: 'read' | 'write', time_ms: number): void;
27
+ recordQuery(fields: string[], operator: string, executionTimeMs: number, rowsScanned: number, resultCount: number, indexUsed?: string): void;
28
+ getIndexMetrics(index_name: string): any | null;
29
+ getAllMetrics(): any[];
30
+ getSlowestQueries(limit: number): any[];
31
+ getFrequentFields(limit: number): Array<[string, number]>;
32
+ generateReport(collectionName: string, period: string): any;
33
+ reset(): void;
34
+ }
35
+ /**
36
+ * Create analytics instance - internal use only
37
+ */
38
+ export declare function createAnalyticsBackend(): IAnalyticsBackend;
39
+ //# sourceMappingURL=analytics-backend.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"analytics-backend.d.ts","sourceRoot":"","sources":["../src/analytics-backend.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAwBH,MAAM,WAAW,iBAAiB;IAChC,gBAAgB,CAAC,UAAU,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACzF,WAAW,CACT,MAAM,EAAE,MAAM,EAAE,EAChB,QAAQ,EAAE,MAAM,EAChB,eAAe,EAAE,MAAM,EACvB,WAAW,EAAE,MAAM,EACnB,WAAW,EAAE,MAAM,EACnB,SAAS,CAAC,EAAE,MAAM,GACjB,IAAI,CAAC;IACR,eAAe,CAAC,UAAU,EAAE,MAAM,GAAG,GAAG,GAAG,IAAI,CAAC;IAChD,aAAa,IAAI,GAAG,EAAE,CAAC;IACvB,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG,GAAG,EAAE,CAAC;IACxC,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG,KAAK,CAAC,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IAC1D,cAAc,CAAC,cAAc,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,GAAG,CAAC;IAC5D,KAAK,IAAI,IAAI,CAAC;CACf;AAED;;GAEG;AACH,qBAAa,gBAAiB,YAAW,iBAAiB;IACxD,OAAO,CAAC,OAAO,CAAoB;IACnC,OAAO,CAAC,UAAU,CAAS;;YAqBb,QAAQ;IAoBtB,gBAAgB,CAAC,UAAU,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI;IAIxF,WAAW,CACT,MAAM,EAAE,MAAM,EAAE,EAChB,QAAQ,EAAE,MAAM,EAChB,eAAe,EAAE,MAAM,EACvB,WAAW,EAAE,MAAM,EACnB,WAAW,EAAE,MAAM,EACnB,SAAS,CAAC,EAAE,MAAM,GACjB,IAAI;IAIP,eAAe,CAAC,UAAU,EAAE,MAAM,GAAG,GAAG,GAAG,IAAI;IAI/C,aAAa,IAAI,GAAG,EAAE;IAItB,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG,GAAG,EAAE;IAIvC,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG,KAAK,CAAC,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAIzD,cAAc,CAAC,cAAc,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,GAAG;IAI3D,KAAK,IAAI,IAAI;CAGd;AA0FD;;GAEG;AACH,wBAAgB,sBAAsB,IAAI,iBAAiB,CAE1D"}
@@ -0,0 +1,152 @@
1
+ /**
2
+ * Analytics Backend - Dynamic Rust/WASM with TypeScript fallback
3
+ *
4
+ * Provides a unified interface to analytics with automatic fallback:
5
+ * - Primary: Rust-based implementation via WASM for performance
6
+ * - Fallback: Pure TypeScript implementation when WASM unavailable
7
+ */
8
+ import { IndexAnalytics as TypeScriptIndexAnalytics } from './index-analytics.js';
9
+ /**
10
+ * Analytics backend selector with dynamic WASM loading
11
+ */
12
+ export class AnalyticsBackend {
13
+ constructor() {
14
+ this.wasmLoaded = false;
15
+ // Start with TypeScript backend, attempt WASM load async
16
+ // Create a wrapper that implements the interface
17
+ const tsBackend = new TypeScriptIndexAnalytics();
18
+ this.backend = {
19
+ recordIndexUsage: (name, op, time) => tsBackend.recordIndexUsage(name, op, time),
20
+ recordQuery: (fields, op, time, rows, count, index) => tsBackend.recordQuery(fields, op, time, rows, count, index),
21
+ getIndexMetrics: (name) => tsBackend.getIndexMetrics(name),
22
+ getAllMetrics: () => tsBackend.getAllMetrics(),
23
+ getSlowestQueries: (limit) => tsBackend.getSlowestQueries(limit),
24
+ getFrequentFields: (limit) => tsBackend.getFrequentFields(limit),
25
+ generateReport: (name, period) => tsBackend.generateReport(name, period),
26
+ reset: () => tsBackend.reset(),
27
+ };
28
+ this.loadWasm().catch(() => {
29
+ // Silently fail - TypeScript fallback is already in place
30
+ });
31
+ }
32
+ async loadWasm() {
33
+ if (this.wasmLoaded)
34
+ return;
35
+ try {
36
+ // Dynamic import of WASM module when available
37
+ // @ts-ignore - WASM module may not exist during development
38
+ const wasmModule = await import('@feltdb/wasm');
39
+ // Create WASM analytics instance
40
+ const wasmAnalytics = new wasmModule.WasmAnalytics();
41
+ // Replace backend with WASM implementation
42
+ this.backend = new WasmAnalyticsAdapter(wasmAnalytics);
43
+ this.wasmLoaded = true;
44
+ }
45
+ catch (error) {
46
+ // WASM unavailable, continue with TypeScript
47
+ // This is normal during development
48
+ }
49
+ }
50
+ recordIndexUsage(index_name, operation, time_ms) {
51
+ this.backend.recordIndexUsage(index_name, operation, time_ms);
52
+ }
53
+ recordQuery(fields, operator, executionTimeMs, rowsScanned, resultCount, indexUsed) {
54
+ this.backend.recordQuery(fields, operator, executionTimeMs, rowsScanned, resultCount, indexUsed);
55
+ }
56
+ getIndexMetrics(index_name) {
57
+ return this.backend.getIndexMetrics(index_name);
58
+ }
59
+ getAllMetrics() {
60
+ return this.backend.getAllMetrics();
61
+ }
62
+ getSlowestQueries(limit) {
63
+ return this.backend.getSlowestQueries(limit);
64
+ }
65
+ getFrequentFields(limit) {
66
+ return this.backend.getFrequentFields(limit);
67
+ }
68
+ generateReport(collectionName, period) {
69
+ return this.backend.generateReport(collectionName, period);
70
+ }
71
+ reset() {
72
+ this.backend.reset();
73
+ }
74
+ }
75
+ /**
76
+ * Adapter to bridge WASM analytics to TypeScript interface
77
+ */
78
+ class WasmAnalyticsAdapter {
79
+ constructor(wasm) {
80
+ this.wasm = wasm;
81
+ }
82
+ recordIndexUsage(index_name, operation, time_ms) {
83
+ this.wasm.record_index_usage(index_name, operation, time_ms);
84
+ }
85
+ recordQuery(fields, operator, executionTimeMs, rowsScanned, resultCount, indexUsed) {
86
+ this.wasm.record_query(JSON.stringify(fields), operator, executionTimeMs, BigInt(rowsScanned), BigInt(resultCount), indexUsed || null);
87
+ }
88
+ getIndexMetrics(index_name) {
89
+ try {
90
+ const json = this.wasm.get_index_metrics(index_name);
91
+ return JSON.parse(json);
92
+ }
93
+ catch {
94
+ return null;
95
+ }
96
+ }
97
+ getAllMetrics() {
98
+ try {
99
+ const json = this.wasm.get_all_metrics();
100
+ return JSON.parse(json);
101
+ }
102
+ catch {
103
+ return [];
104
+ }
105
+ }
106
+ getSlowestQueries(limit) {
107
+ try {
108
+ const json = this.wasm.get_slowest_queries(limit);
109
+ return JSON.parse(json);
110
+ }
111
+ catch {
112
+ return [];
113
+ }
114
+ }
115
+ getFrequentFields(limit) {
116
+ try {
117
+ const json = this.wasm.get_frequent_fields(limit);
118
+ return JSON.parse(json);
119
+ }
120
+ catch {
121
+ return [];
122
+ }
123
+ }
124
+ generateReport(collectionName, period) {
125
+ try {
126
+ const json = this.wasm.generate_report(collectionName, period);
127
+ return JSON.parse(json);
128
+ }
129
+ catch {
130
+ return {
131
+ collectionName,
132
+ period,
133
+ totalQueries: 0,
134
+ indexedQueries: 0,
135
+ fullScans: 0,
136
+ avgQueryTimeMs: 0,
137
+ indexMetrics: [],
138
+ recommendations: [],
139
+ timestamp: Date.now(),
140
+ };
141
+ }
142
+ }
143
+ reset() {
144
+ this.wasm.reset();
145
+ }
146
+ }
147
+ /**
148
+ * Create analytics instance - internal use only
149
+ */
150
+ export function createAnalyticsBackend() {
151
+ return new AnalyticsBackend();
152
+ }
@@ -0,0 +1,49 @@
1
+ export type ContractGapType = 'MISSING' | 'AMBIGUOUS' | 'CONTRADICTORY' | 'UNAUTHORIZED' | 'UNSUPPORTED' | 'UNVALIDATED' | 'DEPENDENCY_MISSING' | 'PROVIDER_MISSING';
2
+ export type ContractGap = {
3
+ contract_path: string;
4
+ gap_type: ContractGapType;
5
+ severity: string;
6
+ blocking: boolean;
7
+ confidence: number;
8
+ suggested_questions: string[];
9
+ affected_paths: string[];
10
+ };
11
+ export type ContractAssertion = {
12
+ value: unknown;
13
+ confidence: number;
14
+ evidence_refs: string[];
15
+ required: boolean;
16
+ validated: boolean;
17
+ };
18
+ export type ApplicationContract = {
19
+ contract_id: string;
20
+ application_id: string;
21
+ base_revision?: string;
22
+ contract_revision: number;
23
+ status: string;
24
+ assertions: Record<string, ContractAssertion>;
25
+ gaps: ContractGap[];
26
+ };
27
+ export type ContractReadiness = {
28
+ status: string;
29
+ readiness: number;
30
+ blocking_gaps: number;
31
+ gaps: ContractGap[];
32
+ confidence: Record<string, number>;
33
+ next_action: string;
34
+ };
35
+ export declare class ApplicationContractClient {
36
+ private request;
37
+ constructor(request: (path: string, init?: RequestInit) => Promise<any>);
38
+ get(id: string): Promise<ApplicationContract>;
39
+ evaluate(id: string, outcome: string): Promise<ApplicationContract>;
40
+ readiness(id: string): Promise<ContractReadiness>;
41
+ gaps(id: string): Promise<{
42
+ gaps: ContractGap[];
43
+ }>;
44
+ question(id: string): Promise<any>;
45
+ end(id: string): Promise<ApplicationContract>;
46
+ construct(id: string): Promise<any>;
47
+ patch(id: string, patch: unknown): Promise<ApplicationContract>;
48
+ }
49
+ //# sourceMappingURL=application-contract.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"application-contract.d.ts","sourceRoot":"","sources":["../src/application-contract.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,eAAe,GAAC,SAAS,GAAC,WAAW,GAAC,eAAe,GAAC,cAAc,GAAC,aAAa,GAAC,aAAa,GAAC,oBAAoB,GAAC,kBAAkB,CAAC;AACrJ,MAAM,MAAM,WAAW,GAAC;IAAC,aAAa,EAAC,MAAM,CAAC;IAAA,QAAQ,EAAC,eAAe,CAAC;IAAA,QAAQ,EAAC,MAAM,CAAC;IAAA,QAAQ,EAAC,OAAO,CAAC;IAAA,UAAU,EAAC,MAAM,CAAC;IAAA,mBAAmB,EAAC,MAAM,EAAE,CAAC;IAAA,cAAc,EAAC,MAAM,EAAE,CAAA;CAAC,CAAC;AAChL,MAAM,MAAM,iBAAiB,GAAC;IAAC,KAAK,EAAC,OAAO,CAAC;IAAA,UAAU,EAAC,MAAM,CAAC;IAAA,aAAa,EAAC,MAAM,EAAE,CAAC;IAAA,QAAQ,EAAC,OAAO,CAAC;IAAA,SAAS,EAAC,OAAO,CAAA;CAAC,CAAC;AAC1H,MAAM,MAAM,mBAAmB,GAAC;IAAC,WAAW,EAAC,MAAM,CAAC;IAAA,cAAc,EAAC,MAAM,CAAC;IAAA,aAAa,CAAC,EAAC,MAAM,CAAC;IAAA,iBAAiB,EAAC,MAAM,CAAC;IAAA,MAAM,EAAC,MAAM,CAAC;IAAA,UAAU,EAAC,MAAM,CAAC,MAAM,EAAC,iBAAiB,CAAC,CAAC;IAAA,IAAI,EAAC,WAAW,EAAE,CAAA;CAAC,CAAC;AACvM,MAAM,MAAM,iBAAiB,GAAC;IAAC,MAAM,EAAC,MAAM,CAAC;IAAA,SAAS,EAAC,MAAM,CAAC;IAAA,aAAa,EAAC,MAAM,CAAC;IAAA,IAAI,EAAC,WAAW,EAAE,CAAC;IAAA,UAAU,EAAC,MAAM,CAAC,MAAM,EAAC,MAAM,CAAC,CAAC;IAAA,WAAW,EAAC,MAAM,CAAA;CAAC,CAAC;AAC3J,qBAAa,yBAAyB;IAAa,OAAO,CAAC,OAAO;gBAAP,OAAO,EAAC,CAAC,IAAI,EAAC,MAAM,EAAC,IAAI,CAAC,EAAC,WAAW,KAAG,OAAO,CAAC,GAAG,CAAC;IAAG,GAAG,CAAC,EAAE,EAAC,MAAM,GAAgF,OAAO,CAAC,mBAAmB,CAAC;IAAC,QAAQ,CAAC,EAAE,EAAC,MAAM,EAAC,OAAO,EAAC,MAAM,GAAoL,OAAO,CAAC,mBAAmB,CAAC;IAAC,SAAS,CAAC,EAAE,EAAC,MAAM,GAA0F,OAAO,CAAC,iBAAiB,CAAC;IAAC,IAAI,CAAC,EAAE,EAAC,MAAM,GAAqF,OAAO,CAAC;QAAC,IAAI,EAAC,WAAW,EAAE,CAAA;KAAC,CAAC;IAAC,QAAQ,CAAC,EAAE,EAAC,MAAM;IAAsF,GAAG,CAAC,EAAE,EAAC,MAAM,GAAoG,OAAO,CAAC,mBAAmB,CAAC;IAAC,SAAS,CAAC,EAAE,EAAC,MAAM;IAAuG,KAAK,CAAC,EAAE,EAAC,MAAM,EAAC,KAAK,EAAC,OAAO,GAA6K,OAAO,CAAC,mBAAmB,CAAC;CAAE"}
@@ -0,0 +1,13 @@
1
+ export class ApplicationContractClient {
2
+ constructor(request) {
3
+ this.request = request;
4
+ }
5
+ get(id) { return this.request(`/v1/applications/${encodeURIComponent(id)}/contract`); }
6
+ evaluate(id, outcome) { return this.request(`/v1/applications/${encodeURIComponent(id)}/contract/evaluate`, { method: 'POST', headers: { 'content-type': 'application/json' }, body: JSON.stringify({ outcome }) }); }
7
+ readiness(id) { return this.request(`/v1/applications/${encodeURIComponent(id)}/contract/readiness`); }
8
+ gaps(id) { return this.request(`/v1/applications/${encodeURIComponent(id)}/contract/gaps`); }
9
+ question(id) { return this.request(`/v1/applications/${encodeURIComponent(id)}/contract/question`); }
10
+ end(id) { return this.request(`/v1/applications/${encodeURIComponent(id)}/contract/end`, { method: 'POST' }); }
11
+ construct(id) { return this.request(`/v1/applications/${encodeURIComponent(id)}/contract/construct`, { method: 'POST' }); }
12
+ patch(id, patch) { return this.request(`/v1/applications/${encodeURIComponent(id)}/contract/patch`, { method: 'POST', headers: { 'content-type': 'application/json' }, body: JSON.stringify(patch) }); }
13
+ }
@@ -0,0 +1,305 @@
1
+ /** Canonical FeltDB application contract. Rust validation and hashing are authoritative. */
2
+ export interface ManifestField {
3
+ name: string;
4
+ type: string;
5
+ required?: boolean;
6
+ nullable?: boolean;
7
+ default?: unknown;
8
+ enum_values?: string[];
9
+ reference?: string;
10
+ computed?: string;
11
+ }
12
+ export interface ManifestCollection {
13
+ name: string;
14
+ fields: ManifestField[];
15
+ }
16
+ export interface ApplicationManifest {
17
+ application_id: string;
18
+ tenant_id: string;
19
+ schema: number;
20
+ state_schema_version?: number;
21
+ metadata: {
22
+ name: string;
23
+ description?: string;
24
+ labels?: Record<string, string>;
25
+ };
26
+ collections: ManifestCollection[];
27
+ indexes: {
28
+ name: string;
29
+ collection: string;
30
+ fields: string[];
31
+ unique?: boolean;
32
+ sparse?: boolean;
33
+ version?: number;
34
+ }[];
35
+ references: {
36
+ name: string;
37
+ from_collection: string;
38
+ from_field: string;
39
+ to_collection: string;
40
+ to_field: string;
41
+ }[];
42
+ queries: {
43
+ name: string;
44
+ collection: string;
45
+ filter?: unknown;
46
+ fields?: string[];
47
+ }[];
48
+ actions: {
49
+ name: string;
50
+ operation: 'create' | 'update' | 'delete';
51
+ collection: string;
52
+ input_fields?: string[];
53
+ required_capabilities?: string[];
54
+ audit?: boolean;
55
+ }[];
56
+ workflows: {
57
+ name: string;
58
+ steps: {
59
+ name: string;
60
+ capability?: string;
61
+ }[];
62
+ }[];
63
+ triggers: {
64
+ name: string;
65
+ event: string;
66
+ workflow: string;
67
+ }[];
68
+ schedules: {
69
+ name: string;
70
+ expression: string;
71
+ workflow: string;
72
+ }[];
73
+ agents: {
74
+ name: string;
75
+ capabilities: string[];
76
+ }[];
77
+ capabilities: {
78
+ name: string;
79
+ provider?: string;
80
+ }[];
81
+ connections: {
82
+ name: string;
83
+ connection_id: string;
84
+ configuration?: unknown;
85
+ secrets?: {
86
+ binding: string;
87
+ secret_id: string;
88
+ }[];
89
+ }[];
90
+ policies: {
91
+ name: string;
92
+ resource: string;
93
+ capabilities: string[];
94
+ }[];
95
+ ui: {
96
+ routes: {
97
+ path: string;
98
+ view: string;
99
+ }[];
100
+ bindings: {
101
+ name: string;
102
+ collection?: string;
103
+ query?: string;
104
+ fields?: string[];
105
+ }[];
106
+ forms: {
107
+ name: string;
108
+ collection: string;
109
+ fields: string[];
110
+ }[];
111
+ dashboards: {
112
+ name: string;
113
+ bindings: string[];
114
+ }[];
115
+ };
116
+ environments: {
117
+ name: string;
118
+ configuration?: Record<string, string>;
119
+ }[];
120
+ artifacts: {
121
+ name: string;
122
+ uri: string;
123
+ media_type: string;
124
+ }[];
125
+ deployment: {
126
+ environments: string[];
127
+ placement?: string;
128
+ };
129
+ runtime: {
130
+ contract: number;
131
+ minimum_engine: string;
132
+ maximum_engine_exclusive?: string;
133
+ };
134
+ }
135
+ export interface ApplicationDraft {
136
+ draft_id: string;
137
+ application_id: string;
138
+ tenant_id: string;
139
+ base_revision_id?: string;
140
+ manifest: ApplicationManifest;
141
+ version: number;
142
+ updated_at: number;
143
+ updated_by: string;
144
+ }
145
+ export interface ApplicationRevision {
146
+ revision_id: string;
147
+ application_id: string;
148
+ tenant_id: string;
149
+ revision_number: number;
150
+ parent_revision_id?: string;
151
+ manifest_hash: string;
152
+ manifest: ApplicationManifest;
153
+ created_by: string;
154
+ created_at: number;
155
+ status: 'committed';
156
+ }
157
+ export interface ApplicationProposal {
158
+ proposal_id?: string;
159
+ base_revision_id?: string;
160
+ manifest: ApplicationManifest;
161
+ rationale?: string;
162
+ proposed_by: string;
163
+ }
164
+ export type ManifestCompatibility = 'compatible' | 'requires_migration' | 'breaking' | 'invalid';
165
+ export interface ManifestValidation {
166
+ valid: boolean;
167
+ compatibility: ManifestCompatibility;
168
+ issues: {
169
+ category: string;
170
+ path: string;
171
+ message: string;
172
+ }[];
173
+ }
174
+ export type ChangeSafety = 'SAFE' | 'ADDITIVE' | 'MODIFIED' | 'REQUIRES_MIGRATION' | 'BREAKING' | 'SECURITY_SENSITIVE' | 'RUNTIME_SENSITIVE';
175
+ export interface ManifestDiff {
176
+ application_id: string;
177
+ from_revision?: string;
178
+ to_revision: string;
179
+ classification: 'UNCHANGED' | 'ADDITIVE' | 'MODIFIED' | 'MIGRATION_REQUIRED' | 'BREAKING' | 'SECURITY_SENSITIVE' | 'RUNTIME_SENSITIVE';
180
+ compatibility: ManifestCompatibility;
181
+ changes: {
182
+ section: string;
183
+ name: string;
184
+ kind: 'added' | 'removed' | 'modified';
185
+ safety: ChangeSafety;
186
+ detail?: string;
187
+ }[];
188
+ migrations: {
189
+ section: string;
190
+ resource: string;
191
+ operation: string;
192
+ destructive: boolean;
193
+ }[];
194
+ security_changes: {
195
+ section: string;
196
+ resource: string;
197
+ description: string;
198
+ }[];
199
+ migration_plan: {
200
+ from_revision?: string;
201
+ to_revision: string;
202
+ operations: unknown[];
203
+ destructive_operations: unknown[];
204
+ reversible: boolean;
205
+ };
206
+ diff_hash: string;
207
+ }
208
+ export interface RuntimeReadiness {
209
+ revision_id: string;
210
+ environment: string;
211
+ status: 'READY' | 'READY_WITH_WARNINGS' | 'BLOCKED';
212
+ checks: {
213
+ name: string;
214
+ passed: boolean;
215
+ blocking: boolean;
216
+ message: string;
217
+ }[];
218
+ }
219
+ export interface RevisionPromotion {
220
+ application_id: string;
221
+ from_revision?: string;
222
+ to_revision: string;
223
+ environment: string;
224
+ promoted_by: string;
225
+ promoted_at: number;
226
+ reason: string;
227
+ diff_hash: string;
228
+ correlation_id: string;
229
+ rollback: boolean;
230
+ }
231
+ export interface ApplicationRuntimeContract {
232
+ application_id: string;
233
+ tenant_id: string;
234
+ revision_id: string;
235
+ revision_number: number;
236
+ metadata: ApplicationManifest['metadata'];
237
+ state: unknown;
238
+ queries: {
239
+ definitions: ApplicationManifest['queries'];
240
+ live_bindings: boolean;
241
+ };
242
+ actions: {
243
+ definitions: ApplicationManifest['actions'];
244
+ };
245
+ workflows: unknown;
246
+ triggers: unknown;
247
+ schedules: unknown;
248
+ agents: unknown;
249
+ capabilities: unknown;
250
+ connections: unknown;
251
+ policies: unknown;
252
+ ui: unknown;
253
+ artifacts: unknown;
254
+ environment: {
255
+ name: string;
256
+ configuration: Record<string, string>;
257
+ state_namespace: string;
258
+ isolated: boolean;
259
+ };
260
+ compatibility: {
261
+ manifest_version: number;
262
+ runtime_contract_version: number;
263
+ engine_version: string;
264
+ minimum_engine: string;
265
+ maximum_engine_exclusive?: string;
266
+ };
267
+ }
268
+ export declare class ApplicationManifestClient {
269
+ private readonly baseUrl;
270
+ constructor(baseUrl?: string);
271
+ private request;
272
+ createDraft(applicationId: string, baseRevisionId?: string): Promise<ApplicationDraft>;
273
+ getDraft(applicationId: string, draftId: string): Promise<ApplicationDraft>;
274
+ updateDraft(applicationId: string, draft: ApplicationDraft, manifest: ApplicationManifest): Promise<ApplicationDraft>;
275
+ validateDraft(applicationId: string, draftId: string): Promise<ManifestValidation>;
276
+ commitDraft(applicationId: string, draftId: string): Promise<ApplicationRevision>;
277
+ revisions(applicationId: string): Promise<{
278
+ revisions: ApplicationRevision[];
279
+ environment_pointers: Record<string, string>;
280
+ }>;
281
+ diff(applicationId: string, revision: number | string, from?: number | string): Promise<ManifestDiff>;
282
+ preview(applicationId: string, revision: number | string, policy?: unknown): Promise<unknown>;
283
+ environments(applicationId: string): Promise<{
284
+ environments: Record<string, string>;
285
+ }>;
286
+ readiness(applicationId: string, environment: string, revision?: number | string): Promise<RuntimeReadiness>;
287
+ promoteEnvironment(applicationId: string, environment: string, revision: string, expectedCurrentRevision?: string, reason?: string, approveDestructiveChanges?: boolean): Promise<{
288
+ promotion: RevisionPromotion;
289
+ readiness: RuntimeReadiness;
290
+ }>;
291
+ rollback(applicationId: string, environment: string, targetRevision: string, expectedCurrentRevision: string, reason?: string): Promise<{
292
+ promotion: RevisionPromotion;
293
+ readiness: RuntimeReadiness;
294
+ }>;
295
+ history(applicationId: string, environment: string): Promise<{
296
+ history: RevisionPromotion[];
297
+ }>;
298
+ promote(applicationId: string, revision: number | string, environment: string, reason?: string, expectedCurrentRevision?: string, approveDestructiveChanges?: boolean): Promise<unknown>;
299
+ runtime(applicationId: string, revision: number | string, environment?: string): Promise<ApplicationRuntimeContract>;
300
+ run(applicationId: string, revision: number | string, environment?: string): Promise<unknown>;
301
+ stop(applicationId: string, revision: number | string, environment?: string): Promise<unknown>;
302
+ executeAction(applicationId: string, revision: number | string, action: string, input: unknown, environment?: string): Promise<unknown>;
303
+ executeQuery(applicationId: string, revision: number | string, query: string, environment?: string): Promise<unknown>;
304
+ }
305
+ //# sourceMappingURL=application-manifest.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"application-manifest.d.ts","sourceRoot":"","sources":["../src/application-manifest.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,26 @@
1
+ export class ApplicationManifestClient {
2
+ constructor(baseUrl = '') {
3
+ this.baseUrl = baseUrl;
4
+ }
5
+ async request(path, options) { const response = await fetch(`${this.baseUrl}${path}`, { ...options, headers: { ...(options?.body ? { 'Content-Type': 'application/json' } : {}), ...options?.headers } }); const result = await response.json(); if (!response.ok)
6
+ throw Object.assign(new Error(result.error || 'Manifest request failed'), { status: response.status, result }); return result; }
7
+ createDraft(applicationId, baseRevisionId) { return this.request(`/api/applications/${encodeURIComponent(applicationId)}/drafts`, { method: 'POST', body: JSON.stringify({ base_revision_id: baseRevisionId }) }); }
8
+ getDraft(applicationId, draftId) { return this.request(`/api/applications/${encodeURIComponent(applicationId)}/drafts/${encodeURIComponent(draftId)}`); }
9
+ updateDraft(applicationId, draft, manifest) { return this.request(`/api/applications/${encodeURIComponent(applicationId)}/drafts/${encodeURIComponent(draft.draft_id)}`, { method: 'PUT', headers: { 'If-Version': String(draft.version) }, body: JSON.stringify({ manifest }) }); }
10
+ validateDraft(applicationId, draftId) { return this.request(`/api/applications/${encodeURIComponent(applicationId)}/drafts/${encodeURIComponent(draftId)}/validate`, { method: 'POST' }); }
11
+ commitDraft(applicationId, draftId) { return this.request(`/api/applications/${encodeURIComponent(applicationId)}/drafts/${encodeURIComponent(draftId)}/commit`, { method: 'POST' }); }
12
+ revisions(applicationId) { return this.request(`/api/applications/${encodeURIComponent(applicationId)}/revisions`); }
13
+ diff(applicationId, revision, from) { return this.request(`/api/applications/${encodeURIComponent(applicationId)}/revisions/${encodeURIComponent(revision)}/diff${from === undefined ? '' : `?from=${encodeURIComponent(from)}`}`); }
14
+ preview(applicationId, revision, policy) { return this.request(`/api/applications/${encodeURIComponent(applicationId)}/revisions/${encodeURIComponent(revision)}/preview`, { method: 'POST', body: JSON.stringify({ policy }) }); }
15
+ environments(applicationId) { return this.request(`/api/applications/${encodeURIComponent(applicationId)}/environments`); }
16
+ readiness(applicationId, environment, revision) { return this.request(`/api/applications/${encodeURIComponent(applicationId)}/environments/${encodeURIComponent(environment)}/readiness${revision === undefined ? '' : `?revision=${encodeURIComponent(revision)}`}`); }
17
+ promoteEnvironment(applicationId, environment, revision, expectedCurrentRevision, reason = '', approveDestructiveChanges = false) { return this.request(`/api/applications/${encodeURIComponent(applicationId)}/environments/${encodeURIComponent(environment)}/promote`, { method: 'POST', body: JSON.stringify({ revision, expected_current_revision: expectedCurrentRevision, reason, approve_destructive_changes: approveDestructiveChanges }) }); }
18
+ rollback(applicationId, environment, targetRevision, expectedCurrentRevision, reason = '') { return this.request(`/api/applications/${encodeURIComponent(applicationId)}/environments/${encodeURIComponent(environment)}/rollback`, { method: 'POST', body: JSON.stringify({ target_revision: targetRevision, expected_current_revision: expectedCurrentRevision, reason }) }); }
19
+ history(applicationId, environment) { return this.request(`/api/applications/${encodeURIComponent(applicationId)}/environments/${encodeURIComponent(environment)}/history`); }
20
+ promote(applicationId, revision, environment, reason = '', expectedCurrentRevision, approveDestructiveChanges = false) { return this.request(`/api/applications/${encodeURIComponent(applicationId)}/revisions/${encodeURIComponent(revision)}/promote`, { method: 'POST', body: JSON.stringify({ environment, reason, expected_current_revision: expectedCurrentRevision, approve_destructive_changes: approveDestructiveChanges }) }); }
21
+ runtime(applicationId, revision, environment = 'production') { return this.request(`/api/applications/${encodeURIComponent(applicationId)}/revisions/${encodeURIComponent(revision)}/runtime?environment=${encodeURIComponent(environment)}`); }
22
+ run(applicationId, revision, environment = 'preview') { return this.request(`/api/applications/${encodeURIComponent(applicationId)}/revisions/${encodeURIComponent(revision)}/run`, { method: 'POST', body: JSON.stringify({ environment }) }); }
23
+ stop(applicationId, revision, environment = 'preview') { return this.request(`/api/applications/${encodeURIComponent(applicationId)}/revisions/${encodeURIComponent(revision)}/stop`, { method: 'POST', body: JSON.stringify({ environment }) }); }
24
+ executeAction(applicationId, revision, action, input, environment = 'preview') { return this.request(`/api/applications/${encodeURIComponent(applicationId)}/revisions/${encodeURIComponent(revision)}/actions/${encodeURIComponent(action)}?environment=${encodeURIComponent(environment)}`, { method: 'POST', body: JSON.stringify(input) }); }
25
+ executeQuery(applicationId, revision, query, environment = 'preview') { return this.request(`/api/applications/${encodeURIComponent(applicationId)}/revisions/${encodeURIComponent(revision)}/queries/${encodeURIComponent(query)}?environment=${encodeURIComponent(environment)}`, { method: 'POST' }); }
26
+ }