@h-ai/feedback 1.0.0-beta.17 → 1.0.0-beta.19

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/README.en.md CHANGED
@@ -35,7 +35,11 @@ const initialized = await feedback.init({
35
35
  })
36
36
  if (!initialized.success)
37
37
  return initialized
38
- const context = { scopeId: 'tenant-1', userId: 'user-1', permissions: ['feedback:create'] }
38
+ const context = {
39
+ scopeId: 'tenant-1',
40
+ userId: 'user-1',
41
+ permissions: ['feedback:create']
42
+ }
39
43
  const submitted = await feedback.submit({ appId: 'orders', submissionId: 'stable-client-operation' }, context)
40
44
  if (!submitted.success)
41
45
  return submitted
@@ -110,12 +114,14 @@ async function startFeedback(config: FeedbackConfigInput) {
110
114
  collectEvidence: async ({ report, signal }) => ({
111
115
  text: `Diagnostics for ${report.number}`,
112
116
  data: { businessSystem: 'orders', scopeId: report.scopeId },
113
- attachments: [{
114
- id: 'business-logs',
115
- name: 'business-logs.zip',
116
- contentType: 'application/zip',
117
- bytes: await readFile('diagnostics/sanitized-logs.zip', { signal }),
118
- }],
117
+ attachments: [
118
+ {
119
+ id: 'business-logs',
120
+ name: 'business-logs.zip',
121
+ contentType: 'application/zip',
122
+ bytes: await readFile('diagnostics/sanitized-logs.zip', { signal }),
123
+ }
124
+ ],
119
125
  }),
120
126
  })
121
127
  if (!result.success)
package/README.ja.md CHANGED
@@ -35,7 +35,11 @@ const initialized = await feedback.init({
35
35
  })
36
36
  if (!initialized.success)
37
37
  return initialized
38
- const context = { scopeId: 'tenant-1', userId: 'user-1', permissions: ['feedback:create'] }
38
+ const context = {
39
+ scopeId: 'tenant-1',
40
+ userId: 'user-1',
41
+ permissions: ['feedback:create']
42
+ }
39
43
  const submitted = await feedback.submit({ appId: 'orders', submissionId: 'stable-client-operation' }, context)
40
44
  if (!submitted.success)
41
45
  return submitted
@@ -110,12 +114,14 @@ async function startFeedback(config: FeedbackConfigInput) {
110
114
  collectEvidence: async ({ report, signal }) => ({
111
115
  text: `Diagnostics for ${report.number}`,
112
116
  data: { businessSystem: 'orders', scopeId: report.scopeId },
113
- attachments: [{
114
- id: 'business-logs',
115
- name: 'business-logs.zip',
116
- contentType: 'application/zip',
117
- bytes: await readFile('diagnostics/sanitized-logs.zip', { signal }),
118
- }],
117
+ attachments: [
118
+ {
119
+ id: 'business-logs',
120
+ name: 'business-logs.zip',
121
+ contentType: 'application/zip',
122
+ bytes: await readFile('diagnostics/sanitized-logs.zip', { signal }),
123
+ }
124
+ ],
119
125
  }),
120
126
  })
121
127
  if (!result.success)
