@lunora/config 1.0.0-alpha.4 → 1.0.0-alpha.41

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.d.mts CHANGED
@@ -1,5 +1,6 @@
1
- import { ContainerIR, WorkflowIR } from '@lunora/codegen';
1
+ import { ContainerIR, WorkflowIR, QueueIR } from '@lunora/codegen';
2
2
  export type { ContainerIR, WorkflowIR } from '@lunora/codegen';
3
+ import { Writable } from 'node:stream';
3
4
  import 'ts-morph';
4
5
  export { type A as AdditivePolicyEdit, type D as DestructivePolicyEdit, type P as PolicyEdit, type a as PolicyScaffoldFailureReason, type b as ScaffoldFileResult, type S as ScaffoldPolicyEdit, type c as WireResult, type W as WireRlsEdit, d as classifyPolicyEdit, s as scaffoldPolicyFile, w as wireRlsIntoProcedure } from "./packem_shared/policy-scaffold.d-DCmwn7zQ.mjs";
5
6
  /**
@@ -65,6 +66,77 @@ interface DiscoverContainerInfoResult {
65
66
  * (inference).
66
67
  */
67
68
  declare const discoverContainerInfo: (projectRoot: string, schemaDirectory: string) => DiscoverContainerInfoResult;
69
+ /** Severity a container output line is surfaced at: `stderr` → `error`, `stdout` → `info`. */
70
+ type ContainerLogLevel = "error" | "info";
71
+ /** One declared container to follow, identified by the names codegen lifts from `defineContainer`. */
72
+ interface ContainerLogSource {
73
+ /** Generated Durable Object class name, e.g. `TranscoderContainer`. Wrangler's dev image is `cloudflare-dev/<lowercased>`. */
74
+ className: string;
75
+ /** The `lunora/containers.ts` export name, e.g. `transcoder` — used as the display tag. */
76
+ exportName: string;
77
+ }
78
+ /** A single line of container output handed back to the caller. */
79
+ interface ContainerLogLine {
80
+ /** `"error"` for the container's stderr, `"info"` for its stdout. */
81
+ level: ContainerLogLevel;
82
+ /** The container's export name (`transcoder`), for tagging the line. */
83
+ name: string;
84
+ /** One output line, with the trailing newline (and any `\r`) stripped. */
85
+ text: string;
86
+ }
87
+ interface ContainerLogStreamOptions {
88
+ /** The declared containers to follow. An empty list yields an inert handle. */
89
+ containers: ReadonlyArray<ContainerLogSource>;
90
+ /** Injected Docker client — defaults to a real lazily-imported `dockerode` instance. Tests pass a stub. */
91
+ docker?: DockerLike;
92
+ /** Called once per container output line. */
93
+ onLine: (line: ContainerLogLine) => void;
94
+ /** Called once when the Docker engine can't be reached (re-armed after it recovers). Defaults to silent. */
95
+ onUnavailable?: (message: string) => void;
96
+ /** Poll interval override, in ms. */
97
+ pollIntervalMs?: number;
98
+ }
99
+ /** Handle controlling a running log stream. */
100
+ interface ContainerLogStreamHandle {
101
+ /** Stop polling and tear down every attached log stream. Idempotent. */
102
+ close: () => void;
103
+ }
104
+ /** The minimal structural slice of a `dockerode` log stream this module consumes. */
105
+ interface DockerLogStream {
106
+ destroy: () => void;
107
+ on: (event: "data" | "end" | "error", listener: (chunk?: Buffer) => void) => void;
108
+ }
109
+ /** The minimal structural slice of a `dockerode` instance this module consumes. */
110
+ interface DockerLike {
111
+ getContainer: (id: string) => {
112
+ logs: (options: {
113
+ follow: true;
114
+ stderr: true;
115
+ stdout: true;
116
+ tail: "all";
117
+ timestamps: false;
118
+ }) => Promise<DockerLogStream>;
119
+ };
120
+ listContainers: (options: {
121
+ filters: {
122
+ status: ["running"];
123
+ };
124
+ }) => Promise<{
125
+ Id: string;
126
+ Image: string;
127
+ }[]>;
128
+ modem: {
129
+ demuxStream: (stream: DockerLogStream, stdout: Writable, stderr: Writable) => void;
130
+ };
131
+ }
132
+ /**
133
+ * Follow the local Docker logs of every declared container, emitting each output
134
+ * line through `onLine` tagged with its export name. Polls for containers (they
135
+ * start lazily on first request and may be replaced on restart), attaches once
136
+ * per container id, and drops streams whose container has gone. Returns
137
+ * immediately with a `close()` handle; all work happens asynchronously.
138
+ */
139
+ declare const streamContainerLogs: (options: ContainerLogStreamOptions) => ContainerLogStreamHandle;
68
140
  /**
69
141
  * The meta-frameworks Lunora can compose with, plus `"none"` for a standalone
70
142
  * SPA / SSR-less project (the current default). Mirrors PLAN4 §2.4.
@@ -156,34 +228,52 @@ interface InferredContainer extends ContainerIR {
156
228
  interface InferredWorkflow extends WorkflowIR {
157
229
  exported: boolean;
158
230
  }
231
+ /**
232
+ * A queue declared in `lunora/queues.ts`. Unlike workflows, a queue needs no
233
+ * worker-entry class export (its `queue()` handler rides `createWorker`), so
234
+ * there is no `exported` flag — every declared queue is reconcilable into the
235
+ * wrangler `queues.producers[]` / `queues.consumers[]`.
236
+ */
237
+ type InferredQueue = QueueIR;
159
238
  interface InferredBindings {
160
239
  /** Containers declared in `lunora/containers.ts` (exported or not — see {@link InferredContainer.exported}). */
161
240
  containers: InferredContainer[];
162
241
  /** Durable Objects the worker entry exports → safe to bind. */
163
242
  durableObjects: DurableObjectSpec[];
243
+ /**
244
+ * The wrangler `flagship[].binding` name implied by `lunora/flags.ts` when it
245
+ * uses the Flagship provider in binding mode — `undefined` for HTTP-mode
246
+ * Flagship, a custom OpenFeature provider, or no flags. The binding needs an
247
+ * un-mintable `app_id`, so it is reconciled as a hint, not auto-written.
248
+ */
249
+ flagshipBinding?: string;
164
250
  /** Schema declares a `.global()` table → needs the `DB` D1 binding. */
165
251
  needsD1: boolean;
252
+ /** Queues declared in `lunora/queues.ts` → reconciled into `queues.producers[]` / `queues.consumers[]`. */
253
+ queues: InferredQueue[];
166
254
  /** Human-readable provenance for each inferred binding / hint, for logging. */
167
255
  signals: string[];
168
256
  /** `@lunora/ai` is imported or `env.AI` is used → needs the `ai` Workers AI binding. */
169
257
  usesAi: boolean;
170
- /** `@lunora/analytics` is imported → self-describing `analytics_engine_datasets` binding (auto-writeable). */
258
+ /** `@lunora/bindings/analytics` is imported → self-describing `analytics_engine_datasets` binding (auto-writeable). */
171
259
  usesAnalytics: boolean;
172
260
  /** `@lunora/auth` is imported (sessions may be D1- or `SessionDO`-backed). */
173
261
  usesAuth: boolean;
174
262
  /** `@lunora/browser` is imported → self-describing `browser` binding (auto-writeable). */
175
263
  usesBrowser: boolean;
264
+ /** `lunora/flags.ts` declares a feature-flag provider (any OpenFeature provider — Flagship or custom). */
265
+ usesFlags: boolean;
176
266
  /** `@lunora/hyperdrive` is imported (binding needs an un-mintable remote `id`; hint-only). */
177
267
  usesHyperdrive: boolean;
178
- /** `@lunora/images` is imported → self-describing `images` binding (auto-writeable). */
268
+ /** `@lunora/bindings/images` is imported → self-describing `images` binding (auto-writeable). */
179
269
  usesImages: boolean;
180
- /** `@lunora/kv` is imported (namespace binding name + id are user-defined; hint-only). */
270
+ /** `@lunora/bindings/kv` is imported (namespace binding name + id are user-defined; hint-only). */
181
271
  usesKv: boolean;
182
272
  /** `@lunora/mail` is imported (Resend API key must be set in `.dev.vars`; no binding). */
183
273
  usesMail: boolean;
184
274
  /** `@lunora/payment` is imported (provider secrets must be set in `.dev.vars`; no binding). */
185
275
  usesPayment: boolean;
186
- /** `@lunora/pipelines` is imported (binding needs an un-mintable remote pipeline name; hint-only). */
276
+ /** `ctx.pipelines` is used (binding needs an un-mintable remote pipeline name; hint-only). */
187
277
  usesPipelines: boolean;
188
278
  /** `@lunora/scheduler` is imported. */
189
279
  usesScheduler: boolean;
@@ -288,6 +378,12 @@ declare const LUNORA_EVENT_SOURCE = "lunora";
288
378
  * — so the caller passes the original line through untouched. Pure and total.
289
379
  */
290
380
  declare const formatLunoraEvent: (line: string) => LunoraFormattedLine | undefined;
381
+ declare class LunoraReporter {
382
+ #private;
383
+ setStdout(stdout: NodeJS.WriteStream): void;
384
+ setStderr(stderr: NodeJS.WriteStream): void;
385
+ log(meta: unknown): void;
386
+ }
291
387
  /**
292
388
  * Per-package secret-requirements registry for `.dev.vars` scaffolding.
293
389
  *
@@ -332,6 +428,15 @@ interface SecretEntry {
332
428
  */
333
429
  placeholderValue: string;
334
430
  }
