langflower 0.0.4 → 0.0.6

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 (98) hide show
  1. package/README.md +20 -15
  2. package/docs/public/README.md +15 -0
  3. package/docs/public/configuration.md +56 -0
  4. package/docs/public/extending.md +58 -0
  5. package/docs/public/getting-started.md +61 -0
  6. package/docs/public/how-it-works.md +39 -0
  7. package/docs/public/product.md +43 -0
  8. package/docs/public/using-the-editor.md +53 -0
  9. package/docs/public/workflows.md +49 -0
  10. package/package.json +3 -2
  11. package/ui-dist/chunk-6DQ2XSRW.js +4 -0
  12. package/ui-dist/{chunk-2AICAC67.js → chunk-Y6VMBLSJ.js} +1 -1
  13. package/ui-dist/index.html +2 -2
  14. package/ui-dist/main-RCFTD5AZ.js +311 -0
  15. package/ui-dist/styles-EOXODOI7.css +1 -0
  16. package/vendor/common-nodes/dist/ai/critique/node.d.ts +141 -23
  17. package/vendor/common-nodes/dist/ai/critique/node.js +33 -31
  18. package/vendor/common-nodes/dist/ai/fake-llm/node.d.ts +6 -6
  19. package/vendor/common-nodes/dist/ai/llm-compaction-ui-schema.d.ts +1 -1
  20. package/vendor/common-nodes/dist/ai/llm-compaction-ui-schema.js +2 -1
  21. package/vendor/common-nodes/dist/ai/llm-panel-ui-schema.d.ts +7 -21
  22. package/vendor/common-nodes/dist/ai/llm-panel-ui-schema.js +8 -4
  23. package/vendor/common-nodes/dist/ai/llm-session-shell.d.ts +2 -0
  24. package/vendor/common-nodes/dist/ai/llm-session-shell.js +3 -3
  25. package/vendor/common-nodes/dist/ai/normalize-max-iterations.d.ts +4 -3
  26. package/vendor/common-nodes/dist/ai/normalize-max-iterations.js +4 -3
  27. package/vendor/common-nodes/dist/ai/openai/normalize-compaction-params.d.ts +2 -2
  28. package/vendor/common-nodes/dist/ai/openai/normalize-compaction-params.js +1 -1
  29. package/vendor/common-nodes/dist/ai/openai-llm/node.d.ts +9 -9
  30. package/vendor/common-nodes/dist/ai/resolve-chat-provider-model.d.ts +10 -0
  31. package/vendor/common-nodes/dist/ai/resolve-chat-provider-model.js +8 -0
  32. package/vendor/common-nodes/dist/ai/review/node.d.ts +138 -15
  33. package/vendor/common-nodes/dist/ai/review/node.js +29 -22
  34. package/vendor/common-nodes/dist/ai/run-host-services.d.ts +8 -0
  35. package/vendor/common-nodes/dist/ai/sub-agent/node.d.ts +9 -9
  36. package/vendor/common-nodes/dist/ai/sub-agent/node.js +4 -3
  37. package/vendor/common-nodes/dist/hitl/chat-input/node.js +1 -0
  38. package/vendor/common-nodes/dist/hitl/review-gate/node.js +5 -0
  39. package/vendor/node-sdk/dist/node-factory/define-llm-node/default-llm-ports.js +2 -0
  40. package/vendor/node-sdk/dist/node-factory/define-reactive-node/define-reactive-node.d.ts +1 -1
  41. package/vendor/node-sdk/dist/node-factory/define-reactive-node/io-helpers.d.ts +5 -12
  42. package/vendor/node-sdk/dist/node-factory/define-reactive-node/port-meta.d.ts +13 -0
  43. package/vendor/runtime/dist/runtime-runner.js +7 -4
  44. package/vendor/runtime/dist/runtime.d.ts +1 -1
  45. package/vendor/runtime/dist/types.d.ts +12 -0
  46. package/vendor/server/dist/bridge/attach-langflower-bridge.d.ts +4 -1
  47. package/vendor/server/dist/bridge/attach-langflower-bridge.js +16 -5
  48. package/vendor/server/dist/bridge/bridge-event-log.d.ts +12 -0
  49. package/vendor/server/dist/bridge/bridge-event-log.js +199 -0
  50. package/vendor/server/dist/bridge/build-execution-context.d.ts +1 -1
  51. package/vendor/server/dist/bridge/build-execution-context.js +3 -0
  52. package/vendor/server/dist/bridge/emit-bootstrap.d.ts +4 -2
  53. package/vendor/server/dist/bridge/emit-bootstrap.js +6 -2
  54. package/vendor/server/dist/bridge/settings-draft-controller.d.ts +14 -0
  55. package/vendor/server/dist/bridge/settings-draft-controller.js +178 -0
  56. package/vendor/server/dist/bridge/wire-config-handlers.d.ts +8 -1
  57. package/vendor/server/dist/bridge/wire-config-handlers.js +44 -16
  58. package/vendor/server/dist/bridge/wire-editor-handlers.d.ts +8 -1
  59. package/vendor/server/dist/bridge/wire-editor-handlers.js +40 -1
  60. package/vendor/server/dist/bridge/wire-runner-handlers.js +3 -1
  61. package/vendor/server/dist/config/langflower-config.service.d.ts +2 -0
  62. package/vendor/server/dist/config/langflower-config.service.js +24 -1
  63. package/vendor/server/dist/config/resolve-draft-provider-credentials.d.ts +18 -0
  64. package/vendor/server/dist/config/resolve-draft-provider-credentials.js +60 -0
  65. package/vendor/server/dist/create-server.js +5 -3
  66. package/vendor/server/dist/session/build-session-bootstrap.d.ts +3 -1
  67. package/vendor/server/dist/session/build-session-bootstrap.js +9 -0
  68. package/vendor/server/dist/session/langflower-session.d.ts +7 -2
  69. package/vendor/server/dist/session/langflower-session.js +9 -1
  70. package/vendor/server/dist/session/settings-draft-session.d.ts +24 -0
  71. package/vendor/server/dist/session/settings-draft-session.js +82 -0
  72. package/vendor/server/skeleton/schemas/langflower-config.schema.json +4 -0
  73. package/vendor/server/skeleton/skills/langflower-helper/SKILL.md +20 -8
  74. package/vendor/server/skeleton/skills/langflower-helper/architecture.md +5 -0
  75. package/vendor/server/skeleton/skills/langflower-helper/layout.md +18 -16
  76. package/vendor/server/skeleton/workflows/simple-coder.json +249 -19
  77. package/vendor/server/skeleton/workflows/starter.json +31 -20
  78. package/vendor/shared/dist/langflower-bus-config.d.ts +50 -10
  79. package/vendor/shared/dist/langflower-bus-config.js +52 -11
  80. package/vendor/shared/dist/langflower-config/merge-langflower-config-layers.test.js +4 -0
  81. package/vendor/shared/dist/langflower-config/parse-default-chat-model.d.ts +14 -0
  82. package/vendor/shared/dist/langflower-config/parse-default-chat-model.js +38 -0
  83. package/vendor/shared/dist/langflower-config/parse-default-chat-model.test.d.ts +1 -0
  84. package/vendor/shared/dist/langflower-config/parse-default-chat-model.test.js +41 -0
  85. package/vendor/shared/dist/langflower-config/resolve-server-logs-enabled.d.ts +6 -0
  86. package/vendor/shared/dist/langflower-config/resolve-server-logs-enabled.js +5 -0
  87. package/vendor/shared/dist/langflower-config/resolve-server-logs-enabled.test.d.ts +1 -0
  88. package/vendor/shared/dist/langflower-config/resolve-server-logs-enabled.test.js +11 -0
  89. package/vendor/shared/dist/langflower-config/settings-draft.d.ts +44 -0
  90. package/vendor/shared/dist/langflower-config/settings-draft.js +143 -0
  91. package/vendor/shared/dist/langflower.d.ts +7 -2
  92. package/vendor/shared/dist/langflower.js +3 -0
  93. package/vendor/shared/dist/types/langflower-bootstrap.d.ts +6 -1
  94. package/vendor/shared/dist/types/langflower-config.d.ts +65 -0
  95. package/vendor/shared/dist/types/langflower-editor.d.ts +19 -0
  96. package/ui-dist/chunk-6ZABW4JL.js +0 -4
  97. package/ui-dist/main-XI7IOZKZ.js +0 -311
  98. package/ui-dist/styles-TQGRAC7Q.css +0 -1
