@feltdb/core 0.4.11 → 0.4.13

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 (164) hide show
  1. package/dist/cli/commands.js +5 -2
  2. package/dist/cli/index.js +1 -1
  3. package/dist/create/cli.js +16 -1
  4. package/dist/create/create.js +30 -16
  5. package/dist/create/docker-compose-generator.js +48 -9
  6. package/dist/create/package-versions.js +1 -1
  7. package/dist/create/server-source/Cargo.lock +2238 -0
  8. package/dist/create/server-source/Cargo.toml +7 -0
  9. package/dist/create/server-source/crates/feltdb/Cargo.lock +175 -0
  10. package/dist/create/server-source/crates/feltdb/Cargo.toml +79 -0
  11. package/dist/create/server-source/crates/feltdb/benches/baselines/gate-13-redux.json +370 -0
  12. package/dist/create/server-source/crates/feltdb/benches/gate13_baseline.rs +589 -0
  13. package/dist/create/server-source/crates/feltdb/benches/gate13_phase_7_1_release_economics.rs +259 -0
  14. package/dist/create/server-source/crates/feltdb/benches/gate_13_redux.rs +446 -0
  15. package/dist/create/server-source/crates/feltdb/benches/gate_13_regression_runner.rs +272 -0
  16. package/dist/create/server-source/crates/feltdb/benches/gate_14a_concurrent_writer_scaling.rs +378 -0
  17. package/dist/create/server-source/crates/feltdb/benches/gate_14a_production_admission_revalidation.rs +414 -0
  18. package/dist/create/server-source/crates/feltdb/benches/gate_14a_rc2_admission_contract.rs +486 -0
  19. package/dist/create/server-source/crates/feltdb/benches/gate_14a_rc_root_cause.rs +273 -0
  20. package/dist/create/server-source/crates/feltdb/benches/gate_14a_sync1_queued_prototype.rs +587 -0
  21. package/dist/create/server-source/crates/feltdb/benches/gate_14a_sync_economics.rs +513 -0
  22. package/dist/create/server-source/crates/feltdb/benches/gate_14b_causal_backlog_scaling.rs +395 -0
  23. package/dist/create/server-source/crates/feltdb/benches/gate_14c_replication_contract_test.rs +469 -0
  24. package/dist/create/server-source/crates/feltdb/benches/gate_14c_replication_scaling.rs +409 -0
  25. package/dist/create/server-source/crates/feltdb/benches/gate_14d_combined_dimension_scaling.rs +627 -0
  26. package/dist/create/server-source/crates/feltdb/benches/phase_7_1_2_optimization_benchmark.rs +383 -0
  27. package/dist/create/server-source/crates/feltdb/benches/phase_7_1_3_crossover_analysis.rs +298 -0
  28. package/dist/create/server-source/crates/feltdb/src/acceptance_tests.rs +1698 -0
  29. package/dist/create/server-source/crates/feltdb/src/acquisition.rs +286 -0
  30. package/dist/create/server-source/crates/feltdb/src/admission.rs +192 -0
  31. package/dist/create/server-source/crates/feltdb/src/admission_contract_tests.rs +477 -0
  32. package/dist/create/server-source/crates/feltdb/src/adversarial_transport.rs +566 -0
  33. package/dist/create/server-source/crates/feltdb/src/analytics.rs +475 -0
  34. package/dist/create/server-source/crates/feltdb/src/application.rs +2244 -0
  35. package/dist/create/server-source/crates/feltdb/src/application_runtime.rs +1070 -0
  36. package/dist/create/server-source/crates/feltdb/src/authorization.rs +1030 -0
  37. package/dist/create/server-source/crates/feltdb/src/bin/feltdb_node.rs +266 -0
  38. package/dist/create/server-source/crates/feltdb/src/capabilities/mod.rs +8 -0
  39. package/dist/create/server-source/crates/feltdb/src/capabilities/search.rs +418 -0
  40. package/dist/create/server-source/crates/feltdb/src/capabilities/vector.rs +482 -0
  41. package/dist/create/server-source/crates/feltdb/src/capability.rs +903 -0
  42. package/dist/create/server-source/crates/feltdb/src/cardinality_diagnostics.rs +261 -0
  43. package/dist/create/server-source/crates/feltdb/src/cardinality_endpoint.rs +78 -0
  44. package/dist/create/server-source/crates/feltdb/src/causal_dependency_barrier.rs +2214 -0
  45. package/dist/create/server-source/crates/feltdb/src/causal_dependency_barrier_phase_7_1.rs +194 -0
  46. package/dist/create/server-source/crates/feltdb/src/concurrency_fuzzing.rs +427 -0
  47. package/dist/create/server-source/crates/feltdb/src/consistency_contract.rs +453 -0
  48. package/dist/create/server-source/crates/feltdb/src/content_distribution.rs +465 -0
  49. package/dist/create/server-source/crates/feltdb/src/convergence.rs +618 -0
  50. package/dist/create/server-source/crates/feltdb/src/crash_atomic_boundary.rs +418 -0
  51. package/dist/create/server-source/crates/feltdb/src/crash_injection.rs +380 -0
  52. package/dist/create/server-source/crates/feltdb/src/crash_recovery_tests.rs +362 -0
  53. package/dist/create/server-source/crates/feltdb/src/cron.rs +294 -0
  54. package/dist/create/server-source/crates/feltdb/src/distributed_indexing.rs +474 -0
  55. package/dist/create/server-source/crates/feltdb/src/distributed_tests.rs +1003 -0
  56. package/dist/create/server-source/crates/feltdb/src/distributed_transactions.rs +536 -0
  57. package/dist/create/server-source/crates/feltdb/src/durability_guarantees.rs +364 -0
  58. package/dist/create/server-source/crates/feltdb/src/durable_dedup_set.rs +235 -0
  59. package/dist/create/server-source/crates/feltdb/src/durable_operation_log.rs +207 -0
  60. package/dist/create/server-source/crates/feltdb/src/durable_sync.rs +316 -0
  61. package/dist/create/server-source/crates/feltdb/src/execution.rs +426 -0
  62. package/dist/create/server-source/crates/feltdb/src/in_process_transport.rs +219 -0
  63. package/dist/create/server-source/crates/feltdb/src/indexing.rs +779 -0
  64. package/dist/create/server-source/crates/feltdb/src/lib.rs +2838 -0
  65. package/dist/create/server-source/crates/feltdb/src/materialization.rs +184 -0
  66. package/dist/create/server-source/crates/feltdb/src/metrics.rs +267 -0
  67. package/dist/create/server-source/crates/feltdb/src/multi_node_convergence.rs +311 -0
  68. package/dist/create/server-source/crates/feltdb/src/observability.rs +366 -0
  69. package/dist/create/server-source/crates/feltdb/src/operation.rs +251 -0
  70. package/dist/create/server-source/crates/feltdb/src/operation_algebra.rs +438 -0
  71. package/dist/create/server-source/crates/feltdb/src/operation_log.rs +344 -0
  72. package/dist/create/server-source/crates/feltdb/src/partition_reconciliation.rs +477 -0
  73. package/dist/create/server-source/crates/feltdb/src/peer_registry.rs +166 -0
  74. package/dist/create/server-source/crates/feltdb/src/permutation_scheduler.rs +261 -0
  75. package/dist/create/server-source/crates/feltdb/src/persistence_reality.rs +560 -0
  76. package/dist/create/server-source/crates/feltdb/src/phase1b_acceptance.rs +3226 -0
  77. package/dist/create/server-source/crates/feltdb/src/phase1c1_acceptance.rs +201 -0
  78. package/dist/create/server-source/crates/feltdb/src/phase1c2_acceptance.rs +263 -0
  79. package/dist/create/server-source/crates/feltdb/src/phase1c3_acceptance.rs +484 -0
  80. package/dist/create/server-source/crates/feltdb/src/phase1c_atomicity_proof.rs +216 -0
  81. package/dist/create/server-source/crates/feltdb/src/phase5_integration.rs +281 -0
  82. package/dist/create/server-source/crates/feltdb/src/phase5_scenarios.rs +323 -0
  83. package/dist/create/server-source/crates/feltdb/src/phase6_adversarial_scenarios.rs +573 -0
  84. package/dist/create/server-source/crates/feltdb/src/phase6_convergence_validator.rs +404 -0
  85. package/dist/create/server-source/crates/feltdb/src/phase6_persistence.rs +418 -0
  86. package/dist/create/server-source/crates/feltdb/src/phase_1c_real_tcp.rs +381 -0
  87. package/dist/create/server-source/crates/feltdb/src/phase_1c_three_node.rs +523 -0
  88. package/dist/create/server-source/crates/feltdb/src/phase_2a_failures.rs +334 -0
  89. package/dist/create/server-source/crates/feltdb/src/phase_2b_network.rs +306 -0
  90. package/dist/create/server-source/crates/feltdb/src/phase_2c_cascading.rs +355 -0
  91. package/dist/create/server-source/crates/feltdb/src/phase_3_durability.rs +395 -0
  92. package/dist/create/server-source/crates/feltdb/src/phase_4_baseline.rs +346 -0
  93. package/dist/create/server-source/crates/feltdb/src/phase_5_soak.rs +430 -0
  94. package/dist/create/server-source/crates/feltdb/src/production_api.rs +400 -0
  95. package/dist/create/server-source/crates/feltdb/src/provenance.rs +207 -0
  96. package/dist/create/server-source/crates/feltdb/src/query_performance.rs +217 -0
  97. package/dist/create/server-source/crates/feltdb/src/references.rs +404 -0
  98. package/dist/create/server-source/crates/feltdb/src/replay_fuzzing.rs +401 -0
  99. package/dist/create/server-source/crates/feltdb/src/replication_manager.rs +160 -0
  100. package/dist/create/server-source/crates/feltdb/src/replication_protocol.rs +132 -0
  101. package/dist/create/server-source/crates/feltdb/src/routing.rs +409 -0
  102. package/dist/create/server-source/crates/feltdb/src/sharding.rs +523 -0
  103. package/dist/create/server-source/crates/feltdb/src/state_contract.rs +3118 -0
  104. package/dist/create/server-source/crates/feltdb/src/state_hash.rs +291 -0
  105. package/dist/create/server-source/crates/feltdb/src/state_transition_store.rs +376 -0
  106. package/dist/create/server-source/crates/feltdb/src/storage.rs +267 -0
  107. package/dist/create/server-source/crates/feltdb/src/submission.rs +477 -0
  108. package/dist/create/server-source/crates/feltdb/src/sync.rs +483 -0
  109. package/dist/create/server-source/crates/feltdb/src/sync_contract.rs +822 -0
  110. package/dist/create/server-source/crates/feltdb/src/tcp_transport.rs +366 -0
  111. package/dist/create/server-source/crates/feltdb/src/transaction_api.rs +473 -0
  112. package/dist/create/server-source/crates/feltdb/src/transaction_invariants.rs +949 -0
  113. package/dist/create/server-source/crates/feltdb/src/transactions.rs +646 -0
  114. package/dist/create/server-source/crates/feltdb/src/trigger.rs +390 -0
  115. package/dist/create/server-source/crates/feltdb/src/worker_mesh.rs +928 -0
  116. package/dist/create/server-source/crates/feltdb/src/workflow.rs +713 -0
  117. package/dist/create/server-source/crates/feltdb/src/workflow_acceptance_tests.rs +510 -0
  118. package/dist/create/server-source/crates/feltdb/src/workflow_integration.rs +354 -0
  119. package/dist/create/server-source/crates/feltdb/src/workflow_runtime.rs +594 -0
  120. package/dist/create/server-source/crates/feltdb/src/workload.rs +1310 -0
  121. package/dist/create/server-source/crates/feltdb-server/Cargo.toml +23 -0
  122. package/dist/create/server-source/crates/feltdb-server/README.md +79 -0
  123. package/dist/create/server-source/crates/feltdb-server/src/app_state.rs +73 -0
  124. package/dist/create/server-source/crates/feltdb-server/src/application_contract.rs +425 -0
  125. package/dist/create/server-source/crates/feltdb-server/src/artifacts.rs +449 -0
  126. package/dist/create/server-source/crates/feltdb-server/src/audit.rs +59 -0
  127. package/dist/create/server-source/crates/feltdb-server/src/auth.rs +308 -0
  128. package/dist/create/server-source/crates/feltdb-server/src/authorization.rs +228 -0
  129. package/dist/create/server-source/crates/feltdb-server/src/backup.rs +416 -0
  130. package/dist/create/server-source/crates/feltdb-server/src/causal.rs +218 -0
  131. package/dist/create/server-source/crates/feltdb-server/src/certification.rs +223 -0
  132. package/dist/create/server-source/crates/feltdb-server/src/clock.rs +132 -0
  133. package/dist/create/server-source/crates/feltdb-server/src/cluster.rs +165 -0
  134. package/dist/create/server-source/crates/feltdb-server/src/connections.rs +1044 -0
  135. package/dist/create/server-source/crates/feltdb-server/src/content.rs +111 -0
  136. package/dist/create/server-source/crates/feltdb-server/src/identity.rs +250 -0
  137. package/dist/create/server-source/crates/feltdb-server/src/key_management.rs +78 -0
  138. package/dist/create/server-source/crates/feltdb-server/src/key_provider.rs +247 -0
  139. package/dist/create/server-source/crates/feltdb-server/src/leases.rs +123 -0
  140. package/dist/create/server-source/crates/feltdb-server/src/lib.rs +25 -0
  141. package/dist/create/server-source/crates/feltdb-server/src/main.rs +8715 -0
  142. package/dist/create/server-source/crates/feltdb-server/src/metrics.rs +97 -0
  143. package/dist/create/server-source/crates/feltdb-server/src/portable_bundle.rs +350 -0
  144. package/dist/create/server-source/crates/feltdb-server/src/principals.rs +510 -0
  145. package/dist/create/server-source/crates/feltdb-server/src/providers.rs +269 -0
  146. package/dist/create/server-source/crates/feltdb-server/src/releases.rs +2563 -0
  147. package/dist/create/server-source/crates/feltdb-server/src/sessions.rs +156 -0
  148. package/dist/create/server-source/crates/feltdb-server/src/tenancy.rs +1097 -0
  149. package/dist/create/server-source/crates/feltdb-server/src/versions.rs +264 -0
  150. package/dist/create/server-source/crates/feltdb-wasm/Cargo.toml +31 -0
  151. package/dist/create/server-source/crates/feltdb-wasm/src/lib.rs +1086 -0
  152. package/dist/create/server-source/crates/feltdb-wasm/test.db +0 -0
  153. package/dist/flowspec.d.ts +2 -0
  154. package/dist/flowspec.d.ts.map +1 -1
  155. package/dist/flowspec.js +28 -4
  156. package/dist/state-contract.d.ts +7 -1
  157. package/dist/state-contract.d.ts.map +1 -1
  158. package/dist/studio/components/ApplicationDesigner.d.ts.map +1 -1
  159. package/dist/studio/components/index.js +1 -1
  160. package/dist/studio/{components-q43NSTTH.js → components-bHTARBin.js} +160 -89
  161. package/dist/studio/index.js +31 -28
  162. package/dist/studio-app/assets/{index-DZpBoVMp.js → index-BqKquLuU.js} +8 -8
  163. package/dist/studio-app/index.html +1 -1
  164. package/package.json +1 -1
