okengine 0.10.0 → 0.10.2
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 +1 -1
- package/package.json +1 -1
- package/site/content/docs/elements/clock.mdx +2 -2
- package/site/content/docs/elements/flow.mdx +10 -10
- package/site/content/docs/elements/gate.mdx +4 -4
- package/site/content/docs/elements/signal.mdx +4 -7
- package/site/content/docs/elements/store.mdx +1 -1
- package/site/content/docs/elements/vault.mdx +1 -1
- package/site/content/docs/get-started/basic-usage.mdx +1 -3
- package/site/content/docs/get-started/introduction.mdx +1 -1
- package/site/content/docs/reference/cli.md +12 -12
- package/site/content/docs/reference/fx.mdx +3 -4
- package/src/auth/auth.test.ts +1 -2
- package/src/auth/bindings.ts +5 -15
- package/src/auth/gate-auth.test.ts +2 -2
- package/src/cli/ai-setup/apply.ts +13 -0
- package/src/cli/build.test.ts +67 -0
- package/src/cli/build.ts +34 -0
- package/src/cli/db-seed.ts +1 -1
- package/src/cli/dev-app-runner.ts +6 -0
- package/src/cli/dev-controls.test.ts +43 -48
- package/src/cli/dev-controls.ts +23 -172
- package/src/cli/dev.test.ts +2 -4
- package/src/cli/dev.ts +63 -16
- package/src/cli/docker-cli.test.ts +15 -0
- package/src/cli/start.ts +12 -1
- package/src/client/notes-contract.test.ts +3 -4
- package/src/compiler/aot.test.ts +1 -2
- package/src/compiler/effects-infer.ts +37 -8
- package/src/compiler/extract.test.ts +186 -6
- package/src/compiler/extract.ts +31 -6
- package/src/compiler/fixtures/raw/raw-unannotated.ts +2 -4
- package/src/compiler/fixtures/skyport/src/flows/bookings/index.ts +4 -8
- package/src/compiler/fixtures/skyport/src/flows/payments/index.ts +1 -2
- package/src/compiler/fixtures/skyport/src/flows/support/index.ts +1 -2
- package/src/compiler/fixtures/skyport.expected.json +3 -3
- package/src/compiler/fixtures/triggers/five-triggers.ts +5 -10
- package/src/compiler/generate-adopt.test.ts +85 -0
- package/src/compiler/generate-adopt.ts +85 -0
- package/src/console/server/dry-run.audit.test.ts +2 -2
- package/src/console/server/flows.ts +50 -150
- package/src/docker/compose.ts +13 -3
- package/src/docker/recipes/llama-cpp.ts +10 -1
- package/src/docker/stack-id.ts +1 -0
- package/src/elements/channel/declare.ts +27 -1
- package/src/elements/clock/chaos-child.ts +3 -6
- package/src/elements/clock/chaos.test.ts +1 -2
- package/src/elements/clock.test.ts +2 -4
- package/src/elements/signal/declare.ts +25 -1
- package/src/elements/store/cache.test.ts +28 -0
- package/src/elements/store/declare.ts +27 -1
- package/src/elements/store/resource.ts +6 -11
- package/src/elements/store/upsert-app.test.ts +1 -2
- package/src/elements/vault/declare.ts +29 -1
- package/src/kernel/adopt-barrel-fresh.test.ts +103 -0
- package/src/kernel/app.ts +80 -9
- package/src/kernel/auto-registry.test.ts +198 -0
- package/src/kernel/boot-bind/honor-config.test.ts +5 -5
- package/src/kernel/boot.test.ts +19 -15
- package/src/kernel/boot.ts +186 -8
- package/src/kernel/call.test.ts +5 -10
- package/src/kernel/compensate.test.ts +3 -6
- package/src/kernel/concurrency.test.ts +3 -5
- package/src/kernel/correlation.test.ts +4 -8
- package/src/kernel/edge.test.ts +1 -1
- package/src/kernel/effects-stamping.test.ts +204 -0
- package/src/kernel/element-registries.ts +27 -0
- package/src/kernel/errors.ts +22 -0
- package/src/kernel/flow.test.ts +8 -15
- package/src/kernel/flow.ts +12 -14
- package/src/kernel/fx.ts +42 -13
- package/src/kernel/hook-timing.test.ts +2 -2
- package/src/kernel/hooks.test.ts +5 -10
- package/src/kernel/horizontal-child.ts +5 -10
- package/src/kernel/journal-boot.test.ts +2 -4
- package/src/kernel/pipeline.test.ts +6 -12
- package/src/kernel/plugin/capabilities.test.ts +1 -1
- package/src/kernel/plugin/decorate.test.ts +3 -8
- package/src/kernel/plugin/scoping.test.ts +6 -16
- package/src/kernel/plugin-elements.test.ts +1 -1
- package/src/kernel/plugin-needs.test.ts +1 -1
- package/src/kernel/ready.test.ts +1 -2
- package/src/kernel/registry-isolation.test.ts +5 -5
- package/src/kernel/triggers.ts +1 -1
- package/src/manifest/sql-resource.ts +41 -0
- package/src/plugins/anonymous.ts +1 -3
- package/src/plugins/compression.test.ts +6 -8
- package/src/plugins/config-source.test.ts +1 -1
- package/src/plugins/config-source.ts +1 -2
- package/src/plugins/cors.test.ts +10 -10
- package/src/plugins/csrf.test.ts +2 -2
- package/src/plugins/headers.test.ts +14 -15
- package/src/plugins/ip-allowlist.test.ts +9 -9
- package/src/plugins/magic-link.ts +2 -6
- package/src/plugins/maintenance-mode.test.ts +6 -6
- package/src/plugins/otp.ts +5 -15
- package/src/plugins/passkey.ts +4 -12
- package/src/plugins/two-factor.ts +3 -9
- package/src/plugins/username.ts +2 -6
- package/src/release/measure.ts +1 -1
- package/src/runs/runs.test.ts +3 -5
- package/src/runtime/serve.test.ts +2 -4
- package/src/test/create-test-app.test.ts +3 -7
- package/src/test/provisions.integration.test.ts +4 -9
- package/src/test/reset-element-registries.ts +31 -0
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `.adopt()` route-barrel generator — the disk-file alternative to a
|
|
3
|
+
* virtual-module Bun plugin (investigated and rejected: `Bun.plugin()`'s
|
|
4
|
+
* `onResolve` is never invoked for an unresolvable specifier during a plain
|
|
5
|
+
* runtime `import()`, so `oke dev` and `oke build` would resolve a virtual
|
|
6
|
+
* module differently — measured, not assumed).
|
|
7
|
+
*
|
|
8
|
+
* A real file on disk is an ordinary import: identical resolution under
|
|
9
|
+
* `oke dev`'s runtime `import()` and `oke build`'s `Bun.build()`. Convention
|
|
10
|
+
* (validated against every current example app — both `create-oke`
|
|
11
|
+
* templates and the `skyport` compiler fixture, 7/7): every unit under
|
|
12
|
+
* `<rootDir>/src/flows/*` has an `index.ts` barrel.
|
|
13
|
+
*/
|
|
14
|
+
|
|
15
|
+
import { readdir } from "node:fs/promises";
|
|
16
|
+
import { join } from "node:path";
|
|
17
|
+
|
|
18
|
+
/** Options for {@link generateAdoptBarrel}. */
|
|
19
|
+
export interface GenerateAdoptBarrelOptions {
|
|
20
|
+
/** Project root (contains `src/flows`). */
|
|
21
|
+
readonly rootDir: string;
|
|
22
|
+
/** Flows directory relative to {@link rootDir} (default `"src/flows"`). */
|
|
23
|
+
readonly flowsDir?: string;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
/** Generated barrel source plus the unit names it covers. */
|
|
27
|
+
export interface AdoptBarrelResult {
|
|
28
|
+
/** Full `.ts` source — write verbatim to the generated file. */
|
|
29
|
+
readonly source: string;
|
|
30
|
+
/** Unit (folder) names included, sorted. */
|
|
31
|
+
readonly units: readonly string[];
|
|
32
|
+
/** Folders under `flowsDir` skipped for lacking an `index.ts` barrel. */
|
|
33
|
+
readonly skipped: readonly string[];
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
const GENERATED_HEADER =
|
|
37
|
+
"// AUTO-GENERATED by `oke dev` / `oke build` — do not edit by hand.\n" +
|
|
38
|
+
"// Regenerated from every `src/flows/<unit>/index.ts` unit folder.\n";
|
|
39
|
+
|
|
40
|
+
/** A folder name usable as an `export * as <name>` binding. */
|
|
41
|
+
const VALID_UNIT_NAME = /^[A-Za-z_$][A-Za-z0-9_$]*$/;
|
|
42
|
+
|
|
43
|
+
/**
|
|
44
|
+
* Scan `<rootDir>/<flowsDir>/*` and emit a barrel re-exporting every unit
|
|
45
|
+
* folder's `index.ts` under its folder name — the same shape
|
|
46
|
+
* `.adopt({ main, notes })` already takes by hand.
|
|
47
|
+
*
|
|
48
|
+
* Never throws: a missing/unreadable flows directory yields an empty
|
|
49
|
+
* barrel, same posture as the rest of the lazy AoT tooling (best-effort,
|
|
50
|
+
* boot-time checks are what enforce staleness — see
|
|
51
|
+
* `assertAdoptBarrelFresh` in `kernel/boot.ts`).
|
|
52
|
+
*
|
|
53
|
+
* @param options - Root dir / flows dir override
|
|
54
|
+
*/
|
|
55
|
+
export async function generateAdoptBarrel(
|
|
56
|
+
options: GenerateAdoptBarrelOptions,
|
|
57
|
+
): Promise<AdoptBarrelResult> {
|
|
58
|
+
const flowsDir = options.flowsDir ?? "src/flows";
|
|
59
|
+
const abs = join(options.rootDir, flowsDir);
|
|
60
|
+
|
|
61
|
+
const units: string[] = [];
|
|
62
|
+
const skipped: string[] = [];
|
|
63
|
+
try {
|
|
64
|
+
const dirents = await readdir(abs, { withFileTypes: true });
|
|
65
|
+
for (const d of dirents.sort((a, b) => a.name.localeCompare(b.name))) {
|
|
66
|
+
if (!d.isDirectory()) continue;
|
|
67
|
+
const hasBarrel = await Bun.file(join(abs, d.name, "index.ts")).exists();
|
|
68
|
+
if (!hasBarrel) {
|
|
69
|
+
skipped.push(d.name);
|
|
70
|
+
continue;
|
|
71
|
+
}
|
|
72
|
+
if (!VALID_UNIT_NAME.test(d.name)) {
|
|
73
|
+
skipped.push(d.name);
|
|
74
|
+
continue;
|
|
75
|
+
}
|
|
76
|
+
units.push(d.name);
|
|
77
|
+
}
|
|
78
|
+
} catch {
|
|
79
|
+
// Missing flows dir — empty barrel, not a throw (mirrors extractManifest).
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
const lines = units.map((u) => `export * as ${u} from "./${u}/index.ts";`);
|
|
83
|
+
const source = lines.length > 0 ? `${GENERATED_HEADER}${lines.join("\n")}\n` : GENERATED_HEADER;
|
|
84
|
+
return { source, units, skipped };
|
|
85
|
+
}
|
|
@@ -95,7 +95,7 @@ describe("console dry-run / preview audit", () => {
|
|
|
95
95
|
|
|
96
96
|
test("Channels preview is locale template rendering, not dry-run mutation", async () => {
|
|
97
97
|
const flows = await Bun.file(`${import.meta.dir}/flows.ts`).text();
|
|
98
|
-
const previewIdx = flows.indexOf('
|
|
98
|
+
const previewIdx = flows.indexOf('flow("console.channel.preview"');
|
|
99
99
|
expect(previewIdx).toBeGreaterThan(0);
|
|
100
100
|
const slice = flows.slice(previewIdx, previewIdx + 800);
|
|
101
101
|
expect(slice).not.toContain("withDryRun");
|
|
@@ -104,7 +104,7 @@ describe("console dry-run / preview audit", () => {
|
|
|
104
104
|
|
|
105
105
|
test("Traces dryRun is metadata / logging, not withDryRun execution", async () => {
|
|
106
106
|
const flows = await Bun.file(`${import.meta.dir}/flows.ts`).text();
|
|
107
|
-
const idx = flows.indexOf('
|
|
107
|
+
const idx = flows.indexOf('flow("console.traces.replay"');
|
|
108
108
|
expect(idx).toBeGreaterThan(0);
|
|
109
109
|
const slice = flows.slice(idx, idx + 500);
|
|
110
110
|
expect(slice).not.toContain("withDryRun");
|
|
@@ -1674,9 +1674,7 @@ export function createConsoleBindings(state: ConsoleState): {
|
|
|
1674
1674
|
}
|
|
1675
1675
|
|
|
1676
1676
|
function createSetupStatus(state: ConsoleState) {
|
|
1677
|
-
return flow({
|
|
1678
|
-
name: "console.setup.status",
|
|
1679
|
-
unit: "console",
|
|
1677
|
+
return flow("console.setup.status", {
|
|
1680
1678
|
plane: "operator",
|
|
1681
1679
|
out: SetupStatusOut,
|
|
1682
1680
|
do: () => ({
|
|
@@ -1687,9 +1685,7 @@ function createSetupStatus(state: ConsoleState) {
|
|
|
1687
1685
|
}
|
|
1688
1686
|
|
|
1689
1687
|
function createSetupClaim(state: ConsoleState) {
|
|
1690
|
-
return flow({
|
|
1691
|
-
name: "console.setup.claim",
|
|
1692
|
-
unit: "console",
|
|
1688
|
+
return flow("console.setup.claim", {
|
|
1693
1689
|
plane: "operator",
|
|
1694
1690
|
in: ClaimIn,
|
|
1695
1691
|
out: SessionOut,
|
|
@@ -1738,9 +1734,7 @@ function createSetupClaim(state: ConsoleState) {
|
|
|
1738
1734
|
}
|
|
1739
1735
|
|
|
1740
1736
|
function createSessionLogin(state: ConsoleState) {
|
|
1741
|
-
return flow({
|
|
1742
|
-
name: "console.session.login",
|
|
1743
|
-
unit: "console",
|
|
1737
|
+
return flow("console.session.login", {
|
|
1744
1738
|
plane: "operator",
|
|
1745
1739
|
in: LoginIn,
|
|
1746
1740
|
out: SessionOut,
|
|
@@ -1761,9 +1755,7 @@ function createSessionLogin(state: ConsoleState) {
|
|
|
1761
1755
|
}
|
|
1762
1756
|
|
|
1763
1757
|
function createSessionMe(state: ConsoleState) {
|
|
1764
|
-
return flow({
|
|
1765
|
-
name: "console.session.me",
|
|
1766
|
-
unit: "console",
|
|
1758
|
+
return flow("console.session.me", {
|
|
1767
1759
|
plane: "operator",
|
|
1768
1760
|
out: MeOut,
|
|
1769
1761
|
errors: { AuthFailed },
|
|
@@ -1783,9 +1775,7 @@ function createSessionMe(state: ConsoleState) {
|
|
|
1783
1775
|
}
|
|
1784
1776
|
|
|
1785
1777
|
function createSessionLogout() {
|
|
1786
|
-
return flow({
|
|
1787
|
-
name: "console.session.logout",
|
|
1788
|
-
unit: "console",
|
|
1778
|
+
return flow("console.session.logout", {
|
|
1789
1779
|
plane: "operator",
|
|
1790
1780
|
out: z.object({ ok: z.literal(true) }),
|
|
1791
1781
|
do: (_input, fx) => {
|
|
@@ -1798,9 +1788,7 @@ function createSessionLogout() {
|
|
|
1798
1788
|
}
|
|
1799
1789
|
|
|
1800
1790
|
function createManifestGet(state: ConsoleState) {
|
|
1801
|
-
return flow({
|
|
1802
|
-
name: "console.manifest.get",
|
|
1803
|
-
unit: "console",
|
|
1791
|
+
return flow("console.manifest.get", {
|
|
1804
1792
|
plane: "operator",
|
|
1805
1793
|
out: ManifestOut,
|
|
1806
1794
|
errors: { AuthFailed },
|
|
@@ -1812,9 +1800,7 @@ function createManifestGet(state: ConsoleState) {
|
|
|
1812
1800
|
}
|
|
1813
1801
|
|
|
1814
1802
|
function createRunsList(state: ConsoleState) {
|
|
1815
|
-
return flow({
|
|
1816
|
-
name: "console.runs.list",
|
|
1817
|
-
unit: "console",
|
|
1803
|
+
return flow("console.runs.list", {
|
|
1818
1804
|
plane: "operator",
|
|
1819
1805
|
out: RunsListOut,
|
|
1820
1806
|
errors: { AuthFailed },
|
|
@@ -1884,9 +1870,7 @@ export function projectRun(r: WideEvent, piiFields: ReadonlySet<string> = new Se
|
|
|
1884
1870
|
}
|
|
1885
1871
|
|
|
1886
1872
|
function createTracesReplay(state: ConsoleState) {
|
|
1887
|
-
return flow({
|
|
1888
|
-
name: "console.traces.replay",
|
|
1889
|
-
unit: "console",
|
|
1873
|
+
return flow("console.traces.replay", {
|
|
1890
1874
|
plane: "operator",
|
|
1891
1875
|
in: TracesReplayIn,
|
|
1892
1876
|
out: TracesReplayOut,
|
|
@@ -1913,9 +1897,7 @@ function createTracesReplay(state: ConsoleState) {
|
|
|
1913
1897
|
}
|
|
1914
1898
|
|
|
1915
1899
|
function createSignalsList(state: ConsoleState) {
|
|
1916
|
-
return flow({
|
|
1917
|
-
name: "console.signals.list",
|
|
1918
|
-
unit: "console",
|
|
1900
|
+
return flow("console.signals.list", {
|
|
1919
1901
|
plane: "operator",
|
|
1920
1902
|
out: SignalsListOut,
|
|
1921
1903
|
errors: { AuthFailed },
|
|
@@ -1928,9 +1910,7 @@ function createSignalsList(state: ConsoleState) {
|
|
|
1928
1910
|
}
|
|
1929
1911
|
|
|
1930
1912
|
function createSignalsReplay(state: ConsoleState) {
|
|
1931
|
-
return flow({
|
|
1932
|
-
name: "console.signals.replay",
|
|
1933
|
-
unit: "console",
|
|
1913
|
+
return flow("console.signals.replay", {
|
|
1934
1914
|
plane: "operator",
|
|
1935
1915
|
in: SignalsReplayIn,
|
|
1936
1916
|
out: SignalsReplayOut,
|
|
@@ -1943,9 +1923,7 @@ function createSignalsReplay(state: ConsoleState) {
|
|
|
1943
1923
|
}
|
|
1944
1924
|
|
|
1945
1925
|
function createSignalsDryRunReplay(state: ConsoleState) {
|
|
1946
|
-
return flow({
|
|
1947
|
-
name: "console.signals.dryRunReplay",
|
|
1948
|
-
unit: "console",
|
|
1926
|
+
return flow("console.signals.dryRunReplay", {
|
|
1949
1927
|
plane: "operator",
|
|
1950
1928
|
in: SignalsReplayIn.omit({ dryRun: true }),
|
|
1951
1929
|
out: SignalsReplayOut,
|
|
@@ -1958,9 +1936,7 @@ function createSignalsDryRunReplay(state: ConsoleState) {
|
|
|
1958
1936
|
}
|
|
1959
1937
|
|
|
1960
1938
|
function createSignalsDiscard(state: ConsoleState) {
|
|
1961
|
-
return flow({
|
|
1962
|
-
name: "console.signals.discard",
|
|
1963
|
-
unit: "console",
|
|
1939
|
+
return flow("console.signals.discard", {
|
|
1964
1940
|
plane: "operator",
|
|
1965
1941
|
in: SignalsDiscardIn,
|
|
1966
1942
|
out: SignalsDiscardOut,
|
|
@@ -2102,9 +2078,7 @@ function dryRunSafety(row: {
|
|
|
2102
2078
|
}
|
|
2103
2079
|
|
|
2104
2080
|
function createActionPing(state: ConsoleState) {
|
|
2105
|
-
return flow({
|
|
2106
|
-
name: "console.action.ping",
|
|
2107
|
-
unit: "console",
|
|
2081
|
+
return flow("console.action.ping", {
|
|
2108
2082
|
plane: "operator",
|
|
2109
2083
|
in: ActionPingIn,
|
|
2110
2084
|
out: ActionPingOut,
|
|
@@ -2121,9 +2095,7 @@ function createActionPing(state: ConsoleState) {
|
|
|
2121
2095
|
}
|
|
2122
2096
|
|
|
2123
2097
|
function createStructuralPropose(state: ConsoleState) {
|
|
2124
|
-
return flow({
|
|
2125
|
-
name: "console.structural.propose",
|
|
2126
|
-
unit: "console",
|
|
2098
|
+
return flow("console.structural.propose", {
|
|
2127
2099
|
plane: "operator",
|
|
2128
2100
|
in: StructuralIn,
|
|
2129
2101
|
out: StructuralOut,
|
|
@@ -2149,9 +2121,7 @@ function createStructuralPropose(state: ConsoleState) {
|
|
|
2149
2121
|
}
|
|
2150
2122
|
|
|
2151
2123
|
function createFlowsIdentities(state: ConsoleState) {
|
|
2152
|
-
return flow({
|
|
2153
|
-
name: "console.flows.identities",
|
|
2154
|
-
unit: "console",
|
|
2124
|
+
return flow("console.flows.identities", {
|
|
2155
2125
|
plane: "operator",
|
|
2156
2126
|
out: IdentitiesOut,
|
|
2157
2127
|
errors: { AuthFailed },
|
|
@@ -2171,9 +2141,7 @@ function createFlowsIdentities(state: ConsoleState) {
|
|
|
2171
2141
|
}
|
|
2172
2142
|
|
|
2173
2143
|
function createFlowsInvoke(state: ConsoleState) {
|
|
2174
|
-
return flow({
|
|
2175
|
-
name: "console.flows.invoke",
|
|
2176
|
-
unit: "console",
|
|
2144
|
+
return flow("console.flows.invoke", {
|
|
2177
2145
|
plane: "operator",
|
|
2178
2146
|
in: InvokeIn,
|
|
2179
2147
|
out: InvokeOut,
|
|
@@ -2338,9 +2306,7 @@ function requireTenantIfDeclared(
|
|
|
2338
2306
|
}
|
|
2339
2307
|
|
|
2340
2308
|
function createStoreList(state: ConsoleState) {
|
|
2341
|
-
return flow({
|
|
2342
|
-
name: "console.store.list",
|
|
2343
|
-
unit: "console",
|
|
2309
|
+
return flow("console.store.list", {
|
|
2344
2310
|
plane: "operator",
|
|
2345
2311
|
out: StoreListOut,
|
|
2346
2312
|
errors: { AuthFailed },
|
|
@@ -2352,9 +2318,7 @@ function createStoreList(state: ConsoleState) {
|
|
|
2352
2318
|
}
|
|
2353
2319
|
|
|
2354
2320
|
function createStoreQuery(state: ConsoleState) {
|
|
2355
|
-
return flow({
|
|
2356
|
-
name: "console.store.query",
|
|
2357
|
-
unit: "console",
|
|
2321
|
+
return flow("console.store.query", {
|
|
2358
2322
|
plane: "operator",
|
|
2359
2323
|
in: StoreQueryIn,
|
|
2360
2324
|
out: StoreQueryOut,
|
|
@@ -2377,9 +2341,7 @@ function createStoreQuery(state: ConsoleState) {
|
|
|
2377
2341
|
}
|
|
2378
2342
|
|
|
2379
2343
|
function createStoreReveal(state: ConsoleState) {
|
|
2380
|
-
return flow({
|
|
2381
|
-
name: "console.store.reveal",
|
|
2382
|
-
unit: "console",
|
|
2344
|
+
return flow("console.store.reveal", {
|
|
2383
2345
|
plane: "operator",
|
|
2384
2346
|
in: StoreRevealIn,
|
|
2385
2347
|
out: StoreRevealOut,
|
|
@@ -2415,9 +2377,7 @@ function createStoreReveal(state: ConsoleState) {
|
|
|
2415
2377
|
}
|
|
2416
2378
|
|
|
2417
2379
|
function createStoreEdit(state: ConsoleState) {
|
|
2418
|
-
return flow({
|
|
2419
|
-
name: "console.store.edit",
|
|
2420
|
-
unit: "console",
|
|
2380
|
+
return flow("console.store.edit", {
|
|
2421
2381
|
plane: "operator",
|
|
2422
2382
|
in: StoreEditIn,
|
|
2423
2383
|
out: StoreEditOut,
|
|
@@ -2490,9 +2450,7 @@ function createStoreEdit(state: ConsoleState) {
|
|
|
2490
2450
|
}
|
|
2491
2451
|
|
|
2492
2452
|
function createStoreDelete(state: ConsoleState) {
|
|
2493
|
-
return flow({
|
|
2494
|
-
name: "console.store.delete",
|
|
2495
|
-
unit: "console",
|
|
2453
|
+
return flow("console.store.delete", {
|
|
2496
2454
|
plane: "operator",
|
|
2497
2455
|
in: StoreDeleteIn,
|
|
2498
2456
|
out: StoreDeleteOut,
|
|
@@ -2532,9 +2490,7 @@ function createStoreDelete(state: ConsoleState) {
|
|
|
2532
2490
|
}
|
|
2533
2491
|
|
|
2534
2492
|
function createStorePurgeCache(state: ConsoleState) {
|
|
2535
|
-
return flow({
|
|
2536
|
-
name: "console.store.purgeCache",
|
|
2537
|
-
unit: "console",
|
|
2493
|
+
return flow("console.store.purgeCache", {
|
|
2538
2494
|
plane: "operator",
|
|
2539
2495
|
in: StorePurgeIn,
|
|
2540
2496
|
out: StorePurgeOut,
|
|
@@ -2566,9 +2522,7 @@ function createStorePurgeCache(state: ConsoleState) {
|
|
|
2566
2522
|
}
|
|
2567
2523
|
|
|
2568
2524
|
function createStoreSql(state: ConsoleState) {
|
|
2569
|
-
return flow({
|
|
2570
|
-
name: "console.store.sql",
|
|
2571
|
-
unit: "console",
|
|
2525
|
+
return flow("console.store.sql", {
|
|
2572
2526
|
plane: "operator",
|
|
2573
2527
|
in: StoreSqlIn,
|
|
2574
2528
|
out: StoreSqlOut,
|
|
@@ -2599,9 +2553,7 @@ function createStoreSql(state: ConsoleState) {
|
|
|
2599
2553
|
}
|
|
2600
2554
|
|
|
2601
2555
|
function createStorePreview(state: ConsoleState) {
|
|
2602
|
-
return flow({
|
|
2603
|
-
name: "console.store.preview",
|
|
2604
|
-
unit: "console",
|
|
2556
|
+
return flow("console.store.preview", {
|
|
2605
2557
|
plane: "operator",
|
|
2606
2558
|
in: StorePreviewIn,
|
|
2607
2559
|
out: StorePreviewOut,
|
|
@@ -2651,9 +2603,7 @@ function createStorePreview(state: ConsoleState) {
|
|
|
2651
2603
|
}
|
|
2652
2604
|
|
|
2653
2605
|
function createVaultList(state: ConsoleState) {
|
|
2654
|
-
return flow({
|
|
2655
|
-
name: "console.vault.list",
|
|
2656
|
-
unit: "console",
|
|
2606
|
+
return flow("console.vault.list", {
|
|
2657
2607
|
plane: "operator",
|
|
2658
2608
|
out: VaultListOut,
|
|
2659
2609
|
errors: { AuthFailed },
|
|
@@ -2665,9 +2615,7 @@ function createVaultList(state: ConsoleState) {
|
|
|
2665
2615
|
}
|
|
2666
2616
|
|
|
2667
2617
|
function createVaultSet(state: ConsoleState) {
|
|
2668
|
-
return flow({
|
|
2669
|
-
name: "console.vault.set",
|
|
2670
|
-
unit: "console",
|
|
2618
|
+
return flow("console.vault.set", {
|
|
2671
2619
|
plane: "operator",
|
|
2672
2620
|
in: VaultWriteIn,
|
|
2673
2621
|
out: VaultWriteOut,
|
|
@@ -2713,9 +2661,7 @@ function createVaultSet(state: ConsoleState) {
|
|
|
2713
2661
|
}
|
|
2714
2662
|
|
|
2715
2663
|
function createVaultRotate(state: ConsoleState) {
|
|
2716
|
-
return flow({
|
|
2717
|
-
name: "console.vault.rotate",
|
|
2718
|
-
unit: "console",
|
|
2664
|
+
return flow("console.vault.rotate", {
|
|
2719
2665
|
plane: "operator",
|
|
2720
2666
|
in: VaultWriteIn,
|
|
2721
2667
|
out: VaultWriteOut,
|
|
@@ -2774,9 +2720,7 @@ async function vaultNameKnown(state: ConsoleState, name: string): Promise<boolea
|
|
|
2774
2720
|
}
|
|
2775
2721
|
|
|
2776
2722
|
function createAiList(state: ConsoleState) {
|
|
2777
|
-
return flow({
|
|
2778
|
-
name: "console.ai.list",
|
|
2779
|
-
unit: "console",
|
|
2723
|
+
return flow("console.ai.list", {
|
|
2780
2724
|
plane: "operator",
|
|
2781
2725
|
out: AiListOut,
|
|
2782
2726
|
errors: { AuthFailed },
|
|
@@ -2832,9 +2776,7 @@ function createAiList(state: ConsoleState) {
|
|
|
2832
2776
|
}
|
|
2833
2777
|
|
|
2834
2778
|
function createGatesList(state: ConsoleState) {
|
|
2835
|
-
return flow({
|
|
2836
|
-
name: "console.gates.list",
|
|
2837
|
-
unit: "console",
|
|
2779
|
+
return flow("console.gates.list", {
|
|
2838
2780
|
plane: "operator",
|
|
2839
2781
|
out: GatesListOut,
|
|
2840
2782
|
errors: { AuthFailed },
|
|
@@ -2898,9 +2840,7 @@ function createGatesList(state: ConsoleState) {
|
|
|
2898
2840
|
}
|
|
2899
2841
|
|
|
2900
2842
|
function createDiffList(state: ConsoleState) {
|
|
2901
|
-
return flow({
|
|
2902
|
-
name: "console.diff.list",
|
|
2903
|
-
unit: "console",
|
|
2843
|
+
return flow("console.diff.list", {
|
|
2904
2844
|
plane: "operator",
|
|
2905
2845
|
out: DiffListOut,
|
|
2906
2846
|
errors: { AuthFailed },
|
|
@@ -2932,9 +2872,7 @@ function createDiffList(state: ConsoleState) {
|
|
|
2932
2872
|
}
|
|
2933
2873
|
|
|
2934
2874
|
function createPluginsList(state: ConsoleState) {
|
|
2935
|
-
return flow({
|
|
2936
|
-
name: "console.plugin.list",
|
|
2937
|
-
unit: "console",
|
|
2875
|
+
return flow("console.plugin.list", {
|
|
2938
2876
|
plane: "operator",
|
|
2939
2877
|
out: PluginsListOut,
|
|
2940
2878
|
errors: { AuthFailed },
|
|
@@ -2946,9 +2884,7 @@ function createPluginsList(state: ConsoleState) {
|
|
|
2946
2884
|
}
|
|
2947
2885
|
|
|
2948
2886
|
function createGatesSimulate(state: ConsoleState) {
|
|
2949
|
-
return flow({
|
|
2950
|
-
name: "console.gates.simulate",
|
|
2951
|
-
unit: "console",
|
|
2887
|
+
return flow("console.gates.simulate", {
|
|
2952
2888
|
plane: "operator",
|
|
2953
2889
|
in: GatesSimulateIn,
|
|
2954
2890
|
out: GatesSimulateOut,
|
|
@@ -2982,9 +2918,7 @@ function createGatesSimulate(state: ConsoleState) {
|
|
|
2982
2918
|
}
|
|
2983
2919
|
|
|
2984
2920
|
function createGatesPowers(state: ConsoleState) {
|
|
2985
|
-
return flow({
|
|
2986
|
-
name: "console.gates.powers",
|
|
2987
|
-
unit: "console",
|
|
2921
|
+
return flow("console.gates.powers", {
|
|
2988
2922
|
plane: "operator",
|
|
2989
2923
|
in: GatesPowersIn,
|
|
2990
2924
|
out: GatesPowersOut,
|
|
@@ -3015,9 +2949,7 @@ function actorScopesOf(state: ConsoleState, operatorId: string): string[] {
|
|
|
3015
2949
|
}
|
|
3016
2950
|
|
|
3017
2951
|
function createAccessList(state: ConsoleState) {
|
|
3018
|
-
return flow({
|
|
3019
|
-
name: "console.access.list",
|
|
3020
|
-
unit: "console",
|
|
2952
|
+
return flow("console.access.list", {
|
|
3021
2953
|
plane: "operator",
|
|
3022
2954
|
out: AccessListOut,
|
|
3023
2955
|
errors: { AuthFailed },
|
|
@@ -3029,9 +2961,7 @@ function createAccessList(state: ConsoleState) {
|
|
|
3029
2961
|
}
|
|
3030
2962
|
|
|
3031
2963
|
function createAccessEffective(state: ConsoleState) {
|
|
3032
|
-
return flow({
|
|
3033
|
-
name: "console.access.effective",
|
|
3034
|
-
unit: "console",
|
|
2964
|
+
return flow("console.access.effective", {
|
|
3035
2965
|
plane: "operator",
|
|
3036
2966
|
in: AccessEffectiveIn,
|
|
3037
2967
|
out: AccessEffectiveOut,
|
|
@@ -3056,9 +2986,7 @@ function createAccessEffective(state: ConsoleState) {
|
|
|
3056
2986
|
}
|
|
3057
2987
|
|
|
3058
2988
|
function createAccessKeyBlast(state: ConsoleState) {
|
|
3059
|
-
return flow({
|
|
3060
|
-
name: "console.access.keyBlast",
|
|
3061
|
-
unit: "console",
|
|
2989
|
+
return flow("console.access.keyBlast", {
|
|
3062
2990
|
plane: "operator",
|
|
3063
2991
|
in: AccessKeyBlastIn,
|
|
3064
2992
|
out: AccessKeyBlastOut,
|
|
@@ -3074,9 +3002,7 @@ function createAccessKeyBlast(state: ConsoleState) {
|
|
|
3074
3002
|
}
|
|
3075
3003
|
|
|
3076
3004
|
function createAccessCreateKey(state: ConsoleState) {
|
|
3077
|
-
return flow({
|
|
3078
|
-
name: "console.access.createKey",
|
|
3079
|
-
unit: "console",
|
|
3005
|
+
return flow("console.access.createKey", {
|
|
3080
3006
|
plane: "operator",
|
|
3081
3007
|
in: AccessCreateKeyIn,
|
|
3082
3008
|
out: AccessCreateKeyOut,
|
|
@@ -3110,9 +3036,7 @@ function createAccessCreateKey(state: ConsoleState) {
|
|
|
3110
3036
|
}
|
|
3111
3037
|
|
|
3112
3038
|
function createAccessRevokeKey(state: ConsoleState) {
|
|
3113
|
-
return flow({
|
|
3114
|
-
name: "console.access.revokeKey",
|
|
3115
|
-
unit: "console",
|
|
3039
|
+
return flow("console.access.revokeKey", {
|
|
3116
3040
|
plane: "operator",
|
|
3117
3041
|
in: AccessRevokeKeyIn,
|
|
3118
3042
|
out: AccessRevokeKeyOut,
|
|
@@ -3142,9 +3066,7 @@ function createAccessRevokeKey(state: ConsoleState) {
|
|
|
3142
3066
|
}
|
|
3143
3067
|
|
|
3144
3068
|
function createAccessRotateKey(state: ConsoleState) {
|
|
3145
|
-
return flow({
|
|
3146
|
-
name: "console.access.rotateKey",
|
|
3147
|
-
unit: "console",
|
|
3069
|
+
return flow("console.access.rotateKey", {
|
|
3148
3070
|
plane: "operator",
|
|
3149
3071
|
in: AccessRotateKeyIn,
|
|
3150
3072
|
out: AccessRotateKeyOut,
|
|
@@ -3177,9 +3099,7 @@ function createAccessRotateKey(state: ConsoleState) {
|
|
|
3177
3099
|
}
|
|
3178
3100
|
|
|
3179
3101
|
function createAccessSetRoleGrants(state: ConsoleState) {
|
|
3180
|
-
return flow({
|
|
3181
|
-
name: "console.access.setRoleGrants",
|
|
3182
|
-
unit: "console",
|
|
3102
|
+
return flow("console.access.setRoleGrants", {
|
|
3183
3103
|
plane: "operator",
|
|
3184
3104
|
in: AccessSetRoleGrantsIn,
|
|
3185
3105
|
out: AccessSetRoleGrantsOut,
|
|
@@ -3208,9 +3128,7 @@ function createAccessSetRoleGrants(state: ConsoleState) {
|
|
|
3208
3128
|
}
|
|
3209
3129
|
|
|
3210
3130
|
function createClockList(state: ConsoleState) {
|
|
3211
|
-
return flow({
|
|
3212
|
-
name: "console.clock.list",
|
|
3213
|
-
unit: "console",
|
|
3131
|
+
return flow("console.clock.list", {
|
|
3214
3132
|
plane: "operator",
|
|
3215
3133
|
out: ClockListOut,
|
|
3216
3134
|
errors: { AuthFailed },
|
|
@@ -3222,9 +3140,7 @@ function createClockList(state: ConsoleState) {
|
|
|
3222
3140
|
}
|
|
3223
3141
|
|
|
3224
3142
|
function createClockRunNow(state: ConsoleState) {
|
|
3225
|
-
return flow({
|
|
3226
|
-
name: "console.clock.runNow",
|
|
3227
|
-
unit: "console",
|
|
3143
|
+
return flow("console.clock.runNow", {
|
|
3228
3144
|
plane: "operator",
|
|
3229
3145
|
in: ClockRunNowIn,
|
|
3230
3146
|
out: ClockRunNowOut,
|
|
@@ -3269,9 +3185,7 @@ function createClockRunNow(state: ConsoleState) {
|
|
|
3269
3185
|
}
|
|
3270
3186
|
|
|
3271
3187
|
function createClockPause(state: ConsoleState) {
|
|
3272
|
-
return flow({
|
|
3273
|
-
name: "console.clock.pause",
|
|
3274
|
-
unit: "console",
|
|
3188
|
+
return flow("console.clock.pause", {
|
|
3275
3189
|
plane: "operator",
|
|
3276
3190
|
in: ClockPauseIn,
|
|
3277
3191
|
out: ClockPauseOut,
|
|
@@ -3301,9 +3215,7 @@ function createClockPause(state: ConsoleState) {
|
|
|
3301
3215
|
}
|
|
3302
3216
|
|
|
3303
3217
|
function createClockEditSchedule(state: ConsoleState) {
|
|
3304
|
-
return flow({
|
|
3305
|
-
name: "console.clock.editSchedule",
|
|
3306
|
-
unit: "console",
|
|
3218
|
+
return flow("console.clock.editSchedule", {
|
|
3307
3219
|
plane: "operator",
|
|
3308
3220
|
in: ClockEditIn,
|
|
3309
3221
|
out: ClockEditOut,
|
|
@@ -3341,9 +3253,7 @@ function createClockEditSchedule(state: ConsoleState) {
|
|
|
3341
3253
|
}
|
|
3342
3254
|
|
|
3343
3255
|
function createClockWakeEarly(state: ConsoleState) {
|
|
3344
|
-
return flow({
|
|
3345
|
-
name: "console.clock.wakeEarly",
|
|
3346
|
-
unit: "console",
|
|
3256
|
+
return flow("console.clock.wakeEarly", {
|
|
3347
3257
|
plane: "operator",
|
|
3348
3258
|
in: ClockWakeEarlyIn,
|
|
3349
3259
|
out: ClockWakeEarlyOut,
|
|
@@ -3375,9 +3285,7 @@ function createClockWakeEarly(state: ConsoleState) {
|
|
|
3375
3285
|
}
|
|
3376
3286
|
|
|
3377
3287
|
function createChannelsList(state: ConsoleState) {
|
|
3378
|
-
return flow({
|
|
3379
|
-
name: "console.channel.list",
|
|
3380
|
-
unit: "console",
|
|
3288
|
+
return flow("console.channel.list", {
|
|
3381
3289
|
plane: "operator",
|
|
3382
3290
|
out: ChannelsListOut,
|
|
3383
3291
|
errors: { AuthFailed },
|
|
@@ -3389,9 +3297,7 @@ function createChannelsList(state: ConsoleState) {
|
|
|
3389
3297
|
}
|
|
3390
3298
|
|
|
3391
3299
|
function createChannelPreview(state: ConsoleState) {
|
|
3392
|
-
return flow({
|
|
3393
|
-
name: "console.channel.preview",
|
|
3394
|
-
unit: "console",
|
|
3300
|
+
return flow("console.channel.preview", {
|
|
3395
3301
|
plane: "operator",
|
|
3396
3302
|
in: ChannelPreviewIn,
|
|
3397
3303
|
out: ChannelPreviewOut,
|
|
@@ -3411,9 +3317,7 @@ function createChannelPreview(state: ConsoleState) {
|
|
|
3411
3317
|
}
|
|
3412
3318
|
|
|
3413
3319
|
function createChannelVerifyAuth(state: ConsoleState) {
|
|
3414
|
-
return flow({
|
|
3415
|
-
name: "console.channel.verifyAuth",
|
|
3416
|
-
unit: "console",
|
|
3320
|
+
return flow("console.channel.verifyAuth", {
|
|
3417
3321
|
plane: "operator",
|
|
3418
3322
|
in: ChannelVerifyAuthIn,
|
|
3419
3323
|
out: ChannelVerifyAuthOut,
|
|
@@ -3426,9 +3330,7 @@ function createChannelVerifyAuth(state: ConsoleState) {
|
|
|
3426
3330
|
}
|
|
3427
3331
|
|
|
3428
3332
|
function createChannelReveal(state: ConsoleState) {
|
|
3429
|
-
return flow({
|
|
3430
|
-
name: "console.channel.reveal",
|
|
3431
|
-
unit: "console",
|
|
3333
|
+
return flow("console.channel.reveal", {
|
|
3432
3334
|
plane: "operator",
|
|
3433
3335
|
in: ChannelRevealIn,
|
|
3434
3336
|
out: ChannelRevealOut,
|
|
@@ -3454,9 +3356,7 @@ function createChannelReveal(state: ConsoleState) {
|
|
|
3454
3356
|
}
|
|
3455
3357
|
|
|
3456
3358
|
function createChannelSendTest(state: ConsoleState) {
|
|
3457
|
-
return flow({
|
|
3458
|
-
name: "console.channel.sendTest",
|
|
3459
|
-
unit: "console",
|
|
3359
|
+
return flow("console.channel.sendTest", {
|
|
3460
3360
|
plane: "operator",
|
|
3461
3361
|
in: ChannelSendTestIn,
|
|
3462
3362
|
out: ChannelSendTestOut,
|
package/src/docker/compose.ts
CHANGED
|
@@ -452,7 +452,7 @@ const ROLE_ALIASES: Readonly<Record<string, readonly string[]>> = {
|
|
|
452
452
|
"MP_SMTP_AUTH_ALLOW_INSECURE",
|
|
453
453
|
],
|
|
454
454
|
// OKE_AI_URL is already emitted as `${prefix}_URL` — do not alias it again.
|
|
455
|
-
ai: ["OKE_AI_MODEL"],
|
|
455
|
+
ai: ["OKE_AI_MODEL", "OKE_AI_CTX_SIZE"],
|
|
456
456
|
proxy: ["OKE_PROXY_HOST", "OKE_PROXY_ACME_EMAIL"],
|
|
457
457
|
vault: ["OKE_VAULT_TOKEN", "OKE_VAULT_MOUNT"],
|
|
458
458
|
"store.index": ["OKE_STORE_INDEX_KEY"],
|
|
@@ -471,7 +471,10 @@ const ROLE_CONTROL_EXAMPLES: Readonly<Record<string, readonly string[]>> = {
|
|
|
471
471
|
"MP_SMTP_AUTH_ALLOW_INSECURE=1",
|
|
472
472
|
],
|
|
473
473
|
// Curated Docker Hub `ai/` model id for llama.cpp; Ollama tags differ.
|
|
474
|
-
|
|
474
|
+
// OKE_AI_CTX_SIZE bounds the KV cache llama-server allocates at load —
|
|
475
|
+
// left at the model's full native context (often 32K-256K+), a small
|
|
476
|
+
// model's KV cache alone can OOM the container regardless of host RAM.
|
|
477
|
+
ai: ["OKE_AI_MODEL=smollm2", "OKE_AI_CTX_SIZE=4096"],
|
|
475
478
|
proxy: ["OKE_PROXY_HOST=localhost", "OKE_PROXY_ACME_EMAIL=admin@example.com"],
|
|
476
479
|
};
|
|
477
480
|
|
|
@@ -489,7 +492,14 @@ function roleFromEnvKey(key: string): string | undefined {
|
|
|
489
492
|
}
|
|
490
493
|
if (key === "PGDATA" || key === "POSTGRES_INITDB_ARGS") return "store.sql";
|
|
491
494
|
if (key.startsWith("OKE_STORE_KV_MAXMEMORY")) return "store.kv";
|
|
492
|
-
if (
|
|
495
|
+
if (
|
|
496
|
+
key === "OKE_AI_URL" ||
|
|
497
|
+
key === "OKE_AI_MODEL" ||
|
|
498
|
+
key === "OKE_AI_CTX_SIZE" ||
|
|
499
|
+
key === "OLLAMA_HOST"
|
|
500
|
+
) {
|
|
501
|
+
return "ai";
|
|
502
|
+
}
|
|
493
503
|
if (key === "OKE_PROXY_URL" || key === "OKE_PROXY_HOST" || key === "OKE_PROXY_ACME_EMAIL") {
|
|
494
504
|
return "proxy";
|
|
495
505
|
}
|
|
@@ -221,7 +221,14 @@ def ensure_model(model: str) -> str:
|
|
|
221
221
|
def main() -> None:
|
|
222
222
|
model = (os.environ.get("OKE_AI_MODEL") or "smollm2").strip() or "smollm2"
|
|
223
223
|
gguf = ensure_model(model)
|
|
224
|
-
|
|
224
|
+
# Without an explicit --ctx-size, llama-server defaults to the model's
|
|
225
|
+
# full native training context (32K-256K+ for many current models). The
|
|
226
|
+
# KV cache for that is allocated up front and can be many times the
|
|
227
|
+
# model's own file size, OOM-killing the container even with generous
|
|
228
|
+
# Docker memory — independent of how small the model itself is.
|
|
229
|
+
# OKE_AI_CTX_SIZE (docker/.env.docker) overrides this default.
|
|
230
|
+
ctx_size = (os.environ.get("OKE_AI_CTX_SIZE") or "4096").strip() or "4096"
|
|
231
|
+
print(f"oke ai: serving {model} from {gguf} (ctx={ctx_size})", flush=True)
|
|
225
232
|
os.execv(
|
|
226
233
|
"/app/llama-server",
|
|
227
234
|
[
|
|
@@ -234,6 +241,8 @@ def main() -> None:
|
|
|
234
241
|
gguf,
|
|
235
242
|
"--alias",
|
|
236
243
|
model,
|
|
244
|
+
"--ctx-size",
|
|
245
|
+
ctx_size,
|
|
237
246
|
],
|
|
238
247
|
)
|
|
239
248
|
|