@pactor-app/skills 1.34.0 → 1.40.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 (49) hide show
  1. package/package.json +1 -1
  2. package/pactor-dsl/SKILL.md +28 -1
  3. package/pactor-dsl/references/dsl-authoring.md +174 -36
  4. package/pactor-prd/SKILL.md +20 -21
  5. package/pactor-prd/references/acceptance-checklist.md +1 -1
  6. package/pactor-prd/references/component-mapping.md +1 -1
  7. package/pactor-prd/references/data-api.md +37 -0
  8. package/pactor-prd/references/incremental-wireframe-delta.md +8 -9
  9. package/pactor-prd/references/page-inventory-and-files.md +2 -2
  10. package/pactor-prd/references/page-templates.md +59 -12
  11. package/pactor-prd/references/project-structure.md +1 -1
  12. package/pactor-prd/template/README.md +4 -4
  13. package/pactor-prd/template/app/api/d/[...parts]/route.ts +80 -0
  14. package/pactor-prd/template/app/layout.tsx +1 -3
  15. package/pactor-prd/template/next.config.js +2 -2
  16. package/pactor-prd/template/pnpm-lock.yaml +97 -97
  17. package/pactor-prd/template/src/pactor/App.tsx +3 -2
  18. package/pactor-prd/template/src/pactor/actions.ts +5 -431
  19. package/pactor-prd/template/src/pactor/components/index.ts +1 -4
  20. package/pactor-prd/template/src/pactor/config.ts +12 -4
  21. package/pactor-prd/template/src/server/yaml/common/dashboard.yaml +1 -1
  22. package/pactor-prd/template/src/server/yaml/common/login.yaml +46 -75
  23. package/pactor-prd/template/src/server/yaml/models/data-list.yaml +4 -4
  24. package/pactor-prd/template/src/server/yaml/provider/provider-detail.yaml +2 -2
  25. package/pactor-prd/template/src/server/yaml/provider/provider-edit.yaml +1 -1
  26. package/pactor-prd/template/src/server/yaml/provider/provider-list.yaml +1 -1
  27. package/pactor-prd/template/src/server/yaml/route/route-detail.yaml +1 -1
  28. package/pactor-prd/template/src/server/yaml/route/route-edit.yaml +1 -1
  29. package/pactor-prd/template/src/server/yaml/route/route-list.yaml +1 -1
  30. package/pactor-prd/template/src/server/yaml/sitemap.yaml +2 -6
  31. package/pactor-prd/references/mock-data-routes.md +0 -66
  32. package/pactor-prd/template/app/api/data/[...parts]/route.ts +0 -160
  33. package/pactor-prd/template/app/login.css +0 -122
  34. package/pactor-prd/template/src/pactor/components/chip-filter.tsx +0 -89
  35. package/pactor-prd/template/src/pactor/components/chip-node.tsx +0 -46
  36. package/pactor-prd/template/src/pactor/mocks/audit-mock.ts +0 -403
  37. package/pactor-prd/template/src/pactor/mocks/call-logs-mock.ts +0 -875
  38. package/pactor-prd/template/src/pactor/mocks/client-debug-mock.ts +0 -188
  39. package/pactor-prd/template/src/pactor/mocks/client-templates-mock.ts +0 -497
  40. package/pactor-prd/template/src/pactor/mocks/clients-mock.ts +0 -483
  41. package/pactor-prd/template/src/pactor/mocks/costs-mock.ts +0 -406
  42. package/pactor-prd/template/src/pactor/mocks/dashboard-mock.ts +0 -192
  43. package/pactor-prd/template/src/pactor/mocks/data-list-mock.ts +0 -84
  44. package/pactor-prd/template/src/pactor/mocks/model-debug-mock.ts +0 -144
  45. package/pactor-prd/template/src/pactor/mocks/models-mock.ts +0 -799
  46. package/pactor-prd/template/src/pactor/mocks/ops-usage-mock.ts +0 -806
  47. package/pactor-prd/template/src/pactor/mocks/providers-mock.ts +0 -424
  48. package/pactor-prd/template/src/pactor/mocks/routes-mock.ts +0 -604
  49. package/pactor-prd/template/src/pactor/services.ts +0 -200