@@ -0,0 +1,143 @@
1
+ /**
2
+ * Settings form draft helpers — layer config ↔ draft, save payload, equality.
3
+ * Used by UI and server session draft (protocol snapshots redact apiKey).
4
+ */
5
+ import { formatDefaultChatModel, parseDefaultChatModel, } from './parse-default-chat-model.js';
6
+ const isRecord = (value) => typeof value === 'object' && value !== null && !Array.isArray(value);
7
+ const providerBaseURL = (provider) => {
8
+ const options = provider['options'];
9
+ if (!isRecord(options)) {
10
+ return '';
11
+ }
12
+ return typeof options['baseURL'] === 'string' ? options['baseURL'] : '';
13
+ };
14
+ const providerHasApiKey = (provider) => provider['hasApiKey'] === true;
15
+ export const configToDraft = (config) => {
16
+ const providers = Object.entries(config.provider ?? {}).map(([id, provider]) => ({
17
+ id,
18
+ name: provider.name,
19
+ baseURL: providerBaseURL(provider),
20
+ modelsText: (provider.models ?? []).join(', '),
21
+ apiKey: '',
22
+ hasApiKey: providerHasApiKey(provider),
23
+ }));
24
+ const serverLogs = config.serverLogs === true
25
+ ? 'on'
26
+ : config.serverLogs === false
27
+ ? 'off'
28
+ : 'default';
29
+ const parts = parseDefaultChatModel(config.model);
30
+ return {
31
+ defaultProviderId: parts?.providerId ?? '',
32
+ defaultModelId: parts?.model ?? '',
33
+ providers,
34
+ serverLogs,
35
+ };
36
+ };
37
+ /** Snapshot-safe draft — never echo secrets. */
38
+ export const redactDraftSecrets = (draft) => ({
39
+ ...draft,
40
+ providers: draft.providers.map((row) => ({
41
+ ...row,
42
+ apiKey: '',
43
+ })),
44
+ });
45
+ const parseModelsText = (text) => text
46
+ .split(',')
47
+ .map((part) => part.trim())
48
+ .filter((part) => part.length > 0);
49
+ const serverLogsToSave = (draft) => {
50
+ if (draft === 'on') {
51
+ return true;
52
+ }
53
+ if (draft === 'off') {
54
+ return false;
55
+ }
56
+ return null;
57
+ };
58
+ export const draftToSavePayload = (scope, draft) => {
59
+ const providerApiKeys = Object.fromEntries(draft.providers
60
+ .filter((row) => row.apiKey.trim().length > 0)
61
+ .map((row) => [row.id.trim(), row.apiKey.trim()]));
62
+ const provider = Object.fromEntries(draft.providers
63
+ .filter((row) => row.id.trim().length > 0)
64
+ .map((row) => {
65
+ const models = parseModelsText(row.modelsText);
66
+ const baseURL = row.baseURL.trim();
67
+ return [
68
+ row.id.trim(),
69
+ {
70
+ name: row.name.trim() || row.id.trim(),
71
+ ...(models.length > 0 ? { models } : {}),
72
+ ...(baseURL.length > 0 ? { options: { baseURL } } : {}),
73
+ },
74
+ ];
75
+ }));
76
+ // Always send `model` so clearing the selects removes it from the layer
77
+ // (omit would leave the previous disk value — Save looked like a no-op).
78
+ const model = formatDefaultChatModel(draft.defaultProviderId, draft.defaultModelId) ??
79
+ '';
80
+ return {
81
+ scope,
82
+ model,
83
+ provider,
84
+ providerApiKeys,
85
+ serverLogs: serverLogsToSave(draft.serverLogs),
86
+ };
87
+ };
88
+ export const sameDraft = (a, b) => JSON.stringify(a) === JSON.stringify(b);
89
+ /**
90
+ * Merge an incoming patch draft into the session draft while preserving
91
+ * write-only apiKey values when the patch sends an empty key field.
92
+ */
93
+ export const mergeDraftPatch = (previous, patch) => ({
94
+ ...patch,
95
+ providers: patch.providers.map((row, index) => {
96
+ const prior = previous.providers[index];
97
+ const incomingKey = row.apiKey.trim();
98
+ if (incomingKey.length > 0) {
99
+ return row;
100
+ }
101
+ return {
102
+ ...row,
103
+ apiKey: prior?.apiKey ?? '',
104
+ };
105
+ }),
106
+ });
107
+ /**
108
+ * After a saved-layer baseline refresh:
109
+ * - pristine form → take the layer draft (apiKey always empty);
110
+ * - dirty form → clear write-only `apiKey`, refresh `hasApiKey` from the
111
+ * layer, then fully align when non-secret fields already match (post-Save).
112
+ */
113
+ export const draftAfterLayerSnapshot = (previousDraft, previousBaseline, nextBaseline) => {
114
+ if (sameDraft(previousDraft, previousBaseline)) {
115
+ return nextBaseline;
116
+ }
117
+ const cleared = {
118
+ ...previousDraft,
119
+ providers: previousDraft.providers.map((row) => {
120
+ const fromLayer = nextBaseline.providers.find((provider) => provider.id === row.id);
121
+ return {
122
+ ...row,
123
+ apiKey: '',
124
+ hasApiKey: fromLayer?.hasApiKey ?? false,
125
+ };
126
+ }),
127
+ };
128
+ return sameDraft(cleared, nextBaseline) ? nextBaseline : cleared;
129
+ };
130
+ /** Static model ids from the provider row matching `defaultProviderId`. */
131
+ export const defaultProviderStaticModelIds = (draft) => {
132
+ const providerId = draft.defaultProviderId.trim();
133
+ if (providerId.length === 0) {
134
+ return [];
135
+ }
136
+ const row = draft.providers.find((provider) => provider.id === providerId);
137
+ if (row === undefined) {
138
+ return [];
139
+ }
140
+ return parseModelsText(row.modelsText);
141
+ };
142
+ /** Row key for connections map (stable for empty ids). */
143
+ export const providerConnectionKey = (index) => String(index);
@@ -11,9 +11,14 @@ export { langflowerWsConfig } from './langflower-bus-config.js';
11
11
  */
