@beehexa/hexasync-template-model 2608.20.18 → 2608.20.32

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 (41) hide show
  1. package/dist/componentKey.d.ts +26 -0
  2. package/dist/componentKey.d.ts.map +1 -0
  3. package/dist/componentKey.js +32 -0
  4. package/dist/componentKey.js.map +1 -0
  5. package/dist/connectorSupport.d.ts +123 -0
  6. package/dist/connectorSupport.d.ts.map +1 -0
  7. package/dist/connectorSupport.js +116 -0
  8. package/dist/connectorSupport.js.map +1 -0
  9. package/dist/contract.d.ts +57 -0
  10. package/dist/contract.d.ts.map +1 -0
  11. package/dist/contract.js +68 -0
  12. package/dist/contract.js.map +1 -0
  13. package/dist/flowRender.d.ts +89 -0
  14. package/dist/flowRender.d.ts.map +1 -0
  15. package/dist/flowRender.js +316 -0
  16. package/dist/flowRender.js.map +1 -0
  17. package/dist/index.d.ts +30 -0
  18. package/dist/index.d.ts.map +1 -0
  19. package/dist/index.js +28 -0
  20. package/dist/index.js.map +1 -0
  21. package/dist/nodeAddress.d.ts +105 -0
  22. package/dist/nodeAddress.d.ts.map +1 -0
  23. package/dist/nodeAddress.js +195 -0
  24. package/dist/nodeAddress.js.map +1 -0
  25. package/dist/references.d.ts +200 -0
  26. package/dist/references.d.ts.map +1 -0
  27. package/dist/references.js +368 -0
  28. package/dist/references.js.map +1 -0
  29. package/dist/stepGlyph.d.ts +67 -0
  30. package/dist/stepGlyph.d.ts.map +1 -0
  31. package/dist/stepGlyph.js +155 -0
  32. package/dist/stepGlyph.js.map +1 -0
  33. package/dist/templating.d.ts +88 -0
  34. package/dist/templating.d.ts.map +1 -0
  35. package/dist/templating.js +103 -0
  36. package/dist/templating.js.map +1 -0
  37. package/dist/uriPath.d.ts +43 -0
  38. package/dist/uriPath.d.ts.map +1 -0
  39. package/dist/uriPath.js +151 -0
  40. package/dist/uriPath.js.map +1 -0
  41. package/package.json +1 -1
