@lokascript/domain-flow 2.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.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/index.ts","../src/schemas/index.ts","../src/schemas/hateoas-schemas.ts","../src/profiles/index.ts","../src/tokenizers/index.ts","../src/generators/flow-generator.ts","../src/generators/flow-renderer.ts","../src/generators/htmx-generator.ts","../src/generators/route-extractor.ts","../src/parser/pipeline-parser.ts","../src/generators/workflow-generator.ts","../src/runtime/workflow-executor.ts","../src/runtime/mcp-workflow-server.ts"],"sourcesContent":["/**\n * @lokascript/domain-flow — Declarative Reactive Data Flow DSL\n *\n * A multilingual data flow domain built on @lokascript/framework.\n * Parses data flow commands written in 8 languages, compiling to\n * vanilla JS (fetch, EventSource, setInterval) or HTMX attributes.\n *\n * @example\n * ```typescript\n * import { createFlowDSL } from '@lokascript/domain-flow';\n *\n * const flow = createFlowDSL();\n *\n * // English (SVO)\n * flow.compile('fetch /api/users as json into #user-list', 'en');\n * // → { ok: true, code: \"fetch('/api/users').then(r => r.json())...\" }\n *\n * // Spanish (SVO)\n * flow.compile('obtener /api/users como json en #user-list', 'es');\n *\n * // Japanese (SOV)\n * flow.compile('/api/users json で 取得', 'ja');\n *\n * // Arabic (VSO)\n * flow.compile('جلب /api/users ك json في #user-list', 'ar');\n *\n * // Korean (SOV)\n * flow.compile('/api/users json 로 가져오기', 'ko');\n *\n * // Chinese (SVO)\n * flow.compile('获取 /api/users 以 json 到 #user-list', 'zh');\n *\n * // Turkish (SOV)\n * flow.compile('/api/users json olarak getir', 'tr');\n *\n * // French (SVO)\n * flow.compile('récupérer /api/users comme json dans #user-list', 'fr');\n * ```\n */\n\nimport { createMultilingualDSL, type MultilingualDSL } from '@lokascript/framework';\nimport {\n allSchemas,\n fetchSchema,\n pollSchema,\n streamSchema,\n submitSchema,\n transformSchema,\n} from './schemas/index.js';\nimport {\n englishProfile,\n spanishProfile,\n japaneseProfile,\n arabicProfile,\n koreanProfile,\n chineseProfile,\n turkishProfile,\n frenchProfile,\n} from './profiles/index.js';\nimport {\n EnglishFlowTokenizer,\n SpanishFlowTokenizer,\n JapaneseFlowTokenizer,\n ArabicFlowTokenizer,\n KoreanFlowTokenizer,\n ChineseFlowTokenizer,\n TurkishFlowTokenizer,\n FrenchFlowTokenizer,\n} from './tokenizers/index.js';\nimport { flowCodeGenerator } from './generators/flow-generator.js';\n\n/**\n * Create a multilingual FlowScript DSL instance with all 8 supported languages.\n */\nexport function createFlowDSL(): MultilingualDSL {\n return /*#__PURE__*/ createMultilingualDSL({\n name: 'FlowScript',\n schemas: allSchemas,\n languages: [\n {\n code: 'en',\n name: 'English',\n nativeName: 'English',\n tokenizer: EnglishFlowTokenizer,\n patternProfile: englishProfile,\n },\n {\n code: 'es',\n name: 'Spanish',\n nativeName: 'Español',\n tokenizer: SpanishFlowTokenizer,\n patternProfile: spanishProfile,\n },\n {\n code: 'ja',\n name: 'Japanese',\n nativeName: '日本語',\n tokenizer: JapaneseFlowTokenizer,\n patternProfile: japaneseProfile,\n },\n {\n code: 'ar',\n name: 'Arabic',\n nativeName: 'العربية',\n tokenizer: ArabicFlowTokenizer,\n patternProfile: arabicProfile,\n },\n {\n code: 'ko',\n name: 'Korean',\n nativeName: '한국어',\n tokenizer: KoreanFlowTokenizer,\n patternProfile: koreanProfile,\n },\n {\n code: 'zh',\n name: 'Chinese',\n nativeName: '中文',\n tokenizer: ChineseFlowTokenizer,\n patternProfile: chineseProfile,\n },\n {\n code: 'tr',\n name: 'Turkish',\n nativeName: 'Türkçe',\n tokenizer: TurkishFlowTokenizer,\n patternProfile: turkishProfile,\n },\n {\n code: 'fr',\n name: 'French',\n nativeName: 'Français',\n tokenizer: FrenchFlowTokenizer,\n patternProfile: frenchProfile,\n },\n ],\n codeGenerator: flowCodeGenerator,\n });\n}\n\n// Re-export schemas for consumers who want to extend\nexport { allSchemas, fetchSchema, pollSchema, streamSchema, submitSchema, transformSchema };\nexport {\n enterSchema,\n followSchema,\n performSchema,\n captureSchema,\n hateoasSchemas,\n} from './schemas/hateoas-schemas.js';\nexport {\n englishProfile,\n spanishProfile,\n japaneseProfile,\n arabicProfile,\n koreanProfile,\n chineseProfile,\n turkishProfile,\n frenchProfile,\n} from './profiles/index.js';\nexport { flowCodeGenerator, toFlowSpec, parseDuration } from './generators/flow-generator.js';\nexport { renderFlow } from './generators/flow-renderer.js';\nexport { generateHTMX } from './generators/htmx-generator.js';\nexport { extractRoute, extractRoutes } from './generators/route-extractor.js';\nexport { parseFlowPipeline, compilePipeline } from './parser/pipeline-parser.js';\nexport type { HTMXAttributes } from './generators/htmx-generator.js';\nexport type { FlowRouteDescriptor } from './generators/route-extractor.js';\nexport type { PipelineStep, PipelineParseResult } from './parser/pipeline-parser.js';\nexport {\n EnglishFlowTokenizer,\n SpanishFlowTokenizer,\n JapaneseFlowTokenizer,\n ArabicFlowTokenizer,\n KoreanFlowTokenizer,\n ChineseFlowTokenizer,\n TurkishFlowTokenizer,\n FrenchFlowTokenizer,\n} from './tokenizers/index.js';\nexport type { FlowSpec, FlowAction, WorkflowSpec, WorkflowStep } from './types.js';\nexport { toWorkflowSpec, toSirenGrailSteps } from './generators/workflow-generator.js';\n\n// =============================================================================\n// Runtime: HATEOAS Workflow Execution + MCP Server\n// =============================================================================\n\nexport {\n executeWorkflow,\n createWorkflowExecutor,\n toSirenSteps,\n} from './runtime/workflow-executor.js';\nexport type { WorkflowResult, ExecuteWorkflowOptions } from './runtime/workflow-executor.js';\n\nexport {\n McpWorkflowServer,\n createMcpWorkflowServer,\n actionsToTools,\n linksToTools,\n entityToTools,\n} from './runtime/mcp-workflow-server.js';\nexport type { McpWorkflowServerConfig } from './runtime/mcp-workflow-server.js';\n\n// =============================================================================\n// Domain Scan Config (for AOT / Vite plugin integration)\n// =============================================================================\n\n/** HTML attribute and script-type patterns for AOT scanning */\nexport const flowScanConfig = {\n attributes: ['data-flow', '_flow'] as const,\n scriptTypes: ['text/flowscript'] as const,\n defaultLanguage: 'en',\n};\n","/**\n * FlowScript Command Schemas\n *\n * Defines the semantic structure of data flow commands using the framework's\n * defineCommand/defineRole helpers. Each schema specifies roles (source, destination,\n * style, duration, etc.) and per-language marker overrides for 8 languages.\n */\n\nimport { defineCommand, defineRole } from '@lokascript/framework';\n\n// =============================================================================\n// FETCH — Single HTTP request with target\n// =============================================================================\n\nexport const fetchSchema = defineCommand({\n action: 'fetch',\n description: 'Fetch data from a URL and deliver to a target element',\n category: 'source',\n primaryRole: 'source',\n roles: [\n defineRole({\n role: 'source',\n description: 'URL to fetch from',\n required: true,\n expectedTypes: ['expression'],\n svoPosition: 2,\n sovPosition: 2,\n }),\n defineRole({\n role: 'style',\n description: 'Response format (json, html, text)',\n required: false,\n expectedTypes: ['expression'],\n svoPosition: 1,\n sovPosition: 1,\n markerOverride: {\n en: 'as',\n es: 'como',\n ja: 'で',\n ar: 'ك',\n ko: '로',\n zh: '以',\n tr: 'olarak',\n fr: 'comme',\n },\n }),\n defineRole({\n role: 'destination',\n description: 'Target element to deliver data to',\n required: false,\n expectedTypes: ['selector', 'expression'],\n svoPosition: 0,\n sovPosition: 0,\n markerOverride: {\n en: 'into',\n es: 'en',\n ja: 'に',\n ar: 'في',\n ko: '에',\n zh: '到',\n tr: 'e',\n fr: 'dans',\n },\n }),\n ],\n});\n\n// =============================================================================\n// POLL — Repeated fetch with interval\n// =============================================================================\n\nexport const pollSchema = defineCommand({\n action: 'poll',\n description: 'Repeatedly fetch data at a specified interval',\n category: 'source',\n primaryRole: 'source',\n roles: [\n defineRole({\n role: 'source',\n description: 'URL to poll',\n required: true,\n expectedTypes: ['expression'],\n svoPosition: 4,\n sovPosition: 4,\n }),\n defineRole({\n role: 'duration',\n description: 'Polling interval (e.g., 5s, 30s, 1m)',\n required: true,\n expectedTypes: ['expression', 'literal'],\n svoPosition: 3,\n sovPosition: 3,\n markerOverride: {\n en: 'every',\n es: 'cada',\n ja: 'ごとに',\n ar: 'كل',\n ko: '마다',\n zh: '每',\n tr: 'her',\n fr: 'chaque',\n },\n }),\n defineRole({\n role: 'style',\n description: 'Response format (json, html, text)',\n required: false,\n expectedTypes: ['expression'],\n svoPosition: 2,\n sovPosition: 2,\n markerOverride: {\n en: 'as',\n es: 'como',\n ja: 'で',\n ar: 'ك',\n ko: '로',\n zh: '以',\n tr: 'olarak',\n fr: 'comme',\n },\n }),\n defineRole({\n role: 'destination',\n description: 'Target element for poll results',\n required: false,\n expectedTypes: ['selector', 'expression'],\n svoPosition: 1,\n sovPosition: 1,\n markerOverride: {\n en: 'into',\n es: 'en',\n ja: 'に',\n ar: 'في',\n ko: '에',\n zh: '到',\n tr: 'e',\n fr: 'dans',\n },\n }),\n ],\n});\n\n// =============================================================================\n// STREAM — Server-Sent Events connection\n// =============================================================================\n\nexport const streamSchema = defineCommand({\n action: 'stream',\n description: 'Open a streaming connection (SSE) to a URL',\n category: 'source',\n primaryRole: 'source',\n roles: [\n defineRole({\n role: 'source',\n description: 'URL for SSE stream',\n required: true,\n expectedTypes: ['expression'],\n svoPosition: 2,\n sovPosition: 2,\n }),\n defineRole({\n role: 'style',\n description: 'Stream type (sse)',\n required: false,\n expectedTypes: ['expression'],\n svoPosition: 1,\n sovPosition: 1,\n markerOverride: {\n en: 'as',\n es: 'como',\n ja: 'で',\n ar: 'ك',\n ko: '로',\n zh: '以',\n tr: 'olarak',\n fr: 'comme',\n },\n }),\n defineRole({\n role: 'destination',\n description: 'Target element for streamed data',\n required: false,\n expectedTypes: ['selector', 'expression'],\n svoPosition: 0,\n sovPosition: 0,\n markerOverride: {\n en: 'into',\n es: 'en',\n ja: 'に',\n ar: 'في',\n ko: '에',\n zh: '到',\n tr: 'e',\n fr: 'dans',\n },\n }),\n ],\n});\n\n// =============================================================================\n// SUBMIT — Form submission\n// =============================================================================\n\nexport const submitSchema = defineCommand({\n action: 'submit',\n description: 'Submit form data to a URL',\n category: 'action',\n primaryRole: 'patient',\n roles: [\n defineRole({\n role: 'patient',\n description: 'Form element to submit',\n required: true,\n expectedTypes: ['selector', 'expression'],\n svoPosition: 2,\n sovPosition: 1,\n }),\n defineRole({\n role: 'destination',\n description: 'URL to submit to',\n required: true,\n expectedTypes: ['expression'],\n svoPosition: 1,\n sovPosition: 2,\n markerOverride: {\n en: 'to',\n es: 'a',\n ja: 'に',\n ar: 'إلى',\n ko: '로',\n zh: '到',\n tr: 'e',\n fr: 'vers',\n },\n }),\n defineRole({\n role: 'style',\n description: 'Request encoding (json, form, multipart)',\n required: false,\n expectedTypes: ['expression'],\n svoPosition: 0,\n sovPosition: 0,\n markerOverride: {\n en: 'as',\n es: 'como',\n ja: 'で',\n ar: 'ك',\n ko: '로',\n zh: '以',\n tr: 'olarak',\n fr: 'comme',\n },\n }),\n ],\n});\n\n// =============================================================================\n// TRANSFORM — Data transformation step\n// =============================================================================\n\nexport const transformSchema = defineCommand({\n action: 'transform',\n description: 'Transform data using a function or format string',\n category: 'transform',\n primaryRole: 'patient',\n roles: [\n defineRole({\n role: 'patient',\n description: 'Data to transform',\n required: true,\n expectedTypes: ['expression'],\n svoPosition: 2,\n sovPosition: 1,\n }),\n defineRole({\n role: 'instrument',\n description: 'Transform function, format string, or mapping',\n required: true,\n expectedTypes: ['expression', 'literal'],\n svoPosition: 1,\n sovPosition: 2,\n markerOverride: {\n en: 'with',\n es: 'con',\n ja: 'で',\n ar: 'ب',\n ko: '로',\n zh: '用',\n tr: 'ile',\n fr: 'avec',\n },\n }),\n ],\n});\n\n// =============================================================================\n// HATEOAS Schemas (re-exported from dedicated file)\n// =============================================================================\n\nexport {\n enterSchema,\n followSchema,\n performSchema,\n captureSchema,\n hateoasSchemas,\n} from './hateoas-schemas.js';\nimport { hateoasSchemas } from './hateoas-schemas.js';\n\n// =============================================================================\n// All Schemas\n// =============================================================================\n\nexport const allSchemas = [\n fetchSchema,\n pollSchema,\n streamSchema,\n submitSchema,\n transformSchema,\n ...hateoasSchemas,\n];\n","/**\n * HATEOAS Command Schemas\n *\n * Defines 4 HATEOAS-aware FlowScript commands: enter, follow, perform, capture.\n * These compile to siren-grail workflow steps instead of vanilla JS.\n */\n\nimport { defineCommand, defineRole } from '@lokascript/framework';\n\n// =============================================================================\n// ENTER — Establish HATEOAS entry point\n// =============================================================================\n\nexport const enterSchema = defineCommand({\n action: 'enter',\n description: 'Connect to a HATEOAS API entry point',\n category: 'source',\n primaryRole: 'source',\n roles: [\n defineRole({\n role: 'source',\n description: 'API entry point URL',\n required: true,\n expectedTypes: ['expression'],\n svoPosition: 1,\n sovPosition: 1,\n }),\n ],\n});\n\n// =============================================================================\n// FOLLOW — Navigate by link relation\n// =============================================================================\n\nexport const followSchema = defineCommand({\n action: 'follow',\n description: 'Navigate to a resource by following a link relation',\n category: 'action',\n primaryRole: 'patient',\n roles: [\n defineRole({\n role: 'patient',\n description: 'Link relation name to follow (e.g., \"orders\", \"next\")',\n required: true,\n expectedTypes: ['expression'],\n svoPosition: 2,\n sovPosition: 2,\n }),\n defineRole({\n role: 'instrument',\n description: 'Parameter or sub-resource identifier (e.g., item {id})',\n required: false,\n expectedTypes: ['expression'],\n svoPosition: 1,\n sovPosition: 1,\n markerOverride: {\n en: 'item',\n es: 'elemento',\n ja: 'の',\n ar: 'عنصر',\n ko: '항목',\n zh: '项',\n tr: 'öğe',\n fr: 'élément',\n },\n }),\n ],\n});\n\n// =============================================================================\n// PERFORM — Execute a server-defined action\n// =============================================================================\n\nexport const performSchema = defineCommand({\n action: 'perform',\n description: 'Execute a server-defined action (Siren affordance)',\n category: 'action',\n primaryRole: 'patient',\n roles: [\n defineRole({\n role: 'patient',\n description: 'Action name to execute (e.g., \"create-order\", \"ship-order\")',\n required: true,\n expectedTypes: ['expression'],\n svoPosition: 2,\n sovPosition: 1,\n }),\n defineRole({\n role: 'source',\n description: 'Data source — form selector or inline data',\n required: false,\n expectedTypes: ['selector', 'expression'],\n svoPosition: 1,\n sovPosition: 2,\n markerOverride: {\n en: 'with',\n es: 'con',\n ja: 'で',\n ar: 'ب',\n ko: '로',\n zh: '用',\n tr: 'ile',\n fr: 'avec',\n },\n }),\n ],\n});\n\n// =============================================================================\n// CAPTURE — Bind response data to a variable\n// =============================================================================\n\nexport const captureSchema = defineCommand({\n action: 'capture',\n description: 'Bind response data to a named variable for later use',\n category: 'action',\n primaryRole: 'destination',\n roles: [\n defineRole({\n role: 'patient',\n description: 'Property path to capture (optional — captures entire entity if omitted)',\n required: false,\n expectedTypes: ['expression'],\n svoPosition: 2,\n sovPosition: 2,\n }),\n defineRole({\n role: 'destination',\n description: 'Variable name to bind the captured value to',\n required: true,\n expectedTypes: ['expression'],\n svoPosition: 1,\n sovPosition: 1,\n markerOverride: {\n en: 'as',\n es: 'como',\n ja: 'として',\n ar: 'ك',\n ko: '로',\n zh: '为',\n tr: 'olarak',\n fr: 'comme',\n },\n }),\n ],\n});\n\n// =============================================================================\n// All HATEOAS Schemas\n// =============================================================================\n\nexport const hateoasSchemas = [enterSchema, followSchema, performSchema, captureSchema];\n","/**\n * FlowScript Language Profiles\n *\n * Pattern generation profiles for 8 supported languages.\n * Covers SVO (EN, ES, ZH, FR), SOV (JA, KO, TR), and VSO (AR) word orders.\n *\n * Role markers are specified via markerOverride on each schema role.\n * Profile roleMarkers are used only when positional defaults need overriding.\n */\n\nimport type { PatternGenLanguageProfile } from '@lokascript/framework';\n\n// =============================================================================\n// English (SVO)\n// =============================================================================\n\nexport const englishProfile: PatternGenLanguageProfile = {\n code: 'en',\n wordOrder: 'SVO',\n keywords: {\n fetch: { primary: 'fetch' },\n poll: { primary: 'poll' },\n stream: { primary: 'stream' },\n submit: { primary: 'submit' },\n transform: { primary: 'transform' },\n enter: { primary: 'enter' },\n follow: { primary: 'follow' },\n perform: { primary: 'perform' },\n capture: { primary: 'capture' },\n },\n};\n\n// =============================================================================\n// Spanish (SVO)\n// =============================================================================\n\nexport const spanishProfile: PatternGenLanguageProfile = {\n code: 'es',\n wordOrder: 'SVO',\n keywords: {\n fetch: { primary: 'obtener' },\n poll: { primary: 'sondear' },\n stream: { primary: 'transmitir' },\n submit: { primary: 'enviar' },\n transform: { primary: 'transformar' },\n enter: { primary: 'entrar' },\n follow: { primary: 'seguir' },\n perform: { primary: 'ejecutar' },\n capture: { primary: 'capturar' },\n },\n};\n\n// =============================================================================\n// Japanese (SOV)\n// =============================================================================\n\nexport const japaneseProfile: PatternGenLanguageProfile = {\n code: 'ja',\n wordOrder: 'SOV',\n keywords: {\n fetch: { primary: '取得' },\n poll: { primary: 'ポーリング' },\n stream: { primary: 'ストリーム' },\n submit: { primary: '送信' },\n transform: { primary: '変換' },\n enter: { primary: '入る' },\n follow: { primary: '辿る' },\n perform: { primary: '実行' },\n capture: { primary: '取得変数' },\n },\n};\n\n// =============================================================================\n// Arabic (VSO)\n// =============================================================================\n\nexport const arabicProfile: PatternGenLanguageProfile = {\n code: 'ar',\n wordOrder: 'VSO',\n keywords: {\n fetch: { primary: 'جلب' },\n poll: { primary: 'استطلع' },\n stream: { primary: 'بث' },\n submit: { primary: 'أرسل' },\n transform: { primary: 'حوّل' },\n enter: { primary: 'ادخل' },\n follow: { primary: 'اتبع' },\n perform: { primary: 'نفّذ' },\n capture: { primary: 'التقط' },\n },\n};\n\n// =============================================================================\n// Korean (SOV)\n// =============================================================================\n\nexport const koreanProfile: PatternGenLanguageProfile = {\n code: 'ko',\n wordOrder: 'SOV',\n keywords: {\n fetch: { primary: '가져오기' },\n poll: { primary: '폴링' },\n stream: { primary: '스트리밍' },\n submit: { primary: '제출' },\n transform: { primary: '변환' },\n enter: { primary: '진입' },\n follow: { primary: '따라가기' },\n perform: { primary: '실행' },\n capture: { primary: '캡처' },\n },\n};\n\n// =============================================================================\n// Chinese (SVO)\n// =============================================================================\n\nexport const chineseProfile: PatternGenLanguageProfile = {\n code: 'zh',\n wordOrder: 'SVO',\n keywords: {\n fetch: { primary: '获取' },\n poll: { primary: '轮询' },\n stream: { primary: '流式' },\n submit: { primary: '提交' },\n transform: { primary: '转换' },\n enter: { primary: '进入' },\n follow: { primary: '跟随' },\n perform: { primary: '执行' },\n capture: { primary: '捕获' },\n },\n};\n\n// =============================================================================\n// Turkish (SOV)\n// =============================================================================\n\nexport const turkishProfile: PatternGenLanguageProfile = {\n code: 'tr',\n wordOrder: 'SOV',\n keywords: {\n fetch: { primary: 'getir' },\n poll: { primary: 'yokla' },\n stream: { primary: 'aktar' },\n submit: { primary: 'gönder' },\n transform: { primary: 'dönüştür' },\n enter: { primary: 'gir' },\n follow: { primary: 'izle' },\n perform: { primary: 'yürüt' },\n capture: { primary: 'yakala' },\n },\n};\n\n// =============================================================================\n// French (SVO)\n// =============================================================================\n\nexport const frenchProfile: PatternGenLanguageProfile = {\n code: 'fr',\n wordOrder: 'SVO',\n keywords: {\n fetch: { primary: 'récupérer' },\n poll: { primary: 'interroger' },\n stream: { primary: 'diffuser' },\n submit: { primary: 'soumettre' },\n transform: { primary: 'transformer' },\n enter: { primary: 'entrer' },\n follow: { primary: 'suivre' },\n perform: { primary: 'exécuter' },\n capture: { primary: 'capturer' },\n },\n};\n\n// =============================================================================\n// All Profiles\n// =============================================================================\n\nexport const allProfiles = [\n englishProfile,\n spanishProfile,\n japaneseProfile,\n arabicProfile,\n koreanProfile,\n chineseProfile,\n turkishProfile,\n frenchProfile,\n];\n","/**\n * FlowScript Tokenizers\n *\n * Language-specific tokenizers for data flow commands (4 languages).\n * Created via the framework's createSimpleTokenizer factory.\n *\n * Custom extractors handle:\n * - CSS selectors (#id, .class)\n * - URL paths (/api/users, /api/user/{id})\n * - Duration literals (5s, 30s, 1m, 500ms)\n * - Latin extended identifiers (diacritics in Spanish)\n */\n\nimport { createSimpleTokenizer } from '@lokascript/framework';\nimport type { LanguageTokenizer, ValueExtractor, ExtractionResult } from '@lokascript/framework';\n\n// =============================================================================\n// CSS Selector Extractor (#id, .class)\n// =============================================================================\n\nclass CSSSelectorExtractor implements ValueExtractor {\n readonly name = 'css-selector';\n\n canExtract(input: string, position: number): boolean {\n const char = input[position];\n if (char !== '#' && char !== '.') return false;\n const next = input[position + 1];\n return next !== undefined && /[a-zA-Z_-]/.test(next);\n }\n\n extract(input: string, position: number): ExtractionResult | null {\n let end = position + 1;\n while (end < input.length && /[a-zA-Z0-9_-]/.test(input[end])) {\n end++;\n }\n if (end === position + 1) return null;\n return { value: input.slice(position, end), length: end - position };\n }\n}\n\n// =============================================================================\n// URL Path Extractor (/api/users, /api/user/{id})\n// =============================================================================\n\nclass URLPathExtractor implements ValueExtractor {\n readonly name = 'url-path';\n\n canExtract(input: string, position: number): boolean {\n if (input[position] !== '/') return false;\n const next = input[position + 1];\n // Must be followed by a letter, digit, or path char — not a space or operator\n return next !== undefined && /[a-zA-Z0-9_:{]/.test(next);\n }\n\n extract(input: string, position: number): ExtractionResult | null {\n let end = position + 1;\n // URL path characters: letters, digits, /, -, _, ., {, }, :, ?, =, &\n while (end < input.length && /[a-zA-Z0-9/_\\-.{}:?=&]/.test(input[end])) {\n end++;\n }\n if (end <= position + 1) return null;\n return { value: input.slice(position, end), length: end - position };\n }\n}\n\n// =============================================================================\n// Duration Extractor (5s, 30s, 1m, 500ms)\n// =============================================================================\n\nclass DurationExtractor implements ValueExtractor {\n readonly name = 'duration';\n\n canExtract(input: string, position: number): boolean {\n return /[0-9]/.test(input[position]);\n }\n\n extract(input: string, position: number): ExtractionResult | null {\n let end = position;\n // Consume digits\n while (end < input.length && /[0-9]/.test(input[end])) {\n end++;\n }\n if (end === position) return null;\n\n // Check for duration suffix: ms, s, m, h\n const remaining = input.slice(end);\n if (remaining.startsWith('ms')) {\n end += 2;\n } else if (/^[smh](?![a-zA-Z])/.test(remaining)) {\n end += 1;\n } else {\n // Plain number — still valid as a literal\n return { value: input.slice(position, end), length: end - position };\n }\n\n return { value: input.slice(position, end), length: end - position };\n }\n}\n\n// =============================================================================\n// Latin Extended Identifier Extractor (diacritics for Spanish)\n// =============================================================================\n\nclass LatinExtendedIdentifierExtractor implements ValueExtractor {\n readonly name = 'latin-extended-identifier';\n\n canExtract(input: string, position: number): boolean {\n return /\\p{L}/u.test(input[position]);\n }\n\n extract(input: string, position: number): ExtractionResult | null {\n let end = position;\n while (end < input.length && /[\\p{L}\\p{N}_-]/u.test(input[end])) {\n end++;\n }\n if (end === position) return null;\n return { value: input.slice(position, end), length: end - position };\n }\n}\n\n// =============================================================================\n// Shared custom extractors\n// =============================================================================\n\nconst sharedExtractors = [\n new CSSSelectorExtractor(),\n new URLPathExtractor(),\n new DurationExtractor(),\n];\n\n// =============================================================================\n// English FlowScript Tokenizer\n// =============================================================================\n\nexport const EnglishFlowTokenizer: LanguageTokenizer = createSimpleTokenizer({\n language: 'en',\n customExtractors: sharedExtractors,\n keywords: [\n // Commands\n 'fetch',\n 'poll',\n 'stream',\n 'submit',\n 'transform',\n // HATEOAS commands\n 'enter',\n 'follow',\n 'perform',\n 'capture',\n // Role markers\n 'as',\n 'into',\n 'every',\n 'to',\n 'with',\n 'from',\n 'item',\n ],\n includeOperators: false,\n caseInsensitive: true,\n});\n\n// =============================================================================\n// Spanish FlowScript Tokenizer\n// =============================================================================\n\nexport const SpanishFlowTokenizer: LanguageTokenizer = createSimpleTokenizer({\n language: 'es',\n customExtractors: [...sharedExtractors, new LatinExtendedIdentifierExtractor()],\n keywords: [\n // Commands\n 'obtener',\n 'sondear',\n 'transmitir',\n 'enviar',\n 'transformar',\n // HATEOAS commands\n 'entrar',\n 'seguir',\n 'ejecutar',\n 'capturar',\n // Role markers\n 'como',\n 'en',\n 'cada',\n 'a',\n 'con',\n 'de',\n 'elemento',\n ],\n keywordExtras: [\n { native: 'obtener', normalized: 'fetch' },\n { native: 'sondear', normalized: 'poll' },\n { native: 'transmitir', normalized: 'stream' },\n { native: 'enviar', normalized: 'submit' },\n { native: 'transformar', normalized: 'transform' },\n { native: 'entrar', normalized: 'enter' },\n { native: 'seguir', normalized: 'follow' },\n { native: 'ejecutar', normalized: 'perform' },\n { native: 'capturar', normalized: 'capture' },\n { native: 'como', normalized: 'as' },\n { native: 'en', normalized: 'into' },\n { native: 'cada', normalized: 'every' },\n { native: 'a', normalized: 'to' },\n { native: 'con', normalized: 'with' },\n { native: 'elemento', normalized: 'item' },\n ],\n keywordProfile: {\n keywords: {\n fetch: { primary: 'obtener' },\n poll: { primary: 'sondear' },\n stream: { primary: 'transmitir' },\n submit: { primary: 'enviar' },\n transform: { primary: 'transformar' },\n enter: { primary: 'entrar' },\n follow: { primary: 'seguir' },\n perform: { primary: 'ejecutar' },\n capture: { primary: 'capturar' },\n },\n },\n includeOperators: false,\n caseInsensitive: true,\n});\n\n// =============================================================================\n// Japanese FlowScript Tokenizer\n// =============================================================================\n\nexport const JapaneseFlowTokenizer: LanguageTokenizer = createSimpleTokenizer({\n language: 'ja',\n customExtractors: sharedExtractors,\n keywords: [\n // Commands\n '取得',\n 'ポーリング',\n 'ストリーム',\n '送信',\n '変換',\n // HATEOAS commands\n '入る',\n '辿る',\n '実行',\n '取得変数',\n // Role markers / particles\n 'で',\n 'に',\n 'ごとに',\n 'を',\n 'から',\n 'の',\n 'として',\n ],\n keywordExtras: [\n { native: '取得', normalized: 'fetch' },\n { native: 'ポーリング', normalized: 'poll' },\n { native: 'ストリーム', normalized: 'stream' },\n { native: '送信', normalized: 'submit' },\n { native: '変換', normalized: 'transform' },\n { native: '入る', normalized: 'enter' },\n { native: '辿る', normalized: 'follow' },\n { native: '実行', normalized: 'perform' },\n { native: '取得変数', normalized: 'capture' },\n { native: 'で', normalized: 'as' },\n { native: 'に', normalized: 'into' },\n { native: 'ごとに', normalized: 'every' },\n { native: 'を', normalized: 'patient' },\n { native: 'の', normalized: 'item' },\n { native: 'として', normalized: 'as' },\n ],\n keywordProfile: {\n keywords: {\n fetch: { primary: '取得' },\n poll: { primary: 'ポーリング' },\n stream: { primary: 'ストリーム' },\n submit: { primary: '送信' },\n transform: { primary: '変換' },\n enter: { primary: '入る' },\n follow: { primary: '辿る' },\n perform: { primary: '実行' },\n capture: { primary: '取得変数' },\n },\n },\n includeOperators: false,\n caseInsensitive: false,\n});\n\n// =============================================================================\n// Arabic FlowScript Tokenizer\n// =============================================================================\n\nexport const ArabicFlowTokenizer: LanguageTokenizer = createSimpleTokenizer({\n language: 'ar',\n direction: 'rtl',\n customExtractors: sharedExtractors,\n keywords: [\n // Commands\n 'جلب',\n 'استطلع',\n 'بث',\n 'أرسل',\n 'حوّل',\n // HATEOAS commands\n 'ادخل',\n 'اتبع',\n 'نفّذ',\n 'التقط',\n // Role markers\n 'ك',\n 'في',\n 'كل',\n 'إلى',\n 'ب',\n 'من',\n 'عنصر',\n ],\n keywordExtras: [\n { native: 'جلب', normalized: 'fetch' },\n { native: 'استطلع', normalized: 'poll' },\n { native: 'بث', normalized: 'stream' },\n { native: 'أرسل', normalized: 'submit' },\n { native: 'حوّل', normalized: 'transform' },\n { native: 'ادخل', normalized: 'enter' },\n { native: 'اتبع', normalized: 'follow' },\n { native: 'نفّذ', normalized: 'perform' },\n { native: 'التقط', normalized: 'capture' },\n { native: 'ك', normalized: 'as' },\n { native: 'في', normalized: 'into' },\n { native: 'كل', normalized: 'every' },\n { native: 'إلى', normalized: 'to' },\n { native: 'ب', normalized: 'with' },\n { native: 'عنصر', normalized: 'item' },\n ],\n keywordProfile: {\n keywords: {\n fetch: { primary: 'جلب' },\n poll: { primary: 'استطلع' },\n stream: { primary: 'بث' },\n submit: { primary: 'أرسل' },\n transform: { primary: 'حوّل' },\n enter: { primary: 'ادخل' },\n follow: { primary: 'اتبع' },\n perform: { primary: 'نفّذ' },\n capture: { primary: 'التقط' },\n },\n },\n includeOperators: false,\n caseInsensitive: false,\n});\n\n// =============================================================================\n// Korean FlowScript Tokenizer\n// =============================================================================\n\nexport const KoreanFlowTokenizer: LanguageTokenizer = createSimpleTokenizer({\n language: 'ko',\n customExtractors: sharedExtractors,\n keywords: [\n // Commands\n '가져오기',\n '폴링',\n '스트리밍',\n '제출',\n '변환',\n // HATEOAS commands\n '진입',\n '따라가기',\n '실행',\n '캡처',\n // Role markers / particles\n '로',\n '에',\n '마다',\n '를',\n '에서',\n '항목',\n ],\n keywordExtras: [\n { native: '가져오기', normalized: 'fetch' },\n { native: '폴링', normalized: 'poll' },\n { native: '스트리밍', normalized: 'stream' },\n { native: '제출', normalized: 'submit' },\n { native: '변환', normalized: 'transform' },\n { native: '진입', normalized: 'enter' },\n { native: '따라가기', normalized: 'follow' },\n { native: '실행', normalized: 'perform' },\n { native: '캡처', normalized: 'capture' },\n { native: '로', normalized: 'as' },\n { native: '에', normalized: 'into' },\n { native: '마다', normalized: 'every' },\n { native: '를', normalized: 'patient' },\n { native: '항목', normalized: 'item' },\n ],\n keywordProfile: {\n keywords: {\n fetch: { primary: '가져오기' },\n poll: { primary: '폴링' },\n stream: { primary: '스트리밍' },\n submit: { primary: '제출' },\n transform: { primary: '변환' },\n enter: { primary: '진입' },\n follow: { primary: '따라가기' },\n perform: { primary: '실행' },\n capture: { primary: '캡처' },\n },\n },\n includeOperators: false,\n caseInsensitive: false,\n});\n\n// =============================================================================\n// Chinese FlowScript Tokenizer\n// =============================================================================\n\nexport const ChineseFlowTokenizer: LanguageTokenizer = createSimpleTokenizer({\n language: 'zh',\n customExtractors: sharedExtractors,\n keywords: [\n // Commands\n '获取',\n '轮询',\n '流式',\n '提交',\n '转换',\n // HATEOAS commands\n '进入',\n '跟随',\n '执行',\n '捕获',\n // Role markers\n '以',\n '到',\n '每',\n '用',\n '从',\n '项',\n '为',\n ],\n keywordExtras: [\n { native: '获取', normalized: 'fetch' },\n { native: '轮询', normalized: 'poll' },\n { native: '流式', normalized: 'stream' },\n { native: '提交', normalized: 'submit' },\n { native: '转换', normalized: 'transform' },\n { native: '进入', normalized: 'enter' },\n { native: '跟随', normalized: 'follow' },\n { native: '执行', normalized: 'perform' },\n { native: '捕获', normalized: 'capture' },\n { native: '以', normalized: 'as' },\n { native: '到', normalized: 'into' },\n { native: '每', normalized: 'every' },\n { native: '用', normalized: 'with' },\n { native: '项', normalized: 'item' },\n { native: '为', normalized: 'as' },\n ],\n keywordProfile: {\n keywords: {\n fetch: { primary: '获取' },\n poll: { primary: '轮询' },\n stream: { primary: '流式' },\n submit: { primary: '提交' },\n transform: { primary: '转换' },\n enter: { primary: '进入' },\n follow: { primary: '跟随' },\n perform: { primary: '执行' },\n capture: { primary: '捕获' },\n },\n },\n includeOperators: false,\n caseInsensitive: false,\n});\n\n// =============================================================================\n// Turkish FlowScript Tokenizer\n// =============================================================================\n\nexport const TurkishFlowTokenizer: LanguageTokenizer = createSimpleTokenizer({\n language: 'tr',\n customExtractors: [...sharedExtractors, new LatinExtendedIdentifierExtractor()],\n keywords: [\n // Commands\n 'getir',\n 'yokla',\n 'aktar',\n 'gönder',\n 'dönüştür',\n // HATEOAS commands\n 'gir',\n 'izle',\n 'yürüt',\n 'yakala',\n // Role markers\n 'olarak',\n 'e',\n 'her',\n 'ile',\n 'dan',\n 'öğe',\n ],\n keywordExtras: [\n { native: 'getir', normalized: 'fetch' },\n { native: 'yokla', normalized: 'poll' },\n { native: 'aktar', normalized: 'stream' },\n { native: 'gönder', normalized: 'submit' },\n { native: 'dönüştür', normalized: 'transform' },\n { native: 'gir', normalized: 'enter' },\n { native: 'izle', normalized: 'follow' },\n { native: 'yürüt', normalized: 'perform' },\n { native: 'yakala', normalized: 'capture' },\n { native: 'olarak', normalized: 'as' },\n { native: 'e', normalized: 'into' },\n { native: 'her', normalized: 'every' },\n { native: 'ile', normalized: 'with' },\n { native: 'öğe', normalized: 'item' },\n ],\n keywordProfile: {\n keywords: {\n fetch: { primary: 'getir' },\n poll: { primary: 'yokla' },\n stream: { primary: 'aktar' },\n submit: { primary: 'gönder' },\n transform: { primary: 'dönüştür' },\n enter: { primary: 'gir' },\n follow: { primary: 'izle' },\n perform: { primary: 'yürüt' },\n capture: { primary: 'yakala' },\n },\n },\n includeOperators: false,\n caseInsensitive: true,\n});\n\n// =============================================================================\n// French FlowScript Tokenizer\n// =============================================================================\n\nexport const FrenchFlowTokenizer: LanguageTokenizer = createSimpleTokenizer({\n language: 'fr',\n customExtractors: [...sharedExtractors, new LatinExtendedIdentifierExtractor()],\n keywords: [\n // Commands\n 'récupérer',\n 'interroger',\n 'diffuser',\n 'soumettre',\n 'transformer',\n // HATEOAS commands\n 'entrer',\n 'suivre',\n 'exécuter',\n 'capturer',\n // Role markers\n 'comme',\n 'dans',\n 'chaque',\n 'vers',\n 'avec',\n 'de',\n 'élément',\n ],\n keywordExtras: [\n { native: 'récupérer', normalized: 'fetch' },\n { native: 'interroger', normalized: 'poll' },\n { native: 'diffuser', normalized: 'stream' },\n { native: 'soumettre', normalized: 'submit' },\n { native: 'transformer', normalized: 'transform' },\n { native: 'entrer', normalized: 'enter' },\n { native: 'suivre', normalized: 'follow' },\n { native: 'exécuter', normalized: 'perform' },\n { native: 'capturer', normalized: 'capture' },\n { native: 'comme', normalized: 'as' },\n { native: 'dans', normalized: 'into' },\n { native: 'chaque', normalized: 'every' },\n { native: 'vers', normalized: 'to' },\n { native: 'avec', normalized: 'with' },\n { native: 'élément', normalized: 'item' },\n ],\n keywordProfile: {\n keywords: {\n fetch: { primary: 'récupérer' },\n poll: { primary: 'interroger' },\n stream: { primary: 'diffuser' },\n submit: { primary: 'soumettre' },\n transform: { primary: 'transformer' },\n enter: { primary: 'entrer' },\n follow: { primary: 'suivre' },\n perform: { primary: 'exécuter' },\n capture: { primary: 'capturer' },\n },\n },\n includeOperators: false,\n caseInsensitive: true,\n});\n","/**\n * FlowScript Code Generator\n *\n * Transforms semantic AST nodes into either:\n * 1. Vanilla JavaScript strings (primary output via CodeGenerator interface)\n * 2. Structured FlowSpec JSON (via toFlowSpec helper)\n */\n\nimport type { SemanticNode, CodeGenerator } from '@lokascript/framework';\nimport { extractRoleValue } from '@lokascript/framework';\nimport type { FlowSpec } from '../types.js';\n\n// =============================================================================\n// Duration Parsing\n// =============================================================================\n\n/**\n * Parse a duration string to milliseconds.\n * Supports: 500ms, 5s, 1m, 1h, plain number (treated as ms)\n */\nexport function parseDuration(duration: string): number {\n const match = duration.match(/^(\\d+)(ms|s|m|h)?$/);\n if (!match) return 0;\n const value = parseInt(match[1], 10);\n switch (match[2]) {\n case 'h':\n return value * 3600000;\n case 'm':\n return value * 60000;\n case 's':\n return value * 1000;\n case 'ms':\n return value;\n default:\n return value; // plain number = ms\n }\n}\n\n// =============================================================================\n// FlowSpec Extraction\n// =============================================================================\n\n/**\n * Extract a structured FlowSpec from a parsed SemanticNode.\n */\nexport function toFlowSpec(node: SemanticNode, language: string): FlowSpec {\n const action = node.action as FlowSpec['action'];\n const roles: Record<string, string | undefined> = {};\n\n for (const [key, val] of node.roles) {\n roles[key] =\n typeof val === 'string' ? val : ((val as { value?: string })?.value ?? String(val));\n }\n\n const base: FlowSpec = {\n action,\n metadata: { sourceLanguage: language, roles },\n };\n\n switch (action) {\n case 'fetch': {\n base.url = extractRoleValue(node, 'source') || undefined;\n base.responseFormat = normalizeFormat(extractRoleValue(node, 'style'));\n base.target = extractRoleValue(node, 'destination') || undefined;\n base.method = 'GET';\n break;\n }\n case 'poll': {\n base.url = extractRoleValue(node, 'source') || undefined;\n base.responseFormat = normalizeFormat(extractRoleValue(node, 'style'));\n base.target = extractRoleValue(node, 'destination') || undefined;\n base.method = 'GET';\n const dur = extractRoleValue(node, 'duration');\n if (dur) base.intervalMs = parseDuration(dur);\n break;\n }\n case 'stream': {\n base.url = extractRoleValue(node, 'source') || undefined;\n base.responseFormat = 'sse';\n base.target = extractRoleValue(node, 'destination') || undefined;\n base.method = 'GET';\n break;\n }\n case 'submit': {\n base.formSelector = extractRoleValue(node, 'patient') || undefined;\n base.url = extractRoleValue(node, 'destination') || undefined;\n base.responseFormat = normalizeFormat(extractRoleValue(node, 'style'));\n base.method = 'POST';\n break;\n }\n case 'transform': {\n base.transformFn = extractRoleValue(node, 'instrument') || undefined;\n break;\n }\n case 'enter': {\n base.url = extractRoleValue(node, 'source') || undefined;\n break;\n }\n case 'follow': {\n base.linkRel = extractRoleValue(node, 'patient') || undefined;\n break;\n }\n case 'perform': {\n base.actionName = extractRoleValue(node, 'patient') || undefined;\n base.dataSource = extractRoleValue(node, 'source') || undefined;\n break;\n }\n case 'capture': {\n base.captureAs = extractRoleValue(node, 'destination') || undefined;\n base.capturePath = extractRoleValue(node, 'patient') || undefined;\n break;\n }\n }\n\n return base;\n}\n\nfunction normalizeFormat(format: string | null): FlowSpec['responseFormat'] {\n if (!format) return undefined;\n const lower = format.toLowerCase();\n if (lower === 'json') return 'json';\n if (lower === 'html') return 'html';\n if (lower === 'text') return 'text';\n if (lower === 'sse') return 'sse';\n return undefined;\n}\n\n// =============================================================================\n// String Escaping\n// =============================================================================\n\n/** Escape a string for safe inclusion in single-quoted JS string literals. */\nfunction escapeStr(s: string): string {\n return s.replace(/\\\\/g, '\\\\\\\\').replace(/'/g, \"\\\\'\");\n}\n\n// =============================================================================\n// Per-Command JS Generators\n// =============================================================================\n\nfunction generateFetch(node: SemanticNode): string {\n const url = extractRoleValue(node, 'source') || '/';\n const format = extractRoleValue(node, 'style')?.toLowerCase() || 'text';\n const target = extractRoleValue(node, 'destination');\n\n const parseMethod = format === 'json' ? '.json()' : '.text()';\n const lines: string[] = [`fetch('${escapeStr(url)}')`, ` .then(r => r${parseMethod})`];\n\n if (target) {\n lines.push(` .then(data => {`);\n if (format === 'json') {\n lines.push(\n ` document.querySelector('${escapeStr(target)}').innerHTML = typeof data === 'string' ? data : JSON.stringify(data);`\n );\n } else {\n lines.push(` document.querySelector('${escapeStr(target)}').innerHTML = data;`);\n }\n lines.push(` })`);\n }\n\n lines.push(` .catch(err => console.error('Fetch error:', err));`);\n return lines.join('\\n');\n}\n\nfunction generatePoll(node: SemanticNode): string {\n const url = extractRoleValue(node, 'source') || '/';\n const duration = extractRoleValue(node, 'duration') || '5s';\n const format = extractRoleValue(node, 'style')?.toLowerCase() || 'text';\n const target = extractRoleValue(node, 'destination');\n const ms = parseDuration(duration);\n\n const parseMethod = format === 'json' ? '.json()' : '.text()';\n const lines: string[] = [\n `setInterval(async () => {`,\n ` try {`,\n ` const r = await fetch('${escapeStr(url)}');`,\n ` const data = await r${parseMethod};`,\n ];\n\n if (target) {\n if (format === 'json') {\n lines.push(\n ` document.querySelector('${escapeStr(target)}').innerHTML = typeof data === 'string' ? data : JSON.stringify(data);`\n );\n } else {\n lines.push(` document.querySelector('${escapeStr(target)}').innerHTML = data;`);\n }\n }\n\n lines.push(` } catch (err) {`, ` console.error('Poll error:', err);`, ` }`, `}, ${ms});`);\n\n return lines.join('\\n');\n}\n\nfunction generateStream(node: SemanticNode): string {\n const url = extractRoleValue(node, 'source') || '/';\n const target = extractRoleValue(node, 'destination');\n\n const lines: string[] = [`const es = new EventSource('${escapeStr(url)}');`];\n\n if (target) {\n lines.push(\n `es.onmessage = (event) => {`,\n ` document.querySelector('${escapeStr(target)}').insertAdjacentHTML('beforeend', event.data);`,\n `};`\n );\n } else {\n lines.push(`es.onmessage = (event) => {`, ` console.log('Stream data:', event.data);`, `};`);\n }\n\n lines.push(`es.onerror = () => {`, ` console.error('Stream error, reconnecting...');`, `};`);\n\n return lines.join('\\n');\n}\n\nfunction generateSubmit(node: SemanticNode): string {\n const form = extractRoleValue(node, 'patient') || '#form';\n const url = extractRoleValue(node, 'destination') || '/';\n const format = extractRoleValue(node, 'style')?.toLowerCase();\n\n const lines: string[] = [\n `const form = document.querySelector('${escapeStr(form)}');`,\n `const formData = new FormData(form);`,\n ];\n\n if (format === 'json') {\n lines.push(\n `fetch('${escapeStr(url)}', {`,\n ` method: 'POST',`,\n ` headers: { 'Content-Type': 'application/json' },`,\n ` body: JSON.stringify(Object.fromEntries(formData)),`,\n `})`,\n ` .then(r => r.json())`,\n ` .catch(err => console.error('Submit error:', err));`\n );\n } else {\n lines.push(\n `fetch('${escapeStr(url)}', {`,\n ` method: 'POST',`,\n ` body: formData,`,\n `})`,\n ` .then(r => r.text())`,\n ` .catch(err => console.error('Submit error:', err));`\n );\n }\n\n return lines.join('\\n');\n}\n\nfunction generateTransform(node: SemanticNode): string {\n const data = extractRoleValue(node, 'patient') || 'data';\n const fn = extractRoleValue(node, 'instrument') || 'identity';\n\n return `const result = ${fn}(${data});`;\n}\n\n// =============================================================================\n// HATEOAS Command JS Generators\n// =============================================================================\n\nfunction generateEnter(node: SemanticNode): string {\n const url = extractRoleValue(node, 'source') || '/';\n return [\n `// HATEOAS: Connect to entry point`,\n `const agent = new SirenAgent('${escapeStr(url)}');`,\n `await agent.start();`,\n ].join('\\n');\n}\n\nfunction generateFollow(node: SemanticNode): string {\n const rel = extractRoleValue(node, 'patient') || 'self';\n return [\n `// HATEOAS: Follow link relation '${escapeStr(rel)}'`,\n `await agent.followLink('${escapeStr(rel)}');`,\n ].join('\\n');\n}\n\nfunction generatePerform(node: SemanticNode): string {\n const action = extractRoleValue(node, 'patient') || '';\n const dataSource = extractRoleValue(node, 'source');\n const lines = [`// HATEOAS: Execute action '${escapeStr(action)}'`];\n\n if (dataSource) {\n lines.push(\n `const data = Object.fromEntries(new FormData(document.querySelector('${escapeStr(dataSource)}')));`\n );\n lines.push(`await agent.executeAction('${escapeStr(action)}', data);`);\n } else {\n lines.push(`await agent.executeAction('${escapeStr(action)}');`);\n }\n\n return lines.join('\\n');\n}\n\nfunction generateCapture(node: SemanticNode): string {\n const varName = extractRoleValue(node, 'destination') || 'captured';\n const path = extractRoleValue(node, 'patient');\n\n if (path) {\n return `const ${varName} = agent.currentEntity.properties?.['${escapeStr(path)}'];`;\n }\n return `const ${varName} = agent.currentEntity.properties;`;\n}\n\n// =============================================================================\n// Public Code Generator\n// =============================================================================\n\n/**\n * FlowScript code generator implementation.\n * Returns vanilla JavaScript — ready to execute in a browser.\n */\nexport const flowCodeGenerator: CodeGenerator = {\n generate(node: SemanticNode): string {\n switch (node.action) {\n case 'fetch':\n return generateFetch(node);\n case 'poll':\n return generatePoll(node);\n case 'stream':\n return generateStream(node);\n case 'submit':\n return generateSubmit(node);\n case 'transform':\n return generateTransform(node);\n case 'enter':\n return generateEnter(node);\n case 'follow':\n return generateFollow(node);\n case 'perform':\n return generatePerform(node);\n case 'capture':\n return generateCapture(node);\n default:\n throw new Error(`Unknown FlowScript command: ${node.action}`);\n }\n },\n};\n","/**\n * FlowScript Natural Language Renderer\n *\n * Renders a SemanticNode back into natural-language FlowScript syntax\n * for a target language. Inverse of the parser — used by translate().\n */\n\nimport type { SemanticNode } from '@lokascript/framework';\nimport { extractRoleValue } from '@lokascript/framework';\n\n// =============================================================================\n// Keyword Tables\n// =============================================================================\n\nconst COMMAND_KEYWORDS: Record<string, Record<string, string>> = {\n fetch: {\n en: 'fetch',\n es: 'obtener',\n ja: '取得',\n ar: 'جلب',\n ko: '가져오기',\n zh: '获取',\n tr: 'getir',\n fr: 'récupérer',\n },\n poll: {\n en: 'poll',\n es: 'sondear',\n ja: 'ポーリング',\n ar: 'استطلع',\n ko: '폴링',\n zh: '轮询',\n tr: 'yokla',\n fr: 'interroger',\n },\n stream: {\n en: 'stream',\n es: 'transmitir',\n ja: 'ストリーム',\n ar: 'بث',\n ko: '스트리밍',\n zh: '流式',\n tr: 'aktar',\n fr: 'diffuser',\n },\n submit: {\n en: 'submit',\n es: 'enviar',\n ja: '送信',\n ar: 'أرسل',\n ko: '제출',\n zh: '提交',\n tr: 'gönder',\n fr: 'soumettre',\n },\n transform: {\n en: 'transform',\n es: 'transformar',\n ja: '変換',\n ar: 'حوّل',\n ko: '변환',\n zh: '转换',\n tr: 'dönüştür',\n fr: 'transformer',\n },\n};\n\nconst MARKERS: Record<string, Record<string, string>> = {\n as: { en: 'as', es: 'como', ja: 'で', ar: 'ك', ko: '로', zh: '以', tr: 'olarak', fr: 'comme' },\n into: { en: 'into', es: 'en', ja: 'に', ar: 'في', ko: '에', zh: '到', tr: 'e', fr: 'dans' },\n every: {\n en: 'every',\n es: 'cada',\n ja: 'ごとに',\n ar: 'كل',\n ko: '마다',\n zh: '每',\n tr: 'her',\n fr: 'chaque',\n },\n to: { en: 'to', es: 'a', ja: 'に', ar: 'إلى', ko: '로', zh: '到', tr: 'e', fr: 'vers' },\n with: { en: 'with', es: 'con', ja: 'で', ar: 'ب', ko: '로', zh: '用', tr: 'ile', fr: 'avec' },\n};\n\n// =============================================================================\n// Word Order Helpers\n// =============================================================================\n\nconst SOV_LANGUAGES = new Set(['ja', 'ko', 'tr']);\nconst VSO_LANGUAGES = new Set(['ar']);\n\nfunction isSOV(lang: string): boolean {\n return SOV_LANGUAGES.has(lang);\n}\n\nfunction isVSO(lang: string): boolean {\n return VSO_LANGUAGES.has(lang);\n}\n\nfunction kw(command: string, lang: string): string {\n return COMMAND_KEYWORDS[command]?.[lang] ?? command;\n}\n\nfunction mk(marker: string, lang: string): string {\n return MARKERS[marker]?.[lang] ?? marker;\n}\n\n// =============================================================================\n// Per-Command Renderers\n// =============================================================================\n\nfunction renderFetch(node: SemanticNode, lang: string): string {\n const source = extractRoleValue(node, 'source') || '/';\n const style = extractRoleValue(node, 'style');\n const dest = extractRoleValue(node, 'destination');\n const verb = kw('fetch', lang);\n const parts: string[] = [];\n\n if (isSOV(lang)) {\n parts.push(source);\n if (style) parts.push(style, mk('as', lang));\n parts.push(verb);\n if (dest) parts.push(dest, mk('into', lang));\n } else if (isVSO(lang)) {\n // VSO: verb first, then source, then modifiers\n parts.push(verb, source);\n if (style) parts.push(mk('as', lang), style);\n if (dest) parts.push(mk('into', lang), dest);\n } else {\n // SVO (default)\n parts.push(verb, source);\n if (style) parts.push(mk('as', lang), style);\n if (dest) parts.push(mk('into', lang), dest);\n }\n\n return parts.join(' ');\n}\n\nfunction renderPoll(node: SemanticNode, lang: string): string {\n const source = extractRoleValue(node, 'source') || '/';\n const duration = extractRoleValue(node, 'duration') || '5s';\n const style = extractRoleValue(node, 'style');\n const dest = extractRoleValue(node, 'destination');\n const verb = kw('poll', lang);\n const parts: string[] = [];\n\n if (isSOV(lang)) {\n parts.push(source);\n parts.push(duration, mk('every', lang));\n if (style) parts.push(style, mk('as', lang));\n parts.push(verb);\n if (dest) parts.push(dest, mk('into', lang));\n } else if (isVSO(lang)) {\n parts.push(verb, source);\n parts.push(mk('every', lang), duration);\n if (style) parts.push(mk('as', lang), style);\n if (dest) parts.push(mk('into', lang), dest);\n } else {\n parts.push(verb, source);\n parts.push(mk('every', lang), duration);\n if (style) parts.push(mk('as', lang), style);\n if (dest) parts.push(mk('into', lang), dest);\n }\n\n return parts.join(' ');\n}\n\nfunction renderStream(node: SemanticNode, lang: string): string {\n const source = extractRoleValue(node, 'source') || '/';\n const style = extractRoleValue(node, 'style');\n const dest = extractRoleValue(node, 'destination');\n const verb = kw('stream', lang);\n const parts: string[] = [];\n\n if (isSOV(lang)) {\n parts.push(source);\n if (style) parts.push(style, mk('as', lang));\n parts.push(verb);\n if (dest) parts.push(dest, mk('into', lang));\n } else if (isVSO(lang)) {\n parts.push(verb, source);\n if (style) parts.push(mk('as', lang), style);\n if (dest) parts.push(mk('into', lang), dest);\n } else {\n parts.push(verb, source);\n if (style) parts.push(mk('as', lang), style);\n if (dest) parts.push(mk('into', lang), dest);\n }\n\n return parts.join(' ');\n}\n\nfunction renderSubmit(node: SemanticNode, lang: string): string {\n const patient = extractRoleValue(node, 'patient') || '#form';\n const dest = extractRoleValue(node, 'destination') || '/';\n const style = extractRoleValue(node, 'style');\n const verb = kw('submit', lang);\n const parts: string[] = [];\n\n if (isSOV(lang)) {\n parts.push(patient);\n parts.push(dest, mk('to', lang));\n if (style) parts.push(style, mk('as', lang));\n parts.push(verb);\n } else if (isVSO(lang)) {\n // VSO: verb + patient + destination marker + destination + style\n parts.push(verb, patient);\n parts.push(mk('to', lang), dest);\n if (style) parts.push(mk('as', lang), style);\n } else {\n parts.push(verb, patient);\n parts.push(mk('to', lang), dest);\n if (style) parts.push(mk('as', lang), style);\n }\n\n return parts.join(' ');\n}\n\nfunction renderTransform(node: SemanticNode, lang: string): string {\n const patient = extractRoleValue(node, 'patient') || 'data';\n const instrument = extractRoleValue(node, 'instrument') || 'identity';\n const verb = kw('transform', lang);\n const parts: string[] = [];\n\n if (isSOV(lang)) {\n parts.push(patient);\n parts.push(instrument, mk('with', lang));\n parts.push(verb);\n } else if (isVSO(lang)) {\n parts.push(verb, patient);\n parts.push(mk('with', lang), instrument);\n } else {\n parts.push(verb, patient);\n parts.push(mk('with', lang), instrument);\n }\n\n return parts.join(' ');\n}\n\n// =============================================================================\n// Public API\n// =============================================================================\n\n/**\n * Render a FlowScript SemanticNode to natural-language text in the target language.\n */\nexport function renderFlow(node: SemanticNode, language: string): string {\n switch (node.action) {\n case 'fetch':\n return renderFetch(node, language);\n case 'poll':\n return renderPoll(node, language);\n case 'stream':\n return renderStream(node, language);\n case 'submit':\n return renderSubmit(node, language);\n case 'transform':\n return renderTransform(node, language);\n default:\n return `-- Unknown: ${node.action}`;\n }\n}\n","/**\n * HTMX Attribute Generator\n *\n * Transforms a FlowSpec into HTMX-compatible HTML attributes.\n * Maps fetch → hx-get, poll → hx-get + hx-trigger, submit → hx-post.\n * Stream (SSE) has no direct HTMX equivalent — returns null with a note.\n */\n\nimport type { FlowSpec } from '../types.js';\n\nexport interface HTMXAttributes {\n /** Generated HTMX attribute map */\n attrs: Record<string, string>;\n /** Notes about limitations or warnings */\n notes: string[];\n}\n\n/**\n * Generate HTMX attributes from a FlowSpec.\n *\n * @returns HTMXAttributes with attr map and notes, or null if the command\n * has no HTMX equivalent (e.g., transform)\n */\nexport function generateHTMX(spec: FlowSpec): HTMXAttributes | null {\n switch (spec.action) {\n case 'fetch':\n return generateFetchHTMX(spec);\n case 'poll':\n return generatePollHTMX(spec);\n case 'stream':\n return generateStreamHTMX(spec);\n case 'submit':\n return generateSubmitHTMX(spec);\n case 'transform':\n return null; // No HTMX equivalent for data transforms\n default:\n return null;\n }\n}\n\nfunction generateFetchHTMX(spec: FlowSpec): HTMXAttributes {\n const attrs: Record<string, string> = {};\n const notes: string[] = [];\n\n if (spec.url) {\n attrs['hx-get'] = spec.url;\n }\n\n if (spec.target) {\n attrs['hx-target'] = spec.target;\n }\n\n attrs['hx-swap'] = 'innerHTML';\n\n if (spec.responseFormat === 'json') {\n notes.push(\n 'HTMX expects HTML responses by default. For JSON, use hx-ext=\"json-enc\" or handle in a hyperscript handler.'\n );\n }\n\n return { attrs, notes };\n}\n\nfunction generatePollHTMX(spec: FlowSpec): HTMXAttributes {\n const attrs: Record<string, string> = {};\n const notes: string[] = [];\n\n if (spec.url) {\n attrs['hx-get'] = spec.url;\n }\n\n if (spec.intervalMs) {\n const seconds = spec.intervalMs / 1000;\n attrs['hx-trigger'] = `every ${seconds}s`;\n }\n\n if (spec.target) {\n attrs['hx-target'] = spec.target;\n }\n\n attrs['hx-swap'] = 'innerHTML';\n\n if (spec.responseFormat === 'json') {\n notes.push(\n 'HTMX expects HTML responses by default. For JSON, use hx-ext=\"json-enc\" or handle in a hyperscript handler.'\n );\n }\n\n return { attrs, notes };\n}\n\nfunction generateStreamHTMX(spec: FlowSpec): HTMXAttributes {\n const attrs: Record<string, string> = {};\n const notes: string[] = [];\n\n if (spec.url) {\n attrs['hx-ext'] = 'sse';\n attrs['sse-connect'] = spec.url;\n attrs['sse-swap'] = 'message';\n }\n\n if (spec.target) {\n attrs['hx-target'] = spec.target;\n }\n\n notes.push('SSE support requires the htmx sse extension (hx-ext=\"sse\").');\n\n return { attrs, notes };\n}\n\nfunction generateSubmitHTMX(spec: FlowSpec): HTMXAttributes {\n const attrs: Record<string, string> = {};\n const notes: string[] = [];\n\n if (spec.url) {\n attrs['hx-post'] = spec.url;\n }\n\n if (spec.responseFormat === 'json') {\n attrs['hx-ext'] = 'json-enc';\n attrs['hx-encoding'] = 'application/json';\n }\n\n if (spec.target) {\n attrs['hx-target'] = spec.target;\n }\n\n return { attrs, notes };\n}\n","/**\n * Route Extractor\n *\n * Extracts server route descriptors from parsed FlowScript commands.\n * Each fetch/poll/stream/submit URL becomes a RouteDescriptor that can\n * be fed into server-bridge for server-side code generation.\n */\n\nimport type { FlowSpec } from '../types.js';\n\n/**\n * Lightweight route descriptor — compatible with server-bridge's RouteDescriptor\n * but self-contained to avoid a hard dependency on the server-bridge package.\n */\nexport interface FlowRouteDescriptor {\n /** URL path (e.g., /api/users, /api/user/{id}) */\n path: string;\n /** HTTP method */\n method: 'GET' | 'POST' | 'PUT' | 'DELETE';\n /** Expected response format */\n responseFormat: 'json' | 'html' | 'text' | 'sse';\n /** Path parameters extracted from URL (e.g., ['id'] from /api/user/{id}) */\n pathParams: string[];\n /** Suggested handler function name */\n handlerName: string;\n /** Source command that produced this route */\n sourceCommand: string;\n}\n\n/**\n * Extract route descriptors from a FlowSpec.\n * Returns null for commands without URLs (e.g., transform).\n */\nexport function extractRoute(spec: FlowSpec): FlowRouteDescriptor | null {\n if (!spec.url) return null;\n\n const path = spec.url;\n const pathParams = extractPathParams(path);\n const handlerName = generateHandlerName(spec);\n\n return {\n path,\n method: spec.method || 'GET',\n responseFormat: spec.responseFormat || 'text',\n pathParams,\n handlerName,\n sourceCommand: spec.action,\n };\n}\n\n/**\n * Extract multiple route descriptors from an array of FlowSpecs.\n * Filters out nulls (commands without URLs).\n */\nexport function extractRoutes(specs: FlowSpec[]): FlowRouteDescriptor[] {\n return specs.map(extractRoute).filter((r): r is FlowRouteDescriptor => r !== null);\n}\n\n/**\n * Extract path parameters from a URL.\n * Supports both {param} and :param syntax.\n */\nfunction extractPathParams(url: string): string[] {\n const params: string[] = [];\n\n // {param} syntax\n const braceMatches = url.matchAll(/\\{(\\w+)\\}/g);\n for (const match of braceMatches) {\n params.push(match[1]);\n }\n\n // :param syntax\n const colonMatches = url.matchAll(/:(\\w+)/g);\n for (const match of colonMatches) {\n params.push(match[1]);\n }\n\n return params;\n}\n\n/**\n * Generate a suggested handler function name from a FlowSpec.\n */\nfunction generateHandlerName(spec: FlowSpec): string {\n if (!spec.url) return 'handler';\n\n // Extract the last meaningful path segment\n const segments = spec.url\n .split('/')\n .filter(s => s && !s.startsWith('{') && !s.startsWith(':') && !s.includes('?'));\n const lastSegment = segments[segments.length - 1] || 'data';\n\n const prefix =\n spec.method === 'POST'\n ? 'create'\n : spec.method === 'PUT'\n ? 'update'\n : spec.method === 'DELETE'\n ? 'delete'\n : 'get';\n\n // Capitalize first letter\n const name = lastSegment.charAt(0).toUpperCase() + lastSegment.slice(1);\n return `${prefix}${name}`;\n}\n","/**\n * Pipeline Parser\n *\n * Wraps the framework's single-command DSL parser to handle multi-step\n * data flow pipelines. Splits input on arrow delimiters (→ / ->), parses\n * each step individually, and assembles a PipelineParseResult.\n */\n\nimport type { MultilingualDSL, SemanticNode } from '@lokascript/framework';\nimport { renderFlow } from '../generators/flow-renderer.js';\n\n// =============================================================================\n// Types\n// =============================================================================\n\nexport interface PipelineStep {\n /** The semantic node from parsing a single command */\n node: SemanticNode;\n}\n\nexport interface PipelineParseResult {\n /** Ordered pipeline steps */\n steps: PipelineStep[];\n /** Parse errors for any failed steps */\n errors: string[];\n}\n\n// =============================================================================\n// Arrow Delimiter\n// =============================================================================\n\n/** Splits on → (Unicode) or -> (ASCII arrow), with optional surrounding whitespace */\nconst ARROW_DELIMITER = /\\s*(?:→|->)\\s*/;\n\n// =============================================================================\n// Pipeline Parser\n// =============================================================================\n\n/**\n * Parse a multi-step FlowScript pipeline into ordered steps.\n *\n * Splits input on arrow delimiters (→ / ->), parses each segment\n * via the DSL, and returns the steps in order.\n *\n * @example\n * ```\n * // Single-line arrow chain\n * parseFlowPipeline(dsl, 'fetch /api/users as json → transform data with uppercase → into #list', 'en')\n *\n * // Multi-line (newline-separated, each line is a step)\n * parseFlowPipeline(dsl, 'fetch /api/users as json\\ntransform data with uppercase', 'en')\n * ```\n */\nexport function parseFlowPipeline(\n dsl: MultilingualDSL,\n input: string,\n language: string\n): PipelineParseResult {\n const steps: PipelineStep[] = [];\n const errors: string[] = [];\n\n // Split on arrows first, then on newlines for any remaining multi-line segments\n const arrowParts = input.split(ARROW_DELIMITER);\n\n const segments: string[] = [];\n for (const part of arrowParts) {\n // Further split on newlines within each arrow-delimited part\n const lines = part\n .split(/\\n/)\n .map(l => l.trim())\n .filter(Boolean);\n segments.push(...lines);\n }\n\n // Filter out comments (lines starting with --)\n const commands = segments.filter(s => !s.startsWith('--'));\n\n for (const segment of commands) {\n try {\n const node = dsl.parse(segment, language);\n steps.push({ node });\n } catch (err) {\n errors.push(\n `Failed to parse step: \"${segment}\" - ${err instanceof Error ? err.message : String(err)}`\n );\n }\n }\n\n return { steps, errors };\n}\n\n/**\n * Compile a pipeline to a single JS code block.\n *\n * For linear pipelines (no branching), each step's output feeds into the next\n * via Promise chaining. The first step must be a source (fetch/poll/stream),\n * middle steps can be transforms, and the last step can include a destination.\n */\nexport function compilePipeline(\n dsl: MultilingualDSL,\n input: string,\n language: string\n): { ok: boolean; code?: string; errors: string[] } {\n const { steps, errors } = parseFlowPipeline(dsl, input, language);\n\n if (errors.length > 0) {\n return { ok: false, errors };\n }\n\n if (steps.length === 0) {\n return { ok: false, errors: ['Empty pipeline'] };\n }\n\n // Single step: just compile it directly\n if (steps.length === 1) {\n const result = dsl.compile(input.replace(/→|->/g, '').trim(), language);\n return {\n ok: result.ok,\n code: result.code ?? undefined,\n errors: result.ok ? [] : ['Compilation failed'],\n };\n }\n\n // Multi-step: compose into Promise chain\n const compileErrors: string[] = [];\n const codes: string[] = [];\n for (const step of steps) {\n const result = dsl.compile(renderStepBack(step.node, language), language);\n if (result.ok && result.code) {\n codes.push(result.code);\n } else {\n compileErrors.push(`Failed to compile step: ${step.node.action}`);\n }\n }\n\n if (compileErrors.length > 0) {\n return { ok: false, errors: compileErrors };\n }\n\n // Join with comment separators\n const combined = codes.join('\\n\\n// --- next step ---\\n\\n');\n return { ok: true, code: combined, errors: [] };\n}\n\n/**\n * Reconstruct a parse-able string from a SemanticNode for re-compilation.\n * Uses the natural language renderer to produce correct output with markers.\n */\nfunction renderStepBack(node: SemanticNode, language: string): string {\n return renderFlow(node, language);\n}\n","/**\n * Workflow Generator — HATEOAS compilation target\n *\n * Converts a sequence of parsed FlowSpec objects into a WorkflowSpec\n * compatible with siren-grail's compileWorkflow() step format.\n *\n * This is the bridge between FlowScript's natural-language parsing\n * and siren-grail's workflow execution engine.\n */\n\nimport type { FlowSpec, WorkflowSpec, WorkflowStep } from '../types.js';\n\n/**\n * Convert an ordered array of FlowSpecs (from parsed HATEOAS commands)\n * into a WorkflowSpec ready for siren-grail execution.\n *\n * The first 'enter' command provides the entry point URL.\n * Subsequent follow/perform/capture commands become workflow steps.\n *\n * @throws Error if no 'enter' command is found in the specs\n */\nexport function toWorkflowSpec(specs: FlowSpec[]): WorkflowSpec {\n let entryPoint: string | undefined;\n const steps: WorkflowStep[] = [];\n\n // Track the last step so capture can attach to it\n let lastStep: WorkflowStep | undefined;\n\n for (const spec of specs) {\n switch (spec.action) {\n case 'enter': {\n if (!spec.url) throw new Error('enter command requires a URL');\n entryPoint = spec.url;\n break;\n }\n\n case 'follow': {\n if (!spec.linkRel) throw new Error('follow command requires a link relation');\n const step: WorkflowStep = { type: 'navigate', rel: spec.linkRel };\n steps.push(step);\n lastStep = step;\n break;\n }\n\n case 'perform': {\n if (!spec.actionName) throw new Error('perform command requires an action name');\n const step: WorkflowStep = {\n type: 'action',\n action: spec.actionName,\n };\n if (spec.dataSource) {\n step.dataSource = spec.dataSource;\n }\n steps.push(step);\n lastStep = step;\n break;\n }\n\n case 'capture': {\n if (!spec.captureAs) throw new Error('capture command requires a variable name');\n\n // Capture attaches to the previous step as a capture modifier\n if (lastStep && (lastStep.type === 'navigate' || lastStep.type === 'action')) {\n if (!lastStep.capture) lastStep.capture = {};\n lastStep.capture[spec.captureAs] = spec.capturePath || 'properties';\n } else {\n // Standalone capture — attach to an implicit navigate to 'self'\n const step: WorkflowStep = {\n type: 'navigate',\n rel: 'self',\n capture: { [spec.captureAs]: spec.capturePath || 'properties' },\n };\n steps.push(step);\n lastStep = step;\n }\n break;\n }\n\n default:\n // Non-HATEOAS commands (fetch, poll, etc.) are not part of workflows\n break;\n }\n }\n\n if (!entryPoint) {\n throw new Error('Workflow requires an \"enter\" command to specify the API entry point');\n }\n\n return { entryPoint, steps };\n}\n\n/**\n * Convert a WorkflowSpec to siren-grail's compileWorkflow() step format.\n *\n * This produces a plain JSON array compatible with:\n * import { compileWorkflow } from 'siren-agent/workflow';\n * const decide = compileWorkflow(steps);\n */\nexport function toSirenGrailSteps(spec: WorkflowSpec): Array<Record<string, unknown>> {\n return spec.steps.map(step => {\n switch (step.type) {\n case 'navigate':\n return {\n type: 'navigate',\n rel: step.rel,\n ...(step.capture ? { capture: step.capture } : {}),\n };\n\n case 'action':\n return {\n type: 'action',\n action: step.action,\n ...(step.data ? { data: step.data } : {}),\n ...(step.dataSource ? { dataSource: step.dataSource } : {}),\n ...(step.capture ? { capture: step.capture } : {}),\n };\n\n case 'stop':\n return {\n type: 'stop',\n ...(step.result ? { result: step.result } : {}),\n ...(step.reason ? { reason: step.reason } : {}),\n };\n\n default:\n return step as Record<string, unknown>;\n }\n });\n}\n","/**\n * Workflow Executor — siren-grail adapter\n *\n * Thin adapter that takes a WorkflowSpec (from FlowScript parsing)\n * and executes it against a Siren API using siren-grail's OODAAgent\n * and compileWorkflow().\n *\n * This bridges FlowScript's natural-language parsing to siren-grail's\n * HATEOAS agent runtime.\n *\n * @example\n * ```typescript\n * import { executeWorkflow } from '@lokascript/domain-flow/runtime';\n * import { createFlowDSL, toFlowSpec } from '@lokascript/domain-flow';\n * import { toWorkflowSpec } from '@lokascript/domain-flow/generators/workflow-generator';\n *\n * const flow = createFlowDSL();\n * const specs = [\n * toFlowSpec(flow.parse('enter /api', 'en'), 'en'),\n * toFlowSpec(flow.parse('follow orders', 'en'), 'en'),\n * toFlowSpec(flow.parse('perform createOrder with #checkout', 'en'), 'en'),\n * toFlowSpec(flow.parse('capture as orderId', 'en'), 'en'),\n * ];\n *\n * const workflow = toWorkflowSpec(specs);\n * const result = await executeWorkflow(workflow, { verbose: true });\n * ```\n */\n\nimport type { WorkflowSpec, WorkflowStep } from '../types.js';\n\n/**\n * Result from a workflow execution.\n * Maps to siren-grail's OODAResult.\n */\nexport interface WorkflowResult {\n status: 'stopped' | 'error' | 'maxSteps';\n reason: string;\n result?: unknown;\n steps: number;\n history: Array<Record<string, unknown>>;\n}\n\n/**\n * Options for workflow execution.\n */\nexport interface ExecuteWorkflowOptions {\n /** Maximum OODA steps before stopping (default: 50) */\n maxSteps?: number;\n /** HTTP headers to send with all requests */\n headers?: Record<string, string>;\n /** Enable verbose logging (default: false) */\n verbose?: boolean;\n /** Timeout per request in ms (default: 30000) */\n timeout?: number;\n /** Enable auto-pursuit on 409 Conflict responses */\n autoPursue?: boolean;\n /** Callback on each entity navigation */\n onEntity?: (entity: unknown, url: string) => void;\n /** Callback on each decision */\n onDecision?: (decision: unknown) => void;\n}\n\n/**\n * Convert a WorkflowSpec to siren-grail's step format.\n *\n * This is a pure-data transformation — no siren-grail dependency required.\n * The step types map 1:1:\n * WorkflowStep.navigate → { type: 'navigate', rel }\n * WorkflowStep.action → { type: 'action', action, data?, dataSource? }\n * WorkflowStep.stop → { type: 'stop', result?, reason? }\n */\nfunction toSirenSteps(steps: WorkflowStep[]): Array<Record<string, unknown>> {\n return steps.map(step => {\n switch (step.type) {\n case 'navigate':\n return {\n type: 'navigate',\n rel: step.rel,\n ...(step.capture ? { capture: step.capture } : {}),\n };\n\n case 'action':\n return {\n type: 'action',\n action: step.action,\n ...(step.data ? { data: step.data } : {}),\n ...(step.dataSource ? { dataSource: step.dataSource } : {}),\n ...(step.capture ? { capture: step.capture } : {}),\n };\n\n case 'stop':\n return {\n type: 'stop',\n ...(step.result ? { result: step.result } : {}),\n ...(step.reason ? { reason: step.reason } : {}),\n };\n\n default:\n return step as Record<string, unknown>;\n }\n });\n}\n\n/**\n * Execute a WorkflowSpec against a Siren API using siren-grail.\n *\n * Requires `siren-agent` to be installed as a peer dependency.\n * Dynamically imports it to avoid hard dependency.\n *\n * @param spec - The compiled WorkflowSpec from toWorkflowSpec()\n * @param options - Execution options (headers, timeout, etc.)\n * @returns The execution result with status, history, and captured values\n *\n * @throws Error if siren-agent is not installed\n */\nexport async function executeWorkflow(\n spec: WorkflowSpec,\n options: ExecuteWorkflowOptions = {}\n): Promise<WorkflowResult> {\n // Dynamic import to keep siren-agent as optional peer dep\n let sirenAgent: {\n OODAAgent: new (\n url: string,\n opts: Record<string, unknown>\n ) => { run(): Promise<WorkflowResult> };\n compileWorkflow: (steps: Array<Record<string, unknown>>) => unknown;\n };\n\n try {\n sirenAgent = await import('siren-agent');\n } catch {\n throw new Error(\n 'siren-agent is required for workflow execution. Install it with: npm install siren-agent'\n );\n }\n\n const { OODAAgent, compileWorkflow } = sirenAgent;\n const steps = toSirenSteps(spec.steps);\n const decide = compileWorkflow(steps);\n\n const agent = new OODAAgent(spec.entryPoint, {\n maxSteps: options.maxSteps ?? 50,\n headers: options.headers,\n verbose: options.verbose ?? false,\n timeout: options.timeout ?? 30000,\n decide,\n ...(options.autoPursue ? { autoPursue: { maxDepth: 5 } } : {}),\n ...(options.onEntity ? { onEntity: options.onEntity } : {}),\n ...(options.onDecision ? { onDecision: options.onDecision } : {}),\n });\n\n return agent.run();\n}\n\n/**\n * Create a reusable workflow executor bound to specific options.\n *\n * Useful when executing multiple workflows against the same API\n * with shared headers/auth.\n */\nexport function createWorkflowExecutor(defaultOptions: ExecuteWorkflowOptions = {}) {\n return {\n execute(spec: WorkflowSpec, overrides?: ExecuteWorkflowOptions): Promise<WorkflowResult> {\n return executeWorkflow(spec, { ...defaultOptions, ...overrides });\n },\n };\n}\n\n// Re-export for convenience\nexport { toSirenSteps };\n","/**\n * MCP Workflow Server — HATEOAS → MCP tool bridge\n *\n * An MCP server that wraps a Siren API, exposing current entity affordances\n * (actions and links) as dynamic MCP tools. As the agent navigates through\n * hypermedia states, tools appear and disappear — `tools/list_changed` fires\n * on every state transition.\n *\n * This is the novel contribution: MCP's tool protocol becomes a first-class\n * HATEOAS mechanism. External LLM clients (Claude Code, Cursor, etc.) see\n * affordance-driven tool sets without needing to understand Siren.\n *\n * Tool naming convention:\n * action__{name} — Execute a Siren action\n * navigate__{rel} — Follow a Siren link\n * resolve__{name} — Resolve a 409 prerequisite action\n *\n * @example\n * ```typescript\n * import { createMcpWorkflowServer } from '@lokascript/domain-flow/runtime';\n *\n * const server = createMcpWorkflowServer({\n * entryPoint: 'http://api.example.com/',\n * name: 'order-api',\n * version: '1.0.0',\n * });\n *\n * await server.start(); // Connects to API, builds initial tools, listens on stdio\n * ```\n */\n\nimport type { WorkflowSpec } from '../types.js';\n\n// =============================================================================\n// Types\n// =============================================================================\n\n/** Siren entity structure (subset for our needs) */\ninterface SirenEntity {\n class?: string[];\n properties?: Record<string, unknown>;\n entities?: Array<Record<string, unknown>>;\n actions?: SirenAction[];\n links?: SirenLink[];\n}\n\ninterface SirenAction {\n name: string;\n title?: string;\n href: string;\n method?: string;\n type?: string;\n fields?: SirenField[];\n}\n\ninterface SirenField {\n name: string;\n type?: string;\n value?: unknown;\n title?: string;\n}\n\ninterface SirenLink {\n rel: string[];\n href: string;\n title?: string;\n type?: string;\n}\n\n/** MCP tool definition */\ninterface McpTool {\n name: string;\n description: string;\n inputSchema: {\n type: 'object';\n properties: Record<string, unknown>;\n required?: string[];\n };\n}\n\n/** Configuration for the MCP workflow server */\nexport interface McpWorkflowServerConfig {\n /** API entry point URL */\n entryPoint: string;\n /** Server name for MCP identification */\n name?: string;\n /** Server version */\n version?: string;\n /** HTTP headers (e.g., auth) for all API requests */\n headers?: Record<string, string>;\n /** Enable verbose logging */\n verbose?: boolean;\n /** Optional pre-compiled WorkflowSpec to auto-execute */\n workflow?: WorkflowSpec;\n}\n\n// =============================================================================\n// Tool Generation from Siren Affordances\n// =============================================================================\n\n/**\n * Convert Siren actions to MCP tool definitions.\n *\n * Each action becomes an `action__{name}` tool with input schema\n * generated from the action's fields.\n */\nexport function actionsToTools(actions: SirenAction[]): McpTool[] {\n return actions.map(action => {\n const properties: Record<string, unknown> = {};\n const required: string[] = [];\n\n for (const field of action.fields ?? []) {\n properties[field.name] = {\n type: fieldTypeToJsonSchema(field.type),\n ...(field.title ? { description: field.title } : {}),\n ...(field.value !== undefined ? { default: field.value } : {}),\n };\n // Siren fields are required by default unless they have a default value\n if (field.value === undefined) {\n required.push(field.name);\n }\n }\n\n return {\n name: `action__${action.name}`,\n description:\n action.title ??\n `Execute the \"${action.name}\" action (${action.method ?? 'POST'} ${action.href})`,\n inputSchema: {\n type: 'object' as const,\n properties,\n ...(required.length > 0 ? { required } : {}),\n },\n };\n });\n}\n\n/**\n * Convert Siren links to MCP tool definitions.\n *\n * Each link becomes a `navigate__{rel}` tool with no required inputs.\n */\nexport function linksToTools(links: SirenLink[]): McpTool[] {\n // Deduplicate by first rel\n const seen = new Set<string>();\n const tools: McpTool[] = [];\n\n for (const link of links) {\n const rel = link.rel[0];\n if (!rel || rel === 'self' || seen.has(rel)) continue;\n seen.add(rel);\n\n tools.push({\n name: `navigate__${rel}`,\n description: link.title ?? `Navigate to \"${rel}\" (${link.href})`,\n inputSchema: {\n type: 'object' as const,\n properties: {},\n },\n });\n }\n\n return tools;\n}\n\n/**\n * Convert Siren field type to JSON Schema type.\n */\nfunction fieldTypeToJsonSchema(type?: string): string {\n switch (type) {\n case 'number':\n case 'range':\n return 'number';\n case 'checkbox':\n return 'boolean';\n case 'hidden':\n case 'text':\n case 'email':\n case 'url':\n case 'password':\n case 'search':\n case 'tel':\n case 'date':\n case 'datetime-local':\n case 'time':\n case 'month':\n case 'week':\n default:\n return 'string';\n }\n}\n\n/**\n * Build the complete tool set from a Siren entity.\n */\nexport function entityToTools(entity: SirenEntity): McpTool[] {\n return [...actionsToTools(entity.actions ?? []), ...linksToTools(entity.links ?? [])];\n}\n\n// =============================================================================\n// MCP Server (protocol-level, transport-agnostic)\n// =============================================================================\n\n/**\n * MCP Workflow Server state machine.\n *\n * Manages the Siren agent state and translates between MCP tool\n * calls and Siren API interactions. Transport (stdio, SSE, etc.)\n * is handled externally.\n *\n * The server lifecycle:\n * 1. initialize() — fetch entry point, build initial tool set\n * 2. listTools() — return current affordance-derived tools\n * 3. callTool(name, args) — execute action or navigate, rebuild tools\n * 4. On each state change, emit tools/list_changed notification\n */\nexport class McpWorkflowServer {\n private config: Required<Pick<McpWorkflowServerConfig, 'entryPoint' | 'name' | 'version'>> &\n McpWorkflowServerConfig;\n private currentEntity: SirenEntity | null = null;\n private currentUrl: string;\n private currentTools: McpTool[] = [];\n private toolChangeListeners: Array<() => void> = [];\n\n constructor(config: McpWorkflowServerConfig) {\n this.config = {\n name: 'hateoas-mcp-server',\n version: '1.0.0',\n ...config,\n };\n this.currentUrl = config.entryPoint;\n }\n\n /**\n * Register a listener for tool list changes (maps to tools/list_changed).\n */\n onToolsChanged(listener: () => void): void {\n this.toolChangeListeners.push(listener);\n }\n\n /**\n * Initialize the server by fetching the entry point entity.\n */\n async initialize(): Promise<void> {\n const entity = await this.fetchEntity(this.config.entryPoint);\n this.updateState(entity, this.config.entryPoint);\n }\n\n /**\n * Get the current list of available MCP tools.\n */\n listTools(): McpTool[] {\n return this.currentTools;\n }\n\n /**\n * Get the current entity as an MCP resource.\n */\n getCurrentEntity(): SirenEntity | null {\n return this.currentEntity;\n }\n\n /**\n * Get the current URL.\n */\n getCurrentUrl(): string {\n return this.currentUrl;\n }\n\n /**\n * Call a tool (action or navigation).\n *\n * Returns the result text and triggers tools/list_changed if the\n * entity state changed.\n */\n async callTool(\n name: string,\n args: Record<string, unknown>\n ): Promise<{ content: string; isError?: boolean }> {\n if (!this.currentEntity) {\n return { content: 'Server not initialized. Call initialize() first.', isError: true };\n }\n\n // Parse tool name\n const [prefix, ...rest] = name.split('__');\n const identifier = rest.join('__'); // Handle names with double underscores\n\n try {\n switch (prefix) {\n case 'action': {\n const action = this.currentEntity.actions?.find(a => a.name === identifier);\n if (!action) {\n return {\n content: `Action \"${identifier}\" not available. Available: ${(this.currentEntity.actions ?? []).map(a => a.name).join(', ')}`,\n isError: true,\n };\n }\n const result = await this.executeAction(action, args);\n return { content: JSON.stringify(result.properties ?? result, null, 2) };\n }\n\n case 'navigate': {\n const link = this.currentEntity.links?.find(l => l.rel.includes(identifier));\n if (!link) {\n return {\n content: `Link \"${identifier}\" not available. Available: ${(this.currentEntity.links ?? []).map(l => l.rel[0]).join(', ')}`,\n isError: true,\n };\n }\n const entity = await this.fetchEntity(link.href);\n this.updateState(entity, link.href);\n return { content: JSON.stringify(entity.properties ?? entity, null, 2) };\n }\n\n default:\n return { content: `Unknown tool prefix: ${prefix}`, isError: true };\n }\n } catch (error) {\n return {\n content: `Error: ${error instanceof Error ? error.message : String(error)}`,\n isError: true,\n };\n }\n }\n\n /**\n * Get MCP server capabilities for the initialize response.\n */\n getCapabilities() {\n return {\n tools: { listChanged: true },\n resources: {},\n };\n }\n\n /**\n * Get MCP server info for the initialize response.\n */\n getServerInfo() {\n return {\n name: this.config.name,\n version: this.config.version,\n };\n }\n\n // ===========================================================================\n // Private\n // ===========================================================================\n\n private async fetchEntity(url: string): Promise<SirenEntity> {\n const response = await fetch(url, {\n headers: {\n Accept: 'application/vnd.siren+json, application/json',\n ...this.config.headers,\n },\n });\n\n if (!response.ok) {\n throw new Error(`HTTP ${response.status}: ${response.statusText}`);\n }\n\n return (await response.json()) as SirenEntity;\n }\n\n private async executeAction(\n action: SirenAction,\n data: Record<string, unknown>\n ): Promise<SirenEntity> {\n const method = action.method?.toUpperCase() ?? 'POST';\n const headers: Record<string, string> = {\n Accept: 'application/vnd.siren+json, application/json',\n ...this.config.headers,\n };\n\n let body: string | undefined;\n if (method !== 'GET' && method !== 'HEAD') {\n headers['Content-Type'] = action.type ?? 'application/json';\n body = JSON.stringify(data);\n }\n\n const response = await fetch(action.href, { method, headers, body });\n\n if (!response.ok) {\n throw new Error(`HTTP ${response.status}: ${response.statusText}`);\n }\n\n const entity = (await response.json()) as SirenEntity;\n this.updateState(entity, action.href);\n return entity;\n }\n\n private updateState(entity: SirenEntity, url: string): void {\n this.currentEntity = entity;\n this.currentUrl = url;\n this.currentTools = entityToTools(entity);\n\n // Notify listeners (maps to MCP tools/list_changed)\n for (const listener of this.toolChangeListeners) {\n listener();\n }\n }\n}\n\n/**\n * Create a new MCP workflow server instance.\n */\nexport function createMcpWorkflowServer(config: McpWorkflowServerConfig): McpWorkflowServer {\n return new McpWorkflowServer(config);\n}\n"],"mappings":"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","names":["defineCommand","defineRole","defineCommand","defineRole","extractRoleValue"]}
package/package.json ADDED
@@ -0,0 +1,66 @@
1
+ {
2
+ "name": "@lokascript/domain-flow",
3
+ "version": "2.1.0",
4
+ "description": "Declarative reactive data flow DSL built on @lokascript/framework - fetch, poll, stream, submit via natural language",
5
+ "type": "module",
6
+ "sideEffects": false,
7
+ "main": "dist/index.cjs",
8
+ "module": "dist/index.js",
9
+ "types": "dist/index.d.ts",
10
+ "exports": {
11
+ ".": {
12
+ "types": "./dist/index.d.ts",
13
+ "import": "./dist/index.js",
14
+ "require": "./dist/index.cjs"
15
+ }
16
+ },
17
+ "scripts": {
18
+ "build": "tsup && npm run build:types",
19
+ "build:types": "tsc --emitDeclarationOnly --outDir dist",
20
+ "test": "vitest",
21
+ "test:run": "vitest run",
22
+ "test:check": "vitest run --reporter=dot 2>&1 | tail -5",
23
+ "typecheck": "tsc --noEmit"
24
+ },
25
+ "dependencies": {
26
+ "@lokascript/framework": "*"
27
+ },
28
+ "devDependencies": {
29
+ "@types/node": "^20.0.0",
30
+ "tsup": "^8.0.0",
31
+ "typescript": "^5.0.0",
32
+ "vitest": "^4.0.0"
33
+ },
34
+ "files": [
35
+ "dist",
36
+ "src",
37
+ "LICENSE"
38
+ ],
39
+ "keywords": [
40
+ "flowscript",
41
+ "data-flow",
42
+ "reactive",
43
+ "fetch",
44
+ "sse",
45
+ "multilingual",
46
+ "dsl",
47
+ "i18n",
48
+ "parser",
49
+ "lokascript",
50
+ "framework",
51
+ "mcp"
52
+ ],
53
+ "author": "LokaScript Contributors",
54
+ "license": "MIT",
55
+ "repository": {
56
+ "type": "git",
57
+ "url": "git+https://github.com/codetalcott/hyperfixi.git",
58
+ "directory": "packages/domain-flow"
59
+ },
60
+ "engines": {
61
+ "node": ">=18.0.0"
62
+ },
63
+ "publishConfig": {
64
+ "access": "public"
65
+ }
66
+ }