@kernlang/python 3.5.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 (63) hide show
  1. package/LICENSE +678 -0
  2. package/README.md +26 -0
  3. package/dist/codegen-body-python.d.ts +152 -0
  4. package/dist/codegen-body-python.js +1648 -0
  5. package/dist/codegen-body-python.js.map +1 -0
  6. package/dist/codegen-helpers.d.ts +21 -0
  7. package/dist/codegen-helpers.js +352 -0
  8. package/dist/codegen-helpers.js.map +1 -0
  9. package/dist/codegen-python.d.ts +17 -0
  10. package/dist/codegen-python.js +106 -0
  11. package/dist/codegen-python.js.map +1 -0
  12. package/dist/fastapi-middleware.d.ts +8 -0
  13. package/dist/fastapi-middleware.js +87 -0
  14. package/dist/fastapi-middleware.js.map +1 -0
  15. package/dist/fastapi-portable.d.ts +9 -0
  16. package/dist/fastapi-portable.js +295 -0
  17. package/dist/fastapi-portable.js.map +1 -0
  18. package/dist/fastapi-raw-handler.d.ts +28 -0
  19. package/dist/fastapi-raw-handler.js +282 -0
  20. package/dist/fastapi-raw-handler.js.map +1 -0
  21. package/dist/fastapi-response.d.ts +13 -0
  22. package/dist/fastapi-response.js +150 -0
  23. package/dist/fastapi-response.js.map +1 -0
  24. package/dist/fastapi-route.d.ts +12 -0
  25. package/dist/fastapi-route.js +629 -0
  26. package/dist/fastapi-route.js.map +1 -0
  27. package/dist/fastapi-types.d.ts +39 -0
  28. package/dist/fastapi-types.js +5 -0
  29. package/dist/fastapi-types.js.map +1 -0
  30. package/dist/fastapi-utils.d.ts +16 -0
  31. package/dist/fastapi-utils.js +99 -0
  32. package/dist/fastapi-utils.js.map +1 -0
  33. package/dist/fastapi-websocket.d.ts +6 -0
  34. package/dist/fastapi-websocket.js +77 -0
  35. package/dist/fastapi-websocket.js.map +1 -0
  36. package/dist/generators/core.d.ts +23 -0
  37. package/dist/generators/core.js +906 -0
  38. package/dist/generators/core.js.map +1 -0
  39. package/dist/generators/data.d.ts +15 -0
  40. package/dist/generators/data.js +443 -0
  41. package/dist/generators/data.js.map +1 -0
  42. package/dist/generators/ground.d.ts +20 -0
  43. package/dist/generators/ground.js +333 -0
  44. package/dist/generators/ground.js.map +1 -0
  45. package/dist/generators/infra.d.ts +8 -0
  46. package/dist/generators/infra.js +109 -0
  47. package/dist/generators/infra.js.map +1 -0
  48. package/dist/index.d.ts +6 -0
  49. package/dist/index.js +7 -0
  50. package/dist/index.js.map +1 -0
  51. package/dist/ir-semantics/python-leg.d.ts +45 -0
  52. package/dist/ir-semantics/python-leg.js +291 -0
  53. package/dist/ir-semantics/python-leg.js.map +1 -0
  54. package/dist/python-stdlib-preamble.d.ts +32 -0
  55. package/dist/python-stdlib-preamble.js +86 -0
  56. package/dist/python-stdlib-preamble.js.map +1 -0
  57. package/dist/transpiler-fastapi.d.ts +8 -0
  58. package/dist/transpiler-fastapi.js +593 -0
  59. package/dist/transpiler-fastapi.js.map +1 -0
  60. package/dist/type-map.d.ts +14 -0
  61. package/dist/type-map.js +288 -0
  62. package/dist/type-map.js.map +1 -0
  63. package/package.json +37 -0
