@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.
Files changed (127) hide show
  1. package/README.md +25 -0
  2. package/dist/application-development.d.ts +10 -3
  3. package/dist/application-development.d.ts.map +1 -1
  4. package/dist/application-development.js +11 -1
  5. package/dist/application-manifest.d.ts +2 -0
  6. package/dist/application-manifest.d.ts.map +1 -1
  7. package/dist/application-manifest.js +1 -1
  8. package/dist/application-understanding.d.ts +76 -0
  9. package/dist/application-understanding.d.ts.map +1 -0
  10. package/dist/application-understanding.js +282 -0
  11. package/dist/canonical-application.d.ts +1 -0
  12. package/dist/canonical-application.d.ts.map +1 -1
  13. package/dist/canonical-application.js +3 -2
  14. package/dist/cli/ai-model-config.js +3 -3
  15. package/dist/cli/cli.js +1 -1
  16. package/dist/cli/commands.js +321 -45
  17. package/dist/cli/index.js +1 -1
  18. package/dist/cli/managed-environment.js +6 -0
  19. package/dist/cli/managed-project.js +6 -0
  20. package/dist/cli/proposal-client.js +16 -3
  21. package/dist/cli/publish-engine.js +8 -5
  22. package/dist/cli/repository-evidence.js +55 -0
  23. package/dist/cli/source-sync.js +220 -61
  24. package/dist/convergence.d.ts +55 -0
  25. package/dist/convergence.d.ts.map +1 -0
  26. package/dist/convergence.js +63 -0
  27. package/dist/create/cli.js +10 -1
  28. package/dist/create/create.js +10 -12
  29. package/dist/create/managed-account.js +72 -7
  30. package/dist/create/package-versions.js +1 -1
  31. package/dist/create/server-source/crates/feltdb/src/application.rs +14 -0
  32. package/dist/create/server-source/crates/feltdb/src/lib.rs +20 -2
  33. package/dist/create/server-source/crates/feltdb-server/src/app_state.rs +12 -24
  34. package/dist/create/server-source/crates/feltdb-server/src/application_contract.rs +11 -3
  35. package/dist/create/server-source/crates/feltdb-server/src/authenticated_principal.rs +0 -1
  36. package/dist/create/server-source/crates/feltdb-server/src/certification_harness.rs +23 -22
  37. package/dist/create/server-source/crates/feltdb-server/src/connections.rs +14 -0
  38. package/dist/create/server-source/crates/feltdb-server/src/delegation_token.rs +5 -15
  39. package/dist/create/server-source/crates/feltdb-server/src/durable_operations.rs +13 -28
  40. package/dist/create/server-source/crates/feltdb-server/src/identity.rs +79 -14
  41. package/dist/create/server-source/crates/feltdb-server/src/key_management.rs +28 -7
  42. package/dist/create/server-source/crates/feltdb-server/src/lib.rs +5 -5
  43. package/dist/create/server-source/crates/feltdb-server/src/main.rs +1929 -261
  44. package/dist/create/server-source/crates/feltdb-server/src/managed_diagnostics.rs +10 -30
  45. package/dist/create/server-source/crates/feltdb-server/src/membership_policy.rs +12 -4
  46. package/dist/create/server-source/crates/feltdb-server/src/request_telemetry.rs +8 -6
  47. package/dist/create/server-source/crates/feltdb-server/src/snapshot_cursor.rs +10 -14
  48. package/dist/create/server-source/crates/feltdb-server/src/tenancy.rs +191 -22
  49. package/dist/create/server-source/crates/feltdb-server/src/tenant_policies.rs +9 -21
  50. package/dist/create/server-source/crates/feltdb-server/src/transaction_idempotency.rs +5 -3
  51. package/dist/create/server-source/crates/feltdb-server/src/transaction_recovery.rs +9 -8
  52. package/dist/create/server-source/crates/feltdb-server/tests/revision_recovery_integration_test.rs +1 -4
  53. package/dist/create/template/default-project/feltdb.flow +5 -0
  54. package/dist/create/template/default-project/src/context/AuthContext.tsx +9 -1
  55. package/dist/create/template/default-project/src/pages/SignUp.tsx +1 -1
  56. package/dist/flowspec.d.ts +1 -0
  57. package/dist/flowspec.d.ts.map +1 -1
  58. package/dist/flowspec.js +51 -12
  59. package/dist/http-client.d.ts +166 -14
  60. package/dist/http-client.d.ts.map +1 -1
  61. package/dist/http-client.js +91 -31
  62. package/dist/http-db.d.ts +3 -0
  63. package/dist/http-db.d.ts.map +1 -1
  64. package/dist/http-db.js +28 -3
  65. package/dist/index-core.d.ts +5 -0
  66. package/dist/index-core.d.ts.map +1 -1
  67. package/dist/index-core.js +5 -0
  68. package/dist/intent.d.ts +98 -0
  69. package/dist/intent.d.ts.map +1 -0
  70. package/dist/intent.js +343 -0
  71. package/dist/module-intent.d.ts +51 -0
  72. package/dist/module-intent.d.ts.map +1 -0
  73. package/dist/module-intent.js +230 -0
  74. package/dist/module.d.ts +105 -0
  75. package/dist/module.d.ts.map +1 -0
  76. package/dist/module.js +566 -0
  77. package/dist/proposal.d.ts +92 -4
  78. package/dist/proposal.d.ts.map +1 -1
  79. package/dist/proposal.js +150 -6
  80. package/dist/studio/app.d.ts +3 -1
  81. package/dist/studio/app.d.ts.map +1 -1
  82. package/dist/studio/components/AskFeltDB.d.ts +2 -1
  83. package/dist/studio/components/AskFeltDB.d.ts.map +1 -1
  84. package/dist/studio/components/ContractInspector.d.ts +7 -0
  85. package/dist/studio/components/ContractInspector.d.ts.map +1 -0
  86. package/dist/studio/components/ManagedInstancePanel.d.ts.map +1 -1
  87. package/dist/studio/components/ManagedInstancePanel.js +1 -5
  88. package/dist/studio/components/ModuleExplorer.d.ts +6 -0
  89. package/dist/studio/components/ModuleExplorer.d.ts.map +1 -0
  90. package/dist/studio/components/ProposalBrowser.d.ts +10 -1
  91. package/dist/studio/components/ProposalBrowser.d.ts.map +1 -1
  92. package/dist/studio/components/StateExplorer.d.ts +6 -7
  93. package/dist/studio/components/StateExplorer.d.ts.map +1 -1
  94. package/dist/studio/components/index.d.ts +2 -0
  95. package/dist/studio/components/index.d.ts.map +1 -1
  96. package/dist/studio/components/index.js +4 -4
  97. package/dist/studio/components-Duq2xQWt.js +2845 -0
  98. package/dist/studio/index.js +193 -147
  99. package/dist/studio/studio.css +1 -1
  100. package/dist/studio/utils/index.d.ts +2 -0
  101. package/dist/studio/utils/index.d.ts.map +1 -1
  102. package/dist/studio/utils/index.js +14 -12
  103. package/dist/studio/utils/managed-instance.d.ts +0 -4
  104. package/dist/studio/utils/managed-instance.d.ts.map +1 -1
  105. package/dist/studio/utils/managed-instance.js +0 -4
  106. package/dist/studio/utils/proposal-api.d.ts +56 -0
  107. package/dist/studio/utils/proposal-api.d.ts.map +1 -0
  108. package/dist/studio/utils/proposal-api.js +94 -0
  109. package/dist/studio/utils/service-api.d.ts +81 -0
  110. package/dist/studio/utils/service-api.d.ts.map +1 -0
  111. package/dist/studio/utils/service-api.js +51 -0
  112. package/dist/studio-app/assets/{feltdb_wasm-B-Ccgccb.js → feltdb_wasm-bIqcRzAr.js} +1 -1
  113. package/dist/studio-app/assets/feltdb_wasm_bg-BE79okwX.wasm +0 -0
  114. package/dist/studio-app/assets/{index-BRrmvaKw.css → index-Cd_NPw14.css} +1 -1
  115. package/dist/studio-app/assets/index-XGYdlElN.js +29 -0
  116. package/dist/studio-app/index.html +2 -2
  117. package/dist/wasm/feltdb_wasm_bg.wasm +0 -0
  118. package/dist/workspace/local-development-authority.d.ts +2 -0
  119. package/dist/workspace/local-development-authority.d.ts.map +1 -1
  120. package/dist/workspace/local-development-authority.js +128 -4
  121. package/package.json +1 -1
  122. package/dist/studio/components-Bm4sjhcX.js +0 -2162
  123. package/dist/studio-app/assets/dist-DA1MYSzp.js +0 -1
  124. package/dist/studio-app/assets/feltdb_wasm_bg-wH3enJIA.wasm +0 -0
  125. package/dist/studio-app/assets/index-CEIqowCh.js +0 -42
  126. package/dist/studio-app/assets/lib-B2_7fcn7.js +0 -69
  127. 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-CEIqowCh.js"></script>
2
- <link rel="stylesheet" crossorigin href="/assets/index-BRrmvaKw.css">
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,EAAyB,KAAK,eAAe,EAAsB,MAAM,gBAAgB,CAAC;AAEjG,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;CAClD;AAED,kFAAkF;AAClF,wBAAsB,8BAA8B,CAClD,OAAO,EAAE,gCAAgC,GACxC,OAAO,CAAC,yBAAyB,CAAC,CAuHpC"}
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 pathname = new URL(request.url || '/', `http://${host}`).pathname;
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 proposalMatch = pathname.match(/^\/v1\/proposals(?:\/([^/]+)(?:\/(validate|preview|status|history))?)?$/);
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
- json(response, 200, { proposals: await proposalService.list() });
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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@feltdb/core",
3
- "version": "0.7.4",
3
+ "version": "0.8.1",
4
4
  "description": "FeltDB Core - Application-facing database with Browser, Local, and Server runtimes. Durable state, reactive APIs.",
5
5
  "license": "MIT",
6
6
  "type": "module",