slot-flight 0.1.0

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 (107) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +242 -0
  3. package/dist/adapters/openai.d.ts +49 -0
  4. package/dist/adapters/openai.d.ts.map +1 -0
  5. package/dist/adapters/openai.js +93 -0
  6. package/dist/adapters/openai.js.map +1 -0
  7. package/dist/adapters/stream.d.ts +10 -0
  8. package/dist/adapters/stream.d.ts.map +1 -0
  9. package/dist/adapters/stream.js +18 -0
  10. package/dist/adapters/stream.js.map +1 -0
  11. package/dist/adapters/vercel.d.ts +20 -0
  12. package/dist/adapters/vercel.d.ts.map +1 -0
  13. package/dist/adapters/vercel.js +67 -0
  14. package/dist/adapters/vercel.js.map +1 -0
  15. package/dist/core.d.ts +4 -0
  16. package/dist/core.d.ts.map +1 -0
  17. package/dist/core.js +3 -0
  18. package/dist/core.js.map +1 -0
  19. package/dist/engine.d.ts +14 -0
  20. package/dist/engine.d.ts.map +1 -0
  21. package/dist/engine.js +43 -0
  22. package/dist/engine.js.map +1 -0
  23. package/dist/errors.d.ts +23 -0
  24. package/dist/errors.d.ts.map +1 -0
  25. package/dist/errors.js +41 -0
  26. package/dist/errors.js.map +1 -0
  27. package/dist/index.d.ts +3 -0
  28. package/dist/index.d.ts.map +1 -0
  29. package/dist/index.js +2 -0
  30. package/dist/index.js.map +1 -0
  31. package/dist/slot/execution/events.d.ts +15 -0
  32. package/dist/slot/execution/events.d.ts.map +1 -0
  33. package/dist/slot/execution/events.js +114 -0
  34. package/dist/slot/execution/events.js.map +1 -0
  35. package/dist/slot/execution/failures.d.ts +14 -0
  36. package/dist/slot/execution/failures.d.ts.map +1 -0
  37. package/dist/slot/execution/failures.js +71 -0
  38. package/dist/slot/execution/failures.js.map +1 -0
  39. package/dist/slot/execution/frame-request.d.ts +13 -0
  40. package/dist/slot/execution/frame-request.d.ts.map +1 -0
  41. package/dist/slot/execution/frame-request.js +45 -0
  42. package/dist/slot/execution/frame-request.js.map +1 -0
  43. package/dist/slot/execution/index.d.ts +4 -0
  44. package/dist/slot/execution/index.d.ts.map +1 -0
  45. package/dist/slot/execution/index.js +30 -0
  46. package/dist/slot/execution/index.js.map +1 -0
  47. package/dist/slot/execution/request.d.ts +3 -0
  48. package/dist/slot/execution/request.d.ts.map +1 -0
  49. package/dist/slot/execution/request.js +10 -0
  50. package/dist/slot/execution/request.js.map +1 -0
  51. package/dist/slot/execution/scope.d.ts +10 -0
  52. package/dist/slot/execution/scope.d.ts.map +1 -0
  53. package/dist/slot/execution/scope.js +85 -0
  54. package/dist/slot/execution/scope.js.map +1 -0
  55. package/dist/slot/execution/types.d.ts +21 -0
  56. package/dist/slot/execution/types.d.ts.map +1 -0
  57. package/dist/slot/execution/types.js +2 -0
  58. package/dist/slot/execution/types.js.map +1 -0
  59. package/dist/slot/frame/parser.d.ts +27 -0
  60. package/dist/slot/frame/parser.d.ts.map +1 -0
  61. package/dist/slot/frame/parser.js +143 -0
  62. package/dist/slot/frame/parser.js.map +1 -0
  63. package/dist/slot/frame/prompt.d.ts +4 -0
  64. package/dist/slot/frame/prompt.d.ts.map +1 -0
  65. package/dist/slot/frame/prompt.js +59 -0
  66. package/dist/slot/frame/prompt.js.map +1 -0
  67. package/dist/slot/frame/request.d.ts +5 -0
  68. package/dist/slot/frame/request.d.ts.map +1 -0
  69. package/dist/slot/frame/request.js +23 -0
  70. package/dist/slot/frame/request.js.map +1 -0
  71. package/dist/slot/index.d.ts +9 -0
  72. package/dist/slot/index.d.ts.map +1 -0
  73. package/dist/slot/index.js +9 -0
  74. package/dist/slot/index.js.map +1 -0
  75. package/dist/slot/object/definition.d.ts +12 -0
  76. package/dist/slot/object/definition.d.ts.map +1 -0
  77. package/dist/slot/object/definition.js +53 -0
  78. package/dist/slot/object/definition.js.map +1 -0
  79. package/dist/slot/object/projections.d.ts +6 -0
  80. package/dist/slot/object/projections.d.ts.map +1 -0
  81. package/dist/slot/object/projections.js +37 -0
  82. package/dist/slot/object/projections.js.map +1 -0
  83. package/dist/slot/object/run.d.ts +18 -0
  84. package/dist/slot/object/run.d.ts.map +1 -0
  85. package/dist/slot/object/run.js +94 -0
  86. package/dist/slot/object/run.js.map +1 -0
  87. package/dist/slot/object/stream.d.ts +34 -0
  88. package/dist/slot/object/stream.d.ts.map +1 -0
  89. package/dist/slot/object/stream.js +25 -0
  90. package/dist/slot/object/stream.js.map +1 -0
  91. package/dist/slot/object/web.d.ts +5 -0
  92. package/dist/slot/object/web.d.ts.map +1 -0
  93. package/dist/slot/object/web.js +107 -0
  94. package/dist/slot/object/web.js.map +1 -0
  95. package/dist/slot/path.d.ts +20 -0
  96. package/dist/slot/path.d.ts.map +1 -0
  97. package/dist/slot/path.js +125 -0
  98. package/dist/slot/path.js.map +1 -0
  99. package/dist/slot/plan.d.ts +7 -0
  100. package/dist/slot/plan.d.ts.map +1 -0
  101. package/dist/slot/plan.js +17 -0
  102. package/dist/slot/plan.js.map +1 -0
  103. package/dist/types.d.ts +94 -0
  104. package/dist/types.d.ts.map +1 -0
  105. package/dist/types.js +2 -0
  106. package/dist/types.js.map +1 -0
  107. package/package.json +70 -0
