oomi-ai 0.2.27 → 0.2.28

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.md CHANGED
@@ -4,13 +4,14 @@ OpenClaw channel plugin and bridge tooling for Oomi managed chat and voice.
4
4
 
5
5
  ## Current Focus
6
6
 
7
- `0.2.27` keeps the persona automation lane and adds a usable local managed-voice validation path:
7
+ `0.2.28` keeps the persona automation lane and adds a usable local managed-voice validation path:
8
8
  - WebSpatial-based persona scaffolding for generated Oomi apps
9
9
  - a high-level `oomi personas create-managed` command for agent-driven persona creation
10
10
  - device-authenticated persona runtime registration and job callbacks
11
11
  - automatic bridge-side polling for queued `persona_job` control messages
12
12
  - one shared spoken-metadata normalizer used by both the extension and the bridge
13
13
  - a repo-backed local `tts-pipeline` replay that can validate assistant-final -> backend -> real Qwen TTS before publishing
14
+ - spoken-metadata handling that preserves natural pauses like `...` and keeps the managed voice contract valid on the real chat session path
14
15
 
15
16
  This package is for two audiences:
16
17
  - OpenClaw operators who need to connect a machine to Oomi and keep chat or voice healthy
@@ -2,6 +2,8 @@ function trimString(value, fallback = '') {
2
2
  return typeof value === 'string' && value.trim() ? value.trim() : fallback;
3
3
  }
4
4
 
5
+ const ELLIPSIS_PLACEHOLDER = '__OOMI_ELLIPSIS__';
6
+
5
7
  function stripAvatarCommandTags(text) {
6
8
  return text.replace(/\[(anim|animation|face|expression|emotion|gesture|look|gaze):[^\]]+\]/gi, ' ');
7
9
  }
@@ -70,15 +72,19 @@ function normalizeSpeechText(text) {
70
72
  .replace(/\*\*(.*?)\*\*/g, '$1')
71
73
  .replace(/__(.*?)__/g, '$1')
72
74
  .replace(/`([^`]+)`/g, '$1')
73
- .replace(/[\u2013\u2014]/g, ', ')
74
- .replace(/\u2026/g, '...')
75
- .replace(/\s+/g, ' ')
76
- .replace(/\s+([,.;!?])/g, '$1')
77
- .replace(/([,.;!?])(?=[^\s])/g, '$1 ')
78
- .replace(/,\s*,+/g, ', ')
79
- .replace(/\s+/g, ' ')
80
- .trim();
81
- }
75
+ .replace(/[\u2013\u2014]/g, ', ')
76
+ .replace(/\u2026/g, ELLIPSIS_PLACEHOLDER)
77
+ .replace(/\.{3,}/g, ELLIPSIS_PLACEHOLDER)
78
+ .replace(/\s+/g, ' ')
79
+ .replace(/\s+([,.;!?])/g, '$1')
80
+ .replace(/([,;!?])(?=[^\s])/g, '$1 ')
81
+ .replace(/(\.)(?=[^\s.])/g, '$1 ')
82
+ .replace(/,\s*,+/g, ', ')
83
+ .replace(new RegExp(`${ELLIPSIS_PLACEHOLDER}(?=[^\\s,.;!?])`, 'g'), `${ELLIPSIS_PLACEHOLDER} `)
84
+ .replace(new RegExp(ELLIPSIS_PLACEHOLDER, 'g'), '...')
85
+ .replace(/\s+/g, ' ')
86
+ .trim();
87
+ }
82
88
 
83
89
  function splitSpeechSegments(text) {
84
90
  const normalized = normalizeSpeechText(text);
@@ -2,7 +2,7 @@
2
2
  "id": "oomi-ai",
3
3
  "name": "Oomi Channel Plugin",
4
4
  "description": "Managed Oomi channel integration for OpenClaw.",
5
- "version": "0.2.27",
5
+ "version": "0.2.28",
6
6
  "author": "Oomi",
7
7
  "license": "MIT",
8
8
  "openclawVersion": ">=0.5.0",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "oomi-ai",
3
- "version": "0.2.27",
3
+ "version": "0.2.28",
4
4
  "description": "Oomi OpenClaw channel plugin and bridge tooling",
5
5
  "bin": {
6
6
  "oomi": "bin/oomi-ai.js"