431
+ /**
432
+ * Secrets every Lunora project needs regardless of which capability packages are
433
+ * installed — scaffolded into `.dev.vars` always. `LUNORA_ADMIN_TOKEN` is the
434
+ * bearer the local Studio uses to call the worker's admin endpoints (the data
435
+ * browser, schema edits) in dev; the worker reads the SAME `.dev.vars` value via
436
+ * its admin gate, so both agree and the Studio authenticates without a prompt.
437
+ * Without it, every `/_lunora/admin/*` call is `ADMIN_FORBIDDEN` (403).
438
+ */
439
+
335
440
  /**
336
441
  * The canonical registry of per-package secret requirements.
337
442
  *
@@ -653,6 +758,8 @@ interface RemoteEnableInputs {
653
758
  * is still overridable per-run by `--remote` or `LUNORA_REMOTE=1`.
654
759
  */
655
760
  declare const resolveRemoteEnabled: (inputs: RemoteEnableInputs) => boolean;
761
+ /** Core (always-scaffolded) secrets followed by the package-specific ones for the detected capabilities. */
762
+ declare const requiredSecrets: (packageNames: ReadonlyArray<string>) => SecretEntry[];
656
763
  /**
657
764
  * Whether an (already-unquoted) value looks like a fill-me-in placeholder —
658
765
  * empty, angle-bracketed, or containing a known marker — rather than a real
@@ -661,6 +768,15 @@ declare const resolveRemoteEnabled: (inputs: RemoteEnableInputs) => boolean;
661
768
  */