@@ -0,0 +1,27 @@
1
+ export type SlotFrameParserEvent = {
2
+ type: "slot-start";
3
+ slot: string;
4
+ } | {
5
+ type: "slot-delta";
6
+ slot: string;
7
+ delta: string;
8
+ value: string;
9
+ } | {
10
+ type: "slot-complete";
11
+ slot: string;
12
+ value: string;
13
+ };
14
+ export declare class SlotFrameParser {
15
+ private readonly slotsById;
16
+ private state;
17
+ private buffer;
18
+ private current;
19
+ private readonly completed;
20
+ constructor(slotsById: Map<string, string>);
21
+ push(chunk: string): SlotFrameParserEvent[];
22
+ finish(): void;
23
+ private flushValue;
24
+ private dropLeadingBlankLines;
25
+ private mightBePartialHeader;
26
+ }
27
+ //# sourceMappingURL=parser.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parser.d.ts","sourceRoot":"","sources":["../../../src/slot/frame/parser.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,oBAAoB,GAC5B;IAAE,IAAI,EAAE,YAAY,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GACpC;IAAE,IAAI,EAAE,YAAY,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GAClE;IAAE,IAAI,EAAE,eAAe,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AAE3D,qBAAa,eAAe;IAYd,OAAO,CAAC,QAAQ,CAAC,SAAS;IAXtC,OAAO,CAAC,KAAK,CAAkC;IAC/C,OAAO,CAAC,MAAM,CAAM;IACpB,OAAO,CAAC,OAAO,CAMD;IACd,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAqB;gBAElB,SAAS,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC;IAE3D,IAAI,CAAC,KAAK,EAAE,MAAM,GAAG,oBAAoB,EAAE;IAsE3C,MAAM,IAAI,IAAI;IAgBd,OAAO,CAAC,UAAU;IAyDlB,OAAO,CAAC,qBAAqB;IAQ7B,OAAO,CAAC,oBAAoB;CAG7B"}
@@ -0,0 +1,143 @@
1
+ import { SlotFlightSlotProtocolError } from "../../errors.js";
2
+ export class SlotFrameParser {
3
+ slotsById;
4
+ state = "headers";
5
+ buffer = "";
6
+ current;
7
+ completed = new Set();
8
+ constructor(slotsById) {
9
+ this.slotsById = slotsById;
10
+ }
11
+ push(chunk) {
12
+ this.buffer += chunk;
13
+ const events = [];
14
+ while (true) {
15
+ if (this.state === "headers") {
16
+ this.dropLeadingBlankLines();
17
+ if (this.buffer.length === 0) {
18
+ return events;
19
+ }
20
+ const headerMatch = /^<(?<id>\d+)>/.exec(this.buffer);
21
+ if (headerMatch?.groups === undefined) {
22
+ // Chunks can split a header after "<" or the id digits. Wait for
23
+ // more bytes before treating the buffered prefix as invalid output.
24
+ if (this.mightBePartialHeader()) {
25
+ return events;
26
+ }
27
+ const slotLineEnd = this.buffer.indexOf("\n");
28
+ const received = slotLineEnd === -1
29
+ ? this.buffer
30
+ : this.buffer.slice(0, slotLineEnd);
31
+ throw new SlotFlightSlotProtocolError(`Expected slot id header but received "${received}".`, true);
32
+ }
33
+ const id = headerMatch.groups.id;
34
+ const header = headerMatch[0];
35
+ if (this.buffer.length < header.length) {
36
+ return events;
37
+ }
38
+ const path = this.slotsById.get(id);
39
+ if (path === undefined) {
40
+ throw new SlotFlightSlotProtocolError(`Received unregistered slot id "${id}".`, false);
41
+ }
42
+ if (this.completed.has(path)) {
43
+ throw new SlotFlightSlotProtocolError(`Received duplicate slot "${path}".`, false);
44
+ }
45
+ this.current = { id, path, value: "" };
46
+ this.buffer = this.buffer.slice(header.length);
47
+ if (this.buffer.startsWith("\r\n")) {
48
+ this.buffer = this.buffer.slice(2);
49
+ }
50
+ else if (this.buffer.startsWith("\n")) {
51
+ this.buffer = this.buffer.slice(1);
52
+ }
53
+ this.state = "value";
54
+ events.push({ type: "slot-start", slot: path });
55
+ }
56
+ if (this.state === "value") {
57
+ const flushed = this.flushValue();
58
+ events.push(...flushed.events);
59
+ if (!flushed.completedFrame) {
60
+ return events;
61
+ }
62
+ }
63
+ }
64
+ }
65
+ finish() {
66
+ this.dropLeadingBlankLines();
67
+ if (this.state !== "headers" || this.current !== undefined) {
68
+ throw new SlotFlightSlotProtocolError("Slot stream ended before closing delimiter.", true);
69
+ }
70
+ if (this.buffer.length > 0) {
71
+ throw new SlotFlightSlotProtocolError(`Unexpected trailing content after slot frames: "${this.buffer}".`, true);
72
+ }
73
+ }
74
+ flushValue() {
75
+ if (this.current === undefined) {
76
+ return { events: [], completedFrame: false };
77
+ }
78
+ const events = [];
79
+ const closing = `</${this.current.id}>`;
80
+ const closingIndex = this.buffer.indexOf(closing);
81
+ if (closingIndex !== -1) {
82
+ const delta = stripOneTrailingLineBreak(this.buffer.slice(0, closingIndex));
83
+ if (delta.length > 0) {
84
+ this.current.value += delta;
85
+ events.push({
86
+ type: "slot-delta",
87
+ slot: this.current.path,
88
+ delta,
89
+ value: this.current.value
90
+ });
91
+ }
92
+ events.push({
93
+ type: "slot-complete",
94
+ slot: this.current.path,
95
+ value: this.current.value
96
+ });
97
+ this.completed.add(this.current.path);
98
+ this.buffer = this.buffer.slice(closingIndex + closing.length);
99
+ this.current = undefined;
100
+ this.state = "headers";
101
+ return { events, completedFrame: true };
102
+ }
103
+ // Keep a delimiter-sized suffix in the buffer so a close tag split across
104
+ // chunks is not accidentally emitted as value text.
105
+ const keep = closing.length + 1;
106
+ if (this.buffer.length <= keep) {
107
+ return { events, completedFrame: false };
108
+ }
109
+ const deltaEnd = this.buffer.length - keep;
110
+ const delta = this.buffer.slice(0, deltaEnd);
111
+ this.buffer = this.buffer.slice(deltaEnd);
112
+ this.current.value += delta;
113
+ events.push({
114
+ type: "slot-delta",
115
+ slot: this.current.path,
116
+ delta,
117
+ value: this.current.value
118
+ });
119
+ return { events, completedFrame: false };
120
+ }
121
+ dropLeadingBlankLines() {
122
+ while (this.buffer.startsWith("\n") || this.buffer.startsWith("\r\n")) {
123
+ this.buffer = this.buffer.startsWith("\r\n")
124
+ ? this.buffer.slice(2)
125
+ : this.buffer.slice(1);
126
+ }
127
+ }
128
+ mightBePartialHeader() {
129
+ return /^<\d*$/.test(this.buffer);
130
+ }
131
+ }
132
+ function stripOneTrailingLineBreak(value) {
133
+ // Multiline frames commonly place the close tag on its own line; that
134
+ // protocol newline should not become part of the slot value.
135
+ if (value.endsWith("\r\n")) {
136
+ return value.slice(0, -2);
137
+ }
138
+ if (value.endsWith("\n")) {
139
+ return value.slice(0, -1);
140
+ }
141
+ return value;
142
+ }
143
+ //# sourceMappingURL=parser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parser.js","sourceRoot":"","sources":["../../../src/slot/frame/parser.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { SlotFlightPrompt, SlotFrameRequest } from "../../types.js";
2
+ export declare function createSlotFramePrompt(slots: SlotFrameRequest[], prompt: SlotFlightPrompt | undefined): string;
3
+ export declare function defaultSlotFramePrompt(slots: SlotFrameRequest[]): string;
4
+ //# sourceMappingURL=prompt.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompt.d.ts","sourceRoot":"","sources":["../../../src/slot/frame/prompt.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,gBAAgB,EAEhB,gBAAgB,EACjB,MAAM,gBAAgB,CAAC;AAExB,wBAAgB,qBAAqB,CACnC,KAAK,EAAE,gBAAgB,EAAE,EACzB,MAAM,EAAE,gBAAgB,GAAG,SAAS,GACnC,MAAM,CAUR;AAED,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,gBAAgB,EAAE,GAAG,MAAM,CAkCxE"}
@@ -0,0 +1,59 @@
1
+ export function createSlotFramePrompt(slots, prompt) {
2
+ const request = {
3
+ prompt: "",
4
+ slots,
5
+ attempt: Math.max(...slots.map((slot) => slot.attempt))
6
+ };
7
+ return typeof prompt === "function"
8
+ ? prompt(request)
9
+ : (prompt ?? defaultSlotFramePrompt(slots));
10
+ }
11
+ export function defaultSlotFramePrompt(slots) {
12
+ const slotList = slots.map(formatSlotPromptEntry).join("\n\n");
13
+ return [
14
+ "You are filling slots for a server-owned JSON object.",
15
+ "Do not emit JSON.",
16
+ "The server owns the object shape, paths, validation, retries, and assembly.",
17
+ "",
18
+ "OUTPUT CONTRACT",
19
+ "- Emit exactly one frame for each requested slot.",
20
+ "- Emit frames in the same order as the slot list.",
21
+ "- Copy each open and close tag exactly.",
22
+ "- Do not emit unrequested ids, JSON paths, markdown, code fences, commentary, bullets, or explanations.",
23
+ "- Do not omit a frame. If a value is uncertain, make the best valid value for that slot.",
24
+ "- Do not include a closing tag string inside a value.",
25
+ "",
26
+ "FRAME SHAPE",
27
+ "- Prefer one-line frames for concise values:",
28
+ "<1>raw slot value only</1>",
29
+ "- Use multiline frames only when the value itself needs multiple lines:",
30
+ "<1>",
31
+ "raw multiline slot value only",
32
+ "</1>",
33
+ "- After writing a value, immediately write the exact closing tag for that id.",
34
+ "",
35
+ "VALUE RULES",
36
+ "- For mode: text, emit the raw value only. Do not wrap it in quotes unless quotes are part of the value.",
37
+ "- For mode: json, emit one syntactically valid JSON value inside the frame body and nothing else.",
38
+ "- JSON strings, arrays, and objects must use valid JSON syntax with double-quoted strings.",
39
+ "- Respect each slot instruction, especially enum labels, length limits, item counts, and requested language.",
40
+ "- A retry attempt means the previous frame or value for that slot failed parsing, protocol checks, or validation. Produce a corrected value only for the requested retry slot.",
41
+ "",
42
+ "SLOTS",
43
+ slotList
44
+ ].join("\n");
45
+ }
46
+ function formatSlotPromptEntry(slot) {
47
+ return [
48
+ `- id: ${slot.id}`,
49
+ ` path: ${slot.path}`,
50
+ ` mode: ${slot.mode}`,
51
+ ` attempt: ${slot.attempt}`,
52
+ ` open: <${slot.id}>`,
53
+ ` close: </${slot.id}>`,
54
+ slot.prompt ? ` instruction: ${slot.prompt}` : undefined
55
+ ]
56
+ .filter(Boolean)
57
+ .join("\n");
58
+ }
59
+ //# sourceMappingURL=prompt.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompt.js","sourceRoot":"","sources":["../../../src/slot/frame/prompt.ts"],"names":[],"mappings":"AAMA,MAAM,UAAU,qBAAqB,CACnC,KAAyB,EACzB,MAAoC;IAEpC,MAAM,OAAO,GAA4B;QACvC,MAAM,EAAE,EAAE;QACV,KAAK;QACL,OAAO,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;KACxD,CAAC;IAEF,OAAO,OAAO,MAAM,KAAK,UAAU;QACjC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC;QACjB,CAAC,CAAC,CAAC,MAAM,IAAI,sBAAsB,CAAC,KAAK,CAAC,CAAC,CAAC;AAChD,CAAC;AAED,MAAM,UAAU,sBAAsB,CAAC,KAAyB;IAC9D,MAAM,QAAQ,GAAG,KAAK,CAAC,GAAG,CAAC,qBAAqB,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAC/D,OAAO;QACL,uDAAuD;QACvD,mBAAmB;QACnB,6EAA6E;QAC7E,EAAE;QACF,iBAAiB;QACjB,mDAAmD;QACnD,mDAAmD;QACnD,yCAAyC;QACzC,yGAAyG;QACzG,0FAA0F;QAC1F,uDAAuD;QACvD,EAAE;QACF,aAAa;QACb,8CAA8C;QAC9C,4BAA4B;QAC5B,yEAAyE;QACzE,KAAK;QACL,+BAA+B;QAC/B,MAAM;QACN,+EAA+E;QAC/E,EAAE;QACF,aAAa;QACb,0GAA0G;QAC1G,mGAAmG;QACnG,4FAA4F;QAC5F,8GAA8G;QAC9G,gLAAgL;QAChL,EAAE;QACF,OAAO;QACP,QAAQ;KACT,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf,CAAC;AAED,SAAS,qBAAqB,CAAC,IAAsB;IACnD,OAAO;QACL,SAAS,IAAI,CAAC,EAAE,EAAE;QAClB,WAAW,IAAI,CAAC,IAAI,EAAE;QACtB,WAAW,IAAI,CAAC,IAAI,EAAE;QACtB,cAAc,IAAI,CAAC,OAAO,EAAE;QAC5B,YAAY,IAAI,CAAC,EAAE,GAAG;QACtB,cAAc,IAAI,CAAC,EAAE,GAAG;QACxB,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,kBAAkB,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,SAAS;KAC1D;SACE,MAAM,CAAC,OAAO,CAAC;SACf,IAAI,CAAC,IAAI,CAAC,CAAC;AAChB,CAAC"}
@@ -0,0 +1,5 @@
1
+ import type { SlotFrameRequest } from "../../types.js";
2
+ import type { CompiledSlot } from "../plan.js";
3
+ export declare function createSlotId(index: number): string;
4
+ export declare function createSlotFrameRequests(slots: CompiledSlot[], attempts: ReadonlyMap<string, number>): SlotFrameRequest[];
5
+ //# sourceMappingURL=request.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"request.d.ts","sourceRoot":"","sources":["../../../src/slot/frame/request.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AACvD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAE/C,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAElD;AAED,wBAAgB,uBAAuB,CACrC,KAAK,EAAE,YAAY,EAAE,EACrB,QAAQ,EAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,GACpC,gBAAgB,EAAE,CAoBpB"}
@@ -0,0 +1,23 @@
1
+ export function createSlotId(index) {
2
+ return String(index + 1);
3
+ }
4
+ export function createSlotFrameRequests(slots, attempts) {
5
+ // Frame ids are local to this provider request. Retried subsets get compact
6
+ // ids again, while the server keeps the stable mapping back to slot paths.
7
+ return slots.map((slot, index) => {
8
+ const frame = {
9
+ id: createSlotId(index),
10
+ path: slot.path,
11
+ templatePath: slot.definition.path,
12
+ prompt: "",
13
+ attempt: attempts.get(slot.path) ?? 1,
14
+ mode: slot.definition.mode ?? "text"
15
+ };
16
+ frame.prompt =
17
+ typeof slot.definition.prompt === "function"
18
+ ? slot.definition.prompt(frame)
19
+ : (slot.definition.prompt ?? "");
20
+ return frame;
21
+ });
22
+ }
23
+ //# sourceMappingURL=request.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"request.js","sourceRoot":"","sources":["../../../src/slot/frame/request.ts"],"names":[],"mappings":"AAGA,MAAM,UAAU,YAAY,CAAC,KAAa;IACxC,OAAO,MAAM,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;AAC3B,CAAC;AAED,MAAM,UAAU,uBAAuB,CACrC,KAAqB,EACrB,QAAqC;IAErC,4EAA4E;IAC5E,2EAA2E;IAC3E,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE;QAC/B,MAAM,KAAK,GAAqB;YAC9B,EAAE,EAAE,YAAY,CAAC,KAAK,CAAC;YACvB,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,YAAY,EAAE,IAAI,CAAC,UAAU,CAAC,IAAI;YAClC,MAAM,EAAE,EAAE;YACV,OAAO,EAAE,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC;YACrC,IAAI,EAAE,IAAI,CAAC,UAAU,CAAC,IAAI,IAAI,MAAM;SACrC,CAAC;QAEF,KAAK,CAAC,MAAM;YACV,OAAO,IAAI,CAAC,UAAU,CAAC,MAAM,KAAK,UAAU;gBAC1C,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,KAAK,CAAC;gBAC/B,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC;QAErC,OAAO,KAAK,CAAC;IACf,CAAC,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,9 @@
1
+ export { runSlotFrameStream, type SlotExecutionOptions } from "./execution/index.js";
2
+ export { SlotFrameParser } from "./frame/parser.js";
3
+ export { createSlotFramePrompt, defaultSlotFramePrompt } from "./frame/prompt.js";
4
+ export { createSlotFrameRequests, createSlotId } from "./frame/request.js";
5
+ export { type SlotObjectOptions, type SlotObjectOutput, slotObject } from "./object/definition.js";
6
+ export { type CompletedSlot, createSlotObjectStream, type SlotObjectDebugStream, type SlotObjectReadableStreamOptions, type SlotObjectResponseOptions, type SlotObjectStream, type SlotObjectStreamFormat, type SlotObjectStreamSource } from "./object/stream.js";
7
+ export { concretePathToJsonPointer, expandSlotPath, parseConcretePath, parseSlotTemplate, setPathValue } from "./path.js";
8
+ export { type CompiledSlot, compileSlotPlan } from "./plan.js";
9
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/slot/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,kBAAkB,EAClB,KAAK,oBAAoB,EAC1B,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EACL,qBAAqB,EACrB,sBAAsB,EACvB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EACL,uBAAuB,EACvB,YAAY,EACb,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EACL,KAAK,iBAAiB,EACtB,KAAK,gBAAgB,EACrB,UAAU,EACX,MAAM,wBAAwB,CAAC;AAChC,OAAO,EACL,KAAK,aAAa,EAClB,sBAAsB,EACtB,KAAK,qBAAqB,EAC1B,KAAK,+BAA+B,EACpC,KAAK,yBAAyB,EAC9B,KAAK,gBAAgB,EACrB,KAAK,sBAAsB,EAC3B,KAAK,sBAAsB,EAC5B,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EACL,yBAAyB,EACzB,cAAc,EACd,iBAAiB,EACjB,iBAAiB,EACjB,YAAY,EACb,MAAM,WAAW,CAAC;AACnB,OAAO,EACL,KAAK,YAAY,EACjB,eAAe,EAChB,MAAM,WAAW,CAAC"}
@@ -0,0 +1,9 @@
1
+ export { runSlotFrameStream } from "./execution/index.js";
2
+ export { SlotFrameParser } from "./frame/parser.js";
3
+ export { createSlotFramePrompt, defaultSlotFramePrompt } from "./frame/prompt.js";
4
+ export { createSlotFrameRequests, createSlotId } from "./frame/request.js";
5
+ export { slotObject } from "./object/definition.js";
6
+ export { createSlotObjectStream } from "./object/stream.js";
7
+ export { concretePathToJsonPointer, expandSlotPath, parseConcretePath, parseSlotTemplate, setPathValue } from "./path.js";
8
+ export { compileSlotPlan } from "./plan.js";
9
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/slot/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,kBAAkB,EAEnB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EACL,qBAAqB,EACrB,sBAAsB,EACvB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EACL,uBAAuB,EACvB,YAAY,EACb,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAGL,UAAU,EACX,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAEL,sBAAsB,EAOvB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EACL,yBAAyB,EACzB,cAAc,EACd,iBAAiB,EACjB,iBAAiB,EACjB,YAAY,EACb,MAAM,WAAW,CAAC;AACnB,OAAO,EAEL,eAAe,EAChB,MAAM,WAAW,CAAC"}
@@ -0,0 +1,12 @@
1
+ import { z } from "zod";
2
+ import type { SlotDefinition } from "../../types.js";
3
+ export interface SlotObjectOptions<TSchema extends z.ZodTypeAny> {
4
+ schema: TSchema;
5
+ prompt?: string;
6
+ maxRetries?: number;
7
+ }
8
+ export interface SlotObjectOutput<TSchema extends z.ZodTypeAny> extends SlotObjectOptions<TSchema> {
9
+ slots: SlotDefinition[];
10
+ }
11
+ export declare function slotObject<TSchema extends z.ZodTypeAny>(options: SlotObjectOptions<TSchema>): SlotObjectOutput<TSchema>;
12
+ //# sourceMappingURL=definition.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"definition.d.ts","sourceRoot":"","sources":["../../../src/slot/object/definition.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAErD,MAAM,WAAW,iBAAiB,CAAC,OAAO,SAAS,CAAC,CAAC,UAAU;IAC7D,MAAM,EAAE,OAAO,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,gBAAgB,CAAC,OAAO,SAAS,CAAC,CAAC,UAAU,CAC5D,SAAQ,iBAAiB,CAAC,OAAO,CAAC;IAClC,KAAK,EAAE,cAAc,EAAE,CAAC;CACzB;AAED,wBAAgB,UAAU,CAAC,OAAO,SAAS,CAAC,CAAC,UAAU,EACrD,OAAO,EAAE,iBAAiB,CAAC,OAAO,CAAC,GAClC,gBAAgB,CAAC,OAAO,CAAC,CAK3B"}
@@ -0,0 +1,53 @@
1
+ import { z } from "zod";
2
+ import { SlotFlightConfigurationError } from "../../errors.js";
3
+ export function slotObject(options) {
4
+ return {
5
+ ...options,
6
+ slots: inferSlots(options.schema)
7
+ };
8
+ }
9
+ function inferSlots(schema) {
10
+ const root = unwrapSchema(schema);
11
+ if (!(root instanceof z.ZodObject)) {
12
+ throw new SlotFlightConfigurationError("slotObject() requires a Zod object schema.");
13
+ }
14
+ const slots = Object.entries(root.shape).flatMap(([key, child]) => inferSlotAtPath(child, key));
15
+ if (slots.length === 0) {
16
+ throw new SlotFlightConfigurationError("slotObject() requires at least one schema field with .describe().");
17
+ }
18
+ return slots;
19
+ }
20
+ function inferSlotAtPath(schema, path) {
21
+ const unwrapped = unwrapSchema(schema);
22
+ const prompt = schema.description;
23
+ if (prompt !== undefined) {
24
+ return [
25
+ {
26
+ path,
27
+ prompt,
28
+ schema,
29
+ mode: isJsonValueSchema(unwrapped) ? "json" : "text"
30
+ }
31
+ ];
32
+ }
33
+ if (unwrapped instanceof z.ZodObject) {
34
+ return Object.entries(unwrapped.shape).flatMap(([key, child]) => inferSlotAtPath(child, `${path}.${key}`));
35
+ }
36
+ throw new SlotFlightConfigurationError(`Schema field "${path}" must use .describe() to become a slot.`);
37
+ }
38
+ function isJsonValueSchema(schema) {
39
+ return schema instanceof z.ZodArray || schema instanceof z.ZodObject;
40
+ }
41
+ function unwrapSchema(schema) {
42
+ let current = schema;
43
+ // Slot inference should follow the value shape through common wrappers such
44
+ // as optional/default, because those wrappers do not change the JSON path.
45
+ while (current instanceof z.ZodOptional ||
46
+ current instanceof z.ZodNullable ||
47
+ current instanceof z.ZodDefault ||
48
+ current instanceof z.ZodCatch) {
49
+ current = current._def.innerType;
50
+ }
51
+ return current;
52
+ }
53
+ //# sourceMappingURL=definition.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"definition.js","sourceRoot":"","sources":["../../../src/slot/object/definition.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,4BAA4B,EAAE,MAAM,iBAAiB,CAAC;AAc/D,MAAM,UAAU,UAAU,CACxB,OAAmC;IAEnC,OAAO;QACL,GAAG,OAAO;QACV,KAAK,EAAE,UAAU,CAAC,OAAO,CAAC,MAAM,CAAC;KAClC,CAAC;AACJ,CAAC;AAED,SAAS,UAAU,CAAC,MAAoB;IACtC,MAAM,IAAI,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC;IAClC,IAAI,CAAC,CAAC,IAAI,YAAY,CAAC,CAAC,SAAS,CAAC,EAAE,CAAC;QACnC,MAAM,IAAI,4BAA4B,CACpC,4CAA4C,CAC7C,CAAC;IACJ,CAAC;IAED,MAAM,KAAK,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE,CAChE,eAAe,CAAC,KAAqB,EAAE,GAAG,CAAC,CAC5C,CAAC;IAEF,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvB,MAAM,IAAI,4BAA4B,CACpC,mEAAmE,CACpE,CAAC;IACJ,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,eAAe,CAAC,MAAoB,EAAE,IAAY;IACzD,MAAM,SAAS,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC;IACvC,MAAM,MAAM,GAAG,MAAM,CAAC,WAAW,CAAC;IAElC,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;QACzB,OAAO;YACL;gBACE,IAAI;gBACJ,MAAM;gBACN,MAAM;gBACN,IAAI,EAAE,iBAAiB,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM;aACrD;SACF,CAAC;IACJ,CAAC;IAED,IAAI,SAAS,YAAY,CAAC,CAAC,SAAS,EAAE,CAAC;QACrC,OAAO,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE,CAC9D,eAAe,CAAC,KAAqB,EAAE,GAAG,IAAI,IAAI,GAAG,EAAE,CAAC,CACzD,CAAC;IACJ,CAAC;IAED,MAAM,IAAI,4BAA4B,CACpC,iBAAiB,IAAI,0CAA0C,CAChE,CAAC;AACJ,CAAC;AAED,SAAS,iBAAiB,CAAC,MAAoB;IAC7C,OAAO,MAAM,YAAY,CAAC,CAAC,QAAQ,IAAI,MAAM,YAAY,CAAC,CAAC,SAAS,CAAC;AACvE,CAAC;AAED,SAAS,YAAY,CAAC,MAAoB;IACxC,IAAI,OAAO,GAAG,MAAM,CAAC;IAErB,4EAA4E;IAC5E,2EAA2E;IAC3E,OACE,OAAO,YAAY,CAAC,CAAC,WAAW;QAChC,OAAO,YAAY,CAAC,CAAC,WAAW;QAChC,OAAO,YAAY,CAAC,CAAC,UAAU;QAC/B,OAAO,YAAY,CAAC,CAAC,QAAQ,EAC7B,CAAC;QACD,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC;IACnC,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC"}
@@ -0,0 +1,6 @@
1
+ import type { SlotFlightEvent } from "../../types.js";
2
+ import type { CompletedSlot } from "./stream.js";
3
+ export declare function partialObjectIterator<T>(events: AsyncIterable<SlotFlightEvent>): AsyncGenerator<Partial<T>>;
4
+ export declare function completedSlotIterator<T>(events: AsyncIterable<SlotFlightEvent>): AsyncGenerator<CompletedSlot<T>>;
5
+ export declare function completedEventIterator(events: AsyncIterable<SlotFlightEvent>): AsyncGenerator<SlotFlightEvent>;
6
+ //# sourceMappingURL=projections.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"projections.d.ts","sourceRoot":"","sources":["../../../src/slot/object/projections.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AACtD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAEjD,wBAAuB,qBAAqB,CAAC,CAAC,EAC5C,MAAM,EAAE,aAAa,CAAC,eAAe,CAAC,GACrC,cAAc,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAM5B;AAED,wBAAuB,qBAAqB,CAAC,CAAC,EAC5C,MAAM,EAAE,aAAa,CAAC,eAAe,CAAC,GACrC,cAAc,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAUlC;AAED,wBAAuB,sBAAsB,CAC3C,MAAM,EAAE,aAAa,CAAC,eAAe,CAAC,GACrC,cAAc,CAAC,eAAe,CAAC,CAMjC"}
@@ -0,0 +1,37 @@
1
+ export async function* partialObjectIterator(events) {
2
+ for await (const event of events) {
3
+ if (eventHasState(event)) {
4
+ yield event.state;
5
+ }
6
+ }
7
+ }
8
+ export async function* completedSlotIterator(events) {
9
+ for await (const event of events) {
10
+ if (event.type === "slot-complete") {
11
+ yield {
12
+ slot: event.slot,
13
+ value: event.value,
14
+ state: event.state
15
+ };
16
+ }
17
+ }
18
+ }
19
+ export async function* completedEventIterator(events) {
20
+ for await (const event of events) {
21
+ if (isCompletedOutputEvent(event)) {
22
+ yield event;
23
+ }
24
+ }
25
+ }
26
+ function eventHasState(event) {
27
+ return (event.type === "slot-delta" ||
28
+ event.type === "slot-complete" ||
29
+ event.type === "done");
30
+ }
31
+ function isCompletedOutputEvent(event) {
32
+ return (event.type === "slot-complete" ||
33
+ event.type === "slot-retry" ||
34
+ event.type === "slot-error" ||
35
+ event.type === "done");
36
+ }
37
+ //# sourceMappingURL=projections.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"projections.js","sourceRoot":"","sources":["../../../src/slot/object/projections.ts"],"names":[],"mappings":"AAGA,MAAM,CAAC,KAAK,SAAS,CAAC,CAAC,qBAAqB,CAC1C,MAAsC;IAEtC,IAAI,KAAK,EAAE,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QACjC,IAAI,aAAa,CAAC,KAAK,CAAC,EAAE,CAAC;YACzB,MAAM,KAAK,CAAC,KAAmB,CAAC;QAClC,CAAC;IACH,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,SAAS,CAAC,CAAC,qBAAqB,CAC1C,MAAsC;IAEtC,IAAI,KAAK,EAAE,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QACjC,IAAI,KAAK,CAAC,IAAI,KAAK,eAAe,EAAE,CAAC;YACnC,MAAM;gBACJ,IAAI,EAAE,KAAK,CAAC,IAAI;gBAChB,KAAK,EAAE,KAAK,CAAC,KAAK;gBAClB,KAAK,EAAE,KAAK,CAAC,KAAmB;aACjC,CAAC;QACJ,CAAC;IACH,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,SAAS,CAAC,CAAC,sBAAsB,CAC3C,MAAsC;IAEtC,IAAI,KAAK,EAAE,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QACjC,IAAI,sBAAsB,CAAC,KAAK,CAAC,EAAE,CAAC;YAClC,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC;AACH,CAAC;AAED,SAAS,aAAa,CAAC,KAAsB;IAG3C,OAAO,CACL,KAAK,CAAC,IAAI,KAAK,YAAY;QAC3B,KAAK,CAAC,IAAI,KAAK,eAAe;QAC9B,KAAK,CAAC,IAAI,KAAK,MAAM,CACtB,CAAC;AACJ,CAAC;AAED,SAAS,sBAAsB,CAAC,KAAsB;IACpD,OAAO,CACL,KAAK,CAAC,IAAI,KAAK,eAAe;QAC9B,KAAK,CAAC,IAAI,KAAK,YAAY;QAC3B,KAAK,CAAC,IAAI,KAAK,YAAY;QAC3B,KAAK,CAAC,IAAI,KAAK,MAAM,CACtB,CAAC;AACJ,CAAC"}
@@ -0,0 +1,18 @@
1
+ import type { SlotFlightEvent } from "../../types.js";
2
+ export declare class SlotObjectRun {
3
+ private readonly source;
4
+ private readonly cancelSource?;
5
+ private consumedBy;
6
+ private sourceIterator;
7
+ private resolveFinal;
8
+ private rejectFinal;
9
+ private readonly finalObjectPromise;
10
+ constructor(source: AsyncIterable<SlotFlightEvent>, cancelSource?: (() => void) | undefined);
11
+ get finalObject(): Promise<unknown>;
12
+ events(consumer: string): AsyncGenerator<SlotFlightEvent>;
13
+ cancel(): void;
14
+ private startFinalObjectDrain;
15
+ private claim;
16
+ private readEvents;
17
+ }
18
+ //# sourceMappingURL=run.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run.d.ts","sourceRoot":"","sources":["../../../src/slot/object/run.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAEtD,qBAAa,aAAa;IAStB,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAC;IAThC,OAAO,CAAC,UAAU,CAAqB;IACvC,OAAO,CAAC,cAAc,CAA6C;IACnE,OAAO,CAAC,YAAY,CAA4B;IAChD,OAAO,CAAC,WAAW,CAA4B;IAE/C,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAAmB;gBAGnC,MAAM,EAAE,aAAa,CAAC,eAAe,CAAC,EACtC,YAAY,CAAC,GAAE,MAAM,IAAI,aAAA;IAS5C,IAAI,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC,CAKlC;IAED,MAAM,CAAC,QAAQ,EAAE,MAAM,GAAG,cAAc,CAAC,eAAe,CAAC;IAOzD,MAAM,IAAI,IAAI;IAKd,OAAO,CAAC,qBAAqB;IAc7B,OAAO,CAAC,KAAK;YAUE,UAAU;CA0C1B"}
@@ -0,0 +1,94 @@
1
+ import { SlotFlightStreamError } from "../../errors.js";
2
+ export class SlotObjectRun {
3
+ source;
4
+ cancelSource;
5
+ consumedBy;
6
+ sourceIterator;
7
+ resolveFinal;
8
+ rejectFinal;
9
+ finalObjectPromise;
10
+ constructor(source, cancelSource) {
11
+ this.source = source;
12
+ this.cancelSource = cancelSource;
13
+ this.finalObjectPromise = new Promise((resolve, reject) => {
14
+ this.resolveFinal = resolve;
15
+ this.rejectFinal = reject;
16
+ });
17
+ this.finalObjectPromise.catch(() => undefined);
18
+ }
19
+ get finalObject() {
20
+ if (this.consumedBy === undefined) {
21
+ this.startFinalObjectDrain();
22
+ }
23
+ return this.finalObjectPromise;
24
+ }
25
+ events(consumer) {
26
+ // SlotObjectRun deliberately has no event history or fan-out. A run has one
27
+ // live consumer so slow views cannot force unbounded buffering.
28
+ this.claim(consumer);
29
+ return this.readEvents();
30
+ }
31
+ cancel() {
32
+ this.cancelSource?.();
33
+ void this.sourceIterator?.return?.();
34
+ }
35
+ startFinalObjectDrain() {
36
+ this.claim("finalObject");
37
+ void (async () => {
38
+ try {
39
+ for await (const _event of this.readEvents()) {
40
+ // Drain the source so finalObject can be used without selecting a
41
+ // stream view; readEvents resolves the promise when it sees "done".
42
+ }
43
+ }
44
+ catch {
45
+ // readEvents already rejects finalObject with the same error.
46
+ }
47
+ })();
48
+ }
49
+ claim(consumer) {
50
+ if (this.consumedBy !== undefined) {
51
+ throw new SlotFlightStreamError(`SlotObjectStream is already being consumed by ${this.consumedBy}. Choose one stream view per run.`);
52
+ }
53
+ this.consumedBy = consumer;
54
+ }
55
+ async *readEvents() {
56
+ const iterator = this.source[Symbol.asyncIterator]();
57
+ this.sourceIterator = iterator;
58
+ let sawDone = false;
59
+ let completed = false;
60
+ let finalState;
61
+ try {
62
+ while (true) {
63
+ const next = await iterator.next();
64
+ if (next.done) {
65
+ break;
66
+ }
67
+ const event = next.value;
68
+ if (event.type === "done") {
69
+ sawDone = true;
70
+ finalState = event.state;
71
+ }
72
+ yield event;
73
+ }
74
+ if (!sawDone) {
75
+ throw new SlotFlightStreamError("SlotObjectStream source completed without a done event.");
76
+ }
77
+ completed = true;
78
+ this.resolveFinal(finalState);
79
+ }
80
+ catch (error) {
81
+ this.rejectFinal(error);
82
+ throw error;
83
+ }
84
+ finally {
85
+ this.sourceIterator = undefined;
86
+ if (!completed) {
87
+ this.cancel();
88
+ await iterator.return?.();
89
+ this.rejectFinal(new DOMException("Stream cancelled", "AbortError"));
90
+ }
91
+ }
92
+ }
93
+ }
94
+ //# sourceMappingURL=run.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run.js","sourceRoot":"","sources":["../../../src/slot/object/run.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,34 @@
1
+ import type { SlotFlightEvent } from "../../types.js";
2
+ export interface CompletedSlot<T = unknown> {
3
+ slot: string;
4
+ value: unknown;
5
+ state: Partial<T>;
6
+ }
7
+ export type SlotObjectStreamSource = "completed" | "partial" | "events";
8
+ export type SlotObjectStreamFormat = "sse" | "ndjson";
9
+ export interface SlotObjectReadableStreamOptions {
10
+ source?: SlotObjectStreamSource;
11
+ format?: SlotObjectStreamFormat;
12
+ }
13
+ export interface SlotObjectResponseOptions {
14
+ format?: SlotObjectStreamFormat;
15
+ status?: number;
16
+ statusText?: string;
17
+ headers?: HeadersInit;
18
+ }
19
+ export interface SlotObjectDebugStream<T> {
20
+ readonly partialObjectStream: AsyncIterable<Partial<T>>;
21
+ readonly slotEventStream: AsyncIterable<SlotFlightEvent>;
22
+ toReadableStream(options?: SlotObjectReadableStreamOptions): ReadableStream<Uint8Array>;
23
+ }
24
+ export interface SlotObjectStream<T> {
25
+ readonly completedSlotStream: AsyncIterable<CompletedSlot<T>>;
26
+ readonly finalObject: Promise<T>;
27
+ readonly debug: SlotObjectDebugStream<T>;
28
+ toResponse(options?: SlotObjectResponseOptions): Response;
29
+ }
30
+ export interface SlotObjectStreamOptions {
31
+ cancel?: () => void;
32
+ }
33
+ export declare function createSlotObjectStream<T>(source: AsyncIterable<SlotFlightEvent>, options?: SlotObjectStreamOptions): SlotObjectStream<T>;
34
+ //# sourceMappingURL=stream.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stream.d.ts","sourceRoot":"","sources":["../../../src/slot/object/stream.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAKtD,MAAM,WAAW,aAAa,CAAC,CAAC,GAAG,OAAO;IACxC,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,OAAO,CAAC;IACf,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC;CACnB;AAED,MAAM,MAAM,sBAAsB,GAAG,WAAW,GAAG,SAAS,GAAG,QAAQ,CAAC;AACxE,MAAM,MAAM,sBAAsB,GAAG,KAAK,GAAG,QAAQ,CAAC;AAEtD,MAAM,WAAW,+BAA+B;IAC9C,MAAM,CAAC,EAAE,sBAAsB,CAAC;IAChC,MAAM,CAAC,EAAE,sBAAsB,CAAC;CACjC;AAED,MAAM,WAAW,yBAAyB;IACxC,MAAM,CAAC,EAAE,sBAAsB,CAAC;IAChC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,WAAW,CAAC;CACvB;AAED,MAAM,WAAW,qBAAqB,CAAC,CAAC;IACtC,QAAQ,CAAC,mBAAmB,EAAE,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;IACxD,QAAQ,CAAC,eAAe,EAAE,aAAa,CAAC,eAAe,CAAC,CAAC;IACzD,gBAAgB,CACd,OAAO,CAAC,EAAE,+BAA+B,GACxC,cAAc,CAAC,UAAU,CAAC,CAAC;CAC/B;AAED,MAAM,WAAW,gBAAgB,CAAC,CAAC;IACjC,QAAQ,CAAC,mBAAmB,EAAE,aAAa,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC;IAC9D,QAAQ,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC;IACjC,QAAQ,CAAC,KAAK,EAAE,qBAAqB,CAAC,CAAC,CAAC,CAAC;IACzC,UAAU,CAAC,OAAO,CAAC,EAAE,yBAAyB,GAAG,QAAQ,CAAC;CAC3D;AAED,MAAM,WAAW,uBAAuB;IACtC,MAAM,CAAC,EAAE,MAAM,IAAI,CAAC;CACrB;AAED,wBAAgB,sBAAsB,CAAC,CAAC,EACtC,MAAM,EAAE,aAAa,CAAC,eAAe,CAAC,EACtC,OAAO,GAAE,uBAA4B,GACpC,gBAAgB,CAAC,CAAC,CAAC,CA0BrB"}