@agent-native/core 0.84.10 → 0.84.13

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 (140) hide show
  1. package/corpus/README.md +1 -1
  2. package/corpus/core/CHANGELOG.md +48 -0
  3. package/corpus/core/package.json +1 -1
  4. package/corpus/core/src/agent/durable-background.ts +30 -0
  5. package/corpus/core/src/agent/production-agent.ts +34 -6
  6. package/corpus/core/src/agent/run-manager.ts +45 -2
  7. package/corpus/core/src/agent/run-store.ts +29 -6
  8. package/corpus/core/src/chat-threads/store.ts +2 -0
  9. package/corpus/core/src/cli/skills.ts +10 -6
  10. package/corpus/core/src/client/AssistantChat.tsx +40 -9
  11. package/corpus/core/src/client/agent-chat-adapter.ts +23 -2
  12. package/corpus/core/src/client/chat/run-recovery.tsx +52 -44
  13. package/corpus/core/src/client/chat/tool-call-display.tsx +7 -2
  14. package/corpus/core/src/client/require-session.tsx +20 -1
  15. package/corpus/core/src/client/sharing/ShareButton.tsx +9 -3
  16. package/corpus/core/src/collab/storage.ts +40 -5
  17. package/corpus/core/src/server/agent-chat-plugin.ts +1 -0
  18. package/corpus/core/src/server/auth.ts +6 -0
  19. package/corpus/core/src/shared/streaming-text-smoothing.ts +10 -5
  20. package/corpus/templates/assets/.agents/skills/logo-composite/SKILL.md +7 -6
  21. package/corpus/templates/assets/AGENTS.md +15 -0
  22. package/corpus/templates/assets/actions/_helpers.ts +3 -1
  23. package/corpus/templates/assets/actions/create-generation-preset.ts +12 -1
  24. package/corpus/templates/assets/actions/generate-asset.ts +5 -1
  25. package/corpus/templates/assets/actions/generate-image-batch.ts +6 -1
  26. package/corpus/templates/assets/actions/generate-image.ts +18 -11
  27. package/corpus/templates/assets/actions/open-asset-picker.ts +4 -2
  28. package/corpus/templates/assets/actions/update-generation-preset.ts +16 -3
  29. package/corpus/templates/assets/app/i18n/zh-TW.ts +3 -0
  30. package/corpus/templates/assets/app/i18n-data.ts +30 -0
  31. package/corpus/templates/assets/app/routes/brand-kits.$id.tsx +42 -7
  32. package/corpus/templates/assets/app/routes/library.tsx +4 -2
  33. package/corpus/templates/assets/changelog/2026-07-01-generation-presets-can-now-composite-your-brand-s-canonical-.md +6 -0
  34. package/corpus/templates/assets/changelog/2026-07-01-tagging-a-preset-now-briefs-the-agent-on-that-preset-s-aesth.md +6 -0
  35. package/corpus/templates/assets/server/lib/preset-chat-context.ts +118 -0
  36. package/corpus/templates/assets/server/plugins/agent-chat.ts +5 -0
  37. package/corpus/templates/assets/shared/api.ts +1 -0
  38. package/corpus/templates/clips/app/components/library/recording-card.tsx +14 -4
  39. package/corpus/templates/clips/app/components/recorder/recorder-engine.ts +10 -12
  40. package/corpus/templates/clips/app/hooks/use-library.ts +7 -4
  41. package/corpus/templates/clips/app/lib/recording-status.ts +32 -0
  42. package/corpus/templates/clips/changelog/2026-07-01-dictation-keeps-listening-through-natural-pauses-and-gives-c.md +6 -0
  43. package/corpus/templates/clips/changelog/2026-07-01-redoing-a-paused-desktop-recording-no-longer-leaves-the-recording-controls-disabled.md +6 -0
  44. package/corpus/templates/clips/changelog/2026-07-01-stalled-clip-uploads-now-update-in-the-library-and-surface-as-failed.md +6 -0
  45. package/corpus/templates/clips/desktop/src/lib/recorder.ts +36 -18
  46. package/corpus/templates/clips/desktop/src/lib/voice-dictation.ts +99 -27
  47. package/corpus/templates/clips/desktop/src/overlays/flow-bar.tsx +4 -43
  48. package/corpus/templates/clips/desktop/src/overlays/toolbar.tsx +3 -0
  49. package/corpus/templates/clips/desktop/src/styles.css +5 -48
  50. package/corpus/templates/clips/desktop/src-tauri/src/clips/mod.rs +4 -5
  51. package/corpus/templates/design/.agents/skills/design-generation/SKILL.md +15 -6
  52. package/corpus/templates/design/AGENTS.md +8 -4
  53. package/corpus/templates/design/actions/create-design.ts +1 -0
  54. package/corpus/templates/design/actions/duplicate-design.ts +3 -1
  55. package/corpus/templates/design/actions/edit-design.ts +43 -13
  56. package/corpus/templates/design/actions/export-html.ts +4 -2
  57. package/corpus/templates/design/actions/export-pdf.ts +3 -1
  58. package/corpus/templates/design/actions/export-svg.ts +4 -2
  59. package/corpus/templates/design/actions/export-zip.ts +10 -3
  60. package/corpus/templates/design/actions/generate-design.ts +5 -1
  61. package/corpus/templates/design/actions/present-design-variants.ts +17 -12
  62. package/corpus/templates/design/actions/update-file.ts +68 -17
  63. package/corpus/templates/design/app/components/design/DesignCanvas.tsx +3 -2
  64. package/corpus/templates/design/app/components/design/EditPanel.tsx +35 -3
  65. package/corpus/templates/design/app/components/design/MotionDock.tsx +46 -11
  66. package/corpus/templates/design/app/components/design/MultiScreenCanvas.tsx +80 -30
  67. package/corpus/templates/design/app/components/design/bridge/editor-chrome.bridge.ts +60 -10
  68. package/corpus/templates/design/app/components/design/canvas-primitive-style.ts +2 -0
  69. package/corpus/templates/design/app/components/design/inspector/InspectorAiActions.tsx +4 -0
  70. package/corpus/templates/design/app/hooks/use-question-flow.ts +2 -2
  71. package/corpus/templates/design/app/hooks/useAgentEditRequest.ts +2 -2
  72. package/corpus/templates/design/app/i18n-data.ts +1 -1
  73. package/corpus/templates/design/app/pages/DesignEditor.tsx +493 -109
  74. package/corpus/templates/design/app/pages/VisualEdit.tsx +4 -16
  75. package/corpus/templates/design/changelog/2026-07-01-org-members-can-see-design-projects-created-in-their-workspace.md +6 -0
  76. package/corpus/templates/design/e2e/helpers.ts +2 -2
  77. package/corpus/templates/design/server/plugins/db.ts +9 -0
  78. package/dist/agent/durable-background.d.ts +3 -0
  79. package/dist/agent/durable-background.d.ts.map +1 -1
  80. package/dist/agent/durable-background.js +19 -0
  81. package/dist/agent/durable-background.js.map +1 -1
  82. package/dist/agent/production-agent.d.ts +1 -0
  83. package/dist/agent/production-agent.d.ts.map +1 -1
  84. package/dist/agent/production-agent.js +29 -6
  85. package/dist/agent/production-agent.js.map +1 -1
  86. package/dist/agent/run-manager.d.ts.map +1 -1
  87. package/dist/agent/run-manager.js +40 -2
  88. package/dist/agent/run-manager.js.map +1 -1
  89. package/dist/agent/run-store.d.ts.map +1 -1
  90. package/dist/agent/run-store.js +28 -6
  91. package/dist/agent/run-store.js.map +1 -1
  92. package/dist/chat-threads/store.d.ts +1 -0
  93. package/dist/chat-threads/store.d.ts.map +1 -1
  94. package/dist/chat-threads/store.js +2 -0
  95. package/dist/chat-threads/store.js.map +1 -1
  96. package/dist/cli/skills.d.ts.map +1 -1
  97. package/dist/cli/skills.js +10 -6
  98. package/dist/cli/skills.js.map +1 -1
  99. package/dist/client/AssistantChat.d.ts +10 -0
  100. package/dist/client/AssistantChat.d.ts.map +1 -1
  101. package/dist/client/AssistantChat.js +26 -8
  102. package/dist/client/AssistantChat.js.map +1 -1
  103. package/dist/client/agent-chat-adapter.d.ts.map +1 -1
  104. package/dist/client/agent-chat-adapter.js +21 -2
  105. package/dist/client/agent-chat-adapter.js.map +1 -1
  106. package/dist/client/chat/run-recovery.d.ts.map +1 -1
  107. package/dist/client/chat/run-recovery.js +15 -10
  108. package/dist/client/chat/run-recovery.js.map +1 -1
  109. package/dist/client/chat/tool-call-display.d.ts +1 -0
  110. package/dist/client/chat/tool-call-display.d.ts.map +1 -1
  111. package/dist/client/chat/tool-call-display.js +3 -2
  112. package/dist/client/chat/tool-call-display.js.map +1 -1
  113. package/dist/client/require-session.d.ts +14 -0
  114. package/dist/client/require-session.d.ts.map +1 -1
  115. package/dist/client/require-session.js +19 -1
  116. package/dist/client/require-session.js.map +1 -1
  117. package/dist/client/sharing/ShareButton.d.ts +4 -2
  118. package/dist/client/sharing/ShareButton.d.ts.map +1 -1
  119. package/dist/client/sharing/ShareButton.js +3 -1
  120. package/dist/client/sharing/ShareButton.js.map +1 -1
  121. package/dist/collab/routes.d.ts +2 -2
  122. package/dist/collab/storage.d.ts.map +1 -1
  123. package/dist/collab/storage.js +31 -5
  124. package/dist/collab/storage.js.map +1 -1
  125. package/dist/file-upload/actions/upload-image.d.ts +2 -2
  126. package/dist/notifications/routes.d.ts +2 -2
  127. package/dist/observability/routes.d.ts +5 -5
  128. package/dist/progress/routes.d.ts +1 -1
  129. package/dist/resources/handlers.d.ts +3 -3
  130. package/dist/server/agent-chat-plugin.d.ts.map +1 -1
  131. package/dist/server/agent-chat-plugin.js +1 -1
  132. package/dist/server/agent-chat-plugin.js.map +1 -1
  133. package/dist/server/auth.d.ts.map +1 -1
  134. package/dist/server/auth.js +7 -0
  135. package/dist/server/auth.js.map +1 -1
  136. package/dist/server/transcribe-voice.d.ts +1 -1
  137. package/dist/shared/streaming-text-smoothing.d.ts.map +1 -1
  138. package/dist/shared/streaming-text-smoothing.js +8 -5
  139. package/dist/shared/streaming-text-smoothing.js.map +1 -1
  140. package/package.json +1 -1
