@vibesdotdev/integrations-miro 0.0.0-stage → 1.0.0-rc.1
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 +126 -0
- package/README.md +52 -2
- package/dist/client/helper.d.ts +5 -0
- package/dist/client/helper.d.ts.map +1 -0
- package/dist/client/helper.js +6 -0
- package/dist/client/helper.js.map +1 -0
- package/dist/client/index.d.ts +3 -0
- package/dist/client/index.d.ts.map +1 -0
- package/dist/client/index.js +3 -0
- package/dist/client/index.js.map +1 -0
- package/dist/client/runtime-client.d.ts +36 -0
- package/dist/client/runtime-client.d.ts.map +1 -0
- package/dist/client/runtime-client.js +108 -0
- package/dist/client/runtime-client.js.map +1 -0
- package/dist/docs/integrations-miro.docs.descriptor.d.ts +19 -0
- package/dist/docs/integrations-miro.docs.descriptor.d.ts.map +1 -0
- package/dist/docs/integrations-miro.docs.descriptor.js +47 -0
- package/dist/docs/integrations-miro.docs.descriptor.js.map +1 -0
- package/dist/index.d.ts +12 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +10 -0
- package/dist/index.js.map +1 -0
- package/dist/integrations-miro.plugin.d.ts +4 -0
- package/dist/integrations-miro.plugin.d.ts.map +1 -0
- package/dist/integrations-miro.plugin.js +22 -0
- package/dist/integrations-miro.plugin.js.map +1 -0
- package/dist/miro/errors.d.ts +10 -0
- package/dist/miro/errors.d.ts.map +1 -0
- package/dist/miro/errors.js +23 -0
- package/dist/miro/errors.js.map +1 -0
- package/dist/miro/index.d.ts +7 -0
- package/dist/miro/index.d.ts.map +1 -0
- package/dist/miro/index.js +5 -0
- package/dist/miro/index.js.map +1 -0
- package/dist/miro/miro-client.d.ts +22 -0
- package/dist/miro/miro-client.d.ts.map +1 -0
- package/dist/miro/miro-client.js +225 -0
- package/dist/miro/miro-client.js.map +1 -0
- package/dist/miro/miro-implementation.d.ts +17 -0
- package/dist/miro/miro-implementation.d.ts.map +1 -0
- package/dist/miro/miro-implementation.js +108 -0
- package/dist/miro/miro-implementation.js.map +1 -0
- package/dist/miro/miro-schemas.d.ts +2 -0
- package/dist/miro/miro-schemas.d.ts.map +1 -0
- package/dist/miro/miro-schemas.js +2 -0
- package/dist/miro/miro-schemas.js.map +1 -0
- package/dist/miro/system.integration.miro.descriptor.d.ts +69 -0
- package/dist/miro/system.integration.miro.descriptor.d.ts.map +1 -0
- package/dist/miro/system.integration.miro.descriptor.js +109 -0
- package/dist/miro/system.integration.miro.descriptor.js.map +1 -0
- package/dist/miro.catalog.plugin.d.ts +78 -0
- package/dist/miro.catalog.plugin.d.ts.map +1 -0
- package/dist/miro.catalog.plugin.js +21 -0
- package/dist/miro.catalog.plugin.js.map +1 -0
- package/dist/miro.client.plugin.d.ts +9 -0
- package/dist/miro.client.plugin.d.ts.map +1 -0
- package/dist/miro.client.plugin.js +38 -0
- package/dist/miro.client.plugin.js.map +1 -0
- package/dist/schemas/http.d.ts +42 -0
- package/dist/schemas/http.d.ts.map +1 -0
- package/dist/schemas/http.js +33 -0
- package/dist/schemas/http.js.map +1 -0
- package/dist/schemas/miro.d.ts +445 -0
- package/dist/schemas/miro.d.ts.map +1 -0
- package/dist/schemas/miro.js +171 -0
- package/dist/schemas/miro.js.map +1 -0
- package/dist/schemas/oauth.d.ts +136 -0
- package/dist/schemas/oauth.d.ts.map +1 -0
- package/dist/schemas/oauth.js +42 -0
- package/dist/schemas/oauth.js.map +1 -0
- package/dist/schemas/operations.d.ts +540 -0
- package/dist/schemas/operations.d.ts.map +1 -0
- package/dist/schemas/operations.js +58 -0
- package/dist/schemas/operations.js.map +1 -0
- package/dist/schemas/sync.d.ts +340 -0
- package/dist/schemas/sync.d.ts.map +1 -0
- package/dist/schemas/sync.js +40 -0
- package/dist/schemas/sync.js.map +1 -0
- package/dist/schemas/tools.d.ts +533 -0
- package/dist/schemas/tools.d.ts.map +1 -0
- package/dist/schemas/tools.js +58 -0
- package/dist/schemas/tools.js.map +1 -0
- package/dist/server/oauth.d.ts +17 -0
- package/dist/server/oauth.d.ts.map +1 -0
- package/dist/server/oauth.js +74 -0
- package/dist/server/oauth.js.map +1 -0
- package/dist/sync/miro.sync-endpoint.descriptor.d.ts +14 -0
- package/dist/sync/miro.sync-endpoint.descriptor.d.ts.map +1 -0
- package/dist/sync/miro.sync-endpoint.descriptor.js +10 -0
- package/dist/sync/miro.sync-endpoint.descriptor.js.map +1 -0
- package/dist/sync/miro.sync-endpoint.impl.d.ts +31 -0
- package/dist/sync/miro.sync-endpoint.impl.d.ts.map +1 -0
- package/dist/sync/miro.sync-endpoint.impl.js +353 -0
- package/dist/sync/miro.sync-endpoint.impl.js.map +1 -0
- package/dist/sync/miro.title.sync-mapping.descriptor.d.ts +15 -0
- package/dist/sync/miro.title.sync-mapping.descriptor.d.ts.map +1 -0
- package/dist/sync/miro.title.sync-mapping.descriptor.js +15 -0
- package/dist/sync/miro.title.sync-mapping.descriptor.js.map +1 -0
- package/dist/sync/miro.title.sync-mapping.impl.d.ts +17 -0
- package/dist/sync/miro.title.sync-mapping.impl.d.ts.map +1 -0
- package/dist/sync/miro.title.sync-mapping.impl.js +20 -0
- package/dist/sync/miro.title.sync-mapping.impl.js.map +1 -0
- package/dist/tools/descriptors.d.ts +1049 -0
- package/dist/tools/descriptors.d.ts.map +1 -0
- package/dist/tools/descriptors.js +152 -0
- package/dist/tools/descriptors.js.map +1 -0
- package/dist/tools/impl.d.ts +13 -0
- package/dist/tools/impl.d.ts.map +1 -0
- package/dist/tools/impl.js +60 -0
- package/dist/tools/impl.js.map +1 -0
- package/dist/tools/index.d.ts +3 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +3 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/schemas.d.ts +2 -0
- package/dist/tools/schemas.d.ts.map +1 -0
- package/dist/tools/schemas.js +2 -0
- package/dist/tools/schemas.js.map +1 -0
- package/package.json +104 -4
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { type MiroClientConfig } from '../schemas/http.ts';
|
|
2
|
+
import { type CreateMiroBoardInput, type CreateMiroItemInput, type DeleteMiroItemResult, type MiroBoard, type MiroBoardIdInput, type MiroBoardListOptions, type MiroBoardListResult, type MiroBoardUpdateResult, type MiroItem, type MiroItemIdInput, type MiroItemListOptions, type MiroItemListResult, type UpdateMiroBoardInput, type UpdateMiroItemInput } from './miro-schemas.ts';
|
|
3
|
+
export { MiroAPIError } from './errors.ts';
|
|
4
|
+
export type { MiroFetch, MiroClientConfig } from '../schemas/http.ts';
|
|
5
|
+
/** Typed, bounded transport for Miro REST API v2. */
|
|
6
|
+
export declare class MiroAPIClient {
|
|
7
|
+
private readonly apiToken;
|
|
8
|
+
private readonly fetchFn;
|
|
9
|
+
constructor(config: MiroClientConfig);
|
|
10
|
+
listBoards(options?: MiroBoardListOptions): Promise<MiroBoardListResult>;
|
|
11
|
+
getBoard(input: MiroBoardIdInput | string): Promise<MiroBoard | null>;
|
|
12
|
+
createBoard(input: CreateMiroBoardInput): Promise<MiroBoard>;
|
|
13
|
+
updateBoard(input: UpdateMiroBoardInput): Promise<MiroBoardUpdateResult>;
|
|
14
|
+
listItems(options: MiroItemListOptions): Promise<MiroItemListResult>;
|
|
15
|
+
getItem(input: MiroItemIdInput): Promise<MiroItem | null>;
|
|
16
|
+
createItem(input: CreateMiroItemInput): Promise<MiroItem>;
|
|
17
|
+
updateItem(input: UpdateMiroItemInput): Promise<MiroItem>;
|
|
18
|
+
deleteItem(input: MiroItemIdInput): Promise<DeleteMiroItemResult>;
|
|
19
|
+
private request;
|
|
20
|
+
private requestResult;
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=miro-client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"miro-client.d.ts","sourceRoot":"","sources":["../../src/miro/miro-client.ts"],"names":[],"mappings":"AAEA,OAAO,EAAoF,KAAK,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAG7I,OAAO,EAeN,KAAK,oBAAoB,EACzB,KAAK,mBAAmB,EACxB,KAAK,oBAAoB,EACzB,KAAK,SAAS,EACd,KAAK,gBAAgB,EACrB,KAAK,oBAAoB,EACzB,KAAK,mBAAmB,EACxB,KAAK,qBAAqB,EAC1B,KAAK,QAAQ,EACb,KAAK,eAAe,EACpB,KAAK,mBAAmB,EACxB,KAAK,kBAAkB,EAGvB,KAAK,oBAAoB,EACzB,KAAK,mBAAmB,EACxB,MAAM,mBAAmB,CAAC;AAQ3B,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,YAAY,EAAE,SAAS,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAEtE,qDAAqD;AACrD,qBAAa,aAAa;IACzB,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAqB;IAC9C,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAY;gBAExB,MAAM,EAAE,gBAAgB;IAO9B,UAAU,CAAC,OAAO,GAAE,oBAAyB,GAAG,OAAO,CAAC,mBAAmB,CAAC;IAsB5E,QAAQ,CAAC,KAAK,EAAE,gBAAgB,GAAG,MAAM,GAAG,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC;IAUrE,WAAW,CAAC,KAAK,EAAE,oBAAoB,GAAG,OAAO,CAAC,SAAS,CAAC;IAO5D,WAAW,CAAC,KAAK,EAAE,oBAAoB,GAAG,OAAO,CAAC,qBAAqB,CAAC;IAyBxE,SAAS,CAAC,OAAO,EAAE,mBAAmB,GAAG,OAAO,CAAC,kBAAkB,CAAC;IAgBpE,OAAO,CAAC,KAAK,EAAE,eAAe,GAAG,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC;IAczD,UAAU,CAAC,KAAK,EAAE,mBAAmB,GAAG,OAAO,CAAC,QAAQ,CAAC;IAWzD,UAAU,CAAC,KAAK,EAAE,mBAAmB,GAAG,OAAO,CAAC,QAAQ,CAAC;IAWzD,UAAU,CAAC,KAAK,EAAE,eAAe,GAAG,OAAO,CAAC,oBAAoB,CAAC;YASzD,OAAO;YAOP,aAAa;CAgC3B"}
|
|
@@ -0,0 +1,225 @@
|
|
|
1
|
+
import { CapabilityError, valueFreeFailure, settle } from '@vibesdotdev/kernel';
|
|
2
|
+
import { MiroAPIError } from "./errors.js";
|
|
3
|
+
import { RawMiroListSchema, MiroBoardLookupSchema, MiroClientConfigSchema } from "../schemas/http.js";
|
|
4
|
+
import { MiroJsonValueSchema, MiroJsonRecordSchema } from "../schemas/miro.js";
|
|
5
|
+
import { parseMiroBoundary, parseMiroResponse } from "../schemas/operations.js";
|
|
6
|
+
import { CreateMiroBoardInputSchema, CreateMiroItemInputSchema, DeleteMiroItemResultSchema, MiroBoardListOptionsSchema, MiroBoardListResultSchema, MiroBoardSchema, MiroBoardUpdateResultSchema, MiroItemIdInputSchema, MiroItemListOptionsSchema, MiroItemListResultSchema, MiroItemSchema, MiroRateLimitMetadataSchema, UpdateMiroBoardInputSchema, UpdateMiroItemInputSchema } from "./miro-schemas.js";
|
|
7
|
+
const MIRO_API_BASE = 'https://api.miro.com/v2';
|
|
8
|
+
const ITEM_ENDPOINTS = {
|
|
9
|
+
card: 'cards', shape: 'shapes', sticky_note: 'sticky_notes', text: 'texts'
|
|
10
|
+
};
|
|
11
|
+
export { MiroAPIError } from "./errors.js";
|
|
12
|
+
/** Typed, bounded transport for Miro REST API v2. */
|
|
13
|
+
export class MiroAPIClient {
|
|
14
|
+
apiToken;
|
|
15
|
+
fetchFn;
|
|
16
|
+
constructor(config) {
|
|
17
|
+
const parsed = MiroClientConfigSchema.safeParse(config);
|
|
18
|
+
if (!parsed.success)
|
|
19
|
+
throw new MiroAPIError('Miro token is required.', { reason: 'miro-token-required' });
|
|
20
|
+
this.apiToken = parsed.data.apiToken;
|
|
21
|
+
this.fetchFn = parsed.data.fetchFn ?? fetch;
|
|
22
|
+
}
|
|
23
|
+
async listBoards(options = {}) {
|
|
24
|
+
const input = parseMiroBoundary(MiroBoardListOptionsSchema, options);
|
|
25
|
+
const params = new URLSearchParams({
|
|
26
|
+
limit: String(input.limit),
|
|
27
|
+
offset: String(input.offset)
|
|
28
|
+
});
|
|
29
|
+
setParam(params, 'team_id', input.teamId);
|
|
30
|
+
setParam(params, 'project_id', input.projectId);
|
|
31
|
+
setParam(params, 'query', input.query);
|
|
32
|
+
setParam(params, 'owner', input.owner);
|
|
33
|
+
setParam(params, 'sort', input.sort);
|
|
34
|
+
const raw = parseMiroResponse(RawMiroListSchema, await this.request(`/boards?${params.toString()}`));
|
|
35
|
+
return parseMiroResponse(MiroBoardListResultSchema, {
|
|
36
|
+
boards: raw.data.map((board) => parseMiroResponse(MiroBoardSchema, board)),
|
|
37
|
+
size: raw.size ?? raw.data.length,
|
|
38
|
+
limit: raw.limit ?? input.limit,
|
|
39
|
+
offset: raw.offset ?? input.offset,
|
|
40
|
+
total: raw.total
|
|
41
|
+
});
|
|
42
|
+
}
|
|
43
|
+
async getBoard(input) {
|
|
44
|
+
const { boardId } = parseMiroBoundary(MiroBoardLookupSchema, input);
|
|
45
|
+
try {
|
|
46
|
+
return parseMiroResponse(MiroBoardSchema, await this.request(`/boards/${encodeURIComponent(boardId)}`));
|
|
47
|
+
}
|
|
48
|
+
catch (error) {
|
|
49
|
+
if (error instanceof MiroAPIError && error.code === 'NOT_FOUND' && error.reason === 'record-absent' && error.details?.failure === undefined)
|
|
50
|
+
return null;
|
|
51
|
+
throw error;
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
async createBoard(input) {
|
|
55
|
+
const request = parseMiroBoundary(CreateMiroBoardInputSchema, input);
|
|
56
|
+
return parseMiroResponse(MiroBoardSchema, await this.request('/boards', { method: 'POST', body: mutableBoardBody(request) }));
|
|
57
|
+
}
|
|
58
|
+
async updateBoard(input) {
|
|
59
|
+
const request = parseMiroBoundary(UpdateMiroBoardInputSchema, input);
|
|
60
|
+
const result = await this.requestResult(`/boards/${encodeURIComponent(request.boardId)}`, {
|
|
61
|
+
method: 'PATCH',
|
|
62
|
+
body: mutableBoardBody(request)
|
|
63
|
+
});
|
|
64
|
+
if (result.status !== 202) {
|
|
65
|
+
return parseMiroResponse(MiroBoardUpdateResultSchema, {
|
|
66
|
+
boardId: request.boardId,
|
|
67
|
+
state: 'completed',
|
|
68
|
+
board: parseMiroResponse(MiroBoardSchema, result.data),
|
|
69
|
+
pendingFields: []
|
|
70
|
+
});
|
|
71
|
+
}
|
|
72
|
+
const board = await this.getBoard(request.boardId);
|
|
73
|
+
const pendingFields = board ? pendingBoardFields(board, request) : mutableBoardFieldNames(request);
|
|
74
|
+
return parseMiroResponse(MiroBoardUpdateResultSchema, {
|
|
75
|
+
boardId: request.boardId,
|
|
76
|
+
state: pendingFields.length === 0 ? 'completed' : 'accepted',
|
|
77
|
+
board: board ?? undefined,
|
|
78
|
+
pendingFields
|
|
79
|
+
});
|
|
80
|
+
}
|
|
81
|
+
async listItems(options) {
|
|
82
|
+
const input = parseMiroBoundary(MiroItemListOptionsSchema, options);
|
|
83
|
+
const params = new URLSearchParams({ limit: String(input.limit) });
|
|
84
|
+
setParam(params, 'cursor', input.cursor);
|
|
85
|
+
setParam(params, 'type', input.type);
|
|
86
|
+
const raw = parseMiroResponse(RawMiroListSchema, await this.request(`/boards/${encodeURIComponent(input.boardId)}/items?${params.toString()}`));
|
|
87
|
+
return parseMiroResponse(MiroItemListResultSchema, {
|
|
88
|
+
items: raw.data.map((item) => parseMiroResponse(MiroItemSchema, item)),
|
|
89
|
+
hasMore: Boolean(raw.cursor),
|
|
90
|
+
nextCursor: raw.cursor
|
|
91
|
+
});
|
|
92
|
+
}
|
|
93
|
+
async getItem(input) {
|
|
94
|
+
const request = parseMiroBoundary(MiroItemIdInputSchema, input);
|
|
95
|
+
try {
|
|
96
|
+
return parseMiroResponse(MiroItemSchema, await this.request(`/boards/${encodeURIComponent(request.boardId)}/items/${encodeURIComponent(request.itemId)}`));
|
|
97
|
+
}
|
|
98
|
+
catch (error) {
|
|
99
|
+
if (error instanceof MiroAPIError && error.code === 'NOT_FOUND' && error.reason === 'record-absent' && error.details?.failure === undefined)
|
|
100
|
+
return null;
|
|
101
|
+
throw error;
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
async createItem(input) {
|
|
105
|
+
const request = parseMiroBoundary(CreateMiroItemInputSchema, input);
|
|
106
|
+
const endpoint = ITEM_ENDPOINTS[request.type];
|
|
107
|
+
return parseMiroResponse(MiroItemSchema, await this.request(`/boards/${encodeURIComponent(request.boardId)}/${endpoint}`, {
|
|
108
|
+
method: 'POST',
|
|
109
|
+
body: mutableItemBody(request)
|
|
110
|
+
}));
|
|
111
|
+
}
|
|
112
|
+
async updateItem(input) {
|
|
113
|
+
const request = parseMiroBoundary(UpdateMiroItemInputSchema, input);
|
|
114
|
+
const endpoint = ITEM_ENDPOINTS[request.type];
|
|
115
|
+
return parseMiroResponse(MiroItemSchema, await this.request(`/boards/${encodeURIComponent(request.boardId)}/${endpoint}/${encodeURIComponent(request.itemId)}`, { method: 'PATCH', body: mutableItemBody(request) }));
|
|
116
|
+
}
|
|
117
|
+
async deleteItem(input) {
|
|
118
|
+
const request = parseMiroBoundary(MiroItemIdInputSchema, input);
|
|
119
|
+
await this.request(`/boards/${encodeURIComponent(request.boardId)}/items/${encodeURIComponent(request.itemId)}`, { method: 'DELETE' });
|
|
120
|
+
return parseMiroResponse(DeleteMiroItemResultSchema, { deleted: true, itemId: request.itemId });
|
|
121
|
+
}
|
|
122
|
+
async request(path, options = {}) {
|
|
123
|
+
return (await this.requestResult(path, options)).data;
|
|
124
|
+
}
|
|
125
|
+
async requestResult(path, options = {}) {
|
|
126
|
+
const headers = new Headers({ Accept: 'application/json' });
|
|
127
|
+
if (this.apiToken !== undefined) {
|
|
128
|
+
headers.set('Authorization', `Bearer ${this.apiToken}`);
|
|
129
|
+
}
|
|
130
|
+
if (options.body)
|
|
131
|
+
headers.set('Content-Type', 'application/json');
|
|
132
|
+
const attempt = await settle(() => this.fetchFn(`${MIRO_API_BASE}${path}`, {
|
|
133
|
+
method: options.method ?? 'GET', headers,
|
|
134
|
+
body: options.body ? JSON.stringify(options.body) : undefined
|
|
135
|
+
}));
|
|
136
|
+
if (!attempt.ok) {
|
|
137
|
+
if (attempt.cause instanceof CapabilityError)
|
|
138
|
+
throw attempt.cause;
|
|
139
|
+
throw new MiroAPIError('Miro transport failed.', {
|
|
140
|
+
reason: 'miro-transport-failed', failure: valueFreeFailure(attempt.cause)
|
|
141
|
+
});
|
|
142
|
+
}
|
|
143
|
+
const response = attempt.value;
|
|
144
|
+
if (!response.ok) {
|
|
145
|
+
const released = await settle(() => response.body?.cancel());
|
|
146
|
+
throw new MiroAPIError('Miro request failed.', {
|
|
147
|
+
status: response.status, rateLimit: rateLimitMetadata(response.headers),
|
|
148
|
+
failure: released.ok ? undefined : valueFreeFailure(released.cause)
|
|
149
|
+
});
|
|
150
|
+
}
|
|
151
|
+
if (response.status === 204)
|
|
152
|
+
return { status: response.status, data: undefined };
|
|
153
|
+
const payload = await readJson(response);
|
|
154
|
+
return { status: response.status, data: payload };
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
function mutableItemBody(input) {
|
|
158
|
+
return parseMiroBoundary(MiroJsonRecordSchema, Object.fromEntries(Object.entries({
|
|
159
|
+
data: input.data, style: input.style, position: input.position,
|
|
160
|
+
geometry: input.geometry, parent: input.parent
|
|
161
|
+
}).filter(([, value]) => value !== undefined)));
|
|
162
|
+
}
|
|
163
|
+
function mutableBoardBody(input) {
|
|
164
|
+
return parseMiroBoundary(MiroJsonRecordSchema, Object.fromEntries(Object.entries({
|
|
165
|
+
name: input.name, description: input.description, teamId: input.teamId, projectId: input.projectId
|
|
166
|
+
}).filter(([, value]) => value !== undefined)));
|
|
167
|
+
}
|
|
168
|
+
function mutableBoardFieldNames(input) {
|
|
169
|
+
return ['name', 'description', 'teamId', 'projectId'].filter((field) => input[field] !== undefined);
|
|
170
|
+
}
|
|
171
|
+
function pendingBoardFields(board, input) {
|
|
172
|
+
return mutableBoardFieldNames(input).filter((field) => {
|
|
173
|
+
switch (field) {
|
|
174
|
+
case 'name':
|
|
175
|
+
return board.name !== input.name;
|
|
176
|
+
case 'description':
|
|
177
|
+
return (board.description ?? '') !== input.description;
|
|
178
|
+
case 'teamId':
|
|
179
|
+
return board.team?.id !== input.teamId;
|
|
180
|
+
case 'projectId':
|
|
181
|
+
return board.project?.id !== input.projectId;
|
|
182
|
+
}
|
|
183
|
+
});
|
|
184
|
+
}
|
|
185
|
+
async function readJson(response) {
|
|
186
|
+
const attempt = await settle(async () => {
|
|
187
|
+
const text = await response.text();
|
|
188
|
+
if (text.length === 0)
|
|
189
|
+
return undefined;
|
|
190
|
+
return parseMiroResponse(MiroJsonValueSchema, JSON.parse(text));
|
|
191
|
+
});
|
|
192
|
+
if (!attempt.ok) {
|
|
193
|
+
if (attempt.cause instanceof CapabilityError)
|
|
194
|
+
throw attempt.cause;
|
|
195
|
+
throw new MiroAPIError('Miro response is invalid.', {
|
|
196
|
+
failure: valueFreeFailure(attempt.cause),
|
|
197
|
+
status: response.status, reason: 'miro-response-invalid',
|
|
198
|
+
rateLimit: rateLimitMetadata(response.headers)
|
|
199
|
+
});
|
|
200
|
+
}
|
|
201
|
+
return attempt.value;
|
|
202
|
+
}
|
|
203
|
+
function rateLimitMetadata(headers) {
|
|
204
|
+
const candidate = {
|
|
205
|
+
limitCredits: headerNumber(headers, 'X-RateLimit-Limit'),
|
|
206
|
+
remainingCredits: headerNumber(headers, 'X-RateLimit-Remaining'),
|
|
207
|
+
resetAt: headerNumber(headers, 'X-RateLimit-Reset'),
|
|
208
|
+
retryAfterSeconds: headerNumber(headers, 'Retry-After')
|
|
209
|
+
};
|
|
210
|
+
if (Object.values(candidate).every((value) => value === undefined))
|
|
211
|
+
return undefined;
|
|
212
|
+
return MiroRateLimitMetadataSchema.parse(candidate);
|
|
213
|
+
}
|
|
214
|
+
function headerNumber(headers, name) {
|
|
215
|
+
const raw = headers.get(name);
|
|
216
|
+
if (raw === null || raw.trim().length === 0)
|
|
217
|
+
return undefined;
|
|
218
|
+
const value = Number(raw);
|
|
219
|
+
return Number.isFinite(value) && value >= 0 ? value : undefined;
|
|
220
|
+
}
|
|
221
|
+
function setParam(params, key, value) {
|
|
222
|
+
if (value !== undefined)
|
|
223
|
+
params.set(key, value);
|
|
224
|
+
}
|
|
225
|
+
//# sourceMappingURL=miro-client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"miro-client.js","sourceRoot":"","sources":["../../src/miro/miro-client.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { type MiroOperationInput } from '../schemas/operations.ts';
|
|
2
|
+
import type { IntegrationConnectionSelector, IntegrationOAuthAuthorization, IntegrationOAuthCompletion, IntegrationOAuthStart, IntegrationOperationResult } from '@vibesdotdev/integrations/schemas/integration-descriptor';
|
|
3
|
+
import { BaseIntegrationProvider } from '@vibesdotdev/integrations/kinds/integration';
|
|
4
|
+
import { MiroAPIClient } from './miro-client.ts';
|
|
5
|
+
import { type MiroPullOptions, type MiroPullResult } from './miro-schemas.ts';
|
|
6
|
+
/** Hosted Miro integration provider. */
|
|
7
|
+
export declare class MiroIntegration extends BaseIntegrationProvider {
|
|
8
|
+
startAuthorization(_input: IntegrationOAuthStart): Promise<IntegrationOAuthAuthorization>;
|
|
9
|
+
completeAuthorization(_input: IntegrationOAuthCompletion): Promise<void>;
|
|
10
|
+
invokeOperation<T = unknown>(opId: string, args?: MiroOperationInput): Promise<IntegrationOperationResult<T>>;
|
|
11
|
+
invokeOperationForConnection<T = unknown>(selector: Readonly<IntegrationConnectionSelector>, opId: string, args?: MiroOperationInput): Promise<IntegrationOperationResult<T>>;
|
|
12
|
+
private dispatch;
|
|
13
|
+
getClient(selector?: Readonly<IntegrationConnectionSelector>): Promise<MiroAPIClient>;
|
|
14
|
+
/** Pull one page only; cursor persistence and mapping belong to the sync owner. */
|
|
15
|
+
pullBoardItems(options: MiroPullOptions, selector?: Readonly<IntegrationConnectionSelector>): Promise<MiroPullResult>;
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=miro-implementation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"miro-implementation.d.ts","sourceRoot":"","sources":["../../src/miro/miro-implementation.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,kBAAkB,EAA+C,MAAM,0BAA0B,CAAC;AAChH,OAAO,KAAK,EACX,6BAA6B,EAC7B,6BAA6B,EAC7B,0BAA0B,EAC1B,qBAAqB,EACrB,0BAA0B,EAC1B,MAAM,0DAA0D,CAAC;AAClE,OAAO,EAAE,uBAAuB,EAAE,MAAM,6CAA6C,CAAC;AACtF,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAEjD,OAAO,EAUN,KAAK,eAAe,EACpB,KAAK,cAAc,EACnB,MAAM,mBAAmB,CAAC;AAE3B,wCAAwC;AACxC,qBAAa,eAAgB,SAAQ,uBAAuB;IAE5C,kBAAkB,CAChC,MAAM,EAAE,qBAAqB,GAC3B,OAAO,CAAC,6BAA6B,CAAC;IAI1B,qBAAqB,CAAC,MAAM,EAAE,0BAA0B,GAAG,OAAO,CAAC,IAAI,CAAC;IAI9E,eAAe,CAAC,CAAC,GAAG,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,kBAAkB,GAAG,OAAO,CAAC,0BAA0B,CAAC,CAAC,CAAC,CAAC;IAKtH,4BAA4B,CAAC,CAAC,GAAG,OAAO,EACvC,QAAQ,EAAE,QAAQ,CAAC,6BAA6B,CAAC,EACjD,IAAI,EAAE,MAAM,EACZ,IAAI,CAAC,EAAE,kBAAkB,GACvB,OAAO,CAAC,0BAA0B,CAAC,CAAC,CAAC,CAAC;YAS3B,QAAQ;IAmDhB,SAAS,CAAC,QAAQ,CAAC,EAAE,QAAQ,CAAC,6BAA6B,CAAC,GAAG,OAAO,CAAC,aAAa,CAAC;IAgC3F,mFAAmF;IAC7E,cAAc,CAAC,OAAO,EAAE,eAAe,EAAE,QAAQ,CAAC,EAAE,QAAQ,CAAC,6BAA6B,CAAC,GAAG,OAAO,CAAC,cAAc,CAAC;CAU3H"}
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
import * as z from 'zod/v4';
|
|
2
|
+
import { CapabilityError } from '@vibesdotdev/kernel';
|
|
3
|
+
import { parseMiroBoundary } from "../schemas/operations.js";
|
|
4
|
+
import { BaseIntegrationProvider } from '@vibesdotdev/integrations/kinds/integration';
|
|
5
|
+
import { MiroAPIClient } from "./miro-client.js";
|
|
6
|
+
import { sendIntegrationAuthenticatedRequest } from '@vibesdotdev/integrations/server/secrets';
|
|
7
|
+
import { CreateMiroBoardInputSchema, CreateMiroItemInputSchema, MiroBoardIdInputSchema, MiroBoardListOptionsSchema, MiroItemIdInputSchema, MiroItemListOptionsSchema, MiroPullOptionsSchema, UpdateMiroBoardInputSchema, UpdateMiroItemInputSchema } from "./miro-schemas.js";
|
|
8
|
+
/** Hosted Miro integration provider. */
|
|
9
|
+
export class MiroIntegration extends BaseIntegrationProvider {
|
|
10
|
+
async startAuthorization(_input) {
|
|
11
|
+
throw new CapabilityError('Miro OAuth is owned by the platform host.', 'UNAVAILABLE', { reason: 'miro-oauth-host-required' });
|
|
12
|
+
}
|
|
13
|
+
async completeAuthorization(_input) {
|
|
14
|
+
throw new CapabilityError('Miro OAuth is owned by the platform host.', 'UNAVAILABLE', { reason: 'miro-oauth-host-required' });
|
|
15
|
+
}
|
|
16
|
+
async invokeOperation(opId, args) {
|
|
17
|
+
return this.dispatch(opId, args);
|
|
18
|
+
}
|
|
19
|
+
async invokeOperationForConnection(selector, opId, args) {
|
|
20
|
+
return this.dispatch(opId, args, selector);
|
|
21
|
+
}
|
|
22
|
+
async dispatch(opId, args, selector) {
|
|
23
|
+
const declared = (this.descriptor.operations ?? []).some((operation) => operation.id === opId);
|
|
24
|
+
if (!declared) {
|
|
25
|
+
throw new CapabilityError('Miro does not declare this operation.', 'INVALID_INPUT', { reason: 'miro-operation-undeclared' });
|
|
26
|
+
}
|
|
27
|
+
const client = await this.getClient(selector);
|
|
28
|
+
let data;
|
|
29
|
+
switch (opId) {
|
|
30
|
+
case 'listBoards':
|
|
31
|
+
data = await client.listBoards(parseMiroBoundary(MiroBoardListOptionsSchema, args ?? {}));
|
|
32
|
+
break;
|
|
33
|
+
case 'getBoard':
|
|
34
|
+
data = await client.getBoard(parseMiroBoundary(MiroBoardIdInputSchema, args));
|
|
35
|
+
break;
|
|
36
|
+
case 'createBoard':
|
|
37
|
+
data = await client.createBoard(parseMiroBoundary(CreateMiroBoardInputSchema, args));
|
|
38
|
+
break;
|
|
39
|
+
case 'updateBoard':
|
|
40
|
+
data = await client.updateBoard(parseMiroBoundary(UpdateMiroBoardInputSchema, args));
|
|
41
|
+
break;
|
|
42
|
+
case 'listItems':
|
|
43
|
+
data = await client.listItems(parseMiroBoundary(MiroItemListOptionsSchema, args));
|
|
44
|
+
break;
|
|
45
|
+
case 'getItem':
|
|
46
|
+
data = await client.getItem(parseMiroBoundary(MiroItemIdInputSchema, args));
|
|
47
|
+
break;
|
|
48
|
+
case 'createItem':
|
|
49
|
+
data = await client.createItem(parseMiroBoundary(CreateMiroItemInputSchema, args));
|
|
50
|
+
break;
|
|
51
|
+
case 'updateItem':
|
|
52
|
+
data = await client.updateItem(parseMiroBoundary(UpdateMiroItemInputSchema, args));
|
|
53
|
+
break;
|
|
54
|
+
case 'deleteItem':
|
|
55
|
+
data = await client.deleteItem(parseMiroBoundary(MiroItemIdInputSchema, args));
|
|
56
|
+
break;
|
|
57
|
+
case 'pull-board-items':
|
|
58
|
+
data = await this.pullBoardItems(parseMiroBoundary(MiroPullOptionsSchema, args), selector);
|
|
59
|
+
break;
|
|
60
|
+
default:
|
|
61
|
+
throw new CapabilityError('Miro operation is not implemented.', 'INVALID_INPUT', { reason: 'miro-operation-undeclared' });
|
|
62
|
+
}
|
|
63
|
+
return { ok: true, data };
|
|
64
|
+
}
|
|
65
|
+
async getClient(selector) {
|
|
66
|
+
const runtime = this.context.runtime;
|
|
67
|
+
if (!runtime) {
|
|
68
|
+
throw new CapabilityError('Miro runtime is required.', 'UNAVAILABLE', { reason: 'miro-runtime-required' });
|
|
69
|
+
}
|
|
70
|
+
const resolved = await this.getCredentialUseConfiguration(selector);
|
|
71
|
+
const candidates = resolved.credentialReferences.accessToken ?? [];
|
|
72
|
+
if (candidates.length === 0) {
|
|
73
|
+
throw new CapabilityError('Miro access credential is required.', 'PERMISSION_DENIED', { reason: 'miro-token-required' });
|
|
74
|
+
}
|
|
75
|
+
return new MiroAPIClient({ fetchFn: async (input, init) => {
|
|
76
|
+
const request = new Request(input, init);
|
|
77
|
+
const method = request.method;
|
|
78
|
+
if (method !== 'GET' && method !== 'POST' && method !== 'PUT' && method !== 'PATCH' && method !== 'DELETE') {
|
|
79
|
+
throw new CapabilityError('Miro request method is unsupported.', 'INVALID_INPUT', { reason: 'miro-request-method-invalid' });
|
|
80
|
+
}
|
|
81
|
+
const textBody = z.string().safeParse(init?.body);
|
|
82
|
+
return sendIntegrationAuthenticatedRequest(runtime, {
|
|
83
|
+
url: request.url,
|
|
84
|
+
signal: request.signal,
|
|
85
|
+
options: {
|
|
86
|
+
method,
|
|
87
|
+
headers: Object.fromEntries(request.headers),
|
|
88
|
+
body: textBody.success ? textBody.data : request.body ?? undefined,
|
|
89
|
+
credentialBindings: [{
|
|
90
|
+
kind: 'header', candidates, header: 'authorization', prefix: 'Bearer '
|
|
91
|
+
}]
|
|
92
|
+
}
|
|
93
|
+
});
|
|
94
|
+
} });
|
|
95
|
+
}
|
|
96
|
+
/** Pull one page only; cursor persistence and mapping belong to the sync owner. */
|
|
97
|
+
async pullBoardItems(options, selector) {
|
|
98
|
+
const request = parseMiroBoundary(MiroPullOptionsSchema, options);
|
|
99
|
+
const response = await (await this.getClient(selector)).listItems(request);
|
|
100
|
+
return {
|
|
101
|
+
items: response.items,
|
|
102
|
+
hasMore: response.hasMore,
|
|
103
|
+
nextCursor: response.nextCursor,
|
|
104
|
+
scanned: response.items.length
|
|
105
|
+
};
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
//# sourceMappingURL=miro-implementation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"miro-implementation.js","sourceRoot":"","sources":["../../src/miro/miro-implementation.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"miro-schemas.d.ts","sourceRoot":"","sources":["../../src/miro/miro-schemas.ts"],"names":[],"mappings":"AAAA,cAAc,oBAAoB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"miro-schemas.js","sourceRoot":"","sources":["../../src/miro/miro-schemas.ts"],"names":[],"mappings":"AAAA,cAAc,oBAAoB,CAAC"}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
declare const _default: {
|
|
2
|
+
id: string;
|
|
3
|
+
kind: "integration/provider";
|
|
4
|
+
name?: string | undefined;
|
|
5
|
+
description?: string | undefined;
|
|
6
|
+
tags?: string[] | undefined;
|
|
7
|
+
hardware?: string[] | undefined;
|
|
8
|
+
enabled?: boolean | undefined;
|
|
9
|
+
capabilityId?: string | undefined;
|
|
10
|
+
retention?: string | {
|
|
11
|
+
reason: string;
|
|
12
|
+
maxAgeDays?: number | undefined;
|
|
13
|
+
maxEntries?: number | undefined;
|
|
14
|
+
maxBytes?: number | undefined;
|
|
15
|
+
cascadeFrom?: string | undefined;
|
|
16
|
+
ageField?: string | undefined;
|
|
17
|
+
enforcedBy?: string | undefined;
|
|
18
|
+
} | undefined;
|
|
19
|
+
requiredContext?: string[] | undefined;
|
|
20
|
+
optionalContext?: string[] | undefined;
|
|
21
|
+
provider?: string | undefined;
|
|
22
|
+
category?: "push" | "email" | "webhook" | "accounting" | "vcs" | "issue-tracker" | "productivity" | "ocr" | "messaging" | "sms" | "storage" | "analytics" | "observability" | "crm" | "calendar" | "other" | undefined;
|
|
23
|
+
priority?: number | undefined;
|
|
24
|
+
baseUrl?: string | undefined;
|
|
25
|
+
config?: Record<string, import("@vibesdotdev/kernel/bootstrap").JsonValue> | undefined;
|
|
26
|
+
protectedConfigKeys?: string[] | undefined;
|
|
27
|
+
configurationSource?: "account" | "host" | undefined;
|
|
28
|
+
configSettingKey?: string | undefined;
|
|
29
|
+
credentials?: {
|
|
30
|
+
key: string;
|
|
31
|
+
source: "secret" | "setting";
|
|
32
|
+
reference?: {
|
|
33
|
+
source: "secret";
|
|
34
|
+
key: string;
|
|
35
|
+
store?: string | undefined;
|
|
36
|
+
operation?: object | undefined;
|
|
37
|
+
} | undefined;
|
|
38
|
+
providerType?: string | undefined;
|
|
39
|
+
scope?: "project" | "user" | "platform" | "org" | undefined;
|
|
40
|
+
scopeId?: string | undefined;
|
|
41
|
+
settingKey?: string | undefined;
|
|
42
|
+
required?: boolean | undefined;
|
|
43
|
+
}[] | undefined;
|
|
44
|
+
oauth?: {
|
|
45
|
+
authorizationEndpoint: string;
|
|
46
|
+
tokenEndpoint: string;
|
|
47
|
+
scopes?: string[] | undefined;
|
|
48
|
+
authorizationParams?: Record<string, string> | undefined;
|
|
49
|
+
configFromCallback?: string[] | undefined;
|
|
50
|
+
clientAuthentication?: "form" | "basic" | undefined;
|
|
51
|
+
bodyEncoding?: "form" | "json" | undefined;
|
|
52
|
+
headers?: Record<string, string> | undefined;
|
|
53
|
+
scopeIdCallbackParam?: string | undefined;
|
|
54
|
+
} | undefined;
|
|
55
|
+
operations?: {
|
|
56
|
+
id: string;
|
|
57
|
+
name: string;
|
|
58
|
+
description?: string | undefined;
|
|
59
|
+
requiresOrg?: boolean | undefined;
|
|
60
|
+
}[] | undefined;
|
|
61
|
+
connection?: {
|
|
62
|
+
authMode?: "oauth" | "webhook" | "delegated" | "system-config" | undefined;
|
|
63
|
+
connectable?: boolean | undefined;
|
|
64
|
+
checkable?: boolean | undefined;
|
|
65
|
+
requiresProviderAdmin?: boolean | undefined;
|
|
66
|
+
} | undefined;
|
|
67
|
+
};
|
|
68
|
+
export default _default;
|
|
69
|
+
//# sourceMappingURL=system.integration.miro.descriptor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"system.integration.miro.descriptor.d.ts","sourceRoot":"","sources":["../../src/miro/system.integration.miro.descriptor.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAKA,wBA4GG"}
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
import { createRuntimeAsset } from '@vibesdotdev/kernel/factory';
|
|
2
|
+
import {} from '@vibesdotdev/integrations/schemas/integration-descriptor';
|
|
3
|
+
export default createRuntimeAsset({
|
|
4
|
+
kind: 'integration/provider',
|
|
5
|
+
id: 'integration.miro',
|
|
6
|
+
name: 'Miro',
|
|
7
|
+
description: 'Miro v2 boards and board-items transport for domain-owned projections.',
|
|
8
|
+
provider: 'miro',
|
|
9
|
+
category: 'productivity',
|
|
10
|
+
enabled: true,
|
|
11
|
+
priority: 90,
|
|
12
|
+
baseUrl: 'https://api.miro.com/v2',
|
|
13
|
+
configSettingKey: 'integrations.miro.config',
|
|
14
|
+
config: {
|
|
15
|
+
teamId: '',
|
|
16
|
+
boardId: ''
|
|
17
|
+
},
|
|
18
|
+
credentials: [
|
|
19
|
+
{
|
|
20
|
+
key: 'accessToken',
|
|
21
|
+
source: 'secret',
|
|
22
|
+
providerType: 'miro',
|
|
23
|
+
scope: 'org',
|
|
24
|
+
required: false
|
|
25
|
+
},
|
|
26
|
+
{
|
|
27
|
+
key: 'accessToken',
|
|
28
|
+
source: 'secret',
|
|
29
|
+
reference: { source: 'secret', key: 'MIRO_API_TOKEN' },
|
|
30
|
+
required: false
|
|
31
|
+
}
|
|
32
|
+
],
|
|
33
|
+
oauth: {
|
|
34
|
+
authorizationEndpoint: 'https://miro.com/oauth/authorize',
|
|
35
|
+
tokenEndpoint: 'https://api.miro.com/v1/oauth/token',
|
|
36
|
+
scopes: ['boards:read', 'boards:write'],
|
|
37
|
+
configFromCallback: []
|
|
38
|
+
},
|
|
39
|
+
connection: {
|
|
40
|
+
authMode: 'oauth',
|
|
41
|
+
connectable: true,
|
|
42
|
+
checkable: true,
|
|
43
|
+
requiresProviderAdmin: false
|
|
44
|
+
},
|
|
45
|
+
operations: [
|
|
46
|
+
{
|
|
47
|
+
id: 'listBoards',
|
|
48
|
+
name: 'List boards',
|
|
49
|
+
description: 'List one bounded offset page of boards. Args: `MiroBoardListOptions`.',
|
|
50
|
+
requiresOrg: true
|
|
51
|
+
},
|
|
52
|
+
{
|
|
53
|
+
id: 'getBoard',
|
|
54
|
+
name: 'Get board',
|
|
55
|
+
description: 'Fetch a board by id. Args: `{ boardId: string }`.',
|
|
56
|
+
requiresOrg: true
|
|
57
|
+
},
|
|
58
|
+
{
|
|
59
|
+
id: 'createBoard',
|
|
60
|
+
name: 'Create board',
|
|
61
|
+
description: 'Create a board and optionally place it in an explicit team and Space. Args: `CreateMiroBoardInput`.',
|
|
62
|
+
requiresOrg: true
|
|
63
|
+
},
|
|
64
|
+
{
|
|
65
|
+
id: 'updateBoard',
|
|
66
|
+
name: 'Update board',
|
|
67
|
+
description: 'Update a board or move it to an explicit team and Space. Args: `UpdateMiroBoardInput`.',
|
|
68
|
+
requiresOrg: true
|
|
69
|
+
},
|
|
70
|
+
{
|
|
71
|
+
id: 'listItems',
|
|
72
|
+
name: 'List board items',
|
|
73
|
+
description: 'List one bounded cursor page of board items. Args: `MiroItemListOptions`.',
|
|
74
|
+
requiresOrg: true
|
|
75
|
+
},
|
|
76
|
+
{
|
|
77
|
+
id: 'getItem',
|
|
78
|
+
name: 'Get board item',
|
|
79
|
+
description: 'Fetch a board item by id. Args: `{ boardId: string; itemId: string }`.',
|
|
80
|
+
requiresOrg: true
|
|
81
|
+
},
|
|
82
|
+
{
|
|
83
|
+
id: 'createItem',
|
|
84
|
+
name: 'Create board item',
|
|
85
|
+
description: 'Create a supported board item. Args: `CreateMiroItemInput`.',
|
|
86
|
+
requiresOrg: true
|
|
87
|
+
},
|
|
88
|
+
{
|
|
89
|
+
id: 'updateItem',
|
|
90
|
+
name: 'Update board item',
|
|
91
|
+
description: 'Update a supported board item. Args: `UpdateMiroItemInput`.',
|
|
92
|
+
requiresOrg: true
|
|
93
|
+
},
|
|
94
|
+
{
|
|
95
|
+
id: 'deleteItem',
|
|
96
|
+
name: 'Delete board item',
|
|
97
|
+
description: 'Delete a board item. Args: `{ boardId: string; itemId: string }`.',
|
|
98
|
+
requiresOrg: true
|
|
99
|
+
},
|
|
100
|
+
{
|
|
101
|
+
id: 'pull-board-items',
|
|
102
|
+
name: 'Pull board items',
|
|
103
|
+
description: 'Pull exactly one bounded cursor page for a domain-owned sync binding. Args: `MiroPullOptions`.',
|
|
104
|
+
requiresOrg: true
|
|
105
|
+
}
|
|
106
|
+
],
|
|
107
|
+
tags: ['system', 'integration', 'miro', 'boards', 'planning', 'sync']
|
|
108
|
+
});
|
|
109
|
+
//# sourceMappingURL=system.integration.miro.descriptor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"system.integration.miro.descriptor.js","sourceRoot":"","sources":["../../src/miro/system.integration.miro.descriptor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,6BAA6B,CAAC;AACjE,OAAO,EAEN,MAAM,0DAA0D,CAAC;AAElE,eAAe,kBAAkB,CAAqC;IACrE,IAAI,EAAE,sBAAsB;IAC5B,EAAE,EAAE,kBAAkB;IACtB,IAAI,EAAE,MAAM;IACZ,WAAW,EAAE,wEAAwE;IACrF,QAAQ,EAAE,MAAM;IAChB,QAAQ,EAAE,cAAc;IACxB,OAAO,EAAE,IAAI;IACb,QAAQ,EAAE,EAAE;IACZ,OAAO,EAAE,yBAAyB;IAClC,gBAAgB,EAAE,0BAA0B;IAC5C,MAAM,EAAE;QACP,MAAM,EAAE,EAAE;QACV,OAAO,EAAE,EAAE;KACX;IACD,WAAW,EAAE;QACZ;YACC,GAAG,EAAE,aAAa;YAClB,MAAM,EAAE,QAAQ;YAChB,YAAY,EAAE,MAAM;YACpB,KAAK,EAAE,KAAK;YACZ,QAAQ,EAAE,KAAK;SACf;QACD;YACC,GAAG,EAAE,aAAa;YAClB,MAAM,EAAE,QAAQ;YAChB,SAAS,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAG,EAAE,gBAAgB,EAAE;YACtD,QAAQ,EAAE,KAAK;SACf;KACD;IACD,KAAK,EAAE;QACN,qBAAqB,EAAE,kCAAkC;QACzD,aAAa,EAAE,qCAAqC;QACpD,MAAM,EAAE,CAAC,aAAa,EAAE,cAAc,CAAC;QACvC,kBAAkB,EAAE,EAAE;KACtB;IACD,UAAU,EAAE;QACX,QAAQ,EAAE,OAAO;QACjB,WAAW,EAAE,IAAI;QACjB,SAAS,EAAE,IAAI;QACf,qBAAqB,EAAE,KAAK;KAC5B;IACD,UAAU,EAAE;QACX;YACC,EAAE,EAAE,YAAY;YAChB,IAAI,EAAE,aAAa;YACnB,WAAW,EAAE,uEAAuE;YACpF,WAAW,EAAE,IAAI;SACjB;QACD;YACC,EAAE,EAAE,UAAU;YACd,IAAI,EAAE,WAAW;YACjB,WAAW,EAAE,mDAAmD;YAChE,WAAW,EAAE,IAAI;SACjB;QACD;YACC,EAAE,EAAE,aAAa;YACjB,IAAI,EAAE,cAAc;YACpB,WAAW,EACV,qGAAqG;YACtG,WAAW,EAAE,IAAI;SACjB;QACD;YACC,EAAE,EAAE,aAAa;YACjB,IAAI,EAAE,cAAc;YACpB,WAAW,EACV,wFAAwF;YACzF,WAAW,EAAE,IAAI;SACjB;QACD;YACC,EAAE,EAAE,WAAW;YACf,IAAI,EAAE,kBAAkB;YACxB,WAAW,EAAE,2EAA2E;YACxF,WAAW,EAAE,IAAI;SACjB;QACD;YACC,EAAE,EAAE,SAAS;YACb,IAAI,EAAE,gBAAgB;YACtB,WAAW,EAAE,wEAAwE;YACrF,WAAW,EAAE,IAAI;SACjB;QACD;YACC,EAAE,EAAE,YAAY;YAChB,IAAI,EAAE,mBAAmB;YACzB,WAAW,EAAE,6DAA6D;YAC1E,WAAW,EAAE,IAAI;SACjB;QACD;YACC,EAAE,EAAE,YAAY;YAChB,IAAI,EAAE,mBAAmB;YACzB,WAAW,EAAE,6DAA6D;YAC1E,WAAW,EAAE,IAAI;SACjB;QACD;YACC,EAAE,EAAE,YAAY;YAChB,IAAI,EAAE,mBAAmB;YACzB,WAAW,EAAE,mEAAmE;YAChF,WAAW,EAAE,IAAI;SACjB;QACD;YACC,EAAE,EAAE,kBAAkB;YACtB,IAAI,EAAE,kBAAkB;YACxB,WAAW,EACV,gGAAgG;YACjG,WAAW,EAAE,IAAI;SACjB;KACD;IACD,IAAI,EAAE,CAAC,QAAQ,EAAE,aAAa,EAAE,MAAM,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,CAAC;CACrE,CAAC,CAAC"}
|