@ansible-flow/core 0.86.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.
Files changed (90) hide show
  1. package/README.md +1 -1
  2. package/dist/ai/describe.js +4 -3
  3. package/dist/ai/handlers.js +16 -15
  4. package/dist/ai/handlers.js.map +1 -1
  5. package/dist/ai/ops.js +5 -4
  6. package/dist/ai/scenarios.js +8 -6
  7. package/dist/awx/import.js +6 -5
  8. package/dist/catalog/draft.d.ts +2 -0
  9. package/dist/catalog/draft.js +23 -4
  10. package/dist/catalog/draft.js.map +2 -2
  11. package/dist/chunks/{chunk-BXHI5EQM.js → chunk-2DT5DOSO.js} +43 -1
  12. package/dist/chunks/chunk-2DT5DOSO.js.map +7 -0
  13. package/dist/chunks/{chunk-CXVJWFGT.js → chunk-2MJKBPGG.js} +2 -2
  14. package/dist/chunks/{chunk-JTWR3TGG.js → chunk-2P3JEHLH.js} +4 -4
  15. package/dist/chunks/{chunk-H7Z2FBRD.js → chunk-3Z4WABFK.js} +6 -6
  16. package/dist/chunks/{chunk-ZAYNYPCX.js → chunk-ARA3VJR2.js} +2 -2
  17. package/dist/chunks/{chunk-TPRZZHXA.js → chunk-BNMW6KWK.js} +7 -7
  18. package/dist/chunks/{chunk-CM23ODBB.js → chunk-DL4LYODQ.js} +2 -2
  19. package/dist/chunks/chunk-FIKPXL6E.js +23 -0
  20. package/dist/chunks/chunk-FIKPXL6E.js.map +7 -0
  21. package/dist/chunks/{chunk-ABYJBONR.js → chunk-FMCBTYUM.js} +3 -3
  22. package/dist/chunks/{chunk-J7KCGVHU.js → chunk-HPRG2672.js} +2 -2
  23. package/dist/chunks/{chunk-NT62IE3Y.js → chunk-IXW7A4M7.js} +2 -2
  24. package/dist/chunks/{chunk-DHU774ES.js → chunk-IZJPLWDY.js} +2 -2
  25. package/dist/chunks/{chunk-MZ6IJWB2.js → chunk-KZALUEFT.js} +2 -2
  26. package/dist/chunks/{chunk-XOPGOWNQ.js → chunk-O5Y3AZ4X.js} +1 -1
  27. package/dist/chunks/chunk-O5Y3AZ4X.js.map +7 -0
  28. package/dist/chunks/{chunk-2QQC4IZ7.js → chunk-PNLY5IWM.js} +8 -8
  29. package/dist/chunks/chunk-PNLY5IWM.js.map +7 -0
  30. package/dist/chunks/{chunk-5XGAGNH5.js → chunk-QMIXDOU6.js} +5 -5
  31. package/dist/chunks/{chunk-T5UB4MBB.js → chunk-TOTSB4HG.js} +41 -1
  32. package/dist/chunks/chunk-TOTSB4HG.js.map +7 -0
  33. package/dist/chunks/{chunk-7GLSXIZ3.js → chunk-W2CSOAIB.js} +2 -2
  34. package/dist/chunks/{chunk-UXIXXEIW.js → chunk-WSARMPYU.js} +2 -2
  35. package/dist/engine/bypass.js +4 -2
  36. package/dist/engine/engines.js +6 -4
  37. package/dist/engine/files.js +6 -4
  38. package/dist/engine/optionA.js +5 -3
  39. package/dist/engine/partial.js +3 -1
  40. package/dist/engine/partial.js.map +1 -1
  41. package/dist/engine/preview.js +6 -4
  42. package/dist/engine/preview.js.map +1 -1
  43. package/dist/engine/writePlan.js +9 -8
  44. package/dist/flow/commands.d.ts +10 -0
  45. package/dist/flow/commands.js +3 -1
  46. package/dist/flow/facts.d.ts +6 -0
  47. package/dist/flow/facts.js +13 -0
  48. package/dist/flow/facts.js.map +7 -0
  49. package/dist/flow/save.js +3 -1
  50. package/dist/flow/save.js.map +1 -1
  51. package/dist/flow/validate.js +3 -2
  52. package/dist/import/outline.js +7 -6
  53. package/dist/import/playbook.js +5 -4
  54. package/dist/import/source.js +2 -2
  55. package/dist/lens/caption.js +1 -1
  56. package/dist/lens/data.js +3 -1
  57. package/dist/lens/index.js +11 -9
  58. package/dist/lens/index.js.map +1 -1
  59. package/dist/lens/types.d.ts +2 -0
  60. package/dist/lens/types.js +1 -1
  61. package/dist/messageCheck.js +2 -0
  62. package/dist/messageCheck.js.map +2 -2
  63. package/dist/protocol.d.ts +17 -0
  64. package/dist/scenario/live.js +7 -5
  65. package/dist/scenario/simulate.js +6 -4
  66. package/dist/view/flowFacts.js +9 -8
  67. package/dist/view/flowFacts.js.map +1 -1
  68. package/dist/view/jinjaComplete.js +3 -3
  69. package/dist/view/serverChange.d.ts +23 -0
  70. package/dist/view/serverChange.js +48 -0
  71. package/dist/view/serverChange.js.map +7 -0
  72. package/package.json +1 -1
  73. package/dist/chunks/chunk-2QQC4IZ7.js.map +0 -7
  74. package/dist/chunks/chunk-BXHI5EQM.js.map +0 -7
  75. package/dist/chunks/chunk-T5UB4MBB.js.map +0 -7
  76. package/dist/chunks/chunk-XOPGOWNQ.js.map +0 -7
  77. /package/dist/chunks/{chunk-CXVJWFGT.js.map → chunk-2MJKBPGG.js.map} +0 -0
  78. /package/dist/chunks/{chunk-JTWR3TGG.js.map → chunk-2P3JEHLH.js.map} +0 -0
  79. /package/dist/chunks/{chunk-H7Z2FBRD.js.map → chunk-3Z4WABFK.js.map} +0 -0
  80. /package/dist/chunks/{chunk-ZAYNYPCX.js.map → chunk-ARA3VJR2.js.map} +0 -0
  81. /package/dist/chunks/{chunk-TPRZZHXA.js.map → chunk-BNMW6KWK.js.map} +0 -0
  82. /package/dist/chunks/{chunk-CM23ODBB.js.map → chunk-DL4LYODQ.js.map} +0 -0
  83. /package/dist/chunks/{chunk-ABYJBONR.js.map → chunk-FMCBTYUM.js.map} +0 -0
  84. /package/dist/chunks/{chunk-J7KCGVHU.js.map → chunk-HPRG2672.js.map} +0 -0
  85. /package/dist/chunks/{chunk-NT62IE3Y.js.map → chunk-IXW7A4M7.js.map} +0 -0
  86. /package/dist/chunks/{chunk-DHU774ES.js.map → chunk-IZJPLWDY.js.map} +0 -0
  87. /package/dist/chunks/{chunk-MZ6IJWB2.js.map → chunk-KZALUEFT.js.map} +0 -0
  88. /package/dist/chunks/{chunk-5XGAGNH5.js.map → chunk-QMIXDOU6.js.map} +0 -0
  89. /package/dist/chunks/{chunk-7GLSXIZ3.js.map → chunk-W2CSOAIB.js.map} +0 -0
  90. /package/dist/chunks/{chunk-UXIXXEIW.js.map → chunk-WSARMPYU.js.map} +0 -0
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../../src/core/flow/commands.ts"],
4
+ "sourcesContent": ["// Canvas intent commands \u2192 minimal text edits of the flow document (ADR-0001). Commands address\n// nodes and edges by ID; each one becomes a single WorkspaceEdit, i.e. one undo step.\n\nimport { IMPORTED_FIELDS, type ReimportAdd, type ReimportUpdate } from '../import/reimport';\nimport type { TextEdit } from '../yaml/edits';\nimport { deleteKey, insertItem, type OpResult, removeItem, removeItems, setIn } from '../yaml/ops';\nimport type { Path, YamlFile } from '../yaml/parse';\nimport { Literal, type YamlValue } from '../yaml/render';\nimport { YamlEditError, YamlTransaction } from '../yaml/transaction';\nimport { annotationValue, nextAnnotationKey, TIE_OFFSET } from './annotations';\nimport { levelTaken, openOnPurpose, portKey, untakenFailPorts } from './bubbling';\nimport { parseClip } from './clipboard';\nimport { enclosing, liftOf, readerLevel, resolveFrom } from './dataRefs';\nimport {\n acceptedAll,\n acceptedOf,\n checkWhat,\n type DecisionArea,\n decisionItem,\n findAccepted,\n portAccepted,\n} from './decisions';\nimport { canDisable } from './disabled';\nimport { setFactNames } from './facts';\nimport { ANNOTATION_ORDER, NODE_ORDER, purposeKey, requireFormat } from './format';\nimport { CONTINUES_ON, healPlan, healSummary, spliceProblem } from './heal';\nimport { type IdFactory, SLUG, slugify, uniqueKey } from './ids';\nimport { mapStrings, renameExprRef, renameRef } from './jinja';\nimport { BARE_KEYWORDS } from './keywords';\nimport { existingLift, liftField, liftName } from './lift';\nimport { CURRENT_FORMAT, FormatError, formatOf, migrate } from './migrate';\nimport { buildModel, type FlowModel, keyScope, type Level, ROOT } from './model';\nimport { findEnd, type NodeRecipe, type PatternId, patternFits, recipeFor } from './patterns';\nimport {\n isExitName,\n isFailPort,\n isPortLegal,\n LEGACY_PORTS,\n offeredPortNames,\n optionalPortNames,\n portDirection,\n portsFor,\n} from './ports';\nimport { copySubflow, parseRefFrom, refFor } from './refs';\nimport { nodeDesigns, testedDropBack } from './semantic';\nimport { canMarkTested, contentStatus, hasStatus, statusAfterBinding, statusFor } from './status';\nimport {\n ANNOTATION_COLORS,\n ANNOTATION_KINDS,\n type AnnotationColor,\n type AnnotationKind,\n type ApprovalFields,\n type BoundaryExit,\n type ContractField,\n type FlowDocument,\n type FlowNode,\n type HandlerKind,\n type ImplBinding,\n type JoinMode,\n type NodeSettings,\n type NodeStatus,\n type NodeType,\n type PortRef,\n type Position,\n type SubflowBody,\n TEXT_SIZES,\n type TestedRecord,\n type TextSize,\n type Ulid,\n} from './types';\nimport { varNameProblem } from './varNames';\nimport { descendantIds } from './walk';\n\ntype Boundary = NonNullable<SubflowBody['boundary']>;\n\nexport type FlowCommand =\n | {\n kind: 'addNode';\n /** Subflow node whose inner graph receives the node; omitted for the top level. */\n parent?: Ulid;\n type: NodeType;\n title: string;\n key?: string;\n intent?: string;\n ports?: string[];\n purpose?: HandlerKind;\n outcome?: 'success' | 'failed';\n inputs?: Record<string, ContractField>;\n /** Bound from the start (M6 \"Add to subflow\": a role task file becomes a step). */\n impl?: ImplBinding;\n position?: Position;\n /** Wire this output port to the new node's `in`. */\n connectFrom?: PortRef;\n /** Wire the new node's failed_hosts to this node's `in` (e.g. an existing Rollback). */\n wireFailedTo?: Ulid;\n /** Put the new node on this edge: the edge now ends at the node, which continues to the old target. */\n insertOn?: Ulid;\n /** Positions of nodes still shown at auto-layout positions, written in the same edit. */\n freeze?: Record<Ulid, Position>;\n }\n | {\n kind: 'applyPattern';\n pattern: PatternId;\n from: PortRef;\n /** Where the handler node (or, without one, the new end node) goes. */\n position?: Position;\n /** The end node to wire to instead of the one the pattern picks (AFD-21). */\n end?: Ulid;\n freeze?: Record<Ulid, Position>;\n }\n | { kind: 'setDecision'; node: Ulid; port: string; reason: string; by?: string }\n | { kind: 'clearDecision'; node: Ulid; port: string }\n | { kind: 'rewire'; edge: Ulid; to: PortRef }\n /** AFD-233: the wire now leaves from another output, which must be open. */\n | { kind: 'rewireFrom'; edge: Ulid; from: PortRef }\n /**\n * AFD-234: a node standing free of the path goes into a wire; `positions` (where it was\n * dropped, and nodes still at auto-layout positions) are written in the same edit.\n */\n | { kind: 'spliceNode'; node: Ulid; edge: Ulid; positions?: Record<Ulid, Position> }\n /** AFD-242: several nodes switched off, or back on, in one edit. */\n | { kind: 'setDisabled'; ids: Ulid[]; disabled: boolean }\n /** AFD-235: the nodes leave their path, which closes behind them; they keep their wires to each other. */\n | { kind: 'detachNodes'; ids: Ulid[] }\n | { kind: 'updateNode'; id: Ulid; patch: NodePatch }\n | { kind: 'deleteNode'; id: Ulid }\n /**\n * AFD-18: a selection (nodes and wires of one level) goes in one edit, so one undo restores it;\n * AFD-64: with its annotations.\n */\n | {\n kind: 'deleteNodes';\n ids: Ulid[];\n edges?: Ulid[];\n annotations?: Ulid[];\n /** AFD-235: wires into the deleted nodes go on to where those nodes went on (core/flow/heal). */\n heal?: boolean;\n }\n /** AFD-64: annotations move in the same edit (stored form: relative for a Note on a node). */\n | {\n kind: 'moveNodes';\n positions: Record<Ulid, Position>;\n annotations?: Record<Ulid, Position>;\n }\n /** AFD-24: drop stored positions, so the canvas places these nodes again. */\n | { kind: 'unplaceNodes'; ids: Ulid[] }\n | { kind: 'tidyUp'; positions: Record<Ulid, Position>; annotations?: Record<Ulid, Position> }\n /** AFD-64: a Note, Section or Text on a level (format 2); `freeze` as for addNode. */\n | {\n kind: 'addAnnotation';\n level?: string;\n annotation: AnnotationPatch & { text: string; x: number; y: number };\n freeze?: Record<Ulid, Position>;\n }\n /** AFD-64: an annotation's text, look, place or tie (`on: null` unties it). */\n | { kind: 'updateAnnotation'; id: Ulid; patch: AnnotationPatch }\n | { kind: 'connect'; from: PortRef; to: PortRef }\n | { kind: 'disconnect'; edge: Ulid }\n | { kind: 'setPortEnabled'; node: Ulid; port: string; enabled: boolean }\n | {\n kind: 'setContractField';\n /** `flow` for flow inputs, otherwise a node id. */\n target: 'flow' | Ulid;\n side: 'inputs' | 'outputs';\n name: string;\n /** null removes the field. */\n field: ContractField | null;\n /** New name for the field (rename keeps the definition). */\n rename?: string;\n }\n /**\n * AFD-287: a fact an earlier step sets (set_fact) read by `reader`: an output of that name on\n * the setter (a fact needs no `from:`) and an input of the reader from it, in one edit.\n */\n | { kind: 'useFact'; reader: Ulid; setter: Ulid; name: string }\n | { kind: 'updateFlow'; patch: FlowPatch }\n /**\n * AFD-112 (round 4: Q4): a step's Timing setting given at run time, in one edit: the flow input\n * (an integer, the field's value its default), the step input reading it, and the setting.\n */\n | {\n kind: 'askAtRunTime';\n id: Ulid;\n setting: RunTimeSetting;\n name: string;\n description?: string;\n /** Without one, the flow input is required. */\n default?: number;\n }\n /** D-23: the inner node that receives the hosts entering the subflow (null clears it). */\n | { kind: 'setBoundaryIn'; subflow: Ulid; node: Ulid | null }\n /** D-23: an inner output leaves the subflow through the parent's `port`. */\n | { kind: 'connectBoundary'; subflow: Ulid; from: PortRef; port: string; reason?: string }\n | { kind: 'disconnectBoundary'; subflow: Ulid; from: PortRef; port: string }\n | { kind: 'setExitReason'; subflow: Ulid; from: PortRef; port: string; reason: string | null }\n /**\n * M5 \"Save binding\" (mockup 11): the implementation and what came with it (inputs the chips\n * created, outputs from the registered result) in one edit; `impl: null` unbinds. The status\n * follows (AFD-50).\n */\n | {\n kind: 'setBinding';\n id: Ulid;\n impl: ImplBinding | null;\n /** Contract fields to set (null removes one); other fields stay. */\n inputs?: Record<string, ContractField | null>;\n outputs?: Record<string, ContractField | null>;\n }\n /** M6 (D-29): keep a drift item as it is, with a reason; the host adds `by`. */\n | { kind: 'ignoreDrift'; node: Ulid; item: string; reason: string; by?: string }\n | { kind: 'clearDriftIgnore'; node: Ulid; item: string }\n /** M8: keep a lens finding as expected, with a reason; the host adds `by`. */\n | { kind: 'acceptFinding'; finding: string; node?: Ulid; reason: string; by?: string }\n | { kind: 'clearFindingAccept'; finding: string }\n /**\n * AFD-51 (format 2): a validator warning kept as it is, with a reason; the host adds `by`. The\n * warning stops showing for that node (and subject, e.g. the variable a binding reads).\n */\n | { kind: 'acceptCheck'; node: Ulid; code: string; subject?: string; reason: string; by?: string }\n | { kind: 'clearCheckAccept'; node: Ulid; code: string; subject?: string }\n /**\n * Decision 15 (M7): the nodes a passing run of this flow version tested, in one edit. Format 2\n * records the run on each node (AFD-50).\n */\n | {\n kind: 'setStatuses';\n statuses: Record<Ulid, NodeStatus>;\n run?: { id: string; flowVersion?: number; commit?: string };\n }\n /**\n * AFD-44: `tested` set by hand, with the reason, the author and the day (the host adds `by` and\n * `at`): format 2 keeps them on the node (AFD-50), format 1 in the `finding_accepted` record\n * `status:tested|<node>`.\n */\n | { kind: 'markTested'; id: Ulid; reason: string; by?: string; at?: string }\n /** Upgrade Flow Format (AFD-49): the file to the current format, one undo step. */\n | { kind: 'upgradeFormat' }\n /**\n * AFD-60, format 2: a copy of another flow's subflow (`source`, read by the host) on a level,\n * pinned to that flow's `version`; it keeps its source's key.\n */\n | {\n kind: 'addReference';\n parent?: Ulid;\n from: string;\n version: number;\n source: FlowNode;\n position?: Position;\n }\n /** AFD-60: the copy again from a newer version of its source (steps inside start untested). */\n | { kind: 'updateReference'; id: Ulid; version: number; source: FlowNode }\n /** AFD-60: the copy becomes this flow's own subflow, to edit here. */\n | { kind: 'unlinkReference'; id: Ulid }\n /**\n * AFD-61: a re-import's merge, as the host planned it from a fresh import of the source: the\n * steps that take the source's version, the new steps after the step before them, the steps\n * whose task is gone (flagged), and the steps that keep the designer's version: they note the\n * source's fingerprint, so the same change is not offered again.\n */\n | {\n kind: 'reimport';\n updates: ReimportUpdate[];\n adds: ReimportAdd[];\n gone: Ulid[];\n keep?: { node: Ulid; design: string }[];\n }\n /** AFD-17: nodes from clipboard text become new nodes on a level (`root` or a subflow). */\n | {\n kind: 'pasteNodes';\n text: string;\n level?: string;\n position?: Position;\n /** Positions of nodes still shown at auto-layout positions, written in the same edit. */\n freeze?: Record<Ulid, Position>;\n }\n /** AFD-196: move a subflow's steps up to its level and remove the subflow (inverse of extract). */\n /**\n * `place` (AFD-241, the canvas): the steps keep their arrangement, moved to where the subflow\n * stood; without stored positions on either side they are left to automatic placement.\n */\n | { kind: 'dissolveSubflow'; id: Ulid; place?: boolean }\n /** AFD-7: move a connected selection of one level into a new subflow node. */\n | {\n kind: 'extractSubflow';\n nodes: Ulid[];\n title: string;\n key?: string;\n position?: Position;\n freeze?: Record<Ulid, Position>;\n /** AFD-64: annotations of the level that go inside too (Notes on the nodes always do). */\n annotations?: Ulid[];\n };\n\n/**\n * What an annotation command writes (AFD-64). `on` ties a Note to a node of its level (null unties);\n * with `x`/`y` absent the Note keeps its place on the canvas as far as the stored positions tell.\n */\nexport interface AnnotationPatch {\n kind?: AnnotationKind;\n key?: string;\n text?: string;\n x?: number;\n y?: number;\n width?: number | null;\n height?: number | null;\n color?: AnnotationColor | null;\n size?: TextSize | null;\n on?: Ulid | null;\n}\n\nexport interface NodePatch {\n title?: string;\n key?: string;\n intent?: string | null;\n status?: NodeStatus | null;\n condition?: string | null;\n outcome?: 'success' | 'failed' | null;\n purpose?: HandlerKind | null;\n join_mode?: JoinMode | null;\n branches?: number | null;\n /** AFD-242: true switches the node off; false or null switches it back on. */\n disabled?: boolean | null;\n /** Merged into `settings`; null removes a setting. */\n settings?: { [K in keyof NodeSettings]?: NodeSettings[K] | null };\n /** Replaces the binding's task keywords (AFD-26); null or {} removes them. */\n keywords?: Record<string, unknown> | null;\n /**\n * AFD-112: merged into the node's inputs; null removes one. A Timing field given an input with\n * @ and the input it reads are one edit, so one undo takes back both.\n */\n inputs?: Record<string, ContractField | null>;\n /** AFD-273: an approval's approvers, notify and message, replacing them; null removes them. */\n approval?: ApprovalFields | null;\n}\n\n/** An approval's fields as written: names trimmed, empty and repeated ones left out. */\nexport function cleanApproval(fields: ApprovalFields): ApprovalFields {\n const names = (list?: string[]) => [\n ...new Set((list ?? []).map((n) => String(n).trim()).filter(Boolean)),\n ];\n const approvers = names(fields.approvers);\n const notify = names(fields.notify);\n const message = fields.message?.trim();\n return {\n ...(approvers.length ? { approvers } : {}),\n ...(notify.length ? { notify } : {}),\n ...(message ? { message } : {}),\n };\n}\n\n/** The settings a step may take at run time (AFD-112). */\nexport type RunTimeSetting = 'retries' | 'delay' | 'timeout';\n\nexport interface FlowPatch {\n name?: string;\n key?: string;\n goal?: string | null;\n owner?: string | null;\n /** The AWX job template the flow launches (M7 \"Set up AWX template\"); null removes runtime. */\n runtime?: NonNullable<FlowDocument['flow']['runtime']> | null;\n /** Timing lens (M8): `4h`, `2h30m`; null removes it. */\n maintenance_window?: string | null;\n /**\n * AFD-185: variables set outside the flow at run time, merged by name: name -> where it comes\n * from, null removes that name; null for the whole map removes them all.\n */\n external_vars?: Record<string, string | null> | null;\n}\n\nexport interface CommandContext {\n newId: IdFactory;\n}\n\nexport interface CommandResult {\n edits: TextEdit[];\n text: string;\n /** Parse of `text`, so the caller need not parse the result again. */\n file: YamlFile;\n created?: Ulid;\n /** Every node a paste created (AFD-17). */\n pasted?: Ulid[];\n /** Tested nodes the command changed, now implemented again (decision 15). */\n dropped?: Ulid[];\n /** What the command did besides what was asked (outputs lifted, AFD-21). */\n notes?: string[];\n}\n\nexport class CommandError extends Error {\n constructor(\n readonly code: string,\n message: string,\n ) {\n super(message);\n this.name = 'CommandError';\n }\n}\n\n/** A format refusal (newer file, already current, needs an upgrade) as the command's error. */\nexport function formatGuard<T>(run: () => T): T {\n try {\n return run();\n } catch (err) {\n if (err instanceof FormatError) throw new CommandError(err.code, err.message);\n throw err;\n }\n}\n\nconst FLOW_ORDER = [\n 'id',\n 'key',\n 'name',\n 'version',\n 'goal',\n 'owner',\n 'runtime',\n 'imported_from',\n 'maintenance_window',\n 'inputs',\n 'external_vars',\n];\nconst SUBFLOW_ORDER = ['nodes', 'edges', 'annotations', 'layout', 'boundary'];\nconst ROOT_ORDER = [\n 'schema_version',\n 'flow',\n 'nodes',\n 'edges',\n 'annotations',\n 'layout',\n 'decisions',\n];\n\nconst after = (order: readonly string[], key: string) => order.slice(order.indexOf(key) + 1);\n\ninterface State {\n doc: FlowDocument;\n model: FlowModel;\n}\n\nfunction state(tx: YamlTransaction): State {\n const doc = tx.current.doc.toJS() as FlowDocument;\n return { doc, model: buildModel(doc) };\n}\n\nfunction nodeAt(st: State, id: Ulid) {\n const entry = st.model.nodes.get(id);\n if (!entry) throw new CommandError('not-found', `No node ${id}`);\n return entry;\n}\n\nfunction levelOf(st: State, levelId: string): Level {\n const level = st.model.levels.get(levelId);\n if (!level) throw new CommandError('not-found', `No level ${levelId}`);\n return level;\n}\n\nfunction setField(\n tx: YamlTransaction,\n base: Path,\n key: string,\n value: YamlValue | undefined,\n order: readonly string[],\n): void {\n if (value === undefined) return;\n const current = tx.current.doc.getIn([...base, key]);\n if (value === null) {\n if (current !== undefined) tx.apply((f) => deleteKey(f, base, key));\n return;\n }\n tx.apply((f) => setIn(f, [...base, key], value, { before: after(order, key) }));\n}\n\n/** AFD-162: wires removed against one parse, one op per level; how many there were. */\nfunction removeEdgesAtOnce(tx: YamlTransaction, ids: readonly Ulid[]): number {\n const st = state(tx);\n const byList = new Map<string, { path: Path; idx: number[]; length: number }>();\n for (const id of new Set(ids)) {\n const entry = st.model.edges.get(id);\n if (!entry) continue;\n const path = entry.path.slice(0, -1);\n const level = st.model.levels.get(entry.level);\n const key = JSON.stringify(path);\n const list = byList.get(key) ?? { path, idx: [], length: level?.edges.length ?? 0 };\n list.idx.push(entry.path.at(-1) as number);\n byList.set(key, list);\n }\n const ops = [...byList.values()].flatMap((l) => removeIndexes(l.path, l.idx, l.length));\n if (ops.length) tx.applyAll(ops);\n return [...byList.values()].reduce((n, l) => n + l.idx.length, 0);\n}\n\nfunction removeEdgeById(tx: YamlTransaction, id: Ulid): void {\n const entry = state(tx).model.edges.get(id);\n if (!entry) throw new CommandError('not-found', `No edge ${id}`);\n tx.apply((f) => removeItem(f, entry.path.slice(0, -1), entry.path.at(-1) as number));\n}\n\nfunction contract(field: ContractField): YamlValue {\n const out: Record<string, YamlValue> = { type: field.type };\n if (field.required !== undefined) out.required = field.required;\n if (field.default !== undefined) out.default = field.default as YamlValue;\n if (field.from !== undefined) out.from = field.from;\n if (field.targets !== undefined) out.targets = field.targets;\n // AFD-100: AFD-95 read descriptions everywhere but this writer never kept one, so the flow\n // panel's box and the flow tools' set_io lost it. An empty one is no description.\n if (field.description) out.description = field.description;\n return out;\n}\n\ntype Op = (f: YamlFile) => OpResult;\n\n// Builders below return ops computed against one state, so a command can batch them into a single\n// re-parse (YamlTransaction.applyAll). Parsing dominates command latency.\n\nfunction enablePortOps(st: State, id: Ulid, port: string): Op[] {\n const { node, path } = nodeAt(st, id);\n if (portsFor(node).some((p) => p.name === port)) return [];\n // AFD-181: a named exit exists through the boundary output that names it.\n if (node.type === 'subflow' && isExitName(port)) return [];\n if (!optionalPortNames(node.type).includes(port)) {\n throw new CommandError('bad-port', `${node.type} nodes have no port \"${port}\"`);\n }\n if (LEGACY_PORTS.has(port))\n throw new CommandError(\n 'legacy-port',\n `The ${port} port was never built: ${port === 'undo' ? 'apply Rollback on the failure port, which wires an undo step per completed step' : 'a cancelled job routes no host'}`,\n );\n if (node.ports) return [(f) => insertItem(f, [...path, 'ports'], 'end', port)];\n return [(f) => setIn(f, [...path, 'ports'], [port], { before: after(NODE_ORDER, 'ports') })];\n}\n\nfunction ensurePortEnabled(tx: YamlTransaction, id: Ulid, port: string): void {\n tx.applyAll(enablePortOps(state(tx), id, port));\n}\n\nfunction reachable(level: Level, from: Ulid, to: Ulid): boolean {\n const seen = new Set<Ulid>();\n const stack = [from];\n while (stack.length > 0) {\n const n = stack.pop() as Ulid;\n if (n === to) return true;\n if (seen.has(n)) continue;\n seen.add(n);\n for (const e of level.edges) if (e?.from?.node === n) stack.push(e.to.node);\n }\n return false;\n}\n\n/** The output exists on the node and is not wired yet (03: one edge per output). */\nfunction checkOutput(st: State, from: PortRef): Level {\n const a = nodeAt(st, from.node);\n if (!isPortLegal(a.node, from.port) || portDirection(from.port) !== 'out') {\n throw new CommandError('bad-port', `\"${from.port}\" is not an output of ${a.node.type}`);\n }\n const level = levelOf(st, a.level);\n if (level.edges.some((e) => e?.from?.node === from.node && e.from.port === from.port)) {\n throw new CommandError(\n 'port-in-use',\n `${from.port} is already wired; use a parallel node to fan out`,\n );\n }\n const exit = exitOf(st, level, from);\n if (exit) {\n throw new CommandError(\n 'port-in-use',\n `${from.port} already leaves the subflow through ${exit}; remove that exit first`,\n );\n }\n return level;\n}\n\n/** The parent port an inner output leaves through (boundary.outputs), if any. */\nfunction exitOf(st: State, level: Level, from: PortRef): string | undefined {\n const parent = level.parent ? st.model.nodes.get(level.parent)?.node : undefined;\n for (const [port, refs] of Object.entries(parent?.subflow?.boundary?.outputs ?? {}))\n if ((refs ?? []).some((r) => r?.node === from.node && r.port === from.port)) return port;\n return undefined;\n}\n\n/** A subflow node with an inner graph, and the YAML path of its `subflow` block. */\nfunction subflowAt(st: State, id: Ulid): { node: FlowNode; level: Level; base: Path } {\n const { node, path } = nodeAt(st, id);\n if (node.type !== 'subflow') throw new CommandError('bad-type', `${node.title} is not a subflow`);\n const level = st.model.levels.get(id);\n if (!level) throw new CommandError('no-inner-graph', 'The subflow has no inner graph yet');\n return { node, level, base: [...path, 'subflow'] };\n}\n\n/** Ops that make `boundary` equal `next` (whole-block rewrite; the block is small). */\nfunction boundaryOps(st: State, id: Ulid, next: Boundary | undefined): Op[] {\n const { node, base } = subflowAt(st, id);\n const current = node.subflow?.boundary;\n const outputs = Object.fromEntries(\n Object.entries(next?.outputs ?? {}).filter(([, refs]) => (refs ?? []).length > 0),\n );\n const value: Record<string, YamlValue> = {};\n if (next?.in) value.in = next.in;\n if (Object.keys(outputs).length > 0)\n value.outputs = Object.fromEntries(\n Object.entries(outputs).map(([port, refs]) => [\n port,\n refs.map((r) => ({\n node: r.node,\n port: r.port,\n ...(r.reason ? { reason: r.reason } : {}),\n })),\n ]),\n );\n if (Object.keys(value).length === 0)\n return current === undefined ? [] : [(f) => deleteKey(f, base, 'boundary')];\n return [\n (f) => setIn(f, [...base, 'boundary'], value, { before: after(SUBFLOW_ORDER, 'boundary') }),\n ];\n}\n\nfunction edgeItem(ctx: CommandContext, from: PortRef, to: PortRef): Record<string, YamlValue> {\n return {\n id: ctx.newId(),\n from: { node: from.node, port: from.port },\n to: { node: to.node, port: to.port },\n };\n}\n\nfunction addEdge(tx: YamlTransaction, ctx: CommandContext, from: PortRef, to: PortRef): Ulid {\n const st = state(tx);\n const level = checkOutput(st, from);\n const b = nodeAt(st, to.node);\n if (b.level !== level.id)\n throw new CommandError('cross-level', 'Both ends must be in the same level');\n if (!isPortLegal(b.node, to.port) || portDirection(to.port) !== 'in') {\n throw new CommandError('bad-port', `\"${to.port}\" is not an input of ${b.node.type}`);\n }\n if (from.node === to.node || reachable(level, to.node, from.node)) {\n throw new CommandError('cycle', 'This edge would create a cycle');\n }\n const edge = edgeItem(ctx, from, to);\n tx.applyAll([\n ...enablePortOps(st, from.node, from.port),\n ...enablePortOps(st, to.node, to.port),\n (f) => insertItem(f, level.edgesPath, 'end', edge),\n // A wired port is no longer open: its open-on-purpose decision goes in the same edit.\n ...decisionRemovalOps(st, from.node, from.port),\n ]);\n return edge.id as Ulid;\n}\n\nfunction decisionRemovalOps(st: State, node: Ulid, port: string): Op[] {\n const decisions = st.doc.decisions ?? [];\n const idx = acceptedAll(st.doc)\n .filter((a) => a.area === 'port' && a.node === node && a.what === port)\n .map((a) => a.index);\n if (idx.length === 0) return [];\n if (idx.length === decisions.length) return [(f) => deleteKey(f, [], 'decisions')];\n return [(f) => removeItems(f, ['decisions'], idx)];\n}\n\nfunction positionOps(st: State, positions: Record<Ulid, Position>): Op[] {\n const rounded = Object.entries(positions).map(\n ([id, p]) => [id, { x: Math.round(p.x), y: Math.round(p.y) }] as const,\n );\n if (rounded.length === 0) return [];\n if (st.doc.layout === undefined || st.doc.layout === null) {\n const block: Record<string, YamlValue> = {};\n for (const [id, p] of rounded) block[id] = { x: p.x, y: p.y };\n return [(f) => setIn(f, ['layout'], block, { before: after(ROOT_ORDER, 'layout') })];\n }\n const ops: Op[] = [];\n for (const [id, p] of rounded) {\n const old = st.doc.layout[id];\n if (!old) {\n ops.push((f) => setIn(f, ['layout', id], { x: p.x, y: p.y }));\n continue;\n }\n if (old.x !== p.x) ops.push((f) => setIn(f, ['layout', id, 'x'], p.x));\n if (old.y !== p.y) ops.push((f) => setIn(f, ['layout', id, 'y'], p.y));\n }\n return ops;\n}\n\nfunction setPositions(tx: YamlTransaction, positions: Record<Ulid, Position>): void {\n tx.applyAll(positionOps(state(tx), positions));\n}\n\n/** Removes stored positions; the whole block goes when nothing is left in it. */\nfunction unplaceNodes(tx: YamlTransaction, ids: readonly Ulid[]): void {\n const layout = state(tx).doc.layout ?? {};\n const gone = ids.filter((id) => id in layout);\n if (gone.length === 0) return;\n if (gone.length === Object.keys(layout).length) tx.apply((f) => deleteKey(f, [], 'layout'));\n else tx.applyAll(gone.map((id) => (f: YamlFile) => deleteKey(f, ['layout'], id)));\n}\n\ninterface NodeSpec {\n parent?: Ulid;\n type: NodeType;\n title: string;\n key?: string;\n intent?: string;\n ports?: string[];\n purpose?: HandlerKind;\n outcome?: 'success' | 'failed';\n inputs?: Record<string, ContractField>;\n settings?: NodeSettings;\n impl?: ImplBinding;\n}\n\n/** A new node's YAML; `taken` holds the level's keys and receives the new one. */\nfunction nodeItem(\n ctx: CommandContext,\n spec: NodeSpec,\n taken: Set<string>,\n /** The document's name for what the node is for (AFD-52). */\n purpose: 'purpose' | 'handler' = 'handler',\n): { id: Ulid; item: Record<string, YamlValue> } {\n const key = spec.key ?? uniqueKey(slugify(spec.title), taken);\n checkKey(key, taken);\n taken.add(key);\n const id = ctx.newId();\n const node: Record<string, YamlValue> = { id, key, type: spec.type, title: spec.title };\n if (spec.type !== 'start' && spec.type !== 'end') node.status = 'draft';\n if (spec.intent) node.intent = spec.intent;\n if (spec.type === 'end') node.outcome = spec.outcome ?? 'success';\n if (spec.purpose) node[purpose] = spec.purpose;\n const offered = offeredPortNames(spec.type);\n const ports = (spec.ports ?? []).filter((p) => offered.includes(p));\n if (ports.length > 0) node.ports = ports;\n if (spec.inputs && Object.keys(spec.inputs).length > 0) {\n node.inputs = Object.fromEntries(Object.entries(spec.inputs).map(([k, v]) => [k, contract(v)]));\n }\n if (spec.settings && Object.keys(spec.settings).length > 0)\n node.settings = spec.settings as Record<string, YamlValue>;\n if (spec.impl) {\n node.impl = implValue(spec.impl);\n // AFD-232: born bound, so implemented (AFD-31); format 2 settles the status itself.\n if (node.status) node.status = 'implemented';\n }\n return { id, item: node };\n}\n\n/** A level and the levels around it, innermost first, up to the top level. */\nfunction levelChain(model: FlowModel, levelId: string): string[] {\n const out = [levelId];\n for (let at = levelId; at !== ROOT; ) {\n const up = model.nodes.get(at)?.level;\n if (up === undefined) break;\n out.push(up);\n at = up;\n }\n return out;\n}\n\n/**\n * AFD-143: the keys a new node on `levelId` would take over. keyScope resolves the innermost level\n * first, so a reference that sees this level (from it, or from inside one of its subflows) and now\n * reads a node of that key on an outer level would silently read the new node instead.\n */\nexport function shadowedKeys(model: FlowModel, levelId: string): Set<string> {\n const out = new Set<string>();\n for (const entry of model.nodes.values())\n for (const side of ['inputs', 'outputs'] as const) {\n const fields = Object.values(entry.node[side] ?? {});\n if (!fields.some((f) => f?.from)) continue;\n const at = readerLevel(model, entry.node, entry.level, side);\n const chain = levelChain(model, at);\n const here = chain.indexOf(levelId);\n if (here < 0) continue;\n const scope = keyScope(model, at);\n for (const field of fields) {\n const head = (field?.from ?? '').split('.')[0] ?? '';\n if (!head || head === 'flow' || head === 'impl' || head.includes('/')) continue;\n const target = scope.get(head);\n const targetLevel = target ? model.nodes.get(target)?.level : undefined;\n if (targetLevel !== undefined && chain.indexOf(targetLevel) > here) out.add(head);\n }\n }\n return out;\n}\n\n/** A level's keys plus the ones a new node there would take over (AFD-143). */\nclass TakenKeys extends Set<string> {\n constructor(\n own: Iterable<string>,\n readonly shadowed: ReadonlySet<string>,\n ) {\n super([...own, ...shadowed]);\n }\n}\n\n/** Refuses a key a node cannot take on its level; `taken` from levelKeys. */\nfunction checkKey(key: string, taken: ReadonlySet<string>): void {\n if (!SLUG.test(key)) throw new CommandError('bad-key', `Key \"${key}\" must be a lowercase slug`);\n if (taken instanceof TakenKeys && taken.shadowed.has(key))\n throw new CommandError(\n 'shadowing-key',\n `Key \"${key}\" would take over the references that read the \"${key}\" around this level: choose another key`,\n );\n if (taken.has(key))\n throw new CommandError('duplicate-key', `Key \"${key}\" is already used in this level`);\n}\n\n/**\n * The keys a new node on a level cannot take. With the model, also the keys it would take over\n * from outer levels (AFD-143): generated keys pass them by, a key given explicitly is refused.\n */\nfunction levelKeys(level: Level, model?: FlowModel): Set<string> {\n const own = level.nodes.flatMap((n) => (n?.key ? [n.key] : []));\n return model ? new TakenKeys(own, shadowedKeys(model, level.id)) : new Set(own);\n}\n\n/**\n * Inserts a new node into its level. The first step of a subflow creates the inner graph and\n * becomes the boundary entry (D-23), in the same edit.\n */\nfunction insertNode(tx: YamlTransaction, ctx: CommandContext, spec: NodeSpec): Ulid {\n const st = state(tx);\n if (!spec.parent) {\n const level = levelOf(st, ROOT);\n const { id, item } = nodeItem(ctx, spec, levelKeys(level, st.model), purposeKey(st.doc));\n tx.apply((f) => insertItem(f, level.nodesPath, 'end', item));\n return id;\n }\n const parent = spec.parent;\n const { node, path } = nodeAt(st, parent);\n if (node.type !== 'subflow') throw new CommandError('bad-type', `${node.title} is not a subflow`);\n const level = st.model.levels.get(parent);\n const { id, item } = nodeItem(\n ctx,\n spec,\n // An empty subflow has no level yet; its outputs may still read through to outer nodes.\n level ? levelKeys(level, st.model) : new TakenKeys([], shadowedKeys(st.model, parent)),\n purposeKey(st.doc),\n );\n const base = [...path, 'subflow'];\n const entry = !node.subflow?.nodes?.length && !node.subflow?.boundary?.in;\n if (!node.subflow) {\n const body: Record<string, YamlValue> = { nodes: [item] };\n if (entry) body.boundary = { in: id };\n tx.apply((f) => setIn(f, base, body, { before: after(NODE_ORDER, 'subflow') }));\n return id;\n }\n const ops: Op[] = [\n node.subflow.nodes\n ? (f) => insertItem(f, [...base, 'nodes'], 'end', item)\n : (f) => setIn(f, [...base, 'nodes'], [item], { before: after(SUBFLOW_ORDER, 'nodes') }),\n ];\n if (entry) ops.push(...boundaryOps(st, parent, { ...node.subflow.boundary, in: id }));\n tx.applyAll(ops);\n return id;\n}\n\nfunction addNode(\n tx: YamlTransaction,\n ctx: CommandContext,\n cmd: Extract<FlowCommand, { kind: 'addNode' }>,\n notes: string[],\n): Ulid {\n if (cmd.insertOn && cmd.connectFrom)\n throw new CommandError('bad-command', 'Use either insertOn or connectFrom');\n if (cmd.insertOn && !CONTINUES_ON[cmd.type]) {\n throw new CommandError('bad-type', `A ${cmd.type} node cannot be inserted on a wire`);\n }\n const id = insertNode(tx, ctx, cmd);\n liftPathRefs(tx, id, notes);\n setPositions(tx, { ...cmd.freeze, ...(cmd.position ? { [id]: cmd.position } : {}) });\n if (cmd.connectFrom) addEdge(tx, ctx, cmd.connectFrom, { node: id, port: 'in' });\n if (cmd.insertOn) insertOnEdge(tx, ctx, cmd.insertOn, id, CONTINUES_ON[cmd.type] as string);\n if (cmd.wireFailedTo)\n addEdge(tx, ctx, { node: id, port: 'failed_hosts' }, { node: cmd.wireFailedTo, port: 'in' });\n return id;\n}\n\n/** The edge keeps its ID and source and now ends at `node`; `node` continues to the old target. */\nfunction insertOnEdge(\n tx: YamlTransaction,\n ctx: CommandContext,\n edgeId: Ulid,\n node: Ulid,\n out: string,\n): void {\n const st = state(tx);\n const entry = st.model.edges.get(edgeId);\n if (!entry) throw new CommandError('not-found', `No edge ${edgeId}`);\n if (nodeAt(st, node).level !== entry.level)\n throw new CommandError('cross-level', 'The node and the wire must be in the same level');\n const target = { ...entry.edge.to };\n retarget(tx, entry.path, entry.edge.to, { node, port: 'in' });\n addEdge(tx, ctx, { node, port: out }, target);\n}\n\nfunction retarget(tx: YamlTransaction, edgePath: Path, from: PortRef, to: PortRef): void {\n const ops: ((f: YamlFile) => OpResult)[] = [];\n if (from.node !== to.node) ops.push((f) => setIn(f, [...edgePath, 'to', 'node'], to.node));\n if (from.port !== to.port) ops.push((f) => setIn(f, [...edgePath, 'to', 'port'], to.port));\n tx.applyAll(ops);\n}\n\nfunction rewire(tx: YamlTransaction, edgeId: Ulid, to: PortRef): void {\n const st = state(tx);\n const entry = st.model.edges.get(edgeId);\n if (!entry) throw new CommandError('not-found', `No edge ${edgeId}`);\n const { edge } = entry;\n const target = nodeAt(st, to.node);\n if (target.level !== entry.level)\n throw new CommandError('cross-level', 'Both ends must be in the same level');\n if (!isPortLegal(target.node, to.port) || portDirection(to.port) !== 'in') {\n throw new CommandError('bad-port', `\"${to.port}\" is not an input of ${target.node.type}`);\n }\n if (edge.to.node === to.node && edge.to.port === to.port) return;\n const level = levelOf(st, entry.level);\n const without = { ...level, edges: level.edges.filter((e) => e?.id !== edgeId) };\n if (to.node === edge.from.node || reachable(without, to.node, edge.from.node)) {\n throw new CommandError('cycle', 'This edge would create a cycle');\n }\n retarget(tx, entry.path, edge.to, to);\n ensurePortEnabled(tx, to.node, to.port);\n}\n\n/** AFD-233: the wire's source end moves to another output, open and on the same level. */\nfunction rewireFrom(tx: YamlTransaction, edgeId: Ulid, from: PortRef): void {\n const st = state(tx);\n const entry = st.model.edges.get(edgeId);\n if (!entry) throw new CommandError('not-found', `No edge ${edgeId}`);\n const { edge } = entry;\n if (edge.from.node === from.node && edge.from.port === from.port) return;\n const level = checkOutput(st, from);\n if (level.id !== entry.level)\n throw new CommandError('cross-level', 'Both ends must be in the same level');\n const without = { ...level, edges: level.edges.filter((e) => e?.id !== edgeId) };\n if (from.node === edge.to.node || reachable(without, edge.to.node, from.node)) {\n throw new CommandError('cycle', 'This edge would create a cycle');\n }\n const ops: Op[] = [];\n if (from.node !== edge.from.node)\n ops.push((f) => setIn(f, [...entry.path, 'from', 'node'], from.node));\n if (from.port !== edge.from.port)\n ops.push((f) => setIn(f, [...entry.path, 'from', 'port'], from.port));\n tx.applyAll(ops);\n ensurePortEnabled(tx, from.node, from.port);\n const dropped = decisionRemovalOps(state(tx), from.node, from.port);\n if (dropped.length) tx.applyAll(dropped);\n}\n\n/** AFD-242: `disabled: true` on the nodes, or the key removed. */\nfunction setDisabled(tx: YamlTransaction, ids: readonly Ulid[], disabled: boolean): void {\n for (const id of ids) {\n const { node, path } = nodeAt(state(tx), id);\n if (!canDisable(node))\n throw new CommandError('bad-type', `A ${node.type} node cannot be disabled`);\n if ((node.disabled === true) === disabled) continue;\n setField(tx, path, 'disabled', disabled ? true : null, NODE_ORDER);\n }\n}\n\n/** AFD-234: a free-standing node goes into a wire, as a new one does (insertOnEdge). */\nfunction spliceNode(\n tx: YamlTransaction,\n ctx: CommandContext,\n cmd: Extract<FlowCommand, { kind: 'spliceNode' }>,\n): void {\n const st = state(tx);\n const { node } = nodeAt(st, cmd.node);\n const problem = spliceProblem(st.model, cmd.node, cmd.edge);\n if (problem) throw new CommandError('bad-command', problem);\n if (cmd.positions) setPositions(tx, cmd.positions);\n insertOnEdge(tx, ctx, cmd.edge, cmd.node, CONTINUES_ON[node.type] as string);\n}\n\n/**\n * AFD-235: the path closes over nodes about to leave it (core/flow/heal): each wire into them is\n * re-pointed, or takes over the exit they left the subflow by; an entry moves to the next step.\n */\nfunction healAround(\n tx: YamlTransaction,\n ids: readonly Ulid[],\n goneEdges: readonly Ulid[],\n notes: string[],\n): void {\n const plan = healPlan(state(tx).model, ids, goneEdges);\n for (const w of plan.wires) {\n const entry = state(tx).model.edges.get(w.edge);\n if (entry) retarget(tx, entry.path, entry.edge.to, w.to);\n }\n for (const x of plan.exits) {\n removeEdgeById(tx, x.edge);\n const st = state(tx);\n const boundary = subflowAt(st, x.subflow).node.subflow?.boundary ?? {};\n const ref = { node: x.from.node, port: x.from.port, ...(x.reason ? { reason: x.reason } : {}) };\n tx.applyAll(\n boundaryOps(st, x.subflow, {\n ...boundary,\n outputs: { ...boundary.outputs, [x.port]: [...(boundary.outputs?.[x.port] ?? []), ref] },\n }),\n );\n }\n for (const e of plan.entries) setBoundaryIn(tx, { kind: 'setBoundaryIn', ...e });\n const said = healSummary(plan);\n if (said) notes.push(said);\n}\n\n/** AFD-235: the nodes stand free: the path closes behind them and their outside wires go. */\nfunction detachNodes(tx: YamlTransaction, ids: readonly Ulid[], notes: string[]): void {\n const first = state(tx);\n const out = new Set(ids);\n for (const id of ids) nodeAt(first, id);\n healAround(tx, ids, [], notes);\n const st = state(tx);\n const loose: Ulid[] = [];\n const levels = new Set(ids.map((id) => nodeAt(st, id).level));\n for (const levelId of levels) {\n const level = levelOf(st, levelId);\n for (const e of level.edges)\n if (e && out.has(e.from?.node) !== out.has(e.to?.node)) loose.push(e.id);\n }\n removeEdgesAtOnce(tx, loose);\n // The detached nodes no longer start the subflow, nor leave it.\n for (const levelId of levels) {\n const now = state(tx);\n const level = levelOf(now, levelId);\n const parent = level.parent ? now.model.nodes.get(level.parent)?.node : undefined;\n const boundary = parent?.subflow?.boundary;\n if (!parent || !boundary) continue;\n const outputs = Object.fromEntries(\n Object.entries(boundary.outputs ?? {}).map(([p, refs]) => [\n p,\n (refs ?? []).filter((r) => !out.has(r?.node as string)),\n ]),\n );\n const changed =\n out.has(boundary.in as string) ||\n Object.entries(outputs).some(([p, refs]) => refs.length !== boundary.outputs?.[p]?.length);\n if (changed)\n tx.applyAll(\n boundaryOps(now, parent.id, {\n in: out.has(boundary.in as string) ? undefined : boundary.in,\n outputs,\n }),\n );\n }\n}\n\nfunction applyPattern(\n tx: YamlTransaction,\n ctx: CommandContext,\n cmd: Extract<FlowCommand, { kind: 'applyPattern' }>,\n notes: string[],\n): Ulid | undefined {\n const st = state(tx);\n const source = nodeAt(st, cmd.from.node);\n if (!patternFits(cmd.pattern, source.node, cmd.from.port)) {\n throw new CommandError(\n 'pattern-port',\n `\"${cmd.pattern}\" does not fit ${source.node.type} port ${cmd.from.port}`,\n );\n }\n const level = checkOutput(st, cmd.from);\n const recipe = recipeFor(cmd.pattern, source.node, cmd.from.port, level);\n const chosen = cmd.end ? level.nodes.find((n) => n?.id === cmd.end) : undefined;\n if (cmd.end) {\n if (!recipe.end)\n throw new CommandError(\n 'bad-end',\n recipe.reuse\n ? `\"${cmd.pattern}\" reuses ${recipe.reuse.key} here, which is wired already; it takes no end`\n : `\"${cmd.pattern}\" wires to no end node`,\n );\n if (chosen?.type !== 'end')\n throw new CommandError('bad-end', 'The end must be an end node on the same level');\n if ((chosen.outcome ?? 'success') !== recipe.end.outcome)\n throw new CommandError(\n 'bad-end',\n `\"${cmd.pattern}\" ends hosts with outcome ${recipe.end.outcome}, and ${chosen.key} has outcome ${chosen.outcome ?? 'success'}`,\n );\n }\n if (recipe.reuse) {\n setPositions(tx, cmd.freeze ?? {});\n addEdge(tx, ctx, cmd.from, { node: recipe.reuse.id, port: 'in' });\n return undefined;\n }\n // Retry adds no step (AFD-52): the source's own task tries again, and the hosts that still fail\n // leave by the same port, which stays open until something handles them.\n if (recipe.source) {\n const have = source.node.settings ?? {};\n const add = Object.fromEntries(\n Object.entries(recipe.source).filter(([k]) => have[k as keyof NodeSettings] === undefined),\n );\n setPositions(tx, cmd.freeze ?? {});\n if (Object.keys(add).length > 0)\n updateNode(tx, { kind: 'updateNode', id: source.node.id, patch: { settings: add } }, notes);\n const s = { ...recipe.source, ...have };\n notes.push(\n `${cmd.pattern}: ${source.node.key} tries again up to ${s.retries} times, ${s.delay ?? 5}${typeof s.delay === 'string' ? '' : ' s'} apart; hosts that still fail leave by ${cmd.from.port}`,\n );\n return undefined;\n }\n // Every new node and edge is computed against this one state and written in one batch.\n const taken = levelKeys(level, st.model);\n const nodes: Record<string, YamlValue>[] = [];\n const edges: Record<string, YamlValue>[] = [];\n const positions: Record<Ulid, Position> = { ...cmd.freeze };\n let handler: Ulid | undefined;\n if (recipe.node) {\n const created = nodeItem(ctx, recipe.node, taken, purposeKey(st.doc));\n if (recipe.steps?.length)\n created.item.subflow = chainBody(ctx, recipe.steps, purposeKey(st.doc));\n nodes.push(created.item);\n handler = created.id;\n if (cmd.position) positions[handler] = cmd.position;\n }\n let end = recipe.end ? (chosen ?? findEnd(level, recipe.end))?.id : undefined;\n if (end) {\n const key = level.nodes.find((n) => n?.id === end)?.key;\n notes.push(`${cmd.pattern}: the hosts end at ${key} (an existing end node)`);\n }\n if (recipe.end && !end) {\n const { title, outcome } = recipe.end;\n const created = nodeItem(ctx, { type: 'end', title, outcome }, taken);\n nodes.push(created.item);\n end = created.id;\n notes.push(`${cmd.pattern}: the hosts end at ${created.item.key} (a new end node)`);\n if (cmd.position) {\n positions[end] = handler\n ? { x: cmd.position.x, y: cmd.position.y + END_BELOW }\n : cmd.position;\n }\n }\n const first = handler ?? end;\n if (!first) throw new CommandError('bad-pattern', `Pattern \"${cmd.pattern}\" creates nothing`);\n edges.push(edgeItem(ctx, cmd.from, { node: first, port: 'in' }));\n if (handler && end && recipe.end) {\n for (const port of recipe.end.from)\n edges.push(edgeItem(ctx, { node: handler, port }, { node: end, port: 'in' }));\n }\n if (handler && recipe.rejoin) {\n const port = recipe.rejoin.sourcePort;\n const to = level.edges.find((e) => e?.from?.node === cmd.from.node && e.from.port === port)?.to;\n if (to) edges.push(edgeItem(ctx, { node: handler, port: recipe.rejoin.port }, to));\n }\n // Order matters where inserts share an offset: a port added to the last node precedes the new\n // nodes, and new edges precede a layout block created right after the edges.\n tx.applyAll([\n ...enablePortOps(st, cmd.from.node, cmd.from.port),\n ...nodes.map((item) => (f: YamlFile) => insertItem(f, level.nodesPath, 'end', item)),\n ...edges.map((item) => (f: YamlFile) => insertItem(f, level.edgesPath, 'end', item)),\n ...positionOps(st, positions),\n ...decisionRemovalOps(st, cmd.from.node, cmd.from.port),\n ]);\n return first;\n}\n\n/**\n * A new subflow's inner level (AFD-54): the steps wired one after another on ok_hosts, the first\n * the entry and the last one's ok_hosts the exit; their failed hosts bubble to the subflow's port.\n */\nfunction chainBody(\n ctx: CommandContext,\n steps: NodeRecipe[],\n purpose: 'purpose' | 'handler',\n): Record<string, YamlValue> {\n const taken = new Set<string>();\n const items = steps.map((s) => {\n const { impl, ...spec } = s;\n const made = nodeItem(ctx, spec, taken, purpose);\n if (impl) {\n made.item.status = 'implemented';\n made.item.impl = implValue(impl);\n }\n return made;\n });\n const edges = items\n .slice(1)\n .map((b, i) =>\n edgeItem(ctx, { node: items[i]?.id as Ulid, port: 'ok_hosts' }, { node: b.id, port: 'in' }),\n );\n const first = items[0]?.id as Ulid;\n const last = items[items.length - 1]?.id as Ulid;\n return {\n nodes: items.map((i) => i.item),\n ...(edges.length > 0 ? { edges } : {}),\n boundary: { in: first, outputs: { ok_hosts: [{ node: last, port: 'ok_hosts' }] } },\n };\n}\n\n/** Vertical gap between a pattern's handler and the end node created for it. */\nconst END_BELOW = 150;\n\nfunction setDecision(\n tx: YamlTransaction,\n cmd: Extract<FlowCommand, { kind: 'setDecision' }>,\n): void {\n const st = state(tx);\n const { node, level } = nodeAt(st, cmd.node);\n if (!isFailPort(cmd.port) || !portsFor(node).some((p) => p.name === cmd.port)) {\n throw new CommandError('bad-port', `${cmd.port} is not a fail port of ${node.type}`);\n }\n if (\n levelOf(st, level).edges.some((e) => e?.from?.node === cmd.node && e.from.port === cmd.port)\n ) {\n throw new CommandError('port-connected', `${cmd.port} is wired, so it is not open`);\n }\n const reason = cmd.reason.trim();\n if (!reason) throw new CommandError('no-reason', 'Say why the port stays open');\n const decisions = st.doc.decisions ?? [];\n const index = portAccepted(st.doc, cmd.node, cmd.port)?.index ?? -1;\n if (index >= 0) {\n const base: Path = ['decisions', index];\n const old = decisions[index];\n const ops: ((f: YamlFile) => OpResult)[] = [];\n if (old?.reason !== reason)\n ops.push((f) => setIn(f, [...base, 'reason'], reason, { before: ['by'] }));\n if (cmd.by && old?.by !== cmd.by) ops.push((f) => setIn(f, [...base, 'by'], cmd.by as string));\n tx.applyAll(ops);\n return;\n }\n addDecision(tx, decisionItem(st.doc, 'port', cmd.port, cmd.node, reason, cmd.by));\n}\n\n/** A decision item at the end of `decisions` (AFD-51: in the document's format). */\nfunction addDecision(tx: YamlTransaction, item: Record<string, YamlValue>): void {\n if (state(tx).doc.decisions) tx.apply((f) => insertItem(f, ['decisions'], 'end', item));\n else tx.apply((f) => setIn(f, ['decisions'], [item], { before: after(ROOT_ORDER, 'decisions') }));\n}\n\n/** Removes the decisions at these indexes of `decisions` (the key itself when none is left). */\nfunction removeDecisions(tx: YamlTransaction, idx: readonly number[]): void {\n const count = state(tx).doc.decisions?.length ?? 0;\n if (idx.length === 0) return;\n if (idx.length === count) tx.apply((f) => deleteKey(f, [], 'decisions'));\n else tx.apply((f) => removeItems(f, ['decisions'], idx));\n}\n\n/**\n * The same decision again updates its reason and author (AFD-51: any area, either format), else a\n * new one is added.\n */\nfunction recordDecision(\n tx: YamlTransaction,\n area: DecisionArea,\n what: string,\n node: Ulid | undefined,\n reason: string,\n by: string | undefined,\n): void {\n const st = state(tx);\n const index = findAccepted(st.doc, area, what, node)?.index ?? -1;\n if (index >= 0) {\n const base: Path = ['decisions', index];\n const ops: ((f: YamlFile) => OpResult)[] = [\n (f) => setIn(f, [...base, 'reason'], reason, { before: ['by'] }),\n ];\n if (by) ops.push((f) => setIn(f, [...base, 'by'], by));\n tx.applyAll(ops);\n return;\n }\n addDecision(tx, decisionItem(st.doc, area, what, node, reason, by));\n}\n\nfunction renameKey(tx: YamlTransaction, id: Ulid, newKey: string): void {\n const st = state(tx);\n const { node, path, level } = nodeAt(st, id);\n if (newKey === node.key) return;\n checkKey(newKey, levelKeys(levelOf(st, level), st.model));\n const oldKey = node.key;\n // `from:` references keys, not IDs: rewrite every reference that resolves to this node.\n const rewrites: { path: Path; value: string }[] = [];\n for (const entry of st.model.nodes.values()) {\n for (const side of ['inputs', 'outputs'] as const) {\n // AFD-142: a subflow's outputs read its inner level, as resolveFrom resolves them.\n const at = readerLevel(st.model, entry.node, entry.level, side);\n if (keyScope(st.model, at).get(oldKey) !== id) continue;\n for (const [name, field] of Object.entries(entry.node[side] ?? {})) {\n const from = field?.from;\n if (from === oldKey || from?.startsWith(`${oldKey}.`)) {\n rewrites.push({\n path: [...entry.path, side, name, 'from'],\n value: newKey + from.slice(oldKey.length),\n });\n }\n }\n }\n }\n tx.applyAll([\n (f) => setIn(f, [...path, 'key'], newKey),\n ...rewrites.map((r) => (f: YamlFile) => setIn(f, r.path, r.value)),\n ]);\n}\n\nfunction updateNode(\n tx: YamlTransaction,\n cmd: Extract<FlowCommand, { kind: 'updateNode' }>,\n notes: string[],\n): void {\n const { patch } = cmd;\n if (patch.key !== undefined) renameKey(tx, cmd.id, patch.key);\n const { path } = nodeAt(state(tx), cmd.id);\n if (patch.title !== undefined && patch.title.trim() === '') {\n throw new CommandError('bad-title', 'Title must not be empty');\n }\n setField(tx, path, 'title', patch.title, NODE_ORDER);\n // `tested` by hand takes a reason (markTested, AFD-44); another status drops that record.\n if (patch.status === 'tested')\n throw new CommandError('needs-reason', 'Say why it counts as tested');\n for (const k of ['intent', 'condition', 'outcome', 'join_mode', 'branches'] as const) {\n setField(tx, path, k, patch[k] as YamlValue | undefined, NODE_ORDER);\n }\n if (patch.disabled !== undefined) setDisabled(tx, [cmd.id], patch.disabled === true);\n // Format 1 calls it handler (AFD-52); a format 1 name left in a format 2 node goes with the edit.\n if (patch.purpose !== undefined) {\n const key = purposeKey(state(tx).doc);\n setField(tx, path, key, patch.purpose as YamlValue, NODE_ORDER);\n if (key === 'purpose' && state(tx).model.nodes.get(cmd.id)?.node.handler !== undefined)\n setField(tx, path, 'handler', null, NODE_ORDER);\n }\n // Format 2: the status follows what the node has (AFD-50); the one status to set by hand is the\n // one its content gives, which clears `tested` (Clear Tested). Format 1 sets what it is told.\n if (patch.status) {\n const st = state(tx);\n const now = nodeAt(st, cmd.id).node;\n const content = contentStatus(now);\n if (formatOf(st.doc) >= 2 && patch.status !== content)\n throw new CommandError(\n 'status-follows-content',\n `${now.title} is ${content} by what it has: inputs or outputs make a step specified, a binding implemented, and a passing run (or Mark Tested\u2026 with a reason) tested`,\n );\n dropTestedRecords(tx, [cmd.id]);\n setField(tx, path, 'status', patch.status, NODE_ORDER);\n }\n if (patch.settings) {\n for (const [k, v] of Object.entries(patch.settings)) {\n const current = state(tx);\n const node = nodeAt(current, cmd.id).node;\n if (v === null) {\n if (node.settings && k in node.settings) {\n if (Object.keys(node.settings).length === 1)\n tx.apply((f) => deleteKey(f, path, 'settings'));\n else tx.apply((f) => deleteKey(f, [...path, 'settings'], k));\n }\n } else if (v !== undefined) {\n if (node.settings) tx.apply((f) => setIn(f, [...path, 'settings', k], v as YamlValue));\n else setField(tx, path, 'settings', { [k]: v as YamlValue }, NODE_ORDER);\n }\n }\n }\n if (patch.approval !== undefined) {\n const node = nodeAt(state(tx), cmd.id).node;\n if (patch.approval !== null && node.type !== 'approval')\n throw new CommandError(\n 'not-approval',\n `${node.title} is not an approval: approvers, notify and message belong to approval nodes`,\n );\n const fields = patch.approval ? cleanApproval(patch.approval) : {};\n setField(\n tx,\n path,\n 'approval',\n Object.keys(fields).length ? (fields as YamlValue) : null,\n NODE_ORDER,\n );\n }\n for (const [name, field] of Object.entries(patch.inputs ?? {}))\n setContractField(\n tx,\n { kind: 'setContractField', target: cmd.id, side: 'inputs', name, field },\n notes,\n );\n if (patch.keywords !== undefined) {\n const impl = nodeAt(state(tx), cmd.id).node.impl;\n if (!impl || impl.kind === 'playbook')\n throw new CommandError(\n 'no-binding',\n 'Task keywords need a module or role binding: bind the node first',\n );\n const keywords = patch.keywords && Object.keys(patch.keywords).length ? patch.keywords : null;\n if (keywords) tx.apply((f) => setIn(f, [...path, 'impl', 'keywords'], keywords as YamlValue));\n else if (impl.keywords) tx.apply((f) => deleteKey(f, [...path, 'impl'], 'keywords'));\n }\n}\n\n/** Ops removing the given indexes of a sequence (or emptying it) against one parse. */\nfunction removeIndexes(\n seqPath: Path,\n indexes: number[],\n length: number,\n): ((f: YamlFile) => OpResult)[] {\n if (indexes.length === 0) return [];\n if (indexes.length === length) return [(f) => setIn(f, seqPath, [])];\n return [(f) => removeItems(f, seqPath, indexes)];\n}\n\n/**\n * AFD-162: a selection deleted against one parse. Deleting node by node parsed the document and\n * built the model again per node, so select-all and delete on a few hundred nodes blocked the\n * extension host. A node inside a deleted subflow goes with it. The regions (each level's edges\n * and nodes, its annotations, the parent's boundary, decisions, layout) are disjoint, except where\n * a flow-style list is rendered again whole: then applyAll refuses the overlap and the caller\n * deletes node by node. Returns how many nodes were asked for and found.\n */\nfunction deleteNodesAtOnce(tx: YamlTransaction, ids: readonly Ulid[]): number {\n const st = state(tx);\n const asked = new Set(ids.filter((id) => st.model.nodes.has(id)));\n const insideAsked = (id: Ulid) => {\n for (let at = st.model.nodes.get(id)?.level; at && at !== ROOT; ) {\n if (asked.has(at)) return true;\n at = st.model.nodes.get(at)?.level;\n }\n return false;\n };\n const top = [...asked].filter((id) => !insideAsked(id));\n if (top.length === 0) return 0;\n const gone = new Set<Ulid>();\n const byLevel = new Map<string, Ulid[]>();\n for (const id of top) {\n const entry = nodeAt(st, id);\n gone.add(id);\n for (const d of descendantIds(entry.node)) gone.add(d);\n byLevel.set(entry.level, [...(byLevel.get(entry.level) ?? []), id]);\n }\n const ops: Op[] = [];\n for (const [levelId, members] of byLevel) {\n const level = levelOf(st, levelId);\n const here = new Set<string>(members);\n const keys = new Set(members.map((id) => nodeAt(st, id).node.key));\n const edgeIdx = level.edges\n .map((e, i) =>\n e && (here.has(e.from?.node as string) || here.has(e.to?.node as string)) ? i : -1,\n )\n .filter((i) => i >= 0);\n ops.push(...removeIndexes(level.edgesPath, edgeIdx, level.edges.length));\n const nodeIdx = members.map((id) => nodeAt(st, id).path.at(-1) as number);\n ops.push(...removeIndexes(level.nodesPath, nodeIdx, level.nodes.length));\n // AFD-64: the Notes on a node go with it (those inside it go with its body).\n const tied = level.annotations.filter(\n (a) => a && (here.has(a.on as string) || keys.has(a.on as string)),\n );\n ops.push(...removeAnnotationOps(level, new Set(tied.map((a) => a.id))));\n const parent = level.parent ? st.model.nodes.get(level.parent)?.node : undefined;\n const boundary = parent?.subflow?.boundary;\n if (parent && boundary && !gone.has(parent.id)) {\n const outputs = Object.fromEntries(\n Object.entries(boundary.outputs ?? {}).map(([p, refs]) => [\n p,\n (refs ?? []).filter((r) => !here.has(r?.node as string)),\n ]),\n );\n const changed =\n here.has(boundary.in as string) ||\n Object.entries(outputs).some(([p, refs]) => refs.length !== boundary.outputs?.[p]?.length);\n if (changed)\n ops.push(\n ...boundaryOps(st, parent.id, {\n in: here.has(boundary.in as string) ? undefined : boundary.in,\n outputs,\n }),\n );\n }\n }\n const decisions = st.doc.decisions ?? [];\n const decisionIdx = decisions\n .map((d, i) => (d?.node && gone.has(d.node) ? i : -1))\n .filter((i) => i >= 0);\n if (decisionIdx.length > 0 && decisionIdx.length === decisions.length)\n ops.push((f) => deleteKey(f, [], 'decisions'));\n else if (decisionIdx.length) ops.push((f) => removeItems(f, ['decisions'], decisionIdx));\n const layout = st.doc.layout ?? {};\n const layoutIds = [...gone].filter((x) => x in layout);\n if (layoutIds.length > 0 && layoutIds.length === Object.keys(layout).length)\n ops.push((f) => deleteKey(f, [], 'layout'));\n else ops.push(...layoutIds.map((lid) => (f: YamlFile) => deleteKey(f, ['layout'], lid)));\n tx.applyAll(ops);\n return top.length;\n}\n\n/** A field whose from: reads a node a delete removes (AFD-193). */\ninterface DanglingRef {\n node: Ulid;\n side: 'inputs' | 'outputs';\n name: string;\n /** What it read, for the note. */\n read: string;\n}\n\n/**\n * AFD-193: the fields that read what a delete removes: subflow outputs that lift a deleted step\n * (and, in turn, whatever reads those outputs), and inputs whose from: names a deleted node.\n */\nfunction danglingRefs(st: State, ids: readonly Ulid[]): DanglingRef[] {\n const gone = new Set<Ulid>();\n for (const id of ids) {\n const entry = st.model.nodes.get(id);\n if (!entry) continue;\n gone.add(id);\n for (const d of descendantIds(entry.node)) gone.add(d);\n }\n if (gone.size === 0) return [];\n const out: DanglingRef[] = [];\n const dead = new Set<string>();\n const reads = (node: FlowNode, level: string, side: 'inputs' | 'outputs', name: string) => {\n const field = node[side]?.[name];\n if (side === 'outputs' && node.type === 'subflow' && !field?.from) {\n const lift = liftOf(node, name);\n return lift && 'inner' in lift ? { node: lift.inner.id, output: lift.output } : undefined;\n }\n if (!field?.from) return undefined;\n const src = resolveFrom(st.model, node, level, side, field.from);\n return src.kind === 'output' ? { node: src.node.id, output: src.name ?? '' } : undefined;\n };\n // Repeat until nothing more falls: a lifted output that goes takes its readers with it.\n for (let grew = true; grew; ) {\n grew = false;\n for (const { node, level } of st.model.nodes.values()) {\n if (gone.has(node.id)) continue;\n for (const side of ['inputs', 'outputs'] as const)\n for (const name of Object.keys(node[side] ?? {})) {\n const id = `${node.id}|${side}|${name}`;\n if (dead.has(id)) continue;\n const t = reads(node, level, side, name);\n if (!t || !(gone.has(t.node) || dead.has(`${t.node}|outputs|${t.output}`))) continue;\n dead.add(id);\n grew = true;\n out.push({\n node: node.id,\n side,\n name,\n read: node[side]?.[name]?.from ?? `${st.model.nodes.get(t.node)?.node.key}.${t.output}`,\n });\n }\n }\n }\n return out;\n}\n\n/**\n * AFD-193: after a delete, a subflow output that lifted a deleted step goes, and a field that read\n * a deleted node keeps no from (input-unfed then names it), each with a note.\n */\nfunction dropDangling(tx: YamlTransaction, refs: DanglingRef[], notes: string[]): void {\n if (refs.length === 0) return;\n const st = state(tx);\n const ops: Op[] = [];\n for (const r of refs) {\n const entry = st.model.nodes.get(r.node);\n if (!entry?.node[r.side]?.[r.name]) continue;\n if (r.side === 'outputs' && entry.node.type === 'subflow') {\n const all = Object.keys(entry.node.outputs ?? {});\n ops.push((f) =>\n all.length === 1\n ? deleteKey(f, entry.path, 'outputs')\n : deleteKey(f, [...entry.path, 'outputs'], r.name),\n );\n notes.push(`Removed output ${entry.node.key}.${r.name}: it lifted ${r.read}, which is gone`);\n } else {\n ops.push((f) => deleteKey(f, [...entry.path, r.side, r.name], 'from'));\n notes.push(\n `${entry.node.key}.${r.side}.${r.name} read ${r.read}, which is gone: it has no from now`,\n );\n }\n }\n if (ops.length) tx.applyAll(ops);\n}\n\nfunction deleteNode(tx: YamlTransaction, id: Ulid): void {\n // Everything below is computed against one parse: the regions (edges, decisions, layout, the\n // node itself) are disjoint, so one batch replaces a re-parse per removed item.\n const st = state(tx);\n const { level: levelId, path, node } = nodeAt(st, id);\n const level = levelOf(st, levelId);\n const ops: ((f: YamlFile) => OpResult)[] = [];\n\n const edgeIdx = level.edges\n .map((e, i) => (e && (e.from?.node === id || e.to?.node === id) ? i : -1))\n .filter((i) => i >= 0);\n ops.push(...removeIndexes(level.edgesPath, edgeIdx, level.edges.length));\n\n // The node, every step of its inner levels, and its place in an enclosing boundary.\n const gone = new Set([id, ...descendantIds(node)]);\n const decisions = st.doc.decisions ?? [];\n const decisionIdx = decisions\n .map((d, i) => (d?.node && gone.has(d.node) ? i : -1))\n .filter((i) => i >= 0);\n if (decisionIdx.length > 0 && decisionIdx.length === decisions.length) {\n ops.push((f) => deleteKey(f, [], 'decisions'));\n } else {\n if (decisionIdx.length) ops.push((f) => removeItems(f, ['decisions'], decisionIdx));\n }\n\n const layout = st.doc.layout ?? {};\n const layoutIds = [...gone].filter((x) => x in layout);\n if (layoutIds.length > 0 && layoutIds.length === Object.keys(layout).length) {\n ops.push((f) => deleteKey(f, [], 'layout'));\n } else {\n ops.push(...layoutIds.map((lid) => (f: YamlFile) => deleteKey(f, ['layout'], lid)));\n }\n\n ops.push(...removeIndexes(path.slice(0, -1), [path.at(-1) as number], level.nodes.length));\n\n // AFD-64: the Notes on the node go with it (those inside it go with its body).\n const tied = level.annotations.filter((a) => a?.on === id || a?.on === node.key);\n ops.push(...removeAnnotationOps(level, new Set(tied.map((a) => a.id))));\n\n const parent = level.parent ? st.model.nodes.get(level.parent)?.node : undefined;\n const boundary = parent?.subflow?.boundary;\n if (parent && boundary) {\n const outputs = Object.fromEntries(\n Object.entries(boundary.outputs ?? {}).map(([p, refs]) => [\n p,\n (refs ?? []).filter((r) => r?.node !== id),\n ]),\n );\n const changed =\n boundary.in === id ||\n Object.entries(outputs).some(([p, refs]) => refs.length !== boundary.outputs?.[p]?.length);\n if (changed)\n ops.push(\n ...boundaryOps(st, parent.id, {\n in: boundary.in === id ? undefined : boundary.in,\n outputs,\n }),\n );\n }\n tx.applyAll(ops);\n}\n\nfunction setPortEnabled(\n tx: YamlTransaction,\n cmd: Extract<FlowCommand, { kind: 'setPortEnabled' }>,\n): void {\n const st = state(tx);\n const { node, path, level } = nodeAt(st, cmd.node);\n if (!optionalPortNames(node.type).includes(cmd.port)) {\n throw new CommandError('bad-port', `\"${cmd.port}\" is not an optional port of ${node.type}`);\n }\n if (cmd.enabled) {\n ensurePortEnabled(tx, cmd.node, cmd.port);\n return;\n }\n const index = node.ports?.indexOf(cmd.port) ?? -1;\n if (index < 0) return;\n const lvl = levelOf(st, level);\n const exits = node.subflow?.boundary?.outputs?.[cmd.port] ?? [];\n if (\n exits.length > 0 ||\n exitOf(st, lvl, { node: cmd.node, port: cmd.port }) ||\n lvl.edges.some(\n (e) =>\n (e?.from?.node === cmd.node && e.from.port === cmd.port) ||\n (e?.to?.node === cmd.node && e.to.port === cmd.port),\n )\n ) {\n throw new CommandError('port-connected', `Disconnect ${cmd.port} before disabling it`);\n }\n if (node.ports?.length === 1) tx.apply((f) => deleteKey(f, path, 'ports'));\n else tx.apply((f) => removeItem(f, [...path, 'ports'], index));\n}\n\n/** The binding as stored: fields in data-model order, empty params and register left out. */\nfunction implValue(impl: ImplBinding): YamlValue {\n const out: Record<string, YamlValue> = { kind: impl.kind, ref: impl.ref };\n if (impl.collection_version) out.collection_version = impl.collection_version;\n if (impl.params && Object.keys(impl.params).length > 0) out.params = impl.params as YamlValue;\n if (impl.register) out.register = impl.register;\n if (impl.keywords && Object.keys(impl.keywords).length > 0)\n out.keywords = impl.keywords as YamlValue;\n return out;\n}\n\nfunction setBinding(\n tx: YamlTransaction,\n cmd: Extract<FlowCommand, { kind: 'setBinding' }>,\n notes: string[],\n): void {\n const { node, path } = nodeAt(state(tx), cmd.id);\n if (node.type !== 'task' && node.type !== 'subflow')\n throw new CommandError('bad-type', `A ${node.type} node has no implementation`);\n if (cmd.impl) {\n if (!cmd.impl.ref.trim())\n throw new CommandError('bad-ref', 'Choose a module, role or playbook');\n const bad = cmd.impl.register ? varNameProblem(cmd.impl.register) : undefined;\n if (bad) throw new CommandError('bad-name', bad);\n }\n for (const side of ['inputs', 'outputs'] as const) {\n for (const [name, field] of Object.entries(cmd[side] ?? {})) {\n const bad = varNameProblem(name);\n if (bad) throw new CommandError('bad-name', bad);\n const current = nodeAt(state(tx), cmd.id).node[side];\n if (field === null) {\n if (!current || !(name in current)) continue;\n if (Object.keys(current).length === 1) setField(tx, path, side, null, NODE_ORDER);\n else tx.apply((f) => deleteKey(f, [...path, side], name));\n } else if (current) tx.apply((f) => setIn(f, [...path, side, name], contract(field)));\n else setField(tx, path, side, { [name]: contract(field) }, NODE_ORDER);\n }\n }\n // A new binding keeps the task keywords unless it brings its own (AFD-26); playbooks take none.\n const kept = node.impl?.keywords;\n const impl =\n cmd.impl && cmd.impl.keywords === undefined && kept && cmd.impl.kind !== 'playbook'\n ? { ...cmd.impl, keywords: kept }\n : cmd.impl;\n setField(tx, path, 'impl', impl ? implValue(impl) : null, NODE_ORDER);\n // Format 2: the status follows in planCommand, as for every writer (AFD-50). Format 1 keeps the\n // rule every writer had (AFD-31): bind \u2192 implemented, unbind \u2192 specified.\n if (formatOf(state(tx).doc) < 2) {\n const current = node.status ?? 'draft';\n const status = statusAfterBinding(\n current,\n !!impl,\n JSON.stringify(impl ?? null) === JSON.stringify(node.impl ?? null),\n );\n setField(tx, path, 'status', status === current ? undefined : status, NODE_ORDER);\n }\n liftPathRefs(tx, cmd.id, notes);\n}\n\nfunction ignoreDrift(\n tx: YamlTransaction,\n cmd: Extract<FlowCommand, { kind: 'ignoreDrift' }>,\n): void {\n const st = state(tx);\n nodeAt(st, cmd.node);\n const reason = cmd.reason.trim();\n if (!reason) throw new CommandError('no-reason', 'Say why the code and the design may differ');\n if (!cmd.item.trim()) throw new CommandError('bad-item', 'No drift item');\n recordDecision(tx, 'drift', cmd.item, cmd.node, reason, cmd.by);\n}\n\n/**\n * Downstream `from: <key>.<old>[.path]` references to a renamed node output, as rewrites (one\n * edit with the rename, like a key rename).\n */\nfunction outputRefRewrites(\n st: State,\n id: Ulid,\n from: string,\n to: string,\n): { path: Path; value: string }[] {\n const { node } = nodeAt(st, id);\n const out: { path: Path; value: string }[] = [];\n const head = `${node.key}.${from}`;\n for (const entry of st.model.nodes.values()) {\n if (entry.node.id === id) continue;\n for (const side of ['inputs', 'outputs'] as const) {\n // AFD-142: a subflow's outputs read its inner level, as resolveFrom resolves them.\n const at = readerLevel(st.model, entry.node, entry.level, side);\n if (keyScope(st.model, at).get(node.key) !== id) continue;\n // Inside a subflow, `<key>.<name>` is its input (AFD-21).\n if (enclosing(st.model, at).some((s) => s.id === id)) continue;\n for (const [name, field] of Object.entries(entry.node[side] ?? {})) {\n const ref = field?.from;\n if (ref === head || ref?.startsWith(`${head}.`))\n out.push({\n path: [...entry.path, side, name, 'from'],\n value: `${node.key}.${to}${ref.slice(head.length)}`,\n });\n }\n }\n }\n return out;\n}\n\n/** Inner `from: <subflow>.<old>[.path]` references to a renamed subflow input (AFD-21). */\nfunction inputRefRewrites(\n st: State,\n id: Ulid,\n from: string,\n to: string,\n): { path: Path; value: string }[] {\n const { node } = nodeAt(st, id);\n const out: { path: Path; value: string }[] = [];\n const head = `${node.key}.${from}`;\n for (const entry of st.model.nodes.values()) {\n // The subflow's own outputs read its inner level, where `<key>.<name>` is its input too.\n const own = entry.node.id === id;\n if (!own && !enclosing(st.model, entry.level).some((s) => s.id === id)) continue;\n if (!own && keyScope(st.model, entry.level).get(node.key) !== id) continue;\n for (const side of own ? (['outputs'] as const) : (['inputs', 'outputs'] as const))\n for (const [name, field] of Object.entries(entry.node[side] ?? {})) {\n const ref = field?.from;\n if (ref === head || ref?.startsWith(`${head}.`))\n out.push({\n path: [...entry.path, side, name, 'from'],\n value: `${node.key}.${to}${ref.slice(head.length)}`,\n });\n }\n }\n return out;\n}\n\n/**\n * AFD-21: `from: sub/step.output` names a step inside another subflow. Each subflow on the way\n * lifts the output (as extract_subflow does, AFD-7), and the reference reads the outermost one, so\n * the file stays encapsulated.\n */\nfunction liftPathRefs(tx: YamlTransaction, id: Ulid, notes: string[]): void {\n const { node } = nodeAt(state(tx), id);\n for (const side of ['inputs', 'outputs'] as const)\n for (const [name, field] of Object.entries(node[side] ?? {})) {\n const from = field?.from;\n if (typeof from !== 'string') continue;\n const [head = '', out, ...rest] = from.trim().split('.');\n if (!head.includes('/') || !out) continue;\n const value = [liftPath(tx, id, side, head, out, notes), ...rest].join('.');\n const at = nodeAt(state(tx), id).path;\n tx.apply((f) => setIn(f, [...at, side, name, 'from'], value));\n }\n}\n\n/** Lifts `head` (`sub/\u2026/step`) `.out` up to the level the reader sees; the reference it reads. */\nfunction liftPath(\n tx: YamlTransaction,\n readerId: Ulid,\n side: 'inputs' | 'outputs',\n head: string,\n out: string,\n notes: string[],\n): string {\n const st = state(tx);\n const reader = nodeAt(st, readerId);\n const at = side === 'outputs' && st.model.levels.has(readerId) ? readerId : reader.level;\n const scope = keyScope(st.model, at);\n const [first = '', ...more] = head.split('/');\n const top = st.model.nodes.get(scope.get(first) ?? '')?.node;\n if (!top) throw new CommandError('not-found', `${head}.${out}: no node \"${first}\" here`);\n const chain: FlowNode[] = [top];\n for (const seg of more) {\n const parent = chain.at(-1) as FlowNode;\n const step = (parent.subflow?.nodes ?? []).find((n) => n?.key === seg);\n if (!step) {\n const steps = (parent.subflow?.nodes ?? []).map((n) => n?.key).filter(Boolean);\n throw new CommandError(\n 'not-found',\n parent.type === 'subflow'\n ? `${head}.${out}: subflow ${parent.key} has no step ${seg} (steps: ${steps.join(', ') || 'none'})`\n : `${head}.${out}: ${parent.key} is a ${parent.type}, not a subflow`,\n );\n }\n chain.push(step);\n }\n const inner = chain.at(-1) as FlowNode;\n if (!inner.outputs || !(out in inner.outputs)) {\n const has = Object.keys(inner.outputs ?? {});\n throw new CommandError(\n 'not-found',\n `${head} has no output ${out} (${has.length ? `it has ${has.join(', ')}` : 'it has none'})`,\n );\n }\n // The deepest node of the path the reader sees directly needs no lifting.\n let start = 0;\n for (let i = chain.length - 1; i > 0; i--)\n if (scope.get((chain[i] as FlowNode).key) === (chain[i] as FlowNode).id) {\n start = i;\n break;\n }\n let name = out;\n for (let i = chain.length - 2; i >= start; i--)\n name = liftOne(tx, (chain[i] as FlowNode).id, chain[i + 1] as FlowNode, name, notes);\n return `${(chain[start] as FlowNode).key}.${name}`;\n}\n\n/** The subflow output that lifts `child.name`: an existing one, else a new one. */\nfunction liftOne(\n tx: YamlTransaction,\n subId: Ulid,\n child: FlowNode,\n name: string,\n notes: string[],\n): string {\n const { node: sub, path } = nodeAt(state(tx), subId);\n const existing = existingLift(sub, child, name);\n if (existing) return existing;\n const as = liftName(new Set(Object.keys(sub.outputs ?? {})), child.key, name);\n const value = contract(liftField(child, name));\n if (sub.outputs) tx.apply((f) => setIn(f, [...path, 'outputs', as], value));\n else setField(tx, path, 'outputs', { [as]: value }, NODE_ORDER);\n notes.push(`${sub.key} now lifts ${child.key}.${name} as its output ${as}`);\n return as;\n}\n\nfunction setContractField(\n tx: YamlTransaction,\n cmd: Extract<FlowCommand, { kind: 'setContractField' }>,\n notes: string[],\n): void {\n const st = state(tx);\n let base: Path;\n let current: Record<string, ContractField> | undefined;\n if (cmd.target === 'flow') {\n if (cmd.side !== 'inputs') throw new CommandError('bad-side', 'Flows have inputs only');\n base = ['flow'];\n current = st.doc.flow.inputs;\n } else {\n const { node, path } = nodeAt(st, cmd.target);\n base = path;\n current = (node as FlowNode)[cmd.side];\n }\n const order = cmd.target === 'flow' ? FLOW_ORDER : NODE_ORDER;\n const name = cmd.rename ?? cmd.name;\n const bad = varNameProblem(name);\n if (bad) throw new CommandError('bad-name', bad);\n const exists = current !== undefined && cmd.name in current;\n if (cmd.field === null || (cmd.rename && cmd.rename !== cmd.name)) {\n if (exists) {\n if (Object.keys(current ?? {}).length === 1) setField(tx, base, cmd.side, null, order);\n else tx.apply((f) => deleteKey(f, [...base, cmd.side], cmd.name));\n }\n if (cmd.field === null) return;\n }\n if (cmd.rename && cmd.rename !== cmd.name && current && cmd.rename in current) {\n throw new CommandError('duplicate-name', `\"${cmd.rename}\" already exists`);\n }\n const value = contract(cmd.field);\n // A renamed node output: downstream inputs read it as `<key>.<name>`.\n if (cmd.target !== 'flow' && cmd.side === 'outputs' && cmd.rename && cmd.rename !== cmd.name) {\n const rewrites = outputRefRewrites(state(tx), cmd.target, cmd.name, name);\n if (rewrites.length > 0)\n tx.applyAll(rewrites.map((r) => (f: YamlFile) => setIn(f, r.path, r.value)));\n }\n // A renamed subflow input: its inner steps read it as `<key>.<name>` (AFD-21).\n if (cmd.target !== 'flow' && cmd.side === 'inputs' && cmd.rename && cmd.rename !== cmd.name) {\n const rewrites = inputRefRewrites(state(tx), cmd.target, cmd.name, name);\n if (rewrites.length > 0)\n tx.applyAll(rewrites.map((r) => (f: YamlFile) => setIn(f, r.path, r.value)));\n }\n // A renamed node input: the binding's parameters read it by name (chips are Jinja, D-26).\n if (cmd.target !== 'flow' && cmd.side === 'inputs' && cmd.rename && cmd.rename !== cmd.name) {\n const params = nodeAt(state(tx), cmd.target).node.impl?.params;\n if (params) {\n const next = mapStrings(params, (s) => renameRef(s, cmd.name, name));\n if (JSON.stringify(next) !== JSON.stringify(params))\n tx.apply((f) => setIn(f, [...base, 'impl', 'params'], next as YamlValue));\n }\n // AFD-112: and Timing given at run time, and until, which read the step's inputs too.\n const settings = nodeAt(state(tx), cmd.target).node.settings;\n for (const key of ['retries', 'delay', 'timeout', 'until'] as const) {\n const v = settings?.[key];\n if (typeof v !== 'string') continue;\n const next =\n key === 'until' ? renameExprRef(v, cmd.name, name) : renameRef(v, cmd.name, name);\n if (next !== v) tx.apply((f) => setIn(f, [...base, 'settings', key], next));\n }\n // And task keywords (when, loop, \u2026: when and its kind are bare expressions) and a\n // decision's condition, which read inputs by name as well.\n const renamed = nodeAt(state(tx), cmd.target).node;\n const keywords = renamed.impl?.keywords;\n if (keywords) {\n const next = Object.fromEntries(\n Object.entries(keywords).map(([k, v]) => [\n k,\n mapStrings(v, (s) =>\n BARE_KEYWORDS.has(k) && !s.includes('{{')\n ? renameExprRef(s, cmd.name, name)\n : renameRef(s, cmd.name, name),\n ),\n ]),\n );\n if (JSON.stringify(next) !== JSON.stringify(keywords))\n tx.apply((f) => setIn(f, [...base, 'impl', 'keywords'], next as YamlValue));\n }\n if (typeof renamed.condition === 'string') {\n const next = renameExprRef(renamed.condition, cmd.name, name);\n if (next !== renamed.condition) tx.apply((f) => setIn(f, [...base, 'condition'], next));\n }\n }\n const after_ = state(tx);\n const side =\n cmd.target === 'flow' ? after_.doc.flow.inputs : nodeAt(after_, cmd.target).node[cmd.side];\n if (side) tx.apply((f) => setIn(f, [...base, cmd.side, name], value));\n else setField(tx, base, cmd.side, { [name]: value }, order);\n if (cmd.target !== 'flow') liftPathRefs(tx, cmd.target, notes);\n}\n\n/**\n * AFD-112 (round 4: Q4): nothing tied \"a value given at run time\" to a step's Timing. One edit\n * makes the flow input (or reuses one of that name that can hold a number), the step input that\n * reads it, and the setting's template; an approval's timeout stays a duration (AWX needs one).\n */\nfunction askAtRunTime(\n tx: YamlTransaction,\n cmd: Extract<FlowCommand, { kind: 'askAtRunTime' }>,\n notes: string[],\n): void {\n const st = state(tx);\n const { node } = nodeAt(st, cmd.id);\n const plainStep =\n node.type === 'task' || (node.type === 'subflow' && !node.subflow?.nodes?.length);\n if (!plainStep)\n throw new CommandError(\n 'bad-setting',\n node.type === 'approval'\n ? \"An approval's timeout is a fixed duration: AWX needs a number\"\n : `A ${node.type} node runs no task of its own, so it has no ${cmd.setting}`,\n );\n if (cmd.default !== undefined && (!Number.isInteger(cmd.default) || cmd.default < 0))\n throw new CommandError('bad-default', 'The default must be a whole number, 0 or more');\n const numeric = ['integer', 'string', 'any'];\n const flowField = st.doc.flow.inputs?.[cmd.name];\n if (flowField && !numeric.includes(flowField.type))\n throw new CommandError(\n 'duplicate-name',\n `Flow input \"${cmd.name}\" is a ${flowField.type}, which holds no number: choose another name`,\n );\n const nodeField = node.inputs?.[cmd.name];\n if (nodeField && nodeField.from !== `flow.${cmd.name}`)\n throw new CommandError(\n 'duplicate-name',\n `${node.title} already has an input \"${cmd.name}\" that reads ${nodeField.from ?? 'nothing'}: choose another name`,\n );\n if (flowField) notes.push(`Uses the flow input ${cmd.name} that the flow has already`);\n else\n setContractField(\n tx,\n {\n kind: 'setContractField',\n target: 'flow',\n side: 'inputs',\n name: cmd.name,\n field: {\n type: 'integer',\n ...(cmd.default !== undefined ? { default: cmd.default } : { required: true }),\n ...(cmd.description?.trim() ? { description: cmd.description.trim() } : {}),\n },\n },\n notes,\n );\n updateNode(\n tx,\n {\n kind: 'updateNode',\n id: cmd.id,\n patch: {\n settings: { [cmd.setting]: `{{ ${cmd.name} }}` },\n ...(nodeField\n ? {}\n : { inputs: { [cmd.name]: { type: 'integer', from: `flow.${cmd.name}` } } }),\n },\n },\n notes,\n );\n}\n\nfunction updateFlow(tx: YamlTransaction, patch: FlowPatch): void {\n if (patch.key !== undefined && !SLUG.test(patch.key)) {\n throw new CommandError('bad-key', `Key \"${patch.key}\" must be a lowercase slug`);\n }\n if (patch.name !== undefined && patch.name.trim() === '') {\n throw new CommandError('bad-name', 'Name must not be empty');\n }\n for (const k of ['name', 'key', 'goal', 'owner'] as const) {\n setField(tx, ['flow'], k, patch[k] as YamlValue | undefined, FLOW_ORDER);\n }\n if (patch.runtime !== undefined) {\n const value =\n patch.runtime && Object.keys(patch.runtime).length > 0 ? (patch.runtime as YamlValue) : null;\n setField(tx, ['flow'], 'runtime', value, FLOW_ORDER);\n }\n if (patch.maintenance_window !== undefined) {\n const w = patch.maintenance_window?.trim().toLowerCase().replaceAll(/\\s+/g, '') || null;\n if (w !== null && !/^([0-9]+[smhd])+$/.test(w))\n throw new CommandError(\n 'bad-window',\n `\"${patch.maintenance_window}\" is not a duration like 4h or 2h30m`,\n );\n setField(tx, ['flow'], 'maintenance_window', w, FLOW_ORDER);\n }\n if (patch.external_vars !== undefined) {\n const merged: Record<string, string> = { ...(state(tx).doc.flow?.external_vars ?? {}) };\n if (patch.external_vars === null) for (const k of Object.keys(merged)) delete merged[k];\n for (const [name, where] of Object.entries(patch.external_vars ?? {})) {\n if (!/^[A-Za-z_][A-Za-z0-9_]*$/.test(name))\n throw new CommandError('bad-name', `\"${name}\" is not a variable name`);\n if (where === null) delete merged[name];\n else merged[name] = String(where).trim() || 'set at run time';\n }\n setField(\n tx,\n ['flow'],\n 'external_vars',\n Object.keys(merged).length ? (merged as YamlValue) : null,\n FLOW_ORDER,\n );\n }\n}\n\nfunction acceptFinding(\n tx: YamlTransaction,\n cmd: Extract<FlowCommand, { kind: 'acceptFinding' }>,\n): void {\n const st = state(tx);\n if (cmd.node) nodeAt(st, cmd.node);\n const reason = cmd.reason.trim();\n if (!reason) throw new CommandError('no-reason', 'Say why this is expected');\n if (!cmd.finding.trim()) throw new CommandError('bad-finding', 'No finding');\n // A lens finding is keyed by its id alone (the node may go with it, for Complete IDs).\n const index = findAccepted(st.doc, 'lens', cmd.finding)?.index ?? -1;\n if (index >= 0) {\n const base: Path = ['decisions', index];\n const ops: ((f: YamlFile) => OpResult)[] = [\n (f) => setIn(f, [...base, 'reason'], reason, { before: ['by'] }),\n ];\n if (cmd.by) ops.push((f) => setIn(f, [...base, 'by'], cmd.by as string));\n tx.applyAll(ops);\n return;\n }\n addDecision(tx, decisionItem(st.doc, 'lens', cmd.finding, cmd.node, reason, cmd.by));\n}\n\n/** AFD-51: a validator warning accepted with a reason (format 2). */\nfunction acceptCheck(tx: YamlTransaction, cmd: Extract<FlowCommand, { kind: 'acceptCheck' }>) {\n const st = state(tx);\n formatGuard(() => requireFormat(st.doc, 2, 'Accepting a problem'));\n const { node } = nodeAt(st, cmd.node);\n const reason = cmd.reason.trim();\n if (!reason) throw new CommandError('no-reason', `Say why ${node.title} may keep this`);\n recordDecision(tx, 'check', checkWhat(cmd.code, cmd.subject), cmd.node, reason, cmd.by);\n}\n\n/** The record of a node marked tested by hand (AFD-44). */\nexport const testedFinding = (node: Ulid) => `status:tested|${node}`;\n\nfunction markTested(tx: YamlTransaction, cmd: Extract<FlowCommand, { kind: 'markTested' }>): void {\n const st = state(tx);\n const { node, path } = nodeAt(st, cmd.id);\n if (node.type === 'start' || node.type === 'end')\n throw new CommandError('no-status', 'Start and end nodes have no status');\n // Format 1 takes any node with a reason, as before; format 2 only implemented content.\n if (formatOf(st.doc) >= 2 && !canMarkTested(st.doc, node))\n throw new CommandError(\n 'not-implemented',\n (node.subflow?.nodes ?? []).length > 0\n ? 'A subflow is tested when its steps are: mark them'\n : `${node.title} is ${contentStatus(node)}: only an implemented node can be tested`,\n );\n setField(tx, path, 'status', 'tested', NODE_ORDER);\n if (formatOf(st.doc) >= 2) {\n const record: TestedRecord = {\n reason: cmd.reason,\n ...(cmd.by ? { by: cmd.by } : {}),\n ...(cmd.at ? { at: cmd.at } : {}),\n };\n setField(tx, path, 'tested', record as YamlValue, NODE_ORDER);\n return;\n }\n acceptFinding(tx, {\n kind: 'acceptFinding',\n finding: testedFinding(cmd.id),\n node: cmd.id,\n reason: cmd.reason,\n by: cmd.by,\n });\n}\n\n/**\n * A node no longer tested loses its evidence (another status, or the design changed): format 2's\n * `tested` record on the node, format 1's decision for tested by hand.\n */\nfunction dropTestedRecords(tx: YamlTransaction, ids: readonly Ulid[]): void {\n for (const id of ids) {\n const entry = state(tx).model.nodes.get(id);\n if (entry?.node.tested !== undefined) tx.apply((f) => deleteKey(f, entry.path, 'tested'));\n }\n const findings = new Set(ids.map(testedFinding));\n const decisions = state(tx).doc.decisions ?? [];\n const idx = decisions\n .map((d, i) => (d?.kind === 'finding_accepted' && findings.has(d.finding) ? i : -1))\n .filter((i) => i >= 0);\n if (idx.length === 0) return;\n if (idx.length === decisions.length) tx.apply((f) => deleteKey(f, [], 'decisions'));\n else tx.apply((f) => removeItems(f, ['decisions'], idx));\n}\n\nfunction clearFindingAccept(tx: YamlTransaction, finding: string): void {\n removeDecisions(\n tx,\n acceptedAll(state(tx).doc)\n .filter((a) => a.area === 'lens' && a.what === finding)\n .map((a) => a.index),\n );\n}\n\nfunction setBoundaryIn(tx: YamlTransaction, cmd: Extract<FlowCommand, { kind: 'setBoundaryIn' }>) {\n const st = state(tx);\n const { node, level } = subflowAt(st, cmd.subflow);\n if (cmd.node !== null) {\n const inner = nodeAt(st, cmd.node);\n if (inner.level !== level.id)\n throw new CommandError('cross-level', 'The entry must be a step inside the subflow');\n if (!isPortLegal(inner.node, 'in'))\n throw new CommandError('bad-port', `${inner.node.title} has no \"in\" port`);\n }\n const boundary = node.subflow?.boundary ?? {};\n tx.applyAll(boundaryOps(st, cmd.subflow, { ...boundary, in: cmd.node ?? undefined }));\n}\n\nfunction connectBoundary(\n tx: YamlTransaction,\n cmd: Extract<FlowCommand, { kind: 'connectBoundary' }>,\n): void {\n const st = state(tx);\n const { node, level } = subflowAt(st, cmd.subflow);\n if (nodeAt(st, cmd.from.node).level !== level.id)\n throw new CommandError('cross-level', 'Only a step inside the subflow can leave through it');\n // AFD-181: a new name opens a named exit of the subflow.\n if (!(isPortLegal(node, cmd.port) || isExitName(cmd.port)) || portDirection(cmd.port) !== 'out')\n throw new CommandError(\n 'bad-port',\n `${node.title} has no output \"${cmd.port}\"; a named exit takes lowercase letters, digits and _ and no port name (dry_run_done)`,\n );\n if (exitOf(st, level, cmd.from) === cmd.port) return;\n checkOutput(st, cmd.from);\n const boundary = node.subflow?.boundary ?? {};\n const exit: BoundaryExit = { node: cmd.from.node, port: cmd.from.port };\n if (cmd.reason?.trim()) exit.reason = cmd.reason.trim();\n const outputs = {\n ...boundary.outputs,\n [cmd.port]: [...(boundary.outputs?.[cmd.port] ?? []), exit],\n };\n tx.applyAll([\n ...enablePortOps(st, cmd.subflow, cmd.port),\n ...enablePortOps(st, cmd.from.node, cmd.from.port),\n ...boundaryOps(st, cmd.subflow, { ...boundary, outputs }),\n // An inner port that leaves the subflow is wired: its open-on-purpose decision goes too.\n ...decisionRemovalOps(st, cmd.from.node, cmd.from.port),\n ]);\n}\n\n/** Rewrites one exit (`change` returns the new exit, or null to remove it). */\nfunction editExit(\n tx: YamlTransaction,\n subflow: Ulid,\n from: PortRef,\n port: string,\n change: (exit: BoundaryExit) => BoundaryExit | null,\n): void {\n const st = state(tx);\n const { node } = subflowAt(st, subflow);\n const boundary = node.subflow?.boundary ?? {};\n const refs = boundary.outputs?.[port] ?? [];\n const index = refs.findIndex((r) => r?.node === from.node && r.port === from.port);\n if (index < 0) throw new CommandError('not-found', `${from.port} does not leave through ${port}`);\n const next = change(refs[index] as BoundaryExit);\n const list = [...refs.slice(0, index), ...(next ? [next] : []), ...refs.slice(index + 1)];\n tx.applyAll(\n boundaryOps(st, subflow, { ...boundary, outputs: { ...boundary.outputs, [port]: list } }),\n );\n}\n\n/** Decision 15: the given tested nodes become implemented again, since their design changed. */\n// ---- extract into a subflow (AFD-7, ADR-0010) --------------------------------------------------\n\n/** The subflow port an inner output leaves through: its own name when a subflow has it. */\nfunction exitPort(port: string): string {\n if (isPortLegal({ type: 'subflow' } as FlowNode, port)) return port;\n return isFailPort(port) ? 'failed_hosts' : 'ok_hosts';\n}\n\n/**\n * Moves a connected selection of one level into a new subflow node, in one edit. IDs never\n * change. Wires entering the group end at the subflow's `in` (the group has one entry node, its\n * `boundary.in`); wires leaving it start at the subflow port of the same name (boundary exits),\n * merged when they go to the same place. Exits of an enclosing subflow now leave through the new\n * one. Outputs read outside the group are lifted to subflow outputs, and those references are\n * rewritten.\n */\nfunction extractSubflow(\n tx: YamlTransaction,\n ctx: CommandContext,\n cmd: Extract<FlowCommand, { kind: 'extractSubflow' }>,\n): { id: Ulid; rewritten: Ulid[] } {\n const st = state(tx);\n const picked = new Set(cmd.nodes);\n if (picked.size === 0) throw new CommandError('bad-selection', 'Select the nodes to extract');\n const entries = [...picked].map((id) => nodeAt(st, id));\n const levelId = entries[0]?.level as string;\n if (entries.some((e) => e.level !== levelId))\n throw new CommandError('bad-selection', 'The selected nodes must be on one level');\n const bad = entries.filter((e) => e.node.type === 'start' || e.node.type === 'end');\n if (bad.length > 0)\n throw new CommandError(\n 'bad-selection',\n `Start and end nodes stay on their level: ${bad.map((e) => e.node.title).join(', ')}`,\n );\n const level = levelOf(st, levelId);\n const title = (id: Ulid) => st.model.nodes.get(id)?.node.title ?? id;\n\n // Connected, as one group (undirected).\n const inner = level.edges.filter((e) => picked.has(e.from.node) && picked.has(e.to.node));\n const seen = new Set<Ulid>([entries[0]?.node.id as Ulid]);\n for (let grew = true; grew; ) {\n grew = false;\n for (const e of inner)\n if (seen.has(e.from.node) !== seen.has(e.to.node)) {\n seen.add(e.from.node);\n seen.add(e.to.node);\n grew = true;\n }\n }\n if (seen.size !== picked.size)\n throw new CommandError(\n 'bad-selection',\n `The selection is not connected: ${[...picked]\n .filter((id) => !seen.has(id))\n .map(title)\n .join(', ')} ${picked.size - seen.size === 1 ? 'is' : 'are'} apart from the rest`,\n );\n\n // One way in.\n const parent = level.parent ? st.model.nodes.get(level.parent)?.node : undefined;\n const boundary = parent?.subflow?.boundary;\n const incoming = level.edges.filter((e) => !picked.has(e.from.node) && picked.has(e.to.node));\n const entryIds = new Set(incoming.map((e) => e.to.node));\n if (boundary?.in && picked.has(boundary.in)) entryIds.add(boundary.in);\n if (entryIds.size > 1)\n throw new CommandError(\n 'bad-selection',\n `A subflow has one way in, but hosts enter the selection at ${[...entryIds]\n .map((id) => `\"${title(id)}\"`)\n .join(' and ')}`,\n );\n let entry = [...entryIds][0];\n if (!entry) {\n const fed = new Set(inner.map((e) => e.to.node));\n const heads = cmd.nodes.filter((id) => !fed.has(id));\n if (heads.length !== 1)\n throw new CommandError('bad-selection', 'Nothing leads into the selection');\n entry = heads[0] as Ulid;\n }\n\n // Ways out: one parent wire per subflow port.\n const outgoing = level.edges.filter((e) => picked.has(e.from.node) && !picked.has(e.to.node));\n const enclosing = Object.entries(boundary?.outputs ?? {}).flatMap(([port, refs]) =>\n (refs ?? []).filter((r) => picked.has(r.node)).map((r) => ({ ref: r, leaves: port })),\n );\n const dest = new Map<string, string>();\n const claim = (port: string, where: string, what: string) => {\n const had = dest.get(port);\n if (had !== undefined && had !== where)\n throw new CommandError(\n 'bad-selection',\n `The subflow would need two ${port} wires: ${what} leaves for another place than the rest`,\n );\n dest.set(port, where);\n };\n // AFD-181: normal hosts that leave for another place than the rest get a named exit, after the\n // step and port they leave by; failures still share their port.\n const exitFor = new Map<Ulid, string>();\n for (const e of outgoing) {\n const where = `node:${portKey(e.to.node, e.to.port)}`;\n let port = exitPort(e.from.port);\n const had = dest.get(port);\n if (had !== undefined && had !== where && !isFailPort(port)) {\n const key = st.model.nodes.get(e.from.node)?.node.key ?? 'step';\n const base = `${key.replaceAll('-', '_')}_${e.from.port}`;\n port = isExitName(base) ? base : `exit_${base}`;\n for (let i = 2; dest.has(port) && dest.get(port) !== where; i++) port = `${base}_${i}`;\n }\n claim(port, where, `${title(e.from.node)}.${e.from.port}`);\n exitFor.set(e.id, port);\n }\n for (const x of enclosing)\n claim(exitPort(x.ref.port), `leave:${x.leaves}`, `${title(x.ref.node)}.${x.ref.port}`);\n\n // The new node.\n const taken = levelKeys(level, st.model);\n const key = cmd.key ?? uniqueKey(slugify(cmd.title, 'subflow'), taken);\n checkKey(key, taken);\n const id = ctx.newId();\n\n // Outputs read outside the group are lifted to the subflow (AFD-7 decision).\n const movedIds = new Set(entries.flatMap((e) => [e.node.id, ...descendantIds(e.node)]));\n const keyOf = new Map(entries.map((e) => [e.node.key, e.node]));\n const lifted = new Map<string, { name: string; field: ContractField }>();\n const rewrites: { path: Path; value: string; node: Ulid }[] = [];\n for (const other of st.model.nodes.values()) {\n if (movedIds.has(other.node.id)) continue;\n for (const side of ['inputs', 'outputs'] as const) {\n // AFD-142: a subflow's outputs read its inner level, as resolveFrom resolves them.\n const scope = keyScope(st.model, readerLevel(st.model, other.node, other.level, side));\n for (const [name, field] of Object.entries(other.node[side] ?? {})) {\n const [head, out, ...rest] = (field?.from ?? '').split('.');\n const source = head ? keyOf.get(head) : undefined;\n if (!source || !out || scope.get(head as string) !== source.id) continue;\n const ref = `${head}.${out}`;\n let lift = lifted.get(ref);\n if (!lift) {\n const names = new Set([...lifted.values()].map((l) => l.name));\n lift = { name: liftName(names, source.key, out), field: liftField(source, out) };\n lifted.set(ref, lift);\n }\n rewrites.push({\n path: [...other.path, side, name, 'from'],\n value: [key, lift.name, ...rest].join('.'),\n node: other.node.id,\n });\n }\n }\n }\n\n // Fail ports nothing takes keep leaving the same way: through the new subflow's port.\n const exits = new Set([...dest.keys()]);\n const usedHere = levelTaken(level.edges, parent);\n const decided = openOnPurpose(st.doc);\n for (const e of entries)\n for (const port of untakenFailPorts(e.node, usedHere))\n if (\n !decided.has(portKey(e.node.id, port)) &&\n isPortLegal({ type: 'subflow' } as FlowNode, port)\n )\n exits.add(port);\n const optional = optionalPortNames('subflow');\n const ports = [...exits].filter((p) => optional.includes(p)).sort();\n\n // Boundary of the new subflow: its entry, and every exit by its subflow port.\n const outputs: Record<string, BoundaryExit[]> = {};\n const addExit = (port: string, ref: BoundaryExit) => {\n const list = outputs[port] ?? [];\n outputs[port] = list;\n if (!list.some((r) => r.node === ref.node && r.port === ref.port))\n list.push({ node: ref.node, port: ref.port, ...(ref.reason ? { reason: ref.reason } : {}) });\n };\n for (const e of outgoing)\n addExit(exitFor.get(e.id) ?? exitPort(e.from.port), { node: e.from.node, port: e.from.port });\n for (const x of enclosing) addExit(exitPort(x.ref.port), x.ref);\n\n const docNodes = level.nodes.filter((n) => n && picked.has(n.id));\n const item: Record<string, YamlValue> = { id, key, type: 'subflow', title: cmd.title };\n // As far along as its least advanced work step; \"specified\" needs a contract of its own. Format 2\n // settles it from its steps right after (settleStatuses, AFD-50).\n const rank: NodeStatus[] = ['draft', 'specified', 'implemented', 'tested'];\n const work = entries.filter((e) => e.node.type === 'task' || e.node.type === 'subflow');\n const lowest = work.length\n ? rank[Math.min(...work.map((e) => rank.indexOf(e.node.status ?? 'draft')))]\n : 'draft';\n item.status = lowest === 'specified' && lifted.size === 0 ? 'draft' : (lowest ?? 'draft');\n if (ports.length > 0) item.ports = ports;\n if (lifted.size > 0)\n item.outputs = Object.fromEntries([...lifted.values()].map((l) => [l.name, contract(l.field)]));\n const body: Record<string, YamlValue> = {\n nodes: docNodes as unknown as YamlValue,\n };\n if (inner.length > 0)\n body.edges = inner.map((e) => ({\n id: e.id,\n from: { node: e.from.node, port: e.from.port },\n to: { node: e.to.node, port: e.to.port },\n }));\n // AFD-64: the Notes on the extracted nodes and the annotations picked with them go inside,\n // where they stood (positions are in canvas pixels on every level).\n const withThem = new Set(cmd.annotations ?? []);\n const moving = level.annotations.filter(\n (a) => a && (a.on ? picked.has(a.on) : withThem.has(a.id)),\n );\n if (moving.length > 0) body.annotations = moving.map((a) => annotationValue(a));\n const b: Record<string, YamlValue> = { in: entry };\n if (Object.keys(outputs).length > 0)\n b.outputs = Object.fromEntries(\n Object.entries(outputs).map(([port, refs]) => [\n port,\n refs.map((r) => ({\n node: r.node,\n port: r.port,\n ...(r.reason ? { reason: r.reason } : {}),\n })),\n ]),\n );\n body.boundary = b;\n item.subflow = body;\n\n // One batch on this parse: remove the group and its inner wires, retarget the wires in and out\n // (a merged exit keeps its first wire), the enclosing boundary, the rewritten references.\n const ops: Op[] = [];\n const nodeIdx = level.nodes.map((n, i) => (n && picked.has(n.id) ? i : -1)).filter((i) => i >= 0);\n ops.push(...removeIndexes(level.nodesPath, nodeIdx, level.nodes.length));\n const keptExit = new Set<string>();\n const dropEdge = new Set(inner.map((e) => e.id));\n for (const e of outgoing) {\n const port = exitFor.get(e.id) ?? exitPort(e.from.port);\n if (keptExit.has(port)) dropEdge.add(e.id);\n else keptExit.add(port);\n }\n const edgeIdx = level.edges\n .map((e, i) => (e && dropEdge.has(e.id) ? i : -1))\n .filter((i) => i >= 0);\n ops.push(...removeIndexes(level.edgesPath, edgeIdx, level.edges.length));\n ops.push(...removeAnnotationOps(level, new Set(moving.map((a) => a.id))));\n level.edges.forEach((e, i) => {\n if (!e || dropEdge.has(e.id)) return;\n const path = [...level.edgesPath, i];\n if (incoming.includes(e)) ops.push((f) => setIn(f, [...path, 'to', 'node'], id));\n if (outgoing.includes(e)) {\n ops.push((f) => setIn(f, [...path, 'from', 'node'], id));\n const port = exitFor.get(e.id) ?? exitPort(e.from.port);\n if (port !== e.from.port) ops.push((f) => setIn(f, [...path, 'from', 'port'], port));\n }\n });\n if (parent && boundary) {\n const next: Boundary = {\n in: boundary.in && picked.has(boundary.in) ? id : boundary.in,\n outputs: Object.fromEntries(\n Object.entries(boundary.outputs ?? {}).map(([port, refs]) => {\n const kept = (refs ?? []).filter((r) => !picked.has(r.node));\n const moved = (refs ?? []).filter((r) => picked.has(r.node));\n const through = [...new Set(moved.map((r) => exitPort(r.port)))].map((p) => ({\n node: id,\n port: p,\n }));\n return [port, [...kept, ...through]];\n }),\n ),\n };\n ops.push(...boundaryOps(st, parent.id, next));\n }\n for (const r of rewrites) ops.push((f) => setIn(f, r.path, r.value));\n tx.applyAll(ops);\n\n // Then the node, where the group's first node was, and its position.\n const after1 = state(tx);\n const lv = levelOf(after1, levelId);\n const at = Math.min(nodeIdx[0] ?? lv.nodes.length, lv.nodes.length);\n tx.apply((f) =>\n lv.nodes.length === 0 ? setIn(f, lv.nodesPath, [item]) : insertItem(f, lv.nodesPath, at, item),\n );\n // Nodes shown at auto positions are written too: once the level has a stored position, the\n // others would otherwise be stacked below it (ADR-0002).\n setPositions(tx, { ...cmd.freeze, ...(cmd.position ? { [id]: cmd.position } : {}) });\n return { id, rewritten: [...new Set(rewrites.map((r) => r.node))] };\n}\n\n/**\n * AFD-196: a subflow's steps move up to its level, keeping their IDs, and the subflow goes: wires\n * into it go to its entry step, each of its exits becomes wires from the inner ports that left by\n * it (a fail port that bubbled out included), and from: references follow (a reader of what the\n * subflow lifted reads the inner step; an inner step that read the subflow's input reads where that\n * input came from). Returns the nodes whose references were rewritten.\n */\nfunction dissolveSubflow(\n tx: YamlTransaction,\n ctx: CommandContext,\n id: Ulid,\n notes: string[],\n): Ulid[] {\n const st = state(tx);\n const { node: sub, level: levelId } = nodeAt(st, id);\n if (sub.type !== 'subflow') throw new CommandError('bad-type', `${sub.title} is not a subflow`);\n if (sub.ref)\n throw new CommandError(\n 'shared',\n `${sub.title} is a shared subflow: unlink it before dissolving`,\n );\n const inner = st.model.levels.get(sub.id);\n const steps = (sub.subflow?.nodes ?? []).filter((n): n is FlowNode => !!n?.id);\n if (!inner || steps.length === 0)\n throw new CommandError('empty', `${sub.title} has no steps to move up: delete it instead`);\n const level = levelOf(st, levelId);\n const taken = new Set(level.nodes.filter((n) => n && n.id !== sub.id).map((n) => n.key));\n const clash = steps.filter((n) => taken.has(n.key)).map((n) => n.key);\n if (clash.length)\n throw new CommandError(\n 'key-clash',\n `${clash.join(', ')} ${clash.length === 1 ? 'is' : 'are'} taken on the level ${sub.key} is on: rename first (the rename op)`,\n );\n const boundary = sub.subflow?.boundary ?? {};\n const entry = boundary.in;\n const incoming = level.edges.filter((e) => e?.to?.node === sub.id);\n if (incoming.length && !entry)\n throw new CommandError('no-entry', `${sub.title} has no entry step: set_entry first`);\n\n // The inner ports each subflow port stood for: its exits, and fail ports that bubbled to it.\n const innerTaken = levelTaken(inner.edges, sub);\n const sourcesOf = (port: string): PortRef[] => {\n const out = (boundary.outputs?.[port] ?? []).map((r) => ({ node: r.node, port: r.port }));\n for (const n of steps)\n for (const p of untakenFailPorts(n, innerTaken))\n if (p === port && isFailPort(port) && !out.some((r) => r.node === n.id && r.port === p))\n out.push({ node: n.id, port: p });\n return out;\n };\n const outgoing = level.edges.filter((e) => e?.from?.node === sub.id);\n\n // from: rewrites, worked out on the flow as it is.\n const rewrites: { node: Ulid; side: 'inputs' | 'outputs'; name: string; value: string | null }[] =\n [];\n const insideIds = new Set(descendantIds(sub));\n for (const other of st.model.nodes.values()) {\n if (other.node.id === sub.id) continue;\n for (const side of ['inputs', 'outputs'] as const)\n for (const [name, field] of Object.entries(other.node[side] ?? {})) {\n const from = field?.from;\n if (!from) continue;\n const src = resolveFrom(st.model, other.node, other.level, side, from);\n const rest = from.split('.').slice(2);\n if (src.kind === 'output' && src.node.id === sub.id && !insideIds.has(other.node.id)) {\n const lift = src.name ? liftOf(sub, src.name) : undefined;\n rewrites.push({\n node: other.node.id,\n side,\n name,\n value:\n lift && 'inner' in lift\n ? [lift.inner.key, lift.output, ...lift.path, ...rest].join('.')\n : null,\n });\n } else if (src.kind === 'subflowInput' && src.node.id === sub.id) {\n const up = src.field.from?.trim();\n rewrites.push({\n node: other.node.id,\n side,\n name,\n value: up ? [up, ...src.path].join('.') : null,\n });\n }\n }\n }\n\n // Wires: into the subflow go to its entry; out of it, from each inner port it stood for.\n const parentNode = level.parent ? st.model.nodes.get(level.parent)?.node : undefined;\n const added: Record<string, YamlValue>[] = [];\n for (const e of outgoing)\n for (const src of sourcesOf(e.from.port)) added.push(edgeItem(ctx, src, e.to));\n for (const e of inner.edges)\n if (e?.id)\n added.push({\n id: e.id,\n from: { node: e.from.node, port: e.from.port },\n to: { node: e.to.node, port: e.to.port },\n });\n const unwired = outgoing.filter((e) => sourcesOf(e.from.port).length === 0);\n const ops: Op[] = [];\n const dropIdx = level.edges\n .map((e, i) => (e && e.from?.node === sub.id ? i : -1))\n .filter((i) => i >= 0);\n level.edges.forEach((e, i) => {\n if (e?.to?.node === sub.id && entry)\n ops.push((f) => setIn(f, [...level.edgesPath, i, 'to', 'node'], entry));\n });\n ops.push(...removeIndexes(level.edgesPath, dropIdx, level.edges.length));\n const decisions = st.doc.decisions ?? [];\n const decisionIdx = decisions.map((d, i) => (d?.node === sub.id ? i : -1)).filter((i) => i >= 0);\n if (decisionIdx.length && decisionIdx.length === decisions.length)\n ops.push((f) => deleteKey(f, [], 'decisions'));\n else if (decisionIdx.length) ops.push((f) => removeItems(f, ['decisions'], decisionIdx));\n const layout = st.doc.layout ?? {};\n if (sub.id in layout)\n ops.push((f) =>\n Object.keys(layout).length === 1\n ? deleteKey(f, [], 'layout')\n : deleteKey(f, ['layout'], sub.id),\n );\n tx.applyAll(ops);\n\n // The steps where the subflow was, the new wires, the inner notes.\n const subAt = (lv: Level) => lv.nodes.findIndex((n) => n?.id === sub.id);\n let lv = levelOf(state(tx), levelId);\n const at = subAt(lv);\n tx.apply((f) => removeItem(f, lv.nodesPath, at));\n steps.forEach((n, i) => {\n lv = levelOf(state(tx), levelId);\n const value = n as unknown as YamlValue;\n tx.apply((f) =>\n lv.nodes.length === 0\n ? setIn(f, lv.nodesPath, [value])\n : insertItem(f, lv.nodesPath, at + i, value),\n );\n });\n for (const e of added) {\n lv = levelOf(state(tx), levelId);\n tx.apply((f) =>\n lv.edges.length === 0\n ? setIn(f, lv.edgesPath, [e])\n : insertItem(f, lv.edgesPath, lv.edges.length, e),\n );\n }\n for (const a of inner.annotations.filter((x) => x?.id)) {\n lv = levelOf(state(tx), levelId);\n const value = annotationValue(a);\n tx.apply((f) =>\n lv.annotations.length === 0\n ? setIn(f, lv.annotationsPath, [value])\n : insertItem(f, lv.annotationsPath, lv.annotations.length, value),\n );\n }\n\n // The enclosing subflow's boundary: the entry and the exits the subflow stood in for.\n if (parentNode?.subflow?.boundary) {\n const b = parentNode.subflow.boundary;\n const next: Boundary = {\n in: b.in === sub.id ? entry : b.in,\n outputs: Object.fromEntries(\n Object.entries(b.outputs ?? {}).map(([port, refs]) => [\n port,\n (refs ?? []).flatMap((r) =>\n r.node === sub.id\n ? sourcesOf(r.port).map((x) => ({ ...x, ...(r.reason ? { reason: r.reason } : {}) }))\n : [r],\n ),\n ]),\n ),\n };\n tx.applyAll(boundaryOps(state(tx), parentNode.id, next));\n }\n\n // References last, at their paths in the new document.\n const now = state(tx);\n const refOps: Op[] = [];\n for (const r of rewrites) {\n const entryNow = now.model.nodes.get(r.node);\n if (!entryNow?.node[r.side]?.[r.name]) continue;\n const base = [...entryNow.path, r.side, r.name];\n refOps.push((f) =>\n r.value === null ? deleteKey(f, base, 'from') : setIn(f, [...base, 'from'], r.value),\n );\n if (r.value === null)\n notes.push(\n `${entryNow.node.key}.${r.side}.${r.name} read ${sub.key}, which passed nothing on: it has no from now`,\n );\n }\n if (refOps.length) tx.applyAll(refOps);\n\n notes.push(\n `${sub.key} dissolved: ${steps.map((n) => n.key).join(', ')} moved up${entry ? `; wires into it go to ${steps.find((n) => n.id === entry)?.key}` : ''}`,\n );\n if (unwired.length)\n notes.push(\n `${unwired.map((e) => `${sub.key}.${e.from.port}`).join(', ')} had a wire but no inner port left by it: the wire is gone`,\n );\n const settings = Object.keys(sub.settings ?? {});\n if (settings.length)\n notes.push(\n `${sub.key} had settings (${settings.join(', ')}) that no longer apply to its steps`,\n );\n return [...new Set(rewrites.map((r) => r.node))];\n}\n\n// ---- shared subflows (AFD-60) -------------------------------------------------------------\n\n/** The copy's fields, in node order, and its reference: what Add and Update write. */\nfunction writeCopy(\n tx: YamlTransaction,\n ctx: CommandContext,\n id: Ulid,\n from: string,\n version: number,\n source: FlowNode,\n): void {\n if (source.type !== 'subflow' || !source.subflow?.nodes?.length)\n throw new CommandError('bad-type', `${source.title} is not a subflow with steps`);\n const copy = copySubflow(source, ctx.newId);\n const { path } = nodeAt(state(tx), id);\n for (const k of ['intent', 'purpose', 'ports', 'inputs', 'outputs', 'settings'] as const)\n setField(tx, path, k, (copy[k] ?? null) as YamlValue, NODE_ORDER);\n setField(tx, path, 'ref', refFor(from, version, copy) as unknown as YamlValue, NODE_ORDER);\n setField(tx, path, 'subflow', copy.subflow as unknown as YamlValue, NODE_ORDER);\n}\n\nfunction addReference(\n tx: YamlTransaction,\n ctx: CommandContext,\n cmd: Extract<FlowCommand, { kind: 'addReference' }>,\n): Ulid {\n requireFormat(state(tx).doc, 2, 'A shared subflow');\n if (!parseRefFrom(cmd.from))\n throw new CommandError('bad-ref', `\"${cmd.from}\" is not <flow file>#<subflow key>`);\n const id = insertNode(tx, ctx, {\n parent: cmd.parent,\n type: 'subflow',\n title: cmd.source.title,\n key: cmd.source.key,\n });\n writeCopy(tx, ctx, id, cmd.from, cmd.version, cmd.source);\n if (cmd.position) setPositions(tx, { [id]: cmd.position });\n return id;\n}\n\nfunction updateReference(\n tx: YamlTransaction,\n ctx: CommandContext,\n cmd: Extract<FlowCommand, { kind: 'updateReference' }>,\n): void {\n const { node } = nodeAt(state(tx), cmd.id);\n if (!node.ref) throw new CommandError('not-shared', `${node.title} is not a shared subflow`);\n writeCopy(tx, ctx, cmd.id, node.ref.from, cmd.version, cmd.source);\n}\n\n// ---- annotations (AFD-64) -------------------------------------------------------------------\n\n/** Ops removing annotations of one level against one parse; the key goes with the last one. */\nfunction removeAnnotationOps(level: Level, ids: ReadonlySet<string>): Op[] {\n const idx = level.annotations.map((a, i) => (a && ids.has(a.id) ? i : -1)).filter((i) => i >= 0);\n if (idx.length === 0) return [];\n if (idx.length === level.annotations.length) {\n const base = level.annotationsPath.slice(0, -1);\n return [(f) => deleteKey(f, base, 'annotations')];\n }\n return [(f) => removeItems(f, level.annotationsPath, idx)];\n}\n\n/** Removes annotations level by level; how many were there. */\nfunction deleteAnnotations(tx: YamlTransaction, ids: readonly Ulid[]): number {\n const byLevel = new Map<string, Set<Ulid>>();\n for (const id of ids) {\n const entry = state(tx).model.annotations.get(id);\n if (!entry) continue;\n byLevel.set(entry.level, (byLevel.get(entry.level) ?? new Set()).add(id));\n }\n let removed = 0;\n for (const [levelId, set] of byLevel) {\n const level = state(tx).model.levels.get(levelId);\n if (!level) continue;\n tx.applyAll(removeAnnotationOps(level, set));\n removed += set.size;\n }\n return removed;\n}\n\nfunction moveAnnotations(tx: YamlTransaction, positions: Record<Ulid, Position>): void {\n const st = state(tx);\n const ops: Op[] = [];\n for (const [id, p] of Object.entries(positions)) {\n const entry = st.model.annotations.get(id);\n if (!entry) continue;\n const x = Math.round(p.x);\n const y = Math.round(p.y);\n if (entry.annotation.x !== x) ops.push((f) => setIn(f, [...entry.path, 'x'], x));\n if (entry.annotation.y !== y) ops.push((f) => setIn(f, [...entry.path, 'y'], y));\n }\n tx.applyAll(ops);\n}\n\nfunction checkAnnotation(\n st: State,\n levelId: string,\n kind: AnnotationKind,\n patch: AnnotationPatch,\n): void {\n if (!ANNOTATION_KINDS.includes(kind))\n throw new CommandError('invalid', `No annotation kind ${kind}`);\n if (patch.color != null && !ANNOTATION_COLORS.includes(patch.color))\n throw new CommandError('invalid', `No color ${patch.color}: ${ANNOTATION_COLORS.join(', ')}`);\n if (patch.size != null && (kind !== 'text' || !TEXT_SIZES.includes(patch.size)))\n throw new CommandError('invalid', 'Only text has a size: s, m or l');\n if (patch.on != null) {\n if (kind !== 'note') throw new CommandError('invalid', 'Only a note can be on a node');\n const entry = st.model.nodes.get(patch.on);\n if (!entry || entry.level !== levelId)\n throw new CommandError('not-found', 'A note can only be on a node of its own level');\n }\n for (const k of ['x', 'y', 'width', 'height'] as const) {\n const v = patch[k];\n if (v != null && !Number.isFinite(v))\n throw new CommandError('invalid', `${k} must be a number`);\n }\n if (patch.key !== undefined && !SLUG.test(patch.key))\n throw new CommandError(\n 'invalid',\n `\"${patch.key}\" is not a key (lowercase letters, digits, dashes)`,\n );\n}\n\nfunction addAnnotation(\n tx: YamlTransaction,\n ctx: CommandContext,\n cmd: Extract<FlowCommand, { kind: 'addAnnotation' }>,\n): Ulid {\n requireFormat(state(tx).doc, 2, 'Annotations');\n const levelId = cmd.level ?? ROOT;\n const a = cmd.annotation;\n const kind = a.kind ?? 'note';\n checkAnnotation(state(tx), levelId, kind, a);\n if (cmd.freeze) setPositions(tx, cmd.freeze);\n const level = levelOf(state(tx), levelId);\n const taken = level.annotations.map((x) => x?.key);\n if (a.key !== undefined && taken.includes(a.key))\n throw new CommandError('key-taken', `Key \"${a.key}\" is already used on this level`);\n const id = ctx.newId();\n const value = annotationValue({\n id,\n key: a.key ?? nextAnnotationKey(taken, kind),\n kind,\n ...(a.on ? { on: a.on } : {}),\n x: Math.round(a.x),\n y: Math.round(a.y),\n ...(a.width != null ? { width: Math.round(a.width) } : {}),\n ...(a.height != null ? { height: Math.round(a.height) } : {}),\n ...(a.color != null ? { color: a.color } : {}),\n ...(a.size != null ? { size: a.size } : {}),\n text: a.text,\n });\n const order = levelId === ROOT ? ROOT_ORDER : SUBFLOW_ORDER;\n if (level.annotations.length === 0)\n tx.apply((f) =>\n setIn(f, level.annotationsPath, [value], { before: after(order, 'annotations') }),\n );\n else tx.apply((f) => setIn(f, [...level.annotationsPath, level.annotations.length], value));\n return id;\n}\n\n/** A node's stored position, when the file has one (a tie converts through it). */\nfunction storedAt(st: State, id: Ulid | undefined): Position | undefined {\n return id ? st.doc.layout?.[id] : undefined;\n}\n\nfunction updateAnnotation(\n tx: YamlTransaction,\n cmd: Extract<FlowCommand, { kind: 'updateAnnotation' }>,\n): void {\n const st = state(tx);\n const entry = st.model.annotations.get(cmd.id);\n if (!entry) throw new CommandError('not-found', 'That annotation is no longer in the flow');\n const { annotation: a, path, level: levelId } = entry;\n const p = { ...cmd.patch };\n const kind = p.kind ?? a.kind ?? 'note';\n checkAnnotation(st, levelId, kind, p);\n if (p.key !== undefined && p.key !== a.key) {\n const level = levelOf(st, levelId);\n if (level.annotations.some((x) => x?.key === p.key))\n throw new CommandError('key-taken', `Key \"${p.key}\" is already used on this level`);\n }\n // Tying, untying or re-tying keeps the Note where it is shown, as far as stored positions tell.\n if (\n p.on !== undefined &&\n (p.on ?? undefined) !== a.on &&\n p.x === undefined &&\n p.y === undefined\n ) {\n const from = storedAt(st, a.on);\n const to = storedAt(st, p.on ?? undefined);\n const shown = a.on\n ? from\n ? { x: from.x + a.x, y: from.y + a.y }\n : undefined\n : { x: a.x, y: a.y };\n if (p.on) {\n const placed = shown && to ? { x: shown.x - to.x, y: shown.y - to.y } : TIE_OFFSET;\n p.x = placed.x;\n p.y = placed.y;\n } else if (shown) {\n p.x = shown.x;\n p.y = shown.y;\n }\n }\n if (kind !== 'note' && a.on) p.on = null;\n for (const k of ANNOTATION_ORDER) {\n if (k === 'id' || !(k in p)) continue;\n const v = p[k as keyof AnnotationPatch];\n if (v === undefined) continue;\n const value =\n k === 'text'\n ? new Literal(String(v))\n : typeof v === 'number'\n ? Math.round(v)\n : (v as YamlValue);\n if (k === 'text') tx.apply((f) => setIn(f, [...path, 'text'], value));\n else setField(tx, path, k, value, ANNOTATION_ORDER);\n }\n}\n\n// ---- re-import (AFD-61) --------------------------------------------------------------------\n\nfunction reimport(\n tx: YamlTransaction,\n ctx: CommandContext,\n cmd: Extract<FlowCommand, { kind: 'reimport' }>,\n notes: string[],\n): Ulid | undefined {\n for (const u of cmd.updates) {\n const { path } = nodeAt(state(tx), u.node);\n for (const k of IMPORTED_FIELDS)\n setField(tx, path, k, (u.fields[k] ?? null) as YamlValue, NODE_ORDER);\n tx.apply((f) => setIn(f, [...path, 'origin', 'design'], u.design));\n }\n for (const k of cmd.keep ?? []) {\n const { path } = nodeAt(state(tx), k.node);\n tx.apply((f) => setIn(f, [...path, 'origin', 'design'], k.design));\n }\n for (const id of cmd.gone) {\n const { path } = nodeAt(state(tx), id);\n tx.apply((f) => setIn(f, [...path, 'origin', 'gone'], true));\n }\n let first: Ulid | undefined;\n // AFD-148: an add can follow a step added earlier in this plan, named by its ID in the plan.\n const created = new Map<Ulid, Ulid>();\n for (const a of cmd.adds) {\n // On the ok_hosts wire of the step before it; without one, at the end of the top level.\n const st = state(tx);\n const anchor = a.after ? (created.get(a.after) ?? a.after) : undefined;\n const after = anchor ? st.model.nodes.get(anchor) : undefined;\n const level = after ? levelOf(st, after.level) : levelOf(st, ROOT);\n const wire = after\n ? level.edges.find((e) => e?.from?.node === after.node.id && e.from.port === 'ok_hosts')\n : undefined;\n const id = addNode(\n tx,\n ctx,\n {\n kind: 'addNode',\n ...(after && after.level !== ROOT ? { parent: after.level } : {}),\n type: a.step.type,\n title: a.step.title,\n ...(a.step.intent ? { intent: a.step.intent } : {}),\n ...(a.step.impl ? { impl: a.step.impl } : {}),\n ...(wire\n ? { insertOn: wire.id }\n : after\n ? { connectFrom: { node: after.node.id, port: 'ok_hosts' } }\n : {}),\n },\n notes,\n );\n const { path } = nodeAt(state(tx), id);\n for (const k of ['settings', 'ports'] as const)\n if (a.step[k] !== undefined) setField(tx, path, k, a.step[k] as YamlValue, NODE_ORDER);\n if (a.step.origin)\n setField(tx, path, 'origin', a.step.origin as unknown as YamlValue, NODE_ORDER);\n created.set(a.step.id, id);\n first ??= id;\n }\n const kept = cmd.keep?.length ?? 0;\n if (cmd.updates.length + cmd.adds.length + cmd.gone.length + kept > 0)\n notes.push(\n `re-import: ${cmd.updates.length} step(s) took the source's version, ${cmd.adds.length} new, ${cmd.gone.length} flagged as gone, ${kept} kept as designed`,\n );\n return first;\n}\n\n// ---- paste nodes (AFD-17) ------------------------------------------------------------------\n\n/**\n * Nodes from the clipboard become new nodes on a level, in one edit. Every node, inner node and\n * wire gets a new ID; keys stay unless the level has them (then `-2`, \u2026) and references between\n * the pasted nodes follow; tested becomes implemented (the copy has not run here). Wires to nodes\n * that were not copied are not created; references to them stay as written. The group keeps its\n * relative layout around `position`; inner levels keep theirs. Start nodes are not pasted.\n */\nfunction pasteNodes(\n tx: YamlTransaction,\n ctx: CommandContext,\n cmd: Extract<FlowCommand, { kind: 'pasteNodes' }>,\n): Ulid[] {\n const clip = parseClip(cmd.text);\n if (typeof clip === 'string') throw new CommandError('bad-clipboard', clip);\n const source = clip.nodes.filter((n) => n.type !== 'start');\n const st = state(tx);\n // Annotations are format 2 (AFD-64): a format 1 file takes the nodes without them.\n const notes = formatOf(st.doc) >= 2 ? clip.annotations : [];\n if (source.length === 0 && notes.length === 0)\n throw new CommandError('bad-clipboard', 'Nothing to paste: a flow has one start node');\n const levelId = cmd.level ?? ROOT;\n const parent = levelId === ROOT ? undefined : nodeAt(st, levelId);\n if (parent && parent.node.type !== 'subflow')\n throw new CommandError('bad-type', `${parent.node.title} is not a subflow`);\n const level = st.model.levels.get(levelId);\n if (!parent && !level) throw new CommandError('not-found', `No level ${levelId}`);\n\n // New IDs for every node at every depth, and for every wire.\n const ids = new Map<string, Ulid>();\n const mint = (old: string | undefined): Ulid => {\n const fresh = ctx.newId();\n if (old) ids.set(old, fresh);\n return fresh;\n };\n const remapNode = (n: FlowNode): FlowNode => {\n const copy = structuredClone(n) as FlowNode;\n copy.id = mint(n.id);\n if (copy.status === 'tested') copy.status = 'implemented';\n delete copy.tested;\n if (copy.subflow) {\n copy.subflow.nodes = (copy.subflow.nodes ?? []).map(remapNode);\n const inner = copy.subflow;\n inner.edges = (inner.edges ?? []).map((e) => ({\n id: ctx.newId(),\n from: { node: ids.get(e.from.node) ?? e.from.node, port: e.from.port },\n to: { node: ids.get(e.to.node) ?? e.to.node, port: e.to.port },\n }));\n if (inner.boundary) {\n const b = inner.boundary;\n if (b.in) b.in = ids.get(b.in) ?? b.in;\n for (const refs of Object.values(b.outputs ?? {}))\n for (const r of refs ?? []) r.node = ids.get(r.node) ?? r.node;\n }\n if (inner.annotations)\n inner.annotations = inner.annotations.filter(Boolean).map((a) => ({\n ...a,\n id: ctx.newId(),\n ...(a.on ? { on: ids.get(a.on) ?? a.on } : {}),\n }));\n delete inner.layout;\n }\n return copy;\n };\n const nodes = source.map(remapNode);\n\n // Keys unique on the target level; references between the pasted nodes follow a new key.\n const taken = level ? levelKeys(level, st.model) : new Set<string>();\n const renamed = new Map<string, string>();\n nodes.forEach((n, i) => {\n const wanted = SLUG.test(n.key ?? '') ? (n.key as string) : slugify(n.title ?? n.type, n.type);\n const key = uniqueKey(wanted, taken);\n taken.add(key);\n const old = source[i]?.key;\n if (old && old !== key) renamed.set(old, key);\n n.key = key;\n n.title ??= key;\n });\n // Inner levels see the pasted keys too, unless they have a node of the same key.\n const follow = (list: FlowNode[], shadow: ReadonlySet<string>) => {\n for (const n of list) {\n for (const side of ['inputs', 'outputs'] as const)\n for (const field of Object.values(n[side] ?? {})) {\n const [head, ...rest] = (field?.from ?? '').split('.');\n const key = head && !shadow.has(head) ? renamed.get(head) : undefined;\n if (field && key) field.from = [key, ...rest].join('.');\n }\n const inner = n.subflow?.nodes ?? [];\n if (inner.length > 0)\n follow(inner, new Set([...shadow, ...inner.flatMap((c) => (c?.key ? [c.key] : []))]));\n }\n };\n if (renamed.size > 0) follow(nodes, new Set());\n\n const pasted = new Set(source.map((n) => n.id));\n const edges = clip.edges\n .filter((e) => pasted.has(e.from.node) && pasted.has(e.to.node))\n .map((e) => ({\n id: ctx.newId(),\n from: { node: ids.get(e.from.node) as Ulid, port: e.from.port },\n to: { node: ids.get(e.to.node) as Ulid, port: e.to.port },\n }));\n // Ports left open on purpose come along, written in this file's format (AFD-51).\n const target = state(tx).doc;\n const decisions = clip.decisions.flatMap((d, i) => {\n const a = acceptedOf(d, i);\n if (a?.area !== 'port' || !a.node || !ids.has(a.node)) return [];\n return [decisionItem(target, 'port', a.what, ids.get(a.node) as Ulid, a.reason ?? '', a.by)];\n });\n\n // Annotations: new IDs and keys; a Note stays on its node when that node came along.\n const keysTaken = (level?.annotations ?? []).map((a) => a?.key);\n const annotations = notes.map((a) => {\n const kind = a.kind ?? 'note';\n const key =\n a.key && SLUG.test(a.key) && !keysTaken.includes(a.key)\n ? a.key\n : nextAnnotationKey(keysTaken, kind);\n keysTaken.push(key);\n const tied = a.on ? ids.get(a.on) : undefined;\n // A Note whose node stayed behind keeps its place on the canvas, untied.\n const base = a.on && !tied ? clip.layout[a.on] : undefined;\n return {\n ...a,\n id: ctx.newId(),\n key,\n ...(tied ? { on: tied } : { on: undefined }),\n ...(base ? { x: base.x + a.x, y: base.y + a.y } : {}),\n };\n });\n\n // Positions: the group keeps its shape around `position`; inner levels keep theirs.\n const positions: Record<Ulid, Position> = {};\n const top = [\n ...source.map((n) => clip.layout[n.id]).filter((p): p is Position => !!p),\n ...annotations.filter((a) => !a.on).map((a) => ({ x: a.x, y: a.y })),\n ];\n const anchor = top.length\n ? { x: Math.min(...top.map((p) => p.x)), y: Math.min(...top.map((p) => p.y)) }\n : undefined;\n source.forEach((n, i) => {\n const at = clip.layout[n.id];\n const id = nodes[i]?.id as Ulid;\n if (cmd.position && at && anchor)\n positions[id] = { x: cmd.position.x + at.x - anchor.x, y: cmd.position.y + at.y - anchor.y };\n else if (cmd.position) positions[id] = { x: cmd.position.x, y: cmd.position.y + i * 120 };\n else if (at) positions[id] = { x: at.x + 40, y: at.y + 40 };\n });\n for (const [old, fresh] of ids)\n if (!source.some((n) => n.id === old) && clip.layout[old])\n positions[fresh] = clip.layout[old] as Position;\n for (const a of annotations) {\n if (a.on) continue;\n const at = { x: a.x, y: a.y };\n const moved =\n cmd.position && anchor\n ? { x: cmd.position.x + at.x - anchor.x, y: cmd.position.y + at.y - anchor.y }\n : cmd.position\n ? cmd.position\n : { x: at.x + 40, y: at.y + 40 };\n a.x = Math.round(moved.x);\n a.y = Math.round(moved.y);\n }\n const annotationItems = annotations.map((a) => annotationValue(a));\n\n const ops: Op[] = [];\n const append = (path: Path, values: unknown[], order: readonly string[]) => {\n if (values.length === 0) return;\n const items = values as YamlValue[];\n if (tx.current.doc.getIn(path) !== undefined)\n for (const item of items) ops.push((f) => insertItem(f, path, 'end', item));\n else ops.push((f) => setIn(f, path, items, { before: after(order, path.at(-1) as string) }));\n };\n const subflow = parent?.node.subflow;\n const entry = nodes[0]?.id;\n if (parent && !subflow) {\n // A subflow without an inner graph: the pasted nodes are its first level (D-23 entry).\n const body: Record<string, YamlValue> = { nodes: nodes as unknown as YamlValue[] };\n if (edges.length > 0) body.edges = edges as unknown as YamlValue[];\n if (annotationItems.length > 0) body.annotations = annotationItems;\n if (entry) body.boundary = { in: entry };\n ops.push((f) =>\n setIn(f, [...parent.path, 'subflow'], body, { before: after(NODE_ORDER, 'subflow') }),\n );\n } else {\n const level = levelOf(st, levelId);\n const order = parent ? SUBFLOW_ORDER : ROOT_ORDER;\n append(level.nodesPath, nodes, order);\n append(level.edgesPath, edges, order);\n append(level.annotationsPath, annotationItems, order);\n if (entry && parent && !subflow?.nodes?.length && !subflow?.boundary?.in)\n ops.push(...boundaryOps(st, parent.node.id, { ...subflow?.boundary, in: entry }));\n }\n append(['decisions'], decisions, ROOT_ORDER);\n tx.applyAll(ops);\n // Nodes shown at auto positions are written too, or the level would be stacked below the paste.\n setPositions(tx, { ...cmd.freeze, ...positions });\n return nodes.map((n) => n.id);\n}\n\n/**\n * AFD-50: every node a command changed, and the subflows around it, takes the status the rule\n * gives it (status.ts), deepest first, so a subflow sees its steps' new statuses. A node that\n * stops being tested loses its evidence. Nodes the command did not touch keep what they have.\n */\nfunction settleStatuses(tx: YamlTransaction, ids: ReadonlySet<Ulid>): void {\n if (ids.size === 0) return;\n const first = state(tx);\n const todo = new Map<Ulid, number>();\n for (const id of ids) {\n let at: Ulid | undefined = id;\n for (let depth = 0; at && at !== ROOT && first.model.nodes.has(at); depth++) {\n todo.set(at, Math.max(todo.get(at) ?? 0, depth));\n at = first.model.nodes.get(at)?.level;\n }\n }\n const levelDepth = (id: Ulid) => {\n let n = 0;\n for (let at = first.model.nodes.get(id)?.level; at && at !== ROOT; n++)\n at = first.model.nodes.get(at)?.level;\n return n;\n };\n // AFD-162: a subflow's status follows its steps, so deeper levels settle first; the nodes of one\n // depth are settled together, against one parse (paste of many nodes parsed once per node).\n const byDepth = new Map<number, Ulid[]>();\n for (const id of todo.keys()) {\n const d = levelDepth(id);\n byDepth.set(d, [...(byDepth.get(d) ?? []), id]);\n }\n for (const depth of [...byDepth.keys()].sort((a, b) => b - a)) {\n const st = state(tx);\n const changes: { id: Ulid; path: Path; want: NodeStatus; tested: boolean }[] = [];\n for (const id of byDepth.get(depth) ?? []) {\n const entry = st.model.nodes.get(id);\n if (!entry || !hasStatus(entry.node)) continue;\n const want = statusFor(st.doc, entry.node);\n const have = entry.node.status;\n if (have === want || (have === undefined && want === 'draft')) continue;\n changes.push({ id, path: entry.path, want, tested: have === 'tested' });\n }\n if (changes.length === 0) continue;\n const dropped = changes.filter((c) => c.tested).map((c) => c.id);\n const ops: Op[] = changes.map(\n (c) => (f: YamlFile) =>\n setIn(f, [...c.path, 'status'], c.want, { before: after(NODE_ORDER, 'status') }),\n );\n for (const c of changes)\n if (c.tested && st.model.nodes.get(c.id)?.node.tested !== undefined)\n ops.push((f) => deleteKey(f, c.path, 'tested'));\n try {\n tx.applyAll(ops);\n } catch (e) {\n // Flow-style node mappings: one edit at a time (key paths, so the ops still apply).\n if (!(e instanceof YamlEditError && e.code === 'overlap')) throw e;\n for (const op of ops) tx.apply(op);\n }\n // The format 1 decisions of nodes that were tested (their records went above).\n if (dropped.length) dropTestedRecords(tx, dropped);\n }\n}\n\nexport function implementedAgain(tx: YamlTransaction, ids: readonly Ulid[]): void {\n const st = state(tx);\n tx.applyAll(\n ids.map((id) => (f: YamlFile) => setIn(f, [...nodeAt(st, id).path, 'status'], 'implemented')),\n );\n dropTestedRecords(tx, ids);\n}\n\n/** Commands that cannot change a node's design (positions, statuses, drift decisions). */\nconst NO_DESIGN = new Set<FlowCommand['kind']>([\n // The format, not the design: no node goes back to implemented over it.\n 'upgradeFormat',\n // Annotations explain the flow; they are not its design (AFD-64).\n 'addAnnotation',\n 'updateAnnotation',\n 'moveNodes',\n 'tidyUp',\n 'unplaceNodes',\n 'setStatuses',\n 'ignoreDrift',\n 'clearDriftIgnore',\n 'acceptFinding',\n 'clearFindingAccept',\n 'acceptCheck',\n 'clearCheckAccept',\n 'markTested',\n]);\n\n/** `parsed` may carry the caller's existing parse of `text` (saves one parse per command). */\nexport function planCommand(\n text: string,\n cmd: FlowCommand,\n ctx: CommandContext,\n parsed?: YamlFile,\n): CommandResult {\n const tx = new YamlTransaction(text, parsed);\n const before = NO_DESIGN.has(cmd.kind) ? undefined : (tx.current.doc.toJS() as FlowDocument);\n let created: Ulid | undefined;\n let pasted: Ulid[] | undefined;\n /** Nodes whose design a command only re-references (their tested status stays). */\n const rereferenced: Ulid[] = [];\n const notes: string[] = [];\n switch (cmd.kind) {\n case 'addNode':\n created = addNode(tx, ctx, cmd, notes);\n break;\n case 'updateNode':\n updateNode(tx, cmd, notes);\n break;\n case 'askAtRunTime':\n askAtRunTime(tx, cmd, notes);\n break;\n case 'deleteNode':\n deleteNode(tx, cmd.id);\n break;\n case 'deleteNodes': {\n // AFD-193: what reads the nodes going away, found before they go.\n const dangling = danglingRefs(state(tx), cmd.ids);\n if (cmd.heal && cmd.ids.length > 0) healAround(tx, cmd.ids, cmd.edges ?? [], notes);\n // Wires first; each item is looked up again, so a wire of a deleted node or the child of a\n // deleted subflow is simply gone already.\n let removed = removeEdgesAtOnce(tx, cmd.edges ?? []);\n try {\n removed += deleteNodesAtOnce(tx, cmd.ids);\n } catch (e) {\n // AFD-162: a flow-style list rendered again overlapped another edit; one by one then.\n if (!(e instanceof YamlEditError && e.code === 'overlap')) throw e;\n for (const id of cmd.ids)\n if (state(tx).model.nodes.has(id)) {\n deleteNode(tx, id);\n removed++;\n }\n }\n removed += deleteAnnotations(tx, cmd.annotations ?? []);\n if (removed === 0) throw new CommandError('not-found', 'Nothing to delete');\n dropDangling(tx, dangling, notes);\n break;\n }\n case 'moveNodes':\n case 'tidyUp':\n setPositions(tx, cmd.positions);\n if (cmd.annotations) moveAnnotations(tx, cmd.annotations);\n break;\n case 'addAnnotation':\n created = addAnnotation(tx, ctx, cmd);\n break;\n case 'updateAnnotation':\n updateAnnotation(tx, cmd);\n break;\n case 'unplaceNodes':\n unplaceNodes(tx, cmd.ids);\n break;\n case 'connect':\n created = addEdge(tx, ctx, cmd.from, cmd.to);\n break;\n case 'applyPattern':\n created = applyPattern(tx, ctx, cmd, notes);\n break;\n case 'setDecision':\n setDecision(tx, cmd);\n break;\n case 'clearDecision':\n nodeAt(state(tx), cmd.node);\n tx.applyAll(decisionRemovalOps(state(tx), cmd.node, cmd.port));\n break;\n case 'rewire':\n rewire(tx, cmd.edge, cmd.to);\n break;\n case 'rewireFrom':\n rewireFrom(tx, cmd.edge, cmd.from);\n break;\n case 'spliceNode':\n spliceNode(tx, ctx, cmd);\n break;\n case 'detachNodes':\n detachNodes(tx, cmd.ids, notes);\n break;\n case 'setDisabled':\n if (cmd.ids.length === 0) throw new CommandError('not-found', 'No nodes named');\n setDisabled(tx, cmd.ids, cmd.disabled);\n break;\n case 'disconnect':\n removeEdgeById(tx, cmd.edge);\n break;\n case 'setPortEnabled':\n setPortEnabled(tx, cmd);\n break;\n case 'setContractField':\n setContractField(tx, cmd, notes);\n break;\n case 'useFact': {\n const st = state(tx);\n const setter = nodeAt(st, cmd.setter).node;\n const reader = nodeAt(st, cmd.reader).node;\n if (!setFactNames(setter.impl).includes(cmd.name))\n throw new CommandError('no-fact', `${setter.title} does not set ${cmd.name}`);\n const from = `${setter.key}.${cmd.name}`;\n if (!setter.outputs?.[cmd.name])\n setContractField(\n tx,\n {\n kind: 'setContractField',\n target: cmd.setter,\n side: 'outputs',\n name: cmd.name,\n field: { type: 'any' },\n },\n notes,\n );\n const inputs = reader.inputs ?? {};\n if (!Object.values(inputs).some((f) => f?.from === from)) {\n let name = cmd.name;\n for (let i = 2; inputs[name] && inputs[name]?.from !== from; i++) name = `${cmd.name}_${i}`;\n setContractField(\n tx,\n {\n kind: 'setContractField',\n target: cmd.reader,\n side: 'inputs',\n name,\n field: { type: 'any', from },\n },\n notes,\n );\n }\n break;\n }\n case 'setBinding':\n setBinding(tx, cmd, notes);\n break;\n case 'setStatuses': {\n const v2 = formatOf(state(tx).doc) >= 2;\n if (v2 && !cmd.run && Object.values(cmd.statuses).includes('tested'))\n throw new CommandError('needs-run', 'Tested from a run needs the run (format 2 keeps it)');\n for (const [id, status] of Object.entries(cmd.statuses)) {\n const { path } = nodeAt(state(tx), id);\n setField(tx, path, 'status', status, NODE_ORDER);\n if (v2 && status === 'tested' && cmd.run) {\n const record: TestedRecord = {\n run: cmd.run.id,\n ...(cmd.run.flowVersion !== undefined ? { flow_version: cmd.run.flowVersion } : {}),\n ...(cmd.run.commit ? { commit: cmd.run.commit } : {}),\n };\n setField(tx, path, 'tested', record as YamlValue, NODE_ORDER);\n }\n }\n dropTestedRecords(\n tx,\n Object.entries(cmd.statuses)\n .filter(([, s]) => s !== 'tested')\n .map(([id]) => id),\n );\n break;\n }\n case 'markTested':\n markTested(tx, cmd);\n break;\n case 'upgradeFormat':\n formatGuard(() => migrate(tx));\n notes.push(`Upgraded to flow format ${CURRENT_FORMAT}; one undo step reverts it`);\n break;\n case 'ignoreDrift':\n ignoreDrift(tx, cmd);\n break;\n case 'clearDriftIgnore':\n removeDecisions(\n tx,\n acceptedAll(state(tx).doc)\n .filter((a) => a.area === 'drift' && a.node === cmd.node && a.what === cmd.item)\n .map((a) => a.index),\n );\n break;\n case 'acceptCheck':\n acceptCheck(tx, cmd);\n break;\n case 'clearCheckAccept': {\n const what = checkWhat(cmd.code, cmd.subject);\n removeDecisions(\n tx,\n acceptedAll(state(tx).doc)\n .filter((a) => a.area === 'check' && a.node === cmd.node && a.what === what)\n .map((a) => a.index),\n );\n break;\n }\n case 'updateFlow':\n updateFlow(tx, cmd.patch);\n break;\n case 'acceptFinding':\n acceptFinding(tx, cmd);\n break;\n case 'clearFindingAccept':\n clearFindingAccept(tx, cmd.finding);\n break;\n case 'setBoundaryIn':\n setBoundaryIn(tx, cmd);\n break;\n case 'pasteNodes':\n pasted = pasteNodes(tx, ctx, cmd);\n created = pasted[0];\n break;\n case 'addReference':\n created = addReference(tx, ctx, cmd);\n break;\n case 'updateReference':\n updateReference(tx, ctx, cmd);\n break;\n case 'reimport':\n created = reimport(tx, ctx, cmd, notes);\n break;\n case 'unlinkReference': {\n const { node, path } = nodeAt(state(tx), cmd.id);\n if (!node.ref) throw new CommandError('not-shared', `${node.title} is not a shared subflow`);\n setField(tx, path, 'ref', null, NODE_ORDER);\n break;\n }\n case 'dissolveSubflow': {\n // Read before the subflow goes: where it stood, and its steps with their places inside.\n const was = state(tx);\n const layout = was.doc.layout ?? {};\n const at = layout[cmd.id];\n const steps = (was.model.nodes.get(cmd.id)?.node.subflow?.nodes ?? [])\n .filter((n) => !!n?.id)\n .map((n) => n.id);\n rereferenced.push(...dissolveSubflow(tx, ctx, cmd.id, notes));\n if (cmd.place) {\n const placed = steps.filter((id) => layout[id]);\n if (at && placed.length === steps.length && steps.length > 0) {\n const left = Math.min(...placed.map((id) => (layout[id] as Position).x));\n const top = Math.min(...placed.map((id) => (layout[id] as Position).y));\n setPositions(\n tx,\n Object.fromEntries(\n placed.map((id) => {\n const p = layout[id] as Position;\n return [id, { x: at.x + p.x - left, y: at.y + p.y - top }];\n }),\n ),\n );\n } else unplaceNodes(tx, steps);\n }\n break;\n }\n case 'extractSubflow': {\n const r = extractSubflow(tx, ctx, cmd);\n created = r.id;\n rereferenced.push(...r.rewritten);\n break;\n }\n case 'connectBoundary':\n connectBoundary(tx, cmd);\n break;\n case 'disconnectBoundary':\n editExit(tx, cmd.subflow, cmd.from, cmd.port, () => null);\n break;\n case 'setExitReason': {\n const reason = cmd.reason?.trim();\n editExit(tx, cmd.subflow, cmd.from, cmd.port, (e) => ({\n node: e.node,\n port: e.port,\n ...(reason ? { reason } : {}),\n }));\n break;\n }\n }\n let dropped: Ulid[] | undefined;\n // Format 2 settles the statuses of what changed; format 1 files keep theirs (ADR-0025).\n const settle = formatOf(before ?? (tx.current.doc.toJS() as FlowDocument)) >= 2;\n const changed = new Set<Ulid>();\n if (before) {\n // A status the same command sets is the user's choice and stays.\n const keep = new Set<Ulid>();\n if (cmd.kind === 'updateNode' && cmd.patch.status !== undefined) keep.add(cmd.id);\n for (const n of rereferenced) keep.add(n);\n const after = tx.current.doc.toJS() as FlowDocument;\n dropped = testedDropBack(before, after, keep);\n if (dropped.length > 0) implementedAgain(tx, dropped);\n else dropped = undefined;\n if (settle) {\n const was = nodeDesigns(before);\n for (const [id, design] of Object.entries(nodeDesigns(after)))\n if (was[id] !== design) changed.add(id);\n if (created) changed.add(created);\n }\n }\n if (settle) {\n if (cmd.kind === 'setStatuses') for (const id of Object.keys(cmd.statuses)) changed.add(id);\n if (cmd.kind === 'markTested' || cmd.kind === 'updateNode') changed.add(cmd.id);\n settleStatuses(tx, changed);\n }\n return {\n edits: tx.edits(),\n text: tx.text,\n file: tx.current,\n created,\n pasted,\n dropped,\n ...(notes.length ? { notes } : {}),\n };\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["level", "id", "item", "enclosing", "key", "lv", "after"]
7
+ }