stitchkit 0.59.1 → 0.59.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 +44 -4
- package/dist/application/activity.d.ts +70 -0
- package/dist/application/activity.d.ts.map +1 -0
- package/dist/application/events.d.ts +65 -0
- package/dist/application/events.d.ts.map +1 -0
- package/dist/application/grammy.d.ts +35 -0
- package/dist/application/grammy.d.ts.map +1 -0
- package/dist/application/graph.d.ts +11 -0
- package/dist/application/graph.d.ts.map +1 -0
- package/dist/application/health.d.ts +13 -0
- package/dist/application/health.d.ts.map +1 -0
- package/dist/application/kernel.d.ts +31 -0
- package/dist/application/kernel.d.ts.map +1 -0
- package/dist/application/latest-sink.d.ts +39 -0
- package/dist/application/latest-sink.d.ts.map +1 -0
- package/dist/application/resource.d.ts +30 -0
- package/dist/application/resource.d.ts.map +1 -0
- package/dist/application/schedule.d.ts +112 -0
- package/dist/application/schedule.d.ts.map +1 -0
- package/dist/application/schemas.d.ts +160 -0
- package/dist/application/schemas.d.ts.map +1 -0
- package/dist/application/server-resource.d.ts +12 -0
- package/dist/application/server-resource.d.ts.map +1 -0
- package/dist/application-grammy.d.ts +2 -0
- package/dist/application-grammy.d.ts.map +1 -0
- package/dist/application-grammy.js +165 -0
- package/dist/application.d.ts +10 -0
- package/dist/application.d.ts.map +1 -0
- package/dist/application.js +1370 -0
- package/dist/index-dk6e56g0.js +211 -0
- package/dist/{index-9zn9fb4e.js → index-he4psyve.js} +6 -213
- package/dist/index-yr276yz0.js +6 -0
- package/dist/internal/fetch-port.d.ts +2 -0
- package/dist/internal/fetch-port.d.ts.map +1 -0
- package/dist/node.js +115 -13
- package/dist/server/index.js +8 -6
- package/dist/server/node.d.ts.map +1 -1
- package/dist/server/process-signals.d.ts +10 -8
- package/dist/server/process-signals.d.ts.map +1 -1
- package/llms-full.txt +379 -0
- package/llms.txt +1 -0
- package/package.json +15 -2
package/README.md
CHANGED
|
@@ -86,13 +86,50 @@ import { createServer, createHandler, implement } from 'stitchkit/server'
|
|
|
86
86
|
import { createSocketIOServer, createAuthHook } from 'stitchkit/server'
|
|
87
87
|
import { createMcpHandler, mountAgent } from 'stitchkit/tools'
|
|
88
88
|
import { createAgentRuntime, defineAgentProtocol } from 'stitchkit/agent-runtime'
|
|
89
|
+
import { createApplication, defineManagedResource } from 'stitchkit/application'
|
|
89
90
|
import { implementRemote } from 'stitchkit/remote'
|
|
90
91
|
```
|
|
91
92
|
|
|
92
|
-
The root `stitchkit` entrypoint is browser-safe. Server, tool, optional
|
|
93
|
-
AI-SDK-backed agent-runtime and peer-free remote-proxy code live
|
|
94
|
-
`stitchkit/server`, `stitchkit/tools`, `stitchkit/
|
|
95
|
-
`stitchkit/remote` respectively.
|
|
93
|
+
The root `stitchkit` entrypoint is browser-safe. Server, tool, optional managed
|
|
94
|
+
application, AI-SDK-backed agent-runtime and peer-free remote-proxy code live
|
|
95
|
+
behind `stitchkit/server`, `stitchkit/tools`, `stitchkit/application`,
|
|
96
|
+
`stitchkit/agent-runtime` and `stitchkit/remote` respectively. Optional provider
|
|
97
|
+
adapters are isolated further; importing `stitchkit/application` never resolves
|
|
98
|
+
grammY.
|
|
99
|
+
|
|
100
|
+
## Managed application kernel
|
|
101
|
+
|
|
102
|
+
Use [`stitchkit/application`](./docs/guide/application-kernel.md) when several
|
|
103
|
+
process-local resources must start, become ready, drain and stop as one
|
|
104
|
+
application:
|
|
105
|
+
|
|
106
|
+
```ts
|
|
107
|
+
import {
|
|
108
|
+
createApplication,
|
|
109
|
+
createManagedSchedule,
|
|
110
|
+
managedServerResource,
|
|
111
|
+
} from 'stitchkit/application'
|
|
112
|
+
import { bindProcessSignals } from 'stitchkit/server'
|
|
113
|
+
|
|
114
|
+
const app = createApplication({
|
|
115
|
+
id: 'service',
|
|
116
|
+
resources: [
|
|
117
|
+
managedServerResource({ id: 'http', server }),
|
|
118
|
+
createManagedSchedule({
|
|
119
|
+
id: 'cleanup',
|
|
120
|
+
everyMs: 60_000,
|
|
121
|
+
run: ({ signal }) => removeExpiredRecords(signal),
|
|
122
|
+
}),
|
|
123
|
+
],
|
|
124
|
+
})
|
|
125
|
+
|
|
126
|
+
bindProcessSignals(app)
|
|
127
|
+
await app.start()
|
|
128
|
+
```
|
|
129
|
+
|
|
130
|
+
The kernel owns dependency ordering, attempted-start rollback, readiness,
|
|
131
|
+
process-local admission, ephemeral schedules and bounded shutdown. It does not
|
|
132
|
+
own durable jobs, provider policy, retries, process restart or deployment.
|
|
96
133
|
|
|
97
134
|
## Quick Start
|
|
98
135
|
|
|
@@ -290,6 +327,7 @@ import { parseSSE } from 'stitchkit' // client: Response → AsyncGene
|
|
|
290
327
|
| **MCP Tools** | `createMcpHandler()` / `mountMcp()` — MCP tools from contracts |
|
|
291
328
|
| **Agent Tools** | `mountAgent()` — Vercel AI SDK tools from contracts |
|
|
292
329
|
| **Agent Runtime** | `createAgentRuntime()` — optional durable history, stream loop, coordination and fencing |
|
|
330
|
+
| **Application Kernel** | `createApplication()` — optional process-local resources, readiness, schedules and bounded shutdown |
|
|
293
331
|
| **Typed Client** | `createClient()` / `createClients()` — typed fetch from contracts |
|
|
294
332
|
| **Cursor Pagination** | `createCursorQuery()` — `react-query-kit` infinite query from a contract method |
|
|
295
333
|
| **WebSocket** | `createSocketIOClient()` / `createSocketIOServer()` — typed Socket.IO wrappers |
|
|
@@ -377,6 +415,7 @@ peer — an install pulls in only what the project actually uses.
|
|
|
377
415
|
| `@modelcontextprotocol/ext-apps` | peer, optional | Only MCP Apps (`ui://` resources and UI metadata). |
|
|
378
416
|
| `ai` | peer, optional | `stitchkit/tools` agent tools and the optional server-only `stitchkit/agent-runtime`. |
|
|
379
417
|
| `@openrouter/ai-sdk-provider` | peer, optional | Only `stitchkit/agent-runtime/openrouter`; neutral runtime imports do not resolve it. |
|
|
418
|
+
| `grammy` | peer, optional | Only `stitchkit/application/grammy`; the neutral application kernel does not resolve it. |
|
|
380
419
|
| `@tanstack/react-query` + `react-query-kit` | peer, optional | Only `stitchkit/react` — `createCursorQuery`, `createCacheBridge`. |
|
|
381
420
|
| `socket.io` / `@socket.io/bun-engine` / `socket.io-client` | peer, optional | Only the Socket.IO wrappers. |
|
|
382
421
|
|
|
@@ -413,6 +452,7 @@ The full guide and API reference, in [`docs/`](./docs/README.md):
|
|
|
413
452
|
[HTTP server](./docs/guide/server.md) ·
|
|
414
453
|
[typed client](./docs/guide/client.md) ·
|
|
415
454
|
[MCP & agents](./docs/guide/mcp-and-agents.md) ·
|
|
455
|
+
[application kernel](./docs/guide/application-kernel.md) ·
|
|
416
456
|
[realtime](./docs/guide/realtime.md) ·
|
|
417
457
|
[auth & errors](./docs/guide/auth-and-errors.md) ·
|
|
418
458
|
[testing & deployment](./docs/guide/testing-and-deployment.md) ·
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
export declare const ActivityIdSchema: z.ZodString;
|
|
3
|
+
export type ActivityId = z.infer<typeof ActivityIdSchema>;
|
|
4
|
+
export declare const ActivityStageIdSchema: z.ZodString;
|
|
5
|
+
export type ActivityStageId = z.infer<typeof ActivityStageIdSchema>;
|
|
6
|
+
export declare const ActivityStageSnapshotSchema: z.ZodReadonly<z.ZodObject<{
|
|
7
|
+
id: z.ZodString;
|
|
8
|
+
active: z.ZodNumber;
|
|
9
|
+
queued: z.ZodNumber;
|
|
10
|
+
completed: z.ZodNumber;
|
|
11
|
+
failed: z.ZodNumber;
|
|
12
|
+
}, z.core.$strict>>;
|
|
13
|
+
export type ActivityStageSnapshot = z.infer<typeof ActivityStageSnapshotSchema>;
|
|
14
|
+
export declare const ActivitySnapshotSchema: z.ZodReadonly<z.ZodObject<{
|
|
15
|
+
id: z.ZodString;
|
|
16
|
+
epoch: z.ZodString;
|
|
17
|
+
revision: z.ZodNumber;
|
|
18
|
+
capturedAt: z.ZodString;
|
|
19
|
+
changedAt: z.ZodString;
|
|
20
|
+
stages: z.ZodReadonly<z.ZodArray<z.ZodReadonly<z.ZodObject<{
|
|
21
|
+
id: z.ZodString;
|
|
22
|
+
active: z.ZodNumber;
|
|
23
|
+
queued: z.ZodNumber;
|
|
24
|
+
completed: z.ZodNumber;
|
|
25
|
+
failed: z.ZodNumber;
|
|
26
|
+
}, z.core.$strict>>>>;
|
|
27
|
+
totals: z.ZodReadonly<z.ZodObject<{
|
|
28
|
+
active: z.ZodNumber;
|
|
29
|
+
queued: z.ZodNumber;
|
|
30
|
+
completed: z.ZodNumber;
|
|
31
|
+
failed: z.ZodNumber;
|
|
32
|
+
}, z.core.$strict>>;
|
|
33
|
+
}, z.core.$strict>>;
|
|
34
|
+
export type ActivitySnapshot = z.infer<typeof ActivitySnapshotSchema>;
|
|
35
|
+
export declare const ActivityLiveStateSchema: z.ZodEnum<{
|
|
36
|
+
active: "active";
|
|
37
|
+
queued: "queued";
|
|
38
|
+
}>;
|
|
39
|
+
export type ActivityLiveState = z.infer<typeof ActivityLiveStateSchema>;
|
|
40
|
+
declare const ActivityTokenBrand: unique symbol;
|
|
41
|
+
export interface ActivityToken {
|
|
42
|
+
readonly [ActivityTokenBrand]: true;
|
|
43
|
+
}
|
|
44
|
+
export interface ActivityTransition<TStage extends string> {
|
|
45
|
+
readonly stage: TStage;
|
|
46
|
+
readonly state: ActivityLiveState;
|
|
47
|
+
}
|
|
48
|
+
export interface ActivityProjectionSubscriberError {
|
|
49
|
+
readonly error: unknown;
|
|
50
|
+
readonly snapshot: ActivitySnapshot;
|
|
51
|
+
}
|
|
52
|
+
export interface ActivityProjectionConfig<TStages extends readonly string[]> {
|
|
53
|
+
readonly id: string;
|
|
54
|
+
readonly stages: TStages;
|
|
55
|
+
readonly epoch?: string;
|
|
56
|
+
now?: () => Date;
|
|
57
|
+
onSubscriberError?(failure: ActivityProjectionSubscriberError): void | Promise<void>;
|
|
58
|
+
}
|
|
59
|
+
export interface ActivityProjection<TStage extends string> {
|
|
60
|
+
open(stage: TStage, state?: ActivityLiveState): ActivityToken;
|
|
61
|
+
transition(token: ActivityToken, transition: ActivityTransition<TStage>): boolean;
|
|
62
|
+
complete(token: ActivityToken): boolean;
|
|
63
|
+
fail(token: ActivityToken): boolean;
|
|
64
|
+
getSnapshot(): ActivitySnapshot;
|
|
65
|
+
/** Replay the current absolute value, then deliver coalesced newer revisions. */
|
|
66
|
+
subscribe(listener: (snapshot: ActivitySnapshot) => void | Promise<void>): () => void;
|
|
67
|
+
}
|
|
68
|
+
export declare function createActivityProjection<const TStages extends readonly string[]>(config: ActivityProjectionConfig<TStages>): ActivityProjection<TStages[number]>;
|
|
69
|
+
export {};
|
|
70
|
+
//# sourceMappingURL=activity.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"activity.d.ts","sourceRoot":"","sources":["../../src/application/activity.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAUxB,eAAO,MAAM,gBAAgB,aAA6B,CAAC;AAC3D,MAAM,MAAM,UAAU,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,gBAAgB,CAAC,CAAC;AAC1D,eAAO,MAAM,qBAAqB,aAA6B,CAAC;AAChE,MAAM,MAAM,eAAe,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,qBAAqB,CAAC,CAAC;AAEpE,eAAO,MAAM,2BAA2B;;;;;;mBAS3B,CAAC;AACd,MAAM,MAAM,qBAAqB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,2BAA2B,CAAC,CAAC;AAYhF,eAAO,MAAM,sBAAsB;;;;;;;;;;;;;;;;;;;mBAWtB,CAAC;AACd,MAAM,MAAM,gBAAgB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,sBAAsB,CAAC,CAAC;AAEtE,eAAO,MAAM,uBAAuB;;;EAA+B,CAAC;AACpE,MAAM,MAAM,iBAAiB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,uBAAuB,CAAC,CAAC;AAExE,QAAA,MAAM,kBAAkB,EAAE,OAAO,MAAiD,CAAC;AACnF,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,CAAC,kBAAkB,CAAC,EAAE,IAAI,CAAC;CACrC;AAED,MAAM,WAAW,kBAAkB,CAAC,MAAM,SAAS,MAAM;IACvD,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,KAAK,EAAE,iBAAiB,CAAC;CACnC;AAED,MAAM,WAAW,iCAAiC;IAChD,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC;IACxB,QAAQ,CAAC,QAAQ,EAAE,gBAAgB,CAAC;CACrC;AAED,MAAM,WAAW,wBAAwB,CAAC,OAAO,SAAS,SAAS,MAAM,EAAE;IACzE,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;IACzB,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,GAAG,CAAC,EAAE,MAAM,IAAI,CAAC;IACjB,iBAAiB,CAAC,CAAC,OAAO,EAAE,iCAAiC,GAAG,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACtF;AAED,MAAM,WAAW,kBAAkB,CAAC,MAAM,SAAS,MAAM;IACvD,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,iBAAiB,GAAG,aAAa,CAAC;IAC9D,UAAU,CAAC,KAAK,EAAE,aAAa,EAAE,UAAU,EAAE,kBAAkB,CAAC,MAAM,CAAC,GAAG,OAAO,CAAC;IAClF,QAAQ,CAAC,KAAK,EAAE,aAAa,GAAG,OAAO,CAAC;IACxC,IAAI,CAAC,KAAK,EAAE,aAAa,GAAG,OAAO,CAAC;IACpC,WAAW,IAAI,gBAAgB,CAAC;IAChC,iFAAiF;IACjF,SAAS,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE,gBAAgB,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,GAAG,MAAM,IAAI,CAAC;CACvF;AA8BD,wBAAgB,wBAAwB,CAAC,KAAK,CAAC,OAAO,SAAS,SAAS,MAAM,EAAE,EAC9E,MAAM,EAAE,wBAAwB,CAAC,OAAO,CAAC,GACxC,kBAAkB,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAoHrC"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import type { ObservabilitySinkStatus } from '../observability/status';
|
|
3
|
+
import { type ApplicationSnapshot } from './schemas';
|
|
4
|
+
export declare const ApplicationLifecycleEventSchema: z.ZodReadonly<z.ZodObject<{
|
|
5
|
+
type: z.ZodLiteral<"application-state">;
|
|
6
|
+
applicationId: z.ZodString;
|
|
7
|
+
epoch: z.ZodString;
|
|
8
|
+
revision: z.ZodNumber;
|
|
9
|
+
lifecycle: z.ZodEnum<{
|
|
10
|
+
created: "created";
|
|
11
|
+
draining: "draining";
|
|
12
|
+
failed: "failed";
|
|
13
|
+
ready: "ready";
|
|
14
|
+
starting: "starting";
|
|
15
|
+
stopped: "stopped";
|
|
16
|
+
stopping: "stopping";
|
|
17
|
+
}>;
|
|
18
|
+
health: z.ZodEnum<{
|
|
19
|
+
degraded: "degraded";
|
|
20
|
+
healthy: "healthy";
|
|
21
|
+
unhealthy: "unhealthy";
|
|
22
|
+
unknown: "unknown";
|
|
23
|
+
}>;
|
|
24
|
+
ready: z.ZodBoolean;
|
|
25
|
+
capturedAt: z.ZodString;
|
|
26
|
+
resources: z.ZodReadonly<z.ZodArray<z.ZodReadonly<z.ZodObject<{
|
|
27
|
+
id: z.ZodString;
|
|
28
|
+
required: z.ZodBoolean;
|
|
29
|
+
dependsOn: z.ZodReadonly<z.ZodArray<z.ZodString>>;
|
|
30
|
+
state: z.ZodEnum<{
|
|
31
|
+
failed: "failed";
|
|
32
|
+
ready: "ready";
|
|
33
|
+
registered: "registered";
|
|
34
|
+
starting: "starting";
|
|
35
|
+
stopped: "stopped";
|
|
36
|
+
stopping: "stopping";
|
|
37
|
+
}>;
|
|
38
|
+
health: z.ZodEnum<{
|
|
39
|
+
degraded: "degraded";
|
|
40
|
+
healthy: "healthy";
|
|
41
|
+
unhealthy: "unhealthy";
|
|
42
|
+
unknown: "unknown";
|
|
43
|
+
}>;
|
|
44
|
+
ready: z.ZodBoolean;
|
|
45
|
+
}, z.core.$strip>>>>;
|
|
46
|
+
}, z.core.$strict>>;
|
|
47
|
+
export type ApplicationLifecycleEvent = z.infer<typeof ApplicationLifecycleEventSchema>;
|
|
48
|
+
export declare function applicationLifecycleEvent(snapshot: ApplicationSnapshot): ApplicationLifecycleEvent;
|
|
49
|
+
export interface ApplicationEventSinkConfig {
|
|
50
|
+
write(event: ApplicationLifecycleEvent): void | Promise<void>;
|
|
51
|
+
maxPending?: number;
|
|
52
|
+
onSinkError?(failure: {
|
|
53
|
+
error: unknown;
|
|
54
|
+
event?: ApplicationLifecycleEvent;
|
|
55
|
+
}): void | Promise<void>;
|
|
56
|
+
}
|
|
57
|
+
export interface ApplicationEventSink {
|
|
58
|
+
publish(snapshot: ApplicationSnapshot): void;
|
|
59
|
+
flush(): Promise<void>;
|
|
60
|
+
getStatus(): ObservabilitySinkStatus;
|
|
61
|
+
close(): Promise<ObservabilitySinkStatus>;
|
|
62
|
+
}
|
|
63
|
+
/** Failure-isolated operator event delivery; canonical truth remains the absolute snapshot. */
|
|
64
|
+
export declare function createApplicationEventSink(config: ApplicationEventSinkConfig): ApplicationEventSink;
|
|
65
|
+
//# sourceMappingURL=events.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"events.d.ts","sourceRoot":"","sources":["../../src/application/events.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,yBAAyB,CAAC;AACvE,OAAO,EAIL,KAAK,mBAAmB,EAEzB,MAAM,WAAW,CAAC;AAEnB,eAAO,MAAM,+BAA+B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;mBAa/B,CAAC;AACd,MAAM,MAAM,yBAAyB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,+BAA+B,CAAC,CAAC;AAExF,wBAAgB,yBAAyB,CACvC,QAAQ,EAAE,mBAAmB,GAC5B,yBAAyB,CAY3B;AAED,MAAM,WAAW,0BAA0B;IACzC,KAAK,CAAC,KAAK,EAAE,yBAAyB,GAAG,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC9D,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,CAAC,OAAO,EAAE;QACpB,KAAK,EAAE,OAAO,CAAC;QACf,KAAK,CAAC,EAAE,yBAAyB,CAAC;KACnC,GAAG,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAC1B;AAED,MAAM,WAAW,oBAAoB;IACnC,OAAO,CAAC,QAAQ,EAAE,mBAAmB,GAAG,IAAI,CAAC;IAC7C,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACvB,SAAS,IAAI,uBAAuB,CAAC;IACrC,KAAK,IAAI,OAAO,CAAC,uBAAuB,CAAC,CAAC;CAC3C;AAED,+FAA+F;AAC/F,wBAAgB,0BAA0B,CACxC,MAAM,EAAE,0BAA0B,GACjC,oBAAoB,CActB"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { type Bot, Context, type PollingOptions, type WebhookReplyEnvelope } from 'grammy';
|
|
2
|
+
import { type ManagedResource } from './resource';
|
|
3
|
+
export interface GrammyPollingResourceConfig<C extends Context> {
|
|
4
|
+
readonly id: string;
|
|
5
|
+
readonly bot: Bot<C>;
|
|
6
|
+
readonly dependsOn?: readonly string[];
|
|
7
|
+
readonly required?: boolean;
|
|
8
|
+
readonly polling?: Omit<PollingOptions, 'onStart'>;
|
|
9
|
+
readonly onStart?: PollingOptions['onStart'];
|
|
10
|
+
readonly onError?: (error: unknown) => void | Promise<void>;
|
|
11
|
+
}
|
|
12
|
+
/** Thin lifecycle adapter for grammY's built-in long polling. */
|
|
13
|
+
export declare function grammyPollingResource<C extends Context>(config: GrammyPollingResourceConfig<C>): ManagedResource;
|
|
14
|
+
export type GrammyUpdate<C extends Context = Context> = Parameters<Bot<C>['handleUpdate']>[0];
|
|
15
|
+
export interface GrammyWebhookResourceConfig<C extends Context> {
|
|
16
|
+
readonly id: string;
|
|
17
|
+
readonly bot: Bot<C>;
|
|
18
|
+
readonly dependsOn?: readonly string[];
|
|
19
|
+
readonly required?: boolean;
|
|
20
|
+
readonly onError?: (error: unknown) => void | Promise<void>;
|
|
21
|
+
}
|
|
22
|
+
export interface GrammyWebhookResource<C extends Context> {
|
|
23
|
+
readonly resource: ManagedResource;
|
|
24
|
+
handleUpdate(update: GrammyUpdate<C>, webhookReplyEnvelope?: WebhookReplyEnvelope): Promise<void>;
|
|
25
|
+
}
|
|
26
|
+
export declare class GrammyWebhookUnavailableError extends Error {
|
|
27
|
+
readonly code = "GRAMMY_WEBHOOK_NOT_ACCEPTING";
|
|
28
|
+
constructor();
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Create a managed admission gate around an injected grammY webhook bot.
|
|
32
|
+
* HTTP parsing, webhook hosting and Telegram payload persistence remain outside Stitchkit.
|
|
33
|
+
*/
|
|
34
|
+
export declare function createGrammyWebhookResource<C extends Context>(config: GrammyWebhookResourceConfig<C>): GrammyWebhookResource<C>;
|
|
35
|
+
//# sourceMappingURL=grammy.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"grammy.d.ts","sourceRoot":"","sources":["../../src/application/grammy.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,GAAG,EAAE,OAAO,EAAE,KAAK,cAAc,EAAE,KAAK,oBAAoB,EAAE,MAAM,QAAQ,CAAC;AAC3F,OAAO,EAAyB,KAAK,eAAe,EAAE,MAAM,YAAY,CAAC;AAMzE,MAAM,WAAW,2BAA2B,CAAC,CAAC,SAAS,OAAO;IAC5D,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC;IACrB,QAAQ,CAAC,SAAS,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACvC,QAAQ,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAC;IAC5B,QAAQ,CAAC,OAAO,CAAC,EAAE,IAAI,CAAC,cAAc,EAAE,SAAS,CAAC,CAAC;IACnD,QAAQ,CAAC,OAAO,CAAC,EAAE,cAAc,CAAC,SAAS,CAAC,CAAC;IAC7C,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAC7D;AAcD,iEAAiE;AACjE,wBAAgB,qBAAqB,CAAC,CAAC,SAAS,OAAO,EACrD,MAAM,EAAE,2BAA2B,CAAC,CAAC,CAAC,GACrC,eAAe,CAiEjB;AAED,MAAM,MAAM,YAAY,CAAC,CAAC,SAAS,OAAO,GAAG,OAAO,IAAI,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAE9F,MAAM,WAAW,2BAA2B,CAAC,CAAC,SAAS,OAAO;IAC5D,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC;IACrB,QAAQ,CAAC,SAAS,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACvC,QAAQ,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAC;IAC5B,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAC7D;AAED,MAAM,WAAW,qBAAqB,CAAC,CAAC,SAAS,OAAO;IACtD,QAAQ,CAAC,QAAQ,EAAE,eAAe,CAAC;IACnC,YAAY,CACV,MAAM,EAAE,YAAY,CAAC,CAAC,CAAC,EACvB,oBAAoB,CAAC,EAAE,oBAAoB,GAC1C,OAAO,CAAC,IAAI,CAAC,CAAC;CAClB;AAED,qBAAa,6BAA8B,SAAQ,KAAK;IACtD,QAAQ,CAAC,IAAI,kCAAkC;IAE/C,cAGC;CACF;AAED;;;GAGG;AACH,wBAAgB,2BAA2B,CAAC,CAAC,SAAS,OAAO,EAC3D,MAAM,EAAE,2BAA2B,CAAC,CAAC,CAAC,GACrC,qBAAqB,CAAC,CAAC,CAAC,CAiE1B"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { ManagedResource } from './resource';
|
|
2
|
+
export interface ResolvedManagedResource {
|
|
3
|
+
readonly resource: ManagedResource;
|
|
4
|
+
readonly id: string;
|
|
5
|
+
readonly dependsOn: readonly string[];
|
|
6
|
+
readonly required: boolean;
|
|
7
|
+
readonly declarationIndex: number;
|
|
8
|
+
}
|
|
9
|
+
/** Validate the whole graph before any side effect and return stable topological order. */
|
|
10
|
+
export declare function resolveResourceGraph(resources: readonly ManagedResource[]): readonly ResolvedManagedResource[];
|
|
11
|
+
//# sourceMappingURL=graph.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"graph.d.ts","sourceRoot":"","sources":["../../src/application/graph.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAGlD,MAAM,WAAW,uBAAuB;IACtC,QAAQ,CAAC,QAAQ,EAAE,eAAe,CAAC;IACnC,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,SAAS,EAAE,SAAS,MAAM,EAAE,CAAC;IACtC,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;IAC3B,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAC;CACnC;AAED,2FAA2F;AAC3F,wBAAgB,oBAAoB,CAClC,SAAS,EAAE,SAAS,eAAe,EAAE,GACpC,SAAS,uBAAuB,EAAE,CAkDpC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import type { ApplicationHandle } from './kernel';
|
|
3
|
+
export declare const ApplicationHealthHandlerOptionsSchema: z.ZodObject<{
|
|
4
|
+
kind: z.ZodEnum<{
|
|
5
|
+
liveness: "liveness";
|
|
6
|
+
readiness: "readiness";
|
|
7
|
+
}>;
|
|
8
|
+
retryAfterSeconds: z.ZodDefault<z.ZodNumber>;
|
|
9
|
+
}, z.core.$strip>;
|
|
10
|
+
export type ApplicationHealthHandlerOptions = z.input<typeof ApplicationHealthHandlerOptionsSchema>;
|
|
11
|
+
/** Fetch-clean liveness/readiness response with only the sanitized application snapshot. */
|
|
12
|
+
export declare function createApplicationHealthHandler(application: Pick<ApplicationHandle, 'getSnapshot'>, options: ApplicationHealthHandlerOptions): () => Response;
|
|
13
|
+
//# sourceMappingURL=health.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"health.d.ts","sourceRoot":"","sources":["../../src/application/health.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAC;AAElD,eAAO,MAAM,qCAAqC;;;;;;iBAGhD,CAAC;AACH,MAAM,MAAM,+BAA+B,GAAG,CAAC,CAAC,KAAK,CACnD,OAAO,qCAAqC,CAC7C,CAAC;AAEF,4FAA4F;AAC5F,wBAAgB,8BAA8B,CAC5C,WAAW,EAAE,IAAI,CAAC,iBAAiB,EAAE,aAAa,CAAC,EACnD,OAAO,EAAE,+BAA+B,GACvC,MAAM,QAAQ,CAahB"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import type { ShutdownOptions } from '../server/shutdown';
|
|
2
|
+
import type { ManagedResource } from './resource';
|
|
3
|
+
import { type ApplicationShutdownResult, type ApplicationSnapshot } from './schemas';
|
|
4
|
+
export interface ApplicationConfig {
|
|
5
|
+
readonly id: string;
|
|
6
|
+
readonly resources?: readonly ManagedResource[];
|
|
7
|
+
readonly onSnapshot?: (snapshot: ApplicationSnapshot) => void | Promise<void>;
|
|
8
|
+
}
|
|
9
|
+
export interface ApplicationOperationLease {
|
|
10
|
+
readonly released: boolean;
|
|
11
|
+
release(): void;
|
|
12
|
+
}
|
|
13
|
+
export interface ApplicationAdmission {
|
|
14
|
+
acquire(): ApplicationOperationLease | null;
|
|
15
|
+
run<T>(work: () => T | Promise<T>): Promise<T>;
|
|
16
|
+
}
|
|
17
|
+
export interface ApplicationHandle {
|
|
18
|
+
readonly id: string;
|
|
19
|
+
readonly admission: ApplicationAdmission;
|
|
20
|
+
start(): Promise<ApplicationSnapshot>;
|
|
21
|
+
getSnapshot(): ApplicationSnapshot;
|
|
22
|
+
subscribe(listener: (snapshot: ApplicationSnapshot) => void): () => void;
|
|
23
|
+
shutdown(options?: ShutdownOptions): Promise<ApplicationShutdownResult>;
|
|
24
|
+
}
|
|
25
|
+
export declare class ApplicationAdmissionError extends Error {
|
|
26
|
+
readonly code = "APPLICATION_NOT_ACCEPTING";
|
|
27
|
+
constructor();
|
|
28
|
+
}
|
|
29
|
+
/** Compose process-local resources into one deterministic application lifetime. */
|
|
30
|
+
export declare function createApplication(config: ApplicationConfig): ApplicationHandle;
|
|
31
|
+
//# sourceMappingURL=kernel.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"kernel.d.ts","sourceRoot":"","sources":["../../src/application/kernel.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAG1D,OAAO,KAAK,EACV,eAAe,EAGhB,MAAM,YAAY,CAAC;AACpB,OAAO,EAKL,KAAK,yBAAyB,EAE9B,KAAK,mBAAmB,EAGzB,MAAM,WAAW,CAAC;AAyBnB,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,SAAS,CAAC,EAAE,SAAS,eAAe,EAAE,CAAC;IAChD,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC,QAAQ,EAAE,mBAAmB,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAC/E;AAED,MAAM,WAAW,yBAAyB;IACxC,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;IAC3B,OAAO,IAAI,IAAI,CAAC;CACjB;AAED,MAAM,WAAW,oBAAoB;IACnC,OAAO,IAAI,yBAAyB,GAAG,IAAI,CAAC;IAC5C,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;CAChD;AAED,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,SAAS,EAAE,oBAAoB,CAAC;IACzC,KAAK,IAAI,OAAO,CAAC,mBAAmB,CAAC,CAAC;IACtC,WAAW,IAAI,mBAAmB,CAAC;IACnC,SAAS,CAAC,QAAQ,EAAE,CAAC,QAAQ,EAAE,mBAAmB,KAAK,IAAI,GAAG,MAAM,IAAI,CAAC;IACzE,QAAQ,CAAC,OAAO,CAAC,EAAE,eAAe,GAAG,OAAO,CAAC,yBAAyB,CAAC,CAAC;CACzE;AAED,qBAAa,yBAA0B,SAAQ,KAAK;IAClD,QAAQ,CAAC,IAAI,+BAA+B;IAE5C,cAGC;CACF;AA2BD,mFAAmF;AACnF,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,iBAAiB,GAAG,iBAAiB,CAwlB9E"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
export declare const ApplicationSnapshotSinkStatusSchema: z.ZodReadonly<z.ZodObject<{
|
|
3
|
+
accepting: z.ZodBoolean;
|
|
4
|
+
received: z.ZodNumber;
|
|
5
|
+
accepted: z.ZodNumber;
|
|
6
|
+
rejected: z.ZodNumber;
|
|
7
|
+
delivered: z.ZodNumber;
|
|
8
|
+
coalesced: z.ZodNumber;
|
|
9
|
+
failed: z.ZodNumber;
|
|
10
|
+
inFlight: z.ZodBoolean;
|
|
11
|
+
pending: z.ZodBoolean;
|
|
12
|
+
lastAcceptedRevision: z.ZodOptional<z.ZodNumber>;
|
|
13
|
+
lastDeliveredRevision: z.ZodOptional<z.ZodNumber>;
|
|
14
|
+
}, z.core.$strict>>;
|
|
15
|
+
export type ApplicationSnapshotSinkStatus = z.infer<typeof ApplicationSnapshotSinkStatusSchema>;
|
|
16
|
+
export interface RevisionedApplicationSnapshot {
|
|
17
|
+
readonly revision: number;
|
|
18
|
+
}
|
|
19
|
+
export interface ApplicationSnapshotSinkError<TSnapshot> {
|
|
20
|
+
readonly error: unknown;
|
|
21
|
+
readonly snapshot: TSnapshot;
|
|
22
|
+
}
|
|
23
|
+
export interface ApplicationSnapshotSinkConfig<TSnapshot extends RevisionedApplicationSnapshot> {
|
|
24
|
+
write(snapshot: TSnapshot): void | Promise<void>;
|
|
25
|
+
onSinkError?(failure: ApplicationSnapshotSinkError<TSnapshot>): void | Promise<void>;
|
|
26
|
+
}
|
|
27
|
+
export interface ApplicationSnapshotSink<TSnapshot extends RevisionedApplicationSnapshot> {
|
|
28
|
+
/** Admit a newer absolute snapshot. Returns false after close or for a stale revision. */
|
|
29
|
+
publish(snapshot: TSnapshot): boolean;
|
|
30
|
+
getStatus(): ApplicationSnapshotSinkStatus;
|
|
31
|
+
/** Close admission and deliver the newest snapshot accepted before this boundary. */
|
|
32
|
+
close(): Promise<ApplicationSnapshotSinkStatus>;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Deliver absolute state without growing a queue: one write runs while one newer
|
|
36
|
+
* revision may wait, and that pending value is replaced by every still-newer one.
|
|
37
|
+
*/
|
|
38
|
+
export declare function createApplicationSnapshotSink<TSnapshot extends RevisionedApplicationSnapshot>(config: ApplicationSnapshotSinkConfig<TSnapshot>): ApplicationSnapshotSink<TSnapshot>;
|
|
39
|
+
//# sourceMappingURL=latest-sink.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"latest-sink.d.ts","sourceRoot":"","sources":["../../src/application/latest-sink.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB,eAAO,MAAM,mCAAmC;;;;;;;;;;;;mBAenC,CAAC;AACd,MAAM,MAAM,6BAA6B,GAAG,CAAC,CAAC,KAAK,CACjD,OAAO,mCAAmC,CAC3C,CAAC;AAEF,MAAM,WAAW,6BAA6B;IAC5C,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;CAC3B;AAED,MAAM,WAAW,4BAA4B,CAAC,SAAS;IACrD,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC;IACxB,QAAQ,CAAC,QAAQ,EAAE,SAAS,CAAC;CAC9B;AAED,MAAM,WAAW,6BAA6B,CAC5C,SAAS,SAAS,6BAA6B;IAE/C,KAAK,CAAC,QAAQ,EAAE,SAAS,GAAG,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACjD,WAAW,CAAC,CAAC,OAAO,EAAE,4BAA4B,CAAC,SAAS,CAAC,GAAG,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACtF;AAED,MAAM,WAAW,uBAAuB,CAAC,SAAS,SAAS,6BAA6B;IACtF,0FAA0F;IAC1F,OAAO,CAAC,QAAQ,EAAE,SAAS,GAAG,OAAO,CAAC;IACtC,SAAS,IAAI,6BAA6B,CAAC;IAC3C,qFAAqF;IACrF,KAAK,IAAI,OAAO,CAAC,6BAA6B,CAAC,CAAC;CACjD;AAED;;;GAGG;AACH,wBAAgB,6BAA6B,CAAC,SAAS,SAAS,6BAA6B,EAC3F,MAAM,EAAE,6BAA6B,CAAC,SAAS,CAAC,GAC/C,uBAAuB,CAAC,SAAS,CAAC,CAiGpC"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import type { ApplicationHealth } from './schemas';
|
|
2
|
+
export interface ManagedResourceContext {
|
|
3
|
+
readonly applicationId: string;
|
|
4
|
+
readonly signal: AbortSignal;
|
|
5
|
+
readonly deadlineAt?: number;
|
|
6
|
+
readonly forceDeadlineAt?: number;
|
|
7
|
+
now(): number;
|
|
8
|
+
reportHealth(health: Exclude<ApplicationHealth, 'unknown'>): void;
|
|
9
|
+
}
|
|
10
|
+
export interface ManagedResourceStartResult {
|
|
11
|
+
/** Resolves when the resource is ready for dependants. */
|
|
12
|
+
readonly ready?: Promise<void>;
|
|
13
|
+
/** Long-lived completion; settling before shutdown marks the resource unhealthy. */
|
|
14
|
+
readonly completion?: Promise<void>;
|
|
15
|
+
}
|
|
16
|
+
export interface ManagedResource {
|
|
17
|
+
readonly id: string;
|
|
18
|
+
readonly dependsOn?: readonly string[];
|
|
19
|
+
readonly required?: boolean;
|
|
20
|
+
start(context: ManagedResourceContext): void | ManagedResourceStartResult | Promise<void> | Promise<ManagedResourceStartResult | undefined>;
|
|
21
|
+
/** Runs only after the whole required graph reached readiness. */
|
|
22
|
+
activate?(context: ManagedResourceContext): void | Promise<void>;
|
|
23
|
+
stopAdmission?(context: ManagedResourceContext): void | Promise<void>;
|
|
24
|
+
drain?(context: ManagedResourceContext): void | Promise<void>;
|
|
25
|
+
/** Must be safe after any invoked start, including a rejected partial start. */
|
|
26
|
+
close?(context: ManagedResourceContext): void | Promise<void>;
|
|
27
|
+
force?(context: ManagedResourceContext): void | Promise<void>;
|
|
28
|
+
}
|
|
29
|
+
export declare function defineManagedResource<const TResource extends ManagedResource>(resource: TResource): TResource;
|
|
30
|
+
//# sourceMappingURL=resource.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resource.d.ts","sourceRoot":"","sources":["../../src/application/resource.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAC;AAEnD,MAAM,WAAW,sBAAsB;IACrC,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAC;IAC7B,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,eAAe,CAAC,EAAE,MAAM,CAAC;IAClC,GAAG,IAAI,MAAM,CAAC;IACd,YAAY,CAAC,MAAM,EAAE,OAAO,CAAC,iBAAiB,EAAE,SAAS,CAAC,GAAG,IAAI,CAAC;CACnE;AAED,MAAM,WAAW,0BAA0B;IACzC,0DAA0D;IAC1D,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;IAC/B,oFAAoF;IACpF,QAAQ,CAAC,UAAU,CAAC,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;CACrC;AAED,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,SAAS,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACvC,QAAQ,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAC;IAC5B,KAAK,CACH,OAAO,EAAE,sBAAsB,GAE7B,IAAI,GACJ,0BAA0B,GAC1B,OAAO,CAAC,IAAI,CAAC,GACb,OAAO,CAAC,0BAA0B,GAAG,SAAS,CAAC,CAAC;IACpD,kEAAkE;IAClE,QAAQ,CAAC,CAAC,OAAO,EAAE,sBAAsB,GAAG,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACjE,aAAa,CAAC,CAAC,OAAO,EAAE,sBAAsB,GAAG,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACtE,KAAK,CAAC,CAAC,OAAO,EAAE,sBAAsB,GAAG,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC9D,gFAAgF;IAChF,KAAK,CAAC,CAAC,OAAO,EAAE,sBAAsB,GAAG,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC9D,KAAK,CAAC,CAAC,OAAO,EAAE,sBAAsB,GAAG,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAC/D;AAED,wBAAgB,qBAAqB,CAAC,KAAK,CAAC,SAAS,SAAS,eAAe,EAC3E,QAAQ,EAAE,SAAS,GAClB,SAAS,CAEX"}
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import type { ManagedResource } from './resource';
|
|
3
|
+
export declare const ManagedScheduleOverlapSchema: z.ZodDiscriminatedUnion<[z.ZodReadonly<z.ZodObject<{
|
|
4
|
+
mode: z.ZodLiteral<"skip">;
|
|
5
|
+
}, z.core.$strip>>, z.ZodReadonly<z.ZodObject<{
|
|
6
|
+
mode: z.ZodLiteral<"queue-one">;
|
|
7
|
+
}, z.core.$strip>>, z.ZodReadonly<z.ZodObject<{
|
|
8
|
+
mode: z.ZodLiteral<"parallel">;
|
|
9
|
+
maxConcurrent: z.ZodNumber;
|
|
10
|
+
}, z.core.$strip>>], "mode">;
|
|
11
|
+
export type ManagedScheduleOverlap = z.infer<typeof ManagedScheduleOverlapSchema>;
|
|
12
|
+
export declare const ManagedScheduleErrorPolicySchema: z.ZodEnum<{
|
|
13
|
+
continue: "continue";
|
|
14
|
+
"stop-schedule": "stop-schedule";
|
|
15
|
+
}>;
|
|
16
|
+
export type ManagedScheduleErrorPolicy = z.infer<typeof ManagedScheduleErrorPolicySchema>;
|
|
17
|
+
export declare const ManagedScheduleDescriptorSchema: z.ZodReadonly<z.ZodObject<{
|
|
18
|
+
id: z.ZodString;
|
|
19
|
+
everyMs: z.ZodNumber;
|
|
20
|
+
startAfterMs: z.ZodNumber;
|
|
21
|
+
overlap: z.ZodDiscriminatedUnion<[z.ZodReadonly<z.ZodObject<{
|
|
22
|
+
mode: z.ZodLiteral<"skip">;
|
|
23
|
+
}, z.core.$strip>>, z.ZodReadonly<z.ZodObject<{
|
|
24
|
+
mode: z.ZodLiteral<"queue-one">;
|
|
25
|
+
}, z.core.$strip>>, z.ZodReadonly<z.ZodObject<{
|
|
26
|
+
mode: z.ZodLiteral<"parallel">;
|
|
27
|
+
maxConcurrent: z.ZodNumber;
|
|
28
|
+
}, z.core.$strip>>], "mode">;
|
|
29
|
+
errorPolicy: z.ZodEnum<{
|
|
30
|
+
continue: "continue";
|
|
31
|
+
"stop-schedule": "stop-schedule";
|
|
32
|
+
}>;
|
|
33
|
+
}, z.core.$strip>>;
|
|
34
|
+
export type ManagedScheduleDescriptor = z.infer<typeof ManagedScheduleDescriptorSchema>;
|
|
35
|
+
export declare const ManagedScheduleStatusSchema: z.ZodReadonly<z.ZodObject<{
|
|
36
|
+
descriptor: z.ZodReadonly<z.ZodObject<{
|
|
37
|
+
id: z.ZodString;
|
|
38
|
+
everyMs: z.ZodNumber;
|
|
39
|
+
startAfterMs: z.ZodNumber;
|
|
40
|
+
overlap: z.ZodDiscriminatedUnion<[z.ZodReadonly<z.ZodObject<{
|
|
41
|
+
mode: z.ZodLiteral<"skip">;
|
|
42
|
+
}, z.core.$strip>>, z.ZodReadonly<z.ZodObject<{
|
|
43
|
+
mode: z.ZodLiteral<"queue-one">;
|
|
44
|
+
}, z.core.$strip>>, z.ZodReadonly<z.ZodObject<{
|
|
45
|
+
mode: z.ZodLiteral<"parallel">;
|
|
46
|
+
maxConcurrent: z.ZodNumber;
|
|
47
|
+
}, z.core.$strip>>], "mode">;
|
|
48
|
+
errorPolicy: z.ZodEnum<{
|
|
49
|
+
continue: "continue";
|
|
50
|
+
"stop-schedule": "stop-schedule";
|
|
51
|
+
}>;
|
|
52
|
+
}, z.core.$strip>>;
|
|
53
|
+
state: z.ZodEnum<{
|
|
54
|
+
draining: "draining";
|
|
55
|
+
inactive: "inactive";
|
|
56
|
+
running: "running";
|
|
57
|
+
scheduled: "scheduled";
|
|
58
|
+
stopped: "stopped";
|
|
59
|
+
}>;
|
|
60
|
+
revision: z.ZodNumber;
|
|
61
|
+
capturedAt: z.ZodString;
|
|
62
|
+
changedAt: z.ZodString;
|
|
63
|
+
accepting: z.ZodBoolean;
|
|
64
|
+
active: z.ZodNumber;
|
|
65
|
+
queued: z.ZodBoolean;
|
|
66
|
+
runsStarted: z.ZodNumber;
|
|
67
|
+
runsCompleted: z.ZodNumber;
|
|
68
|
+
runsFailed: z.ZodNumber;
|
|
69
|
+
ticksSkipped: z.ZodNumber;
|
|
70
|
+
nextRunAt: z.ZodNullable<z.ZodString>;
|
|
71
|
+
lastScheduledAt: z.ZodNullable<z.ZodString>;
|
|
72
|
+
lastStartedAt: z.ZodNullable<z.ZodString>;
|
|
73
|
+
lastFinishedAt: z.ZodNullable<z.ZodString>;
|
|
74
|
+
}, z.core.$strip>>;
|
|
75
|
+
export type ManagedScheduleStatus = z.infer<typeof ManagedScheduleStatusSchema>;
|
|
76
|
+
export interface ManagedScheduleTimer {
|
|
77
|
+
cancel(): void;
|
|
78
|
+
}
|
|
79
|
+
/** Monotonic timer boundary. Tests can replace it without changing schedule semantics. */
|
|
80
|
+
export interface ManagedScheduleClock {
|
|
81
|
+
/** Monotonic clock used for cadence and deadline arithmetic. */
|
|
82
|
+
now(): number;
|
|
83
|
+
/** Wall clock used only to project portable status timestamps. */
|
|
84
|
+
wallNow(): Date;
|
|
85
|
+
schedule(callback: () => void, delayMs: number): ManagedScheduleTimer;
|
|
86
|
+
}
|
|
87
|
+
export interface ManagedScheduleRunContext {
|
|
88
|
+
readonly applicationId: string;
|
|
89
|
+
readonly signal: AbortSignal;
|
|
90
|
+
readonly scheduledAt: number;
|
|
91
|
+
readonly startedAt: number;
|
|
92
|
+
now(): number;
|
|
93
|
+
}
|
|
94
|
+
export interface ManagedScheduleConfig {
|
|
95
|
+
readonly id: string;
|
|
96
|
+
readonly dependsOn?: readonly string[];
|
|
97
|
+
readonly required?: boolean;
|
|
98
|
+
readonly everyMs: number;
|
|
99
|
+
/** Defaults to one interval. A zero value schedules the first run after activation. */
|
|
100
|
+
readonly startAfterMs?: number;
|
|
101
|
+
readonly overlap?: ManagedScheduleOverlap;
|
|
102
|
+
readonly errorPolicy?: ManagedScheduleErrorPolicy;
|
|
103
|
+
readonly run: (context: ManagedScheduleRunContext) => void | Promise<void>;
|
|
104
|
+
readonly onError?: (error: unknown, context: ManagedScheduleRunContext) => void | Promise<void>;
|
|
105
|
+
readonly clock?: ManagedScheduleClock;
|
|
106
|
+
}
|
|
107
|
+
export interface ManagedSchedule extends ManagedResource {
|
|
108
|
+
readonly status: ManagedScheduleStatus;
|
|
109
|
+
}
|
|
110
|
+
/** Create one fixed-rate, process-local periodic application resource. */
|
|
111
|
+
export declare function createManagedSchedule(config: ManagedScheduleConfig): ManagedSchedule;
|
|
112
|
+
//# sourceMappingURL=schedule.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schedule.d.ts","sourceRoot":"","sources":["../../src/application/schedule.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,EAAE,eAAe,EAA0B,MAAM,YAAY,CAAC;AAa1E,eAAO,MAAM,4BAA4B;;;;;;;4BASvC,CAAC;AACH,MAAM,MAAM,sBAAsB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,4BAA4B,CAAC,CAAC;AAElF,eAAO,MAAM,gCAAgC;;;EAAwC,CAAC;AACtF,MAAM,MAAM,0BAA0B,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,gCAAgC,CAAC,CAAC;AAE1F,eAAO,MAAM,+BAA+B;;;;;;;;;;;;;;;;kBAQ/B,CAAC;AACd,MAAM,MAAM,yBAAyB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,+BAA+B,CAAC,CAAC;AAExF,eAAO,MAAM,2BAA2B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;kBAmB3B,CAAC;AACd,MAAM,MAAM,qBAAqB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,2BAA2B,CAAC,CAAC;AAEhF,MAAM,WAAW,oBAAoB;IACnC,MAAM,IAAI,IAAI,CAAC;CAChB;AAED,0FAA0F;AAC1F,MAAM,WAAW,oBAAoB;IACnC,gEAAgE;IAChE,GAAG,IAAI,MAAM,CAAC;IACd,kEAAkE;IAClE,OAAO,IAAI,IAAI,CAAC;IAChB,QAAQ,CAAC,QAAQ,EAAE,MAAM,IAAI,EAAE,OAAO,EAAE,MAAM,GAAG,oBAAoB,CAAC;CACvE;AAWD,MAAM,WAAW,yBAAyB;IACxC,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAC;IAC7B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,GAAG,IAAI,MAAM,CAAC;CACf;AAED,MAAM,WAAW,qBAAqB;IACpC,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,SAAS,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACvC,QAAQ,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAC;IAC5B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,uFAAuF;IACvF,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,OAAO,CAAC,EAAE,sBAAsB,CAAC;IAC1C,QAAQ,CAAC,WAAW,CAAC,EAAE,0BAA0B,CAAC;IAClD,QAAQ,CAAC,GAAG,EAAE,CAAC,OAAO,EAAE,yBAAyB,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC3E,QAAQ,CAAC,OAAO,CAAC,EAAE,CACjB,KAAK,EAAE,OAAO,EACd,OAAO,EAAE,yBAAyB,KAC/B,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1B,QAAQ,CAAC,KAAK,CAAC,EAAE,oBAAoB,CAAC;CACvC;AAED,MAAM,WAAW,eAAgB,SAAQ,eAAe;IACtD,QAAQ,CAAC,MAAM,EAAE,qBAAqB,CAAC;CACxC;AAID,0EAA0E;AAC1E,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,qBAAqB,GAAG,eAAe,CA0QpF"}
|