package/README.md CHANGED
@@ -34,7 +34,11 @@ const initialized = await feedback.init({
34
34
  if (!initialized.success)
35
35
  return initialized
36
36
 
37
- const context = { scopeId: 'tenant-1', userId: 'user-1', permissions: ['feedback:create'] }
37
+ const context = {
38
+ scopeId: 'tenant-1',
39
+ userId: 'user-1',
40
+ permissions: ['feedback:create']
41
+ }
38
42
  const submitted = await feedback.submit({ appId: 'orders', submissionId: 'stable-client-operation' }, context)
39
43
  if (!submitted.success)
40
44
  return submitted
@@ -112,12 +116,14 @@ async function startFeedback(config: FeedbackConfigInput) {
112
116
  collectEvidence: async ({ report, signal }) => ({
113
117
  text: `Diagnostics for ${report.number}`,
114
118
  data: { businessSystem: 'orders', scopeId: report.scopeId },
115
- attachments: [{
116
- id: 'business-logs',
117
- name: 'business-logs.zip',
118
- contentType: 'application/zip',
119
- bytes: await readFile('diagnostics/sanitized-logs.zip', { signal }),
120
- }],
119
+ attachments: [
120
+ {
121
+ id: 'business-logs',
122
+ name: 'business-logs.zip',
123
+ contentType: 'application/zip',
124
+ bytes: await readFile('diagnostics/sanitized-logs.zip', { signal }),
125
+ }
126
+ ],
121
127
  }),
122
128
  })
123
129
  if (!result.success)
@@ -213,4 +213,5 @@ declare function queryFeedbackBundle(bundle: FeedbackBundle, query?: FeedbackBun
213
213
  */
214
214
  declare function getFeedbackBundleViewerFiles(): Readonly<Record<string, Uint8Array>>;
215
215
 
216
- export { type FeedbackBundle, type FeedbackBundleAttachment, type FeedbackBundleEvidence, type FeedbackBundleEvidencePage, type FeedbackBundleFile, type FeedbackBundleInput, type FeedbackBundleManifest, type FeedbackBundleQuery, type FeedbackBundleReadOptions, createFeedbackBundle, getFeedbackBundleViewerFiles, queryFeedbackBundle, readFeedbackBundle, summarizeFeedbackBundle };
216
+ export { createFeedbackBundle, getFeedbackBundleViewerFiles, queryFeedbackBundle, readFeedbackBundle, summarizeFeedbackBundle };
217
+ export type { FeedbackBundle, FeedbackBundleAttachment, FeedbackBundleEvidence, FeedbackBundleEvidencePage, FeedbackBundleFile, FeedbackBundleInput, FeedbackBundleManifest, FeedbackBundleQuery, FeedbackBundleReadOptions };
@@ -1,3 +1,3 @@
1
- export { createFeedbackBundle, getFeedbackBundleViewerFiles, queryFeedbackBundle, readFeedbackBundle, summarizeFeedbackBundle } from '../chunk-KGMLTOMM.js';
1
+ export { createFeedbackBundle, getFeedbackBundleViewerFiles, queryFeedbackBundle, readFeedbackBundle, summarizeFeedbackBundle } from '../chunk-IFJHL5VK.js';
2
2
  //# sourceMappingURL=index.js.map
3
3
  //# sourceMappingURL=index.js.map
@@ -1,4 +1,4 @@
1
- import { F as FeedbackFileSaver } from './feedback-client-files-B88nCOo_.js';
1
+ import { FeedbackFileSaver } from './client/index.js';
2
2
  import '@h-ai/api-contract/feedback';
3
3
  import '@h-ai/core';
4
4
 
package/dist/capacitor.js CHANGED
@@ -4,7 +4,11 @@ import { Share } from '@capacitor/share';
4
4
  // src/client/feedback-client-capacitor.ts
5
5
  var saveCapacitorFeedbackFile = async (bytes, filename, _contentType, signal) => {
6
6
  const path = `feedback/${globalThis.crypto.randomUUID()}/${filename}`;
7
- const cleanup = () => Filesystem.rmdir({ path: path.slice(0, path.lastIndexOf("/")), directory: Directory.Cache, recursive: true }).catch(() => void 0);
7
+ const cleanup = () => Filesystem.rmdir({
8
+ path: path.slice(0, path.lastIndexOf("/")),
9
+ directory: Directory.Cache,
10
+ recursive: true
11
+ }).catch(() => void 0);
8
12
  const abort = () => {
9
13
  void cleanup();
10
14
  };
@@ -14,12 +18,22 @@ var saveCapacitorFeedbackFile = async (bytes, filename, _contentType, signal) =>
14
18
  try {
15
19
  if (signal?.aborted)
16
20
  return { status: "cancelled" };
17
- const file = await Filesystem.writeFile({ path, data: btoa(raw), directory: Directory.Cache, recursive: true });
21
+ const file = await Filesystem.writeFile({
22
+ path,
23
+ data: btoa(raw),
24
+ directory: Directory.Cache,
25
+ recursive: true
26
+ });
18
27
  if (signal?.aborted)
19
28
  return { status: "cancelled" };
20
29
  signal?.addEventListener("abort", abort, { once: true });
21
- await Share.share({ files: [file.uri], dialogTitle: filename });
22
- return { status: signal?.aborted ? "cancelled" : "shared" };
30
+ await Share.share({
31
+ files: [file.uri],
32
+ dialogTitle: filename
33
+ });
34
+ return {
35
+ status: signal?.aborted ? "cancelled" : "shared"
36
+ };
23
37
  } catch (cause) {
24
38
  if (cause instanceof Error && cause.message === "Share canceled")
25
39
  return { status: "cancelled" };
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/client/feedback-client-capacitor.ts"],"names":[],"mappings":";;;;AAcO,IAAM,yBAAA,GAA+C,OAAO,KAAA,EAAO,QAAA,EAAU,cAAc,MAAA,KAAW;AAC3G,EAAA,MAAM,OAAO,CAAA,SAAA,EAAY,UAAA,CAAW,OAAO,UAAA,EAAY,IAAI,QAAQ,CAAA,CAAA;AACnE,EAAA,MAAM,OAAA,GAAU,MAAM,UAAA,CAAW,KAAA,CAAM,EAAE,IAAA,EAAM,IAAA,CAAK,KAAA,CAAM,CAAA,EAAG,IAAA,CAAK,WAAA,CAAY,GAAG,CAAC,CAAA,EAAG,SAAA,EAAW,SAAA,CAAU,KAAA,EAAO,SAAA,EAAW,MAAM,CAAA,CAAE,KAAA,CAAM,MAAM,MAAS,CAAA;AACzJ,EAAA,MAAM,QAAQ,MAAM;AAClB,IAAA,KAAK,OAAA,EAAQ;AAAA,EACf,CAAA;AACA,EAAA,IAAI,GAAA,GAAM,EAAA;AACV,EAAA,KAAA,IAAS,MAAA,GAAS,CAAA,EAAG,MAAA,GAAS,KAAA,CAAM,QAAQ,MAAA,IAAU,KAAA;AACpD,IAAA,GAAA,IAAO,MAAA,CAAO,aAAa,GAAG,KAAA,CAAM,SAAS,MAAA,EAAQ,MAAA,GAAS,KAAK,CAAC,CAAA;AACtE,EAAA,IAAI;AACF,IAAA,IAAI,MAAA,EAAQ,OAAA;AACV,MAAA,OAAO,EAAE,QAAQ,WAAA,EAAY;AAC/B,IAAA,MAAM,IAAA,GAAO,MAAM,UAAA,CAAW,SAAA,CAAU,EAAE,IAAA,EAAM,IAAA,EAAM,IAAA,CAAK,GAAG,GAAG,SAAA,EAAW,SAAA,CAAU,KAAA,EAAO,SAAA,EAAW,MAAM,CAAA;AAC9G,IAAA,IAAI,MAAA,EAAQ,OAAA;AACV,MAAA,OAAO,EAAE,QAAQ,WAAA,EAAY;AAC/B,IAAA,MAAA,EAAQ,iBAAiB,OAAA,EAAS,KAAA,EAAO,EAAE,IAAA,EAAM,MAAM,CAAA;AACvD,IAAA,MAAM,KAAA,CAAM,KAAA,CAAM,EAAE,KAAA,EAAO,CAAC,KAAK,GAAG,CAAA,EAAG,WAAA,EAAa,QAAA,EAAU,CAAA;AAC9D,IAAA,OAAO,EAAE,MAAA,EAAQ,MAAA,EAAQ,OAAA,GAAU,cAAc,QAAA,EAAS;AAAA,EAC5D,SACO,KAAA,EAAO;AAEZ,IAAA,IAAI,KAAA,YAAiB,KAAA,IAAS,KAAA,CAAM,OAAA,KAAY,gBAAA;AAC9C,MAAA,OAAO,EAAE,QAAQ,WAAA,EAAY;AAC/B,IAAA,MAAM,KAAA;AAAA,EACR,CAAA,SACA;AACE,IAAA,MAAA,EAAQ,mBAAA,CAAoB,SAAS,KAAK,CAAA;AAC1C,IAAA,MAAM,OAAA,EAAQ;AAAA,EAChB;AACF","file":"capacitor.js","sourcesContent":["/** Capacitor 独立入口,只在 App 中导入插件,缓存目录由本次调用负责清理。 */\nimport type { FeedbackFileSaver } from './feedback-client-files.js'\nimport { Directory, Filesystem } from '@capacitor/filesystem'\nimport { Share } from '@capacitor/share'\n\n/**\n * 以原生分享保存临时诊断包;分享结束、失败或退出会话均清理缓存。\n * @example\n * ```ts\n * import { configureFeedbackSaving } from '@h-ai/feedback/client'\n * import { saveCapacitorFeedbackFile } from '@h-ai/feedback/capacitor'\n * configureFeedbackSaving(saveCapacitorFeedbackFile)\n * ```\n */\nexport const saveCapacitorFeedbackFile: FeedbackFileSaver = async (bytes, filename, _contentType, signal) => {\n const path = `feedback/${globalThis.crypto.randomUUID()}/${filename}`\n const cleanup = () => Filesystem.rmdir({ path: path.slice(0, path.lastIndexOf('/')), directory: Directory.Cache, recursive: true }).catch(() => undefined)\n const abort = () => {\n void cleanup()\n }\n let raw = ''\n for (let offset = 0; offset < bytes.length; offset += 32768)\n raw += String.fromCharCode(...bytes.subarray(offset, offset + 32768))\n try {\n if (signal?.aborted)\n return { status: 'cancelled' }\n const file = await Filesystem.writeFile({ path, data: btoa(raw), directory: Directory.Cache, recursive: true })\n if (signal?.aborted)\n return { status: 'cancelled' }\n signal?.addEventListener('abort', abort, { once: true })\n await Share.share({ files: [file.uri], dialogTitle: filename })\n return { status: signal?.aborted ? 'cancelled' : 'shared' }\n }\n catch (cause) {\n // 原生插件以固定消息表示主动取消;其余异常交给统一保存边界记录并返回失败。\n if (cause instanceof Error && cause.message === 'Share canceled')\n return { status: 'cancelled' }\n throw cause\n }\n finally {\n signal?.removeEventListener('abort', abort)\n await cleanup()\n }\n}\n"]}
1
+ {"version":3,"sources":["../src/client/feedback-client-capacitor.ts"],"names":[],"mappings":";;;;AAcO,IAAM,yBAAA,GAA+C,OAAO,KAAA,EAAO,QAAA,EAAU,cAAc,MAAA,KAAW;AAC3G,EAAA,MAAM,OAAO,CAAA,SAAA,EAAY,UAAA,CAAW,OAAO,UAAA,EAAY,IAAI,QAAQ,CAAA,CAAA;AACnE,EAAA,MAAM,OAAA,GAAU,MAAM,UAAA,CAAW,KAAA,CAAM;AAAA,IACrC,MAAM,IAAA,CAAK,KAAA,CAAM,GAAG,IAAA,CAAK,WAAA,CAAY,GAAG,CAAC,CAAA;AAAA,IACzC,WAAW,SAAA,CAAU,KAAA;AAAA,IACrB,SAAA,EAAW;AAAA,GACZ,CAAA,CAAE,KAAA,CAAM,MAAM,MAAS,CAAA;AACxB,EAAA,MAAM,QAAQ,MAAM;AAClB,IAAA,KAAK,OAAA,EAAQ;AAAA,EACf,CAAA;AACA,EAAA,IAAI,GAAA,GAAM,EAAA;AACV,EAAA,KAAA,IAAS,MAAA,GAAS,CAAA,EAAG,MAAA,GAAS,KAAA,CAAM,QAAQ,MAAA,IAAU,KAAA;AACpD,IAAA,GAAA,IAAO,MAAA,CAAO,aAAa,GAAG,KAAA,CAAM,SAAS,MAAA,EAAQ,MAAA,GAAS,KAAK,CAAC,CAAA;AACtE,EAAA,IAAI;AACF,IAAA,IAAI,MAAA,EAAQ,OAAA;AACV,MAAA,OAAO,EAAE,QAAQ,WAAA,EAAY;AAC/B,IAAA,MAAM,IAAA,GAAO,MAAM,UAAA,CAAW,SAAA,CAAU;AAAA,MACtC,IAAA;AAAA,MACA,IAAA,EAAM,KAAK,GAAG,CAAA;AAAA,MACd,WAAW,SAAA,CAAU,KAAA;AAAA,MACrB,SAAA,EAAW;AAAA,KACZ,CAAA;AACD,IAAA,IAAI,MAAA,EAAQ,OAAA;AACV,MAAA,OAAO,EAAE,QAAQ,WAAA,EAAY;AAC/B,IAAA,MAAA,EAAQ,iBAAiB,OAAA,EAAS,KAAA,EAAO,EAAE,IAAA,EAAM,MAAM,CAAA;AACvD,IAAA,MAAM,MAAM,KAAA,CAAM;AAAA,MAChB,KAAA,EAAO,CAAC,IAAA,CAAK,GAAG,CAAA;AAAA,MAChB,WAAA,EAAa;AAAA,KACd,CAAA;AACD,IAAA,OAAO;AAAA,MACL,MAAA,EAAQ,MAAA,EAAQ,OAAA,GAAU,WAAA,GAAc;AAAA,KAC1C;AAAA,EACF,SACO,KAAA,EAAO;AAEZ,IAAA,IAAI,KAAA,YAAiB,KAAA,IAAS,KAAA,CAAM,OAAA,KAAY,gBAAA;AAC9C,MAAA,OAAO,EAAE,QAAQ,WAAA,EAAY;AAC/B,IAAA,MAAM,KAAA;AAAA,EACR,CAAA,SACA;AACE,IAAA,MAAA,EAAQ,mBAAA,CAAoB,SAAS,KAAK,CAAA;AAC1C,IAAA,MAAM,OAAA,EAAQ;AAAA,EAChB;AACF","file":"capacitor.js","sourcesContent":["/** Capacitor 独立入口,只在 App 中导入插件,缓存目录由本次调用负责清理。 */\nimport type { FeedbackFileSaver } from './feedback-client-files.js'\nimport { Directory, Filesystem } from '@capacitor/filesystem'\nimport { Share } from '@capacitor/share'\n\n/**\n * 以原生分享保存临时诊断包;分享结束、失败或退出会话均清理缓存。\n * @example\n * ```ts\n * import { configureFeedbackSaving } from '@h-ai/feedback/client'\n * import { saveCapacitorFeedbackFile } from '@h-ai/feedback/capacitor'\n * configureFeedbackSaving(saveCapacitorFeedbackFile)\n * ```\n */\nexport const saveCapacitorFeedbackFile: FeedbackFileSaver = async (bytes, filename, _contentType, signal) => {\n const path = `feedback/${globalThis.crypto.randomUUID()}/${filename}`\n const cleanup = () => Filesystem.rmdir({\n path: path.slice(0, path.lastIndexOf('/')),\n directory: Directory.Cache,\n recursive: true,\n }).catch(() => undefined)\n const abort = () => {\n void cleanup()\n }\n let raw = ''\n for (let offset = 0; offset < bytes.length; offset += 32768)\n raw += String.fromCharCode(...bytes.subarray(offset, offset + 32768))\n try {\n if (signal?.aborted)\n return { status: 'cancelled' }\n const file = await Filesystem.writeFile({\n path,\n data: btoa(raw),\n directory: Directory.Cache,\n recursive: true,\n })\n if (signal?.aborted)\n return { status: 'cancelled' }\n signal?.addEventListener('abort', abort, { once: true })\n await Share.share({\n files: [file.uri],\n dialogTitle: filename,\n })\n return {\n status: signal?.aborted ? 'cancelled' : 'shared',\n }\n }\n catch (cause) {\n // 原生插件以固定消息表示主动取消;其余异常交给统一保存边界记录并返回失败。\n if (cause instanceof Error && cause.message === 'Share canceled')\n return { status: 'cancelled' }\n throw cause\n }\n finally {\n signal?.removeEventListener('abort', abort)\n await cleanup()\n }\n}\n"]}