12
12
  export type { DividerPositions, ExecutionFeedSnapshotPayload, RunnerSnapshotPayload, SessionStateSnapshotPayload, ToolConfigSnapshotPayload, } from './types/langflower-bootstrap.js';
13
13
  export type { ProjectBootstrapResultPayload } from './types/langflower-project-bootstrap.js';
14
- export type { LangflowerConfig, LangflowerConfigSaveRequestedPayload, LangflowerConfigScope, LangflowerConfigSnapshotPayload, LangflowerHarnessConfig, LangflowerMcpConfig, LangflowerMcpHttpServerConfig, LangflowerMcpServerConfig, LangflowerMcpStdioServerConfig, LangflowerModelsCatalogSnapshotPayload, LangflowerProviderModelsCatalog, LangflowerPermissionConfig, LangflowerPermissionDecision, LangflowerPermissionToolConfig, LangflowerProviderConfig, LangflowerSkillConfig, LangflowerToolConfig, ProviderModelEntry, RunnerPermissionAskPayload, RunnerPermissionReplyPayload, } from './types/langflower-config.js';
14
+ export type { LangflowerConfig, LangflowerConfigDraft, LangflowerConfigDraftDiscardRequestedPayload, LangflowerConfigDraftPatchRequestedPayload, LangflowerConfigDraftSnapshotPayload, LangflowerConfigSaveRequestedPayload, LangflowerConfigScope, LangflowerConfigSnapshotPayload, LangflowerHarnessConfig, LangflowerMcpConfig, LangflowerMcpHttpServerConfig, LangflowerMcpServerConfig, LangflowerMcpStdioServerConfig, LangflowerModelsCatalogSnapshotPayload, LangflowerProviderModelsCatalog, LangflowerPermissionConfig, LangflowerPermissionDecision, LangflowerPermissionToolConfig, LangflowerProviderConfig, LangflowerSkillConfig, LangflowerToolConfig, ProviderConnectionStatus, ProviderModelEntry, RunnerPermissionAskPayload, RunnerPermissionReplyPayload, } from './types/langflower-config.js';
15
15
  export { mergeLangflowerConfigLayers } from './langflower-config/merge-langflower-config-layers.js';
