@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.
Files changed (3) hide show
  1. package/README.md +551 -0
  2. package/package.json +21 -0
  3. 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
+ }