@@ -20,7 +20,7 @@ export declare function createTranscribeVoiceHandler(): import("h3").EventHandle
20
20
  error: string;
21
21
  text?: undefined;
22
22
  } | {
23
- text: string;
24
23
  error?: undefined;
24
+ text: string;
25
25
  }>>;
26
26
  //# sourceMappingURL=transcribe-voice.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"streaming-text-smoothing.d.ts","sourceRoot":"","sources":["../../src/shared/streaming-text-smoothing.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,mCAAmC,KAAK,CAAC;AACtD,eAAO,MAAM,8CAA8C,MAAM,CAAC;AAClE,eAAO,MAAM,yCAAyC,MAAM,CAAC;AA2C7D;;;;;;;;;;GAUG;AACH,wBAAgB,2BAA2B,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CA6ClE;AAED;;;;;GAKG;AACH,wBAAgB,mBAAmB,IAAI,IAAI,CAE1C;AAED,wBAAgB,mCAAmC,CACjD,SAAS,EAAE,SAAS,MAAM,EAAE,GAC3B,MAAM,CASR;AAED,wBAAgB,0BAA0B,CAAC,EACzC,OAAO,EACP,SAAS,EACT,SAAiB,GAClB,EAAE;IACD,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB,GAAG,MAAM,CAqBT;AAED,wBAAgB,iCAAiC,CAC/C,QAAQ,EAAE,MAAM,GAAG,SAAS,EAC5B,OAAO,EAAE,MAAM,GACd,MAAM,CAkBR"}
