@shepai/cli 1.86.0 → 1.86.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.
Files changed (165) hide show
  1. package/dist/src/presentation/web/app/api/attachments/upload-from-path/route.d.ts +3 -0
  2. package/dist/src/presentation/web/app/api/attachments/upload-from-path/route.d.ts.map +1 -0
  3. package/dist/src/presentation/web/app/api/attachments/upload-from-path/route.js +120 -0
  4. package/dist/src/presentation/web/components/common/feature-create-drawer/feature-create-drawer.d.ts.map +1 -1
  5. package/dist/src/presentation/web/components/common/feature-create-drawer/feature-create-drawer.js +38 -13
  6. package/dist/tsconfig.build.tsbuildinfo +1 -1
  7. package/package.json +1 -1
  8. package/web/.next/BUILD_ID +1 -1
  9. package/web/.next/app-path-routes-manifest.json +1 -0
  10. package/web/.next/build-manifest.json +2 -2
  11. package/web/.next/fallback-build-manifest.json +2 -2
  12. package/web/.next/prerender-manifest.json +3 -3
  13. package/web/.next/required-server-files.js +1 -1
  14. package/web/.next/required-server-files.json +1 -1
  15. package/web/.next/routes-manifest.json +6 -0
  16. package/web/.next/server/app/(dashboard)/@drawer/create/page/server-reference-manifest.json +18 -18
  17. package/web/.next/server/app/(dashboard)/@drawer/create/page.js +1 -1
  18. package/web/.next/server/app/(dashboard)/@drawer/create/page.js.nft.json +1 -1
  19. package/web/.next/server/app/(dashboard)/@drawer/create/page_client-reference-manifest.js +1 -1
  20. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page/server-reference-manifest.json +21 -21
  21. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page.js +1 -1
  22. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page.js.nft.json +1 -1
  23. package/web/.next/server/app/(dashboard)/@drawer/feature/[featureId]/page_client-reference-manifest.js +1 -1
  24. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page/server-reference-manifest.json +14 -14
  25. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page.js +1 -1
  26. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page.js.nft.json +1 -1
  27. package/web/.next/server/app/(dashboard)/@drawer/repository/[repositoryId]/page_client-reference-manifest.js +1 -1
  28. package/web/.next/server/app/(dashboard)/create/page/server-reference-manifest.json +18 -18
  29. package/web/.next/server/app/(dashboard)/create/page.js +1 -1
  30. package/web/.next/server/app/(dashboard)/create/page.js.nft.json +1 -1
  31. package/web/.next/server/app/(dashboard)/create/page_client-reference-manifest.js +1 -1
  32. package/web/.next/server/app/(dashboard)/feature/[featureId]/page/server-reference-manifest.json +21 -21
  33. package/web/.next/server/app/(dashboard)/feature/[featureId]/page.js +1 -1
  34. package/web/.next/server/app/(dashboard)/feature/[featureId]/page.js.nft.json +1 -1
  35. package/web/.next/server/app/(dashboard)/feature/[featureId]/page_client-reference-manifest.js +1 -1
  36. package/web/.next/server/app/(dashboard)/page/server-reference-manifest.json +14 -14
  37. package/web/.next/server/app/(dashboard)/page.js +1 -1
  38. package/web/.next/server/app/(dashboard)/page.js.nft.json +1 -1
  39. package/web/.next/server/app/(dashboard)/page_client-reference-manifest.js +1 -1
  40. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page/server-reference-manifest.json +14 -14
  41. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page.js +1 -1
  42. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page.js.nft.json +1 -1
  43. package/web/.next/server/app/(dashboard)/repository/[repositoryId]/page_client-reference-manifest.js +1 -1
  44. package/web/.next/server/app/_global-error/page.js +1 -1
  45. package/web/.next/server/app/_global-error/page.js.nft.json +1 -1
  46. package/web/.next/server/app/_global-error/page_client-reference-manifest.js +1 -1
  47. package/web/.next/server/app/_global-error.html +2 -2
  48. package/web/.next/server/app/_global-error.rsc +1 -1
  49. package/web/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  50. package/web/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  51. package/web/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  52. package/web/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  53. package/web/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  54. package/web/.next/server/app/_not-found/page/server-reference-manifest.json +1 -1
  55. package/web/.next/server/app/_not-found/page.js +1 -1
  56. package/web/.next/server/app/_not-found/page.js.nft.json +1 -1
  57. package/web/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  58. package/web/.next/server/app/api/attachments/preview/route.js.nft.json +1 -1
  59. package/web/.next/server/app/api/attachments/upload-from-path/route/app-paths-manifest.json +3 -0
  60. package/web/.next/server/app/api/attachments/upload-from-path/route/build-manifest.json +11 -0
  61. package/web/.next/server/app/api/attachments/upload-from-path/route/server-reference-manifest.json +4 -0
  62. package/web/.next/server/app/api/attachments/upload-from-path/route.js +7 -0
  63. package/web/.next/server/app/api/attachments/upload-from-path/route.js.map +5 -0
  64. package/web/.next/server/app/api/attachments/upload-from-path/route.js.nft.json +1 -0
  65. package/web/.next/server/app/api/attachments/upload-from-path/route_client-reference-manifest.js +2 -0
  66. package/web/.next/server/app/api/feature-logs/route.js +1 -1
  67. package/web/.next/server/app/api/feature-logs/route.js.nft.json +1 -1
  68. package/web/.next/server/app/settings/page/server-reference-manifest.json +5 -5
  69. package/web/.next/server/app/settings/page.js +1 -1
  70. package/web/.next/server/app/settings/page.js.nft.json +1 -1
  71. package/web/.next/server/app/settings/page_client-reference-manifest.js +1 -1
  72. package/web/.next/server/app/skills/page/server-reference-manifest.json +6 -6
  73. package/web/.next/server/app/skills/page.js +1 -1
  74. package/web/.next/server/app/skills/page.js.nft.json +1 -1
  75. package/web/.next/server/app/skills/page_client-reference-manifest.js +1 -1
  76. package/web/.next/server/app/tools/page/server-reference-manifest.json +6 -6
  77. package/web/.next/server/app/tools/page.js +1 -1
  78. package/web/.next/server/app/tools/page.js.nft.json +1 -1
  79. package/web/.next/server/app/tools/page_client-reference-manifest.js +1 -1
  80. package/web/.next/server/app/version/page/server-reference-manifest.json +1 -1
  81. package/web/.next/server/app/version/page.js +1 -1
  82. package/web/.next/server/app/version/page.js.nft.json +1 -1
  83. package/web/.next/server/app/version/page_client-reference-manifest.js +1 -1
  84. package/web/.next/server/app-paths-manifest.json +1 -0
  85. package/web/.next/server/chunks/8ba4b_server_app_api_attachments_upload-from-path_route_actions_05020a44.js +3 -0
  86. package/web/.next/server/chunks/8ba4b_server_app_api_attachments_upload-from-path_route_actions_05020a44.js.map +1 -0
  87. package/web/.next/server/chunks/[root-of-the-server]__a5879003._.js +3 -0
  88. package/web/.next/server/chunks/[root-of-the-server]__a5879003._.js.map +1 -0
  89. package/web/.next/server/chunks/{[root-of-the-server]__52c318d1._.js → [root-of-the-server]__d8037e14._.js} +2 -2
  90. package/web/.next/server/chunks/ssr/744ca_web_components_common_control-center-drawer_create-drawer-client_tsx_5e26fc0a._.js +1 -1
  91. package/web/.next/server/chunks/ssr/744ca_web_components_common_control-center-drawer_create-drawer-client_tsx_5e26fc0a._.js.map +1 -1
  92. package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_@drawer_repository_[repositoryId]_page_actions_da7eef33.js +1 -1
  93. package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_@drawer_repository_[repositoryId]_page_actions_da7eef33.js.map +1 -1
  94. package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_repository_[repositoryId]_page_actions_0a9251aa.js +1 -1
  95. package/web/.next/server/chunks/ssr/8ba4b_server_app_(dashboard)_repository_[repositoryId]_page_actions_0a9251aa.js.map +1 -1
  96. package/web/.next/server/chunks/ssr/[root-of-the-server]__11033878._.js +1 -1
  97. package/web/.next/server/chunks/ssr/[root-of-the-server]__11033878._.js.map +1 -1
  98. package/web/.next/server/chunks/ssr/[root-of-the-server]__17143953._.js +1 -1
  99. package/web/.next/server/chunks/ssr/[root-of-the-server]__17143953._.js.map +1 -1
  100. package/web/.next/server/chunks/ssr/{[root-of-the-server]__8d9536c4._.js → [root-of-the-server]__248ee887._.js} +2 -2
  101. package/web/.next/server/chunks/ssr/[root-of-the-server]__357d99f9._.js +1 -1
  102. package/web/.next/server/chunks/ssr/[root-of-the-server]__4af0afe0._.js +3 -0
  103. package/web/.next/server/chunks/ssr/[root-of-the-server]__4be9a9bb._.js +1 -1
  104. package/web/.next/server/chunks/ssr/[root-of-the-server]__5d87af2e._.js +1 -1
  105. package/web/.next/server/chunks/ssr/{[root-of-the-server]__f8210f45._.js → [root-of-the-server]__9bc1434f._.js} +2 -2
  106. package/web/.next/server/chunks/ssr/[root-of-the-server]__9de266fa._.js +1 -1
  107. package/web/.next/server/chunks/ssr/[root-of-the-server]__9de266fa._.js.map +1 -1
  108. package/web/.next/server/chunks/ssr/[root-of-the-server]__aad040c0._.js +1 -1
  109. package/web/.next/server/chunks/ssr/[root-of-the-server]__aad040c0._.js.map +1 -1
  110. package/web/.next/server/chunks/ssr/{[root-of-the-server]__f1a05100._.js → [root-of-the-server]__b062b383._.js} +2 -2
  111. package/web/.next/server/chunks/ssr/[root-of-the-server]__b3a4cef4._.js +1 -1
  112. package/web/.next/server/chunks/ssr/[root-of-the-server]__b3a4cef4._.js.map +1 -1
  113. package/web/.next/server/chunks/ssr/[root-of-the-server]__f0d8d054._.js +2 -2
  114. package/web/.next/server/chunks/ssr/[root-of-the-server]__fdc75809._.js +1 -1
  115. package/web/.next/server/chunks/ssr/[root-of-the-server]__fdc75809._.js.map +1 -1
  116. package/web/.next/server/chunks/ssr/_135edb9c._.js +1 -1
  117. package/web/.next/server/chunks/ssr/_135edb9c._.js.map +1 -1
  118. package/web/.next/server/chunks/ssr/{_a2ec151c._.js → _61480424._.js} +2 -2
  119. package/web/.next/server/chunks/ssr/{_a2ec151c._.js.map → _61480424._.js.map} +1 -1
  120. package/web/.next/server/chunks/ssr/_752e01fd._.js +1 -1
  121. package/web/.next/server/chunks/ssr/_752e01fd._.js.map +1 -1
  122. package/web/.next/server/chunks/ssr/_8dacd1e7._.js +1 -1
  123. package/web/.next/server/chunks/ssr/_8dacd1e7._.js.map +1 -1
  124. package/web/.next/server/chunks/ssr/_cc77a143._.js +1 -1
  125. package/web/.next/server/chunks/ssr/_cc77a143._.js.map +1 -1
  126. package/web/.next/server/chunks/ssr/b1a17_presentation_web_components_features_settings_settings-page-client_tsx_6ed9d5f8._.js +1 -1
  127. package/web/.next/server/chunks/ssr/b1a17_presentation_web_components_features_settings_settings-page-client_tsx_6ed9d5f8._.js.map +1 -1
  128. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_(dashboard)_page_actions_021a05f2.js +1 -1
  129. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_(dashboard)_page_actions_021a05f2.js.map +1 -1
  130. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_skills_page_actions_1fa8042e.js +1 -1
  131. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_skills_page_actions_1fa8042e.js.map +1 -1
  132. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_tools_page_actions_24684200.js +1 -1
  133. package/web/.next/server/chunks/ssr/src_presentation_web__next-internal_server_app_tools_page_actions_24684200.js.map +1 -1
  134. package/web/.next/server/chunks/ssr/src_presentation_web_c4348b8a._.js +2 -2
  135. package/web/.next/server/chunks/ssr/src_presentation_web_c4348b8a._.js.map +1 -1
  136. package/web/.next/server/chunks/ssr/src_presentation_web_components_bf50c527._.js +1 -1
  137. package/web/.next/server/chunks/ssr/src_presentation_web_components_bf50c527._.js.map +1 -1
  138. package/web/.next/server/chunks/ssr/src_presentation_web_components_de814675._.js +1 -1
  139. package/web/.next/server/chunks/ssr/src_presentation_web_components_de814675._.js.map +1 -1
  140. package/web/.next/server/chunks/ssr/src_presentation_web_components_features_control-center_7ac3562e._.js +1 -1
  141. package/web/.next/server/chunks/ssr/src_presentation_web_components_features_control-center_7ac3562e._.js.map +1 -1
  142. package/web/.next/server/chunks/ssr/src_presentation_web_e4510d10._.js +2 -2
  143. package/web/.next/server/chunks/ssr/src_presentation_web_e4510d10._.js.map +1 -1
  144. package/web/.next/server/pages/500.html +2 -2
  145. package/web/.next/server/server-reference-manifest.js +1 -1
  146. package/web/.next/server/server-reference-manifest.json +28 -28
  147. package/web/.next/static/chunks/{e49abd7c0c1cdef2.js → 0b3852464455cb56.js} +1 -1
  148. package/web/.next/static/chunks/{8b59757e9f52e364.js → 177579b39fd0f63a.js} +1 -1
  149. package/web/.next/static/chunks/{eafcdd214c540495.js → 866566643c6aaecf.js} +1 -1
  150. package/web/.next/static/chunks/{ba99f8c298491782.js → 8d82ff1402dcf377.js} +1 -1
  151. package/web/.next/static/chunks/{c2e2e1720b4f9a1a.js → 9d59d178a1e154b2.js} +1 -1
  152. package/web/.next/static/chunks/{673af06602f590f0.js → c7a4303d3cf08477.js} +1 -1
  153. package/web/.next/static/chunks/{20e5c07abd2699c2.js → dd6c69087923da49.js} +2 -2
  154. package/web/.next/static/chunks/{c481a0ab2ddddbf4.js → dd6cd59c8f439583.js} +1 -1
  155. package/web/.next/static/chunks/{c267885c32e4091c.js → e1edce9ef55b5824.js} +1 -1
  156. package/web/.next/static/chunks/{98b1c6b413aeb539.js → f46a0078f2ee9c44.js} +1 -1
  157. package/web/.next/server/chunks/ssr/[root-of-the-server]__b65f78cf._.js +0 -3
  158. /package/web/.next/server/chunks/{[root-of-the-server]__52c318d1._.js.map → [root-of-the-server]__d8037e14._.js.map} +0 -0
  159. /package/web/.next/server/chunks/ssr/{[root-of-the-server]__8d9536c4._.js.map → [root-of-the-server]__248ee887._.js.map} +0 -0
  160. /package/web/.next/server/chunks/ssr/{[root-of-the-server]__b65f78cf._.js.map → [root-of-the-server]__4af0afe0._.js.map} +0 -0
  161. /package/web/.next/server/chunks/ssr/{[root-of-the-server]__f8210f45._.js.map → [root-of-the-server]__9bc1434f._.js.map} +0 -0
  162. /package/web/.next/server/chunks/ssr/{[root-of-the-server]__f1a05100._.js.map → [root-of-the-server]__b062b383._.js.map} +0 -0
  163. /package/web/.next/static/{VCU_mY2u0y_7bLsvmLjyS → T8HBuz_VR2eZQbNRNSohp}/_buildManifest.js +0 -0
  164. /package/web/.next/static/{VCU_mY2u0y_7bLsvmLjyS → T8HBuz_VR2eZQbNRNSohp}/_clientMiddlewareManifest.json +0 -0
  165. /package/web/.next/static/{VCU_mY2u0y_7bLsvmLjyS → T8HBuz_VR2eZQbNRNSohp}/_ssgManifest.js +0 -0
