okengine 0.10.1 → 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.
Files changed (98) hide show
  1. package/README.md +1 -1
  2. package/package.json +1 -1
  3. package/site/content/docs/elements/clock.mdx +2 -2
  4. package/site/content/docs/elements/flow.mdx +10 -10
  5. package/site/content/docs/elements/gate.mdx +4 -4
  6. package/site/content/docs/elements/signal.mdx +4 -7
  7. package/site/content/docs/elements/store.mdx +1 -1
  8. package/site/content/docs/elements/vault.mdx +1 -1
  9. package/site/content/docs/get-started/basic-usage.mdx +1 -3
  10. package/site/content/docs/get-started/introduction.mdx +1 -1
  11. package/site/content/docs/reference/cli.md +12 -12
  12. package/site/content/docs/reference/fx.mdx +3 -4
  13. package/src/auth/auth.test.ts +1 -2
  14. package/src/auth/bindings.ts +5 -15
  15. package/src/auth/gate-auth.test.ts +2 -2
  16. package/src/cli/ai-setup/apply.ts +13 -0
  17. package/src/cli/build.test.ts +67 -0
  18. package/src/cli/build.ts +34 -0
  19. package/src/cli/db-seed.ts +1 -1
  20. package/src/cli/dev-controls.test.ts +43 -48
  21. package/src/cli/dev-controls.ts +23 -172
  22. package/src/cli/dev.test.ts +2 -4
  23. package/src/cli/dev.ts +37 -16
  24. package/src/client/notes-contract.test.ts +3 -4
  25. package/src/compiler/aot.test.ts +1 -2
  26. package/src/compiler/extract.test.ts +76 -21
  27. package/src/compiler/extract.ts +3 -3
  28. package/src/compiler/fixtures/raw/raw-unannotated.ts +2 -4
  29. package/src/compiler/fixtures/skyport/src/flows/bookings/index.ts +4 -8
  30. package/src/compiler/fixtures/skyport/src/flows/payments/index.ts +1 -2
  31. package/src/compiler/fixtures/skyport/src/flows/support/index.ts +1 -2
  32. package/src/compiler/fixtures/skyport.expected.json +3 -3
  33. package/src/compiler/fixtures/triggers/five-triggers.ts +5 -10
  34. package/src/compiler/generate-adopt.test.ts +85 -0
  35. package/src/compiler/generate-adopt.ts +85 -0
  36. package/src/console/server/dry-run.audit.test.ts +2 -2
  37. package/src/console/server/flows.ts +50 -150
  38. package/src/docker/compose.ts +13 -3
  39. package/src/docker/recipes/llama-cpp.ts +10 -1
  40. package/src/docker/stack-id.ts +1 -0
  41. package/src/elements/channel/declare.ts +27 -1
  42. package/src/elements/clock/chaos-child.ts +3 -6
  43. package/src/elements/clock/chaos.test.ts +1 -2
  44. package/src/elements/clock.test.ts +2 -4
  45. package/src/elements/signal/declare.ts +25 -1
  46. package/src/elements/store/declare.ts +27 -1
  47. package/src/elements/store/resource.ts +6 -11
  48. package/src/elements/store/upsert-app.test.ts +1 -2
  49. package/src/elements/vault/declare.ts +29 -1
  50. package/src/kernel/adopt-barrel-fresh.test.ts +103 -0
  51. package/src/kernel/app.ts +66 -9
  52. package/src/kernel/auto-registry.test.ts +198 -0
  53. package/src/kernel/boot-bind/honor-config.test.ts +5 -5
  54. package/src/kernel/boot.test.ts +19 -15
  55. package/src/kernel/boot.ts +81 -1
  56. package/src/kernel/call.test.ts +5 -10
  57. package/src/kernel/compensate.test.ts +3 -6
  58. package/src/kernel/concurrency.test.ts +3 -5
  59. package/src/kernel/correlation.test.ts +4 -8
  60. package/src/kernel/edge.test.ts +1 -1
  61. package/src/kernel/effects-stamping.test.ts +4 -7
  62. package/src/kernel/element-registries.ts +27 -0
  63. package/src/kernel/errors.ts +11 -0
  64. package/src/kernel/flow.test.ts +8 -15
  65. package/src/kernel/flow.ts +12 -14
  66. package/src/kernel/hook-timing.test.ts +2 -2
  67. package/src/kernel/hooks.test.ts +5 -10
  68. package/src/kernel/horizontal-child.ts +5 -10
  69. package/src/kernel/journal-boot.test.ts +2 -4
  70. package/src/kernel/pipeline.test.ts +6 -12
  71. package/src/kernel/plugin/capabilities.test.ts +1 -1
  72. package/src/kernel/plugin/decorate.test.ts +3 -8
  73. package/src/kernel/plugin/scoping.test.ts +6 -16
  74. package/src/kernel/plugin-elements.test.ts +1 -1
  75. package/src/kernel/plugin-needs.test.ts +1 -1
  76. package/src/kernel/ready.test.ts +1 -2
  77. package/src/kernel/registry-isolation.test.ts +5 -5
  78. package/src/kernel/triggers.ts +1 -1
  79. package/src/plugins/anonymous.ts +1 -3
  80. package/src/plugins/compression.test.ts +6 -8
  81. package/src/plugins/config-source.test.ts +1 -1
  82. package/src/plugins/config-source.ts +1 -2
  83. package/src/plugins/cors.test.ts +10 -10
  84. package/src/plugins/csrf.test.ts +2 -2
  85. package/src/plugins/headers.test.ts +14 -15
  86. package/src/plugins/ip-allowlist.test.ts +9 -9
  87. package/src/plugins/magic-link.ts +2 -6
  88. package/src/plugins/maintenance-mode.test.ts +6 -6
  89. package/src/plugins/otp.ts +5 -15
  90. package/src/plugins/passkey.ts +4 -12
  91. package/src/plugins/two-factor.ts +3 -9
  92. package/src/plugins/username.ts +2 -6
  93. package/src/release/measure.ts +1 -1
  94. package/src/runs/runs.test.ts +3 -5
  95. package/src/runtime/serve.test.ts +2 -4
  96. package/src/test/create-test-app.test.ts +3 -7
  97. package/src/test/provisions.integration.test.ts +4 -9
  98. package/src/test/reset-element-registries.ts +31 -0