16
- export type { EditorAddEdgeRequestedPayload, EditorAddNodeRequestedPayload, EditorPasteRequestedPayload, EditorSelectedNodePayload, EditorSelectNodeRequestedPayload, EditorUpdateNodeRequestedPayload, } from './types/langflower-editor.js';
16
+ export { defaultChatModelEmptyTitle, formatDefaultChatModel, parseDefaultChatModel, } from './langflower-config/parse-default-chat-model.js';
17
+ export type { DefaultChatModelParts } from './langflower-config/parse-default-chat-model.js';
18
+ export { configToDraft, defaultProviderStaticModelIds, draftAfterLayerSnapshot, draftToSavePayload, mergeDraftPatch, providerConnectionKey, redactDraftSecrets, sameDraft, } from './langflower-config/settings-draft.js';
19
+ export type { ProviderDraft, ServerLogsDraft, SettingsDraft, } from './langflower-config/settings-draft.js';
20
+ export { resolveServerLogsEnabled } from './langflower-config/resolve-server-logs-enabled.js';
21
+ export type { EditorAddEdgeRequestedPayload, EditorAddNodeRequestedPayload, EditorPasteRequestedPayload, EditorSelectedNodePayload, EditorSelectNodeRequestedPayload, EditorSettingsRequestedPayload, EditorSettingsSnapshotPayload, EditorUpdateNodeRequestedPayload, } from './types/langflower-editor.js';
17
22
  export type { PaletteCompilationDiagnostic, PaletteConfigPayload, PaletteNodeDefinition, PaletteNodeSource, } from './types/langflower-palette.js';