@@ -0,0 +1,26 @@
1
+ /**
2
+ * The identity a component's `id`/`key` field actually denotes — the ONE implementation of it.
3
+ *
4
+ * The merge engine strips a surrounding quote pair and any leading `!`, and treats the `!` as a
5
+ * REMOVAL directive rather than part of the name. Anything that reads component identity out of a
6
+ * parsed file has to agree with that, or the two disagree about what a project contains: the index
7
+ * read `String(raw)` verbatim and so reported `objects/!DROPME` as a component the project declares,
8
+ * and `objects/'Quoted'` as distinct from `objects/Quoted`. Exported so there is one answer and not
9
+ * two (NFR-1 — the editor invents no semantics the runtime lacks).
10
+ *
11
+ * ### Why it lives in `model` rather than in `compose`, where it was written
12
+ *
13
+ * AD-33 rule 6: a node ADDRESS is built from the normalised key, because `!CHECK_EXISTS_ITEMS` — the one corpus step
14
+ * key outside `[A-Za-z0-9_]` — would otherwise put a removal directive inside an address, and specifically inside
15
+ * the address of a node the composer deletes. `nodeAddress.ts` is in this package because an address serves the
16
+ * diagram, the provenance anchor and an MCP citation alike, and `model` declares no dependencies at all, so it
17
+ * could not reach `compose`. Moving the function down rather than copying it keeps "the ONE implementation" true;
18
+ * `compose` re-exports it, so every existing importer is unaffected.
19
+ *
20
+ * Returns `undefined` for an absent id, which is not the same as an empty one.
21
+ */
22
+ export declare function normalizeComponentKey(raw: unknown): {
23
+ id: string;
24
+ removes: boolean;
25
+ } | undefined;
26
+ //# sourceMappingURL=componentKey.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"componentKey.d.ts","sourceRoot":"","sources":["../src/componentKey.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,qBAAqB,CACnC,GAAG,EAAE,OAAO,GACX;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,OAAO,CAAA;CAAE,GAAG,SAAS,CAQ9C"}
@@ -0,0 +1,32 @@
1
+ /**
2
+ * The identity a component's `id`/`key` field actually denotes — the ONE implementation of it.
3
+ *
4
+ * The merge engine strips a surrounding quote pair and any leading `!`, and treats the `!` as a
5
+ * REMOVAL directive rather than part of the name. Anything that reads component identity out of a
6
+ * parsed file has to agree with that, or the two disagree about what a project contains: the index
7
+ * read `String(raw)` verbatim and so reported `objects/!DROPME` as a component the project declares,
8
+ * and `objects/'Quoted'` as distinct from `objects/Quoted`. Exported so there is one answer and not
9
+ * two (NFR-1 — the editor invents no semantics the runtime lacks).
10
+ *
11
+ * ### Why it lives in `model` rather than in `compose`, where it was written
12
+ *
13
+ * AD-33 rule 6: a node ADDRESS is built from the normalised key, because `!CHECK_EXISTS_ITEMS` — the one corpus step
14
+ * key outside `[A-Za-z0-9_]` — would otherwise put a removal directive inside an address, and specifically inside
15
+ * the address of a node the composer deletes. `nodeAddress.ts` is in this package because an address serves the
16
+ * diagram, the provenance anchor and an MCP citation alike, and `model` declares no dependencies at all, so it
17
+ * could not reach `compose`. Moving the function down rather than copying it keeps "the ONE implementation" true;
18
+ * `compose` re-exports it, so every existing importer is unaffected.
19
+ *
20
+ * Returns `undefined` for an absent id, which is not the same as an empty one.
21
+ */
22
+ export function normalizeComponentKey(raw) {
23
+ if (raw === null || raw === undefined)
24
+ return undefined;
25
+ // Coerce so a numeric id (`id: 100`) does not crash `.replace`.
26
+ const unquoted = String(raw).replace(/^['"]([^'"]+)['"]$/, '$1');
27
+ return {
28
+ id: unquoted.replace(/^!+/, ''),
29
+ removes: unquoted.startsWith('!'),
30
+ };
31
+ }
32
+ //# sourceMappingURL=componentKey.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"componentKey.js","sourceRoot":"","sources":["../src/componentKey.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,MAAM,UAAU,qBAAqB,CACnC,GAAY;IAEZ,IAAI,GAAG,KAAK,IAAI,IAAI,GAAG,KAAK,SAAS;QAAE,OAAO,SAAS,CAAC;IACxD,gEAAgE;IAChE,MAAM,QAAQ,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,oBAAoB,EAAE,IAAI,CAAC,CAAC;IACjE,OAAO;QACL,EAAE,EAAE,QAAQ,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC;QAC/B,OAAO,EAAE,QAAQ,CAAC,UAAU,CAAC,GAAG,CAAC;KAClC,CAAC;AACJ,CAAC"}
@@ -0,0 +1,123 @@
1
+ /**
2
+ * The unsupported-connector wording — ONE source, six surfaces (FR-10, Story 2.5; AD-31).
3
+ *
4
+ * `unsupported-connector-policy.md` states the contract in the feature's own words: *"This file exists so that
5
+ * the diagnostic, the picker, the preview, the compose report, the MCP server and the generated AI instructions
6
+ * all quote the same words. Six surfaces, one source."* This module IS that source in code, so a surface cannot
7
+ * paraphrase it and drift.
8
+ *
9
+ * It lives in the zero-dependency model package deliberately: the CLI's rules, the CLI's report renderer and the
10
+ * VS Code extension all already depend on this package, and nothing else can reach all three.
11
+ *
12
+ * ### Why the catalog facts are parameters rather than baked in
13
+ *
14
+ * The message names the catalog version and the connector count, because — per the policy — *"when the catalog is
15
+ * behind, that is the tool's fault, not the author's."* Those two numbers change every time the catalog ships, so
16
+ * baking them in would mean the wording and the data drifting apart by construction.
17
+ */
18
+ /** What a request needs, in the order the policy lists them. Numbered by the renderer, not here. */
19
+ export declare const REQUEST_REQUIREMENTS: readonly string[];
20
+ export declare const SUPPORT_EMAIL = "support@beehexa.com";
21
+ export interface CatalogFacts {
22
+ readonly catalogVersion: string | number;
23
+ readonly connectorCount: number;
24
+ }
25
+ /**
26
+ * The full block — for `explain`, the compose report appendix, the preview banner and the AI instructions.
27
+ */
28
+ export declare function unsupportedConnectorGuidance(facts: CatalogFacts): string;
29
+ /**
30
+ * The short form — for a diagnostic message, a hover, a status-bar item, a one-line tool response.
31
+ *
32
+ * Deliberately NOT a truncation of the long form: a truncated instruction that stops before the sandbox is an
33
+ * instruction someone will follow incompletely.
34
+ */
35
+ export declare const UNSUPPORTED_CONNECTOR_SHORT: string;
36
+ /**
37
+ * The pre-filled request email (FR-10's *Copy request email*).
38
+ *
39
+ * Pre-fills what the tooling KNOWS — the identity found, and the system name when the author gave one — and
40
+ * leaves the documentation link and the sandbox for the author, because inventing either would be worse than an
41
+ * empty line. G-6 applies to a request email as much as to a connection: never invent an identity.
42
+ */
43
+ export declare function unsupportedConnectorRequestEmail(input: {
44
+ readonly connectorId: string;
45
+ readonly systemName?: string;
46
+ readonly systemCode?: string;
47
+ readonly facts: CatalogFacts;
48
+ }): {
49
+ readonly to: string;
50
+ readonly subject: string;
51
+ readonly body: string;
52
+ };
53
+ /**
54
+ * The shipped connector catalog, as the rules need to read it (Story 2.2).
55
+ *
56
+ * ⛔ INJECTED, NOT BUNDLED. The rules run in this repo; the catalog ships in
57
+ * `hexasync-templates-vscode-ext/assets/connectors/catalog.json`, which `prd/addendum.md` §2 decided
58
+ * deliberately — *"a data file under the extension's asset tree, so it inherits the existing bump gate for
59
+ * free"* — while rejecting a separate published data package as *"more version surface than 22 rows justify"*.
60
+ *
61
+ * So the SHAPE lives here and the DATA arrives through `ValidationContext.connectorCatalog`, which is the
62
+ * pattern that context already uses for `variables`, `projects`, `libraryVariables` and `overwrites`. The rule
63
+ * stays one implementation that the Problems panel and the compose report both run (NFR-1) — and that an MCP
64
+ * server will run unchanged when Epic 6 builds one, which is the point of the seam rather than a claim that it
65
+ * exists today (Epic 2 review: three comments asserted that surface as present);
66
+ * only the data is supplied.
67
+ *
68
+ * The consequence is real and must never be silent: a bare `hexasync compose` has no catalog, so the
69
+ * catalog-dependent checks cannot run. `catalogChecksSkipped` is how a run says so out loud.
70
+ */
71
+ export interface CatalogEntry {
72
+ readonly key: string;
73
+ readonly name: string;
74
+ readonly generation: string;
75
+ readonly connectorId: string;
76
+ readonly systemId?: string;
77
+ readonly systemCode?: string;
78
+ readonly status?: string;
79
+ /**
80
+ * The connector's logo, as a bare name (`lightspeed`), a filename (`lazada.png`), a repository path or an
81
+ * absolute URL — the third link of FR-11's icon chain (Story 3.1).
82
+ *
83
+ * Added because it was missing: all 22 shipped rows carry one and no consumer could read it.
84
+ */
85
+ readonly icon?: string;
86
+ /** The SYSTEM in a developer's terms — prefilled into a generated connection (Story 3.4). */
87
+ readonly description?: string;
88
+ /** The catalog key of the row that replaces this one — Story 3.9 offers the migration by name. */
89
+ readonly supersededBy?: string;
90
+ /** The catalog key of the row this one replaces. The inverse of `supersededBy`. */
91
+ readonly supersedes?: string;
92
+ /** False when this row must not be offered as something to connect to. Absent means yes. */
93
+ readonly connectable?: boolean;
94
+ /** True for a real id that is never a third-party system — the self connector, PostgreSQL, Basic Auth. */
95
+ readonly internal?: boolean;
96
+ /**
97
+ * How the system authenticates — `oauth2-authcode`, `api-key`, `basic`, `custom-app`, `rpa`, `unknown`.
98
+ *
99
+ * Declared in `connector-catalog.schema.json` and carried by no shipped row yet. Added to this type in the
100
+ * Story 5.5 review: the extension's connection card was built to state it and the editor's catalog loader was
101
+ * silently dropping the field, so it could never arrive however many rows declared it.
102
+ */
103
+ readonly authKind?: string;
104
+ }
105
+ export interface ConnectorCatalog {
106
+ readonly catalogVersion: string | number;
107
+ /** Every Gateway V3 row shares this connector id, which is why identity is the PAIR (addendum §2). */
108
+ readonly universalConnectorId: string;
109
+ readonly connectors: readonly CatalogEntry[];
110
+ }
111
+ /** Said once, so six surfaces cannot each invent their own way of admitting it. */
112
+ export declare const CATALOG_CHECKS_SKIPPED = "Connector-catalog checks were skipped: no catalog was supplied to this run.";
113
+ export declare function catalogFactsOf(catalog: ConnectorCatalog): CatalogFacts;
114
+ export declare function isUniversalConnector(catalog: ConnectorCatalog, connectorId: string): boolean;
115
+ /** Every entry registered under a connector id. More than one only for the universal connector. */
116
+ export declare function entriesForConnector(catalog: ConnectorCatalog, connectorId: string): readonly CatalogEntry[];
117
+ /** The entry a `(connectorId, systemCode)` pair names — the identity addendum §2 insists on. */
118
+ export declare function entryForPair(catalog: ConnectorCatalog, connectorId: string, systemCode: string | undefined): CatalogEntry | undefined;
119
+ /** Any entry claiming this system code, whatever its connector — how a copy-paste is caught. */
120
+ export declare function entriesForSystemCode(catalog: ConnectorCatalog, systemCode: string): readonly CatalogEntry[];
121
+ /** Any entry claiming this system id. The other half of the pair a copy-paste breaks. */
122
+ export declare function entriesForSystemId(catalog: ConnectorCatalog, systemId: string): readonly CatalogEntry[];
123
+ //# sourceMappingURL=connectorSupport.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"connectorSupport.d.ts","sourceRoot":"","sources":["../src/connectorSupport.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,116 @@
1
+ /**
2
+ * The unsupported-connector wording — ONE source, six surfaces (FR-10, Story 2.5; AD-31).
3
+ *
4
+ * `unsupported-connector-policy.md` states the contract in the feature's own words: *"This file exists so that
5
+ * the diagnostic, the picker, the preview, the compose report, the MCP server and the generated AI instructions
6
+ * all quote the same words. Six surfaces, one source."* This module IS that source in code, so a surface cannot
7
+ * paraphrase it and drift.
8
+ *
9
+ * It lives in the zero-dependency model package deliberately: the CLI's rules, the CLI's report renderer and the
10
+ * VS Code extension all already depend on this package, and nothing else can reach all three.
11
+ *
12
+ * ### Why the catalog facts are parameters rather than baked in
13
+ *
14
+ * The message names the catalog version and the connector count, because — per the policy — *"when the catalog is
15
+ * behind, that is the tool's fault, not the author's."* Those two numbers change every time the catalog ships, so
16
+ * baking them in would mean the wording and the data drifting apart by construction.
17
+ */
18
+ /** What a request needs, in the order the policy lists them. Numbered by the renderer, not here. */
19
+ export const REQUEST_REQUIREMENTS = [
20
+ '**The system** you want to connect to (product name, and the edition/plan if it matters)',
21
+ '**Website URL**',
22
+ '**API documentation** — a link, or an attachment if the docs are not public. It must be **up to date**',
23
+ '**A sandbox / test environment**, with credentials we can use',
24
+ ];
25
+ export const SUPPORT_EMAIL = 'support@beehexa.com';
26
+ /**
27
+ * The full block — for `explain`, the compose report appendix, the preview banner and the AI instructions.
28
+ */
29
+ export function unsupportedConnectorGuidance(facts) {
30
+ const numbered = REQUEST_REQUIREMENTS.map((requirement, index) => `${index + 1}. ${requirement}`).join('\n');
31
+ return [
32
+ '**This connector is not supported.**',
33
+ '',
34
+ `HexaSync currently supports only the connectors in the shipped catalog (\`catalogVersion ${facts.catalogVersion}\`, ` +
35
+ `\`${facts.connectorCount}\` connectors). To have a new system implemented, email the HexaSync Team at ` +
36
+ `**${SUPPORT_EMAIL}** with:`,
37
+ '',
38
+ numbered,
39
+ '',
40
+ 'The HexaSync Team will contact you to proceed with the request.',
41
+ ].join('\n');
42
+ }
43
+ /**
44
+ * The short form — for a diagnostic message, a hover, a status-bar item, a one-line tool response.
45
+ *
46
+ * Deliberately NOT a truncation of the long form: a truncated instruction that stops before the sandbox is an
47
+ * instruction someone will follow incompletely.
48
+ */
49
+ export const UNSUPPORTED_CONNECTOR_SHORT = `Not supported. Request this connector: email **${SUPPORT_EMAIL}** with the system name, website URL, ` +
50
+ `up-to-date API docs, and a sandbox environment.`;
51
+ /**
52
+ * The pre-filled request email (FR-10's *Copy request email*).
53
+ *
54
+ * Pre-fills what the tooling KNOWS — the identity found, and the system name when the author gave one — and
55
+ * leaves the documentation link and the sandbox for the author, because inventing either would be worse than an
56
+ * empty line. G-6 applies to a request email as much as to a connection: never invent an identity.
57
+ */
58
+ export function unsupportedConnectorRequestEmail(input) {
59
+ const named = input.systemName?.trim() || '<the system you want to connect to>';
60
+ return {
61
+ to: SUPPORT_EMAIL,
62
+ subject: `HexaSync connector request: ${named}`,
63
+ body: [
64
+ 'Hello HexaSync Team,',
65
+ '',
66
+ `I would like to request support for a connector that is not in the shipped catalog ` +
67
+ `(catalogVersion ${input.facts.catalogVersion}, ${input.facts.connectorCount} connectors).`,
68
+ '',
69
+ `1. System: ${named}`,
70
+ `2. Website URL: `,
71
+ `3. API documentation (must be up to date): `,
72
+ `4. Sandbox / test environment and credentials: `,
73
+ '',
74
+ 'Details found in my template:',
75
+ `- connector id: ${input.connectorId}`,
76
+ ...(input.systemCode ? [`- system code: ${input.systemCode}`] : []),
77
+ '',
78
+ 'Thank you.',
79
+ ].join('\n'),
80
+ };
81
+ }
82
+ /** Said once, so six surfaces cannot each invent their own way of admitting it. */
83
+ export const CATALOG_CHECKS_SKIPPED = 'Connector-catalog checks were skipped: no catalog was supplied to this run.';
84
+ /**
85
+ * Ids are compared LOWERCASED.
86
+ *
87
+ * addendum §2: *"Casing is not guaranteed across the places these values arrive from — the platform UI had to
88
+ * build a lowercased index of its own map for the same reason."*
89
+ */
90
+ const fold = (value) => (value ?? '').trim().toLowerCase();
91
+ export function catalogFactsOf(catalog) {
92
+ return {
93
+ catalogVersion: catalog.catalogVersion,
94
+ connectorCount: catalog.connectors.length,
95
+ };
96
+ }
97
+ export function isUniversalConnector(catalog, connectorId) {
98
+ return fold(connectorId) === fold(catalog.universalConnectorId);
99
+ }
100
+ /** Every entry registered under a connector id. More than one only for the universal connector. */
101
+ export function entriesForConnector(catalog, connectorId) {
102
+ return catalog.connectors.filter((entry) => fold(entry.connectorId) === fold(connectorId));
103
+ }
104
+ /** The entry a `(connectorId, systemCode)` pair names — the identity addendum §2 insists on. */
105
+ export function entryForPair(catalog, connectorId, systemCode) {
106
+ return entriesForConnector(catalog, connectorId).find((entry) => fold(entry.systemCode) === fold(systemCode));
107
+ }
108
+ /** Any entry claiming this system code, whatever its connector — how a copy-paste is caught. */
109
+ export function entriesForSystemCode(catalog, systemCode) {
110
+ return catalog.connectors.filter((entry) => fold(entry.systemCode) === fold(systemCode));
111
+ }
112
+ /** Any entry claiming this system id. The other half of the pair a copy-paste breaks. */
113
+ export function entriesForSystemId(catalog, systemId) {
114
+ return catalog.connectors.filter((entry) => fold(entry.systemId) === fold(systemId));
115
+ }
116
+ //# sourceMappingURL=connectorSupport.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"connectorSupport.js","sourceRoot":"","sources":["../src/connectorSupport.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,oGAAoG;AACpG,MAAM,CAAC,MAAM,oBAAoB,GAAsB;IACrD,0FAA0F;IAC1F,iBAAiB;IACjB,wGAAwG;IACxG,+DAA+D;CAChE,CAAC;AAEF,MAAM,CAAC,MAAM,aAAa,GAAG,qBAAqB,CAAC;AAOnD;;GAEG;AACH,MAAM,UAAU,4BAA4B,CAAC,KAAmB;IAC9D,MAAM,QAAQ,GAAG,oBAAoB,CAAC,GAAG,CACvC,CAAC,WAAW,EAAE,KAAK,EAAE,EAAE,CAAC,GAAG,KAAK,GAAG,CAAC,KAAK,WAAW,EAAE,CACvD,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACb,OAAO;QACL,sCAAsC;QACtC,EAAE;QACF,4FAA4F,KAAK,CAAC,cAAc,MAAM;YACpH,KAAK,KAAK,CAAC,cAAc,+EAA+E;YACxG,KAAK,aAAa,UAAU;QAC9B,EAAE;QACF,QAAQ;QACR,EAAE;QACF,iEAAiE;KAClE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf,CAAC;AAED;;;;;GAKG;AACH,MAAM,CAAC,MAAM,2BAA2B,GACtC,kDAAkD,aAAa,wCAAwC;IACvG,iDAAiD,CAAC;AAEpD;;;;;;GAMG;AACH,MAAM,UAAU,gCAAgC,CAAC,KAKhD;IACC,MAAM,KAAK,GACT,KAAK,CAAC,UAAU,EAAE,IAAI,EAAE,IAAI,qCAAqC,CAAC;IACpE,OAAO;QACL,EAAE,EAAE,aAAa;QACjB,OAAO,EAAE,+BAA+B,KAAK,EAAE;QAC/C,IAAI,EAAE;YACJ,sBAAsB;YACtB,EAAE;YACF,qFAAqF;gBACnF,mBAAmB,KAAK,CAAC,KAAK,CAAC,cAAc,KAAK,KAAK,CAAC,KAAK,CAAC,cAAc,eAAe;YAC7F,EAAE;YACF,cAAc,KAAK,EAAE;YACrB,kBAAkB;YAClB,6CAA6C;YAC7C,iDAAiD;YACjD,EAAE;YACF,+BAA+B;YAC/B,mBAAmB,KAAK,CAAC,WAAW,EAAE;YACtC,GAAG,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,kBAAkB,KAAK,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YACnE,EAAE;YACF,YAAY;SACb,CAAC,IAAI,CAAC,IAAI,CAAC;KACb,CAAC;AACJ,CAAC;AA8DD,mFAAmF;AACnF,MAAM,CAAC,MAAM,sBAAsB,GACjC,6EAA6E,CAAC;AAEhF;;;;;GAKG;AACH,MAAM,IAAI,GAAG,CAAC,KAAyB,EAAU,EAAE,CACjD,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;AAErC,MAAM,UAAU,cAAc,CAAC,OAAyB;IACtD,OAAO;QACL,cAAc,EAAE,OAAO,CAAC,cAAc;QACtC,cAAc,EAAE,OAAO,CAAC,UAAU,CAAC,MAAM;KAC1C,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,oBAAoB,CAClC,OAAyB,EACzB,WAAmB;IAEnB,OAAO,IAAI,CAAC,WAAW,CAAC,KAAK,IAAI,CAAC,OAAO,CAAC,oBAAoB,CAAC,CAAC;AAClE,CAAC;AAED,mGAAmG;AACnG,MAAM,UAAU,mBAAmB,CACjC,OAAyB,EACzB,WAAmB;IAEnB,OAAO,OAAO,CAAC,UAAU,CAAC,MAAM,CAC9B,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,KAAK,IAAI,CAAC,WAAW,CAAC,CACzD,CAAC;AACJ,CAAC;AAED,gGAAgG;AAChG,MAAM,UAAU,YAAY,CAC1B,OAAyB,EACzB,WAAmB,EACnB,UAA8B;IAE9B,OAAO,mBAAmB,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC,IAAI,CACnD,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,KAAK,IAAI,CAAC,UAAU,CAAC,CACvD,CAAC;AACJ,CAAC;AAED,gGAAgG;AAChG,MAAM,UAAU,oBAAoB,CAClC,OAAyB,EACzB,UAAkB;IAElB,OAAO,OAAO,CAAC,UAAU,CAAC,MAAM,CAC9B,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,KAAK,IAAI,CAAC,UAAU,CAAC,CACvD,CAAC;AACJ,CAAC;AAED,yFAAyF;AACzF,MAAM,UAAU,kBAAkB,CAChC,OAAyB,EACzB,QAAgB;IAEhB,OAAO,OAAO,CAAC,UAAU,CAAC,MAAM,CAC9B,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,KAAK,IAAI,CAAC,QAAQ,CAAC,CACnD,CAAC;AACJ,CAAC"}
@@ -0,0 +1,57 @@
1
+ /**
2
+ * The compose contract version (AD-13, Story 1.10).
3
+ *
4
+ * A single integer, deliberately independent of every package's semver. Semver answers "did the
5
+ * API change?"; this answers a different and more dangerous question — "would the same input
6
+ * compose to a different output?" A patch release that fixes a typo in a report heading changes
7
+ * the version of the package but not the meaning of a composition, and warning about that would
8
+ * train everyone to ignore the warning.
9
+ *
10
+ * BUMP THIS **ONLY** when merge, inheritance or substitution semantics change:
11
+ * - the merge engine's later-wins / id-matching behaviour
12
+ * - the resolver's generation, weight, index or dedupe ordering
13
+ * - which files are admitted to the variable pool, or how the pool is assembled
14
+ * - the shape or precedence of `!md[...]` include resolution
15
+ *
16
+ * Do NOT bump it for: report wording, new diagnostics, performance work, refactors that hold the
17
+ * byte-identical baseline, or anything the composed `output.yaml` cannot observe.
18
+ *
19
+ * `scripts/contract-version-guard.mjs` enforces the first list in CI: touch a semantics file
20
+ * without moving this integer and the build fails.
21
+ *
22
+ * History
23
+ * 1 — Phase 1. Established at the end of Epic 1, covering the merge engine, the two-phase
24
+ * weighted resolver, and the Story 1.8 rule admitting a declared external's variables.yaml
25
+ * to the pool.
26
+ * 2 — Epic 1 review fixes (2026-08-02). Three changes that a composed output CAN observe:
27
+ * variable precedence across sibling projects at the same generation no longer depends on
28
+ * which slot a value came from; `!md[...]` paths are resolved after a partial's
29
+ * `replacements` rather than before; and include discovery no longer misses a path
30
+ * containing `]` nor aborts on a reference the resolver would never resolve.
31
+ * 3 — A missing `!md[...]` target no longer aborts the compose (2026-08-20). It resolved to an
32
+ * exception before, so the composed output did not exist at all; it now resolves to an EMPTY
33
+ * string and the miss is reported through `MergeHooks.onMissingInclude`, which the validation
34
+ * registry raises as `MDI-1` (high). A composed `output.yaml` can observe this directly — the
35
+ * same project that produced nothing now produces a document with an empty description — which
36
+ * is precisely the "shape or precedence of `!md[...]` include resolution" clause above, so it
37
+ * is a bump rather than an ACK. Losing an entire project's output and report to one absent
38
+ * Markdown file cost the author the very report that would have named the file.
39
+ */
40
+ export declare const COMPOSE_CONTRACT_VERSION = 3;
41
+ /** What a version mismatch means for a caller that found one. */
42
+ export interface ContractComparison {
43
+ ours: number;
44
+ /** `undefined` when the workspace declared none — never fabricated from `ours`. */
45
+ theirs: number | undefined;
46
+ match: boolean;
47
+ /** Human-readable, naming BOTH versions — a warning that names only one is unactionable. */
48
+ message?: string;
49
+ }
50
+ /**
51
+ * Compare the contract version a consumer was built against with the workspace toolchain's.
52
+ *
53
+ * Returns a comparison rather than throwing, because a mismatch must NOT stop anyone working
54
+ * (AC 2). The editor keeps composing; it just says so, and stamps what it produced.
55
+ */
56
+ export declare function compareComposeContract(ours: number, theirs: number | undefined | null): ContractComparison;
57
+ //# sourceMappingURL=contract.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"contract.d.ts","sourceRoot":"","sources":["../src/contract.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAsCG;AACH,eAAO,MAAM,wBAAwB,IAAI,CAAC;AAE1C,iEAAiE;AACjE,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,mFAAmF;IACnF,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC;IAC3B,KAAK,EAAE,OAAO,CAAC;IACf,4FAA4F;IAC5F,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED;;;;;GAKG;AACH,wBAAgB,sBAAsB,CACpC,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,GAChC,kBAAkB,CAoBpB"}
@@ -0,0 +1,68 @@
1
+ /**
2
+ * The compose contract version (AD-13, Story 1.10).
3
+ *
4
+ * A single integer, deliberately independent of every package's semver. Semver answers "did the
5
+ * API change?"; this answers a different and more dangerous question — "would the same input
6
+ * compose to a different output?" A patch release that fixes a typo in a report heading changes
7
+ * the version of the package but not the meaning of a composition, and warning about that would
8
+ * train everyone to ignore the warning.
9
+ *
10
+ * BUMP THIS **ONLY** when merge, inheritance or substitution semantics change:
11
+ * - the merge engine's later-wins / id-matching behaviour
12
+ * - the resolver's generation, weight, index or dedupe ordering
13
+ * - which files are admitted to the variable pool, or how the pool is assembled
14
+ * - the shape or precedence of `!md[...]` include resolution
15
+ *
16
+ * Do NOT bump it for: report wording, new diagnostics, performance work, refactors that hold the
17
+ * byte-identical baseline, or anything the composed `output.yaml` cannot observe.
18
+ *
19
+ * `scripts/contract-version-guard.mjs` enforces the first list in CI: touch a semantics file
20
+ * without moving this integer and the build fails.
21
+ *
22
+ * History
23
+ * 1 — Phase 1. Established at the end of Epic 1, covering the merge engine, the two-phase
24
+ * weighted resolver, and the Story 1.8 rule admitting a declared external's variables.yaml
25
+ * to the pool.
26
+ * 2 — Epic 1 review fixes (2026-08-02). Three changes that a composed output CAN observe:
27
+ * variable precedence across sibling projects at the same generation no longer depends on
28
+ * which slot a value came from; `!md[...]` paths are resolved after a partial's
29
+ * `replacements` rather than before; and include discovery no longer misses a path
30
+ * containing `]` nor aborts on a reference the resolver would never resolve.
31
+ * 3 — A missing `!md[...]` target no longer aborts the compose (2026-08-20). It resolved to an
32
+ * exception before, so the composed output did not exist at all; it now resolves to an EMPTY
33
+ * string and the miss is reported through `MergeHooks.onMissingInclude`, which the validation
34
+ * registry raises as `MDI-1` (high). A composed `output.yaml` can observe this directly — the
35
+ * same project that produced nothing now produces a document with an empty description — which
36
+ * is precisely the "shape or precedence of `!md[...]` include resolution" clause above, so it
37
+ * is a bump rather than an ACK. Losing an entire project's output and report to one absent
38
+ * Markdown file cost the author the very report that would have named the file.
39
+ */
40
+ export const COMPOSE_CONTRACT_VERSION = 3;
41
+ /**
42
+ * Compare the contract version a consumer was built against with the workspace toolchain's.
43
+ *
44
+ * Returns a comparison rather than throwing, because a mismatch must NOT stop anyone working
45
+ * (AC 2). The editor keeps composing; it just says so, and stamps what it produced.
46
+ */
47
+ export function compareComposeContract(ours, theirs) {
48
+ // An unknown version is not a mismatch. An older toolchain that predates the contract cannot
49
+ // report one, and treating absence as disagreement would warn every user of it, every time.
50
+ if (theirs === undefined || theirs === null) {
51
+ // `theirs: undefined`, NOT `theirs: ours` (corrected 2026-08-02). Echoing `ours` back was
52
+ // convenient for the `match` check and a lie to every caller that reads the field — a
53
+ // display or an artefact stamp would report a version the workspace never declared.
54
+ return { ours, theirs: undefined, match: true };
55
+ }
56
+ if (ours === theirs)
57
+ return { ours, theirs, match: true };
58
+ return {
59
+ ours,
60
+ theirs,
61
+ match: false,
62
+ message: `Compose contract mismatch: this extension composes under contract v${ours}, but the ` +
63
+ `workspace toolchain uses v${theirs}. The editor and your CI can therefore disagree ` +
64
+ `about a composed profile without either being wrong. Align the pinned ` +
65
+ `@beehexa/* packages with the workspace's toolchain.`,
66
+ };
67
+ }
68
+ //# sourceMappingURL=contract.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"contract.js","sourceRoot":"","sources":["../src/contract.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAsCG;AACH,MAAM,CAAC,MAAM,wBAAwB,GAAG,CAAC,CAAC;AAY1C;;;;;GAKG;AACH,MAAM,UAAU,sBAAsB,CACpC,IAAY,EACZ,MAAiC;IAEjC,6FAA6F;IAC7F,4FAA4F;IAC5F,IAAI,MAAM,KAAK,SAAS,IAAI,MAAM,KAAK,IAAI,EAAE,CAAC;QAC5C,0FAA0F;QAC1F,sFAAsF;QACtF,oFAAoF;QACpF,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;IAClD,CAAC;IACD,IAAI,IAAI,KAAK,MAAM;QAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;IAC1D,OAAO;QACL,IAAI;QACJ,MAAM;QACN,KAAK,EAAE,KAAK;QACZ,OAAO,EACL,sEAAsE,IAAI,YAAY;YACtF,6BAA6B,MAAM,kDAAkD;YACrF,wEAAwE;YACxE,qDAAqD;KACxD,CAAC;AACJ,CAAC"}
@@ -0,0 +1,89 @@
1
+ /** A node as a renderer needs to see it — neither flow package's shape, deliberately. */
2
+ export interface RenderNode {
3
+ /** The AD-33 canonical address. Projected to a mermaid id here, never by the caller. */
4
+ readonly address: string;
5
+ /** What the box says. */
6
+ readonly label: string;
7
+ /** Draw it as a decision diamond. */
8
+ readonly decides?: boolean;
9
+ /** Draw it as a stadium — a terminal, an unresolved target. */
10
+ readonly terminal?: boolean;
11
+ }
12
+ export interface RenderEdge {
13
+ readonly from: string;
14
+ readonly to: string;
15
+ readonly label?: string;
16
+ }
17
+ /** One subgraph. A flat chart passes a single group with no title. */
18
+ export interface RenderGroup {
19
+ readonly key: string;
20
+ readonly title?: string;
21
+ readonly nodes: readonly RenderNode[];
22
+ }
23
+ export type FlowDirection = 'TD' | 'LR';
24
+ export interface RenderOverlay {
25
+ /** Addresses a run walked through. */
26
+ readonly traversed?: readonly string[];
27
+ /** Addresses a run failed at. */
28
+ readonly errored?: readonly string[];
29
+ /**
30
+ * Supplied by the caller, not chosen here.
31
+ *
32
+ * dashboard's live values come from its theme; the extension's webview themes its own. A renderer that hardcoded a
33
+ * colour would be wrong in one of light or dark — which is exactly why the extension delegates to a stylesheet.
34
+ */
35
+ readonly colors?: {
36
+ readonly traversed?: string;
37
+ readonly errored?: string;
38
+ };
39
+ }
40
+ export interface RenderOptions {
41
+ readonly direction?: FlowDirection;
42
+ /** One chart with a subgraph per group, versus one flat chart. */
43
+ readonly multiStage?: boolean;
44
+ /** Run highlighting. An ARGUMENT, never state on the model (AD-29). */
45
+ readonly overlay?: RenderOverlay;
46
+ /**
47
+ * Emitted as `classDef`/`class` rather than a per-element style, for a consumer whose stylesheet owns the colour.
48
+ * Carries no colour of its own — see rule 3.
49
+ */
50
+ readonly shapeClasses?: readonly {
51
+ readonly name: string;
52
+ readonly declaration: string;
53
+ readonly addresses: readonly string[];
54
+ }[];
55
+ /**
56
+ * What an EMPTY flow says.
57
+ *
58
+ * `epic-4-ground-truth.md` records three different answers across the three implementations and that Story 4.8's AC
59
+ * — *"saying so rather than rendering an empty diagram"* — needs one chosen. The CLI's answer is adopted: a single
60
+ * node stating what is absent. The wording is the caller's, because only the caller knows whether "no steps" or "no
61
+ * pusher steps" is the true sentence.
62
+ */
63
+ readonly emptyLabel?: string;
64
+ }
65
+ /**
66
+ * A label, safe inside `["…"]`.
67
+ *
68
+ * ⚠️ Escaping lives HERE, and Story 4.2's review is why it is written down: the frontend port moved escaping out of
69
+ * the model layer without recording that it had moved, and **4 real labels carry a raw newline**
70
+ * (`ShoplinePublicApp.yaml`). A renderer that forgets breaks a real connector's diagram.
71
+ *
72
+ * The `&` replacement comes FIRST, or the entities the later rules produce would themselves be re-escaped.
73
+ */
74
+ export declare function escapeLabel(value: string): string;
75
+ /**
76
+ * The diagram.
77
+ *
78
+ * Deterministic for a given `(groups, edges, opts)`: every list is emitted in the order given, duplicates are
79
+ * collapsed by first appearance, and nothing consults the clock or the environment.
80
+ */
81
+ export declare function renderMermaid(groups: readonly RenderGroup[], edges: readonly RenderEdge[], opts?: RenderOptions): string;
82
+ /**
83
+ * A titled section with a fenced diagram, and nothing else (rule 3).
84
+ *
85
+ * What the composition report embeds and what an MCP resource serves — the same string, because two surfaces
86
+ * describing one flow disagreeing is the defect this epic exists to remove.
87
+ */
88
+ export declare function renderMarkdown(title: string, groups: readonly RenderGroup[], edges: readonly RenderEdge[], opts?: RenderOptions): string;
89
+ //# sourceMappingURL=flowRender.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"flowRender.d.ts","sourceRoot":"","sources":["../src/flowRender.ts"],"names":[],"mappings":"AA2CA,yFAAyF;AACzF,MAAM,WAAW,UAAU;IACzB,wFAAwF;IACxF,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,yBAAyB;IACzB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,qCAAqC;IACrC,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC;IAC3B,+DAA+D;IAC/D,QAAQ,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAC;CAC7B;AAED,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,sEAAsE;AACtE,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,KAAK,EAAE,SAAS,UAAU,EAAE,CAAC;CACvC;AAED,MAAM,MAAM,aAAa,GAAG,IAAI,GAAG,IAAI,CAAC;AAExC,MAAM,WAAW,aAAa;IAC5B,sCAAsC;IACtC,QAAQ,CAAC,SAAS,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACvC,iCAAiC;IACjC,QAAQ,CAAC,OAAO,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACrC;;;;;OAKG;IACH,QAAQ,CAAC,MAAM,CAAC,EAAE;QAChB,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;QAC5B,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;KAC3B,CAAC;CACH;AAED,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,SAAS,CAAC,EAAE,aAAa,CAAC;IACnC,kEAAkE;IAClE,QAAQ,CAAC,UAAU,CAAC,EAAE,OAAO,CAAC;IAC9B,uEAAuE;IACvE,QAAQ,CAAC,OAAO,CAAC,EAAE,aAAa,CAAC;IACjC;;;OAGG;IACH,QAAQ,CAAC,YAAY,CAAC,EAAE,SAAS;QAC/B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;QACtB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;QAC7B,QAAQ,CAAC,SAAS,EAAE,SAAS,MAAM,EAAE,CAAC;KACvC,EAAE,CAAC;IACJ;;;;;;;OAOG;IACH,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;CAC9B;AAwBD;;;;;;;;GAQG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAQjD;AAsFD;;;;;GAKG;AACH,wBAAgB,aAAa,CAC3B,MAAM,EAAE,SAAS,WAAW,EAAE,EAC9B,KAAK,EAAE,SAAS,UAAU,EAAE,EAC5B,IAAI,GAAE,aAAkB,GACvB,MAAM,CAiIR;AAED;;;;;GAKG;AACH,wBAAgB,cAAc,CAC5B,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,SAAS,WAAW,EAAE,EAC9B,KAAK,EAAE,SAAS,UAAU,EAAE,EAC5B,IAAI,GAAE,aAAkB,GACvB,MAAM,CAiBR"}