@underdogai/mesh-event-schemas 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/LICENSE +21 -0
- package/README.md +62 -0
- package/dist/apppacks.d.ts +15652 -0
- package/dist/apppacks.d.ts.map +1 -0
- package/dist/apppacks.js +71 -0
- package/dist/apppacks.js.map +1 -0
- package/dist/blocks.d.ts +2320 -0
- package/dist/blocks.d.ts.map +1 -0
- package/dist/blocks.js +472 -0
- package/dist/blocks.js.map +1 -0
- package/dist/capabilities.d.ts +35 -0
- package/dist/capabilities.d.ts.map +1 -0
- package/dist/capabilities.js +37 -0
- package/dist/capabilities.js.map +1 -0
- package/dist/events.d.ts +4557 -0
- package/dist/events.d.ts.map +1 -0
- package/dist/events.js +571 -0
- package/dist/events.js.map +1 -0
- package/dist/index.d.ts +16 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +16 -0
- package/dist/index.js.map +1 -0
- package/dist/namespace.d.ts +56 -0
- package/dist/namespace.d.ts.map +1 -0
- package/dist/namespace.js +60 -0
- package/dist/namespace.js.map +1 -0
- package/dist/plugins.d.ts +131 -0
- package/dist/plugins.d.ts.map +1 -0
- package/dist/plugins.js +66 -0
- package/dist/plugins.js.map +1 -0
- package/dist/registry.d.ts +67 -0
- package/dist/registry.d.ts.map +1 -0
- package/dist/registry.js +212 -0
- package/dist/registry.js.map +1 -0
- package/dist/surfaces.d.ts +54323 -0
- package/dist/surfaces.d.ts.map +1 -0
- package/dist/surfaces.js +523 -0
- package/dist/surfaces.js.map +1 -0
- package/dist/templates.d.ts +390 -0
- package/dist/templates.d.ts.map +1 -0
- package/dist/templates.js +493 -0
- package/dist/templates.js.map +1 -0
- package/package.json +50 -0
- package/src/apppacks.ts +90 -0
- package/src/blocks.ts +544 -0
- package/src/capabilities.ts +58 -0
- package/src/events.ts +758 -0
- package/src/index.ts +15 -0
- package/src/namespace.ts +64 -0
- package/src/plugins.ts +118 -0
- package/src/registry.ts +261 -0
- package/src/surfaces.ts +610 -0
- package/src/templates.ts +736 -0
|
@@ -0,0 +1,493 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Composite 템플릿 — 프리미티브 블록을 조합한 고수준 카드 빌더 (작성자 DX).
|
|
3
|
+
*
|
|
4
|
+
* 작성자는 매번 블록 트리를 손으로 쌓지 않고 templates.approval(...) 처럼 의도 단위로 만든다.
|
|
5
|
+
* registerTemplate() 로 작성자가 자기 템플릿을 등록할 수도 있다(클라이언트 릴리스 불필요 —
|
|
6
|
+
* 템플릿은 프리미티브로 "확장"되어 기존 렌더러가 그대로 그린다).
|
|
7
|
+
*/
|
|
8
|
+
import { buildUiCardContent } from "./events.js";
|
|
9
|
+
const templateRegistry = new Map();
|
|
10
|
+
export function registerTemplate(name, fn) {
|
|
11
|
+
templateRegistry.set(name, fn);
|
|
12
|
+
}
|
|
13
|
+
export function hasTemplate(name) {
|
|
14
|
+
return templateRegistry.has(name);
|
|
15
|
+
}
|
|
16
|
+
export function renderTemplate(name, params) {
|
|
17
|
+
const fn = templateRegistry.get(name);
|
|
18
|
+
if (!fn)
|
|
19
|
+
throw new Error(`Unknown template: ${name}`);
|
|
20
|
+
return fn(params);
|
|
21
|
+
}
|
|
22
|
+
function approval(p) {
|
|
23
|
+
const blocks = [{ type: "fields", items: p.fields }];
|
|
24
|
+
if (p.note)
|
|
25
|
+
blocks.push({ type: "input", name: "note", label: "Note", placeholder: "Optional" });
|
|
26
|
+
blocks.push({
|
|
27
|
+
type: "actions",
|
|
28
|
+
elements: [
|
|
29
|
+
{
|
|
30
|
+
type: "button",
|
|
31
|
+
action_id: "approve",
|
|
32
|
+
text: p.approveText ?? "Approve",
|
|
33
|
+
style: "primary",
|
|
34
|
+
...(p.confirm ? { confirm: { title: "Approve", text: "Approve this?" } } : {}),
|
|
35
|
+
},
|
|
36
|
+
{ type: "button", action_id: "reject", text: p.rejectText ?? "Reject", style: "danger" },
|
|
37
|
+
],
|
|
38
|
+
});
|
|
39
|
+
return buildUiCardContent({
|
|
40
|
+
card_id: p.card_id,
|
|
41
|
+
title: p.title,
|
|
42
|
+
fallback: p.title ?? "Approval request",
|
|
43
|
+
context: p.context,
|
|
44
|
+
blocks,
|
|
45
|
+
});
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* 다단계 승인 카드 (HITL) — 0/N 승인 카운터(metric) + 순차 승인자 타임라인(steps) + 액션.
|
|
49
|
+
* approval.request/.decision 이벤트의 표시면. 승인자 status 가 done/active/error/todo 로 매핑되고
|
|
50
|
+
* approved/required 카운터가 진행도를 보여준다(색-only 회피: 숫자 병기).
|
|
51
|
+
*/
|
|
52
|
+
function multiApproval(p) {
|
|
53
|
+
const required = p.required ?? p.approvers.length;
|
|
54
|
+
const approved = p.approvers.filter((a) => a.status === "approved").length;
|
|
55
|
+
const rejected = p.approvers.some((a) => a.status === "rejected");
|
|
56
|
+
const blocks = [];
|
|
57
|
+
if (p.fields?.length)
|
|
58
|
+
blocks.push({ type: "fields", items: p.fields });
|
|
59
|
+
blocks.push({
|
|
60
|
+
type: "metric",
|
|
61
|
+
label: "Approvals",
|
|
62
|
+
value: `${approved}/${required}`,
|
|
63
|
+
tone: rejected ? "danger" : approved >= required ? "success" : "info",
|
|
64
|
+
});
|
|
65
|
+
blocks.push({
|
|
66
|
+
type: "steps",
|
|
67
|
+
items: p.approvers.map((a) => ({
|
|
68
|
+
label: a.name,
|
|
69
|
+
status: a.status === "approved"
|
|
70
|
+
? "done"
|
|
71
|
+
: a.status === "rejected"
|
|
72
|
+
? "error"
|
|
73
|
+
: a.status === "active"
|
|
74
|
+
? "active"
|
|
75
|
+
: "todo",
|
|
76
|
+
note: a.note,
|
|
77
|
+
})),
|
|
78
|
+
});
|
|
79
|
+
if (p.note)
|
|
80
|
+
blocks.push({ type: "text", text: p.note, markdown: true });
|
|
81
|
+
const row = actionRow(p.actions ?? [
|
|
82
|
+
{ action_id: "approve", text: "Approve", style: "primary" },
|
|
83
|
+
{ action_id: "reject", text: "Reject", style: "danger" },
|
|
84
|
+
]);
|
|
85
|
+
if (row)
|
|
86
|
+
blocks.push(row);
|
|
87
|
+
return buildUiCardContent({
|
|
88
|
+
card_id: p.card_id,
|
|
89
|
+
title: p.title ?? "Approval workflow",
|
|
90
|
+
fallback: p.title ?? `Approval ${approved}/${required}`,
|
|
91
|
+
state: p.state,
|
|
92
|
+
context: p.context,
|
|
93
|
+
blocks,
|
|
94
|
+
});
|
|
95
|
+
}
|
|
96
|
+
/** 작업 상태별 텍스트 라벨(색-only 회피 — 단계 note 에 병기). */
|
|
97
|
+
const TASK_STATUS_LABEL = {
|
|
98
|
+
todo: "To do",
|
|
99
|
+
in_progress: "In progress",
|
|
100
|
+
blocked: "Blocked",
|
|
101
|
+
done: "Done",
|
|
102
|
+
cancelled: "Cancelled",
|
|
103
|
+
};
|
|
104
|
+
/**
|
|
105
|
+
* 작업 상태 → steps 블록 상태(done|active|todo|error) 매핑.
|
|
106
|
+
* blocked→error(빨강·주의 환기)·cancelled→todo(회색·비강조) — 둘은 색이 달라 구분되고, 정확한 상태는
|
|
107
|
+
* 단계 note 텍스트로 병기한다(steps 블록엔 상태 칩이 없어 색만으로 구분 금지 원칙을 텍스트로 충족).
|
|
108
|
+
*/
|
|
109
|
+
const TASK_STEP_STATUS = {
|
|
110
|
+
done: "done",
|
|
111
|
+
in_progress: "active",
|
|
112
|
+
blocked: "error",
|
|
113
|
+
todo: "todo",
|
|
114
|
+
cancelled: "todo",
|
|
115
|
+
};
|
|
116
|
+
/**
|
|
117
|
+
* 작업 진척 카드 (C층 프리미티브) — task.* 이벤트에서 파생한 TaskSummary 를 0/N metric + 전체 progress +
|
|
118
|
+
* 작업별 steps 로 렌더. 공정률·카운트는 모두 summary(데이터)에서 오고 카드는 손데이터를 만들지 않는다
|
|
119
|
+
* (done_when "진척도 실데이터"). 상태는 단계 note 에 텍스트로 병기(접근성). multiApproval(0/N)·checklist 와 동형.
|
|
120
|
+
*/
|
|
121
|
+
function taskList(p) {
|
|
122
|
+
const s = p.summary;
|
|
123
|
+
// 완료 카운터의 분모는 공정률과 같은 기준(cancelled 제외) — "1/4"와 25% 가 어긋나지 않게.
|
|
124
|
+
const countable = s.total - s.cancelled;
|
|
125
|
+
const blocks = [
|
|
126
|
+
{
|
|
127
|
+
type: "metric",
|
|
128
|
+
label: "Done",
|
|
129
|
+
value: `${s.done}/${countable}`,
|
|
130
|
+
tone: s.percent === 100 && countable > 0 ? "success" : s.byStatus.blocked > 0 ? "warning" : "info",
|
|
131
|
+
},
|
|
132
|
+
{ type: "progress", value: s.percent, label: `${s.percent}% complete` },
|
|
133
|
+
{
|
|
134
|
+
type: "steps",
|
|
135
|
+
items: s.tasks.map((t) => {
|
|
136
|
+
// note = 상태 라벨(색-only 회피) + (진행 중이면 %) + 담당자 + 메모 — 한 줄 맥락.
|
|
137
|
+
const parts = [TASK_STATUS_LABEL[t.status]];
|
|
138
|
+
if (t.status === "in_progress" && t.progress != null)
|
|
139
|
+
parts.push(`${t.progress}%`);
|
|
140
|
+
if (t.assignees?.length)
|
|
141
|
+
parts.push(t.assignees.join(", "));
|
|
142
|
+
if (t.note)
|
|
143
|
+
parts.push(t.note);
|
|
144
|
+
return { label: t.title, status: TASK_STEP_STATUS[t.status], note: parts.join(" · ") };
|
|
145
|
+
}),
|
|
146
|
+
},
|
|
147
|
+
];
|
|
148
|
+
const row = actionRow(p.actions);
|
|
149
|
+
if (row)
|
|
150
|
+
blocks.push(row);
|
|
151
|
+
return buildUiCardContent({
|
|
152
|
+
card_id: p.card_id,
|
|
153
|
+
title: p.title ?? "Tasks",
|
|
154
|
+
// fallback 도 카드 metric 과 같은 분모(cancelled 제외)를 써 미지원 클라에서도 카운트가 일치한다.
|
|
155
|
+
fallback: p.title ?? `${s.done}/${countable} tasks done`,
|
|
156
|
+
state: p.state,
|
|
157
|
+
context: p.context,
|
|
158
|
+
blocks,
|
|
159
|
+
});
|
|
160
|
+
}
|
|
161
|
+
function wizard(p) {
|
|
162
|
+
return buildUiCardContent({
|
|
163
|
+
card_id: p.card_id,
|
|
164
|
+
title: p.title,
|
|
165
|
+
fallback: p.title ?? "Step-by-step form",
|
|
166
|
+
steps: p.steps,
|
|
167
|
+
blocks: [
|
|
168
|
+
{
|
|
169
|
+
type: "actions",
|
|
170
|
+
elements: [
|
|
171
|
+
{ type: "button", action_id: p.submitId ?? "submit", text: p.submitText ?? "Submit", style: "primary" },
|
|
172
|
+
],
|
|
173
|
+
},
|
|
174
|
+
],
|
|
175
|
+
});
|
|
176
|
+
}
|
|
177
|
+
function list(p) {
|
|
178
|
+
return buildUiCardContent({
|
|
179
|
+
card_id: p.card_id,
|
|
180
|
+
title: p.title,
|
|
181
|
+
fallback: p.title ?? "List",
|
|
182
|
+
blocks: [{ type: "table", columns: p.columns, rows: p.rows }],
|
|
183
|
+
});
|
|
184
|
+
}
|
|
185
|
+
function progress(p) {
|
|
186
|
+
const blocks = [{ type: "progress", value: p.value, label: p.label }];
|
|
187
|
+
if (p.steps)
|
|
188
|
+
blocks.push({ type: "steps", items: p.steps });
|
|
189
|
+
return buildUiCardContent({
|
|
190
|
+
card_id: p.card_id,
|
|
191
|
+
title: p.title,
|
|
192
|
+
fallback: p.title ?? "Progress",
|
|
193
|
+
state: p.state,
|
|
194
|
+
blocks,
|
|
195
|
+
});
|
|
196
|
+
}
|
|
197
|
+
/** 정보/조사 결과 카드 — (선택) badge + 키-값 fields + (선택) 메모 텍스트. */
|
|
198
|
+
function info(p) {
|
|
199
|
+
const blocks = [];
|
|
200
|
+
if (p.badge)
|
|
201
|
+
blocks.push({ type: "badge", text: p.badge.text, tone: p.badge.tone });
|
|
202
|
+
blocks.push({ type: "fields", items: p.fields });
|
|
203
|
+
if (p.note)
|
|
204
|
+
blocks.push({ type: "text", text: p.note, markdown: true });
|
|
205
|
+
return buildUiCardContent({
|
|
206
|
+
card_id: p.card_id,
|
|
207
|
+
title: p.title,
|
|
208
|
+
fallback: p.title ?? "Info",
|
|
209
|
+
context: p.context,
|
|
210
|
+
blocks,
|
|
211
|
+
});
|
|
212
|
+
}
|
|
213
|
+
/** 문서/파일 카드 — 파일명·메타 fields + (선택) 요약 + 미리보기 액션. */
|
|
214
|
+
function doc(p) {
|
|
215
|
+
const items = [{ label: "File", value: p.fileName, short: true }];
|
|
216
|
+
if (p.fileMeta)
|
|
217
|
+
items.push({ label: "Details", value: p.fileMeta, short: true });
|
|
218
|
+
const blocks = [{ type: "fields", items }];
|
|
219
|
+
if (p.summary)
|
|
220
|
+
blocks.push({ type: "text", text: p.summary });
|
|
221
|
+
blocks.push({
|
|
222
|
+
type: "actions",
|
|
223
|
+
elements: [{ type: "button", action_id: p.previewId ?? "preview", text: p.previewText ?? "Preview" }],
|
|
224
|
+
});
|
|
225
|
+
return buildUiCardContent({
|
|
226
|
+
card_id: p.card_id,
|
|
227
|
+
title: p.title,
|
|
228
|
+
fallback: p.title ?? p.fileName,
|
|
229
|
+
context: p.context,
|
|
230
|
+
blocks,
|
|
231
|
+
});
|
|
232
|
+
}
|
|
233
|
+
/** 에이전트 실행 계획 카드 — progress + steps 타임라인 (Agent Plan). */
|
|
234
|
+
function plan(p) {
|
|
235
|
+
return buildUiCardContent({
|
|
236
|
+
card_id: p.card_id,
|
|
237
|
+
title: p.title,
|
|
238
|
+
fallback: p.title ?? "Execution plan",
|
|
239
|
+
context: p.context,
|
|
240
|
+
blocks: [
|
|
241
|
+
// tone 미지정 → 기본 브랜드(보라) 채움. info 톤이 필요하면 호출부에서 지정. (DESIGN.md §5.5)
|
|
242
|
+
{ type: "progress", value: p.value, label: p.label },
|
|
243
|
+
{ type: "steps", items: p.steps },
|
|
244
|
+
],
|
|
245
|
+
});
|
|
246
|
+
}
|
|
247
|
+
/** 단일 단계 입력 폼 카드 — 임의 입력 블록 + 제출 액션(마법사 wizard 와 달리 단일 화면). */
|
|
248
|
+
function form(p) {
|
|
249
|
+
return buildUiCardContent({
|
|
250
|
+
card_id: p.card_id,
|
|
251
|
+
title: p.title,
|
|
252
|
+
fallback: p.title ?? "Form",
|
|
253
|
+
context: p.context,
|
|
254
|
+
blocks: [
|
|
255
|
+
...p.blocks,
|
|
256
|
+
{
|
|
257
|
+
type: "actions",
|
|
258
|
+
elements: [
|
|
259
|
+
{ type: "button", action_id: p.submitId ?? "submit", text: p.submitText ?? "Submit", style: "primary" },
|
|
260
|
+
],
|
|
261
|
+
},
|
|
262
|
+
],
|
|
263
|
+
});
|
|
264
|
+
}
|
|
265
|
+
/** 진척도·임팩트 스코어카드 — 공정률(progress) + 기준 체크리스트 + 임팩트 KPI(metric). */
|
|
266
|
+
function scorecard(p) {
|
|
267
|
+
const blocks = [];
|
|
268
|
+
if (p.progress != null || p.progressLabel) {
|
|
269
|
+
blocks.push({ type: "progress", value: p.progress, label: p.progressLabel });
|
|
270
|
+
}
|
|
271
|
+
for (const m of p.metrics ?? []) {
|
|
272
|
+
blocks.push({ type: "metric", label: m.label, value: m.value, target: m.target, delta: m.delta, tone: m.tone });
|
|
273
|
+
}
|
|
274
|
+
if (p.criteria?.length) {
|
|
275
|
+
blocks.push({
|
|
276
|
+
type: "steps",
|
|
277
|
+
items: p.criteria.map((c) => ({ label: c.label, status: c.done ? "done" : "todo" })),
|
|
278
|
+
});
|
|
279
|
+
}
|
|
280
|
+
return buildUiCardContent({
|
|
281
|
+
card_id: p.card_id,
|
|
282
|
+
title: p.title ?? "Progress · Impact",
|
|
283
|
+
fallback: p.title ?? "Progress/Impact",
|
|
284
|
+
context: p.context,
|
|
285
|
+
blocks,
|
|
286
|
+
});
|
|
287
|
+
}
|
|
288
|
+
/** ActionDef[] → actions 블록(없으면 null). */
|
|
289
|
+
function actionRow(actions) {
|
|
290
|
+
if (!actions?.length)
|
|
291
|
+
return null;
|
|
292
|
+
return {
|
|
293
|
+
type: "actions",
|
|
294
|
+
elements: actions.map((a) => ({ type: "button", action_id: a.action_id, text: a.text, style: a.style, value: a.value })),
|
|
295
|
+
};
|
|
296
|
+
}
|
|
297
|
+
/** 인물 카드 — 아바타 + 연락 fields + (선택) 엔티티 칩 + 액션. */
|
|
298
|
+
function contactCard(p) {
|
|
299
|
+
const blocks = [{ type: "avatar", name: p.name, subtitle: p.role, status: p.status }];
|
|
300
|
+
if (p.fields?.length)
|
|
301
|
+
blocks.push({ type: "fields", items: p.fields });
|
|
302
|
+
if (p.ref)
|
|
303
|
+
blocks.push({ type: "entityRef", entity: p.ref.entity, label: p.ref.label, url: p.ref.url, tone: "info" });
|
|
304
|
+
const row = actionRow(p.actions);
|
|
305
|
+
if (row)
|
|
306
|
+
blocks.push(row);
|
|
307
|
+
return buildUiCardContent({ card_id: p.card_id, title: p.title, fallback: p.title ?? p.name, context: p.context, blocks });
|
|
308
|
+
}
|
|
309
|
+
/** AI 브리핑 카드 — 요약 + 포인트 + 출처 칩 + 액션. */
|
|
310
|
+
function digest(p) {
|
|
311
|
+
const blocks = [{ type: "text", text: p.summary, markdown: true }];
|
|
312
|
+
if (p.points?.length)
|
|
313
|
+
blocks.push({ type: "text", text: p.points.map((pt) => `- ${pt}`).join("\n"), markdown: true });
|
|
314
|
+
if (p.sources?.length) {
|
|
315
|
+
blocks.push({ type: "context", elements: ["Sources"] });
|
|
316
|
+
for (const s of p.sources)
|
|
317
|
+
blocks.push({ type: "entityRef", entity: "source", label: s.label, url: s.url });
|
|
318
|
+
}
|
|
319
|
+
const row = actionRow(p.actions);
|
|
320
|
+
if (row)
|
|
321
|
+
blocks.push(row);
|
|
322
|
+
return buildUiCardContent({ card_id: p.card_id, title: p.title, fallback: p.title ?? "Digest", context: p.context, blocks });
|
|
323
|
+
}
|
|
324
|
+
/** 인시던트 카드 — 심각도 콜아웃 + 메타 fields + 대응 steps + 액션. */
|
|
325
|
+
function incident(p) {
|
|
326
|
+
const blocks = [
|
|
327
|
+
{ type: "callout", tone: p.tone ?? "warning", title: p.severity ?? "Incident", text: p.summary ?? p.title ?? "Incident reported" },
|
|
328
|
+
];
|
|
329
|
+
if (p.fields?.length)
|
|
330
|
+
blocks.push({ type: "fields", items: p.fields });
|
|
331
|
+
if (p.steps?.length)
|
|
332
|
+
blocks.push({ type: "steps", items: p.steps });
|
|
333
|
+
const row = actionRow(p.actions);
|
|
334
|
+
if (row)
|
|
335
|
+
blocks.push(row);
|
|
336
|
+
return buildUiCardContent({ card_id: p.card_id, title: p.title, fallback: p.title ?? p.severity ?? "Incident", context: p.context, blocks });
|
|
337
|
+
}
|
|
338
|
+
/** KPI 그리드 카드 — metric 묶음 + (선택) 추세 차트. */
|
|
339
|
+
function kpiGrid(p) {
|
|
340
|
+
const blocks = p.metrics.map((m) => ({
|
|
341
|
+
type: "metric",
|
|
342
|
+
label: m.label,
|
|
343
|
+
value: m.value,
|
|
344
|
+
target: m.target,
|
|
345
|
+
delta: m.delta,
|
|
346
|
+
tone: m.tone,
|
|
347
|
+
}));
|
|
348
|
+
if (p.chart) {
|
|
349
|
+
blocks.push({ type: "chart", variant: p.chart.variant, data: p.chart.data, caption: p.chart.caption, unit: p.chart.unit });
|
|
350
|
+
}
|
|
351
|
+
return buildUiCardContent({ card_id: p.card_id, title: p.title, fallback: p.title ?? "KPIs", context: p.context, blocks });
|
|
352
|
+
}
|
|
353
|
+
/** 송장 카드 — 금액·기한 등 fields + (선택) 상태 배지 + 승인/반려 액션. */
|
|
354
|
+
function invoice(p) {
|
|
355
|
+
const blocks = [];
|
|
356
|
+
if (p.status)
|
|
357
|
+
blocks.push({ type: "badge", text: p.status.label, tone: p.status.tone });
|
|
358
|
+
const items = [];
|
|
359
|
+
if (p.number)
|
|
360
|
+
items.push({ label: "Invoice", value: p.number, short: true });
|
|
361
|
+
if (p.vendor)
|
|
362
|
+
items.push({ label: "Vendor", value: p.vendor, short: true });
|
|
363
|
+
items.push({ label: "Amount", value: p.amount, short: true });
|
|
364
|
+
if (p.due)
|
|
365
|
+
items.push({ label: "Due", value: p.due, short: true });
|
|
366
|
+
blocks.push({ type: "fields", items });
|
|
367
|
+
const row = actionRow(p.actions ?? [
|
|
368
|
+
{ action_id: "approve", text: "Approve", style: "primary" },
|
|
369
|
+
{ action_id: "reject", text: "Reject", style: "danger" },
|
|
370
|
+
]);
|
|
371
|
+
if (row)
|
|
372
|
+
blocks.push(row);
|
|
373
|
+
return buildUiCardContent({ card_id: p.card_id, title: p.title, fallback: p.title ?? `Invoice ${p.number ?? ""}`.trim(), context: p.context, blocks });
|
|
374
|
+
}
|
|
375
|
+
/** 견적 카드 — 라인아이템 table + (선택) 합계 metric + 액션. */
|
|
376
|
+
function estimate(p) {
|
|
377
|
+
const blocks = [
|
|
378
|
+
{ type: "table", columns: ["Item", "Qty", "Amount"], rows: p.lines.map((l) => [l.label, l.qty ?? "", l.amount]) },
|
|
379
|
+
];
|
|
380
|
+
if (p.total)
|
|
381
|
+
blocks.push({ type: "metric", label: "Total", value: p.total, tone: "info" });
|
|
382
|
+
if (p.note)
|
|
383
|
+
blocks.push({ type: "text", text: p.note });
|
|
384
|
+
const row = actionRow(p.actions);
|
|
385
|
+
if (row)
|
|
386
|
+
blocks.push(row);
|
|
387
|
+
return buildUiCardContent({ card_id: p.card_id, title: p.title, fallback: p.title ?? "Estimate", context: p.context, blocks });
|
|
388
|
+
}
|
|
389
|
+
/** 비교 카드 — A vs B 표(첫 열=기준, 나머지=옵션 값). */
|
|
390
|
+
function comparison(p) {
|
|
391
|
+
const blocks = [
|
|
392
|
+
{ type: "table", columns: ["", ...p.options], rows: p.rows.map((r) => [r.label, ...r.values]) },
|
|
393
|
+
];
|
|
394
|
+
return buildUiCardContent({ card_id: p.card_id, title: p.title, fallback: p.title ?? "Comparison", context: p.context, blocks });
|
|
395
|
+
}
|
|
396
|
+
/** 체크리스트 카드 — (선택) 담당 아바타 + 진행률 progress + 항목 steps(done/todo). */
|
|
397
|
+
function checklist(p) {
|
|
398
|
+
const total = p.items.length;
|
|
399
|
+
const done = p.items.filter((i) => i.done).length;
|
|
400
|
+
const pct = total ? Math.round((done / total) * 100) : 0;
|
|
401
|
+
const blocks = [];
|
|
402
|
+
if (p.owner)
|
|
403
|
+
blocks.push({ type: "avatar", name: p.owner, subtitle: `Owner · ${done}/${total} done` });
|
|
404
|
+
blocks.push({ type: "progress", value: pct, label: `${done}/${total} complete` });
|
|
405
|
+
blocks.push({
|
|
406
|
+
type: "steps",
|
|
407
|
+
items: p.items.map((i) => ({ label: i.label, status: i.done ? "done" : "todo", note: i.note })),
|
|
408
|
+
});
|
|
409
|
+
return buildUiCardContent({ card_id: p.card_id, title: p.title, fallback: p.title ?? "Checklist", context: p.context, blocks });
|
|
410
|
+
}
|
|
411
|
+
/** 회의 카드 — 안건/일시 fields + 참석자 avatarGroup + (선택) 시간 후보 radio + 확정 액션. */
|
|
412
|
+
function meeting(p) {
|
|
413
|
+
const blocks = [];
|
|
414
|
+
const items = [];
|
|
415
|
+
if (p.agenda)
|
|
416
|
+
items.push({ label: "Agenda", value: p.agenda });
|
|
417
|
+
if (p.when)
|
|
418
|
+
items.push({ label: "When", value: p.when, short: true });
|
|
419
|
+
if (p.duration)
|
|
420
|
+
items.push({ label: "Duration", value: p.duration, short: true });
|
|
421
|
+
if (items.length)
|
|
422
|
+
blocks.push({ type: "fields", items });
|
|
423
|
+
if (p.attendees?.length)
|
|
424
|
+
blocks.push({ type: "avatarGroup", label: "Attendees", people: p.attendees.map((a) => ({ name: a })) });
|
|
425
|
+
if (p.options?.length) {
|
|
426
|
+
blocks.push({ type: "radio", name: "slot", label: "Pick a slot", options: p.options, value: p.options[0]?.value });
|
|
427
|
+
}
|
|
428
|
+
blocks.push({
|
|
429
|
+
type: "actions",
|
|
430
|
+
elements: [{ type: "button", action_id: "confirm_schedule", text: p.confirmText ?? "Confirm time", style: "primary" }],
|
|
431
|
+
});
|
|
432
|
+
return buildUiCardContent({ card_id: p.card_id, title: p.title, fallback: p.title ?? "Meeting", context: p.context, blocks });
|
|
433
|
+
}
|
|
434
|
+
/** 오류 복구 카드 — danger 콜아웃 + (선택) 상세 code + Retry/Escalate 액션. */
|
|
435
|
+
function errorRecovery(p) {
|
|
436
|
+
const blocks = [{ type: "callout", tone: "danger", title: p.title ?? "Something went wrong", text: p.message }];
|
|
437
|
+
if (p.detail)
|
|
438
|
+
blocks.push({ type: "code", code: p.detail });
|
|
439
|
+
blocks.push({
|
|
440
|
+
type: "actions",
|
|
441
|
+
elements: [
|
|
442
|
+
{ type: "button", action_id: "retry", text: p.retryText ?? "Retry", style: "primary" },
|
|
443
|
+
{ type: "button", action_id: "escalate", text: p.escalateText ?? "Escalate" },
|
|
444
|
+
],
|
|
445
|
+
});
|
|
446
|
+
return buildUiCardContent({ card_id: p.card_id, title: p.title, fallback: p.title ?? "Error", context: p.context, blocks });
|
|
447
|
+
}
|
|
448
|
+
/** 내장 템플릿 모음 (타입드 SDK 진입점). */
|
|
449
|
+
export const templates = {
|
|
450
|
+
approval,
|
|
451
|
+
multiApproval,
|
|
452
|
+
taskList,
|
|
453
|
+
wizard,
|
|
454
|
+
list,
|
|
455
|
+
progress,
|
|
456
|
+
info,
|
|
457
|
+
doc,
|
|
458
|
+
plan,
|
|
459
|
+
form,
|
|
460
|
+
scorecard,
|
|
461
|
+
contactCard,
|
|
462
|
+
digest,
|
|
463
|
+
incident,
|
|
464
|
+
kpiGrid,
|
|
465
|
+
invoice,
|
|
466
|
+
estimate,
|
|
467
|
+
comparison,
|
|
468
|
+
checklist,
|
|
469
|
+
meeting,
|
|
470
|
+
errorRecovery,
|
|
471
|
+
};
|
|
472
|
+
registerTemplate("approval", approval);
|
|
473
|
+
registerTemplate("multiApproval", multiApproval);
|
|
474
|
+
registerTemplate("taskList", taskList);
|
|
475
|
+
registerTemplate("wizard", wizard);
|
|
476
|
+
registerTemplate("list", list);
|
|
477
|
+
registerTemplate("progress", progress);
|
|
478
|
+
registerTemplate("info", info);
|
|
479
|
+
registerTemplate("doc", doc);
|
|
480
|
+
registerTemplate("plan", plan);
|
|
481
|
+
registerTemplate("form", form);
|
|
482
|
+
registerTemplate("scorecard", scorecard);
|
|
483
|
+
registerTemplate("contactCard", contactCard);
|
|
484
|
+
registerTemplate("digest", digest);
|
|
485
|
+
registerTemplate("incident", incident);
|
|
486
|
+
registerTemplate("kpiGrid", kpiGrid);
|
|
487
|
+
registerTemplate("invoice", invoice);
|
|
488
|
+
registerTemplate("estimate", estimate);
|
|
489
|
+
registerTemplate("comparison", comparison);
|
|
490
|
+
registerTemplate("checklist", checklist);
|
|
491
|
+
registerTemplate("meeting", meeting);
|
|
492
|
+
registerTemplate("errorRecovery", errorRecovery);
|
|
493
|
+
//# sourceMappingURL=templates.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"templates.js","sourceRoot":"","sources":["../src/templates.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@underdogai/mesh-event-schemas",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "@underdogai/mesh-app-sdk 가 쓰는 이벤트·UI 블록 스키마(zod) — 카드/서피스 와이어 포맷의 단일 진실 공급원.",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "./dist/index.js",
|
|
7
|
+
"types": "./dist/index.d.ts",
|
|
8
|
+
"exports": {
|
|
9
|
+
".": {
|
|
10
|
+
"types": "./dist/index.d.ts",
|
|
11
|
+
"import": "./dist/index.js",
|
|
12
|
+
"default": "./dist/index.js"
|
|
13
|
+
}
|
|
14
|
+
},
|
|
15
|
+
"files": [
|
|
16
|
+
"dist",
|
|
17
|
+
"src"
|
|
18
|
+
],
|
|
19
|
+
"publishConfig": {
|
|
20
|
+
"access": "public"
|
|
21
|
+
},
|
|
22
|
+
"dependencies": {
|
|
23
|
+
"zod": "^3.23.8"
|
|
24
|
+
},
|
|
25
|
+
"devDependencies": {
|
|
26
|
+
"typescript": "^5.6.3"
|
|
27
|
+
},
|
|
28
|
+
"license": "MIT",
|
|
29
|
+
"author": "Underdog",
|
|
30
|
+
"keywords": [
|
|
31
|
+
"matrix",
|
|
32
|
+
"chatops",
|
|
33
|
+
"zod",
|
|
34
|
+
"schema",
|
|
35
|
+
"event-schema"
|
|
36
|
+
],
|
|
37
|
+
"homepage": "https://chatops.theunderdog.ai/sdk-guide",
|
|
38
|
+
"repository": {
|
|
39
|
+
"type": "git",
|
|
40
|
+
"url": "https://forgejo.taildff74c.ts.net:3000/Underdog/ChatOps.git",
|
|
41
|
+
"directory": "packages/event-schemas"
|
|
42
|
+
},
|
|
43
|
+
"engines": {
|
|
44
|
+
"node": ">=20"
|
|
45
|
+
},
|
|
46
|
+
"scripts": {
|
|
47
|
+
"build": "tsc -p tsconfig.json",
|
|
48
|
+
"typecheck": "tsc -p tsconfig.json --noEmit"
|
|
49
|
+
}
|
|
50
|
+
}
|
package/src/apppacks.ts
ADDED
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* App Pack 레지스트리 — 도메인 1개(CRM·Forgejo·프로젝트…)를 클라이언트에 가르치는 선언형 번들.
|
|
3
|
+
*
|
|
4
|
+
* 카드의 templateRegistry(templates.ts) / 블록의 registerBlock(ui-blocks)과 같은 "확장 봉합선"을,
|
|
5
|
+
* 룸 단위 셸 서피스로 일반화한 것이다. 룸이 선언한 바인딩(app)에 따라 클라이언트가 팩을 골라
|
|
6
|
+
* 컨텍스트 패널 등 서피스를 렌더한다. 새 SaaS 단위 = 새 팩(데이터) — 클라이언트 포크가 아니다.
|
|
7
|
+
*
|
|
8
|
+
* (panel + 선택 header/canvas 를 담는다. 사이드바 섹션 스펙은 후속. docs/extensibility.md §10)
|
|
9
|
+
*
|
|
10
|
+
* registerAppPack 은 등록 시점에 zod 로 검증한다 → 깨진/외부 공급 팩이 클라를 못 깨게(거부 + 경고).
|
|
11
|
+
*/
|
|
12
|
+
import { z } from "zod";
|
|
13
|
+
import {
|
|
14
|
+
AgentDockSpecSchema,
|
|
15
|
+
CanvasSpecSchema,
|
|
16
|
+
CommandPaletteSpecSchema,
|
|
17
|
+
ComposerSpecSchema,
|
|
18
|
+
HeaderSpecSchema,
|
|
19
|
+
ModalSpecSchema,
|
|
20
|
+
ObjectMapSpecSchema,
|
|
21
|
+
PanelSpecSchema,
|
|
22
|
+
SidebarSectionSpecSchema,
|
|
23
|
+
} from "./surfaces.js";
|
|
24
|
+
|
|
25
|
+
/** App Pack 스키마 — 한 도메인의 셸 서피스(헤더·캔버스·패널) 전체를 선언형으로 기술. */
|
|
26
|
+
export const AppPackSchema = z.object({
|
|
27
|
+
/** 룸 바인딩(org.corp.room.binding)의 app 키와 일치 */
|
|
28
|
+
app: z.string().min(1),
|
|
29
|
+
/** 사람이 읽는 이름 */
|
|
30
|
+
displayName: z.string().optional(),
|
|
31
|
+
/** 이 팩이 다루는 엔티티 타입(예: ["lead"], ["repo","pr","issue"]) */
|
|
32
|
+
entityTypes: z.string().array(),
|
|
33
|
+
/** 컨텍스트 패널 선언형 스펙 */
|
|
34
|
+
panel: PanelSpecSchema,
|
|
35
|
+
/** 룸 헤더(제목·메타·파이프라인) 선언형 스펙 */
|
|
36
|
+
header: HeaderSpecSchema.optional(),
|
|
37
|
+
/** 이벤트 캔버스(보드) 선언형 스펙 */
|
|
38
|
+
canvas: CanvasSpecSchema.optional(),
|
|
39
|
+
/** 우측 에이전트 도크(런 + 도메인 서비스) 선언형 스펙 — M3 셸 확장(패널 외 셸 영역 기여) */
|
|
40
|
+
dock: AgentDockSpecSchema.optional(),
|
|
41
|
+
/** 좌측 레일 사이드바 섹션(도메인 네비게이션) — M3 셸 확장. 팩이 여러 섹션을 기여. */
|
|
42
|
+
sidebar: SidebarSectionSpecSchema.array().optional(),
|
|
43
|
+
/** 컴포저(입력창) 어휘 — 슬래시 명령·퀵액션·@엔티티 자동완성. M3 셸 확장. */
|
|
44
|
+
composer: ComposerSpecSchema.optional(),
|
|
45
|
+
/** ⌘K 커맨드 팔레트 엔트리(도메인 액션) — M3 셸 확장. */
|
|
46
|
+
commandPalette: CommandPaletteSpecSchema.optional(),
|
|
47
|
+
/** 객체 맵 — 엔티티 관계 그래프("객체 맵" 탭/캔버스). M3 셸 확장. */
|
|
48
|
+
objectMap: ObjectMapSpecSchema.optional(),
|
|
49
|
+
/** 선언형 모달/시트(확인 다이얼로그) — 같은 id 의 셸 액션이 열고, 확인 시 confirm.action_id 발행. */
|
|
50
|
+
modals: ModalSpecSchema.array().optional(),
|
|
51
|
+
});
|
|
52
|
+
export type AppPack = z.infer<typeof AppPackSchema>;
|
|
53
|
+
|
|
54
|
+
/** registerAppPack 결과 — 깨진 팩은 등록되지 않고 이슈를 돌려준다(호출측이 가시화). */
|
|
55
|
+
export type AppPackRegistration =
|
|
56
|
+
| { ok: true; app: string }
|
|
57
|
+
| { ok: false; app: string; issues: string[] };
|
|
58
|
+
|
|
59
|
+
const registry = new Map<string, AppPack>();
|
|
60
|
+
|
|
61
|
+
/** 환경에 console 이 있으면 경고를 남긴다(이 패키지는 서버/클라/MCP 공용이라 직접 의존하지 않는다). */
|
|
62
|
+
function warn(message: string): void {
|
|
63
|
+
const c = (globalThis as { console?: { warn?: (...args: unknown[]) => void } }).console;
|
|
64
|
+
c?.warn?.(message);
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
/**
|
|
68
|
+
* App Pack 을 검증 후 등록한다. 깨진 팩(잘못된 panel/header/canvas 등)은 거부 + 경고하고
|
|
69
|
+
* 등록하지 않는다 → 외부/작성자 공급 데이터가 클라를 깨지 못한다(graceful). 정상 in-repo 팩은 통과.
|
|
70
|
+
*/
|
|
71
|
+
export function registerAppPack(pack: AppPack): AppPackRegistration {
|
|
72
|
+
const parsed = AppPackSchema.safeParse(pack);
|
|
73
|
+
if (!parsed.success) {
|
|
74
|
+
const app = typeof (pack as { app?: unknown } | null)?.app === "string" ? (pack as { app: string }).app : "<unknown>";
|
|
75
|
+
const issues = parsed.error.issues.map((i) => `${i.path.join(".") || "(root)"}: ${i.message}`);
|
|
76
|
+
warn(`[apppacks] 잘못된 App Pack 거부: ${app} — ${issues.join("; ")}`);
|
|
77
|
+
return { ok: false, app, issues };
|
|
78
|
+
}
|
|
79
|
+
registry.set(parsed.data.app, parsed.data);
|
|
80
|
+
return { ok: true, app: parsed.data.app };
|
|
81
|
+
}
|
|
82
|
+
export function getAppPack(app: string): AppPack | undefined {
|
|
83
|
+
return registry.get(app);
|
|
84
|
+
}
|
|
85
|
+
export function hasAppPack(app: string): boolean {
|
|
86
|
+
return registry.has(app);
|
|
87
|
+
}
|
|
88
|
+
export function listAppPacks(): AppPack[] {
|
|
89
|
+
return [...registry.values()];
|
|
90
|
+
}
|