@@ -1,200 +0,0 @@
1
- /**
2
- * 页面 DSL 的 service 数据源注册表(
3
- * `services={{...}}` 包装层),经 SitemapApp 的 `services` prop 全局注册。
4
- * 实现为 mock(src/pactor/mocks/);
5
- * 列表类服务负责把 DSL 的一族布尔快筛参数还原为数组(表达式引擎不支持数组方法)。
6
- */
7
- import type { ServiceHandler } from "@pactor-app/runtime";
8
-
9
- import { queryDashboard } from "./mocks/dashboard-mock";
10
- import {
11
- getProvider,
12
- pullProviderModels,
13
- queryProviders,
14
- } from "./mocks/providers-mock";
15
- import { getModel, queryModels } from "./mocks/models-mock";
16
- import { getRoute, queryRoutes } from "./mocks/routes-mock";
17
- import {
18
- CLIENT_TAG_FILTERS,
19
- clientsByTemplate,
20
- getClient,
21
- queryClients,
22
- } from "./mocks/clients-mock";
23
- import {
24
- CLIENT_TEMPLATE_TAG_FILTERS,
25
- getClientTemplate,
26
- queryClientTemplates,
27
- } from "./mocks/client-templates-mock";
28
- import { getCallLog, queryCallLogs } from "./mocks/call-logs-mock";
29
- import { getCost, queryCosts } from "./mocks/costs-mock";
30
- import { getAudit, listAuditOperators, queryAudits } from "./mocks/audit-mock";
31
- import {
32
- getDataListItem,
33
- queryDataList,
34
- saveDataListItem,
35
- } from "./mocks/data-list-mock";
36
- import {
37
- queryAvailability,
38
- queryClientUsage,
39
- queryModelUsage,
40
- queryProviderUsage,
41
- } from "./mocks/ops-usage-mock";
42
-
43
- function str(value: unknown): string {
44
- return typeof value === "string" ? value : "";
45
- }
46
-
47
- function opt(value: unknown): string | undefined {
48
- return typeof value === "string" ? value : undefined;
49
- }
50
-
51
- /** 标签 state 键:连字符转下划线(如 team-default → tag_team_default) */
52
- const tagKey = (value: string) => `tag_${value.replace(/-/g, "_")}`;
53
-
54
- /** 快筛值数组:service 直调为数组,http query 序列化后为逗号串;空值返回 undefined */
55
- function strList(value: unknown): string[] | undefined {
56
- if (Array.isArray(value)) {
57
- return value.filter((v): v is string => typeof v === "string" && v !== "");
58
- }
59
- if (typeof value === "string") return value.split(",").filter(Boolean);
60
- return undefined;
61
- }
62
-
63
- export const pactorServices: Record<string, ServiceHandler> = {
64
- "dashboard.query": (params) =>
65
- queryDashboard(str(params.start), str(params.end)),
66
-
67
- // 类型多选:ChipFilter 以 types 数组(http 侧序列化为逗号串)提交;
68
- // 旧版 DSL 一族一个布尔参数的写法保留兼容,这里还原为 family 数组
69
- "provider.list": (params) =>
70
- queryProviders({
71
- keyword: str(params.keyword),
72
- status: str(params.status) || "all",
73
- types:
74
- strList(params.types) ??
75
- ["openai", "anthropic", "gemini", "dashscope"].filter(
76
- (f) => params[f] === true,
77
- ),
78
- }),
79
- "provider.detail": (params) => getProvider(str(params.code)),
80
- "provider.pullModels": (params) => pullProviderModels(str(params.code)),
81
-
82
- // 厂商多选:ChipFilter 以 providers 数组(http 侧序列化为逗号串)提交;
83
- // 旧版 DSL 一个 Provider 一个布尔参数的写法保留兼容
84
- "model.list": (params) =>
85
- queryModels({
86
- type: str(params.type) || "all",
87
- providers:
88
- strList(params.providers) ??
89
- ["dashscope", "gemini", "openai"].filter((p) => params[p] === true),
90
- }),
91
- "model.detail": (params) => getModel(str(params.code)),
92
-
93
- // 标签多选:ChipFilter 以 tags 数组(http 侧序列化为逗号串)提交;
94
- // 旧版 DSL 一个标签一个布尔参数(连字符转下划线)的写法保留兼容
95
- "route.list": (params) =>
96
- queryRoutes({
97
- status: str(params.status) || "all",
98
- type: str(params.type) || "all",
99
- tags:
100
- strList(params.tags) ??
101
- [
102
- ["reasoning", "tag_reasoning"],
103
- ["premium", "tag_premium"],
104
- ["general", "tag_general"],
105
- ["coding", "tag_coding"],
106
- ["low-cost", "tag_low_cost"],
107
- ["mobile", "tag_mobile"],
108
- ["vision", "tag_vision"],
109
- ["embedding", "tag_embedding"],
110
- ]
111
- .filter(([, k]) => params[k] === true)
112
- .map(([t]) => t),
113
- }),
114
- "route.detail": (params) => getRoute(str(params.code)),
115
-
116
- "client.list": (params) =>
117
- queryClients({
118
- status: str(params.status) || "all",
119
- name: str(params.name),
120
- code: str(params.code),
121
- // ChipFilter 以 tags 数组(http 侧为逗号串)提交;旧布尔族写法保留兼容
122
- tags:
123
- strList(params.tags) ??
124
- CLIENT_TAG_FILTERS.filter((t) => params[tagKey(t.value)] === true).map(
125
- (t) => t.value,
126
- ),
127
- }),
128
- "client.detail": (params) => getClient(str(params.code)),
129
-
130
- "clientTemplate.list": (params) =>
131
- queryClientTemplates({
132
- status: str(params.status) || "all",
133
- keyword: str(params.keyword),
134
- tags:
135
- strList(params.tags) ??
136
- CLIENT_TEMPLATE_TAG_FILTERS.filter(
137
- (t) => params[tagKey(t.value)] === true,
138
- ).map((t) => t.value),
139
- }),
140
- "clientTemplate.detail": (params) => getClientTemplate(str(params.code)),
141
- "clientTemplate.createdClients": (params) =>
142
- clientsByTemplate(str(params.code)),
143
-
144
- "callLog.list": (params) =>
145
- queryCallLogs({
146
- start: opt(params.start),
147
- end: opt(params.end),
148
- status: str(params.status) || "all",
149
- model: str(params.model) || "all",
150
- provider: str(params.provider) || "all",
151
- protocol: str(params.protocol) || "all",
152
- routeGroup: str(params.routeGroup) || "all",
153
- email: str(params.email),
154
- appKey: str(params.appKey),
155
- }),
156
- "callLog.detail": (params) => getCallLog(str(params.id)),
157
-
158
- "cost.list": (params) =>
159
- queryCosts({
160
- application: str(params.application),
161
- appKey: str(params.appKey),
162
- alias: str(params.alias),
163
- model: str(params.model) || "all",
164
- provider: str(params.provider) || "all",
165
- start: opt(params.start),
166
- end: opt(params.end),
167
- }),
168
- "cost.detail": (params) => getCost(str(params.id)),
169
-
170
- "audit.list": (params) =>
171
- queryAudits({
172
- start: opt(params.start),
173
- end: opt(params.end),
174
- operator: str(params.operator) || "all",
175
- operation: str(params.operation) || "all",
176
- resourceType: str(params.resourceType) || "all",
177
- resourceId: str(params.resourceId),
178
- }),
179
- "audit.detail": (params) => getAudit(str(params.id)) ?? null,
180
- "audit.operators": () => listAuditOperators(),
181
-
182
- "ops.modelUsage": (params) =>
183
- queryModelUsage({ start: opt(params.start), end: opt(params.end) }),
184
- "ops.providerUsage": (params) =>
185
- queryProviderUsage({ start: opt(params.start), end: opt(params.end) }),
186
- "ops.clientUsage": (params) =>
187
- queryClientUsage({ start: opt(params.start), end: opt(params.end) }),
188
- "ops.availability": (params) =>
189
- queryAvailability({ start: opt(params.start), end: opt(params.end) }),
190
-
191
- // 数据列表骨架示例(yaml/models/data-list.yaml);生成业务列表页时成组复制改名
192
- "dataList.list": (params) =>
193
- queryDataList({
194
- keyword: str(params.keyword),
195
- status: str(params.status) || "all",
196
- }),
197
- "dataList.detail": (params) => getDataListItem(str(params.code)),
198
- "dataList.save": (params) =>
199
- saveDataListItem(params as Parameters<typeof saveDataListItem>[0]),
200
- };