stitchkit 0.59.0 → 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.
Files changed (61) hide show
  1. package/README.md +44 -4
  2. package/dist/agent-runtime/runtime.d.ts.map +1 -1
  3. package/dist/agent-runtime/terminal-commit.d.ts +102 -0
  4. package/dist/agent-runtime/terminal-commit.d.ts.map +1 -0
  5. package/dist/agent-runtime.js +143 -46
  6. package/dist/application/activity.d.ts +70 -0
  7. package/dist/application/activity.d.ts.map +1 -0
  8. package/dist/application/events.d.ts +65 -0
  9. package/dist/application/events.d.ts.map +1 -0
  10. package/dist/application/grammy.d.ts +35 -0
  11. package/dist/application/grammy.d.ts.map +1 -0
  12. package/dist/application/graph.d.ts +11 -0
  13. package/dist/application/graph.d.ts.map +1 -0
  14. package/dist/application/health.d.ts +13 -0
  15. package/dist/application/health.d.ts.map +1 -0
  16. package/dist/application/kernel.d.ts +31 -0
  17. package/dist/application/kernel.d.ts.map +1 -0
  18. package/dist/application/latest-sink.d.ts +39 -0
  19. package/dist/application/latest-sink.d.ts.map +1 -0
  20. package/dist/application/resource.d.ts +30 -0
  21. package/dist/application/resource.d.ts.map +1 -0
  22. package/dist/application/schedule.d.ts +112 -0
  23. package/dist/application/schedule.d.ts.map +1 -0
  24. package/dist/application/schemas.d.ts +160 -0
  25. package/dist/application/schemas.d.ts.map +1 -0
  26. package/dist/application/server-resource.d.ts +12 -0
  27. package/dist/application/server-resource.d.ts.map +1 -0
  28. package/dist/application-grammy.d.ts +2 -0
  29. package/dist/application-grammy.d.ts.map +1 -0
  30. package/dist/application-grammy.js +165 -0
  31. package/dist/application.d.ts +10 -0
  32. package/dist/application.d.ts.map +1 -0
  33. package/dist/application.js +1370 -0
  34. package/dist/cli.d.ts +1 -0
  35. package/dist/cli.d.ts.map +1 -1
  36. package/dist/cli.js +1 -1
  37. package/dist/{index-zk5zn2nh.js → index-3nwng7hs.js} +287 -38
  38. package/dist/index-dk6e56g0.js +211 -0
  39. package/dist/{index-9zn9fb4e.js → index-he4psyve.js} +6 -213
  40. package/dist/index-yr276yz0.js +6 -0
  41. package/dist/internal/fetch-port.d.ts +2 -0
  42. package/dist/internal/fetch-port.d.ts.map +1 -0
  43. package/dist/node.js +115 -13
  44. package/dist/server/index.js +8 -6
  45. package/dist/server/node.d.ts.map +1 -1
  46. package/dist/server/process-signals.d.ts +10 -8
  47. package/dist/server/process-signals.d.ts.map +1 -1
  48. package/dist/tools/cli-args.d.ts +16 -0
  49. package/dist/tools/cli-args.d.ts.map +1 -1
  50. package/dist/tools/cli-command.d.ts +16 -0
  51. package/dist/tools/cli-command.d.ts.map +1 -1
  52. package/dist/tools/cli-policy.d.ts +22 -0
  53. package/dist/tools/cli-policy.d.ts.map +1 -0
  54. package/dist/tools/cli.d.ts +2 -1
  55. package/dist/tools/cli.d.ts.map +1 -1
  56. package/dist/tools.d.ts +1 -0
  57. package/dist/tools.d.ts.map +1 -1
  58. package/dist/tools.js +1 -1
  59. package/llms-full.txt +471 -14
  60. package/llms.txt +1 -0
  61. 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 behind
