@softacus-software/elwis-data-mcp 0.1.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 (118) hide show
  1. package/CHANGELOG.md +15 -0
  2. package/LICENSE +6 -0
  3. package/README.md +183 -0
  4. package/dist/app-scope.js +92 -0
  5. package/dist/app-scope.js.map +1 -0
  6. package/dist/artifact-read.js +114 -0
  7. package/dist/artifact-read.js.map +1 -0
  8. package/dist/audit.js +36 -0
  9. package/dist/audit.js.map +1 -0
  10. package/dist/builders/artifact-type-execute.js +100 -0
  11. package/dist/builders/artifact-type-execute.js.map +1 -0
  12. package/dist/builders/artifact-type-plan.js +139 -0
  13. package/dist/builders/artifact-type-plan.js.map +1 -0
  14. package/dist/builders/design-interview.js +246 -0
  15. package/dist/builders/design-interview.js.map +1 -0
  16. package/dist/builders/entity-lifecycle-execute.js +12 -0
  17. package/dist/builders/entity-lifecycle-execute.js.map +1 -0
  18. package/dist/builders/entity-lifecycle-plan.js +345 -0
  19. package/dist/builders/entity-lifecycle-plan.js.map +1 -0
  20. package/dist/builders/links-execute.js +50 -0
  21. package/dist/builders/links-execute.js.map +1 -0
  22. package/dist/builders/links-plan.js +62 -0
  23. package/dist/builders/links-plan.js.map +1 -0
  24. package/dist/builders/page-execute.js +38 -0
  25. package/dist/builders/page-execute.js.map +1 -0
  26. package/dist/builders/page-plan.js +148 -0
  27. package/dist/builders/page-plan.js.map +1 -0
  28. package/dist/builders/records-execute.js +24 -0
  29. package/dist/builders/records-execute.js.map +1 -0
  30. package/dist/builders/records-lifecycle-execute.js +30 -0
  31. package/dist/builders/records-lifecycle-execute.js.map +1 -0
  32. package/dist/builders/records-lifecycle-plan.js +199 -0
  33. package/dist/builders/records-lifecycle-plan.js.map +1 -0
  34. package/dist/builders/records-plan.js +74 -0
  35. package/dist/builders/records-plan.js.map +1 -0
  36. package/dist/builders/update-page-execute.js +38 -0
  37. package/dist/builders/update-page-execute.js.map +1 -0
  38. package/dist/builders/update-page-plan.js +137 -0
  39. package/dist/builders/update-page-plan.js.map +1 -0
  40. package/dist/builders/workflow-execute.js +11 -0
  41. package/dist/builders/workflow-execute.js.map +1 -0
  42. package/dist/builders/workflow-plan.js +115 -0
  43. package/dist/builders/workflow-plan.js.map +1 -0
  44. package/dist/cli/client-configs.js +98 -0
  45. package/dist/cli/client-configs.js.map +1 -0
  46. package/dist/cli/login.js +64 -0
  47. package/dist/cli/login.js.map +1 -0
  48. package/dist/cli/prompter.js +77 -0
  49. package/dist/cli/prompter.js.map +1 -0
  50. package/dist/cli/setup.js +214 -0
  51. package/dist/cli/setup.js.map +1 -0
  52. package/dist/config.js +38 -0
  53. package/dist/config.js.map +1 -0
  54. package/dist/confirm.js +22 -0
  55. package/dist/confirm.js.map +1 -0
  56. package/dist/elwis-api.js +96 -0
  57. package/dist/elwis-api.js.map +1 -0
  58. package/dist/http-client.js +142 -0
  59. package/dist/http-client.js.map +1 -0
  60. package/dist/index.js +20 -0
  61. package/dist/index.js.map +1 -0
  62. package/dist/jwt.js +18 -0
  63. package/dist/jwt.js.map +1 -0
  64. package/dist/prune.js +9 -0
  65. package/dist/prune.js.map +1 -0
  66. package/dist/resolve.js +71 -0
  67. package/dist/resolve.js.map +1 -0
  68. package/dist/result.js +16 -0
  69. package/dist/result.js.map +1 -0
  70. package/dist/server.js +82 -0
  71. package/dist/server.js.map +1 -0
  72. package/dist/session-store.js +51 -0
  73. package/dist/session-store.js.map +1 -0
  74. package/dist/tools/build-artifact-type.js +36 -0
  75. package/dist/tools/build-artifact-type.js.map +1 -0
  76. package/dist/tools/build-links.js +33 -0
  77. package/dist/tools/build-links.js.map +1 -0
  78. package/dist/tools/build-page.js +40 -0
  79. package/dist/tools/build-page.js.map +1 -0
  80. package/dist/tools/build-workflow.js +36 -0
  81. package/dist/tools/build-workflow.js.map +1 -0
  82. package/dist/tools/create-application.js +44 -0
  83. package/dist/tools/create-application.js.map +1 -0
  84. package/dist/tools/create-artifacts.js +33 -0
  85. package/dist/tools/create-artifacts.js.map +1 -0
  86. package/dist/tools/create-folder.js +55 -0
  87. package/dist/tools/create-folder.js.map +1 -0
  88. package/dist/tools/delete-artifacts.js +33 -0
  89. package/dist/tools/delete-artifacts.js.map +1 -0
  90. package/dist/tools/delete-entity.js +35 -0
  91. package/dist/tools/delete-entity.js.map +1 -0
  92. package/dist/tools/explain-access.js +40 -0
  93. package/dist/tools/explain-access.js.map +1 -0
  94. package/dist/tools/get-entity.js +36 -0
  95. package/dist/tools/get-entity.js.map +1 -0
  96. package/dist/tools/get-page.js +75 -0
  97. package/dist/tools/get-page.js.map +1 -0
  98. package/dist/tools/list-apps.js +22 -0
  99. package/dist/tools/list-apps.js.map +1 -0
  100. package/dist/tools/list-entities.js +43 -0
  101. package/dist/tools/list-entities.js.map +1 -0
  102. package/dist/tools/propose-page-design.js +17 -0
  103. package/dist/tools/propose-page-design.js.map +1 -0
  104. package/dist/tools/raw-api.js +132 -0
  105. package/dist/tools/raw-api.js.map +1 -0
  106. package/dist/tools/read-artifacts.js +197 -0
  107. package/dist/tools/read-artifacts.js.map +1 -0
  108. package/dist/tools/resolve-entity.js +22 -0
  109. package/dist/tools/resolve-entity.js.map +1 -0
  110. package/dist/tools/update-artifacts.js +33 -0
  111. package/dist/tools/update-artifacts.js.map +1 -0
  112. package/dist/tools/update-entity.js +41 -0
  113. package/dist/tools/update-entity.js.map +1 -0
  114. package/dist/tools/update-page.js +40 -0
  115. package/dist/tools/update-page.js.map +1 -0
  116. package/dist/write-gate.js +25 -0
  117. package/dist/write-gate.js.map +1 -0
  118. package/package.json +55 -0
