@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.
- package/README.md +1 -1
- package/dist/ai/describe.js +4 -3
- package/dist/ai/handlers.js +16 -15
- package/dist/ai/handlers.js.map +1 -1
- package/dist/ai/ops.js +5 -4
- package/dist/ai/scenarios.js +8 -6
- package/dist/awx/import.js +6 -5
- package/dist/catalog/draft.d.ts +2 -0
- package/dist/catalog/draft.js +23 -4
- package/dist/catalog/draft.js.map +2 -2
- package/dist/chunks/{chunk-BXHI5EQM.js → chunk-2DT5DOSO.js} +43 -1
- package/dist/chunks/chunk-2DT5DOSO.js.map +7 -0
- package/dist/chunks/{chunk-CXVJWFGT.js → chunk-2MJKBPGG.js} +2 -2
- package/dist/chunks/{chunk-JTWR3TGG.js → chunk-2P3JEHLH.js} +4 -4
- package/dist/chunks/{chunk-H7Z2FBRD.js → chunk-3Z4WABFK.js} +6 -6
- package/dist/chunks/{chunk-ZAYNYPCX.js → chunk-ARA3VJR2.js} +2 -2
- package/dist/chunks/{chunk-TPRZZHXA.js → chunk-BNMW6KWK.js} +7 -7
- package/dist/chunks/{chunk-CM23ODBB.js → chunk-DL4LYODQ.js} +2 -2
- package/dist/chunks/chunk-FIKPXL6E.js +23 -0
- package/dist/chunks/chunk-FIKPXL6E.js.map +7 -0
- package/dist/chunks/{chunk-ABYJBONR.js → chunk-FMCBTYUM.js} +3 -3
- package/dist/chunks/{chunk-J7KCGVHU.js → chunk-HPRG2672.js} +2 -2
- package/dist/chunks/{chunk-NT62IE3Y.js → chunk-IXW7A4M7.js} +2 -2
- package/dist/chunks/{chunk-DHU774ES.js → chunk-IZJPLWDY.js} +2 -2
- package/dist/chunks/{chunk-MZ6IJWB2.js → chunk-KZALUEFT.js} +2 -2
- package/dist/chunks/{chunk-XOPGOWNQ.js → chunk-O5Y3AZ4X.js} +1 -1
- package/dist/chunks/chunk-O5Y3AZ4X.js.map +7 -0
- package/dist/chunks/{chunk-2QQC4IZ7.js → chunk-PNLY5IWM.js} +8 -8
- package/dist/chunks/chunk-PNLY5IWM.js.map +7 -0
- package/dist/chunks/{chunk-5XGAGNH5.js → chunk-QMIXDOU6.js} +5 -5
- package/dist/chunks/{chunk-T5UB4MBB.js → chunk-TOTSB4HG.js} +41 -1
- package/dist/chunks/chunk-TOTSB4HG.js.map +7 -0
- package/dist/chunks/{chunk-7GLSXIZ3.js → chunk-W2CSOAIB.js} +2 -2
- package/dist/chunks/{chunk-UXIXXEIW.js → chunk-WSARMPYU.js} +2 -2
- package/dist/engine/bypass.js +4 -2
- package/dist/engine/engines.js +6 -4
- package/dist/engine/files.js +6 -4
- package/dist/engine/optionA.js +5 -3
- package/dist/engine/partial.js +3 -1
- package/dist/engine/partial.js.map +1 -1
- package/dist/engine/preview.js +6 -4
- package/dist/engine/preview.js.map +1 -1
- package/dist/engine/writePlan.js +9 -8
- package/dist/flow/commands.d.ts +10 -0
- package/dist/flow/commands.js +3 -1
- package/dist/flow/facts.d.ts +6 -0
- package/dist/flow/facts.js +13 -0
- package/dist/flow/facts.js.map +7 -0
- package/dist/flow/save.js +3 -1
- package/dist/flow/save.js.map +1 -1
- package/dist/flow/validate.js +3 -2
- package/dist/import/outline.js +7 -6
- package/dist/import/playbook.js +5 -4
- package/dist/import/source.js +2 -2
- package/dist/lens/caption.js +1 -1
- package/dist/lens/data.js +3 -1
- package/dist/lens/index.js +11 -9
- package/dist/lens/index.js.map +1 -1
- package/dist/lens/types.d.ts +2 -0
- package/dist/lens/types.js +1 -1
- package/dist/messageCheck.js +2 -0
- package/dist/messageCheck.js.map +2 -2
- package/dist/protocol.d.ts +17 -0
- package/dist/scenario/live.js +7 -5
- package/dist/scenario/simulate.js +6 -4
- package/dist/view/flowFacts.js +9 -8
- package/dist/view/flowFacts.js.map +1 -1
- package/dist/view/jinjaComplete.js +3 -3
- package/dist/view/serverChange.d.ts +23 -0
- package/dist/view/serverChange.js +48 -0
- package/dist/view/serverChange.js.map +7 -0
- package/package.json +1 -1
- package/dist/chunks/chunk-2QQC4IZ7.js.map +0 -7
- package/dist/chunks/chunk-BXHI5EQM.js.map +0 -7
- package/dist/chunks/chunk-T5UB4MBB.js.map +0 -7
- package/dist/chunks/chunk-XOPGOWNQ.js.map +0 -7
- /package/dist/chunks/{chunk-CXVJWFGT.js.map → chunk-2MJKBPGG.js.map} +0 -0
- /package/dist/chunks/{chunk-JTWR3TGG.js.map → chunk-2P3JEHLH.js.map} +0 -0
- /package/dist/chunks/{chunk-H7Z2FBRD.js.map → chunk-3Z4WABFK.js.map} +0 -0
- /package/dist/chunks/{chunk-ZAYNYPCX.js.map → chunk-ARA3VJR2.js.map} +0 -0
- /package/dist/chunks/{chunk-TPRZZHXA.js.map → chunk-BNMW6KWK.js.map} +0 -0
- /package/dist/chunks/{chunk-CM23ODBB.js.map → chunk-DL4LYODQ.js.map} +0 -0
- /package/dist/chunks/{chunk-ABYJBONR.js.map → chunk-FMCBTYUM.js.map} +0 -0
- /package/dist/chunks/{chunk-J7KCGVHU.js.map → chunk-HPRG2672.js.map} +0 -0
- /package/dist/chunks/{chunk-NT62IE3Y.js.map → chunk-IXW7A4M7.js.map} +0 -0
- /package/dist/chunks/{chunk-DHU774ES.js.map → chunk-IZJPLWDY.js.map} +0 -0
- /package/dist/chunks/{chunk-MZ6IJWB2.js.map → chunk-KZALUEFT.js.map} +0 -0
- /package/dist/chunks/{chunk-5XGAGNH5.js.map → chunk-QMIXDOU6.js.map} +0 -0
- /package/dist/chunks/{chunk-7GLSXIZ3.js.map → chunk-W2CSOAIB.js.map} +0 -0
- /package/dist/chunks/{chunk-UXIXXEIW.js.map → chunk-WSARMPYU.js.map} +0 -0
package/dist/lens/index.js.map
CHANGED
|
@@ -2,6 +2,6 @@
|
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../../src/core/lens/index.ts"],
|
|
4
4
|
"sourcesContent": ["// One entry point for the webview: the active lens's view with accepted findings marked, and the\n// summary card rows of semantic zoom (D-19), which draw on every lens's facts.\nimport { durationSeconds } from '../engine/util';\nimport { acceptedAll } from '../flow/decisions';\nimport { modelOf } from '../flow/model';\nimport type { FlowDocument, FlowNode } from '../flow/types';\nimport type { RunView } from '../protocol';\nimport { formatSeconds, nodeHosts } from '../run/view';\nimport { accessLens } from './access';\nimport { changesLens } from './changes';\nimport { codeLens } from './code';\nimport { incoming, title } from './common';\nimport { dataLens } from './data';\nimport { declaredTarget, inventoryLens } from './inventory';\nimport { timingLens } from './timing';\nimport type { LensFacts, LensId, LensView } from './types';\n\nexport function lensView(\n lens: LensId,\n doc: FlowDocument,\n facts: LensFacts,\n run: RunView | null,\n): LensView {\n const view =\n lens === 'inventory'\n ? inventoryLens(doc, facts.inventory, run, facts.code)\n : lens === 'data'\n ? dataLens(doc)\n : lens === 'code'\n ? codeLens(doc, facts.code)\n : lens === 'access'\n ? accessLens(doc, facts.inventory, facts.code)\n : lens === 'changes'\n ? changesLens(doc, facts.compare)\n : timingLens(doc, facts.timing);\n const accepted = new Map(\n acceptedAll(doc)\n .filter((a) => a.area === 'lens')\n .map((a) => [a.what, { reason: a.reason ?? '', by: a.by }]),\n );\n const rank = (f: LensView['findings'][number]) =>\n (f.accepted ? 2 : 0) + (f.severity === 'warning' ? 0 : 1);\n view.findings = view.findings\n .map((f) => (accepted.has(f.id) ? { ...f, accepted: accepted.get(f.id) } : f))\n .sort((a, b) => rank(a) - rank(b));\n return view;\n}\n\nexport interface SummaryRow {\n label: string;\n value: string;\n}\n\n/** Mockup 08 \"zoomed in or selected\": hosts, limit, data, binding, access, timing. */\nexport function summaryRows(\n doc: FlowDocument,\n node: FlowNode,\n facts: LensFacts,\n run: RunView | null,\n): SummaryRow[] {\n const model = modelOf(doc);\n const rows: SummaryRow[] = [];\n const add = (label: string, value: string | undefined) => {\n if (value) rows.push({ label, value });\n };\n const inv = facts.inventory?.state === 'ready' ? facts.inventory.facts : undefined;\n const targets = inv?.targets ?? facts.inventory?.targets ?? '';\n const pattern = declaredTarget(doc, node, targets, facts.code)?.pattern ?? targets;\n if (pattern) {\n const count = inv?.patterns[pattern]?.count;\n const ran = run?.summary ? nodeHosts(run.summary, node.id).length : undefined;\n add('hosts', `${pattern}${count !== undefined ? ` \u00B7 ${count}` : ''}${ran ? ` \u2192 ${ran}` : ''}`);\n }\n const from = incoming(model, node.id);\n if (from.length > 0)\n add(\n 'limit',\n `${from[0]?.port} from ${title(model, from[0]?.from ?? '')}${from.length > 1 ? ` +${from.length - 1}` : ''}`,\n );\n add('inputs', Object.keys(node.inputs ?? {}).join(', '));\n add('outputs', Object.keys(node.outputs ?? {}).join(', '));\n const code = facts.code?.nodes[node.id];\n if (node.impl?.ref)\n add(node.impl.kind, `${node.impl.ref}${code?.version ? ` ${code.version}` : ''}`);\n if (code?.collection)\n add(\n 'collection',\n `${code.collection}${facts.code?.collections[code.collection] ? ` ${facts.code.collections[code.collection]}` : ''}`,\n );\n add('credential', node.settings?.credential);\n if (node.settings?.become) add('become', 'yes');\n const s = node.settings ?? {};\n const limits = [\n s.serial !== undefined ? `${s.serial}` : '',\n s.timeout ? `timeout ${s.timeout}` : '',\n s.retries ? `retries ${s.retries}` : '',\n ].filter(Boolean);\n add('serial', limits.join(' \u00B7 '));\n const t = facts.timing?.nodes[node.id];\n if (t) add('duration', `avg ${formatSeconds(t.avg)} \u00B7 p95 ${formatSeconds(t.p95)}`);\n else if (durationSeconds(s.timeout) === undefined && run?.summary?.timings?.[node.id]) {\n const x = run.summary.timings[node.id];\n if (x) add('duration', `last ${formatSeconds(x.end - x.start)}`);\n }\n return rows;\n}\n\nexport type { LensFacts, LensId, LensView } from './types';\nexport { LENSES } from './types';\n"],
|
|
5
|
-
"mappings": "
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
package/dist/lens/types.d.ts
CHANGED
|
@@ -62,6 +62,8 @@ export interface DataWire {
|
|
|
62
62
|
to: Ulid;
|
|
63
63
|
label: string;
|
|
64
64
|
title: string;
|
|
65
|
+
/** AFD-287: a value read without an input (a fact an earlier step sets): drawn as a warning. */
|
|
66
|
+
undeclared?: boolean;
|
|
65
67
|
}
|
|
66
68
|
/** A node of the compared version that is gone (AFD-57): drawn as a ghost on its level. */
|
|
67
69
|
export interface GhostNode {
|
package/dist/lens/types.js
CHANGED
package/dist/messageCheck.js
CHANGED
|
@@ -35,6 +35,8 @@ function messageProblem(m) {
|
|
|
35
35
|
return isMap(m.request) ? void 0 : "scenarioEdit: bad request";
|
|
36
36
|
case "runScenarios":
|
|
37
37
|
return strList(m.names) ? void 0 : "runScenarios: bad names";
|
|
38
|
+
case "serverUpdate":
|
|
39
|
+
return typeof m.show === "boolean" ? void 0 : "serverUpdate: bad show";
|
|
38
40
|
case "mergeChoose":
|
|
39
41
|
return str(m.id, 500) && (m.side === "ours" || m.side === "theirs") ? void 0 : "mergeChoose: bad choice";
|
|
40
42
|
case "lens":
|
package/dist/messageCheck.js.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../src/core/messageCheck.ts"],
|
|
4
|
-
"sourcesContent": ["// AFD-165: the host checks what a designer webview sends before acting on it. The webview runs\n// under a strict CSP with no HTML sinks, so a compromised page is unlikely; these checks keep one\n// from turning a message into a git option, a file outside the workspace or a probe argument.\n// Shape only: what a value means (a known ref, a path inside the folder) is checked where it is\n// used.\n\nconst isMap = (v: unknown): v is Record<string, unknown> =>\n !!v && typeof v === 'object' && !Array.isArray(v);\n\nconst str = (v: unknown, max = 4096): v is string => typeof v === 'string' && v.length <= max;\nconst optNum = (v: unknown) => v === undefined || (typeof v === 'number' && Number.isFinite(v));\nconst strList = (v: unknown) =>\n v === undefined || (Array.isArray(v) && v.every((x) => str(x, 200)));\n\n/** A plugin name the probe looks up: dotted words, no option or path syntax. */\nexport const PLUGIN_NAME = /^[A-Za-z0-9_][A-Za-z0-9_.]{0,199}$/;\n\n/** A git revision a designer may ask to compare with: never an option (`-\u2026`), no spaces. */\nexport const GIT_REF = /^[A-Za-z0-9_][A-Za-z0-9_./@{}^~-]{0,199}$/;\n\nconst CATALOG_OPS = new Set(['search', 'doc', 'roles', 'playbooks', 'rebuild']);\n\nfunction catalogProblem(r: unknown): string | undefined {\n if (!isMap(r) || !CATALOG_OPS.has(String(r.op))) return 'catalog: unknown request';\n if (r.op === 'search' && (!str(r.query, 500) || !strList(r.types))) return 'catalog: bad search';\n if (r.op === 'doc' && (!str(r.fqcn) || !PLUGIN_NAME.test(r.fqcn)))\n return 'catalog: not a plugin name';\n return undefined;\n}\n\n/** Why a message from the webview is refused, or undefined when its shape is right. */\nexport function messageProblem(m: unknown): string | undefined {\n if (!isMap(m) || !str(m.type, 64)) return 'not a designer message';\n if ('reqId' in m && !optNum(m.reqId)) return `${m.type}: bad reqId`;\n switch (m.type) {\n case 'openCode':\n return str(m.path) && m.path !== '' && optNum(m.line) ? undefined : 'openCode: bad path';\n case 'openText':\n return m.path === undefined ||\n (Array.isArray(m.path) &&\n m.path.every((p) => str(p, 1000) || (typeof p === 'number' && Number.isInteger(p))))\n ? undefined\n : 'openText: bad path';\n case 'compareWith':\n return str(m.ref, 200) && GIT_REF.test(m.ref) ? undefined : 'compareWith: bad ref';\n case 'catalog':\n return catalogProblem(m.request);\n case 'openLink':\n return str(m.url) ? undefined : 'openLink: bad url';\n case 'copyText':\n return str(m.text, 10_000_000) && optNum(m.count) ? undefined : 'copyText: bad text';\n case 'command':\n return isMap(m.command) && str(m.command.kind, 64) ? undefined : 'command: bad command';\n case 'scenarioEdit':\n return isMap(m.request) ? undefined : 'scenarioEdit: bad request';\n case 'runScenarios':\n return strList(m.names) ? undefined : 'runScenarios: bad names';\n case 'mergeChoose':\n return str(m.id, 500) && (m.side === 'ours' || m.side === 'theirs')\n ? undefined\n : 'mergeChoose: bad choice';\n case 'lens':\n return m.lens === null || str(m.lens, 64) ? undefined : 'lens: bad lens';\n default:\n return undefined;\n }\n}\n"],
|
|
5
|
-
"mappings": ";AAMA,IAAM,QAAQ,CAAC,MACb,CAAC,CAAC,KAAK,OAAO,MAAM,YAAY,CAAC,MAAM,QAAQ,CAAC;AAElD,IAAM,MAAM,CAAC,GAAY,MAAM,SAAsB,OAAO,MAAM,YAAY,EAAE,UAAU;AAC1F,IAAM,SAAS,CAAC,MAAe,MAAM,UAAc,OAAO,MAAM,YAAY,OAAO,SAAS,CAAC;AAC7F,IAAM,UAAU,CAAC,MACf,MAAM,UAAc,MAAM,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,IAAI,GAAG,GAAG,CAAC;AAG7D,IAAM,cAAc;AAGpB,IAAM,UAAU;AAEvB,IAAM,cAAc,oBAAI,IAAI,CAAC,UAAU,OAAO,SAAS,aAAa,SAAS,CAAC;AAE9E,SAAS,eAAe,GAAgC;AACtD,MAAI,CAAC,MAAM,CAAC,KAAK,CAAC,YAAY,IAAI,OAAO,EAAE,EAAE,CAAC,EAAG,QAAO;AACxD,MAAI,EAAE,OAAO,aAAa,CAAC,IAAI,EAAE,OAAO,GAAG,KAAK,CAAC,QAAQ,EAAE,KAAK,GAAI,QAAO;AAC3E,MAAI,EAAE,OAAO,UAAU,CAAC,IAAI,EAAE,IAAI,KAAK,CAAC,YAAY,KAAK,EAAE,IAAI;AAC7D,WAAO;AACT,SAAO;AACT;AAGO,SAAS,eAAe,GAAgC;AAC7D,MAAI,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,EAAG,QAAO;AAC1C,MAAI,WAAW,KAAK,CAAC,OAAO,EAAE,KAAK,EAAG,QAAO,GAAG,EAAE,IAAI;AACtD,UAAQ,EAAE,MAAM;AAAA,IACd,KAAK;AACH,aAAO,IAAI,EAAE,IAAI,KAAK,EAAE,SAAS,MAAM,OAAO,EAAE,IAAI,IAAI,SAAY;AAAA,IACtE,KAAK;AACH,aAAO,EAAE,SAAS,UACf,MAAM,QAAQ,EAAE,IAAI,KACnB,EAAE,KAAK,MAAM,CAAC,MAAM,IAAI,GAAG,GAAI,KAAM,OAAO,MAAM,YAAY,OAAO,UAAU,CAAC,CAAE,IAClF,SACA;AAAA,IACN,KAAK;AACH,aAAO,IAAI,EAAE,KAAK,GAAG,KAAK,QAAQ,KAAK,EAAE,GAAG,IAAI,SAAY;AAAA,IAC9D,KAAK;AACH,aAAO,eAAe,EAAE,OAAO;AAAA,IACjC,KAAK;AACH,aAAO,IAAI,EAAE,GAAG,IAAI,SAAY;AAAA,IAClC,KAAK;AACH,aAAO,IAAI,EAAE,MAAM,GAAU,KAAK,OAAO,EAAE,KAAK,IAAI,SAAY;AAAA,IAClE,KAAK;AACH,aAAO,MAAM,EAAE,OAAO,KAAK,IAAI,EAAE,QAAQ,MAAM,EAAE,IAAI,SAAY;AAAA,IACnE,KAAK;AACH,aAAO,MAAM,EAAE,OAAO,IAAI,SAAY;AAAA,IACxC,KAAK;AACH,aAAO,QAAQ,EAAE,KAAK,IAAI,SAAY;AAAA,IACxC,KAAK;AACH,aAAO,IAAI,EAAE,IAAI,GAAG,MAAM,EAAE,SAAS,UAAU,EAAE,SAAS,YACtD,SACA;AAAA,IACN,KAAK;AACH,aAAO,EAAE,SAAS,QAAQ,IAAI,EAAE,MAAM,EAAE,IAAI,SAAY;AAAA,IAC1D;AACE,aAAO;AAAA,EACX;AACF;",
|
|
4
|
+
"sourcesContent": ["// AFD-165: the host checks what a designer webview sends before acting on it. The webview runs\n// under a strict CSP with no HTML sinks, so a compromised page is unlikely; these checks keep one\n// from turning a message into a git option, a file outside the workspace or a probe argument.\n// Shape only: what a value means (a known ref, a path inside the folder) is checked where it is\n// used.\n\nconst isMap = (v: unknown): v is Record<string, unknown> =>\n !!v && typeof v === 'object' && !Array.isArray(v);\n\nconst str = (v: unknown, max = 4096): v is string => typeof v === 'string' && v.length <= max;\nconst optNum = (v: unknown) => v === undefined || (typeof v === 'number' && Number.isFinite(v));\nconst strList = (v: unknown) =>\n v === undefined || (Array.isArray(v) && v.every((x) => str(x, 200)));\n\n/** A plugin name the probe looks up: dotted words, no option or path syntax. */\nexport const PLUGIN_NAME = /^[A-Za-z0-9_][A-Za-z0-9_.]{0,199}$/;\n\n/** A git revision a designer may ask to compare with: never an option (`-\u2026`), no spaces. */\nexport const GIT_REF = /^[A-Za-z0-9_][A-Za-z0-9_./@{}^~-]{0,199}$/;\n\nconst CATALOG_OPS = new Set(['search', 'doc', 'roles', 'playbooks', 'rebuild']);\n\nfunction catalogProblem(r: unknown): string | undefined {\n if (!isMap(r) || !CATALOG_OPS.has(String(r.op))) return 'catalog: unknown request';\n if (r.op === 'search' && (!str(r.query, 500) || !strList(r.types))) return 'catalog: bad search';\n if (r.op === 'doc' && (!str(r.fqcn) || !PLUGIN_NAME.test(r.fqcn)))\n return 'catalog: not a plugin name';\n return undefined;\n}\n\n/** Why a message from the webview is refused, or undefined when its shape is right. */\nexport function messageProblem(m: unknown): string | undefined {\n if (!isMap(m) || !str(m.type, 64)) return 'not a designer message';\n if ('reqId' in m && !optNum(m.reqId)) return `${m.type}: bad reqId`;\n switch (m.type) {\n case 'openCode':\n return str(m.path) && m.path !== '' && optNum(m.line) ? undefined : 'openCode: bad path';\n case 'openText':\n return m.path === undefined ||\n (Array.isArray(m.path) &&\n m.path.every((p) => str(p, 1000) || (typeof p === 'number' && Number.isInteger(p))))\n ? undefined\n : 'openText: bad path';\n case 'compareWith':\n return str(m.ref, 200) && GIT_REF.test(m.ref) ? undefined : 'compareWith: bad ref';\n case 'catalog':\n return catalogProblem(m.request);\n case 'openLink':\n return str(m.url) ? undefined : 'openLink: bad url';\n case 'copyText':\n return str(m.text, 10_000_000) && optNum(m.count) ? undefined : 'copyText: bad text';\n case 'command':\n return isMap(m.command) && str(m.command.kind, 64) ? undefined : 'command: bad command';\n case 'scenarioEdit':\n return isMap(m.request) ? undefined : 'scenarioEdit: bad request';\n case 'runScenarios':\n return strList(m.names) ? undefined : 'runScenarios: bad names';\n case 'serverUpdate':\n return typeof m.show === 'boolean' ? undefined : 'serverUpdate: bad show';\n case 'mergeChoose':\n return str(m.id, 500) && (m.side === 'ours' || m.side === 'theirs')\n ? undefined\n : 'mergeChoose: bad choice';\n case 'lens':\n return m.lens === null || str(m.lens, 64) ? undefined : 'lens: bad lens';\n default:\n return undefined;\n }\n}\n"],
|
|
5
|
+
"mappings": ";AAMA,IAAM,QAAQ,CAAC,MACb,CAAC,CAAC,KAAK,OAAO,MAAM,YAAY,CAAC,MAAM,QAAQ,CAAC;AAElD,IAAM,MAAM,CAAC,GAAY,MAAM,SAAsB,OAAO,MAAM,YAAY,EAAE,UAAU;AAC1F,IAAM,SAAS,CAAC,MAAe,MAAM,UAAc,OAAO,MAAM,YAAY,OAAO,SAAS,CAAC;AAC7F,IAAM,UAAU,CAAC,MACf,MAAM,UAAc,MAAM,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,IAAI,GAAG,GAAG,CAAC;AAG7D,IAAM,cAAc;AAGpB,IAAM,UAAU;AAEvB,IAAM,cAAc,oBAAI,IAAI,CAAC,UAAU,OAAO,SAAS,aAAa,SAAS,CAAC;AAE9E,SAAS,eAAe,GAAgC;AACtD,MAAI,CAAC,MAAM,CAAC,KAAK,CAAC,YAAY,IAAI,OAAO,EAAE,EAAE,CAAC,EAAG,QAAO;AACxD,MAAI,EAAE,OAAO,aAAa,CAAC,IAAI,EAAE,OAAO,GAAG,KAAK,CAAC,QAAQ,EAAE,KAAK,GAAI,QAAO;AAC3E,MAAI,EAAE,OAAO,UAAU,CAAC,IAAI,EAAE,IAAI,KAAK,CAAC,YAAY,KAAK,EAAE,IAAI;AAC7D,WAAO;AACT,SAAO;AACT;AAGO,SAAS,eAAe,GAAgC;AAC7D,MAAI,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,EAAG,QAAO;AAC1C,MAAI,WAAW,KAAK,CAAC,OAAO,EAAE,KAAK,EAAG,QAAO,GAAG,EAAE,IAAI;AACtD,UAAQ,EAAE,MAAM;AAAA,IACd,KAAK;AACH,aAAO,IAAI,EAAE,IAAI,KAAK,EAAE,SAAS,MAAM,OAAO,EAAE,IAAI,IAAI,SAAY;AAAA,IACtE,KAAK;AACH,aAAO,EAAE,SAAS,UACf,MAAM,QAAQ,EAAE,IAAI,KACnB,EAAE,KAAK,MAAM,CAAC,MAAM,IAAI,GAAG,GAAI,KAAM,OAAO,MAAM,YAAY,OAAO,UAAU,CAAC,CAAE,IAClF,SACA;AAAA,IACN,KAAK;AACH,aAAO,IAAI,EAAE,KAAK,GAAG,KAAK,QAAQ,KAAK,EAAE,GAAG,IAAI,SAAY;AAAA,IAC9D,KAAK;AACH,aAAO,eAAe,EAAE,OAAO;AAAA,IACjC,KAAK;AACH,aAAO,IAAI,EAAE,GAAG,IAAI,SAAY;AAAA,IAClC,KAAK;AACH,aAAO,IAAI,EAAE,MAAM,GAAU,KAAK,OAAO,EAAE,KAAK,IAAI,SAAY;AAAA,IAClE,KAAK;AACH,aAAO,MAAM,EAAE,OAAO,KAAK,IAAI,EAAE,QAAQ,MAAM,EAAE,IAAI,SAAY;AAAA,IACnE,KAAK;AACH,aAAO,MAAM,EAAE,OAAO,IAAI,SAAY;AAAA,IACxC,KAAK;AACH,aAAO,QAAQ,EAAE,KAAK,IAAI,SAAY;AAAA,IACxC,KAAK;AACH,aAAO,OAAO,EAAE,SAAS,YAAY,SAAY;AAAA,IACnD,KAAK;AACH,aAAO,IAAI,EAAE,IAAI,GAAG,MAAM,EAAE,SAAS,UAAU,EAAE,SAAS,YACtD,SACA;AAAA,IACN,KAAK;AACH,aAAO,EAAE,SAAS,QAAQ,IAAI,EAAE,MAAM,EAAE,IAAI,SAAY;AAAA,IAC1D;AACE,aAAO;AAAA,EACX;AACF;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
package/dist/protocol.d.ts
CHANGED
|
@@ -15,6 +15,7 @@ import type { ScenarioResult } from './scenario/scenarios';
|
|
|
15
15
|
import type { RepoState } from './view/flowFacts';
|
|
16
16
|
import type { PluginName } from './view/jinjaComplete';
|
|
17
17
|
import type { OutsideMarks } from './view/outsideChanges';
|
|
18
|
+
import type { ServerChange } from './view/serverChange';
|
|
18
19
|
import type { Path } from './yaml/parse';
|
|
19
20
|
export interface Snapshot {
|
|
20
21
|
/** TextDocument version this snapshot was built from. */
|
|
@@ -353,6 +354,11 @@ export type HostMessage = {
|
|
|
353
354
|
type: 'mergeConflicts';
|
|
354
355
|
merge: MergeView | null;
|
|
355
356
|
}
|
|
357
|
+
/** AFD-284: the flow changed on Ansible Flow Server's branch; null clears it. */
|
|
358
|
+
| {
|
|
359
|
+
type: 'serverChange';
|
|
360
|
+
change: ServerChange | null;
|
|
361
|
+
}
|
|
356
362
|
/** AFD-93: the workspace's flows at a glance, for the flow panel's line. */
|
|
357
363
|
| {
|
|
358
364
|
type: 'repoState';
|
|
@@ -505,6 +511,15 @@ export type WebviewMessage = {
|
|
|
505
511
|
| {
|
|
506
512
|
type: 'mergeFinish';
|
|
507
513
|
}
|
|
514
|
+
/** AFD-284: Update (pull); with `show`, the Changes lens against the version shown before. */
|
|
515
|
+
| {
|
|
516
|
+
type: 'serverUpdate';
|
|
517
|
+
show: boolean;
|
|
518
|
+
}
|
|
519
|
+
/** AFD-284: the server notice put away until the branch moves on. */
|
|
520
|
+
| {
|
|
521
|
+
type: 'serverDismiss';
|
|
522
|
+
}
|
|
508
523
|
/** AFD-65: a link in an annotation; the host opens web links this flow's annotations hold. */
|
|
509
524
|
| {
|
|
510
525
|
type: 'openLink';
|
|
@@ -662,6 +677,8 @@ export interface DomSummary {
|
|
|
662
677
|
banner: number | null;
|
|
663
678
|
/** AFD-19: items the written-by-hand banner says need IDs (null: no banner). */
|
|
664
679
|
idGaps: number | null;
|
|
680
|
+
/** AFD-284: the server note's words (null: no note). */
|
|
681
|
+
server?: string | null;
|
|
665
682
|
/** AFD-283: conflicts the Merge note lists (null: no note). */
|
|
666
683
|
merge?: number | null;
|
|
667
684
|
/** Inside a subflow: frame ports shown (enabled ones) and boundary wires drawn. */
|
package/dist/scenario/live.js
CHANGED
|
@@ -4,20 +4,20 @@ import {
|
|
|
4
4
|
scenarioHash,
|
|
5
5
|
simulatedEnds,
|
|
6
6
|
storedVerdict
|
|
7
|
-
} from "../chunks/chunk-
|
|
8
|
-
import "../chunks/chunk-
|
|
7
|
+
} from "../chunks/chunk-DL4LYODQ.js";
|
|
8
|
+
import "../chunks/chunk-W2CSOAIB.js";
|
|
9
9
|
import "../chunks/chunk-23ISDYUS.js";
|
|
10
10
|
import "../chunks/chunk-TH6ICGA5.js";
|
|
11
11
|
import "../chunks/chunk-KOG6OURH.js";
|
|
12
|
-
import "../chunks/chunk-
|
|
12
|
+
import "../chunks/chunk-2MJKBPGG.js";
|
|
13
13
|
import "../chunks/chunk-OEEHAY5X.js";
|
|
14
14
|
import "../chunks/chunk-LPBLGBDT.js";
|
|
15
15
|
import "../chunks/chunk-6MLYGFT6.js";
|
|
16
|
-
import "../chunks/chunk-
|
|
16
|
+
import "../chunks/chunk-ARA3VJR2.js";
|
|
17
17
|
import "../chunks/chunk-56VTJ6YF.js";
|
|
18
18
|
import "../chunks/chunk-BAZIS67B.js";
|
|
19
19
|
import "../chunks/chunk-X3DEH47B.js";
|
|
20
|
-
import "../chunks/chunk-
|
|
20
|
+
import "../chunks/chunk-TOTSB4HG.js";
|
|
21
21
|
import "../chunks/chunk-SN7X6FYV.js";
|
|
22
22
|
import "../chunks/chunk-24G5UVEF.js";
|
|
23
23
|
import "../chunks/chunk-CORZL72E.js";
|
|
@@ -28,6 +28,7 @@ import "../chunks/chunk-GK3SD3WE.js";
|
|
|
28
28
|
import "../chunks/chunk-H6ARLMMI.js";
|
|
29
29
|
import "../chunks/chunk-TG3C3GIL.js";
|
|
30
30
|
import "../chunks/chunk-WISXIO3I.js";
|
|
31
|
+
import "../chunks/chunk-FIKPXL6E.js";
|
|
31
32
|
import "../chunks/chunk-WG7O3OBV.js";
|
|
32
33
|
import "../chunks/chunk-NUGJSYSP.js";
|
|
33
34
|
import "../chunks/chunk-XRGZNPPO.js";
|
|
@@ -40,6 +41,7 @@ import "../chunks/chunk-HFHXHOBC.js";
|
|
|
40
41
|
import "../chunks/chunk-RKLF3DLT.js";
|
|
41
42
|
import "../chunks/chunk-GTHXWNCC.js";
|
|
42
43
|
import "../chunks/chunk-OEQXGULI.js";
|
|
44
|
+
import "../chunks/chunk-T6SZLRDM.js";
|
|
43
45
|
import "../chunks/chunk-AJRIS5VY.js";
|
|
44
46
|
import "../chunks/chunk-GQ2W4RTY.js";
|
|
45
47
|
import "../chunks/chunk-BVEW6MKL.js";
|
|
@@ -2,19 +2,19 @@ import {
|
|
|
2
2
|
prepare,
|
|
3
3
|
simulateRun,
|
|
4
4
|
simulateScenario
|
|
5
|
-
} from "../chunks/chunk-
|
|
5
|
+
} from "../chunks/chunk-W2CSOAIB.js";
|
|
6
6
|
import "../chunks/chunk-23ISDYUS.js";
|
|
7
7
|
import "../chunks/chunk-TH6ICGA5.js";
|
|
8
8
|
import "../chunks/chunk-KOG6OURH.js";
|
|
9
|
-
import "../chunks/chunk-
|
|
9
|
+
import "../chunks/chunk-2MJKBPGG.js";
|
|
10
10
|
import "../chunks/chunk-OEEHAY5X.js";
|
|
11
11
|
import "../chunks/chunk-LPBLGBDT.js";
|
|
12
12
|
import "../chunks/chunk-6MLYGFT6.js";
|
|
13
|
-
import "../chunks/chunk-
|
|
13
|
+
import "../chunks/chunk-ARA3VJR2.js";
|
|
14
14
|
import "../chunks/chunk-56VTJ6YF.js";
|
|
15
15
|
import "../chunks/chunk-BAZIS67B.js";
|
|
16
16
|
import "../chunks/chunk-X3DEH47B.js";
|
|
17
|
-
import "../chunks/chunk-
|
|
17
|
+
import "../chunks/chunk-TOTSB4HG.js";
|
|
18
18
|
import "../chunks/chunk-SN7X6FYV.js";
|
|
19
19
|
import "../chunks/chunk-24G5UVEF.js";
|
|
20
20
|
import "../chunks/chunk-CORZL72E.js";
|
|
@@ -25,6 +25,7 @@ import "../chunks/chunk-GK3SD3WE.js";
|
|
|
25
25
|
import "../chunks/chunk-H6ARLMMI.js";
|
|
26
26
|
import "../chunks/chunk-TG3C3GIL.js";
|
|
27
27
|
import "../chunks/chunk-WISXIO3I.js";
|
|
28
|
+
import "../chunks/chunk-FIKPXL6E.js";
|
|
28
29
|
import "../chunks/chunk-WG7O3OBV.js";
|
|
29
30
|
import "../chunks/chunk-NUGJSYSP.js";
|
|
30
31
|
import "../chunks/chunk-XRGZNPPO.js";
|
|
@@ -37,6 +38,7 @@ import "../chunks/chunk-HFHXHOBC.js";
|
|
|
37
38
|
import "../chunks/chunk-RKLF3DLT.js";
|
|
38
39
|
import "../chunks/chunk-GTHXWNCC.js";
|
|
39
40
|
import "../chunks/chunk-OEQXGULI.js";
|
|
41
|
+
import "../chunks/chunk-T6SZLRDM.js";
|
|
40
42
|
import "../chunks/chunk-AJRIS5VY.js";
|
|
41
43
|
import "../chunks/chunk-GQ2W4RTY.js";
|
|
42
44
|
import "../chunks/chunk-BVEW6MKL.js";
|
package/dist/view/flowFacts.js
CHANGED
|
@@ -1,17 +1,17 @@
|
|
|
1
1
|
import {
|
|
2
2
|
planGenerated
|
|
3
|
-
} from "../chunks/chunk-
|
|
4
|
-
import "../chunks/chunk-
|
|
5
|
-
import "../chunks/chunk-
|
|
6
|
-
import "../chunks/chunk-
|
|
3
|
+
} from "../chunks/chunk-2P3JEHLH.js";
|
|
4
|
+
import "../chunks/chunk-HPRG2672.js";
|
|
5
|
+
import "../chunks/chunk-WSARMPYU.js";
|
|
6
|
+
import "../chunks/chunk-2MJKBPGG.js";
|
|
7
7
|
import "../chunks/chunk-OEEHAY5X.js";
|
|
8
8
|
import "../chunks/chunk-LPBLGBDT.js";
|
|
9
9
|
import "../chunks/chunk-6MLYGFT6.js";
|
|
10
|
-
import "../chunks/chunk-
|
|
10
|
+
import "../chunks/chunk-ARA3VJR2.js";
|
|
11
11
|
import "../chunks/chunk-56VTJ6YF.js";
|
|
12
12
|
import "../chunks/chunk-BAZIS67B.js";
|
|
13
13
|
import "../chunks/chunk-X3DEH47B.js";
|
|
14
|
-
import "../chunks/chunk-
|
|
14
|
+
import "../chunks/chunk-TOTSB4HG.js";
|
|
15
15
|
import "../chunks/chunk-SN7X6FYV.js";
|
|
16
16
|
import "../chunks/chunk-24G5UVEF.js";
|
|
17
17
|
import {
|
|
@@ -22,15 +22,15 @@ import "../chunks/chunk-75QLJHZ5.js";
|
|
|
22
22
|
import "../chunks/chunk-LMTTJDCC.js";
|
|
23
23
|
import {
|
|
24
24
|
validateFlow
|
|
25
|
-
} from "../chunks/chunk-
|
|
25
|
+
} from "../chunks/chunk-PNLY5IWM.js";
|
|
26
26
|
import "../chunks/chunk-OREXQ4IZ.js";
|
|
27
27
|
import "../chunks/chunk-KSM4O2XL.js";
|
|
28
|
-
import "../chunks/chunk-T6SZLRDM.js";
|
|
29
28
|
import "../chunks/chunk-7D55CRGU.js";
|
|
30
29
|
import "../chunks/chunk-GK3SD3WE.js";
|
|
31
30
|
import "../chunks/chunk-H6ARLMMI.js";
|
|
32
31
|
import "../chunks/chunk-TG3C3GIL.js";
|
|
33
32
|
import "../chunks/chunk-WISXIO3I.js";
|
|
33
|
+
import "../chunks/chunk-FIKPXL6E.js";
|
|
34
34
|
import "../chunks/chunk-WG7O3OBV.js";
|
|
35
35
|
import "../chunks/chunk-NUGJSYSP.js";
|
|
36
36
|
import "../chunks/chunk-XRGZNPPO.js";
|
|
@@ -43,6 +43,7 @@ import "../chunks/chunk-HFHXHOBC.js";
|
|
|
43
43
|
import "../chunks/chunk-RKLF3DLT.js";
|
|
44
44
|
import "../chunks/chunk-GTHXWNCC.js";
|
|
45
45
|
import "../chunks/chunk-OEQXGULI.js";
|
|
46
|
+
import "../chunks/chunk-T6SZLRDM.js";
|
|
46
47
|
import "../chunks/chunk-AJRIS5VY.js";
|
|
47
48
|
import "../chunks/chunk-GQ2W4RTY.js";
|
|
48
49
|
import "../chunks/chunk-BVEW6MKL.js";
|
|
@@ -2,6 +2,6 @@
|
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../../src/core/view/flowFacts.ts"],
|
|
4
4
|
"sourcesContent": ["// What the Flows view says about each flow (AFD-86, wave 8 group D): its problems and the state of\n// its generated code, so a repository's health shows without opening every flow (round 1: P16, T7\n// given up). The code state uses the same write plan a save does (ADR-0009), so \"edited by hand\"\n// here is what a save would leave alone. Pure, with the generated folder read through GeneratedDir.\n// AFD-93 (wave 9): each flow's problems with their places, for the Problems panel of flows that are\n// not open, and the workspace's state in a line for the flow panel (round 2: S8, T7 given up).\n\nimport { type GeneratedDir, planGenerated } from '../engine/writePlan';\nimport { parseFlow, rangeOf } from '../flow/document';\nimport type { SchemaValidator } from '../flow/schema';\nimport { type Finding, validateFlow } from '../flow/validate';\n\nexport type CodeState = 'current' | 'out of date' | 'edited by hand' | 'no code yet' | 'blocked';\n\nexport interface FlowFacts {\n name: string;\n key: string;\n errors: number;\n warnings: number;\n code: CodeState;\n /** Generated files edited by hand (a save leaves them alone). */\n kept: string[];\n /** The flow does not parse. */\n broken?: string;\n /** AFD-93: its errors and warnings with their places (validation only: no catalog, no files). */\n problems: FlowProblem[];\n}\n\n/** A line and character, both from 0, as VS Code counts them (UTF-16, like JS strings). */\nexport interface LinePos {\n line: number;\n character: number;\n}\n\nexport interface FlowProblem {\n start: LinePos;\n end: LinePos;\n message: string;\n severity: Finding['severity'];\n code: string;\n}\n\n/** Where an offset of the text is, as a line and character. */\nexport function lineCol(text: string, offset: number): LinePos {\n const at = Math.max(0, Math.min(offset, text.length));\n const before = text.lastIndexOf('\\n', at - 1);\n let line = 0;\n for (let i = text.indexOf('\\n'); i !== -1 && i < at; i = text.indexOf('\\n', i + 1)) line++;\n return { line, character: at - before - 1 };\n}\n\nexport async function flowFacts(\n text: string,\n schema: SchemaValidator,\n dir: GeneratedDir,\n options: { source: string; root?: string },\n): Promise<FlowFacts> {\n const parsed = parseFlow(text);\n const doc = parsed.doc;\n if (!doc) {\n const broken = parsed.errors[0]?.message ?? 'The file does not parse';\n const at = lineCol(text, parsed.errors[0]?.offset ?? 0);\n return {\n name: options.source.replace(/\\.flow\\.ya?ml$/, ''),\n key: '',\n errors: 1,\n warnings: 0,\n code: 'blocked',\n kept: [],\n broken,\n problems: [\n {\n start: at,\n end: { line: at.line, character: at.character + 1 },\n message: broken,\n severity: 'error',\n code: 'yaml',\n },\n ],\n };\n }\n const findings = validateFlow(doc, schema(doc)).findings;\n const errors = findings.filter((f) => f.severity === 'error').length;\n const warnings = findings.filter((f) => f.severity === 'warning').length;\n const problems = findings.map((f): FlowProblem => {\n const [start, end] = rangeOf(parsed.file, f.path);\n return {\n start: lineCol(text, start),\n end: lineCol(text, end),\n message: f.message,\n severity: f.severity,\n code: f.code,\n };\n });\n const base = { name: doc.flow.name, key: doc.flow.key, errors, warnings, problems };\n if (errors > 0) return { ...base, code: 'blocked', kept: [] };\n const plan = await planGenerated(text, schema, dir, options);\n if (plan.kept.length > 0) return { ...base, code: 'edited by hand', kept: plan.kept };\n if ((await dir.list()).length === 0) return { ...base, code: 'no code yet', kept: [] };\n const stale = plan.write.length > 0 || plan.remove.length > 0;\n return { ...base, code: stale ? 'out of date' : 'current', kept: [] };\n}\n\n/** The view's description of a flow: problems first, then the code when it needs a look. */\nexport function factsLine(f: FlowFacts): string {\n const n = (count: number, one: string) => `${count} ${one}${count === 1 ? '' : 's'}`;\n const parts = [\n f.broken ? 'does not parse' : f.errors ? n(f.errors, 'error') : '',\n !f.broken && f.warnings ? n(f.warnings, 'warning') : '',\n f.code === 'out of date'\n ? 'code out of date'\n : f.code === 'edited by hand'\n ? 'code edited by hand'\n : f.code === 'no code yet'\n ? 'no code yet'\n : '',\n ].filter(Boolean);\n return parts.join(' \u00B7 ');\n}\n\n/** What each state means, for the view's tooltip (round 1: \"edited by hand\" was not understood). */\nexport const CODE_MEANING: Record<CodeState, string> = {\n current: 'The generated playbooks match the flow.',\n 'out of date':\n 'The generated playbooks do not match the flow yet: saving the flow (or Generate Code) writes them.',\n 'edited by hand':\n 'A generated playbook was changed in a text editor, so saving the flow leaves it alone. Generate Code asks before it writes over the change.',\n 'no code yet': 'No playbook was generated for this flow yet: saving it writes them.',\n blocked: 'The flow has errors, so no code is generated until they are fixed.',\n};\n\n/** A folder of the Flows view: its subfolders and the flows in it. */\nexport interface FlowFolder {\n name: string;\n /** Path relative to the workspace folder, `/`-separated; empty at the top. */\n path: string;\n folders: FlowFolder[];\n /** Relative paths of the flow files. */\n flows: string[];\n}\n\n/**\n * The flows by folder. A folder that only holds its own flow (`flows/hello/hello.flow.yaml`, the\n * New Flow layout) does not make a level of its own: the flow sits in the folder above.\n */\nexport function flowTree(paths: readonly string[]): FlowFolder {\n const root: FlowFolder = { name: '', path: '', folders: [], flows: [] };\n for (const path of [...paths].sort((a, b) => a.localeCompare(b))) {\n const parts = path.split('/');\n const file = parts.pop() ?? path;\n const key = file.replace(/\\.flow\\.ya?ml$/, '');\n if (parts.at(-1) === key) parts.pop();\n let at = root;\n for (const name of parts) {\n let next = at.folders.find((f) => f.name === name);\n if (!next) {\n next = { name, path: at.path ? `${at.path}/${name}` : name, folders: [], flows: [] };\n at.folders.push(next);\n }\n at = next;\n }\n at.flows.push(path);\n }\n return root;\n}\n\n/** AFD-93: the workspace's flows at a glance, for the flow panel. */\nexport interface RepoState {\n /** Flows found in the workspace. */\n flows: number;\n withErrors: number;\n editedByHand: number;\n outOfDate: number;\n}\n\nexport function repoState(all: readonly FlowFacts[], flows = all.length): RepoState {\n return {\n flows,\n withErrors: all.filter((f) => f.broken || f.errors > 0).length,\n editedByHand: all.filter((f) => f.code === 'edited by hand').length,\n outOfDate: all.filter((f) => f.code === 'out of date').length,\n };\n}\n\n/** Some flow needs a look: errors, or generated code changed by hand (out of date is routine). */\nexport const needsLook = (s: RepoState) => s.withErrors + s.editedByHand > 0;\n\n/** \"In this workspace: 1 flow with errors, 1 with code edited by hand\", or that all is well. */\nexport function repoLine(s: RepoState): string {\n const parts: string[] = [];\n const add = (count: number, what: string) => {\n if (!count) return;\n const noun = parts.length ? '' : count === 1 ? 'flow ' : 'flows ';\n parts.push(`${count} ${noun}${what}`);\n };\n add(s.withErrors, 'with errors');\n add(s.editedByHand, 'with code edited by hand');\n add(s.outOfDate, 'with code out of date');\n if (parts.length) return `In this workspace: ${parts.join(', ')}`;\n return s.flows > 1\n ? 'Other flows of this workspace have no problems'\n : 'No other flows in this workspace';\n}\n"],
|
|
5
|
-
"mappings": "
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -1,6 +1,3 @@
|
|
|
1
|
-
import {
|
|
2
|
-
scanJinja
|
|
3
|
-
} from "../chunks/chunk-FIVVDND6.js";
|
|
4
1
|
import {
|
|
5
2
|
CONSTANTS,
|
|
6
3
|
FIELD_TYPES,
|
|
@@ -17,6 +14,9 @@ import {
|
|
|
17
14
|
TESTS,
|
|
18
15
|
strftime
|
|
19
16
|
} from "../chunks/chunk-S2ZRU4A6.js";
|
|
17
|
+
import {
|
|
18
|
+
scanJinja
|
|
19
|
+
} from "../chunks/chunk-FIVVDND6.js";
|
|
20
20
|
|
|
21
21
|
// src/core/view/jinjaComplete.ts
|
|
22
22
|
var IDENT_KINDS = /* @__PURE__ */ new Set([
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import type { FlowDocument } from '../flow/types';
|
|
2
|
+
/** The notice over the canvas; null clears it. */
|
|
3
|
+
export interface ServerChange {
|
|
4
|
+
/** The server's commit the notice is about (Update brings it here). */
|
|
5
|
+
commit: string;
|
|
6
|
+
/** "Mia Ortega changed this flow on the server: 1 step." */
|
|
7
|
+
text: string;
|
|
8
|
+
removed?: boolean;
|
|
9
|
+
}
|
|
10
|
+
export interface ChangedFlow {
|
|
11
|
+
file: string;
|
|
12
|
+
change: 'added' | 'changed' | 'removed';
|
|
13
|
+
authors: string[];
|
|
14
|
+
}
|
|
15
|
+
/** Who, in words: one or two names, else the first two and how many more. */
|
|
16
|
+
export declare function namesText(authors: readonly string[]): string;
|
|
17
|
+
/** "3 steps and 1 wire": how much the server's version differs from the one here. */
|
|
18
|
+
export declare function howMuch(here: FlowDocument, there: FlowDocument): string;
|
|
19
|
+
/**
|
|
20
|
+
* The notice for `file` given the server's changes since the local HEAD, or undefined when the
|
|
21
|
+
* server's branch did not change this flow.
|
|
22
|
+
*/
|
|
23
|
+
export declare function serverChangeOf(commit: string, changed: readonly ChangedFlow[], file: string, here?: FlowDocument, there?: FlowDocument): ServerChange | undefined;
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import {
|
|
2
|
+
diffFlows
|
|
3
|
+
} from "../chunks/chunk-AGH4HY6I.js";
|
|
4
|
+
import "../chunks/chunk-TG3C3GIL.js";
|
|
5
|
+
import "../chunks/chunk-XRGZNPPO.js";
|
|
6
|
+
import "../chunks/chunk-VG3RKETK.js";
|
|
7
|
+
import "../chunks/chunk-TS4N2EIO.js";
|
|
8
|
+
import "../chunks/chunk-BCX7P6SV.js";
|
|
9
|
+
import "../chunks/chunk-BVEW6MKL.js";
|
|
10
|
+
import "../chunks/chunk-3Z2U3LN7.js";
|
|
11
|
+
import "../chunks/chunk-GHG3VINX.js";
|
|
12
|
+
import "../chunks/chunk-5TUAMVIV.js";
|
|
13
|
+
import "../chunks/chunk-45CE2RUH.js";
|
|
14
|
+
import "../chunks/chunk-E2YZJWO7.js";
|
|
15
|
+
import "../chunks/chunk-ZP5LQ4XC.js";
|
|
16
|
+
import "../chunks/chunk-2OD7UZ7V.js";
|
|
17
|
+
import "../chunks/chunk-AGWQ3ANE.js";
|
|
18
|
+
|
|
19
|
+
// src/core/view/serverChange.ts
|
|
20
|
+
var plural = (n, one) => `${n} ${one}${n === 1 ? "" : "s"}`;
|
|
21
|
+
function namesText(authors) {
|
|
22
|
+
if (!authors.length) return "Someone";
|
|
23
|
+
return authors.length <= 2 ? authors.join(" and ") : `${authors.slice(0, 2).join(", ")} and ${authors.length - 2} more`;
|
|
24
|
+
}
|
|
25
|
+
function howMuch(here, there) {
|
|
26
|
+
const d = diffFlows(here, there);
|
|
27
|
+
const parts = [
|
|
28
|
+
d.nodes.length ? plural(d.nodes.length, "step") : "",
|
|
29
|
+
d.wires.length ? plural(d.wires.length, "wire") : "",
|
|
30
|
+
d.annotations.length ? plural(d.annotations.length, "note") : ""
|
|
31
|
+
].filter(Boolean);
|
|
32
|
+
return parts.length ? parts.join(" and ") : "the flow's settings";
|
|
33
|
+
}
|
|
34
|
+
function serverChangeOf(commit, changed, file, here, there) {
|
|
35
|
+
const mine = changed.find((c) => c.file === file);
|
|
36
|
+
if (!mine) return void 0;
|
|
37
|
+
const who = namesText(mine.authors);
|
|
38
|
+
if (mine.change === "removed")
|
|
39
|
+
return { commit, removed: true, text: `${who} removed this flow on the server.` };
|
|
40
|
+
const amount = here && there ? `: ${howMuch(here, there)}` : "";
|
|
41
|
+
return { commit, text: `${who} changed this flow on the server${amount}.` };
|
|
42
|
+
}
|
|
43
|
+
export {
|
|
44
|
+
howMuch,
|
|
45
|
+
namesText,
|
|
46
|
+
serverChangeOf
|
|
47
|
+
};
|
|
48
|
+
//# sourceMappingURL=serverChange.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../../src/core/view/serverChange.ts"],
|
|
4
|
+
"sourcesContent": ["// AFD-284: what the designer says when the flow it shows changed on Ansible Flow Server's branch\n// beyond the local HEAD: who changed it and how much, or that it is gone there. Pure: the\n// extension gives the server's answer and the two versions.\nimport { diffFlows } from '../flow/semanticDiff';\nimport type { FlowDocument } from '../flow/types';\n\n/** The notice over the canvas; null clears it. */\nexport interface ServerChange {\n /** The server's commit the notice is about (Update brings it here). */\n commit: string;\n /** \"Mia Ortega changed this flow on the server: 1 step.\" */\n text: string;\n removed?: boolean;\n}\n\nexport interface ChangedFlow {\n file: string;\n change: 'added' | 'changed' | 'removed';\n authors: string[];\n}\n\nconst plural = (n: number, one: string) => `${n} ${one}${n === 1 ? '' : 's'}`;\n\n/** Who, in words: one or two names, else the first two and how many more. */\nexport function namesText(authors: readonly string[]): string {\n if (!authors.length) return 'Someone';\n return authors.length <= 2\n ? authors.join(' and ')\n : `${authors.slice(0, 2).join(', ')} and ${authors.length - 2} more`;\n}\n\n/** \"3 steps and 1 wire\": how much the server's version differs from the one here. */\nexport function howMuch(here: FlowDocument, there: FlowDocument): string {\n const d = diffFlows(here, there);\n const parts = [\n d.nodes.length ? plural(d.nodes.length, 'step') : '',\n d.wires.length ? plural(d.wires.length, 'wire') : '',\n d.annotations.length ? plural(d.annotations.length, 'note') : '',\n ].filter(Boolean);\n return parts.length ? parts.join(' and ') : \"the flow's settings\";\n}\n\n/**\n * The notice for `file` given the server's changes since the local HEAD, or undefined when the\n * server's branch did not change this flow.\n */\nexport function serverChangeOf(\n commit: string,\n changed: readonly ChangedFlow[],\n file: string,\n here?: FlowDocument,\n there?: FlowDocument,\n): ServerChange | undefined {\n const mine = changed.find((c) => c.file === file);\n if (!mine) return undefined;\n const who = namesText(mine.authors);\n if (mine.change === 'removed')\n return { commit, removed: true, text: `${who} removed this flow on the server.` };\n const amount = here && there ? `: ${howMuch(here, there)}` : '';\n return { commit, text: `${who} changed this flow on the server${amount}.` };\n}\n"],
|
|
5
|
+
"mappings": ";;;;;;;;;;;;;;;;;;;AAqBA,IAAM,SAAS,CAAC,GAAW,QAAgB,GAAG,CAAC,IAAI,GAAG,GAAG,MAAM,IAAI,KAAK,GAAG;AAGpE,SAAS,UAAU,SAAoC;AAC5D,MAAI,CAAC,QAAQ,OAAQ,QAAO;AAC5B,SAAO,QAAQ,UAAU,IACrB,QAAQ,KAAK,OAAO,IACpB,GAAG,QAAQ,MAAM,GAAG,CAAC,EAAE,KAAK,IAAI,CAAC,QAAQ,QAAQ,SAAS,CAAC;AACjE;AAGO,SAAS,QAAQ,MAAoB,OAA6B;AACvE,QAAM,IAAI,UAAU,MAAM,KAAK;AAC/B,QAAM,QAAQ;AAAA,IACZ,EAAE,MAAM,SAAS,OAAO,EAAE,MAAM,QAAQ,MAAM,IAAI;AAAA,IAClD,EAAE,MAAM,SAAS,OAAO,EAAE,MAAM,QAAQ,MAAM,IAAI;AAAA,IAClD,EAAE,YAAY,SAAS,OAAO,EAAE,YAAY,QAAQ,MAAM,IAAI;AAAA,EAChE,EAAE,OAAO,OAAO;AAChB,SAAO,MAAM,SAAS,MAAM,KAAK,OAAO,IAAI;AAC9C;AAMO,SAAS,eACd,QACA,SACA,MACA,MACA,OAC0B;AAC1B,QAAM,OAAO,QAAQ,KAAK,CAAC,MAAM,EAAE,SAAS,IAAI;AAChD,MAAI,CAAC,KAAM,QAAO;AAClB,QAAM,MAAM,UAAU,KAAK,OAAO;AAClC,MAAI,KAAK,WAAW;AAClB,WAAO,EAAE,QAAQ,SAAS,MAAM,MAAM,GAAG,GAAG,oCAAoC;AAClF,QAAM,SAAS,QAAQ,QAAQ,KAAK,QAAQ,MAAM,KAAK,CAAC,KAAK;AAC7D,SAAO,EAAE,QAAQ,MAAM,GAAG,GAAG,mCAAmC,MAAM,IAAI;AAC5E;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@ansible-flow/core",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.87.0",
|
|
4
4
|
"description": "Ansible Flow Designer core: the flow model, commands, validation and playbook generation, for any JavaScript host.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"homepage": "https://github.com/ChistokhinSV/ansible-flow-designer/blob/main/docs/packages.md",
|