662
769
  declare const isPlaceholderValue: (value: string) => boolean;
663
770
  /**
771
+ * True for a secret-looking key whose value Lunora can mint locally (a random
772
+ * 32-byte hex, like `openssl rand -hex 32`) — e.g. `AUTH_SECRET`,
773
+ * `LUNORA_ADMIN_TOKEN`, `STORAGE_SIGNING_SECRET`. False for provider-issued keys
774
+ * ({@link PROVIDER_SECRET_KEYS}) and any non-secret key.
775
+ */
776
+ declare const isMintableSecretKey: (key: string) => boolean;
777
+ /** Mint a fresh strong secret value — 64 hex chars (32 bytes), like `openssl rand -hex 32`. */
778
+ declare const generateSecretValue: (randomHex?: (bytes: number) => string) => string;
779
+ /**
664
780
  * The outcome of planning a scaffold — a discriminated union so the orchestrator
665
781
  * never has to re-derive whether `content` is present.
666
782
  *
@@ -762,6 +878,58 @@ declare const buildPackageSecretsBlock: (packageNames: ReadonlyArray<string>, ex
762
878
  * **Safety invariant:** only placeholder values are written — no real secrets.
763
879
  */
764
880
  declare const ensureDevVariablesExample: (cwd: string, packageNames: ReadonlyArray<string>) => string[];