@@ -0,0 +1,3 @@
1
+ import { NextResponse } from 'next/server';
2
+ export declare function POST(request: Request): Promise<NextResponse>;
3
+ //# sourceMappingURL=route.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"route.d.ts","sourceRoot":"","sources":["../../../../../../../../src/presentation/web/app/api/attachments/upload-from-path/route.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAoF3C,wBAAsB,IAAI,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,YAAY,CAAC,CAmDlE"}
@@ -0,0 +1,120 @@
1
+ import { NextResponse } from 'next/server';
2
+ import { readFile } from 'fs/promises';
3
+ import { extname, basename } from 'path';
4
+ import { resolve as resolvePath } from 'path';
5
+ import { resolve } from '../../../../lib/server-container.js';
6
+ const MAX_FILE_SIZE = 10 * 1024 * 1024; // 10 MB
7
+ const ALLOWED_EXTENSIONS = new Set([
8
+ '.png',
9
+ '.jpg',
10
+ '.jpeg',
11
+ '.gif',
12
+ '.webp',
13
+ '.svg',
14
+ '.bmp',
15
+ '.ico',
16
+ '.pdf',
17
+ '.doc',
18
+ '.docx',
19
+ '.xls',
20
+ '.xlsx',
21
+ '.ppt',
22
+ '.pptx',
23
+ '.txt',
24
+ '.md',
25
+ '.csv',
26
+ '.json',
27
+ '.yaml',
28
+ '.yml',
29
+ '.xml',
30
+ '.ts',
31
+ '.tsx',
32
+ '.js',
33
+ '.jsx',
34
+ '.py',
35
+ '.rb',
36
+ '.go',
37
+ '.rs',
38
+ '.java',
39
+ '.c',
40
+ '.cpp',
41
+ '.h',
42
+ '.hpp',
43
+ '.cs',
44
+ '.swift',
45
+ '.kt',
46
+ '.html',
47
+ '.css',
48
+ '.scss',
49
+ '.less',
50
+ '.sh',
51
+ '.bash',
52
+ '.zsh',
53
+ '.fish',
54
+ '.toml',
55
+ '.ini',
56
+ '.cfg',
57
+ '.conf',
58
+ '.env',
59
+ '.zip',
60
+ '.tar',
61
+ '.gz',
62
+ '.log',
63
+ ]);
64
+ const MIME_MAP = {
65
+ '.png': 'image/png',
66
+ '.jpg': 'image/jpeg',
67
+ '.jpeg': 'image/jpeg',
68
+ '.gif': 'image/gif',
69
+ '.webp': 'image/webp',
70
+ '.svg': 'image/svg+xml',
71
+ '.bmp': 'image/bmp',
72
+ '.ico': 'image/x-icon',
73
+ '.pdf': 'application/pdf',
74
+ '.txt': 'text/plain',
75
+ '.md': 'text/markdown',
76
+ '.json': 'application/json',
77
+ '.yaml': 'text/yaml',
78
+ '.yml': 'text/yaml',
79
+ };
80
+ export async function POST(request) {
81
+ try {
82
+ const body = await request.json();
83
+ const { path, sessionId } = body;
84
+ if (!path || !sessionId) {
85
+ return NextResponse.json({ error: 'Missing required fields: path, sessionId' }, { status: 400 });
86
+ }
87
+ const ext = extname(path).toLowerCase();
88
+ if (ext && !ALLOWED_EXTENSIONS.has(ext)) {
89
+ return NextResponse.json({ error: `File type "${ext}" is not allowed` }, { status: 400 });
90
+ }
91
+ let buffer;
92
+ try {
93
+ buffer = await readFile(resolvePath(path));
94
+ }
95
+ catch {
96
+ return NextResponse.json({ error: 'File not found or unreadable' }, { status: 404 });
97
+ }
98
+ if (buffer.length > MAX_FILE_SIZE) {
99
+ return NextResponse.json({
100
+ error: `File exceeds 10 MB limit (${(buffer.length / 1024 / 1024).toFixed(1)} MB)`,
101
+ }, { status: 413 });
102
+ }
103
+ const filename = basename(path);
104
+ const mimeType = MIME_MAP[ext] ?? 'application/octet-stream';
105
+ const service = resolve('AttachmentStorageService');
106
+ const attachment = service.store(buffer, filename, mimeType, sessionId);
107
+ return NextResponse.json({
108
+ id: attachment.id,
109
+ name: attachment.name,
110
+ size: Number(attachment.size),
111
+ mimeType: attachment.mimeType,
112
+ path: attachment.path,
113
+ createdAt: attachment.createdAt,
114
+ });
115
+ }
116
+ catch (error) {
117
+ const message = error instanceof Error ? error.message : 'Upload failed';
118
+ return NextResponse.json({ error: message }, { status: 500 });
119
+ }
120
+ }
@@ -1 +1 @@
1
- {"version":3,"file":"feature-create-drawer.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/feature-create-drawer/feature-create-drawer.tsx"],"names":[],"mappings":"AAkBA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,qCAAqC,CAAC;AAI5E,YAAY,EAAE,cAAc,EAAE,MAAM,0DAA0D,CAAC;AAE/F,uFAAuF;AACvF,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,0DAA0D;AAC1D,MAAM,WAAW,mBAAmB;IAClC,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,oBAAoB;IACnC,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,cAAc,EAAE,CAAC;IAC9B,cAAc,EAAE,MAAM,CAAC;IACvB,aAAa,EAAE;QACb,QAAQ,EAAE,OAAO,CAAC;QAClB,SAAS,EAAE,OAAO,CAAC;QACnB,UAAU,EAAE,OAAO,CAAC;KACrB,CAAC;IACF,IAAI,EAAE,OAAO,CAAC;IACd,MAAM,EAAE,OAAO,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,0EAA0E;IAC1E,IAAI,EAAE,OAAO,CAAC;IACd,wDAAwD;IACxD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,mDAAmD;IACnD,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AA+ED,MAAM,WAAW,wBAAwB;IACvC,IAAI,EAAE,OAAO,CAAC;IACd,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,QAAQ,EAAE,CAAC,IAAI,EAAE,oBAAoB,KAAK,IAAI,CAAC;IAC/C,cAAc,EAAE,MAAM,CAAC;IACvB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,gBAAgB,CAAC,EAAE,gBAAgB,CAAC;IACpC,qEAAqE;IACrE,QAAQ,CAAC,EAAE,mBAAmB,EAAE,CAAC;IACjC,kGAAkG;IAClG,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,8CAA8C;IAC9C,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,yCAAyC;IACzC,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,wBAAgB,mBAAmB,CAAC,EAClC,IAAI,EACJ,OAAO,EACP,QAAQ,EACR,cAAc,EACd,YAAoB,EACpB,gBAAgB,EAChB,QAAQ,EACR,eAAe,EACf,gBAAgB,EAChB,YAAY,GACb,EAAE,wBAAwB,2CAkjB1B"}
1
+ {"version":3,"file":"feature-create-drawer.d.ts","sourceRoot":"","sources":["../../../../../../../src/presentation/web/components/common/feature-create-drawer/feature-create-drawer.tsx"],"names":[],"mappings":"AAkBA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,qCAAqC,CAAC;AAI5E,YAAY,EAAE,cAAc,EAAE,MAAM,0DAA0D,CAAC;AAE/F,uFAAuF;AACvF,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,0DAA0D;AAC1D,MAAM,WAAW,mBAAmB;IAClC,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,oBAAoB;IACnC,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,cAAc,EAAE,CAAC;IAC9B,cAAc,EAAE,MAAM,CAAC;IACvB,aAAa,EAAE;QACb,QAAQ,EAAE,OAAO,CAAC;QAClB,SAAS,EAAE,OAAO,CAAC;QACnB,UAAU,EAAE,OAAO,CAAC;KACrB,CAAC;IACF,IAAI,EAAE,OAAO,CAAC;IACd,MAAM,EAAE,OAAO,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,0EAA0E;IAC1E,IAAI,EAAE,OAAO,CAAC;IACd,wDAAwD;IACxD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,mDAAmD;IACnD,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AA+ED,MAAM,WAAW,wBAAwB;IACvC,IAAI,EAAE,OAAO,CAAC;IACd,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,QAAQ,EAAE,CAAC,IAAI,EAAE,oBAAoB,KAAK,IAAI,CAAC;IAC/C,cAAc,EAAE,MAAM,CAAC;IACvB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,gBAAgB,CAAC,EAAE,gBAAgB,CAAC;IACpC,qEAAqE;IACrE,QAAQ,CAAC,EAAE,mBAAmB,EAAE,CAAC;IACjC,kGAAkG;IAClG,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,8CAA8C;IAC9C,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,yCAAyC;IACzC,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,wBAAgB,mBAAmB,CAAC,EAClC,IAAI,EACJ,OAAO,EACP,QAAQ,EACR,cAAc,EACd,YAAoB,EACpB,gBAAgB,EAChB,QAAQ,EACR,eAAe,EACf,gBAAgB,EAChB,YAAY,GACb,EAAE,wBAAwB,2CA6kB1B"}
@@ -289,20 +289,45 @@ export function FeatureCreateDrawer({ open, onClose, onSubmit, repositoryPath, i
289
289
  const handleAddFiles = useCallback(async () => {
290
290
  try {
291
291
  const files = await pickFiles();
292
- if (files) {
293
- setAttachments((prev) => {
294
- const existingPaths = new Set(prev.map((f) => f.path));
295
- const unique = files
296
- .filter((f) => !existingPaths.has(f.path))
297
- .map((f) => ({
298
- id: crypto.randomUUID(),
299
- name: f.name,
300
- size: f.size,
292
+ if (!files)
293
+ return;
294
+ for (const file of files) {
295
+ const tempId = crypto.randomUUID();
296
+ setAttachments((prev) => [
297
+ ...prev,
298
+ {
299
+ id: tempId,
300
+ name: file.name,
301
+ size: file.size,
301
302
  mimeType: 'application/octet-stream',
302
- path: f.path,
303
- }));
304
- return unique.length > 0 ? [...prev, ...unique] : prev;
305
- });
303
+ path: '',
304
+ loading: true,
305
+ },
306
+ ]);
307
+ try {
308
+ const res = await fetch('/api/attachments/upload-from-path', {
309
+ method: 'POST',
310
+ headers: { 'Content-Type': 'application/json' },
311
+ body: JSON.stringify({ path: file.path, sessionId: sessionIdRef.current }),
312
+ });
313
+ if (!res.ok) {
314
+ const body = await res.json().catch(() => ({ error: 'Upload failed' }));
315
+ setAttachments((prev) => prev.filter((a) => a.id !== tempId));
316
+ setUploadError(body.error ?? 'Upload failed');
317
+ return;
318
+ }
319
+ const uploaded = await res.json();
320
+ setAttachments((prev) => {
321
+ const isDupe = prev.some((a) => a.id !== tempId && a.path === uploaded.path);
322
+ if (isDupe)
323
+ return prev.filter((a) => a.id !== tempId);
324
+ return prev.map((a) => a.id === tempId ? { ...uploaded, id: tempId, loading: false } : a);
325
+ });
326
+ }
327
+ catch {
328
+ setAttachments((prev) => prev.filter((a) => a.id !== tempId));
329
+ setUploadError('Upload failed');
330
+ }
306
331
  }
307
332
  }
308
333
  catch {