create-feltdb 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.
- package/dist/cli.js +16 -1
- package/dist/create.js +30 -16
- package/dist/docker-compose-generator.js +48 -9
- package/dist/package-versions.js +1 -1
- package/dist/server-source/Cargo.lock +2238 -0
- package/dist/server-source/Cargo.toml +7 -0
- package/dist/server-source/crates/feltdb/Cargo.lock +175 -0
- package/dist/server-source/crates/feltdb/Cargo.toml +79 -0
- package/dist/server-source/crates/feltdb/benches/baselines/gate-13-redux.json +370 -0
- package/dist/server-source/crates/feltdb/benches/gate13_baseline.rs +589 -0
- package/dist/server-source/crates/feltdb/benches/gate13_phase_7_1_release_economics.rs +259 -0
- package/dist/server-source/crates/feltdb/benches/gate_13_redux.rs +446 -0
- package/dist/server-source/crates/feltdb/benches/gate_13_regression_runner.rs +272 -0
- package/dist/server-source/crates/feltdb/benches/gate_14a_concurrent_writer_scaling.rs +378 -0
- package/dist/server-source/crates/feltdb/benches/gate_14a_production_admission_revalidation.rs +414 -0
- package/dist/server-source/crates/feltdb/benches/gate_14a_rc2_admission_contract.rs +486 -0
- package/dist/server-source/crates/feltdb/benches/gate_14a_rc_root_cause.rs +273 -0
- package/dist/server-source/crates/feltdb/benches/gate_14a_sync1_queued_prototype.rs +587 -0
- package/dist/server-source/crates/feltdb/benches/gate_14a_sync_economics.rs +513 -0
- package/dist/server-source/crates/feltdb/benches/gate_14b_causal_backlog_scaling.rs +395 -0
- package/dist/server-source/crates/feltdb/benches/gate_14c_replication_contract_test.rs +469 -0
- package/dist/server-source/crates/feltdb/benches/gate_14c_replication_scaling.rs +409 -0
- package/dist/server-source/crates/feltdb/benches/gate_14d_combined_dimension_scaling.rs +627 -0
- package/dist/server-source/crates/feltdb/benches/phase_7_1_2_optimization_benchmark.rs +383 -0
- package/dist/server-source/crates/feltdb/benches/phase_7_1_3_crossover_analysis.rs +298 -0
- package/dist/server-source/crates/feltdb/src/acceptance_tests.rs +1698 -0
- package/dist/server-source/crates/feltdb/src/acquisition.rs +286 -0
- package/dist/server-source/crates/feltdb/src/admission.rs +192 -0
- package/dist/server-source/crates/feltdb/src/admission_contract_tests.rs +477 -0
- package/dist/server-source/crates/feltdb/src/adversarial_transport.rs +566 -0
- package/dist/server-source/crates/feltdb/src/analytics.rs +475 -0
- package/dist/server-source/crates/feltdb/src/application.rs +2244 -0
- package/dist/server-source/crates/feltdb/src/application_runtime.rs +1070 -0
- package/dist/server-source/crates/feltdb/src/authorization.rs +1030 -0
- package/dist/server-source/crates/feltdb/src/bin/feltdb_node.rs +266 -0
- package/dist/server-source/crates/feltdb/src/capabilities/mod.rs +8 -0
- package/dist/server-source/crates/feltdb/src/capabilities/search.rs +418 -0
- package/dist/server-source/crates/feltdb/src/capabilities/vector.rs +482 -0
- package/dist/server-source/crates/feltdb/src/capability.rs +903 -0
- package/dist/server-source/crates/feltdb/src/cardinality_diagnostics.rs +261 -0
- package/dist/server-source/crates/feltdb/src/cardinality_endpoint.rs +78 -0
- package/dist/server-source/crates/feltdb/src/causal_dependency_barrier.rs +2214 -0
- package/dist/server-source/crates/feltdb/src/causal_dependency_barrier_phase_7_1.rs +194 -0
- package/dist/server-source/crates/feltdb/src/concurrency_fuzzing.rs +427 -0
- package/dist/server-source/crates/feltdb/src/consistency_contract.rs +453 -0
- package/dist/server-source/crates/feltdb/src/content_distribution.rs +465 -0
- package/dist/server-source/crates/feltdb/src/convergence.rs +618 -0
- package/dist/server-source/crates/feltdb/src/crash_atomic_boundary.rs +418 -0
- package/dist/server-source/crates/feltdb/src/crash_injection.rs +380 -0
- package/dist/server-source/crates/feltdb/src/crash_recovery_tests.rs +362 -0
- package/dist/server-source/crates/feltdb/src/cron.rs +294 -0
- package/dist/server-source/crates/feltdb/src/distributed_indexing.rs +474 -0
- package/dist/server-source/crates/feltdb/src/distributed_tests.rs +1003 -0
- package/dist/server-source/crates/feltdb/src/distributed_transactions.rs +536 -0
- package/dist/server-source/crates/feltdb/src/durability_guarantees.rs +364 -0
- package/dist/server-source/crates/feltdb/src/durable_dedup_set.rs +235 -0
- package/dist/server-source/crates/feltdb/src/durable_operation_log.rs +207 -0
- package/dist/server-source/crates/feltdb/src/durable_sync.rs +316 -0
- package/dist/server-source/crates/feltdb/src/execution.rs +426 -0
- package/dist/server-source/crates/feltdb/src/in_process_transport.rs +219 -0
- package/dist/server-source/crates/feltdb/src/indexing.rs +779 -0
- package/dist/server-source/crates/feltdb/src/lib.rs +2838 -0
- package/dist/server-source/crates/feltdb/src/materialization.rs +184 -0
- package/dist/server-source/crates/feltdb/src/metrics.rs +267 -0
- package/dist/server-source/crates/feltdb/src/multi_node_convergence.rs +311 -0
- package/dist/server-source/crates/feltdb/src/observability.rs +366 -0
- package/dist/server-source/crates/feltdb/src/operation.rs +251 -0
- package/dist/server-source/crates/feltdb/src/operation_algebra.rs +438 -0
- package/dist/server-source/crates/feltdb/src/operation_log.rs +344 -0
- package/dist/server-source/crates/feltdb/src/partition_reconciliation.rs +477 -0
- package/dist/server-source/crates/feltdb/src/peer_registry.rs +166 -0
- package/dist/server-source/crates/feltdb/src/permutation_scheduler.rs +261 -0
- package/dist/server-source/crates/feltdb/src/persistence_reality.rs +560 -0
- package/dist/server-source/crates/feltdb/src/phase1b_acceptance.rs +3226 -0
- package/dist/server-source/crates/feltdb/src/phase1c1_acceptance.rs +201 -0
- package/dist/server-source/crates/feltdb/src/phase1c2_acceptance.rs +263 -0
- package/dist/server-source/crates/feltdb/src/phase1c3_acceptance.rs +484 -0
- package/dist/server-source/crates/feltdb/src/phase1c_atomicity_proof.rs +216 -0
- package/dist/server-source/crates/feltdb/src/phase5_integration.rs +281 -0
- package/dist/server-source/crates/feltdb/src/phase5_scenarios.rs +323 -0
- package/dist/server-source/crates/feltdb/src/phase6_adversarial_scenarios.rs +573 -0
- package/dist/server-source/crates/feltdb/src/phase6_convergence_validator.rs +404 -0
- package/dist/server-source/crates/feltdb/src/phase6_persistence.rs +418 -0
- package/dist/server-source/crates/feltdb/src/phase_1c_real_tcp.rs +381 -0
- package/dist/server-source/crates/feltdb/src/phase_1c_three_node.rs +523 -0
- package/dist/server-source/crates/feltdb/src/phase_2a_failures.rs +334 -0
- package/dist/server-source/crates/feltdb/src/phase_2b_network.rs +306 -0
- package/dist/server-source/crates/feltdb/src/phase_2c_cascading.rs +355 -0
- package/dist/server-source/crates/feltdb/src/phase_3_durability.rs +395 -0
- package/dist/server-source/crates/feltdb/src/phase_4_baseline.rs +346 -0
- package/dist/server-source/crates/feltdb/src/phase_5_soak.rs +430 -0
- package/dist/server-source/crates/feltdb/src/production_api.rs +400 -0
- package/dist/server-source/crates/feltdb/src/provenance.rs +207 -0
- package/dist/server-source/crates/feltdb/src/query_performance.rs +217 -0
- package/dist/server-source/crates/feltdb/src/references.rs +404 -0
- package/dist/server-source/crates/feltdb/src/replay_fuzzing.rs +401 -0
- package/dist/server-source/crates/feltdb/src/replication_manager.rs +160 -0
- package/dist/server-source/crates/feltdb/src/replication_protocol.rs +132 -0
- package/dist/server-source/crates/feltdb/src/routing.rs +409 -0
- package/dist/server-source/crates/feltdb/src/sharding.rs +523 -0
- package/dist/server-source/crates/feltdb/src/state_contract.rs +3118 -0
- package/dist/server-source/crates/feltdb/src/state_hash.rs +291 -0
- package/dist/server-source/crates/feltdb/src/state_transition_store.rs +376 -0
- package/dist/server-source/crates/feltdb/src/storage.rs +267 -0
- package/dist/server-source/crates/feltdb/src/submission.rs +477 -0
- package/dist/server-source/crates/feltdb/src/sync.rs +483 -0
- package/dist/server-source/crates/feltdb/src/sync_contract.rs +822 -0
- package/dist/server-source/crates/feltdb/src/tcp_transport.rs +366 -0
- package/dist/server-source/crates/feltdb/src/transaction_api.rs +473 -0
- package/dist/server-source/crates/feltdb/src/transaction_invariants.rs +949 -0
- package/dist/server-source/crates/feltdb/src/transactions.rs +646 -0
- package/dist/server-source/crates/feltdb/src/trigger.rs +390 -0
- package/dist/server-source/crates/feltdb/src/worker_mesh.rs +928 -0
- package/dist/server-source/crates/feltdb/src/workflow.rs +713 -0
- package/dist/server-source/crates/feltdb/src/workflow_acceptance_tests.rs +510 -0
- package/dist/server-source/crates/feltdb/src/workflow_integration.rs +354 -0
- package/dist/server-source/crates/feltdb/src/workflow_runtime.rs +594 -0
- package/dist/server-source/crates/feltdb/src/workload.rs +1310 -0
- package/dist/server-source/crates/feltdb-server/Cargo.toml +23 -0
- package/dist/server-source/crates/feltdb-server/README.md +79 -0
- package/dist/server-source/crates/feltdb-server/src/app_state.rs +73 -0
- package/dist/server-source/crates/feltdb-server/src/application_contract.rs +425 -0
- package/dist/server-source/crates/feltdb-server/src/artifacts.rs +449 -0
- package/dist/server-source/crates/feltdb-server/src/audit.rs +59 -0
- package/dist/server-source/crates/feltdb-server/src/auth.rs +308 -0
- package/dist/server-source/crates/feltdb-server/src/authorization.rs +228 -0
- package/dist/server-source/crates/feltdb-server/src/backup.rs +416 -0
- package/dist/server-source/crates/feltdb-server/src/causal.rs +218 -0
- package/dist/server-source/crates/feltdb-server/src/certification.rs +223 -0
- package/dist/server-source/crates/feltdb-server/src/clock.rs +132 -0
- package/dist/server-source/crates/feltdb-server/src/cluster.rs +165 -0
- package/dist/server-source/crates/feltdb-server/src/connections.rs +1044 -0
- package/dist/server-source/crates/feltdb-server/src/content.rs +111 -0
- package/dist/server-source/crates/feltdb-server/src/identity.rs +250 -0
- package/dist/server-source/crates/feltdb-server/src/key_management.rs +78 -0
- package/dist/server-source/crates/feltdb-server/src/key_provider.rs +247 -0
- package/dist/server-source/crates/feltdb-server/src/leases.rs +123 -0
- package/dist/server-source/crates/feltdb-server/src/lib.rs +25 -0
- package/dist/server-source/crates/feltdb-server/src/main.rs +8715 -0
- package/dist/server-source/crates/feltdb-server/src/metrics.rs +97 -0
- package/dist/server-source/crates/feltdb-server/src/portable_bundle.rs +350 -0
- package/dist/server-source/crates/feltdb-server/src/principals.rs +510 -0
- package/dist/server-source/crates/feltdb-server/src/providers.rs +269 -0
- package/dist/server-source/crates/feltdb-server/src/releases.rs +2563 -0
- package/dist/server-source/crates/feltdb-server/src/sessions.rs +156 -0
- package/dist/server-source/crates/feltdb-server/src/tenancy.rs +1097 -0
- package/dist/server-source/crates/feltdb-server/src/versions.rs +264 -0
- package/dist/server-source/crates/feltdb-wasm/Cargo.toml +31 -0
- package/dist/server-source/crates/feltdb-wasm/src/lib.rs +1086 -0
- package/dist/server-source/crates/feltdb-wasm/test.db +0 -0
- package/package.json +3 -3
package/dist/cli.js
CHANGED
|
@@ -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(
|
|
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) {
|
package/dist/create.js
CHANGED
|
@@ -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
|
|
389
|
-
You
|
|
390
|
-
|
|
391
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
6
|
-
* -
|
|
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
|
|
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
|
-
|
|
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:
|
|
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://
|
|
76
|
-
APP_URL: http://
|
|
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
|
package/dist/package-versions.js
CHANGED
|
@@ -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.
|
|
3
|
+
export const FELTDB_PACKAGE_VERSION = '0.4.13';
|
|
4
4
|
export const feltdbPackageRange = `^${FELTDB_PACKAGE_VERSION}`;
|