daiso 1.0.9 → 1.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.
Files changed (86) hide show
  1. package/README.md +88 -9
  2. package/dist/api/actionsProxy.js +3 -0
  3. package/dist/api/cgvHandlers.js +15 -3
  4. package/dist/api/configStatus.js +1 -1
  5. package/dist/api/dtryxHandlers.js +113 -0
  6. package/dist/api/emart24Handlers.js +6 -2
  7. package/dist/api/gs25Handlers.js +22 -19
  8. package/dist/api/handlers.js +3 -0
  9. package/dist/api/healthCheckDefinitions.js +56 -8
  10. package/dist/api/healthCheckShape.js +24 -8
  11. package/dist/api/healthChecks.js +48 -20
  12. package/dist/api/operationalAuth.js +32 -0
  13. package/dist/api/routes/dtryxRoutes.js +22 -0
  14. package/dist/api/routes/healthRoutes.js +19 -11
  15. package/dist/api/routes/rateLimitStatsRoutes.js +274 -0
  16. package/dist/api/routes/registerServiceRoutes.js +37 -0
  17. package/dist/api/sevenelevenHandlers.js +7 -3
  18. package/dist/cli/commandOptions.js +24 -0
  19. package/dist/cli/commands/cinema.js +27 -0
  20. package/dist/cli/commands/convenience.js +2 -2
  21. package/dist/cli.js +7 -1
  22. package/dist/cliHelp.js +3 -337
  23. package/dist/cliHelpDefinitions.js +369 -0
  24. package/dist/cliInteractive.js +8 -5
  25. package/dist/core/errors.js +17 -2
  26. package/dist/core/registry.js +13 -15
  27. package/dist/durableObjects/dailyRateLimiter.js +185 -0
  28. package/dist/durableObjects/rateLimitMetricsStore.js +144 -0
  29. package/dist/index.js +16 -30
  30. package/dist/middleware/dailyRateLimit.js +176 -0
  31. package/dist/pages/openapiFullSpec.js +2 -0
  32. package/dist/pages/openapiSpecActionParameters.js +429 -0
  33. package/dist/pages/openapiSpecActions.js +1 -391
  34. package/dist/pages/openapiSpecComponentsLottecinema.js +2 -2
  35. package/dist/pages/openapiSpecPathsDtryx.js +148 -0
  36. package/dist/pages/openapiSpecPathsLotteMart.js +10 -2
  37. package/dist/pages/promptRetailCinemaText.js +9 -1
  38. package/dist/services/cgv/client.js +7 -4
  39. package/dist/services/cgv/errors.js +12 -0
  40. package/dist/services/cgv/transport.js +19 -2
  41. package/dist/services/cu/client.js +42 -12
  42. package/dist/services/cu/index.js +13 -3
  43. package/dist/services/cu/tools/checkInventory.js +65 -45
  44. package/dist/services/cu/tools/findNearbyStores.js +4 -3
  45. package/dist/services/cu/upstreamError.js +15 -0
  46. package/dist/services/dtryx/api.js +25 -0
  47. package/dist/services/dtryx/client.js +133 -0
  48. package/dist/services/dtryx/index.js +24 -0
  49. package/dist/services/dtryx/location.js +216 -0
  50. package/dist/services/dtryx/tools/getRemainingSeats.js +117 -0
  51. package/dist/services/dtryx/tools/listCinemas.js +46 -0
  52. package/dist/services/dtryx/tools/listNowShowing.js +77 -0
  53. package/dist/services/dtryx/types.js +4 -0
  54. package/dist/services/dtryx/validation.js +21 -0
  55. package/dist/services/emart24/tools/searchProducts.js +37 -19
  56. package/dist/services/feedback/tools/submitDeveloperRequest.js +15 -1
  57. package/dist/services/gs25/api.js +2 -2
  58. package/dist/services/gs25/client.js +16 -123
  59. package/dist/services/gs25/errors.js +12 -0
  60. package/dist/services/gs25/index.js +2 -2
  61. package/dist/services/gs25/productSearch.js +1 -0
  62. package/dist/services/gs25/storeStockTransport.js +55 -0
  63. package/dist/services/gs25/tools/checkInventory.js +7 -2
  64. package/dist/services/gs25/tools/findNearbyStores.js +20 -5
  65. package/dist/services/lottecinema/client.js +4 -2
  66. package/dist/services/lottemart/config.js +1 -1
  67. package/dist/services/lottemart/session.js +29 -160
  68. package/dist/services/lottemart/socketTransport.js +149 -0
  69. package/dist/services/oliveyoung/client.js +1 -0
  70. package/dist/services/places/client.js +29 -8
  71. package/dist/services/seveneleven/client.js +18 -8
  72. package/dist/services/seveneleven/index.js +11 -7
  73. package/dist/services/seveneleven/inventory.js +5 -2
  74. package/dist/services/seveneleven/productKeyword.js +3 -2
  75. package/dist/services/seveneleven/tools/checkInventory.js +4 -3
  76. package/dist/services/seveneleven/tools/getCatalogSnapshot.js +4 -3
  77. package/dist/services/seveneleven/tools/getSearchPopwords.js +4 -3
  78. package/dist/services/seveneleven/tools/searchProducts.js +40 -20
  79. package/dist/services/seveneleven/tools/searchStores.js +4 -3
  80. package/dist/utils/format.js +10 -3
  81. package/dist/utils/http.js +38 -10
  82. package/dist/utils/zyte.js +13 -2
  83. package/dist/utils/zyteJsonFallback.js +67 -0
  84. package/openapi.json +51 -3
  85. package/openapi.yaml +36 -3
  86. package/package.json +28 -24