881
+ interface DevSecretsFillPlan {
882
+ /** {@link CORE_SECRETS} keys appended because they were absent (each generated). */
883
+ addedKeys: string[];
884
+ /** The full new file content to write. */
885
+ content: string;
886
+ /** Existing empty/placeholder secret-keyed entries filled with fresh values. */
887
+ filledKeys: string[];
888
+ }
889
+ /**
890
+ * Plan the in-place generation of dev secrets for a `.dev.vars`. First, every
891
+ * line whose KEY looks like a secret (`*_SECRET`, `*_TOKEN`, `*_KEY`,
892
+ * `*_PASSWORD`) and whose value is empty or a placeholder gets a freshly
893
+ * generated value — so a `lunora add`-scaffolded `.dev.vars` (which writes each
894
+ * secret blank) becomes usable on `lunora dev` / `vite dev` without the user
895
+ * running `openssl` by hand. Second, any {@link CORE_SECRETS} key absent from
896
+ * the file is appended (generated) — notably `LUNORA_ADMIN_TOKEN`, which the
897
+ * local Studio needs to call the worker's admin gate in dev (without it the
898
+ * Studio shows its login gate).
899
+ *
900
+ * Pure (given `randomHex`): real (non-placeholder) values are never touched, and
901
+ * comments + non-secret entries are preserved verbatim.
902
+ */
903
+ declare const planDevSecretsFill: (input: {
904
+ existingContent: string;
905
+ randomHex?: (bytes: number) => string;
906
+ }) => DevSecretsFillPlan;
907
+ interface FillDevSecretsResult {
908
+ /** Core secret keys appended (generated) because they were missing. */
909
+ addedKeys: string[];
910
+ /** Existing empty/placeholder secrets filled with generated values. */
911
+ filledKeys: string[];
912
+ /** `created` = no `.dev.vars` existed; `filled` = topped up an existing one; `unchanged` = nothing to do. */
913
+ status: "created" | "filled" | "unchanged";
914
+ }
915
+ /**
916
+ * Generate any missing/empty dev secrets in the project's `.dev.vars`, in place.
917
+ *
918
+ * Complements {@link ensureDevVariables} (which scaffolds `.dev.vars` from
919
+ * `.dev.vars.example`). A `lunora add`-scaffolded project writes secrets blank
920
+ * straight into `.dev.vars` (no example) and never includes `LUNORA_ADMIN_TOKEN`
921
+ * — so the worker boots with empty secrets and the Studio shows its login gate.
922
+ * This fills those gaps at dev startup, so both `lunora dev` and the
923
+ * `@lunora/vite` dev server give a working project with zero manual `openssl`.
924
+ *
925
+ * Never overwrites a real (non-placeholder) value. The write is atomic + owner-
926
+ * only (temp + rename, `mode: 0o600`), matching the other `.dev.vars` writers.
927
+ */
928
+ declare const fillDevSecrets: (deps: {
929
+ cwd: string;
930
+ info?: (message: string) => void;
931
+ randomHex?: (bytes: number) => string;
932
+ }) => FillDevSecretsResult;
765
933
  /** Add a new table to `defineSchema({ ... })`. */
