@agent-native/core 0.91.1 → 0.91.2

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 (209) hide show
  1. package/blueprints/action/crud.md +1 -1
  2. package/blueprints/channel/discord.md +1 -1
  3. package/blueprints/provider/stripe.md +1 -1
  4. package/blueprints/sandbox/docker.md +1 -1
  5. package/corpus/README.md +1 -1
  6. package/corpus/core/CHANGELOG.md +14 -0
  7. package/corpus/core/blueprints/action/crud.md +1 -1
  8. package/corpus/core/blueprints/channel/discord.md +1 -1
  9. package/corpus/core/blueprints/provider/stripe.md +1 -1
  10. package/corpus/core/blueprints/sandbox/docker.md +1 -1
  11. package/corpus/core/package.json +6 -5
  12. package/corpus/core/src/agent/run-manager.ts +23 -2
  13. package/corpus/core/src/agent/run-store.ts +2 -2
  14. package/corpus/core/src/cli/add.ts +1 -1
  15. package/corpus/core/src/cli/create.ts +8 -3
  16. package/corpus/core/src/cli/index.ts +5 -4
  17. package/corpus/core/src/client/extensions/ExtensionSlot.tsx +7 -0
  18. package/corpus/core/src/client/session-replay.ts +97 -3
  19. package/corpus/core/src/jobs/scheduler.ts +30 -1
  20. package/corpus/core/src/localization/default-messages.ts +21 -0
  21. package/corpus/core/src/templates/default/app/i18n/ar-SA.ts +21 -0
  22. package/corpus/core/src/templates/default/app/i18n/de-DE.ts +21 -0
  23. package/corpus/core/src/templates/default/app/i18n/en-US.ts +21 -0
  24. package/corpus/core/src/templates/default/app/i18n/es-ES.ts +21 -0
  25. package/corpus/core/src/templates/default/app/i18n/fr-FR.ts +21 -0
  26. package/corpus/core/src/templates/default/app/i18n/hi-IN.ts +20 -0
  27. package/corpus/core/src/templates/default/app/i18n/ja-JP.ts +21 -0
  28. package/corpus/core/src/templates/default/app/i18n/ko-KR.ts +20 -0
  29. package/corpus/core/src/templates/default/app/i18n/pt-BR.ts +21 -0
  30. package/corpus/core/src/templates/default/app/i18n/zh-CN.ts +20 -0
  31. package/corpus/core/src/templates/default/app/i18n/zh-TW.ts +19 -0
  32. package/corpus/core/src/templates/default/package.json +2 -2
  33. package/corpus/core/src/templates/headless/package.json +3 -3
  34. package/corpus/core/src/templates/workspace-core/package.json +6 -6
  35. package/corpus/core/src/templates/workspace-root/package.json +2 -2
  36. package/corpus/core/src/triggers/dispatcher.ts +30 -2
  37. package/corpus/core/src/vite/client.ts +96 -1
  38. package/corpus/templates/analytics/.agents/skills/session-replay/SKILL.md +21 -2
  39. package/corpus/templates/analytics/app/global.css +26 -10
  40. package/corpus/templates/analytics/app/i18n/zh-TW.ts +2 -0
  41. package/corpus/templates/analytics/app/i18n-data.ts +25 -0
  42. package/corpus/templates/analytics/app/pages/sessions/SessionDetailPage.tsx +548 -237
  43. package/corpus/templates/analytics/app/pages/sessions/SessionDevToolsPanel.tsx +285 -294
  44. package/corpus/templates/analytics/changelog/2026-07-08-console-details-expand-inline-under-each-row-and-the-event-t.md +6 -0
  45. package/corpus/templates/analytics/changelog/2026-07-08-session-replay-clamps-ultra-wide-viewports-while-keeping-the.md +6 -0
  46. package/corpus/templates/analytics/changelog/2026-07-08-session-replay-keeps-a-usable-stage-when-dev-tools-is-open-a.md +6 -0
  47. package/corpus/templates/analytics/changelog/2026-07-08-session-replay-resumes-after-scrubbing-and-expands-console-r.md +6 -0
  48. package/corpus/templates/analytics/changelog/2026-07-08-session-replays-wait-for-full-load-keep-a-normal-viewport-an.md +6 -0
  49. package/corpus/templates/analytics/package.json +2 -2
  50. package/corpus/templates/assets/package.json +2 -2
  51. package/corpus/templates/brain/package.json +2 -2
  52. package/corpus/templates/calendar/AGENTS.md +10 -0
  53. package/corpus/templates/calendar/actions/create-event.ts +5 -1
  54. package/corpus/templates/calendar/actions/event-action-helpers.ts +41 -0
  55. package/corpus/templates/calendar/actions/get-attendee-timezones.ts +28 -0
  56. package/corpus/templates/calendar/actions/set-attendee-timezone.ts +68 -0
  57. package/corpus/templates/calendar/app/components/calendar/EventAttendeesSection.tsx +150 -11
  58. package/corpus/templates/calendar/app/components/calendar/EventDetailPanel.tsx +36 -1
  59. package/corpus/templates/calendar/app/components/calendar/EventDetailPopover.tsx +32 -0
  60. package/corpus/templates/calendar/app/hooks/use-attendee-timezones.ts +24 -0
  61. package/corpus/templates/calendar/app/i18n/zh-TW.ts +2 -0
  62. package/corpus/templates/calendar/app/i18n-data.ts +20 -0
  63. package/corpus/templates/calendar/app/lib/attendee-local-time.ts +122 -0
  64. package/corpus/templates/calendar/changelog/2026-07-08-event-details-now-support-extension-widgets-and-you-can-see-.md +6 -0
  65. package/corpus/templates/calendar/changelog/2026-07-08-when-you-invite-guests-to-a-new-event-you-now-appear-in.md +6 -0
  66. package/corpus/templates/calendar/package.json +2 -2
  67. package/corpus/templates/calendar/server/handlers/events.ts +5 -1
  68. package/corpus/templates/calendar/shared/api.ts +6 -0
  69. package/corpus/templates/chat/package.json +2 -2
  70. package/corpus/templates/clips/.agents/skills/meetings/SKILL.md +6 -2
  71. package/corpus/templates/clips/actions/create-meeting.ts +8 -3
  72. package/corpus/templates/clips/actions/list-meetings.ts +31 -3
  73. package/corpus/templates/clips/changelog/2026-07-08-after-finishing-a-desktop-recording-reopening-clips-restor.md +6 -0
  74. package/corpus/templates/clips/changelog/2026-07-08-clips-now-pops-up-to-take-notes-when-you-join-an-adhoc-zoom-.md +6 -0
  75. package/corpus/templates/clips/changelog/2026-07-08-desktop-clip-recordings-are-louder-after-capture-mic-only.md +6 -0
  76. package/corpus/templates/clips/changelog/2026-07-08-meeting-reminders-now-appear-1-minute-before-start-stay-unti.md +6 -0
  77. package/corpus/templates/clips/changelog/2026-07-08-the-desktop-meetings-panel-has-room-for-its-drop-shadow-and-.md +6 -0
  78. package/corpus/templates/clips/chrome-extension/package.json +2 -2
  79. package/corpus/templates/clips/desktop/package.json +2 -2
  80. package/corpus/templates/clips/desktop/src/app.tsx +91 -34
  81. package/corpus/templates/clips/desktop/src/hooks/useMeetingTranscription.ts +15 -5
  82. package/corpus/templates/clips/desktop/src/lib/meeting-notification-timing.ts +83 -0
  83. package/corpus/templates/clips/desktop/src/lib/native-recording-warm.ts +21 -0
  84. package/corpus/templates/clips/desktop/src/lib/recorder.ts +98 -20
  85. package/corpus/templates/clips/desktop/src/overlays/meeting-notification.tsx +174 -50
  86. package/corpus/templates/clips/desktop/src/styles.css +128 -53
  87. package/corpus/templates/clips/desktop/src-tauri/src/adhoc_meetings_watcher.rs +364 -0
  88. package/corpus/templates/clips/desktop/src-tauri/src/clips/mod.rs +1 -1
  89. package/corpus/templates/clips/desktop/src-tauri/src/lib.rs +5 -0
  90. package/corpus/templates/clips/desktop/src-tauri/src/meetings_watcher.rs +91 -11
  91. package/corpus/templates/clips/desktop/src-tauri/src/native_screen.rs +69 -19
  92. package/corpus/templates/clips/desktop/src-tauri/src/native_speech.rs +36 -1
  93. package/corpus/templates/clips/desktop/src-tauri/src/notifications.rs +62 -10
  94. package/corpus/templates/clips/desktop/src-tauri/src/silence_detector.rs +1 -24
  95. package/corpus/templates/clips/desktop/src-tauri/src/util.rs +36 -1
  96. package/corpus/templates/clips/package.json +2 -2
  97. package/corpus/templates/content/actions/_content-database-personal-view.ts +80 -0
  98. package/corpus/templates/content/actions/get-content-database-personal-view.ts +27 -0
  99. package/corpus/templates/content/actions/update-content-database-personal-view.ts +31 -0
  100. package/corpus/templates/content/actions/update-content-database-view.ts +3 -0
  101. package/corpus/templates/content/app/components/editor/DocumentProperties.tsx +1 -1
  102. package/corpus/templates/content/app/components/editor/database/DatabaseView.tsx +2584 -546
  103. package/corpus/templates/content/app/components/editor/database/filter-sort.ts +220 -18
  104. package/corpus/templates/content/app/hooks/use-content-database.ts +32 -0
  105. package/corpus/templates/content/app/i18n/zh-TW.ts +16 -0
  106. package/corpus/templates/content/app/i18n-data.ts +154 -0
  107. package/corpus/templates/content/changelog/2026-07-08-database-filters-now-support-notion-style-reset-save-for-eve.md +6 -0
  108. package/corpus/templates/content/changelog/2026-07-08-date-filters-can-now-target-a-between-range.md +6 -0
  109. package/corpus/templates/content/package.json +2 -2
  110. package/corpus/templates/content/parity/matrix.md +1 -1
  111. package/corpus/templates/content/parity/matrix.ts +2 -0
  112. package/corpus/templates/content/shared/api.ts +24 -0
  113. package/corpus/templates/design/package.json +2 -2
  114. package/corpus/templates/dispatch/app/i18n/zh-TW.ts +34 -1
  115. package/corpus/templates/dispatch/app/i18n-data.ts +387 -10
  116. package/corpus/templates/dispatch/app/routes/automations.tsx +1 -0
  117. package/corpus/templates/dispatch/changelog/2026-07-08-added-an-automations-page-to-review-pause-and-create.md +6 -0
  118. package/corpus/templates/dispatch/changelog/2026-07-08-destinations-now-shows-outbound-delivery-queue-health.md +6 -0
  119. package/corpus/templates/dispatch/package.json +2 -2
  120. package/corpus/templates/forms/package.json +2 -2
  121. package/corpus/templates/macros/package.json +2 -2
  122. package/corpus/templates/mail/app/hooks/use-emails.ts +56 -44
  123. package/corpus/templates/mail/app/lib/gmail-mutation-queue.ts +325 -0
  124. package/corpus/templates/mail/changelog/2026-07-08-rapid-archive-and-mark-read-now-batch-gmail-updates-so-the-i.md +6 -0
  125. package/corpus/templates/mail/package.json +2 -2
  126. package/corpus/templates/plan/package.json +2 -2
  127. package/corpus/templates/slides/app/components/editor/ImageDropPromptPopover.tsx +46 -29
  128. package/corpus/templates/slides/app/context/DeckContext.tsx +45 -18
  129. package/corpus/templates/slides/app/i18n/ar-SA.ts +4 -0
  130. package/corpus/templates/slides/app/i18n/de-DE.ts +4 -0
  131. package/corpus/templates/slides/app/i18n/en-US.ts +4 -0
  132. package/corpus/templates/slides/app/i18n/es-ES.ts +4 -0
  133. package/corpus/templates/slides/app/i18n/fr-FR.ts +4 -0
  134. package/corpus/templates/slides/app/i18n/hi-IN.ts +4 -0
  135. package/corpus/templates/slides/app/i18n/ja-JP.ts +4 -0
  136. package/corpus/templates/slides/app/i18n/ko-KR.ts +4 -0
  137. package/corpus/templates/slides/app/i18n/pt-BR.ts +4 -0
  138. package/corpus/templates/slides/app/i18n/zh-CN.ts +4 -0
  139. package/corpus/templates/slides/app/i18n/zh-TW.ts +4 -0
  140. package/corpus/templates/slides/app/lib/image-drop-to-agent.ts +115 -0
  141. package/corpus/templates/slides/app/pages/DeckEditor.tsx +22 -13
  142. package/corpus/templates/slides/changelog/2026-07-08-dropping-an-image-onto-a-slide-and-sending-it-to-the-agent-w.md +6 -0
  143. package/corpus/templates/slides/changelog/2026-07-08-undo-works-after-the-agent-edits-a-slide-so-you-can-reverse.md +6 -0
  144. package/corpus/templates/slides/package.json +2 -2
  145. package/dist/agent/run-manager.d.ts.map +1 -1
  146. package/dist/agent/run-manager.js +23 -2
  147. package/dist/agent/run-manager.js.map +1 -1
  148. package/dist/agent/run-store.js +2 -2
  149. package/dist/agent/run-store.js.map +1 -1
  150. package/dist/catalog.json +2 -2
  151. package/dist/cli/add.js +1 -1
  152. package/dist/cli/add.js.map +1 -1
  153. package/dist/cli/create.d.ts.map +1 -1
  154. package/dist/cli/create.js +8 -3
  155. package/dist/cli/create.js.map +1 -1
  156. package/dist/cli/index.js +5 -4
  157. package/dist/cli/index.js.map +1 -1
  158. package/dist/client/extensions/ExtensionSlot.js +6 -0
  159. package/dist/client/extensions/ExtensionSlot.js.map +1 -1
  160. package/dist/client/session-replay.d.ts +8 -0
  161. package/dist/client/session-replay.d.ts.map +1 -1
  162. package/dist/client/session-replay.js +80 -3
  163. package/dist/client/session-replay.js.map +1 -1
  164. package/dist/collab/struct-routes.d.ts +1 -1
  165. package/dist/file-upload/actions/upload-image.d.ts +1 -1
  166. package/dist/jobs/scheduler.js +26 -1
  167. package/dist/jobs/scheduler.js.map +1 -1
  168. package/dist/localization/default-messages.d.ts +19 -0
  169. package/dist/localization/default-messages.d.ts.map +1 -1
  170. package/dist/localization/default-messages.js +19 -0
  171. package/dist/localization/default-messages.js.map +1 -1
  172. package/dist/provider-api/corpus-jobs.d.ts +2 -2
  173. package/dist/resources/handlers.d.ts +2 -2
  174. package/dist/templates/default/app/i18n/ar-SA.ts +21 -0
  175. package/dist/templates/default/app/i18n/de-DE.ts +21 -0
  176. package/dist/templates/default/app/i18n/en-US.ts +21 -0
  177. package/dist/templates/default/app/i18n/es-ES.ts +21 -0
  178. package/dist/templates/default/app/i18n/fr-FR.ts +21 -0
  179. package/dist/templates/default/app/i18n/hi-IN.ts +20 -0
  180. package/dist/templates/default/app/i18n/ja-JP.ts +21 -0
  181. package/dist/templates/default/app/i18n/ko-KR.ts +20 -0
  182. package/dist/templates/default/app/i18n/pt-BR.ts +21 -0
  183. package/dist/templates/default/app/i18n/zh-CN.ts +20 -0
  184. package/dist/templates/default/app/i18n/zh-TW.ts +19 -0
  185. package/dist/templates/default/package.json +2 -2
  186. package/dist/templates/headless/package.json +3 -3
  187. package/dist/templates/workspace-core/package.json +6 -6
  188. package/dist/templates/workspace-root/package.json +2 -2
  189. package/dist/triggers/dispatcher.js +27 -2
  190. package/dist/triggers/dispatcher.js.map +1 -1
  191. package/dist/vite/client.d.ts.map +1 -1
  192. package/dist/vite/client.js +70 -1
  193. package/dist/vite/client.js.map +1 -1
  194. package/package.json +7 -6
  195. package/src/templates/default/app/i18n/ar-SA.ts +21 -0
  196. package/src/templates/default/app/i18n/de-DE.ts +21 -0
  197. package/src/templates/default/app/i18n/en-US.ts +21 -0
  198. package/src/templates/default/app/i18n/es-ES.ts +21 -0
  199. package/src/templates/default/app/i18n/fr-FR.ts +21 -0
  200. package/src/templates/default/app/i18n/hi-IN.ts +20 -0
  201. package/src/templates/default/app/i18n/ja-JP.ts +21 -0
  202. package/src/templates/default/app/i18n/ko-KR.ts +20 -0
  203. package/src/templates/default/app/i18n/pt-BR.ts +21 -0
  204. package/src/templates/default/app/i18n/zh-CN.ts +20 -0
  205. package/src/templates/default/app/i18n/zh-TW.ts +19 -0
  206. package/src/templates/default/package.json +2 -2
  207. package/src/templates/headless/package.json +3 -3
  208. package/src/templates/workspace-core/package.json +6 -6
  209. package/src/templates/workspace-root/package.json +2 -2
