@feltdb/core 0.7.1 → 0.7.3

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 (41) hide show
  1. package/README.md +22 -0
  2. package/dist/cli/commands.js +163 -33
  3. package/dist/cli/index.js +1 -1
  4. package/dist/collection.d.ts.map +1 -1
  5. package/dist/collection.js +2 -1
  6. package/dist/create/package-versions.js +1 -1
  7. package/dist/create/server-source/crates/feltdb/src/authority_failover.rs +769 -0
  8. package/dist/create/server-source/crates/feltdb/src/bin/feltdb_node.rs +305 -0
  9. package/dist/create/server-source/crates/feltdb/src/lib.rs +9 -0
  10. package/dist/create/server-source/crates/feltdb/src/state_facade.rs +292 -0
  11. package/dist/create/server-source/crates/feltdb/src/state_model.rs +1856 -0
  12. package/dist/create/server-source/crates/feltdb/tests/feltdb_state_boundary_tests.rs +634 -0
  13. package/dist/create/server-source/crates/feltdb/tests/state_model_integration.rs +366 -0
  14. package/dist/create/server-source/crates/feltdb/tests/state_persistence_integration.rs +270 -0
  15. package/dist/create/server-source/crates/feltdb-server/src/app_state.rs +13 -0
  16. package/dist/create/server-source/crates/feltdb-server/src/main.rs +184 -1
  17. package/dist/db.d.ts +7 -0
  18. package/dist/db.d.ts.map +1 -1
  19. package/dist/db.js +12 -1
  20. package/dist/feltdb.d.ts +2 -0
  21. package/dist/feltdb.d.ts.map +1 -1
  22. package/dist/http-db.d.ts +24 -0
  23. package/dist/http-db.d.ts.map +1 -1
  24. package/dist/http-db.js +13 -0
  25. package/dist/index-core.d.ts +1 -0
  26. package/dist/index-core.d.ts.map +1 -1
  27. package/dist/studio/app.d.ts +3 -1
  28. package/dist/studio/app.d.ts.map +1 -1
  29. package/dist/studio/components/ApplicationDesigner.d.ts +9 -1
  30. package/dist/studio/components/ApplicationDesigner.d.ts.map +1 -1
  31. package/dist/studio/components/index.js +1 -1
  32. package/dist/studio/{components-C5p2TfIU.js → components-Dxuhrv8_.js} +196 -187
  33. package/dist/studio/index.js +66 -65
  34. package/dist/studio-app/assets/{feltdb_wasm-C9xpYtna.js → feltdb_wasm-DVKsw75S.js} +1 -1
  35. package/dist/studio-app/assets/feltdb_wasm_bg-DNyNf0yy.wasm +0 -0
  36. package/dist/studio-app/assets/index-B5tnmvSD.js +28 -0
  37. package/dist/studio-app/index.html +1 -1
  38. package/dist/wasm/feltdb_wasm_bg.wasm +0 -0
  39. package/package.json +1 -1
  40. package/dist/studio-app/assets/feltdb_wasm_bg-BsXHw7eX.wasm +0 -0
  41. package/dist/studio-app/assets/index-sQyf4Ewl.js +0 -28
package/README.md CHANGED
@@ -111,6 +111,28 @@ A write with `requireAbsent: true` is an atomic create. The authority assigns
111
111
  it `__version: 1`—overriding any caller-supplied version—so it can immediately
112
112
  be updated with `ifVersion: 1`.
113
113
 
114
+ ## Bounded authority queries
115
+
116
+ Remote databases can filter, order, and limit records inside the authority:
117
+
118
+ ```typescript
119
+ const page = await db.query({
120
+ collection: 'outbox',
121
+ where: [
122
+ { field: 'status', eq: 'pending' },
123
+ { field: 'nextAttemptAt', lte: Date.now() },
124
+ ],
125
+ orderBy: [{ field: 'nextAttemptAt', direction: 'asc' }],
126
+ limit: 100,
127
+ cursor,
128
+ });
129
+ ```
130
+
131
+ The server adds `recordId` as a deterministic final tie-breaker and returns an
132
+ opaque `nextCursor`. Page snapshots are stable across concurrent inserts and
133
+ deletes. This method is intentionally unavailable on embedded runtimes;
134
+ `Collection.where()` and `Collection.find()` retain their existing behavior.
135
+
114
136
  ## Durable Operation Management
115
137
 
116
138
  FeltDB provides atomic operation admission and lifecycle management for systems that need to survive process crashes with guaranteed identity stability.