766
934
  interface AddTableEdit {
767
935
  readonly kind: "addTable";
@@ -891,6 +1059,56 @@ interface DiscoverSchemaInfoResult {
891
1059
  * parse failure is a warning (validator) or simply ignorable (inference).
892
1060
  */
893
1061
  declare const discoverSchemaInfo: (projectRoot: string, schemaDirectory: string) => DiscoverSchemaInfoResult;
1062
+ /**
1063
+ * A badge: the short colored label that prefixes a line. `bg`/`fg` are hex so the
1064
+ * same value drives both colorize's `bgHex().hex()` and the tui `&lt;Text>` props.
1065
+ */
1066
+ interface BadgeSpec {
1067
+ bg: `#${string}`;
1068
+ fg: `#${string}`;
1069
+ text: string;
1070
+ }
1071
+ /** Lunora purple — the accent shared with the CLI prompt frames. */
1072
+ declare const ACCENT: `#${string}`;
1073
+ /** Standard log-level badge names (the restyled base output). */
1074
+ type LevelBadgeName = "debug" | "error" | "info" | "success" | "warn";
1075
+ /** Step-phase badge names (the create-astro-style flow transcript). */
1076
+ type StepBadgeName = "add" | "deps" | "dir" | "git" | "lunora" | "next" | "tmpl";
1077
+ type BadgeName = LevelBadgeName | StepBadgeName;
1078
+ /** The ordered step-phase names, used to register custom pail log types. */
1079
+ declare const STEP_BADGE_NAMES: ReadonlyArray<StepBadgeName>;
1080
+ /**
1081
+ * Every badge, keyed by name. Levels get their conventional colors (red/amber/
1082
+ * green/blue/grey); step phases follow create-astro's green→purple→cyan rhythm.
1083
+ */
1084
+ declare const BADGES: Record<BadgeName, BadgeSpec>;
1085
+ /**
1086
+ * Luna, the mascot: the folklore rabbit-in-the-moon — a bunny tucked inside the
1087
+ * moon disc. Pure ASCII so it renders the same everywhere (including piped logs).
1088
+ * The CLI signs off the `init` flow with it, the way create-astro closes with
1089
+ * Houston.
1090
+ */
1091
+ declare const LUNA_NAME = "Luna";
1092
+ declare const LUNA_SIGNOFF = "Safe travels, voyager.";
1093
+ declare const LUNA_BUNNY: string;
1094
+ /**
1095
+ * {@link LUNA_BUNNY} with its leading newline stripped, ready to render inline
1096
+ * (beside the name + sign-off). Both render paths — the tui mascot frame and the
1097
+ * pail off-TTY fallback — use this so neither re-implements the strip.
1098
+ */
1099
+ declare const LUNA_ART: string;
1100
+ /** The colored part of a badge — the word with one space of padding each side. */
1101
+ declare const padBadge: (text: string) => string;
1102
+ /** Leading spaces that right-align a badge's box within the gutter. */
1103
+ declare const badgeLead: (text: string) => string;
1104
+ /** Total columns a rendered badge column occupies (lead + box), constant across badges. */
1105
+ declare const BADGE_COLUMN_WIDTH: number;
1106
+ /** Columns a rendered badge occupies — the gutter-aligned column width. */
1107
+ declare const badgeWidth: (_spec: BadgeSpec) => number;
1108
+ /** Paint a badge as an ANSI string (the non-tui path): right-aligning spaces + the colored box. */
1109
+ declare const paintBadge: (spec: BadgeSpec) => string;
1110
+ /** Dim continuation text (a step's chosen answer, shown under the question). */
1111
+ declare const paintAnswer: (text: string) => string;
894
1112
  /** Candidate wrangler config filenames, in the order every consumer probes them. */
895
1113
  declare const WRANGLER_FILES: readonly ["wrangler.jsonc", "wrangler.json"];
896
1114
  /** Locate the project's wrangler config, or `undefined` when none exists. */
@@ -946,6 +1164,22 @@ interface WranglerWorkflowEntry {
946
1164
  class_name?: string;
947
1165
  name?: string;
948
1166
  }
1167
+ /** A wrangler `queues.producers[]` entry — a `Queue` binding sending to `queue`. */
1168
+ interface WranglerQueueProducer {
1169
+ binding?: string;
1170
+ delivery_delay?: number;
1171
+ queue?: string;
1172
+ }
1173
+ /** A wrangler `queues.consumers[]` entry — push (worker) or `type: "http_pull"`. */
1174
+ interface WranglerQueueConsumer {
1175
+ dead_letter_queue?: string;
1176
+ max_batch_size?: number;
1177
+ max_batch_timeout?: number;
1178
+ max_retries?: number;
1179
+ queue?: string;
1180
+ retry_delay?: number;
1181
+ type?: string;
1182
+ }
949
1183
  interface WranglerConfig {
950
1184
  analytics_engine_datasets?: ReadonlyArray<{
951
1185
  binding?: string;
@@ -974,6 +1208,10 @@ interface WranglerConfig {
974
1208
  durable_objects?: {
975
1209
  bindings?: ReadonlyArray<WranglerDurableObjectBinding>;
976
1210
  };
1211
+ flagship?: ReadonlyArray<{
1212
+ app_id?: string;
1213
+ binding?: string;
1214
+ } | null | undefined>;
977
1215
  hyperdrive?: ReadonlyArray<{
978
1216
  binding?: string;
979
1217
  id?: string;
@@ -1010,9 +1248,18 @@ interface WranglerConfig {
1010
1248
  placement?: {
1011
1249
  mode?: string;
1012
1250
  };
1251
+ queues?: {
1252
+ consumers?: ReadonlyArray<WranglerQueueConsumer | null | undefined>;
1253
+ producers?: ReadonlyArray<WranglerQueueProducer | null | undefined>;
1254
+ };
1013
1255
  r2_buckets?: ReadonlyArray<{
1014
1256
  binding?: string;
1015
1257
  }>;
1258
+ secrets_store_secrets?: ReadonlyArray<{
1259
+ binding?: string;
1260
+ secret_name?: string;
1261
+ store_id?: string;
1262
+ } | null | undefined>;
1016
1263
  send_email?: ReadonlyArray<{
1017
1264
  allowed_destination_addresses?: ReadonlyArray<string>;
1018
1265
  destination_address?: string;
@@ -1072,4 +1319,4 @@ interface WranglerProjectValidationResult {
1072
1319
  * `{ problems, wranglerPath }` shape plus the structured `report`.
1073
1320
  */
1074
1321
  declare const validateWranglerProject: (options: WranglerProjectValidationOptions) => WranglerProjectValidationResult;
1075
- export { AGENT_RULES_DIR, AGENT_RULES_HINT, AGENT_RULES_HINT_ENV, type AddIndexEdit, type AddOptionalColumnEdit, type AddTableEdit, type AdditiveEdit, type AgentRulesStatus, type ApplyEditResult, type ApplyFailureReason, type AugmentPlan, DEV_VARS_EXAMPLE_FILE, DEV_VARS_FILE, DEV_VARS_KEY_PATTERN, type DestructiveEdit, type DetectedFramework, type DiscoverContainerInfoResult, type DiscoverSchemaInfoResult, type DiscoverWorkflowInfoResult, type EnsureDevVariablesDeps, type EnsureDevVariablesResult, type EnsureDevVariablesStatus, type ExportGap, type FrameworkClass, type FrameworkDetection, type InferOptions, type InferredBindings, type InferredContainer, type InferredWorkflow, LINKED_PROJECT_DIR, LINKED_PROJECT_FILE, LUNORA_CONFIG_FILE, LUNORA_EVENT_SOURCE, LUNORA_SKILL_NAMES, type LinkedProject, type LunoraFormattedLine, type LunoraLineLevel, type LunoraProjectConfig, type MaterializeOptions, type MaterializeResult, type MultiSelectOption, PACKAGE_SECRETS_REGISTRY, type ParseSchemaResult, REMOTE_ELIGIBLE_KEYS, REQUIRED_COMPATIBILITY_DATE, REQUIRED_FLAG, ROOT_SKILL_NAME, type ReadWranglerResult, type ReconcileBindingsResult, type RemoteBindingPlan, type RemoteEnableInputs, type RemotePreference, type RemoteWranglerShape, type ScaffoldPlan, type SchemaColumn, type SchemaEdit, type SchemaIndex, type SchemaInfo, type SchemaTable, type SecretEntry, type SelectOption, type TailConsumer, WRANGLER_FILES, type WranglerConfig, type WranglerContainerEntry, type WranglerProjectValidationOptions, type WranglerProjectValidationResult, type WranglerValidationReport, type WranglerWorkflowEntry, applyAdditiveEdit, buildPackageSecretsBlock, claimAgentRulesHint, classifyEdit, createConfirm, detectAgentRules, detectFramework, discoverContainerInfo, discoverSchemaInfo, discoverWorkflowInfo, ensureDevVariables, ensureDevVariablesExample as ensureDevVarsExample, findWranglerFile, formatLunoraEvent, inferLunoraBindings, injectRemoteFlags, interpretRemote, isInteractive, isPlaceholderValue, isRemoteEnvEnabled, materializeRemoteWranglerConfig, packageNamesFromBindings, parseDevVariableEntries, parseSchema, planDevVariablesAugment, planDevVariablesScaffold, planRemoteBindings, promptMultiSelect, promptSelect, promptYesNo, readLinkedProject, readProjectRemotePreference, readWranglerJsonc, reconcileWranglerBindings, resolveRemoteEnabled, secretsForPackages, validateWrangler, validateWranglerConfig, validateWranglerProject, withTailConsumer, writeLinkedProject };
1322
+ export { ACCENT, AGENT_RULES_DIR, AGENT_RULES_HINT, AGENT_RULES_HINT_ENV, type AddIndexEdit, type AddOptionalColumnEdit, type AddTableEdit, type AdditiveEdit, type AgentRulesStatus, type ApplyEditResult, type ApplyFailureReason, type AugmentPlan, BADGES, BADGE_COLUMN_WIDTH, type BadgeName, type BadgeSpec, type ContainerLogLevel, type ContainerLogLine, type ContainerLogSource, type ContainerLogStreamHandle, type ContainerLogStreamOptions, DEV_VARS_EXAMPLE_FILE, DEV_VARS_FILE, DEV_VARS_KEY_PATTERN, type DestructiveEdit, type DetectedFramework, type DevSecretsFillPlan, type DiscoverContainerInfoResult, type DiscoverSchemaInfoResult, type DiscoverWorkflowInfoResult, type DockerLike, type EnsureDevVariablesDeps, type EnsureDevVariablesResult, type EnsureDevVariablesStatus, type ExportGap, type FillDevSecretsResult, type FrameworkClass, type FrameworkDetection, type InferOptions, type InferredBindings, type InferredContainer, type InferredWorkflow, LINKED_PROJECT_DIR, LINKED_PROJECT_FILE, LUNA_ART, LUNA_BUNNY, LUNA_NAME, LUNA_SIGNOFF, LUNORA_CONFIG_FILE, LUNORA_EVENT_SOURCE, LUNORA_SKILL_NAMES, type LevelBadgeName, type LinkedProject, type LunoraFormattedLine, type LunoraLineLevel, type LunoraProjectConfig, LunoraReporter, type MaterializeOptions, type MaterializeResult, type MultiSelectOption, PACKAGE_SECRETS_REGISTRY, type ParseSchemaResult, REMOTE_ELIGIBLE_KEYS, REQUIRED_COMPATIBILITY_DATE, REQUIRED_FLAG, ROOT_SKILL_NAME, type ReadWranglerResult, type ReconcileBindingsResult, type RemoteBindingPlan, type RemoteEnableInputs, type RemotePreference, type RemoteWranglerShape, STEP_BADGE_NAMES, type ScaffoldPlan, type SchemaColumn, type SchemaEdit, type SchemaIndex, type SchemaInfo, type SchemaTable, type SecretEntry, type SelectOption, type StepBadgeName, type TailConsumer, WRANGLER_FILES, type WranglerConfig, type WranglerContainerEntry, type WranglerProjectValidationOptions, type WranglerProjectValidationResult, type WranglerValidationReport, type WranglerWorkflowEntry, applyAdditiveEdit, badgeLead, badgeWidth, buildPackageSecretsBlock, claimAgentRulesHint, classifyEdit, createConfirm, detectAgentRules, detectFramework, discoverContainerInfo, discoverSchemaInfo, discoverWorkflowInfo, ensureDevVariables, ensureDevVariablesExample as ensureDevVarsExample, fillDevSecrets, findWranglerFile, formatLunoraEvent, generateSecretValue, inferLunoraBindings, injectRemoteFlags, interpretRemote, isInteractive, isMintableSecretKey, isPlaceholderValue, isRemoteEnvEnabled, materializeRemoteWranglerConfig, packageNamesFromBindings, padBadge, paintAnswer, paintBadge, parseDevVariableEntries, parseSchema, planDevSecretsFill, planDevVariablesAugment, planDevVariablesScaffold, planRemoteBindings, promptMultiSelect, promptSelect, promptYesNo, readLinkedProject, readProjectRemotePreference, readWranglerJsonc, reconcileWranglerBindings, requiredSecrets, resolveRemoteEnabled, secretsForPackages, streamContainerLogs, validateWrangler, validateWranglerConfig, validateWranglerProject, withTailConsumer, writeLinkedProject };