@@ -0,0 +1,429 @@
1
+ /**
2
+ * OpenAI Actions용 축약 OpenAPI 스펙
3
+ */
4
+ import { ACTION_QUERY_ACTIONS } from '../api/actionsProxy.js';
5
+ export const ACTION_QUERY_PARAMETERS = [
6
+ {
7
+ name: 'cinemaCode',
8
+ in: 'query',
9
+ required: false,
10
+ description: '디트릭스 극장 코드',
11
+ schema: { type: 'string' },
12
+ },
13
+ {
14
+ name: 'brandCode',
15
+ in: 'query',
16
+ required: false,
17
+ description: '디트릭스 브랜드 코드',
18
+ schema: { type: 'string' },
19
+ },
20
+ {
21
+ name: 'region',
22
+ in: 'query',
23
+ required: false,
24
+ description: '디트릭스 광역 지역명',
25
+ schema: { type: 'string' },
26
+ },
27
+ {
28
+ name: 'movieName',
29
+ in: 'query',
30
+ required: false,
31
+ description: '디트릭스 영화명 부분 일치',
32
+ schema: { type: 'string' },
33
+ },
34
+ {
35
+ name: 'includePlayDates',
36
+ in: 'query',
37
+ required: false,
38
+ description: '디트릭스 상영 가능 날짜 포함',
39
+ schema: { type: 'boolean' },
40
+ },
41
+ {
42
+ name: 'action',
43
+ in: 'query',
44
+ required: true,
45
+ description: '실행할 액션 이름입니다. 사용 가능한 값은 enum 목록을 참고하세요.',
46
+ schema: {
47
+ type: 'string',
48
+ enum: ACTION_QUERY_ACTIONS,
49
+ },
50
+ },
51
+ {
52
+ name: 'q',
53
+ in: 'query',
54
+ required: false,
55
+ description: '다이소 제품 검색어',
56
+ schema: { type: 'string' },
57
+ },
58
+ {
59
+ name: 'query',
60
+ in: 'query',
61
+ required: false,
62
+ description: '세븐일레븐 상품 검색어',
63
+ schema: { type: 'string' },
64
+ },
65
+ {
66
+ name: 'itemCode',
67
+ in: 'query',
68
+ required: false,
69
+ description: 'GS25 상품 코드',
70
+ schema: { type: 'string' },
71
+ },
72
+ {
73
+ name: 'productId',
74
+ in: 'query',
75
+ required: false,
76
+ description: '제품 ID 또는 상세 조회용 path 파라미터. 상품명만 알면 먼저 daisoSearchProducts 또는 /api/daiso/products로 productId를 확인하세요.',
77
+ schema: { type: 'string' },
78
+ },
79
+ {
80
+ name: 'keyword',
81
+ in: 'query',
82
+ required: false,
83
+ description: '공통 키워드 파라미터',
84
+ schema: { type: 'string' },
85
+ },
86
+ {
87
+ name: 'location',
88
+ in: 'query',
89
+ required: false,
90
+ description: '주변 장소 검색 지역/역/주소 키워드',
91
+ schema: { type: 'string' },
92
+ },
93
+ {
94
+ name: 'category',
95
+ in: 'query',
96
+ required: false,
97
+ description: '주변 장소 카테고리(restaurant, cafe, food, dessert, all)',
98
+ schema: { type: 'string' },
99
+ },
100
+ {
101
+ name: 'services',
102
+ in: 'query',
103
+ required: false,
104
+ description: '통합 비교 서비스 목록(daiso,gs25,seveneleven,emart24)',
105
+ schema: { type: 'string' },
106
+ },
107
+ {
108
+ name: 'type',
109
+ in: 'query',
110
+ required: false,
111
+ description: '개발자 요청 유형(bug, improvement, feature, docs, other)',
112
+ schema: { type: 'string' },
113
+ },
114
+ {
115
+ name: 'severity',
116
+ in: 'query',
117
+ required: false,
118
+ description: '개발자 요청 영향도(low, medium, high, critical)',
119
+ schema: { type: 'string' },
120
+ },
121
+ {
122
+ name: 'title',
123
+ in: 'query',
124
+ required: false,
125
+ description: '개발자 요청 제목',
126
+ schema: { type: 'string' },
127
+ },
128
+ {
129
+ name: 'description',
130
+ in: 'query',
131
+ required: false,
132
+ description: '개발자 요청 상세 설명',
133
+ schema: { type: 'string' },
134
+ },
135
+ {
136
+ name: 'toolName',
137
+ in: 'query',
138
+ required: false,
139
+ description: '문제가 발생했거나 개선이 필요한 MCP 도구 이름',
140
+ schema: { type: 'string' },
141
+ },
142
+ {
143
+ name: 'reproduction',
144
+ in: 'query',
145
+ required: false,
146
+ description: '오류 재현 방법',
147
+ schema: { type: 'string' },
148
+ },
149
+ {
150
+ name: 'expected',
151
+ in: 'query',
152
+ required: false,
153
+ description: '기대 결과',
154
+ schema: { type: 'string' },
155
+ },
156
+ {
157
+ name: 'actual',
158
+ in: 'query',
159
+ required: false,
160
+ description: '실제 결과',
161
+ schema: { type: 'string' },
162
+ },
163
+ {
164
+ name: 'source',
165
+ in: 'query',
166
+ required: false,
167
+ description: '요청 출처(mcp, chatgpt, claude, cli, api, other)',
168
+ schema: { type: 'string' },
169
+ },
170
+ {
171
+ name: 'sido',
172
+ in: 'query',
173
+ required: false,
174
+ description: '다이소 시/도',
175
+ schema: { type: 'string' },
176
+ },
177
+ {
178
+ name: 'gugun',
179
+ in: 'query',
180
+ required: false,
181
+ description: '다이소 구/군',
182
+ schema: { type: 'string' },
183
+ },
184
+ {
185
+ name: 'dong',
186
+ in: 'query',
187
+ required: false,
188
+ description: '다이소 동',
189
+ schema: { type: 'string' },
190
+ },
191
+ {
192
+ name: 'area',
193
+ in: 'query',
194
+ required: false,
195
+ description: '롯데마트 지역',
196
+ schema: { type: 'string' },
197
+ },
198
+ {
199
+ name: 'area1',
200
+ in: 'query',
201
+ required: false,
202
+ description: '이마트24 1차 지역',
203
+ schema: { type: 'string' },
204
+ },
205
+ {
206
+ name: 'area2',
207
+ in: 'query',
208
+ required: false,
209
+ description: '이마트24 2차 지역',
210
+ schema: { type: 'string' },
211
+ },
212
+ {
213
+ name: 'areaCode',
214
+ in: 'query',
215
+ required: false,
216
+ description: '메가박스 지역 코드',
217
+ schema: { type: 'string' },
218
+ },
219
+ {
220
+ name: 'brandVariant',
221
+ in: 'query',
222
+ required: false,
223
+ description: '롯데마트 브랜드 변형',
224
+ schema: { type: 'string' },
225
+ },
226
+ {
227
+ name: 'lat',
228
+ in: 'query',
229
+ required: false,
230
+ description: '위도',
231
+ schema: { type: 'number', format: 'float' },
232
+ },
233
+ {
234
+ name: 'lng',
235
+ in: 'query',
236
+ required: false,
237
+ description: '경도',
238
+ schema: { type: 'number', format: 'float' },
239
+ },
240
+ {
241
+ name: 'page',
242
+ in: 'query',
243
+ required: false,
244
+ description: '페이지 번호',
245
+ schema: { type: 'integer' },
246
+ },
247
+ {
248
+ name: 'pageIdx',
249
+ in: 'query',
250
+ required: false,
251
+ description: '올리브영 페이지 번호',
252
+ schema: { type: 'integer' },
253
+ },
254
+ {
255
+ name: 'pageLimit',
256
+ in: 'query',
257
+ required: false,
258
+ description: '롯데마트 추가 페이지 수',
259
+ schema: { type: 'integer' },
260
+ },
261
+ {
262
+ name: 'pageSize',
263
+ in: 'query',
264
+ required: false,
265
+ description: '페이지 크기',
266
+ schema: { type: 'integer' },
267
+ },
268
+ {
269
+ name: 'size',
270
+ in: 'query',
271
+ required: false,
272
+ description: '페이지 크기 또는 검색 크기',
273
+ schema: { type: 'integer' },
274
+ },
275
+ {
276
+ name: 'offset',
277
+ in: 'query',
278
+ required: false,
279
+ description: 'CU 검색 오프셋',
280
+ schema: { type: 'integer' },
281
+ },
282
+ {
283
+ name: 'limit',
284
+ in: 'query',
285
+ required: false,
286
+ description: '최대 결과 수',
287
+ schema: { type: 'integer' },
288
+ },
289
+ {
290
+ name: 'storeLimit',
291
+ in: 'query',
292
+ required: false,
293
+ description: '매장 결과 제한 수',
294
+ schema: { type: 'integer' },
295
+ },
296
+ {
297
+ name: 'storeCode',
298
+ in: 'query',
299
+ required: false,
300
+ description: '매장 코드. 다이소 진열 위치는 /api/daiso/inventory 응답의 storeInventory.stores[].storeCode에서 확인하세요.',
301
+ schema: { type: 'string' },
302
+ },
303
+ {
304
+ name: 'storeName',
305
+ in: 'query',
306
+ required: false,
307
+ description: '매장명. 롯데마트 상품 조회에서 storeCode가 없을 때 사용하며, 모르면 먼저 lottemartFindNearbyStores 또는 /api/lottemart/stores로 확인하세요.',
308
+ schema: { type: 'string' },
309
+ },
310
+ {
311
+ name: 'storeKeyword',
312
+ in: 'query',
313
+ required: false,
314
+ description: '매장 키워드',
315
+ schema: { type: 'string' },
316
+ },
317
+ {
318
+ name: 'playDate',
319
+ in: 'query',
320
+ required: false,
321
+ description: '상영일(YYYYMMDD)',
322
+ schema: { type: 'string' },
323
+ },
324
+ {
325
+ name: 'regionCode',
326
+ in: 'query',
327
+ required: false,
328
+ description: 'CGV 지역 코드',
329
+ schema: { type: 'string' },
330
+ },
331
+ {
332
+ name: 'theaterCode',
333
+ in: 'query',
334
+ required: false,
335
+ description: 'CGV 극장 코드',
336
+ schema: { type: 'string' },
337
+ },
338
+ {
339
+ name: 'theaterId',
340
+ in: 'query',
341
+ required: false,
342
+ description: '메가박스/롯데시네마 지점 ID',
343
+ schema: { type: 'string' },
344
+ },
345
+ {
346
+ name: 'movieCode',
347
+ in: 'query',
348
+ required: false,
349
+ description: 'CGV 영화 코드',
350
+ schema: { type: 'string' },
351
+ },
352
+ {
353
+ name: 'movieId',
354
+ in: 'query',
355
+ required: false,
356
+ description: '메가박스/롯데시네마 영화 ID',
357
+ schema: { type: 'string' },
358
+ },
359
+ {
360
+ name: 'pluCd',
361
+ in: 'query',
362
+ required: false,
363
+ description: '이마트24 상품 PLU 코드',
364
+ schema: { type: 'string' },
365
+ },
366
+ {
367
+ name: 'bizNoArr',
368
+ in: 'query',
369
+ required: false,
370
+ description: '이마트24 사업자번호 목록',
371
+ schema: { type: 'string' },
372
+ },
373
+ {
374
+ name: 'label',
375
+ in: 'query',
376
+ required: false,
377
+ description: '세븐일레븐 인기 검색어 라벨',
378
+ schema: { type: 'string' },
379
+ },
380
+ {
381
+ name: 'sort',
382
+ in: 'query',
383
+ required: false,
384
+ description: '정렬 기준',
385
+ schema: { type: 'string' },
386
+ },
387
+ {
388
+ name: 'searchSort',
389
+ in: 'query',
390
+ required: false,
391
+ description: 'CU 검색 정렬 기준',
392
+ schema: { type: 'string' },
393
+ },
394
+ {
395
+ name: 'service24h',
396
+ in: 'query',
397
+ required: false,
398
+ description: '이마트24 24시간 필터',
399
+ schema: { type: 'boolean' },
400
+ },
401
+ {
402
+ name: 'includeSoldOut',
403
+ in: 'query',
404
+ required: false,
405
+ description: '올리브영 품절 포함 여부',
406
+ schema: { type: 'boolean' },
407
+ },
408
+ {
409
+ name: 'includeIssues',
410
+ in: 'query',
411
+ required: false,
412
+ description: '세븐일레븐 이달의 행사지 포함 여부',
413
+ schema: { type: 'boolean' },
414
+ },
415
+ {
416
+ name: 'includeExhibition',
417
+ in: 'query',
418
+ required: false,
419
+ description: '세븐일레븐 전시상품 포함 여부',
420
+ schema: { type: 'boolean' },
421
+ },
422
+ {
423
+ name: 'timeoutMs',
424
+ in: 'query',
425
+ required: false,
426
+ description: '원본 요청 타임아웃(ms), 디트릭스는 1~60000',
427
+ schema: { type: 'integer' },
428
+ },
429
+ ];