okengine 0.23.0 → 0.23.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/package.json +1 -1
- package/site/content/docs/ai/mcp.mdx +4 -4
- package/site/content/docs/elements/channel/index.mdx +4 -4
- package/site/content/docs/elements/channel/receipts.mdx +7 -5
- package/site/content/docs/elements/channel/sms.mdx +2 -1
- package/site/content/docs/elements/flow/index.mdx +22 -18
- package/site/content/docs/elements/signal/broadcast.mdx +4 -2
- package/site/content/docs/elements/signal/index.mdx +15 -14
- package/site/content/docs/plugins/otp.mdx +3 -3
- package/site/content/docs/reference/configuration.mdx +16 -0
- package/site/content/docs/reference/errors.mdx +31 -19
- package/site/content/docs/reference/fx.mdx +12 -4
- package/src/auth/tenants.ts +17 -0
- package/src/cli/doctor-diff.test.ts +29 -1
- package/src/cli/doctor-diff.ts +35 -0
- package/src/cli/manifest-pr-diff.ts +16 -0
- package/src/compiler/aot.test.ts +3 -2
- package/src/compiler/aot.ts +45 -1
- package/src/compiler/dynamic.ts +1 -1
- package/src/compiler/effects-fetch.test.ts +77 -0
- package/src/compiler/effects-infer.ts +87 -16
- package/src/compiler/effects-join.test.ts +48 -0
- package/src/compiler/extract.test.ts +28 -0
- package/src/compiler/extract.ts +11 -1
- package/src/compiler/fx-index.ts +58 -4
- package/src/compiler/http-parse.test.ts +101 -0
- package/src/compiler/http-parse.ts +188 -9
- package/src/compiler/interpret.ts +25 -2
- package/src/console/index.ts +1 -1
- package/src/console/ui-next/dist/assets/{access-page-DDKkhT9v.js → access-page-zBMhZnFm.js} +1 -1
- package/src/console/ui-next/dist/assets/{agent-disclosure-62Xts8Xi.js → agent-disclosure-CBj9f7Ju.js} +1 -1
- package/src/console/ui-next/dist/assets/{cache-glyph-DyeoKHKA.js → cache-glyph-D3MY49h3.js} +1 -1
- package/src/console/ui-next/dist/assets/{call-pii-button-DvfpLXsU.js → call-pii-button-L9JxdBhp.js} +1 -1
- package/src/console/ui-next/dist/assets/{collapsible-BY03SeCg.js → collapsible-BvFaX-Zt.js} +1 -1
- package/src/console/ui-next/dist/assets/{decisions-page-CgkKlA56.js → decisions-page-DgB76m-X.js} +1 -1
- package/src/console/ui-next/dist/assets/{duration-tone-Y6HLjyJ5.js → duration-tone-l1DSJ2Vz.js} +1 -1
- package/src/console/ui-next/dist/assets/{flows-page-DLPfNy-_.js → flows-page-Bb9t1lu6.js} +1 -1
- package/src/console/ui-next/dist/assets/{highlighted-json-D7nNzpgB.js → highlighted-json-DMvsi3Ti.js} +1 -1
- package/src/console/ui-next/dist/assets/{http-method-DdL19zzh.js → http-method-BwhJBTcQ.js} +1 -1
- package/src/console/ui-next/dist/assets/{index-C0lc_s9d.js → index-RhV2jT_7.js} +3 -3
- package/src/console/ui-next/dist/assets/{observability-page-CRlcyLCC.js → observability-page-BRfUILBq.js} +1 -1
- package/src/console/ui-next/dist/assets/{replica-lag-Bb3FWUu9.js → replica-lag-BsceAzIG.js} +1 -1
- package/src/console/ui-next/dist/assets/{request-meta-DYBMWhX8.js → request-meta-C6lTyCXp.js} +1 -1
- package/src/console/ui-next/dist/assets/{store-page-CcE-SXC8.js → store-page-YmE806bJ.js} +1 -1
- package/src/console/ui-next/dist/assets/{trace-detail-sheet-CKMSEQ4s.js → trace-detail-sheet-Di4irS49.js} +1 -1
- package/src/console/ui-next/dist/assets/{tree-expand-toggle-QOfk0M0H.js → tree-expand-toggle-DYeL6Rye.js} +1 -1
- package/src/console/ui-next/dist/assets/{units-page-DKC1CDDd.js → units-page-07agasRA.js} +1 -1
- package/src/console/ui-next/dist/assets/{vault-page-B54v4Yit.js → vault-page-CHBck4n_.js} +1 -1
- package/src/console/ui-next/dist/index.html +1 -1
- package/src/console/ui-next/seed-parked-approval.ts +5 -1
- package/src/drivers/journal-postgres.test.ts +106 -2
- package/src/drivers/journal-postgres.ts +475 -14
- package/src/drivers/postgres.test.ts +60 -0
- package/src/drivers/postgres.ts +79 -5
- package/src/drivers/signal-compete.test.ts +238 -0
- package/src/drivers/signal-postgres.test.ts +170 -0
- package/src/drivers/signal-postgres.ts +486 -213
- package/src/drivers/signal-redis.test.ts +224 -0
- package/src/drivers/signal-redis.ts +934 -93
- package/src/drivers/signal-types.ts +12 -0
- package/src/elements/ai/approval.test.ts +15 -3
- package/src/elements/ai/approval.ts +15 -9
- package/src/elements/ai/mcp-protocol.ts +5 -6
- package/src/elements/ai/runtime.ts +20 -19
- package/src/elements/channel/runtime.ts +42 -4
- package/src/elements/channel/sql-ledger.test.ts +404 -0
- package/src/elements/channel/sql-ledger.ts +395 -0
- package/src/elements/clock/chaos-child.ts +12 -2
- package/src/elements/clock/durable.ts +11 -0
- package/src/elements/signal/runtime.ts +9 -0
- package/src/elements/signal.test.ts +1 -0
- package/src/elements/store/cache-bus.test.ts +121 -0
- package/src/elements/store/cache-bus.ts +278 -0
- package/src/elements/store/cache.test.ts +179 -15
- package/src/elements/store/cache.ts +357 -51
- package/src/elements/store/prepare-row.test.ts +6 -2
- package/src/elements/store/runtime.ts +44 -2
- package/src/elements/store/sql-errors.test.ts +131 -0
- package/src/elements/store/sql-errors.ts +39 -16
- package/src/elements/store/sql-nested-tx.test.ts +344 -0
- package/src/elements/store/sql-session.test.ts +2 -0
- package/src/elements/store/sql-session.ts +275 -9
- package/src/elements/store.ts +1 -0
- package/src/kernel/app.ts +207 -43
- package/src/kernel/auto-cache.test.ts +228 -0
- package/src/kernel/auto-registry.test.ts +5 -1
- package/src/kernel/boot-bind/channel.ts +63 -2
- package/src/kernel/boot-bind/honor-config.test.ts +40 -10
- package/src/kernel/boot-bind/signal.ts +72 -25
- package/src/kernel/boot-bind/store.ts +16 -1
- package/src/kernel/boot.test.ts +2 -2
- package/src/kernel/boot.ts +54 -10
- package/src/kernel/boundary-contract.ts +7 -0
- package/src/kernel/builtin-errors.ts +2 -0
- package/src/kernel/call.test.ts +1 -0
- package/src/kernel/errors-compiler.ts +11 -0
- package/src/kernel/errors-text.ts +16 -0
- package/src/kernel/errors.ts +8 -0
- package/src/kernel/flow.ts +33 -3
- package/src/kernel/fx-call-types.test.ts +32 -0
- package/src/kernel/fx-decide.ts +11 -7
- package/src/kernel/fx-sql-handle.ts +52 -7
- package/src/kernel/fx.test.ts +1 -3
- package/src/kernel/fx.ts +27 -16
- package/src/kernel/horizontal-child.ts +54 -1
- package/src/kernel/horizontal.integration.test.ts +131 -7
- package/src/kernel/idempotency.test.ts +4 -4
- package/src/kernel/journal-boot.test.ts +83 -6
- package/src/kernel/journal.test.ts +158 -0
- package/src/kernel/journal.ts +515 -54
- package/src/kernel/pipeline-tenant.ts +5 -1
- package/src/kernel/pipeline.ts +5 -0
- package/src/kernel/signal-tx.ts +28 -0
- package/src/kernel/store-transaction.test.ts +95 -0
- package/src/mcp/authorization.ts +5 -11
- package/src/mcp/confirmation.ts +203 -38
- package/src/mcp/docs-server.ts +26 -4
- package/src/mcp/index.ts +4 -0
- package/src/mcp/mcp.test.ts +404 -33
- package/src/mcp/protocol.ts +8 -2
- package/src/mcp/server.ts +31 -5
- package/src/mcp/session.ts +7 -0
- package/src/mcp/tools.ts +68 -19
- package/src/mcp/versions.ts +60 -0
- package/src/plugins/index.ts +1 -0
- package/src/plugins/mena.ts +56 -0
- package/src/runtime/bun.ts +5 -0
- package/src/runtime/types.ts +5 -0
|
@@ -5,8 +5,13 @@
|
|
|
5
5
|
|
|
6
6
|
import { describe, expect, test } from "bun:test";
|
|
7
7
|
|
|
8
|
-
import
|
|
9
|
-
import {
|
|
8
|
+
import { OkeError } from "../kernel/errors.ts";
|
|
9
|
+
import { createJournal, type JournalRun } from "../kernel/journal.ts";
|
|
10
|
+
import {
|
|
11
|
+
createPostgresJournalFake,
|
|
12
|
+
createPostgresJournalStore,
|
|
13
|
+
postgresJournalStatements,
|
|
14
|
+
} from "./journal-postgres.ts";
|
|
10
15
|
|
|
11
16
|
function seedRun(patch: Partial<JournalRun> & { id: string }): JournalRun {
|
|
12
17
|
return {
|
|
@@ -174,4 +179,103 @@ describe("postgres JournalStore (fake)", () => {
|
|
|
174
179
|
expect(row?.leaseExpiresAt).toBeUndefined();
|
|
175
180
|
await store.close();
|
|
176
181
|
});
|
|
182
|
+
|
|
183
|
+
test("step writes stay linear as the journal grows", async () => {
|
|
184
|
+
const store = await createPostgresJournalStore({ sql: createPostgresJournalFake() });
|
|
185
|
+
const journal = createJournal({ store, now: () => 1, codeVersion: "v1" });
|
|
186
|
+
const session = await journal.start("long");
|
|
187
|
+
const steps = 40;
|
|
188
|
+
const payload = "x".repeat(200);
|
|
189
|
+
for (let i = 0; i < steps; i++) {
|
|
190
|
+
await session.step(`s${i}`, () => payload);
|
|
191
|
+
}
|
|
192
|
+
const perStep = JSON.stringify({
|
|
193
|
+
kind: "step",
|
|
194
|
+
name: "s0",
|
|
195
|
+
value: payload,
|
|
196
|
+
at: 1,
|
|
197
|
+
}).length;
|
|
198
|
+
expect(store.writeBytes).toBeLessThan(steps * (perStep + 80) * 3);
|
|
199
|
+
const row = await store.get(session.runId);
|
|
200
|
+
expect(row?.entries).toHaveLength(steps);
|
|
201
|
+
await store.close();
|
|
202
|
+
});
|
|
203
|
+
|
|
204
|
+
test("a stale fence cannot append, and an identical append is a no-op", async () => {
|
|
205
|
+
const store = await createPostgresJournalStore({ sql: createPostgresJournalFake() });
|
|
206
|
+
const journal = createJournal({
|
|
207
|
+
store,
|
|
208
|
+
now: () => 1_000,
|
|
209
|
+
codeVersion: "v1",
|
|
210
|
+
lease: { instanceId: "A", leaseMs: 5_000 },
|
|
211
|
+
});
|
|
212
|
+
const session = await journal.start("charge");
|
|
213
|
+
await session.step("one", () => 1);
|
|
214
|
+
const entry = { kind: "step" as const, name: "one", value: 1, at: 1_000 };
|
|
215
|
+
const append = store.appendEntry;
|
|
216
|
+
if (!append) throw new Error("appendEntry missing");
|
|
217
|
+
await append(session.runId, 0, entry, {
|
|
218
|
+
lockedBy: "A",
|
|
219
|
+
leaseToken: 1,
|
|
220
|
+
now: 1_000,
|
|
221
|
+
});
|
|
222
|
+
await expect(
|
|
223
|
+
append(
|
|
224
|
+
session.runId,
|
|
225
|
+
1,
|
|
226
|
+
{ kind: "step", name: "two", value: 2, at: 1_000 },
|
|
227
|
+
{ lockedBy: "A", leaseToken: 99, now: 1_000 },
|
|
228
|
+
),
|
|
229
|
+
).rejects.toBeInstanceOf(OkeError);
|
|
230
|
+
expect((await store.get(session.runId))?.entries).toHaveLength(1);
|
|
231
|
+
expect((await store.get(session.runId))?.leaseToken).toBe(1);
|
|
232
|
+
await store.close();
|
|
233
|
+
});
|
|
234
|
+
|
|
235
|
+
test("cas rewrites only the entries that changed", async () => {
|
|
236
|
+
const store = await createPostgresJournalStore({ sql: createPostgresJournalFake() });
|
|
237
|
+
await store.put(
|
|
238
|
+
seedRun({
|
|
239
|
+
id: "cas",
|
|
240
|
+
lockedBy: "A",
|
|
241
|
+
leaseExpiresAt: 5_000,
|
|
242
|
+
leaseToken: 1,
|
|
243
|
+
entries: [
|
|
244
|
+
{ kind: "step", name: "a", value: 1, at: 1 },
|
|
245
|
+
{ kind: "step", name: "b", value: 2, at: 1 },
|
|
246
|
+
{ kind: "step", name: "c", value: 3, at: 1 },
|
|
247
|
+
],
|
|
248
|
+
}),
|
|
249
|
+
);
|
|
250
|
+
const before = store.writeBytes;
|
|
251
|
+
const result = await store.cas("cas", "A", 1_000, 5_000, (run) => ({
|
|
252
|
+
...run,
|
|
253
|
+
entries: run.entries.map((item) =>
|
|
254
|
+
item.kind === "step" && item.name === "b" ? { ...item, value: 9 } : item,
|
|
255
|
+
),
|
|
256
|
+
}));
|
|
257
|
+
expect(result).toBe("ok");
|
|
258
|
+
const row = await store.get("cas");
|
|
259
|
+
expect(row?.entries[1]).toMatchObject({ value: 9 });
|
|
260
|
+
expect(row?.entries[0]).toMatchObject({ value: 1 });
|
|
261
|
+
expect(store.writeBytes - before).toBeLessThan(JSON.stringify(row?.entries).length);
|
|
262
|
+
await store.close();
|
|
263
|
+
});
|
|
264
|
+
|
|
265
|
+
test("every journal statement matches the fake, and an unknown statement does not", async () => {
|
|
266
|
+
const sql = createPostgresJournalFake();
|
|
267
|
+
const pad = Array.from({ length: 20 }, () => 0);
|
|
268
|
+
for (const statement of postgresJournalStatements()) {
|
|
269
|
+
const run = /^\s*SELECT/i.test(statement)
|
|
270
|
+
? sql.query(statement, pad)
|
|
271
|
+
: sql.exec(statement, pad);
|
|
272
|
+
try {
|
|
273
|
+
await run;
|
|
274
|
+
} catch (err) {
|
|
275
|
+
expect(String(err)).not.toContain("unsupported");
|
|
276
|
+
}
|
|
277
|
+
}
|
|
278
|
+
await expect(sql.exec("UPDATE oke_journal_runs SET nope = 1")).rejects.toThrow(/unsupported/);
|
|
279
|
+
await sql.close();
|
|
280
|
+
});
|
|
177
281
|
});
|