@feltdb/core 0.7.4 → 0.8.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +25 -0
- package/dist/application-development.d.ts +10 -3
- package/dist/application-development.d.ts.map +1 -1
- package/dist/application-development.js +11 -1
- package/dist/application-manifest.d.ts +2 -0
- package/dist/application-manifest.d.ts.map +1 -1
- package/dist/application-manifest.js +1 -1
- package/dist/application-understanding.d.ts +76 -0
- package/dist/application-understanding.d.ts.map +1 -0
- package/dist/application-understanding.js +282 -0
- package/dist/canonical-application.d.ts +1 -0
- package/dist/canonical-application.d.ts.map +1 -1
- package/dist/canonical-application.js +3 -2
- package/dist/cli/ai-model-config.js +3 -3
- package/dist/cli/cli.js +1 -1
- package/dist/cli/commands.js +321 -45
- package/dist/cli/index.js +1 -1
- package/dist/cli/managed-environment.js +6 -0
- package/dist/cli/managed-project.js +6 -0
- package/dist/cli/proposal-client.js +16 -3
- package/dist/cli/publish-engine.js +8 -5
- package/dist/cli/repository-evidence.js +55 -0
- package/dist/cli/source-sync.js +220 -61
- package/dist/convergence.d.ts +55 -0
- package/dist/convergence.d.ts.map +1 -0
- package/dist/convergence.js +63 -0
- package/dist/create/cli.js +10 -1
- package/dist/create/create.js +10 -12
- package/dist/create/managed-account.js +72 -7
- package/dist/create/package-versions.js +1 -1
- package/dist/create/server-source/crates/feltdb/src/application.rs +14 -0
- package/dist/create/server-source/crates/feltdb/src/lib.rs +20 -2
- package/dist/create/server-source/crates/feltdb-server/src/app_state.rs +12 -24
- package/dist/create/server-source/crates/feltdb-server/src/application_contract.rs +11 -3
- package/dist/create/server-source/crates/feltdb-server/src/authenticated_principal.rs +0 -1
- package/dist/create/server-source/crates/feltdb-server/src/certification_harness.rs +23 -22
- package/dist/create/server-source/crates/feltdb-server/src/connections.rs +14 -0
- package/dist/create/server-source/crates/feltdb-server/src/delegation_token.rs +5 -15
- package/dist/create/server-source/crates/feltdb-server/src/durable_operations.rs +13 -28
- package/dist/create/server-source/crates/feltdb-server/src/identity.rs +79 -14
- package/dist/create/server-source/crates/feltdb-server/src/key_management.rs +28 -7
- package/dist/create/server-source/crates/feltdb-server/src/lib.rs +5 -5
- package/dist/create/server-source/crates/feltdb-server/src/main.rs +1929 -261
- package/dist/create/server-source/crates/feltdb-server/src/managed_diagnostics.rs +10 -30
- package/dist/create/server-source/crates/feltdb-server/src/membership_policy.rs +12 -4
- package/dist/create/server-source/crates/feltdb-server/src/request_telemetry.rs +8 -6
- package/dist/create/server-source/crates/feltdb-server/src/snapshot_cursor.rs +10 -14
- package/dist/create/server-source/crates/feltdb-server/src/tenancy.rs +191 -22
- package/dist/create/server-source/crates/feltdb-server/src/tenant_policies.rs +9 -21
- package/dist/create/server-source/crates/feltdb-server/src/transaction_idempotency.rs +5 -3
- package/dist/create/server-source/crates/feltdb-server/src/transaction_recovery.rs +9 -8
- package/dist/create/server-source/crates/feltdb-server/tests/revision_recovery_integration_test.rs +1 -4
- package/dist/create/template/default-project/feltdb.flow +5 -0
- package/dist/create/template/default-project/src/context/AuthContext.tsx +9 -1
- package/dist/create/template/default-project/src/pages/SignUp.tsx +1 -1
- package/dist/flowspec.d.ts +1 -0
- package/dist/flowspec.d.ts.map +1 -1
- package/dist/flowspec.js +51 -12
- package/dist/http-client.d.ts +166 -14
- package/dist/http-client.d.ts.map +1 -1
- package/dist/http-client.js +91 -31
- package/dist/http-db.d.ts +3 -0
- package/dist/http-db.d.ts.map +1 -1
- package/dist/http-db.js +28 -3
- package/dist/index-core.d.ts +5 -0
- package/dist/index-core.d.ts.map +1 -1
- package/dist/index-core.js +5 -0
- package/dist/intent.d.ts +98 -0
- package/dist/intent.d.ts.map +1 -0
- package/dist/intent.js +343 -0
- package/dist/module-intent.d.ts +51 -0
- package/dist/module-intent.d.ts.map +1 -0
- package/dist/module-intent.js +230 -0
- package/dist/module.d.ts +105 -0
- package/dist/module.d.ts.map +1 -0
- package/dist/module.js +566 -0
- package/dist/proposal.d.ts +92 -4
- package/dist/proposal.d.ts.map +1 -1
- package/dist/proposal.js +150 -6
- package/dist/studio/app.d.ts +3 -1
- package/dist/studio/app.d.ts.map +1 -1
- package/dist/studio/components/AskFeltDB.d.ts +2 -1
- package/dist/studio/components/AskFeltDB.d.ts.map +1 -1
- package/dist/studio/components/ContractInspector.d.ts +7 -0
- package/dist/studio/components/ContractInspector.d.ts.map +1 -0
- package/dist/studio/components/ManagedInstancePanel.d.ts.map +1 -1
- package/dist/studio/components/ManagedInstancePanel.js +1 -5
- package/dist/studio/components/ModuleExplorer.d.ts +6 -0
- package/dist/studio/components/ModuleExplorer.d.ts.map +1 -0
- package/dist/studio/components/ProposalBrowser.d.ts +10 -1
- package/dist/studio/components/ProposalBrowser.d.ts.map +1 -1
- package/dist/studio/components/StateExplorer.d.ts +6 -7
- package/dist/studio/components/StateExplorer.d.ts.map +1 -1
- package/dist/studio/components/index.d.ts +2 -0
- package/dist/studio/components/index.d.ts.map +1 -1
- package/dist/studio/components/index.js +4 -4
- package/dist/studio/components-Duq2xQWt.js +2845 -0
- package/dist/studio/index.js +193 -147
- package/dist/studio/studio.css +1 -1
- package/dist/studio/utils/index.d.ts +2 -0
- package/dist/studio/utils/index.d.ts.map +1 -1
- package/dist/studio/utils/index.js +14 -12
- package/dist/studio/utils/managed-instance.d.ts +0 -4
- package/dist/studio/utils/managed-instance.d.ts.map +1 -1
- package/dist/studio/utils/managed-instance.js +0 -4
- package/dist/studio/utils/proposal-api.d.ts +56 -0
- package/dist/studio/utils/proposal-api.d.ts.map +1 -0
- package/dist/studio/utils/proposal-api.js +94 -0
- package/dist/studio/utils/service-api.d.ts +81 -0
- package/dist/studio/utils/service-api.d.ts.map +1 -0
- package/dist/studio/utils/service-api.js +51 -0
- package/dist/studio-app/assets/{feltdb_wasm-B-Ccgccb.js → feltdb_wasm-bIqcRzAr.js} +1 -1
- package/dist/studio-app/assets/feltdb_wasm_bg-BE79okwX.wasm +0 -0
- package/dist/studio-app/assets/{index-BRrmvaKw.css → index-Cd_NPw14.css} +1 -1
- package/dist/studio-app/assets/index-XGYdlElN.js +29 -0
- package/dist/studio-app/index.html +2 -2
- package/dist/wasm/feltdb_wasm_bg.wasm +0 -0
- package/dist/workspace/local-development-authority.d.ts +2 -0
- package/dist/workspace/local-development-authority.d.ts.map +1 -1
- package/dist/workspace/local-development-authority.js +128 -4
- package/package.json +1 -1
- package/dist/studio/components-Bm4sjhcX.js +0 -2162
- package/dist/studio-app/assets/dist-DA1MYSzp.js +0 -1
- package/dist/studio-app/assets/feltdb_wasm_bg-wH3enJIA.wasm +0 -0
- package/dist/studio-app/assets/index-CEIqowCh.js +0 -42
- package/dist/studio-app/assets/lib-B2_7fcn7.js +0 -69
- package/dist/studio-app/assets/worker-CARZ5g7K.js +0 -69
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
<!doctype html><html lang="en"><head><meta charset="UTF-8"/><meta name="viewport" content="width=device-width,initial-scale=1"/><meta name="theme-color" content="#17211b"/><title>FeltDB Studio</title> <script type="module" crossorigin src="/assets/index-
|
|
2
|
-
<link rel="stylesheet" crossorigin href="/assets/index-
|
|
1
|
+
<!doctype html><html lang="en"><head><meta charset="UTF-8"/><meta name="viewport" content="width=device-width,initial-scale=1"/><meta name="theme-color" content="#17211b"/><title>FeltDB Studio</title> <script type="module" crossorigin src="/assets/index-XGYdlElN.js"></script>
|
|
2
|
+
<link rel="stylesheet" crossorigin href="/assets/index-Cd_NPw14.css">
|
|
3
3
|
</head><body><div id="root"></div></body></html>
|
|
Binary file
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { type ProposalContext } from '../proposal.js';
|
|
2
|
+
import type { ObservedEvidenceInput } from '../application-understanding.js';
|
|
2
3
|
export interface LocalDevelopmentAuthority {
|
|
3
4
|
endpoint: string;
|
|
4
5
|
proposalAuthorityToken: string;
|
|
@@ -9,6 +10,7 @@ export interface LocalDevelopmentAuthorityOptions {
|
|
|
9
10
|
host?: string;
|
|
10
11
|
port?: number;
|
|
11
12
|
proposalContext?: () => Promise<ProposalContext>;
|
|
13
|
+
intentObservations?: () => ObservedEvidenceInput[] | Promise<ObservedEvidenceInput[]>;
|
|
12
14
|
}
|
|
13
15
|
/** Start the durable, unauthenticated loopback authority used by `feltdb dev`. */
|
|
14
16
|
export declare function startLocalDevelopmentAuthority(options: LocalDevelopmentAuthorityOptions): Promise<LocalDevelopmentAuthority>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"local-development-authority.d.ts","sourceRoot":"","sources":["../../src/workspace/local-development-authority.ts"],"names":[],"mappings":"AAGA,OAAO,
|
|
1
|
+
{"version":3,"file":"local-development-authority.d.ts","sourceRoot":"","sources":["../../src/workspace/local-development-authority.ts"],"names":[],"mappings":"AAGA,OAAO,EAAwD,KAAK,eAAe,EAAsB,MAAM,gBAAgB,CAAC;AAEhI,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,iCAAiC,CAAC;AAE7E,MAAM,WAAW,yBAAyB;IACxC,QAAQ,EAAE,MAAM,CAAC;IACjB,sBAAsB,EAAE,MAAM,CAAC;IAC/B,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACxB;AAED,MAAM,WAAW,gCAAgC;IAC/C,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,eAAe,CAAC,EAAE,MAAM,OAAO,CAAC,eAAe,CAAC,CAAC;IACjD,kBAAkB,CAAC,EAAE,MAAM,qBAAqB,EAAE,GAAG,OAAO,CAAC,qBAAqB,EAAE,CAAC,CAAC;CACvF;AAED,kFAAkF;AAClF,wBAAsB,8BAA8B,CAClD,OAAO,EAAE,gCAAgC,GACxC,OAAO,CAAC,yBAAyB,CAAC,CA6JpC"}
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import http from 'node:http';
|
|
2
2
|
import path from 'node:path';
|
|
3
3
|
import { FileJsDb } from '../file-db.js';
|
|
4
|
-
import { FeltDBProposalService } from '../proposal.js';
|
|
4
|
+
import { FELTDB_CONVERGENCE_COLLECTION, FeltDBProposalService } from '../proposal.js';
|
|
5
|
+
import { IntentService } from '../intent.js';
|
|
5
6
|
/** Start the durable, unauthenticated loopback authority used by `feltdb dev`. */
|
|
6
7
|
export async function startLocalDevelopmentAuthority(options) {
|
|
7
8
|
const host = options.host || '127.0.0.1';
|
|
@@ -22,6 +23,7 @@ export async function startLocalDevelopmentAuthority(options) {
|
|
|
22
23
|
throw new Error(result.error); },
|
|
23
24
|
};
|
|
24
25
|
const proposalService = options.proposalContext ? new FeltDBProposalService(store, options.proposalContext, proposalAuthorityToken) : undefined;
|
|
26
|
+
const intentService = proposalService && options.proposalContext ? new IntentService(store, options.proposalContext, proposalService, options.intentObservations) : undefined;
|
|
25
27
|
const streams = new Set();
|
|
26
28
|
const server = http.createServer(async (request, response) => {
|
|
27
29
|
try {
|
|
@@ -34,7 +36,8 @@ export async function startLocalDevelopmentAuthority(options) {
|
|
|
34
36
|
response.end();
|
|
35
37
|
return;
|
|
36
38
|
}
|
|
37
|
-
const
|
|
39
|
+
const requestUrl = new URL(request.url || '/', `http://${host}`);
|
|
40
|
+
const pathname = requestUrl.pathname;
|
|
38
41
|
if (request.method === 'GET' && (pathname === '/health' || pathname === '/ready')) {
|
|
39
42
|
json(response, 200, { status: 'ready', storage: 'writable', authority: 'local-development' });
|
|
40
43
|
return;
|
|
@@ -51,7 +54,92 @@ export async function startLocalDevelopmentAuthority(options) {
|
|
|
51
54
|
request.once('close', () => streams.delete(response));
|
|
52
55
|
return;
|
|
53
56
|
}
|
|
54
|
-
const
|
|
57
|
+
const previewSimulationMatch = pathname.match(/^\/v1\/previews\/([^/]+)\/simulate$/);
|
|
58
|
+
if (previewSimulationMatch) {
|
|
59
|
+
if (!proposalService) {
|
|
60
|
+
json(response, 503, { error: 'PROPOSAL_SERVICE_UNAVAILABLE' });
|
|
61
|
+
return;
|
|
62
|
+
}
|
|
63
|
+
if (request.method !== 'POST') {
|
|
64
|
+
json(response, 405, { error: 'METHOD_NOT_ALLOWED' });
|
|
65
|
+
return;
|
|
66
|
+
}
|
|
67
|
+
const artifact = await proposalService.getPreview(decodeURIComponent(previewSimulationMatch[1]));
|
|
68
|
+
const input = parseObject(await readBody(request));
|
|
69
|
+
const event = String(input.event || '');
|
|
70
|
+
if (!artifact.events.includes(event)) {
|
|
71
|
+
json(response, 422, { error: 'UNSUPPORTED_PREVIEW_EVENT' });
|
|
72
|
+
return;
|
|
73
|
+
}
|
|
74
|
+
json(response, 200, { preview_id: artifact.preview_id, event, status: 'simulated', external_side_effects: 'none', trace: artifact.state_flow, writes: 'isolated_preview_namespace_only' });
|
|
75
|
+
return;
|
|
76
|
+
}
|
|
77
|
+
const previewMatch = pathname.match(/^\/v1\/previews\/([^/]+)(?:\/data\/([^/]+))?$/);
|
|
78
|
+
if (previewMatch) {
|
|
79
|
+
if (!proposalService) {
|
|
80
|
+
json(response, 503, { error: 'PROPOSAL_SERVICE_UNAVAILABLE' });
|
|
81
|
+
return;
|
|
82
|
+
}
|
|
83
|
+
const artifact = await proposalService.getPreview(decodeURIComponent(previewMatch[1]));
|
|
84
|
+
if (request.method === 'GET' && !previewMatch[2]) {
|
|
85
|
+
json(response, 200, artifact);
|
|
86
|
+
return;
|
|
87
|
+
}
|
|
88
|
+
if (request.method === 'GET' && previewMatch[2]) {
|
|
89
|
+
const collection = decodeURIComponent(previewMatch[2]);
|
|
90
|
+
const seed = artifact.seeded_records.find(value => value.collection === collection);
|
|
91
|
+
json(response, seed ? 200 : 404, seed ? { preview_id: artifact.preview_id, collection, records: [{ id: seed.id, _preview_data: true, _preview_source: 'synthetic' }], data_classification: 'synthetic_preview', pagination: { limit: 50, nextCursor: null } } : { error: 'COLLECTION_NOT_FOUND' });
|
|
92
|
+
return;
|
|
93
|
+
}
|
|
94
|
+
json(response, 405, { error: 'METHOD_NOT_ALLOWED' });
|
|
95
|
+
return;
|
|
96
|
+
}
|
|
97
|
+
const intentMatch = pathname.match(/^\/v1\/intents(?:\/([^/]+)(?:\/(understanding|plan|proposal|history|execute))?)?$/);
|
|
98
|
+
if (intentMatch) {
|
|
99
|
+
if (!intentService) {
|
|
100
|
+
json(response, 503, { error: 'INTENT_SERVICE_UNAVAILABLE' });
|
|
101
|
+
return;
|
|
102
|
+
}
|
|
103
|
+
const id = intentMatch[1] ? decodeURIComponent(intentMatch[1]) : undefined;
|
|
104
|
+
const operation = intentMatch[2];
|
|
105
|
+
const body = await readBody(request);
|
|
106
|
+
const input = body ? parseObject(body) : {};
|
|
107
|
+
if (request.method === 'POST' && !id) {
|
|
108
|
+
const raw = String(input.raw_request ?? input.request ?? '');
|
|
109
|
+
json(response, 201, await intentService.execute(raw, String(input.actor ?? 'developer')));
|
|
110
|
+
return;
|
|
111
|
+
}
|
|
112
|
+
if (request.method === 'GET' && !id) {
|
|
113
|
+
json(response, 200, { intents: await intentService.list() });
|
|
114
|
+
return;
|
|
115
|
+
}
|
|
116
|
+
if (request.method === 'GET' && id) {
|
|
117
|
+
const intent = await intentService.get(id);
|
|
118
|
+
if (!operation) {
|
|
119
|
+
json(response, 200, intent);
|
|
120
|
+
return;
|
|
121
|
+
}
|
|
122
|
+
if (operation === 'understanding') {
|
|
123
|
+
json(response, 200, intent.understanding ?? {});
|
|
124
|
+
return;
|
|
125
|
+
}
|
|
126
|
+
if (operation === 'plan') {
|
|
127
|
+
json(response, 200, intent.plan ?? {});
|
|
128
|
+
return;
|
|
129
|
+
}
|
|
130
|
+
if (operation === 'proposal') {
|
|
131
|
+
json(response, 200, intent.proposal_id ? await proposalService.get(intent.proposal_id) : {});
|
|
132
|
+
return;
|
|
133
|
+
}
|
|
134
|
+
if (operation === 'history') {
|
|
135
|
+
json(response, 200, { events: await intentService.history(id) });
|
|
136
|
+
return;
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
json(response, 405, { error: 'METHOD_NOT_ALLOWED' });
|
|
140
|
+
return;
|
|
141
|
+
}
|
|
142
|
+
const proposalMatch = pathname.match(/^\/v1\/proposals(?:\/([^/]+)(?:\/(validate|preview|approve|reject|status|history|convergence))?)?$/);
|
|
55
143
|
if (proposalMatch) {
|
|
56
144
|
if (!proposalService) {
|
|
57
145
|
json(response, 503, { error: 'PROPOSAL_SERVICE_UNAVAILABLE' });
|
|
@@ -67,7 +155,15 @@ export async function startLocalDevelopmentAuthority(options) {
|
|
|
67
155
|
return;
|
|
68
156
|
}
|
|
69
157
|
if (request.method === 'GET' && !id) {
|
|
70
|
-
|
|
158
|
+
const limit = Math.max(1, Math.min(100, Number(requestUrl.searchParams.get('limit') || 50)));
|
|
159
|
+
const status = requestUrl.searchParams.get('status');
|
|
160
|
+
const environment = requestUrl.searchParams.get('environment');
|
|
161
|
+
const after = requestUrl.searchParams.get('cursor');
|
|
162
|
+
const offset = after ? Number(Buffer.from(after, 'base64url').toString('utf8')) : 0;
|
|
163
|
+
const all = (await proposalService.list()).filter(value => (!status || value.status === status) && (!environment || value.environment === environment)).sort((a, b) => a.id.localeCompare(b.id));
|
|
164
|
+
const proposals = all.slice(offset, offset + limit);
|
|
165
|
+
const nextCursor = offset + limit < all.length ? Buffer.from(String(offset + limit)).toString('base64url') : null;
|
|
166
|
+
json(response, 200, { proposals, pagination: { limit, nextCursor } });
|
|
71
167
|
return;
|
|
72
168
|
}
|
|
73
169
|
if (request.method === 'GET' && id && !operation) {
|
|
@@ -78,6 +174,26 @@ export async function startLocalDevelopmentAuthority(options) {
|
|
|
78
174
|
json(response, 200, { events: await proposalService.history(id) });
|
|
79
175
|
return;
|
|
80
176
|
}
|
|
177
|
+
if (request.method === 'GET' && id && operation === 'status') {
|
|
178
|
+
json(response, 200, await proposalService.readiness(id));
|
|
179
|
+
return;
|
|
180
|
+
}
|
|
181
|
+
if (request.method === 'GET' && id && operation === 'convergence') {
|
|
182
|
+
const all = await store.list(FELTDB_CONVERGENCE_COLLECTION);
|
|
183
|
+
json(response, 200, { convergence: all.filter(value => value.proposal_id === id).sort((a, b) => String(b.created_at).localeCompare(String(a.created_at))) });
|
|
184
|
+
return;
|
|
185
|
+
}
|
|
186
|
+
if (request.method === 'POST' && id && operation === 'convergence') {
|
|
187
|
+
const proposal = await proposalService.get(id);
|
|
188
|
+
if (proposal.status !== 'applied')
|
|
189
|
+
throw new Error('PROPOSAL_NOT_APPLIED');
|
|
190
|
+
if (input.proposal_id !== id)
|
|
191
|
+
throw new Error('INVALID_CONVERGENCE');
|
|
192
|
+
const value = { ...input, id: `cv_${crypto.randomUUID().replaceAll('-', '')}`, created_at: new Date().toISOString(), verifier_version: 1 };
|
|
193
|
+
await store.create(FELTDB_CONVERGENCE_COLLECTION, value.id, value);
|
|
194
|
+
json(response, 201, value);
|
|
195
|
+
return;
|
|
196
|
+
}
|
|
81
197
|
if (request.method === 'POST' && id && operation === 'validate') {
|
|
82
198
|
json(response, 200, await proposalService.validate(id, actor));
|
|
83
199
|
return;
|
|
@@ -86,6 +202,14 @@ export async function startLocalDevelopmentAuthority(options) {
|
|
|
86
202
|
json(response, 200, await proposalService.preview(id, actor));
|
|
87
203
|
return;
|
|
88
204
|
}
|
|
205
|
+
if (request.method === 'POST' && id && operation === 'approve') {
|
|
206
|
+
json(response, 200, await proposalService.transition(id, 'approved', actor, undefined, input.approve_authorization === true));
|
|
207
|
+
return;
|
|
208
|
+
}
|
|
209
|
+
if (request.method === 'POST' && id && operation === 'reject') {
|
|
210
|
+
json(response, 200, await proposalService.transition(id, 'rejected', actor));
|
|
211
|
+
return;
|
|
212
|
+
}
|
|
89
213
|
if (request.method === 'PATCH' && id && operation === 'status') {
|
|
90
214
|
const status = String(input.status || '');
|
|
91
215
|
json(response, 200, await proposalService.transition(id, status, actor, request.headers['feltdb-proposal-authority'], input.approve_authorization === true));
|
package/package.json
CHANGED