@@ -7,7 +7,7 @@ import http from 'http';
7
7
  import { createRequire } from 'module';
8
8
  import { spawn, spawnSync } from 'child_process';
9
9
  import { createFeltDB, diffFlowSpec, formatFlowSpec, parseFlowSpec, planFlowSpecMigration, validateFlowSpec } from '@feltdb/core';
10
- const RELEASE_VERSION = '0.4.11';
10
+ const RELEASE_VERSION = '0.4.13';
11
11
  function loadProjectEnvironment(file = path.resolve('.env.local')) {
12
12
  if (!fs.existsSync(file))
13
13
  return;
@@ -699,6 +699,9 @@ async function handleStudio(args) {
699
699
  const port = args.includes('--port')
700
700
  ? args[args.indexOf('--port') + 1] || '3000'
701
701
  : '3000';
702
+ const host = args.includes('--host')
703
+ ? args[args.indexOf('--host') + 1] || '127.0.0.1'
704
+ : '127.0.0.1';
702
705
  const open = !args.includes('--no-open');
703
706
  const namespace = args.includes('--namespace')
704
707
  ? args[args.indexOf('--namespace') + 1] || 'default'
@@ -745,7 +748,7 @@ async function handleStudio(args) {
745
748
  response.setHeader('Cache-Control', file.endsWith('index.html') ? 'no-store' : 'public, max-age=31536000, immutable');
746
749
  fs.createReadStream(file).pipe(response);
747
750
  });
748
- await new Promise((resolve, reject) => { server.once('error', reject); server.listen(Number(port), '127.0.0.1', resolve); });
751
+ await new Promise((resolve, reject) => { server.once('error', reject); server.listen(Number(port), host, resolve); });
749
752
  const parameters = new URLSearchParams({ namespace, runtime });
750
753
  if (connectUrl)
751
754
  parameters.set('connect', connectUrl);
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.4.11';
26
+ const VERSION = '0.4.13';
27
27
  function prompt(question) {
28
28
  const rl = readline.createInterface({
29
29
  input: process.stdin,
@@ -18,6 +18,7 @@ function parseArgs(args) {
18
18
  framework: 'react',
19
19
  distributed: true,
20
20
  agents: true,
21
+ webllm: true,
21
22
  capabilities: 'search',
22
23
  };
23
24
  for (let i = 0; i < args.length; i++) {
@@ -46,6 +47,12 @@ function parseArgs(args) {
46
47
  case '--no-agents':
47
48
  options.agents = false;
48
49
  break;
50
+ case '--webllm':
51
+ options.webllm = true;
52
+ break;
53
+ case '--no-webllm':
54
+ options.webllm = false;
55
+ break;
49
56
  case '--capabilities':
50
57
  options.capabilities = args[++i];
51
58
  break;
@@ -161,6 +168,10 @@ async function promptForOptions(defaults) {
161
168
  ], defaults.framework),
162
169
  distributed: await select('Enable distributed operation?', yesNo, defaults.distributed),
163
170
  agents: await select('Include an autonomous agent example?', yesNo, defaults.agents),
171
+ webllm: await select('Install WebLLM for private natural-language app building?', [
172
+ { label: 'Yes', value: true, description: 'build FeltDB schemas, capabilities, workflows, and UI locally with AI' },
173
+ { label: 'No', value: false, description: 'skip the browser model and AI builder' },
174
+ ], defaults.webllm),
164
175
  capabilities: await select('Choose starter capabilities:', [
165
176
  { label: 'Search', value: 'search' },
166
177
  { label: 'Vector search', value: 'vector' },
@@ -212,6 +223,8 @@ Options:
212
223
  --framework <framework> Choose framework: react or vanilla (default: react)
213
224
  --no-distributed Disable distributed operation
214
225
  --no-agents Exclude agent examples
226
+ --webllm Include the private natural-language FeltDB app builder (default)
227
+ --no-webllm Do not install WebLLM or generate the AI builder
215
228
  --capabilities <list> Choose capabilities: search, vector, or search,vector
216
229
  --no-install Skip npm install
217
230
  --no-start Skip npm run dev
@@ -269,6 +282,7 @@ Learn more: https://github.com/rkendel1/feltdb`);
269
282
  console.log(`Framework: ${options.framework}`);
270
283
  console.log(`Distributed: ${options.distributed ? 'yes' : 'no'}`);
271
284
  console.log(`Agents: ${options.agents ? 'yes' : 'no'}`);
285
+ console.log(`WebLLM: ${options.webllm ? 'yes — natural-language app builder' : 'no'}`);
272
286
  console.log(`Capabilities: ${options.capabilities}`);
273
287
  console.log('\n═══════════════════════════════════════════════\n');
274
288
  const projectDir = path.resolve(process.cwd(), projectName);
@@ -281,6 +295,7 @@ Learn more: https://github.com/rkendel1/feltdb`);
281
295
  framework: options.framework,
282
296
  distributed: options.distributed,
283
297
  agents: options.agents,
298
+ webllm: options.webllm,
284
299
  capabilities: options.capabilities,
285
300
  });
286
301
  if (options.runtime === 'managed') {
@@ -297,7 +312,7 @@ Learn more: https://github.com/rkendel1/feltdb`);
297
312
  console.log('\n✅ FeltDB application created successfully!\n');
298
313
  const npm = process.platform === 'win32' ? 'npm.cmd' : 'npm';
299
314
  if (shouldInstall) {
300
- console.log('📦 Installing application, Studio, and local AI dependencies...\n');
315
+ console.log(`📦 Installing application, Studio${options.webllm ? ', and local WebLLM app builder' : ''} dependencies...\n`);
301
316
  await run(npm, ['install'], projectDir);
302
317
  }
303
318
  if (shouldStart) {
@@ -3,8 +3,10 @@
3
3
  */
4
4
  import fs from 'fs';
5
5
  import path from 'path';
6
+ import { fileURLToPath } from 'url';
7
+ import { randomBytes } from 'crypto';
6
8
  import { feltdbPackageRange } from './package-versions.js';
7
- import { generateDockerCompose, generateDockerfile, generateDockerIgnore, generateDotEnvLocal, } from './docker-compose-generator.js';
9
+ import { generateDockerCompose, generateDockerfile, generateDockerIgnore, generateDotEnvLocal, generateFeltDBDockerfile, generateStudioDockerfile, } from './docker-compose-generator.js';
8
10
  export async function createProject(options) {
9
11
  const { projectName, templatesDir } = options;
10
12
  const projectDir = path.resolve(process.cwd(), projectName);
@@ -29,6 +31,7 @@ export async function createProject(options) {
29
31
  const framework = options.framework || 'react';
30
32
  const distributed = options.distributed !== false;
31
33
  const hasAgents = options.agents !== false;
34
+ const hasWebLLM = options.webllm !== false;
32
35
  const capabilities = options.capabilities || 'search';
33
36
  // Create package.json
34
37
  const packageJson = {
@@ -65,7 +68,7 @@ export async function createProject(options) {
65
68
  packageJson.devDependencies['@types/react'] = '^18.0.0';
66
69
  packageJson.devDependencies['@types/react-dom'] = '^18.0.0';
67
70
  }
68
- if (hasAgents) {
71
+ if (hasAgents && hasWebLLM) {
69
72
  packageJson.dependencies['@feltdb/webllm'] = feltdbPackageRange;
70
73
  }
71
74
  fs.writeFileSync(path.join(projectDir, 'package.json'), JSON.stringify(packageJson, null, 2));
@@ -345,7 +348,7 @@ async function logActivity(event: Omit<ActivityEvent, 'id' | 'timestamp'>): Prom
345
348
  `;
346
349
  fs.writeFileSync(path.join(srcDir, 'feltdb.ts'), feltdbTs);
347
350
  // Create a real local-inference agent for browser projects.
348
- if (hasAgents) {
351
+ if (hasAgents && hasWebLLM) {
349
352
  const agentTs = `import { WebLLMProvider } from '@feltdb/webllm';
350
353
  import { db, reports } from '../../src/feltdb';
351
354
 
@@ -385,15 +388,19 @@ export async function runResearcher(
385
388
  }
386
389
 
387
390
  try {
388
- const systemPrompt = \`You are a helpful AI assistant that operates entirely in the browser.
389
- You help users:
390
- - Summarize documents concisely
391
- - Expand and enhance text with more details
392
- - Generate ideas and suggestions
393
- - Improve writing clarity and structure
394
- - Answer questions about document content
391
+ const systemPrompt = \`You are the private, in-browser FeltDB application builder.
392
+ Turn natural-language product requirements into valid, coherent FeltDB applications. You know the
393
+ Flow DSL and keep collections, references, indexes, capabilities, workflows, triggers, policies,
394
+ agents, and React UI code consistent with one another.
395
395
 
396
- Always be concise and practical. Respect the user's intent.\`;
396
+ Supported field types are text, integer, number, decimal, money, bigint, boolean, datetime, date,
397
+ time, uuid, email, url, phone, json, object, binary, file, geo, enum(...), array<T>, map<T>,
398
+ vector<N>, and ref Collection. Prefer UUID identifiers, explicit references, precise domain types,
399
+ least-privilege capabilities, and policies for every writable collection. Never invent syntax.
400
+
401
+ When asked to build or change an app, return a short implementation plan followed by complete
402
+ copy-ready feltdb.flow and TypeScript/React code blocks. Preserve the existing app model supplied
403
+ by the user and clearly identify files to create or replace. All inference remains local.\`;
397
404
 
398
405
  const content = await provider.generate([
399
406
  { role: 'system', content: systemPrompt },
@@ -537,10 +544,10 @@ export const capabilities = {
537
544
  fs.writeFileSync(path.join(feltdbDir, 'capabilities', 'index.ts'), capabilitiesTs);
538
545
  // Create main application file based on framework
539
546
  if (framework === 'react') {
540
- const agentImport = hasAgents
547
+ const agentImport = hasAgents && hasWebLLM
541
548
  ? "import { runResearcher, summarizeDocument, enhanceDocument, generateIdeas, generateFeltDBFeature, generateReactComponent, generateCapability } from '../feltdb/agents/researcher';"
542
549
  : '';
543
- const agentState = hasAgents
550
+ const agentState = hasAgents && hasWebLLM
544
551
  ? ` const [prompt, setPrompt] = useState('');
545
552
  const [answer, setAnswer] = useState('');
546
553
  const [modelStatus, setModelStatus] = useState('Model not loaded');
@@ -548,7 +555,7 @@ export const capabilities = {
548
555
  const [selectedDoc, setSelectedDoc] = useState<any | null>(null);
549
556
  const [aiMode, setAiMode] = useState<'custom' | 'summarize' | 'enhance' | 'ideas' | 'feltdb' | 'react' | 'capability'>('custom');`
550
557
  : '';
551
- const agentHandler = hasAgents
558
+ const agentHandler = hasAgents && hasWebLLM
552
559
  ? `
553
560
  const handleRunAI = async (mode: 'custom' | 'summarize' | 'enhance' | 'ideas' | 'feltdb' | 'react' | 'capability') => {
554
561
  setGenerating(true);
@@ -582,7 +589,7 @@ export const capabilities = {
582
589
  };
583
590
  `
584
591
  : '';
585
- const agentMarkup = hasAgents
592
+ const agentMarkup = hasAgents && hasWebLLM
586
593
  ? `
587
594
  <section className="researcher">
588
595
  <h2>🤖 AI Assistant (Private, Local)</h2>
@@ -1230,8 +1237,15 @@ NODE_ENV=development
1230
1237
  };
1231
1238
  fs.writeFileSync(path.join(projectDir, 'docker-compose.yml'), generateDockerCompose(dockerConfig));
1232
1239
  fs.writeFileSync(path.join(projectDir, 'Dockerfile'), generateDockerfile(dockerConfig, framework));
1240
+ fs.writeFileSync(path.join(projectDir, 'Dockerfile.feltdb'), generateFeltDBDockerfile(dockerConfig));
1241
+ fs.writeFileSync(path.join(projectDir, 'Dockerfile.studio'), generateStudioDockerfile(dockerConfig));
1242
+ const serverSource = fileURLToPath(new URL('./server-source', import.meta.url));
1243
+ fs.cpSync(serverSource, path.join(projectDir, '.feltdb', 'server-source'), { recursive: true });
1233
1244
  fs.writeFileSync(path.join(projectDir, '.dockerignore'), generateDockerIgnore());
1234
- fs.writeFileSync(path.join(projectDir, '.env.docker'), generateDotEnvLocal(dockerConfig));
1245
+ const dockerEnvironment = generateDotEnvLocal(dockerConfig, randomBytes(32).toString('hex'));
1246
+ fs.writeFileSync(path.join(projectDir, '.env.docker'), dockerEnvironment);
1247
+ // Docker Compose loads .env automatically; it is already excluded from git.
1248
+ fs.writeFileSync(path.join(projectDir, '.env'), dockerEnvironment);
1235
1249
  }
1236
1250
  // Create RUNTIME_GUIDE.md
1237
1251
  const runtimeGuide = `# Runtime Configuration Guide
@@ -2,26 +2,28 @@
2
2
  * Docker Compose generator for self-hosted FeltDB deployments
3
3
  *
4
4
  * Generates:
5
- * - docker-compose.yml with three services (FeltDB, App, Studio)
6
- * - Dockerfile for application container
5
+ * - docker-compose.yml with three locally buildable services
6
+ * - Dockerfiles for the FeltDB server, application, and Studio
7
7
  * - .dockerignore for optimized builds
8
8
  * - Environment configuration
9
9
  */
10
10
  export function generateDockerCompose(config) {
11
11
  return `services:
12
12
  feltdb:
13
- image: \${FELTDB_IMAGE:-ghcr.io/rkendel1/feltdb:${config.version}}
13
+ image: \${FELTDB_IMAGE:-${config.appName.toLowerCase().replace(/[^a-z0-9]/g, '-')}-feltdb:${config.version}}
14
+ build:
15
+ context: .
16
+ dockerfile: Dockerfile.feltdb
14
17
  container_name: \${COMPOSE_PROJECT_NAME}-feltdb
15
18
  environment:
16
19
  FELTDB_APP_NAME: \${FELTDB_APP_NAME:-${config.appName}}
17
20
  FELTDB_APP_ID: \${FELTDB_APP_ID:-${config.appId}}
18
21
  FELTDB_VERSION: \${FELTDB_VERSION:-${config.version}}
19
22
  FELTDB_PEERS: \${FELTDB_PEERS:-}
20
- FELTDB_REPLICATION_PORT: ${config.replicationPort}
23
+ FELTDB_MASTER_KEY: \${FELTDB_MASTER_KEY}
21
24
  NODE_ENV: \${NODE_ENV:-production}
22
25
  ports:
23
26
  - "\${FELTDB_API_PORT:-${config.port}}:7700"
24
- - "\${FELTDB_REPLICATION_PORT:-${config.replicationPort}}:${config.replicationPort}"
25
27
  volumes:
26
28
  - feltdb_data:/data
27
29
  - ./feltdb.flow:/app/feltdb.flow:ro
@@ -69,11 +71,17 @@ export function generateDockerCompose(config) {
69
71
  app.feltdb/version: "${config.version}"
70
72
 
71
73
  studio:
72
- image: rkendel1/feltdb-studio:latest
74
+ image: \${STUDIO_IMAGE:-${config.appName.toLowerCase().replace(/[^a-z0-9]/g, '-')}-studio:${config.version}}
75
+ build:
76
+ context: .
77
+ dockerfile: Dockerfile.studio
78
+ args:
79
+ FELTDB_VERSION: ${config.version}
73
80
  container_name: \${COMPOSE_PROJECT_NAME}-studio
74
81
  environment:
75
- FELTDB_API_URL: http://feltdb:7700
76
- APP_URL: http://app:3000
82
+ FELTDB_API_URL: \${FELTDB_PUBLIC_URL:-http://127.0.0.1:${config.port}}
83
+ APP_URL: \${APP_PUBLIC_URL:-http://127.0.0.1:5173}
84
+ FELTDB_NAMESPACE: \${FELTDB_APP_ID:-${config.appId}}
77
85
  ports:
78
86
  - "\${STUDIO_PORT:-${config.studioPort}}:8000"
79
87
  depends_on:
@@ -97,6 +105,36 @@ volumes:
97
105
  app.feltdb/data: "durable-operations-log"
98
106
  `;
99
107
  }
108
+ export function generateFeltDBDockerfile(config) {
109
+ return `# FeltDB server source is bundled with create-feltdb for a reproducible build.
110
+ FROM rust:1.96-alpine AS builder
111
+ RUN apk add --no-cache pkgconf openssl-dev musl-dev
112
+ WORKDIR /source
113
+ COPY .feltdb/server-source/ ./
114
+ RUN cargo build -p feltdb-server --release --locked
115
+
116
+ FROM alpine:3.22
117
+ RUN apk add --no-cache ca-certificates curl tini
118
+ COPY --from=builder /source/target/release/feltdb-server /usr/local/bin/feltdb-server
119
+ RUN adduser -D -u 1000 feltdb && mkdir -p /data && chown feltdb:feltdb /data
120
+ USER feltdb
121
+ EXPOSE 7700
122
+ HEALTHCHECK --interval=10s --timeout=5s --start-period=30s --retries=3 CMD curl -fsS http://127.0.0.1:7700/health || exit 1
123
+ ENTRYPOINT ["/sbin/tini", "--"]
124
+ CMD ["feltdb-server", "--host", "0.0.0.0", "--port", "7700", "--namespace", "${config.appId}", "--data", "/data/feltdb.log", "--allow-origin", "http://127.0.0.1:5173", "--allow-origin", "http://127.0.0.1:${config.studioPort}"]
125
+ `;
126
+ }
127
+ export function generateStudioDockerfile(config) {
128
+ return `# FeltDB Studio served by the same version as this generated project.
129
+ FROM node:22-alpine
130
+ ARG FELTDB_VERSION=${config.version}
131
+ RUN npm install --global "@feltdb/core@\${FELTDB_VERSION}" && npm cache clean --force
132
+ WORKDIR /project
133
+ COPY feltdb.flow ./feltdb.flow
134
+ EXPOSE 8000
135
+ CMD ["sh", "-c", "feltdb studio --host 0.0.0.0 --port 8000 --namespace \"\${FELTDB_NAMESPACE}\" --runtime self-hosted --connect \"\${FELTDB_API_URL}\" --app-url \"\${APP_URL}\" --no-open"]
136
+ `;
137
+ }
100
138
  export function generateDockerfile(config, framework) {
101
139
  const buildCommand = 'npm run build';
102
140
  return `# FeltDB Application Container
@@ -143,7 +181,7 @@ coverage
143
181
  .turbo
144
182
  `;
145
183
  }
146
- export function generateDotEnvLocal(config) {
184
+ export function generateDotEnvLocal(config, masterKey = '') {
147
185
  return `# Docker Compose Environment
148
186
  # Generated by create-feltdb for \${config.appName}
149
187
 
@@ -156,6 +194,7 @@ FELTDB_VERSION=${config.version}
156
194
  FELTDB_API_PORT=${config.port}
157
195
  FELTDB_REPLICATION_PORT=${config.replicationPort}
158
196
  FELTDB_PEERS=
197
+ FELTDB_MASTER_KEY=${masterKey}
159
198
 
160
199
  # Application Configuration
161
200
  APP_PORT=3000
@@ -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.4.11';
3
+ export const FELTDB_PACKAGE_VERSION = '0.4.13';
4
4
  export const feltdbPackageRange = `^${FELTDB_PACKAGE_VERSION}`;