94
- `stitchkit/server`, `stitchkit/tools`, `stitchkit/agent-runtime` and
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) ·
@@ -1 +1 @@
1
- {"version":3,"file":"runtime.d.ts","sourceRoot":"","sources":["../../src/agent-runtime/runtime.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"runtime.d.ts","sourceRoot":"","sources":["../../src/agent-runtime/runtime.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,102 @@
1
+ import { type AgentMessage, type AgentRun, type AgentSnapshot, type AgentTerminalReason } from './schemas';
2
+ import type { AgentRuntimeStore, AgentStoreMutationResult } from './store';
3
+ export declare class AgentRuntimeConflictError extends Error {
4
+ constructor(operation: string);
5
+ }
6
+ export declare function appliedSnapshot(result: AgentStoreMutationResult, operation: string): {
7
+ schemaVersion: 1;
8
+ conversationId: string;
9
+ version: number;
10
+ messages: {
11
+ schemaVersion: 1;
12
+ id: string;
13
+ conversationId: string;
14
+ runId?: string | undefined;
15
+ role: "assistant" | "summary" | "system" | "user";
16
+ status: "committed" | "completed" | "failed" | "interrupted" | "streaming";
17
+ parts: ({
18
+ type: "text";
19
+ text: string;
20
+ } | {
21
+ type: "reasoning";
22
+ text: string;
23
+ provider?: {
24
+ schemaVersion: number;
25
+ provider: string;
26
+ data: Record<string, import("zod").JSONType>;
27
+ } | undefined;
28
+ } | {
29
+ type: "file";
30
+ mediaType: string;
31
+ reference: string;
32
+ filename?: string | undefined;
33
+ } | {
34
+ type: "source";
35
+ sourceId: string;
36
+ url?: string | undefined;
37
+ title?: string | undefined;
38
+ } | {
39
+ type: "tool-call";
40
+ callId: string;
41
+ toolName: string;
42
+ input: import("zod").JSONType;
43
+ provider?: {
44
+ schemaVersion: number;
45
+ provider: string;
46
+ data: Record<string, import("zod").JSONType>;
47
+ } | undefined;
48
+ } | {
49
+ type: "tool-result";
50
+ callId: string;
51
+ toolName: string;
52
+ outcome: "error" | "interrupted" | "success";
53
+ output?: import("zod").JSONType | undefined;
54
+ } | {
55
+ type: "provider";
56
+ envelope: {
57
+ schemaVersion: number;
58
+ provider: string;
59
+ data: Record<string, import("zod").JSONType>;
60
+ };
61
+ } | {
62
+ type: "control";
63
+ reason: "run-interrupted" | "stale-run";
64
+ })[];
65
+ metadata?: Record<string, import("zod").JSONType> | undefined;
66
+ createdAt: string;
67
+ updatedAt: string;
68
+ }[];
69
+ runs: {
70
+ schemaVersion: 1;
71
+ id: string;
72
+ conversationId: string;
73
+ inputMessageIds: string[];
74
+ assistantMessageId: string;
75
+ state: "abandoned" | "cancelled" | "completed" | "failed" | "interrupt_requested" | "interrupted" | "queued" | "running";
76
+ revision: number;
77
+ ownerId?: string | undefined;
78
+ fencingToken?: number | undefined;
79
+ terminalReason?: "abandoned" | "cancelled" | "interrupted" | "policy_stop" | "provider_failure" | "shutdown" | "success" | "timeout" | "tool_failure" | undefined;
80
+ terminalPolicyName?: string | undefined;
81
+ createdAt: string;
82
+ updatedAt: string;
83
+ }[];
84
+ };
85
+ interface TerminalCommitCandidate {
86
+ run: AgentRun;
87
+ assistant: AgentMessage;
88
+ reason: AgentTerminalReason;
89
+ policyName?: string;
90
+ }
91
+ export interface AgentTerminalCommitResolution extends TerminalCommitCandidate {
92
+ snapshot: AgentSnapshot;
93
+ committedByCaller: boolean;
94
+ }
95
+ export declare function commitAgentRunTerminal(input: {
96
+ store: AgentRuntimeStore;
97
+ runtimeEpoch: string;
98
+ candidate: TerminalCommitCandidate;
99
+ now: () => Date;
100
+ }): Promise<AgentTerminalCommitResolution>;
101
+ export {};
102
+ //# sourceMappingURL=terminal-commit.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"terminal-commit.d.ts","sourceRoot":"","sources":["../../src/agent-runtime/terminal-commit.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,YAAY,EAGjB,KAAK,QAAQ,EACb,KAAK,aAAa,EAClB,KAAK,mBAAmB,EACzB,MAAM,WAAW,CAAC;AACnB,OAAO,KAAK,EAAE,iBAAiB,EAAE,wBAAwB,EAAE,MAAM,SAAS,CAAC;AAE3E,qBAAa,yBAA0B,SAAQ,KAAK;IAClD,YAAY,SAAS,EAAE,MAAM,EAG5B;CACF;AAED,wBAAgB,eAAe,CAAC,MAAM,EAAE,wBAAwB,EAAE,SAAS,EAAE,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAGlF;AAED,UAAU,uBAAuB;IAC/B,GAAG,EAAE,QAAQ,CAAC;IACd,SAAS,EAAE,YAAY,CAAC;IACxB,MAAM,EAAE,mBAAmB,CAAC;IAC5B,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAUD,MAAM,WAAW,6BAA8B,SAAQ,uBAAuB;IAC5E,QAAQ,EAAE,aAAa,CAAC;IACxB,iBAAiB,EAAE,OAAO,CAAC;CAC5B;AAuED,wBAAsB,sBAAsB,CAAC,KAAK,EAAE;IAClD,KAAK,EAAE,iBAAiB,CAAC;IACzB,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,uBAAuB,CAAC;IACnC,GAAG,EAAE,MAAM,IAAI,CAAC;CACjB,GAAG,OAAO,CAAC,6BAA6B,CAAC,CA4CzC"}
@@ -900,6 +900,8 @@ import {
900
900
  streamText
901
901
  } from "ai";
902
902
  import { z as z5 } from "zod";
903
+
904
+ // src/agent-runtime/terminal-commit.ts
903
905
  class AgentRuntimeConflictError extends Error {
904
906
  constructor(operation) {
905
907
  super(`Agent runtime store conflict during ${operation}`);
@@ -911,6 +913,94 @@ function appliedSnapshot(result, operation) {
911
913
  return result.snapshot;
912
914
  throw new AgentRuntimeConflictError(operation);
913
915
  }
916
+ function terminalMessageStatus(reason) {
917
+ if (reason === "success" || reason === "policy_stop")
918
+ return "completed";
919
+ if (reason === "interrupted" || reason === "cancelled" || reason === "shutdown") {
920
+ return "interrupted";
921
+ }
922
+ return "failed";
923
+ }
924
+ function canonicalTerminal(snapshot, runId, retainedAssistant) {
925
+ const run = snapshot.runs.find((candidate) => candidate.id === runId);
926
+ if (!run?.terminalReason)
927
+ return;
928
+ const assistant = snapshot.messages.find((message) => message.id === run.assistantMessageId) ?? retainedAssistant;
929
+ if (snapshot.conversationId !== run.conversationId || !assistant || assistant.id !== run.assistantMessageId || assistant.conversationId !== run.conversationId || assistant.runId !== run.id || assistant.role !== "assistant" || assistant.status !== terminalMessageStatus(run.terminalReason)) {
930
+ throw new AgentRuntimeConflictError("terminal result projection");
931
+ }
932
+ return {
933
+ snapshot,
934
+ run,
935
+ assistant,
936
+ reason: run.terminalReason,
937
+ committedByCaller: false,
938
+ ...run.terminalPolicyName && { policyName: run.terminalPolicyName }
939
+ };
940
+ }
941
+ function interruptedCandidate(candidate, run, now) {
942
+ const hasInterruptControl = candidate.assistant.parts.some((part) => part.type === "control" && part.reason === "run-interrupted");
943
+ const parts = hasInterruptControl ? candidate.assistant.parts : [
944
+ ...candidate.assistant.parts,
945
+ AgentMessagePartSchema.parse({ type: "control", reason: "run-interrupted" })
946
+ ];
947
+ return {
948
+ run,
949
+ assistant: AgentMessageSchema.parse({
950
+ ...candidate.assistant,
951
+ status: "interrupted",
952
+ parts,
953
+ updatedAt: now().toISOString()
954
+ }),
955
+ reason: "interrupted"
956
+ };
957
+ }
958
+ function canRetryTerminal(current, previous, runtimeEpoch) {
959
+ return (current.state === "running" || current.state === "interrupt_requested") && current.ownerId === runtimeEpoch && current.fencingToken === previous.fencingToken;
960
+ }
961
+ async function commitAgentRunTerminal(input) {
962
+ let candidate = input.candidate;
963
+ while (true) {
964
+ const committed = await input.store.commitRunTerminal({
965
+ conversationId: candidate.run.conversationId,
966
+ runId: candidate.run.id,
967
+ expectedRevision: candidate.run.revision,
968
+ ownerId: input.runtimeEpoch,
969
+ ...candidate.run.fencingToken !== undefined && {
970
+ fencingToken: candidate.run.fencingToken
971
+ },
972
+ assistant: candidate.assistant,
973
+ reason: candidate.reason,
974
+ ...candidate.policyName && { policyName: candidate.policyName }
975
+ });
976
+ if (committed.outcome === "applied") {
977
+ const terminal2 = canonicalTerminal(committed.snapshot, candidate.run.id);
978
+ if (!terminal2)
979
+ throw new AgentRuntimeConflictError("terminal result projection");
980
+ return { ...terminal2, committedByCaller: true };
981
+ }
982
+ if (committed.outcome === "duplicate") {
983
+ const terminal2 = canonicalTerminal(committed.snapshot, candidate.run.id, committed.assistant);
984
+ if (!terminal2)
985
+ throw new AgentRuntimeConflictError("terminal result projection");
986
+ return terminal2;
987
+ }
988
+ if (committed.outcome !== "conflict") {
989
+ throw new AgentRuntimeConflictError("terminal commit");
990
+ }
991
+ const latest = await input.store.loadSnapshot(candidate.run.conversationId);
992
+ const terminal = canonicalTerminal(latest, candidate.run.id);
993
+ if (terminal)
994
+ return terminal;
995
+ const current = latest.runs.find((run) => run.id === candidate.run.id);
996
+ if (!current || !canRetryTerminal(current, candidate.run, input.runtimeEpoch)) {
997
+ throw new AgentRuntimeConflictError("terminal commit");
998
+ }
999
+ candidate = current.state === "interrupt_requested" ? interruptedCandidate(candidate, current, input.now) : { ...candidate, run: current };
1000
+ }
1001
+ }
1002
+
1003
+ // src/agent-runtime/runtime.ts
914
1004
  function findRun(runs, runId) {
915
1005
  const run = runs.find((candidate) => candidate.id === runId);
916
1006
  if (!run)
@@ -1547,59 +1637,66 @@ function createAgentRuntime(config) {
1547
1637
  parts,
1548
1638
  updatedAt: now().toISOString()
1549
1639
  });
1550
- snapshot = appliedSnapshot(await config.store.commitRunTerminal({
1551
- conversationId: run.conversationId,
1552
- runId: run.id,
1553
- expectedRevision: run.revision,
1554
- ownerId: runtimeEpoch,
1555
- ...run.fencingToken !== undefined && { fencingToken: run.fencingToken },
1556
- assistant,
1557
- reason: terminalReason,
1558
- ...terminalPolicyName && { policyName: terminalPolicyName }
1559
- }), "terminal commit");
1560
- run = findRun(snapshot.runs, run.id);
1561
- const terminalMetrics = {
1640
+ const terminal = await commitAgentRunTerminal({
1641
+ store: config.store,
1642
+ runtimeEpoch,
1643
+ candidate: {
1644
+ run,
1645
+ assistant,
1646
+ reason: terminalReason,
1647
+ ...terminalPolicyName && { policyName: terminalPolicyName }
1648
+ },
1649
+ now
1650
+ });
1651
+ snapshot = terminal.snapshot;
1652
+ run = terminal.run;
1653
+ assistant = terminal.assistant;
1654
+ terminalReason = terminal.reason;
1655
+ terminalPolicyName = terminal.policyName;
1656
+ const terminalMetrics = terminal.committedByCaller ? {
1562
1657
  partial: false,
1563
1658
  durationMs: performance.now() - runStartedAt,
1564
1659
  ...usage && { usage },
1565
1660
  ...firstOutputAt !== undefined && { ttftMs: firstOutputAt - runStartedAt }
1566
- };
1567
- config.observe?.emit({
1568
- schemaVersion: 1,
1569
- eventId: agentDurableEventId("terminal", run.id, snapshot.version),
1570
- type: "run-terminal",
1571
- conversationId: run.conversationId,
1572
- runId: run.id,
1573
- traceId: trace?.traceId ?? generateId(),
1574
- spanId: trace?.spanId ?? generateId(),
1575
- ...trace?.parentSpanId && { parentSpanId: trace.parentSpanId },
1576
- state: run.state,
1577
- terminalReason,
1578
- ...selectedModel && { modelId: selectedModel.descriptor.modelId },
1579
- durationMs: terminalMetrics.durationMs,
1580
- ...usage && { usage },
1581
- ...internalCause !== undefined && { internalCause },
1582
- ...firstOutputAt !== undefined && { ttftMs: firstOutputAt - runStartedAt },
1583
- emittedAt: now().toISOString()
1584
- });
1585
- await publish({
1586
- type: "terminal",
1587
- eventId: agentDurableEventId("terminal", run.id, snapshot.version),
1588
- conversationId: run.conversationId,
1589
- runId: run.id,
1590
- snapshotVersion: snapshot.version,
1591
- reason: terminalReason,
1592
- ...terminalPolicyName && { policyName: terminalPolicyName },
1593
- message: assistant,
1594
- metrics: terminalMetrics,
1595
- emittedAt: now().toISOString()
1596
- });
1661
+ } : undefined;
1662
+ if (terminalMetrics) {
1663
+ config.observe?.emit({
1664
+ schemaVersion: 1,
1665
+ eventId: agentDurableEventId("terminal", run.id, snapshot.version),
1666
+ type: "run-terminal",
1667
+ conversationId: run.conversationId,
1668
+ runId: run.id,
1669
+ traceId: trace?.traceId ?? generateId(),
1670
+ spanId: trace?.spanId ?? generateId(),
1671
+ ...trace?.parentSpanId && { parentSpanId: trace.parentSpanId },
1672
+ state: run.state,
1673
+ terminalReason,
1674
+ ...selectedModel && { modelId: selectedModel.descriptor.modelId },
1675
+ durationMs: terminalMetrics.durationMs,
1676
+ ...usage && { usage },
1677
+ ...internalCause !== undefined && { internalCause },
1678
+ ...firstOutputAt !== undefined && { ttftMs: firstOutputAt - runStartedAt },
1679
+ emittedAt: now().toISOString()
1680
+ });
1681
+ await publish({
1682
+ type: "terminal",
1683
+ eventId: agentDurableEventId("terminal", run.id, snapshot.version),
1684
+ conversationId: run.conversationId,
1685
+ runId: run.id,
1686
+ snapshotVersion: snapshot.version,
1687
+ reason: terminalReason,
1688
+ ...terminalPolicyName && { policyName: terminalPolicyName },
1689
+ message: assistant,
1690
+ metrics: terminalMetrics,
1691
+ emittedAt: now().toISOString()
1692
+ });
1693
+ }
1597
1694
  return {
1598
1695
  run,
1599
1696
  message: assistant,
1600
1697
  reason: terminalReason,
1601
1698
  snapshotVersion: snapshot.version,
1602
- metrics: terminalMetrics,
1699
+ ...terminalMetrics && { metrics: terminalMetrics },
1603
1700
  ...terminalPolicyName && { policyName: terminalPolicyName }
1604
1701
  };
1605
1702
  };
@@ -2175,7 +2272,7 @@ function terminalState(reason) {
2175
2272
  return "abandoned";
2176
2273
  return "failed";
2177
2274
  }
2178
- function terminalMessageStatus(reason) {
2275
+ function terminalMessageStatus2(reason) {
2179
2276
  if (reason === "success" || reason === "policy_stop")
2180
2277
  return "completed";
2181
2278
  if (reason === "interrupted" || reason === "cancelled" || reason === "shutdown") {
@@ -2343,7 +2440,7 @@ function reduceStore(current, operation) {
2343
2440
  }
2344
2441
  if (operation.type === "terminal" && run) {
2345
2442
  const input = operation.input;
2346
- if (run.revision !== input.expectedRevision || run.state !== "running" && run.state !== "interrupt_requested" || run.ownerId !== input.ownerId || input.fencingToken !== undefined && run.fencingToken !== input.fencingToken || input.assistant.runId !== run.id || input.assistant.id !== run.assistantMessageId || input.assistant.conversationId !== run.conversationId || input.assistant.role !== "assistant" || input.assistant.status !== terminalMessageStatus(input.reason)) {
2443
+ if (run.revision !== input.expectedRevision || run.state !== "running" && run.state !== "interrupt_requested" || run.ownerId !== input.ownerId || input.fencingToken !== undefined && run.fencingToken !== input.fencingToken || input.assistant.runId !== run.id || input.assistant.id !== run.assistantMessageId || input.assistant.conversationId !== run.conversationId || input.assistant.role !== "assistant" || input.assistant.status !== terminalMessageStatus2(input.reason)) {
2347
2444
  return conflict(run.revision);
2348
2445
  }
2349
2446
  const next = AgentRunSchema.parse({
@@ -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"}