stitchkit 0.80.0 → 0.80.1

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.
@@ -0,0 +1,86 @@
1
+ import { z } from 'zod';
2
+ export declare const RevisionSignalStateSchema: z.ZodEnum<{
3
+ closed: "closed";
4
+ open: "open";
5
+ }>;
6
+ export type RevisionSignalState = z.infer<typeof RevisionSignalStateSchema>;
7
+ export declare const RevisionSignalWaitOutcomeSchema: z.ZodEnum<{
8
+ aborted: "aborted";
9
+ capacity: "capacity";
10
+ changed: "changed";
11
+ closed: "closed";
12
+ "timed-out": "timed-out";
13
+ }>;
14
+ export type RevisionSignalWaitOutcome = z.infer<typeof RevisionSignalWaitOutcomeSchema>;
15
+ export declare const RevisionSignalWaitResultSchema: z.ZodReadonly<z.ZodObject<{
16
+ outcome: z.ZodEnum<{
17
+ aborted: "aborted";
18
+ capacity: "capacity";
19
+ changed: "changed";
20
+ closed: "closed";
21
+ "timed-out": "timed-out";
22
+ }>;
23
+ revision: z.ZodNumber;
24
+ }, z.core.$strict>>;
25
+ export type RevisionSignalWaitResult = z.infer<typeof RevisionSignalWaitResultSchema>;
26
+ export declare const RevisionSignalAdvanceResultSchema: z.ZodReadonly<z.ZodObject<{
27
+ outcome: z.ZodEnum<{
28
+ advanced: "advanced";
29
+ closed: "closed";
30
+ }>;
31
+ revision: z.ZodNumber;
32
+ }, z.core.$strict>>;
33
+ export type RevisionSignalAdvanceResult = z.infer<typeof RevisionSignalAdvanceResultSchema>;
34
+ export declare const RevisionSignalSnapshotSchema: z.ZodReadonly<z.ZodObject<{
35
+ state: z.ZodEnum<{
36
+ closed: "closed";
37
+ open: "open";
38
+ }>;
39
+ revision: z.ZodNumber;
40
+ pending: z.ZodNumber;
41
+ maxWaiters: z.ZodNumber;
42
+ advances: z.ZodNumber;
43
+ refusedAdvances: z.ZodNumber;
44
+ waits: z.ZodNumber;
45
+ changed: z.ZodNumber;
46
+ timedOut: z.ZodNumber;
47
+ aborted: z.ZodNumber;
48
+ closedWaits: z.ZodNumber;
49
+ capacityRefusals: z.ZodNumber;
50
+ clockFailures: z.ZodNumber;
51
+ }, z.core.$strict>>;
52
+ export type RevisionSignalSnapshot = z.infer<typeof RevisionSignalSnapshotSchema>;
53
+ export interface RevisionSignalTimer {
54
+ cancel(): void;
55
+ }
56
+ /** Timer boundary for deterministic wait-budget tests. */
57
+ export interface RevisionSignalClock {
58
+ schedule(callback: () => void, delayMs: number): RevisionSignalTimer;
59
+ }
60
+ export interface RevisionSignalConfig {
61
+ /** Maximum simultaneously parked waits. */
62
+ readonly maxWaiters: number;
63
+ /** Defaults to the platform timer. */
64
+ readonly clock?: RevisionSignalClock;
65
+ }
66
+ export interface RevisionSignalWaitOptions {
67
+ readonly signal?: AbortSignal;
68
+ /** Absent means wait until an advance, abort or close. */
69
+ readonly timeoutMs?: number;
70
+ }
71
+ export interface RevisionSignal {
72
+ /** Advance the monotonic revision and broadcast it to every older waiter. */
73
+ advance(): RevisionSignalAdvanceResult;
74
+ /**
75
+ * Wait for a revision newer than `after`.
76
+ *
77
+ * An already newer revision resolves immediately. The current revision parks the wait. A
78
+ * future revision is a caller bug and is rejected before any waiter is retained.
79
+ */
80
+ wait(after: number, options?: RevisionSignalWaitOptions): Promise<RevisionSignalWaitResult>;
81
+ close(): RevisionSignalSnapshot;
82
+ getSnapshot(): RevisionSignalSnapshot;
83
+ }
84
+ /** Finite process-local broadcast wake-up keyed by a monotonic revision. */
85
+ export declare function createRevisionSignal(config: RevisionSignalConfig): RevisionSignal;
86
+ //# sourceMappingURL=revision-signal.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"revision-signal.d.ts","sourceRoot":"","sources":["../../src/application/revision-signal.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAMxB,eAAO,MAAM,yBAAyB;;;EAA6B,CAAC;AACpE,MAAM,MAAM,mBAAmB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,yBAAyB,CAAC,CAAC;AAE5E,eAAO,MAAM,+BAA+B;;;;;;EAM1C,CAAC;AACH,MAAM,MAAM,yBAAyB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,+BAA+B,CAAC,CAAC;AAExF,eAAO,MAAM,8BAA8B;;;;;;;;;mBAM9B,CAAC;AACd,MAAM,MAAM,wBAAwB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,8BAA8B,CAAC,CAAC;AAEtF,eAAO,MAAM,iCAAiC;;;;;;mBAMjC,CAAC;AACd,MAAM,MAAM,2BAA2B,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,iCAAiC,CAAC,CAAC;AAE5F,eAAO,MAAM,4BAA4B;;;;;;;;;;;;;;;;;mBAiB5B,CAAC;AACd,MAAM,MAAM,sBAAsB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,4BAA4B,CAAC,CAAC;AAElF,MAAM,WAAW,mBAAmB;IAClC,MAAM,IAAI,IAAI,CAAC;CAChB;AAED,0DAA0D;AAC1D,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,QAAQ,EAAE,MAAM,IAAI,EAAE,OAAO,EAAE,MAAM,GAAG,mBAAmB,CAAC;CACtE;AAED,MAAM,WAAW,oBAAoB;IACnC,2CAA2C;IAC3C,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,sCAAsC;IACtC,QAAQ,CAAC,KAAK,CAAC,EAAE,mBAAmB,CAAC;CACtC;AAED,MAAM,WAAW,yBAAyB;IACxC,QAAQ,CAAC,MAAM,CAAC,EAAE,WAAW,CAAC;IAC9B,0DAA0D;IAC1D,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;CAC7B;AAED,MAAM,WAAW,cAAc;IAC7B,6EAA6E;IAC7E,OAAO,IAAI,2BAA2B,CAAC;IACvC;;;;;OAKG;IACH,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,yBAAyB,GAAG,OAAO,CAAC,wBAAwB,CAAC,CAAC;IAC5F,KAAK,IAAI,sBAAsB,CAAC;IAChC,WAAW,IAAI,sBAAsB,CAAC;CACvC;AAaD,4EAA4E;AAC5E,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,oBAAoB,GAAG,cAAc,CAoHjF"}
@@ -10,6 +10,7 @@ export { defineKeyspace, type KeyspaceBackend, type KeyspaceChange, type Keyspac
10
10
  export { type SqliteKeyspaceBackendConfig, sqliteKeyspaceBackend, } from './application/keyspace-sqlite.js';
11
11
  export { type ApplicationSnapshotSink, type ApplicationSnapshotSinkConfig, type ApplicationSnapshotSinkError, type ApplicationSnapshotSinkStatus, ApplicationSnapshotSinkStatusSchema, createApplicationSnapshotSink, type RevisionedApplicationSnapshot, } from './application/latest-sink.js';
12
12
  export { defineManagedResource, type ManagedResource, type ManagedResourceContext, type ManagedResourceDependency, type ManagedResourcePublished, type ManagedResourcePublishesNoValue, type ManagedResourceStartResult, managedResourceDependencyId, } from './application/resource.js';
13
+ export { createRevisionSignal, type RevisionSignal, type RevisionSignalAdvanceResult, RevisionSignalAdvanceResultSchema, type RevisionSignalClock, type RevisionSignalConfig, type RevisionSignalSnapshot, RevisionSignalSnapshotSchema, type RevisionSignalState, RevisionSignalStateSchema, type RevisionSignalTimer, type RevisionSignalWaitOptions, type RevisionSignalWaitOutcome, RevisionSignalWaitOutcomeSchema, type RevisionSignalWaitResult, RevisionSignalWaitResultSchema, } from './application/revision-signal.js';
13
14
  export { createManagedSchedule, type ManagedSchedule, type ManagedScheduleClock, type ManagedScheduleConfig, type ManagedScheduleDescriptor, ManagedScheduleDescriptorSchema, type ManagedScheduleErrorPolicy, ManagedScheduleErrorPolicySchema, type ManagedScheduleOverlap, ManagedScheduleOverlapSchema, type ManagedScheduleRunContext, type ManagedScheduleStatus, ManagedScheduleStatusSchema, type ManagedScheduleTimer, } from './application/schedule.js';
14
15
  export { type ManagedServerResource, type ManagedServerResourceConfig, managedServerResource, } from './application/server-resource.js';
15
16
  export { type AttachedWatcher, createWatchHub, type WatchHub, type WatchHubConfig, type WatchOperation, type WatchSubscriber, watchKey, } from './application/watch-hub.js';
@@ -1 +1 @@
1
- {"version":3,"file":"application.d.ts","sourceRoot":"","sources":["../src/application.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"application.d.ts","sourceRoot":"","sources":["../src/application.ts"],"names":[],"mappings":"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"}
@@ -778,6 +778,167 @@ function sqliteKeyspaceBackend(declaration, config) {
778
778
  }
779
779
  };
780
780
  }
781
+ // src/application/revision-signal.ts
782
+ import { z as z5 } from "zod";
783
+ var NonNegativeSafeIntegerSchema = z5.number().int().nonnegative().safe();
784
+ var PositiveSafeIntegerSchema2 = z5.number().int().positive().safe();
785
+ var TimerDelaySchema = z5.number().int().positive().max(2147483647);
786
+ var RevisionSignalStateSchema = z5.enum(["open", "closed"]);
787
+ var RevisionSignalWaitOutcomeSchema = z5.enum([
788
+ "changed",
789
+ "timed-out",
790
+ "aborted",
791
+ "closed",
792
+ "capacity"
793
+ ]);
794
+ var RevisionSignalWaitResultSchema = z5.object({
795
+ outcome: RevisionSignalWaitOutcomeSchema,
796
+ revision: NonNegativeSafeIntegerSchema
797
+ }).strict().readonly();
798
+ var RevisionSignalAdvanceResultSchema = z5.object({
799
+ outcome: z5.enum(["advanced", "closed"]),
800
+ revision: NonNegativeSafeIntegerSchema
801
+ }).strict().readonly();
802
+ var RevisionSignalSnapshotSchema = z5.object({
803
+ state: RevisionSignalStateSchema,
804
+ revision: NonNegativeSafeIntegerSchema,
805
+ pending: NonNegativeSafeIntegerSchema,
806
+ maxWaiters: PositiveSafeIntegerSchema2,
807
+ advances: NonNegativeSafeIntegerSchema,
808
+ refusedAdvances: NonNegativeSafeIntegerSchema,
809
+ waits: NonNegativeSafeIntegerSchema,
810
+ changed: NonNegativeSafeIntegerSchema,
811
+ timedOut: NonNegativeSafeIntegerSchema,
812
+ aborted: NonNegativeSafeIntegerSchema,
813
+ closedWaits: NonNegativeSafeIntegerSchema,
814
+ capacityRefusals: NonNegativeSafeIntegerSchema,
815
+ clockFailures: NonNegativeSafeIntegerSchema
816
+ }).strict().readonly();
817
+ var systemClock = {
818
+ schedule(callback, delayMs) {
819
+ const timer = setTimeout(callback, delayMs);
820
+ return { cancel: () => clearTimeout(timer) };
821
+ }
822
+ };
823
+ function createRevisionSignal(config) {
824
+ const maxWaiters = PositiveSafeIntegerSchema2.parse(config.maxWaiters);
825
+ const clock = config.clock ?? systemClock;
826
+ const waiters = new Set;
827
+ let state = "open";
828
+ let revision = 0;
829
+ let advances = 0;
830
+ let refusedAdvances = 0;
831
+ let waits = 0;
832
+ let changed = 0;
833
+ let timedOut = 0;
834
+ let aborted = 0;
835
+ let closedWaits = 0;
836
+ let capacityRefusals = 0;
837
+ let clockFailures = 0;
838
+ const result = (outcome) => {
839
+ if (outcome === "changed")
840
+ changed += 1;
841
+ else if (outcome === "timed-out")
842
+ timedOut += 1;
843
+ else if (outcome === "aborted")
844
+ aborted += 1;
845
+ else if (outcome === "closed")
846
+ closedWaits += 1;
847
+ else
848
+ capacityRefusals += 1;
849
+ return RevisionSignalWaitResultSchema.parse({ outcome, revision });
850
+ };
851
+ const snapshot = () => RevisionSignalSnapshotSchema.parse({
852
+ state,
853
+ revision,
854
+ pending: waiters.size,
855
+ maxWaiters,
856
+ advances,
857
+ refusedAdvances,
858
+ waits,
859
+ changed,
860
+ timedOut,
861
+ aborted,
862
+ closedWaits,
863
+ capacityRefusals,
864
+ clockFailures
865
+ });
866
+ return {
867
+ advance() {
868
+ if (state === "closed") {
869
+ refusedAdvances += 1;
870
+ return RevisionSignalAdvanceResultSchema.parse({ outcome: "closed", revision });
871
+ }
872
+ if (revision === Number.MAX_SAFE_INTEGER) {
873
+ throw new RangeError("Revision signal exhausted the safe-integer revision range");
874
+ }
875
+ revision += 1;
876
+ advances += 1;
877
+ for (const waiter of [...waiters])
878
+ waiter.settle("changed");
879
+ return RevisionSignalAdvanceResultSchema.parse({ outcome: "advanced", revision });
880
+ },
881
+ wait(after, options = {}) {
882
+ const parsedAfter = NonNegativeSafeIntegerSchema.parse(after);
883
+ const timeoutMs = options.timeoutMs === undefined ? undefined : TimerDelaySchema.parse(options.timeoutMs);
884
+ if (parsedAfter > revision) {
885
+ throw new RangeError(`Revision signal cannot wait after future revision ${parsedAfter}; current revision is ${revision}`);
886
+ }
887
+ waits += 1;
888
+ if (state === "closed")
889
+ return Promise.resolve(result("closed"));
890
+ if (parsedAfter < revision)
891
+ return Promise.resolve(result("changed"));
892
+ if (options.signal?.aborted)
893
+ return Promise.resolve(result("aborted"));
894
+ if (waiters.size >= maxWaiters)
895
+ return Promise.resolve(result("capacity"));
896
+ return new Promise((resolve) => {
897
+ let settled = false;
898
+ let timer;
899
+ const waiter = {
900
+ settle(outcome) {
901
+ if (settled)
902
+ return;
903
+ settled = true;
904
+ timer?.cancel();
905
+ options.signal?.removeEventListener("abort", onAbort);
906
+ waiters.delete(waiter);
907
+ resolve(result(outcome));
908
+ }
909
+ };
910
+ function onAbort() {
911
+ waiter.settle("aborted");
912
+ }
913
+ waiters.add(waiter);
914
+ options.signal?.addEventListener("abort", onAbort, { once: true });
915
+ if (timeoutMs !== undefined) {
916
+ try {
917
+ const scheduled = clock.schedule(() => waiter.settle("timed-out"), timeoutMs);
918
+ timer = scheduled;
919
+ if (settled)
920
+ scheduled.cancel();
921
+ } catch (error) {
922
+ settled = true;
923
+ options.signal?.removeEventListener("abort", onAbort);
924
+ waiters.delete(waiter);
925
+ clockFailures += 1;
926
+ throw error;
927
+ }
928
+ }
929
+ });
930
+ },
931
+ close() {
932
+ if (state === "closed")
933
+ return snapshot();
934
+ state = "closed";
935
+ for (const waiter of [...waiters])
936
+ waiter.settle("closed");
937
+ return snapshot();
938
+ },
939
+ getSnapshot: snapshot
940
+ };
941
+ }
781
942
  // src/application/server-resource.ts
782
943
  function managedServerResource(config) {
783
944
  let shutdownPromise;
@@ -1092,6 +1253,7 @@ export {
1092
1253
  defineManagedResource,
1093
1254
  defineKeyspace,
1094
1255
  createWatchHub,
1256
+ createRevisionSignal,
1095
1257
  createManagedSchedule,
1096
1258
  createDecisionPipeline,
1097
1259
  createCreditWindow,
@@ -1104,6 +1266,11 @@ export {
1104
1266
  createApplication,
1105
1267
  createActivityProjection,
1106
1268
  applicationLifecycleEvent,
1269
+ RevisionSignalWaitResultSchema,
1270
+ RevisionSignalWaitOutcomeSchema,
1271
+ RevisionSignalStateSchema,
1272
+ RevisionSignalSnapshotSchema,
1273
+ RevisionSignalAdvanceResultSchema,
1107
1274
  PolicyDecisionSchema,
1108
1275
  ManagedScheduleStatusSchema,
1109
1276
  ManagedScheduleOverlapSchema,
package/llms-full.txt CHANGED
@@ -5153,7 +5153,7 @@ description: Compose process-local resources, schedules, readiness, drain and op
5153
5153
  type: architecture
5154
5154
  status: active
5155
5155
  created: 2026-08-23
5156
- updated: 2026-08-23
5156
+ updated: 2026-09-04 14:11 +07:00
5157
5157
  ---
5158
5158
 
5159
5159
  # Managed application kernel
@@ -5663,6 +5663,40 @@ underlying Promise actually settles. `drain()` therefore reports real work;
5663
5663
  `force()` closes admission and reports remaining work without claiming to have
5664
5664
  terminated it. → ADR 0118.
5665
5665
 
5666
+ ### Bounded revision wake-up
5667
+
5668
+ Use `createRevisionSignal` when several operations need to wait for the same
5669
+ process-local fact to change, but the change itself is not a queue item:
5670
+
5671
+ ```ts
5672
+ const connectionsChanged = createRevisionSignal({ maxWaiters: 256 })
5673
+
5674
+ const observed = connectionsChanged.getSnapshot().revision
5675
+ const result = await connectionsChanged.wait(observed, {
5676
+ signal: request.signal,
5677
+ timeoutMs: 10_000,
5678
+ })
5679
+
5680
+ // After changing the canonical connection state:
5681
+ connectionsChanged.advance()
5682
+ ```
5683
+
5684
+ `wait(after)` resolves immediately when the signal is already newer than
5685
+ `after`; this closes the race between reading a snapshot and registering the
5686
+ wait. Waiting on the current revision parks one operation, up to `maxWaiters`.
5687
+ Every terminal result carries the revision it observed and distinguishes
5688
+ `changed`, `timed-out`, `aborted`, `closed` and `capacity`. A future `after` is
5689
+ a caller error rather than a revision the signal could honestly promise to
5690
+ reach.
5691
+
5692
+ One advance wakes every older waiter. It is not consumed by the first reader,
5693
+ does not retain event payloads and has no replay history. A bounded channel is
5694
+ for delivering items to one reader; a credit window grants a finite resource.
5695
+
5696
+ The signal is already its whole lifecycle handle. Call its idempotent `close()`
5697
+ from the `close` phase of the managed resource that owns the changing fact;
5698
+ there is no second managed-resource wrapper around the same state. → ADR 0163.
5699
+
5666
5700
  ### Bounded delivery and byte credit
5667
5701
 
5668
5702
  `createBoundedChannel` is for one asynchronous reader when an event bus is not a
@@ -13775,6 +13809,19 @@ cutovers are covered by the executable
13775
13809
  | `BoundedAdmissionRefusalError` | class | `run()` refusal with reason and optional `retryAfterMs` |
13776
13810
  | `BoundedOperationWaitError` | class | caller wait ended as `cancelled` or `timed-out`; underlying capacity remains leased until work settles |
13777
13811
 
13812
+ ### Revision wake-up
13813
+
13814
+ | Export | Kind | Summary |
13815
+ |--------|------|---------|
13816
+ | `createRevisionSignal` | function | finite broadcast wait for the next monotonic process-local revision |
13817
+ | `RevisionSignal` / `RevisionSignalConfig` / `RevisionSignalClock` / `RevisionSignalTimer` | _type_ | signal handle, waiter bound and replaceable timer boundary |
13818
+ | `RevisionSignalWaitOptions` | _type_ | optional caller `signal` and positive `timeoutMs`; absent options wait until advance or close |
13819
+ | `RevisionSignalWaitOutcomeSchema` / `RevisionSignalWaitOutcome` | schema / _type_ | `changed \| timed-out \| aborted \| closed \| capacity` |
13820
+ | `RevisionSignalWaitResultSchema` / `RevisionSignalWaitResult` | schema / _type_ | terminal wait outcome with the revision observed at settlement |
13821
+ | `RevisionSignalAdvanceResultSchema` / `RevisionSignalAdvanceResult` | schema / _type_ | successful `advanced` or post-close `closed`, with the resulting revision |
13822
+ | `RevisionSignalStateSchema` / `RevisionSignalState` | schema / _type_ | `open \| closed` lifecycle |
13823
+ | `RevisionSignalSnapshotSchema` / `RevisionSignalSnapshot` | schema / _type_ | current revision, finite pending count and lifetime outcome counters |
13824
+
13778
13825
  ### Bounded delivery
13779
13826
 
13780
13827
  | Export | Kind | Summary |
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "stitchkit",
3
- "version": "0.80.0",
3
+ "version": "0.80.1",
4
4
  "description": "Contract-first backend framework — one defineContract() into an HTTP API, MCP tools, AI-agent tools and a typed client. Bun and Node.",
5
5
  "keywords": [
6
6
  "bun",
@@ -170,7 +170,7 @@
170
170
  "check": "bun x tsc --noEmit",
171
171
  "build:js": "bun run build:entrypoints && bun scripts/preserve-webpack-ignore.mjs",
172
172
  "build:types": "bun x tsc -p tsconfig.build.json --emitDeclarationOnly && bun scripts/rewrite-declaration-specifiers.mjs",
173
- "build": "rm -rf dist && bun run build:js && bun run build:types && bun scripts/check-browser-clean.mjs && bun scripts/check-browser-executes.mjs && bun scripts/check-env-live.mjs && bun scripts/check-public-types.mjs",
173
+ "build": "rm -rf dist && bun run build:js && bun run build:types && bun scripts/check-browser-clean.mjs && bun scripts/check-browser-executes.mjs && bun scripts/check-env-live.mjs && bun scripts/check-public-types.mjs && bun scripts/check-declarations-strict.mjs",
174
174
  "dev": "bun run build:entrypoints -- --watch",
175
175
  "prepack": "cp ../../README.md ./README.md && bun ../../scripts/gen-llms.ts && bun run build",
176
176
  "test": "bun test",