@weavix/tracker-plugin-sdk 0.0.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/AGENTS.md +27 -0
- package/API_REFERENCE.md +541 -0
- package/README.md +363 -0
- package/dist/index.mjs +28 -0
- package/dist/index.mjs.map +1 -0
- package/dist/tracker-plugin-external/src/api/trackerApi.d.ts +23 -0
- package/dist/tracker-plugin-external/src/api/trackerApi.d.ts.map +1 -0
- package/dist/tracker-plugin-external/src/index.d.ts +19 -0
- package/dist/tracker-plugin-external/src/index.d.ts.map +1 -0
- package/package.json +39 -0
package/AGENTS.md
ADDED
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
# @weavix/tracker-plugin-sdk — agents
|
|
2
|
+
|
|
3
|
+
**Пакет:** core SDK (Weavix / npm). API идентичен internal, без `yateamApi`.
|
|
4
|
+
|
|
5
|
+
## Импорты
|
|
6
|
+
|
|
7
|
+
```typescript
|
|
8
|
+
import { hostApi, trackerApi, uiApi, PluginActionError } from '@weavix/tracker-plugin-sdk';
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
Peer: `@weavix/tracker-api-types`, `@weavix/tracker-core`.
|
|
12
|
+
|
|
13
|
+
## Правила
|
|
14
|
+
|
|
15
|
+
- **hostApi** — хост; **trackerApi.v3** — REST.
|
|
16
|
+
- **uiApi** — navigate, toaster, confirm.
|
|
17
|
+
|
|
18
|
+
## Документация
|
|
19
|
+
|
|
20
|
+
| Файл | Назначение |
|
|
21
|
+
|------|------------|
|
|
22
|
+
| [../../AGENTS.md](../../AGENTS.md) | Общий вход (таблица internal vs external) |
|
|
23
|
+
| [../../docs/agent/COOKBOOK.md](../../docs/agent/COOKBOOK.md) | Рецепты (блок External) |
|
|
24
|
+
| [README.md](./README.md) | Быстрый старт |
|
|
25
|
+
| [API_REFERENCE.md](./API_REFERENCE.md) | hostApi, uiApi, trackerApi.v3 |
|
|
26
|
+
|
|
27
|
+
React: [@weavix/tracker-plugin-sdk-react](../tracker-react-external/AGENTS.md).
|
package/API_REFERENCE.md
ADDED
|
@@ -0,0 +1,541 @@
|
|
|
1
|
+
# API Reference - @weavix/tracker-plugin-sdk
|
|
2
|
+
|
|
3
|
+
## Table of Contents
|
|
4
|
+
|
|
5
|
+
- [hostApi (HostApi)](#hostapi-hostapi)
|
|
6
|
+
- [init()](#init)
|
|
7
|
+
- [getTheme()](#gettheme)
|
|
8
|
+
- [getLanguage()](#getlanguage)
|
|
9
|
+
- [getContext()](#getcontext)
|
|
10
|
+
- [updateContentSize()](#updatecontentsize)
|
|
11
|
+
- [notifyReady()](#notifyready)
|
|
12
|
+
- [getSlot()](#getslot)
|
|
13
|
+
- [getEntityId()](#getentityid)
|
|
14
|
+
- [getEntityMeta()](#getentitymeta)
|
|
15
|
+
- [getContextLevel()](#getcontextlevel)
|
|
16
|
+
- [disableAutoResize()](#disableautoresize)
|
|
17
|
+
- [uiApi](#uiapi)
|
|
18
|
+
- [navigate()](#navigate)
|
|
19
|
+
- [trackerApi (TrackerApi)](#trackerapi-trackerapi)
|
|
20
|
+
- [v3](#v3)
|
|
21
|
+
- [Types](#types)
|
|
22
|
+
- [TrackerApiInitOptions](#trackerapiinitoptions)
|
|
23
|
+
- [TrackerApiCallOptions](#trackerapicalloptions)
|
|
24
|
+
- [TrackerApiV3](#trackerapiv3)
|
|
25
|
+
- [ApiCallResult](#apicallresult)
|
|
26
|
+
- [ApiCallPayload](#apicallpayload)
|
|
27
|
+
- [PluginActionError](#pluginactionerror)
|
|
28
|
+
- [Theme](#theme)
|
|
29
|
+
- [SlotContextMap](#slotcontextmap)
|
|
30
|
+
- [BasicContext](#basiccontext)
|
|
31
|
+
- [ContextLevel](#contextlevel)
|
|
32
|
+
- [ContentSizeUpdateRequest](#contentsizeupdaterequest)
|
|
33
|
+
- [HostInitOptions](#hostinitoptions)
|
|
34
|
+
- [NavigateRequest](#navigaterequest)
|
|
35
|
+
- [Коды ошибок API](#коды-ошибок-api)
|
|
36
|
+
- [Utils](#utils)
|
|
37
|
+
- [getLocalizedString()](#getlocalizedstring)
|
|
38
|
+
- [getField()](#getfield)
|
|
39
|
+
- [Handlers](#handlers)
|
|
40
|
+
|
|
41
|
+
---
|
|
42
|
+
|
|
43
|
+
## hostApi (HostApi)
|
|
44
|
+
|
|
45
|
+
API для взаимодействия с хостом (Tracker): инициализация плагина, тема, язык, контекст слота, размер окна, уведомление о готовности.
|
|
46
|
+
|
|
47
|
+
Экспортируется singleton **`hostApi`**. Обычно используется внутри `TrackerPluginProvider` (пакет react); при необходимости можно вызывать напрямую.
|
|
48
|
+
|
|
49
|
+
### init()
|
|
50
|
+
|
|
51
|
+
Инициализирует плагин (чтение параметров из URL, инициализация моста, при необходимости — авто-ресайз). Вызывать один раз перед использованием остальных методов.
|
|
52
|
+
|
|
53
|
+
**Parameters:** `options?: HostInitOptions` — опции (например `autoResize`, по умолчанию `true`).
|
|
54
|
+
|
|
55
|
+
**Throws:** `Error` — если в URL нет обязательных параметров (slot, parentOrigin, id, elementId).
|
|
56
|
+
|
|
57
|
+
```typescript
|
|
58
|
+
import { hostApi } from '@weavix/tracker-plugin-sdk';
|
|
59
|
+
|
|
60
|
+
hostApi.init({ autoResize: true });
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
---
|
|
64
|
+
|
|
65
|
+
### getTheme()
|
|
66
|
+
|
|
67
|
+
Возвращает текущую тему хоста.
|
|
68
|
+
|
|
69
|
+
**Returns:** `Promise<Theme>`
|
|
70
|
+
|
|
71
|
+
```typescript
|
|
72
|
+
const theme = await hostApi.getTheme(); // 'light' | 'light-hc' | 'dark' | 'dark-hc' | 'system'
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
---
|
|
76
|
+
|
|
77
|
+
### getLanguage()
|
|
78
|
+
|
|
79
|
+
Возвращает текущий язык хоста.
|
|
80
|
+
|
|
81
|
+
**Returns:** `Promise<string>` (например `'ru'`, `'en'`).
|
|
82
|
+
|
|
83
|
+
```typescript
|
|
84
|
+
const language = await hostApi.getLanguage();
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
---
|
|
88
|
+
|
|
89
|
+
### getContext()
|
|
90
|
+
|
|
91
|
+
Возвращает контекст слота, в котором запущен плагин. Тип зависит от слота (см. [SlotContextMap](#slotcontextmap)).
|
|
92
|
+
|
|
93
|
+
**Returns:** `Promise<SlotContextMap[TSlot]>`
|
|
94
|
+
|
|
95
|
+
```typescript
|
|
96
|
+
const context = await hostApi.getContext();
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
---
|
|
100
|
+
|
|
101
|
+
### updateContentSize()
|
|
102
|
+
|
|
103
|
+
Отправляет хосту запрос на изменение высоты окна плагина.
|
|
104
|
+
|
|
105
|
+
**Parameters:** `payload: ContentSizeUpdateRequest` (поле `height`).
|
|
106
|
+
|
|
107
|
+
**Returns:** `Promise<…>`
|
|
108
|
+
|
|
109
|
+
```typescript
|
|
110
|
+
await hostApi.updateContentSize({ height: 500 });
|
|
111
|
+
```
|
|
112
|
+
|
|
113
|
+
---
|
|
114
|
+
|
|
115
|
+
### notifyReady()
|
|
116
|
+
|
|
117
|
+
Сообщает хосту, что плагин готов к работе.
|
|
118
|
+
|
|
119
|
+
**Returns:** `Promise<…>`
|
|
120
|
+
|
|
121
|
+
```typescript
|
|
122
|
+
await hostApi.notifyReady();
|
|
123
|
+
```
|
|
124
|
+
|
|
125
|
+
---
|
|
126
|
+
|
|
127
|
+
### getSlot()
|
|
128
|
+
|
|
129
|
+
Возвращает текущий слот. Вызывать только после `init()`.
|
|
130
|
+
|
|
131
|
+
**Returns:** `TSlot` (ключ из SlotContextMap).
|
|
132
|
+
|
|
133
|
+
```typescript
|
|
134
|
+
const slot = hostApi.getSlot(); // например 'issue.action'
|
|
135
|
+
```
|
|
136
|
+
|
|
137
|
+
---
|
|
138
|
+
|
|
139
|
+
### getEntityId()
|
|
140
|
+
|
|
141
|
+
Возвращает идентификатор сущности, переданный хостом в параметрах iframe. Доступен сразу после `init()` без postMessage-запроса.
|
|
142
|
+
|
|
143
|
+
**Returns:** `string | null` — идентификатор сущности или `null`, если параметр не передан.
|
|
144
|
+
|
|
145
|
+
```typescript
|
|
146
|
+
const entityId = hostApi.getEntityId(); // например 'QUEUE-1' или null
|
|
147
|
+
```
|
|
148
|
+
|
|
149
|
+
---
|
|
150
|
+
|
|
151
|
+
### getEntityMeta()
|
|
152
|
+
|
|
153
|
+
Возвращает метаданные сущности, переданные хостом в параметрах iframe (JSON-объект). Доступны сразу после `init()` без postMessage-запроса.
|
|
154
|
+
|
|
155
|
+
**Returns:** `Record<string, string> | undefined` — объект с метаданными или `undefined`, если метаданных нет.
|
|
156
|
+
|
|
157
|
+
```typescript
|
|
158
|
+
const entityMeta = hostApi.getEntityMeta(); // например { key: 'QUEUE-1' } или undefined
|
|
159
|
+
```
|
|
160
|
+
|
|
161
|
+
---
|
|
162
|
+
|
|
163
|
+
### getContextLevel()
|
|
164
|
+
|
|
165
|
+
Возвращает уровень контекста, объявленный в манифесте плагина (через параметр iframe `contextLevel`).
|
|
166
|
+
|
|
167
|
+
- `'basic'` — плагин получает только `entityId` и `entityMeta` без postMessage-запроса к хосту.
|
|
168
|
+
- `'full'` — плагин получает полный контекст слота через `context.get` (поведение по умолчанию).
|
|
169
|
+
|
|
170
|
+
**Returns:** `ContextLevel` (`'basic' | 'full'`). По умолчанию `'full'`.
|
|
171
|
+
|
|
172
|
+
```typescript
|
|
173
|
+
const level = hostApi.getContextLevel(); // 'basic' | 'full'
|
|
174
|
+
```
|
|
175
|
+
|
|
176
|
+
---
|
|
177
|
+
|
|
178
|
+
### disableAutoResize()
|
|
179
|
+
|
|
180
|
+
Отключает автоматическое изменение размера контейнера по контенту.
|
|
181
|
+
|
|
182
|
+
```typescript
|
|
183
|
+
hostApi.disableAutoResize();
|
|
184
|
+
```
|
|
185
|
+
|
|
186
|
+
---
|
|
187
|
+
|
|
188
|
+
## uiApi
|
|
189
|
+
|
|
190
|
+
Singleton **`uiApi`** — UI-взаимодействия с хостом: навигация, тосты (`uiApi.toaster`), confirm (`uiApi.confirm`).
|
|
191
|
+
|
|
192
|
+
### navigate()
|
|
193
|
+
|
|
194
|
+
Выполнить навигацию в хост-приложении (путь Tracker, внешний URL и т.д.).
|
|
195
|
+
|
|
196
|
+
**Parameters:** `NavigateRequest` (см. [тип](#navigaterequest))
|
|
197
|
+
|
|
198
|
+
**Returns:** `Promise<void>`
|
|
199
|
+
|
|
200
|
+
```typescript
|
|
201
|
+
import { uiApi } from '@weavix/tracker-plugin-sdk';
|
|
202
|
+
|
|
203
|
+
await uiApi.navigate({
|
|
204
|
+
path: '/issues/QUEUE-1',
|
|
205
|
+
params: { tab: 'comments' },
|
|
206
|
+
options: { newTab: false },
|
|
207
|
+
});
|
|
208
|
+
```
|
|
209
|
+
|
|
210
|
+
---
|
|
211
|
+
|
|
212
|
+
## trackerApi (TrackerApi)
|
|
213
|
+
|
|
214
|
+
Класс для вызова Tracker Public API через хост (контракт `api.tracker.call`). Доступ к эндпоинтам — через типизированное API **v3**.
|
|
215
|
+
|
|
216
|
+
Описание методов и форматов ответов: [Common format](https://docs.yandex-team.ru/tracker/common-format).
|
|
217
|
+
|
|
218
|
+
Экспортируется singleton **`trackerApi`**.
|
|
219
|
+
|
|
220
|
+
### v3
|
|
221
|
+
|
|
222
|
+
Объект с методами по HTTP: `get`, `post`, `put`, `patch`, `delete`. Ключи — пути эндпоинтов из OpenAPI (`@weavix/tracker-api-types`); при обращении по пути IDE показывает подсказки и JSDoc.
|
|
223
|
+
|
|
224
|
+
**Примеры:**
|
|
225
|
+
|
|
226
|
+
```typescript
|
|
227
|
+
import { trackerApi } from '@weavix/tracker-plugin-sdk';
|
|
228
|
+
|
|
229
|
+
// GET — результат: { data, headers }
|
|
230
|
+
const { data, headers } = await trackerApi.v3.get['/issues/{id}']({
|
|
231
|
+
pathParams: { id: 'QUEUE-123' },
|
|
232
|
+
queryParams: { expand: ['COMMENTS'] },
|
|
233
|
+
});
|
|
234
|
+
|
|
235
|
+
// POST
|
|
236
|
+
await trackerApi.v3.post['/v2/issues']({
|
|
237
|
+
bodyParams: { queue: { key: 'TASK' }, summary: 'Новая задача' },
|
|
238
|
+
});
|
|
239
|
+
```
|
|
240
|
+
|
|
241
|
+
- **v3.get[path](payload)** — GET; `payload`: `pathParams`, опционально `queryParams`.
|
|
242
|
+
- **v3.post[path](payload)** / **put** / **patch** — в `payload` передаётся `bodyParams` (и при необходимости `pathParams`, `queryParams`).
|
|
243
|
+
- **v3.delete[path](payload)** — DELETE; `payload`: `pathParams`, опционально `queryParams`.
|
|
244
|
+
|
|
245
|
+
**Результат** — объект с полями **`data`** (тело ответа) и **`headers`** (полезные заголовки, `Record<string, string>`). По форме это совпадает с типом [`ApiCallResult`](#apicallresult) на стороне контракта с хостом; в **`trackerApi.v3`** TypeScript выводит для **`data`** конкретный тип ответа эндпоинта, а не `unknown`.
|
|
246
|
+
|
|
247
|
+
Во все запросы через `trackerApi.v3` в контракт уходит **version: 'v3'**.
|
|
248
|
+
|
|
249
|
+
```typescript
|
|
250
|
+
const { data, headers } = await trackerApi.v3.get['/issues/{id}']({
|
|
251
|
+
pathParams: { id: 'QUEUE-123' },
|
|
252
|
+
});
|
|
253
|
+
// data — типизирован по OpenAPI; headers — Record<string, string>
|
|
254
|
+
```
|
|
255
|
+
|
|
256
|
+
---
|
|
257
|
+
|
|
258
|
+
## Types
|
|
259
|
+
|
|
260
|
+
### TrackerApiInitOptions
|
|
261
|
+
|
|
262
|
+
Опции при создании экземпляра TrackerApi (если будет использоваться не singleton). Сейчас из core экспортируется только `trackerApi`, опции не передаются.
|
|
263
|
+
|
|
264
|
+
```typescript
|
|
265
|
+
interface TrackerApiInitOptions {
|
|
266
|
+
apiVersion?: string;
|
|
267
|
+
}
|
|
268
|
+
```
|
|
269
|
+
|
|
270
|
+
---
|
|
271
|
+
|
|
272
|
+
### TrackerApiCallOptions
|
|
273
|
+
|
|
274
|
+
Параметры вызова эндпоинта в v3: `pathParams`, `queryParams`, `bodyParams`.
|
|
275
|
+
|
|
276
|
+
```typescript
|
|
277
|
+
interface TrackerApiCallOptions {
|
|
278
|
+
pathParams?: Record<string, string>;
|
|
279
|
+
queryParams?: Record<string, unknown>;
|
|
280
|
+
bodyParams?: Record<string, unknown>;
|
|
281
|
+
}
|
|
282
|
+
```
|
|
283
|
+
|
|
284
|
+
---
|
|
285
|
+
|
|
286
|
+
### TrackerApiV3
|
|
287
|
+
|
|
288
|
+
Тип объекта `trackerApi.v3`: для каждого пути — вызов с тем же `payload`, что в типах API, а промис резолвится в **`{ data, headers }`**, где **`data`** имеет тип тела ответа этого эндпоинта.
|
|
289
|
+
|
|
290
|
+
---
|
|
291
|
+
|
|
292
|
+
### ApiCallResult
|
|
293
|
+
|
|
294
|
+
Результат вызова Tracker API через хост (`api.tracker.call`). Экспортируется из пакета.
|
|
295
|
+
|
|
296
|
+
```typescript
|
|
297
|
+
type ApiCallResult = {
|
|
298
|
+
/** Тело ответа API */
|
|
299
|
+
data: unknown;
|
|
300
|
+
/** Полезные заголовки ответа (нормализованы в строки) */
|
|
301
|
+
headers: Record<string, string>;
|
|
302
|
+
};
|
|
303
|
+
```
|
|
304
|
+
|
|
305
|
+
---
|
|
306
|
+
|
|
307
|
+
### ApiCallPayload
|
|
308
|
+
|
|
309
|
+
Полезная нагрузка, которую SDK отправляет хосту при вызове API. Обычно собирается внутри `trackerApi`; тип экспортируется для типизации на стороне хоста/обработчиков.
|
|
310
|
+
|
|
311
|
+
```typescript
|
|
312
|
+
type ApiCallPayload = {
|
|
313
|
+
version: string;
|
|
314
|
+
method: string;
|
|
315
|
+
url: string;
|
|
316
|
+
pathParams: Record<string, string>;
|
|
317
|
+
queryParams: Record<string, unknown>;
|
|
318
|
+
bodyParams: Record<string, unknown>;
|
|
319
|
+
};
|
|
320
|
+
```
|
|
321
|
+
|
|
322
|
+
---
|
|
323
|
+
|
|
324
|
+
### PluginActionError
|
|
325
|
+
|
|
326
|
+
Ошибка действия плагина (в т.ч. при вызове Tracker API через мост). Экспортируется класс **`PluginActionError`**.
|
|
327
|
+
|
|
328
|
+
- **`code`** — числовой код ошибки (см. [Коды ошибок API](#коды-ошибок-api)).
|
|
329
|
+
- **`message`** — текст сообщения.
|
|
330
|
+
- **`errorData`** (опционально) — объект/данные ошибки, которые вернул сервер (тело ответа или структурированная ошибка), если хост их передал.
|
|
331
|
+
|
|
332
|
+
```typescript
|
|
333
|
+
import { PluginActionError } from '@weavix/tracker-plugin-sdk';
|
|
334
|
+
|
|
335
|
+
try {
|
|
336
|
+
await trackerApi.v3.get['/issues/{id}']({ pathParams: { id: 'BAD' } });
|
|
337
|
+
} catch (e) {
|
|
338
|
+
if (e instanceof PluginActionError) {
|
|
339
|
+
console.log(e.code, e.message, e.errorData);
|
|
340
|
+
}
|
|
341
|
+
}
|
|
342
|
+
```
|
|
343
|
+
|
|
344
|
+
---
|
|
345
|
+
|
|
346
|
+
### Theme
|
|
347
|
+
|
|
348
|
+
Тип темы оформления хоста.
|
|
349
|
+
|
|
350
|
+
```typescript
|
|
351
|
+
type Theme = 'light' | 'light-hc' | 'dark' | 'dark-hc' | 'system';
|
|
352
|
+
```
|
|
353
|
+
|
|
354
|
+
---
|
|
355
|
+
|
|
356
|
+
### SlotContextMap
|
|
357
|
+
|
|
358
|
+
Маппинг имён слотов на типы контекста. Например, слот `issue.action` даёт контекст типа `Issue`. Типы контекста и мапа (`SlotContextMap`, `Issue` в слоте и др.) задаются пакетом **`@weavix/tracker-core`** и реэкспортируются из core.
|
|
359
|
+
|
|
360
|
+
```typescript
|
|
361
|
+
// Пример: для слота 'issue.action' getContext() вернёт Issue
|
|
362
|
+
const context = await hostApi.getContext();
|
|
363
|
+
```
|
|
364
|
+
|
|
365
|
+
---
|
|
366
|
+
|
|
367
|
+
### BasicContext
|
|
368
|
+
|
|
369
|
+
Базовый контекст плагина — доступен при `contextLevel = 'basic'` в манифесте. Содержит только данные из параметров iframe, без postMessage-запроса к хосту.
|
|
370
|
+
|
|
371
|
+
```typescript
|
|
372
|
+
type BasicContext = {
|
|
373
|
+
/** Идентификатор сущности (например, ключ задачи 'QUEUE-1') */
|
|
374
|
+
entityId: string;
|
|
375
|
+
/** Метаданные сущности, переданные хостом */
|
|
376
|
+
entityMeta?: Record<string, string>;
|
|
377
|
+
};
|
|
378
|
+
```
|
|
379
|
+
|
|
380
|
+
Используется как тип `slotContext` при вызове `useTrackerPluginContext()` или `useTrackerPluginContext('basic')` в react-пакете.
|
|
381
|
+
|
|
382
|
+
---
|
|
383
|
+
|
|
384
|
+
### ContextLevel
|
|
385
|
+
|
|
386
|
+
Уровень контекста, объявляемый в манифесте плагина в поле `contextLevel` слота.
|
|
387
|
+
|
|
388
|
+
```typescript
|
|
389
|
+
type ContextLevel = 'basic' | 'full';
|
|
390
|
+
```
|
|
391
|
+
|
|
392
|
+
- `'basic'` — плагин получает только `entityId` и `entityMeta` из параметров iframe. Вызов `context.get` не выполняется.
|
|
393
|
+
- `'full'` — плагин получает полный контекст слота через postMessage (`context.get`). Поведение по умолчанию.
|
|
394
|
+
|
|
395
|
+
**Пример в манифесте:**
|
|
396
|
+
|
|
397
|
+
```json
|
|
398
|
+
{
|
|
399
|
+
"slots": {
|
|
400
|
+
"tracker": {
|
|
401
|
+
"issue.action": [
|
|
402
|
+
{
|
|
403
|
+
"entrypoint": "index.html",
|
|
404
|
+
"contextLevel": "basic"
|
|
405
|
+
}
|
|
406
|
+
]
|
|
407
|
+
}
|
|
408
|
+
}
|
|
409
|
+
}
|
|
410
|
+
```
|
|
411
|
+
|
|
412
|
+
---
|
|
413
|
+
|
|
414
|
+
### ContentSizeUpdateRequest
|
|
415
|
+
|
|
416
|
+
Запрос на изменение размера контента плагина.
|
|
417
|
+
|
|
418
|
+
```typescript
|
|
419
|
+
type ContentSizeUpdateRequest = { height?: number };
|
|
420
|
+
```
|
|
421
|
+
|
|
422
|
+
---
|
|
423
|
+
|
|
424
|
+
### HostInitOptions
|
|
425
|
+
|
|
426
|
+
Опции инициализации хоста (передаются в `hostApi.init()`).
|
|
427
|
+
|
|
428
|
+
```typescript
|
|
429
|
+
interface HostInitOptions {
|
|
430
|
+
/** Авто-ресайз по контенту, по умолчанию true */
|
|
431
|
+
autoResize?: boolean;
|
|
432
|
+
}
|
|
433
|
+
```
|
|
434
|
+
|
|
435
|
+
---
|
|
436
|
+
|
|
437
|
+
### NavigateRequest
|
|
438
|
+
|
|
439
|
+
Запрос на навигацию в хосте (`uiApi.navigate`).
|
|
440
|
+
|
|
441
|
+
```typescript
|
|
442
|
+
type NavigateRequest = {
|
|
443
|
+
path: string;
|
|
444
|
+
params?: Record<string, string | number | boolean | null | undefined | (string | number | boolean | null | undefined)[]>;
|
|
445
|
+
options?: {
|
|
446
|
+
newTab?: boolean;
|
|
447
|
+
};
|
|
448
|
+
};
|
|
449
|
+
```
|
|
450
|
+
|
|
451
|
+
---
|
|
452
|
+
|
|
453
|
+
## Коды ошибок API
|
|
454
|
+
|
|
455
|
+
При вызовах методов хост может вернуть ошибку с кодом. Константы экспортируются из пакета:
|
|
456
|
+
|
|
457
|
+
```typescript
|
|
458
|
+
import {
|
|
459
|
+
METHOD_NOT_SUPPORTED,
|
|
460
|
+
MISSING_REQUIRED_SCOPE,
|
|
461
|
+
PLUGIN_ID_IS_NOT_CORRECT,
|
|
462
|
+
PLUGIN_ID_OR_SLOT_NOT_PROVIDED,
|
|
463
|
+
UNKNOWN_ERROR,
|
|
464
|
+
VALIDATION_ERROR,
|
|
465
|
+
} from '@weavix/tracker-plugin-sdk';
|
|
466
|
+
```
|
|
467
|
+
|
|
468
|
+
| Константа | Код | Описание |
|
|
469
|
+
|-----------|-----|----------|
|
|
470
|
+
| `PLUGIN_ID_OR_SLOT_NOT_PROVIDED` | 1000 | Не переданы обязательные параметры инициализации плагина. |
|
|
471
|
+
| `PLUGIN_ID_IS_NOT_CORRECT` | 1001 | Неверный или несовпадающий pluginId. |
|
|
472
|
+
| `VALIDATION_ERROR` | 1002 | Ошибка валидации запроса. |
|
|
473
|
+
| `METHOD_NOT_SUPPORTED` | 1003 | Метод не поддерживается. |
|
|
474
|
+
| `MISSING_REQUIRED_SCOPE` | 1004 | Недостаточно прав (scope). |
|
|
475
|
+
| `UNKNOWN_ERROR` | 6666 | Неизвестная ошибка. |
|
|
476
|
+
|
|
477
|
+
---
|
|
478
|
+
|
|
479
|
+
## Utils
|
|
480
|
+
|
|
481
|
+
### getLocalizedString()
|
|
482
|
+
|
|
483
|
+
Возвращает локализованную строку по коду языка. Тип `LocalizedString` приходит из **`@weavix/tracker-core`** (реэкспорт из core).
|
|
484
|
+
|
|
485
|
+
```typescript
|
|
486
|
+
function getLocalizedString(
|
|
487
|
+
value: LocalizedString,
|
|
488
|
+
language: string,
|
|
489
|
+
fallbackLanguage?: string,
|
|
490
|
+
): string;
|
|
491
|
+
```
|
|
492
|
+
|
|
493
|
+
### getField()
|
|
494
|
+
|
|
495
|
+
Извлекает значение из объекта по точечному пути (dot notation).
|
|
496
|
+
|
|
497
|
+
```typescript
|
|
498
|
+
function getField<T = unknown>(
|
|
499
|
+
obj: Record<string, unknown>,
|
|
500
|
+
path: string,
|
|
501
|
+
defaultValue?: T,
|
|
502
|
+
): T | undefined;
|
|
503
|
+
```
|
|
504
|
+
|
|
505
|
+
---
|
|
506
|
+
|
|
507
|
+
## Handlers
|
|
508
|
+
|
|
509
|
+
Экспортируются **getHandler**, **setHandler**, типы **HandlerFunction**, **Handlers**, **HttpMethod** — для регистрации обработчиков запросов со стороны хоста (см. контракт и слоты).
|
|
510
|
+
|
|
511
|
+
---
|
|
512
|
+
|
|
513
|
+
## Complete Example
|
|
514
|
+
|
|
515
|
+
```typescript
|
|
516
|
+
import {
|
|
517
|
+
hostApi,
|
|
518
|
+
trackerApi,
|
|
519
|
+
getField,
|
|
520
|
+
type Theme,
|
|
521
|
+
} from '@weavix/tracker-plugin-sdk';
|
|
522
|
+
|
|
523
|
+
// Инициализация обычно выполняется в TrackerPluginProvider (react)
|
|
524
|
+
hostApi.init({ autoResize: true });
|
|
525
|
+
|
|
526
|
+
const theme: Theme = await hostApi.getTheme();
|
|
527
|
+
const language = await hostApi.getLanguage();
|
|
528
|
+
const context = await hostApi.getContext();
|
|
529
|
+
|
|
530
|
+
// Вызов Tracker API v3 (в payload уходит version: 'v3')
|
|
531
|
+
const { data: issue } = await trackerApi.v3.get['/issues/{id}']({
|
|
532
|
+
pathParams: { id: 'KEY-1' },
|
|
533
|
+
queryParams: { expand: ['COMMENTS'] },
|
|
534
|
+
});
|
|
535
|
+
|
|
536
|
+
const summary = getField<string>(issue as Record<string, unknown>, 'summary', 'Без названия');
|
|
537
|
+
|
|
538
|
+
await hostApi.notifyReady();
|
|
539
|
+
```
|
|
540
|
+
|
|
541
|
+
Типы **HTTP** запросов/ответов эндпоинтов (в т.ч. `Issue` в ответе REST) задаются пакетом **@weavix/tracker-api-types**. Типы **контекста слота** и `SlotContextMap` — из **@weavix/tracker-core** (см. выше).
|
package/README.md
ADDED
|
@@ -0,0 +1,363 @@
|
|
|
1
|
+
# @weavix/tracker-plugin-sdk
|
|
2
|
+
|
|
3
|
+
Core package for Tracker plugins (Weavix / npm). API surface matches `@yandex-data-ui/tracker-plugin-sdk-core` without `yateamApi`.
|
|
4
|
+
|
|
5
|
+
> External flavor. Internal (Yandex): `@yandex-data-ui/tracker-plugin-sdk-core`.
|
|
6
|
+
|
|
7
|
+
Низкоуровневое API для взаимодействия с хостом и вызова Tracker Public API.
|
|
8
|
+
|
|
9
|
+
> **Для агентов и AI:** начните с [AGENTS.md](./AGENTS.md) и [COOKBOOK](../../docs/agent/COOKBOOK.md).
|
|
10
|
+
|
|
11
|
+
## Установка
|
|
12
|
+
|
|
13
|
+
```bash
|
|
14
|
+
npm install @weavix/tracker-plugin-sdk
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
## Использование
|
|
18
|
+
|
|
19
|
+
```typescript
|
|
20
|
+
import { hostApi, trackerApi } from '@weavix/tracker-plugin-sdk';
|
|
21
|
+
|
|
22
|
+
// Инициализация плагина (чтение параметров из URL, настройка моста)
|
|
23
|
+
hostApi.init({ autoResize: true });
|
|
24
|
+
|
|
25
|
+
// Получение текущей темы
|
|
26
|
+
const theme = await hostApi.getTheme(); // 'light' | 'light-hc' | 'dark' | 'dark-hc' | 'system' | undefined
|
|
27
|
+
|
|
28
|
+
// Получение текущего языка
|
|
29
|
+
const language = await hostApi.getLanguage(); // 'ru' | 'en' | undefined
|
|
30
|
+
|
|
31
|
+
// Получение контекста слота (например, текущей задачи для слота 'issue.action')
|
|
32
|
+
const context = await hostApi.getContext();
|
|
33
|
+
|
|
34
|
+
// Уведомление хоста о готовности плагина
|
|
35
|
+
await hostApi.notifyReady();
|
|
36
|
+
|
|
37
|
+
// Обновление высоты контейнера плагина
|
|
38
|
+
await hostApi.updateContentSize({ height: 500 });
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
## Tracker API
|
|
42
|
+
|
|
43
|
+
Все вызовы Tracker Public API выполняются через `trackerApi.v3` — типизированный прокси над HTTP-методами. Ключи — пути эндпоинтов из OpenAPI (`@weavix/tracker-api-types`); IDE предоставляет автодополнение и JSDoc.
|
|
44
|
+
|
|
45
|
+
Подробное описание методов и форматов ответов: [Tracker API Reference](https://docs.yandex-team.ru/tracker/api-ref/about-api).
|
|
46
|
+
|
|
47
|
+
```typescript
|
|
48
|
+
import { trackerApi } from '@weavix/tracker-plugin-sdk';
|
|
49
|
+
|
|
50
|
+
// GET — возвращает { data, headers }
|
|
51
|
+
const { data: issue } = await trackerApi.v3.get['/issues/{id}']({
|
|
52
|
+
pathParams: { id: 'QUEUE-123' },
|
|
53
|
+
queryParams: { expand: ['COMMENTS'] },
|
|
54
|
+
});
|
|
55
|
+
|
|
56
|
+
// POST
|
|
57
|
+
await trackerApi.v3.post['/v2/issues']({
|
|
58
|
+
bodyParams: { queue: { key: 'TASK' }, summary: 'Новая задача' },
|
|
59
|
+
});
|
|
60
|
+
|
|
61
|
+
// PATCH
|
|
62
|
+
await trackerApi.v3.patch['/v2/issues/{id}']({
|
|
63
|
+
pathParams: { id: 'QUEUE-123' },
|
|
64
|
+
bodyParams: { summary: 'Обновлённое название' },
|
|
65
|
+
});
|
|
66
|
+
|
|
67
|
+
// DELETE
|
|
68
|
+
await trackerApi.v3.delete['/v2/issues/{id}']({
|
|
69
|
+
pathParams: { id: 'QUEUE-123' },
|
|
70
|
+
});
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
### Очереди
|
|
74
|
+
|
|
75
|
+
```typescript
|
|
76
|
+
// Получение списка очередей
|
|
77
|
+
const { data: queues } = await trackerApi.v3.get['/v2/queues']({
|
|
78
|
+
queryParams: { page: 1, perPage: 100 },
|
|
79
|
+
});
|
|
80
|
+
|
|
81
|
+
// Получение конкретной очереди
|
|
82
|
+
const { data: queue } = await trackerApi.v3.get['/v2/queues/{id}']({
|
|
83
|
+
pathParams: { id: 'MYQUEUE' },
|
|
84
|
+
});
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
### Задачи
|
|
88
|
+
|
|
89
|
+
```typescript
|
|
90
|
+
// Получение задачи по ключу
|
|
91
|
+
const { data: issue } = await trackerApi.v3.get['/issues/{id}']({
|
|
92
|
+
pathParams: { id: 'QUEUE-123' },
|
|
93
|
+
});
|
|
94
|
+
|
|
95
|
+
// Создание задачи
|
|
96
|
+
const { data: newIssue } = await trackerApi.v3.post['/v2/issues']({
|
|
97
|
+
bodyParams: {
|
|
98
|
+
queue: { key: 'QUEUE' },
|
|
99
|
+
summary: 'Название задачи',
|
|
100
|
+
},
|
|
101
|
+
});
|
|
102
|
+
|
|
103
|
+
// Поиск задач
|
|
104
|
+
const { data: issues } = await trackerApi.v3.post['/v2/issues/_search']({
|
|
105
|
+
bodyParams: { filter: { queue: 'QUEUE' } },
|
|
106
|
+
});
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
## Тосты (Toast notifications)
|
|
110
|
+
|
|
111
|
+
Плагины могут показывать toast-уведомления в хост-приложении через `uiApi.toaster`. API максимально приближен к gravity-ui `useToaster`.
|
|
112
|
+
|
|
113
|
+
> **Permission:** Требуется `"toaster"` в `permissions.ui` манифеста плагина (хост преобразует в scope `tracker:ui:toaster`).
|
|
114
|
+
|
|
115
|
+
```typescript
|
|
116
|
+
import { uiApi } from '@weavix/tracker-plugin-sdk';
|
|
117
|
+
|
|
118
|
+
// Простой тост
|
|
119
|
+
uiApi.toaster.add({
|
|
120
|
+
title: 'Сохранено',
|
|
121
|
+
theme: 'success',
|
|
122
|
+
});
|
|
123
|
+
|
|
124
|
+
// Тост с текстовым содержимым и кастомным временем показа
|
|
125
|
+
uiApi.toaster.add({
|
|
126
|
+
title: 'Ошибка',
|
|
127
|
+
theme: 'danger',
|
|
128
|
+
content: 'Не удалось загрузить данные',
|
|
129
|
+
autoHiding: 10000,
|
|
130
|
+
});
|
|
131
|
+
|
|
132
|
+
// Тост с кнопкой действия
|
|
133
|
+
uiApi.toaster.add({
|
|
134
|
+
title: 'Элемент удалён',
|
|
135
|
+
theme: 'info',
|
|
136
|
+
content: 'QUEUE-123',
|
|
137
|
+
actions: [
|
|
138
|
+
{
|
|
139
|
+
label: 'Отменить',
|
|
140
|
+
onClick: () => {
|
|
141
|
+
// обработка нажатия
|
|
142
|
+
},
|
|
143
|
+
},
|
|
144
|
+
],
|
|
145
|
+
});
|
|
146
|
+
```
|
|
147
|
+
|
|
148
|
+
### `uiApi.toaster.add(options)`
|
|
149
|
+
|
|
150
|
+
| Параметр | Тип | По умолчанию | Описание |
|
|
151
|
+
|----------|-----|--------------|----------|
|
|
152
|
+
| `title` | `string` | — | Заголовок тоста (обязательный) |
|
|
153
|
+
| `name` | `string` | auto | Уникальный ключ для дедупликации. Генерируется автоматически, если не передан |
|
|
154
|
+
| `theme` | `'success' \| 'danger' \| 'warning' \| 'info'` | `'info'` | Тема (цвет и иконка) |
|
|
155
|
+
| `content` | `string` | — | Текстовое содержимое под заголовком |
|
|
156
|
+
| `autoHiding` | `number` | `5000` | Время показа в мс (от 1000 до 30000) |
|
|
157
|
+
| `isClosable` | `boolean` | `true` | Показывать кнопку закрытия |
|
|
158
|
+
| `actions` | `ToastAction[]` | — | Кнопки действий (макс. 2) |
|
|
159
|
+
|
|
160
|
+
**`ToastAction`:**
|
|
161
|
+
|
|
162
|
+
| Поле | Тип | Описание |
|
|
163
|
+
|------|-----|----------|
|
|
164
|
+
| `label` | `string` | Текст кнопки (макс. 50 символов) |
|
|
165
|
+
| `onClick` | `() => void` | Callback при нажатии |
|
|
166
|
+
|
|
167
|
+
**Возвращает:** `Promise<{ name: string }>` — имя тоста (для идентификации).
|
|
168
|
+
|
|
169
|
+
**Ограничения:**
|
|
170
|
+
- `title` — макс. 200 символов
|
|
171
|
+
- `content` — макс. 500 символов
|
|
172
|
+
- `actions` — макс. 2 кнопки
|
|
173
|
+
- Rate limit — 5 тостов за 10 секунд на плагин
|
|
174
|
+
|
|
175
|
+
## Навигация в хосте
|
|
176
|
+
|
|
177
|
+
Плагин может открыть путь в хост-приложении или внешний URL через `uiApi.navigate`:
|
|
178
|
+
|
|
179
|
+
```typescript
|
|
180
|
+
import { uiApi } from '@weavix/tracker-plugin-sdk';
|
|
181
|
+
|
|
182
|
+
await uiApi.navigate({
|
|
183
|
+
path: '/queues/MYQUEUE',
|
|
184
|
+
params: { tab: 'settings' },
|
|
185
|
+
options: { newTab: true },
|
|
186
|
+
});
|
|
187
|
+
```
|
|
188
|
+
|
|
189
|
+
| Поле | Тип | Описание |
|
|
190
|
+
|------|-----|----------|
|
|
191
|
+
| `path` | `string` | Путь или URL (обязательный) |
|
|
192
|
+
| `params` | `Record<string, string \| number \| boolean \| null \| undefined \| (string \| number \| boolean \| null \| undefined)[]>` | Query-параметры |
|
|
193
|
+
| `options.newTab` | `boolean` | Открыть в новой вкладке |
|
|
194
|
+
|
|
195
|
+
`TrackerPluginProvider` (react) перехватывает клики по внешним ссылкам в iframe и вызывает `uiApi.navigate`.
|
|
196
|
+
|
|
197
|
+
## Storage API
|
|
198
|
+
|
|
199
|
+
`storageApi` — JSON-хранилище уровня организации, опосредованное хостом. Запись общая на всю организацию: её видят все пользователи плагина, право на запись определяет хост (отдаёт его в поле `canWrite` каждой прочитанной записи).
|
|
200
|
+
|
|
201
|
+
На сегодня доступен единственный контекст — `storageApi.orgShared`.
|
|
202
|
+
|
|
203
|
+
```typescript
|
|
204
|
+
import { storageApi } from '@weavix/tracker-plugin-sdk';
|
|
205
|
+
|
|
206
|
+
// Чтение
|
|
207
|
+
const record = await storageApi.orgShared.get('settings');
|
|
208
|
+
// record: { data: { theme: 'dark' }, version: 5, canWrite: true, ... } | null
|
|
209
|
+
|
|
210
|
+
// Создание новой записи (на пустом бакете)
|
|
211
|
+
await storageApi.orgShared.patch({
|
|
212
|
+
bucket: 'settings',
|
|
213
|
+
data: { theme: 'dark', notifications: true },
|
|
214
|
+
version: 0,
|
|
215
|
+
});
|
|
216
|
+
|
|
217
|
+
// Обновление без знания текущей версии — SDK сам вычитает её и поретраит конфликты
|
|
218
|
+
await storageApi.orgShared.patch({
|
|
219
|
+
bucket: 'settings',
|
|
220
|
+
data: { count: 42 },
|
|
221
|
+
});
|
|
222
|
+
|
|
223
|
+
// Удаление отдельного поля — передайте `null`
|
|
224
|
+
await storageApi.orgShared.patch({
|
|
225
|
+
bucket: 'settings',
|
|
226
|
+
data: { theme: null },
|
|
227
|
+
});
|
|
228
|
+
```
|
|
229
|
+
|
|
230
|
+
### `storageApi.orgShared.get(bucket?)`
|
|
231
|
+
|
|
232
|
+
Возвращает `Promise<StorageRecord | null>` — текущую запись или `null`, если её ещё нет.
|
|
233
|
+
|
|
234
|
+
| Параметр | Тип | По умолчанию | Описание |
|
|
235
|
+
|----------|-----|--------------|----------|
|
|
236
|
+
| `bucket` | `string \| undefined` | хост подставляет `'default'` | Ключ записи внутри контекста |
|
|
237
|
+
|
|
238
|
+
### `storageApi.orgShared.patch(options)`
|
|
239
|
+
|
|
240
|
+
Merge-patch: поля из `data` накладываются на текущую запись поверх, значение `null` удаляет ключ. Возвращает полный смерженный `StorageRecord` с новой версией (включая поля, дописанные параллельными писателями).
|
|
241
|
+
|
|
242
|
+
| Параметр | Тип | По умолчанию | Описание |
|
|
243
|
+
|----------|-----|--------------|----------|
|
|
244
|
+
| `bucket` | `string` | хост подставляет `'default'` | Ключ записи |
|
|
245
|
+
| `data` | `Record<string, unknown>` | — | Merge-doc; `null` удаляет поле |
|
|
246
|
+
| `version` | `number \| undefined` | auto-resolve | Ожидаемая текущая версия |
|
|
247
|
+
|
|
248
|
+
**Версионирование.**
|
|
249
|
+
|
|
250
|
+
- **С явным `version`** — отправляется один запрос. Любая ошибка, включая `VERSION_CONFLICT`, пробрасывается вызывающему. Используйте, если приложение само держит актуальную версию и должно реагировать на конфликт (например, показать пользователю «данные изменились, перечитайте»). Для создания записи на пустом бакете передавайте `version: 0`.
|
|
251
|
+
- **Без `version`** — SDK сначала читает текущую версию через `get` (для пустого бакета берётся `0`), затем выполняет `patch`. На `VERSION_CONFLICT` цикл повторяется до двух раз, каждый ретрай заново читает версию. Любая другая ошибка пробрасывается мгновенно. В худшем случае — 6 round-trip-ов (3 пары GET + PATCH); на каждом ретрае в консоль пишется `console.warn`.
|
|
252
|
+
|
|
253
|
+
### Ошибки
|
|
254
|
+
|
|
255
|
+
Все ошибки storage-методов — экземпляры `PluginActionError` с числовыми кодами:
|
|
256
|
+
|
|
257
|
+
| Код | Константа | Когда |
|
|
258
|
+
|-----|-----------|-------|
|
|
259
|
+
| `1010` | `VERSION_CONFLICT` | Переданный `version` не совпал с текущим |
|
|
260
|
+
| `1011` | `DATA_TOO_LARGE` | Размер записи после операции превысил 256 KiB |
|
|
261
|
+
| `1012` | `BAD_KEY` | `bucket` не прошёл валидацию формата или длины |
|
|
262
|
+
|
|
263
|
+
```typescript
|
|
264
|
+
import { PluginActionError, VERSION_CONFLICT, storageApi } from '@weavix/tracker-plugin-sdk';
|
|
265
|
+
|
|
266
|
+
try {
|
|
267
|
+
await storageApi.orgShared.patch({ bucket: 'settings', data: { x: 1 }, version: 0 });
|
|
268
|
+
} catch (e) {
|
|
269
|
+
if (e instanceof PluginActionError && e.code === VERSION_CONFLICT) {
|
|
270
|
+
// показать пользователю, что версия устарела
|
|
271
|
+
}
|
|
272
|
+
}
|
|
273
|
+
```
|
|
274
|
+
|
|
275
|
+
### Типы
|
|
276
|
+
|
|
277
|
+
```typescript
|
|
278
|
+
import type {
|
|
279
|
+
StorageContextType, // 'orgShared' (расширяемое в будущем)
|
|
280
|
+
StorageRecord, // { key, version, data, canWrite, createdAt, updatedAt }
|
|
281
|
+
StorageGetPayload, // wire-payload для storage.get
|
|
282
|
+
StoragePatchPayload, // wire-payload для storage.patch
|
|
283
|
+
} from '@weavix/tracker-plugin-sdk';
|
|
284
|
+
```
|
|
285
|
+
|
|
286
|
+
## Обработка ошибок
|
|
287
|
+
|
|
288
|
+
```typescript
|
|
289
|
+
import { trackerApi, PluginActionError } from '@weavix/tracker-plugin-sdk';
|
|
290
|
+
|
|
291
|
+
try {
|
|
292
|
+
await trackerApi.v3.get['/issues/{id}']({ pathParams: { id: 'BAD' } });
|
|
293
|
+
} catch (e) {
|
|
294
|
+
if (e instanceof PluginActionError) {
|
|
295
|
+
console.log(e.code, e.message, e.errorData);
|
|
296
|
+
}
|
|
297
|
+
}
|
|
298
|
+
```
|
|
299
|
+
|
|
300
|
+
## API
|
|
301
|
+
|
|
302
|
+
### `hostApi`
|
|
303
|
+
|
|
304
|
+
- `init(options?)` — инициализация плагина (чтение параметров из URL, настройка моста). Вызывать один раз перед использованием остальных методов.
|
|
305
|
+
- `getTheme()` — текущая тема (`'light' | 'light-hc' | 'dark' | 'dark-hc' | 'system'`)
|
|
306
|
+
- `getLanguage()` — текущий код языка (`'ru'`, `'en'` и др.)
|
|
307
|
+
- `getContext()` — контекст слота (тип зависит от слота, см. `SlotContextMap`)
|
|
308
|
+
- `getSlot()` — имя текущего слота (вызывать после `init()`)
|
|
309
|
+
- `updateContentSize(request)` — обновление высоты контейнера плагина
|
|
310
|
+
- `notifyReady()` — уведомление хоста о готовности плагина
|
|
311
|
+
- `disableAutoResize()` — отключение автоматического изменения размера
|
|
312
|
+
|
|
313
|
+
### `uiApi`
|
|
314
|
+
|
|
315
|
+
UI-методы хоста (навигация, тосты, confirm и др.).
|
|
316
|
+
|
|
317
|
+
- `uiApi.navigate(request)` — навигация в хост-приложении. Подробности — [выше](#навигация-в-хосте).
|
|
318
|
+
- `uiApi.toaster.add(options)` — показать toast-уведомление в хост-приложении. Подробности — [выше](#тосты-toast-notifications).
|
|
319
|
+
- `uiApi.confirm.show(options)` — диалог подтверждения (permission `confirm` в манифесте).
|
|
320
|
+
|
|
321
|
+
### `trackerApi.v3`
|
|
322
|
+
|
|
323
|
+
Типизированный прокси над эндпоинтами Tracker Public API v3:
|
|
324
|
+
|
|
325
|
+
- `trackerApi.v3.get[path](payload)` — GET-запрос; `payload`: `pathParams`, опционально `queryParams`
|
|
326
|
+
- `trackerApi.v3.post[path](payload)` — POST-запрос; `payload`: `bodyParams`, опционально `pathParams`, `queryParams`
|
|
327
|
+
- `trackerApi.v3.put[path](payload)` — PUT-запрос
|
|
328
|
+
- `trackerApi.v3.patch[path](payload)` — PATCH-запрос
|
|
329
|
+
- `trackerApi.v3.delete[path](payload)` — DELETE-запрос; `payload`: `pathParams`, опционально `queryParams`
|
|
330
|
+
|
|
331
|
+
Все методы возвращают `Promise<{ data, headers }>`, где `data` типизирован согласно ответу эндпоинта.
|
|
332
|
+
|
|
333
|
+
## Типы
|
|
334
|
+
|
|
335
|
+
- **`SlotContextMap`**, контексты слотов, `LocalizedString` и связанные типы (`Issue` в контексте слота, `Attachment` и т.д.) — из **`@weavix/tracker-core`**, реэкспортируются из этого пакета.
|
|
336
|
+
- Типы **запросов и ответов HTTP** эндпоинтов Tracker Public API (`trackerApi.v3`) — из **`@weavix/tracker-api-types`**.
|
|
337
|
+
|
|
338
|
+
```typescript
|
|
339
|
+
import type {
|
|
340
|
+
Theme,
|
|
341
|
+
ApiCallResult,
|
|
342
|
+
ApiCallPayload,
|
|
343
|
+
TrackerApiCallOptions,
|
|
344
|
+
ContentSizeUpdateRequest,
|
|
345
|
+
SlotContextMap,
|
|
346
|
+
} from '@weavix/tracker-plugin-sdk';
|
|
347
|
+
```
|
|
348
|
+
|
|
349
|
+
## React-интеграция
|
|
350
|
+
|
|
351
|
+
Для React-приложений используйте [@weavix/tracker-plugin-sdk-react](../tracker-react-external/README.md) — `TrackerPluginProvider`, `useTrackerPluginContext`, `useLocalizedString`.
|
|
352
|
+
|
|
353
|
+
## Полная документация
|
|
354
|
+
|
|
355
|
+
📖 [AGENTS.md](./AGENTS.md) — краткий вход для агентов.
|
|
356
|
+
|
|
357
|
+
📖 [COOKBOOK](../../docs/agent/COOKBOOK.md) — типовые сценарии.
|
|
358
|
+
|
|
359
|
+
📖 [API Reference](./API_REFERENCE.md) — hostApi, trackerApi.v3, типы, ошибки.
|
|
360
|
+
|
|
361
|
+
## Лицензия
|
|
362
|
+
|
|
363
|
+
UNLICENSED
|
package/dist/index.mjs
ADDED
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { trackerApi as r } from "@weavix/tracker-core";
|
|
2
|
+
import { getHandler as o, getLocalizedString as E, hostApi as R, setHandler as i, storageApi as A } from "@weavix/tracker-core";
|
|
3
|
+
import { BAD_KEY as N, DATA_TOO_LARGE as p, METHOD_NOT_SUPPORTED as T, MISSING_REQUIRED_SCOPE as D, PLUGIN_ID_IS_NOT_CORRECT as a, PLUGIN_ID_OR_SLOT_NOT_PROVIDED as n, PluginActionError as s, UNKNOWN_ERROR as S, VALIDATION_ERROR as c, VERSION_CONFLICT as L, dispatchHostEvent as P, getField as g, on as d, resetEventBus as l, uiApi as C } from "@weavix/sdk-core";
|
|
4
|
+
const e = r;
|
|
5
|
+
export {
|
|
6
|
+
N as BAD_KEY,
|
|
7
|
+
p as DATA_TOO_LARGE,
|
|
8
|
+
T as METHOD_NOT_SUPPORTED,
|
|
9
|
+
D as MISSING_REQUIRED_SCOPE,
|
|
10
|
+
a as PLUGIN_ID_IS_NOT_CORRECT,
|
|
11
|
+
n as PLUGIN_ID_OR_SLOT_NOT_PROVIDED,
|
|
12
|
+
s as PluginActionError,
|
|
13
|
+
S as UNKNOWN_ERROR,
|
|
14
|
+
c as VALIDATION_ERROR,
|
|
15
|
+
L as VERSION_CONFLICT,
|
|
16
|
+
P as dispatchHostEvent,
|
|
17
|
+
g as getField,
|
|
18
|
+
o as getHandler,
|
|
19
|
+
E as getLocalizedString,
|
|
20
|
+
R as hostApi,
|
|
21
|
+
d as on,
|
|
22
|
+
l as resetEventBus,
|
|
23
|
+
i as setHandler,
|
|
24
|
+
A as storageApi,
|
|
25
|
+
e as trackerApi,
|
|
26
|
+
C as uiApi
|
|
27
|
+
};
|
|
28
|
+
//# sourceMappingURL=index.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.mjs","sources":["../src/api/trackerApi.ts"],"sourcesContent":["import type {\n ApiV3DeleteMethods,\n ApiV3GetMethods,\n ApiV3PatchMethods,\n ApiV3PostMethods,\n ApiV3PutMethods,\n} from '@weavix/tracker-api-types';\nimport {\n type TrackerApiCallOptions as BaseCallOptions,\n type TrackerApiInitOptions as BaseInitOptions,\n trackerApi as trackerApiBase,\n} from '@weavix/tracker-core';\n\nexport type TrackerApiCallOptions = BaseCallOptions;\nexport type TrackerApiInitOptions = BaseInitOptions;\n\ntype ApiResult<M> = {\n [K in keyof M]: M[K] extends (...args: infer A) => Promise<infer R>\n ? (...args: A) => Promise<{ data: R; headers: Record<string, string> }>\n : never;\n};\n\nexport interface TrackerApiV3 {\n get: ApiResult<ApiV3GetMethods>;\n post: ApiResult<ApiV3PostMethods>;\n put: ApiResult<ApiV3PutMethods>;\n patch: ApiResult<ApiV3PatchMethods>;\n delete: ApiResult<ApiV3DeleteMethods>;\n}\n\nexport interface TrackerApi {\n v3: TrackerApiV3;\n}\n\nexport const trackerApi = trackerApiBase as unknown as TrackerApi;\n"],"names":["trackerApi","trackerApiBase"],"mappings":";;;AAkCO,MAAMA,IAAaC;"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { ApiV3DeleteMethods, ApiV3GetMethods, ApiV3PatchMethods, ApiV3PostMethods, ApiV3PutMethods } from '@weavix/tracker-api-types';
|
|
2
|
+
import { TrackerApiCallOptions as BaseCallOptions, TrackerApiInitOptions as BaseInitOptions } from '@weavix/tracker-core';
|
|
3
|
+
export type TrackerApiCallOptions = BaseCallOptions;
|
|
4
|
+
export type TrackerApiInitOptions = BaseInitOptions;
|
|
5
|
+
type ApiResult<M> = {
|
|
6
|
+
[K in keyof M]: M[K] extends (...args: infer A) => Promise<infer R> ? (...args: A) => Promise<{
|
|
7
|
+
data: R;
|
|
8
|
+
headers: Record<string, string>;
|
|
9
|
+
}> : never;
|
|
10
|
+
};
|
|
11
|
+
export interface TrackerApiV3 {
|
|
12
|
+
get: ApiResult<ApiV3GetMethods>;
|
|
13
|
+
post: ApiResult<ApiV3PostMethods>;
|
|
14
|
+
put: ApiResult<ApiV3PutMethods>;
|
|
15
|
+
patch: ApiResult<ApiV3PatchMethods>;
|
|
16
|
+
delete: ApiResult<ApiV3DeleteMethods>;
|
|
17
|
+
}
|
|
18
|
+
export interface TrackerApi {
|
|
19
|
+
v3: TrackerApiV3;
|
|
20
|
+
}
|
|
21
|
+
export declare const trackerApi: TrackerApi;
|
|
22
|
+
export {};
|
|
23
|
+
//# sourceMappingURL=trackerApi.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"trackerApi.d.ts","sourceRoot":"","sources":["../../../../src/api/trackerApi.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACR,kBAAkB,EAClB,eAAe,EACf,iBAAiB,EACjB,gBAAgB,EAChB,eAAe,EAClB,MAAM,2BAA2B,CAAC;AACnC,OAAO,EACH,KAAK,qBAAqB,IAAI,eAAe,EAC7C,KAAK,qBAAqB,IAAI,eAAe,EAEhD,MAAM,sBAAsB,CAAC;AAE9B,MAAM,MAAM,qBAAqB,GAAG,eAAe,CAAC;AACpD,MAAM,MAAM,qBAAqB,GAAG,eAAe,CAAC;AAEpD,KAAK,SAAS,CAAC,CAAC,IAAI;KACf,CAAC,IAAI,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,GAAG,IAAI,EAAE,MAAM,CAAC,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC,GAC7D,CAAC,GAAG,IAAI,EAAE,CAAC,KAAK,OAAO,CAAC;QAAE,IAAI,EAAE,CAAC,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;KAAE,CAAC,GACrE,KAAK;CACd,CAAC;AAEF,MAAM,WAAW,YAAY;IACzB,GAAG,EAAE,SAAS,CAAC,eAAe,CAAC,CAAC;IAChC,IAAI,EAAE,SAAS,CAAC,gBAAgB,CAAC,CAAC;IAClC,GAAG,EAAE,SAAS,CAAC,eAAe,CAAC,CAAC;IAChC,KAAK,EAAE,SAAS,CAAC,iBAAiB,CAAC,CAAC;IACpC,MAAM,EAAE,SAAS,CAAC,kBAAkB,CAAC,CAAC;CACzC;AAED,MAAM,WAAW,UAAU;IACvB,EAAE,EAAE,YAAY,CAAC;CACpB;AAED,eAAO,MAAM,UAAU,EAAgC,UAAU,CAAC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
export { hostApi } from '@weavix/tracker-core';
|
|
2
|
+
export type { ApiCallPayload, ApiCallResult, HostApi } from '@weavix/tracker-core';
|
|
3
|
+
export { trackerApi } from './api/trackerApi';
|
|
4
|
+
export type { TrackerApi, TrackerApiCallOptions, TrackerApiInitOptions, TrackerApiV3, } from './api/trackerApi';
|
|
5
|
+
export type { ContentSizeUpdateRequest } from '../../plugin-sdk-core/src/index.ts';
|
|
6
|
+
export { getHandler, setHandler } from '@weavix/tracker-core';
|
|
7
|
+
export type { GetDataResultMap, HandlerFunction, Handlers, HttpMethod } from '@weavix/tracker-core';
|
|
8
|
+
export { dispatchHostEvent, on, resetEventBus } from '../../plugin-sdk-core/src/index.ts';
|
|
9
|
+
export type { EventMessage, HostEventCallback, HostEventContract, HostEventMethod, Unsubscribe, } from '../../plugin-sdk-core/src/index.ts';
|
|
10
|
+
export { BAD_KEY, DATA_TOO_LARGE, METHOD_NOT_SUPPORTED, MISSING_REQUIRED_SCOPE, PLUGIN_ID_IS_NOT_CORRECT, PLUGIN_ID_OR_SLOT_NOT_PROVIDED, PluginActionError, UNKNOWN_ERROR, VALIDATION_ERROR, VERSION_CONFLICT, } from '../../plugin-sdk-core/src/index.ts';
|
|
11
|
+
export type { BasicContext, ContextLevel, Theme } from '../../plugin-sdk-core/src/index.ts';
|
|
12
|
+
export type { Attachment, AttachmentViewerActionSlotContext, BoardTabSlotContext, GoalSlotContext, Issue, IssueCommentActionSlotContext, LocalizedString, MetaEntityV2, PortfolioSlotContext, ProjectSlotContext, SlotContextMap, TriggerActionData, TriggerCreateActionsSlotContext, TriggerEditActionsSlotContext, } from '@weavix/tracker-core';
|
|
13
|
+
export { uiApi } from '../../plugin-sdk-core/src/index.ts';
|
|
14
|
+
export type { ConfirmOptions, ConfirmResult, ToastAction, ToastOptions } from '../../plugin-sdk-core/src/index.ts';
|
|
15
|
+
export { getField } from '../../plugin-sdk-core/src/index.ts';
|
|
16
|
+
export { getLocalizedString } from '@weavix/tracker-core';
|
|
17
|
+
export { storageApi } from '@weavix/tracker-core';
|
|
18
|
+
export type { StorageContextType, StorageGetPayload, StoragePatchPayload, StorageRecord, } from '@weavix/tracker-core';
|
|
19
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AAC/C,YAAY,EAAE,cAAc,EAAE,aAAa,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AACnF,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,YAAY,EACR,UAAU,EACV,qBAAqB,EACrB,qBAAqB,EACrB,YAAY,GACf,MAAM,kBAAkB,CAAC;AAG1B,YAAY,EAAE,wBAAwB,EAAE,MAAM,kBAAkB,CAAC;AAGjE,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAC9D,YAAY,EAAE,gBAAgB,EAAE,eAAe,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAGpG,OAAO,EAAE,iBAAiB,EAAE,EAAE,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACxE,YAAY,EACR,YAAY,EACZ,iBAAiB,EACjB,iBAAiB,EACjB,eAAe,EACf,WAAW,GACd,MAAM,kBAAkB,CAAC;AAG1B,OAAO,EACH,OAAO,EACP,cAAc,EACd,oBAAoB,EACpB,sBAAsB,EACtB,wBAAwB,EACxB,8BAA8B,EAC9B,iBAAiB,EACjB,aAAa,EACb,gBAAgB,EAChB,gBAAgB,GACnB,MAAM,kBAAkB,CAAC;AAG1B,YAAY,EAAE,YAAY,EAAE,YAAY,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAC1E,YAAY,EACR,UAAU,EACV,iCAAiC,EACjC,mBAAmB,EACnB,eAAe,EACf,KAAK,EACL,6BAA6B,EAC7B,eAAe,EACf,YAAY,EACZ,oBAAoB,EACpB,kBAAkB,EAClB,cAAc,EACd,iBAAiB,EACjB,+BAA+B,EAC/B,6BAA6B,GAChC,MAAM,sBAAsB,CAAC;AAG9B,OAAO,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACzC,YAAY,EAAE,cAAc,EAAE,aAAa,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAGjG,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAG1D,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAClD,YAAY,EACR,kBAAkB,EAClB,iBAAiB,EACjB,mBAAmB,EACnB,aAAa,GAChB,MAAM,sBAAsB,CAAC"}
|
package/package.json
ADDED
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@weavix/tracker-plugin-sdk",
|
|
3
|
+
"version": "0.0.1",
|
|
4
|
+
"exports": {
|
|
5
|
+
".": {
|
|
6
|
+
"types": "./dist/index.d.ts",
|
|
7
|
+
"import": "./dist/index.mjs"
|
|
8
|
+
}
|
|
9
|
+
},
|
|
10
|
+
"files": [
|
|
11
|
+
"dist",
|
|
12
|
+
"README.md",
|
|
13
|
+
"AGENTS.md",
|
|
14
|
+
"API_REFERENCE.md"
|
|
15
|
+
],
|
|
16
|
+
"keywords": [],
|
|
17
|
+
"author": "Tracker Team",
|
|
18
|
+
"license": "UNLICENSED",
|
|
19
|
+
"description": "Core package for Tracker plugin SDK (Weavix flavor)",
|
|
20
|
+
"publishConfig": {
|
|
21
|
+
"registry": "https://registry.npmjs.org/",
|
|
22
|
+
"access": "public"
|
|
23
|
+
},
|
|
24
|
+
"peerDependencies": {
|
|
25
|
+
"@weavix/sdk-core": "^0.0.3",
|
|
26
|
+
"@weavix/tracker-api-types": ">=0.0.0",
|
|
27
|
+
"@weavix/tracker-core": "^0.0.1"
|
|
28
|
+
},
|
|
29
|
+
"devDependencies": {
|
|
30
|
+
"@types/jest": "*",
|
|
31
|
+
"@weavix/tracker-api-types": "*",
|
|
32
|
+
"@weavix/sdk-core": "0.0.0",
|
|
33
|
+
"@weavix/tracker-core": "0.0.1"
|
|
34
|
+
},
|
|
35
|
+
"scripts": {
|
|
36
|
+
"build": "vite build",
|
|
37
|
+
"typecheck": "tsc --noEmit"
|
|
38
|
+
}
|
|
39
|
+
}
|