@feltdb/core 0.7.3 → 0.7.4

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 (95) hide show
  1. package/dist/application-development.d.ts +76 -0
  2. package/dist/application-development.d.ts.map +1 -0
  3. package/dist/application-development.js +137 -0
  4. package/dist/application-manifest.d.ts +5 -1
  5. package/dist/application-manifest.d.ts.map +1 -1
  6. package/dist/application-manifest.js +10 -3
  7. package/dist/canonical-application.d.ts +26 -0
  8. package/dist/canonical-application.d.ts.map +1 -0
  9. package/dist/canonical-application.js +45 -0
  10. package/dist/cli/ai-model-config.js +97 -0
  11. package/dist/cli/commands.js +466 -105
  12. package/dist/cli/index.js +1 -1
  13. package/dist/cli/proposal-client.js +54 -0
  14. package/dist/cli/publish-engine.js +162 -0
  15. package/dist/cli/source-sync.js +139 -0
  16. package/dist/create/cli.js +1 -1
  17. package/dist/create/create.js +30 -6
  18. package/dist/create/managed-account.js +14 -7
  19. package/dist/create/package-versions.js +1 -1
  20. package/dist/create/server-source/crates/feltdb/src/application.rs +31 -1
  21. package/dist/create/server-source/crates/feltdb/src/authority_failover.rs +84 -6
  22. package/dist/create/server-source/crates/feltdb/src/bin/feltdb_node.rs +126 -38
  23. package/dist/create/server-source/crates/feltdb/src/distributed_transactions.rs +72 -34
  24. package/dist/create/server-source/crates/feltdb-server/src/identity.rs +46 -3
  25. package/dist/create/server-source/crates/feltdb-server/src/main.rs +315 -16
  26. package/dist/create/server-source/crates/feltdb-server/src/tenancy.rs +20 -0
  27. package/dist/create/template/default-project/README.md +57 -0
  28. package/dist/create/template/default-project/agents/activity-assistant.ts +18 -0
  29. package/dist/create/template/default-project/agents/project-assistant.ts +19 -0
  30. package/dist/create/template/default-project/capabilities/activity-summary.ts +14 -0
  31. package/dist/create/template/default-project/capabilities/project-search.ts +16 -0
  32. package/dist/create/template/default-project/capabilities/project-summary.ts +15 -0
  33. package/dist/create/template/default-project/feltdb.flow +169 -0
  34. package/dist/create/template/default-project/src/App.tsx +20 -0
  35. package/dist/create/template/default-project/src/context/AuthContext.tsx +27 -0
  36. package/dist/create/template/default-project/src/feltdb.ts +87 -0
  37. package/dist/create/template/default-project/src/index.tsx +14 -0
  38. package/dist/create/template/default-project/src/pages/Activity.tsx +7 -0
  39. package/dist/create/template/default-project/src/pages/Agents.tsx +15 -0
  40. package/dist/create/template/default-project/src/pages/Dashboard.tsx +17 -0
  41. package/dist/create/template/default-project/src/pages/Invitations.tsx +11 -0
  42. package/dist/create/template/default-project/src/pages/Projects.tsx +11 -0
  43. package/dist/create/template/default-project/src/pages/SignIn.tsx +8 -0
  44. package/dist/create/template/default-project/src/pages/SignUp.tsx +8 -0
  45. package/dist/create/template/default-project/src/styles-application.css +21 -0
  46. package/dist/create/template/default-project/src/styles.css +1 -0
  47. package/dist/create/template/default-project/workflows/agent-assisted-summary.ts +1 -0
  48. package/dist/create/template/default-project/workflows/invitation.ts +30 -0
  49. package/dist/create/template/default-project/workflows/project-created.ts +2 -0
  50. package/dist/db.d.ts +49 -1
  51. package/dist/db.d.ts.map +1 -1
  52. package/dist/db.js +77 -0
  53. package/dist/error-codes.d.ts +20 -1
  54. package/dist/error-codes.d.ts.map +1 -1
  55. package/dist/error-codes.js +25 -0
  56. package/dist/flowspec.d.ts.map +1 -1
  57. package/dist/flowspec.js +27 -6
  58. package/dist/http-db.d.ts +15 -2
  59. package/dist/http-db.d.ts.map +1 -1
  60. package/dist/http-db.js +113 -5
  61. package/dist/index-core.d.ts +3 -0
  62. package/dist/index-core.d.ts.map +1 -1
  63. package/dist/index-core.js +3 -0
  64. package/dist/proposal.d.ts +85 -0
  65. package/dist/proposal.d.ts.map +1 -0
  66. package/dist/proposal.js +105 -0
  67. package/dist/studio/app.d.ts +3 -1
  68. package/dist/studio/app.d.ts.map +1 -1
  69. package/dist/studio/components/ApplicationDesigner.d.ts +2 -1
  70. package/dist/studio/components/ApplicationDesigner.d.ts.map +1 -1
  71. package/dist/studio/components/AskFeltDB.d.ts +20 -0
  72. package/dist/studio/components/AskFeltDB.d.ts.map +1 -0
  73. package/dist/studio/components/ProposalBrowser.d.ts +3 -0
  74. package/dist/studio/components/ProposalBrowser.d.ts.map +1 -0
  75. package/dist/studio/components/index.d.ts +2 -0
  76. package/dist/studio/components/index.d.ts.map +1 -1
  77. package/dist/studio/components/index.js +4 -4
  78. package/dist/studio/{components-Dxuhrv8_.js → components-Bm4sjhcX.js} +335 -5
  79. package/dist/studio/index.js +168 -157
  80. package/dist/studio/studio.css +1 -1
  81. package/dist/studio-app/assets/dist-DA1MYSzp.js +1 -0
  82. package/dist/studio-app/assets/{feltdb_wasm-DVKsw75S.js → feltdb_wasm-B-Ccgccb.js} +1 -1
  83. package/dist/studio-app/assets/feltdb_wasm_bg-wH3enJIA.wasm +0 -0
  84. package/dist/studio-app/assets/{index-C1GWyazR.css → index-BRrmvaKw.css} +1 -1
  85. package/dist/studio-app/assets/index-CEIqowCh.js +42 -0
  86. package/dist/studio-app/assets/lib-B2_7fcn7.js +69 -0
  87. package/dist/studio-app/assets/worker-CARZ5g7K.js +69 -0
  88. package/dist/studio-app/index.html +2 -2
  89. package/dist/wasm/feltdb_wasm_bg.wasm +0 -0
  90. package/dist/workspace/local-development-authority.d.ts +3 -0
  91. package/dist/workspace/local-development-authority.d.ts.map +1 -1
  92. package/dist/workspace/local-development-authority.js +62 -1
  93. package/package.json +1 -1
  94. package/dist/studio-app/assets/feltdb_wasm_bg-DNyNf0yy.wasm +0 -0
  95. package/dist/studio-app/assets/index-B5tnmvSD.js +0 -28
