@ansible-flow/core 0.85.0 → 0.87.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 +4 -3
- package/dist/ai/handlers.js +17 -16
- package/dist/ai/handlers.js.map +1 -1
- package/dist/ai/ops.js +5 -4
- package/dist/ai/scenarios.js +9 -7
- package/dist/awx/import.js +6 -5
- 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-CXVJWFGT.js → chunk-2MJKBPGG.js} +2 -2
- package/dist/chunks/{chunk-JTWR3TGG.js → chunk-2P3JEHLH.js} +4 -4
- package/dist/chunks/{chunk-6M3OG3E4.js → chunk-3Z4WABFK.js} +6 -6
- package/dist/chunks/{chunk-ZAYNYPCX.js → chunk-ARA3VJR2.js} +2 -2
- package/dist/chunks/{chunk-2HMLC2AO.js → chunk-BNMW6KWK.js} +6 -6
- package/dist/chunks/{chunk-CM23ODBB.js → chunk-DL4LYODQ.js} +2 -2
- package/dist/chunks/chunk-FIKPXL6E.js +23 -0
- package/dist/chunks/chunk-FIKPXL6E.js.map +7 -0
- package/dist/chunks/{chunk-ABYJBONR.js → chunk-FMCBTYUM.js} +3 -3
- package/dist/chunks/{chunk-J7KCGVHU.js → chunk-HPRG2672.js} +2 -2
- package/dist/chunks/{chunk-V2SPY2EI.js → chunk-IXW7A4M7.js} +2 -2
- package/dist/chunks/{chunk-22D2NC2L.js → chunk-IZJPLWDY.js} +5 -5
- package/dist/chunks/{chunk-MZ6IJWB2.js → chunk-KZALUEFT.js} +2 -2
- package/dist/chunks/{chunk-XOPGOWNQ.js → chunk-O5Y3AZ4X.js} +1 -1
- package/dist/chunks/chunk-O5Y3AZ4X.js.map +7 -0
- package/dist/chunks/{chunk-2QQC4IZ7.js → chunk-PNLY5IWM.js} +8 -8
- package/dist/chunks/chunk-PNLY5IWM.js.map +7 -0
- package/dist/chunks/{chunk-T5UB4MBB.js → chunk-TOTSB4HG.js} +41 -1
- package/dist/chunks/chunk-TOTSB4HG.js.map +7 -0
- package/dist/chunks/{chunk-7GLSXIZ3.js → chunk-W2CSOAIB.js} +2 -2
- package/dist/chunks/{chunk-UXIXXEIW.js → chunk-WSARMPYU.js} +2 -2
- package/dist/engine/bypass.js +4 -2
- package/dist/engine/engines.js +6 -4
- package/dist/engine/files.js +6 -4
- package/dist/engine/optionA.js +5 -3
- package/dist/engine/partial.js +3 -1
- package/dist/engine/partial.js.map +1 -1
- package/dist/engine/preview.js +6 -4
- package/dist/engine/preview.js.map +1 -1
- package/dist/engine/writePlan.js +9 -8
- 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/merge.d.ts +27 -0
- package/dist/flow/merge.js +422 -0
- package/dist/flow/merge.js.map +7 -0
- package/dist/flow/mergeText.d.ts +3 -0
- package/dist/flow/mergeText.js +71 -0
- package/dist/flow/mergeText.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/flow/valueText.d.ts +6 -0
- package/dist/flow/valueText.js +56 -0
- package/dist/flow/valueText.js.map +7 -0
- package/dist/import/outline.js +6 -5
- package/dist/import/playbook.js +5 -4
- package/dist/lens/caption.js +1 -1
- package/dist/lens/data.js +3 -1
- package/dist/lens/index.js +6 -4
- 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 +4 -0
- package/dist/messageCheck.js.map +2 -2
- package/dist/protocol.d.ts +45 -0
- package/dist/scenario/live.js +7 -5
- package/dist/scenario/simulate.js +6 -4
- package/dist/view/flowFacts.js +9 -8
- package/dist/view/flowFacts.js.map +1 -1
- package/dist/view/jinjaComplete.js +3 -3
- 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-BXHI5EQM.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-CXVJWFGT.js.map → chunk-2MJKBPGG.js.map} +0 -0
- /package/dist/chunks/{chunk-JTWR3TGG.js.map → chunk-2P3JEHLH.js.map} +0 -0
- /package/dist/chunks/{chunk-6M3OG3E4.js.map → chunk-3Z4WABFK.js.map} +0 -0
- /package/dist/chunks/{chunk-ZAYNYPCX.js.map → chunk-ARA3VJR2.js.map} +0 -0
- /package/dist/chunks/{chunk-2HMLC2AO.js.map → chunk-BNMW6KWK.js.map} +0 -0
- /package/dist/chunks/{chunk-CM23ODBB.js.map → chunk-DL4LYODQ.js.map} +0 -0
- /package/dist/chunks/{chunk-ABYJBONR.js.map → chunk-FMCBTYUM.js.map} +0 -0
- /package/dist/chunks/{chunk-J7KCGVHU.js.map → chunk-HPRG2672.js.map} +0 -0
- /package/dist/chunks/{chunk-V2SPY2EI.js.map → chunk-IXW7A4M7.js.map} +0 -0
- /package/dist/chunks/{chunk-22D2NC2L.js.map → chunk-IZJPLWDY.js.map} +0 -0
- /package/dist/chunks/{chunk-MZ6IJWB2.js.map → chunk-KZALUEFT.js.map} +0 -0
- /package/dist/chunks/{chunk-7GLSXIZ3.js.map → chunk-W2CSOAIB.js.map} +0 -0
- /package/dist/chunks/{chunk-UXIXXEIW.js.map → chunk-WSARMPYU.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": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA4BO,SAAS,QAAQ,MAA8B;AACpD,QAAM,OAAO,KAAK;AAClB,SAAO;AAAA,IACL,MAAM,MAAM,QAAQ;AAAA,IACpB,KAAK,MAAM,OAAO;AAAA,IAClB,oBAAoB,MAAM;AAAA,IAC1B,QAAQ,gBAAgB,MAAM,UAAU,CAAC,CAAC;AAAA,IAC1C,UAAU,MAAM,SAAS,YAAY,CAAC,OAAO,aAAa,MAAM,IAAI,IAAI;AAAA,IACxE,QAAQ,CAAC;AAAA,IACT,SAAS,CAAC;AAAA,EACZ;AACF;AAEA,IAAM,QAAQ,CAAC,MAAe,MAAM,UAAa,MAAM,MAAO,MAAM,QAAQ,CAAC,KAAK,EAAE,WAAW;AAGxF,SAAS,UAAU,GAAqC;AAC7D,MAAI,CAAC,EAAE,IAAI,KAAK,EAAG,QAAO;AAC1B,QAAM,SAAS,OAAO,YAAY,OAAO,QAAQ,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC;AACvF,SAAO;AAAA,IACL,MAAM,EAAE;AAAA,IACR,KAAK,EAAE,IAAI,KAAK;AAAA,IAChB,GAAI,EAAE,SAAS,YAAY,EAAE,qBACzB,EAAE,oBAAoB,EAAE,mBAAmB,IAC3C,CAAC;AAAA,IACL,GAAI,OAAO,KAAK,MAAM,EAAE,SAAS,IAAI,EAAE,OAAO,IAAI,CAAC;AAAA,IACnD,GAAI,EAAE,SAAS,YAAY,EAAE,WAAW,EAAE,UAAU,EAAE,SAAS,IAAI,CAAC;AAAA,EACtE;AACF;AAEA,SAAS,MACP,MACA,OAC2C;AAC3C,QAAM,MAAqC,EAAE,GAAI,QAAQ,CAAC,EAAG;AAC7D,aAAW,CAAC,GAAG,CAAC,KAAK,OAAO,QAAQ,KAAK,GAAG;AAC1C,QAAI,MAAM,KAAM,QAAO,IAAI,CAAC;AAAA,QACvB,KAAI,CAAC,IAAI;AAAA,EAChB;AACA,SAAO,OAAO,KAAK,GAAG,EAAE,SAAS,IAAI,MAAM;AAC7C;AAGO,SAAS,WAAW,MAAgB,GAA2B;AACpE,QAAM,OAAO,UAAU,CAAC;AAExB,QAAM,WAAW,QAAQ,KAAK,SAAS,aAAa,KAAK,MAAM,WAAW;AAC1E,SAAO;AAAA,IACL,GAAG;AAAA,IACH,MAAM,QAAQ,WAAW,EAAE,GAAG,MAAM,SAAS,IAAI;AAAA,IACjD,QAAQ,MAAM,KAAK,QAAQ,EAAE,MAAM;AAAA,IACnC,SAAS,MAAM,KAAK,SAAS,EAAE,OAAO;AAAA,EACxC;AACF;AAEO,SAAS,QAAQ,MAAgB,GAA0B;AAGhE,QAAM,MAAM,WAAW,MAAM,QAAQ,IAAI,CAAC;AAC1C,QAAM,SAAS,WAAW,MAAM,CAAC;AACjC,SACE,KAAK,UAAU,OAAO,QAAQ,IAAI,MAAM,KAAK,UAAU,IAAI,QAAQ,IAAI,KACvE,KAAK,UAAU,OAAO,UAAU,IAAI,MAAM,KAAK,UAAU,IAAI,UAAU,IAAI,KAC3E,KAAK,UAAU,OAAO,WAAW,IAAI,MAAM,KAAK,UAAU,IAAI,WAAW,IAAI;AAEjF;AAGO,SAAS,eAAe,MAAgB,GAA8B;AAC3E,QAAM,OAAO,UAAU,CAAC;AACxB,QAAM,UAAU,CAAC,OAA6C,SAC5D,OAAO;AAAA,IACL,OAAO,QAAQ,KAAK,EAAE;AAAA,MACpB,CAAC,CAAC,GAAG,CAAC,MAAM,KAAK,UAAU,CAAC,MAAM,KAAK,UAAU,KAAK,IAAI,IAAI,CAAC,KAAK,IAAI;AAAA,IAC1E;AAAA,EACF;AACF,SAAO;AAAA,IACL,MAAM;AAAA,IACN,IAAI,KAAK;AAAA,IACT;AAAA,IACA,QAAQ,QAAQ,EAAE,QAAQ,QAAQ;AAAA,IAClC,SAAS,QAAQ,EAAE,SAAS,SAAS;AAAA,EACvC;AACF;AAaO,SAAS,UAAU,GAA2B;AACnD,MAAI,EAAE,SAAS,UAAU,EAAE,SAAS,UAAW,QAAO;AACtD,MAAI,EAAE,WAAW,EAAE,QAAQ,SAAS,KAAK,EAAE,SAAS,OAAQ,QAAO;AACnE,MAAI,EAAE,SAAS,WAAW,CAAC,EAAE,YAAY,EAAE,aAAa,UAAU,CAAC,EAAE,WAAY,QAAO;AACxF,MAAI,EAAE,SAAS,SAAS,EAAE,SAAS,QAAS,QAAO;AACnD,MAAI,EAAE,SAAS,UAAU,EAAE,SAAS,UAAU,EAAE,SAAS,UAAU,EAAE,WAAY,QAAO;AACxF,SAAO;AACT;AAGO,SAAS,WACd,SACA,QAC2C;AAC3C,QAAM,MAAM,OAAO,QAAQ,WAAW,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,MAAM,MAAM,OAAO;AAAA,IACjE;AAAA,IACA;AAAA,IACA,SAAS,UAAU,MAAM;AAAA,IACzB,UAAU,CAAC,CAAC,OAAO,YAAY,OAAO,YAAY;AAAA,EACpD,EAAE;AACF,QAAM,MAAM,CAAC,MACX,EAAE,YAAY,CAAC,MAAM,OAAO,EAAE,IAAI,CAAC,MAAM,EAAE,OAAO,WAAW,CAAC,GAAG,KAAK,CAAC,MAAM,CAAC,MAAM,OAAO,CAAC,CAAC,CAAC;AAChG,SAAO,EAAE,OAAO,IAAI,OAAO,GAAG,GAAG,MAAM,IAAI,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,EAAE;AACpE;AAYO,SAAS,YACd,SACA,QACA,QAA2B,CAAC,GACf;AACb,QAAM,EAAE,OAAO,KAAK,IAAI,WAAW,SAAS,MAAM;AAClD,SAAO;AAAA,IACL,UAAU,MAAM,OAAO,CAAC,MAAM,EAAE,QAAQ;AAAA,IACxC,KAAK,MAAM,OAAO,CAAC,MAAM,CAAC,EAAE,QAAQ;AAAA,IACpC,OAAO,MAAM,QAAQ,CAAC,MAAM,KAAK,OAAO,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;AAAA,IAC5D,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,MAAM,SAAS,EAAE,IAAI,CAAC;AAAA,EAClD;AACF;AAMO,SAAS,aAAa,QAA8B,OAA4B;AACrF,QAAM,IAAI,MAAM,KAAK,EAAE,YAAY;AACnC,MAAI,CAAC,EAAG,QAAO,CAAC,GAAG,MAAM;AACzB,QAAM,OAAO,CAAC,MAAiB;AAC7B,UAAM,OAAO,EAAE,KAAK,YAAY;AAChC,QAAI,SAAS,EAAG,QAAO;AACvB,QAAI,KAAK,WAAW,CAAC,EAAG,QAAO;AAC/B,QAAI,KAAK,SAAS,CAAC,EAAG,QAAO;AAC7B,SAAK,EAAE,OAAO,WAAW,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,YAAY,EAAE,SAAS,CAAC,CAAC,EAAG,QAAO;AAC9E,QAAI,EAAE,OAAO,YAAY,YAAY,EAAE,SAAS,CAAC,EAAG,QAAO;AAC3D,WAAO;AAAA,EACT;AACA,SAAO,OACJ,IAAI,CAAC,GAAG,OAAO,EAAE,GAAG,GAAG,GAAG,KAAK,CAAC,EAAE,EAAE,EACpC,OAAO,CAAC,MAAM,EAAE,KAAK,CAAC,EACtB,KAAK,CAAC,GAAG,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,EACrC,IAAI,CAAC,MAAM,EAAE,CAAC;AACnB;AAGO,IAAM,sBAA2C,oBAAI,IAAI;AAAA,EAC9D;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAED,IAAM,eAA6C;AAAA,EACjD,KAAK;AAAA,EACL,QAAQ;AAAA,EACR,KAAK;AAAA,EACL,SAAS;AAAA,EACT,OAAO;AAAA,EACP,MAAM;AAAA,EACN,SAAS;AAAA,EACT,MAAM;AAAA,EACN,MAAM;AAAA,EACN,SAAS;AACX;AAEO,SAAS,eAAe,KAAgD;AAC7E,SAAO,aAAa,IAAI,IAAI,KAAK;AACnC;AAUO,SAAS,UACd,OACA,QACA,KACa;AACb,QAAM,OAAO,OAAO;AACpB,MAAI,CAAC,KAAM,QAAO,CAAC,EAAE,OAAO,WAAW,MAAM,oCAAoC,CAAC;AAClF,QAAM,QAAqB,CAAC;AAC5B,QAAM,SAAS,IAAI;AACnB,MAAI,KAAK,SAAS,YAAY,QAAQ;AACpC,UAAM,SAAS,KAAK,UAAU,CAAC;AAC/B,UAAM,QAAQ,IAAI,IAAI,OAAO,KAAK,MAAM,CAAC;AACzC,UAAM,UAAU,OAAO,QAAQ,kBAAkB,KAAK,KAAK,OAAO,OAAO,KAAK,CAAC,CAAC,EAC7E,OAAO,CAAC,CAAC,MAAM,CAAC,MAAM,EAAE,YAAY,EAAE,YAAY,UAAa,CAAC,MAAM,IAAI,IAAI,CAAC,EAC/E,OAAO,CAAC,CAAC,EAAE,CAAC,MAAM,EAAE,EAAE,WAAW,CAAC,GAAG,KAAK,CAAC,MAAM,MAAM,IAAI,CAAC,CAAC,CAAC,EAC9D,IAAI,CAAC,CAAC,IAAI,MAAM,IAAI;AACvB,UAAM;AAAA,MACJ,QAAQ,SAAS,IACb,EAAE,OAAO,WAAW,MAAM,gCAAgC,QAAQ,KAAK,IAAI,CAAC,GAAG,IAC/E,EAAE,OAAO,MAAM,MAAM,0BAA0B;AAAA,IACrD;AAAA,EACF;AACA,aAAW,QAAQ,OAAO,KAAK,UAAU,CAAC,CAAC,GAAG;AAC5C,QAAI,WAAW,KAAK,IAAI,EAAG;AAC3B,UAAM,QAAQ,OAAO,SAAS,IAAI;AAClC,UAAM,OAAO,OAAO;AACpB,QAAI,CAAC,MAAO,OAAM,KAAK,EAAE,OAAO,WAAW,MAAM,GAAG,IAAI,gCAAgC,CAAC;AAAA,aAChF,MAAM,WAAW,OAAO;AAC/B,YAAM,KAAK,EAAE,OAAO,MAAM,MAAM,GAAG,IAAI,0BAA0B,CAAC;AAAA,aAC3D,MAAM;AACb,YAAM,MAAM,KAAK,MAAM,GAAG,EAAE,CAAC,KAAK;AAClC,YAAM,SAAS,CAAC,GAAG,MAAM,MAAM,OAAO,CAAC,EAAE,KAAK,CAAC,MAAM,EAAE,KAAK,QAAQ,GAAG,GAAG;AAC1E,YAAM,KAAK;AAAA,QACT,OAAO;AAAA,QACP,MAAM,GAAG,IAAI,eAAe,SAAS,IAAI,OAAO,KAAK,MAAM,IAAI;AAAA,MACjE,CAAC;AAAA,IACH,MAAO,OAAM,KAAK,EAAE,OAAO,QAAQ,MAAM,GAAG,IAAI,wCAAwC,CAAC;AAAA,EAC3F;AACA,MAAI,KAAK,SAAS,YAAY,QAAQ;AACpC,UAAM,QAAQ,OAAO,YAAY,YAAY;AAC7C,QAAI,UAAU;AACZ,YAAM,KAAK,EAAE,OAAO,MAAM,MAAM,6CAA6C,CAAC;AAAA,aACvE,UAAU;AACjB,YAAM,KAAK,EAAE,OAAO,QAAQ,MAAM,uDAAuD,CAAC;AAAA,aACnF,UAAU;AACjB,YAAM,KAAK,EAAE,OAAO,QAAQ,MAAM,8CAA8C,CAAC;AACnF,QAAI,OAAO;AACT,YAAM,KAAK,EAAE,OAAO,QAAQ,MAAM,eAAe,OAAO,WAAW,OAAO,cAAc,GAAG,CAAC;AAAA,EAChG;AACA,MAAI,KAAK,SAAS;AAChB,UAAM;AAAA,MACJ,IAAI,WACA,EAAE,OAAO,MAAM,MAAM,iDAAiD,IACtE,EAAE,OAAO,QAAQ,MAAM,6CAA6C;AAAA,IAC1E;AACF,MAAI,KAAK,SAAS;AAChB,UAAM;AAAA,MACJ,IAAI,kBACA,EAAE,OAAO,MAAM,MAAM,4DAA4D,IACjF;AAAA,QACE,OAAO;AAAA,QACP,MAAM;AAAA,MACR;AAAA,IACN;AACF,SAAO;AACT;AAsCA,IAAM,eAAe,CAAC,UAAU,gBAAgB,MAAM,UAAU,QAAQ,UAAU,WAAW,KAAK;AAElG,SAAS,cAAc,MAAsB;AAC3C,QAAM,QAAQ,KAAK,MAAM,IAAI,EAAE,CAAC,KAAK,IAAI,KAAK;AAC9C,UAAQ,oBAAoB,KAAK,IAAI,IAAI,CAAC,KAAK,MAAM,MAAM,GAAG,GAAG;AACnE;AAGO,SAAS,aAAa,SAAmE;AAC9F,QAAM,OAAO,CAAC,SAAiB;AAC7B,UAAM,IAAI,aAAa,QAAQ,IAAI;AACnC,WAAO,IAAI,IAAI,aAAa,SAAS;AAAA,EACvC;AACA,SAAO,OAAO,QAAQ,WAAW,CAAC,CAAC,EAChC,OAAO,CAAC,CAAC,IAAI,MAAM,2BAA2B,KAAK,IAAI,CAAC,EACxD,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,MAAM,KAAK,CAAC,IAAI,KAAK,CAAC,CAAC,EACpC,IAAI,CAAC,CAAC,MAAM,CAAC,OAAO,EAAE,MAAM,QAAQ,cAAc,OAAO,GAAG,eAAe,EAAE,CAAC,EAAE,EAAE;AACvF;AAKA,SAAS,SAAS,MAAc,OAA4B;AAC1D,MAAI,CAAC,MAAM,IAAI,IAAI,EAAG,QAAO;AAC7B,MAAI,IAAI;AACR,SAAO,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,EAAE,EAAG;AAClC,SAAO,GAAG,IAAI,IAAI,CAAC;AACrB;AAMO,SAAS,WAAW,OAAkB,MAAgB,UAAkC;AAC7F,QAAM,SAAS,KAAK,UAAU,CAAC;AAC/B,QAAM,QAAQ,IAAI,IAAI,OAAO,KAAK,MAAM,CAAC;AACzC,QAAM,UAAU,IAAI,IAAI,OAAO,OAAO,MAAM,EAAE,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;AACjE,QAAM,QAAQ,MAAM,MAAM,IAAI,KAAK,EAAE,GAAG;AACxC,QAAM,aAAa,CAAC,SAA+C;AACjE,UAAM,SAAS,KAAK,MAAM,SAAS,WAAW,WAAW,IAAI,IAAI;AACjE,WAAO,UAAU,OAAO,SAAS,IAAI,EAAE,OAAO,IAAI,CAAC;AAAA,EACrD;AAEA,QAAM,WAAW,CAAC,SAAyD;AACzE,QAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,SAAU,QAAO,CAAC;AAC1C,UAAM,MAAM,YAAY,OAAO,MAAM,OAAO,UAAU,IAAI;AAC1D,QAAI,IAAI,SAAS,YAAY,CAAC,IAAI,QAAQ,IAAI,KAAK,SAAS,EAAG,QAAO,CAAC;AACvE,WAAO,IAAI,KAAK,UAAU,IAAI,IAAI,GAAG,SAAS,kBAAkB,WAAW,IAAI,IAAI,IAAI,CAAC;AAAA,EAC1F;AACA,QAAM,MAAmB,OAAO,QAAQ,MAAM,EAAE,IAAI,CAAC,CAAC,MAAM,CAAC,OAAO;AAAA,IAClE;AAAA,IACA,OAAO;AAAA,IACP,QAAQ,GAAG,OAAO,cAAc,EAAE,IAAI,KAAK;AAAA,IAC3C,GAAG,SAAS,GAAG,IAAI;AAAA,EACrB,EAAE;AACF,aAAW,CAAC,MAAM,CAAC,KAAK,OAAO,QAAQ,MAAM,IAAI,MAAM,UAAU,CAAC,CAAC,GAAG;AACpE,UAAM,OAAO,QAAQ,IAAI;AACzB,QAAI,QAAQ,IAAI,IAAI,KAAK,GAAG,SAAS,YAAa;AAClD,UAAM,KAAK,SAAS,MAAM,KAAK;AAC/B,UAAM,IAAI,EAAE;AACZ,QAAI,KAAK;AAAA,MACP,MAAM;AAAA,MACN,OAAO;AAAA,MACP,QAAQ;AAAA,MACR,OAAO,EAAE,MAAM,GAAG,QAAQ,OAAO,KAAK;AAAA,IACxC,CAAC;AAAA,EACH;AACA,QAAM,QAAQ,CACZ,MACA,MACA,QACA,MACA,QAAoC,CAAC,MAClC;AACH,QAAI,QAAQ,IAAI,IAAI,EAAG;AACvB,YAAQ,IAAI,IAAI;AAChB,UAAM,KAAK,SAAS,MAAM,KAAK;AAC/B,UAAM,IAAI,EAAE;AACZ,QAAI,KAAK,EAAE,MAAM,IAAI,OAAO,MAAM,QAAQ,OAAO,EAAE,MAAM,KAAK,GAAG,GAAG,MAAM,CAAC;AAAA,EAC7E;AAEA,QAAM,KAAK,MAAM,MAAM,IAAI,KAAK,EAAE,GAAG;AACrC,aAAW,OAAO,KAAK,UAAU,OAAO,EAAE,IAAI,CAAC;AAC7C,eAAW,CAAC,MAAM,CAAC,KAAK,OAAO,QAAQ,IAAI,UAAU,CAAC,CAAC;AACrD;AAAA,QACE;AAAA,QACA,GAAG,IAAI,GAAG,IAAI,IAAI;AAAA,QAClB,qBAAqB,IAAI,KAAK;AAAA,QAC9B,GAAG,QAAQ;AAAA,MACb;AACJ,QAAM,WAAW,cAAc,OAAO,KAAK,EAAE;AAC7C,aAAW,MAAM;AACf,eAAW,CAAC,MAAM,CAAC,KAAK,OAAO,QAAQ,GAAG,WAAW,CAAC,CAAC;AACrD;AAAA,QACE;AAAA,QACA,GAAG,GAAG,GAAG,IAAI,IAAI;AAAA,QACjB,cAAc,GAAG,KAAK;AAAA,QACtB,GAAG,QAAQ;AAAA,QACX,GAAG,SAAS,kBAAkB,WAAW,EAAE,IAAI,CAAC;AAAA,MAClD;AAEJ,QAAM,SAAS,CAAC,KAAe,SAAuB;AACpD,eAAW,QAAQ,IAAI,SAAS,SAAS,CAAC,GAAG;AAC3C,UAAI,CAAC,MAAM,IAAK;AAChB,YAAMA,MAAK,GAAG,IAAI,IAAI,KAAK,GAAG;AAC9B,iBAAW,CAAC,MAAM,CAAC,KAAK,OAAO,QAAQ,KAAK,WAAW,CAAC,CAAC,GAAG;AAE1D,cAAM,SAAS,OAAO,KAAK,IAAI,WAAW,CAAC,CAAC,EAAE,KAAK,CAAC,MAAM;AACxD,gBAAM,IAAI,OAAO,KAAK,CAAC;AACvB,iBAAO,CAAC,CAAC,KAAK,WAAW,KAAK,EAAE,MAAM,OAAO,KAAK,MAAM,EAAE,WAAW;AAAA,QACvE,CAAC;AACD,YAAI,OAAQ;AACZ;AAAA,UACE;AAAA,UACA,GAAGA,GAAE,IAAI,IAAI;AAAA,UACb,cAAc,KAAK,KAAK,aAAa,IAAI,KAAK,sBAAmB,KAAK,MAAM,GAAG,EAAE,CAAC,CAAC;AAAA,UACnF,GAAG,QAAQ;AAAA,QACb;AAAA,MACF;AACA,UAAI,KAAK,QAAS,QAAO,MAAMA,GAAE;AAAA,IACnC;AAAA,EACF;AACA,aAAW,MAAM,SAAU,KAAI,GAAG,SAAS,UAAW,QAAO,IAAI,GAAG,GAAG;AAEvE,aAAW,MAAM;AACf,eAAW,QAAQ,aAAa,GAAG,IAAI,GAAG;AACxC,UAAI,GAAG,UAAU,IAAI,EAAG;AACxB,YAAM,OAAO,GAAG,GAAG,GAAG,IAAI,IAAI;AAC9B,UAAI,QAAQ,IAAI,IAAI,EAAG;AACvB,cAAQ,IAAI,IAAI;AAChB,YAAM,KAAK,SAAS,MAAM,KAAK;AAC/B,YAAM,IAAI,EAAE;AACZ,UAAI,KAAK;AAAA,QACP,MAAM;AAAA,QACN,OAAO;AAAA,QACP,QAAQ,gBAAgB,GAAG,KAAK;AAAA,QAChC,OAAO,EAAE,MAAM,OAAO,KAAK;AAAA,QAC3B,QAAQ,EAAE,MAAM,GAAG,IAAI,QAAQ,MAAM,OAAO,EAAE,MAAM,MAAM,EAAE;AAAA,MAC9D,CAAC;AAAA,IACH;AAEF,aAAW,MAAM,UAAU;AACzB,QAAI,GAAG,MAAM,SAAS,SAAU;AAChC,QAAI,OAAO,OAAO,GAAG,WAAW,CAAC,CAAC,EAAE,KAAK,CAAC,MAAM,GAAG,SAAS,eAAe,EAAG;AAC9E,UAAM,SAAS,aAAa,EAAE;AAC9B,UAAM,OAAO,GAAG,GAAG,GAAG,IAAI,MAAM;AAChC,QAAI,QAAQ,IAAI,IAAI,EAAG;AACvB,YAAQ,IAAI,IAAI;AAChB,UAAM,KAAK,SAAS,QAAQ,KAAK;AACjC,UAAM,IAAI,EAAE;AACZ,QAAI,KAAK;AAAA,MACP,MAAM;AAAA,MACN,OAAO;AAAA,MACP,QAAQ,cAAc,GAAG,KAAK;AAAA,MAC9B,OAAO,EAAE,MAAM,QAAQ,KAAK;AAAA,MAC5B,QAAQ,EAAE,MAAM,GAAG,IAAI,QAAQ,OAAO;AAAA,MACtC,GAAG,WAAW,EAAE;AAAA,IAClB,CAAC;AAAA,EACH;AACA,SAAO;AACT;",
|
|
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": "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",
|
|
6
|
+
"names": ["out", "to"]
|
|
7
|
+
}
|
|
@@ -12,7 +12,7 @@ import {
|
|
|
12
12
|
} from "./chunk-6MLYGFT6.js";
|
|
13
13
|
import {
|
|
14
14
|
withoutDisabled
|
|
15
|
-
} from "./chunk-
|
|
15
|
+
} from "./chunk-ARA3VJR2.js";
|
|
16
16
|
import {
|
|
17
17
|
Comment,
|
|
18
18
|
comment,
|
|
@@ -1332,4 +1332,4 @@ export {
|
|
|
1332
1332
|
CHECKSUM_PREFIX,
|
|
1333
1333
|
optionA
|
|
1334
1334
|
};
|
|
1335
|
-
//# sourceMappingURL=chunk-
|
|
1335
|
+
//# sourceMappingURL=chunk-2MJKBPGG.js.map
|
|
@@ -1,16 +1,16 @@
|
|
|
1
1
|
import {
|
|
2
2
|
engineFor
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-HPRG2672.js";
|
|
4
4
|
import {
|
|
5
5
|
GENERATED_MARK,
|
|
6
6
|
generatedState
|
|
7
|
-
} from "./chunk-
|
|
7
|
+
} from "./chunk-WSARMPYU.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-2P3JEHLH.js.map
|
|
@@ -1,7 +1,3 @@
|
|
|
1
|
-
import {
|
|
2
|
-
fromRoot,
|
|
3
|
-
localize
|
|
4
|
-
} from "./chunk-5CD65KH3.js";
|
|
5
1
|
import {
|
|
6
2
|
basename,
|
|
7
3
|
dirname
|
|
@@ -9,6 +5,10 @@ import {
|
|
|
9
5
|
import {
|
|
10
6
|
shortName
|
|
11
7
|
} from "./chunk-LNFMYJUJ.js";
|
|
8
|
+
import {
|
|
9
|
+
fromRoot,
|
|
10
|
+
localize
|
|
11
|
+
} from "./chunk-5CD65KH3.js";
|
|
12
12
|
import {
|
|
13
13
|
LevelBuilder,
|
|
14
14
|
importedFlow
|
|
@@ -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-3Z4WABFK.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
|
|
@@ -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-3Z4WABFK.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-BNMW6KWK.js.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import {
|
|
2
2
|
simulateRun,
|
|
3
3
|
simulateScenario
|
|
4
|
-
} from "./chunk-
|
|
4
|
+
} from "./chunk-W2CSOAIB.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-DL4LYODQ.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
|
CommandError,
|
|
3
3
|
planCommand
|
|
4
|
-
} from "./chunk-
|
|
4
|
+
} from "./chunk-TOTSB4HG.js";
|
|
5
5
|
import {
|
|
6
6
|
flowFromFile
|
|
7
7
|
} from "./chunk-CORZL72E.js";
|
|
@@ -17,7 +17,7 @@ import {
|
|
|
17
17
|
acceptKey,
|
|
18
18
|
acceptMatches,
|
|
19
19
|
validateFlow
|
|
20
|
-
} from "./chunk-
|
|
20
|
+
} from "./chunk-PNLY5IWM.js";
|
|
21
21
|
import {
|
|
22
22
|
completeIds
|
|
23
23
|
} from "./chunk-XRGZNPPO.js";
|
|
@@ -778,4 +778,4 @@ export {
|
|
|
778
778
|
opLabel,
|
|
779
779
|
applyOps
|
|
780
780
|
};
|
|
781
|
-
//# sourceMappingURL=chunk-
|
|
781
|
+
//# sourceMappingURL=chunk-FMCBTYUM.js.map
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import {
|
|
2
2
|
optionA
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-2MJKBPGG.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-HPRG2672.js.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import {
|
|
2
2
|
flatPlays,
|
|
3
3
|
importPlaybook
|
|
4
|
-
} from "./chunk-
|
|
4
|
+
} from "./chunk-3Z4WABFK.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-IXW7A4M7.js.map
|
|
@@ -1,7 +1,3 @@
|
|
|
1
|
-
import {
|
|
2
|
-
checkLive,
|
|
3
|
-
simulatedEnds
|
|
4
|
-
} from "./chunk-CM23ODBB.js";
|
|
5
1
|
import {
|
|
6
2
|
endWords,
|
|
7
3
|
scenarioMisses
|
|
@@ -10,6 +6,10 @@ import {
|
|
|
10
6
|
ScenarioEditError,
|
|
11
7
|
planScenarioEdit
|
|
12
8
|
} from "./chunk-2PSB652B.js";
|
|
9
|
+
import {
|
|
10
|
+
checkLive,
|
|
11
|
+
simulatedEnds
|
|
12
|
+
} from "./chunk-DL4LYODQ.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-IZJPLWDY.js.map
|
|
@@ -10,7 +10,7 @@ import {
|
|
|
10
10
|
} from "./chunk-BXJOUAXV.js";
|
|
11
11
|
import {
|
|
12
12
|
acceptKey
|
|
13
|
-
} from "./chunk-
|
|
13
|
+
} from "./chunk-PNLY5IWM.js";
|
|
14
14
|
import {
|
|
15
15
|
openFailPorts
|
|
16
16
|
} from "./chunk-KSM4O2XL.js";
|
|
@@ -265,4 +265,4 @@ export {
|
|
|
265
265
|
countFindings,
|
|
266
266
|
describeFlow
|
|
267
267
|
};
|
|
268
|
-
//# sourceMappingURL=chunk-
|
|
268
|
+
//# sourceMappingURL=chunk-KZALUEFT.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../../src/core/lens/types.ts"],
|
|
4
|
+
"sourcesContent": ["// Lenses (D-18, 04 \u00A77, M8): one category of facts across the whole canvas. A lens fills the node\n// chips (two at most, D-19), may label wires, and adds a side panel with findings. Pure data: the\n// host gathers facts (inventory, catalog, run history), the webview computes the view.\nimport type { FlowCommand } from '../flow/commands';\nimport type { FlowDocument, NodeType, Position, Ulid } from '../flow/types';\n\nexport type LensId = 'inventory' | 'data' | 'code' | 'access' | 'timing' | 'changes';\n\n/** Each lens with what it shows, in a newcomer's words (AFD-71: its tooltip). */\nexport const LENSES: readonly { id: LensId; label: string; hint: string }[] = [\n {\n id: 'inventory',\n label: 'Inventory',\n hint: 'Which hosts each step runs on, counted in your inventory',\n },\n {\n id: 'data',\n label: 'Data',\n hint: 'What each step reads and sets, with dotted wires from where each input comes',\n },\n {\n id: 'code',\n label: 'Code',\n hint: 'What each step runs (module, role or playbook) and whether your environment has it',\n },\n {\n id: 'access',\n label: 'Access',\n hint: 'Who each step acts as: credential, user, become, vaulted variables',\n },\n {\n id: 'timing',\n label: 'Timing',\n hint: 'Batches, timeouts and measured durations, against the maintenance window',\n },\n {\n id: 'changes',\n label: 'Changes',\n hint: 'What changed since another version of the flow: HEAD, a branch or a commit',\n },\n];\n\nexport interface LensChip {\n text: string;\n title?: string;\n tone?: 'warn' | 'muted';\n}\n\n/** A side panel row; hovering it highlights `nodes` and dims the rest (04 \u00A77). */\nexport interface LensItem {\n key: string;\n label: string;\n value?: string;\n detail?: string;\n nodes: Ulid[];\n tone?: 'warn' | 'muted';\n}\n\nexport interface LensSection {\n title: string;\n items: LensItem[];\n empty?: string;\n}\n\n/** A one-edit fix (a canvas command), or a jump to the node's properties. */\nexport type FindingFix =\n | { label: string; command: FlowCommand }\n | { label: string; properties: Ulid };\n\nexport interface LensFinding {\n /** Stable across documents (`inventory:broad-target:<node>`), the key of `finding_accepted`. */\n id: string;\n lens: LensId;\n severity: 'warning' | 'info';\n title: string;\n detail: string;\n /** The node an acceptance is attached to (deleted with it). */\n node?: Ulid;\n nodes: Ulid[];\n fixes: FindingFix[];\n accepted?: { reason: string; by?: string };\n /**\n * AFD-106 (round 3: R10): Accept with Reason comes before the fixes. Keeping become needs a\n * reason; the participant kept it and recorded none.\n */\n acceptFirst?: boolean;\n}\n\n/** Data lens (decision 14): derived from `from:` references, never stored as edges. */\nexport interface DataWire {\n id: string;\n from: Ulid;\n to: Ulid;\n label: string;\n title: string;\n /** AFD-287: a value read without an input (a fact an earlier step sets): drawn as a warning. */\n undeclared?: boolean;\n}\n\n/** A node of the compared version that is gone (AFD-57): drawn as a ghost on its level. */\nexport interface GhostNode {\n id: Ulid;\n title: string;\n type: NodeType;\n level: string;\n position?: Position;\n}\n\nexport interface LensView {\n lens: LensId;\n /** Changes lens: removed nodes, drawn where they stood. */\n ghosts?: GhostNode[];\n /** Changes lens (AFD-66): annotations outlined as added or changed. */\n annotations?: Record<Ulid, 'added' | 'changed'>;\n chips: Record<Ulid, LensChip[]>;\n /** Wire labels by edge id (Inventory: hosts that took the wire in the last run). */\n wires?: Record<string, string>;\n dataWires?: DataWire[];\n stats: { label: string; value: string }[];\n sections: LensSection[];\n findings: LensFinding[];\n /** What the lens cannot show yet and why (no inventory read, no catalog, no runs). */\n notes: string[];\n}\n\n// ---- Facts the host gathers -------------------------------------------------------------------\n\n/** One host pattern resolved against the inventory (probe `inventory_lens`). */\nexport interface PatternFacts {\n count: number;\n /** Hosts the flow targets do not include. */\n outside: number;\n /** A few of those hosts, for the finding text. */\n sample: string[];\n}\n\n/** Inventory variables that decide access, aggregated over a pattern's hosts. */\nexport interface AccessVar {\n /** Value \u2192 host count; booleans as `true`/`false`. Vaulted values are never read. */\n values: Record<string, number>;\n /** Where the values come from (`group_vars/all.yml:2`); booleans carry no origin. */\n origins: string[];\n vault?: boolean;\n}\n\nexport interface InventoryFacts {\n sources: string[];\n /** Sources that are inventory plugins or scripts (read on demand, with a timeout). */\n dynamic: string[];\n total: number;\n /** The flow targets this was resolved for (the targets input as last entered). */\n targets: string;\n patterns: Record<string, PatternFacts>;\n /** Hosts in any pattern, and the groups they belong to. */\n scope: { count: number; groups: Record<string, number> };\n prod_groups: string[];\n /** Per pattern: ansible_user, ansible_become, ansible_become_user, ansible_connection. */\n access: Record<string, Record<string, AccessVar>>;\n /** Vaulted variable names of the hosts in scope, with their origin (never the value). */\n vaulted: Record<string, string>;\n}\n\nexport interface InventoryState {\n state: 'idle' | 'loading' | 'ready' | 'error';\n facts?: InventoryFacts;\n error?: string;\n /** The targets pattern the user entered (remembered with the run inputs). */\n targets?: string;\n inventory?: string;\n}\n\nexport interface CodeNodeFacts {\n kind: 'module' | 'role' | 'playbook';\n ref: string;\n fqcn?: string;\n collection?: string;\n version?: string;\n state: 'ok' | 'not-in-ee' | 'removed' | 'deprecated' | 'unknown';\n why?: string;\n /** Playbook bindings: the `hosts:` of the imported plays. */\n hosts?: string[];\n}\n\nexport interface CodeFacts {\n /** False until a catalog of the environment exists (opening a flow never starts the probe). */\n ready: boolean;\n environment: string;\n /** Installed collection \u2192 version. */\n collections: Record<string, string>;\n /** `collections/requirements.yml` pins, collection \u2192 version spec. */\n requirements?: { path: string; pins: Record<string, string> };\n nodes: Record<Ulid, CodeNodeFacts>;\n}\n\nexport interface NodeTiming {\n runs: number;\n /** Seconds. */\n avg: number;\n p95: number;\n last: number;\n}\n\n/** Local run history (decision M8-2): the last 20 runs started from VS Code. */\nexport interface TimingFacts {\n runs: number;\n nodes: Record<Ulid, NodeTiming>;\n}\n\n/** A version to compare with (AFD-57): HEAD, a branch, or a commit that touched the flow. */\nexport interface CompareRef {\n ref: string;\n label: string;\n}\n\n/** The Changes lens's base: the flow as the chosen version has it. */\nexport interface CompareFacts {\n state: 'loading' | 'ready' | 'error';\n ref: string;\n label: string;\n refs: CompareRef[];\n base?: FlowDocument;\n error?: string;\n}\n\nexport interface LensFacts {\n inventory?: InventoryState;\n code?: CodeFacts;\n timing?: TimingFacts;\n compare?: CompareFacts;\n}\n"],
|
|
5
|
+
"mappings": ";AASO,IAAM,SAAiE;AAAA,EAC5E;AAAA,IACE,IAAI;AAAA,IACJ,OAAO;AAAA,IACP,MAAM;AAAA,EACR;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IACJ,OAAO;AAAA,IACP,MAAM;AAAA,EACR;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IACJ,OAAO;AAAA,IACP,MAAM;AAAA,EACR;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IACJ,OAAO;AAAA,IACP,MAAM;AAAA,EACR;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IACJ,OAAO;AAAA,IACP,MAAM;AAAA,EACR;AAAA,EACA;AAAA,IACE,IAAI;AAAA,IACJ,OAAO;AAAA,IACP,MAAM;AAAA,EACR;AACF;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -4,9 +4,6 @@ import {
|
|
|
4
4
|
import {
|
|
5
5
|
openFailPorts
|
|
6
6
|
} from "./chunk-KSM4O2XL.js";
|
|
7
|
-
import {
|
|
8
|
-
takesFreeKeys
|
|
9
|
-
} from "./chunk-T6SZLRDM.js";
|
|
10
7
|
import {
|
|
11
8
|
rollingObstacles
|
|
12
9
|
} from "./chunk-7D55CRGU.js";
|
|
@@ -16,6 +13,10 @@ import {
|
|
|
16
13
|
import {
|
|
17
14
|
refDesign
|
|
18
15
|
} from "./chunk-H6ARLMMI.js";
|
|
16
|
+
import {
|
|
17
|
+
factSetter,
|
|
18
|
+
setFactNames
|
|
19
|
+
} from "./chunk-FIKPXL6E.js";
|
|
19
20
|
import {
|
|
20
21
|
healPlan
|
|
21
22
|
} from "./chunk-WG7O3OBV.js";
|
|
@@ -631,6 +632,9 @@ function hintFor(model, node, level, name) {
|
|
|
631
632
|
const upstream = upstreamNodes(model, node.id);
|
|
632
633
|
for (const up of upstream)
|
|
633
634
|
if (up.outputs && name in up.outputs) return `; add input ${name} (from: ${up.key}.${name})`;
|
|
635
|
+
const setter = factSetter(model, node, name);
|
|
636
|
+
if (setter)
|
|
637
|
+
return `; "${setter.title}" sets it (set_fact): use it as an input (quick fix, or the @ picker), which makes it an output there`;
|
|
634
638
|
const inside = (sub, path) => {
|
|
635
639
|
for (const step of sub.subflow?.nodes ?? []) {
|
|
636
640
|
if (!step?.key) continue;
|
|
@@ -1296,10 +1300,6 @@ function definedGuards(nodes, names) {
|
|
|
1296
1300
|
}
|
|
1297
1301
|
return out;
|
|
1298
1302
|
}
|
|
1299
|
-
function setFactNames(impl) {
|
|
1300
|
-
if (impl.kind !== "module" || !takesFreeKeys(impl.ref)) return [];
|
|
1301
|
-
return Object.keys(impl.params ?? {}).filter((k) => k !== "cacheable");
|
|
1302
|
-
}
|
|
1303
1303
|
function externalVars(model) {
|
|
1304
1304
|
const ext = model.doc.flow?.external_vars;
|
|
1305
1305
|
return new Set(ext && typeof ext === "object" ? Object.keys(ext) : []);
|
|
@@ -1326,4 +1326,4 @@ export {
|
|
|
1326
1326
|
MAGIC_VARS,
|
|
1327
1327
|
bareParams
|
|
1328
1328
|
};
|
|
1329
|
-
//# sourceMappingURL=chunk-
|
|
1329
|
+
//# sourceMappingURL=chunk-PNLY5IWM.js.map
|