@soln/cli 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.
- package/README.md +551 -0
- package/package.json +21 -0
- package/soln.mjs +1104 -0
package/README.md
ADDED
|
@@ -0,0 +1,551 @@
|
|
|
1
|
+
# Soln CLI
|
|
2
|
+
|
|
3
|
+
`sl` is the command-line interface for controlling the authenticated Soln tenant.
|
|
4
|
+
|
|
5
|
+
The current release supports:
|
|
6
|
+
|
|
7
|
+
- `sl system organization profile get`
|
|
8
|
+
- `sl system organization profile update`
|
|
9
|
+
- `sl system organization structure get`
|
|
10
|
+
- `sl login`
|
|
11
|
+
- `sl whoami`
|
|
12
|
+
- `sl logout`
|
|
13
|
+
- `soln studio init page`
|
|
14
|
+
- `soln studio deploy`
|
|
15
|
+
- `soln studio publish`
|
|
16
|
+
- `soln studio pull`
|
|
17
|
+
- `soln studio status`
|
|
18
|
+
|
|
19
|
+
## Requirements
|
|
20
|
+
|
|
21
|
+
- Node.js 22 or newer
|
|
22
|
+
|
|
23
|
+
## Install
|
|
24
|
+
|
|
25
|
+
```bash
|
|
26
|
+
npm install -g @soln/cli
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
## Login
|
|
30
|
+
|
|
31
|
+
The `sl` executable uses the same existing member login and local session as the legacy `soln` alias:
|
|
32
|
+
|
|
33
|
+
```bash
|
|
34
|
+
sl login --base-url <api-url> --tenant <tenant-subdomain> --email <email>
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
Use a tenant member account and password:
|
|
38
|
+
|
|
39
|
+
```bash
|
|
40
|
+
soln login --base-url <api-url> --tenant <tenant-subdomain> --email <email>
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
`--tenant` is the tenant subdomain, not the tenant UUID.
|
|
44
|
+
|
|
45
|
+
If the password is entered incorrectly, the CLI prompts again in the same command. After 3 failed password attempts, the command exits.
|
|
46
|
+
|
|
47
|
+
Use email verification code login:
|
|
48
|
+
|
|
49
|
+
```bash
|
|
50
|
+
soln login --base-url <api-url> --tenant <tenant-subdomain> --email <email> --method email
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
If the verification code is entered incorrectly, the CLI keeps prompting in the same command so the current code can still be used until it expires or reaches the server-side attempt limit.
|
|
54
|
+
|
|
55
|
+
The CLI stores the authenticated member session in:
|
|
56
|
+
|
|
57
|
+
```txt
|
|
58
|
+
~/.soln/config.json
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
The config file is written with `0600` permissions. Passwords are never stored.
|
|
62
|
+
|
|
63
|
+
## Check Current Session
|
|
64
|
+
|
|
65
|
+
```bash
|
|
66
|
+
soln whoami
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
This command reads the local session and verifies it with the Soln API:
|
|
70
|
+
|
|
71
|
+
```txt
|
|
72
|
+
GET /auth/member/me
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
Use JSON output from scripts:
|
|
76
|
+
|
|
77
|
+
```bash
|
|
78
|
+
soln whoami --json
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
## Logout
|
|
82
|
+
|
|
83
|
+
```bash
|
|
84
|
+
soln logout
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
After the Soln API confirms logout, the local session file is removed.
|
|
88
|
+
|
|
89
|
+
## System Organization Profile
|
|
90
|
+
|
|
91
|
+
Read the organization profile for the currently authenticated tenant:
|
|
92
|
+
|
|
93
|
+
```bash
|
|
94
|
+
sl system organization profile get
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
The command obtains a Runtime identity from the existing member session, then reads the tenant-side profile. It does not accept a tenant ID, role, or arbitrary command string. The Runtime permission `system-organization.page / enter` is enforced before the profile query.
|
|
98
|
+
|
|
99
|
+
Update the profile through the same Runtime command endpoint:
|
|
100
|
+
|
|
101
|
+
```bash
|
|
102
|
+
sl system organization profile update --display-name "Acme Corporation"
|
|
103
|
+
```
|
|
104
|
+
|
|
105
|
+
Read the organization and department trees for the currently authenticated tenant:
|
|
106
|
+
|
|
107
|
+
```bash
|
|
108
|
+
sl system organization structure get
|
|
109
|
+
```
|
|
110
|
+
|
|
111
|
+
The structure command requires `system-organization-structure.page / enter` and returns
|
|
112
|
+
organization and department trees without members, extensions, or tenant identifiers.
|
|
113
|
+
|
|
114
|
+
The same namespace provides read-only organization, department, and member queries:
|
|
115
|
+
|
|
116
|
+
```bash
|
|
117
|
+
sl system organization structure organization list --keyword "North"
|
|
118
|
+
sl system organization structure organization get --organization-id <uuid>
|
|
119
|
+
sl system organization structure department list --organization-id <uuid>
|
|
120
|
+
sl system organization structure department get --department-id <uuid>
|
|
121
|
+
sl system organization structure member list --department-id <uuid> --include-descendants --page 1 --page-size 20
|
|
122
|
+
sl system organization structure member get --member-id <uuid>
|
|
123
|
+
```
|
|
124
|
+
|
|
125
|
+
The three list commands accept SDK-compatible profile-field conditions:
|
|
126
|
+
|
|
127
|
+
```bash
|
|
128
|
+
sl system organization structure member list \
|
|
129
|
+
--condition-json '{"logic":"and","children":[{"field":"so_avatar","operator":"not_empty"}]}' \
|
|
130
|
+
--page 1 --page-size 20 --json
|
|
131
|
+
```
|
|
132
|
+
|
|
133
|
+
Supported operators are `eq`, `neq`, `contains`, `not_contains`, `gt`, `gte`, `lt`, `lte`, `in`, `empty`, and `not_empty`.
|
|
134
|
+
|
|
135
|
+
Message templates use aggregate authoring definitions. Create and update accept exactly one inline JSON object or JSON file. New templates are drafts; activation and archival are explicit lifecycle commands. Built-in templates are readable but cannot be changed or deleted.
|
|
136
|
+
|
|
137
|
+
```bash
|
|
138
|
+
sl system message template list --json
|
|
139
|
+
sl system message template get --template-id <uuid> --json
|
|
140
|
+
sl system message template create --definition-file message-template.json --json
|
|
141
|
+
sl system message template update --template-id <uuid> --definition-file message-template.json --json
|
|
142
|
+
sl system message template activate --template-id <uuid> --json
|
|
143
|
+
sl system message template delete --template-id <uuid> [--force] --json
|
|
144
|
+
```
|
|
145
|
+
|
|
146
|
+
Generic form schemas and records use the following commands:
|
|
147
|
+
|
|
148
|
+
```bash
|
|
149
|
+
sl system form schema list --keyword "orders" --json
|
|
150
|
+
sl system form schema get --form-api-name orders --json
|
|
151
|
+
```
|
|
152
|
+
|
|
153
|
+
Form model and field management uses the same fixed Soln Runtime command endpoint. New models are created disabled; enable requires an enabled, visible identifier field. Disable a model before deleting it. Field configuration is passed as one JSON object so formula, option, validation, and display settings remain lossless:
|
|
154
|
+
|
|
155
|
+
```bash
|
|
156
|
+
sl system form schema create --name Orders --api-name orders --type custom --json
|
|
157
|
+
sl system form field create --form-id <uuid> \
|
|
158
|
+
--definition-json '{"name":"Order No","apiName":"so_order_no","type":"text","isIdentifier":true,"required":true}' --json
|
|
159
|
+
sl system form schema enable --form-id <uuid> --json
|
|
160
|
+
sl system form field update --field-id <uuid> \
|
|
161
|
+
--definition-json '{"name":"Order Number","required":true}' --json
|
|
162
|
+
sl system form formula catalog --json
|
|
163
|
+
sl system form formula validate --form-id <uuid> \
|
|
164
|
+
--expression 'ROUND(FIELD("so_quantity") * FIELD("so_unit_price"), 2)' \
|
|
165
|
+
--result-data-type number --json
|
|
166
|
+
sl system form formula preview --form-id <uuid> \
|
|
167
|
+
--expression 'ROUND(FIELD("so_quantity") * FIELD("so_unit_price"), 2)' \
|
|
168
|
+
--result-data-type number \
|
|
169
|
+
--values-json '{"so_quantity":3,"so_unit_price":12.345}' --json
|
|
170
|
+
sl system form schema disable --form-id <uuid> --json
|
|
171
|
+
sl system form schema delete --form-id <uuid> --json
|
|
172
|
+
```
|
|
173
|
+
|
|
174
|
+
Layout design uses five aggregate commands. Create and update definitions can be inline JSON or a JSON file. Canvas definitions are complete snapshots: omitted groups are deleted and omitted fields become hidden. A DEFAULT system layout accepts canvas updates, but its metadata, scopes, and deletion remain protected.
|
|
175
|
+
|
|
176
|
+
```bash
|
|
177
|
+
sl system form layout list --form-id <uuid> --json
|
|
178
|
+
sl system form layout get --layout-id <uuid> --json
|
|
179
|
+
sl system form layout create --form-id <uuid> --definition-file layout-create.json --json
|
|
180
|
+
sl system form layout update --layout-id <uuid> --definition-file layout-canvas.json --json
|
|
181
|
+
sl system form layout delete --layout-id <uuid> --json
|
|
182
|
+
```
|
|
183
|
+
|
|
184
|
+
Page-event bindings are stored on a custom layout's form configuration. `main-init` is valid for every custom page layout; field and child-row events are restricted by the layout page type. Binding requires a published Studio script asset and the active script file path.
|
|
185
|
+
|
|
186
|
+
```bash
|
|
187
|
+
sl system form layout page-event get --asset-id <uuid> --form-id <uuid> --layout-id <uuid> --json
|
|
188
|
+
sl system form layout page-event bind --asset-id <uuid> --file-path src/events/customer.ts \
|
|
189
|
+
--form-id <uuid> --layout-id <uuid> --event-type main-field-change \
|
|
190
|
+
--field-mode specified --fields-json '["so_customer_id"]' --json
|
|
191
|
+
sl system form layout page-event verify --asset-id <uuid> --file-path src/events/customer.ts \
|
|
192
|
+
--form-id <uuid> --layout-id <uuid> --event-type main-field-change \
|
|
193
|
+
--field-mode specified --fields-json '["so_customer_id"]' --json
|
|
194
|
+
sl system form layout page-event unbind --asset-id <uuid> --file-path src/events/customer.ts \
|
|
195
|
+
--form-id <uuid> --layout-id <uuid> --event-type main-field-change \
|
|
196
|
+
--field-mode specified --fields-json '["so_customer_id"]' --json
|
|
197
|
+
```
|
|
198
|
+
|
|
199
|
+
按钮设计配置和运行时按钮执行是两套命令。设计更新是两个数组的完整替换,必须先读取当前配置再提交;自定义按钮可以单独创建、更新或删除。按钮脚本支持 `beforeClick`、`action`、`afterClick` 三个阶段,绑定后必须执行 `verify`。
|
|
200
|
+
|
|
201
|
+
```bash
|
|
202
|
+
sl system form button design get --form-id <uuid> --json
|
|
203
|
+
sl system form button design update --form-id <uuid> --definition-file button-design.json --json
|
|
204
|
+
sl system form button design custom create --form-id <uuid> --definition-file button.json --json
|
|
205
|
+
sl system form button design custom update --form-id <uuid> --button-id <uuid> --definition-file button-patch.json --json
|
|
206
|
+
sl system form button design custom delete --form-id <uuid> --button-id <uuid> --json
|
|
207
|
+
|
|
208
|
+
sl system form button script-binding get --asset-id <uuid> --form-id <uuid> --json
|
|
209
|
+
sl system form button script-binding bind --asset-id <uuid> --file-path src/buttons/order.ts \
|
|
210
|
+
--form-id <uuid> --button-key custom:<uuid> --phase action --json
|
|
211
|
+
sl system form button script-binding verify --asset-id <uuid> --file-path src/buttons/order.ts \
|
|
212
|
+
--form-id <uuid> --button-key custom:<uuid> --phase action --json
|
|
213
|
+
sl system form button script-binding unbind --asset-id <uuid> --file-path src/buttons/order.ts \
|
|
214
|
+
--form-id <uuid> --button-key custom:<uuid> --phase action --json
|
|
215
|
+
```
|
|
216
|
+
|
|
217
|
+
Generic form records use the same condition engine:
|
|
218
|
+
|
|
219
|
+
```bash
|
|
220
|
+
sl system form record list \
|
|
221
|
+
--form-api-name orders \
|
|
222
|
+
--condition-json '{"logic":"and","children":[{"field":"status","operator":"eq","value":"active"}]}' \
|
|
223
|
+
--sort-field-api-name createdAt --sort-direction desc \
|
|
224
|
+
--include-detail --include-total --page 1 --page-size 20 --json
|
|
225
|
+
|
|
226
|
+
sl system form record list \
|
|
227
|
+
--form-api-name orders \
|
|
228
|
+
--keywords-json '["Shanghai","priority"]' \
|
|
229
|
+
--search-field-api-name customerName \
|
|
230
|
+
--visibility-states-json '[{"dataStatus":"active","approvalStatus":"approved"}]' \
|
|
231
|
+
--include-detail --json
|
|
232
|
+
|
|
233
|
+
sl system form record get --record-id <uuid> --json
|
|
234
|
+
sl system form record cleanup --form-api-name orders --mode restore --condition-json '{"field":"status","operator":"eq","value":"canceled"}' --json
|
|
235
|
+
sl system form record cleanup --form-api-name orders --mode purge --keyword test --json
|
|
236
|
+
```
|
|
237
|
+
|
|
238
|
+
批量创建和更新使用 Runtime 的正式批量表单 API。每批必须包含 1–100 条显式记录;执行前仍需先用 `form button list` 解析当前成员可执行的 NEW 或 EDIT 按钮:
|
|
239
|
+
|
|
240
|
+
```bash
|
|
241
|
+
sl system form record batch create \
|
|
242
|
+
--form-api-name orders \
|
|
243
|
+
--button-key preset:form.submit \
|
|
244
|
+
--records-json '[{"title":"SO-1","data":{"orderNo":"SO-1"}},{"title":"SO-2","data":{"orderNo":"SO-2"}}]' \
|
|
245
|
+
--json
|
|
246
|
+
|
|
247
|
+
sl system form record batch update \
|
|
248
|
+
--form-api-name orders \
|
|
249
|
+
--button-key preset:form.save \
|
|
250
|
+
--records-json '[{"recordId":"<uuid>","data":{"status":"completed"}}]' \
|
|
251
|
+
--json
|
|
252
|
+
```
|
|
253
|
+
|
|
254
|
+
批量写入在租户数据库事务中执行,任意一条失败会回滚整个批次。按钮 `beforeClick` 在事务开始前逐条执行;事务成功后逐条执行 `afterClick`,后置脚本失败会写入返回结果但不会回滚业务数据。
|
|
255
|
+
|
|
256
|
+
查询当前成员有权使用的表单按钮:
|
|
257
|
+
|
|
258
|
+
```bash
|
|
259
|
+
sl system form button list \
|
|
260
|
+
--form-api-name orders \
|
|
261
|
+
--scope VIEW \
|
|
262
|
+
--record-id <uuid> \
|
|
263
|
+
--json
|
|
264
|
+
```
|
|
265
|
+
|
|
266
|
+
执行一个已解析的按钮。`--payload-json` 只传按钮所需的记录、草稿和业务输入,不能传租户、脚本或任意命令标识:
|
|
267
|
+
|
|
268
|
+
```bash
|
|
269
|
+
sl system form button execute \
|
|
270
|
+
--form-api-name orders \
|
|
271
|
+
--button-key preset:form.save \
|
|
272
|
+
--payload-json '{"recordId":"<uuid>","draft":{"data":{"status":"approved"}}}' \
|
|
273
|
+
--json
|
|
274
|
+
```
|
|
275
|
+
|
|
276
|
+
数据清理页的固定动作不属于表单按钮设计配置。先查询回收站记录,再解析并执行对应动作:
|
|
277
|
+
|
|
278
|
+
```bash
|
|
279
|
+
sl system form record list \
|
|
280
|
+
--form-api-name orders \
|
|
281
|
+
--data-status trashed \
|
|
282
|
+
--include-detail --json
|
|
283
|
+
|
|
284
|
+
sl system form button list \
|
|
285
|
+
--form-api-name orders \
|
|
286
|
+
--scope VIEW \
|
|
287
|
+
--record-id <uuid> \
|
|
288
|
+
--json
|
|
289
|
+
|
|
290
|
+
sl system form button execute \
|
|
291
|
+
--form-api-name orders \
|
|
292
|
+
--button-key preset:dataCleanup.restore \
|
|
293
|
+
--payload-json '{"recordId":"<uuid>"}' \
|
|
294
|
+
--json
|
|
295
|
+
|
|
296
|
+
sl system form button execute \
|
|
297
|
+
--form-api-name orders \
|
|
298
|
+
--button-key preset:dataCleanup.purge \
|
|
299
|
+
--payload-json '{"recordId":"<uuid>"}' \
|
|
300
|
+
--json
|
|
301
|
+
```
|
|
302
|
+
|
|
303
|
+
`dataCleanup.purge` 会提交不可恢复的物理清除任务,只接受已经在回收站且没有清除任务进行中的记录。批量操作使用 `preset:dataCleanupBatch.restore` 和 `preset:dataCleanupBatch.purge`,并在 `recordIds` 中传入最多 100 个记录 ID。
|
|
304
|
+
|
|
305
|
+
处理“当前筛选条件的全部结果”时,不需要先分页收集记录 ID,直接提交筛选条件:
|
|
306
|
+
|
|
307
|
+
```bash
|
|
308
|
+
sl system form record cleanup \
|
|
309
|
+
--form-api-name orders \
|
|
310
|
+
--mode restore \
|
|
311
|
+
--condition-json '{"field":"status","operator":"eq","value":"canceled"}' \
|
|
312
|
+
--json
|
|
313
|
+
|
|
314
|
+
sl system form record cleanup \
|
|
315
|
+
--form-api-name orders \
|
|
316
|
+
--mode purge \
|
|
317
|
+
--keyword test \
|
|
318
|
+
--excluded-record-ids-json '["<uuid>"]' \
|
|
319
|
+
--json
|
|
320
|
+
```
|
|
321
|
+
|
|
322
|
+
该命令固定只处理回收站记录,并在租户 Runtime 内按筛选条件生成批处理任务。`purge` 是不可恢复操作;组织、部门和成员目录不能使用此命令。
|
|
323
|
+
|
|
324
|
+
Member queries use `active` and `inactive` statuses, while organization and department
|
|
325
|
+
queries use `active` and `disabled`. Organization and department member scopes are
|
|
326
|
+
mutually exclusive, and `--include-descendants` requires one of those scopes.
|
|
327
|
+
|
|
328
|
+
The update requires `system-organization.page / enter` and the page action `system-organization.page.edit / execute`.
|
|
329
|
+
|
|
330
|
+
## Document Reading
|
|
331
|
+
|
|
332
|
+
Document commands operate on an existing tenant file asset. The first read or search
|
|
333
|
+
parses the source with the tenant Docling service and persists searchable chunks in the
|
|
334
|
+
tenant database. Continue large reads with the `position.next` values returned by the
|
|
335
|
+
previous call.
|
|
336
|
+
|
|
337
|
+
```bash
|
|
338
|
+
sl system document metadata get --file-id <file-uuid> --json
|
|
339
|
+
sl system document read --file-id <file-uuid> --max-chunks 20 --max-chars 30000 --json
|
|
340
|
+
sl system document search --file-id <file-uuid> --query 'payment terms' --limit 8 --json
|
|
341
|
+
```
|
|
342
|
+
|
|
343
|
+
## Help Center
|
|
344
|
+
|
|
345
|
+
Help commands answer how-to questions from the released Soln Help Center content that ships
|
|
346
|
+
with the runtime. They read the product manual only and never touch tenant business data.
|
|
347
|
+
Use them before explaining how a page, module, or workflow is used.
|
|
348
|
+
|
|
349
|
+
```bash
|
|
350
|
+
sl system help list --keyword form --limit 50 --json
|
|
351
|
+
sl system help search --query 'how do I configure an approval process' --json
|
|
352
|
+
sl system help search --query '审批流程怎么配置' --locale zh-CN --limit 3 --json
|
|
353
|
+
sl system help read --doc-id using-soln/approval-processes/process-management --max-chars 12000 --json
|
|
354
|
+
```
|
|
355
|
+
|
|
356
|
+
`search` returns each matching topic `docId`, `section`, `url`, and a bounded snippet. Continue
|
|
357
|
+
with `system help read` and its `position.next` value when a topic is longer than one response.
|
|
358
|
+
`--locale` accepts `en` or `zh-CN`; a topic without translation falls back to English and reports
|
|
359
|
+
`localeFallback: true`.
|
|
360
|
+
|
|
361
|
+
## Analysis Datasets
|
|
362
|
+
|
|
363
|
+
Persistent datasets are tenant-owned definitions. Create and update accept complete JSON
|
|
364
|
+
snapshots; read the existing dataset before update. Physical field keys use
|
|
365
|
+
`t0.<apiName>`, `t1.<apiName>`, and so on. A computed config uses a bare key, while its
|
|
366
|
+
persisted field uses `computed.<key>`.
|
|
367
|
+
|
|
368
|
+
```json
|
|
369
|
+
{
|
|
370
|
+
"name": "Order analysis",
|
|
371
|
+
"description": null,
|
|
372
|
+
"sourceConfig": {
|
|
373
|
+
"formId": "<form-uuid>",
|
|
374
|
+
"joins": [],
|
|
375
|
+
"computedFields": [{
|
|
376
|
+
"key": "net_amount",
|
|
377
|
+
"name": "Net amount",
|
|
378
|
+
"expression": "FIELD(\"t0.so_amount\") * 0.9",
|
|
379
|
+
"dataType": "number",
|
|
380
|
+
"valueSource": "expression"
|
|
381
|
+
}]
|
|
382
|
+
},
|
|
383
|
+
"fields": [{
|
|
384
|
+
"key": "computed.net_amount",
|
|
385
|
+
"name": "Net amount",
|
|
386
|
+
"sourceName": "Net amount",
|
|
387
|
+
"apiName": "net_amount",
|
|
388
|
+
"tableAlias": "computed",
|
|
389
|
+
"tableName": "computed",
|
|
390
|
+
"formId": null,
|
|
391
|
+
"dataType": "number",
|
|
392
|
+
"fieldType": "number",
|
|
393
|
+
"originType": "COMPUTED",
|
|
394
|
+
"expression": "FIELD(\"t0.so_amount\") * 0.9",
|
|
395
|
+
"semanticType": "MEASURE",
|
|
396
|
+
"aggregationType": "sum",
|
|
397
|
+
"isVisible": true,
|
|
398
|
+
"metadata": { "valueSource": "expression" }
|
|
399
|
+
}]
|
|
400
|
+
}
|
|
401
|
+
```
|
|
402
|
+
|
|
403
|
+
```bash
|
|
404
|
+
sl system analysis dataset list --json
|
|
405
|
+
sl system analysis dataset get --dataset-id <dataset-uuid> --json
|
|
406
|
+
sl system analysis dataset create --definition-file dataset.json --json
|
|
407
|
+
sl system analysis dataset update --dataset-id <dataset-uuid> --definition-file dataset.json --json
|
|
408
|
+
sl system analysis dataset query --dataset-id <dataset-uuid> --query-file query.json --json
|
|
409
|
+
```
|
|
410
|
+
|
|
411
|
+
Studio-derived columns are persistent numeric computed measures. Set `valueSource` to
|
|
412
|
+
`studio_script`, leave both expressions empty, discover a published server-script asset
|
|
413
|
+
and file, then provide both UUIDs in the query or chart binding:
|
|
414
|
+
|
|
415
|
+
```json
|
|
416
|
+
{
|
|
417
|
+
"mode": "aggregate",
|
|
418
|
+
"dimensions": ["t0.so_region"],
|
|
419
|
+
"measures": ["computed.adjusted_amount"],
|
|
420
|
+
"bindingScript": {
|
|
421
|
+
"studioScriptAssetId": "<published-asset-uuid>",
|
|
422
|
+
"studioScriptFileId": "<published-file-uuid>",
|
|
423
|
+
"matchFields": [{ "datasetFieldKey": "t0.so_region", "resultKey": "region" }],
|
|
424
|
+
"assignments": [{
|
|
425
|
+
"computedFieldKey": "computed.adjusted_amount",
|
|
426
|
+
"resultKey": "adjustedAmount"
|
|
427
|
+
}],
|
|
428
|
+
"where": {}
|
|
429
|
+
}
|
|
430
|
+
}
|
|
431
|
+
```
|
|
432
|
+
|
|
433
|
+
Session datasets are conversation-scoped and support physical fields plus expression
|
|
434
|
+
computed fields. They do not support `bindingScript`.
|
|
435
|
+
|
|
436
|
+
```bash
|
|
437
|
+
sl system analysis session-dataset create --thread-id <thread-uuid> --definition-file session-dataset.json --json
|
|
438
|
+
sl system analysis session-dataset list --thread-id <thread-uuid> --json
|
|
439
|
+
sl system analysis session-dataset get --thread-id <thread-uuid> --session-dataset-id <uuid> --json
|
|
440
|
+
sl system analysis session-dataset query --thread-id <thread-uuid> --session-dataset-id <uuid> --query-file query.json --json
|
|
441
|
+
sl system analysis session-dataset delete-for-thread --thread-id <thread-uuid> --json
|
|
442
|
+
```
|
|
443
|
+
|
|
444
|
+
## Automation Tasks
|
|
445
|
+
|
|
446
|
+
Automation commands use the Runtime service and tenant repository directly. For AI-authored
|
|
447
|
+
graphs, load the authorized catalog with `draft context`, build a semantic spec, and call
|
|
448
|
+
`draft validate`. Reuse the exact validated `graphSchema` for create or version creation.
|
|
449
|
+
|
|
450
|
+
```bash
|
|
451
|
+
sl system automation draft context --json
|
|
452
|
+
sl system automation draft validate --spec-file automation-spec.json --locale zh-CN --timezone Asia/Shanghai --json
|
|
453
|
+
sl system automation draft generate --goal "Notify the owner after an order is created" --timezone Asia/Shanghai --json
|
|
454
|
+
sl system automation task list --keyword order --json
|
|
455
|
+
sl system automation task get --definition-id <uuid> --json
|
|
456
|
+
sl system automation task create --definition-file automation-create.json --json
|
|
457
|
+
sl system automation task update --definition-id <uuid> --definition-file automation-update.json --json
|
|
458
|
+
sl system automation task delete --definition-id <uuid> --json
|
|
459
|
+
sl system automation task version list --definition-id <uuid> --json
|
|
460
|
+
sl system automation task version create --definition-id <uuid> --graph-file automation-graph.json --json
|
|
461
|
+
sl system automation task version publish --definition-id <uuid> --version-id <uuid> --json
|
|
462
|
+
sl system automation task run --definition-id <uuid> --payload-json '{"recordId":"<uuid>"}' --json
|
|
463
|
+
sl system automation execution list --definition-id <uuid> --status failed --from 2026-08-01T00:00:00+08:00 --to 2026-08-18T00:00:00+08:00 --json
|
|
464
|
+
sl system automation execution get --execution-id <uuid> --json
|
|
465
|
+
sl system automation execution batch-failure list --execution-id <uuid> --page 1 --page-size 20 --json
|
|
466
|
+
```
|
|
467
|
+
|
|
468
|
+
`task create` accepts `code`, `name`, optional `description`, and a complete `graphSchema`.
|
|
469
|
+
`task update` only changes definition fields or status; graph changes create a new immutable
|
|
470
|
+
version. A Studio service node requires both the published `studioScriptAssetId` and published
|
|
471
|
+
entry `studioScriptFileId`; a file path is not a file ID. Runtime command help contains the
|
|
472
|
+
trigger, node, message mapping, OpenLink callback, script payload, and return-value contracts.
|
|
473
|
+
|
|
474
|
+
## Studio Projects
|
|
475
|
+
|
|
476
|
+
Create a local Studio page project:
|
|
477
|
+
|
|
478
|
+
```bash
|
|
479
|
+
soln studio init page --code customer-dashboard --name "Customer Dashboard"
|
|
480
|
+
```
|
|
481
|
+
|
|
482
|
+
This creates:
|
|
483
|
+
|
|
484
|
+
```txt
|
|
485
|
+
soln.extension.json
|
|
486
|
+
src/App.tsx
|
|
487
|
+
package.json
|
|
488
|
+
tsconfig.json
|
|
489
|
+
```
|
|
490
|
+
|
|
491
|
+
Deploy the current Studio project to the authenticated tenant:
|
|
492
|
+
|
|
493
|
+
```bash
|
|
494
|
+
soln studio deploy
|
|
495
|
+
```
|
|
496
|
+
|
|
497
|
+
Deploy reads `soln.extension.json`, uploads source files to the existing Studio asset API, and asks the Soln API to compile the asset. Server-side compile remains the source of truth.
|
|
498
|
+
When a new Studio asset is created, the CLI writes the returned `assetId` back to `soln.extension.json`.
|
|
499
|
+
|
|
500
|
+
Publish the deployed Studio asset:
|
|
501
|
+
|
|
502
|
+
```bash
|
|
503
|
+
soln studio publish --notes "Initial release"
|
|
504
|
+
```
|
|
505
|
+
|
|
506
|
+
Pull an existing Studio asset into a local project:
|
|
507
|
+
|
|
508
|
+
```bash
|
|
509
|
+
soln studio pull --asset-id <asset-id> --dir ./customer-dashboard
|
|
510
|
+
```
|
|
511
|
+
|
|
512
|
+
Pull refuses to overwrite local files with different content unless `--force` is provided.
|
|
513
|
+
|
|
514
|
+
Inspect a local Studio project:
|
|
515
|
+
|
|
516
|
+
```bash
|
|
517
|
+
soln studio status
|
|
518
|
+
soln studio status --check
|
|
519
|
+
```
|
|
520
|
+
|
|
521
|
+
`--check` loads the bound remote asset and reports whether local files need deploy.
|
|
522
|
+
|
|
523
|
+
Use JSON output from scripts:
|
|
524
|
+
|
|
525
|
+
```bash
|
|
526
|
+
soln studio deploy --json
|
|
527
|
+
soln studio publish --json
|
|
528
|
+
soln studio pull --asset-id <asset-id> --json
|
|
529
|
+
soln studio status --check --json
|
|
530
|
+
```
|
|
531
|
+
|
|
532
|
+
### 转发表单记录到聊天
|
|
533
|
+
|
|
534
|
+
先查询记录、接收人,并通过 `sl system form button list` 确认有转发权限。
|
|
535
|
+
接收人使用 `sl system organization structure member list --keyword 张三 --json` 返回的成员 ID;同名时先确认目标。
|
|
536
|
+
|
|
537
|
+
单条转发:
|
|
538
|
+
|
|
539
|
+
```bash
|
|
540
|
+
sl system form button execute \
|
|
541
|
+
--form-api-name orders \
|
|
542
|
+
--button-key preset:detail.forward \
|
|
543
|
+
--payload-json '{"recordId":"<记录UUID>","input":{"targetMemberIds":["<成员UUID>"],"clientBatchId":"<本次操作UUID>"}}' \
|
|
544
|
+
--json
|
|
545
|
+
```
|
|
546
|
+
|
|
547
|
+
批量转发使用 `preset:listBatch.forward`,将 `recordId` 改为 `recordIds` 数组。
|
|
548
|
+
每次最多 100 条记录、100 位接收人;生成的消息不得超过 4000 字符。
|
|
549
|
+
同一次操作重试时复用 `clientBatchId`;新的转发使用新的 UUID。
|
|
550
|
+
Runtime 从记录生成名称和详情链接,并执行按钮权限、读取权限、显示条件和按钮脚本。
|
|
551
|
+
结果包含 `succeededCount`、`failedCount`、成功消息 ID 和失败接收人列表。
|
package/package.json
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@soln/cli",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "Command-line interface for Soln member authentication.",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"license": "UNLICENSED",
|
|
7
|
+
"engines": {
|
|
8
|
+
"node": ">=22.0.0"
|
|
9
|
+
},
|
|
10
|
+
"bin": {
|
|
11
|
+
"sl": "soln.mjs",
|
|
12
|
+
"soln": "soln.mjs"
|
|
13
|
+
},
|
|
14
|
+
"files": [
|
|
15
|
+
"soln.mjs",
|
|
16
|
+
"README.md"
|
|
17
|
+
],
|
|
18
|
+
"publishConfig": {
|
|
19
|
+
"access": "public"
|
|
20
|
+
}
|
|
21
|
+
}
|