@memberjunction/core-actions 5.37.0 → 5.38.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 (42) hide show
  1. package/README.md +19 -1
  2. package/dist/custom/interactive-forms/_shared.d.ts +144 -0
  3. package/dist/custom/interactive-forms/_shared.d.ts.map +1 -0
  4. package/dist/custom/interactive-forms/_shared.js +300 -0
  5. package/dist/custom/interactive-forms/_shared.js.map +1 -0
  6. package/dist/custom/interactive-forms/activate-interactive-form-version.action.d.ts +31 -0
  7. package/dist/custom/interactive-forms/activate-interactive-form-version.action.d.ts.map +1 -0
  8. package/dist/custom/interactive-forms/activate-interactive-form-version.action.js +139 -0
  9. package/dist/custom/interactive-forms/activate-interactive-form-version.action.js.map +1 -0
  10. package/dist/custom/interactive-forms/create-interactive-form.action.d.ts +32 -0
  11. package/dist/custom/interactive-forms/create-interactive-form.action.d.ts.map +1 -0
  12. package/dist/custom/interactive-forms/create-interactive-form.action.js +162 -0
  13. package/dist/custom/interactive-forms/create-interactive-form.action.js.map +1 -0
  14. package/dist/custom/interactive-forms/get-active-form-for-entity.action.d.ts +46 -0
  15. package/dist/custom/interactive-forms/get-active-form-for-entity.action.d.ts.map +1 -0
  16. package/dist/custom/interactive-forms/get-active-form-for-entity.action.js +179 -0
  17. package/dist/custom/interactive-forms/get-active-form-for-entity.action.js.map +1 -0
  18. package/dist/custom/interactive-forms/get-default-form-scaffold.action.d.ts +32 -0
  19. package/dist/custom/interactive-forms/get-default-form-scaffold.action.d.ts.map +1 -0
  20. package/dist/custom/interactive-forms/get-default-form-scaffold.action.js +87 -0
  21. package/dist/custom/interactive-forms/get-default-form-scaffold.action.js.map +1 -0
  22. package/dist/custom/interactive-forms/get-entity-schema-for-form.action.d.ts +34 -0
  23. package/dist/custom/interactive-forms/get-entity-schema-for-form.action.d.ts.map +1 -0
  24. package/dist/custom/interactive-forms/get-entity-schema-for-form.action.js +103 -0
  25. package/dist/custom/interactive-forms/get-entity-schema-for-form.action.js.map +1 -0
  26. package/dist/custom/interactive-forms/index.d.ts +8 -0
  27. package/dist/custom/interactive-forms/index.d.ts.map +1 -0
  28. package/dist/custom/interactive-forms/index.js +8 -0
  29. package/dist/custom/interactive-forms/index.js.map +1 -0
  30. package/dist/custom/interactive-forms/modify-interactive-form.action.d.ts +54 -0
  31. package/dist/custom/interactive-forms/modify-interactive-form.action.d.ts.map +1 -0
  32. package/dist/custom/interactive-forms/modify-interactive-form.action.js +300 -0
  33. package/dist/custom/interactive-forms/modify-interactive-form.action.js.map +1 -0
  34. package/dist/custom/interactive-forms/revert-interactive-form.action.d.ts +39 -0
  35. package/dist/custom/interactive-forms/revert-interactive-form.action.d.ts.map +1 -0
  36. package/dist/custom/interactive-forms/revert-interactive-form.action.js +155 -0
  37. package/dist/custom/interactive-forms/revert-interactive-form.action.js.map +1 -0
  38. package/dist/index.d.ts +1 -0
  39. package/dist/index.d.ts.map +1 -1
  40. package/dist/index.js +2 -0
  41. package/dist/index.js.map +1 -1
  42. package/package.json +34 -32