1
+ {"version":3,"file":"streaming-text-smoothing.d.ts","sourceRoot":"","sources":["../../src/shared/streaming-text-smoothing.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,mCAAmC,KAAK,CAAC;AACtD,eAAO,MAAM,8CAA8C,MAAM,CAAC;AAClE,eAAO,MAAM,yCAAyC,MAAM,CAAC;AA4C7D;;;;;;;;;;GAUG;AACH,wBAAgB,2BAA2B,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CA6ClE;AAED;;;;;GAKG;AACH,wBAAgB,mBAAmB,IAAI,IAAI,CAE1C;AAED,wBAAgB,mCAAmC,CACjD,SAAS,EAAE,SAAS,MAAM,EAAE,GAC3B,MAAM,CASR;AAED,wBAAgB,0BAA0B,CAAC,EACzC,OAAO,EACP,SAAS,EACT,SAAiB,GAClB,EAAE;IACD,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB,GAAG,MAAM,CAyBT;AAED,wBAAgB,iCAAiC,CAC/C,QAAQ,EAAE,MAAM,GAAG,SAAS,EAC5B,OAAO,EAAE,MAAM,GACd,MAAM,CAkBR"}
@@ -1,6 +1,7 @@
1
1
  export const SMOOTH_STREAMING_COMMIT_INTERVAL_MS = 16;
2
2
  export const SMOOTH_STREAMING_LONG_TEXT_THRESHOLD_GRAPHEMES = 640;
3
3
  export const SMOOTH_STREAMING_LONG_TEXT_TAIL_GRAPHEMES = 180;
4
+ const SMOOTH_STREAMING_SPEED_MULTIPLIER = 2;
4
5
  // Module-level singleton Segmenter instance — creating a new Segmenter on every
5
6
  // call was previously the hot path cost (allocation + engine init per chunk).
6
7
  let _segmenter = undefined; // undefined = not yet checked
@@ -85,7 +86,7 @@ export function smoothStreamingRevealCount({ backlog, elapsedMs, inputDone = fal
85
86
  if (backlog <= 0 || elapsedMs <= 0) {
86
87
  return 0;
87
88
  }
88
- const charactersPerSecond = inputDone
89
+ const baseCharactersPerSecond = inputDone
89
90
  ? backlog > 800
90
91
  ? 900
91
92
  : 420
@@ -96,7 +97,9 @@ export function smoothStreamingRevealCount({ backlog, elapsedMs, inputDone = fal
96
97
  : backlog > 180
97
98
  ? 190
98
99
  : 95;
99
- const maxBurst = inputDone ? 160 : backlog > 1400 ? 120 : 72;
100
+ const charactersPerSecond = baseCharactersPerSecond * SMOOTH_STREAMING_SPEED_MULTIPLIER;
101
+ const maxBurst = (inputDone ? 160 : backlog > 1400 ? 120 : 72) *
102
+ SMOOTH_STREAMING_SPEED_MULTIPLIER;
100
103
  const count = Math.floor((elapsedMs / 1000) * charactersPerSecond);
101
104
  return Math.min(backlog, Math.max(1, count), maxBurst);
102
105
  }
@@ -105,13 +108,13 @@ export function smoothStreamingPunctuationDelayMs(grapheme, backlog) {
105
108
  return 0;
106
109
  }
107
110
  if (grapheme === "\n") {
108
- return 80;
111
+ return 80 / SMOOTH_STREAMING_SPEED_MULTIPLIER;
109
112
  }
110
113
  if (/[.!?)]/.test(grapheme)) {
111
- return 70;
114
+ return 70 / SMOOTH_STREAMING_SPEED_MULTIPLIER;
112
115
  }
113
116
  if (/[,;:]/.test(grapheme)) {
114
- return 35;
117
+ return 35 / SMOOTH_STREAMING_SPEED_MULTIPLIER;
115
118
  }
116
119
  return 0;
117
120
  }
@@ -1 +1 @@
1
- {"version":3,"file":"streaming-text-smoothing.js","sourceRoot":"","sources":["../../src/shared/streaming-text-smoothing.ts"],"names":[],"mappings":"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","sourcesContent":["export const SMOOTH_STREAMING_COMMIT_INTERVAL_MS = 16;\nexport const SMOOTH_STREAMING_LONG_TEXT_THRESHOLD_GRAPHEMES = 640;\nexport const SMOOTH_STREAMING_LONG_TEXT_TAIL_GRAPHEMES = 180;\n\ntype SegmenterInstance = {\n segment(input: string): Iterable<{ segment: string }>;\n};\n\ntype SegmenterConstructor = new (\n locales?: string | string[],\n options?: { granularity?: \"grapheme\" },\n) => SegmenterInstance;\n\n// Module-level singleton Segmenter instance — creating a new Segmenter on every\n// call was previously the hot path cost (allocation + engine init per chunk).\nlet _segmenter: SegmenterInstance | null | undefined = undefined; // undefined = not yet checked\n\nfunction getSegmenter(): SegmenterInstance | null {\n if (_segmenter !== undefined) return _segmenter;\n const Segmenter = (Intl as typeof Intl & { Segmenter?: SegmenterConstructor })\n .Segmenter;\n _segmenter = Segmenter\n ? new Segmenter(undefined, { granularity: \"grapheme\" })\n : null;\n return _segmenter;\n}\n\n/**\n * Incremental segmentation cache. Instead of re-segmenting the full target\n * text on every frame, we extend the cached grapheme array by only segmenting\n * newly appended text.\n *\n * Because multi-byte grapheme clusters (emoji, ZWJ sequences) can straddle a\n * chunk boundary we re-segment the last OVERLAP characters of the previous text\n * together with the new suffix, then splice the results in.\n */\nconst SEGMENTER_OVERLAP = 16; // chars — safely covers any real grapheme cluster\n\ninterface SegmenterCache {\n text: string;\n graphemes: string[];\n}\n\nlet _segCache: SegmenterCache | null = null;\n\n/**\n * Split `text` into grapheme clusters.\n *\n * Results are cached: when `text` is an append of a previously segmented\n * string, only the appended suffix is segmented (plus a small overlap) and\n * merged with the cached result, making this O(delta) instead of O(n) per\n * call.\n *\n * When the new text is not a prefix-extension of the cache (e.g. a full reset\n * or non-append change) we fall back to full segmentation and reset the cache.\n */\nexport function splitStreamingTextGraphemes(text: string): string[] {\n const segmenter = getSegmenter();\n\n if (!segmenter) {\n return Array.from(text);\n }\n\n // Fast path: exact cache hit\n if (_segCache && _segCache.text === text) {\n return _segCache.graphemes;\n }\n\n // Incremental path: new text extends the cached text\n if (_segCache && text.startsWith(_segCache.text)) {\n const prevLen = _segCache.text.length;\n // Re-segment from (prevLen - OVERLAP) to include the overlap so any\n // grapheme that was split across the boundary is correctly re-assembled.\n const overlapStart = Math.max(0, prevLen - SEGMENTER_OVERLAP);\n const suffix = text.slice(overlapStart);\n const newGraphemes = Array.from(\n segmenter.segment(suffix),\n (entry) => entry.segment,\n );\n // Drop graphemes that correspond to the overlap region from the cache so\n // we don't double-count them.\n const overlapGraphemes = Array.from(\n segmenter.segment(text.slice(overlapStart, prevLen)),\n (entry) => entry.segment,\n );\n const stableGraphemes = _segCache.graphemes.slice(\n 0,\n _segCache.graphemes.length - overlapGraphemes.length,\n );\n const merged = stableGraphemes.concat(newGraphemes);\n _segCache = { text, graphemes: merged };\n return merged;\n }\n\n // Full fallback: text is not an append of cached text (reset or replacement)\n const graphemes = Array.from(\n segmenter.segment(text),\n (entry) => entry.segment,\n );\n _segCache = { text, graphemes };\n return graphemes;\n}\n\n/**\n * Reset the incremental segmentation cache. Call this when switching to a\n * new message so the cache from the previous message isn't carried over.\n * (Not strictly necessary for correctness — the cache is keyed on content —\n * but avoids holding a reference to the last message's text string.)\n */\nexport function resetSegmenterCache(): void {\n _segCache = null;\n}\n\nexport function initialSmoothStreamingGraphemeCount(\n graphemes: readonly string[],\n): number {\n if (graphemes.length <= SMOOTH_STREAMING_LONG_TEXT_THRESHOLD_GRAPHEMES) {\n return 0;\n }\n\n return Math.max(\n 0,\n graphemes.length - SMOOTH_STREAMING_LONG_TEXT_TAIL_GRAPHEMES,\n );\n}\n\nexport function smoothStreamingRevealCount({\n backlog,\n elapsedMs,\n inputDone = false,\n}: {\n backlog: number;\n elapsedMs: number;\n inputDone?: boolean;\n}): number {\n if (backlog <= 0 || elapsedMs <= 0) {\n return 0;\n }\n\n const charactersPerSecond = inputDone\n ? backlog > 800\n ? 900\n : 420\n : backlog > 1400\n ? 640\n : backlog > 520\n ? 360\n : backlog > 180\n ? 190\n : 95;\n\n const maxBurst = inputDone ? 160 : backlog > 1400 ? 120 : 72;\n const count = Math.floor((elapsedMs / 1000) * charactersPerSecond);\n\n return Math.min(backlog, Math.max(1, count), maxBurst);\n}\n\nexport function smoothStreamingPunctuationDelayMs(\n grapheme: string | undefined,\n backlog: number,\n): number {\n if (!grapheme || backlog > 220) {\n return 0;\n }\n\n if (grapheme === \"\\n\") {\n return 80;\n }\n\n if (/[.!?)]/.test(grapheme)) {\n return 70;\n }\n\n if (/[,;:]/.test(grapheme)) {\n return 35;\n }\n\n return 0;\n}\n"]}
1
+ {"version":3,"file":"streaming-text-smoothing.js","sourceRoot":"","sources":["../../src/shared/streaming-text-smoothing.ts"],"names":[],"mappings":"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","sourcesContent":["export const SMOOTH_STREAMING_COMMIT_INTERVAL_MS = 16;\nexport const SMOOTH_STREAMING_LONG_TEXT_THRESHOLD_GRAPHEMES = 640;\nexport const SMOOTH_STREAMING_LONG_TEXT_TAIL_GRAPHEMES = 180;\nconst SMOOTH_STREAMING_SPEED_MULTIPLIER = 2;\n\ntype SegmenterInstance = {\n segment(input: string): Iterable<{ segment: string }>;\n};\n\ntype SegmenterConstructor = new (\n locales?: string | string[],\n options?: { granularity?: \"grapheme\" },\n) => SegmenterInstance;\n\n// Module-level singleton Segmenter instance — creating a new Segmenter on every\n// call was previously the hot path cost (allocation + engine init per chunk).\nlet _segmenter: SegmenterInstance | null | undefined = undefined; // undefined = not yet checked\n\nfunction getSegmenter(): SegmenterInstance | null {\n if (_segmenter !== undefined) return _segmenter;\n const Segmenter = (Intl as typeof Intl & { Segmenter?: SegmenterConstructor })\n .Segmenter;\n _segmenter = Segmenter\n ? new Segmenter(undefined, { granularity: \"grapheme\" })\n : null;\n return _segmenter;\n}\n\n/**\n * Incremental segmentation cache. Instead of re-segmenting the full target\n * text on every frame, we extend the cached grapheme array by only segmenting\n * newly appended text.\n *\n * Because multi-byte grapheme clusters (emoji, ZWJ sequences) can straddle a\n * chunk boundary we re-segment the last OVERLAP characters of the previous text\n * together with the new suffix, then splice the results in.\n */\nconst SEGMENTER_OVERLAP = 16; // chars — safely covers any real grapheme cluster\n\ninterface SegmenterCache {\n text: string;\n graphemes: string[];\n}\n\nlet _segCache: SegmenterCache | null = null;\n\n/**\n * Split `text` into grapheme clusters.\n *\n * Results are cached: when `text` is an append of a previously segmented\n * string, only the appended suffix is segmented (plus a small overlap) and\n * merged with the cached result, making this O(delta) instead of O(n) per\n * call.\n *\n * When the new text is not a prefix-extension of the cache (e.g. a full reset\n * or non-append change) we fall back to full segmentation and reset the cache.\n */\nexport function splitStreamingTextGraphemes(text: string): string[] {\n const segmenter = getSegmenter();\n\n if (!segmenter) {\n return Array.from(text);\n }\n\n // Fast path: exact cache hit\n if (_segCache && _segCache.text === text) {\n return _segCache.graphemes;\n }\n\n // Incremental path: new text extends the cached text\n if (_segCache && text.startsWith(_segCache.text)) {\n const prevLen = _segCache.text.length;\n // Re-segment from (prevLen - OVERLAP) to include the overlap so any\n // grapheme that was split across the boundary is correctly re-assembled.\n const overlapStart = Math.max(0, prevLen - SEGMENTER_OVERLAP);\n const suffix = text.slice(overlapStart);\n const newGraphemes = Array.from(\n segmenter.segment(suffix),\n (entry) => entry.segment,\n );\n // Drop graphemes that correspond to the overlap region from the cache so\n // we don't double-count them.\n const overlapGraphemes = Array.from(\n segmenter.segment(text.slice(overlapStart, prevLen)),\n (entry) => entry.segment,\n );\n const stableGraphemes = _segCache.graphemes.slice(\n 0,\n _segCache.graphemes.length - overlapGraphemes.length,\n );\n const merged = stableGraphemes.concat(newGraphemes);\n _segCache = { text, graphemes: merged };\n return merged;\n }\n\n // Full fallback: text is not an append of cached text (reset or replacement)\n const graphemes = Array.from(\n segmenter.segment(text),\n (entry) => entry.segment,\n );\n _segCache = { text, graphemes };\n return graphemes;\n}\n\n/**\n * Reset the incremental segmentation cache. Call this when switching to a\n * new message so the cache from the previous message isn't carried over.\n * (Not strictly necessary for correctness — the cache is keyed on content —\n * but avoids holding a reference to the last message's text string.)\n */\nexport function resetSegmenterCache(): void {\n _segCache = null;\n}\n\nexport function initialSmoothStreamingGraphemeCount(\n graphemes: readonly string[],\n): number {\n if (graphemes.length <= SMOOTH_STREAMING_LONG_TEXT_THRESHOLD_GRAPHEMES) {\n return 0;\n }\n\n return Math.max(\n 0,\n graphemes.length - SMOOTH_STREAMING_LONG_TEXT_TAIL_GRAPHEMES,\n );\n}\n\nexport function smoothStreamingRevealCount({\n backlog,\n elapsedMs,\n inputDone = false,\n}: {\n backlog: number;\n elapsedMs: number;\n inputDone?: boolean;\n}): number {\n if (backlog <= 0 || elapsedMs <= 0) {\n return 0;\n }\n\n const baseCharactersPerSecond = inputDone\n ? backlog > 800\n ? 900\n : 420\n : backlog > 1400\n ? 640\n : backlog > 520\n ? 360\n : backlog > 180\n ? 190\n : 95;\n const charactersPerSecond =\n baseCharactersPerSecond * SMOOTH_STREAMING_SPEED_MULTIPLIER;\n\n const maxBurst =\n (inputDone ? 160 : backlog > 1400 ? 120 : 72) *\n SMOOTH_STREAMING_SPEED_MULTIPLIER;\n const count = Math.floor((elapsedMs / 1000) * charactersPerSecond);\n\n return Math.min(backlog, Math.max(1, count), maxBurst);\n}\n\nexport function smoothStreamingPunctuationDelayMs(\n grapheme: string | undefined,\n backlog: number,\n): number {\n if (!grapheme || backlog > 220) {\n return 0;\n }\n\n if (grapheme === \"\\n\") {\n return 80 / SMOOTH_STREAMING_SPEED_MULTIPLIER;\n }\n\n if (/[.!?)]/.test(grapheme)) {\n return 70 / SMOOTH_STREAMING_SPEED_MULTIPLIER;\n }\n\n if (/[,;:]/.test(grapheme)) {\n return 35 / SMOOTH_STREAMING_SPEED_MULTIPLIER;\n }\n\n return 0;\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@agent-native/core",
3
- "version": "0.84.10",
3
+ "version": "0.84.13",
4
4
  "description": "Framework for agent-native application development — where AI agents and UI share SQL state, actions, and context",
5
5
  "homepage": "https://github.com/BuilderIO/agent-native#readme",
6
6
  "bugs": {