@josephyan/qingflow-cli 0.2.0-beta.71 → 0.2.0-beta.72

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.
@@ -8,6 +8,8 @@ from typing import Any, Callable
8
8
 
9
9
  JSONObject = dict[str, Any]
10
10
  TransformFn = Callable[[JSONObject], None]
11
+ USER_DOMAIN = "user"
12
+ BUILDER_DOMAIN = "builder"
11
13
 
12
14
 
13
15
  COMMON_SUCCESS_DROP_TOP = {
@@ -45,6 +47,10 @@ COMMON_ERROR_DROP_TOP = {
45
47
  SUCCESS_POLICY_BY_TOOL: dict[str, TransformFn] = {}
46
48
 
47
49
 
50
+ def _tool_key(domain: str, tool_name: str) -> str:
51
+ return f"{domain}:{tool_name}"
52
+
53
+
48
54
  def trim_public_response(tool_name: str | None, payload: dict[str, Any]) -> dict[str, Any]:
49
55
  if not isinstance(payload, dict):
50
56
  return payload
@@ -97,215 +103,234 @@ def resolve_cli_tool_name(args: Any) -> str | None:
97
103
  command = getattr(args, "command", None)
98
104
  if command == "auth":
99
105
  return {
100
- "login": "auth_login",
101
- "use-token": "auth_use_token",
102
- "whoami": "auth_whoami",
103
- "logout": "auth_logout",
106
+ "login": _tool_key(USER_DOMAIN, "auth_login"),
107
+ "use-token": _tool_key(USER_DOMAIN, "auth_use_token"),
108
+ "whoami": _tool_key(USER_DOMAIN, "auth_whoami"),
109
+ "logout": _tool_key(USER_DOMAIN, "auth_logout"),
104
110
  }.get(getattr(args, "auth_command", None))
105
111
  if command == "workspace":
106
112
  return {
107
- "list": "workspace_list",
108
- "select": "workspace_select",
113
+ "list": _tool_key(USER_DOMAIN, "workspace_list"),
114
+ "select": _tool_key(USER_DOMAIN, "workspace_select"),
109
115
  }.get(getattr(args, "workspace_command", None))
110
116
  if command == "app":
111
117
  return {
112
- "list": "app_list",
113
- "search": "app_search",
114
- "get": "app_get",
118
+ "list": _tool_key(USER_DOMAIN, "app_list"),
119
+ "search": _tool_key(USER_DOMAIN, "app_search"),
120
+ "get": _tool_key(USER_DOMAIN, "app_get"),
115
121
  }.get(getattr(args, "app_command", None))
122
+ if command == "portal":
123
+ return {
124
+ "list": _tool_key(USER_DOMAIN, "portal_list"),
125
+ "get": _tool_key(USER_DOMAIN, "portal_get"),
126
+ }.get(getattr(args, "portal_command", None))
127
+ if command == "view":
128
+ return {
129
+ "get": _tool_key(USER_DOMAIN, "view_get"),
130
+ }.get(getattr(args, "view_command", None))
131
+ if command == "chart":
132
+ return {
133
+ "get": _tool_key(USER_DOMAIN, "chart_get"),
134
+ }.get(getattr(args, "chart_command", None))
116
135
  if command == "record":
117
136
  record_command = getattr(args, "record_command", None)
118
137
  if record_command == "schema":
119
138
  return {
120
- "applicant": "record_schema_get",
121
- "browse": "record_browse_schema_get",
122
- "insert": "record_insert_schema_get",
123
- "update": "record_update_schema_get",
124
- "import": "record_import_schema_get",
125
- "code-block": "record_code_block_schema_get",
139
+ "applicant": _tool_key(USER_DOMAIN, "record_schema_get"),
140
+ "browse": _tool_key(USER_DOMAIN, "record_browse_schema_get"),
141
+ "insert": _tool_key(USER_DOMAIN, "record_insert_schema_get"),
142
+ "update": _tool_key(USER_DOMAIN, "record_update_schema_get"),
143
+ "import": _tool_key(USER_DOMAIN, "record_import_schema_get"),
144
+ "code-block": _tool_key(USER_DOMAIN, "record_code_block_schema_get"),
126
145
  }.get(getattr(args, "record_schema_command", None))
127
146
  return {
128
- "list": "record_list",
129
- "get": "record_get",
130
- "insert": "record_insert",
131
- "update": "record_update",
132
- "delete": "record_delete",
133
- "analyze": "record_analyze",
134
- "code-block-run": "record_code_block_run",
147
+ "list": _tool_key(USER_DOMAIN, "record_list"),
148
+ "get": _tool_key(USER_DOMAIN, "record_get"),
149
+ "insert": _tool_key(USER_DOMAIN, "record_insert"),
150
+ "update": _tool_key(USER_DOMAIN, "record_update"),
151
+ "delete": _tool_key(USER_DOMAIN, "record_delete"),
152
+ "analyze": _tool_key(USER_DOMAIN, "record_analyze"),
153
+ "code-block-run": _tool_key(USER_DOMAIN, "record_code_block_run"),
135
154
  }.get(record_command)
136
155
  if command == "import":
137
156
  return {
138
- "template": "record_import_template_get",
139
- "verify": "record_import_verify",
140
- "repair": "record_import_repair_local",
141
- "start": "record_import_start",
142
- "status": "record_import_status_get",
157
+ "template": _tool_key(USER_DOMAIN, "record_import_template_get"),
158
+ "verify": _tool_key(USER_DOMAIN, "record_import_verify"),
159
+ "repair": _tool_key(USER_DOMAIN, "record_import_repair_local"),
160
+ "start": _tool_key(USER_DOMAIN, "record_import_start"),
161
+ "status": _tool_key(USER_DOMAIN, "record_import_status_get"),
143
162
  }.get(getattr(args, "import_command", None))
144
163
  if command == "task":
145
164
  return {
146
- "list": "task_list",
147
- "get": "task_get",
148
- "action": "task_action_execute",
149
- "log": "task_workflow_log_get",
165
+ "list": _tool_key(USER_DOMAIN, "task_list"),
166
+ "get": _tool_key(USER_DOMAIN, "task_get"),
167
+ "action": _tool_key(USER_DOMAIN, "task_action_execute"),
168
+ "log": _tool_key(USER_DOMAIN, "task_workflow_log_get"),
150
169
  }.get(getattr(args, "task_command", None))
151
170
  if command not in {"builder", "build"}:
152
171
  return None
153
172
  builder_command = getattr(args, "builder_command", None)
154
173
  if builder_command == "contract":
155
- return "builder_tool_contract"
174
+ return _tool_key(BUILDER_DOMAIN, "builder_tool_contract")
156
175
  if builder_command == "member":
157
176
  return {
158
- "search": "member_search",
177
+ "search": _tool_key(BUILDER_DOMAIN, "member_search"),
159
178
  }.get(getattr(args, "builder_member_command", None))
160
179
  if builder_command == "role":
161
180
  return {
162
- "search": "role_search",
163
- "create": "role_create",
181
+ "search": _tool_key(BUILDER_DOMAIN, "role_search"),
182
+ "create": _tool_key(BUILDER_DOMAIN, "role_create"),
164
183
  }.get(getattr(args, "builder_role_command", None))
165
184
  if builder_command == "package":
166
185
  return {
167
- "list": "package_list",
168
- "resolve": "package_resolve",
169
- "create": "package_create",
170
- "attach-app": "package_attach_app",
186
+ "list": _tool_key(BUILDER_DOMAIN, "package_list"),
187
+ "resolve": _tool_key(BUILDER_DOMAIN, "package_resolve"),
188
+ "create": _tool_key(BUILDER_DOMAIN, "package_create"),
189
+ "attach-app": _tool_key(BUILDER_DOMAIN, "package_attach_app"),
171
190
  }.get(getattr(args, "builder_package_command", None))
172
191
  if builder_command == "app":
192
+ app_command = getattr(args, "builder_app_command", None)
193
+ if app_command == "get":
194
+ return {
195
+ "summary": _tool_key(BUILDER_DOMAIN, "app_get"),
196
+ "fields": _tool_key(BUILDER_DOMAIN, "app_get_fields"),
197
+ "layout": _tool_key(BUILDER_DOMAIN, "app_get_layout"),
198
+ "views": _tool_key(BUILDER_DOMAIN, "app_get_views"),
199
+ "flow": _tool_key(BUILDER_DOMAIN, "app_get_flow"),
200
+ "charts": _tool_key(BUILDER_DOMAIN, "app_get_charts"),
201
+ }.get(getattr(args, "builder_app_get_section", "summary"))
173
202
  return {
174
- "resolve": "app_resolve",
175
- "release-edit-lock-if-mine": "app_release_edit_lock_if_mine",
176
- "read-summary": "app_read_summary",
177
- "read-fields": "app_read_fields",
178
- "read-layout": "app_read_layout_summary",
179
- "read-views": "app_read_views_summary",
180
- "read-flow": "app_read_flow_summary",
181
- "read-charts": "app_read_charts_summary",
182
- }.get(getattr(args, "builder_app_command", None))
203
+ "resolve": _tool_key(BUILDER_DOMAIN, "app_resolve"),
204
+ "release-edit-lock-if-mine": _tool_key(BUILDER_DOMAIN, "app_release_edit_lock_if_mine"),
205
+ }.get(app_command)
183
206
  if builder_command == "button":
184
207
  return {
185
- "list": "app_custom_button_list",
186
- "get": "app_custom_button_get",
187
- "create": "app_custom_button_create",
188
- "update": "app_custom_button_update",
189
- "delete": "app_custom_button_delete",
208
+ "list": _tool_key(BUILDER_DOMAIN, "app_custom_button_list"),
209
+ "get": _tool_key(BUILDER_DOMAIN, "app_custom_button_get"),
210
+ "create": _tool_key(BUILDER_DOMAIN, "app_custom_button_create"),
211
+ "update": _tool_key(BUILDER_DOMAIN, "app_custom_button_update"),
212
+ "delete": _tool_key(BUILDER_DOMAIN, "app_custom_button_delete"),
190
213
  }.get(getattr(args, "builder_button_command", None))
191
214
  if builder_command == "portal":
192
215
  return {
193
- "list": "portal_list",
194
- "get": "portal_get",
195
- "read-summary": "portal_read_summary",
196
- "apply": "portal_apply",
216
+ "list": _tool_key(BUILDER_DOMAIN, "portal_list"),
217
+ "get": _tool_key(BUILDER_DOMAIN, "portal_get"),
218
+ "apply": _tool_key(BUILDER_DOMAIN, "portal_apply"),
197
219
  }.get(getattr(args, "builder_portal_command", None))
198
220
  if builder_command == "view":
199
221
  return {
200
- "get": "view_get",
222
+ "get": _tool_key(BUILDER_DOMAIN, "view_get"),
201
223
  }.get(getattr(args, "builder_view_command", None))
202
224
  if builder_command == "chart":
203
225
  return {
204
- "get": "chart_get",
226
+ "get": _tool_key(BUILDER_DOMAIN, "chart_get"),
205
227
  }.get(getattr(args, "builder_chart_command", None))
206
228
  if builder_command == "schema":
207
- return {"apply": "app_schema_apply"}.get(getattr(args, "builder_schema_command", None))
229
+ return {"apply": _tool_key(BUILDER_DOMAIN, "app_schema_apply")}.get(getattr(args, "builder_schema_command", None))
208
230
  if builder_command == "layout":
209
- return {"apply": "app_layout_apply"}.get(getattr(args, "builder_layout_command", None))
231
+ return {"apply": _tool_key(BUILDER_DOMAIN, "app_layout_apply")}.get(getattr(args, "builder_layout_command", None))
210
232
  if builder_command == "views":
211
- return {"apply": "app_views_apply"}.get(getattr(args, "builder_views_command", None))
233
+ return {"apply": _tool_key(BUILDER_DOMAIN, "app_views_apply")}.get(getattr(args, "builder_views_command", None))
212
234
  if builder_command == "flow":
213
- return {"apply": "app_flow_apply"}.get(getattr(args, "builder_flow_command", None))
235
+ return {"apply": _tool_key(BUILDER_DOMAIN, "app_flow_apply")}.get(getattr(args, "builder_flow_command", None))
214
236
  if builder_command == "charts":
215
- return {"apply": "app_charts_apply"}.get(getattr(args, "builder_charts_command", None))
237
+ return {"apply": _tool_key(BUILDER_DOMAIN, "app_charts_apply")}.get(getattr(args, "builder_charts_command", None))
216
238
  if builder_command == "publish":
217
- return {"verify": "app_publish_verify"}.get(getattr(args, "builder_publish_command", None))
239
+ return {"verify": _tool_key(BUILDER_DOMAIN, "app_publish_verify")}.get(getattr(args, "builder_publish_command", None))
218
240
  return None
219
241
 
220
242
 
221
243
  USER_SERVER_METHOD_MAP = {
222
- "auth_login": "auth_login",
223
- "auth_use_token": "auth_use_token",
224
- "auth_whoami": "auth_whoami",
225
- "auth_logout": "auth_logout",
226
- "workspace_list": "workspace_list",
227
- "workspace_select": "workspace_select",
228
- "app_list": "app_list",
229
- "app_search": "app_search",
230
- "app_get": "app_get",
231
- "file_get_upload_info": "file_get_upload_info",
232
- "file_upload_local": "file_upload_local",
233
- "feedback_submit": "feedback_submit",
234
- "record_import_schema_get": "record_import_schema_get",
235
- "record_import_template_get": "record_import_template_get",
236
- "record_import_verify": "record_import_verify",
237
- "record_import_repair_local": "record_import_repair_local",
238
- "record_import_start": "record_import_start",
239
- "record_import_status_get": "record_import_status_get",
240
- "record_insert_schema_get_public": "record_insert_schema_get",
241
- "record_member_candidates": "record_member_candidates",
242
- "record_department_candidates": "record_department_candidates",
243
- "record_analyze": "record_analyze",
244
- "record_list": "record_list",
245
- "record_get_public": "record_get",
246
- "record_browse_schema_get_public": "record_browse_schema_get",
247
- "record_update_schema_get_public": "record_update_schema_get",
248
- "record_insert_public": "record_insert",
249
- "record_update_public": "record_update",
250
- "record_delete_public": "record_delete",
251
- "record_code_block_schema_get_public": "record_code_block_schema_get",
252
- "record_code_block_run": "record_code_block_run",
253
- "task_list": "task_list",
254
- "task_get": "task_get",
255
- "task_action_execute": "task_action_execute",
256
- "task_associated_report_detail_get": "task_associated_report_detail_get",
257
- "task_workflow_log_get": "task_workflow_log_get",
258
- "directory_search": "directory_search",
259
- "directory_list_internal_users": "directory_list_internal_users",
260
- "directory_list_all_internal_users": "directory_list_all_internal_users",
261
- "directory_list_internal_departments": "directory_list_internal_departments",
262
- "directory_list_all_departments": "directory_list_all_departments",
263
- "directory_list_sub_departments": "directory_list_sub_departments",
264
- "directory_list_external_members": "directory_list_external_members",
244
+ "auth_login": _tool_key(USER_DOMAIN, "auth_login"),
245
+ "auth_use_token": _tool_key(USER_DOMAIN, "auth_use_token"),
246
+ "auth_whoami": _tool_key(USER_DOMAIN, "auth_whoami"),
247
+ "auth_logout": _tool_key(USER_DOMAIN, "auth_logout"),
248
+ "workspace_list": _tool_key(USER_DOMAIN, "workspace_list"),
249
+ "workspace_select": _tool_key(USER_DOMAIN, "workspace_select"),
250
+ "app_list": _tool_key(USER_DOMAIN, "app_list"),
251
+ "app_search": _tool_key(USER_DOMAIN, "app_search"),
252
+ "app_get": _tool_key(USER_DOMAIN, "app_get"),
253
+ "portal_list": _tool_key(USER_DOMAIN, "portal_list"),
254
+ "portal_get": _tool_key(USER_DOMAIN, "portal_get"),
255
+ "view_get": _tool_key(USER_DOMAIN, "view_get"),
256
+ "chart_get": _tool_key(USER_DOMAIN, "chart_get"),
257
+ "file_get_upload_info": _tool_key(USER_DOMAIN, "file_get_upload_info"),
258
+ "file_upload_local": _tool_key(USER_DOMAIN, "file_upload_local"),
259
+ "feedback_submit": _tool_key(USER_DOMAIN, "feedback_submit"),
260
+ "record_import_schema_get": _tool_key(USER_DOMAIN, "record_import_schema_get"),
261
+ "record_import_template_get": _tool_key(USER_DOMAIN, "record_import_template_get"),
262
+ "record_import_verify": _tool_key(USER_DOMAIN, "record_import_verify"),
263
+ "record_import_repair_local": _tool_key(USER_DOMAIN, "record_import_repair_local"),
264
+ "record_import_start": _tool_key(USER_DOMAIN, "record_import_start"),
265
+ "record_import_status_get": _tool_key(USER_DOMAIN, "record_import_status_get"),
266
+ "record_insert_schema_get_public": _tool_key(USER_DOMAIN, "record_insert_schema_get"),
267
+ "record_member_candidates": _tool_key(USER_DOMAIN, "record_member_candidates"),
268
+ "record_department_candidates": _tool_key(USER_DOMAIN, "record_department_candidates"),
269
+ "record_analyze": _tool_key(USER_DOMAIN, "record_analyze"),
270
+ "record_list": _tool_key(USER_DOMAIN, "record_list"),
271
+ "record_get_public": _tool_key(USER_DOMAIN, "record_get"),
272
+ "record_browse_schema_get_public": _tool_key(USER_DOMAIN, "record_browse_schema_get"),
273
+ "record_update_schema_get_public": _tool_key(USER_DOMAIN, "record_update_schema_get"),
274
+ "record_insert_public": _tool_key(USER_DOMAIN, "record_insert"),
275
+ "record_update_public": _tool_key(USER_DOMAIN, "record_update"),
276
+ "record_delete_public": _tool_key(USER_DOMAIN, "record_delete"),
277
+ "record_code_block_schema_get_public": _tool_key(USER_DOMAIN, "record_code_block_schema_get"),
278
+ "record_code_block_run": _tool_key(USER_DOMAIN, "record_code_block_run"),
279
+ "task_list": _tool_key(USER_DOMAIN, "task_list"),
280
+ "task_get": _tool_key(USER_DOMAIN, "task_get"),
281
+ "task_action_execute": _tool_key(USER_DOMAIN, "task_action_execute"),
282
+ "task_associated_report_detail_get": _tool_key(USER_DOMAIN, "task_associated_report_detail_get"),
283
+ "task_workflow_log_get": _tool_key(USER_DOMAIN, "task_workflow_log_get"),
284
+ "directory_search": _tool_key(USER_DOMAIN, "directory_search"),
285
+ "directory_list_internal_users": _tool_key(USER_DOMAIN, "directory_list_internal_users"),
286
+ "directory_list_all_internal_users": _tool_key(USER_DOMAIN, "directory_list_all_internal_users"),
287
+ "directory_list_internal_departments": _tool_key(USER_DOMAIN, "directory_list_internal_departments"),
288
+ "directory_list_all_departments": _tool_key(USER_DOMAIN, "directory_list_all_departments"),
289
+ "directory_list_sub_departments": _tool_key(USER_DOMAIN, "directory_list_sub_departments"),
290
+ "directory_list_external_members": _tool_key(USER_DOMAIN, "directory_list_external_members"),
265
291
  }
266
292
 
267
293
  BUILDER_SERVER_METHOD_MAP = {
268
- "auth_login": "auth_login",
269
- "auth_use_token": "auth_use_token",
270
- "auth_whoami": "auth_whoami",
271
- "auth_logout": "auth_logout",
272
- "workspace_list": "workspace_list",
273
- "workspace_select": "workspace_select",
274
- "file_upload_local": "file_upload_local",
275
- "feedback_submit": "feedback_submit",
276
- "package_list": "package_list",
277
- "package_resolve": "package_resolve",
278
- "builder_tool_contract": "builder_tool_contract",
279
- "package_create": "package_create",
280
- "member_search": "member_search",
281
- "role_search": "role_search",
282
- "role_create": "role_create",
283
- "package_attach_app": "package_attach_app",
284
- "app_release_edit_lock_if_mine": "app_release_edit_lock_if_mine",
285
- "app_resolve": "app_resolve",
286
- "app_custom_button_list": "app_custom_button_list",
287
- "app_custom_button_get": "app_custom_button_get",
288
- "app_custom_button_create": "app_custom_button_create",
289
- "app_custom_button_update": "app_custom_button_update",
290
- "app_custom_button_delete": "app_custom_button_delete",
291
- "app_read_summary": "app_read_summary",
292
- "app_read_fields": "app_read_fields",
293
- "app_read_layout_summary": "app_read_layout_summary",
294
- "app_read_views_summary": "app_read_views_summary",
295
- "app_read_flow_summary": "app_read_flow_summary",
296
- "app_read_charts_summary": "app_read_charts_summary",
297
- "portal_list": "portal_list",
298
- "portal_get": "portal_get",
299
- "portal_read_summary": "portal_read_summary",
300
- "view_get": "view_get",
301
- "chart_get": "chart_get",
302
- "app_schema_apply": "app_schema_apply",
303
- "app_layout_apply": "app_layout_apply",
304
- "app_flow_apply": "app_flow_apply",
305
- "app_views_apply": "app_views_apply",
306
- "app_charts_apply": "app_charts_apply",
307
- "portal_apply": "portal_apply",
308
- "app_publish_verify": "app_publish_verify",
294
+ "auth_login": _tool_key(BUILDER_DOMAIN, "auth_login"),
295
+ "auth_use_token": _tool_key(BUILDER_DOMAIN, "auth_use_token"),
296
+ "auth_whoami": _tool_key(BUILDER_DOMAIN, "auth_whoami"),
297
+ "auth_logout": _tool_key(BUILDER_DOMAIN, "auth_logout"),
298
+ "workspace_list": _tool_key(BUILDER_DOMAIN, "workspace_list"),
299
+ "workspace_select": _tool_key(BUILDER_DOMAIN, "workspace_select"),
300
+ "file_upload_local": _tool_key(BUILDER_DOMAIN, "file_upload_local"),
301
+ "feedback_submit": _tool_key(BUILDER_DOMAIN, "feedback_submit"),
302
+ "package_list": _tool_key(BUILDER_DOMAIN, "package_list"),
303
+ "package_resolve": _tool_key(BUILDER_DOMAIN, "package_resolve"),
304
+ "builder_tool_contract": _tool_key(BUILDER_DOMAIN, "builder_tool_contract"),
305
+ "package_create": _tool_key(BUILDER_DOMAIN, "package_create"),
306
+ "member_search": _tool_key(BUILDER_DOMAIN, "member_search"),
307
+ "role_search": _tool_key(BUILDER_DOMAIN, "role_search"),
308
+ "role_create": _tool_key(BUILDER_DOMAIN, "role_create"),
309
+ "package_attach_app": _tool_key(BUILDER_DOMAIN, "package_attach_app"),
310
+ "app_release_edit_lock_if_mine": _tool_key(BUILDER_DOMAIN, "app_release_edit_lock_if_mine"),
311
+ "app_resolve": _tool_key(BUILDER_DOMAIN, "app_resolve"),
312
+ "app_custom_button_list": _tool_key(BUILDER_DOMAIN, "app_custom_button_list"),
313
+ "app_custom_button_get": _tool_key(BUILDER_DOMAIN, "app_custom_button_get"),
314
+ "app_custom_button_create": _tool_key(BUILDER_DOMAIN, "app_custom_button_create"),
315
+ "app_custom_button_update": _tool_key(BUILDER_DOMAIN, "app_custom_button_update"),
316
+ "app_custom_button_delete": _tool_key(BUILDER_DOMAIN, "app_custom_button_delete"),
317
+ "app_get": _tool_key(BUILDER_DOMAIN, "app_get"),
318
+ "app_get_fields": _tool_key(BUILDER_DOMAIN, "app_get_fields"),
319
+ "app_get_layout": _tool_key(BUILDER_DOMAIN, "app_get_layout"),
320
+ "app_get_views": _tool_key(BUILDER_DOMAIN, "app_get_views"),
321
+ "app_get_flow": _tool_key(BUILDER_DOMAIN, "app_get_flow"),
322
+ "app_get_charts": _tool_key(BUILDER_DOMAIN, "app_get_charts"),
323
+ "portal_list": _tool_key(BUILDER_DOMAIN, "portal_list"),
324
+ "portal_get": _tool_key(BUILDER_DOMAIN, "portal_get"),
325
+ "view_get": _tool_key(BUILDER_DOMAIN, "view_get"),
326
+ "chart_get": _tool_key(BUILDER_DOMAIN, "chart_get"),
327
+ "app_schema_apply": _tool_key(BUILDER_DOMAIN, "app_schema_apply"),
328
+ "app_layout_apply": _tool_key(BUILDER_DOMAIN, "app_layout_apply"),
329
+ "app_flow_apply": _tool_key(BUILDER_DOMAIN, "app_flow_apply"),
330
+ "app_views_apply": _tool_key(BUILDER_DOMAIN, "app_views_apply"),
331
+ "app_charts_apply": _tool_key(BUILDER_DOMAIN, "app_charts_apply"),
332
+ "portal_apply": _tool_key(BUILDER_DOMAIN, "portal_apply"),
333
+ "app_publish_verify": _tool_key(BUILDER_DOMAIN, "app_publish_verify"),
309
334
  }
310
335
 
311
336
 
@@ -475,6 +500,7 @@ def _trim_app_search_like(payload: JSONObject) -> None:
475
500
 
476
501
 
477
502
  def _trim_app_get(payload: JSONObject) -> None:
503
+ _trim_builder_envelope(payload)
478
504
  _trim_nested_item_list(
479
505
  payload,
480
506
  ("data", "accessible_views"),
@@ -563,20 +589,23 @@ def _trim_builder_list_like(payload: JSONObject) -> None:
563
589
  _trim_builder_envelope(payload)
564
590
 
565
591
 
566
- def _register_policy(names: tuple[str, ...], transform: TransformFn) -> None:
567
- for name in names:
568
- SUCCESS_POLICY_BY_TOOL[name] = transform
592
+ def _register_policy(domains: tuple[str, ...], names: tuple[str, ...], transform: TransformFn) -> None:
593
+ for domain in domains:
594
+ for name in names:
595
+ SUCCESS_POLICY_BY_TOOL[_tool_key(domain, name)] = transform
569
596
 
570
597
 
571
- _register_policy(("auth_login", "auth_use_token", "auth_whoami"), _trim_auth_payload)
572
- _register_policy(("auth_logout",), _trim_auth_logout)
573
- _register_policy(("workspace_list",), _trim_workspace_list)
574
- _register_policy(("workspace_select",), _trim_workspace_select)
575
- _register_policy(("app_list", "app_search"), _trim_app_search_like)
576
- _register_policy(("app_get",), _trim_app_get)
577
- _register_policy(("file_get_upload_info",), _trim_file_upload_info)
578
- _register_policy(("file_upload_local",), _trim_file_upload_local)
598
+ _register_policy((USER_DOMAIN, BUILDER_DOMAIN), ("auth_login", "auth_use_token", "auth_whoami"), _trim_auth_payload)
599
+ _register_policy((USER_DOMAIN, BUILDER_DOMAIN), ("auth_logout",), _trim_auth_logout)
600
+ _register_policy((USER_DOMAIN, BUILDER_DOMAIN), ("workspace_list",), _trim_workspace_list)
601
+ _register_policy((USER_DOMAIN, BUILDER_DOMAIN), ("workspace_select",), _trim_workspace_select)
602
+ _register_policy((USER_DOMAIN,), ("app_list", "app_search"), _trim_app_search_like)
603
+ _register_policy((USER_DOMAIN, BUILDER_DOMAIN), ("app_get",), _trim_app_get)
604
+ _register_policy((USER_DOMAIN, BUILDER_DOMAIN), ("portal_list", "portal_get", "view_get", "chart_get"), _trim_builder_list_like)
605
+ _register_policy((USER_DOMAIN,), ("file_get_upload_info",), _trim_file_upload_info)
606
+ _register_policy((USER_DOMAIN, BUILDER_DOMAIN), ("file_upload_local",), _trim_file_upload_local)
579
607
  _register_policy(
608
+ (USER_DOMAIN,),
580
609
  (
581
610
  "record_import_schema_get",
582
611
  "record_import_template_get",
@@ -588,6 +617,7 @@ _register_policy(
588
617
  _trim_import_schema,
589
618
  )
590
619
  _register_policy(
620
+ (USER_DOMAIN,),
591
621
  (
592
622
  "record_schema_get",
593
623
  "record_insert_schema_get",
@@ -597,13 +627,14 @@ _register_policy(
597
627
  ),
598
628
  _trim_record_schema,
599
629
  )
600
- _register_policy(("record_insert", "record_update"), _trim_record_write)
601
- _register_policy(("record_get",), _trim_record_get)
602
- _register_policy(("record_list",), _trim_record_list)
603
- _register_policy(("record_analyze",), _trim_record_analyze)
604
- _register_policy(("record_code_block_run",), _trim_code_block_run)
605
- _register_policy(("task_list",), _trim_task_list)
630
+ _register_policy((USER_DOMAIN,), ("record_insert", "record_update"), _trim_record_write)
631
+ _register_policy((USER_DOMAIN,), ("record_get",), _trim_record_get)
632
+ _register_policy((USER_DOMAIN,), ("record_list",), _trim_record_list)
633
+ _register_policy((USER_DOMAIN,), ("record_analyze",), _trim_record_analyze)
634
+ _register_policy((USER_DOMAIN,), ("record_code_block_run",), _trim_code_block_run)
635
+ _register_policy((USER_DOMAIN,), ("task_list",), _trim_task_list)
606
636
  _register_policy(
637
+ (USER_DOMAIN,),
607
638
  (
608
639
  "task_get",
609
640
  "task_action_execute",
@@ -613,6 +644,7 @@ _register_policy(
613
644
  _trim_task_get,
614
645
  )
615
646
  _register_policy(
647
+ (USER_DOMAIN,),
616
648
  (
617
649
  "directory_search",
618
650
  "directory_list_internal_users",
@@ -624,12 +656,19 @@ _register_policy(
624
656
  ),
625
657
  _trim_directory,
626
658
  )
627
- _register_policy(("feedback_submit",), _trim_feedback)
659
+ _register_policy((USER_DOMAIN, BUILDER_DOMAIN), ("feedback_submit",), _trim_feedback)
628
660
  _register_policy(
661
+ (USER_DOMAIN,),
629
662
  (
630
663
  "record_member_candidates",
631
664
  "record_department_candidates",
632
665
  "record_delete",
666
+ ),
667
+ _trim_builder_list_like,
668
+ )
669
+ _register_policy(
670
+ (BUILDER_DOMAIN,),
671
+ (
633
672
  "package_list",
634
673
  "package_resolve",
635
674
  "builder_tool_contract",
@@ -645,17 +684,11 @@ _register_policy(
645
684
  "app_custom_button_create",
646
685
  "app_custom_button_update",
647
686
  "app_custom_button_delete",
648
- "app_read_summary",
649
- "app_read_fields",
650
- "app_read_layout_summary",
651
- "app_read_views_summary",
652
- "app_read_flow_summary",
653
- "app_read_charts_summary",
654
- "portal_list",
655
- "portal_get",
656
- "portal_read_summary",
657
- "view_get",
658
- "chart_get",
687
+ "app_get_fields",
688
+ "app_get_layout",
689
+ "app_get_views",
690
+ "app_get_flow",
691
+ "app_get_charts",
659
692
  "app_schema_apply",
660
693
  "app_layout_apply",
661
694
  "app_flow_apply",
@@ -35,7 +35,7 @@ def build_builder_server() -> FastMCP:
35
35
  "Follow the resource path resolve -> summary read -> apply -> attach -> publish_verify. "
36
36
  "Use builder_tool_contract when you need a machine-readable contract, aliases, allowed enums, or a minimal valid example for a public builder tool. "
37
37
  "If creating a new package may be appropriate, ask the user to confirm package creation before calling package_create; otherwise use package_resolve/package_list and app_resolve to locate resources, "
38
- "app_read_summary/app_read_fields/app_read_layout_summary/app_read_views_summary/app_read_flow_summary/app_read_charts_summary/portal_list/portal_get/portal_read_summary/view_get/chart_get for reads, "
38
+ "app_get/app_get_fields/app_get_layout/app_get_views/app_get_flow/app_get_charts/portal_list/portal_get/view_get/chart_get for configuration reads, "
39
39
  "member_search/role_search/role_create when workflow assignees must come from the directory or role catalog, preferring roles over explicit members unless the user explicitly names members, "
40
40
  "then app_schema_apply/app_layout_apply/app_flow_apply/app_views_apply/app_charts_apply/portal_apply to execute normalized patches; these apply tools perform planning, normalization, and dependency checks internally where applicable. Schema/layout/views noop requests skip publish, charts are immediate-live without publish and resolve targets by chart_id first then exact unique chart name, portal updates are replace-only and publish=false only guarantees draft/base-info updates, and flow should use publish=false whenever you only want draft/precheck behavior. "
41
41
  "Use package_attach_app to attach apps to packages, and app_publish_verify for explicit final publish verification. "
@@ -153,7 +153,7 @@ def build_builder_server() -> FastMCP:
153
153
  ) -> dict:
154
154
  try:
155
155
  return trim_public_response(
156
- "feedback_submit",
156
+ "builder:feedback_submit",
157
157
  feedback.feedback_submit(
158
158
  category=category,
159
159
  title=title,
@@ -311,28 +311,28 @@ def build_builder_server() -> FastMCP:
311
311
  return ai_builder.app_custom_button_delete(profile=profile, app_key=app_key, button_id=button_id)
312
312
 
313
313
  @server.tool()
314
- def app_read_summary(profile: str = DEFAULT_PROFILE, app_key: str = "") -> dict:
315
- return ai_builder.app_read_summary(profile=profile, app_key=app_key)
314
+ def app_get(profile: str = DEFAULT_PROFILE, app_key: str = "") -> dict:
315
+ return ai_builder.app_get(profile=profile, app_key=app_key)
316
316
 
317
317
  @server.tool()
318
- def app_read_fields(profile: str = DEFAULT_PROFILE, app_key: str = "") -> dict:
319
- return ai_builder.app_read_fields(profile=profile, app_key=app_key)
318
+ def app_get_fields(profile: str = DEFAULT_PROFILE, app_key: str = "") -> dict:
319
+ return ai_builder.app_get_fields(profile=profile, app_key=app_key)
320
320
 
321
321
  @server.tool()
322
- def app_read_layout_summary(profile: str = DEFAULT_PROFILE, app_key: str = "") -> dict:
323
- return ai_builder.app_read_layout_summary(profile=profile, app_key=app_key)
322
+ def app_get_layout(profile: str = DEFAULT_PROFILE, app_key: str = "") -> dict:
323
+ return ai_builder.app_get_layout(profile=profile, app_key=app_key)
324
324
 
325
325
  @server.tool()
326
- def app_read_views_summary(profile: str = DEFAULT_PROFILE, app_key: str = "") -> dict:
327
- return ai_builder.app_read_views_summary(profile=profile, app_key=app_key)
326
+ def app_get_views(profile: str = DEFAULT_PROFILE, app_key: str = "") -> dict:
327
+ return ai_builder.app_get_views(profile=profile, app_key=app_key)
328
328
 
329
329
  @server.tool()
330
- def app_read_flow_summary(profile: str = DEFAULT_PROFILE, app_key: str = "") -> dict:
331
- return ai_builder.app_read_flow_summary(profile=profile, app_key=app_key)
330
+ def app_get_flow(profile: str = DEFAULT_PROFILE, app_key: str = "") -> dict:
331
+ return ai_builder.app_get_flow(profile=profile, app_key=app_key)
332
332
 
333
333
  @server.tool()
334
- def app_read_charts_summary(profile: str = DEFAULT_PROFILE, app_key: str = "") -> dict:
335
- return ai_builder.app_read_charts_summary(profile=profile, app_key=app_key)
334
+ def app_get_charts(profile: str = DEFAULT_PROFILE, app_key: str = "") -> dict:
335
+ return ai_builder.app_get_charts(profile=profile, app_key=app_key)
336
336
 
337
337
  @server.tool()
338
338
  def portal_list(profile: str = DEFAULT_PROFILE) -> dict:
@@ -347,36 +347,12 @@ def build_builder_server() -> FastMCP:
347
347
  return ai_builder.portal_get(profile=profile, dash_key=dash_key, being_draft=being_draft)
348
348
 
349
349
  @server.tool()
350
- def portal_read_summary(
351
- profile: str = DEFAULT_PROFILE,
352
- dash_key: str = "",
353
- being_draft: bool = True,
354
- ) -> dict:
355
- return ai_builder.portal_read_summary(profile=profile, dash_key=dash_key, being_draft=being_draft)
356
-
357
- @server.tool()
358
- def view_get(profile: str = DEFAULT_PROFILE, viewgraph_key: str = "") -> dict:
359
- return ai_builder.view_get(profile=profile, viewgraph_key=viewgraph_key)
350
+ def view_get(profile: str = DEFAULT_PROFILE, view_key: str = "") -> dict:
351
+ return ai_builder.view_get(profile=profile, view_key=view_key)
360
352
 
361
353
  @server.tool()
362
- def chart_get(
363
- profile: str = DEFAULT_PROFILE,
364
- chart_id: str = "",
365
- data_payload: dict | None = None,
366
- page_num: int | None = None,
367
- page_size: int | None = None,
368
- page_num_y: int | None = None,
369
- page_size_y: int | None = None,
370
- ) -> dict:
371
- return ai_builder.chart_get(
372
- profile=profile,
373
- chart_id=chart_id,
374
- data_payload=data_payload or {},
375
- page_num=page_num,
376
- page_size=page_size,
377
- page_num_y=page_num_y,
378
- page_size_y=page_size_y,
379
- )
354
+ def chart_get(profile: str = DEFAULT_PROFILE, chart_id: str = "") -> dict:
355
+ return ai_builder.chart_get(profile=profile, chart_id=chart_id)
380
356
 
381
357
  @server.tool()
382
358
  def app_schema_apply(