@@ -8,7 +8,7 @@ import net from 'net';
8
8
  import { createRequire } from 'module';
9
9
  import { spawn, spawnSync } from 'child_process';
10
10
  import { randomBytes } from 'crypto';
11
- import { createFeltDB, diffFlowSpec, formatFlowSpec, InvestigationLifecycleManager, parseFlowSpec, planFlowSpecMigration, startLocalDevelopmentAuthority, validateFlowSpec } from '@feltdb/core';
11
+ import { createFeltDB, diffFlowSpec, emptyFlowSpec, formatFlowSpec, InvestigationLifecycleManager, parseFlowSpec, planFlowSpecMigration, startLocalDevelopmentAuthority, validateFlowSpec } from '@feltdb/core';
12
12
  import { discoverWorkspace, ensureWorkspaceGitIgnored, generatePairingToken, persistPairingToken, displayWorkspaceStatus, initializeWorkspace, startPairingDiscoveryServer } from './workspace-integration.js';
13
13
  import { applicationUrlCandidate, detectApplication, discoverApplicationUrl } from './application.js';
14
14
  import { resolveApplicationLifecycle, startManagedApplication, waitForManagedApplication } from './application-lifecycle.js';
@@ -77,6 +77,8 @@ export async function handleCommand(command, args) {
77
77
  return handleFlowDiff(args);
78
78
  case 'deploy':
79
79
  return handleFlowDeploy(args);
80
+ case 'publish':
81
+ return handleManagedPublish(args);
80
82
  case 'help':
81
83
  default:
82
84
  return handleHelp();
@@ -231,36 +233,149 @@ async function handleFlowDeploy(args) {
231
233
  await db.close();
232
234
  }
233
235
  }