@@ -43,6 +43,8 @@ const messages = {
43
43
  destinations: "Destinations",
44
44
  identities: "Identities",
45
45
  approvals: "Approbations",
46
+ automations: "Automatisations",
47
+ delivery: "Livraison",
46
48
  audit: "Audit",
47
49
  dreams: "Dreams",
48
50
  threadDebug: "Débogage du fil de discussion",
@@ -161,6 +163,22 @@ const messages = {
161
163
  activeUsers: "Utilisateurs actifs",
162
164
  workspaceAppsStat: "Applications d'espace de travail",
163
165
  chatThreads: "Fils de discussion",
166
+ also: "Aussi",
167
+ workspaceShortcutsAria: "Raccourcis de l’espace de travail",
168
+ deliveryQueue: "File de livraison",
169
+ failedLastHour: "{{count}} échecs au cours de la dernière heure",
170
+ processingCount: "{{count}} en cours",
171
+ queued: "En file",
172
+ active: "Actif",
173
+ done1h: "Terminé 1 h",
174
+ failed1h: "Échoué 1 h",
175
+ oldestQueued: "Plus ancien en file : {{age}}",
176
+ queueAgeNone: "aucun",
177
+ queueFailureHint:
178
+ "Vérifiez les identifiants, les destinations et les erreurs récentes de la file.",
179
+ unknownPlatform: "inconnu",
180
+ attemptsCount: "{{count}} tentatives",
181
+ noErrorMessage: "(aucun message d’erreur)",
164
182
  },
165
183
  },