@@ -0,0 +1,148 @@
1
+ import { z } from 'zod';
2
+ import { RequireApplicationId } from '../resolve.js';
3
+ import { Prune } from '../prune.js';
4
+ export const ADVERTISED_WIDGET_CODES = [
5
+ 'TEXT', 'LIST-NEW', 'LIST_MATRIX', 'MENU', 'ARTIFACT', 'SIDEBAR_MODAL', 'CHART', 'APEX_CHART',
6
+ 'PICTURE', 'CARD', 'NUMBER', 'FOLDER', 'TAG', 'FILTER', 'AUTH', 'AVR', 'CALENDAR', 'COUNTER', 'GANTT',
7
+ ];
8
+ const HideDto = z.object({ mobile: z.boolean().default(false), tablet: z.boolean().default(false), pc: z.boolean().default(false) });
9
+ const WidgetInput = z.object({ code: z.string(), value: z.record(z.string(), z.unknown()) });
10
+ export const LIST_NEW_MODEL_DEFAULTS = {
11
+ listUiType: 'STANDARD',
12
+ listType: 'Artifacts',
13
+ state: { filters: {}, columnOrder: [] },
14
+ selected: { columns: [], applications: [], artifactTypes: [], linkTypes: [], linkFiltersNew: {}, folderFilter: {}, dateFilters: {}, userFilters: {} },
15
+ settings: {
16
+ loadMode: 'byArtifactType', folderPath: '', folderId: '', background: {}, showTable: true, showCount: false,
17
+ showLinkButtons: false, sticky: true, caption: null, summary: null, emptyMessage: 'No records found',
18
+ useDoubleClick: false, dragHandle: false, allowSelect: true, multiselect: false, rowSelector: false,
19
+ showNumberOfSelected: false, activateClickOnLoad: false, activateClickOnPagination: true, onActivateClick: 'first',
20
+ editableRow: true, openArtifactCurrentTab: false, rowsPerPage: 20, scrollHeight: '', columnResizeMode: 'fit',
21
+ actions: [], responsive: 'rebuild', size: 'sm', textWrap: 'nowrap', showLineBreaks: false, rowsStriped: false,
22
+ customColors: false, showAddButton: false, showExportButton: false,
23
+ exportFileName: 'export.xls', addButtonLabel: 'Add', doFilterOnUrlChange: false,
24
+ doSortOnUrlChange: false, emitFolderUrl: false, groupingOptions: [], groupMetaData: null,
25
+ grouping: {
26
+ groupingAttributes: [], pagination: 'perTable', groupCollapse: 'expandAll', showEmptyGroups: false,
27
+ sortSettings: { sortAttribute: 'sortOrder', sortType: 1, order: 'orderFirst' },
28
+ groupByDate: { filter: 'currentMonth', customSettings: { offsetInDays: 0, isDateTime: false } },
29
+ },
30
+ filtersForQueryParams: [], refreshOnCustomEvent: false, refreshEventName: '', columnSettings: {},
31
+ cellPaddings: { paddingBottom: '0.1rem', paddingLeft: '0.1rem', paddingRight: '0.1rem', paddingTop: '0.1rem' },
32
+ urlKeys: { listeningKeys: {}, emittingKeys: {} },
33
+ urlToNavigate: '/page',
34
+ },
35
+ };
36
+ function IsPlainObject(v) {
37
+ return typeof v === 'object' && v !== null && !Array.isArray(v);
38
+ }
39
+ export function DeepMergeDefaults(defaults, value) {
40
+ const out = { ...defaults };
41
+ for (const [k, v] of Object.entries(value)) {
42
+ out[k] = IsPlainObject(v) && IsPlainObject(out[k]) ? DeepMergeDefaults(out[k], v) : v;
43
+ }
44
+ return out;
45
+ }
46
+ function WidgetValueWithDefaults(code, value) {
47
+ if (code !== 'LIST-NEW')
48
+ return value;
49
+ const defaults = structuredClone(LIST_NEW_MODEL_DEFAULTS);
50
+ const model = DeepMergeDefaults(defaults, IsPlainObject(value.model) ? value.model : {});
51
+ if (!IsPlainObject(model.selected))
52
+ model.selected = structuredClone(LIST_NEW_MODEL_DEFAULTS.selected);
53
+ if (!IsPlainObject(model.state))
54
+ model.state = structuredClone(LIST_NEW_MODEL_DEFAULTS.state);
55
+ if (!IsPlainObject(model.settings))
56
+ model.settings = structuredClone(LIST_NEW_MODEL_DEFAULTS.settings);
57
+ const selected = model.selected;
58
+ const keys = (Array.isArray(selected.columns) ? selected.columns : []).map(c => c?.key).filter((k) => typeof k === 'string');
59
+ const state = model.state;
60
+ if (!Array.isArray(state.columnOrder))
61
+ state.columnOrder = [];
62
+ if (!state.columnOrder.length)
63
+ state.columnOrder = keys;
64
+ const settings = model.settings;
65
+ if (!IsPlainObject(settings.columnSettings))
66
+ settings.columnSettings = {};
67
+ for (const key of keys) {
68
+ if (!settings.columnSettings[key])
69
+ settings.columnSettings[key] = { actions: [] };
70
+ }
71
+ return { ...value, model };
72
+ }
73
+ const PartInput = z.object({ styles: z.record(z.string(), z.unknown()).optional(), htmlId: z.string().optional(), widget: WidgetInput });
74
+ const BlockInput = z.object({ parts: z.array(PartInput).min(1) });
75
+ const RowInput = z.object({
76
+ layout: z.array(z.string()).min(1),
77
+ styles: z.record(z.string(), z.unknown()).optional(),
78
+ htmlId: z.string().optional(),
79
+ rowHide: HideDto.optional(),
80
+ blocks: z.array(BlockInput).min(1),
81
+ });
82
+ export const SectionInput = z.object({
83
+ styles: z.record(z.string(), z.unknown()).optional(),
84
+ htmlId: z.string().optional(),
85
+ sectionHide: HideDto.optional(),
86
+ alwaysVisible: z.boolean().optional(),
87
+ reactOnUrlParams: z.boolean().optional(),
88
+ showIfNoKeyInUrl: z.boolean().optional(),
89
+ rows: z.array(RowInput).min(1),
90
+ });
91
+ export const BuildPageInput = z.object({
92
+ applicationId: z.string().optional(),
93
+ applicationName: z.string().optional(),
94
+ name: z.string().min(1),
95
+ alias: z.string().optional(),
96
+ isPublic: z.boolean().optional(),
97
+ pageParameters: z.string().optional(),
98
+ settings: z.record(z.string(), z.unknown()).optional(),
99
+ sections: z.array(SectionInput).min(1),
100
+ dryRun: z.boolean().default(false),
101
+ confirm: z.string().optional().describe('Confirmation token from the previous preview of this exact plan; required to execute when confirmation mode is on'),
102
+ });
103
+ export async function BuildPagePlan(api, raw) {
104
+ const input = BuildPageInput.parse(raw);
105
+ const applicationId = await RequireApplicationId(api, input);
106
+ const existing = (await api.list('page', { applicationId: { $oid: applicationId }, name: input.name }))[0];
107
+ if (existing)
108
+ return { applicationId, reuse: { id: existing.id, name: existing.name }, widgets: [], pageBody: {} };
109
+ const widgets = [];
110
+ const sections = MapSections(input.sections, widgets);
111
+ const pageBody = Prune({
112
+ applicationId,
113
+ name: input.name,
114
+ alias: input.alias,
115
+ isPublic: input.isPublic,
116
+ pageParameters: input.pageParameters,
117
+ settings: input.settings,
118
+ sections,
119
+ });
120
+ return { applicationId, widgets, pageBody };
121
+ }
122
+ export function MapSections(sections, widgets) {
123
+ return sections.map((s) => Prune({
124
+ templateId: null,
125
+ styles: s.styles,
126
+ htmlId: s.htmlId,
127
+ sectionHide: s.sectionHide,
128
+ alwaysVisible: s.alwaysVisible,
129
+ reactOnUrlParams: s.reactOnUrlParams,
130
+ showIfNoKeyInUrl: s.showIfNoKeyInUrl,
131
+ rows: s.rows.map((r) => Prune({
132
+ templateId: null,
133
+ layout: r.layout,
134
+ styles: r.styles,
135
+ htmlId: r.htmlId,
136
+ rowHide: r.rowHide,
137
+ blocks: r.blocks.map((b) => ({
138
+ templateId: null,
139
+ parts: b.parts.map((p) => {
140
+ const index = widgets.length;
141
+ widgets.push({ code: p.widget.code, value: WidgetValueWithDefaults(p.widget.code, p.widget.value) });
142
+ return Prune({ templateId: null, styles: p.styles, htmlId: p.htmlId, widget: { templateId: null, widgetId: { $widgetIndex: index } } });
143
+ }),
144
+ })),
145
+ })),
146
+ }));
147
+ }
148
+ //# sourceMappingURL=page-plan.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"page-plan.js","sourceRoot":"","sources":["../../src/builders/page-plan.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ import { HttpErrorDetail } from '../http-client.js';
2
+ export async function ExecuteRecordsPlan(api, plan) {
3
+ const created = [];
4
+ const baseSequence = Date.now();
5
+ for (const [index, create] of plan.creates.entries()) {
6
+ try {
7
+ const attributes = plan.autoSequenceAttributeId && !create.attributes[plan.autoSequenceAttributeId]
8
+ ? { ...create.attributes, [plan.autoSequenceAttributeId]: { value: String(baseSequence + index) } }
9
+ : create.attributes;
10
+ const artifact = await api.createArtifact({
11
+ artifactTypeId: plan.artifactTypeId,
12
+ parentFolderId: null,
13
+ attributes,
14
+ });
15
+ created.push({ id: artifact.id, name: create.name });
16
+ }
17
+ catch (e) {
18
+ const done = created.length ? `; already created (not rolled back): ${created.map(c => `${c.name} (${c.id})`).join(', ')}` : '';
19
+ throw new Error(`create_elwis_artifacts failed on "${create.name}": ${e.message}${HttpErrorDetail(e)}${done}`, { cause: e });
20
+ }
21
+ }
22
+ return { artifactType: { id: plan.artifactTypeId, name: plan.artifactTypeName }, created };
23
+ }
24
+ //# sourceMappingURL=records-execute.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"records-execute.js","sourceRoot":"","sources":["../../src/builders/records-execute.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAOpD,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,GAAa,EAAE,IAAiB;IACvE,MAAM,OAAO,GAAwC,EAAE,CAAC;IACxD,MAAM,YAAY,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAChC,KAAK,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,IAAI,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC;QACrD,IAAI,CAAC;YACH,MAAM,UAAU,GAAG,IAAI,CAAC,uBAAuB,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,uBAAuB,CAAC;gBACjG,CAAC,CAAC,EAAE,GAAG,MAAM,CAAC,UAAU,EAAE,CAAC,IAAI,CAAC,uBAAuB,CAAC,EAAE,EAAE,KAAK,EAAE,MAAM,CAAC,YAAY,GAAG,KAAK,CAAC,EAAE,EAAE;gBACnG,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC;YACtB,MAAM,QAAQ,GAAG,MAAM,GAAG,CAAC,cAAc,CAAiB;gBACxD,cAAc,EAAE,IAAI,CAAC,cAAc;gBACnC,cAAc,EAAE,IAAI;gBACpB,UAAU;aACX,CAAC,CAAC;YACH,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,QAAQ,CAAC,EAAE,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;QACvD,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,MAAM,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,wCAAwC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAChI,MAAM,IAAI,KAAK,CAAC,qCAAqC,MAAM,CAAC,IAAI,MAAO,CAAW,CAAC,OAAO,GAAG,eAAe,CAAC,CAAC,CAAC,GAAG,IAAI,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC;QAC1I,CAAC;IACH,CAAC;IACD,OAAO,EAAE,YAAY,EAAE,EAAE,EAAE,EAAE,IAAI,CAAC,cAAc,EAAE,IAAI,EAAE,IAAI,CAAC,gBAAgB,EAAE,EAAE,OAAO,EAAE,CAAC;AAC7F,CAAC"}
@@ -0,0 +1,30 @@
1
+ import { HttpErrorDetail } from '../http-client.js';
2
+ export async function ExecuteUpdatePlan(api, plan) {
3
+ const updated = [];
4
+ for (const change of plan.changes) {
5
+ try {
6
+ await api.updateArtifact({ id: change.id, attributes: change.attributes });
7
+ updated.push({ id: change.id, name: change.name, artifactType: change.artifactType, changedAttributes: change.changedAttributes });
8
+ }
9
+ catch (e) {
10
+ const done = updated.length ? `; already updated: ${updated.map(u => u.name).join(', ')}` : '';
11
+ throw new Error(`update_elwis_artifacts failed on "${change.name}": ${e.message}${HttpErrorDetail(e)}${done}`, { cause: e });
12
+ }
13
+ }
14
+ return { updated };
15
+ }
16
+ export async function ExecuteDeletePlan(api, plan) {
17
+ const deleted = [];
18
+ for (const target of plan.deletes) {
19
+ try {
20
+ await api.softDeleteArtifact(target.id);
21
+ deleted.push({ id: target.id, name: target.name });
22
+ }
23
+ catch (e) {
24
+ const done = deleted.length ? `; already deleted: ${deleted.map(d => d.name).join(', ')}` : '';
25
+ throw new Error(`delete_elwis_artifacts failed on "${target.name}": ${e.message}${HttpErrorDetail(e)}${done}`, { cause: e });
26
+ }
27
+ }
28
+ return { deleted };
29
+ }
30
+ //# sourceMappingURL=records-lifecycle-execute.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"records-lifecycle-execute.js","sourceRoot":"","sources":["../../src/builders/records-lifecycle-execute.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAUpD,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,GAAa,EAAE,IAAgB;IACrE,MAAM,OAAO,GAA4B,EAAE,CAAC;IAC5C,KAAK,MAAM,MAAM,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;QAClC,IAAI,CAAC;YACH,MAAM,GAAG,CAAC,cAAc,CAAC,EAAE,EAAE,EAAE,MAAM,CAAC,EAAE,EAAE,UAAU,EAAE,MAAM,CAAC,UAAU,EAAE,CAAC,CAAC;YAC3E,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,MAAM,CAAC,EAAE,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,YAAY,EAAE,MAAM,CAAC,YAAY,EAAE,iBAAiB,EAAE,MAAM,CAAC,iBAAiB,EAAE,CAAC,CAAC;QACrI,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,MAAM,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,sBAAsB,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC/F,MAAM,IAAI,KAAK,CAAC,qCAAqC,MAAM,CAAC,IAAI,MAAO,CAAW,CAAC,OAAO,GAAG,eAAe,CAAC,CAAC,CAAC,GAAG,IAAI,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC;QAC1I,CAAC;IACH,CAAC;IACD,OAAO,EAAE,OAAO,EAAE,CAAC;AACrB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,GAAa,EAAE,IAAgB;IACrE,MAAM,OAAO,GAA4B,EAAE,CAAC;IAC5C,KAAK,MAAM,MAAM,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;QAClC,IAAI,CAAC;YACH,MAAM,GAAG,CAAC,kBAAkB,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;YACxC,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,MAAM,CAAC,EAAE,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;QACrD,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,MAAM,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,sBAAsB,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC/F,MAAM,IAAI,KAAK,CAAC,qCAAqC,MAAM,CAAC,IAAI,MAAO,CAAW,CAAC,OAAO,GAAG,eAAe,CAAC,CAAC,CAAC,GAAG,IAAI,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC;QAC1I,CAAC;IACH,CAAC;IACD,OAAO,EAAE,OAAO,EAAE,CAAC;AACrB,CAAC"}
@@ -0,0 +1,199 @@
1
+ import { z } from 'zod';
2
+ import { AmbiguityError, IsObjectId, ResolveOneId } from '../resolve.js';
3
+ import { ElwisHttpError } from '../http-client.js';
4
+ import { LoadAttributeMap, ResolveUnknownAttributeNames } from '../artifact-read.js';
5
+ const ValuePrimitive = z.union([z.string(), z.number(), z.boolean()]);
6
+ const RecordRef = z.string().min(1).describe('Record name or 24-char hex artifact id');
7
+ const TYPE_SCOPE_DESCRIBE = 'Artifact type name or id; scopes record-name resolution and is required only when names are ambiguous across types (one artifactType scope per call; split mixed-type batches)';
8
+ const DRY_RUN_DESCRIBE = 'Preview the resolved records and changes without writing anything';
9
+ export const UpdateArtifactsInput = z.object({
10
+ applicationId: z.string().optional(),
11
+ applicationName: z.string().optional(),
12
+ artifactType: z.string().optional().describe(TYPE_SCOPE_DESCRIBE),
13
+ updates: z
14
+ .array(z.object({
15
+ record: RecordRef,
16
+ values: z
17
+ .record(z.string(), z.union([ValuePrimitive, z.array(ValuePrimitive)]))
18
+ .optional()
19
+ .describe('Attribute values to change, keyed by attribute name or id; attributes not listed keep their current value'),
20
+ rename: z.string().min(1).optional().describe('Preferred way to change the record\'s name; do not also pass Name in values'),
21
+ }))
22
+ .min(1)
23
+ .max(50),
24
+ dryRun: z.boolean().default(false).describe(DRY_RUN_DESCRIBE),
25
+ confirm: z.string().optional().describe('Confirmation token from the previous preview of this exact plan; required to execute when confirmation mode is on'),
26
+ });
27
+ export const DeleteArtifactsInput = z.object({
28
+ applicationId: z.string().optional(),
29
+ applicationName: z.string().optional(),
30
+ artifactType: z.string().optional().describe(TYPE_SCOPE_DESCRIBE),
31
+ records: z.array(RecordRef).min(1).max(50),
32
+ dryRun: z.boolean().default(false).describe(`${DRY_RUN_DESCRIBE}, always run this first`),
33
+ confirm: z.string().optional().describe('Confirmation token from the previous preview of this exact plan; required to execute when confirmation mode is on'),
34
+ });
35
+ function Coerce(value) {
36
+ return Array.isArray(value) ? value.map(String) : String(value);
37
+ }
38
+ class LifecycleContext {
39
+ api;
40
+ applicationId;
41
+ types = new Map();
42
+ appNames = new Map();
43
+ appTypeIds = null;
44
+ typeScope = null;
45
+ nameAttributeId = '';
46
+ constructor(api, applicationId) {
47
+ this.api = api;
48
+ this.applicationId = applicationId;
49
+ }
50
+ async init(artifactType) {
51
+ this.nameAttributeId = (await this.api.systemAttributes()).nameAttributeId;
52
+ if (artifactType) {
53
+ this.typeScope = await this.type(await ResolveOneId(this.api, 'artifact-type', this.applicationId, artifactType));
54
+ }
55
+ else {
56
+ const rows = await this.api.list('artifact-type', { applicationId: { $oid: this.applicationId } }, 501);
57
+ if (rows.length > 500)
58
+ throw new Error('The application has more than 500 artifact types; pass an explicit artifactType');
59
+ for (const row of rows)
60
+ this.types.set(row.id, { id: row.id, name: row.name, applicationId: this.applicationId, attributes: row.attributes ?? {} });
61
+ this.appTypeIds = rows.map(r => r.id);
62
+ }
63
+ }
64
+ async type(id) {
65
+ const hit = this.types.get(id);
66
+ if (hit)
67
+ return hit;
68
+ let doc;
69
+ try {
70
+ doc = await this.api.getOne('artifact-type', id);
71
+ }
72
+ catch (e) {
73
+ if (e instanceof ElwisHttpError && e.status === 404)
74
+ throw new Error(`The record references artifact type ${id} which no longer exists`, { cause: e });
75
+ throw e;
76
+ }
77
+ const resolved = { id, name: doc.name, applicationId: doc.applicationId ? String(doc.applicationId) : null, attributes: doc.attributes ?? {} };
78
+ this.types.set(id, resolved);
79
+ return resolved;
80
+ }
81
+ async applicationName(id) {
82
+ const hit = this.appNames.get(id);
83
+ if (hit)
84
+ return hit;
85
+ const name = await this.api.getOne('application', id).then(a => a.name).catch(() => id);
86
+ this.appNames.set(id, name);
87
+ return name;
88
+ }
89
+ async assertInApplication(type, ref) {
90
+ if (type.applicationId === this.applicationId)
91
+ return;
92
+ const owner = type.applicationId ? await this.applicationName(type.applicationId) : 'an unknown application';
93
+ const current = await this.applicationName(this.applicationId);
94
+ throw new Error(`Record "${ref}" belongs to application "${owner}", not "${current}"; call again with applicationName "${owner}"`);
95
+ }
96
+ async resolveRecord(ref) {
97
+ if (IsObjectId(ref)) {
98
+ const artifact = await this.api.getOne('artifact', ref);
99
+ await this.assertInApplication(await this.type(String(artifact.artifactTypeId)), ref);
100
+ return artifact;
101
+ }
102
+ const filter = { [`attributes.${this.nameAttributeId}.value`]: ref };
103
+ if (this.typeScope)
104
+ filter.artifactTypeId = { $oid: this.typeScope.id };
105
+ else
106
+ filter.artifactTypeId = { $in: (this.appTypeIds ?? []).map(id => ({ $oid: id })) };
107
+ const page = await this.api.listRecords('artifact', filter, { limit: 6 });
108
+ if (page.data.length === 1)
109
+ return page.data[0];
110
+ const scopeSuffix = this.typeScope ? ` of type "${this.typeScope.name}"` : '';
111
+ if (page.data.length === 0)
112
+ throw new Error(`No record named "${ref}"${scopeSuffix} in this application`);
113
+ const candidates = await Promise.all(page.data.map(async (a) => ({
114
+ id: String(a.id),
115
+ name: `${ref} (${(await this.type(String(a.artifactTypeId))).name})`,
116
+ })));
117
+ const truncated = page.data.length === 6 ? ' (list may be truncated)' : '';
118
+ throw new AmbiguityError(`Multiple records named "${ref}"${scopeSuffix}; narrow with artifactType or pass an explicit id${truncated}`, candidates);
119
+ }
120
+ }
121
+ async function ResolveTargets(api, applicationId, artifactType, refs) {
122
+ const ctx = new LifecycleContext(api, applicationId);
123
+ await ctx.init(artifactType);
124
+ const targets = [];
125
+ const seen = new Map();
126
+ for (const ref of refs) {
127
+ const artifact = await ctx.resolveRecord(ref);
128
+ const type = await ctx.type(String(artifact.artifactTypeId));
129
+ await ctx.assertInApplication(type, ref);
130
+ const prior = seen.get(String(artifact.id));
131
+ if (prior !== undefined)
132
+ throw new Error(`"${ref}" and "${prior}" resolve to the same record; list each record once`);
133
+ seen.set(String(artifact.id), ref);
134
+ targets.push({ artifact, type, ref });
135
+ }
136
+ return { ctx, targets };
137
+ }
138
+ export async function BuildUpdatePlan(api, raw, applicationId) {
139
+ const input = UpdateArtifactsInput.parse(raw);
140
+ const { ctx, targets } = await ResolveTargets(api, applicationId, input.artifactType, input.updates.map(u => u.record));
141
+ const map = await LoadAttributeMap(api, applicationId);
142
+ const changes = [];
143
+ for (let i = 0; i < input.updates.length; i++) {
144
+ const update = input.updates[i];
145
+ const { artifact, type } = targets[i];
146
+ const attributeIds = Object.keys(type.attributes);
147
+ await ResolveUnknownAttributeNames(api, map, attributeIds);
148
+ const byLowerName = new Map();
149
+ for (const id of attributeIds) {
150
+ const key = (map.byId.get(id) ?? id).toLowerCase();
151
+ byLowerName.set(key, [...(byLowerName.get(key) ?? []), id]);
152
+ }
153
+ const attributes = {};
154
+ for (const [key, value] of Object.entries(update.values ?? {})) {
155
+ let id;
156
+ if (IsObjectId(key)) {
157
+ if (!attributeIds.includes(key))
158
+ throw new Error(`Attribute id "${key}" is not assigned to artifact type "${type.name}"`);
159
+ id = key;
160
+ }
161
+ else {
162
+ const ids = byLowerName.get(key.toLowerCase()) ?? [];
163
+ if (ids.length === 0)
164
+ throw new Error(`Attribute "${key}" is not assigned to artifact type "${type.name}"; assignable attributes: ${attributeIds.map(a => map.byId.get(a) ?? a).join(', ')}`);
165
+ if (ids.length > 1)
166
+ throw new Error(`Multiple attributes named "${key}" on artifact type "${type.name}"; pass an explicit id: ${ids.map(a => `${map.byId.get(a) ?? a} (${a})`).join(', ')}`);
167
+ id = ids[0];
168
+ }
169
+ attributes[id] = { value: Coerce(value) };
170
+ }
171
+ if (update.rename) {
172
+ if (attributes[ctx.nameAttributeId] !== undefined)
173
+ throw new Error(`Update for "${update.record}" passes both rename and a Name value; use one of them`);
174
+ attributes[ctx.nameAttributeId] = { value: update.rename };
175
+ }
176
+ if (Object.keys(attributes).length === 0)
177
+ throw new Error(`Update for "${update.record}" contains no changes; provide at least one attribute value or a new name`);
178
+ changes.push({
179
+ id: String(artifact.id),
180
+ name: artifact.attributes?.[ctx.nameAttributeId]?.value ?? update.record,
181
+ artifactType: type.name,
182
+ attributes,
183
+ changedAttributes: Object.keys(attributes).map(id => map.byId.get(id) ?? id),
184
+ });
185
+ }
186
+ return { changes };
187
+ }
188
+ export async function BuildDeletePlan(api, raw, applicationId) {
189
+ const input = DeleteArtifactsInput.parse(raw);
190
+ const { ctx, targets } = await ResolveTargets(api, applicationId, input.artifactType, input.records);
191
+ return {
192
+ deletes: targets.map(({ artifact, type, ref }) => ({
193
+ id: String(artifact.id),
194
+ name: artifact.attributes?.[ctx.nameAttributeId]?.value ?? ref,
195
+ artifactType: type.name,
196
+ })),
197
+ };
198
+ }
199
+ //# sourceMappingURL=records-lifecycle-plan.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"records-lifecycle-plan.js","sourceRoot":"","sources":["../../src/builders/records-lifecycle-plan.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,74 @@
1
+ import { z } from 'zod';
2
+ import { IsObjectId, ResolveOneId } from '../resolve.js';
3
+ import { LoadAttributeMap, ResolveUnknownAttributeNames } from '../artifact-read.js';
4
+ const ValuePrimitive = z.union([z.string(), z.number(), z.boolean()]);
5
+ export const CreateArtifactsInput = z.object({
6
+ applicationId: z.string().optional(),
7
+ applicationName: z.string().optional(),
8
+ artifactType: z.string().min(1).describe('Artifact type name or 24-char hex id'),
9
+ records: z
10
+ .array(z.object({
11
+ name: z.string().min(1).describe('Record name (fills the system Name attribute)'),
12
+ values: z
13
+ .record(z.string(), z.union([ValuePrimitive, z.array(ValuePrimitive)]))
14
+ .optional()
15
+ .describe('Attribute values keyed by attribute name or id; unspecified attributes default to an empty string'),
16
+ }))
17
+ .min(1)
18
+ .max(50),
19
+ dryRun: z.boolean().default(false),
20
+ confirm: z.string().optional().describe('Confirmation token from the previous preview of this exact plan; required to execute when confirmation mode is on'),
21
+ });
22
+ function Coerce(value) {
23
+ return Array.isArray(value) ? value.map(String) : String(value);
24
+ }
25
+ export async function BuildRecordsPlan(api, raw, applicationId) {
26
+ const input = CreateArtifactsInput.parse(raw);
27
+ const artifactTypeId = await ResolveOneId(api, 'artifact-type', applicationId, input.artifactType);
28
+ const type = await api.getOne('artifact-type', artifactTypeId);
29
+ const attributeIds = Object.keys(type.attributes ?? {});
30
+ if (attributeIds.length === 0)
31
+ throw new Error(`Artifact type "${type.name}" has no attributes assigned`);
32
+ const map = await LoadAttributeMap(api, applicationId);
33
+ await ResolveUnknownAttributeNames(api, map, attributeIds);
34
+ const sys = await api.systemAttributes();
35
+ const byLowerName = new Map();
36
+ for (const id of attributeIds) {
37
+ const key = (map.byId.get(id) ?? id).toLowerCase();
38
+ byLowerName.set(key, [...(byLowerName.get(key) ?? []), id]);
39
+ }
40
+ const assignable = attributeIds.map(id => ({ id, name: map.byId.get(id) ?? id }));
41
+ const resolveKey = (key) => {
42
+ if (IsObjectId(key)) {
43
+ if (!attributeIds.includes(key))
44
+ throw new Error(`Attribute id "${key}" is not assigned to artifact type "${type.name}"`);
45
+ return key;
46
+ }
47
+ const ids = byLowerName.get(key.toLowerCase()) ?? [];
48
+ if (ids.length === 1)
49
+ return ids[0];
50
+ if (ids.length === 0)
51
+ throw new Error(`Attribute "${key}" is not assigned to artifact type "${type.name}"; assignable attributes: ${assignable.map(a => a.name).join(', ')}`);
52
+ throw new Error(`Multiple attributes named "${key}" on artifact type "${type.name}"; pass an explicit id`);
53
+ };
54
+ let autoSequenceAttributeId;
55
+ const creates = input.records.map((record) => {
56
+ const provided = new Map();
57
+ for (const [key, value] of Object.entries(record.values ?? {}))
58
+ provided.set(resolveKey(key), Coerce(value));
59
+ const attributes = {};
60
+ for (const id of attributeIds) {
61
+ if (id === sys.nameAttributeId)
62
+ attributes[id] = { value: record.name };
63
+ else if (provided.has(id))
64
+ attributes[id] = { value: provided.get(id) };
65
+ else if (id === sys.sequenceAttributeId)
66
+ autoSequenceAttributeId = id;
67
+ else
68
+ attributes[id] = { value: '' };
69
+ }
70
+ return { name: record.name, attributes };
71
+ });
72
+ return { artifactTypeId, artifactTypeName: type.name, attributes: assignable, creates, autoSequenceAttributeId };
73
+ }
74
+ //# sourceMappingURL=records-plan.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"records-plan.js","sourceRoot":"","sources":["../../src/builders/records-plan.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,38 @@
1
+ import { ResolveWidgetIndices } from './page-execute.js';
2
+ import { HttpErrorDetail } from '../http-client.js';
3
+ import { Prune } from '../prune.js';
4
+ export async function ExecuteUpdatePagePlan(api, plan) {
5
+ const createdWidgets = [];
6
+ const ids = [];
7
+ let pageUpdated = false;
8
+ try {
9
+ for (const w of plan.newWidgets) {
10
+ const res = await api.create('widget', { code: w.code, value: w.value });
11
+ ids.push(res.id);
12
+ createdWidgets.push({ id: res.id, code: w.code });
13
+ }
14
+ const sections = ResolveWidgetIndices(plan.sections, ids);
15
+ const body = Prune({ id: plan.page.id, sections, name: plan.meta.rename, alias: plan.meta.alias, isPublic: plan.meta.isPublic });
16
+ const page = await api.update('page', body);
17
+ pageUpdated = true;
18
+ const updatedWidgets = [];
19
+ for (const edit of plan.widgetTexts) {
20
+ try {
21
+ await api.update('widget', { id: edit.widgetId, code: edit.code, value: edit.value });
22
+ updatedWidgets.push(edit.widgetId);
23
+ }
24
+ catch (e) {
25
+ const done = updatedWidgets.length ? `; widget contents already updated: ${updatedWidgets.join(', ')}` : '';
26
+ throw new Error(`the page layout was updated but replacing widget ${edit.widgetId} content failed: ${e.message}${HttpErrorDetail(e)}${done}; do not re-run the layout changes`, { cause: e });
27
+ }
28
+ }
29
+ return { page: { id: page.id, name: page.name }, createdWidgets, updatedWidgets, applied: plan.summary };
30
+ }
31
+ catch (e) {
32
+ const orphans = !pageUpdated && ids.length
33
+ ? ` Newly created widgets are unowned and left for the backend's scheduled orphan cleanup: ${ids.join(', ')}.`
34
+ : '';
35
+ throw new Error(`update_elwis_page failed: ${e.message}${HttpErrorDetail(e)}.${orphans}`, { cause: e });
36
+ }
37
+ }
38
+ //# sourceMappingURL=update-page-execute.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"update-page-execute.js","sourceRoot":"","sources":["../../src/builders/update-page-execute.ts"],"names":[],"mappings":"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"}