@@ -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,
@@ -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
- ai: ["OKE_AI_MODEL=smollm2"],
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 (key === "OKE_AI_URL" || key === "OKE_AI_MODEL" || key === "OLLAMA_HOST") return "ai";
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
- print(f"oke ai: serving {model} from {gguf}", flush=True)
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
 
@@ -128,6 +128,7 @@ export const STACK_CONTROL_KEYS = [
128
128
  "MP_SMTP_AUTH_ACCEPT_ANY",
129
129
  "MP_SMTP_AUTH_ALLOW_INSECURE",
130
130
  "OKE_AI_MODEL",
131
+ "OKE_AI_CTX_SIZE",
131
132
  "OKE_PROXY_HOST",
132
133
  "OKE_PROXY_ACME_EMAIL",
133
134
  // OpenBao app token — minted by bootstrap, must survive `writeDerivedFiles`.
@@ -5,6 +5,7 @@
5
5
  */
6
6
 
7
7
  import type { ChannelMedium } from "../../manifest/types.ts";
8
+ import { channelTemplateRegistry } from "../../kernel/element-registries.ts";
8
9
 
9
10
  /** Options for a medium binder (`channel.email`, …). */
10
11
  export interface ChannelMediumOptions {
@@ -49,6 +50,29 @@ export interface ChannelMediumBinder {
49
50
  ): ChannelTemplateDecl;
50
51
  }
51
52
 
53
+ /**
54
+ * Medium binders' `.template()` (email / sms / whatsapp / push) push into
55
+ * the shared {@link channelTemplateRegistry} (`src/kernel/element-registries.ts`)
56
+ * so {@link oke} can auto-populate `channel.templates` with zero explicit
57
+ * array — mirrors the {@link on} trigger-drain registry
58
+ * (`src/kernel/on.ts`). The medium-agnostic `channel.template()` is
59
+ * intentionally not auto-registered (out of scope).
60
+ *
61
+ * Snapshot of every medium-binder template declared since the last reset.
62
+ */
63
+ export function listChannelTemplates(): readonly ChannelTemplateDecl[] {
64
+ return channelTemplateRegistry.slice();
65
+ }
66
+
67
+ /**
68
+ * Clear the channel-template registry (tests / fresh app adopt).
69
+ *
70
+ * @internal
71
+ */
72
+ export function resetChannelTemplates(): void {
73
+ channelTemplateRegistry.length = 0;
74
+ }
75
+
52
76
  /**
53
77
  * Create a medium binder.
54
78
  *
@@ -64,7 +88,7 @@ function mediumBinder(
64
88
  medium,
65
89
  ...(from !== undefined ? { from } : {}),
66
90
  template(name, opts = {}) {
67
- return {
91
+ const decl: ChannelTemplateDecl = {
68
92
  kind: "template",
69
93
  name,
70
94
  medium,
@@ -73,6 +97,8 @@ function mediumBinder(
73
97
  ...(opts.schema !== undefined ? { schema: opts.schema } : {}),
74
98
  ...(from !== undefined ? { from } : {}),
75
99
  };
100
+ channelTemplateRegistry.push(decl);
101
+ return decl;
76
102
  },
77
103
  };
78
104
  }
@@ -169,8 +169,7 @@ if (mode === "tick-loop") {
169
169
  }
170
170
 
171
171
  const journalStore = createFileJournalStore(join(journalPath));
172
- const charge = flow({
173
- name: "chaos.charge",
172
+ const charge = flow("chaos.charge", {
174
173
  durable: true,
175
174
  do: async (_input, fx) => {
176
175
  const intent = await fx.step("create-intent", async () => {
@@ -329,8 +328,7 @@ async function logHasStep(path: string, step: string, instanceId: string): Promi
329
328
 
330
329
  /** Durable charge flow: step 1 → block → step 2 (both logged). */
331
330
  function chargeFlow(instanceId: string, stepLogPath: string, blockMs: number): AnyFlowDef {
332
- return flow({
333
- name: "chaos.journal.charge",
331
+ return flow("chaos.journal.charge", {
334
332
  durable: true,
335
333
  do: async (_input, fx) => {
336
334
  const intent = await fx.step("create-intent", async () => {
@@ -349,8 +347,7 @@ function chargeFlow(instanceId: string, stepLogPath: string, blockMs: number): A
349
347
 
350
348
  /** Durable sleeper flow: step 1 → sleep → confirm (steps logged). */
351
349
  function sleeperFlow(instanceId: string, stepLogPath: string, wakeMs: number): AnyFlowDef {
352
- return flow({
353
- name: "chaos.journal.sleeper",
350
+ return flow("chaos.journal.sleeper", {
354
351
  durable: true,
355
352
  do: async (_input, fx) => {
356
353
  await fx.step("create-intent", async () => {