@ansible-flow/core 0.86.0 → 0.88.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/dist/ai/describe.js +8 -7
- package/dist/ai/handlers.js +27 -25
- package/dist/ai/handlers.js.map +1 -1
- package/dist/ai/ops.js +8 -7
- package/dist/ai/reference.js +2 -2
- package/dist/ai/scenarios.js +12 -8
- package/dist/awx/import.js +7 -6
- package/dist/catalog/draft.d.ts +2 -0
- package/dist/catalog/draft.js +23 -4
- package/dist/catalog/draft.js.map +2 -2
- package/dist/chunks/{chunk-BXHI5EQM.js → chunk-2DT5DOSO.js} +43 -1
- package/dist/chunks/chunk-2DT5DOSO.js.map +7 -0
- package/dist/chunks/{chunk-DHU774ES.js → chunk-2KB3J3R5.js} +2 -2
- package/dist/chunks/{chunk-EAJFZKPB.js → chunk-37FKZNRN.js} +3 -3
- package/dist/chunks/{chunk-TPRZZHXA.js → chunk-57KJYXWA.js} +7 -7
- package/dist/chunks/{chunk-JTWR3TGG.js → chunk-7ALTNZCI.js} +4 -4
- package/dist/chunks/{chunk-UXIXXEIW.js → chunk-APBEHKCF.js} +2 -2
- package/dist/chunks/{chunk-ZAYNYPCX.js → chunk-ARA3VJR2.js} +2 -2
- package/dist/chunks/{chunk-7GLSXIZ3.js → chunk-BSX6G7QY.js} +5 -5
- package/dist/chunks/{chunk-H7Z2FBRD.js → chunk-CATQHJS6.js} +8 -8
- package/dist/chunks/{chunk-J7KCGVHU.js → chunk-CCWUUVSG.js} +2 -2
- package/dist/chunks/{chunk-C6SQEXL5.js → chunk-CNQ7M7HA.js} +2 -2
- package/dist/chunks/{chunk-NT62IE3Y.js → chunk-CNYGDBID.js} +2 -2
- package/dist/chunks/chunk-FIKPXL6E.js +23 -0
- package/dist/chunks/chunk-FIKPXL6E.js.map +7 -0
- package/dist/chunks/{chunk-CM23ODBB.js → chunk-J5LYSQ3L.js} +2 -2
- package/dist/chunks/{chunk-72LO6GQE.js → chunk-KXD6FX2Z.js} +2 -2
- package/dist/chunks/{chunk-4RMWFRWG.js → chunk-LELKMVJG.js} +45 -7
- package/dist/chunks/chunk-LELKMVJG.js.map +7 -0
- package/dist/chunks/{chunk-XOPGOWNQ.js → chunk-O5Y3AZ4X.js} +1 -1
- package/dist/chunks/chunk-O5Y3AZ4X.js.map +7 -0
- package/dist/chunks/{chunk-5XGAGNH5.js → chunk-OGNFHW5O.js} +7 -13
- package/dist/chunks/chunk-OGNFHW5O.js.map +7 -0
- package/dist/chunks/chunk-OJZSZBHW.js +45 -0
- package/dist/chunks/chunk-OJZSZBHW.js.map +7 -0
- package/dist/chunks/{chunk-R4MW3DRT.js → chunk-OW32YCZ6.js} +2 -2
- package/dist/chunks/{chunk-2QQC4IZ7.js → chunk-PNLY5IWM.js} +8 -8
- package/dist/chunks/chunk-PNLY5IWM.js.map +7 -0
- package/dist/chunks/{chunk-76T45V37.js → chunk-TBFB7A2Z.js} +5 -1
- package/dist/chunks/{chunk-76T45V37.js.map → chunk-TBFB7A2Z.js.map} +2 -2
- package/dist/chunks/{chunk-BXJOUAXV.js → chunk-TEJARYAE.js} +3 -3
- package/dist/chunks/{chunk-T5UB4MBB.js → chunk-TOTSB4HG.js} +41 -1
- package/dist/chunks/chunk-TOTSB4HG.js.map +7 -0
- package/dist/chunks/{chunk-MZ6IJWB2.js → chunk-TPMACJFA.js} +4 -4
- package/dist/chunks/{chunk-CXVJWFGT.js → chunk-WTVGCMGV.js} +8 -4
- package/dist/chunks/chunk-WTVGCMGV.js.map +7 -0
- package/dist/chunks/{chunk-6MLYGFT6.js → chunk-XJAMBKE3.js} +6 -2
- package/dist/chunks/chunk-XJAMBKE3.js.map +7 -0
- package/dist/chunks/{chunk-ABYJBONR.js → chunk-ZXUXX3YY.js} +4 -4
- package/dist/engine/binding.js +3 -1
- package/dist/engine/bypass.js +4 -2
- package/dist/engine/engines.js +9 -5
- package/dist/engine/files.js +9 -5
- package/dist/engine/optionA.js +8 -4
- package/dist/engine/partial.js +3 -1
- package/dist/engine/partial.js.map +1 -1
- package/dist/engine/preview.js +9 -5
- package/dist/engine/preview.js.map +1 -1
- package/dist/engine/writePlan.js +12 -9
- package/dist/export/drawio.js +3 -3
- package/dist/export/layoutCheck.js +3 -3
- package/dist/export/scene.js +2 -2
- package/dist/export/svg.js +4 -4
- package/dist/flow/commands.d.ts +10 -0
- package/dist/flow/commands.js +3 -1
- package/dist/flow/facts.d.ts +6 -0
- package/dist/flow/facts.js +13 -0
- package/dist/flow/facts.js.map +7 -0
- package/dist/flow/findingCodes.js +1 -1
- package/dist/flow/localFiles.d.ts +17 -0
- package/dist/flow/localFiles.js +14 -0
- package/dist/flow/localFiles.js.map +7 -0
- package/dist/flow/save.js +3 -1
- package/dist/flow/save.js.map +1 -1
- package/dist/flow/validate.js +3 -2
- package/dist/import/outline.js +9 -7
- package/dist/import/playbook.js +6 -5
- package/dist/import/source.js +3 -2
- package/dist/lens/caption.js +1 -1
- package/dist/lens/data.js +3 -1
- package/dist/lens/index.js +11 -9
- package/dist/lens/index.js.map +1 -1
- package/dist/lens/types.d.ts +2 -0
- package/dist/lens/types.js +1 -1
- package/dist/messageCheck.js +2 -0
- package/dist/messageCheck.js.map +2 -2
- package/dist/protocol.d.ts +29 -0
- package/dist/run/command.d.ts +13 -4
- package/dist/run/command.js +19 -0
- package/dist/run/command.js.map +3 -3
- package/dist/scenario/live.js +11 -7
- package/dist/scenario/simulate.js +10 -6
- package/dist/view/flowFacts.js +12 -9
- package/dist/view/flowFacts.js.map +1 -1
- package/dist/view/route.d.ts +3 -1
- package/dist/view/route.js +1 -1
- package/dist/view/serverChange.d.ts +23 -0
- package/dist/view/serverChange.js +48 -0
- package/dist/view/serverChange.js.map +7 -0
- package/package.json +1 -1
- package/dist/chunks/chunk-2QQC4IZ7.js.map +0 -7
- package/dist/chunks/chunk-4RMWFRWG.js.map +0 -7
- package/dist/chunks/chunk-5XGAGNH5.js.map +0 -7
- package/dist/chunks/chunk-6MLYGFT6.js.map +0 -7
- package/dist/chunks/chunk-BXHI5EQM.js.map +0 -7
- package/dist/chunks/chunk-CXVJWFGT.js.map +0 -7
- package/dist/chunks/chunk-T5UB4MBB.js.map +0 -7
- package/dist/chunks/chunk-XOPGOWNQ.js.map +0 -7
- /package/dist/chunks/{chunk-DHU774ES.js.map → chunk-2KB3J3R5.js.map} +0 -0
- /package/dist/chunks/{chunk-EAJFZKPB.js.map → chunk-37FKZNRN.js.map} +0 -0
- /package/dist/chunks/{chunk-TPRZZHXA.js.map → chunk-57KJYXWA.js.map} +0 -0
- /package/dist/chunks/{chunk-JTWR3TGG.js.map → chunk-7ALTNZCI.js.map} +0 -0
- /package/dist/chunks/{chunk-UXIXXEIW.js.map → chunk-APBEHKCF.js.map} +0 -0
- /package/dist/chunks/{chunk-ZAYNYPCX.js.map → chunk-ARA3VJR2.js.map} +0 -0
- /package/dist/chunks/{chunk-7GLSXIZ3.js.map → chunk-BSX6G7QY.js.map} +0 -0
- /package/dist/chunks/{chunk-H7Z2FBRD.js.map → chunk-CATQHJS6.js.map} +0 -0
- /package/dist/chunks/{chunk-J7KCGVHU.js.map → chunk-CCWUUVSG.js.map} +0 -0
- /package/dist/chunks/{chunk-C6SQEXL5.js.map → chunk-CNQ7M7HA.js.map} +0 -0
- /package/dist/chunks/{chunk-NT62IE3Y.js.map → chunk-CNYGDBID.js.map} +0 -0
- /package/dist/chunks/{chunk-CM23ODBB.js.map → chunk-J5LYSQ3L.js.map} +0 -0
- /package/dist/chunks/{chunk-72LO6GQE.js.map → chunk-KXD6FX2Z.js.map} +0 -0
- /package/dist/chunks/{chunk-R4MW3DRT.js.map → chunk-OW32YCZ6.js.map} +0 -0
- /package/dist/chunks/{chunk-BXJOUAXV.js.map → chunk-TEJARYAE.js.map} +0 -0
- /package/dist/chunks/{chunk-MZ6IJWB2.js.map → chunk-TPMACJFA.js.map} +0 -0
- /package/dist/chunks/{chunk-ABYJBONR.js.map → chunk-ZXUXX3YY.js.map} +0 -0
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../../src/core/catalog/draft.ts"],
|
|
4
|
-
"sourcesContent": ["// The binding being configured in the properties view (M5, mockup 11): staged in the webview and\n// written by \"Save binding\" as one setBinding command. Pure, so the form, the checklist and the\n// generated-task preview are the same functions the tests run.\n\nimport type { FlowCommand } from '../flow/commands';\nimport { registerName } from '../flow/dataNames';\nimport { enclosing, liftOf, resolveFrom, upstreamNodes } from '../flow/dataRefs';\nimport { refsIn } from '../flow/jinja';\nimport type { FlowModel } from '../flow/model';\nimport type { ContractField, ContractType, FlowNode, ImplBinding, Ulid } from '../flow/types';\nimport { MAGIC_VARS } from '../flow/validate';\nimport { documentedOptions } from './freeKeys';\nimport type { CatalogOption, CatalogPlugin, CatalogReturn } from './types';\n\nexport type BindKind = ImplBinding['kind'];\n\nexport interface BindingDraft {\n kind: BindKind;\n ref: string;\n collection_version?: string;\n params: Record<string, unknown>;\n register: string;\n /** Contract fields the binding adds or changes (chips, returns); null removes one. */\n inputs: Record<string, ContractField | null>;\n outputs: Record<string, ContractField | null>;\n}\n\nexport function draftOf(node: FlowNode): BindingDraft {\n const impl = node.impl;\n return {\n kind: impl?.kind ?? 'module',\n ref: impl?.ref ?? '',\n collection_version: impl?.collection_version,\n params: structuredClone(impl?.params ?? {}),\n register: impl?.kind === 'module' || !impl ? registerName(node, impl) : '',\n inputs: {},\n outputs: {},\n };\n}\n\nconst empty = (v: unknown) => v === undefined || v === '' || (Array.isArray(v) && v.length === 0);\n\n/** The binding as it would be stored; null while nothing is chosen. */\nexport function draftImpl(d: BindingDraft): ImplBinding | null {\n if (!d.ref.trim()) return null;\n const params = Object.fromEntries(Object.entries(d.params).filter(([, v]) => !empty(v)));\n return {\n kind: d.kind,\n ref: d.ref.trim(),\n ...(d.kind === 'module' && d.collection_version\n ? { collection_version: d.collection_version }\n : {}),\n ...(Object.keys(params).length > 0 ? { params } : {}),\n ...(d.kind === 'module' && d.register ? { register: d.register } : {}),\n };\n}\n\nfunction merge(\n base: Record<string, ContractField> | undefined,\n patch: Record<string, ContractField | null>,\n): Record<string, ContractField> | undefined {\n const out: Record<string, ContractField> = { ...(base ?? {}) };\n for (const [k, v] of Object.entries(patch)) {\n if (v === null) delete out[k];\n else out[k] = v;\n }\n return Object.keys(out).length > 0 ? out : undefined;\n}\n\n/** The node as it will be after Save binding (preview, checklist). */\nexport function stagedNode(node: FlowNode, d: BindingDraft): FlowNode {\n const impl = draftImpl(d);\n // Save binding keeps the task keywords (AFD-26); playbook bindings take none.\n const keywords = impl && impl.kind !== 'playbook' ? node.impl?.keywords : undefined;\n return {\n ...node,\n impl: impl && keywords ? { ...impl, keywords } : impl,\n inputs: merge(node.inputs, d.inputs),\n outputs: merge(node.outputs, d.outputs),\n };\n}\n\nexport function isDirty(node: FlowNode, d: BindingDraft): boolean {\n // Against the draft the node loads as, not the node itself: loading fills in what the file leaves\n // out (the register name), so an untouched draft is never a change (AFD-43, the leave guard).\n const was = stagedNode(node, draftOf(node));\n const staged = stagedNode(node, d);\n return (\n JSON.stringify(staged.impl ?? null) !== JSON.stringify(was.impl ?? null) ||\n JSON.stringify(staged.inputs ?? null) !== JSON.stringify(was.inputs ?? null) ||\n JSON.stringify(staged.outputs ?? null) !== JSON.stringify(was.outputs ?? null)\n );\n}\n\n/** Save binding: one command; the status follows in planCommand (AFD-50). */\nexport function bindingCommand(node: FlowNode, d: BindingDraft): FlowCommand {\n const impl = draftImpl(d);\n const changed = (patch: Record<string, ContractField | null>, side: 'inputs' | 'outputs') =>\n Object.fromEntries(\n Object.entries(patch).filter(\n ([k, v]) => JSON.stringify(v) !== JSON.stringify(node[side]?.[k] ?? null),\n ),\n );\n return {\n kind: 'setBinding',\n id: node.id,\n impl,\n inputs: changed(d.inputs, 'inputs'),\n outputs: changed(d.outputs, 'outputs'),\n };\n}\n\n// ---- form ---------------------------------------------------------------------------------------\n\nexport type Control = 'bool' | 'choice' | 'list' | 'number' | 'text' | 'yaml';\n\nexport interface FormField {\n name: string;\n option: CatalogOption;\n control: Control;\n required: boolean;\n}\n\nexport function controlOf(o: CatalogOption): Control {\n if (o.type === 'bool' || o.type === 'boolean') return 'bool';\n if (o.choices && o.choices.length > 0 && o.type !== 'list') return 'choice';\n if (o.type === 'list' && (!o.elements || o.elements === 'str') && !o.suboptions) return 'list';\n if (o.type === 'int' || o.type === 'float') return 'number';\n if (o.type === 'dict' || o.type === 'list' || o.type === 'json' || o.suboptions) return 'yaml';\n return 'text';\n}\n\n/** Required and already set parameters first; the rest behind \"Show N more\" (mockup 11). */\nexport function formFields(\n options: Record<string, CatalogOption> | undefined,\n params: Record<string, unknown>,\n): { shown: FormField[]; more: FormField[] } {\n const all = Object.entries(options ?? {}).map(([name, option]) => ({\n name,\n option,\n control: controlOf(option),\n required: !!option.required && option.default === undefined,\n }));\n const set = (f: FormField) =>\n f.required || !empty(params[f.name]) || (f.option.aliases ?? []).some((a) => !empty(params[a]));\n return { shown: all.filter(set), more: all.filter((f) => !set(f)) };\n}\n\n/** Configure's groups (AFD-80): what a module needs, what has a value, what was added, the rest. */\nexport interface ParamGroups {\n required: FormField[];\n set: FormField[];\n /** Added with the parameter picker or a docs row, still without a value. */\n added: FormField[];\n /** Offered by the parameter picker. */\n rest: FormField[];\n}\n\nexport function paramGroups(\n options: Record<string, CatalogOption> | undefined,\n params: Record<string, unknown>,\n added: readonly string[] = [],\n): ParamGroups {\n const { shown, more } = formFields(options, params);\n return {\n required: shown.filter((f) => f.required),\n set: shown.filter((f) => !f.required),\n added: added.flatMap((n) => more.filter((f) => f.name === n)),\n rest: more.filter((f) => !added.includes(f.name)),\n };\n}\n\n/**\n * The parameter picker's matches (AFD-80): by name first (exact, then prefix, then inside), then\n * by alias, then by description, each kept in the docs' order. An empty query keeps them all.\n */\nexport function filterParams(fields: readonly FormField[], query: string): FormField[] {\n const q = query.trim().toLowerCase();\n if (!q) return [...fields];\n const rank = (f: FormField) => {\n const name = f.name.toLowerCase();\n if (name === q) return 0;\n if (name.startsWith(q)) return 1;\n if (name.includes(q)) return 2;\n if ((f.option.aliases ?? []).some((a) => a.toLowerCase().includes(q))) return 3;\n if (f.option.description.toLowerCase().includes(q)) return 4;\n return -1;\n };\n return fields\n .map((f, i) => ({ f, i, r: rank(f) }))\n .filter((x) => x.r >= 0)\n .sort((a, b) => a.r - b.r || a.i - b.i)\n .map((x) => x.f);\n}\n\n/** Binding problems that ask for another module, not other parameters: Change Module opens. */\nexport const CHANGE_MODULE_CODES: ReadonlySet<string> = new Set([\n 'binding-not-in-ee',\n 'binding-removed',\n 'binding-redirect',\n 'binding-deprecated',\n]);\n\nconst RETURN_TYPES: Record<string, ContractType> = {\n str: 'string',\n string: 'string',\n int: 'integer',\n integer: 'integer',\n float: 'any',\n bool: 'boolean',\n boolean: 'boolean',\n list: 'list',\n dict: 'dict',\n complex: 'dict',\n};\n\nexport function contractTypeOf(ret: Pick<CatalogReturn, 'type'>): ContractType {\n return RETURN_TYPES[ret.type] ?? 'any';\n}\n\n// ---- checklist ----------------------------------------------------------------------------------\n\nexport interface CheckItem {\n state: 'ok' | 'warn' | 'missing';\n text: string;\n}\n\n/** What the binding still needs and what to know about it (mockup 11 checklist). */\nexport function checklist(\n model: FlowModel,\n staged: FlowNode,\n doc: { plugin?: CatalogPlugin | null; roleSpec?: boolean; playbookTargets?: boolean },\n): CheckItem[] {\n const impl = staged.impl;\n if (!impl) return [{ state: 'missing', text: 'Choose a module, role or playbook' }];\n const items: CheckItem[] = [];\n const plugin = doc.plugin;\n if (impl.kind === 'module' && plugin) {\n const params = impl.params ?? {};\n const given = new Set(Object.keys(params));\n const missing = Object.entries(documentedOptions(impl.ref, plugin.options) ?? {})\n .filter(([name, o]) => o.required && o.default === undefined && !given.has(name))\n .filter(([, o]) => !(o.aliases ?? []).some((a) => given.has(a)))\n .map(([name]) => name);\n items.push(\n missing.length > 0\n ? { state: 'missing', text: `Required parameters missing: ${missing.join(', ')}` }\n : { state: 'ok', text: 'Required parameters set' },\n );\n }\n for (const name of refsIn(impl.params ?? {})) {\n if (MAGIC_VARS.test(name)) continue;\n const input = staged.inputs?.[name];\n const from = input?.from;\n if (!input) items.push({ state: 'missing', text: `${name} is not an input of this node` });\n else if (from?.startsWith('flow.'))\n items.push({ state: 'ok', text: `${name} comes from flow inputs` });\n else if (from) {\n const key = from.split('.')[0] ?? '';\n const source = [...model.nodes.values()].find((e) => e.node.key === key)?.node;\n items.push({\n state: 'ok',\n text: `${name} comes from ${source ? `\"${source.title}\"` : from}`,\n });\n } else items.push({ state: 'warn', text: `${name} is an input without a source (from:)` });\n }\n if (impl.kind === 'module' && plugin) {\n const check = plugin.attributes?.check_mode?.support;\n if (check === 'full')\n items.push({ state: 'ok', text: 'Supports check mode, safe in skeleton runs' });\n else if (check === 'partial')\n items.push({ state: 'warn', text: 'Partial check mode support: skeleton runs may differ' });\n else if (check === 'none')\n items.push({ state: 'warn', text: 'No check mode: skeleton runs skip this task' });\n if (plugin.deprecated)\n items.push({ state: 'warn', text: `Deprecated: ${plugin.deprecated.why || 'see the docs'}` });\n }\n if (impl.kind === 'role')\n items.push(\n doc.roleSpec\n ? { state: 'ok', text: 'The role checks its arguments (argument_specs)' }\n : { state: 'warn', text: 'No argument_specs: variables are free-form' },\n );\n if (impl.kind === 'playbook')\n items.push(\n doc.playbookTargets\n ? { state: 'ok', text: 'Its plays target {{ afd_hosts }}, the hosts arriving here' }\n : {\n state: 'warn',\n text: 'Its plays do not target {{ afd_hosts }}: they run on their own hosts',\n },\n );\n return items;\n}\n\n// ---- data references ----------------------------------------------------------------------------\n\nexport { upstreamNodes };\n\nexport interface RefChoice {\n /** The variable the chip reads. */\n name: string;\n label: string;\n detail: string;\n /** Set when choosing it adds a node input. */\n field?: ContractField;\n /**\n * AFD-106 (round 3: R7): choosing it also makes this upstream step's registered result an output\n * there. The participant typed the register name, since nothing in the list offered the result.\n */\n expose?: { node: Ulid; output: string };\n /**\n * AFD-108 (wave 10: Z1): set when the choice is a module step's whole result: the fields its\n * docs list, which the list offers next (`read_version_result.stdout`).\n */\n fields?: ResultField[];\n}\n\n/** A documented field of a module's result (its RETURN section). */\nexport interface ResultField {\n name: string;\n /** The first sentence of the docs' description. */\n detail: string;\n}\n\n// The fields people read most come first; the rest keep the order of the docs.\nconst FIRST_FIELDS = ['stdout', 'stdout_lines', 'rc', 'stderr', 'json', 'status', 'content', 'msg'];\n\nfunction firstSentence(text: string): string {\n const line = (text.split('\\n')[0] ?? '').trim();\n return (/^(.*?[.!?])(\\s|$)/.exec(line)?.[1] ?? line).slice(0, 120);\n}\n\n/** The fields of a module's result a reference can read, from the docs' returns. */\nexport function resultFields(returns: Record<string, CatalogReturn> | undefined): ResultField[] {\n const rank = (name: string) => {\n const i = FIRST_FIELDS.indexOf(name);\n return i < 0 ? FIRST_FIELDS.length : i;\n };\n return Object.entries(returns ?? {})\n .filter(([name]) => /^[A-Za-z_][A-Za-z0-9_]*$/.test(name))\n .sort(([a], [b]) => rank(a) - rank(b))\n .map(([name, r]) => ({ name, detail: firstSentence(String(r?.description ?? '')) }));\n}\n\n/** The fields of a step's result, by the step (the webview has the module docs). */\nexport type FieldsOf = (step: FlowNode) => ResultField[] | undefined;\n\nfunction freeName(base: string, taken: Set<string>): string {\n if (!taken.has(base)) return base;\n let i = 2;\n while (taken.has(`${base}_${i}`)) i++;\n return `${base}_${i}`;\n}\n\n/**\n * What `@` offers (D-26): node inputs, then flow inputs and upstream outputs as new inputs. With\n * `fieldsOf`, a choice that is a module step's whole result carries the fields of it (AFD-108).\n */\nexport function refChoices(model: FlowModel, node: FlowNode, fieldsOf?: FieldsOf): RefChoice[] {\n const inputs = node.inputs ?? {};\n const taken = new Set(Object.keys(inputs));\n const sources = new Set(Object.values(inputs).map((f) => f?.from));\n const level = model.nodes.get(node.id)?.level;\n const fieldsFrom = (step: FlowNode): { fields?: ResultField[] } => {\n const fields = step.impl?.kind === 'module' ? fieldsOf?.(step) : undefined;\n return fields && fields.length > 0 ? { fields } : {};\n };\n // A node input that reads an upstream step's whole result (`<key>.<output>`, the register).\n const resultOf = (from: string | undefined): { fields?: ResultField[] } => {\n if (!from || !level || !fieldsOf) return {};\n const src = resolveFrom(model, node, level, 'inputs', from);\n if (src.kind !== 'output' || !src.name || src.path.length > 0) return {};\n return src.node.outputs?.[src.name]?.from === 'impl.register' ? fieldsFrom(src.node) : {};\n };\n const out: RefChoice[] = Object.entries(inputs).map(([name, f]) => ({\n name,\n label: name,\n detail: f?.from ? `input from ${f.from}` : 'node input',\n ...resultOf(f?.from),\n }));\n for (const [name, f] of Object.entries(model.doc.flow?.inputs ?? {})) {\n const from = `flow.${name}`;\n if (sources.has(from) || f?.type === 'host_list') continue;\n const as = freeName(name, taken);\n taken.add(as);\n out.push({\n name: as,\n label: from,\n detail: 'flow input \u00B7 adds a node input',\n field: { type: f?.type ?? 'any', from },\n });\n }\n const offer = (\n name: string,\n from: string,\n detail: string,\n type: ContractField['type'],\n extra: { fields?: ResultField[] } = {},\n ) => {\n if (sources.has(from)) return;\n sources.add(from);\n const as = freeName(name, taken);\n taken.add(as);\n out.push({ name: as, label: from, detail, field: { type, from }, ...extra });\n };\n // Inside a subflow, `<subflow>.<input>` reads the subflow's input (AFD-21).\n const at = model.nodes.get(node.id)?.level;\n for (const sub of at ? enclosing(model, at) : [])\n for (const [name, f] of Object.entries(sub.inputs ?? {}))\n offer(\n name,\n `${sub.key}.${name}`,\n `input of subflow \"${sub.title}\" \u00B7 adds a node input`,\n f?.type ?? 'any',\n );\n const upstream = upstreamNodes(model, node.id);\n for (const up of upstream)\n for (const [name, f] of Object.entries(up.outputs ?? {}))\n offer(\n name,\n `${up.key}.${name}`,\n `output of \"${up.title}\" \u00B7 adds a node input`,\n f?.type ?? 'any',\n f?.from === 'impl.register' ? fieldsFrom(up) : {},\n );\n // Outputs of steps inside earlier subflows: choosing one lifts it to the subflow (AFD-21).\n const inside = (sub: FlowNode, path: string): void => {\n for (const step of sub.subflow?.nodes ?? []) {\n if (!step?.key) continue;\n const at = `${path}/${step.key}`;\n for (const [name, f] of Object.entries(step.outputs ?? {})) {\n // Already lifted: the subflow's own output is offered above.\n const lifted = Object.keys(sub.outputs ?? {}).some((o) => {\n const l = liftOf(sub, o);\n return !!l && 'inner' in l && l.inner.id === step.id && l.output === name;\n });\n if (lifted) continue;\n offer(\n name,\n `${at}.${name}`,\n `output of \"${step.title}\" inside \"${sub.title}\" \u00B7 lifts it to ${path.split('/')[0]}`,\n f?.type ?? 'any',\n );\n }\n if (step.subflow) inside(step, at);\n }\n };\n for (const up of upstream) if (up.type === 'subflow') inside(up, up.key);\n // AFD-106: an upstream module step's registered result that is no output yet.\n for (const up of upstream) {\n if (up.impl?.kind !== 'module') continue;\n if (Object.values(up.outputs ?? {}).some((f) => f?.from === 'impl.register')) continue;\n const result = registerName(up);\n const from = `${up.key}.${result}`;\n if (sources.has(from)) continue;\n sources.add(from);\n const as = freeName(result, taken);\n taken.add(as);\n out.push({\n name: as,\n label: from,\n detail: `result of \"${up.title}\" \u00B7 makes it an output there`,\n field: { type: 'dict', from },\n expose: { node: up.id, output: result },\n ...fieldsFrom(up),\n });\n }\n return out;\n}\n"],
|
|
5
|
-
"mappings": "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",
|
|
4
|
+
"sourcesContent": ["// The binding being configured in the properties view (M5, mockup 11): staged in the webview and\n// written by \"Save binding\" as one setBinding command. Pure, so the form, the checklist and the\n// generated-task preview are the same functions the tests run.\n\nimport type { FlowCommand } from '../flow/commands';\nimport { registerName } from '../flow/dataNames';\nimport { enclosing, liftOf, resolveFrom, upstreamNodes } from '../flow/dataRefs';\nimport { setFactNames } from '../flow/facts';\nimport { refsIn } from '../flow/jinja';\nimport type { FlowModel } from '../flow/model';\nimport type { ContractField, ContractType, FlowNode, ImplBinding, Ulid } from '../flow/types';\nimport { MAGIC_VARS } from '../flow/validate';\nimport { documentedOptions } from './freeKeys';\nimport type { CatalogOption, CatalogPlugin, CatalogReturn } from './types';\n\nexport type BindKind = ImplBinding['kind'];\n\nexport interface BindingDraft {\n kind: BindKind;\n ref: string;\n collection_version?: string;\n params: Record<string, unknown>;\n register: string;\n /** Contract fields the binding adds or changes (chips, returns); null removes one. */\n inputs: Record<string, ContractField | null>;\n outputs: Record<string, ContractField | null>;\n}\n\nexport function draftOf(node: FlowNode): BindingDraft {\n const impl = node.impl;\n return {\n kind: impl?.kind ?? 'module',\n ref: impl?.ref ?? '',\n collection_version: impl?.collection_version,\n params: structuredClone(impl?.params ?? {}),\n register: impl?.kind === 'module' || !impl ? registerName(node, impl) : '',\n inputs: {},\n outputs: {},\n };\n}\n\nconst empty = (v: unknown) => v === undefined || v === '' || (Array.isArray(v) && v.length === 0);\n\n/** The binding as it would be stored; null while nothing is chosen. */\nexport function draftImpl(d: BindingDraft): ImplBinding | null {\n if (!d.ref.trim()) return null;\n const params = Object.fromEntries(Object.entries(d.params).filter(([, v]) => !empty(v)));\n return {\n kind: d.kind,\n ref: d.ref.trim(),\n ...(d.kind === 'module' && d.collection_version\n ? { collection_version: d.collection_version }\n : {}),\n ...(Object.keys(params).length > 0 ? { params } : {}),\n ...(d.kind === 'module' && d.register ? { register: d.register } : {}),\n };\n}\n\nfunction merge(\n base: Record<string, ContractField> | undefined,\n patch: Record<string, ContractField | null>,\n): Record<string, ContractField> | undefined {\n const out: Record<string, ContractField> = { ...(base ?? {}) };\n for (const [k, v] of Object.entries(patch)) {\n if (v === null) delete out[k];\n else out[k] = v;\n }\n return Object.keys(out).length > 0 ? out : undefined;\n}\n\n/** The node as it will be after Save binding (preview, checklist). */\nexport function stagedNode(node: FlowNode, d: BindingDraft): FlowNode {\n const impl = draftImpl(d);\n // Save binding keeps the task keywords (AFD-26); playbook bindings take none.\n const keywords = impl && impl.kind !== 'playbook' ? node.impl?.keywords : undefined;\n return {\n ...node,\n impl: impl && keywords ? { ...impl, keywords } : impl,\n inputs: merge(node.inputs, d.inputs),\n outputs: merge(node.outputs, d.outputs),\n };\n}\n\nexport function isDirty(node: FlowNode, d: BindingDraft): boolean {\n // Against the draft the node loads as, not the node itself: loading fills in what the file leaves\n // out (the register name), so an untouched draft is never a change (AFD-43, the leave guard).\n const was = stagedNode(node, draftOf(node));\n const staged = stagedNode(node, d);\n return (\n JSON.stringify(staged.impl ?? null) !== JSON.stringify(was.impl ?? null) ||\n JSON.stringify(staged.inputs ?? null) !== JSON.stringify(was.inputs ?? null) ||\n JSON.stringify(staged.outputs ?? null) !== JSON.stringify(was.outputs ?? null)\n );\n}\n\n/** Save binding: one command; the status follows in planCommand (AFD-50). */\nexport function bindingCommand(node: FlowNode, d: BindingDraft): FlowCommand {\n const impl = draftImpl(d);\n const changed = (patch: Record<string, ContractField | null>, side: 'inputs' | 'outputs') =>\n Object.fromEntries(\n Object.entries(patch).filter(\n ([k, v]) => JSON.stringify(v) !== JSON.stringify(node[side]?.[k] ?? null),\n ),\n );\n return {\n kind: 'setBinding',\n id: node.id,\n impl,\n inputs: changed(d.inputs, 'inputs'),\n outputs: changed(d.outputs, 'outputs'),\n };\n}\n\n// ---- form ---------------------------------------------------------------------------------------\n\nexport type Control = 'bool' | 'choice' | 'list' | 'number' | 'text' | 'yaml';\n\nexport interface FormField {\n name: string;\n option: CatalogOption;\n control: Control;\n required: boolean;\n}\n\nexport function controlOf(o: CatalogOption): Control {\n if (o.type === 'bool' || o.type === 'boolean') return 'bool';\n if (o.choices && o.choices.length > 0 && o.type !== 'list') return 'choice';\n if (o.type === 'list' && (!o.elements || o.elements === 'str') && !o.suboptions) return 'list';\n if (o.type === 'int' || o.type === 'float') return 'number';\n if (o.type === 'dict' || o.type === 'list' || o.type === 'json' || o.suboptions) return 'yaml';\n return 'text';\n}\n\n/** Required and already set parameters first; the rest behind \"Show N more\" (mockup 11). */\nexport function formFields(\n options: Record<string, CatalogOption> | undefined,\n params: Record<string, unknown>,\n): { shown: FormField[]; more: FormField[] } {\n const all = Object.entries(options ?? {}).map(([name, option]) => ({\n name,\n option,\n control: controlOf(option),\n required: !!option.required && option.default === undefined,\n }));\n const set = (f: FormField) =>\n f.required || !empty(params[f.name]) || (f.option.aliases ?? []).some((a) => !empty(params[a]));\n return { shown: all.filter(set), more: all.filter((f) => !set(f)) };\n}\n\n/** Configure's groups (AFD-80): what a module needs, what has a value, what was added, the rest. */\nexport interface ParamGroups {\n required: FormField[];\n set: FormField[];\n /** Added with the parameter picker or a docs row, still without a value. */\n added: FormField[];\n /** Offered by the parameter picker. */\n rest: FormField[];\n}\n\nexport function paramGroups(\n options: Record<string, CatalogOption> | undefined,\n params: Record<string, unknown>,\n added: readonly string[] = [],\n): ParamGroups {\n const { shown, more } = formFields(options, params);\n return {\n required: shown.filter((f) => f.required),\n set: shown.filter((f) => !f.required),\n added: added.flatMap((n) => more.filter((f) => f.name === n)),\n rest: more.filter((f) => !added.includes(f.name)),\n };\n}\n\n/**\n * The parameter picker's matches (AFD-80): by name first (exact, then prefix, then inside), then\n * by alias, then by description, each kept in the docs' order. An empty query keeps them all.\n */\nexport function filterParams(fields: readonly FormField[], query: string): FormField[] {\n const q = query.trim().toLowerCase();\n if (!q) return [...fields];\n const rank = (f: FormField) => {\n const name = f.name.toLowerCase();\n if (name === q) return 0;\n if (name.startsWith(q)) return 1;\n if (name.includes(q)) return 2;\n if ((f.option.aliases ?? []).some((a) => a.toLowerCase().includes(q))) return 3;\n if (f.option.description.toLowerCase().includes(q)) return 4;\n return -1;\n };\n return fields\n .map((f, i) => ({ f, i, r: rank(f) }))\n .filter((x) => x.r >= 0)\n .sort((a, b) => a.r - b.r || a.i - b.i)\n .map((x) => x.f);\n}\n\n/** Binding problems that ask for another module, not other parameters: Change Module opens. */\nexport const CHANGE_MODULE_CODES: ReadonlySet<string> = new Set([\n 'binding-not-in-ee',\n 'binding-removed',\n 'binding-redirect',\n 'binding-deprecated',\n]);\n\nconst RETURN_TYPES: Record<string, ContractType> = {\n str: 'string',\n string: 'string',\n int: 'integer',\n integer: 'integer',\n float: 'any',\n bool: 'boolean',\n boolean: 'boolean',\n list: 'list',\n dict: 'dict',\n complex: 'dict',\n};\n\nexport function contractTypeOf(ret: Pick<CatalogReturn, 'type'>): ContractType {\n return RETURN_TYPES[ret.type] ?? 'any';\n}\n\n// ---- checklist ----------------------------------------------------------------------------------\n\nexport interface CheckItem {\n state: 'ok' | 'warn' | 'missing';\n text: string;\n}\n\n/** What the binding still needs and what to know about it (mockup 11 checklist). */\nexport function checklist(\n model: FlowModel,\n staged: FlowNode,\n doc: { plugin?: CatalogPlugin | null; roleSpec?: boolean; playbookTargets?: boolean },\n): CheckItem[] {\n const impl = staged.impl;\n if (!impl) return [{ state: 'missing', text: 'Choose a module, role or playbook' }];\n const items: CheckItem[] = [];\n const plugin = doc.plugin;\n if (impl.kind === 'module' && plugin) {\n const params = impl.params ?? {};\n const given = new Set(Object.keys(params));\n const missing = Object.entries(documentedOptions(impl.ref, plugin.options) ?? {})\n .filter(([name, o]) => o.required && o.default === undefined && !given.has(name))\n .filter(([, o]) => !(o.aliases ?? []).some((a) => given.has(a)))\n .map(([name]) => name);\n items.push(\n missing.length > 0\n ? { state: 'missing', text: `Required parameters missing: ${missing.join(', ')}` }\n : { state: 'ok', text: 'Required parameters set' },\n );\n }\n for (const name of refsIn(impl.params ?? {})) {\n if (MAGIC_VARS.test(name)) continue;\n const input = staged.inputs?.[name];\n const from = input?.from;\n if (!input) items.push({ state: 'missing', text: `${name} is not an input of this node` });\n else if (from?.startsWith('flow.'))\n items.push({ state: 'ok', text: `${name} comes from flow inputs` });\n else if (from) {\n const key = from.split('.')[0] ?? '';\n const source = [...model.nodes.values()].find((e) => e.node.key === key)?.node;\n items.push({\n state: 'ok',\n text: `${name} comes from ${source ? `\"${source.title}\"` : from}`,\n });\n } else items.push({ state: 'warn', text: `${name} is an input without a source (from:)` });\n }\n if (impl.kind === 'module' && plugin) {\n const check = plugin.attributes?.check_mode?.support;\n if (check === 'full')\n items.push({ state: 'ok', text: 'Supports check mode, safe in skeleton runs' });\n else if (check === 'partial')\n items.push({ state: 'warn', text: 'Partial check mode support: skeleton runs may differ' });\n else if (check === 'none')\n items.push({ state: 'warn', text: 'No check mode: skeleton runs skip this task' });\n if (plugin.deprecated)\n items.push({ state: 'warn', text: `Deprecated: ${plugin.deprecated.why || 'see the docs'}` });\n }\n if (impl.kind === 'role')\n items.push(\n doc.roleSpec\n ? { state: 'ok', text: 'The role checks its arguments (argument_specs)' }\n : { state: 'warn', text: 'No argument_specs: variables are free-form' },\n );\n if (impl.kind === 'playbook')\n items.push(\n doc.playbookTargets\n ? { state: 'ok', text: 'Its plays target {{ afd_hosts }}, the hosts arriving here' }\n : {\n state: 'warn',\n text: 'Its plays do not target {{ afd_hosts }}: they run on their own hosts',\n },\n );\n return items;\n}\n\n// ---- data references ----------------------------------------------------------------------------\n\nexport { upstreamNodes };\n\nexport interface RefChoice {\n /** The variable the chip reads. */\n name: string;\n label: string;\n detail: string;\n /** Set when choosing it adds a node input. */\n field?: ContractField;\n /**\n * AFD-106 (round 3: R7): choosing it also makes this upstream step's registered result an output\n * there. The participant typed the register name, since nothing in the list offered the result.\n */\n expose?: {\n node: Ulid;\n output: string;\n /** AFD-287: the output it becomes (a fact: no `from:`); else the whole registered result. */\n field?: ContractField;\n };\n /**\n * AFD-108 (wave 10: Z1): set when the choice is a module step's whole result: the fields its\n * docs list, which the list offers next (`read_version_result.stdout`).\n */\n fields?: ResultField[];\n}\n\n/** A documented field of a module's result (its RETURN section). */\nexport interface ResultField {\n name: string;\n /** The first sentence of the docs' description. */\n detail: string;\n}\n\n// The fields people read most come first; the rest keep the order of the docs.\nconst FIRST_FIELDS = ['stdout', 'stdout_lines', 'rc', 'stderr', 'json', 'status', 'content', 'msg'];\n\nfunction firstSentence(text: string): string {\n const line = (text.split('\\n')[0] ?? '').trim();\n return (/^(.*?[.!?])(\\s|$)/.exec(line)?.[1] ?? line).slice(0, 120);\n}\n\n/** The fields of a module's result a reference can read, from the docs' returns. */\nexport function resultFields(returns: Record<string, CatalogReturn> | undefined): ResultField[] {\n const rank = (name: string) => {\n const i = FIRST_FIELDS.indexOf(name);\n return i < 0 ? FIRST_FIELDS.length : i;\n };\n return Object.entries(returns ?? {})\n .filter(([name]) => /^[A-Za-z_][A-Za-z0-9_]*$/.test(name))\n .sort(([a], [b]) => rank(a) - rank(b))\n .map(([name, r]) => ({ name, detail: firstSentence(String(r?.description ?? '')) }));\n}\n\n/** The fields of a step's result, by the step (the webview has the module docs). */\nexport type FieldsOf = (step: FlowNode) => ResultField[] | undefined;\n\nfunction freeName(base: string, taken: Set<string>): string {\n if (!taken.has(base)) return base;\n let i = 2;\n while (taken.has(`${base}_${i}`)) i++;\n return `${base}_${i}`;\n}\n\n/**\n * What `@` offers (D-26): node inputs, then flow inputs and upstream outputs as new inputs. With\n * `fieldsOf`, a choice that is a module step's whole result carries the fields of it (AFD-108).\n */\nexport function refChoices(model: FlowModel, node: FlowNode, fieldsOf?: FieldsOf): RefChoice[] {\n const inputs = node.inputs ?? {};\n const taken = new Set(Object.keys(inputs));\n const sources = new Set(Object.values(inputs).map((f) => f?.from));\n const level = model.nodes.get(node.id)?.level;\n const fieldsFrom = (step: FlowNode): { fields?: ResultField[] } => {\n const fields = step.impl?.kind === 'module' ? fieldsOf?.(step) : undefined;\n return fields && fields.length > 0 ? { fields } : {};\n };\n // A node input that reads an upstream step's whole result (`<key>.<output>`, the register).\n const resultOf = (from: string | undefined): { fields?: ResultField[] } => {\n if (!from || !level || !fieldsOf) return {};\n const src = resolveFrom(model, node, level, 'inputs', from);\n if (src.kind !== 'output' || !src.name || src.path.length > 0) return {};\n return src.node.outputs?.[src.name]?.from === 'impl.register' ? fieldsFrom(src.node) : {};\n };\n const out: RefChoice[] = Object.entries(inputs).map(([name, f]) => ({\n name,\n label: name,\n detail: f?.from ? `input from ${f.from}` : 'node input',\n ...resultOf(f?.from),\n }));\n for (const [name, f] of Object.entries(model.doc.flow?.inputs ?? {})) {\n const from = `flow.${name}`;\n if (sources.has(from) || f?.type === 'host_list') continue;\n const as = freeName(name, taken);\n taken.add(as);\n out.push({\n name: as,\n label: from,\n detail: 'flow input \u00B7 adds a node input',\n field: { type: f?.type ?? 'any', from },\n });\n }\n const offer = (\n name: string,\n from: string,\n detail: string,\n type: ContractField['type'],\n extra: { fields?: ResultField[] } = {},\n ) => {\n if (sources.has(from)) return;\n sources.add(from);\n const as = freeName(name, taken);\n taken.add(as);\n out.push({ name: as, label: from, detail, field: { type, from }, ...extra });\n };\n // Inside a subflow, `<subflow>.<input>` reads the subflow's input (AFD-21).\n const at = model.nodes.get(node.id)?.level;\n for (const sub of at ? enclosing(model, at) : [])\n for (const [name, f] of Object.entries(sub.inputs ?? {}))\n offer(\n name,\n `${sub.key}.${name}`,\n `input of subflow \"${sub.title}\" \u00B7 adds a node input`,\n f?.type ?? 'any',\n );\n const upstream = upstreamNodes(model, node.id);\n for (const up of upstream)\n for (const [name, f] of Object.entries(up.outputs ?? {}))\n offer(\n name,\n `${up.key}.${name}`,\n `output of \"${up.title}\" \u00B7 adds a node input`,\n f?.type ?? 'any',\n f?.from === 'impl.register' ? fieldsFrom(up) : {},\n );\n // Outputs of steps inside earlier subflows: choosing one lifts it to the subflow (AFD-21).\n const inside = (sub: FlowNode, path: string): void => {\n for (const step of sub.subflow?.nodes ?? []) {\n if (!step?.key) continue;\n const at = `${path}/${step.key}`;\n for (const [name, f] of Object.entries(step.outputs ?? {})) {\n // Already lifted: the subflow's own output is offered above.\n const lifted = Object.keys(sub.outputs ?? {}).some((o) => {\n const l = liftOf(sub, o);\n return !!l && 'inner' in l && l.inner.id === step.id && l.output === name;\n });\n if (lifted) continue;\n offer(\n name,\n `${at}.${name}`,\n `output of \"${step.title}\" inside \"${sub.title}\" \u00B7 lifts it to ${path.split('/')[0]}`,\n f?.type ?? 'any',\n );\n }\n if (step.subflow) inside(step, at);\n }\n };\n for (const up of upstream) if (up.type === 'subflow') inside(up, up.key);\n // AFD-287: a fact an upstream set_fact step sets that is no output there yet.\n for (const up of upstream)\n for (const fact of setFactNames(up.impl)) {\n if (up.outputs?.[fact]) continue;\n const from = `${up.key}.${fact}`;\n if (sources.has(from)) continue;\n sources.add(from);\n const as = freeName(fact, taken);\n taken.add(as);\n out.push({\n name: as,\n label: from,\n detail: `fact set by \"${up.title}\" \u00B7 makes it an output there`,\n field: { type: 'any', from },\n expose: { node: up.id, output: fact, field: { type: 'any' } },\n });\n }\n // AFD-106: an upstream module step's registered result that is no output yet.\n for (const up of upstream) {\n if (up.impl?.kind !== 'module') continue;\n if (Object.values(up.outputs ?? {}).some((f) => f?.from === 'impl.register')) continue;\n const result = registerName(up);\n const from = `${up.key}.${result}`;\n if (sources.has(from)) continue;\n sources.add(from);\n const as = freeName(result, taken);\n taken.add(as);\n out.push({\n name: as,\n label: from,\n detail: `result of \"${up.title}\" \u00B7 makes it an output there`,\n field: { type: 'dict', from },\n expose: { node: up.id, output: result },\n ...fieldsFrom(up),\n });\n }\n return out;\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": ["at"]
|
|
7
7
|
}
|
|
@@ -4,12 +4,16 @@ import {
|
|
|
4
4
|
title,
|
|
5
5
|
visibleAt
|
|
6
6
|
} from "./chunk-LQZOPIIG.js";
|
|
7
|
+
import {
|
|
8
|
+
factSetter
|
|
9
|
+
} from "./chunk-FIKPXL6E.js";
|
|
7
10
|
import {
|
|
8
11
|
liftOf,
|
|
9
12
|
resolveFrom
|
|
10
13
|
} from "./chunk-BUPWGYNF.js";
|
|
11
14
|
import {
|
|
12
15
|
exprRefs,
|
|
16
|
+
refsIn,
|
|
13
17
|
templated
|
|
14
18
|
} from "./chunk-VHCA4A7K.js";
|
|
15
19
|
import {
|
|
@@ -93,6 +97,44 @@ ${text}`;
|
|
|
93
97
|
);
|
|
94
98
|
}
|
|
95
99
|
}
|
|
100
|
+
for (const { node, level } of model.nodes.values()) {
|
|
101
|
+
if (!isWork(node) || !node.impl) continue;
|
|
102
|
+
const declared = new Set(Object.keys(node.inputs ?? {}));
|
|
103
|
+
const names = refsIn([node.impl.params ?? {}, node.impl.keywords ?? {}]);
|
|
104
|
+
for (const name of names) {
|
|
105
|
+
if (declared.has(name)) continue;
|
|
106
|
+
const setter = factSetter(model, node, name);
|
|
107
|
+
if (!setter) continue;
|
|
108
|
+
const at = model.nodes.get(setter.id)?.level;
|
|
109
|
+
const to = at ? visibleAt(model, node.id, at) : void 0;
|
|
110
|
+
if (to && at === level) {
|
|
111
|
+
const id = `data:${setter.id}>${node.id}:${name}`;
|
|
112
|
+
wires.set(id, {
|
|
113
|
+
id,
|
|
114
|
+
from: setter.id,
|
|
115
|
+
to,
|
|
116
|
+
label: `${name} (not declared)`,
|
|
117
|
+
title: `${node.title} reads ${name}, which ${setter.title} sets, with no input for it`,
|
|
118
|
+
undeclared: true
|
|
119
|
+
});
|
|
120
|
+
}
|
|
121
|
+
findings.push({
|
|
122
|
+
id: `data:undeclared:${node.id}.${name}`,
|
|
123
|
+
lens: "data",
|
|
124
|
+
severity: "warning",
|
|
125
|
+
title: `${node.title} reads ${name} from ${setter.title} without declaring it`,
|
|
126
|
+
detail: `${setter.title} sets ${name} with set_fact; ${node.title} reads it with no input. It works while both run in one play, but the flow does not show it, and a run in parts (AWX, approvals) loses it. Make it an output of ${setter.title} and an input here.`,
|
|
127
|
+
node: node.id,
|
|
128
|
+
nodes: [setter.id, node.id],
|
|
129
|
+
fixes: [
|
|
130
|
+
{
|
|
131
|
+
label: `Use ${name} as an Input`,
|
|
132
|
+
command: { kind: "useFact", reader: node.id, setter: setter.id, name }
|
|
133
|
+
}
|
|
134
|
+
]
|
|
135
|
+
});
|
|
136
|
+
}
|
|
137
|
+
}
|
|
96
138
|
for (const { node } of model.nodes.values())
|
|
97
139
|
for (const out of node.type === "subflow" ? Object.keys(node.outputs ?? {}) : []) {
|
|
98
140
|
const lift = liftOf(node, out);
|
|
@@ -188,4 +230,4 @@ function timingReads(node) {
|
|
|
188
230
|
export {
|
|
189
231
|
dataLens
|
|
190
232
|
};
|
|
191
|
-
//# sourceMappingURL=chunk-
|
|
233
|
+
//# sourceMappingURL=chunk-2DT5DOSO.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../../src/core/lens/data.ts"],
|
|
4
|
+
"sourcesContent": ["// Data lens (04 \u00A77, decision 14): what each node reads and writes, and the data wires derived from\n// `from:` references. A reference into another level is drawn from the producer to the subflow\n// that contains the consumer, on the producer's level.\nimport { liftOf, resolveFrom } from '../flow/dataRefs';\nimport { factSetter } from '../flow/facts';\nimport { exprRefs, refsIn, templated } from '../flow/jinja';\nimport { modelOf, ROOT } from '../flow/model';\nimport type { FlowDocument, FlowNode, Ulid } from '../flow/types';\nimport { isWork, listChip, title, visibleAt } from './common';\nimport type { DataWire, LensChip, LensFinding, LensItem, LensView } from './types';\n\nexport function dataLens(doc: FlowDocument): LensView {\n const model = modelOf(doc);\n const flowInputs = doc.flow.inputs ?? {};\n const start = model.levels.get(ROOT)?.nodes.find((n) => n?.type === 'start')?.id;\n const chips: Record<Ulid, LensChip[]> = {};\n const wires = new Map<string, DataWire>();\n const findings: LensFinding[] = [];\n /** `key.output` \u2192 consumers. */\n const readers = new Map<string, Set<Ulid>>();\n const inputUse = new Map<string, Set<Ulid>>();\n\n const wire = (from: Ulid, to: Ulid, label: string, text: string) => {\n if (from === to) return;\n const id = `data:${from}>${to}`;\n const w = wires.get(id);\n if (!w) wires.set(id, { id, from, to, label, title: text });\n else if (!w.label.split(', ').includes(label)) {\n w.label = `${w.label}, ${label}`;\n w.title = `${w.title}\\n${text}`;\n }\n };\n\n for (const { node, level } of model.nodes.values()) {\n if (!isWork(node)) continue;\n const ins = Object.keys(node.inputs ?? {});\n const outs = Object.keys(node.outputs ?? {});\n chips[node.id] = [listChip('in: ', ins), listChip('out: ', outs)].filter(\n (c): c is LensChip => !!c,\n );\n // AFD-112: an input a Timing setting reads at run time says so on its wire.\n const timing = timingReads(node);\n for (const [name, field] of Object.entries(node.inputs ?? {})) {\n const from = field?.from;\n const readBy = timing.get(name)?.join(', ');\n const by = readBy ? ` \u00B7 ${readBy}` : '';\n if (!from) {\n // AFD-106 (round 3: R7): required or not, nothing feeds it (the validator's input-unfed).\n if (field?.default === undefined && field?.type !== 'host_list')\n findings.push({\n id: `data:unfed:${node.id}.${name}`,\n lens: 'data',\n severity: 'warning',\n title: `${node.title} has no value for ${name}`,\n detail: `The input ${name} has no default and no \\`from:\\`. Wire it to a flow input or an upstream output.`,\n node: node.id,\n nodes: [node.id],\n fixes: [{ label: 'Open Details', properties: node.id }],\n });\n continue;\n }\n const src = resolveFrom(model, node, level, 'inputs', from);\n // Inside a subflow, <subflow>.<input> reads its input: drawn where the subflow gets it.\n if (src.kind === 'impl' || src.kind === 'subflowInput') continue;\n if (src.kind === 'unresolved') {\n findings.push(unresolved(node.id, node.title, name, from, src.why));\n continue;\n }\n if (src.kind === 'flow') {\n const out = src.name;\n inputUse.set(out, (inputUse.get(out) ?? new Set()).add(node.id));\n const to = start ? visibleAt(model, node.id, ROOT) : undefined;\n if (start && to) wire(start, to, out, `flow.${out} \u2192 ${node.title}.${name}${by}`);\n continue;\n }\n const producer = src.node.id;\n const p = model.nodes.get(producer);\n if (!p) continue;\n const out = src.name;\n // By producer ID: keys repeat across levels.\n const key = `${producer}.${out}`;\n readers.set(key, (readers.get(key) ?? new Set()).add(node.id));\n const to = visibleAt(model, node.id, p.level);\n if (to)\n wire(\n producer,\n to,\n out === name ? out : `${out} \u2192 ${name}`,\n `${from} \u2192 ${node.title}.${name}${by}`,\n );\n }\n }\n\n // AFD-287: a step that reads a fact an earlier step sets, with no input for it: it works on one\n // play, but the design does not show it, and runs in parts (AWX, approvals) lose it.\n for (const { node, level } of model.nodes.values()) {\n if (!isWork(node) || !node.impl) continue;\n const declared = new Set(Object.keys(node.inputs ?? {}));\n const names = refsIn([node.impl.params ?? {}, node.impl.keywords ?? {}]);\n for (const name of names) {\n if (declared.has(name)) continue;\n const setter = factSetter(model, node, name);\n if (!setter) continue;\n const at = model.nodes.get(setter.id)?.level;\n const to = at ? visibleAt(model, node.id, at) : undefined;\n if (to && at === level) {\n const id = `data:${setter.id}>${node.id}:${name}`;\n wires.set(id, {\n id,\n from: setter.id,\n to,\n label: `${name} (not declared)`,\n title: `${node.title} reads ${name}, which ${setter.title} sets, with no input for it`,\n undeclared: true,\n });\n }\n findings.push({\n id: `data:undeclared:${node.id}.${name}`,\n lens: 'data',\n severity: 'warning',\n title: `${node.title} reads ${name} from ${setter.title} without declaring it`,\n detail: `${setter.title} sets ${name} with set_fact; ${node.title} reads it with no input. It works while both run in one play, but the flow does not show it, and a run in parts (AWX, approvals) loses it. Make it an output of ${setter.title} and an input here.`,\n node: node.id,\n nodes: [setter.id, node.id],\n fixes: [\n {\n label: `Use ${name} as an Input`,\n command: { kind: 'useFact', reader: node.id, setter: setter.id, name },\n },\n ],\n });\n }\n }\n\n // A subflow output reads the inner output it lifts (AFD-7, AFD-21).\n for (const { node } of model.nodes.values())\n for (const out of node.type === 'subflow' ? Object.keys(node.outputs ?? {}) : []) {\n const lift = liftOf(node, out);\n if (!lift || !('inner' in lift)) continue;\n const key = `${lift.inner.id}.${lift.output}`;\n readers.set(key, (readers.get(key) ?? new Set()).add(node.id));\n }\n\n const variables: LensItem[] = [];\n for (const { node } of model.nodes.values()) {\n for (const out of Object.keys(node.outputs ?? {})) {\n const users = [...(readers.get(`${node.id}.${out}`) ?? [])];\n variables.push({\n key: `var:${node.id}.${out}`,\n label: `${node.key}.${out}`,\n detail: users.length\n ? `read by ${users.map((u) => title(model, u)).join(', ')}`\n : 'not read',\n nodes: [node.id, ...users],\n tone: users.length ? undefined : 'muted',\n });\n if (users.length === 0)\n findings.push({\n id: `data:unused-output:${node.id}.${out}`,\n lens: 'data',\n severity: 'info',\n title: `${node.title} writes ${out}, which nothing reads`,\n detail: `No node input refers to ${node.key}.${out}. Remove the output, or wire it where it is needed.`,\n node: node.id,\n nodes: [node.id],\n fixes: [{ label: 'Open Details', properties: node.id }],\n });\n }\n }\n const inputs: LensItem[] = Object.keys(flowInputs).map((name) => {\n const users = [...(inputUse.get(name) ?? [])];\n return {\n key: `input:${name}`,\n label: `flow.${name}`,\n detail: users.length\n ? `read by ${users.map((u) => title(model, u)).join(', ')}`\n : 'not read by a node input',\n nodes: users,\n tone: users.length ? undefined : 'muted',\n };\n });\n const dataWires = [...wires.values()];\n return {\n lens: 'data',\n chips,\n dataWires,\n stats: [\n { label: 'data wires', value: String(dataWires.length) },\n {\n label: 'unresolved',\n value: String(findings.filter((f) => f.severity === 'warning').length),\n },\n {\n label: 'unused outputs',\n value: String(findings.filter((f) => f.id.startsWith('data:unused')).length),\n },\n ],\n sections: [\n { title: 'Flow inputs', items: inputs, empty: 'The flow has no inputs.' },\n { title: 'Node outputs', items: variables, empty: 'No node declares outputs.' },\n ],\n findings,\n notes: dataWires.length === 0 ? ['No data wires: no node input has a from: reference.'] : [],\n };\n}\n\nfunction unresolved(\n node: Ulid,\n nodeTitle: string,\n name: string,\n from: string,\n why: string,\n): LensFinding {\n return {\n id: `data:unresolved:${node}.${name}`,\n lens: 'data',\n severity: 'warning',\n title: `${nodeTitle}: ${name} reads ${from}, which does not exist`,\n detail: `\"${from}\" ${why}.`,\n node,\n nodes: [node],\n fixes: [{ label: 'Open Details', properties: node }],\n };\n}\n\nconst TIMING_WORDS: Record<string, string> = {\n retries: 'Retries',\n delay: 'Delay',\n timeout: 'Timeout',\n};\n\n/** AFD-112: each input the step's Timing reads at run time, with the fields that read it. */\nfunction timingReads(node: FlowNode): Map<string, string[]> {\n const out = new Map<string, string[]>();\n for (const [key, word] of Object.entries(TIMING_WORDS)) {\n const v = node.settings?.[key as keyof NonNullable<FlowNode['settings']>];\n if (!templated(v)) continue;\n for (const name of exprRefs(v)) out.set(name, [...(out.get(name) ?? []), word]);\n }\n return out;\n}\n"],
|
|
5
|
+
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;AAWO,SAAS,SAAS,KAA6B;AACpD,QAAM,QAAQ,QAAQ,GAAG;AACzB,QAAM,aAAa,IAAI,KAAK,UAAU,CAAC;AACvC,QAAM,QAAQ,MAAM,OAAO,IAAI,IAAI,GAAG,MAAM,KAAK,CAAC,MAAM,GAAG,SAAS,OAAO,GAAG;AAC9E,QAAM,QAAkC,CAAC;AACzC,QAAM,QAAQ,oBAAI,IAAsB;AACxC,QAAM,WAA0B,CAAC;AAEjC,QAAM,UAAU,oBAAI,IAAuB;AAC3C,QAAM,WAAW,oBAAI,IAAuB;AAE5C,QAAM,OAAO,CAAC,MAAY,IAAU,OAAe,SAAiB;AAClE,QAAI,SAAS,GAAI;AACjB,UAAM,KAAK,QAAQ,IAAI,IAAI,EAAE;AAC7B,UAAM,IAAI,MAAM,IAAI,EAAE;AACtB,QAAI,CAAC,EAAG,OAAM,IAAI,IAAI,EAAE,IAAI,MAAM,IAAI,OAAO,OAAO,KAAK,CAAC;AAAA,aACjD,CAAC,EAAE,MAAM,MAAM,IAAI,EAAE,SAAS,KAAK,GAAG;AAC7C,QAAE,QAAQ,GAAG,EAAE,KAAK,KAAK,KAAK;AAC9B,QAAE,QAAQ,GAAG,EAAE,KAAK;AAAA,EAAK,IAAI;AAAA,IAC/B;AAAA,EACF;AAEA,aAAW,EAAE,MAAM,MAAM,KAAK,MAAM,MAAM,OAAO,GAAG;AAClD,QAAI,CAAC,OAAO,IAAI,EAAG;AACnB,UAAM,MAAM,OAAO,KAAK,KAAK,UAAU,CAAC,CAAC;AACzC,UAAM,OAAO,OAAO,KAAK,KAAK,WAAW,CAAC,CAAC;AAC3C,UAAM,KAAK,EAAE,IAAI,CAAC,SAAS,QAAQ,GAAG,GAAG,SAAS,SAAS,IAAI,CAAC,EAAE;AAAA,MAChE,CAAC,MAAqB,CAAC,CAAC;AAAA,IAC1B;AAEA,UAAM,SAAS,YAAY,IAAI;AAC/B,eAAW,CAAC,MAAM,KAAK,KAAK,OAAO,QAAQ,KAAK,UAAU,CAAC,CAAC,GAAG;AAC7D,YAAM,OAAO,OAAO;AACpB,YAAM,SAAS,OAAO,IAAI,IAAI,GAAG,KAAK,IAAI;AAC1C,YAAM,KAAK,SAAS,SAAM,MAAM,KAAK;AACrC,UAAI,CAAC,MAAM;AAET,YAAI,OAAO,YAAY,UAAa,OAAO,SAAS;AAClD,mBAAS,KAAK;AAAA,YACZ,IAAI,cAAc,KAAK,EAAE,IAAI,IAAI;AAAA,YACjC,MAAM;AAAA,YACN,UAAU;AAAA,YACV,OAAO,GAAG,KAAK,KAAK,qBAAqB,IAAI;AAAA,YAC7C,QAAQ,aAAa,IAAI;AAAA,YACzB,MAAM,KAAK;AAAA,YACX,OAAO,CAAC,KAAK,EAAE;AAAA,YACf,OAAO,CAAC,EAAE,OAAO,gBAAgB,YAAY,KAAK,GAAG,CAAC;AAAA,UACxD,CAAC;AACH;AAAA,MACF;AACA,YAAM,MAAM,YAAY,OAAO,MAAM,OAAO,UAAU,IAAI;AAE1D,UAAI,IAAI,SAAS,UAAU,IAAI,SAAS,eAAgB;AACxD,UAAI,IAAI,SAAS,cAAc;AAC7B,iBAAS,KAAK,WAAW,KAAK,IAAI,KAAK,OAAO,MAAM,MAAM,IAAI,GAAG,CAAC;AAClE;AAAA,MACF;AACA,UAAI,IAAI,SAAS,QAAQ;AACvB,cAAMA,OAAM,IAAI;AAChB,iBAAS,IAAIA,OAAM,SAAS,IAAIA,IAAG,KAAK,oBAAI,IAAI,GAAG,IAAI,KAAK,EAAE,CAAC;AAC/D,cAAMC,MAAK,QAAQ,UAAU,OAAO,KAAK,IAAI,IAAI,IAAI;AACrD,YAAI,SAASA,IAAI,MAAK,OAAOA,KAAID,MAAK,QAAQA,IAAG,WAAM,KAAK,KAAK,IAAI,IAAI,GAAG,EAAE,EAAE;AAChF;AAAA,MACF;AACA,YAAM,WAAW,IAAI,KAAK;AAC1B,YAAM,IAAI,MAAM,MAAM,IAAI,QAAQ;AAClC,UAAI,CAAC,EAAG;AACR,YAAM,MAAM,IAAI;AAEhB,YAAM,MAAM,GAAG,QAAQ,IAAI,GAAG;AAC9B,cAAQ,IAAI,MAAM,QAAQ,IAAI,GAAG,KAAK,oBAAI,IAAI,GAAG,IAAI,KAAK,EAAE,CAAC;AAC7D,YAAM,KAAK,UAAU,OAAO,KAAK,IAAI,EAAE,KAAK;AAC5C,UAAI;AACF;AAAA,UACE;AAAA,UACA;AAAA,UACA,QAAQ,OAAO,MAAM,GAAG,GAAG,WAAM,IAAI;AAAA,UACrC,GAAG,IAAI,WAAM,KAAK,KAAK,IAAI,IAAI,GAAG,EAAE;AAAA,QACtC;AAAA,IACJ;AAAA,EACF;AAIA,aAAW,EAAE,MAAM,MAAM,KAAK,MAAM,MAAM,OAAO,GAAG;AAClD,QAAI,CAAC,OAAO,IAAI,KAAK,CAAC,KAAK,KAAM;AACjC,UAAM,WAAW,IAAI,IAAI,OAAO,KAAK,KAAK,UAAU,CAAC,CAAC,CAAC;AACvD,UAAM,QAAQ,OAAO,CAAC,KAAK,KAAK,UAAU,CAAC,GAAG,KAAK,KAAK,YAAY,CAAC,CAAC,CAAC;AACvE,eAAW,QAAQ,OAAO;AACxB,UAAI,SAAS,IAAI,IAAI,EAAG;AACxB,YAAM,SAAS,WAAW,OAAO,MAAM,IAAI;AAC3C,UAAI,CAAC,OAAQ;AACb,YAAM,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,GAAG;AACvC,YAAM,KAAK,KAAK,UAAU,OAAO,KAAK,IAAI,EAAE,IAAI;AAChD,UAAI,MAAM,OAAO,OAAO;AACtB,cAAM,KAAK,QAAQ,OAAO,EAAE,IAAI,KAAK,EAAE,IAAI,IAAI;AAC/C,cAAM,IAAI,IAAI;AAAA,UACZ;AAAA,UACA,MAAM,OAAO;AAAA,UACb;AAAA,UACA,OAAO,GAAG,IAAI;AAAA,UACd,OAAO,GAAG,KAAK,KAAK,UAAU,IAAI,WAAW,OAAO,KAAK;AAAA,UACzD,YAAY;AAAA,QACd,CAAC;AAAA,MACH;AACA,eAAS,KAAK;AAAA,QACZ,IAAI,mBAAmB,KAAK,EAAE,IAAI,IAAI;AAAA,QACtC,MAAM;AAAA,QACN,UAAU;AAAA,QACV,OAAO,GAAG,KAAK,KAAK,UAAU,IAAI,SAAS,OAAO,KAAK;AAAA,QACvD,QAAQ,GAAG,OAAO,KAAK,SAAS,IAAI,mBAAmB,KAAK,KAAK,mKAAmK,OAAO,KAAK;AAAA,QAChP,MAAM,KAAK;AAAA,QACX,OAAO,CAAC,OAAO,IAAI,KAAK,EAAE;AAAA,QAC1B,OAAO;AAAA,UACL;AAAA,YACE,OAAO,OAAO,IAAI;AAAA,YAClB,SAAS,EAAE,MAAM,WAAW,QAAQ,KAAK,IAAI,QAAQ,OAAO,IAAI,KAAK;AAAA,UACvE;AAAA,QACF;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF;AAGA,aAAW,EAAE,KAAK,KAAK,MAAM,MAAM,OAAO;AACxC,eAAW,OAAO,KAAK,SAAS,YAAY,OAAO,KAAK,KAAK,WAAW,CAAC,CAAC,IAAI,CAAC,GAAG;AAChF,YAAM,OAAO,OAAO,MAAM,GAAG;AAC7B,UAAI,CAAC,QAAQ,EAAE,WAAW,MAAO;AACjC,YAAM,MAAM,GAAG,KAAK,MAAM,EAAE,IAAI,KAAK,MAAM;AAC3C,cAAQ,IAAI,MAAM,QAAQ,IAAI,GAAG,KAAK,oBAAI,IAAI,GAAG,IAAI,KAAK,EAAE,CAAC;AAAA,IAC/D;AAEF,QAAM,YAAwB,CAAC;AAC/B,aAAW,EAAE,KAAK,KAAK,MAAM,MAAM,OAAO,GAAG;AAC3C,eAAW,OAAO,OAAO,KAAK,KAAK,WAAW,CAAC,CAAC,GAAG;AACjD,YAAM,QAAQ,CAAC,GAAI,QAAQ,IAAI,GAAG,KAAK,EAAE,IAAI,GAAG,EAAE,KAAK,CAAC,CAAE;AAC1D,gBAAU,KAAK;AAAA,QACb,KAAK,OAAO,KAAK,EAAE,IAAI,GAAG;AAAA,QAC1B,OAAO,GAAG,KAAK,GAAG,IAAI,GAAG;AAAA,QACzB,QAAQ,MAAM,SACV,WAAW,MAAM,IAAI,CAAC,MAAM,MAAM,OAAO,CAAC,CAAC,EAAE,KAAK,IAAI,CAAC,KACvD;AAAA,QACJ,OAAO,CAAC,KAAK,IAAI,GAAG,KAAK;AAAA,QACzB,MAAM,MAAM,SAAS,SAAY;AAAA,MACnC,CAAC;AACD,UAAI,MAAM,WAAW;AACnB,iBAAS,KAAK;AAAA,UACZ,IAAI,sBAAsB,KAAK,EAAE,IAAI,GAAG;AAAA,UACxC,MAAM;AAAA,UACN,UAAU;AAAA,UACV,OAAO,GAAG,KAAK,KAAK,WAAW,GAAG;AAAA,UAClC,QAAQ,2BAA2B,KAAK,GAAG,IAAI,GAAG;AAAA,UAClD,MAAM,KAAK;AAAA,UACX,OAAO,CAAC,KAAK,EAAE;AAAA,UACf,OAAO,CAAC,EAAE,OAAO,gBAAgB,YAAY,KAAK,GAAG,CAAC;AAAA,QACxD,CAAC;AAAA,IACL;AAAA,EACF;AACA,QAAM,SAAqB,OAAO,KAAK,UAAU,EAAE,IAAI,CAAC,SAAS;AAC/D,UAAM,QAAQ,CAAC,GAAI,SAAS,IAAI,IAAI,KAAK,CAAC,CAAE;AAC5C,WAAO;AAAA,MACL,KAAK,SAAS,IAAI;AAAA,MAClB,OAAO,QAAQ,IAAI;AAAA,MACnB,QAAQ,MAAM,SACV,WAAW,MAAM,IAAI,CAAC,MAAM,MAAM,OAAO,CAAC,CAAC,EAAE,KAAK,IAAI,CAAC,KACvD;AAAA,MACJ,OAAO;AAAA,MACP,MAAM,MAAM,SAAS,SAAY;AAAA,IACnC;AAAA,EACF,CAAC;AACD,QAAM,YAAY,CAAC,GAAG,MAAM,OAAO,CAAC;AACpC,SAAO;AAAA,IACL,MAAM;AAAA,IACN;AAAA,IACA;AAAA,IACA,OAAO;AAAA,MACL,EAAE,OAAO,cAAc,OAAO,OAAO,UAAU,MAAM,EAAE;AAAA,MACvD;AAAA,QACE,OAAO;AAAA,QACP,OAAO,OAAO,SAAS,OAAO,CAAC,MAAM,EAAE,aAAa,SAAS,EAAE,MAAM;AAAA,MACvE;AAAA,MACA;AAAA,QACE,OAAO;AAAA,QACP,OAAO,OAAO,SAAS,OAAO,CAAC,MAAM,EAAE,GAAG,WAAW,aAAa,CAAC,EAAE,MAAM;AAAA,MAC7E;AAAA,IACF;AAAA,IACA,UAAU;AAAA,MACR,EAAE,OAAO,eAAe,OAAO,QAAQ,OAAO,0BAA0B;AAAA,MACxE,EAAE,OAAO,gBAAgB,OAAO,WAAW,OAAO,4BAA4B;AAAA,IAChF;AAAA,IACA;AAAA,IACA,OAAO,UAAU,WAAW,IAAI,CAAC,qDAAqD,IAAI,CAAC;AAAA,EAC7F;AACF;AAEA,SAAS,WACP,MACA,WACA,MACA,MACA,KACa;AACb,SAAO;AAAA,IACL,IAAI,mBAAmB,IAAI,IAAI,IAAI;AAAA,IACnC,MAAM;AAAA,IACN,UAAU;AAAA,IACV,OAAO,GAAG,SAAS,KAAK,IAAI,UAAU,IAAI;AAAA,IAC1C,QAAQ,IAAI,IAAI,KAAK,GAAG;AAAA,IACxB;AAAA,IACA,OAAO,CAAC,IAAI;AAAA,IACZ,OAAO,CAAC,EAAE,OAAO,gBAAgB,YAAY,KAAK,CAAC;AAAA,EACrD;AACF;AAEA,IAAM,eAAuC;AAAA,EAC3C,SAAS;AAAA,EACT,OAAO;AAAA,EACP,SAAS;AACX;AAGA,SAAS,YAAY,MAAuC;AAC1D,QAAM,MAAM,oBAAI,IAAsB;AACtC,aAAW,CAAC,KAAK,IAAI,KAAK,OAAO,QAAQ,YAAY,GAAG;AACtD,UAAM,IAAI,KAAK,WAAW,GAA8C;AACxE,QAAI,CAAC,UAAU,CAAC,EAAG;AACnB,eAAW,QAAQ,SAAS,CAAC,EAAG,KAAI,IAAI,MAAM,CAAC,GAAI,IAAI,IAAI,IAAI,KAAK,CAAC,GAAI,IAAI,CAAC;AAAA,EAChF;AACA,SAAO;AACT;",
|
|
6
|
+
"names": ["out", "to"]
|
|
7
|
+
}
|
|
@@ -9,7 +9,7 @@ import {
|
|
|
9
9
|
import {
|
|
10
10
|
checkLive,
|
|
11
11
|
simulatedEnds
|
|
12
|
-
} from "./chunk-
|
|
12
|
+
} from "./chunk-J5LYSQ3L.js";
|
|
13
13
|
import {
|
|
14
14
|
blocking,
|
|
15
15
|
checkScenarios,
|
|
@@ -218,4 +218,4 @@ export {
|
|
|
218
218
|
scenarioProblemLines,
|
|
219
219
|
scenariosTool
|
|
220
220
|
};
|
|
221
|
-
//# sourceMappingURL=chunk-
|
|
221
|
+
//# sourceMappingURL=chunk-2KB3J3R5.js.map
|
|
@@ -13,7 +13,7 @@ import {
|
|
|
13
13
|
portLook,
|
|
14
14
|
shiftOf,
|
|
15
15
|
toneColour
|
|
16
|
-
} from "./chunk-
|
|
16
|
+
} from "./chunk-OW32YCZ6.js";
|
|
17
17
|
import {
|
|
18
18
|
NOTE_COLORS,
|
|
19
19
|
TONES
|
|
@@ -27,7 +27,7 @@ import {
|
|
|
27
27
|
import {
|
|
28
28
|
portCentre,
|
|
29
29
|
scenesOf
|
|
30
|
-
} from "./chunk-
|
|
30
|
+
} from "./chunk-KXD6FX2Z.js";
|
|
31
31
|
import {
|
|
32
32
|
ROOT
|
|
33
33
|
} from "./chunk-2OD7UZ7V.js";
|
|
@@ -290,4 +290,4 @@ export {
|
|
|
290
290
|
sceneSvg,
|
|
291
291
|
toSvg
|
|
292
292
|
};
|
|
293
|
-
//# sourceMappingURL=chunk-
|
|
293
|
+
//# sourceMappingURL=chunk-37FKZNRN.js.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import {
|
|
2
2
|
readPlaybook,
|
|
3
3
|
scanFolder
|
|
4
|
-
} from "./chunk-
|
|
4
|
+
} from "./chunk-OGNFHW5O.js";
|
|
5
5
|
import {
|
|
6
6
|
exportTemplates,
|
|
7
7
|
jobTemplateFromExport,
|
|
@@ -10,11 +10,7 @@ import {
|
|
|
10
10
|
} from "./chunk-IYVI5MSS.js";
|
|
11
11
|
import {
|
|
12
12
|
importPlaybook
|
|
13
|
-
} from "./chunk-
|
|
14
|
-
import {
|
|
15
|
-
fromRoot,
|
|
16
|
-
localize
|
|
17
|
-
} from "./chunk-5CD65KH3.js";
|
|
13
|
+
} from "./chunk-CATQHJS6.js";
|
|
18
14
|
import {
|
|
19
15
|
basename,
|
|
20
16
|
dirname,
|
|
@@ -24,6 +20,10 @@ import {
|
|
|
24
20
|
normalize,
|
|
25
21
|
parseAnsible
|
|
26
22
|
} from "./chunk-6L43PFIN.js";
|
|
23
|
+
import {
|
|
24
|
+
fromRoot,
|
|
25
|
+
localize
|
|
26
|
+
} from "./chunk-5CD65KH3.js";
|
|
27
27
|
import {
|
|
28
28
|
VAULT
|
|
29
29
|
} from "./chunk-TC7FOG4T.js";
|
|
@@ -455,4 +455,4 @@ export {
|
|
|
455
455
|
paged,
|
|
456
456
|
sourceOutline
|
|
457
457
|
};
|
|
458
|
-
//# sourceMappingURL=chunk-
|
|
458
|
+
//# sourceMappingURL=chunk-57KJYXWA.js.map
|
|
@@ -1,16 +1,16 @@
|
|
|
1
1
|
import {
|
|
2
2
|
engineFor
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-CCWUUVSG.js";
|
|
4
4
|
import {
|
|
5
5
|
GENERATED_MARK,
|
|
6
6
|
generatedState
|
|
7
|
-
} from "./chunk-
|
|
7
|
+
} from "./chunk-APBEHKCF.js";
|
|
8
8
|
import {
|
|
9
9
|
parseFlow
|
|
10
10
|
} from "./chunk-CORZL72E.js";
|
|
11
11
|
import {
|
|
12
12
|
validateFlow
|
|
13
|
-
} from "./chunk-
|
|
13
|
+
} from "./chunk-PNLY5IWM.js";
|
|
14
14
|
|
|
15
15
|
// src/core/engine/writePlan.ts
|
|
16
16
|
async function planGenerated(text, schema, dir, options) {
|
|
@@ -65,4 +65,4 @@ async function planGenerated(text, schema, dir, options) {
|
|
|
65
65
|
export {
|
|
66
66
|
planGenerated
|
|
67
67
|
};
|
|
68
|
-
//# sourceMappingURL=chunk-
|
|
68
|
+
//# sourceMappingURL=chunk-7ALTNZCI.js.map
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import {
|
|
2
2
|
CHECKSUM_PREFIX
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-WTVGCMGV.js";
|
|
4
4
|
import {
|
|
5
5
|
checksum
|
|
6
6
|
} from "./chunk-BAZIS67B.js";
|
|
@@ -22,4 +22,4 @@ export {
|
|
|
22
22
|
GENERATED_MARK,
|
|
23
23
|
generatedState
|
|
24
24
|
};
|
|
25
|
-
//# sourceMappingURL=chunk-
|
|
25
|
+
//# sourceMappingURL=chunk-APBEHKCF.js.map
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import {
|
|
2
2
|
planCommand
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-TOTSB4HG.js";
|
|
4
4
|
import {
|
|
5
5
|
disabledIds
|
|
6
6
|
} from "./chunk-4IZNAB7J.js";
|
|
@@ -40,4 +40,4 @@ function withoutDisabled(doc) {
|
|
|
40
40
|
export {
|
|
41
41
|
withoutDisabled
|
|
42
42
|
};
|
|
43
|
-
//# sourceMappingURL=chunk-
|
|
43
|
+
//# sourceMappingURL=chunk-ARA3VJR2.js.map
|
|
@@ -1,13 +1,13 @@
|
|
|
1
|
-
import {
|
|
2
|
-
matchHosts
|
|
3
|
-
} from "./chunk-23ISDYUS.js";
|
|
4
1
|
import {
|
|
5
2
|
judge,
|
|
6
3
|
scenarioHosts
|
|
7
4
|
} from "./chunk-TH6ICGA5.js";
|
|
5
|
+
import {
|
|
6
|
+
matchHosts
|
|
7
|
+
} from "./chunk-23ISDYUS.js";
|
|
8
8
|
import {
|
|
9
9
|
optionA
|
|
10
|
-
} from "./chunk-
|
|
10
|
+
} from "./chunk-WTVGCMGV.js";
|
|
11
11
|
import {
|
|
12
12
|
resolvePattern
|
|
13
13
|
} from "./chunk-LPBLGBDT.js";
|
|
@@ -280,4 +280,4 @@ export {
|
|
|
280
280
|
simulateRun,
|
|
281
281
|
simulateScenario
|
|
282
282
|
};
|
|
283
|
-
//# sourceMappingURL=chunk-
|
|
283
|
+
//# sourceMappingURL=chunk-BSX6G7QY.js.map
|
|
@@ -1,18 +1,18 @@
|
|
|
1
1
|
import {
|
|
2
|
-
|
|
3
|
-
|
|
2
|
+
basename,
|
|
3
|
+
dirname
|
|
4
|
+
} from "./chunk-6L43PFIN.js";
|
|
4
5
|
import {
|
|
5
6
|
fromRoot,
|
|
6
7
|
localize
|
|
7
8
|
} from "./chunk-5CD65KH3.js";
|
|
8
|
-
import {
|
|
9
|
-
basename,
|
|
10
|
-
dirname
|
|
11
|
-
} from "./chunk-6L43PFIN.js";
|
|
12
9
|
import {
|
|
13
10
|
LevelBuilder,
|
|
14
11
|
importedFlow
|
|
15
12
|
} from "./chunk-PDUQ3KMW.js";
|
|
13
|
+
import {
|
|
14
|
+
shortName
|
|
15
|
+
} from "./chunk-LNFMYJUJ.js";
|
|
16
16
|
import {
|
|
17
17
|
SECRET,
|
|
18
18
|
VAULT,
|
|
@@ -27,7 +27,7 @@ import {
|
|
|
27
27
|
import {
|
|
28
28
|
MAGIC_VARS,
|
|
29
29
|
bareParams
|
|
30
|
-
} from "./chunk-
|
|
30
|
+
} from "./chunk-PNLY5IWM.js";
|
|
31
31
|
import {
|
|
32
32
|
walkNodes
|
|
33
33
|
} from "./chunk-VG3RKETK.js";
|
|
@@ -989,4 +989,4 @@ export {
|
|
|
989
989
|
flatPlays,
|
|
990
990
|
importPlaybook
|
|
991
991
|
};
|
|
992
|
-
//# sourceMappingURL=chunk-
|
|
992
|
+
//# sourceMappingURL=chunk-CATQHJS6.js.map
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import {
|
|
2
2
|
optionA
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-WTVGCMGV.js";
|
|
4
4
|
|
|
5
5
|
// src/core/engine/engines.ts
|
|
6
6
|
function engineFor(_doc) {
|
|
@@ -10,4 +10,4 @@ function engineFor(_doc) {
|
|
|
10
10
|
export {
|
|
11
11
|
engineFor
|
|
12
12
|
};
|
|
13
|
-
//# sourceMappingURL=chunk-
|
|
13
|
+
//# sourceMappingURL=chunk-CCWUUVSG.js.map
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import {
|
|
2
2
|
FINDING_CODES
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-TBFB7A2Z.js";
|
|
4
4
|
import {
|
|
5
5
|
OP_SPECS
|
|
6
6
|
} from "./chunk-SELZNC6A.js";
|
|
@@ -309,4 +309,4 @@ export {
|
|
|
309
309
|
referenceFiles,
|
|
310
310
|
guideReferenceFiles
|
|
311
311
|
};
|
|
312
|
-
//# sourceMappingURL=chunk-
|
|
312
|
+
//# sourceMappingURL=chunk-CNQ7M7HA.js.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import {
|
|
2
2
|
flatPlays,
|
|
3
3
|
importPlaybook
|
|
4
|
-
} from "./chunk-
|
|
4
|
+
} from "./chunk-CATQHJS6.js";
|
|
5
5
|
import {
|
|
6
6
|
LevelBuilder,
|
|
7
7
|
importedFlow
|
|
@@ -405,4 +405,4 @@ export {
|
|
|
405
405
|
expandable,
|
|
406
406
|
importWorkflow
|
|
407
407
|
};
|
|
408
|
-
//# sourceMappingURL=chunk-
|
|
408
|
+
//# sourceMappingURL=chunk-CNYGDBID.js.map
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import {
|
|
2
|
+
takesFreeKeys
|
|
3
|
+
} from "./chunk-T6SZLRDM.js";
|
|
4
|
+
import {
|
|
5
|
+
upstreamNodes
|
|
6
|
+
} from "./chunk-BUPWGYNF.js";
|
|
7
|
+
|
|
8
|
+
// src/core/flow/facts.ts
|
|
9
|
+
function setFactNames(impl) {
|
|
10
|
+
if (impl?.kind !== "module" || !takesFreeKeys(impl.ref)) return [];
|
|
11
|
+
return Object.keys(impl.params ?? {}).filter(
|
|
12
|
+
(k) => k !== "cacheable" && /^[A-Za-z_][A-Za-z0-9_]*$/.test(k)
|
|
13
|
+
);
|
|
14
|
+
}
|
|
15
|
+
function factSetter(model, reader, name) {
|
|
16
|
+
return upstreamNodes(model, reader.id).find((up) => setFactNames(up.impl).includes(name));
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
export {
|
|
20
|
+
setFactNames,
|
|
21
|
+
factSetter
|
|
22
|
+
};
|
|
23
|
+
//# sourceMappingURL=chunk-FIKPXL6E.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../../src/core/flow/facts.ts"],
|
|
4
|
+
"sourcesContent": ["// AFD-287: the facts a step sets (set_fact's parameters' keys), and the step before a reader that\n// sets a name. Steps pass data through declared inputs and outputs; a fact that is no output yet\n// is still a value a later step may want, so the @ list, the unknown-variable warning and the Data\n// lens offer it, and `useFact` declares it on both steps in one edit.\nimport { takesFreeKeys } from '../catalog/freeKeys';\nimport { upstreamNodes } from './dataRefs';\nimport type { FlowModel } from './model';\nimport type { FlowNode } from './types';\n\n/** The facts a set_fact step sets: its parameters' keys (`cacheable` is an option). */\nexport function setFactNames(impl: FlowNode['impl']): string[] {\n if (impl?.kind !== 'module' || !takesFreeKeys(impl.ref)) return [];\n return Object.keys(impl.params ?? {}).filter(\n (k) => k !== 'cacheable' && /^[A-Za-z_][A-Za-z0-9_]*$/.test(k),\n );\n}\n\n/** The nearest step that runs before `reader` and sets `name` with set_fact. */\nexport function factSetter(model: FlowModel, reader: FlowNode, name: string): FlowNode | undefined {\n // upstreamNodes lists the nearest first.\n return upstreamNodes(model, reader.id).find((up) => setFactNames(up.impl).includes(name));\n}\n"],
|
|
5
|
+
"mappings": ";;;;;;;;AAUO,SAAS,aAAa,MAAkC;AAC7D,MAAI,MAAM,SAAS,YAAY,CAAC,cAAc,KAAK,GAAG,EAAG,QAAO,CAAC;AACjE,SAAO,OAAO,KAAK,KAAK,UAAU,CAAC,CAAC,EAAE;AAAA,IACpC,CAAC,MAAM,MAAM,eAAe,2BAA2B,KAAK,CAAC;AAAA,EAC/D;AACF;AAGO,SAAS,WAAW,OAAkB,QAAkB,MAAoC;AAEjG,SAAO,cAAc,OAAO,OAAO,EAAE,EAAE,KAAK,CAAC,OAAO,aAAa,GAAG,IAAI,EAAE,SAAS,IAAI,CAAC;AAC1F;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import {
|
|
2
2
|
simulateRun,
|
|
3
3
|
simulateScenario
|
|
4
|
-
} from "./chunk-
|
|
4
|
+
} from "./chunk-BSX6G7QY.js";
|
|
5
5
|
import {
|
|
6
6
|
DROPPED,
|
|
7
7
|
blocking,
|
|
@@ -80,4 +80,4 @@ export {
|
|
|
80
80
|
simulatedEnds,
|
|
81
81
|
checkSummary
|
|
82
82
|
};
|
|
83
|
-
//# sourceMappingURL=chunk-
|
|
83
|
+
//# sourceMappingURL=chunk-J5LYSQ3L.js.map
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import {
|
|
2
2
|
routeWire
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-LELKMVJG.js";
|
|
4
4
|
import {
|
|
5
5
|
boundaryView,
|
|
6
6
|
levelView
|
|
@@ -163,4 +163,4 @@ export {
|
|
|
163
163
|
scenesOf,
|
|
164
164
|
levelSuffix
|
|
165
165
|
};
|
|
166
|
-
//# sourceMappingURL=chunk-
|
|
166
|
+
//# sourceMappingURL=chunk-KXD6FX2Z.js.map
|