166
184
  agentPanel: {
@@ -342,6 +360,9 @@ const messages = {
342
360
  contactSidebarWidget: "Widget de la barre latérale des contacts",
343
361
  contactSidebarDescription:
344
362
  "Apparaît à côté de la conversation en cours avec le contexte du contact et du fil de discussion.",
363
+ eventDetailWidget: "Widget de détail d'événement",
364
+ eventDetailDescription:
365
+ "Apparaît sous l'événement de calendrier ouvert avec le contexte de l'événement et des participants.",
345
366
  addWidgetHere: "Ajouter un widget ici",
346
367
  back: "Retour",
347
368
  editExtension: "Modifier l'extension",
@@ -41,6 +41,8 @@ const messages = {
41
41
  destinations: "Destinations",
42
42
  identities: "Identities",
43
43
  approvals: "स्वीकृतियाँ",
44
+ automations: "ऑटोमेशन",
45
+ delivery: "डिलीवरी",
44
46
  audit: "Audit",
45
47
  dreams: "Dreams",
46
48
  threadDebug: "थ्रेड डिबग",
@@ -152,6 +154,21 @@ const messages = {
152
154
  activeUsers: "सक्रिय उपयोगकर्ता",
153
155
  workspaceAppsStat: "कार्यक्षेत्र ऐप्स",
154
156
  chatThreads: "चैट सूत्र",
157
+ also: "और भी",
158
+ workspaceShortcutsAria: "कार्यस्थान शॉर्टकट",
159
+ deliveryQueue: "डिलीवरी कतार",
160
+ failedLastHour: "पिछले घंटे में {{count}} विफल",
161
+ processingCount: "{{count}} प्रोसेस हो रहे हैं",
162
+ queued: "कतार में",
163
+ active: "सक्रिय",
164
+ done1h: "पूर्ण 1घं",
165
+ failed1h: "विफल 1घं",
166
+ oldestQueued: "सबसे पुराना कतार में: {{age}}",
167
+ queueAgeNone: "कोई नहीं",
168
+ queueFailureHint: "क्रेडेंशियल, गंतव्य और हाल की कतार त्रुटियाँ जाँचें।",
169
+ unknownPlatform: "अज्ञात",
170
+ attemptsCount: "{{count}} प्रयास",
171
+ noErrorMessage: "(कोई त्रुटि संदेश नहीं)",
155
172
  },
156
173
  },
157
174
  agentPanel: {
@@ -327,6 +344,9 @@ const messages = {
327
344
  contactSidebarWidget: "साइडबार विजेट से संपर्क करें",
328
345
  contactSidebarDescription:
329
346
  "संपर्क और थ्रेड संदर्भ के साथ वर्तमान वार्तालाप के बगल में दिखाई देता है।",
347
+ eventDetailWidget: "इवेंट विवरण विजेट",
348
+ eventDetailDescription:
349
+ "खुले कैलेंडर इवेंट के नीचे इवेंट और उपस्थित लोगों के संदर्भ के साथ दिखाई देता है।",
330
350
  addWidgetHere: "यहां विजेट जोड़ें",
331
351
  back: "वापस",
332
352
  editExtension: "एक्सटेंशन संपादित करें",
@@ -43,6 +43,8 @@ const messages = {
43
43
  destinations: "Destinations",
44
44
  identities: "Identities",
45
45
  approvals: "承認",
46
+ automations: "自動化",
47
+ delivery: "配信",
46
48
  audit: "Audit",
47
49
  dreams: "Dreams",
48
50
  threadDebug: "スレッドのデバッグ",
@@ -157,6 +159,22 @@ const messages = {
157
159
  activeUsers: "アクティブユーザー",
158
160
  workspaceAppsStat: "ワークスペースアプリ",
159
161
  chatThreads: "チャットスレッド",
162
+ also: "その他",
163
+ workspaceShortcutsAria: "ワークスペースのショートカット",
164
+ deliveryQueue: "配信キュー",
165
+ failedLastHour: "過去 1 時間で {{count}} 件失敗",
166
+ processingCount: "{{count}} 件処理中",
167
+ queued: "待機中",
168
+ active: "実行中",
169
+ done1h: "完了 1h",
170
+ failed1h: "失敗 1h",
171
+ oldestQueued: "最古の待機: {{age}}",
172
+ queueAgeNone: "なし",
173
+ queueFailureHint:
174
+ "認証情報、送信先、最近のキューエラーを確認してください。",
175
+ unknownPlatform: "不明",
176
+ attemptsCount: "{{count}} 回試行",
177
+ noErrorMessage: "(エラーメッセージなし)",
160
178
  },
161
179
  },
162
180
  agentPanel: {
@@ -332,6 +350,9 @@ const messages = {
332
350
  contactSidebarWidget: "連絡先サイドバー ウィジェット",
333
351
  contactSidebarDescription:
334
352
  "現在の会話の横に連絡先とスレッドのコンテキストが表示されます。",
353
+ eventDetailWidget: "予定詳細ウィジェット",
354
+ eventDetailDescription:
355
+ "開いているカレンダー予定の下に、予定と出席者のコンテキストとともに表示されます。",
335
356
  addWidgetHere: "ここにウィジェットを追加",
336
357
  back: "戻る",
337
358
  editExtension: "拡張子の編集",
@@ -42,6 +42,8 @@ const messages = {
42
42
  destinations: "Destinations",
43
43
  identities: "Identities",
44
44
  approvals: "승인",
45
+ automations: "자동화",
46
+ delivery: "전달",
45
47
  audit: "Audit",
46
48
  dreams: "Dreams",
47
49
  threadDebug: "스레드 디버그",
@@ -154,6 +156,21 @@ const messages = {
154
156
  activeUsers: "활성 사용자",
155
157
  workspaceAppsStat: "작업 공간 앱",
156
158
  chatThreads: "채팅 스레드",
159
+ also: "또한",
160
+ workspaceShortcutsAria: "워크스페이스 바로가기",
161
+ deliveryQueue: "전달 대기열",
162
+ failedLastHour: "지난 1시간 동안 {{count}}건 실패",
163
+ processingCount: "{{count}}건 처리 중",
164
+ queued: "대기 중",
165
+ active: "진행 중",
166
+ done1h: "완료 1시간",
167
+ failed1h: "실패 1시간",
168
+ oldestQueued: "가장 오래된 대기: {{age}}",
169
+ queueAgeNone: "없음",
170
+ queueFailureHint: "자격 증명, 대상, 최근 대기열 오류를 확인하세요.",
171
+ unknownPlatform: "알 수 없음",
172
+ attemptsCount: "{{count}}회 시도",
173
+ noErrorMessage: "(오류 메시지 없음)",
157
174
  },
158
175
  },
159
176
  agentPanel: {
@@ -326,6 +343,9 @@ const messages = {
326
343
  contactSidebarWidget: "연락처 사이드바 위젯",
327
344
  contactSidebarDescription:
328
345
  "연락처 및 스레드 컨텍스트가 포함된 현재 대화 옆에 표시됩니다.",
346
+ eventDetailWidget: "일정 상세 위젯",
347
+ eventDetailDescription:
348
+ "열린 캘린더 일정 아래에 일정 및 참석자 컨텍스트와 함께 표시됩니다.",
329
349
  addWidgetHere: "여기에 위젯 추가",
330
350
  back: "뒤로",
331
351
  editExtension: "확장 편집",
@@ -43,6 +43,8 @@ const messages = {
43
43
  destinations: "Destinations",
44
44
  identities: "Identities",
45
45
  approvals: "Aprovações",
46
+ automations: "Automações",
47
+ delivery: "Entrega",
46
48
  audit: "Audit",
47
49
  dreams: "Dreams",
48
50
  threadDebug: "Depuração de thread",
@@ -161,6 +163,22 @@ const messages = {
161
163
  activeUsers: "Usuários ativos",
162
164
  workspaceAppsStat: "Aplicativos de espaço de trabalho",
163
165
  chatThreads: "Tópicos de bate-papo",
166
+ also: "Também",
167
+ workspaceShortcutsAria: "Atalhos do espaço de trabalho",
168
+ deliveryQueue: "Fila de entrega",
169
+ failedLastHour: "{{count}} falhas na última hora",
170
+ processingCount: "{{count}} em processamento",
171
+ queued: "Na fila",
172
+ active: "Ativo",
173
+ done1h: "Concluído 1 h",
174
+ failed1h: "Falhou 1 h",
175
+ oldestQueued: "Mais antigo na fila: {{age}}",
176
+ queueAgeNone: "nenhum",
177
+ queueFailureHint:
178
+ "Verifique credenciais, destinos e erros recentes da fila.",
179
+ unknownPlatform: "desconhecido",
180
+ attemptsCount: "{{count}} tentativas",
181
+ noErrorMessage: "(sem mensagem de erro)",
164
182
  },
165
183
  },
166
184
  agentPanel: {
@@ -341,6 +359,9 @@ const messages = {
341
359
  contactSidebarWidget: "Widget da barra lateral de contato",
342
360
  contactSidebarDescription:
343
361
  "Aparece ao lado da conversa atual com o contexto do contato e do tópico.",
362
+ eventDetailWidget: "Widget de detalhes do evento",
363
+ eventDetailDescription:
364
+ "Aparece abaixo do evento aberto do calendário com o contexto do evento e dos participantes.",
344
365
  addWidgetHere: "Adicione widget aqui",
345
366
  back: "Voltar",
346
367
  editExtension: "Editar extensão",
@@ -41,6 +41,8 @@ const messages = {
41
41
  destinations: "Destinations",
42
42
  identities: "Identities",
43
43
  approvals: "批准",
44
+ automations: "自动化",
45
+ delivery: "投递",
44
46
  audit: "Audit",
45
47
  dreams: "Dreams",
46
48
  threadDebug: "线程调试",
@@ -150,6 +152,21 @@ const messages = {
150
152
  activeUsers: "活跃用户",
151
153
  workspaceAppsStat: "工作区应用程序",
152
154
  chatThreads: "聊天话题",
155
+ also: "还有",
156
+ workspaceShortcutsAria: "工作区快捷入口",
157
+ deliveryQueue: "投递队列",
158
+ failedLastHour: "过去一小时失败 {{count}} 次",
159
+ processingCount: "{{count}} 个处理中",
160
+ queued: "排队中",
161
+ active: "进行中",
162
+ done1h: "完成 1 小时",
163
+ failed1h: "失败 1 小时",
164
+ oldestQueued: "最早排队:{{age}}",
165
+ queueAgeNone: "无",
166
+ queueFailureHint: "请检查凭据、目的地和最近的队列错误。",
167
+ unknownPlatform: "未知",
168
+ attemptsCount: "{{count}} 次尝试",
169
+ noErrorMessage: "(无错误消息)",
153
170
  },
154
171
  },
155
172
  agentPanel: {
@@ -316,6 +333,9 @@ const messages = {
316
333
  buildNewWidget: "构建一个新的小部件",
317
334
  contactSidebarWidget: "联系侧边栏小部件",
318
335
  contactSidebarDescription: "显示在当前对话旁边,包含联系人和线程上下文。",
336
+ eventDetailWidget: "活动详情小部件",
337
+ eventDetailDescription:
338
+ "显示在打开的日历活动下方,包含活动和与会者上下文。",
319
339
  addWidgetHere: "在这里添加小部件",
320
340
  back: "返回",
321
341
  editExtension: "编辑扩展名",
@@ -41,6 +41,8 @@ const messages = {
41
41
  destinations: "Destinations",
42
42
  identities: "Identities",
43
43
  approvals: "核准",
44
+ automations: "自動化",
45
+ delivery: "投遞",
44
46
  audit: "Audit",
45
47
  dreams: "Dreams",
46
48
  threadDebug: "對話串偵錯",
@@ -148,6 +150,21 @@ const messages = {
148
150
  activeUsers: "活躍使用者",
149
151
  workspaceAppsStat: "工作區應用程式",
150
152
  chatThreads: "聊天話題",
153
+ also: "還有",
154
+ workspaceShortcutsAria: "工作區快捷入口",
155
+ deliveryQueue: "投遞佇列",
156
+ failedLastHour: "過去一小時失敗 {{count}} 次",
157
+ processingCount: "{{count}} 個處理中",
158
+ queued: "排隊中",
159
+ active: "進行中",
160
+ done1h: "完成 1 小時",
161
+ failed1h: "失敗 1 小時",
162
+ oldestQueued: "最早排隊:{{age}}",
163
+ queueAgeNone: "無",
164
+ queueFailureHint: "請檢查憑證、目的地和最近的佇列錯誤。",
165
+ unknownPlatform: "未知",
166
+ attemptsCount: "{{count}} 次嘗試",
167
+ noErrorMessage: "(無錯誤訊息)",
151
168
  },
152
169
  },
153
170
  agentPanel: {
@@ -316,6 +333,8 @@ const messages = {
316
333
  buildNewWidget: "建置一個新的小工具",
317
334
  contactSidebarWidget: "聯絡側邊欄小工具",
318
335
  contactSidebarDescription: "顯示在目前對話旁邊,包含聯絡人和對話串脈絡。",
336
+ eventDetailWidget: "活動詳情小工具",
337
+ eventDetailDescription: "顯示在開啟的日曆活動下方,包含活動與出席者脈絡。",
319
338
  addWidgetHere: "在這裡新增小工具",
320
339
  back: "返回",
321
340
  editExtension: "編輯擴充功能名",
@@ -31,7 +31,6 @@
31
31
  "@types/node": "^24.2.1",
32
32
  "@types/react": "catalog:",
33
33
  "@types/react-dom": "catalog:",
34
- "@typescript/native-preview": "catalog:",
35
34
  "class-variance-authority": "^0.7.1",
36
35
  "clsx": "^2.1.1",
37
36
  "next-themes": "^0.4.6",
@@ -43,7 +42,8 @@
43
42
  "tailwind-merge": "^3.5.0",
44
43
  "tailwindcss": "^4.1.18",
45
44
  "tsx": "^4.20.3",
46
- "typescript": "^6.0.3",
45
+ "typescript": "catalog:",
46
+ "typescript-7": "catalog:",
47
47
  "vite": "^8.0.0"
48
48
  }
49
49
  }
@@ -7,7 +7,7 @@
7
7
  "agent": "agent-native agent",
8
8
  "script": "agent-native script",
9
9
  "skills:update": "agent-native skills update scaffold --project",
10
- "typecheck": "tsgo --noEmit"
10
+ "typecheck": "tsc --noEmit"
11
11
  },
12
12
  "dependencies": {
13
13
  "@agent-native/core": "latest",
@@ -16,9 +16,9 @@
16
16
  },
17
17
  "devDependencies": {
18
18
  "@types/node": "^24.2.1",
19
- "@typescript/native-preview": "catalog:",
20
19
  "oxfmt": "catalog:",
21
20
  "tsx": "^4.20.3",
22
- "typescript": "^6.0.3"
21
+ "typescript": "catalog:",
22
+ "typescript-7": "catalog:"
23
23
  }
24
24
  }
@@ -26,13 +26,13 @@
26
26
  }
27
27
  },
28
28
  "scripts": {
29
- "build": "tsgo",
30
- "dev": "tsgo --watch --preserveWatchOutput",
31
- "typecheck": "tsgo --noEmit",
32
- "prepare": "tsgo"
29
+ "build": "tsc",
30
+ "dev": "tsc --watch --preserveWatchOutput",
31
+ "typecheck": "tsc --noEmit",
32
+ "prepare": "tsc"
33
33
  },
34
34
  "devDependencies": {
35
- "@typescript/native-preview": "catalog:",
36
- "typescript": "^6.0.3"
35
+ "typescript": "catalog:",
36
+ "typescript-7": "catalog:"
37
37
  }
38
38
  }
@@ -17,10 +17,10 @@
17
17
  },
18
18
  "devDependencies": {
19
19
  "@types/node": "^24.2.1",
20
- "@typescript/native-preview": "catalog:",
21
20
  "oxfmt": "catalog:",
22
21
  "tsx": "catalog:",
23
- "typescript": "^6.0.3"
22
+ "typescript": "catalog:",
23
+ "typescript-7": "catalog:"
24
24
  },
25
25
  "packageManager": "pnpm@10.14.0",
26
26
  "agent-native": {
@@ -414,7 +414,7 @@ async function dispatchAgentic(
414
414
  (await getStoredModelForEngine(engine, { appId: _deps!.appId })) ??
415
415
  engine.defaultModel;
416
416
  const model = normalizeModelForEngine(engine, modelCandidate);
417
- await createThread(jobUserEmail, {
417
+ const thread = await createThread(jobUserEmail, {
418
418
  title: `Trigger: ${triggerName} — ${now.toLocaleDateString()}`,
419
419
  });
420
420
 
@@ -448,9 +448,11 @@ ${body}`;
448
448
  const timeout = setTimeout(() => controller.abort(), 5 * 60 * 1000);
449
449
 
450
450
  const events: AgentChatEvent[] = [];
451
+ let triggerUsage: Awaited<ReturnType<typeof runAgentLoop>> | null =
452
+ null;
451
453
 
452
454
  try {
453
- await runAgentLoop({
455
+ triggerUsage = await runAgentLoop({
454
456
  engine,
455
457
  model,
456
458
  systemPrompt,
@@ -459,11 +461,37 @@ ${body}`;
459
461
  actions,
460
462
  send: (event) => events.push(event),
461
463
  signal: controller.signal,
464
+ threadId: thread.id,
462
465
  });
463
466
  } finally {
464
467
  clearTimeout(timeout);
465
468
  }
466
469
 
470
+ if (
471
+ triggerUsage &&
472
+ (triggerUsage.inputTokens > 0 ||
473
+ triggerUsage.outputTokens > 0 ||
474
+ triggerUsage.cacheReadTokens > 0 ||
475
+ triggerUsage.cacheWriteTokens > 0)
476
+ ) {
477
+ try {
478
+ const { recordUsage } = await import("../usage/store.js");
479
+ await recordUsage({
480
+ ownerEmail: jobUserEmail,
481
+ inputTokens: triggerUsage.inputTokens,
482
+ outputTokens: triggerUsage.outputTokens,
483
+ cacheReadTokens: triggerUsage.cacheReadTokens,
484
+ cacheWriteTokens: triggerUsage.cacheWriteTokens,
485
+ model: triggerUsage.model,
486
+ label: `automation:${triggerName}`,
487
+ app: _deps!.appId,
488
+ refId: eventMeta.eventId,
489
+ });
490
+ } catch {
491
+ // Usage attribution must not break automation dispatch.
492
+ }
493
+ }
494
+
467
495
  meta.lastStatus = "success";
468
496
  await resourcePut(
469
497
  resource.owner,
@@ -306,7 +306,7 @@ function findWorkspaceCoreSync(
306
306
 
307
307
  function findLocalWorkspacePackageDeps(
308
308
  startDir: string,
309
- _workspaceRoot: string | null,
309
+ workspaceRoot: string | null,
310
310
  ): Array<{ packageName: string; packageDir: string }> {
311
311
  const pkgPath = path.join(startDir, "package.json");
312
312
  if (!fs.existsSync(pkgPath)) return [];
@@ -329,6 +329,12 @@ function findLocalWorkspacePackageDeps(
329
329
  let packageJsonPath: string | null = null;
330
330
  if (range.startsWith("file:")) {
331
331
  packageJsonPath = findFilePackageJsonPath(pkgPath, range);
332
+ } else if (range.startsWith("workspace:")) {
333
+ packageJsonPath = findWorkspacePackageJsonPath(
334
+ pkgPath,
335
+ packageName,
336
+ workspaceRoot,
337
+ );
332
338
  } else {
333
339
  continue;
334
340
  }
@@ -350,6 +356,93 @@ function findLocalWorkspacePackageDeps(
350
356
  }
351
357
  }
352
358
 
359
+ function packagePathSegments(packageName: string): string[] {
360
+ return packageName.split("/");
361
+ }
362
+
363
+ function findWorkspacePackageJsonPath(
364
+ pkgPath: string,
365
+ packageName: string,
366
+ workspaceRoot: string | null,
367
+ ): string | null {
368
+ const packageSegments = packagePathSegments(packageName);
369
+ const candidates = [
370
+ path.join(path.dirname(pkgPath), "node_modules", ...packageSegments),
371
+ ...(workspaceRoot
372
+ ? [path.join(workspaceRoot, "node_modules", ...packageSegments)]
373
+ : []),
374
+ ];
375
+
376
+ for (const candidate of candidates) {
377
+ const packageJsonPath = path.join(candidate, "package.json");
378
+ if (!fs.existsSync(packageJsonPath)) continue;
379
+ const realPath = fs.realpathSync(packageJsonPath);
380
+ if (
381
+ workspaceRoot &&
382
+ !realPath.startsWith(`${fs.realpathSync(workspaceRoot)}${path.sep}`)
383
+ ) {
384
+ continue;
385
+ }
386
+ return realPath;
387
+ }
388
+
389
+ if (workspaceRoot) {
390
+ return findWorkspacePackageJsonByName(workspaceRoot, packageName);
391
+ }
392
+
393
+ return null;
394
+ }
395
+
396
+ function findWorkspacePackageJsonByName(
397
+ workspaceRoot: string,
398
+ packageName: string,
399
+ ): string | null {
400
+ const searchRoots = ["packages", "templates"].map((name) =>
401
+ path.join(workspaceRoot, name),
402
+ );
403
+
404
+ for (const searchRoot of searchRoots) {
405
+ const packageJsonPath = findPackageJsonInTree(searchRoot, packageName, 2);
406
+ if (packageJsonPath) return packageJsonPath;
407
+ }
408
+
409
+ return null;
410
+ }
411
+
412
+ function findPackageJsonInTree(
413
+ root: string,
414
+ packageName: string,
415
+ maxDepth: number,
416
+ ): string | null {
417
+ if (!fs.existsSync(root)) return null;
418
+
419
+ const packageJsonPath = path.join(root, "package.json");
420
+ if (fs.existsSync(packageJsonPath)) {
421
+ try {
422
+ const pkg = JSON.parse(fs.readFileSync(packageJsonPath, "utf-8"));
423
+ if (pkg?.name === packageName) return fs.realpathSync(packageJsonPath);
424
+ } catch {
425
+ // Ignore malformed workspace package metadata.
426
+ }
427
+ }
428
+
429
+ if (maxDepth <= 0) return null;
430
+
431
+ for (const entry of fs.readdirSync(root, { withFileTypes: true })) {
432
+ if (!entry.isDirectory()) continue;
433
+ if (entry.name === "node_modules" || entry.name.startsWith(".")) continue;
434
+
435
+ const found = findPackageJsonInTree(
436
+ path.join(root, entry.name),
437
+ packageName,
438
+ maxDepth - 1,
439
+ );
440
+ if (found) return found;
441
+ }
442
+
443
+ return null;
444
+ }
445
+
353
446
  function findFilePackageJsonPath(
354
447
  pkgPath: string,
355
448
  range: string,
@@ -2157,8 +2250,10 @@ function localWorkspacePackageAliases(
2157
2250
  packages: Array<{ packageName: string; packageDir: string }>,
2158
2251
  ): any[] {
2159
2252
  const aliases: any[] = [];
2253
+ const sourceAliasExcludes = new Set(["@agent-native/pinpoint"]);
2160
2254
 
2161
2255
  for (const { packageName, packageDir } of packages) {
2256
+ if (sourceAliasExcludes.has(packageName)) continue;
2162
2257
  const pkgPath = path.join(packageDir, "package.json");
2163
2258
  if (!fs.existsSync(pkgPath)) continue;
2164
2259
 
@@ -89,8 +89,27 @@ agent answers about browser recordings in the Analytics template.
89
89
  - The `/sessions/:recordingId` replay player has a Dev Tools toggle that opens
90
90
  a panel with Console and Network tabs: filter chips, search, an error-count
91
91
  badge, and playback-time highlighting.
92
- - Rows are Jump-to-seek: clicking one seeks the player to that moment. Extend
93
- this panel instead of adding a separate debugging surface.
92
+ - Rows expand inline under the selected line (Chrome-style). Expanding a row
93
+ does not seek; use Jump to to move the playhead. Extend this panel instead of
94
+ adding a separate debugging surface.
95
+
96
+ ## Playback Viewer
97
+
98
+ - Wait for all replay chunks (`isComplete`) before constructing the rrweb
99
+ `Replayer`. Progressive chunk publishes should only update the loading bar;
100
+ rebuilding the player mid-load desyncs the scrubber and playhead.
101
+ - Prefer the latest sane Meta / ViewportResize frame for stage dimensions.
102
+ Out-of-range aspect ratios are clamped (preserve height, shrink width) before
103
+ handing events to rrweb so the stage does not collapse into an ultra-wide
104
+ ribbon and the recorded DOM stays roughly aligned. Capture also clamps the
105
+ same frames in `@agent-native/core` so new recordings never store absurd
106
+ Meta widths.
107
+ - The event timeline soft-highlights the active marker, auto-scrolls it into
108
+ view (pausing briefly after manual scroll), and supports search. It appears
109
+ beside the player from ~880px content width upward.
110
+ - Dev Tools height is capped so the replay stage never collapses into a ribbon
111
+ on short viewports; the scrubber playhead stays visually distinct from red
112
+ error marker dots.
94
113
 
95
114
  ## Debugging A User-Reported Bug
96
115
 
@@ -337,23 +337,33 @@
337
337
  opacity: 0.55;
338
338
  }
339
339
 
340
+ /* Keep the playhead visually distinct from red console-error marker dots on
341
+ the scrubber track — those markers used to look like a second thumb. */
340
342
  .an-replay-scrub::-webkit-slider-thumb {
341
- width: 0.75rem;
342
- height: 0.75rem;
343
+ width: 0.875rem;
344
+ height: 0.875rem;
343
345
  appearance: none;
344
346
  border: 2px solid hsl(var(--background));
345
347
  border-radius: 9999px;
346
- background: hsl(var(--primary));
347
- box-shadow: 0 0 0 1px hsl(var(--border));
348
+ background: hsl(217 91% 60%);
349
+ box-shadow:
350
+ 0 0 0 1px hsl(217 91% 60% / 0.55),
351
+ 0 1px 2px hsl(0 0% 0% / 0.35);
352
+ position: relative;
353
+ z-index: 40;
348
354
  }
349
355
 
350
356
  .an-replay-scrub::-moz-range-thumb {
351
- width: 0.75rem;
352
- height: 0.75rem;
357
+ width: 0.875rem;
358
+ height: 0.875rem;
353
359
  border: 2px solid hsl(var(--background));
354
360
  border-radius: 9999px;
355
- background: hsl(var(--primary));
356
- box-shadow: 0 0 0 1px hsl(var(--border));
361
+ background: hsl(217 91% 60%);
362
+ box-shadow:
363
+ 0 0 0 1px hsl(217 91% 60% / 0.55),
364
+ 0 1px 2px hsl(0 0% 0% / 0.35);
365
+ position: relative;
366
+ z-index: 40;
357
367
  }
358
368
 
359
369
  .dark
@@ -570,9 +580,9 @@
570
580
  }
571
581
  }
572
582
 
573
- @container analytics-session-detail (min-width: 1040px) {
583
+ @container analytics-session-detail (min-width: 880px) {
574
584
  .analytics-session-detail-workbench {
575
- grid-template-columns: minmax(0, 1fr) 330px;
585
+ grid-template-columns: minmax(0, 1fr) minmax(260px, 300px);
576
586
  }
577
587
 
578
588
  .analytics-session-detail-timeline {
@@ -580,6 +590,12 @@
580
590
  }
581
591
  }
582
592
 
593
+ @container analytics-session-detail (min-width: 1200px) {
594
+ .analytics-session-detail-workbench {
595
+ grid-template-columns: minmax(0, 1fr) 330px;
596
+ }
597
+ }
598
+
583
599
  /* The dashboard grid responds to the available content width — which shrinks
584
600
  when the agent sidebar is open — not the viewport. Rows are rendered
585
601
  explicitly so deleting a card only expands the remaining cards in that row. */
@@ -964,6 +964,8 @@ const messages = {
964
964
  timeline: "事件時間線",
965
965
  replayTimeline: "回放時間線",
966
966
  timelineDescription: "顯示 {{count}} / {{total}} 個有用事件。",
967
+ timelineSearch: "搜尋事件...",
968
+ timelineNoMatches: "沒有符合目前搜尋的時間線事件。",
967
969
  noTimelineEvents: "未找到時間線標記",
968
970
  sequence: "Sequence",
969
971
  size: "Size",