@portel/photon-core 1.1.0 → 1.2.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.
- package/dist/generator.d.ts +587 -107
- package/dist/generator.d.ts.map +1 -1
- package/dist/generator.js +313 -151
- package/dist/generator.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +10 -7
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
- package/src/generator.ts +779 -220
- package/src/index.ts +50 -13
package/dist/generator.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"generator.d.ts","sourceRoot":"","sources":["../src/generator.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"generator.d.ts","sourceRoot":"","sources":["../src/generator.ts"],"names":[],"mappings":"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"}
|
package/dist/generator.js
CHANGED
|
@@ -1,192 +1,280 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Generator-based Tool Execution
|
|
2
|
+
* Generator-based Tool Execution with Ask/Emit Pattern
|
|
3
3
|
*
|
|
4
|
-
* Enables photon tools to use generator functions with `yield` for:
|
|
5
|
-
* -
|
|
6
|
-
* -
|
|
7
|
-
* - Streaming responses
|
|
8
|
-
* - Multi-step wizards
|
|
4
|
+
* Enables photon tools to use async generator functions with `yield` for:
|
|
5
|
+
* - Interactive user input (ask) - blocks until user responds
|
|
6
|
+
* - Real-time output (emit) - fire and forget, no response needed
|
|
9
7
|
*
|
|
10
|
-
*
|
|
11
|
-
*
|
|
12
|
-
*
|
|
13
|
-
*
|
|
14
|
-
*
|
|
8
|
+
* ══════════════════════════════════════════════════════════════════════════════
|
|
9
|
+
* DESIGN PHILOSOPHY
|
|
10
|
+
* ══════════════════════════════════════════════════════════════════════════════
|
|
11
|
+
*
|
|
12
|
+
* The `ask` vs `emit` pattern provides instant clarity:
|
|
13
|
+
* - `ask` = "I need something FROM the user" (blocks, returns value)
|
|
14
|
+
* - `emit` = "I'm sending something TO the user" (non-blocking, void)
|
|
15
|
+
*
|
|
16
|
+
* This maps naturally to all runtime contexts:
|
|
17
|
+
*
|
|
18
|
+
* | Runtime | ask (input) | emit (output) |
|
|
19
|
+
* |------------|--------------------------|----------------------------|
|
|
20
|
+
* | REST API | Returns 202 + continue | Included in response or SSE|
|
|
21
|
+
* | WebSocket | Server request → client | Server push to client |
|
|
22
|
+
* | CLI | Readline prompt | Console output |
|
|
23
|
+
* | MCP | Elicitation dialog | Notification/logging |
|
|
24
|
+
* | Chatbot | Bot question → user reply| Status message, typing... |
|
|
25
|
+
*
|
|
26
|
+
* ══════════════════════════════════════════════════════════════════════════════
|
|
27
|
+
* REST API CONTINUATION PATTERN
|
|
28
|
+
* ══════════════════════════════════════════════════════════════════════════════
|
|
29
|
+
*
|
|
30
|
+
* When a generator yields `ask`, REST APIs can implement a continuation flow:
|
|
31
|
+
*
|
|
32
|
+
* ```
|
|
33
|
+
* POST /api/google-tv/connect
|
|
34
|
+
* Body: { ip: "192.168.1.100" }
|
|
35
|
+
*
|
|
36
|
+
* Response (202 Accepted):
|
|
37
|
+
* {
|
|
38
|
+
* "status": "awaiting_input",
|
|
39
|
+
* "continuation_id": "ctx_abc123",
|
|
40
|
+
* "ask": { "type": "text", "id": "pairing_code", "message": "Enter code:" },
|
|
41
|
+
* "continue": "/api/google-tv/connect/ctx_abc123"
|
|
42
|
+
* }
|
|
43
|
+
*
|
|
44
|
+
* POST /api/google-tv/connect/ctx_abc123
|
|
45
|
+
* Body: { "pairing_code": "123456" }
|
|
46
|
+
*
|
|
47
|
+
* Response (200 OK):
|
|
48
|
+
* { "status": "complete", "result": { "success": true } }
|
|
49
|
+
* ```
|
|
50
|
+
*
|
|
51
|
+
* ══════════════════════════════════════════════════════════════════════════════
|
|
52
|
+
* USAGE EXAMPLE
|
|
53
|
+
* ══════════════════════════════════════════════════════════════════════════════
|
|
15
54
|
*
|
|
16
|
-
* @example
|
|
17
55
|
* ```typescript
|
|
18
56
|
* async *connect(params: { ip: string }) {
|
|
19
|
-
*
|
|
57
|
+
* yield { emit: 'status', message: 'Connecting to TV...' };
|
|
58
|
+
*
|
|
59
|
+
* await this.startPairing(params.ip);
|
|
20
60
|
*
|
|
61
|
+
* yield { emit: 'progress', value: 0.3, message: 'Waiting for code...' };
|
|
62
|
+
*
|
|
63
|
+
* // Blocks until user provides input
|
|
21
64
|
* const code: string = yield {
|
|
22
|
-
*
|
|
23
|
-
*
|
|
65
|
+
* ask: 'text',
|
|
66
|
+
* id: 'pairing_code',
|
|
67
|
+
* message: 'Enter the 6-digit code shown on TV:',
|
|
68
|
+
* pattern: '^[0-9]{6}$',
|
|
69
|
+
* required: true
|
|
24
70
|
* };
|
|
25
71
|
*
|
|
72
|
+
* yield { emit: 'status', message: 'Verifying code...' };
|
|
73
|
+
*
|
|
26
74
|
* await this.sendCode(code);
|
|
27
|
-
*
|
|
75
|
+
*
|
|
76
|
+
* yield { emit: 'toast', message: 'Connected!', type: 'success' };
|
|
77
|
+
*
|
|
78
|
+
* return { success: true, paired: true };
|
|
28
79
|
* }
|
|
29
80
|
* ```
|
|
81
|
+
*
|
|
82
|
+
* @module generator
|
|
30
83
|
*/
|
|
84
|
+
// ══════════════════════════════════════════════════════════════════════════════
|
|
85
|
+
// TYPE GUARDS - Check what kind of yield we have
|
|
86
|
+
// ══════════════════════════════════════════════════════════════════════════════
|
|
31
87
|
/**
|
|
32
|
-
* Check if
|
|
88
|
+
* Check if yield is an ask (requires user input)
|
|
89
|
+
*
|
|
90
|
+
* @example
|
|
91
|
+
* if (isAskYield(yielded)) {
|
|
92
|
+
* const userInput = await promptUser(yielded);
|
|
93
|
+
* generator.next(userInput);
|
|
94
|
+
* }
|
|
33
95
|
*/
|
|
34
|
-
export function
|
|
35
|
-
return '
|
|
96
|
+
export function isAskYield(y) {
|
|
97
|
+
return 'ask' in y;
|
|
36
98
|
}
|
|
37
99
|
/**
|
|
38
|
-
* Check if
|
|
100
|
+
* Check if yield is an emit (output only, no response needed)
|
|
101
|
+
*
|
|
102
|
+
* @example
|
|
103
|
+
* if (isEmitYield(yielded)) {
|
|
104
|
+
* handleOutput(yielded);
|
|
105
|
+
* generator.next(); // Continue without value
|
|
106
|
+
* }
|
|
39
107
|
*/
|
|
40
|
-
export function
|
|
41
|
-
return '
|
|
108
|
+
export function isEmitYield(y) {
|
|
109
|
+
return 'emit' in y;
|
|
42
110
|
}
|
|
43
111
|
/**
|
|
44
|
-
*
|
|
112
|
+
* Get the type of an ask yield
|
|
45
113
|
*/
|
|
46
|
-
export function
|
|
47
|
-
return
|
|
114
|
+
export function getAskType(y) {
|
|
115
|
+
return y.ask;
|
|
48
116
|
}
|
|
49
117
|
/**
|
|
50
|
-
*
|
|
118
|
+
* Get the type of an emit yield
|
|
51
119
|
*/
|
|
52
|
-
export function
|
|
53
|
-
return
|
|
120
|
+
export function getEmitType(y) {
|
|
121
|
+
return y.emit;
|
|
122
|
+
}
|
|
123
|
+
// ══════════════════════════════════════════════════════════════════════════════
|
|
124
|
+
// GENERATOR DETECTION
|
|
125
|
+
// ══════════════════════════════════════════════════════════════════════════════
|
|
126
|
+
/**
|
|
127
|
+
* Check if a function is an async generator function
|
|
128
|
+
*
|
|
129
|
+
* @example
|
|
130
|
+
* if (isAsyncGeneratorFunction(method)) {
|
|
131
|
+
* const gen = method.call(instance, params);
|
|
132
|
+
* await executeGenerator(gen, config);
|
|
133
|
+
* }
|
|
134
|
+
*/
|
|
135
|
+
export function isAsyncGeneratorFunction(fn) {
|
|
136
|
+
if (!fn)
|
|
137
|
+
return false;
|
|
138
|
+
const constructor = fn.constructor;
|
|
139
|
+
if (!constructor)
|
|
140
|
+
return false;
|
|
141
|
+
if (constructor.name === 'AsyncGeneratorFunction')
|
|
142
|
+
return true;
|
|
143
|
+
const prototype = Object.getPrototypeOf(fn);
|
|
144
|
+
return prototype?.constructor?.name === 'AsyncGeneratorFunction';
|
|
54
145
|
}
|
|
55
|
-
// ============================================================================
|
|
56
|
-
// Generator Executor - Runs generator tools
|
|
57
|
-
// ============================================================================
|
|
58
146
|
/**
|
|
59
|
-
*
|
|
147
|
+
* Check if a value is an async generator instance (already invoked)
|
|
148
|
+
*
|
|
149
|
+
* @example
|
|
150
|
+
* const result = method.call(instance, params);
|
|
151
|
+
* if (isAsyncGenerator(result)) {
|
|
152
|
+
* await executeGenerator(result, config);
|
|
153
|
+
* }
|
|
154
|
+
*/
|
|
155
|
+
export function isAsyncGenerator(obj) {
|
|
156
|
+
return obj &&
|
|
157
|
+
typeof obj.next === 'function' &&
|
|
158
|
+
typeof obj.return === 'function' &&
|
|
159
|
+
typeof obj.throw === 'function' &&
|
|
160
|
+
typeof obj[Symbol.asyncIterator] === 'function';
|
|
161
|
+
}
|
|
162
|
+
// ══════════════════════════════════════════════════════════════════════════════
|
|
163
|
+
// GENERATOR EXECUTOR - Runs generator tools to completion
|
|
164
|
+
// ══════════════════════════════════════════════════════════════════════════════
|
|
165
|
+
/**
|
|
166
|
+
* Execute a generator-based photon tool to completion.
|
|
167
|
+
*
|
|
168
|
+
* Handles the yield/resume loop:
|
|
169
|
+
* 1. Run generator until it yields
|
|
170
|
+
* 2. If ask yield: get input from provider (or pre-provided), resume with value
|
|
171
|
+
* 3. If emit yield: call output handler, resume without value
|
|
172
|
+
* 4. Repeat until generator returns
|
|
60
173
|
*
|
|
61
174
|
* @param generator - The async generator to execute
|
|
62
175
|
* @param config - Configuration for handling yields
|
|
63
176
|
* @returns The final return value of the generator
|
|
64
177
|
*
|
|
65
178
|
* @example
|
|
66
|
-
*
|
|
67
|
-
*
|
|
68
|
-
*
|
|
69
|
-
* if ('
|
|
70
|
-
* if ('confirm' in y) return await confirm(y.confirm);
|
|
179
|
+
* const result = await executeGenerator(photon.connect({ ip: '192.168.1.1' }), {
|
|
180
|
+
* inputProvider: async (ask) => {
|
|
181
|
+
* if (ask.ask === 'text') return await readline(ask.message);
|
|
182
|
+
* if (ask.ask === 'confirm') return await confirm(ask.message);
|
|
71
183
|
* },
|
|
72
|
-
* outputHandler: (
|
|
73
|
-
* if ('progress'
|
|
184
|
+
* outputHandler: (emit) => {
|
|
185
|
+
* if (emit.emit === 'progress') console.log(`${emit.value * 100}%`);
|
|
74
186
|
* }
|
|
75
187
|
* });
|
|
76
|
-
* ```
|
|
77
188
|
*/
|
|
78
189
|
export async function executeGenerator(generator, config) {
|
|
79
190
|
const { inputProvider, outputHandler, preProvidedInputs } = config;
|
|
80
|
-
let
|
|
191
|
+
let askIndex = 0;
|
|
81
192
|
let result = await generator.next();
|
|
82
193
|
while (!result.done) {
|
|
83
194
|
const yielded = result.value;
|
|
84
|
-
// Handle
|
|
85
|
-
if (
|
|
86
|
-
// Generate
|
|
87
|
-
const
|
|
195
|
+
// Handle ask yields (need input)
|
|
196
|
+
if (isAskYield(yielded)) {
|
|
197
|
+
// Generate id if not provided
|
|
198
|
+
const askId = yielded.id || `ask_${askIndex++}`;
|
|
88
199
|
// Check for pre-provided input (REST API style)
|
|
89
|
-
if (preProvidedInputs &&
|
|
90
|
-
result = await generator.next(preProvidedInputs[
|
|
200
|
+
if (preProvidedInputs && askId in preProvidedInputs) {
|
|
201
|
+
result = await generator.next(preProvidedInputs[askId]);
|
|
91
202
|
continue;
|
|
92
203
|
}
|
|
93
204
|
// Get input from provider
|
|
94
205
|
const input = await inputProvider(yielded);
|
|
95
206
|
result = await generator.next(input);
|
|
96
207
|
}
|
|
97
|
-
// Handle
|
|
98
|
-
else {
|
|
208
|
+
// Handle emit yields (output only)
|
|
209
|
+
else if (isEmitYield(yielded)) {
|
|
99
210
|
if (outputHandler) {
|
|
100
211
|
await outputHandler(yielded);
|
|
101
212
|
}
|
|
102
213
|
// Continue without providing a value
|
|
103
214
|
result = await generator.next();
|
|
104
215
|
}
|
|
216
|
+
// Unknown yield type - skip
|
|
217
|
+
else {
|
|
218
|
+
console.warn('[generator] Unknown yield type:', yielded);
|
|
219
|
+
result = await generator.next();
|
|
220
|
+
}
|
|
105
221
|
}
|
|
106
222
|
return result.value;
|
|
107
223
|
}
|
|
108
|
-
// ============================================================================
|
|
109
|
-
// Generator Detection - Check if a function is a generator
|
|
110
|
-
// ============================================================================
|
|
111
224
|
/**
|
|
112
|
-
*
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
return false;
|
|
117
|
-
const constructor = fn.constructor;
|
|
118
|
-
if (!constructor)
|
|
119
|
-
return false;
|
|
120
|
-
if (constructor.name === 'AsyncGeneratorFunction')
|
|
121
|
-
return true;
|
|
122
|
-
// Check prototype chain
|
|
123
|
-
const prototype = Object.getPrototypeOf(fn);
|
|
124
|
-
return prototype && prototype.constructor &&
|
|
125
|
-
prototype.constructor.name === 'AsyncGeneratorFunction';
|
|
126
|
-
}
|
|
127
|
-
/**
|
|
128
|
-
* Check if a value is an async generator (already invoked)
|
|
129
|
-
*/
|
|
130
|
-
export function isAsyncGenerator(obj) {
|
|
131
|
-
return obj &&
|
|
132
|
-
typeof obj.next === 'function' &&
|
|
133
|
-
typeof obj.return === 'function' &&
|
|
134
|
-
typeof obj.throw === 'function' &&
|
|
135
|
-
typeof obj[Symbol.asyncIterator] === 'function';
|
|
136
|
-
}
|
|
137
|
-
/**
|
|
138
|
-
* Extract yield information by running generator with mock provider
|
|
139
|
-
* This is used for REST API schema generation
|
|
225
|
+
* Extract ask yield information by running generator with mock provider.
|
|
226
|
+
*
|
|
227
|
+
* This is used for REST API schema generation - each ask becomes
|
|
228
|
+
* an optional request parameter.
|
|
140
229
|
*
|
|
141
|
-
* Note:
|
|
142
|
-
*
|
|
230
|
+
* Note: Only extracts asks reachable with default/empty inputs.
|
|
231
|
+
* Conditional asks may not be discovered.
|
|
232
|
+
*
|
|
233
|
+
* @example
|
|
234
|
+
* const asks = await extractAsks(Photon.prototype.connect, { ip: '' });
|
|
235
|
+
* // Returns: [{ id: 'pairing_code', type: 'text', message: '...' }]
|
|
236
|
+
* // These become optional query/body params in REST API
|
|
143
237
|
*/
|
|
144
|
-
export async function
|
|
145
|
-
const
|
|
146
|
-
let
|
|
238
|
+
export async function extractAsks(generatorFn, mockParams = {}) {
|
|
239
|
+
const asks = [];
|
|
240
|
+
let askIndex = 0;
|
|
147
241
|
try {
|
|
148
242
|
const generator = generatorFn(mockParams);
|
|
149
243
|
let result = await generator.next();
|
|
150
244
|
while (!result.done) {
|
|
151
245
|
const yielded = result.value;
|
|
152
|
-
if (
|
|
153
|
-
const id = yielded.id || `
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
result = await generator.next(yielded.default || '');
|
|
246
|
+
if (isAskYield(yielded)) {
|
|
247
|
+
const id = yielded.id || `ask_${askIndex++}`;
|
|
248
|
+
const extracted = {
|
|
249
|
+
id,
|
|
250
|
+
type: yielded.ask,
|
|
251
|
+
message: yielded.message,
|
|
252
|
+
required: yielded.required,
|
|
253
|
+
};
|
|
254
|
+
// Extract type-specific properties
|
|
255
|
+
if (yielded.ask === 'text') {
|
|
256
|
+
extracted.default = yielded.default;
|
|
257
|
+
extracted.pattern = yielded.pattern;
|
|
165
258
|
}
|
|
166
|
-
else if ('confirm'
|
|
167
|
-
|
|
168
|
-
id,
|
|
169
|
-
type: 'confirm',
|
|
170
|
-
prompt: yielded.confirm,
|
|
171
|
-
dangerous: yielded.dangerous,
|
|
172
|
-
});
|
|
173
|
-
result = await generator.next(true);
|
|
259
|
+
else if (yielded.ask === 'confirm') {
|
|
260
|
+
extracted.default = yielded.default;
|
|
174
261
|
}
|
|
175
|
-
else if ('select'
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
type: 'select',
|
|
179
|
-
prompt: yielded.select,
|
|
180
|
-
options: yielded.options,
|
|
181
|
-
multi: yielded.multi,
|
|
182
|
-
});
|
|
183
|
-
const firstOption = yielded.options[0];
|
|
184
|
-
const mockValue = typeof firstOption === 'string' ? firstOption : firstOption.value;
|
|
185
|
-
result = await generator.next(yielded.multi ? [mockValue] : mockValue);
|
|
262
|
+
else if (yielded.ask === 'select') {
|
|
263
|
+
extracted.options = yielded.options;
|
|
264
|
+
extracted.default = yielded.default;
|
|
186
265
|
}
|
|
266
|
+
else if (yielded.ask === 'number') {
|
|
267
|
+
extracted.default = yielded.default;
|
|
268
|
+
extracted.min = yielded.min;
|
|
269
|
+
extracted.max = yielded.max;
|
|
270
|
+
}
|
|
271
|
+
asks.push(extracted);
|
|
272
|
+
// Provide mock value to continue
|
|
273
|
+
const mockValue = getMockValue(yielded);
|
|
274
|
+
result = await generator.next(mockValue);
|
|
187
275
|
}
|
|
188
276
|
else {
|
|
189
|
-
// Skip
|
|
277
|
+
// Skip emit yields
|
|
190
278
|
result = await generator.next();
|
|
191
279
|
}
|
|
192
280
|
}
|
|
@@ -194,55 +282,129 @@ export async function extractYields(generatorFn, mockParams = {}) {
|
|
|
194
282
|
catch (error) {
|
|
195
283
|
// Generator may throw if it needs real resources
|
|
196
284
|
// Return what we've extracted so far
|
|
197
|
-
console.warn('[generator]
|
|
285
|
+
console.warn('[generator] Ask extraction incomplete:', error);
|
|
286
|
+
}
|
|
287
|
+
return asks;
|
|
288
|
+
}
|
|
289
|
+
/**
|
|
290
|
+
* Get a mock value for an ask yield (for extraction purposes)
|
|
291
|
+
*/
|
|
292
|
+
function getMockValue(ask) {
|
|
293
|
+
switch (ask.ask) {
|
|
294
|
+
case 'text':
|
|
295
|
+
case 'password':
|
|
296
|
+
return ask.default || '';
|
|
297
|
+
case 'confirm':
|
|
298
|
+
return ask.default ?? true;
|
|
299
|
+
case 'select':
|
|
300
|
+
const select = ask;
|
|
301
|
+
const firstOpt = select.options[0];
|
|
302
|
+
const firstVal = typeof firstOpt === 'string' ? firstOpt : firstOpt.value;
|
|
303
|
+
return select.multi ? [firstVal] : firstVal;
|
|
304
|
+
case 'number':
|
|
305
|
+
return ask.default ?? 0;
|
|
306
|
+
case 'file':
|
|
307
|
+
return null;
|
|
308
|
+
case 'date':
|
|
309
|
+
return ask.default || new Date().toISOString();
|
|
310
|
+
default:
|
|
311
|
+
return null;
|
|
198
312
|
}
|
|
199
|
-
return yields;
|
|
200
313
|
}
|
|
201
|
-
//
|
|
202
|
-
//
|
|
203
|
-
//
|
|
314
|
+
// ══════════════════════════════════════════════════════════════════════════════
|
|
315
|
+
// BUILT-IN INPUT PROVIDERS
|
|
316
|
+
// ══════════════════════════════════════════════════════════════════════════════
|
|
204
317
|
/**
|
|
205
|
-
*
|
|
206
|
-
*
|
|
318
|
+
* Error thrown when input is required but not available.
|
|
319
|
+
*
|
|
320
|
+
* REST APIs can catch this to return a continuation response.
|
|
321
|
+
*
|
|
322
|
+
* @example
|
|
323
|
+
* try {
|
|
324
|
+
* await executeGenerator(gen, { inputProvider: createPrefilledProvider({}) });
|
|
325
|
+
* } catch (e) {
|
|
326
|
+
* if (e instanceof NeedsInputError) {
|
|
327
|
+
* return {
|
|
328
|
+
* status: 'awaiting_input',
|
|
329
|
+
* ask: e.ask,
|
|
330
|
+
* continuation_id: saveContinuation(gen)
|
|
331
|
+
* };
|
|
332
|
+
* }
|
|
333
|
+
* }
|
|
334
|
+
*/
|
|
335
|
+
export class NeedsInputError extends Error {
|
|
336
|
+
ask;
|
|
337
|
+
constructor(ask) {
|
|
338
|
+
super(`Input required: ${ask.message}`);
|
|
339
|
+
this.name = 'NeedsInputError';
|
|
340
|
+
this.ask = ask;
|
|
341
|
+
}
|
|
342
|
+
}
|
|
343
|
+
/**
|
|
344
|
+
* Create an input provider from pre-provided values.
|
|
345
|
+
* Throws NeedsInputError if a required value is missing.
|
|
346
|
+
*
|
|
347
|
+
* Use for REST APIs where all inputs are provided upfront.
|
|
348
|
+
*
|
|
349
|
+
* @example
|
|
350
|
+
* const provider = createPrefilledProvider({
|
|
351
|
+
* name: 'John',
|
|
352
|
+
* confirmed: true
|
|
353
|
+
* });
|
|
207
354
|
*/
|
|
208
355
|
export function createPrefilledProvider(inputs) {
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
const id = yielded.id || 'default';
|
|
356
|
+
let askIndex = 0;
|
|
357
|
+
return async (ask) => {
|
|
358
|
+
const id = ask.id || `ask_${askIndex++}`;
|
|
213
359
|
if (id in inputs) {
|
|
214
360
|
return inputs[id];
|
|
215
361
|
}
|
|
216
362
|
// Check for default value
|
|
217
|
-
if ('
|
|
218
|
-
return
|
|
363
|
+
if ('default' in ask && ask.default !== undefined) {
|
|
364
|
+
return ask.default;
|
|
219
365
|
}
|
|
220
|
-
|
|
366
|
+
// No input available
|
|
367
|
+
throw new NeedsInputError(ask);
|
|
221
368
|
};
|
|
222
369
|
}
|
|
370
|
+
// ══════════════════════════════════════════════════════════════════════════════
|
|
371
|
+
// UTILITY: Wrap regular function as generator
|
|
372
|
+
// ══════════════════════════════════════════════════════════════════════════════
|
|
223
373
|
/**
|
|
224
|
-
*
|
|
225
|
-
*
|
|
374
|
+
* Wrap a regular async function to behave like a generator.
|
|
375
|
+
* Useful for uniform handling in runtimes.
|
|
376
|
+
*
|
|
377
|
+
* @example
|
|
378
|
+
* const gen = wrapAsGenerator(() => photon.simpleMethod(params));
|
|
379
|
+
* const result = await executeGenerator(gen, config);
|
|
226
380
|
*/
|
|
227
|
-
export
|
|
228
|
-
|
|
229
|
-
constructor(yielded) {
|
|
230
|
-
const message = 'prompt' in yielded ? yielded.prompt :
|
|
231
|
-
'confirm' in yielded ? yielded.confirm :
|
|
232
|
-
'select' in yielded ? yielded.select : 'Input required';
|
|
233
|
-
super(`Input required: ${message}`);
|
|
234
|
-
this.name = 'NeedsInputError';
|
|
235
|
-
this.yielded = yielded;
|
|
236
|
-
}
|
|
381
|
+
export async function* wrapAsGenerator(asyncFn) {
|
|
382
|
+
return await asyncFn();
|
|
237
383
|
}
|
|
238
|
-
// ============================================================================
|
|
239
|
-
// Utility: Wrap regular async function to match generator interface
|
|
240
|
-
// ============================================================================
|
|
241
384
|
/**
|
|
242
|
-
*
|
|
243
|
-
* Useful for uniform handling in runtimes
|
|
385
|
+
* @deprecated Use isAskYield instead
|
|
244
386
|
*/
|
|
245
|
-
export
|
|
246
|
-
|
|
387
|
+
export const isInputYield = isAskYield;
|
|
388
|
+
/**
|
|
389
|
+
* @deprecated Use isEmitYield instead
|
|
390
|
+
*/
|
|
391
|
+
export function isProgressYield(y) {
|
|
392
|
+
return isEmitYield(y) && y.emit === 'progress';
|
|
393
|
+
}
|
|
394
|
+
/**
|
|
395
|
+
* @deprecated Use isEmitYield instead
|
|
396
|
+
*/
|
|
397
|
+
export function isStreamYield(y) {
|
|
398
|
+
return isEmitYield(y) && y.emit === 'stream';
|
|
399
|
+
}
|
|
400
|
+
/**
|
|
401
|
+
* @deprecated Use isEmitYield instead
|
|
402
|
+
*/
|
|
403
|
+
export function isLogYield(y) {
|
|
404
|
+
return isEmitYield(y) && y.emit === 'log';
|
|
247
405
|
}
|
|
406
|
+
/**
|
|
407
|
+
* @deprecated Use extractAsks instead
|
|
408
|
+
*/
|
|
409
|
+
export const extractYields = extractAsks;
|
|
248
410
|
//# sourceMappingURL=generator.js.map
|
package/dist/generator.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"generator.js","sourceRoot":"","sources":["../src/generator.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"generator.js","sourceRoot":"","sources":["../src/generator.ts"],"names":[],"mappings":"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"}
|