@@ -0,0 +1,87 @@
1
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
2
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
6
+ };
7
+ import { BaseAction } from "@memberjunction/actions";
8
+ import { Metadata, LogError } from "@memberjunction/core";
9
+ import { RegisterClass } from "@memberjunction/global";
10
+ import { buildDefaultFormScaffold } from "@memberjunction/interactive-component-types/forms";
11
+ /**
12
+ * Read-only action that produces a working form-role `ComponentSpec`
13
+ * scaffolded from the entity's CodeGen metadata (Category /
14
+ * GeneratedFormSectionType / Sequence / FK relationships / value lists).
15
+ *
16
+ * **Why this exists.** Today the Form Builder agent writes JSX from
17
+ * scratch every time, producing inconsistent quality. Calling this action
18
+ * first gives the agent a known-good baseline (mirrors the default Angular
19
+ * form) that it can modify per user requirements instead of inventing a
20
+ * layout. Far fewer lint failures, dramatically better starting point.
21
+ *
22
+ * **Pure read.** No persistence. The returned spec is intended to be
23
+ * modified and then passed to {@link CreateInteractiveFormAction} or
24
+ * {@link ModifyInteractiveFormAction}.
25
+ */
26
+ let GetDefaultFormScaffoldForEntityAction = class GetDefaultFormScaffoldForEntityAction extends BaseAction {
27
+ /**
28
+ * Required input:
29
+ * - `EntityName` (string) — fully-qualified entity name, e.g. "MJ: Applications".
30
+ *
31
+ * Output:
32
+ * - `Spec` parameter — the scaffolded `ComponentSpec` object (componentRole='form', location='embedded').
33
+ * - `Message` — the same object, stringified.
34
+ */
35
+ async InternalRunAction(params) {
36
+ try {
37
+ const entityName = this.getStringParam(params, "EntityName");
38
+ if (!entityName) {
39
+ return failure("MISSING_PARAMETER", "Parameter 'EntityName' is required.");
40
+ }
41
+ const provider = params.Provider ?? Metadata.Provider;
42
+ if (!provider) {
43
+ return failure("NO_PROVIDER", "No metadata provider available.");
44
+ }
45
+ const spec = buildDefaultFormScaffold(entityName, provider);
46
+ if (!spec) {
47
+ return failure("ENTITY_NOT_FOUND", `Entity '${entityName}' is not registered with the active metadata provider.`);
48
+ }
49
+ params.Params.push({
50
+ Name: "Spec",
51
+ Type: "Output",
52
+ Value: spec,
53
+ });
54
+ return {
55
+ Success: true,
56
+ ResultCode: "SUCCESS",
57
+ Message: JSON.stringify(spec),
58
+ };
59
+ }
60
+ catch (err) {
61
+ const message = err instanceof Error ? err.message : String(err);
62
+ LogError(`GetDefaultFormScaffoldForEntityAction: ${message}`);
63
+ return failure("UNEXPECTED_ERROR", message);
64
+ }
65
+ }
66
+ getStringParam(params, name) {
67
+ const p = params.Params.find(x => x.Name?.trim().toLowerCase() === name.toLowerCase());
68
+ if (!p || p.Value == null)
69
+ return null;
70
+ const v = String(p.Value).trim();
71
+ return v.length > 0 ? v : null;
72
+ }
73
+ };
74
+ GetDefaultFormScaffoldForEntityAction = __decorate([
75
+ RegisterClass(BaseAction, "__GetDefaultFormScaffoldForEntity")
76
+ ], GetDefaultFormScaffoldForEntityAction);
77
+ export { GetDefaultFormScaffoldForEntityAction };
78
+ function failure(resultCode, message) {
79
+ return { Success: false, ResultCode: resultCode, Message: message };
80
+ }
81
+ /** Tree-shaking guard — called from src/index.ts. */
82
+ export function LoadGetDefaultFormScaffoldForEntityAction() {
83
+ if (false) {
84
+ const _ = GetDefaultFormScaffoldForEntityAction;
85
+ }
86
+ }
87
+ //# sourceMappingURL=get-default-form-scaffold.action.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-default-form-scaffold.action.js","sourceRoot":"","sources":["../../../src/custom/interactive-forms/get-default-form-scaffold.action.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,34 @@
1
+ import { ActionResultSimple, RunActionParams } from "@memberjunction/actions-base";
2
+ import { BaseAction } from "@memberjunction/actions";
3
+ /**
4
+ * Read-only action consumed by the Form Builder agent to inspect an entity's
5
+ * curated form-relevant schema before generating a form Component.
6
+ *
7
+ * Returns the `CuratedFormSchema` shape: FK references resolved to
8
+ * `{entity, displayField}`, value-list fields annotated with `allowedValues`,
9
+ * and audit / virtual / computed fields stripped. See
10
+ * `@memberjunction/interactive-component-types/forms` for the type.
11
+ *
12
+ * Output is stringified JSON in `Message` (Action framework convention) and
13
+ * also surfaced as a `Schema` output parameter for callers that prefer
14
+ * structured access.
15
+ */
16
+ export declare class GetEntitySchemaForFormAction extends BaseAction {
17
+ /**
18
+ * Required input:
19
+ * - `EntityName` (string) — fully-qualified entity name, e.g. "MJ: Applications".
20
+ *
21
+ * Output:
22
+ * - `Schema` parameter — the `CuratedFormSchema` object.
23
+ * - `Message` — the same object, stringified.
24
+ */
25
+ protected InternalRunAction(params: RunActionParams): Promise<ActionResultSimple>;
26
+ /** Case-insensitive trim-tolerant fetch for the EntityName param. */
27
+ private getEntityNameParam;
28
+ }
29
+ /**
30
+ * Tree-shaking guard. Imported and called from src/index.ts so bundlers
31
+ * don't drop the action when no consumer references it by name.
32
+ */
33
+ export declare function LoadGetEntitySchemaForFormAction(): void;
34
+ //# sourceMappingURL=get-entity-schema-for-form.action.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-entity-schema-for-form.action.d.ts","sourceRoot":"","sources":["../../../src/custom/interactive-forms/get-entity-schema-for-form.action.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AACnF,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAKrD;;;;;;;;;;;;GAYG;AACH,qBACa,4BAA6B,SAAQ,UAAU;IAExD;;;;;;;OAOG;cACa,iBAAiB,CAAC,MAAM,EAAE,eAAe,GAAG,OAAO,CAAC,kBAAkB,CAAC;IAmDvF,qEAAqE;IACrE,OAAO,CAAC,kBAAkB;CAS7B;AAED;;;GAGG;AACH,wBAAgB,gCAAgC,IAAI,IAAI,CAIvD"}
@@ -0,0 +1,103 @@
1
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
2
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
6
+ };
7
+ import { BaseAction } from "@memberjunction/actions";
8
+ import { Metadata, LogError } from "@memberjunction/core";
9
+ import { RegisterClass } from "@memberjunction/global";
10
+ import { buildCuratedFormSchema } from "@memberjunction/interactive-component-types/forms";
11
+ /**
12
+ * Read-only action consumed by the Form Builder agent to inspect an entity's
13
+ * curated form-relevant schema before generating a form Component.
14
+ *
15
+ * Returns the `CuratedFormSchema` shape: FK references resolved to
16
+ * `{entity, displayField}`, value-list fields annotated with `allowedValues`,
17
+ * and audit / virtual / computed fields stripped. See
18
+ * `@memberjunction/interactive-component-types/forms` for the type.
19
+ *
20
+ * Output is stringified JSON in `Message` (Action framework convention) and
21
+ * also surfaced as a `Schema` output parameter for callers that prefer
22
+ * structured access.
23
+ */
24
+ let GetEntitySchemaForFormAction = class GetEntitySchemaForFormAction extends BaseAction {
25
+ /**
26
+ * Required input:
27
+ * - `EntityName` (string) — fully-qualified entity name, e.g. "MJ: Applications".
28
+ *
29
+ * Output:
30
+ * - `Schema` parameter — the `CuratedFormSchema` object.
31
+ * - `Message` — the same object, stringified.
32
+ */
33
+ async InternalRunAction(params) {
34
+ try {
35
+ const entityName = this.getEntityNameParam(params);
36
+ if (!entityName) {
37
+ return {
38
+ Success: false,
39
+ ResultCode: "MISSING_PARAMETER",
40
+ Message: "Parameter 'EntityName' is required.",
41
+ };
42
+ }
43
+ const provider = params.Provider ?? Metadata.Provider;
44
+ if (!provider) {
45
+ return {
46
+ Success: false,
47
+ ResultCode: "NO_PROVIDER",
48
+ Message: "No metadata provider available. Action requires a configured provider on the run params or globally.",
49
+ };
50
+ }
51
+ const schema = buildCuratedFormSchema(entityName, provider);
52
+ if (!schema) {
53
+ return {
54
+ Success: false,
55
+ ResultCode: "ENTITY_NOT_FOUND",
56
+ Message: `Entity '${entityName}' is not registered with the active metadata provider.`,
57
+ };
58
+ }
59
+ params.Params.push({
60
+ Name: "Schema",
61
+ Type: "Output",
62
+ Value: schema,
63
+ });
64
+ return {
65
+ Success: true,
66
+ ResultCode: "SUCCESS",
67
+ Message: JSON.stringify(schema),
68
+ };
69
+ }
70
+ catch (err) {
71
+ const message = err instanceof Error ? err.message : String(err);
72
+ LogError(`GetEntitySchemaForFormAction: ${message}`);
73
+ return {
74
+ Success: false,
75
+ ResultCode: "UNEXPECTED_ERROR",
76
+ Message: message,
77
+ };
78
+ }
79
+ }
80
+ /** Case-insensitive trim-tolerant fetch for the EntityName param. */
81
+ getEntityNameParam(params) {
82
+ const param = params.Params.find(p => p.Name?.trim().toLowerCase() === "entityname");
83
+ if (!param || param.Value == null) {
84
+ return null;
85
+ }
86
+ const value = String(param.Value).trim();
87
+ return value.length > 0 ? value : null;
88
+ }
89
+ };
90
+ GetEntitySchemaForFormAction = __decorate([
91
+ RegisterClass(BaseAction, "__GetEntitySchemaForForm")
92
+ ], GetEntitySchemaForFormAction);
93
+ export { GetEntitySchemaForFormAction };
94
+ /**
95
+ * Tree-shaking guard. Imported and called from src/index.ts so bundlers
96
+ * don't drop the action when no consumer references it by name.
97
+ */
98
+ export function LoadGetEntitySchemaForFormAction() {
99
+ if (false) {
100
+ const _ = GetEntitySchemaForFormAction;
101
+ }
102
+ }
103
+ //# sourceMappingURL=get-entity-schema-for-form.action.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-entity-schema-for-form.action.js","sourceRoot":"","sources":["../../../src/custom/interactive-forms/get-entity-schema-for-form.action.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ export * from './get-entity-schema-for-form.action.js';
2
+ export * from './get-default-form-scaffold.action.js';
3
+ export * from './get-active-form-for-entity.action.js';
4
+ export * from './create-interactive-form.action.js';
5
+ export * from './modify-interactive-form.action.js';
6
+ export * from './activate-interactive-form-version.action.js';
7
+ export * from './revert-interactive-form.action.js';
8
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/custom/interactive-forms/index.ts"],"names":[],"mappings":"AAAA,cAAc,qCAAqC,CAAC;AACpD,cAAc,oCAAoC,CAAC;AACnD,cAAc,qCAAqC,CAAC;AACpD,cAAc,kCAAkC,CAAC;AACjD,cAAc,kCAAkC,CAAC;AACjD,cAAc,4CAA4C,CAAC;AAC3D,cAAc,kCAAkC,CAAC"}
@@ -0,0 +1,8 @@
1
+ export * from './get-entity-schema-for-form.action.js';
2
+ export * from './get-default-form-scaffold.action.js';
3
+ export * from './get-active-form-for-entity.action.js';
4
+ export * from './create-interactive-form.action.js';
5
+ export * from './modify-interactive-form.action.js';
6
+ export * from './activate-interactive-form-version.action.js';
7
+ export * from './revert-interactive-form.action.js';
8
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/custom/interactive-forms/index.ts"],"names":[],"mappings":"AAAA,cAAc,qCAAqC,CAAC;AACpD,cAAc,oCAAoC,CAAC;AACnD,cAAc,qCAAqC,CAAC;AACpD,cAAc,kCAAkC,CAAC;AACjD,cAAc,kCAAkC,CAAC;AACjD,cAAc,4CAA4C,CAAC;AAC3D,cAAc,kCAAkC,CAAC"}
@@ -0,0 +1,54 @@
1
+ import { ActionResultSimple, RunActionParams } from "@memberjunction/actions-base";
2
+ import { BaseAction } from "@memberjunction/actions";
3
+ /**
4
+ * Modify an existing interactive-form override.
5
+ *
6
+ * Behavior is driven by the **`VersionBumpKind` input** and the **source
7
+ * Override's status** (Override is the canonical "is this live" signal —
8
+ * Component.Status can drift independently):
9
+ *
10
+ * | Source Status | VersionBumpKind | Behavior |
11
+ * |---------------|------------------------|-----------------------------------------------------------------------------------------------------------------------------------------------------|
12
+ * | Pending | `in-place` (default) | Overwrite the existing Pending Component row in place. No new version. Iteration-loop behavior. |
13
+ * | Pending | `patch` / `minor` / `major` | **Demote** the existing Pending → Inactive, then insert a new Pending Component v(bumped) + new Pending Override pointing at it. Creates rollback. |
14
+ * | Active | `in-place` | **Rejected** — would corrupt the live Active row. Returns `INVALID_BUMP_FOR_STATUS`. |
15
+ * | Active | `patch` / `minor` (default) / `major` | Insert new Pending Component v(bumped) + new Pending Override. Active is untouched — user explicitly Activates later. |
16
+ * | Inactive | `in-place` | **Rejected** — overwriting a dead row achieves nothing. Use 'Revert Interactive Form' to re-activate first, or supply a bump kind. |
17
+ * | Inactive | `patch` (default) / `minor` / `major` | Branch-from-historical. Insert new Pending Component v(bumped) sourced from this Inactive spec. The Inactive source is left alone (already historical). |
18
+ *
19
+ * **Defaults** preserve historical behavior: omit `VersionBumpKind` and
20
+ * Pending sources stay in-place, Active sources bump minor, Inactive
21
+ * sources bump patch (the conservative branch-from-historical case).
22
+ *
23
+ * **Security clamp.** Modify *always* writes a User-scope Pending Override,
24
+ * regardless of the original override's scope. Even if the caller is
25
+ * modifying a Role-scope or Global override (which they have permission to
26
+ * read because they pass the ownership check), the new Pending sibling
27
+ * is always User-scoped to the calling user. Scope promotion (User → Role
28
+ * → Global) is a separate, deliberate human action with its own permission
29
+ * gate in Component Studio / Form Builder. The agent cannot widen scope
30
+ * through Modify any more than through Create.
31
+ *
32
+ * **Ownership check.** The caller must own (or have role membership for, or
33
+ * be admin over) the existing override they're modifying. See
34
+ * `checkOverrideOwnership` in `_shared.ts`. Returns FORBIDDEN if rejected.
35
+ *
36
+ * Inputs:
37
+ * - `OverrideID` (required, string) — the override to modify
38
+ * - `Spec` (required, ComponentSpec | string) — the new form spec
39
+ * - `Notes` (optional, string) — appended to the override's Notes column
40
+ * - `VersionBumpKind` (optional, 'in-place' | 'patch' | 'minor' | 'major') — see table above
41
+ *
42
+ * Outputs:
43
+ * - `ComponentID` — the Component row that now holds the spec (new for snapshots, same for in-place)
44
+ * - `OverrideID` — the Override row that points at it
45
+ * - `Mode` — 'in-place' or 'new-version'
46
+ * - `Version` — the Component's resulting Version string
47
+ */
48
+ export declare class ModifyInteractiveFormAction extends BaseAction {
49
+ protected InternalRunAction(params: RunActionParams): Promise<ActionResultSimple>;
50
+ private findParam;
51
+ }
52
+ /** Tree-shaking guard. */
53
+ export declare function LoadModifyInteractiveFormAction(): void;
54
+ //# sourceMappingURL=modify-interactive-form.action.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"modify-interactive-form.action.d.ts","sourceRoot":"","sources":["../../../src/custom/interactive-forms/modify-interactive-form.action.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AACnF,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAWrD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4CG;AACH,qBACa,2BAA4B,SAAQ,UAAU;cAEvC,iBAAiB,CAAC,MAAM,EAAE,eAAe,GAAG,OAAO,CAAC,kBAAkB,CAAC;IAuOvF,OAAO,CAAC,SAAS;CAKpB;AAED,0BAA0B;AAC1B,wBAAgB,+BAA+B,IAAI,IAAI,CAItD"}
@@ -0,0 +1,300 @@
1
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
2
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
6
+ };
7
+ import { BaseAction } from "@memberjunction/actions";
8
+ import { Metadata, LogError } from "@memberjunction/core";
9
+ import { RegisterClass } from "@memberjunction/global";
10
+ import { addOutput, bumpVersion, checkOverrideOwnership, failure, getStringParam, insertComponent, insertOverride, lintFormSpec, loadComponent, loadOverride, mapToComponentStatus, parseSpecParam, parseVersionBumpKind, } from "./_shared.js";
11
+ /**
12
+ * Modify an existing interactive-form override.
13
+ *
14
+ * Behavior is driven by the **`VersionBumpKind` input** and the **source
15
+ * Override's status** (Override is the canonical "is this live" signal —
16
+ * Component.Status can drift independently):
17
+ *
18
+ * | Source Status | VersionBumpKind | Behavior |
19
+ * |---------------|------------------------|-----------------------------------------------------------------------------------------------------------------------------------------------------|
20
+ * | Pending | `in-place` (default) | Overwrite the existing Pending Component row in place. No new version. Iteration-loop behavior. |
21
+ * | Pending | `patch` / `minor` / `major` | **Demote** the existing Pending → Inactive, then insert a new Pending Component v(bumped) + new Pending Override pointing at it. Creates rollback. |
22
+ * | Active | `in-place` | **Rejected** — would corrupt the live Active row. Returns `INVALID_BUMP_FOR_STATUS`. |
23
+ * | Active | `patch` / `minor` (default) / `major` | Insert new Pending Component v(bumped) + new Pending Override. Active is untouched — user explicitly Activates later. |
24
+ * | Inactive | `in-place` | **Rejected** — overwriting a dead row achieves nothing. Use 'Revert Interactive Form' to re-activate first, or supply a bump kind. |
25
+ * | Inactive | `patch` (default) / `minor` / `major` | Branch-from-historical. Insert new Pending Component v(bumped) sourced from this Inactive spec. The Inactive source is left alone (already historical). |
26
+ *
27
+ * **Defaults** preserve historical behavior: omit `VersionBumpKind` and
28
+ * Pending sources stay in-place, Active sources bump minor, Inactive
29
+ * sources bump patch (the conservative branch-from-historical case).
30
+ *
31
+ * **Security clamp.** Modify *always* writes a User-scope Pending Override,
32
+ * regardless of the original override's scope. Even if the caller is
33
+ * modifying a Role-scope or Global override (which they have permission to
34
+ * read because they pass the ownership check), the new Pending sibling
35
+ * is always User-scoped to the calling user. Scope promotion (User → Role
36
+ * → Global) is a separate, deliberate human action with its own permission
37
+ * gate in Component Studio / Form Builder. The agent cannot widen scope
38
+ * through Modify any more than through Create.
39
+ *
40
+ * **Ownership check.** The caller must own (or have role membership for, or
41
+ * be admin over) the existing override they're modifying. See
42
+ * `checkOverrideOwnership` in `_shared.ts`. Returns FORBIDDEN if rejected.
43
+ *
44
+ * Inputs:
45
+ * - `OverrideID` (required, string) — the override to modify
46
+ * - `Spec` (required, ComponentSpec | string) — the new form spec
47
+ * - `Notes` (optional, string) — appended to the override's Notes column
48
+ * - `VersionBumpKind` (optional, 'in-place' | 'patch' | 'minor' | 'major') — see table above
49
+ *
50
+ * Outputs:
51
+ * - `ComponentID` — the Component row that now holds the spec (new for snapshots, same for in-place)
52
+ * - `OverrideID` — the Override row that points at it
53
+ * - `Mode` — 'in-place' or 'new-version'
54
+ * - `Version` — the Component's resulting Version string
55
+ */
56
+ let ModifyInteractiveFormAction = class ModifyInteractiveFormAction extends BaseAction {
57
+ async InternalRunAction(params) {
58
+ try {
59
+ const overrideID = getStringParam(params, "OverrideID");
60
+ if (!overrideID) {
61
+ return failure("MISSING_PARAMETER", "Parameter 'OverrideID' is required.");
62
+ }
63
+ const specRaw = this.findParam(params, "Spec");
64
+ if (specRaw == null) {
65
+ return failure("MISSING_PARAMETER", "Parameter 'Spec' is required.");
66
+ }
67
+ const parsed = parseSpecParam(specRaw);
68
+ if ('error' in parsed) {
69
+ return failure("LINT_FAILED", `Spec is not valid JSON: ${parsed.error}`);
70
+ }
71
+ const spec = parsed;
72
+ const notes = getStringParam(params, "Notes");
73
+ const provider = params.Provider ?? Metadata.Provider;
74
+ if (!provider)
75
+ return failure("NO_PROVIDER", "No metadata provider available.");
76
+ const user = params.ContextUser;
77
+ if (!user)
78
+ return failure("NO_USER", "Action requires a ContextUser.");
79
+ const override = await loadOverride(provider, user, overrideID);
80
+ if (!override) {
81
+ return failure("OVERRIDE_NOT_FOUND", `EntityFormOverride '${overrideID}' not found.`);
82
+ }
83
+ // Defense-in-depth ownership check — see _shared.ts.
84
+ const ownershipFail = checkOverrideOwnership(override, user);
85
+ if (ownershipFail)
86
+ return ownershipFail;
87
+ const existingComponent = await loadComponent(provider, user, override.ComponentID);
88
+ if (!existingComponent) {
89
+ return failure("COMPONENT_NOT_FOUND", `Override ${overrideID} points at Component ${override.ComponentID} which no longer exists.`);
90
+ }
91
+ // Lineage identity guard. Component lineage is collapsed by Name
92
+ // in the Form Builder version rail — different Name = different
93
+ // lineage, no rollback link between them. The agent must NOT
94
+ // rename across Modify calls (e.g. sanitizing "Contemporary AI
95
+ // Models Form" → "ContemporaryAIModelsForm" to satisfy
96
+ // component-name-mismatch lint silently forks the user's form
97
+ // into a phantom new lineage). Reject mismatches with a clear
98
+ // error so the agent retries with the right name. The function
99
+ // name inside spec.code MUST match spec.name (enforced by
100
+ // component-name-mismatch lint) — keep spec.name pinned to the
101
+ // existing Component.Name and sanitize the function name to
102
+ // match, never the other way around.
103
+ if (spec.name && spec.name !== existingComponent.Name) {
104
+ return failure("LINEAGE_NAME_MISMATCH", `Modify requires spec.name to match the existing Component name '${existingComponent.Name}', got '${spec.name}'. Modify operates on a Component lineage — its identity is the Name and cannot change between versions. Update spec.name and the function declaration in spec.code to '${existingComponent.Name}' and retry. (If the user wants a renamed form, that's a Create on the new entity or a manual rename in Form Builder, not a Modify.)`);
105
+ }
106
+ // Pin Name and Title to the existing row regardless — covers
107
+ // the case where the agent omitted spec.name entirely.
108
+ spec.name = existingComponent.Name;
109
+ if (existingComponent.Title && !spec.title)
110
+ spec.title = existingComponent.Title;
111
+ // Lint AFTER the lineage guard so any name/title pinning is
112
+ // visible to the linter (function-name match, etc.).
113
+ const lintFail = await lintFormSpec(spec, user);
114
+ if (lintFail)
115
+ return lintFail;
116
+ // Resolve VersionBumpKind: explicit param wins; otherwise default
117
+ // by source status to preserve historical behavior — Pending →
118
+ // in-place (iteration loop), Active → minor (snapshot).
119
+ //
120
+ // Route off the OVERRIDE's status, not the Component's. The Override
121
+ // is what determines whether a form is live; Component.Status can
122
+ // drift independently (manual edits, partial activations) and using
123
+ // it for routing risks demoting an Active override on the assumption
124
+ // it's a Pending iteration.
125
+ const overrideStatus = override.Status ?? 'Pending';
126
+ const sourceStatus = overrideStatus === 'Active' ? 'Active' :
127
+ overrideStatus === 'Pending' ? 'Pending' : 'Inactive';
128
+ const isPendingSource = sourceStatus === 'Pending';
129
+ const rawKind = getStringParam(params, "VersionBumpKind");
130
+ let bumpKind;
131
+ if (rawKind) {
132
+ const parsed = parseVersionBumpKind(rawKind);
133
+ if (!parsed) {
134
+ return failure("INVALID_BUMP_KIND", `Unknown VersionBumpKind '${rawKind}'. Expected one of: 'in-place', 'patch', 'minor', 'major'.`);
135
+ }
136
+ bumpKind = parsed;
137
+ }
138
+ else {
139
+ // Default behavior by source status. Inactive defaults to
140
+ // 'patch' (the conservative branch-from-historical case);
141
+ // any explicit kind still wins above.
142
+ bumpKind = isPendingSource ? 'in-place' : (sourceStatus === 'Inactive' ? 'patch' : 'minor');
143
+ }
144
+ // 'in-place' is only meaningful against a Pending source — it
145
+ // overwrites the iteration's Spec on the same row. Against
146
+ // Active (would clobber live) or Inactive (overwriting a dead
147
+ // row achieves nothing — won't re-activate it; use Revert for
148
+ // that) we reject loudly so the caller corrects intent.
149
+ if (bumpKind === 'in-place' && !isPendingSource) {
150
+ return failure("INVALID_BUMP_FOR_STATUS", `'in-place' is only valid against a Pending Override (got Status='${overrideStatus}'). Use 'patch', 'minor', or 'major' to snapshot a new Pending version from this source; use 'Revert Interactive Form' to re-activate an Inactive historical version.`);
151
+ }
152
+ if (bumpKind === 'in-place') {
153
+ // ── in-place modify of the Pending Component ─────────────
154
+ existingComponent.Specification = JSON.stringify(spec);
155
+ // Refresh Title/Description if the new spec moves them.
156
+ if (spec.title)
157
+ existingComponent.Title = spec.title;
158
+ if (spec.description)
159
+ existingComponent.Description = spec.description;
160
+ const saved = await existingComponent.Save();
161
+ if (!saved) {
162
+ return failure("PERSIST_FAILED", `Component in-place update failed: ${existingComponent.LatestResult?.CompleteMessage ?? 'unknown error'}`);
163
+ }
164
+ if (notes) {
165
+ // Append a line of human-readable notes. The Notes column
166
+ // accepts NVARCHAR(MAX), so this scales.
167
+ const existingNotes = override.Notes ?? '';
168
+ override.Notes = existingNotes
169
+ ? `${existingNotes}\n${notes}`
170
+ : notes;
171
+ await override.Save();
172
+ }
173
+ addOutput(params, "ComponentID", existingComponent.ID);
174
+ addOutput(params, "OverrideID", override.ID);
175
+ addOutput(params, "Mode", "in-place");
176
+ addOutput(params, "Version", existingComponent.Version);
177
+ return {
178
+ Success: true, ResultCode: "SUCCESS",
179
+ Message: JSON.stringify({
180
+ Mode: 'in-place',
181
+ ComponentID: existingComponent.ID,
182
+ OverrideID: override.ID,
183
+ Version: existingComponent.Version,
184
+ }),
185
+ };
186
+ }
187
+ // ── new-version path: snapshot to a new Pending Component +
188
+ // sibling Override. Works for Active sources (preserves the
189
+ // live Active row), Pending sources (where we demote the existing
190
+ // Pending → Inactive to keep the rollback history without producing
191
+ // two concurrent Pendings), and Inactive sources (branch-from-
192
+ // historical — no demote needed since source is already Inactive,
193
+ // and the user explicitly opened it to fork from there).
194
+ const newVersion = bumpVersion(existingComponent.Version, bumpKind);
195
+ const newSequence = (existingComponent.VersionSequence ?? 0) + 1;
196
+ const componentInsert = await insertComponent({
197
+ provider, user, spec,
198
+ fallbackName: existingComponent.Name,
199
+ description: existingComponent.Description,
200
+ version: newVersion,
201
+ versionSequence: newSequence,
202
+ componentStatus: 'Pending',
203
+ });
204
+ if ('error' in componentInsert)
205
+ return componentInsert.error;
206
+ const newComponentID = componentInsert.id;
207
+ // New Pending Override at the same scope as the existing one. We
208
+ // do not widen scope: if existing is User-scoped, new is too. If
209
+ // somehow existing is Role/Global (manual promotion), we still
210
+ // honor that — Modify is a content change, not a scope change.
211
+ const overrideInsert = await insertOverride({
212
+ provider, user,
213
+ entityID: override.EntityID,
214
+ componentID: newComponentID,
215
+ name: override.Name,
216
+ description: override.Description,
217
+ notes,
218
+ status: 'Pending',
219
+ priority: override.Priority,
220
+ });
221
+ if ('error' in overrideInsert) {
222
+ return failure("PERSIST_FAILED", `${overrideInsert.error.Message} (Component ${newComponentID} was persisted; its sibling override row failed to write.)`);
223
+ }
224
+ // Demote the prior Pending source — both the Component row and
225
+ // its Override row — to Inactive. This preserves the rollback
226
+ // history (the row stays in the version rail and can be
227
+ // re-Activated later) without leaving two concurrent Pendings
228
+ // for the same lineage. Failures here are non-fatal: the new
229
+ // version is already persisted, so we log and continue rather
230
+ // than tearing down what we just wrote.
231
+ let demotedComponentID = null;
232
+ let demotedOverrideID = null;
233
+ if (isPendingSource) {
234
+ // Component table uses 'Draft'/'Published'/'Deprecated' —
235
+ // map our 'Inactive' lifecycle to the table's 'Deprecated'.
236
+ try {
237
+ existingComponent.Status = mapToComponentStatus('Inactive');
238
+ const ok = await existingComponent.Save();
239
+ if (ok)
240
+ demotedComponentID = existingComponent.ID;
241
+ else
242
+ LogError(`ModifyInteractiveFormAction: failed to demote prior Pending Component ${existingComponent.ID}: ${existingComponent.LatestResult?.CompleteMessage ?? 'unknown error'}`);
243
+ }
244
+ catch (err) {
245
+ LogError(`ModifyInteractiveFormAction: error demoting prior Pending Component ${existingComponent.ID}: ${err instanceof Error ? err.message : String(err)}`);
246
+ }
247
+ try {
248
+ override.Status = 'Inactive';
249
+ const ok = await override.Save();
250
+ if (ok)
251
+ demotedOverrideID = override.ID;
252
+ else
253
+ LogError(`ModifyInteractiveFormAction: failed to demote prior Pending Override ${override.ID}: ${override.LatestResult?.CompleteMessage ?? 'unknown error'}`);
254
+ }
255
+ catch (err) {
256
+ LogError(`ModifyInteractiveFormAction: error demoting prior Pending Override ${override.ID}: ${err instanceof Error ? err.message : String(err)}`);
257
+ }
258
+ }
259
+ addOutput(params, "ComponentID", newComponentID);
260
+ addOutput(params, "OverrideID", overrideInsert.id);
261
+ addOutput(params, "Mode", "new-version");
262
+ addOutput(params, "Version", newVersion);
263
+ return {
264
+ Success: true, ResultCode: "SUCCESS",
265
+ Message: JSON.stringify({
266
+ Mode: 'new-version',
267
+ ComponentID: newComponentID,
268
+ OverrideID: overrideInsert.id,
269
+ Version: newVersion,
270
+ BumpKind: bumpKind,
271
+ PreviousComponentID: existingComponent.ID,
272
+ PreviousOverrideID: override.ID,
273
+ PreviousSourceStatus: sourceStatus,
274
+ DemotedComponentID: demotedComponentID,
275
+ DemotedOverrideID: demotedOverrideID,
276
+ }),
277
+ };
278
+ }
279
+ catch (err) {
280
+ const message = err instanceof Error ? err.message : String(err);
281
+ LogError(`ModifyInteractiveFormAction: ${message}`);
282
+ return failure("UNEXPECTED_ERROR", message);
283
+ }
284
+ }
285
+ findParam(params, name) {
286
+ const p = params.Params.find(x => x.Name?.trim().toLowerCase() === name.toLowerCase());
287
+ return p?.Value;
288
+ }
289
+ };
290
+ ModifyInteractiveFormAction = __decorate([
291
+ RegisterClass(BaseAction, "__ModifyInteractiveForm")
292
+ ], ModifyInteractiveFormAction);
293
+ export { ModifyInteractiveFormAction };
294
+ /** Tree-shaking guard. */
295
+ export function LoadModifyInteractiveFormAction() {
296
+ if (false) {
297
+ const _ = ModifyInteractiveFormAction;
298
+ }
299
+ }
300
+ //# sourceMappingURL=modify-interactive-form.action.js.map