236
+ async function handleManagedPublish(args) {
237
+ loadProjectEnvironment();
238
+ const configPath = path.resolve('feltdb.config.json');
239
+ if (!fs.existsSync(configPath))
240
+ throw new Error('feltdb.config.json is required for publish');
241
+ const config = JSON.parse(fs.readFileSync(configPath, 'utf8'));
242
+ if (config.runtime !== 'managed')
243
+ throw new Error('feltdb publish requires a managed runtime in feltdb.config.json');
244
+ const url = process.env.VITE_FELTDB_MANAGED_URL;
245
+ const token = process.env.VITE_FELTDB_MANAGED_API_KEY;
246
+ const tenantId = process.env.VITE_FELTDB_MANAGED_TENANT_ID;
247
+ const applicationId = process.env.VITE_FELTDB_MANAGED_APPLICATION_ID;
248
+ const namespace = process.env.VITE_FELTDB_MANAGED_NAMESPACE || config.namespace;
249
+ const environment = process.env.VITE_FELTDB_MANAGED_ENVIRONMENT || 'production';
250
+ const missing = [
251
+ ['VITE_FELTDB_MANAGED_URL', url],
252
+ ['VITE_FELTDB_MANAGED_API_KEY', token],
253
+ ['VITE_FELTDB_MANAGED_TENANT_ID', tenantId],
254
+ ['VITE_FELTDB_MANAGED_APPLICATION_ID', applicationId],
255
+ ['VITE_FELTDB_MANAGED_NAMESPACE', namespace],
256
+ ].filter(([, value]) => !value).map(([name]) => name);
257
+ if (missing.length)
258
+ throw new Error(`Managed publish configuration is incomplete in .env.local: ${missing.join(', ')}`);
259
+ const file = flowFile(args);
260
+ const spec = readFlowSpec(file);
261
+ const diagnostics = validateFlowSpec(spec).filter(value => value.severity === 'error');
262
+ if (diagnostics.length)
263
+ throw new Error(diagnostics.map(value => value.message).join('; '));
264
+ console.log('FeltDB Publish');
265
+ console.log(`Application: ${spec.app}`);
266
+ console.log(`Environment: ${environment}`);
267
+ console.log(`Namespace: ${namespace}`);
268
+ console.log(`API: ${url}`);
269
+ console.log('✓ Configuration loaded');
270
+ if (!args.includes('--no-build')) {
271
+ const manifestPath = path.resolve('package.json');
272
+ if (!fs.existsSync(manifestPath))
273
+ throw new Error('package.json is required to build the application');
274
+ const manifest = JSON.parse(fs.readFileSync(manifestPath, 'utf8'));
275
+ if (!manifest.scripts?.build)
276
+ throw new Error('package.json must define a build script for managed publish');
277
+ const build = spawnSync('npm', ['run', 'build'], { cwd: process.cwd(), stdio: 'inherit' });
278
+ if (build.error)
279
+ throw build.error;
280
+ if (build.status !== 0)
281
+ throw new Error(`Application build failed with exit code ${build.status}`);
282
+ }
283
+ console.log('✓ Build completed');
284
+ console.log('✓ Application validated');
285
+ const remote = createFeltDB({ namespace, server: { url: url, token: token } });
286
+ try {
287
+ const current = await remote.collection('_flow_apps').get(spec.app);
288
+ const migration = planFlowSpecMigration(current?.spec ?? emptyFlowSpec(spec.app), spec);
289
+ const destructive = migration.filter(value => value.safety === 'destructive');
290
+ if (destructive.length && !args.includes('--allow-destructive')) {
291
+ throw new Error(`Publish contains destructive changes (${destructive.map(value => value.target).join(', ')}); review them and rerun with --allow-destructive`);
292
+ }
293
+ const result = await remote.deployFlowSpec(spec, current?.version ?? 0, args.includes('--allow-destructive'));
294
+ const publishState = {
295
+ tenantId,
296
+ applicationId,
297
+ namespace,
298
+ environment,
299
+ deploymentId: `${applicationId}:${environment}:${result.version}`,
300
+ version: result.version,
301
+ publishedAt: new Date().toISOString(),
302
+ };
303
+ fs.mkdirSync(path.resolve('.feltdb'), { recursive: true });
304
+ fs.writeFileSync(path.resolve('.feltdb/last-published.json'), `${JSON.stringify(publishState, null, 2)}\n`, { mode: 0o600 });
305
+ fs.writeFileSync(path.resolve('.feltdb/last-deployed.flow'), formatFlowSpec(spec));
306
+ console.log('✓ Published');
307
+ console.log(`Deployment: ${publishState.deploymentId}`);
308
+ console.log(`Version: ${result.version}`);
309
+ console.log('Your app is live.');
310
+ }
311
+ finally {
312
+ await remote.close();
313
+ }
314
+ }
234
315
  async function handleServer(args) {
235
- console.log('🚀 Starting FeltDB Server\n');
236
- const port = args.includes('--port') ? args[args.indexOf('--port') + 1] || '7700' : '7700';
237
- const dataDir = args.includes('--data') ? args[args.indexOf('--data') + 1] || './data' : './data';
238
- const authEnabled = args.includes('--auth');
239
- console.log('FeltDB Self-Hosted Server');
240
- console.log(` Listen: 0.0.0.0:${port}`);
241
- console.log(` Storage: ${dataDir}`);
242
- console.log(` Auth: ${authEnabled ? 'Enabled' : 'Development (no auth required)'}`);
243
- console.log(` Namespace: default\n`);
244
- // Ensure data directory exists
245
- if (!fs.existsSync(dataDir)) {
246
- fs.mkdirSync(dataDir, { recursive: true });
247
- }
248
- // Store server info
249
- const serverConfig = {
250
- port: parseInt(port),
251
- dataDir,
252
- authEnabled,
253
- startTime: new Date().toISOString(),
316
+ const require = createRequire(import.meta.url);
317
+ const packageRoot = path.dirname(require.resolve('@feltdb/core/package.json'));
318
+ const executable = process.platform === 'win32' ? 'feltdb-server.exe' : 'feltdb-server';
319
+ const candidates = [
320
+ process.env.FELTDB_SERVER_BIN,
321
+ path.join(packageRoot, 'dist', 'server-bin', `${process.platform}-${process.arch}`, executable),
322
+ path.resolve(packageRoot, '..', '..', 'target', 'release', executable),
323
+ path.resolve(packageRoot, '..', '..', 'target', 'debug', executable),
324
+ ].filter((value) => Boolean(value));
325
+ const binary = candidates.find(value => fs.existsSync(value));
326
+ const manifests = [
327
+ path.join(packageRoot, 'dist', 'server-source', 'Cargo.toml'),
328
+ path.join(packageRoot, 'dist', 'create', 'server-source', 'Cargo.toml'),
329
+ ];
330
+ const manifest = manifests.find(value => fs.existsSync(value));
331
+ if (process.env.FELTDB_SERVER_BIN && !binary) {
332
+ throw new Error(`FELTDB_SERVER_BIN does not exist: ${process.env.FELTDB_SERVER_BIN}`);
333
+ }
334
+ if (!binary && !manifest) {
335
+ throw new Error('No FeltDB authority is available. Reinstall @feltdb/core or set FELTDB_SERVER_BIN to a feltdb-server executable.');
336
+ }
337
+ const forwarded = [...args];
338
+ if (!forwarded.includes('--host'))
339
+ forwarded.unshift('--host', '0.0.0.0');
340
+ if (!forwarded.includes('--data'))
341
+ forwarded.push('--data', path.resolve('data', 'feltdb.log'));
342
+ const dataIndex = forwarded.indexOf('--data');
343
+ if (dataIndex >= 0 && forwarded[dataIndex + 1]) {
344
+ const data = path.resolve(forwarded[dataIndex + 1]);
345
+ const directoryStyle = data.endsWith(path.sep)
346
+ || (fs.existsSync(data) && fs.statSync(data).isDirectory())
347
+ || path.extname(data) === '';
348
+ if (directoryStyle) {
349
+ fs.mkdirSync(data, { recursive: true });
350
+ forwarded[dataIndex + 1] = path.join(data, 'feltdb.log');
351
+ }
352
+ else {
353
+ fs.mkdirSync(path.dirname(data), { recursive: true });
354
+ forwarded[dataIndex + 1] = data;
355
+ }
356
+ }
357
+ const command = binary || 'cargo';
358
+ const commandArgs = binary
359
+ ? forwarded
360
+ : ['run', '--quiet', '--locked', '--manifest-path', manifest, '--package', 'feltdb-server', '--', ...forwarded];
361
+ console.log(`Starting FeltDB authority (${binary ? binary : 'packaged Rust source'})`);
362
+ const child = spawn(command, commandArgs, { stdio: 'inherit', env: process.env });
363
+ const forwardSignal = (signal) => {
364
+ if (child.exitCode === null)
365
+ child.kill(signal);
254
366
  };
255
- const configFile = path.join(dataDir, 'server.json');
256
- fs.writeFileSync(configFile, JSON.stringify(serverConfig, null, 2));
257
- console.log('🌐 Server listening...');
258
- console.log(` http://0.0.0.0:${port}\n`);
259
- console.log('✅ Ready for connections\n');
260
- console.log('To connect from another machine:');
261
- console.log(` feltdb connect http://localhost:${port}\n`);
262
- // Keep the server running
263
- await new Promise(() => { });
367
+ const onSigint = () => forwardSignal('SIGINT');
368
+ const onSigterm = () => forwardSignal('SIGTERM');
369
+ process.once('SIGINT', onSigint);
370
+ process.once('SIGTERM', onSigterm);
371
+ const exitCode = await new Promise((resolve, reject) => {
372
+ child.once('error', reject);
373
+ child.once('exit', (code, signal) => resolve(code ?? (signal ? 1 : 0)));
374
+ });
375
+ process.off('SIGINT', onSigint);
376
+ process.off('SIGTERM', onSigterm);
377
+ if (exitCode !== 0)
378
+ throw new Error(`FeltDB authority exited with code ${exitCode}`);
264
379
  }
265
380
  async function handleKeys(args) {
266
381
  const subcommand = args[0];
@@ -1121,9 +1236,13 @@ async function handleDoctor() {
1121
1236
  console.log('\n✅ System healthy\n');
1122
1237
  }
1123
1238
  async function handleStudio(args, onReady) {
1239
+ loadProjectEnvironment();
1240
+ const projectConfigPath = path.resolve('feltdb.config.json');
1241
+ const projectConfig = fs.existsSync(projectConfigPath) ? JSON.parse(fs.readFileSync(projectConfigPath, 'utf8')) : {};
1242
+ const projectIsManaged = projectConfig.runtime === 'managed';
1124
1243
  const connectUrl = args.includes('--connect')
1125
1244
  ? args[args.indexOf('--connect') + 1]
1126
- : undefined;
1245
+ : projectIsManaged ? process.env.VITE_FELTDB_MANAGED_URL : undefined;
1127
1246
  const port = args.includes('--port')
1128
1247
  ? args[args.indexOf('--port') + 1] || '7701'
1129
1248
  : '7701';
@@ -1133,10 +1252,10 @@ async function handleStudio(args, onReady) {
1133
1252
  const open = !args.includes('--no-open');
1134
1253
  const namespace = args.includes('--namespace')
1135
1254
  ? args[args.indexOf('--namespace') + 1] || 'default'
1136
- : 'default';
1255
+ : projectIsManaged ? process.env.VITE_FELTDB_MANAGED_NAMESPACE || projectConfig.namespace || 'default' : 'default';
1137
1256
  const runtime = args.includes('--runtime')
1138
1257
  ? args[args.indexOf('--runtime') + 1] || 'browser'
1139
- : connectUrl ? 'remote' : 'browser';
1258
+ : projectIsManaged ? 'managed' : connectUrl ? 'remote' : 'browser';
1140
1259
  const appUrl = args.includes('--app-url')
1141
1260
  ? args[args.indexOf('--app-url') + 1]
1142
1261
  : undefined;
@@ -1177,7 +1296,15 @@ async function handleStudio(args, onReady) {
1177
1296
  response.setHeader('Content-Type', 'application/json; charset=utf-8');
1178
1297
  response.setHeader('Cache-Control', 'no-store');
1179
1298
  response.setHeader('Pragma', 'no-cache');
1180
- response.end(JSON.stringify({ token: connectUrl ? process.env.VITE_FELTDB_API_KEY || '' : '', session }));
1299
+ const managedPublish = runtime === 'managed' ? {
1300
+ url: process.env.VITE_FELTDB_MANAGED_URL || connectUrl || '',
1301
+ namespace: process.env.VITE_FELTDB_MANAGED_NAMESPACE || namespace,
1302
+ token: process.env.VITE_FELTDB_MANAGED_API_KEY || process.env.VITE_FELTDB_API_KEY || '',
1303
+ tenantId: process.env.VITE_FELTDB_MANAGED_TENANT_ID || '',
1304
+ applicationId: process.env.VITE_FELTDB_MANAGED_APPLICATION_ID || '',
1305
+ environment: process.env.VITE_FELTDB_MANAGED_ENVIRONMENT || 'production',
1306
+ } : undefined;
1307
+ response.end(JSON.stringify({ token: connectUrl ? process.env.VITE_FELTDB_API_KEY || process.env.VITE_FELTDB_MANAGED_API_KEY || '' : '', managedPublish, session }));
1181
1308
  return;
1182
1309
  }
1183
1310
  if (pathname === '/_feltdb/project') {
@@ -1278,6 +1405,7 @@ Commands:
1278
1405
  validate [file] Validate an entire FlowSpec application model
1279
1406
  diff [file] Diff FlowSpec against the last deployed model
1280
1407
  deploy [file] Validate, version, and deploy FlowSpec
1408
+ publish [file] Build and publish/update a managed application
1281
1409
  studio Launch FeltDB Studio (developer interface)
1282
1410
  server Start self-hosted FeltDB server
1283
1411
  keys Manage API keys
@@ -1299,6 +1427,8 @@ Studio:
1299
1427
 
1300
1428
  Server Options:
1301
1429
  feltdb server [--port 7700] [--data ./data] [--auth]
1430
+ Starts the real Rust HTTP authority. Set FELTDB_MASTER_KEY; Cargo builds the
1431
+ version-matched bundled source when no FELTDB_SERVER_BIN override is set.
1302
1432
 
1303
1433
  API Key Commands:
1304
1434
  feltdb keys create [--name dev] [--scope '*']
package/dist/cli/index.js CHANGED
@@ -23,7 +23,7 @@ import * as path from 'path';
23
23
  import * as readline from 'readline';
24
24
  import { getClient } from './api-client.js';
25
25
  import { loadFeltDBConfig, createDefaultConfig, validateModel, } from './config.js';
26
- const VERSION = '0.6.14';
26
+ const VERSION = '0.7.3';
27
27
  function prompt(question) {
28
28
  const rl = readline.createInterface({
29
29
  input: process.stdin,
@@ -1 +1 @@
1
- {"version":3,"file":"collection.d.ts","sourceRoot":"","sources":["../src/collection.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"collection.d.ts","sourceRoot":"","sources":["../src/collection.ts"],"names":[],"mappings":"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"}
@@ -333,7 +333,8 @@ export class Collection {
333
333
  if (!current) {
334
334
  throw new Error(`Record ${id} not found`);
335
335
  }
336
- const updated = { ...current, ...changes };
336
+ const nextVersion = (current.__version || 1) + 1;
337
+ const updated = { ...current, ...changes, __version: nextVersion };
337
338
  const key = `${this.name}:${id}`;
338
339
  const result = await (this.db.update
339
340
  ? this.db.update(key, JSON.stringify(updated))
@@ -1,4 +1,4 @@
1
1
  // One release train keeps generated applications installable. The repository
2
2
  // validation script checks these values against every workspace manifest.
3
- export const FELTDB_PACKAGE_VERSION = '0.7.1';
3
+ export const FELTDB_PACKAGE_VERSION = '0.7.3';
4
4
  export const feltdbPackageRange = `^${FELTDB_PACKAGE_VERSION}`;