@@ -0,0 +1,76 @@
1
+ import type { CanonicalApplicationContract } from './canonical-application.js';
2
+ import { type FlowDiagnostic, type FlowMigrationOperation, type FlowSpec, type FlowSpecDiff } from './flowspec.js';
3
+ export interface FeltDBContractSnapshot {
4
+ application: {
5
+ application_id: string;
6
+ environment: string;
7
+ };
8
+ contract_version: number;
9
+ contract_hash: string;
10
+ dsl_version: number;
11
+ schema: CanonicalApplicationContract['manifest']['collections'];
12
+ indexes: CanonicalApplicationContract['manifest']['indexes'];
13
+ policies: CanonicalApplicationContract['manifest']['policies'];
14
+ workflows: CanonicalApplicationContract['manifest']['workflows'];
15
+ agents: CanonicalApplicationContract['manifest']['agents'];
16
+ capabilities: CanonicalApplicationContract['manifest']['capabilities'];
17
+ supported_primitives: readonly string[];
18
+ }
19
+ export interface FeltDBFlowProposal {
20
+ baseContractHash: string;
21
+ baseFlowHash: string;
22
+ proposedFlow: string;
23
+ summary: string;
24
+ changes: string[];
25
+ warnings: string[];
26
+ }
27
+ export interface AuthorizationChange {
28
+ policy: string;
29
+ before?: string[];
30
+ after?: string[];
31
+ widening: boolean;
32
+ }
33
+ export interface ValidatedFlowProposal {
34
+ proposal: FeltDBFlowProposal;
35
+ proposedSpec: FlowSpec;
36
+ proposedContract: CanonicalApplicationContract;
37
+ diagnostics: FlowDiagnostic[];
38
+ diff: FlowSpecDiff;
39
+ migration: FlowMigrationOperation[];
40
+ authorizationChanges: AuthorizationChange[];
41
+ }
42
+ export declare function createContractSnapshot(contract: CanonicalApplicationContract, options?: {
43
+ environment?: string;
44
+ contractVersion?: number;
45
+ }): FeltDBContractSnapshot;
46
+ export declare function contractSnapshotText(snapshot: FeltDBContractSnapshot): string;
47
+ /** Load the same whitelisted snapshot from local, self-hosted, or managed SDKs. */
48
+ export declare function loadContractSnapshot(db: {
49
+ application: {
50
+ get(): Promise<Record<string, unknown>>;
51
+ };
52
+ }): Promise<FeltDBContractSnapshot>;
53
+ export declare function flowSourceHash(source: string): Promise<string>;
54
+ export declare const FELTDB_FLOW_DSL_GUIDE = "FeltDB FlowSpec v1 reference:\n- One document: flow_version 1, then app Name { ... }.\n- collection Name { field: primitive; optional fields append ?; references use ref Collection; indexes use index name using hash(field) }.\n- capability Name { visibility public|internal|agent; read Collection; write Collection }.\n- workflow Name { step step_name { read Collection | write Collection | capability CapabilityName } }.\n- agent Name { capability CapabilityName; workflow WorkflowName }.\n- policy Collection { read: expression; write: expression }. Preserve existing authorization unless the request explicitly requires a change.\n- Valid policy examples include authenticated, member, owner, self(field), and alternatives joined with |.\n- Every referenced collection, capability, and workflow must be declared. Names are case-sensitive.\n- Use only supported_primitives from the supplied snapshot. Do not invent UI, deployment, record data, secrets, or executable implementation syntax.\n- Make the smallest semantic change that satisfies the request and retain all unrelated declarations.";
55
+ /** One provider-neutral prompt used by local WebLLM and bring-your-own models. */
56
+ export declare function createFlowProposalMessages(snapshot: FeltDBContractSnapshot, currentFlow: string, intent: string): ({
57
+ role: "system";
58
+ content: string;
59
+ } | {
60
+ role: "user";
61
+ content: string;
62
+ })[];
63
+ /** Parse and validate untrusted model output through the canonical FeltDB pipeline. */
64
+ export declare function validateGeneratedFlowProposal(input: {
65
+ raw: string;
66
+ snapshot: FeltDBContractSnapshot;
67
+ currentFlow: string;
68
+ allowDestructiveProposal?: boolean;
69
+ }): Promise<FeltDBFlowProposal>;
70
+ export declare function validateFlowProposal(input: {
71
+ proposal: FeltDBFlowProposal;
72
+ currentFlow: string;
73
+ snapshot: FeltDBContractSnapshot;
74
+ tenantId?: string;
75
+ }): Promise<ValidatedFlowProposal>;
76
+ //# sourceMappingURL=application-development.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"application-development.d.ts","sourceRoot":"","sources":["../src/application-development.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,137 @@
1
+ import { canonicalApplicationBytes, compileApplicationContract } from './canonical-application.js';
2
+ import { FLOW_PRIMITIVE_TYPES, diffFlowSpec, parseFlowSpec, planFlowSpecMigration, validateFlowSpec, } from './flowspec.js';
3
+ async function sha256(value) {
4
+ const digest = await crypto.subtle.digest('SHA-256', value.slice().buffer);
5
+ return `sha256:${Array.from(new Uint8Array(digest), byte => byte.toString(16).padStart(2, '0')).join('')}`;
6
+ }
7
+ export function createContractSnapshot(contract, options = {}) {
8
+ const manifest = contract.manifest;
9
+ // This is intentionally a whitelist. Metadata labels, environment
10
+ // configuration, connections, and artifacts can contain deployment data and
11
+ // must never become model context merely because the manifest grows.
12
+ return {
13
+ application: {
14
+ application_id: contract.application_id,
15
+ environment: options.environment ?? 'local',
16
+ },
17
+ contract_version: options.contractVersion ?? contract.schema_version,
18
+ contract_hash: contract.hashes.application,
19
+ dsl_version: contract.dsl_version,
20
+ schema: manifest.collections,
21
+ indexes: manifest.indexes,
22
+ policies: manifest.policies,
23
+ workflows: manifest.workflows,
24
+ agents: manifest.agents,
25
+ capabilities: manifest.capabilities,
26
+ supported_primitives: FLOW_PRIMITIVE_TYPES,
27
+ };
28
+ }
29
+ export function contractSnapshotText(snapshot) {
30
+ return new TextDecoder().decode(canonicalApplicationBytes(snapshot));
31
+ }
32
+ /** Load the same whitelisted snapshot from local, self-hosted, or managed SDKs. */
33
+ export async function loadContractSnapshot(db) {
34
+ const discovery = await db.application.get();
35
+ const snapshot = discovery.snapshot;
36
+ if (!snapshot || typeof snapshot.contract_hash !== 'string' || !Array.isArray(snapshot.schema)) {
37
+ throw new Error('The application service did not return a FeltDB contract snapshot');
38
+ }
39
+ return snapshot;
40
+ }
41
+ export async function flowSourceHash(source) {
42
+ return sha256(new TextEncoder().encode(source.replace(/\r\n/g, '\n')));
43
+ }
44
+ export const FELTDB_FLOW_DSL_GUIDE = `FeltDB FlowSpec v1 reference:
45
+ - One document: flow_version 1, then app Name { ... }.
46
+ - collection Name { field: primitive; optional fields append ?; references use ref Collection; indexes use index name using hash(field) }.
47
+ - capability Name { visibility public|internal|agent; read Collection; write Collection }.
48
+ - workflow Name { step step_name { read Collection | write Collection | capability CapabilityName } }.
49
+ - agent Name { capability CapabilityName; workflow WorkflowName }.
50
+ - policy Collection { read: expression; write: expression }. Preserve existing authorization unless the request explicitly requires a change.
51
+ - Valid policy examples include authenticated, member, owner, self(field), and alternatives joined with |.
52
+ - Every referenced collection, capability, and workflow must be declared. Names are case-sensitive.
53
+ - Use only supported_primitives from the supplied snapshot. Do not invent UI, deployment, record data, secrets, or executable implementation syntax.
54
+ - Make the smallest semantic change that satisfies the request and retain all unrelated declarations.`;
55
+ /** One provider-neutral prompt used by local WebLLM and bring-your-own models. */
56
+ export function createFlowProposalMessages(snapshot, currentFlow, intent) {
57
+ return [
58
+ { role: 'system', content: [
59
+ 'You propose minimal changes to a FeltDB application.',
60
+ 'feltdb.flow is authoritative. Preserve every unrelated declaration verbatim in meaning.',
61
+ `Generate flow_version ${snapshot.dsl_version} only. Never invent unsupported primitives.`,
62
+ 'Return only JSON with: proposedFlow, summary, changes, warnings.',
63
+ 'The proposedFlow value must contain the complete resulting document, not a patch or excerpt.',
64
+ 'Do not include application records, credentials, tokens, environment configuration, or deployment actions.',
65
+ FELTDB_FLOW_DSL_GUIDE,
66
+ `Current contract snapshot: ${contractSnapshotText(snapshot)}`,
67
+ `Current feltdb.flow:\n${currentFlow}`,
68
+ ].join('\n\n') },
69
+ { role: 'user', content: intent },
70
+ ];
71
+ }
72
+ /** Parse and validate untrusted model output through the canonical FeltDB pipeline. */
73
+ export async function validateGeneratedFlowProposal(input) {
74
+ const cleaned = input.raw.trim().replace(/^```(?:json)?\s*/i, '').replace(/\s*```$/, '');
75
+ let value;
76
+ try {
77
+ value = JSON.parse(cleaned);
78
+ }
79
+ catch {
80
+ throw new Error('The configured model returned an invalid flow proposal document');
81
+ }
82
+ const proposal = {
83
+ baseContractHash: input.snapshot.contract_hash,
84
+ baseFlowHash: await flowSourceHash(input.currentFlow),
85
+ proposedFlow: String(value.proposedFlow ?? ''),
86
+ summary: String(value.summary ?? ''),
87
+ changes: Array.isArray(value.changes) ? value.changes.map(String) : [],
88
+ warnings: Array.isArray(value.warnings) ? value.warnings.map(String) : [],
89
+ };
90
+ const review = await validateFlowProposal({ proposal, currentFlow: input.currentFlow, snapshot: input.snapshot });
91
+ if (!input.allowDestructiveProposal && (review.diff.removed.length || review.migration.some(item => item.safety === 'destructive'))) {
92
+ throw new Error(`NON_MINIMAL_FLOW_PROPOSAL: generated change removes existing application semantics (${review.diff.removed.join(', ')})`);
93
+ }
94
+ return proposal;
95
+ }
96
+ function policyChanges(before, after) {
97
+ const left = new Map(before.policies.map(policy => [policy.name, policy.statements]));
98
+ const right = new Map(after.policies.map(policy => [policy.name, policy.statements]));
99
+ const names = new Set([...left.keys(), ...right.keys()]);
100
+ const broad = /\b(public|any|anonymous|authenticated)\b/i;
101
+ return [...names].flatMap(policy => {
102
+ const previous = left.get(policy);
103
+ const next = right.get(policy);
104
+ if (JSON.stringify(previous) === JSON.stringify(next))
105
+ return [];
106
+ const added = (next ?? []).filter(statement => !(previous ?? []).includes(statement));
107
+ return [{ policy, before: previous, after: next, widening: !next || added.some(statement => broad.test(statement)) }];
108
+ });
109
+ }
110
+ export async function validateFlowProposal(input) {
111
+ const currentHash = await flowSourceHash(input.currentFlow);
112
+ if (input.proposal.baseFlowHash !== currentHash) {
113
+ throw new Error(`STALE_FLOW_PROPOSAL: proposal is based on ${input.proposal.baseFlowHash}, current flow is ${currentHash}`);
114
+ }
115
+ if (input.proposal.baseContractHash !== input.snapshot.contract_hash) {
116
+ throw new Error(`STALE_CONTRACT_PROPOSAL: proposal is based on ${input.proposal.baseContractHash}, current contract is ${input.snapshot.contract_hash}`);
117
+ }
118
+ const current = parseFlowSpec(input.currentFlow);
119
+ const proposedSpec = parseFlowSpec(input.proposal.proposedFlow);
120
+ if (proposedSpec.version !== input.snapshot.dsl_version) {
121
+ throw new Error(`DSL_VERSION_MISMATCH: proposal uses ${proposedSpec.version}, runtime requires ${input.snapshot.dsl_version}`);
122
+ }
123
+ const diagnostics = validateFlowSpec(proposedSpec);
124
+ const errors = diagnostics.filter(item => item.severity === 'error');
125
+ if (errors.length)
126
+ throw new Error(`INVALID_FLOW_PROPOSAL: ${errors.map(item => item.message).join('; ')}`);
127
+ const proposedContract = await compileApplicationContract(proposedSpec, input.tenantId ?? 'local', input.snapshot.application.application_id);
128
+ return {
129
+ proposal: input.proposal,
130
+ proposedSpec,
131
+ proposedContract,
132
+ diagnostics,
133
+ diff: diffFlowSpec(current, proposedSpec),
134
+ migration: planFlowSpecMigration(current, proposedSpec),
135
+ authorizationChanges: policyChanges(current, proposedSpec),
136
+ };
137
+ }
@@ -77,6 +77,7 @@ export interface ApplicationManifest {
77
77
  capabilities: {
78
78
  name: string;
79
79
  provider?: string;
80
+ visibility?: 'public' | 'agent' | 'workflow' | 'internal';
80
81
  }[];
81
82
  connections: {
82
83
  name: string;
@@ -90,6 +91,8 @@ export interface ApplicationManifest {
90
91
  policies: {
91
92
  name: string;
92
93
  resource: string;
94
+ read?: string;
95
+ write?: string;
93
96
  capabilities: string[];
94
97
  }[];
95
98
  ui: {
@@ -267,7 +270,8 @@ export interface ApplicationRuntimeContract {
267
270
  }
268
271
  export declare class ApplicationManifestClient {
269
272
  private readonly baseUrl;
270
- constructor(baseUrl?: string);
273
+ private readonly token;
274
+ constructor(baseUrl?: string, token?: string);
271
275
  private request;
272
276
  createDraft(applicationId: string, baseRevisionId?: string): Promise<ApplicationDraft>;
273
277
  getDraft(applicationId: string, draftId: string): Promise<ApplicationDraft>;
@@ -1 +1 @@
1
- {"version":3,"file":"application-manifest.d.ts","sourceRoot":"","sources":["../src/application-manifest.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"application-manifest.d.ts","sourceRoot":"","sources":["../src/application-manifest.ts"],"names":[],"mappings":"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"}
@@ -1,10 +1,17 @@
1
1
  export class ApplicationManifestClient {
2
2
  baseUrl;
3
- constructor(baseUrl = '') {
3
+ token;
4
+ constructor(baseUrl = '', token = '') {
4
5
  this.baseUrl = baseUrl;
6
+ this.token = token;
5
7
  }
6
- async request(path, options) { const response = await fetch(`${this.baseUrl}${path}`, { ...options, headers: { ...(options?.body ? { 'Content-Type': 'application/json' } : {}), ...options?.headers } }); const result = await response.json(); if (!response.ok)
7
- throw Object.assign(new Error(result.error || 'Manifest request failed'), { status: response.status, result }); return result; }
8
+ async request(path, options) { const response = await fetch(`${this.baseUrl}${path}`, { ...options, headers: { ...(options?.body ? { 'Content-Type': 'application/json' } : {}), ...(this.token ? { Authorization: `Bearer ${this.token}` } : {}), ...options?.headers } }); const text = await response.text(); let result = {}; try {
9
+ result = text ? JSON.parse(text) : {};
10
+ }
11
+ catch {
12
+ result = { error: text };
13
+ } if (!response.ok)
14
+ throw Object.assign(new Error(response.status === 401 || response.status === 403 ? 'Authentication failed. Check the configured managed credentials.' : result.error || 'Manifest request failed'), { status: response.status, result }); return result; }
8
15
  createDraft(applicationId, baseRevisionId) { return this.request(`/api/applications/${encodeURIComponent(applicationId)}/drafts`, { method: 'POST', body: JSON.stringify({ base_revision_id: baseRevisionId }) }); }
9
16
  getDraft(applicationId, draftId) { return this.request(`/api/applications/${encodeURIComponent(applicationId)}/drafts/${encodeURIComponent(draftId)}`); }
10
17
  updateDraft(applicationId, draft, manifest) { return this.request(`/api/applications/${encodeURIComponent(applicationId)}/drafts/${encodeURIComponent(draft.draft_id)}`, { method: 'PUT', headers: { 'If-Version': String(draft.version) }, body: JSON.stringify({ manifest }) }); }
@@ -0,0 +1,26 @@
1
+ import type { ApplicationManifest } from './application-manifest.js';
2
+ import { type FlowSpec } from './flowspec.js';
3
+ export interface CanonicalApplicationHashes {
4
+ model: string;
5
+ authorization: string;
6
+ workflows: string;
7
+ agents: string;
8
+ capabilities: string;
9
+ application: string;
10
+ }
11
+ /** Executable, transport-neutral application definition compiled from feltdb.flow. */
12
+ export interface CanonicalApplicationContract {
13
+ application_id: string;
14
+ tenant_id: string;
15
+ schema_version: number;
16
+ dsl_version: number;
17
+ manifest: ApplicationManifest;
18
+ hashes: CanonicalApplicationHashes;
19
+ }
20
+ export declare function canonicalApplicationBytes(value: unknown): Uint8Array;
21
+ /**
22
+ * Compile the developer-authored Flow definition into the one contract used by
23
+ * local runtimes, remote services, Studio, publishing, and SDK introspection.
24
+ */
25
+ export declare function compileApplicationContract(spec: FlowSpec, tenantId: string, applicationId: string): Promise<CanonicalApplicationContract>;
26
+ //# sourceMappingURL=canonical-application.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"canonical-application.d.ts","sourceRoot":"","sources":["../src/canonical-application.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAC;AACrE,OAAO,EAAsB,KAAK,QAAQ,EAAE,MAAM,eAAe,CAAC;AAElE,MAAM,WAAW,0BAA0B;IACzC,KAAK,EAAE,MAAM,CAAC;IACd,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,sFAAsF;AACtF,MAAM,WAAW,4BAA4B;IAC3C,cAAc,EAAE,MAAM,CAAC;IACvB,SAAS,EAAE,MAAM,CAAC;IAClB,cAAc,EAAE,MAAM,CAAC;IACvB,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,mBAAmB,CAAC;IAC9B,MAAM,EAAE,0BAA0B,CAAC;CACpC;AAaD,wBAAgB,yBAAyB,CAAC,KAAK,EAAE,OAAO,GAAG,UAAU,CAEpE;AAQD;;;GAGG;AACH,wBAAsB,0BAA0B,CAC9C,IAAI,EAAE,QAAQ,EACd,QAAQ,EAAE,MAAM,EAChB,aAAa,EAAE,MAAM,GACpB,OAAO,CAAC,4BAA4B,CAAC,CAmBvC"}
@@ -0,0 +1,45 @@
1
+ import { flowSpecToManifest } from './flowspec.js';
2
+ function canonical(value) {
3
+ if (Array.isArray(value))
4
+ return value.map(canonical);
5
+ if (value && typeof value === 'object') {
6
+ return Object.fromEntries(Object.entries(value)
7
+ .filter(([, item]) => item !== undefined)
8
+ .sort(([left], [right]) => left.localeCompare(right))
9
+ .map(([key, item]) => [key, canonical(item)]));
10
+ }
11
+ return value;
12
+ }
13
+ export function canonicalApplicationBytes(value) {
14
+ return new TextEncoder().encode(JSON.stringify(canonical(value)));
15
+ }
16
+ async function hash(value) {
17
+ const bytes = canonicalApplicationBytes(value);
18
+ const digest = await crypto.subtle.digest('SHA-256', bytes.slice().buffer);
19
+ return `sha256:${Array.from(new Uint8Array(digest), byte => byte.toString(16).padStart(2, '0')).join('')}`;
20
+ }
21
+ /**
22
+ * Compile the developer-authored Flow definition into the one contract used by
23
+ * local runtimes, remote services, Studio, publishing, and SDK introspection.
24
+ */
25
+ export async function compileApplicationContract(spec, tenantId, applicationId) {
26
+ if (spec.version !== 1)
27
+ throw new Error(`Unsupported flow_version ${spec.version}; this SDK supports flow_version 1`);
28
+ const manifest = flowSpecToManifest(spec, tenantId, applicationId);
29
+ const [model, authorization, workflows, agents, capabilities] = await Promise.all([
30
+ hash({ collections: manifest.collections, indexes: manifest.indexes, references: manifest.references }),
31
+ hash(manifest.policies),
32
+ hash({ workflows: manifest.workflows, triggers: manifest.triggers, schedules: manifest.schedules }),
33
+ hash(manifest.agents),
34
+ hash(manifest.capabilities),
35
+ ]);
36
+ const application = await hash({ dsl_version: spec.version, manifest });
37
+ return {
38
+ application_id: applicationId,
39
+ tenant_id: tenantId,
40
+ schema_version: manifest.schema,
41
+ dsl_version: spec.version,
42
+ manifest,
43
+ hashes: { model, authorization, workflows, agents, capabilities, application },
44
+ };
45
+ }
@@ -0,0 +1,97 @@
1
+ import fs from 'node:fs';
2
+ import path from 'node:path';
3
+ import { createHash } from 'node:crypto';
4
+ import { spawnSync } from 'node:child_process';
5
+ import { createFlowProposalMessages, validateGeneratedFlowProposal, } from '@feltdb/core';
6
+ const CONFIG_FILE = '.feltdb/ai.json';
7
+ const SERVICE = 'feltdb-ai';
8
+ function credentialId(cwd, provider) {
9
+ return `${createHash('sha256').update(path.resolve(cwd)).digest('hex').slice(0, 16)}:${provider}`;
10
+ }
11
+ export function readAiModelConfiguration(cwd = process.cwd()) {
12
+ const file = path.join(cwd, CONFIG_FILE);
13
+ if (!fs.existsSync(file))
14
+ return { version: 1, provider: 'local-webllm', model: 'SmolLM2-360M-Instruct-q4f32_1-MLC' };
15
+ const value = JSON.parse(fs.readFileSync(file, 'utf8'));
16
+ if (value.version !== 1 || !['local-webllm', 'openai-compatible'].includes(value.provider) || !value.model) {
17
+ throw new Error(`${CONFIG_FILE} contains an unsupported AI model configuration`);
18
+ }
19
+ return value;
20
+ }
21
+ function storeCredential(id, secret) {
22
+ if (process.platform === 'darwin') {
23
+ const result = spawnSync('security', ['add-generic-password', '-U', '-s', SERVICE, '-a', id, '-w', secret], { encoding: 'utf8' });
24
+ if (result.status !== 0)
25
+ throw new Error(`Could not store the model credential in macOS Keychain: ${result.stderr.trim()}`);
26
+ return;
27
+ }
28
+ if (process.platform === 'linux') {
29
+ const result = spawnSync('secret-tool', ['store', '--label', 'FeltDB AI model credential', 'service', SERVICE, 'account', id], { input: secret, encoding: 'utf8' });
30
+ if (result.status !== 0)
31
+ throw new Error('Could not store the model credential with Secret Service. Install libsecret tools or use FELTDB_AI_API_KEY per session.');
32
+ return;
33
+ }
34
+ throw new Error('Persistent AI credentials require macOS Keychain or Linux Secret Service. Use FELTDB_AI_API_KEY per session on this platform.');
35
+ }
36
+ function loadCredential(id) {
37
+ if (process.env.FELTDB_AI_API_KEY)
38
+ return process.env.FELTDB_AI_API_KEY;
39
+ if (process.platform === 'darwin') {
40
+ const result = spawnSync('security', ['find-generic-password', '-s', SERVICE, '-a', id, '-w'], { encoding: 'utf8' });
41
+ return result.status === 0 ? result.stdout.trim() : undefined;
42
+ }
43
+ if (process.platform === 'linux') {
44
+ const result = spawnSync('secret-tool', ['lookup', 'service', SERVICE, 'account', id], { encoding: 'utf8' });
45
+ return result.status === 0 ? result.stdout.trim() : undefined;
46
+ }
47
+ return undefined;
48
+ }
49
+ export function configureAiModel(input, cwd = process.cwd()) {
50
+ const id = input.provider === 'openai-compatible' ? credentialId(cwd, input.provider) : undefined;
51
+ if (input.apiKey && id)
52
+ storeCredential(id, input.apiKey);
53
+ const config = { version: 1, provider: input.provider, model: input.model,
54
+ baseUrl: input.baseUrl?.replace(/\/+$/, ''), credentialId: id,
55
+ credentialRequired: input.provider === 'openai-compatible' ? input.credentialRequired !== false : false };
56
+ fs.mkdirSync(path.join(cwd, '.feltdb'), { recursive: true });
57
+ fs.writeFileSync(path.join(cwd, CONFIG_FILE), `${JSON.stringify(config, null, 2)}\n`, { mode: 0o600 });
58
+ return config;
59
+ }
60
+ export function publicAiModelConfiguration(cwd = process.cwd()) {
61
+ const config = readAiModelConfiguration(cwd);
62
+ return { provider: config.provider, model: config.model, baseUrl: config.baseUrl,
63
+ local: config.provider === 'local-webllm', credentialRequired: config.credentialRequired !== false,
64
+ credentialConfigured: config.provider === 'local-webllm' || config.credentialRequired === false || Boolean(config.credentialId && loadCredential(config.credentialId)) };
65
+ }
66
+ export async function generateConfiguredFlowProposal(input, cwd = process.cwd()) {
67
+ const config = readAiModelConfiguration(cwd);
68
+ if (config.provider === 'local-webllm')
69
+ throw new Error('Local WebLLM generation runs in the browser');
70
+ const apiKey = config.credentialId ? loadCredential(config.credentialId) : process.env.FELTDB_AI_API_KEY;
71
+ const baseUrl = config.baseUrl || 'https://api.openai.com/v1';
72
+ const messages = createFlowProposalMessages(input.snapshot, input.currentFlow, input.intent);
73
+ const complete = async (requestMessages) => {
74
+ const response = await fetch(`${baseUrl}/chat/completions`, {
75
+ method: 'POST',
76
+ headers: { 'content-type': 'application/json', ...(apiKey ? { authorization: `Bearer ${apiKey}` } : {}) },
77
+ body: JSON.stringify({ model: config.model, messages: requestMessages, temperature: 0.1, response_format: { type: 'json_object' } }),
78
+ });
79
+ const body = await response.json().catch(() => ({}));
80
+ if (!response.ok)
81
+ throw new Error(`Configured model request failed (${response.status}): ${body.error?.message || body.error || 'unknown error'}`);
82
+ const raw = body.choices?.[0]?.message?.content;
83
+ if (typeof raw !== 'string')
84
+ throw new Error('Configured model returned no proposal content');
85
+ return raw;
86
+ };
87
+ const raw = await complete(messages);
88
+ try {
89
+ return await validateGeneratedFlowProposal({ raw, snapshot: input.snapshot, currentFlow: input.currentFlow });
90
+ }
91
+ catch (error) {
92
+ const reason = error instanceof Error ? error.message : String(error);
93
+ const repaired = await complete([...messages, { role: 'assistant', content: raw }, { role: 'user',
94
+ content: `FeltDB rejected that proposal: ${reason}. Return one corrected complete JSON proposal. Do not broaden or add unrelated changes.` }]);
95
+ return validateGeneratedFlowProposal({ raw: repaired, snapshot: input.snapshot, currentFlow: input.currentFlow });
96
+ }
97
+ }