@@ -0,0 +1,333 @@
1
+ /**
2
+ * Ground Layer generators — Python generation for KERN's ground-truth nodes:
3
+ * derive, transform, action, guard, assume, invariant, each, collect, branch, resolve, expect, recover
4
+ */
5
+ import { handlerCode } from '@kernlang/core';
6
+ import { buildPythonParamList, emitPyLowConfidenceTodo, emitPyReasonAnnotations, firstChild, kids, p, } from '../codegen-helpers.js';
7
+ import { mapTsTypeToPython, toSnakeCase } from '../type-map.js';
8
+ /**
9
+ * Common preamble extracted from all ground layer generators.
10
+ * Returns { annotations, todo, props, name } ready for use.
11
+ */
12
+ function groundPreamble(node) {
13
+ const annotations = emitPyReasonAnnotations(node);
14
+ const conf = p(node).confidence;
15
+ const todo = emitPyLowConfidenceTodo(node, conf);
16
+ const props = p(node);
17
+ const name = toSnakeCase(props.name);
18
+ return { annotations, todo, props, name };
19
+ }
20
+ // ── derive ──────────────────────────────────────────────────────────────
21
+ export function generateDerive(node) {
22
+ const { annotations, todo, props, name } = groundPreamble(node);
23
+ const expr = props.expr;
24
+ const constType = props.type;
25
+ const typeAnnotation = constType ? `: ${mapTsTypeToPython(constType)}` : '';
26
+ return [...todo, ...annotations, `${name}${typeAnnotation} = ${expr}`];
27
+ }
28
+ // ── transform ───────────────────────────────────────────────────────────
29
+ export function generateTransform(node) {
30
+ const { annotations, todo, props, name } = groundPreamble(node);
31
+ const target = props.target;
32
+ const via = props.via;
33
+ const constType = props.type;
34
+ const code = handlerCode(node);
35
+ const typeAnnotation = constType ? `: ${mapTsTypeToPython(constType)}` : '';
36
+ if (code) {
37
+ const lines = [...todo, ...annotations];
38
+ lines.push(`def ${name}(state)${typeAnnotation}:`);
39
+ for (const line of code.split('\n')) {
40
+ lines.push(` ${line}`);
41
+ }
42
+ return lines;
43
+ }
44
+ if (target && via) {
45
+ return [
46
+ ...todo,
47
+ ...annotations,
48
+ `${name}${typeAnnotation} = ${via.replace(/\(/, `(${target}, `).replace(/, \)/, ')')}`,
49
+ ];
50
+ }
51
+ if (via) {
52
+ return [...todo, ...annotations, `${name}${typeAnnotation} = ${via}`];
53
+ }
54
+ return [...todo, ...annotations, `${name}${typeAnnotation} = None`];
55
+ }
56
+ // ── action ──────────────────────────────────────────────────────────────
57
+ export function generateAction(node) {
58
+ const { annotations, todo, props, name } = groundPreamble(node);
59
+ const idempotent = props.idempotent === 'true' || props.idempotent === true;
60
+ const reversible = props.reversible === 'true' || props.reversible === true;
61
+ const returns = props.returns;
62
+ const code = handlerCode(node);
63
+ // Slice 3c P2 follow-up: target-neutral helper reads structured `param`
64
+ // children when present, falls back to legacy `params="..."` otherwise.
65
+ const paramList = buildPythonParamList(node);
66
+ const retClause = returns ? ` -> ${mapTsTypeToPython(returns)}` : ' -> None';
67
+ const lines = [...todo, ...annotations];
68
+ lines.push(`async def ${name}(${paramList})${retClause}:`);
69
+ // Docstring with metadata
70
+ const metaParts = [];
71
+ if (idempotent)
72
+ metaParts.push('idempotent=True');
73
+ if (reversible)
74
+ metaParts.push('reversible=True');
75
+ if (metaParts.length > 0) {
76
+ lines.push(` """@action ${metaParts.join(' ')}"""`);
77
+ }
78
+ if (code) {
79
+ for (const line of code.split('\n')) {
80
+ lines.push(` ${line}`);
81
+ }
82
+ }
83
+ else {
84
+ lines.push(' pass');
85
+ }
86
+ return lines;
87
+ }
88
+ // ── guard ───────────────────────────────────────────────────────────────
89
+ export function generateGuard(node) {
90
+ const annotations = emitPyReasonAnnotations(node);
91
+ const conf = p(node).confidence;
92
+ const todo = emitPyLowConfidenceTodo(node, conf);
93
+ const props = p(node);
94
+ const name = props.name || 'guard';
95
+ const expr = props.expr;
96
+ const elseCode = props.else;
97
+ if (elseCode && /^\d+$/.test(elseCode)) {
98
+ return [
99
+ ...todo,
100
+ ...annotations,
101
+ `if not (${expr}):\n raise HTTPException(status_code=${elseCode}, detail="Guard: ${name}")`,
102
+ ];
103
+ }
104
+ else if (elseCode) {
105
+ return [...todo, ...annotations, `if not (${expr}):\n ${elseCode}`];
106
+ }
107
+ return [...todo, ...annotations, `if not (${expr}):\n raise ValueError("Guard failed: ${name}")`];
108
+ }
109
+ // ── assume ──────────────────────────────────────────────────────────────
110
+ export function generateAssume(node) {
111
+ const annotations = emitPyReasonAnnotations(node);
112
+ const conf = p(node).confidence;
113
+ const todo = emitPyLowConfidenceTodo(node, conf);
114
+ const props = p(node);
115
+ const expr = props.expr;
116
+ const name = props.name || 'assumption';
117
+ return [...todo, ...annotations, `assert ${expr}, "Assume failed: ${name}"`];
118
+ }
119
+ // ── invariant ───────────────────────────────────────────────────────────
120
+ export function generateInvariant(node) {
121
+ const annotations = emitPyReasonAnnotations(node);
122
+ const conf = p(node).confidence;
123
+ const todo = emitPyLowConfidenceTodo(node, conf);
124
+ const props = p(node);
125
+ const name = props.name || 'invariant';
126
+ const expr = props.expr;
127
+ return [...todo, ...annotations, `assert ${expr}, "Invariant: ${name}"`];
128
+ }
129
+ let _dispatcher = () => [];
130
+ /** Set the dispatcher function to break the circular dependency. */
131
+ export function setDispatcher(fn) {
132
+ _dispatcher = fn;
133
+ }
134
+ export function generateEach(node) {
135
+ const annotations = emitPyReasonAnnotations(node);
136
+ const conf = p(node).confidence;
137
+ const todo = emitPyLowConfidenceTodo(node, conf);
138
+ const props = p(node);
139
+ const name = props.name || 'item';
140
+ const collection = props.in;
141
+ const index = props.index;
142
+ const isAwait = props.await === true || props.await === 'true';
143
+ const lines = [...todo, ...annotations];
144
+ if (index) {
145
+ if (isAwait) {
146
+ throw new Error('each await=true cannot be combined with index=');
147
+ }
148
+ lines.push(`for ${index}, ${name} in enumerate(${collection}):`);
149
+ }
150
+ else {
151
+ lines.push(`${isAwait ? 'async ' : ''}for ${name} in ${collection}:`);
152
+ }
153
+ const children = kids(node);
154
+ if (children.length === 0) {
155
+ lines.push(' pass');
156
+ }
157
+ else {
158
+ for (const child of children) {
159
+ const childLines = _dispatcher(child);
160
+ for (const line of childLines) {
161
+ lines.push(` ${line}`);
162
+ }
163
+ }
164
+ }
165
+ return lines;
166
+ }
167
+ // ── collect ─────────────────────────────────────────────────────────────
168
+ export function generateCollect(node) {
169
+ const { annotations, todo, props, name } = groundPreamble(node);
170
+ const from = props.from;
171
+ const where = props.where;
172
+ const limit = props.limit;
173
+ if (where && limit) {
174
+ return [...todo, ...annotations, `${name} = [item for item in ${from} if ${where}][:${limit}]`];
175
+ }
176
+ if (where) {
177
+ return [...todo, ...annotations, `${name} = [item for item in ${from} if ${where}]`];
178
+ }
179
+ if (limit) {
180
+ return [...todo, ...annotations, `${name} = ${from}[:${limit}]`];
181
+ }
182
+ return [...todo, ...annotations, `${name} = list(${from})`];
183
+ }
184
+ // ── branch / path ───────────────────────────────────────────────────────
185
+ export function generateBranch(node) {
186
+ const annotations = emitPyReasonAnnotations(node);
187
+ const conf = p(node).confidence;
188
+ const todo = emitPyLowConfidenceTodo(node, conf);
189
+ const props = p(node);
190
+ const name = props.name || 'branch';
191
+ const on = props.on;
192
+ const paths = kids(node, 'path');
193
+ const lines = [...todo, ...annotations];
194
+ lines.push(`# branch: ${name}`);
195
+ lines.push(`match ${on}:`);
196
+ for (const pathNode of paths) {
197
+ const pp = p(pathNode);
198
+ const value = pp.value;
199
+ lines.push(` case "${value}":`);
200
+ const children = kids(pathNode);
201
+ if (children.length === 0) {
202
+ lines.push(' pass');
203
+ }
204
+ else {
205
+ for (const child of children) {
206
+ const childLines = _dispatcher(child);
207
+ for (const line of childLines) {
208
+ lines.push(` ${line}`);
209
+ }
210
+ }
211
+ }
212
+ }
213
+ return lines;
214
+ }
215
+ // ── resolve ─────────────────────────────────────────────────────────────
216
+ export function generateResolve(node) {
217
+ const { annotations, todo, name } = groundPreamble(node);
218
+ const candidates = kids(node, 'candidate');
219
+ const discriminator = firstChild(node, 'discriminator');
220
+ if (!discriminator)
221
+ return [`# resolve: ${name} — missing discriminator`];
222
+ const dp = p(discriminator);
223
+ const method = dp.method || 'select';
224
+ const metric = dp.metric || '';
225
+ const lines = [...todo, ...annotations];
226
+ lines.push(`# resolve: ${name}`);
227
+ lines.push(`_${name}_candidates = [`);
228
+ for (const c of candidates) {
229
+ const cp = p(c);
230
+ const cname = cp.name;
231
+ const code = handlerCode(c);
232
+ lines.push(` {"name": "${cname}", "fn": lambda signal: ${code.trim() || 'None'}},`);
233
+ }
234
+ lines.push(`]`);
235
+ lines.push('');
236
+ const discCode = handlerCode(discriminator);
237
+ lines.push(`async def resolve_${name}(signal):`);
238
+ lines.push(` candidates = _${name}_candidates`);
239
+ lines.push(` # discriminator: ${method}(${metric})`);
240
+ if (discCode) {
241
+ for (const line of discCode.split('\n')) {
242
+ lines.push(` ${line}`);
243
+ }
244
+ }
245
+ lines.push(` return candidates[winner_idx]["fn"](signal)`);
246
+ return lines;
247
+ }
248
+ // ── expect ──────────────────────────────────────────────────────────────
249
+ export function generateExpect(node) {
250
+ const annotations = emitPyReasonAnnotations(node);
251
+ const conf = p(node).confidence;
252
+ const todo = emitPyLowConfidenceTodo(node, conf);
253
+ const props = p(node);
254
+ const name = toSnakeCase(props.name || 'expected');
255
+ const expr = props.expr;
256
+ const within = props.within;
257
+ const max = props.max;
258
+ const min = props.min;
259
+ if (within) {
260
+ const [lo, hi] = within.split('..');
261
+ return [
262
+ ...todo,
263
+ ...annotations,
264
+ `assert ${lo} <= (${expr}) <= ${hi}, f"Expected ${name} in [${lo}, ${hi}], got {${expr}}"`,
265
+ ];
266
+ }
267
+ if (min && max) {
268
+ return [
269
+ ...todo,
270
+ ...annotations,
271
+ `assert ${min} <= (${expr}) <= ${max}, f"Expected ${name} in [${min}, ${max}], got {${expr}}"`,
272
+ ];
273
+ }
274
+ if (max) {
275
+ return [...todo, ...annotations, `assert (${expr}) <= ${max}, f"Expected ${name} <= ${max}, got {${expr}}"`];
276
+ }
277
+ if (min) {
278
+ return [...todo, ...annotations, `assert (${expr}) >= ${min}, f"Expected ${name} >= ${min}, got {${expr}}"`];
279
+ }
280
+ return [...todo, ...annotations, `assert (${expr}) is not None, "Expected ${name} to be defined"`];
281
+ }
282
+ // ── recover ─────────────────────────────────────────────────────────────
283
+ export function generateRecover(node) {
284
+ const { annotations, todo, name } = groundPreamble(node);
285
+ const strategies = kids(node, 'strategy');
286
+ const lines = [...todo, ...annotations];
287
+ lines.push(`# recover: ${name}`);
288
+ lines.push(`async def ${name}_with_recovery(fn):`);
289
+ for (const strategy of strategies) {
290
+ const sp = p(strategy);
291
+ const sname = sp.name;
292
+ const code = handlerCode(strategy);
293
+ if (sname === 'retry') {
294
+ const max = Number(sp.max) || 3;
295
+ const delay = Number(sp.delay) || 1000;
296
+ lines.push(` # strategy: retry (max=${max}, delay=${delay}ms)`);
297
+ lines.push(` import asyncio`);
298
+ lines.push(` for _attempt in range(${max}):`);
299
+ lines.push(` try:`);
300
+ lines.push(` return await fn()`);
301
+ lines.push(` except Exception:`);
302
+ lines.push(` if _attempt < ${max - 1}:`);
303
+ lines.push(` await asyncio.sleep(${delay / 1000})`);
304
+ }
305
+ else if (sname === 'fallback') {
306
+ lines.push(` # strategy: fallback (terminal)`);
307
+ if (code) {
308
+ for (const line of code.split('\n')) {
309
+ lines.push(` ${line}`);
310
+ }
311
+ }
312
+ else {
313
+ lines.push(` raise RuntimeError("All recovery strategies exhausted for ${name}")`);
314
+ }
315
+ }
316
+ else {
317
+ lines.push(` # strategy: ${sname}`);
318
+ lines.push(` try:`);
319
+ if (code) {
320
+ for (const line of code.split('\n')) {
321
+ lines.push(` ${line}`);
322
+ }
323
+ }
324
+ else {
325
+ lines.push(` pass`);
326
+ }
327
+ lines.push(` except Exception:`);
328
+ lines.push(` pass`);
329
+ }
330
+ }
331
+ return lines;
332
+ }
333
+ //# sourceMappingURL=ground.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ground.js","sourceRoot":"","sources":["../../src/generators/ground.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Infrastructure generators — Python generation for KERN's infra nodes:
3
+ * job, storage, email
4
+ */
5
+ import type { IRNode } from '@kernlang/core';
6
+ export declare function generatePythonJob(node: IRNode): string[];
7
+ export declare function generatePythonStorage(node: IRNode): string[];
8
+ export declare function generatePythonEmail(node: IRNode): string[];
@@ -0,0 +1,109 @@
1
+ /**
2
+ * Infrastructure generators — Python generation for KERN's infra nodes:
3
+ * job, storage, email
4
+ */
5
+ import { handlerCode } from '@kernlang/core';
6
+ import { kids, p } from '../codegen-helpers.js';
7
+ import { mapTsTypeToPython, toSnakeCase } from '../type-map.js';
8
+ // ── Job (arq worker) ────────────────────────────────────────────────────
9
+ export function generatePythonJob(node) {
10
+ const props = p(node);
11
+ const name = toSnakeCase(props.name || 'job');
12
+ const _queue = props.queue || name;
13
+ const code = handlerCode(node);
14
+ const lines = [];
15
+ lines.push(`# Run: arq main.WorkerSettings`);
16
+ lines.push(`from arq import create_pool, func`);
17
+ lines.push(`from arq.connections import RedisSettings`);
18
+ lines.push('');
19
+ lines.push(`async def ${name}(ctx${kids(node, 'field').length > 0
20
+ ? ', ' +
21
+ kids(node, 'field')
22
+ .map((f) => `${toSnakeCase(p(f).name)}: ${mapTsTypeToPython(p(f).type || 'Any')}`)
23
+ .join(', ')
24
+ : ''}):`);
25
+ if (code) {
26
+ for (const line of code.split('\n'))
27
+ lines.push(` ${line}`);
28
+ }
29
+ else {
30
+ lines.push(` pass`);
31
+ }
32
+ lines.push('');
33
+ lines.push('');
34
+ lines.push(`class WorkerSettings:`);
35
+ lines.push(` functions = [func(${name}, name="${name}")]`);
36
+ lines.push(` redis_settings = RedisSettings()`);
37
+ return lines;
38
+ }
39
+ // ── Storage (S3/local) ──────────────────────────────────────────────────
40
+ export function generatePythonStorage(node) {
41
+ const props = p(node);
42
+ const provider = props.provider || 's3';
43
+ const bucket = props.bucket || 'my-app-uploads';
44
+ const lines = [];
45
+ if (provider === 's3') {
46
+ lines.push(`import aioboto3`);
47
+ lines.push(`import os`);
48
+ lines.push('');
49
+ lines.push(`BUCKET = os.environ.get("S3_BUCKET", "${bucket}")`);
50
+ lines.push(`REGION = os.environ.get("AWS_REGION", "us-east-1")`);
51
+ lines.push(`session = aioboto3.Session()`);
52
+ lines.push('');
53
+ lines.push(`async def upload_file(key: str, data: bytes, content_type: str) -> str:`);
54
+ lines.push(` async with session.client("s3", region_name=REGION) as s3:`);
55
+ lines.push(` await s3.put_object(Bucket=BUCKET, Key=key, Body=data, ContentType=content_type)`);
56
+ lines.push(` return key`);
57
+ lines.push('');
58
+ lines.push(`async def get_signed_url(key: str, expires_in: int = 3600) -> str:`);
59
+ lines.push(` async with session.client("s3", region_name=REGION) as s3:`);
60
+ lines.push(` return await s3.generate_presigned_url("get_object", Params={"Bucket": BUCKET, "Key": key}, ExpiresIn=expires_in)`);
61
+ }
62
+ else {
63
+ lines.push(`from pathlib import Path`);
64
+ lines.push('');
65
+ lines.push(`STORAGE_DIR = Path("./uploads")`);
66
+ lines.push(`STORAGE_DIR.mkdir(parents=True, exist_ok=True)`);
67
+ lines.push('');
68
+ lines.push(`async def upload_file(key: str, data: bytes) -> str:`);
69
+ lines.push(` (STORAGE_DIR / key).write_bytes(data)`);
70
+ lines.push(` return key`);
71
+ lines.push('');
72
+ lines.push(`async def read_file(key: str) -> bytes:`);
73
+ lines.push(` return (STORAGE_DIR / key).read_bytes()`);
74
+ }
75
+ return lines;
76
+ }
77
+ // ── Email (SendGrid/SMTP) ───────────────────────────────────────────────
78
+ export function generatePythonEmail(node) {
79
+ const props = p(node);
80
+ const provider = props.provider || 'smtp';
81
+ const from = props.from || 'noreply@example.com';
82
+ const lines = [];
83
+ if (provider === 'sendgrid') {
84
+ lines.push(`import httpx`);
85
+ lines.push(`import os`);
86
+ lines.push('');
87
+ lines.push(`SENDGRID_API_KEY = os.environ.get("SENDGRID_API_KEY", "")`);
88
+ lines.push(`DEFAULT_FROM = "${from}"`);
89
+ lines.push('');
90
+ lines.push(`async def send_email(to: str, subject: str, html: str, sender: str = DEFAULT_FROM) -> None:`);
91
+ lines.push(` async with httpx.AsyncClient() as client:`);
92
+ lines.push(` await client.post("https://api.sendgrid.com/v3/mail/send", headers={"Authorization": f"Bearer {SENDGRID_API_KEY}"}, json={"personalizations": [{"to": [{"email": to}]}], "from": {"email": sender}, "subject": subject, "content": [{"type": "text/html", "value": html}]})`);
93
+ }
94
+ else {
95
+ lines.push(`import aiosmtplib`);
96
+ lines.push(`from email.message import EmailMessage`);
97
+ lines.push(`import os`);
98
+ lines.push('');
99
+ lines.push(`async def send_email(to: str, subject: str, html: str, sender: str = "${from}") -> None:`);
100
+ lines.push(` msg = EmailMessage()`);
101
+ lines.push(` msg["From"] = sender`);
102
+ lines.push(` msg["To"] = to`);
103
+ lines.push(` msg["Subject"] = subject`);
104
+ lines.push(` msg.set_content(html, subtype="html")`);
105
+ lines.push(` await aiosmtplib.send(msg, hostname=os.environ.get("SMTP_HOST", "localhost"), port=int(os.environ.get("SMTP_PORT", "587")))`);
106
+ }
107
+ return lines;
108
+ }
109
+ //# sourceMappingURL=infra.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"infra.js","sourceRoot":"","sources":["../../src/generators/infra.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * @kernlang/python — FastAPI Python backend transpiler
3
+ */
4
+ export { generatePythonCoreNode } from './codegen-python.js';
5
+ export { transpileFastAPI } from './transpiler-fastapi.js';
6
+ export { mapTsTypeToPython, toScreamingSnake, toSnakeCase } from './type-map.js';
package/dist/index.js ADDED
@@ -0,0 +1,7 @@
1
+ /**
2
+ * @kernlang/python — FastAPI Python backend transpiler
3
+ */
4
+ export { generatePythonCoreNode } from './codegen-python.js';
5
+ export { transpileFastAPI } from './transpiler-fastapi.js';
6
+ export { mapTsTypeToPython, toScreamingSnake, toSnakeCase } from './type-map.js';
7
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,sBAAsB,EAAE,MAAM,qBAAqB,CAAC;AAC7D,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC"}
@@ -0,0 +1,45 @@
1
+ /**
2
+ * Python emitter leg — Phase 1 PR-3b.
3
+ *
4
+ * Council-approved design (6-engine agon brainstorm, run 1778871685720):
5
+ *
6
+ * - **(A) Fresh `python3 -u` subprocess per fixture.** Clean isolation;
7
+ * ~50-100ms overhead × 19 fixtures = ~1-2s test cost; no shared state.
8
+ * `-u` flag forces unbuffered stdio so short-lived fixtures cannot
9
+ * drop trace events to a half-flushed buffer.
10
+ * - **(ii) Dedicated FD 3 for trace transport.** stdout is reserved for
11
+ * emitted-code `print()` calls; FD3 carries one JSON event per line.
12
+ * This keeps user output from polluting the trace channel.
13
+ * - **(B1) Codegen hook injected in production Python emitter** behind
14
+ * `BodyEmitOptions.traceHooks.eachIterNext` (opt-in only; production
15
+ * callers never set it). Symmetric with TS leg's hook contract.
16
+ * - **(P1) Sentinel exception classes** `_KernReturn`/`_KernThrow`
17
+ * defined in the prelude. Lowered `throw` body-stmts raise them;
18
+ * a wrapping `async def __kern_run()` catches and resolves them
19
+ * into [[CompletionRecord]]s. Symmetric with TS sentinel approach.
20
+ *
21
+ * Council-flagged mitigations applied:
22
+ * - Deterministic JSON: `sort_keys=True` on Python side; we already do
23
+ * key-sorted serialization on TS side via `serializeValue`.
24
+ * - Unbuffered stdio: `python3 -u`.
25
+ * - Async-aware timeout: subprocess SIGKILLed after 10s if it hasn't
26
+ * exited; surfaces as PythonLegError.
27
+ *
28
+ * Fixture authors: do NOT use Python `print()` inside fixture bodies — the
29
+ * harness writes the completion record to stdout. Use `__trace` events with
30
+ * `op: 'stdout'` if you need to observe stdout-style output through the
31
+ * trace channel (FD 3).
32
+ */
33
+ import type { NodeFixture, SemanticEnv, Trace } from '@kernlang/core';
34
+ export declare class PythonLegError extends Error {
35
+ constructor(message: string);
36
+ }
37
+ /**
38
+ * Run the Python emitter leg of the differential harness.
39
+ *
40
+ * Error model mirrors `runTsEmitterLeg`: ONLY the sentinel-resolved
41
+ * completions count as fixture-comparable; any other failure (spawn
42
+ * error, non-zero exit, malformed FD3 output) is thrown so the harness
43
+ * records `leg-error`.
44
+ */
45
+ export declare function runPythonEmitterLeg(fixture: NodeFixture, env: SemanticEnv): Promise<Trace>;