@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.
- package/README.md +25 -0
- package/dist/application-development.d.ts +10 -3
- package/dist/application-development.d.ts.map +1 -1
- package/dist/application-development.js +11 -1
- package/dist/application-manifest.d.ts +2 -0
- package/dist/application-manifest.d.ts.map +1 -1
- package/dist/application-manifest.js +1 -1
- package/dist/application-understanding.d.ts +76 -0
- package/dist/application-understanding.d.ts.map +1 -0
- package/dist/application-understanding.js +282 -0
- package/dist/canonical-application.d.ts +1 -0
- package/dist/canonical-application.d.ts.map +1 -1
- package/dist/canonical-application.js +3 -2
- package/dist/cli/ai-model-config.js +3 -3
- package/dist/cli/cli.js +1 -1
- package/dist/cli/commands.js +321 -45
- package/dist/cli/index.js +1 -1
- package/dist/cli/managed-environment.js +6 -0
- package/dist/cli/managed-project.js +6 -0
- package/dist/cli/proposal-client.js +16 -3
- package/dist/cli/publish-engine.js +8 -5
- package/dist/cli/repository-evidence.js +55 -0
- package/dist/cli/source-sync.js +220 -61
- package/dist/convergence.d.ts +55 -0
- package/dist/convergence.d.ts.map +1 -0
- package/dist/convergence.js +63 -0
- package/dist/create/cli.js +10 -1
- package/dist/create/create.js +10 -12
- package/dist/create/managed-account.js +72 -7
- package/dist/create/package-versions.js +1 -1
- package/dist/create/server-source/crates/feltdb/src/application.rs +14 -0
- package/dist/create/server-source/crates/feltdb/src/lib.rs +20 -2
- package/dist/create/server-source/crates/feltdb-server/src/app_state.rs +12 -24
- package/dist/create/server-source/crates/feltdb-server/src/application_contract.rs +11 -3
- package/dist/create/server-source/crates/feltdb-server/src/authenticated_principal.rs +0 -1
- package/dist/create/server-source/crates/feltdb-server/src/certification_harness.rs +23 -22
- package/dist/create/server-source/crates/feltdb-server/src/connections.rs +14 -0
- package/dist/create/server-source/crates/feltdb-server/src/delegation_token.rs +5 -15
- package/dist/create/server-source/crates/feltdb-server/src/durable_operations.rs +13 -28
- package/dist/create/server-source/crates/feltdb-server/src/identity.rs +79 -14
- package/dist/create/server-source/crates/feltdb-server/src/key_management.rs +28 -7
- package/dist/create/server-source/crates/feltdb-server/src/lib.rs +5 -5
- package/dist/create/server-source/crates/feltdb-server/src/main.rs +1929 -261
- package/dist/create/server-source/crates/feltdb-server/src/managed_diagnostics.rs +10 -30
- package/dist/create/server-source/crates/feltdb-server/src/membership_policy.rs +12 -4
- package/dist/create/server-source/crates/feltdb-server/src/request_telemetry.rs +8 -6
- package/dist/create/server-source/crates/feltdb-server/src/snapshot_cursor.rs +10 -14
- package/dist/create/server-source/crates/feltdb-server/src/tenancy.rs +191 -22
- package/dist/create/server-source/crates/feltdb-server/src/tenant_policies.rs +9 -21
- package/dist/create/server-source/crates/feltdb-server/src/transaction_idempotency.rs +5 -3
- package/dist/create/server-source/crates/feltdb-server/src/transaction_recovery.rs +9 -8
- package/dist/create/server-source/crates/feltdb-server/tests/revision_recovery_integration_test.rs +1 -4
- package/dist/create/template/default-project/feltdb.flow +5 -0
- package/dist/create/template/default-project/src/context/AuthContext.tsx +9 -1
- package/dist/create/template/default-project/src/pages/SignUp.tsx +1 -1
- package/dist/flowspec.d.ts +1 -0
- package/dist/flowspec.d.ts.map +1 -1
- package/dist/flowspec.js +51 -12
- package/dist/http-client.d.ts +166 -14
- package/dist/http-client.d.ts.map +1 -1
- package/dist/http-client.js +91 -31
- package/dist/http-db.d.ts +3 -0
- package/dist/http-db.d.ts.map +1 -1
- package/dist/http-db.js +28 -3
- package/dist/index-core.d.ts +5 -0
- package/dist/index-core.d.ts.map +1 -1
- package/dist/index-core.js +5 -0
- package/dist/intent.d.ts +98 -0
- package/dist/intent.d.ts.map +1 -0
- package/dist/intent.js +343 -0
- package/dist/module-intent.d.ts +51 -0
- package/dist/module-intent.d.ts.map +1 -0
- package/dist/module-intent.js +230 -0
- package/dist/module.d.ts +105 -0
- package/dist/module.d.ts.map +1 -0
- package/dist/module.js +566 -0
- package/dist/proposal.d.ts +92 -4
- package/dist/proposal.d.ts.map +1 -1
- package/dist/proposal.js +150 -6
- package/dist/studio/app.d.ts +3 -1
- package/dist/studio/app.d.ts.map +1 -1
- package/dist/studio/components/AskFeltDB.d.ts +2 -1
- package/dist/studio/components/AskFeltDB.d.ts.map +1 -1
- package/dist/studio/components/ContractInspector.d.ts +7 -0
- package/dist/studio/components/ContractInspector.d.ts.map +1 -0
- package/dist/studio/components/ManagedInstancePanel.d.ts.map +1 -1
- package/dist/studio/components/ManagedInstancePanel.js +1 -5
- package/dist/studio/components/ModuleExplorer.d.ts +6 -0
- package/dist/studio/components/ModuleExplorer.d.ts.map +1 -0
- package/dist/studio/components/ProposalBrowser.d.ts +10 -1
- package/dist/studio/components/ProposalBrowser.d.ts.map +1 -1
- package/dist/studio/components/StateExplorer.d.ts +6 -7
- package/dist/studio/components/StateExplorer.d.ts.map +1 -1
- package/dist/studio/components/index.d.ts +2 -0
- package/dist/studio/components/index.d.ts.map +1 -1
- package/dist/studio/components/index.js +4 -4
- package/dist/studio/components-Duq2xQWt.js +2845 -0
- package/dist/studio/index.js +193 -147
- package/dist/studio/studio.css +1 -1
- package/dist/studio/utils/index.d.ts +2 -0
- package/dist/studio/utils/index.d.ts.map +1 -1
- package/dist/studio/utils/index.js +14 -12
- package/dist/studio/utils/managed-instance.d.ts +0 -4
- package/dist/studio/utils/managed-instance.d.ts.map +1 -1
- package/dist/studio/utils/managed-instance.js +0 -4
- package/dist/studio/utils/proposal-api.d.ts +56 -0
- package/dist/studio/utils/proposal-api.d.ts.map +1 -0
- package/dist/studio/utils/proposal-api.js +94 -0
- package/dist/studio/utils/service-api.d.ts +81 -0
- package/dist/studio/utils/service-api.d.ts.map +1 -0
- package/dist/studio/utils/service-api.js +51 -0
- package/dist/studio-app/assets/{feltdb_wasm-B-Ccgccb.js → feltdb_wasm-bIqcRzAr.js} +1 -1
- package/dist/studio-app/assets/feltdb_wasm_bg-BE79okwX.wasm +0 -0
- package/dist/studio-app/assets/{index-BRrmvaKw.css → index-Cd_NPw14.css} +1 -1
- package/dist/studio-app/assets/index-XGYdlElN.js +29 -0
- package/dist/studio-app/index.html +2 -2
- package/dist/wasm/feltdb_wasm_bg.wasm +0 -0
- package/dist/workspace/local-development-authority.d.ts +2 -0
- package/dist/workspace/local-development-authority.d.ts.map +1 -1
- package/dist/workspace/local-development-authority.js +128 -4
- package/package.json +1 -1
- package/dist/studio/components-Bm4sjhcX.js +0 -2162
- package/dist/studio-app/assets/dist-DA1MYSzp.js +0 -1
- package/dist/studio-app/assets/feltdb_wasm_bg-wH3enJIA.wasm +0 -0
- package/dist/studio-app/assets/index-CEIqowCh.js +0 -42
- package/dist/studio-app/assets/lib-B2_7fcn7.js +0 -69
- package/dist/studio-app/assets/worker-CARZ5g7K.js +0 -69
package/README.md
CHANGED
|
@@ -30,6 +30,31 @@ Install `react` and `react-dom` only when using the React bindings. The
|
|
|
30
30
|
`@feltdb/webllm` package remains an optional, separately installed AI runtime.
|
|
31
31
|
The `feltdb studio` command serves the Studio application bundled with core.
|
|
32
32
|
|
|
33
|
+
## Canonical managed Service API
|
|
34
|
+
|
|
35
|
+
Use one scoped client for managed application discovery, authorized data
|
|
36
|
+
inspection, and the Proposal lifecycle:
|
|
37
|
+
|
|
38
|
+
```typescript
|
|
39
|
+
import { createClient } from '@feltdb/core';
|
|
40
|
+
|
|
41
|
+
const feltdb = createClient({
|
|
42
|
+
url: process.env.FELTDB_URL!,
|
|
43
|
+
token: process.env.FELTDB_TOKEN!,
|
|
44
|
+
applicationId: process.env.FELTDB_APPLICATION_ID!,
|
|
45
|
+
environment: 'production',
|
|
46
|
+
});
|
|
47
|
+
|
|
48
|
+
const application = await feltdb.application.get();
|
|
49
|
+
const users = await feltdb.data.list('User', { limit: 50 });
|
|
50
|
+
const proposals = await feltdb.proposals.list({ status: 'previewed' });
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
All these operations use the application-facing `/v1` Service API and retain
|
|
54
|
+
the same application/environment scope. Proposal approval is available here;
|
|
55
|
+
repository application intentionally is not. Only `feltdb ai apply <id>` owns
|
|
56
|
+
repository mutation.
|
|
57
|
+
|
|
33
58
|
## Quick Start
|
|
34
59
|
|
|
35
60
|
```typescript
|
|
@@ -14,6 +14,7 @@ export interface FeltDBContractSnapshot {
|
|
|
14
14
|
workflows: CanonicalApplicationContract['manifest']['workflows'];
|
|
15
15
|
agents: CanonicalApplicationContract['manifest']['agents'];
|
|
16
16
|
capabilities: CanonicalApplicationContract['manifest']['capabilities'];
|
|
17
|
+
modules: NonNullable<CanonicalApplicationContract['manifest']['modules']>;
|
|
17
18
|
supported_primitives: readonly string[];
|
|
18
19
|
}
|
|
19
20
|
export interface FeltDBFlowProposal {
|
|
@@ -23,6 +24,11 @@ export interface FeltDBFlowProposal {
|
|
|
23
24
|
summary: string;
|
|
24
25
|
changes: string[];
|
|
25
26
|
warnings: string[];
|
|
27
|
+
implementation?: import('./module-intent.js').ModuleImplementationPlan;
|
|
28
|
+
understanding?: import('./application-understanding.js').ApplicationUnderstanding;
|
|
29
|
+
source_plan?: {
|
|
30
|
+
files: import('./proposal.js').ProposalSourceOperation[];
|
|
31
|
+
};
|
|
26
32
|
}
|
|
27
33
|
export interface AuthorizationChange {
|
|
28
34
|
policy: string;
|
|
@@ -51,18 +57,19 @@ export declare function loadContractSnapshot(db: {
|
|
|
51
57
|
};
|
|
52
58
|
}): Promise<FeltDBContractSnapshot>;
|
|
53
59
|
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.";
|
|
60
|
+
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- module Name { provider provider-name; version exact-semver }. Module-qualified references use ref module.Model.\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
61
|
/** One provider-neutral prompt used by local WebLLM and bring-your-own models. */
|
|
56
|
-
export declare function createFlowProposalMessages(snapshot: FeltDBContractSnapshot, currentFlow: string, intent: string): ({
|
|
62
|
+
export declare function createFlowProposalMessages(snapshot: FeltDBContractSnapshot, currentFlow: string, intent: string): Promise<({
|
|
57
63
|
role: "system";
|
|
58
64
|
content: string;
|
|
59
65
|
} | {
|
|
60
66
|
role: "user";
|
|
61
67
|
content: string;
|
|
62
|
-
})[]
|
|
68
|
+
})[]>;
|
|
63
69
|
/** Parse and validate untrusted model output through the canonical FeltDB pipeline. */
|
|
64
70
|
export declare function validateGeneratedFlowProposal(input: {
|
|
65
71
|
raw: string;
|
|
72
|
+
intent: string;
|
|
66
73
|
snapshot: FeltDBContractSnapshot;
|
|
67
74
|
currentFlow: string;
|
|
68
75
|
allowDestructiveProposal?: boolean;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"application-development.d.ts","sourceRoot":"","sources":["../src/application-development.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,4BAA4B,EAAE,MAAM,4BAA4B,CAAC;AAE/E,OAAO,EAML,KAAK,cAAc,EACnB,KAAK,sBAAsB,EAC3B,KAAK,QAAQ,EACb,KAAK,YAAY,EAClB,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"application-development.d.ts","sourceRoot":"","sources":["../src/application-development.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
import { canonicalApplicationBytes, compileApplicationContract } from './canonical-application.js';
|
|
2
2
|
import { FLOW_PRIMITIVE_TYPES, diffFlowSpec, parseFlowSpec, planFlowSpecMigration, validateFlowSpec, } from './flowspec.js';
|
|
3
|
+
import { planModuleImplementation, resolveModuleIntent } from './module-intent.js';
|
|
4
|
+
import { collectApplicationUnderstanding } from './application-understanding.js';
|
|
3
5
|
async function sha256(value) {
|
|
4
6
|
const digest = await crypto.subtle.digest('SHA-256', value.slice().buffer);
|
|
5
7
|
return `sha256:${Array.from(new Uint8Array(digest), byte => byte.toString(16).padStart(2, '0')).join('')}`;
|
|
@@ -23,6 +25,7 @@ export function createContractSnapshot(contract, options = {}) {
|
|
|
23
25
|
workflows: manifest.workflows,
|
|
24
26
|
agents: manifest.agents,
|
|
25
27
|
capabilities: manifest.capabilities,
|
|
28
|
+
modules: manifest.modules ?? [],
|
|
26
29
|
supported_primitives: FLOW_PRIMITIVE_TYPES,
|
|
27
30
|
};
|
|
28
31
|
}
|
|
@@ -45,6 +48,7 @@ export const FELTDB_FLOW_DSL_GUIDE = `FeltDB FlowSpec v1 reference:
|
|
|
45
48
|
- One document: flow_version 1, then app Name { ... }.
|
|
46
49
|
- collection Name { field: primitive; optional fields append ?; references use ref Collection; indexes use index name using hash(field) }.
|
|
47
50
|
- capability Name { visibility public|internal|agent; read Collection; write Collection }.
|
|
51
|
+
- module Name { provider provider-name; version exact-semver }. Module-qualified references use ref module.Model.
|
|
48
52
|
- workflow Name { step step_name { read Collection | write Collection | capability CapabilityName } }.
|
|
49
53
|
- agent Name { capability CapabilityName; workflow WorkflowName }.
|
|
50
54
|
- policy Collection { read: expression; write: expression }. Preserve existing authorization unless the request explicitly requires a change.
|
|
@@ -53,7 +57,10 @@ export const FELTDB_FLOW_DSL_GUIDE = `FeltDB FlowSpec v1 reference:
|
|
|
53
57
|
- Use only supported_primitives from the supplied snapshot. Do not invent UI, deployment, record data, secrets, or executable implementation syntax.
|
|
54
58
|
- Make the smallest semantic change that satisfies the request and retain all unrelated declarations.`;
|
|
55
59
|
/** One provider-neutral prompt used by local WebLLM and bring-your-own models. */
|
|
56
|
-
export function createFlowProposalMessages(snapshot, currentFlow, intent) {
|
|
60
|
+
export async function createFlowProposalMessages(snapshot, currentFlow, intent) {
|
|
61
|
+
const resolvedIntent = resolveModuleIntent(intent);
|
|
62
|
+
const understanding = await collectApplicationUnderstanding({ intent, snapshot, currentFlow, moduleIntent: resolvedIntent });
|
|
63
|
+
const moduleIntent = resolvedIntent ? JSON.stringify(planModuleImplementation(resolvedIntent, snapshot, currentFlow, understanding)) : undefined;
|
|
57
64
|
return [
|
|
58
65
|
{ role: 'system', content: [
|
|
59
66
|
'You propose minimal changes to a FeltDB application.',
|
|
@@ -65,6 +72,8 @@ export function createFlowProposalMessages(snapshot, currentFlow, intent) {
|
|
|
65
72
|
FELTDB_FLOW_DSL_GUIDE,
|
|
66
73
|
`Current contract snapshot: ${contractSnapshotText(snapshot)}`,
|
|
67
74
|
`Current feltdb.flow:\n${currentFlow}`,
|
|
75
|
+
`Authoritative application understanding (evidence references, inferences, confidence, and unknowns; never promote an inference to an authoritative fact):\n${JSON.stringify(understanding)}`,
|
|
76
|
+
moduleIntent ? `Authoritative resolved module implementation context (fit these semantics to the application; do not invent or redefine module semantics):\n${moduleIntent}` : '',
|
|
68
77
|
].join('\n\n') },
|
|
69
78
|
{ role: 'user', content: intent },
|
|
70
79
|
];
|
|
@@ -86,6 +95,7 @@ export async function validateGeneratedFlowProposal(input) {
|
|
|
86
95
|
summary: String(value.summary ?? ''),
|
|
87
96
|
changes: Array.isArray(value.changes) ? value.changes.map(String) : [],
|
|
88
97
|
warnings: Array.isArray(value.warnings) ? value.warnings.map(String) : [],
|
|
98
|
+
understanding: await collectApplicationUnderstanding({ intent: input.intent, snapshot: input.snapshot, currentFlow: input.currentFlow, moduleIntent: resolveModuleIntent(input.intent) }),
|
|
89
99
|
};
|
|
90
100
|
const review = await validateFlowProposal({ proposal, currentFlow: input.currentFlow, snapshot: input.snapshot });
|
|
91
101
|
if (!input.allowDestructiveProposal && (review.diff.removed.length || review.migration.some(item => item.safety === 'destructive'))) {
|
|
@@ -79,6 +79,7 @@ export interface ApplicationManifest {
|
|
|
79
79
|
provider?: string;
|
|
80
80
|
visibility?: 'public' | 'agent' | 'workflow' | 'internal';
|
|
81
81
|
}[];
|
|
82
|
+
modules?: import('./module.js').FeltDBModuleDefinition[];
|
|
82
83
|
connections: {
|
|
83
84
|
name: string;
|
|
84
85
|
connection_id: string;
|
|
@@ -124,6 +125,7 @@ export interface ApplicationManifest {
|
|
|
124
125
|
name: string;
|
|
125
126
|
uri: string;
|
|
126
127
|
media_type: string;
|
|
128
|
+
content?: string;
|
|
127
129
|
}[];
|
|
128
130
|
deployment: {
|
|
129
131
|
environments: string[];
|
|
@@ -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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"}
|
|
@@ -11,7 +11,7 @@ export class ApplicationManifestClient {
|
|
|
11
11
|
catch {
|
|
12
12
|
result = { error: text };
|
|
13
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; }
|
|
14
|
+
throw Object.assign(new Error(response.status === 401 || response.status === 403 ? 'Authentication failed. Check the configured managed credentials.' : result.message || result.error || 'Manifest request failed'), { status: response.status, result }); return result; }
|
|
15
15
|
createDraft(applicationId, baseRevisionId) { return this.request(`/api/applications/${encodeURIComponent(applicationId)}/drafts`, { method: 'POST', body: JSON.stringify({ base_revision_id: baseRevisionId }) }); }
|
|
16
16
|
getDraft(applicationId, draftId) { return this.request(`/api/applications/${encodeURIComponent(applicationId)}/drafts/${encodeURIComponent(draftId)}`); }
|
|
17
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,76 @@
|
|
|
1
|
+
import type { FeltDBContractSnapshot } from "./application-development.js";
|
|
2
|
+
import type { ModuleIntent } from "./module-intent.js";
|
|
3
|
+
export type EvidenceAuthority = "authoritative" | "observed" | "inferred";
|
|
4
|
+
export type EvidenceSource = "feltdb.flow" | "canonical_contract" | "schema" | "policy" | "workflow" | "agent" | "capability" | "module" | "application_metadata" | "repository" | "git" | "proposal" | "proposal_history";
|
|
5
|
+
export interface ApplicationEvidence {
|
|
6
|
+
id: string;
|
|
7
|
+
source: EvidenceSource;
|
|
8
|
+
claim: string;
|
|
9
|
+
value: unknown;
|
|
10
|
+
source_ref: string;
|
|
11
|
+
authority: Exclude<EvidenceAuthority, "inferred">;
|
|
12
|
+
}
|
|
13
|
+
export interface ApplicationInference {
|
|
14
|
+
id: string;
|
|
15
|
+
claim: string;
|
|
16
|
+
value: unknown;
|
|
17
|
+
confidence: number;
|
|
18
|
+
authority: EvidenceAuthority;
|
|
19
|
+
evidence: string[];
|
|
20
|
+
counter_evidence: string[];
|
|
21
|
+
reason: string;
|
|
22
|
+
created_at: string;
|
|
23
|
+
}
|
|
24
|
+
export interface ApplicationUnknown {
|
|
25
|
+
claim: string;
|
|
26
|
+
reason: string;
|
|
27
|
+
resolution: "clarification_required" | "evidence_required";
|
|
28
|
+
}
|
|
29
|
+
export interface ApplicationAssumption {
|
|
30
|
+
claim: string;
|
|
31
|
+
value: unknown;
|
|
32
|
+
based_on: string;
|
|
33
|
+
confidence: number;
|
|
34
|
+
}
|
|
35
|
+
export interface ApplicationUnderstanding {
|
|
36
|
+
version: 1;
|
|
37
|
+
application: FeltDBContractSnapshot["application"];
|
|
38
|
+
intent: string;
|
|
39
|
+
evidence: ApplicationEvidence[];
|
|
40
|
+
inferences: ApplicationInference[];
|
|
41
|
+
unknowns: ApplicationUnknown[];
|
|
42
|
+
assumptions: ApplicationAssumption[];
|
|
43
|
+
evidence_hash: string;
|
|
44
|
+
understanding_hash: string;
|
|
45
|
+
created_at: string;
|
|
46
|
+
completeness: {
|
|
47
|
+
score: number;
|
|
48
|
+
findings: Array<{
|
|
49
|
+
claim: string;
|
|
50
|
+
status: "complete" | "partial" | "missing" | "contradictory";
|
|
51
|
+
evidence: string[];
|
|
52
|
+
}>;
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
export interface ObservedEvidenceInput {
|
|
56
|
+
source: "repository" | "git" | "application_metadata" | "proposal" | "proposal_history";
|
|
57
|
+
claim: string;
|
|
58
|
+
value?: unknown;
|
|
59
|
+
source_ref: string;
|
|
60
|
+
}
|
|
61
|
+
/** Deterministic, bounded understanding stage. It accepts structured observations, never raw repository contents. */
|
|
62
|
+
export declare function collectApplicationUnderstanding(input: {
|
|
63
|
+
intent: string;
|
|
64
|
+
snapshot: FeltDBContractSnapshot;
|
|
65
|
+
currentFlow: string;
|
|
66
|
+
moduleIntent?: ModuleIntent;
|
|
67
|
+
observations?: ObservedEvidenceInput[];
|
|
68
|
+
now?: string;
|
|
69
|
+
}): Promise<ApplicationUnderstanding>;
|
|
70
|
+
export declare function understandingInference(understanding: ApplicationUnderstanding, claim: string): ApplicationInference | undefined;
|
|
71
|
+
export declare function understandingOwner(understanding: ApplicationUnderstanding, module?: {
|
|
72
|
+
placement: {
|
|
73
|
+
owner_claim: string;
|
|
74
|
+
};
|
|
75
|
+
}): string | undefined;
|
|
76
|
+
//# sourceMappingURL=application-understanding.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"application-understanding.d.ts","sourceRoot":"","sources":["../src/application-understanding.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,282 @@
|
|
|
1
|
+
import { canonicalApplicationBytes } from "./canonical-application.js";
|
|
2
|
+
import { parseFlowSpec } from "./flowspec.js";
|
|
3
|
+
import { resolveFeltDBModule } from "./module.js";
|
|
4
|
+
const secretValue = /(?:sk_(?:live|test)_|whsec_|fdb_(?:live|control)_|-----BEGIN (?:RSA |EC |OPENSSH )?PRIVATE KEY-----)/i;
|
|
5
|
+
const AUTOMATIC_PLANNING_CONFIDENCE = 0.8;
|
|
6
|
+
function safe(value) {
|
|
7
|
+
if (typeof value === "string")
|
|
8
|
+
return secretValue.test(value) ? "[REDACTED]" : value.slice(0, 500);
|
|
9
|
+
if (Array.isArray(value))
|
|
10
|
+
return value.slice(0, 50).map(safe);
|
|
11
|
+
if (value && typeof value === "object")
|
|
12
|
+
return Object.fromEntries(Object.entries(value)
|
|
13
|
+
.slice(0, 50)
|
|
14
|
+
.map(([key, child]) => [
|
|
15
|
+
key,
|
|
16
|
+
/password|token|credential|private.?key|secret.?value/i.test(key)
|
|
17
|
+
? "[REDACTED]"
|
|
18
|
+
: safe(child),
|
|
19
|
+
]));
|
|
20
|
+
return value;
|
|
21
|
+
}
|
|
22
|
+
async function hash(value) {
|
|
23
|
+
const bytes = canonicalApplicationBytes(value);
|
|
24
|
+
const digest = await crypto.subtle.digest("SHA-256", bytes.slice().buffer);
|
|
25
|
+
return `sha256:${Array.from(new Uint8Array(digest), (byte) => byte.toString(16).padStart(2, "0")).join("")}`;
|
|
26
|
+
}
|
|
27
|
+
async function evidence(source, claim, value, source_ref, authority) {
|
|
28
|
+
const normalized = {
|
|
29
|
+
source,
|
|
30
|
+
claim: claim.slice(0, 200),
|
|
31
|
+
value: safe(value),
|
|
32
|
+
source_ref: source_ref.slice(0, 500),
|
|
33
|
+
authority,
|
|
34
|
+
};
|
|
35
|
+
return { id: `ev_${(await hash(normalized)).slice(7, 23)}`, ...normalized };
|
|
36
|
+
}
|
|
37
|
+
/** Deterministic, bounded understanding stage. It accepts structured observations, never raw repository contents. */
|
|
38
|
+
export async function collectApplicationUnderstanding(input) {
|
|
39
|
+
const spec = parseFlowSpec(input.currentFlow);
|
|
40
|
+
const collected = [];
|
|
41
|
+
collected.push(await evidence("canonical_contract", "application.contract", {
|
|
42
|
+
version: input.snapshot.contract_version,
|
|
43
|
+
hash: input.snapshot.contract_hash,
|
|
44
|
+
}, "contract", "authoritative"));
|
|
45
|
+
collected.push(await evidence("feltdb.flow", "application.flow", { app: spec.app, version: spec.version }, "feltdb.flow", "authoritative"));
|
|
46
|
+
for (const collection of spec.collections) {
|
|
47
|
+
collected.push(await evidence("schema", `schema.collection.${collection.name}`, {
|
|
48
|
+
fields: collection.fields.map((field) => ({
|
|
49
|
+
name: field.name,
|
|
50
|
+
type: field.type,
|
|
51
|
+
optional: field.optional,
|
|
52
|
+
})),
|
|
53
|
+
}, `schema.collections.${collection.name}`, "authoritative"));
|
|
54
|
+
for (const field of collection.fields.filter((field) => field.type.startsWith("ref ")))
|
|
55
|
+
collected.push(await evidence("schema", `schema.relationship.${collection.name}.${field.name}`, `${collection.name}.${field.name} -> ${field.type.slice(4)}`, `schema.collections.${collection.name}.fields.${field.name}`, "authoritative"));
|
|
56
|
+
}
|
|
57
|
+
for (const policy of spec.policies)
|
|
58
|
+
collected.push(await evidence("policy", `policy.${policy.name}`, policy.statements, `policies.${policy.name}`, "authoritative"));
|
|
59
|
+
for (const workflow of spec.workflows)
|
|
60
|
+
collected.push(await evidence("workflow", `workflow.${workflow.name}`, workflow.steps.map((step) => ({
|
|
61
|
+
name: step.name,
|
|
62
|
+
statements: step.statements,
|
|
63
|
+
})), `workflows.${workflow.name}`, "authoritative"));
|
|
64
|
+
for (const agent of spec.agents)
|
|
65
|
+
collected.push(await evidence("agent", `agent.${agent.name}`, agent.statements, `agents.${agent.name}`, "authoritative"));
|
|
66
|
+
for (const capability of spec.capabilities)
|
|
67
|
+
collected.push(await evidence("capability", `capability.${capability.name}`, capability.statements, `capabilities.${capability.name}`, "authoritative"));
|
|
68
|
+
const resolvedModule = input.moduleIntent
|
|
69
|
+
? resolveFeltDBModule({
|
|
70
|
+
name: input.moduleIntent.module,
|
|
71
|
+
provider: input.moduleIntent.provider,
|
|
72
|
+
version: input.moduleIntent.version,
|
|
73
|
+
})
|
|
74
|
+
: undefined;
|
|
75
|
+
if (resolvedModule) {
|
|
76
|
+
const module = resolvedModule;
|
|
77
|
+
collected.push(await evidence("module", `module.${module.id}`, {
|
|
78
|
+
id: module.id,
|
|
79
|
+
provider: module.provider,
|
|
80
|
+
version: module.version,
|
|
81
|
+
models: module.models,
|
|
82
|
+
capabilities: module.capabilities,
|
|
83
|
+
reconciliation: module.reconciliation,
|
|
84
|
+
authorization: module.authorization,
|
|
85
|
+
configuration: module.configuration.map((value) => value.name),
|
|
86
|
+
secrets: module.secrets.map((value) => value.name),
|
|
87
|
+
}, `module:${module.id}@${module.version}`, "authoritative"));
|
|
88
|
+
}
|
|
89
|
+
for (const observation of (input.observations ?? []).slice(0, 50))
|
|
90
|
+
collected.push(await evidence(observation.source, observation.claim, observation.value ?? true, observation.source_ref, "observed"));
|
|
91
|
+
if (collected.length > 256)
|
|
92
|
+
throw new Error("EVIDENCE_LIMIT_EXCEEDED");
|
|
93
|
+
const createdAt = input.now ?? new Date().toISOString();
|
|
94
|
+
const relationships = collected.filter((value) => value.claim.startsWith("schema.relationship."));
|
|
95
|
+
const explicitOwner = resolvedModule
|
|
96
|
+
? spec.collections
|
|
97
|
+
.find((value) => value.name === resolvedModule.placement.primary_application_model)
|
|
98
|
+
?.fields.find((value) => value.name === resolvedModule.placement.owner_field &&
|
|
99
|
+
value.type.startsWith("ref "))
|
|
100
|
+
: undefined;
|
|
101
|
+
const candidates = [
|
|
102
|
+
...new Set(resolvedModule?.patterns.flatMap((value) => value.owner_candidates) ?? []),
|
|
103
|
+
].filter((candidate) => spec.collections.some((value) => value.name === candidate));
|
|
104
|
+
const ownershipSupport = (candidate) => collected.filter((item) => String(item.value).endsWith(`-> ${candidate}`) ||
|
|
105
|
+
(item.source === "repository" &&
|
|
106
|
+
item.claim.includes(candidate.toLowerCase()) &&
|
|
107
|
+
item.claim.endsWith("_boundary")));
|
|
108
|
+
const inferences = [];
|
|
109
|
+
const unknowns = [];
|
|
110
|
+
const assumptions = [];
|
|
111
|
+
if (resolvedModule) {
|
|
112
|
+
const ownerClaim = resolvedModule.placement.owner_claim;
|
|
113
|
+
if (explicitOwner) {
|
|
114
|
+
const owner = explicitOwner.type.slice(4);
|
|
115
|
+
const relationshipClaim = `schema.relationship.${resolvedModule.placement.primary_application_model}.${resolvedModule.placement.owner_field}`;
|
|
116
|
+
const support = relationships.filter((value) => value.claim === relationshipClaim);
|
|
117
|
+
inferences.push({
|
|
118
|
+
id: `inf_${resolvedModule.id}_owner`,
|
|
119
|
+
claim: ownerClaim,
|
|
120
|
+
value: owner,
|
|
121
|
+
confidence: 1,
|
|
122
|
+
authority: "authoritative",
|
|
123
|
+
evidence: support.map((value) => value.id),
|
|
124
|
+
counter_evidence: [],
|
|
125
|
+
reason: `${resolvedModule.placement.primary_application_model}.${resolvedModule.placement.owner_field} is explicitly declared by the application contract.`,
|
|
126
|
+
created_at: createdAt,
|
|
127
|
+
});
|
|
128
|
+
}
|
|
129
|
+
else {
|
|
130
|
+
const ranked = candidates
|
|
131
|
+
.map((candidate) => ({
|
|
132
|
+
candidate,
|
|
133
|
+
support: ownershipSupport(candidate),
|
|
134
|
+
}))
|
|
135
|
+
.sort((left, right) => right.support.length - left.support.length ||
|
|
136
|
+
left.candidate.localeCompare(right.candidate));
|
|
137
|
+
if (ranked[0]?.support.length &&
|
|
138
|
+
ranked[0].support.length > (ranked[1]?.support.length ?? 0)) {
|
|
139
|
+
const authoritativeCount = ranked[0].support.filter((value) => value.authority === "authoritative").length;
|
|
140
|
+
const confidence = Math.round(Math.min(0.97, authoritativeCount ? 0.84 + authoritativeCount * 0.06 : 0.72) * 100) / 100;
|
|
141
|
+
inferences.push({
|
|
142
|
+
id: `inf_${resolvedModule.id}_owner`,
|
|
143
|
+
claim: ownerClaim,
|
|
144
|
+
value: ranked[0].candidate,
|
|
145
|
+
confidence,
|
|
146
|
+
authority: "inferred",
|
|
147
|
+
evidence: ranked[0].support.map((value) => value.id),
|
|
148
|
+
counter_evidence: ranked
|
|
149
|
+
.slice(1)
|
|
150
|
+
.flatMap((value) => value.support.map((item) => item.id)),
|
|
151
|
+
reason: `${ranked[0].candidate} is the strongest existing application ownership boundary.`,
|
|
152
|
+
created_at: createdAt,
|
|
153
|
+
});
|
|
154
|
+
if (confidence >= AUTOMATIC_PLANNING_CONFIDENCE)
|
|
155
|
+
assumptions.push({
|
|
156
|
+
claim: `${resolvedModule.placement.primary_application_model}.${resolvedModule.placement.owner_field}`,
|
|
157
|
+
value: ranked[0].candidate,
|
|
158
|
+
based_on: `inf_${resolvedModule.id}_owner`,
|
|
159
|
+
confidence,
|
|
160
|
+
});
|
|
161
|
+
else
|
|
162
|
+
unknowns.push({
|
|
163
|
+
claim: ownerClaim,
|
|
164
|
+
reason: `The strongest ownership inference has confidence ${confidence}, below the ${AUTOMATIC_PLANNING_CONFIDENCE} planning threshold.`,
|
|
165
|
+
resolution: "clarification_required",
|
|
166
|
+
});
|
|
167
|
+
}
|
|
168
|
+
else {
|
|
169
|
+
unknowns.push({
|
|
170
|
+
claim: ownerClaim,
|
|
171
|
+
reason: `The contract does not establish a unique ${resolvedModule.id} ownership boundary.`,
|
|
172
|
+
resolution: "clarification_required",
|
|
173
|
+
});
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
if (!spec.modules?.some((value) => value.name === resolvedModule.id))
|
|
177
|
+
unknowns.push({
|
|
178
|
+
claim: `${resolvedModule.id}.existing_implementation`,
|
|
179
|
+
reason: `${resolvedModule.name} is not installed in the canonical application contract.`,
|
|
180
|
+
resolution: "evidence_required",
|
|
181
|
+
});
|
|
182
|
+
}
|
|
183
|
+
for (const inference of inferences)
|
|
184
|
+
if (inference.confidence > 0 && !inference.evidence.length)
|
|
185
|
+
throw new Error(`CONFIDENCE_WITHOUT_EVIDENCE: ${inference.claim}`);
|
|
186
|
+
const evidenceHash = await hash(collected);
|
|
187
|
+
const completenessFindings = [
|
|
188
|
+
{
|
|
189
|
+
claim: "ownership",
|
|
190
|
+
status: (inferences.length
|
|
191
|
+
? "complete"
|
|
192
|
+
: unknowns.some((value) => value.resolution === "clarification_required")
|
|
193
|
+
? "contradictory"
|
|
194
|
+
: "missing"),
|
|
195
|
+
evidence: inferences.flatMap((value) => value.evidence),
|
|
196
|
+
},
|
|
197
|
+
{
|
|
198
|
+
claim: "integration_boundary",
|
|
199
|
+
status: (resolvedModule ? "complete" : "missing"),
|
|
200
|
+
evidence: collected
|
|
201
|
+
.filter((value) => value.source === "module")
|
|
202
|
+
.map((value) => value.id),
|
|
203
|
+
},
|
|
204
|
+
{
|
|
205
|
+
claim: "authorization",
|
|
206
|
+
status: (spec.policies.length ||
|
|
207
|
+
collected.some((value) => value.claim === "repository.authentication")
|
|
208
|
+
? "complete"
|
|
209
|
+
: "partial"),
|
|
210
|
+
evidence: collected
|
|
211
|
+
.filter((value) => value.source === "policy" ||
|
|
212
|
+
value.claim === "repository.authentication")
|
|
213
|
+
.map((value) => value.id),
|
|
214
|
+
},
|
|
215
|
+
{
|
|
216
|
+
claim: "state_placement",
|
|
217
|
+
status: (candidates.length ? "complete" : "missing"),
|
|
218
|
+
evidence: collected
|
|
219
|
+
.filter((value) => value.source === "schema")
|
|
220
|
+
.map((value) => value.id),
|
|
221
|
+
},
|
|
222
|
+
{
|
|
223
|
+
claim: "workflow_mapping",
|
|
224
|
+
status: (resolvedModule?.reconciliation.length
|
|
225
|
+
? "complete"
|
|
226
|
+
: "missing"),
|
|
227
|
+
evidence: collected
|
|
228
|
+
.filter((value) => value.source === "module")
|
|
229
|
+
.map((value) => value.id),
|
|
230
|
+
},
|
|
231
|
+
{
|
|
232
|
+
claim: "ui_placement",
|
|
233
|
+
status: (collected.some((value) => value.source === "repository")
|
|
234
|
+
? "partial"
|
|
235
|
+
: "missing"),
|
|
236
|
+
evidence: collected
|
|
237
|
+
.filter((value) => value.source === "repository")
|
|
238
|
+
.map((value) => value.id),
|
|
239
|
+
},
|
|
240
|
+
];
|
|
241
|
+
const weights = { complete: 1, partial: 0.5, missing: 0, contradictory: 0 };
|
|
242
|
+
const completeness = {
|
|
243
|
+
score: Math.round((completenessFindings.reduce((sum, value) => sum + weights[value.status], 0) /
|
|
244
|
+
completenessFindings.length) *
|
|
245
|
+
100),
|
|
246
|
+
findings: completenessFindings,
|
|
247
|
+
};
|
|
248
|
+
const semantic = {
|
|
249
|
+
version: 1,
|
|
250
|
+
application: input.snapshot.application,
|
|
251
|
+
intent: input.intent,
|
|
252
|
+
evidence_hash: evidenceHash,
|
|
253
|
+
inferences,
|
|
254
|
+
unknowns,
|
|
255
|
+
assumptions,
|
|
256
|
+
completeness,
|
|
257
|
+
};
|
|
258
|
+
const fingerprint = {
|
|
259
|
+
...semantic,
|
|
260
|
+
inferences: inferences.map(({ created_at: _createdAt, ...inference }) => inference),
|
|
261
|
+
};
|
|
262
|
+
return {
|
|
263
|
+
...semantic,
|
|
264
|
+
evidence: collected,
|
|
265
|
+
understanding_hash: await hash(fingerprint),
|
|
266
|
+
created_at: createdAt,
|
|
267
|
+
};
|
|
268
|
+
}
|
|
269
|
+
export function understandingInference(understanding, claim) {
|
|
270
|
+
return understanding.inferences.find((value) => value.claim === claim);
|
|
271
|
+
}
|
|
272
|
+
export function understandingOwner(understanding, module) {
|
|
273
|
+
const claim = module?.placement.owner_claim ?? "billing.owner";
|
|
274
|
+
const inference = understandingInference(understanding, claim);
|
|
275
|
+
if (!inference ||
|
|
276
|
+
understanding.unknowns.some((value) => value.claim === claim))
|
|
277
|
+
return undefined;
|
|
278
|
+
if (inference.authority !== "authoritative" &&
|
|
279
|
+
inference.confidence < AUTOMATIC_PLANNING_CONFIDENCE)
|
|
280
|
+
return undefined;
|
|
281
|
+
return String(inference.value);
|
|
282
|
+
}
|
|
@@ -1 +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,
|
|
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,OAAO,EAAE,MAAM,CAAC;IAChB,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,CAoBvC"}
|
|
@@ -26,12 +26,13 @@ export async function compileApplicationContract(spec, tenantId, applicationId)
|
|
|
26
26
|
if (spec.version !== 1)
|
|
27
27
|
throw new Error(`Unsupported flow_version ${spec.version}; this SDK supports flow_version 1`);
|
|
28
28
|
const manifest = flowSpecToManifest(spec, tenantId, applicationId);
|
|
29
|
-
const [model, authorization, workflows, agents, capabilities] = await Promise.all([
|
|
29
|
+
const [model, authorization, workflows, agents, capabilities, modules] = await Promise.all([
|
|
30
30
|
hash({ collections: manifest.collections, indexes: manifest.indexes, references: manifest.references }),
|
|
31
31
|
hash(manifest.policies),
|
|
32
32
|
hash({ workflows: manifest.workflows, triggers: manifest.triggers, schedules: manifest.schedules }),
|
|
33
33
|
hash(manifest.agents),
|
|
34
34
|
hash(manifest.capabilities),
|
|
35
|
+
hash(manifest.modules ?? []),
|
|
35
36
|
]);
|
|
36
37
|
const application = await hash({ dsl_version: spec.version, manifest });
|
|
37
38
|
return {
|
|
@@ -40,6 +41,6 @@ export async function compileApplicationContract(spec, tenantId, applicationId)
|
|
|
40
41
|
schema_version: manifest.schema,
|
|
41
42
|
dsl_version: spec.version,
|
|
42
43
|
manifest,
|
|
43
|
-
hashes: { model, authorization, workflows, agents, capabilities, application },
|
|
44
|
+
hashes: { model, authorization, workflows, agents, capabilities, modules, application },
|
|
44
45
|
};
|
|
45
46
|
}
|
|
@@ -69,7 +69,7 @@ export async function generateConfiguredFlowProposal(input, cwd = process.cwd())
|
|
|
69
69
|
throw new Error('Local WebLLM generation runs in the browser');
|
|
70
70
|
const apiKey = config.credentialId ? loadCredential(config.credentialId) : process.env.FELTDB_AI_API_KEY;
|
|
71
71
|
const baseUrl = config.baseUrl || 'https://api.openai.com/v1';
|
|
72
|
-
const messages = createFlowProposalMessages(input.snapshot, input.currentFlow, input.intent);
|
|
72
|
+
const messages = await createFlowProposalMessages(input.snapshot, input.currentFlow, input.intent);
|
|
73
73
|
const complete = async (requestMessages) => {
|
|
74
74
|
const response = await fetch(`${baseUrl}/chat/completions`, {
|
|
75
75
|
method: 'POST',
|
|
@@ -86,12 +86,12 @@ export async function generateConfiguredFlowProposal(input, cwd = process.cwd())
|
|
|
86
86
|
};
|
|
87
87
|
const raw = await complete(messages);
|
|
88
88
|
try {
|
|
89
|
-
return await validateGeneratedFlowProposal({ raw, snapshot: input.snapshot, currentFlow: input.currentFlow });
|
|
89
|
+
return await validateGeneratedFlowProposal({ raw, intent: input.intent, snapshot: input.snapshot, currentFlow: input.currentFlow });
|
|
90
90
|
}
|
|
91
91
|
catch (error) {
|
|
92
92
|
const reason = error instanceof Error ? error.message : String(error);
|
|
93
93
|
const repaired = await complete([...messages, { role: 'assistant', content: raw }, { role: 'user',
|
|
94
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 });
|
|
95
|
+
return validateGeneratedFlowProposal({ raw: repaired, intent: input.intent, snapshot: input.snapshot, currentFlow: input.currentFlow });
|
|
96
96
|
}
|
|
97
97
|
}
|