18
23
  export type { CustomPaletteCompilationStatus, CustomPalettePackError, CustomPaletteSnapshotPayload, } from './types/langflower-custom-palette.js';
19
24
  export type { ExecutionProgressStatus, SessionReadyPayload, } from './types/langflower-server.js';
@@ -5,6 +5,9 @@ export { encodeMcpToolId, isMcpToolId, isValidMcpServerId, parseMcpToolId, } fro
5
5
  export { displayEnabledToolIds, HARNESS_BUILTIN_TOOL_OPTIONS, mergeEnabledToolIdsOnNewWires, resolveEnabledToolOptions, resolveMcpServerOptions, resolveWiredToolOptions, } from './langflower-config/resolve-wired-tool-options.js';
6
6
  export { langflowerWsConfig } from './langflower-bus-config.js';
7
7
  export { mergeLangflowerConfigLayers } from './langflower-config/merge-langflower-config-layers.js';
8
+ export { defaultChatModelEmptyTitle, formatDefaultChatModel, parseDefaultChatModel, } from './langflower-config/parse-default-chat-model.js';
9
+ export { configToDraft, defaultProviderStaticModelIds, draftAfterLayerSnapshot, draftToSavePayload, mergeDraftPatch, providerConnectionKey, redactDraftSecrets, sameDraft, } from './langflower-config/settings-draft.js';
10
+ export { resolveServerLogsEnabled } from './langflower-config/resolve-server-logs-enabled.js';
8
11
  export { toCheckpointJsonValue } from './checkpoint/json-value.js';
