@saltcorn/copilot 0.7.5 → 0.8.1

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.
@@ -0,0 +1,209 @@
1
+ const Field = require("@saltcorn/data/models/field");
2
+ const Table = require("@saltcorn/data/models/table");
3
+ const Form = require("@saltcorn/data/models/form");
4
+ const MetaData = require("@saltcorn/data/models/metadata");
5
+ const View = require("@saltcorn/data/models/view");
6
+ const Trigger = require("@saltcorn/data/models/trigger");
7
+ const { findType } = require("@saltcorn/data/models/discovery");
8
+ const { save_menu_items } = require("@saltcorn/data/models/config");
9
+ const db = require("@saltcorn/data/db");
10
+ const WorkflowRun = require("@saltcorn/data/models/workflow_run");
11
+ const {
12
+ localeDateTime,
13
+ renderForm,
14
+ mkTable,
15
+ post_delete_btn,
16
+ } = require("@saltcorn/markup");
17
+ const {
18
+ div,
19
+ script,
20
+ domReady,
21
+ pre,
22
+ code,
23
+ input,
24
+ h4,
25
+ style,
26
+ h5,
27
+ button,
28
+ text_attr,
29
+ i,
30
+ p,
31
+ span,
32
+ small,
33
+ form,
34
+ textarea,
35
+ } = require("@saltcorn/markup/tags");
36
+ const { getState } = require("@saltcorn/data/db/state");
37
+ const renderLayout = require("@saltcorn/markup/layout");
38
+ const { viewname } = require("./common");
39
+ const { requirementsList, req_routes } = require("./requirements");
40
+ const { showSchema, schema_routes } = require("./schema");
41
+ const { makeTaskList, task_routes } = require("./tasks");
42
+ const { errorList, error_routes } = require("./errors");
43
+ const { feedbackList, feedback_routes } = require("./feedback");
44
+ const { progressList, progress_routes } = require("./progress");
45
+ const { runNextTask } = require("./run_task");
46
+ const { makeTaskChart } = require("./taskchart");
47
+
48
+ const get_state_fields = () => [];
49
+
50
+ const sys_prompt = ``;
51
+
52
+ const makeSpecForm = async (req) => {
53
+ const spec = await MetaData.findOne({
54
+ type: "CopilotConstructMgr",
55
+ name: "spec",
56
+ });
57
+
58
+ return new Form({
59
+ blurb: "Provide a high-level description of the application",
60
+ fields: [
61
+ {
62
+ name: "description",
63
+ label: "Description",
64
+ type: "String",
65
+ fieldview: "textarea",
66
+ },
67
+ {
68
+ name: "audience",
69
+ label: "Audience",
70
+ type: "String",
71
+ fieldview: "textarea",
72
+ },
73
+ {
74
+ name: "core_features",
75
+ label: "Core features",
76
+ type: "String",
77
+ fieldview: "textarea",
78
+ },
79
+ {
80
+ name: "out_of_scope",
81
+ label: "Out of scope",
82
+ type: "String",
83
+ fieldview: "textarea",
84
+ },
85
+ {
86
+ name: "visual_style",
87
+ label: "Visual style",
88
+ type: "String",
89
+ fieldview: "textarea",
90
+ },
91
+ ],
92
+ xhrSubmit: true,
93
+ action: `/view/${encodeURIComponent(viewname)}/submit_specs`,
94
+ values: spec?.body || {},
95
+ });
96
+ };
97
+
98
+ const run = async (table_id, viewname, cfg, state, { req, res }) => {
99
+ const specForm = await makeSpecForm(req);
100
+ const reqList = await requirementsList(req);
101
+ const taskList = await makeTaskList(req);
102
+ const errList = await errorList(req);
103
+ const feedbacks = await feedbackList(req);
104
+ const progress = await progressList(req);
105
+ const taskChart = await makeTaskChart(req);
106
+ const schema = await showSchema(req);
107
+ const layout = {
108
+ type: "tabs",
109
+ ntabs: 5,
110
+ tabId: "",
111
+ lazyLoadViews: true,
112
+ titles: [
113
+ "Specification",
114
+ "Requirements",
115
+ "Schema",
116
+ "Tasks",
117
+ "Task chart",
118
+ "Progress",
119
+ "Feedback",
120
+ "Errors",
121
+ ],
122
+ contents: [
123
+ {
124
+ type: "blank",
125
+ contents: div({ class: "mt-2" }, renderForm(specForm, req.csrfToken())),
126
+ },
127
+ { type: "blank", contents: reqList },
128
+ { type: "blank", contents: schema },
129
+ { type: "blank", contents: taskList },
130
+ { type: "blank", contents: taskChart },
131
+ { type: "blank", contents: progress },
132
+ { type: "blank", contents: feedbacks },
133
+ { type: "blank", contents: errList },
134
+ ],
135
+ deeplink: true,
136
+ tabsStyle: "Tabs",
137
+ };
138
+ return renderLayout({
139
+ blockDispatch: {},
140
+ layout,
141
+ role: req.user?.role_id || 100,
142
+ req,
143
+ hints: getState().getLayout(req.user).hints || {},
144
+ });
145
+ };
146
+
147
+ const submit_specs = async (table_id, viewname, config, body, { req, res }) => {
148
+ const { _csrf, ...spec } = body;
149
+ const existing = await MetaData.findOne({
150
+ type: "CopilotConstructMgr",
151
+ name: "spec",
152
+ });
153
+
154
+ if (existing) await db.update("_sc_metadata", { body: spec }, existing.id);
155
+ else
156
+ await MetaData.create({
157
+ type: "CopilotConstructMgr",
158
+ name: "spec",
159
+ user_id: req.user?.id || undefined,
160
+ body: spec,
161
+ });
162
+ };
163
+
164
+ const virtual_triggers = () => {
165
+ return [
166
+ {
167
+ when_trigger: "Error",
168
+ run: async (row) => {
169
+ const existing = await MetaData.find({
170
+ type: "CopilotConstructMgr",
171
+ name: "error",
172
+ });
173
+ const messages = new Set(existing.map((m) => m.body?.error?.stack));
174
+ if (!messages.has(row.stack))
175
+ await MetaData.create({
176
+ type: "CopilotConstructMgr",
177
+ name: "error",
178
+ body: { status: "New", error: row },
179
+ user_id: null,
180
+ });
181
+ },
182
+ },
183
+ {
184
+ when_trigger: "Often",
185
+ run: async () => {
186
+ await runNextTask();
187
+ },
188
+ },
189
+ ];
190
+ };
191
+
192
+ module.exports = {
193
+ name: viewname,
194
+ display_state_form: false,
195
+ get_state_fields,
196
+ tableless: true,
197
+ singleton: true,
198
+ run,
199
+ routes: {
200
+ submit_specs,
201
+ ...req_routes,
202
+ ...task_routes,
203
+ ...error_routes,
204
+ ...feedback_routes,
205
+ ...progress_routes,
206
+ ...schema_routes,
207
+ },
208
+ virtual_triggers,
209
+ };