9
12
  export { buildWorkflowFingerprint } from './checkpoint/workflow-fingerprint.js';
10
13
  export { deriveExecutionProgressStatus, formatRunSettleLine, terminalExecutionProgressStatus, } from './execution/derive-run-settle-outcome.js';
@@ -1,7 +1,7 @@
1
1
  import type { RunId, RuntimeRunnerEvent, RuntimeRunnerStatus } from '@langflower/runtime';
2
2
  import type { ToolConfig } from './config.js';
3
3
  import type { LangflowerConfig } from './langflower-config.js';
4
- import type { EditorSelectedNodePayload } from './langflower-editor.js';
4
+ import type { EditorSelectedNodePayload, EditorSettingsSnapshotPayload } from './langflower-editor.js';
5
5
  import type { ExecutionProgressStatus } from './langflower-server.js';
6
6
  /** Editor divider positions (sidebar + composer sizes in px). */
7
7
  export type DividerPositions = {
@@ -57,4 +57,9 @@ export type SessionStateSnapshotPayload = {
57
57
  readonly dividerPositions: DividerPositions;
58
58
  /** Currently selected canvas node (in memory, shared across tabs), or `null`. */
59
59
  readonly selectedNode: EditorSelectedNodePayload['node'];
60
+ /**
61
+ * Settings aside chrome (open + scope). Empty effective providers force
62
+ * `{ open: true, scope: 'global' }` on connect for bootstrap onboarding.
63
+ */
64
+ readonly settings: EditorSettingsSnapshotPayload;
60
65
  };
@@ -114,6 +114,11 @@ export type LangflowerConfig = {
114
114
  * Inspector `enabledMcpIds` is the only enable gate.
115
115
  */
116
116
  readonly mcp?: LangflowerMcpConfig;
117
+ /**
118
+ * Bridge diagnostic JSONL logging under `.langflower/logs/`.
119
+ * Omit = inherit (Default in Settings); `true`/`false` set the scope.
120
+ */
121
+ readonly serverLogs?: boolean;
117
122
  };
118
123
  /** Settings / config save target layer. */
119
124
  export type LangflowerConfigScope = 'project' | 'global';
@@ -131,6 +136,11 @@ export type LangflowerConfigSaveRequestedPayload = {
131
136
  readonly model?: string;
132
137
  readonly provider?: Readonly<Record<string, LangflowerProviderConfig>>;
133
138
  readonly providerApiKeys?: Readonly<Record<string, string>>;
139
+ /**
140
+ * `true` / `false` persist the scope key; `null` clears it (Default).
141
+ * Omitted leaves the existing scope value unchanged.
142
+ */
143
+ readonly serverLogs?: boolean | null;
134
144
  };
135
145
  /** Server → client authoritative config slice (effective + editable layers). */
136
146
  export type LangflowerConfigSnapshotPayload = {
@@ -179,3 +189,58 @@ export type LangflowerProviderModelsCatalog = {
179
189
  export type LangflowerModelsCatalogSnapshotPayload = {
180
190
  readonly catalogs: Readonly<Record<string, LangflowerProviderModelsCatalog>>;
181
191
  };
192
+ /**
193
+ * Per-provider connection probe status on the Settings draft snapshot.
194
+ * Keyed by draft row index string (`"0"`, `"1"`, …).
195
+ */
196
+ export type ProviderConnectionStatus = {
197
+ readonly state: 'idle';
198
+ } | {
199
+ readonly state: 'checking';
200
+ } | {
201
+ readonly state: 'ok';
202
+ readonly modelCount: number;
203
+ } | {
204
+ readonly state: 'error';
205
+ readonly message: string;
206
+ };
207
+ /**
208
+ * Redacted Settings form draft (same shape as UI/server session draft).
209
+ * `providers[].apiKey` is always empty on the wire.
210
+ */
211
+ export type LangflowerConfigDraft = {
212
+ readonly defaultProviderId: string;
213
+ readonly defaultModelId: string;
214
+ readonly providers: readonly {
215
+ readonly id: string;
216
+ readonly name: string;
217
+ readonly baseURL: string;
218
+ readonly modelsText: string;
219
+ readonly apiKey: string;
220
+ readonly hasApiKey: boolean;
221
+ }[];
222
+ readonly serverLogs: 'off' | 'default' | 'on';
223
+ };
224
+ /**
225
+ * Server → client: authoritative unsaved Settings draft for one scope,
226
+ * including per-row connection status. Session memory; broadcast to all tabs.
227
+ */
228
+ export type LangflowerConfigDraftSnapshotPayload = {
229
+ readonly scope: LangflowerConfigScope;
230
+ readonly draft: LangflowerConfigDraft;
231
+ readonly baseline: LangflowerConfigDraft;
232
+ readonly dirty: boolean;
233
+ readonly connections: Readonly<Record<string, ProviderConnectionStatus>>;
234
+ };
235
+ /**
236
+ * Client → server: replace the session draft for a scope (full draft).
237
+ * Empty `providers[].apiKey` means keep the session pending key / saved key.
238
+ */
239
+ export type LangflowerConfigDraftPatchRequestedPayload = {
240
+ readonly scope: LangflowerConfigScope;
241
+ readonly draft: LangflowerConfigDraft;
242
+ };
243
+ /** Client → server: re-seed draft from the saved layer for a scope. */
244
+ export type LangflowerConfigDraftDiscardRequestedPayload = {
245
+ readonly scope: LangflowerConfigScope;
246
+ };
@@ -1,4 +1,5 @@
1
1
  import type { NodeId } from '@langflower/runtime';
2
+ import type { LangflowerConfigScope } from './langflower-config.js';
2
3
  import type { PaletteNodeDefinition } from './langflower-palette.js';
3
4
  import type { WorkflowNodePersisted } from './langflower-workflow.js';
4
5
  /** Palette drop or explicit add-node intent — server assigns `nodeId`. */
@@ -65,6 +66,24 @@ export type EditorUpdateNodeRequestedPayload = {
65
66
  export type EditorSelectNodeRequestedPayload = {
66
67
  readonly nodeId: NodeId | null;
67
68
  };
69
+ /**
70
+ * Authoritative Settings aside chrome — open/closed + active config scope.
71
+ * Session memory only (not persisted to `langflower.jsonc`).
72
+ */
73
+ export type EditorSettingsSnapshotPayload = {
74
+ readonly open: boolean;
75
+ readonly scope: LangflowerConfigScope;
76
+ };
77
+ /**
78
+ * Intent to set Settings aside chrome.
79
+ *
80
+ * When `open: true`, `scope` is required. When `open: false`, server keeps the
81
+ * prior scope for the next open.
82
+ */
83
+ export type EditorSettingsRequestedPayload = {
84
+ readonly open: boolean;
85
+ readonly scope?: LangflowerConfigScope;
86
+ };
68
87
  /**
69
88
  * Rich selected-node projection for the Inspector — the existing persisted
70
89
  * node shape plus its palette definition, no parallel DTO. `null` when